ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjE0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsMTMgQEAKK0Jhc2VkT25TdHlsZTogR29vZ2xlCitTdGFuZGFyZDogQ3BwMTEKK0FjY2Vzc01vZGlmaWVyT2Zmc2V0OiAtMgorQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmU6IElubGluZQorQ29sdW1uTGltaXQ6IDEwMAorQ29tbWVudFByYWdtYXM6IE5PTElOVDouKgorRGVyaXZlUG9pbnRlckFsaWdubWVudDogZmFsc2UKK0luY2x1ZGVCbG9ja3M6IFByZXNlcnZlCitJbmRlbnRXaWR0aDogNAorQ29udGludWF0aW9uSW5kZW50V2lkdGg6IDgKK1BvaW50ZXJBbGlnbm1lbnQ6IExlZnQKK1RhYldpZHRoOiA0CitVc2VUYWI6IE5ldmVyCmRpZmYgLS1naXQgYS9BbmRyb2lkLmJwIGIvQW5kcm9pZC5icAppbmRleCA2MGYwZmYxLi5lZTYwOWUxIDEwMDY0NAotLS0gYS9BbmRyb2lkLmJwCisrKyBiL0FuZHJvaWQuYnAKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKICAgICAgICAgICAgIGFwZXhfYXZhaWxhYmxlOiBbCiAgICAgICAgICAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoIiwKICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAogICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKICAgICAgICAgICAgIF0sCkBAIC04Niw3ICs4Niw3IEBACiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAogICAgIGFwZXhfYXZhaWxhYmxlOiBbCiAgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUiLAorICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9NRVRBREFUQSBiL01FVEFEQVRBCmluZGV4IGFhYmRhMzYuLjE0NmJmY2IgMTAwNjQ0Ci0tLSBhL01FVEFEQVRBCisrKyBiL01FVEFEQVRBCkBAIC0yLDIyICsyLDIyIEBACiAjICAgICBDT05TVUxUIFRIRSBPV05FUlMgQU5EIG9wZW5zb3VyY2UtbGljZW5zaW5nQGdvb2dsZS5jb20gQkVGT1JFCiAjICAgICBERVBFTkRJTkcgT04gSVQgSU4gWU9VUiBQUk9KRUNULiAqKioKIHRoaXJkX3BhcnR5IHsKLSAgIyB3b3VsZCBiZSBOT1RJQ0Ugc2F2ZSBmb3IgV2lkZXZpbmUgTWFzdGVyIExpY2Vuc2UgQWdyZWVtZW50IGluOgotICAjICAgZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAKLSAgIyAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAKLSAgIyAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oCi0gICMgICBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3Byb3Rvcy9EZXZpY2VGaWxlcy5wcm90bwotICAjICAgZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaAotICAjIGFuZCBwYXRlbnQgZGlzY2xhaW1lcnMgaW46Ci0gICMgICBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Ci0gICMgICBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0Ci0gICMgICBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Ci0gICMgICBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dAotICAjICAgbWVkaWEvY29kZWNzL2Ftcm5iL3BhdGVudF9kaXNjbGFpbWVyLnR4dAotICAjICAgbWVkaWEvY29kZWNzL2FtcndiL2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKLSAgIyAgIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Ci0gICMgICBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Ci0gICMgICBtZWRpYS9jb2RlY3MvbXAzZGVjL3BhdGVudF9kaXNjbGFpbWVyLnR4dAotICAjICAgbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKKyAgbGljZW5zZV9ub3RlOiAid291bGQgYmUgTk9USUNFIHNhdmUgZm9yIFdpZGV2aW5lIE1hc3RlciBMaWNlbnNlIEFncmVlbWVudCBpbjpcbiIKKyAgIiAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRGV2aWNlRmlsZXMuY3BwXG4iCisgICIgICBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwXG4iCisgICIgICBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRGV2aWNlRmlsZXMuaFxuIgorICAiICAgZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG9cbiIKKyAgIiAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmhcbiIKKyAgIiBhbmQgcGF0ZW50IGRpc2NsYWltZXJzIGluOlxuIgorICAiICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL3BhdGVudF9kaXNjbGFpbWVyLnR4dFxuIgorICAiICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL3BhdGVudF9kaXNjbGFpbWVyLnR4dFxuIgorICAiICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL3BhdGVudF9kaXNjbGFpbWVyLnR4dFxuIgorICAiICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHRcbiIKKyAgIiAgIG1lZGlhL2NvZGVjcy9hbXJuYi9wYXRlbnRfZGlzY2xhaW1lci50eHRcbiIKKyAgIiAgIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0XG4iCisgICIgICBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3BhdGVudF9kaXNjbGFpbWVyLnR4dFxuIgorICAiICAgbWVkaWEvY29kZWNzL200dl9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dFxuIgorICAiICAgbWVkaWEvY29kZWNzL21wM2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHRcbiIKKyAgIiAgIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IgogICBsaWNlbnNlX3R5cGU6IEJZX0VYQ0VQVElPTl9PTkxZCiB9CmRpZmYgLS1naXQgYS9PV05FUlMgYi9PV05FUlMKaW5kZXggMGJlMTE5Ni4uNDBjNjVlNyAxMDA2NDQKLS0tIGEvT1dORVJTCisrKyBiL09XTkVSUwpAQCAtMSw3ICsxLDYgQEAKICMgQnVnIGNvbXBvbmVudDogMTM0NAogZWxhdXJlbnRAZ29vZ2xlLmNvbQogZXRhbHZhbGFAZ29vZ2xlLmNvbQotaGt1YW5nQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KIAogIyBnby9hbmRyb2lkLWZ3ay1tZWRpYS1zb2x1dGlvbnMgZm9yIGluZm8gb24gYXJlYXMgb2Ygb3duZXJzaGlwLgpkaWZmIC0tZ2l0IGEvYXBleC9BbmRyb2lkLmJwIGIvYXBleC9BbmRyb2lkLmJwCmluZGV4IGI5YWJkMTIuLjU3MGNhMDEgMTAwNjQ0Ci0tLSBhL2FwZXgvQW5kcm9pZC5icAorKysgYi9hcGV4L0FuZHJvaWQuYnAKQEAgLTIzLDcgKzIzLDYgQEAKIAogYXBleF9kZWZhdWx0cyB7CiAgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLWRlZmF1bHRzIiwKLSAgICB1cGRhdGFibGU6IHRydWUsCiAgICAgYm9vdGNsYXNzcGF0aF9mcmFnbWVudHM6IFsiY29tLmFuZHJvaWQubWVkaWEtYm9vdGNsYXNzcGF0aC1mcmFnbWVudCJdLAogICAgIHN5c3RlbXNlcnZlcmNsYXNzcGF0aF9mcmFnbWVudHM6IFsiY29tLmFuZHJvaWQubWVkaWEtc3lzdGVtc2VydmVyY2xhc3NwYXRoLWZyYWdtZW50Il0sCiAgICAgbXVsdGlsaWI6IHsKQEAgLTU3LDYgKzU2LDcgQEAKICAgICBwcmVidWlsdHM6IFsKICAgICAgICAgImNvZGVfY292ZXJhZ2UucG9saWN5IiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLW1lZGlhdHJhbnNjb2RpbmcucmMiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEtbWVkaWF0cmFuc2NvZGluZy4zMnJjIiwKICAgICAgICAgImNyYXNoX2R1bXAucG9saWN5IiwKICAgICAgICAgIm1lZGlhZXh0cmFjdG9yLnBvbGljeSIsCiAgICAgICAgICJtZWRpYS1saW5rZXItY29uZmlnIiwKQEAgLTY3LDE0ICs2NywxMyBAQAogICAgIC8vIFVzZSBhIGN1c3RvbSBBbmRyb2lkTWFuaWZlc3QueG1sIHVzZWQgZm9yIEFQSSB0YXJnZXRpbmcuCiAgICAgYW5kcm9pZE1hbmlmZXN0OiAiOmNvbS5hbmRyb2lkLm1lZGlhLWFuZHJvaWRNYW5pZmVzdCIsCiAKLSAgICAvLyBJTVBPUlRBTlQ6IEZvciB0aGUgQVBFWCB0byBiZSBpbnN0YWxsZWQgb24gQW5kcm9pZCAxMCAoQVBJIDI5KSwKLSAgICAvLyBtaW5fc2RrX3ZlcnNpb24gc2hvdWxkIGJlIDI5LiBUaGlzIGVuYWJsZXMgdGhlIGJ1aWxkIHN5c3RlbSB0byBtYWtlCisgICAgLy8gSU1QT1JUQU5UOiBxLWxhdW5jaGVkLWFwZXgtbW9kdWxlIGVuYWJsZXMgdGhlIGJ1aWxkIHN5c3RlbSB0byBtYWtlCiAgICAgLy8gc3VyZSB0aGUgcGFja2FnZSBjb21wYXRpYmxlIHRvIEFuZHJvaWQgMTAgaW4gdHdvIHdheXM6CiAgICAgLy8gLSBidWlsZCB0aGUgQVBFWCBwYWNrYWdlIGNvbXBhdGlibGUgdG8gQW5kcm9pZCAxMAogICAgIC8vICAgc28gdGhhdCB0aGUgcGFja2FnZSBjYW4gYmUgaW5zdGFsbGVkLgogICAgIC8vIC0gYnVpbGQgYXJ0aWZhY3RzIChsaWIvamF2YWxpYi9iaW4pIGFnYWluc3QgQW5kcm9pZCAxMCBTREsKICAgICAvLyAgIHNvIHRoYXQgdGhlIGFydGlmYWN0cyBjYW4gcnVuLgotICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBkZWZhdWx0czogWyJxLWxhdW5jaGVkLWFwZXgtbW9kdWxlIl0sCiAgICAgLy8gSW5kaWNhdGVzIHRoYXQgcHJlLWluc3RhbGxlZCB2ZXJzaW9uIG9mIHRoaXMgYXBleCBjYW4gYmUgY29tcHJlc3NlZC4KICAgICAvLyBXaGV0aGVyIGl0IGFjdHVhbGx5IHdpbGwgYmUgY29tcHJlc3NlZCBpcyBjb250cm9sbGVkIG9uIHBlci1kZXZpY2UgYmFzaXMuCiAgICAgY29tcHJlc3NpYmxlOiB0cnVlLApAQCAtMTI2LDYgKzEyNSwyNiBAQAogICAgIC8vIG1vZGlmaWVkIGJ5IHRoZSBTb29uZyBvciBwbGF0Zm9ybSBjb21wYXQgdGVhbS4KICAgICBoaWRkZW5fYXBpOiB7CiAgICAgICAgIG1heF90YXJnZXRfb19sb3dfcHJpb3JpdHk6IFsiaGlkZGVuYXBpL2hpZGRlbmFwaS1tYXgtdGFyZ2V0LW8tbG93LXByaW9yaXR5LnR4dCJdLAorCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgcGFja2FnZXMgY29udGFpbiBjbGFzc2VzIGZyb20gb3RoZXIgbW9kdWxlcyBvbiB0aGUKKyAgICAgICAgLy8gYm9vdGNsYXNzcGF0aC4gVGhhdCBtZWFucyB0aGF0IHRoZSBoaWRkZW4gQVBJIGZsYWdzIGZvciB0aGlzIG1vZHVsZQorICAgICAgICAvLyBoYXMgdG8gZXhwbGljaXRseSBsaXN0IGV2ZXJ5IHNpbmdsZSBjbGFzcyB0aGlzIG1vZHVsZSBwcm92aWRlcyBpbgorICAgICAgICAvLyB0aGF0IHBhY2thZ2UgdG8gZGlmZmVyZW50aWF0ZSB0aGVtIGZyb20gdGhlIGNsYXNzZXMgcHJvdmlkZWQgYnkgb3RoZXIKKyAgICAgICAgLy8gbW9kdWxlcy4gVGhhdCBjYW4gaW5jbHVkZSBwcml2YXRlIGNsYXNzZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlCisgICAgICAgIC8vIEFQSS4KKyAgICAgICAgc3BsaXRfcGFja2FnZXM6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgXSwKKworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHBhY2thZ2VzIGFuZCBhbGwgdGhlaXIgc3VicGFja2FnZXMgY3VycmVudGx5IG9ubHkKKyAgICAgICAgLy8gY29udGFpbiBjbGFzc2VzIGZyb20gdGhpcyBib290Y2xhc3NwYXRoX2ZyYWdtZW50LiBMaXN0aW5nIGEgcGFja2FnZQorICAgICAgICAvLyBoZXJlIHdvbid0IHByZXZlbnQgb3RoZXIgYm9vdGNsYXNzcGF0aCBtb2R1bGVzIGZyb20gYWRkaW5nIGNsYXNzZXMgaW4KKyAgICAgICAgLy8gYW55IG9mIHRob3NlIHBhY2thZ2VzIGJ1dCBpdCB3aWxsIHByZXZlbnQgdGhlbSBmcm9tIGFkZGluZyB0aG9zZQorICAgICAgICAvLyBjbGFzc2VzIGludG8gYW4gQVBJIHN1cmZhY2UsIGUuZy4gcHVibGljLCBzeXN0ZW0sIGV0Yy4uIERvaW5nIHNvIHdpbGwKKyAgICAgICAgLy8gcmVzdWx0IGluIGEgYnVpbGQgZmFpbHVyZSBkdWUgdG8gaW5jb25zaXN0ZW50IGZsYWdzLgorICAgICAgICBwYWNrYWdlX3ByZWZpeGVzOiBbCisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlcm5hbCIsCisgICAgICAgIF0sCiAgICAgfSwKIH0KIApAQCAtMTQ4LDcgKzE2Nyw2IEBACiAKIGFwZXhfZGVmYXVsdHMgewogICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWRlZmF1bHRzIiwKLSAgICB1cGRhdGFibGU6IHRydWUsCiAgICAgYmluYXJpZXM6IFsKICAgICAgICAgIm1lZGlhc3djb2RlYyIsCiAgICAgXSwKQEAgLTE2MCw2ICsxNzgsNyBAQAogICAgIF0sCiAgICAgcHJlYnVpbHRzOiBbCiAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLW1lZGlhc3djb2RlYy5yYyIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLW1lZGlhc3djb2RlYy4zMnJjIiwKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtbGQuY29uZmlnLnR4dCIsCiAgICAgICAgICJtZWRpYXN3Y29kZWMucG9saWN5IiwKICAgICAgICAgImNvZGVfY292ZXJhZ2UucG9saWN5IiwKQEAgLTE3MiwzMCArMTkxLDQ2IEBACiAgICAgLy8gVXNlIGEgY3VzdG9tIEFuZHJvaWRNYW5pZmVzdC54bWwgdXNlZCBmb3IgQVBJIHRhcmdldGluZy4KICAgICBhbmRyb2lkTWFuaWZlc3Q6ICI6Y29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1hbmRyb2lkTWFuaWZlc3QiLAogCi0gICAgLy8gSU1QT1JUQU5UOiBGb3IgdGhlIEFQRVggdG8gYmUgaW5zdGFsbGVkIG9uIEFuZHJvaWQgMTAgKEFQSSAyOSksCi0gICAgLy8gbWluX3Nka192ZXJzaW9uIHNob3VsZCBiZSAyOS4gVGhpcyBlbmFibGVzIHRoZSBidWlsZCBzeXN0ZW0gdG8gbWFrZQorICAgIC8vIElNUE9SVEFOVDogcS1sYXVuY2hlZC1hcGV4LW1vZHVsZSBlbmFibGVzIHRoZSBidWlsZCBzeXN0ZW0gdG8gbWFrZQogICAgIC8vIHN1cmUgdGhlIHBhY2thZ2UgY29tcGF0aWJsZSB0byBBbmRyb2lkIDEwIGluIHR3byB3YXlzOgogICAgIC8vIC0gYnVpbGQgdGhlIEFQRVggcGFja2FnZSBjb21wYXRpYmxlIHRvIEFuZHJvaWQgMTAKICAgICAvLyAgIHNvIHRoYXQgdGhlIHBhY2thZ2UgY2FuIGJlIGluc3RhbGxlZC4KICAgICAvLyAtIGJ1aWxkIGFydGlmYWN0cyAobGliL2phdmFsaWIvYmluKSBhZ2FpbnN0IEFuZHJvaWQgMTAgU0RLCiAgICAgLy8gICBzbyB0aGF0IHRoZSBhcnRpZmFjdHMgY2FuIHJ1bi4KLSAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgZGVmYXVsdHM6IFsicS1sYXVuY2hlZC1hcGV4LW1vZHVsZSJdLAogICAgIC8vIEluZGljYXRlcyB0aGF0IHByZS1pbnN0YWxsZWQgdmVyc2lvbiBvZiB0aGlzIGFwZXggY2FuIGJlIGNvbXByZXNzZWQuCiAgICAgLy8gV2hldGhlciBpdCBhY3R1YWxseSB3aWxsIGJlIGNvbXByZXNzZWQgaXMgY29udHJvbGxlZCBvbiBwZXItZGV2aWNlIGJhc2lzLgogICAgIGNvbXByZXNzaWJsZTogdHJ1ZSwKIH0KIAorLy8gaW5zdGFsbCBhcyBtZWRpYXRyYW5zY29kaW5nLiogYW5kIG1lZGlhc3djb2RlYy4qIGluc3RlYWQgb2YgaW5pdC4qCisvLyBzbyB3ZSBhcmUgcmVhZHkgZm9yIGRheSB3ZSBoYXZlIG1vcmUgdGhhbiAxICpyYyBmaWxlIHdpdGhpbiB0aGUgYXBleC4KKwogcHJlYnVpbHRfZXRjIHsKICAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEtbWVkaWF0cmFuc2NvZGluZy5yYyIsCiAgICAgc3JjOiAibWVkaWF0cmFuc2NvZGluZy5yYyIsCi0gICAgZmlsZW5hbWU6ICJpbml0LnJjIiwKKyAgICBmaWxlbmFtZTogIm1lZGlhdHJhbnNjb2RpbmcucmMiLAorICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEtbWVkaWF0cmFuc2NvZGluZy4zMnJjIiwKKyAgICBzcmM6ICJtZWRpYXRyYW5zY29kaW5nLjMycmMiLAorICAgIGZpbGVuYW1lOiAibWVkaWF0cmFuc2NvZGluZy4zMnJjIiwKICAgICBpbnN0YWxsYWJsZTogZmFsc2UsCiB9CiAKIHByZWJ1aWx0X2V0YyB7CiAgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtbWVkaWFzd2NvZGVjLnJjIiwKICAgICBzcmM6ICJtZWRpYXN3Y29kZWMucmMiLAotICAgIGZpbGVuYW1lOiAiaW5pdC5yYyIsCisgICAgZmlsZW5hbWU6ICJtZWRpYXN3Y29kZWMucmMiLAorICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1tZWRpYXN3Y29kZWMuMzJyYyIsCisgICAgc3JjOiAibWVkaWFzd2NvZGVjLjMycmMiLAorICAgIGZpbGVuYW1lOiAibWVkaWFzd2NvZGVjLjMycmMiLAogICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKIH0KIApkaWZmIC0tZ2l0IGEvYXBleC9PV05FUlMgYi9hcGV4L09XTkVSUwppbmRleCA1NTg3ZjVmLi41NDgwMmQ0IDEwMDY0NAotLS0gYS9hcGV4L09XTkVSUworKysgYi9hcGV4L09XTkVSUwpAQCAtMSw2ICsxLDcgQEAKLWNoekBnb29nbGUuY29tCi1kd2thbmdAZ29vZ2xlLmNvbQorZXNzaWNrQGdvb2dsZS5jb20KIGppeW9uZ0Bnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCi1tYXJjb25lQGdvb2dsZS5jb20KLXdqaWFAZ29vZ2xlLmNvbQorbmNoYWxrb0Bnb29nbGUuY29tCisKK2luY2x1ZGUgcGxhdGZvcm0vcGFja2FnZXMvbW9kdWxlcy9jb21tb246L01PRFVMRVNfT1dORVJTCisKZGlmZiAtLWdpdCBhL2FwZXgvbWFuaWZlc3QuanNvbiBiL2FwZXgvbWFuaWZlc3QuanNvbgppbmRleCA1ZDcyMDMxLi40Yjc1YjA0IDEwMDY0NAotLS0gYS9hcGV4L21hbmlmZXN0Lmpzb24KKysrIGIvYXBleC9tYW5pZmVzdC5qc29uCkBAIC0xLDYgKzEsNiBAQAogewogICAibmFtZSI6ICJjb20uYW5kcm9pZC5tZWRpYSIsCi0gICJ2ZXJzaW9uIjogMzE5OTk5OTAwLAorICAidmVyc2lvbiI6IDMzOTk5MDAwMCwKICAgInJlcXVpcmVOYXRpdmVMaWJzIjogWwogICAgICJsaWJhbmRyb2lkLnNvIiwKICAgICAibGliYmluZGVyX25kay5zbyIsCmRpZmYgLS1naXQgYS9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24gYi9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24KaW5kZXggYjBkOTYyZC4uZmJjYmI2OSAxMDA2NDQKLS0tIGEvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uCisrKyBiL2FwZXgvbWFuaWZlc3RfY29kZWMuanNvbgpAQCAtMSw2ICsxLDYgQEAKIHsKICAgIm5hbWUiOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCi0gICJ2ZXJzaW9uIjogMzE5OTk5OTAwLAorICAidmVyc2lvbiI6IDMzOTk5MDAwMCwKICAgInJlcXVpcmVOYXRpdmVMaWJzIjogWwogICAgICI6c3BoYWwiCiAgIF0KZGlmZiAtLWdpdCBhL2FwZXgvbWVkaWFzd2NvZGVjLjMycmMgYi9hcGV4L21lZGlhc3djb2RlYy4zMnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MGQxNzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L21lZGlhc3djb2RlYy4zMnJjCkBAIC0wLDAgKzEsOCBAQAorIyMgIGZvciBTREsgcmVsZWFzZXMgPj0gMzIKKyMjCitzZXJ2aWNlIG1lZGlhLnN3Y29kZWMgL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy9iaW4vbWVkaWFzd2NvZGVjCisgICAgY2xhc3MgbWFpbgorICAgIHVzZXIgbWVkaWFjb2RlYworICAgIGdyb3VwIGNhbWVyYSBkcm1ycGMgbWVkaWFkcm0KKyAgICBpb3ByaW8gcnQgNAorICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvYXBleC9tZWRpYXN3Y29kZWMucmMgYi9hcGV4L21lZGlhc3djb2RlYy5yYwppbmRleCAwYzliOGM4Li40Njc5OWM3IDEwMDY0NAotLS0gYS9hcGV4L21lZGlhc3djb2RlYy5yYworKysgYi9hcGV4L21lZGlhc3djb2RlYy5yYwpAQCAtMSwzICsxLDYgQEAKKyMjICBmb3IgU0RLIHJlbGVhc2VzIDI5Li4zMQorIyMgIHdoZXJlIHdyaXRlcGlkIGhhcyBub3QgeWV0IGJlZW4gcmVwbGFjZWQgYnkgdGFza19wcm9maWxlcworIyMKIHNlcnZpY2UgbWVkaWEuc3djb2RlYyAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2Jpbi9tZWRpYXN3Y29kZWMKICAgICBjbGFzcyBtYWluCiAgICAgdXNlciBtZWRpYWNvZGVjCmRpZmYgLS1naXQgYS9hcGV4L21lZGlhdHJhbnNjb2RpbmcuMzJyYyBiL2FwZXgvbWVkaWF0cmFuc2NvZGluZy4zMnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYmE5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L21lZGlhdHJhbnNjb2RpbmcuMzJyYwpAQCAtMCwwICsxLDE1IEBACisjIyAgZm9yIFNESyByZWxlYXNlcyA+PSAzMgorIyMKKyMKKyMgbWVkaWEudHJhbnNjb2Rpbmcgc2VydmljZSBpcyBkZWZpbmVkIG9uIGNvbS5hbmRyb2lkLm1lZGlhIGFwZXggd2hpY2ggZ29lcyBiYWNrCisjIHRvIEFQSTI5LCBidXQgd2Ugb25seSB3YW50IGl0IHN0YXJ0ZWQgb24gQVBJMzErIGRldmljZXMuIFNvIHdlIGRlY2xhcmUgaXQgYXMKKyMgImRpc2FibGVkIiBhbmQgc3RhcnQgaXQgZXhwbGljaXRseSBvbiBib290Lgorc2VydmljZSBtZWRpYS50cmFuc2NvZGluZyAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS9iaW4vbWVkaWF0cmFuc2NvZGluZworICAgIGNsYXNzIG1haW4KKyAgICB1c2VyIG1lZGlhCisgICAgZ3JvdXAgbWVkaWEKKyAgICBpb3ByaW8gcnQgNAorICAgICMgUmVzdHJpY3QgdG8gbGl0dGxlIGNvcmVzIG9ubHkgd2l0aCBzeXN0ZW0tYmFja2dyb3VuZCBjcHVzZXQuCisgICAgdGFza19wcm9maWxlcyBTZXJ2aWNlQ2FwYWNpdHlMb3cKKyAgICBpbnRlcmZhY2UgYWlkbCBtZWRpYS50cmFuc2NvZGluZworICAgIGRpc2FibGVkCmRpZmYgLS1naXQgYS9hcGV4L21lZGlhdHJhbnNjb2RpbmcucmMgYi9hcGV4L21lZGlhdHJhbnNjb2RpbmcucmMKaW5kZXggYWU5ZjhiYS4uNmU0NTNiZSAxMDA2NDQKLS0tIGEvYXBleC9tZWRpYXRyYW5zY29kaW5nLnJjCisrKyBiL2FwZXgvbWVkaWF0cmFuc2NvZGluZy5yYwpAQCAtMSwzICsxLDcgQEAKKyMjICBmb3IgU0RLIHJlbGVhc2VzIDI5Li4zMQorIyMgIHdoZXJlIHdyaXRlcGlkIGhhcyBub3QgeWV0IGJlZW4gcmVwbGFjZWQgYnkgdGFza19wcm9maWxlcworIyMKKyMKICMgbWVkaWEudHJhbnNjb2Rpbmcgc2VydmljZSBpcyBkZWZpbmVkIG9uIGNvbS5hbmRyb2lkLm1lZGlhIGFwZXggd2hpY2ggZ29lcyBiYWNrCiAjIHRvIEFQSTI5LCBidXQgd2Ugb25seSB3YW50IGl0IHN0YXJ0ZWQgb24gQVBJMzErIGRldmljZXMuIFNvIHdlIGRlY2xhcmUgaXQgYXMKICMgImRpc2FibGVkIiBhbmQgc3RhcnQgaXQgZXhwbGljaXRseSBvbiBib290LgpkaWZmIC0tZ2l0IGEvY2FtZXJhL0FuZHJvaWQuYnAgYi9jYW1lcmEvQW5kcm9pZC5icAppbmRleCA2ODc4YzIwLi5lNDQyMDJiIDEwMDY0NAotLS0gYS9jYW1lcmEvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvQW5kcm9pZC5icApAQCAtNDMsNiArNDMsMTAgQEAKICAgICBdLAogfQogCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJjYW1lcmFfaGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmNhbWVyYV9jbGllbnQiLAogCkBAIC0xMDksNiArMTEzLDMwIEBACiAKIH0KIAorY2NfbGlicmFyeV9ob3N0X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmNhbWVyYV9jbGllbnRfaG9zdCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDYW1lcmFNZXRhZGF0YS5jcHAiLAorICAgICAgICAiVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgInN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgICAgICAiaW5jbHVkZS9jYW1lcmEiCisgICAgXSwKK30KKwogLy8gQUlETCBpbnRlcmZhY2UgYmV0d2VlbiBjYW1lcmEgY2xpZW50cyBhbmQgdGhlIGNhbWVyYSBzZXJ2aWNlLgogZmlsZWdyb3VwIHsKICAgICBuYW1lOiAibGliY2FtZXJhX2NsaWVudF9haWRsIiwKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFCYXNlLmNwcCBiL2NhbWVyYS9DYW1lcmFCYXNlLmNwcAppbmRleCAwMzQzOWZkLi4yNGM5MTA4IDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhQmFzZS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYUJhc2UuY3BwCkBAIC02OCw2ICs2OCw5IEBACiAgICAgICAgIHVuYXZhaWxhYmxlUGh5c2ljYWxJZHMxNi5wdXNoX2JhY2soU3RyaW5nMTYoaWQ4KSk7CiAgICAgfQogICAgIHJlcyA9IHBhcmNlbC0+d3JpdGVTdHJpbmcxNlZlY3Rvcih1bmF2YWlsYWJsZVBoeXNpY2FsSWRzMTYpOworICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisKKyAgICByZXMgPSBwYXJjZWwtPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYoY2xpZW50UGFja2FnZSkpOwogICAgIHJldHVybiByZXM7CiB9CiAKQEAgLTg2LDYgKzg5LDEyIEBACiAgICAgZm9yIChhdXRvJiBpZDE2IDogdW5hdmFpbGFibGVQaHlzaWNhbElkczE2KSB7CiAgICAgICAgIHVuYXZhaWxhYmxlUGh5c2ljYWxJZHMucHVzaF9iYWNrKFN0cmluZzgoaWQxNikpOwogICAgIH0KKworICAgIFN0cmluZzE2IHRlbXBDbGllbnRQYWNrYWdlOworICAgIHJlcyA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZ0ZW1wQ2xpZW50UGFja2FnZSk7CisgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICBjbGllbnRQYWNrYWdlID0gU3RyaW5nOCh0ZW1wQ2xpZW50UGFja2FnZSk7CisKICAgICByZXR1cm4gcmVzOwogfQogCmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhU2Vzc2lvblN0YXRzLmNwcCBiL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuY3BwCmluZGV4IDI4ZTAzN2YuLmQxYWEzNmEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuY3BwCkBAIC01Miw2ICs1MiwxMiBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIGZsb2F0IG1heFByZXZpZXdGcHMgPSAwOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkRmxvYXQoJm1heFByZXZpZXdGcHMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG1heFByZXZpZXdGcHMgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgIGludCBkYXRhU3BhY2UgPSAwOwogICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJmRhdGFTcGFjZSkpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgZGF0YVNwYWNlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKQEAgLTExMiw5ICsxMTgsMjIgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUgPSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJEOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50NjQoJmR5bmFtaWNSYW5nZVByb2ZpbGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGR5bmFtaWMgcmFuZ2UgcHJvZmlsZSB0eXBlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxUOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50NjQoJnN0cmVhbVVzZUNhc2UpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHN0cmVhbSB1c2UgY2FzZSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgbVdpZHRoID0gd2lkdGg7CiAgICAgbUhlaWdodCA9IGhlaWdodDsKICAgICBtRm9ybWF0ID0gZm9ybWF0OworICAgIG1NYXhQcmV2aWV3RnBzID0gbWF4UHJldmlld0ZwczsKICAgICBtRGF0YVNwYWNlID0gZGF0YVNwYWNlOwogICAgIG1Vc2FnZSA9IHVzYWdlOwogICAgIG1SZXF1ZXN0Q291bnQgPSByZXF1ZXN0Q291bnQ7CkBAIC0xMjUsNiArMTQ0LDggQEAKICAgICBtSGlzdG9ncmFtVHlwZSA9IGhpc3RvZ3JhbVR5cGU7CiAgICAgbUhpc3RvZ3JhbUJpbnMgPSBzdGQ6Om1vdmUoaGlzdG9ncmFtQmlucyk7CiAgICAgbUhpc3RvZ3JhbUNvdW50cyA9IHN0ZDo6bW92ZShoaXN0b2dyYW1Db3VudHMpOworICAgIG1EeW5hbWljUmFuZ2VQcm9maWxlID0gZHluYW1pY1JhbmdlUHJvZmlsZTsKKyAgICBtU3RyZWFtVXNlQ2FzZSA9IHN0cmVhbVVzZUNhc2U7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNTIsNiArMTczLDExIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlRmxvYXQobU1heFByZXZpZXdGcHMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gbWF4UHJldmlld0ZwcyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1EYXRhU3BhY2UpKSAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gZGF0YVNwYWNlISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC0yMDIsNiArMjI4LDE2IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50NjQobUR5bmFtaWNSYW5nZVByb2ZpbGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBkeW5hbWljIHJhbmdlIHByb2ZpbGUgdHlwZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50NjQobVN0cmVhbVVzZUNhc2UpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gdXNlIGNhc2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIyMywxMSArMjU5LDEzIEBACiAgICAgICAgIG1BcGlMZXZlbCgwKSwKICAgICAgICAgbUlzTmRrKGZhbHNlKSwKICAgICAgICAgbUxhdGVuY3lNcygtMSksCisgICAgICAgIG1NYXhQcmV2aWV3RnBzKDApLAogICAgICAgICBtU2Vzc2lvblR5cGUoMCksCiAgICAgICAgIG1JbnRlcm5hbFJlY29uZmlndXJlKDApLAogICAgICAgICBtUmVxdWVzdENvdW50KDApLAogICAgICAgICBtUmVzdWx0RXJyb3JDb3VudCgwKSwKLSAgICAgICAgbURldmljZUVycm9yKGZhbHNlKSB7fQorICAgICAgICBtRGV2aWNlRXJyb3IoZmFsc2UpLAorICAgICAgICBtVmlkZW9TdGFiaWxpemF0aW9uTW9kZSgtMSkge30KIAogQ2FtZXJhU2Vzc2lvblN0YXRzOjpDYW1lcmFTZXNzaW9uU3RhdHMoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAogICAgICAgICBpbnQgZmFjaW5nLCBpbnQgbmV3Q2FtZXJhU3RhdGUsIGNvbnN0IFN0cmluZzE2JiBjbGllbnROYW1lLApAQCAtMjM5LDExICsyNzcsMTMgQEAKICAgICAgICAgICAgICAgICBtQXBpTGV2ZWwoYXBpTGV2ZWwpLAogICAgICAgICAgICAgICAgIG1Jc05kayhpc05kayksCiAgICAgICAgICAgICAgICAgbUxhdGVuY3lNcyhsYXRlbmN5TXMpLAorICAgICAgICAgICAgICAgIG1NYXhQcmV2aWV3RnBzKDApLAogICAgICAgICAgICAgICAgIG1TZXNzaW9uVHlwZSgwKSwKICAgICAgICAgICAgICAgICBtSW50ZXJuYWxSZWNvbmZpZ3VyZSgwKSwKICAgICAgICAgICAgICAgICBtUmVxdWVzdENvdW50KDApLAogICAgICAgICAgICAgICAgIG1SZXN1bHRFcnJvckNvdW50KDApLAotICAgICAgICAgICAgICAgIG1EZXZpY2VFcnJvcigwKSB7fQorICAgICAgICAgICAgICAgIG1EZXZpY2VFcnJvcigwKSwKKyAgICAgICAgICAgICAgICBtVmlkZW9TdGFiaWxpemF0aW9uTW9kZSgtMSkge30KIAogc3RhdHVzX3QgQ2FtZXJhU2Vzc2lvblN0YXRzOjpyZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgewogICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgewpAQCAtMjk1LDYgKzMzNSwxMiBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIGZsb2F0IG1heFByZXZpZXdGcHM7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRGbG9hdCgmbWF4UHJldmlld0ZwcykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWF4UHJldmlld0ZwcyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgaW50MzJfdCBzZXNzaW9uVHlwZTsKICAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZzZXNzaW9uVHlwZSkpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgc2Vzc2lvbiB0eXBlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKQEAgLTMzMSw2ICszNzcsMTggQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBTdHJpbmcxNiB1c2VyVGFnOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkU3RyaW5nMTYoJnVzZXJUYWcpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHVzZXIgdGFnISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaW50MzJfdCB2aWRlb1N0YWJpbGl6YXRpb25Nb2RlOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJnZpZGVvU3RhYmlsaXphdGlvbk1vZGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHZpZGVvIHN0YWJpbGl6YXRpb24gbW9kZSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgbUNhbWVyYUlkID0gaWQ7CiAgICAgbUZhY2luZyA9IGZhY2luZzsKICAgICBtTmV3Q2FtZXJhU3RhdGUgPSBuZXdDYW1lcmFTdGF0ZTsKQEAgLTMzOCwxMiArMzk2LDE1IEBACiAgICAgbUFwaUxldmVsID0gYXBpTGV2ZWw7CiAgICAgbUlzTmRrID0gaXNOZGs7CiAgICAgbUxhdGVuY3lNcyA9IGxhdGVuY3lNczsKKyAgICBtTWF4UHJldmlld0ZwcyA9IG1heFByZXZpZXdGcHM7CiAgICAgbVNlc3Npb25UeXBlID0gc2Vzc2lvblR5cGU7CiAgICAgbUludGVybmFsUmVjb25maWd1cmUgPSBpbnRlcm5hbFJlY29uZmlndXJlOwogICAgIG1SZXF1ZXN0Q291bnQgPSByZXF1ZXN0Q291bnQ7CiAgICAgbVJlc3VsdEVycm9yQ291bnQgPSByZXN1bHRFcnJvckNvdW50OwogICAgIG1EZXZpY2VFcnJvciA9IGRldmljZUVycm9yOwogICAgIG1TdHJlYW1TdGF0cyA9IHN0ZDo6bW92ZShzdHJlYW1TdGF0cyk7CisgICAgbVVzZXJUYWcgPSB1c2VyVGFnOworICAgIG1WaWRlb1N0YWJpbGl6YXRpb25Nb2RlID0gdmlkZW9TdGFiaWxpemF0aW9uTW9kZTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTM5MSw2ICs0NTIsMTEgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVGbG9hdChtTWF4UHJldmlld0ZwcykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIG1heFByZXZpZXdGcHMhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtU2Vzc2lvblR5cGUpKSAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzZXNzaW9uIHR5cGUhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTQyMSw2ICs0ODcsMTUgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVTdHJpbmcxNihtVXNlclRhZykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHVzZXIgdGFnISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobVZpZGVvU3RhYmlsaXphdGlvbk1vZGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSB2aWRlbyBzdGFiaWxpemF0aW9uIG1vZGUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhVXRpbHMuY3BwIGIvY2FtZXJhL0NhbWVyYVV0aWxzLmNwcAppbmRleCBhZjNjNDkyLi4zNDczNzgwIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhVXRpbHMuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFVdGlscy5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KQEAgLTMxLDcgKzMyLDcgQEAKIGNvbnN0IGNoYXIgKmtDYW1lcmFTZXJ2aWNlRGlzYWJsZWRQcm9wZXJ0eSA9ICJjb25maWcuZGlzYWJsZV9jYW1lcmFzZXJ2aWNlIjsKIAogc3RhdHVzX3QgQ2FtZXJhVXRpbHM6OmdldFJvdGF0aW9uVHJhbnNmb3JtKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9pbnQzMl90KiB0cmFuc2Zvcm0pIHsKKyAgICAgICAgaW50IG1pcnJvck1vZGUsIC8qb3V0Ki9pbnQzMl90KiB0cmFuc2Zvcm0pIHsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogCiAgICAgaWYgKHRyYW5zZm9ybSA9PSBOVUxMKSB7CkBAIC01NSw5ICs1NiwxOCBAQAogCiAgICAgaW50MzJfdCYgZmxhZ3MgPSAqdHJhbnNmb3JtOwogCi0gICAgYm9vbCBtaXJyb3IgPSAoZW50cnlGYWNpbmcuZGF0YS51OFswXSA9PSBBTkRST0lEX0xFTlNfRkFDSU5HX0ZST05UKTsKKyAgICBpbnQzMl90IG1pcnJvciA9IDA7CisgICAgaWYgKG1pcnJvck1vZGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTyAmJgorICAgICAgICAgICAgZW50cnlGYWNpbmcuZGF0YS51OFswXSA9PSBBTkRST0lEX0xFTlNfRkFDSU5HX0ZST05UKSB7CisgICAgICAgIG1pcnJvciA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfSDsKKyAgICB9IGVsc2UgaWYgKG1pcnJvck1vZGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfSCkgeworICAgICAgICBtaXJyb3IgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9GTElQX0g7CisgICAgfSBlbHNlIGlmIChtaXJyb3JNb2RlID09IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX1YpIHsKKyAgICAgICAgbWlycm9yID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fRkxJUF9WOworICAgIH0KKwogICAgIGludCBvcmllbnRhdGlvbiA9IGVudHJ5LmRhdGEuaTMyWzBdOwotICAgIGlmICghbWlycm9yKSB7CisgICAgaWYgKG1pcnJvciA9PSAwKSB7CiAgICAgICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHsKICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICBmbGFncyA9IDA7CkBAIC03NywyNSArODcsMjUgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICAvLyBGcm9udCBjYW1lcmEgbmVlZHMgdG8gYmUgaG9yaXpvbnRhbGx5IGZsaXBwZWQgZm9yIG1pcnJvci1saWtlIGJlaGF2aW9yLgorICAgICAgICAvLyAtIEZyb250IGNhbWVyYSBuZWVkcyB0byBiZSBob3Jpem9udGFsbHkgZmxpcHBlZCBmb3IgbWlycm9yLWxpa2UgYmVoYXZpb3IuCisgICAgICAgIC8vIC0gQXBwbGljYXRpb24tc3BlY2lmaWVkIG1pcnJvcmluZyBuZWVkcyB0byBiZSBhcHBsaWVkLgogICAgICAgICAvLyBOb3RlOiBGbGlwcyBhcmUgYXBwbGllZCBiZWZvcmUgcm90YXRlczsgdXNpbmcgWE9SIGhlcmUgYXMgc29tZSBvZiB0aGVzZSBmbGFncyBhcmUKICAgICAgICAgLy8gY29tcG9zZWQgaW4gdGVybXMgb2Ygb3RoZXIgZmxpcC9yb3RhdGlvbiBmbGFncywgYW5kIGFyZSBub3QgYml0d2lzZS1PUmFibGUuCiAgICAgICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHsKICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfSDsKKyAgICAgICAgICAgICAgICBmbGFncyA9IG1pcnJvcjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9GTElQX0ggXgorICAgICAgICAgICAgICAgIGZsYWdzID0gbWlycm9yIF4KICAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF8yNzA7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfSCBeCisgICAgICAgICAgICAgICAgZmxhZ3MgPSBtaXJyb3IgXgogICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzE4MDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMjcwOgotICAgICAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fRkxJUF9IIF4KKyAgICAgICAgICAgICAgICBmbGFncyA9IG1pcnJvciBeCiAgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfOTA7Ci0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEhBTCBhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbiB2YWx1ZTogJWQiLApkaWZmIC0tZ2l0IGEvY2FtZXJhL09XTkVSUyBiL2NhbWVyYS9PV05FUlMKaW5kZXggZDZiOTVkYS4uMzg1YzE2MyAxMDA2NDQKLS0tIGEvY2FtZXJhL09XTkVSUworKysgYi9jYW1lcmEvT1dORVJTCkBAIC0xLDggKzEsNyBAQAotZXBlZXZAZ29vZ2xlLmNvbQorIyBCdWcgY29tcG9uZW50OiA0MTcyNwogZXRhbHZhbGFAZ29vZ2xlLmNvbQorYXJha2VzaEBnb29nbGUuY29tCitlcGVldkBnb29nbGUuY29tCiBqY2hvd2RoYXJ5QGdvb2dsZS5jb20KIHNodXpoZW53YW5nQGdvb2dsZS5jb20KLXlpbmNoaWF5ZWhAZ29vZ2xlLmNvbQotIyBiYWNrdXAgb3duZXIKLWN5Y2hlbkBnb29nbGUuY29tCi16aGlqdW5oZUBnb29nbGUuY29tCitydWNoYW1rQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcCBiL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcAppbmRleCAyNGZhOTEyLi5iMzc4MDNhIDEwMDY0NAotLS0gYS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKKysrIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCkBAIC03NjAsNyArNzYwLDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOwogICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIiVzOiBWZW5kb3IgdGFnIGRlc2NyaXB0b3IgY2FjaGUgbm90IGluaXRpYWxpemVkLiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBWRU5ET1JfVEFHX05BTUVfRVJSOworICAgICAgICByZXR1cm4gVkVORE9SX1RBR19UWVBFX0VSUjsKICAgICB9CiAgICAgcmV0dXJuIHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGUtPmdldFRhZ1R5cGUodGFnLCBpZCk7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwKaW5kZXggNzhhNzdkNC4uMWU3NDhjNyAxMDA2NDQKLS0tIGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbApAQCAtMTczLDYgKzE3MywxMyBAQAogCiAgICAgdm9pZCBzZXRUb3JjaE1vZGUoU3RyaW5nIGNhbWVyYUlkLCBib29sZWFuIGVuYWJsZWQsIElCaW5kZXIgY2xpZW50QmluZGVyKTsKIAorICAgIC8vIENoYW5nZSB0aGUgYnJpZ2h0bmVzcyBsZXZlbCBvZiB0aGUgZmxhc2ggdW5pdCBhc3NvY2lhdGVkIHdpdGggY2FtZXJhSWQgdG8gc3RyZW5ndGhMZXZlbC4KKyAgICAvLyBJZiB0aGUgdG9yY2ggaXMgaW4gT0ZGIHN0YXRlIGFuZCBzdHJlbmd0aExldmVsID4gMCB0aGVuIHRoZSB0b3JjaCB3aWxsIGFsc28gYmUgdHVybmVkIE9OLgorICAgIHZvaWQgdHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbChTdHJpbmcgY2FtZXJhSWQsIGludCBzdHJlbmd0aExldmVsLCBJQmluZGVyIGNsaWVudEJpbmRlcik7CisKKyAgICAvLyBHZXQgdGhlIGJyaWdodG5lc3MgbGV2ZWwgb2YgdGhlIGZsYXNoIHVuaXQgYXNzb2NpYXRlZCB3aXRoIGNhbWVyYUlkLgorICAgIGludCBnZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoU3RyaW5nIGNhbWVyYUlkKTsKKwogICAgIC8qKgogICAgICAqIE5vdGlmeSB0aGUgY2FtZXJhIHNlcnZpY2Ugb2YgYSBzeXN0ZW0gZXZlbnQuICBTaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSBzeXN0ZW1fc2VydmVyLgogICAgICAqCkBAIC0xODAsNiArMTg3LDggQEAKICAgICAgKi8KICAgICBjb25zdCBpbnQgRVZFTlRfTk9ORSA9IDA7CiAgICAgY29uc3QgaW50IEVWRU5UX1VTRVJfU1dJVENIRUQgPSAxOyAvLyBUaGUgYXJndW1lbnQgaXMgdGhlIHNldCBvZiBuZXcgZm9yZWdyb3VuZCB1c2VyIElEcy4KKyAgICBjb25zdCBpbnQgRVZFTlRfVVNCX0RFVklDRV9BVFRBQ0hFRCA9IDI7IC8vIFRoZSBhcmd1bWVudCBpcyB0aGUgZGV2aWNlSWQgYW5kIHZlbmRvcklkCisgICAgY29uc3QgaW50IEVWRU5UX1VTQl9ERVZJQ0VfREVUQUNIRUQgPSAzOyAvLyBUaGUgYXJndW1lbnQgaXMgdGhlIGRldmljZUlkIGFuZCB2ZW5kb3JJZAogICAgIG9uZXdheSB2b2lkIG5vdGlmeVN5c3RlbUV2ZW50KGludCBldmVudElkLCBpbiBpbnRbXSBhcmdzKTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbAppbmRleCBjNTQ4MTNjLi41ZjE3ZjViIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbApAQCAtODMsNiArODMsOCBAQAogCiAgICAgb25ld2F5IHZvaWQgb25Ub3JjaFN0YXR1c0NoYW5nZWQoaW50IHN0YXR1cywgU3RyaW5nIGNhbWVyYUlkKTsKIAorICAgIG9uZXdheSB2b2lkIG9uVG9yY2hTdHJlbmd0aExldmVsQ2hhbmdlZChTdHJpbmcgY2FtZXJhSWQsIGludCBuZXdUb3JjaFN0cmVuZ3RoKTsKKwogICAgIC8qKgogICAgICAqIE5vdGlmeSByZWdpc3RlcmVkIGNsaWVudHMgYWJvdXQgY2FtZXJhIGFjY2VzcyBwcmlvcml0eSBjaGFuZ2VzLgogICAgICAqIENsaWVudHMgd2hpY2ggd2VyZSBwcmV2aW91c2x5IHVuYWJsZSB0byBvcGVuIGEgY2VydGFpbiBjYW1lcmEgZGV2aWNlCmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlUHJveHkuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5haWRsCmluZGV4IGJiYjAyODkuLjg4NzgzZmIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5haWRsCkBAIC0zNyw4ICszNywxNiBAQAogICAgIG9uZXdheSB2b2lkIG5vdGlmeUNhbWVyYVN0YXRlKGluIENhbWVyYVNlc3Npb25TdGF0cyBjYW1lcmFTZXNzaW9uU3RhdHMpOwogCiAgICAgLyoqCi0gICAgICogUmVwb3J0cyB3aGV0aGVyIHRoZSB0b3AgYWN0aXZpdHkgbmVlZHMgYSByb3RhdGUgYW5kIGNyb3Agb3ZlcnJpZGUuCisgICAgICogUmV0dXJucyB0aGUgbmVjZXNzYXJ5IHJvdGF0ZSBhbmQgY3JvcCBvdmVycmlkZSBmb3IgdGhlIHRvcCBhY3Rpdml0eSB3aGljaAorICAgICAqIHdpbGwgYmUgb25lIG9mICh7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfTk9ORX0sCisgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNTQ0FMRVJfUk9UQVRFX0FORF9DUk9QXzkwfSwKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfMTgwfSwKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfMjcwfSkuCiAgICAgICovCi0gICAgYm9vbGVhbiBpc1JvdGF0ZUFuZENyb3BPdmVycmlkZU5lZWRlZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBzZW5zb3JPcmllbnRhdGlvbiwKLSAgICAgICAgICAgIGludCBsZW5zRmFjaW5nKTsKKyAgICBpbnQgZ2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IGxlbnNGYWNpbmcsIGludCB1c2VySWQpOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBjYW1lcmEgaGFzIGJlZW4gZGlzYWJsZWQgdmlhIGRldmljZSBwb2xpY3kuCisgICAgICovCisgICAgYm9vbGVhbiBpc0NhbWVyYURpc2FibGVkKCk7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAgYi9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAKaW5kZXggZWJjMDlkNy4uN2E4YTRiYSAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwCisrKyBiL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcApAQCAtMTQ2LDYgKzE0NiwyMCBAQAogICAgICAgICBtU3VyZmFjZUlkeExpc3QucHVzaF9iYWNrKHN1cmZhY2VJZHgpOwogICAgIH0KIAorICAgIGludDMyX3QgaGFzVXNlclRhZzsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZoYXNVc2VyVGFnKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCB1c2VyIHRhZyBhdmFpbGFiaWxpdHkgZmxhZyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChoYXNVc2VyVGFnKSB7CisgICAgICAgIFN0cmluZzE2IHVzZXJUYWc7CisgICAgICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkU3RyaW5nMTYoJnVzZXJUYWcpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCB1c2VyIHRhZyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBtVXNlclRhZyA9IFN0cmluZzgodXNlclRhZykuY19zdHIoKTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIxMyw2ICsyMjcsMTQgQEAKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBpZiAobVVzZXJUYWcuZW1wdHkoKSkgeworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKDEpOworICAgICAgICBwYXJjZWwtPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobVVzZXJUYWcuY19zdHIoKSkpOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAgYi9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcAppbmRleCAyYmNjZDg3Li4xMWQ0OTYwIDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcAorKysgYi9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8Z3VpL3ZpZXcvU3VyZmFjZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfbWV0YWRhdGEuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTc2LDYgKzc3LDIyIEBACiAgICAgcmV0dXJuIG1TZW5zb3JQaXhlbE1vZGVzVXNlZDsKIH0KIAoraW50NjRfdCBPdXRwdXRDb25maWd1cmF0aW9uOjpnZXREeW5hbWljUmFuZ2VQcm9maWxlKCkgY29uc3QgeworICAgIHJldHVybiBtRHluYW1pY1JhbmdlUHJvZmlsZTsKK30KKworaW50NjRfdCBPdXRwdXRDb25maWd1cmF0aW9uOjpnZXRTdHJlYW1Vc2VDYXNlKCkgY29uc3QgeworICAgIHJldHVybiBtU3RyZWFtVXNlQ2FzZTsKK30KKworaW50IE91dHB1dENvbmZpZ3VyYXRpb246OmdldFRpbWVzdGFtcEJhc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1UaW1lc3RhbXBCYXNlOworfQorCitpbnQgT3V0cHV0Q29uZmlndXJhdGlvbjo6Z2V0TWlycm9yTW9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1pcnJvck1vZGU7Cit9CisKIE91dHB1dENvbmZpZ3VyYXRpb246Ok91dHB1dENvbmZpZ3VyYXRpb24oKSA6CiAgICAgICAgIG1Sb3RhdGlvbihJTlZBTElEX1JPVEFUSU9OKSwKICAgICAgICAgbVN1cmZhY2VTZXRJRChJTlZBTElEX1NFVF9JRCksCkBAIC04NCw3ICsxMDEsMTEgQEAKICAgICAgICAgbUhlaWdodCgwKSwKICAgICAgICAgbUlzRGVmZXJyZWQoZmFsc2UpLAogICAgICAgICBtSXNTaGFyZWQoZmFsc2UpLAotICAgICAgICBtSXNNdWx0aVJlc29sdXRpb24oZmFsc2UpIHsKKyAgICAgICAgbUlzTXVsdGlSZXNvbHV0aW9uKGZhbHNlKSwKKyAgICAgICAgbUR5bmFtaWNSYW5nZVByb2ZpbGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCksCisgICAgICAgIG1TdHJlYW1Vc2VDYXNlKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQpLAorICAgICAgICBtVGltZXN0YW1wQmFzZShUSU1FU1RBTVBfQkFTRV9ERUZBVUxUKSwKKyAgICAgICAgbU1pcnJvck1vZGUoTUlSUk9SX01PREVfQVVUTykgewogfQogCiBPdXRwdXRDb25maWd1cmF0aW9uOjpPdXRwdXRDb25maWd1cmF0aW9uKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCYgcGFyY2VsKSA6CkBAIC0xNjUsNiArMTg2LDMwIEBACiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgc2Vuc29yIHBpeGVsIG1vZGUocykgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KKyAgICBpbnQ2NF90IGR5bmFtaWNQcm9maWxlOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50NjQoJmR5bmFtaWNQcm9maWxlKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBzdXJmYWNlIGR5bmFtaWMgcmFuZ2UgcHJvZmlsZSBmbGFnIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxUOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50NjQoJnN0cmVhbVVzZUNhc2UpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHN0cmVhbSB1c2UgY2FzZSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBUSU1FU1RBTVBfQkFTRV9ERUZBVUxUOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJnRpbWVzdGFtcEJhc2UpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHRpbWVzdGFtcCBiYXNlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgbWlycm9yTW9kZSA9IE1JUlJPUl9NT0RFX0FVVE87CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmbWlycm9yTW9kZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWlycm9yaW5nIG1vZGUgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgIG1Sb3RhdGlvbiA9IHJvdGF0aW9uOwogICAgIG1TdXJmYWNlU2V0SUQgPSBzZXRJRDsKICAgICBtU3VyZmFjZVR5cGUgPSBzdXJmYWNlVHlwZTsKQEAgLTE3Myw2ICsyMTgsOSBAQAogICAgIG1Jc0RlZmVycmVkID0gaXNEZWZlcnJlZCAhPSAwOwogICAgIG1Jc1NoYXJlZCA9IGlzU2hhcmVkICE9IDA7CiAgICAgbUlzTXVsdGlSZXNvbHV0aW9uID0gaXNNdWx0aVJlc29sdXRpb24gIT0gMDsKKyAgICBtU3RyZWFtVXNlQ2FzZSA9IHN0cmVhbVVzZUNhc2U7CisgICAgbVRpbWVzdGFtcEJhc2UgPSB0aW1lc3RhbXBCYXNlOworICAgIG1NaXJyb3JNb2RlID0gbWlycm9yTW9kZTsKICAgICBmb3IgKGF1dG8mIHN1cmZhY2UgOiBzdXJmYWNlU2hpbXMpIHsKICAgICAgICAgQUxPR1YoIiVzOiBPdXRwdXRDb25maWd1cmF0aW9uOiAlcCwgbmFtZSAlcyIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBzdXJmYWNlLmdyYXBoaWNCdWZmZXJQcm9kdWNlci5nZXQoKSwKQEAgLTE4MSwxMCArMjI5LDE0IEBACiAgICAgfQogCiAgICAgbVNlbnNvclBpeGVsTW9kZXNVc2VkID0gc3RkOjptb3ZlKHNlbnNvclBpeGVsTW9kZXNVc2VkKTsKKyAgICBtRHluYW1pY1JhbmdlUHJvZmlsZSA9IGR5bmFtaWNQcm9maWxlOwogCiAgICAgQUxPR1YoIiVzOiBPdXRwdXRDb25maWd1cmF0aW9uOiByb3RhdGlvbiA9ICVkLCBzZXRJZCA9ICVkLCBzdXJmYWNlVHlwZSA9ICVkLCIKLSAgICAgICAgICAiIHBoeXNpY2FsQ2FtZXJhSWQgPSAlcywgaXNNdWx0aVJlc29sdXRpb24gPSAlZCIsIF9fRlVOQ1RJT05fXywgbVJvdGF0aW9uLAotICAgICAgICAgIG1TdXJmYWNlU2V0SUQsIG1TdXJmYWNlVHlwZSwgU3RyaW5nOChtUGh5c2ljYWxDYW1lcmFJZCkuc3RyaW5nKCksIG1Jc011bHRpUmVzb2x1dGlvbik7CisgICAgICAgICAgIiBwaHlzaWNhbENhbWVyYUlkID0gJXMsIGlzTXVsdGlSZXNvbHV0aW9uID0gJWQsIHN0cmVhbVVzZUNhc2UgPSAlIiBQUklkNjQKKyAgICAgICAgICAiLCB0aW1lc3RhbXBCYXNlID0gJWQsIG1pcnJvck1vZGUgPSAlZCIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBtUm90YXRpb24sIG1TdXJmYWNlU2V0SUQsIG1TdXJmYWNlVHlwZSwKKyAgICAgICAgICBTdHJpbmc4KG1QaHlzaWNhbENhbWVyYUlkKS5zdHJpbmcoKSwgbUlzTXVsdGlSZXNvbHV0aW9uLCBtU3RyZWFtVXNlQ2FzZSwgdGltZXN0YW1wQmFzZSwKKyAgICAgICAgICBtTWlycm9yTW9kZSk7CiAKICAgICByZXR1cm4gZXJyOwogfQpAQCAtMTk5LDYgKzI1MSwxMCBAQAogICAgIG1Jc1NoYXJlZCA9IGlzU2hhcmVkOwogICAgIG1QaHlzaWNhbENhbWVyYUlkID0gcGh5c2ljYWxJZDsKICAgICBtSXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZTsKKyAgICBtRHluYW1pY1JhbmdlUHJvZmlsZSA9IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQ7CisgICAgbVN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxUOworICAgIG1UaW1lc3RhbXBCYXNlID0gVElNRVNUQU1QX0JBU0VfREVGQVVMVDsKKyAgICBtTWlycm9yTW9kZSA9IE1JUlJPUl9NT0RFX0FVVE87CiB9CiAKIE91dHB1dENvbmZpZ3VyYXRpb246Ok91dHB1dENvbmZpZ3VyYXRpb24oCkBAIC0yMDcsNyArMjYzLDExIEBACiAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGlzU2hhcmVkKQogICA6IG1HYnBzKGdicHMpLCBtUm90YXRpb24ocm90YXRpb24pLCBtU3VyZmFjZVNldElEKHN1cmZhY2VTZXRJRCksIG1TdXJmYWNlVHlwZShzdXJmYWNlVHlwZSksCiAgICAgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpLCBtSXNEZWZlcnJlZChmYWxzZSksIG1Jc1NoYXJlZChpc1NoYXJlZCksCi0gICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCksIG1Jc011bHRpUmVzb2x1dGlvbihmYWxzZSkgeyB9CisgICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCksIG1Jc011bHRpUmVzb2x1dGlvbihmYWxzZSksCisgICAgbUR5bmFtaWNSYW5nZVByb2ZpbGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCksCisgICAgbVN0cmVhbVVzZUNhc2UoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCksCisgICAgbVRpbWVzdGFtcEJhc2UoVElNRVNUQU1QX0JBU0VfREVGQVVMVCksCisgICAgbU1pcnJvck1vZGUoTUlSUk9SX01PREVfQVVUTykgeyB9CiAKIHN0YXR1c190IE91dHB1dENvbmZpZ3VyYXRpb246OndyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKIApAQCAtMjU0LDYgKzMxNCwxOCBAQAogICAgIGVyciA9IHBhcmNlbC0+d3JpdGVQYXJjZWxhYmxlVmVjdG9yKG1TZW5zb3JQaXhlbE1vZGVzVXNlZCk7CiAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKIAorICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQ2NChtRHluYW1pY1JhbmdlUHJvZmlsZSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQ2NChtU3RyZWFtVXNlQ2FzZSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtVGltZXN0YW1wQmFzZSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtTWlycm9yTW9kZSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwCmluZGV4IDhjYTg5MjAuLjA5NGEzYzEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKQEAgLTQzLDYgKzQzLDcgQEAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjYiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi43IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyLVYxLW5kayIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNCIsCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhQmFzZS5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUJhc2UuaAppbmRleCBlMTU2OTk0Li44ZTUzOTY4IDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhQmFzZS5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFCYXNlLmgKQEAgLTg1LDExICs4NSwxNyBAQAogICAgICAqLwogICAgIHN0ZDo6dmVjdG9yPFN0cmluZzg+IHVuYXZhaWxhYmxlUGh5c2ljYWxJZHM7CiAKKyAgICAvKioKKyAgICAgKiBDbGllbnQgcGFja2FnZSBuYW1lIGlmIGNhbWVyYSBpcyBvcGVuLCBvdGhlcndpc2Ugbm90IGFwcGxpY2FibGUKKyAgICAgKi8KKyAgICBTdHJpbmc4IGNsaWVudFBhY2thZ2U7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpOwogCi0gICAgQ2FtZXJhU3RhdHVzKFN0cmluZzggaWQsIGludDMyX3QgcywgY29uc3Qgc3RkOjp2ZWN0b3I8U3RyaW5nOD4mIHVuYXZhaWxTdWJJZHMpIDoKLSAgICAgICAgICAgIGNhbWVyYUlkKGlkKSwgc3RhdHVzKHMpLCB1bmF2YWlsYWJsZVBoeXNpY2FsSWRzKHVuYXZhaWxTdWJJZHMpIHt9CisgICAgQ2FtZXJhU3RhdHVzKFN0cmluZzggaWQsIGludDMyX3QgcywgY29uc3Qgc3RkOjp2ZWN0b3I8U3RyaW5nOD4mIHVuYXZhaWxTdWJJZHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjbGllbnRQa2cpIDogY2FtZXJhSWQoaWQpLCBzdGF0dXMocyksCisgICAgICAgICAgICB1bmF2YWlsYWJsZVBoeXNpY2FsSWRzKHVuYXZhaWxTdWJJZHMpLCBjbGllbnRQYWNrYWdlKGNsaWVudFBrZykge30KICAgICBDYW1lcmFTdGF0dXMoKSA6IHN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCkge30KIH07CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuaAppbmRleCBjMzk4YWNhLi5hYWE4OGIyIDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhU2Vzc2lvblN0YXRzLmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVNlc3Npb25TdGF0cy5oCkBAIC0xOSw2ICsxOSw4IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgogCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiAKQEAgLTM1LDYgKzM3LDcgQEAKICAgICBpbnQgbVdpZHRoOwogICAgIGludCBtSGVpZ2h0OwogICAgIGludCBtRm9ybWF0OworICAgIGZsb2F0IG1NYXhQcmV2aWV3RnBzOwogICAgIGludCBtRGF0YVNwYWNlOwogICAgIGludDY0X3QgbVVzYWdlOwogCkBAIC02MCwxNiArNjMsMjYgQEAKICAgICAvLyBzaXplKG1IaXN0b2dyYW1CaW5zKSArIDEgPSBzaXplKG1IaXN0b2dyYW1Db3VudHMpCiAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbUhpc3RvZ3JhbUNvdW50czsKIAorICAgIC8vIER5bmFtaWMgcmFuZ2UgcHJvZmlsZQorICAgIGludDY0X3QgbUR5bmFtaWNSYW5nZVByb2ZpbGU7CisgICAgLy8gU3RyZWFtIHVzZSBjYXNlCisgICAgaW50NjRfdCBtU3RyZWFtVXNlQ2FzZTsKKwogICAgIENhbWVyYVN0cmVhbVN0YXRzKCkgOgotICAgICAgICAgICAgbVdpZHRoKDApLCBtSGVpZ2h0KDApLCBtRm9ybWF0KDApLCBtRGF0YVNwYWNlKDApLCBtVXNhZ2UoMCksCisgICAgICAgICAgICBtV2lkdGgoMCksIG1IZWlnaHQoMCksIG1Gb3JtYXQoMCksIG1NYXhQcmV2aWV3RnBzKDApLCBtRGF0YVNwYWNlKDApLCBtVXNhZ2UoMCksCiAgICAgICAgICAgICBtUmVxdWVzdENvdW50KDApLCBtRXJyb3JDb3VudCgwKSwgbVN0YXJ0TGF0ZW5jeU1zKDApLAotICAgICAgICAgICAgbU1heEhhbEJ1ZmZlcnMoMCksIG1NYXhBcHBCdWZmZXJzKDApLCBtSGlzdG9ncmFtVHlwZShISVNUT0dSQU1fVFlQRV9VTktOT1dOKSB7fQotICAgIENhbWVyYVN0cmVhbVN0YXRzKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwgaW50IGRhdGFTcGFjZSwgaW50NjRfdCB1c2FnZSwKLSAgICAgICAgICAgIGludCBtYXhIYWxCdWZmZXJzLCBpbnQgbWF4QXBwQnVmZmVycykKLSAgICAgICAgICAgIDogbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpLCBtRm9ybWF0KGZvcm1hdCksIG1EYXRhU3BhY2UoZGF0YVNwYWNlKSwKLSAgICAgICAgICAgICAgbVVzYWdlKHVzYWdlKSwgbVJlcXVlc3RDb3VudCgwKSwgbUVycm9yQ291bnQoMCksIG1TdGFydExhdGVuY3lNcygwKSwKLSAgICAgICAgICAgICAgbU1heEhhbEJ1ZmZlcnMobWF4SGFsQnVmZmVycyksIG1NYXhBcHBCdWZmZXJzKG1heEFwcEJ1ZmZlcnMpLAotICAgICAgICAgICAgICBtSGlzdG9ncmFtVHlwZShISVNUT0dSQU1fVFlQRV9VTktOT1dOKSB7fQorICAgICAgICAgICAgbU1heEhhbEJ1ZmZlcnMoMCksIG1NYXhBcHBCdWZmZXJzKDApLCBtSGlzdG9ncmFtVHlwZShISVNUT0dSQU1fVFlQRV9VTktOT1dOKSwKKyAgICAgICAgICAgIG1EeW5hbWljUmFuZ2VQcm9maWxlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQpLAorICAgICAgICAgICAgbVN0cmVhbVVzZUNhc2UoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCkge30KKyAgICBDYW1lcmFTdHJlYW1TdGF0cyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIGZsb2F0IG1heFByZXZpZXdGcHMsIGludCBkYXRhU3BhY2UsCisgICAgICAgICAgICBpbnQ2NF90IHVzYWdlLCBpbnQgbWF4SGFsQnVmZmVycywgaW50IG1heEFwcEJ1ZmZlcnMsIGludCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICAgICAgaW50IHN0cmVhbVVzZUNhc2UpCisgICAgICAgICAgICA6IG1XaWR0aCh3aWR0aCksIG1IZWlnaHQoaGVpZ2h0KSwgbUZvcm1hdChmb3JtYXQpLCBtTWF4UHJldmlld0ZwcyhtYXhQcmV2aWV3RnBzKSwKKyAgICAgICAgICAgICAgbURhdGFTcGFjZShkYXRhU3BhY2UpLCBtVXNhZ2UodXNhZ2UpLCBtUmVxdWVzdENvdW50KDApLCBtRXJyb3JDb3VudCgwKSwKKyAgICAgICAgICAgICAgbVN0YXJ0TGF0ZW5jeU1zKDApLCBtTWF4SGFsQnVmZmVycyhtYXhIYWxCdWZmZXJzKSwgbU1heEFwcEJ1ZmZlcnMobWF4QXBwQnVmZmVycyksCisgICAgICAgICAgICAgIG1IaXN0b2dyYW1UeXBlKEhJU1RPR1JBTV9UWVBFX1VOS05PV04pLAorICAgICAgICAgICAgICBtRHluYW1pY1JhbmdlUHJvZmlsZShkeW5hbWljUmFuZ2VQcm9maWxlKSwKKyAgICAgICAgICAgICAgbVN0cmVhbVVzZUNhc2Uoc3RyZWFtVXNlQ2FzZSkge30KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CkBAIC0xMTEsNiArMTI0LDcgQEAKICAgICBib29sIG1Jc05kazsKICAgICAvLyBsYXRlbmN5IGluIG1zIGZvciBjYW1lcmEgb3BlbiwgY2xvc2UsIG9yIHNlc3Npb24gY3JlYXRpb24uCiAgICAgaW50IG1MYXRlbmN5TXM7CisgICAgZmxvYXQgbU1heFByZXZpZXdGcHM7CiAKICAgICAvLyBTZXNzaW9uIGluZm8gYW5kIHN0YXRpc3RpY3MKICAgICBpbnQgbVNlc3Npb25UeXBlOwpAQCAtMTIyLDYgKzEzNiw4IEBACiAgICAgLy8gV2hldGhlciB0aGUgZGV2aWNlIHJ1bnMgaW50byBhbiBlcnJvciBzdGF0ZQogICAgIGJvb2wgbURldmljZUVycm9yOwogICAgIHN0ZDo6dmVjdG9yPENhbWVyYVN0cmVhbVN0YXRzPiBtU3RyZWFtU3RhdHM7CisgICAgU3RyaW5nMTYgbVVzZXJUYWc7CisgICAgaW50IG1WaWRlb1N0YWJpbGl6YXRpb25Nb2RlOwogCiAgICAgLy8gQ29uc3RydWN0b3JzCiAgICAgQ2FtZXJhU2Vzc2lvblN0YXRzKCk7CmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhVXRpbHMuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oCmluZGV4IGEzOTdjY2QuLjMxZDI1ZTcgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oCkBAIC0zNywxMCArMzcsMTMgQEAKICAgICAgICAgICogbWV0YWRhdGEuICBUaGlzIGlzIGJhc2VkIG9uIHRoZSBzZW5zb3Igb3JpZW50YXRpb24gYW5kIGxlbnMgZmFjaW5nCiAgICAgICAgICAqIGF0dHJpYnV0ZXMgb2YgdGhlIGNhbWVyYSBkZXZpY2UuCiAgICAgICAgICAqCisgICAgICAgICAqIElmIG1pcnJvck1vZGUgaXMgbm90IEFVVE8sIGl0IHdpbGwgYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgbGVucworICAgICAgICAgKiBmYWNpbmcgYmFzZWQgbWlycm9yLgorICAgICAgICAgKgogICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KICAgICAgICAgICovCiAgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRSb3RhdGlvblRyYW5zZm9ybShjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKLSAgICAgICAgICAgICAgICAvKm91dCovaW50MzJfdCogdHJhbnNmb3JtKTsKKyAgICAgICAgICAgICAgICBpbnQgbWlycm9yTW9kZSwgLypvdXQqL2ludDMyX3QqIHRyYW5zZm9ybSk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrIGlmIHRoZSBpbWFnZSBkYXRhIGlzIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEsIHRoYXQgY29udGFpbnMgYSBuYXRpdmUgaGFuZGxlLgpkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmgKaW5kZXggNTA2YWJhYi4uMjhkYmM3YyAxMDA2NDQKLS0tIGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5oCkBAIC02Myw2ICs2Myw4IEBACiAKICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtQ29udGV4dDsgLy8gYXJiaXRyYXJ5IHVzZXIgY29udGV4dCBmcm9tIE5ESyBhcHBzLCBudWxsIGZvciBqYXZhIGFwcHMKIAorICAgIHN0ZDo6c3RyaW5nICAgICAgICAgICAgIG1Vc2VyVGFnOyAvLyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdCBwYXNzZWQgaW50byBzZXRUYWcuCisKICAgICAvKioKICAgICAgKiBLZWVwIGltcGwgdXAtdG8tZGF0ZSB3aXRoIENhcHR1cmVSZXF1ZXN0LmphdmEgaW4gZnJhbWV3b3Jrcy9iYXNlCiAgICAgICovCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKaW5kZXggZjgwZWQzYS4uYjg0Mjg4NSAxMDA2NDQKLS0tIGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaApAQCAtMzgsMTYgKzM4LDM0IEBACiAgICAgICAgIFNVUkZBQ0VfVFlQRV9TVVJGQUNFX1ZJRVcgPSAwLAogICAgICAgICBTVVJGQUNFX1RZUEVfU1VSRkFDRV9URVhUVVJFID0gMQogICAgIH07CisgICAgZW51bSBUaW1lc3RhbXBCYXNlVHlwZSB7CisgICAgICAgIFRJTUVTVEFNUF9CQVNFX0RFRkFVTFQgPSAwLAorICAgICAgICBUSU1FU1RBTVBfQkFTRV9TRU5TT1IgPSAxLAorICAgICAgICBUSU1FU1RBTVBfQkFTRV9NT05PVE9OSUMgPSAyLAorICAgICAgICBUSU1FU1RBTVBfQkFTRV9SRUFMVElNRSA9IDMsCisgICAgICAgIFRJTUVTVEFNUF9CQVNFX0NIT1JFT0dSQVBIRVJfU1lOQ0VEID0gNAorICAgIH07CisgICAgZW51bSBNaXJyb3JNb2RlVHlwZSB7CisgICAgICAgIE1JUlJPUl9NT0RFX0FVVE8gPSAwLAorICAgICAgICBNSVJST1JfTU9ERV9OT05FID0gMSwKKyAgICAgICAgTUlSUk9SX01PREVfSCA9IDIsCisgICAgICAgIE1JUlJPUl9NT0RFX1YgPSAzLAorICAgIH07CisKICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4mIGdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcnMoKSBjb25zdDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBnZXRSb3RhdGlvbigpIGNvbnN0OwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGdldFN1cmZhY2VTZXRJRCgpIGNvbnN0OwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGdldFN1cmZhY2VUeXBlKCkgY29uc3Q7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V2lkdGgoKSBjb25zdDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBnZXRIZWlnaHQoKSBjb25zdDsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICBnZXREeW5hbWljUmFuZ2VQcm9maWxlKCkgY29uc3Q7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgaXNEZWZlcnJlZCgpIGNvbnN0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIGlzU2hhcmVkKCkgY29uc3Q7CiAgICAgU3RyaW5nMTYgICAgICAgICAgICAgICAgICAgZ2V0UGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIGlzTXVsdGlSZXNvbHV0aW9uKCkgY29uc3Q7CisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgZ2V0U3RyZWFtVXNlQ2FzZSgpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGdldFRpbWVzdGFtcEJhc2UoKSBjb25zdDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBnZXRNaXJyb3JNb2RlKCkgY29uc3Q7CiAKICAgICAvLyBzZXQgb2Ygc2Vuc29yIHBpeGVsIG1vZGUgcmVzb2x1dGlvbnMgYWxsb3dlZCB7TUFYX1JFU09MVVRJT04sIERFRkFVTFRfTU9ERX07CiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mICAgICAgICAgICAgZ2V0U2Vuc29yUGl4ZWxNb2Rlc1VzZWQoKSBjb25zdDsKQEAgLTg5LDcgKzEwNywxMSBAQAogICAgICAgICAgICAgICAgIGdicHNFcXVhbChvdGhlcikgJiYKICAgICAgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFJZCA9PSBvdGhlci5tUGh5c2ljYWxDYW1lcmFJZCAmJgogICAgICAgICAgICAgICAgIG1Jc011bHRpUmVzb2x1dGlvbiA9PSBvdGhlci5tSXNNdWx0aVJlc29sdXRpb24gJiYKLSAgICAgICAgICAgICAgICBzZW5zb3JQaXhlbE1vZGVzVXNlZEVxdWFsKG90aGVyKSk7CisgICAgICAgICAgICAgICAgc2Vuc29yUGl4ZWxNb2Rlc1VzZWRFcXVhbChvdGhlcikgJiYKKyAgICAgICAgICAgICAgICBtRHluYW1pY1JhbmdlUHJvZmlsZSA9PSBvdGhlci5tRHluYW1pY1JhbmdlUHJvZmlsZSAmJgorICAgICAgICAgICAgICAgIG1TdHJlYW1Vc2VDYXNlID09IG90aGVyLm1TdHJlYW1Vc2VDYXNlICYmCisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcEJhc2UgPT0gb3RoZXIubVRpbWVzdGFtcEJhc2UgJiYKKyAgICAgICAgICAgICAgICBtTWlycm9yTW9kZSA9PSBvdGhlci5tTWlycm9yTW9kZSk7CiAgICAgfQogICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKQEAgLTEyNiw2ICsxNDgsMTggQEAKICAgICAgICAgaWYgKCFzZW5zb3JQaXhlbE1vZGVzVXNlZEVxdWFsKG90aGVyKSkgewogICAgICAgICAgICAgcmV0dXJuIHNlbnNvclBpeGVsTW9kZXNVc2VkTGVzc1RoYW4ob3RoZXIpOwogICAgICAgICB9CisgICAgICAgIGlmIChtRHluYW1pY1JhbmdlUHJvZmlsZSAhPSBvdGhlci5tRHluYW1pY1JhbmdlUHJvZmlsZSkgeworICAgICAgICAgICAgcmV0dXJuIG1EeW5hbWljUmFuZ2VQcm9maWxlIDwgb3RoZXIubUR5bmFtaWNSYW5nZVByb2ZpbGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdHJlYW1Vc2VDYXNlICE9IG90aGVyLm1TdHJlYW1Vc2VDYXNlKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0cmVhbVVzZUNhc2UgPCBvdGhlci5tU3RyZWFtVXNlQ2FzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRpbWVzdGFtcEJhc2UgIT0gb3RoZXIubVRpbWVzdGFtcEJhc2UpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGltZXN0YW1wQmFzZSA8IG90aGVyLm1UaW1lc3RhbXBCYXNlOworICAgICAgICB9CisgICAgICAgIGlmIChtTWlycm9yTW9kZSAhPSBvdGhlci5tTWlycm9yTW9kZSkgeworICAgICAgICAgICAgcmV0dXJuIG1NaXJyb3JNb2RlIDwgb3RoZXIubU1pcnJvck1vZGU7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGdicHNMZXNzVGhhbihvdGhlcik7CiAgICAgfQogCkBAIC0xNTAsNiArMTg0LDEwIEBACiAgICAgU3RyaW5nMTYgICAgICAgICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhSWQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUlzTXVsdGlSZXNvbHV0aW9uOwogICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+ICAgICAgIG1TZW5zb3JQaXhlbE1vZGVzVXNlZDsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICBtRHluYW1pY1JhbmdlUHJvZmlsZTsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVXNlQ2FzZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wQmFzZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBtTWlycm9yTW9kZTsKIH07CiB9IC8vIG5hbWVzcGFjZSBwYXJhbXMKIH0gLy8gbmFtZXNwYWNlIGNhbWVyYTIKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKaW5kZXggMWFjODQ4Mi4uOWM5ODc3OCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKKysrIGIvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgogCiAjaW5jbHVkZSAiaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jIgorI2luY2x1ZGUgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTcyLDIyICs3MywxNiBAQAogICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyIHx8IHJlcXVlc3RzID09IG51bGxwdHIgfHwgbnVtUmVxdWVzdHMgPCAxKSB7Ci0gICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGludmFsaWQgaW5wdXQ6IHNlc3Npb24gJXAsIG51bVJlcXVlc3QgJWQsIHJlcXVlc3RzICVwIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlc3Npb24sIG51bVJlcXVlc3RzLCByZXF1ZXN0cyk7Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotICAgIH0KKyAgICByZXR1cm4gY2FwdHVyZVRlbXBsYXRlKHNlc3Npb24sIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Cit9CiAKLSAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgewotICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOwotICAgICAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gQ0FQVFVSRV9TRVFVRU5DRV9JRF9OT05FOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwotICAgIH0KLQotICAgIHJldHVybiBzZXNzaW9uLT5jYXB0dXJlKAotICAgICAgICAgICAgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlVjIoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3NWMiogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICByZXR1cm4gY2FwdHVyZVRlbXBsYXRlKHNlc3Npb24sIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7CiB9CiAKIEVYUE9SVApAQCAtOTcsMjIgKzkyLDI2IEBACiAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGlmIChzZXNzaW9uID09IG51bGxwdHIgfHwgcmVxdWVzdHMgPT0gbnVsbHB0ciB8fCBudW1SZXF1ZXN0cyA8IDEpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogaW52YWxpZCBpbnB1dDogc2Vzc2lvbiAlcCwgbnVtUmVxdWVzdCAlZCwgcmVxdWVzdHMgJXAiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2Vzc2lvbiwgbnVtUmVxdWVzdHMsIHJlcXVlc3RzKTsKLSAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7Ci0gICAgfQorICAgIHJldHVybiBjYXB0dXJlVGVtcGxhdGUoc2Vzc2lvbiwgbGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Cit9CiAKLSAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgewotICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOwotICAgICAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICAgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKLSAgICB9CitFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlVjIoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrc1YyKiBsY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICByZXR1cm4gY2FwdHVyZVRlbXBsYXRlKHNlc3Npb24sIGxjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworfQogCi0gICAgcmV0dXJuIHNlc3Npb24tPmNhcHR1cmUoCi0gICAgICAgICAgICBsY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0VjIoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3NWMiogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICByZXR1cm4gc2V0UmVwZWF0aW5nUmVxdWVzdFRlbXBsYXRlKHNlc3Npb24sIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7CiB9CiAKIEVYUE9SVApAQCAtMTIxLDIzICsxMjAsMTAgQEAKICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgewogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0ciB8fCByZXF1ZXN0cyA9PSBudWxscHRyIHx8IG51bVJlcXVlc3RzIDwgMSkgewotICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBpbnZhbGlkIGlucHV0OiBzZXNzaW9uICVwLCBudW1SZXF1ZXN0ICVkLCByZXF1ZXN0cyAlcCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzZXNzaW9uLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMpOwotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgewotICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOwotICAgICAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICAgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gc2Vzc2lvbi0+c2V0UmVwZWF0aW5nUmVxdWVzdChjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworICAgIHJldHVybiBzZXRSZXBlYXRpbmdSZXF1ZXN0VGVtcGxhdGUoc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIH0KIAorCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0KAogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCkBAIC0xNDUsMjEgKzEzMSwxOCBAQAogICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyIHx8IHJlcXVlc3RzID09IG51bGxwdHIgfHwgbnVtUmVxdWVzdHMgPCAxKSB7Ci0gICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGludmFsaWQgaW5wdXQ6IHNlc3Npb24gJXAsIG51bVJlcXVlc3QgJWQsIHJlcXVlc3RzICVwIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlc3Npb24sIG51bVJlcXVlc3RzLCByZXF1ZXN0cyk7Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotICAgIH0KKyAgICByZXR1cm4gc2V0UmVwZWF0aW5nUmVxdWVzdFRlbXBsYXRlKHNlc3Npb24sIGxjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworfQogCi0gICAgaWYgKHNlc3Npb24tPmlzQ2xvc2VkKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uICVwIGlzIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fLCBzZXNzaW9uKTsKLSAgICAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7Ci0gICAgICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7Ci0gICAgfQogCi0gICAgcmV0dXJuIHNlc3Npb24tPnNldFJlcGVhdGluZ1JlcXVlc3QobGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7CitFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0VjIoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrc1YyKiBsY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICByZXR1cm4gc2V0UmVwZWF0aW5nUmVxdWVzdFRlbXBsYXRlKHNlc3Npb24sIGxjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOwogfQogCiBFWFBPUlQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jIGIvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ZTIwZAotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKworI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKwordGVtcGxhdGUgPGNsYXNzIENhbGxiYWNrVHlwZT4KK2NhbWVyYV9zdGF0dXNfdCBjYXB0dXJlVGVtcGxhdGUoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQ2FsbGJhY2tUeXBlKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChzZXNzaW9uID09IG51bGxwdHIgfHwgcmVxdWVzdHMgPT0gbnVsbHB0ciB8fCBudW1SZXF1ZXN0cyA8IDEpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogaW52YWxpZCBpbnB1dDogc2Vzc2lvbiAlcCwgbnVtUmVxdWVzdCAlZCwgcmVxdWVzdHMgJXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2Vzc2lvbiwgbnVtUmVxdWVzdHMsIHJlcXVlc3RzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgaWYgKHNlc3Npb24tPmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uICVwIGlzIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fLCBzZXNzaW9uKTsKKyAgICAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorCisgICAgcmV0dXJuIHNlc3Npb24tPmNhcHR1cmUoCisgICAgICAgICAgICBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ2FsbGJhY2tUeXBlPgorY2FtZXJhX3N0YXR1c190IHNldFJlcGVhdGluZ1JlcXVlc3RUZW1wbGF0ZSgKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9DYWxsYmFja1R5cGUqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0ciB8fCByZXF1ZXN0cyA9PSBudWxscHRyIHx8IG51bVJlcXVlc3RzIDwgMSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBpbnZhbGlkIGlucHV0OiBzZXNzaW9uICVwLCBudW1SZXF1ZXN0ICVkLCByZXF1ZXN0cyAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzZXNzaW9uLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOworICAgICAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICAgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKKyAgICB9CisKKyAgICByZXR1cm4gc2Vzc2lvbi0+c2V0UmVwZWF0aW5nUmVxdWVzdChjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IGRkNjUyYzcuLjc5OTc3NjggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTI2LDggKzI2LDYgQEAKICNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKICNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAotI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMiCi0KIEFDYW1lcmFEZXZpY2U6On5BQ2FtZXJhRGV2aWNlKCkgewogICAgIG1EZXZpY2UtPnN0b3BMb29wZXJBbmREaXNjb25uZWN0KCk7CiB9CkBAIC05MTMsNiArOTExLDcgQEAKICAgICAgICAgY2FzZSBrV2hhdE9uRXJyb3I6CiAgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uU3RhdGVDYjoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDI6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKQEAgLTk4NSw2ICs5ODQsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uU3RhdGVDYjoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDI6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKQEAgLTEwMDQsNiArMTAwNCw3IEBACiAgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdFNwID0gbnVsbHB0cjsKICAgICAgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQyOgogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CkBAIC0xMDU1LDYgKzEwNTYsMzUgQEAKICAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQyOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydFYyIG9uU3RhcnQyOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblN0YXJ0Mik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSBzdGFydFYyIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3RhcnQyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQ2NChrVGltZVN0YW1wS2V5LCAmdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCB0aW1lc3RhbXAhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDY0KGtGcmFtZU51bWJlcktleSwgJmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBmcmFtZSBudW1iZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblN0YXJ0MikoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgdGltZXN0YW1wLCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uUmVzdWx0OwpAQCAtMTI4NSw3ICsxMzE1LDggQEAKICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgOgogICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKICAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKLSAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKGZhbHNlKSB7CisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayhmYWxzZSksCisgICAgICAgIG1JczJDYWxsYmFjayhmYWxzZSkgewogICAgIGluaXRDYXB0dXJlQ2FsbGJhY2tzKGNicyk7CiAKICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKQEAgLTEzMDEsNyArMTMzMiw4IEBACiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpIDoKICAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCiAgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCi0gICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayh0cnVlKSB7CisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayh0cnVlKSwKKyAgICAgICAgbUlzMkNhbGxiYWNrKGZhbHNlKSB7CiAgICAgaW5pdENhcHR1cmVDYWxsYmFja3MobGNicyk7CiAKICAgICBpZiAobGNicyAhPSBudWxscHRyKSB7CkBAIC0xMzEwLDYgKzEzNDIsNDAgQEAKICAgICB9CiB9CiAKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzVjIqIGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKGZhbHNlKSwKKyAgICAgICAgbUlzMkNhbGxiYWNrKHRydWUpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrc1YyKGNicyk7CisKKyAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IGNicy0+b25DYXB0dXJlQ29tcGxldGVkOworICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gY2JzLT5vbkNhcHR1cmVGYWlsZWQ7CisgICAgfQorfQorCitDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSG9sZGVyOjpDYWxsYmFja0hvbGRlcigKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzVjIqIGxjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayh0cnVlKSwKKyAgICAgICAgbUlzMkNhbGxiYWNrKHRydWUpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrc1YyKGxjYnMpOworCisgICAgaWYgKGxjYnMgIT0gbnVsbHB0cikgeworICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IGxjYnMtPm9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CisgICAgICAgIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkID0gbGNicy0+b25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZDsKKyAgICB9Cit9CisKIHZvaWQKIENhbWVyYURldmljZTo6Y2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKAogICAgIGNvbnN0IGludCBzZXF1ZW5jZUlkLCBjb25zdCBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcikgewpAQCAtMTUzNiw3ICsxNjAyLDYgQEAKICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCkgewogICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwotCiAgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZApAQCAtMTU1MSwxMSArMTYxNiwxNCBAQAogCiAgICAgaW50IHNlcXVlbmNlSWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOwogICAgIGludDMyX3QgYnVyc3RJZCA9IHJlc3VsdEV4dHJhcy5idXJzdElkOworICAgIGludDY0X3QgZnJhbWVOdW1iZXIgPSByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXI7CiAKICAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOwogICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CiAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKKyAgICAgICAgYm9vbCB2MkNhbGxiYWNrID0gY2JoLm1JczJDYWxsYmFjazsKICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0ID0gY2JoLm1PbkNhcHR1cmVTdGFydGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0VjIgb25TdGFydDIgPSBjYmgubU9uQ2FwdHVyZVN0YXJ0ZWQyOwogICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CiAgICAgICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKQEAgLTE1NjMsMTIgKzE2MzEsMTkgQEAKICAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CiAgICAgICAgIH0KICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOwotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0LCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG51bGxwdHI7CisgICAgICAgIGlmICh2MkNhbGxiYWNrKSB7CisgICAgICAgICAgICBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU3RhcnQyLCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblN0YXJ0Mik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU3RhcnQsIGRldi0+bUhhbmRsZXIpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCAqKW9uU3RhcnQpOworICAgICAgICB9CiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblN0YXJ0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKICAgICAgICAgbXNnLT5zZXRJbnQ2NChrVGltZVN0YW1wS2V5LCB0aW1lc3RhbXApOworICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgZnJhbWVOdW1iZXIpOwogICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0KICAgICByZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKaW5kZXggMzQ0ZDk2NC4uMTc5ODhmZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCkBAIC0yMTUsNiArMjE1LDcgQEAKICAgICAgICAga1doYXRTZXNzaW9uU3RhdGVDYiwgICAvLyBvblJlYWR5LCBvbkFjdGl2ZQogICAgICAgICAvLyBDYXB0dXJlIGNhbGxiYWNrcwogICAgICAgICBrV2hhdENhcHR1cmVTdGFydCwgICAgIC8vIG9uQ2FwdHVyZVN0YXJ0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlU3RhcnQyLCAgICAgLy8gb25DYXB0dXJlU3RhcnRlZAogICAgICAgICBrV2hhdENhcHR1cmVSZXN1bHQsICAgIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQsIG9uQ2FwdHVyZUNvbXBsZXRlZAogICAgICAgICBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0LCAvLyBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZUZhaWwsICAgICAgLy8gb25DYXB0dXJlRmFpbGVkCkBAIC0yOTQsMTEgKzI5NSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAogICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAogICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzKTsKLQotICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KLSAgICAgICAgdm9pZCBpbml0Q2FwdHVyZUNhbGxiYWNrcyhUKiBjYnMpIHsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrc1YyKiBjYnMpOworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3NWMiogbGNicyk7CisgICAgICAgIHZvaWQgY2xlYXJDYWxsYmFja3MoKSB7CiAgICAgICAgICAgICBtQ29udGV4dCA9IG51bGxwdHI7CiAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZDIgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uQ2FwdHVyZVByb2dyZXNzZWQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CiAgICAgICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CkBAIC0zMDcsNiArMzE1LDI0IEBACiAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCA9IG51bGxwdHI7CiAgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgICAgdm9pZCBpbml0Q2FwdHVyZUNhbGxiYWNrc1YyKFQqIGNicykgeworICAgICAgICAgICAgY2xlYXJDYWxsYmFja3MoKTsKKyAgICAgICAgICAgIGlmIChjYnMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1Db250ZXh0ID0gY2JzLT5jb250ZXh0OworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkMiA9IGNicy0+b25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlUHJvZ3Jlc3NlZCA9IGNicy0+b25DYXB0dXJlUHJvZ3Jlc3NlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IGNicy0+b25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgICB2b2lkIGluaXRDYXB0dXJlQ2FsbGJhY2tzKFQqIGNicykgeworICAgICAgICAgICAgY2xlYXJDYWxsYmFja3MoKTsKICAgICAgICAgICAgIGlmIChjYnMgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIG1Db250ZXh0ID0gY2JzLT5jb250ZXh0OwogICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gY2JzLT5vbkNhcHR1cmVTdGFydGVkOwpAQCAtMzIwLDkgKzM0NiwxMSBAQAogICAgICAgICBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gbVJlcXVlc3RzOwogICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUlzUmVwZWF0aW5nOwogICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrOworICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUlzMkNhbGxiYWNrOwogCiAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dDsKICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBtT25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydFYyIG1PbkNhcHR1cmVTdGFydGVkMjsKICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uQ2FwdHVyZVByb2dyZXNzZWQ7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVDb21wbGV0ZWQ7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAppbmRleCA5NWVmMmIyLi41ODkyZjFhIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTE4OSw4ICsxODksMTIgQEAKICAgICBzcDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBjbSA9IG1DYW1lcmFNYW5hZ2VyLnByb21vdGUoKTsKICAgICBpZiAoY20gIT0gbnVsbHB0cikgewogICAgICAgICBBdXRvTXV0ZXggbG9jayhjbS0+bUxvY2spOworICAgICAgICBzdGQ6OnZlY3RvcjxTdHJpbmc4PiBjYW1lcmFJZExpc3Q7CiAgICAgICAgIGZvciAoYXV0byYgcGFpciA6IGNtLT5tRGV2aWNlU3RhdHVzTWFwKSB7Ci0gICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICBjYW1lcmFJZExpc3QucHVzaF9iYWNrKHBhaXIuZmlyc3QpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChTdHJpbmc4IGNhbWVyYUlkIDogY2FtZXJhSWRMaXN0KSB7CiAgICAgICAgICAgICBjbS0+b25TdGF0dXNDaGFuZ2VkTG9ja2VkKAogICAgICAgICAgICAgICAgICAgICBDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVCwgY2FtZXJhSWQpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCmluZGV4IGNjYmZhYTkuLmQ1M2Q4MDkgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCkBAIC05NSw2ICs5NSw5IEBACiAgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25Ub3JjaFN0YXR1c0NoYW5nZWQoaW50MzJfdCwgY29uc3QgU3RyaW5nMTYmKSB7CiAgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblRvcmNoU3RyZW5ndGhMZXZlbENoYW5nZWQoY29uc3QgU3RyaW5nMTYmLCBpbnQzMl90KSB7CisgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgICAgIH0KIAogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKTsKICAgICAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkNhbWVyYU9wZW5lZChjb25zdCBTdHJpbmcxNiYsIGNvbnN0IFN0cmluZzE2JikgewpAQCAtMTM5LDYgKzE0Miw4IEBACiAgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CiAgICAgICAgIH0KICAgICAgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV29yZGVyZWQtY29tcGFyZS1mdW5jdGlvbi1wb2ludGVycyIKICAgICAgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgaWYgKG1Db250ZXh0ICE9IG90aGVyLm1Db250ZXh0KSByZXR1cm4gbUNvbnRleHQgPCBvdGhlci5tQ29udGV4dDsKICAgICAgICAgICAgIGlmIChtUGh5c2ljYWxDYW1BdmFpbGFibGUgIT0gb3RoZXIubVBoeXNpY2FsQ2FtQXZhaWxhYmxlKSB7CkBAIC0xNTIsNiArMTU3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlICE9IG90aGVyLm1BdmFpbGFibGUpIHJldHVybiBtQXZhaWxhYmxlIDwgb3RoZXIubUF2YWlsYWJsZTsKICAgICAgICAgICAgIHJldHVybiBtVW5hdmFpbGFibGUgPCBvdGhlci5tVW5hdmFpbGFibGU7CisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAogICAgICAgICB9CiAgICAgICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CiAgICAgICAgICAgICByZXR1cm4gKCp0aGlzICE9IG90aGVyICYmICEoKnRoaXMgPCBvdGhlcikpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcAppbmRleCBkYWIyZmVmLi4wNTEyNGMwIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcApAQCAtMTgyLDcgKzE4Miw3IEBACiAgICAgICAgIGludDY0X3QgZm9ybWF0ID0gZW50cnkuZGF0YS5pNjRbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKICAgICAgICAgaW50NjRfdCB3aWR0aCA9IGVudHJ5LmRhdGEuaTY0W2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKICAgICAgICAgaW50NjRfdCBoZWlnaHQgPSBlbnRyeS5kYXRhLmk2NFtpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOwotICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9EVVJBVElPTl9PRkZTRVRdOworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gZW50cnkuZGF0YS5pNjRbaSArIFNUUkVBTV9EVVJBVElPTl9PRkZTRVRdOwogCiAgICAgICAgIC8vIExlYXZlIHRoZSB1bmZpbHRlcmVkIGZvcm1hdCBpbiBzbyBhcHBzIGRlcGVuZGluZyBvbiBwcmV2aW91cyB3cm9uZwogICAgICAgICAvLyBmaWx0ZXIgYmVoYXZpb3IgY29udGludWUgdG8gd29yawpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCmluZGV4IDJiN2YwNDAuLmIwZmQwMGMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgKQEAgLTgxMSw2ICs4MTEsMTg0IEBACiAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIF9fSU5UUk9EVUNFRF9JTigyOSk7CiAKKy8qKgorICogVGhlIGRlZmluaXRpb24gb2YgY2FtZXJhIGNhcHR1cmUgc3RhcnQgY2FsbGJhY2suIFRoZSBzYW1lIGFzCisgKiB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlU3RhcnRlZH0sIGV4Y2VwdCB0aGF0CisgKiBpdCBoYXMgdGhlIGZyYW1lIG51bWJlciBvZiB0aGUgY2FwdHVyZSBhcyB3ZWxsLgorICoKKyAqIEBwYXJhbSBjb250ZXh0IFRoZSBvcHRpb25hbCBhcHBsaWNhdGlvbiBjb250ZXh0IHByb3ZpZGVkIGJ5IHVzZXIgaW4KKyAqICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrc30uCisgKiBAcGFyYW0gc2Vzc2lvbiBUaGUgY2FtZXJhIGNhcHR1cmUgc2Vzc2lvbiBvZiBpbnRlcmVzdC4KKyAqIEBwYXJhbSByZXF1ZXN0IFRoZSBjYXB0dXJlIHJlcXVlc3QgdGhhdCBpcyBzdGFydGluZy4gTm90ZSB0aGF0IHRoaXMgcG9pbnRlciBwb2ludHMgdG8gYSBjb3B5IG9mCisgKiAgICAgICAgICAgICAgICBjYXB0dXJlIHJlcXVlc3Qgc2VudCBieSBhcHBsaWNhdGlvbiwgc28gdGhlIGFkZHJlc3MgaXMgZGlmZmVyZW50IHRvIHdoYXQKKyAqICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNlbnQgYnV0IHRoZSBjb250ZW50IHdpbGwgbWF0Y2guIFRoaXMgcmVxdWVzdCB3aWxsIGJlIGZyZWVkIGJ5CisgKiAgICAgICAgICAgICAgICBmcmFtZXdvcmsgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBjYWxsYmFjayByZXR1cm5zLgorICogQHBhcmFtIHRpbWVzdGFtcCBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGNhcHR1cmUgaXMgc3RhcnRlZC4gVGhpcyB0aW1lc3RhbXAgd2lsbCBtYXRjaAorICogICAgICAgICAgICAgICAgICB7QGxpbmsgQUNBTUVSQV9TRU5TT1JfVElNRVNUQU1QfSBvZiB0aGUge0BsaW5rIEFDYW1lcmFNZXRhZGF0YX0gaW4KKyAqICAgICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzI29uQ2FwdHVyZUNvbXBsZXRlZH0gY2FsbGJhY2suCisgKiBAcGFyYW0gZnJhbWVOdW1iZXIgdGhlIGZyYW1lIG51bWJlciBvZiB0aGUgY2FwdHVyZSBzdGFydGVkCisgKi8KK3R5cGVkZWYgdm9pZCAoKkFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnRWMikoCisgICAgICAgIHZvaWQqIGNvbnRleHQsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBpbnQ2NF90IHRpbWVzdGFtcCwgaW50NjRfdCBmcmFtZU51bWJlcik7CisvKioKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MsCisgKiB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBjYXB0dXJlQ2FsbGJhY2tfc3RhcnRWMiBjYWxsYmFjayBpcworICogdXNlZCwgaW5zdGVhZCBvZiBjYXB0dXJlQ2FsbGJhY2tfc3RhcnQsIHRvIHN1cHBvcnQgcmV0cmlldmluZyB0aGUgZnJhbWUgbnVtYmVyLgorICovCit0eXBlZGVmIHN0cnVjdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrc1YyIHsKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzCisgICAgICovCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVTdGFydGVkfSwKKyAgICAgKiBleGNlcHQgdGhhdCBpdCBoYXMgdGhlIGZyYW1lIG51bWJlciBvZiB0aGUgY2FwdHVyZSBhZGRlZCBpbiB0aGUgcGFyYW1ldGVyCisgICAgICogbGlzdC4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0VjIgICAgICAgICBvbkNhcHR1cmVTdGFydGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlUHJvZ3Jlc3NlZH0uCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgICAgICAgIG9uQ2FwdHVyZVByb2dyZXNzZWQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVDb21wbGV0ZWR9LgorICAgICAqLworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0ICAgICAgICBvbkNhcHR1cmVDb21wbGV0ZWQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVGYWlsZWR9LgorICAgICAqLworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkICAgICAgICBvbkNhcHR1cmVGYWlsZWQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZH0uCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCAgIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkfS4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlQWJvcnQgb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlQnVmZmVyTG9zdH0uCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0ICAgIG9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisKKworfSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrc1YyOworCisvKioKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcywKKyAqIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IGFuIGNhcHR1cmVDYWxsYmFja19zdGFydFYyIGNhbGxiYWNrIGlzCisgKiB1c2VkLCBpbnN0ZWFkIG9mIGNhcHR1cmVDYWxsYmFja19zdGFydCwgdG8gc3VwcG9ydCByZXRyaWV2aW5nIGZyYW1lIG51bWJlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrc1YyIHsKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzCisgICAgICovCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVTdGFydGVkfSwKKyAgICAgKiBleGNlcHQgdGhhdCBpdCBoYXMgdGhlIGZyYW1lIG51bWJlciBvZiB0aGUgY2FwdHVyZSBhZGRlZCBpbiB0aGUgcGFyYW1ldGVyCisgICAgICogbGlzdC4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0VjIgICAgICAgICBvbkNhcHR1cmVTdGFydGVkOworCisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVQcm9ncmVzc2VkfS4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCAgICAgICAgb25DYXB0dXJlUHJvZ3Jlc3NlZDsKKworICAgIC8qKgorICAgICAqIFNhbWUgYXMKKyAgICAgKiB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyNvbkxvZ2ljYWxDYXB0dXJlQ29tcGxldGVkfS4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBpbnN0ZWFkIG9mIHtAbGluayBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkfSB3aGVuIHRoZQorICAgICAqIGNhbWVyYSBkZXZpY2UgZmFpbGVkIHRvIHByb2R1Y2UgYSBjYXB0dXJlIHJlc3VsdCBmb3IgdGhlCisgICAgICogcmVxdWVzdC4KKyAgICAgKgorICAgICAqIDxwPk90aGVyIHJlcXVlc3RzIGFyZSB1bmFmZmVjdGVkLCBhbmQgc29tZSBvciBhbGwgaW1hZ2UgYnVmZmVycyBmcm9tCisgICAgICogdGhlIGNhcHR1cmUgbWF5IGhhdmUgYmVlbiBwdXNoZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBvdXRwdXQKKyAgICAgKiBzdHJlYW1zLjwvcD4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgQUNhcHR1cmVSZXF1ZXN0IHBvaW50ZXIgaW4gdGhlIGNhbGxiYWNrIHdpbGwgbm90IG1hdGNoIHdoYXQgYXBwbGljYXRpb24gaGFzCisgICAgICogc3VibWl0dGVkLCBidXQgdGhlIGNvbnRlbnRzIHRoZSBBQ2FwdHVyZVJlcXVlc3Qgd2lsbCBtYXRjaCB3aGF0IGFwcGxpY2F0aW9uIHN1Ym1pdHRlZC48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFMb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWx1cmUKKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZH0uCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCAgIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkfS4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlQWJvcnQgb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlQnVmZmVyTG9zdH0uCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0ICAgIG9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisKK30gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrc1YyOworCisvKioKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmUsIHdpdGggYWRkZWQKKyAqIHN1cHBvcnQgZm9yIHYyIG9mIGNhbWVyYSBjYWxsYmFja3MsIHdoZXJlIHRoZSBvbkNhcHR1cmVTdGFydGVkIGNhbGxiYWNrCisgKiBhZGRzIGZyYW1lIG51bWJlciBpbiBpdHMgcGFyYW1ldGVyIGxpc3QuCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZVYyKAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzVjIqIGNhbGxiYWNrcywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgX19JTlRST0RVQ0VEX0lOKDMzKTsKKworLyoqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsX3NldFJlcGVhdGluZ1JlcXVlc3QsIHdpdGggYWRkZWQKKyAqIHN1cHBvcnQgZm9yIHYyIG9mIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGNhbGxiYWNrcyB3aGVyZSB0aGUgb25DYXB0dXJlU3RhcnRlZAorICogY2FsbGJhY2sgYWRkcyBmcmFtZSBudW1iZXIgaW4gaXRzIHBhcmFtZXRlciBsaXN0LgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3NldFJlcGVhdGluZ1JlcXVlc3RWMigKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrc1YyKiBjYWxsYmFja3MsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIF9fSU5UUk9EVUNFRF9JTigzMyk7CisKKy8qKgorICogVGhpcyBoYXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbF9jYXB0dXJlLCB3aXRoIGFkZGVkCisgKiBzdXBwb3J0IGZvciB2MiBvZiBsb2dpY2FsIG11bHRpLWNhbWVyYSAgY2FsbGJhY2tzIHdoZXJlIHRoZSBvbkNhcHR1cmVTdGFydGVkIGNhbGxiYWNrCisgKiBhZGRzIGZyYW1lIG51bWJlciBpbiBpdHMgcGFyYW1ldGVyIGxpc3QuCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlVjIoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrc1YyKiBjYWxsYmFja3MsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIF9fSU5UUk9EVUNFRF9JTigzMyk7CisKKy8qKgorICogVGhpcyBoYXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbF9zZXRSZXBlYXRpbmdSZXF1ZXN0LCB3aXRoIGFkZGVkCisgKiBzdXBwb3J0IGZvciB2MiBvZiBsb2dpY2FsIG11bHRpLWNhbWVyYSBjYWxsYmFja3Mgd2hlcmUgdGhlIG9uQ2FwdHVyZVN0YXJ0ZWQKKyAqIGNhbGxiYWNrIGFkZHMgZnJhbWUgbnVtYmVyIGluIGl0cyBwYXJhbWV0ZXIgbGlzdC4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX3NldFJlcGVhdGluZ1JlcXVlc3RWMigKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzVjIqIGNhbGxiYWNrcywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgX19JTlRST0RVQ0VEX0lOKDMzKTsKKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FNRVJBX0NBUFRVUkVfU0VTU0lPTl9IICovCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaAppbmRleCA4Njc4MWU1Li5iNmY4NTUyIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKQEAgLTcyLDYgKzcyLDggQEAKICAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTiwKICAgICBBQ0FNRVJBX0hFSUMsCiAgICAgQUNBTUVSQV9IRUlDX0lORk8sCisgICAgQUNBTUVSQV9BVVRPTU9USVZFLAorICAgIEFDQU1FUkFfQVVUT01PVElWRV9MRU5TLAogICAgIEFDQU1FUkFfU0VDVElPTl9DT1VOVCwKIAogICAgIEFDQU1FUkFfVkVORE9SID0gMHg4MDAwCkBAIC0xMTUsNiArMTE3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAxNiwKICAgICBBQ0FNRVJBX0hFSUNfU1RBUlQgICAgICAgICAgICAgPSBBQ0FNRVJBX0hFSUMgICAgICAgICAgICAgIDw8IDE2LAogICAgIEFDQU1FUkFfSEVJQ19JTkZPX1NUQVJUICAgICAgICA9IEFDQU1FUkFfSEVJQ19JTkZPICAgICAgICAgPDwgMTYsCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX1NUQVJUICAgICAgID0gQUNBTUVSQV9BVVRPTU9USVZFICAgICAgICA8PCAxNiwKKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19TVEFSVCAgPSBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOUyAgIDw8IDE2LAogICAgIEFDQU1FUkFfVkVORE9SX1NUQVJUICAgICAgICAgICA9IEFDQU1FUkFfVkVORE9SICAgICAgICAgICAgPDwgMTYKIH0gYWNhbWVyYV9tZXRhZGF0YV9zZWN0aW9uX3N0YXJ0X3Q7CiAKQEAgLTUxNyw2ICs1MjEsMTQgQEAKICAgICAgKiByZWdpb24gYW5kIG91dHB1dCBvbmx5IHRoZSBpbnRlcnNlY3Rpb24gcmVjdGFuZ2xlIGFzIHRoZSBtZXRlcmluZyByZWdpb24gaW4gdGhlIHJlc3VsdAogICAgICAqIG1ldGFkYXRhLiAgSWYgdGhlIHJlZ2lvbiBpcyBlbnRpcmVseSBvdXRzaWRlIHRoZSBjcm9wIHJlZ2lvbiwgaXQgd2lsbCBiZSBpZ25vcmVkIGFuZAogICAgICAqIG5vdCByZXBvcnRlZCBpbiB0aGUgcmVzdWx0IG1ldGFkYXRhLjwvcD4KKyAgICAgKiA8cD5XaGVuIHNldHRpbmcgdGhlIEFFIG1ldGVyaW5nIHJlZ2lvbnMsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGNvbnNpZGVyIHRoZSBhZGRpdGlvbmFsCisgICAgICogY3JvcCByZXN1bHRlZCBmcm9tIHRoZSBhc3BlY3QgcmF0aW8gZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgcHJldmlldyBzdHJlYW0gYW5kCisgICAgICogQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04uIEZvciBleGFtcGxlLCBpZiB0aGUgQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04gaXMgdGhlIGZ1bGwKKyAgICAgKiBhY3RpdmUgYXJyYXkgc2l6ZSB3aXRoIDQ6MyBhc3BlY3QgcmF0aW8sIGFuZCB0aGUgcHJldmlldyBzdHJlYW0gaXMgMTY6OSwKKyAgICAgKiB0aGUgYm91bmRhcnkgb2YgQUUgcmVnaW9ucyB3aWxsIGJlIFswLCB5X2Nyb3BdIGFuZAorICAgICAqIFthY3RpdmVfd2lkdGgsIGFjdGl2ZV9oZWlnaHQgLSAyICogeV9jcm9wXSByYXRoZXIgdGhhbiBbMCwgMF0gYW5kCisgICAgICogW2FjdGl2ZV93aWR0aCwgYWN0aXZlX2hlaWdodF0sIHdoZXJlIHlfY3JvcCBpcyB0aGUgYWRkaXRpb25hbCBjcm9wIGR1ZSB0byBhc3BlY3QgcmF0aW8KKyAgICAgKiBtaXNtYXRjaC48L3A+CiAgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBUEkgbGV2ZWwgMzAsIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiBhY3RpdmVBcnJheVNpemUgb3IKICAgICAgKiBwcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplIGlzIHVzZWQgdG8gcmVwcmVzZW50IHBvc3Qtem9vbVJhdGlvIGZpZWxkIG9mIHZpZXcsIG5vdAogICAgICAqIHByZS16b29tIGZpZWxkIG9mIHZpZXcuIFRoaXMgbWVhbnMgdGhhdCB0aGUgc2FtZSBhZVJlZ2lvbnMgdmFsdWVzIGF0IGRpZmZlcmVudApAQCAtNzE4LDYgKzczMCwxNCBAQAogICAgICAqIHJlZ2lvbiBhbmQgb3V0cHV0IG9ubHkgdGhlIGludGVyc2VjdGlvbiByZWN0YW5nbGUgYXMgdGhlIG1ldGVyaW5nIHJlZ2lvbiBpbiB0aGUgcmVzdWx0CiAgICAgICogbWV0YWRhdGEuIElmIHRoZSByZWdpb24gaXMgZW50aXJlbHkgb3V0c2lkZSB0aGUgY3JvcCByZWdpb24sIGl0IHdpbGwgYmUgaWdub3JlZCBhbmQKICAgICAgKiBub3QgcmVwb3J0ZWQgaW4gdGhlIHJlc3VsdCBtZXRhZGF0YS48L3A+CisgICAgICogPHA+V2hlbiBzZXR0aW5nIHRoZSBBRiBtZXRlcmluZyByZWdpb25zLCB0aGUgYXBwbGljYXRpb24gbXVzdCBjb25zaWRlciB0aGUgYWRkaXRpb25hbAorICAgICAqIGNyb3AgcmVzdWx0ZWQgZnJvbSB0aGUgYXNwZWN0IHJhdGlvIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHByZXZpZXcgc3RyZWFtIGFuZAorICAgICAqIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OLiBGb3IgZXhhbXBsZSwgaWYgdGhlIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OIGlzIHRoZSBmdWxsCisgICAgICogYWN0aXZlIGFycmF5IHNpemUgd2l0aCA0OjMgYXNwZWN0IHJhdGlvLCBhbmQgdGhlIHByZXZpZXcgc3RyZWFtIGlzIDE2OjksCisgICAgICogdGhlIGJvdW5kYXJ5IG9mIEFGIHJlZ2lvbnMgd2lsbCBiZSBbMCwgeV9jcm9wXSBhbmQKKyAgICAgKiBbYWN0aXZlX3dpZHRoLCBhY3RpdmVfaGVpZ2h0IC0gMiAqIHlfY3JvcF0gcmF0aGVyIHRoYW4gWzAsIDBdIGFuZAorICAgICAqIFthY3RpdmVfd2lkdGgsIGFjdGl2ZV9oZWlnaHRdLCB3aGVyZSB5X2Nyb3AgaXMgdGhlIGFkZGl0aW9uYWwgY3JvcCBkdWUgdG8gYXNwZWN0IHJhdGlvCisgICAgICogbWlzbWF0Y2guPC9wPgogICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQVBJIGxldmVsIDMwLCB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgYWN0aXZlQXJyYXlTaXplIG9yCiAgICAgICogcHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBwb3N0LXpvb21SYXRpbyBmaWVsZCBvZiB2aWV3LCBub3QKICAgICAgKiBwcmUtem9vbSBmaWVsZCBvZiB2aWV3LiBUaGlzIG1lYW5zIHRoYXQgdGhlIHNhbWUgYWZSZWdpb25zIHZhbHVlcyBhdCBkaWZmZXJlbnQKQEAgLTgzOCw3ICs4NTgsNyBAQAogICAgICAqIHJvdXRpbmUgaXMgZW5hYmxlZCwgb3ZlcnJpZGluZyB0aGUgYXBwbGljYXRpb24ncyBzZWxlY3RlZAogICAgICAqIEFDQU1FUkFfQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0sIEFDQU1FUkFfQ09MT1JfQ09SUkVDVElPTl9HQUlOUyBhbmQKICAgICAgKiBBQ0FNRVJBX0NPTE9SX0NPUlJFQ1RJT05fTU9ERS4gTm90ZSB0aGF0IHdoZW4gQUNBTUVSQV9DT05UUk9MX0FFX01PREUKLSAgICAgKiBpcyBPRkYsIHRoZSBiZWhhdmlvciBvZiBBV0IgaXMgZGV2aWNlIGRlcGVuZGVudC4gSXQgaXMgcmVjb21tZW5lZCB0bworICAgICAqIGlzIE9GRiwgdGhlIGJlaGF2aW9yIG9mIEFXQiBpcyBkZXZpY2UgZGVwZW5kZW50LiBJdCBpcyByZWNvbW1lbmRlZCB0bwogICAgICAqIGFsc28gc2V0IEFXQiBtb2RlIHRvIE9GRiBvciBsb2NrIEFXQiBieSB1c2luZyBBQ0FNRVJBX0NPTlRST0xfQVdCX0xPQ0sgYmVmb3JlCiAgICAgICogc2V0dGluZyBBRSBtb2RlIHRvIE9GRi48L3A+CiAgICAgICogPHA+V2hlbiBzZXQgdG8gdGhlIE9GRiBtb2RlLCB0aGUgY2FtZXJhIGRldmljZSdzIGF1dG8td2hpdGUgYmFsYW5jZQpAQCAtOTEzLDYgKzkzMywxNCBAQAogICAgICAqIHJlZ2lvbiBhbmQgb3V0cHV0IG9ubHkgdGhlIGludGVyc2VjdGlvbiByZWN0YW5nbGUgYXMgdGhlIG1ldGVyaW5nIHJlZ2lvbiBpbiB0aGUgcmVzdWx0CiAgICAgICogbWV0YWRhdGEuICBJZiB0aGUgcmVnaW9uIGlzIGVudGlyZWx5IG91dHNpZGUgdGhlIGNyb3AgcmVnaW9uLCBpdCB3aWxsIGJlIGlnbm9yZWQgYW5kCiAgICAgICogbm90IHJlcG9ydGVkIGluIHRoZSByZXN1bHQgbWV0YWRhdGEuPC9wPgorICAgICAqIDxwPldoZW4gc2V0dGluZyB0aGUgQVdCIG1ldGVyaW5nIHJlZ2lvbnMsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGNvbnNpZGVyIHRoZSBhZGRpdGlvbmFsCisgICAgICogY3JvcCByZXN1bHRlZCBmcm9tIHRoZSBhc3BlY3QgcmF0aW8gZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgcHJldmlldyBzdHJlYW0gYW5kCisgICAgICogQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04uIEZvciBleGFtcGxlLCBpZiB0aGUgQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04gaXMgdGhlIGZ1bGwKKyAgICAgKiBhY3RpdmUgYXJyYXkgc2l6ZSB3aXRoIDQ6MyBhc3BlY3QgcmF0aW8sIGFuZCB0aGUgcHJldmlldyBzdHJlYW0gaXMgMTY6OSwKKyAgICAgKiB0aGUgYm91bmRhcnkgb2YgQVdCIHJlZ2lvbnMgd2lsbCBiZSBbMCwgeV9jcm9wXSBhbmQKKyAgICAgKiBbYWN0aXZlX3dpZHRoLCBhY3RpdmVfaGVpZ2h0IC0gMiAqIHlfY3JvcF0gcmF0aGVyIHRoYW4gWzAsIDBdIGFuZAorICAgICAqIFthY3RpdmVfd2lkdGgsIGFjdGl2ZV9oZWlnaHRdLCB3aGVyZSB5X2Nyb3AgaXMgdGhlIGFkZGl0aW9uYWwgY3JvcCBkdWUgdG8gYXNwZWN0IHJhdGlvCisgICAgICogbWlzbWF0Y2guPC9wPgogICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQVBJIGxldmVsIDMwLCB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgYWN0aXZlQXJyYXlTaXplIG9yCiAgICAgICogcHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBwb3N0LXpvb21SYXRpbyBmaWVsZCBvZiB2aWV3LCBub3QKICAgICAgKiBwcmUtem9vbSBmaWVsZCBvZiB2aWV3LiBUaGlzIG1lYW5zIHRoYXQgdGhlIHNhbWUgYXdiUmVnaW9ucyB2YWx1ZXMgYXQgZGlmZmVyZW50CkBAIC05NjEsMTMgKzk4OSwxNSBAQAogICAgICAqCiAgICAgICogPHA+VGhpcyBjb250cm9sIChleGNlcHQgZm9yIE1BTlVBTCkgaXMgb25seSBlZmZlY3RpdmUgaWYKICAgICAgKiA8Y29kZT5BQ0FNRVJBX0NPTlRST0xfTU9ERSAhPSBPRkY8L2NvZGU+IGFuZCBhbnkgM0Egcm91dGluZSBpcyBhY3RpdmUuPC9wPgotICAgICAqIDxwPkFsbCBpbnRlbnRzIGFyZSBzdXBwb3J0ZWQgYnkgYWxsIGRldmljZXMsIGV4Y2VwdCB0aGF0OgotICAgICAqICAgKiBaRVJPX1NIVVRURVJfTEFHIHdpbGwgYmUgc3VwcG9ydGVkIGlmIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTIGNvbnRhaW5zCi0gICAgICogUFJJVkFURV9SRVBST0NFU1NJTkcgb3IgWVVWX1JFUFJPQ0VTU0lORy4KLSAgICAgKiAgICogTUFOVUFMIHdpbGwgYmUgc3VwcG9ydGVkIGlmIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTIGNvbnRhaW5zCi0gICAgICogTUFOVUFMX1NFTlNPUi4KLSAgICAgKiAgICogTU9USU9OX1RSQUNLSU5HIHdpbGwgYmUgc3VwcG9ydGVkIGlmIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTIGNvbnRhaW5zCi0gICAgICogTU9USU9OX1RSQUNLSU5HLjwvcD4KKyAgICAgKiA8cD5BbGwgaW50ZW50cyBhcmUgc3VwcG9ydGVkIGJ5IGFsbCBkZXZpY2VzLCBleGNlcHQgdGhhdDo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5aRVJPX1NIVVRURVJfTEFHIHdpbGwgYmUgc3VwcG9ydGVkIGlmIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTIGNvbnRhaW5zCisgICAgICogUFJJVkFURV9SRVBST0NFU1NJTkcgb3IgWVVWX1JFUFJPQ0VTU0lORy48L2xpPgorICAgICAqIDxsaT5NQU5VQUwgd2lsbCBiZSBzdXBwb3J0ZWQgaWYgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMgY29udGFpbnMKKyAgICAgKiBNQU5VQUxfU0VOU09SLjwvbGk+CisgICAgICogPGxpPk1PVElPTl9UUkFDS0lORyB3aWxsIGJlIHN1cHBvcnRlZCBpZiBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyBjb250YWlucworICAgICAqIE1PVElPTl9UUkFDS0lORy48L2xpPgorICAgICAqIDwvdWw+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfQ09OVFJPTF9NT0RFCiAgICAgICogQHNlZSBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwpAQCAtMTA5MCw2ICsxMTIwLDE1IEBACiAgICAgICogKEFDQU1FUkFfTEVOU19PUFRJQ0FMX1NUQUJJTElaQVRJT05fTU9ERSksIHR1cm5pbmcgYm90aCBtb2RlcyBvbiBtYXkKICAgICAgKiBwcm9kdWNlIHVuZGVzaXJhYmxlIGludGVyYWN0aW9uLCBzbyBpdCBpcyByZWNvbW1lbmRlZCBub3QgdG8gZW5hYmxlCiAgICAgICogYm90aCBhdCB0aGUgc2FtZSB0aW1lLjwvcD4KKyAgICAgKiA8cD5JZiB2aWRlbyBzdGFiaWxpemF0aW9uIGlzIHNldCB0byAiUFJFVklFV19TVEFCSUxJWkFUSU9OIiwKKyAgICAgKiBBQ0FNRVJBX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREUgaXMgb3ZlcnJpZGRlbi4gVGhlIGNhbWVyYSBzdWItc3lzdGVtIG1heSBjaG9vc2UKKyAgICAgKiB0byB0dXJuIG9uIGhhcmR3YXJlIGJhc2VkIGltYWdlIHN0YWJpbGl6YXRpb24gaW4gYWRkaXRpb24gdG8gc29mdHdhcmUgYmFzZWQgc3RhYmlsaXphdGlvbgorICAgICAqIGlmIGl0IGRlZW1zIHRoYXQgYXBwcm9wcmlhdGUuCisgICAgICogVGhpcyBrZXkgbWF5IGJlIGEgcGFydCBvZiB0aGUgYXZhaWxhYmxlIHNlc3Npb24ga2V5cywgd2hpY2ggY2FtZXJhIGNsaWVudHMgbWF5CisgICAgICogcXVlcnkgdmlhCisgICAgICoge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcyB9LgorICAgICAqIElmIHRoaXMgaXMgdGhlIGNhc2UsIGNoYW5naW5nIHRoaXMga2V5IG92ZXIgdGhlIGxpZmUtdGltZSBvZiBhIGNhcHR1cmUgc2Vzc2lvbiBtYXkKKyAgICAgKiBjYXVzZSBkZWxheXMgLyBnbGl0Y2hlcy48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfQ09OVFJPTF9WSURFT19TVEFCSUxJWkFUSU9OX01PREUKICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19PUFRJQ0FMX1NUQUJJTElaQVRJT05fTU9ERQpAQCAtMTQ0OSw3ICsxNDg4LDcgQEAKICAgICAgKiBBbnkgc3RhdGUgKGV4Y2x1ZGluZyBMT0NLRUQpIHwgQUNBTUVSQV9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUiBpcyBTVEFSVCwgc2VxdWVuY2UgZG9uZSB8IEZMQVNIX1JFUVVJUkVEIHwgQ29udmVyZ2VkIGJ1dCB0b28gZGFyayB3L28gZmxhc2ggYWZ0ZXIgYSBwcmVjYXB0dXJlIHNlcXVlbmNlLCB0cmFuc2llbnQgc3RhdGVzIGFyZSBza2lwcGVkIGJ5IGNhbWVyYSBkZXZpY2UuCiAgICAgICogQW55IHN0YXRlIChleGNsdWRpbmcgTE9DS0VEKSB8IEFDQU1FUkFfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIgaXMgU1RBUlQsIHNlcXVlbmNlIGRvbmUgfCBDT05WRVJHRUQgICAgICB8IENvbnZlcmdlZCBhZnRlciBhIHByZWNhcHR1cmUgc2VxdWVuY2UsIHRyYW5zaWVudCBzdGF0ZXMgYXJlIHNraXBwZWQgYnkgY2FtZXJhIGRldmljZS4KICAgICAgKiBBbnkgc3RhdGUgKGV4Y2x1ZGluZyBMT0NLRUQpIHwgQUNBTUVSQV9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUiBpcyBDQU5DRUwsIGNvbnZlcmdlZCAgICB8IEZMQVNIX1JFUVVJUkVEIHwgQ29udmVyZ2VkIGJ1dCB0b28gZGFyayB3L28gZmxhc2ggYWZ0ZXIgYSBwcmVjYXB0dXJlIHNlcXVlbmNlIGlzIGNhbmNlbGVkLCB0cmFuc2llbnQgc3RhdGVzIGFyZSBza2lwcGVkIGJ5IGNhbWVyYSBkZXZpY2UuCi0gICAgICogQW55IHN0YXRlIChleGNsdWRpbmcgTE9DS0VEKSB8IEFDQU1FUkFfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIgaXMgQ0FOQ0VMLCBjb252ZXJnZWQgICAgfCBDT05WRVJHRUQgICAgICB8IENvbnZlcmdlZCBhZnRlciBhIHByZWNhcHR1cmUgc2VxdWVuY2VpcyBjYW5jZWxlZCwgdHJhbnNpZW50IHN0YXRlcyBhcmUgc2tpcHBlZCBieSBjYW1lcmEgZGV2aWNlLgorICAgICAqIEFueSBzdGF0ZSAoZXhjbHVkaW5nIExPQ0tFRCkgfCBBQ0FNRVJBX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSIGlzIENBTkNFTCwgY29udmVyZ2VkICAgIHwgQ09OVkVSR0VEICAgICAgfCBDb252ZXJnZWQgYWZ0ZXIgYSBwcmVjYXB0dXJlIHNlcXVlbmNlcyBjYW5jZWxlZCwgdHJhbnNpZW50IHN0YXRlcyBhcmUgc2tpcHBlZCBieSBjYW1lcmEgZGV2aWNlLgogICAgICAqIENPTlZFUkdFRCAgICAgIHwgQ2FtZXJhIGRldmljZSBmaW5pc2hlZCBBRSBzY2FuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGTEFTSF9SRVFVSVJFRCB8IENvbnZlcmdlZCBidXQgdG9vIGRhcmsgdy9vIGZsYXNoIGFmdGVyIGEgbmV3IHNjYW4sIHRyYW5zaWVudCBzdGF0ZXMgYXJlIHNraXBwZWQgYnkgY2FtZXJhIGRldmljZS4KICAgICAgKiBGTEFTSF9SRVFVSVJFRCB8IENhbWVyYSBkZXZpY2UgZmluaXNoZWQgQUUgc2NhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ09OVkVSR0VEICAgICAgfCBDb252ZXJnZWQgYWZ0ZXIgYSBuZXcgc2NhbiwgdHJhbnNpZW50IHN0YXRlcyBhcmUgc2tpcHBlZCBieSBjYW1lcmEgZGV2aWNlLjwvcD4KICAgICAgKgpAQCAtMTY4NSw3ICsxNzI0LDcgQEAKICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgogICAgICAqIDxwPkRldmljZXMgc3VwcG9ydCBwb3N0IFJBVyBzZW5zaXRpdml0eSBib29zdCAgd2lsbCBhZHZlcnRpc2UKLSAgICAgKiBBQ0FNRVJBX0NPTlRST0xfUE9TVF9SQVdfU0VOU0lUSVZJVFlfQk9PU1Qga2V5IGZvciBjb250cm9saW5nCisgICAgICogQUNBTUVSQV9DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NUIGtleSBmb3IgY29udHJvbGxpbmcKICAgICAgKiBwb3N0IFJBVyBzZW5zaXRpdml0eSBib29zdC48L3A+CiAgICAgICogPHA+VGhpcyBrZXkgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPiBmb3IgZGV2aWNlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGFueSBSQVcgZm9ybWF0CiAgICAgICogb3V0cHV0cy4gRm9yIGRldmljZXMgdGhhdCBkbyBzdXBwb3J0IFJBVyBmb3JtYXQgb3V0cHV0cywgdGhpcyBrZXkgd2lsbCBhbHdheXMKQEAgLTIxNDQsNiArMjE4Myw1MSBAQAogICAgICAqLwogICAgIEFDQU1FUkFfRkxBU0hfSU5GT19BVkFJTEFCTEUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2ZsYXNoX2luZm9fYXZhaWxhYmxlX3QpCiAgICAgICAgICAgICBBQ0FNRVJBX0ZMQVNIX0lORk9fU1RBUlQsCisgICAgLyoqCisgICAgICogPHA+TWF4aW11bSBmbGFzaGxpZ2h0IGJyaWdodG5lc3MgbGV2ZWwuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzI8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+SWYgdGhpcyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMSwgdGhlbiB0aGUgZGV2aWNlIHN1cHBvcnRzIGNvbnRyb2xsaW5nIHRoZQorICAgICAqIGZsYXNobGlnaHQgYnJpZ2h0bmVzcyBsZXZlbCB2aWEKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1hbmFnZXIuaHRtbCN0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsIj5DYW1lcmFNYW5hZ2VyI3R1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWw8L2E+LgorICAgICAqIElmIHRoaXMgdmFsdWUgaXMgZXF1YWwgdG8gMSwgZmxhc2hsaWdodCBicmlnaHRuZXNzIGNvbnRyb2wgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBUaGUgdmFsdWUgZm9yIHRoaXMga2V5IHdpbGwgYmUgbnVsbCBmb3IgZGV2aWNlcyB3aXRoIG5vIGZsYXNoIHVuaXQuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfRkxBU0hfSU5GT19TVFJFTkdUSF9NQVhJTVVNX0xFVkVMID0gICAgICAgICAgICAgICAgIC8vIGludDMyCisgICAgICAgICAgICBBQ0FNRVJBX0ZMQVNIX0lORk9fU1RBUlQgKyAyLAorICAgIC8qKgorICAgICAqIDxwPkRlZmF1bHQgZmxhc2hsaWdodCBicmlnaHRuZXNzIGxldmVsIHRvIGJlIHNldCB2aWEKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1hbmFnZXIuaHRtbCN0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsIj5DYW1lcmFNYW5hZ2VyI3R1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWw8L2E+LjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPklmIGZsYXNoIHVuaXQgaXMgYXZhaWxhYmxlIHRoaXMgd2lsbCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSBhbmQgbGVzcworICAgICAqIG9yIGVxdWFsIHRvIDxjb2RlPkFDQU1FUkFfRkxBU0hfSU5GT19TVFJFTkdUSF9NQVhJTVVNX0xFVkVMPC9jb2RlPi48L3A+CisgICAgICogPHA+U2V0dGluZyBmbGFzaGxpZ2h0IGJyaWdodG5lc3MgYWJvdmUgdGhlIGRlZmF1bHQgbGV2ZWwKKyAgICAgKiAoaS5lLjxjb2RlPkFDQU1FUkFfRkxBU0hfSU5GT19TVFJFTkdUSF9ERUZBVUxUX0xFVkVMPC9jb2RlPikgbWF5IG1ha2UgdGhlIGRldmljZSBtb3JlCisgICAgICogbGlrZWx5IHRvIHJlYWNoIHRoZXJtYWwgdGhyb3R0bGluZyBjb25kaXRpb25zIGFuZCBzbG93IGRvd24sIG9yIGRyYWluIHRoZQorICAgICAqIGJhdHRlcnkgcXVpY2tlciB0aGFuIG5vcm1hbC4gVG8gbWluaW1pemUgc3VjaCBpc3N1ZXMsIGl0IGlzIHJlY29tbWVuZGVkIHRvCisgICAgICogc3RhcnQgdGhlIGZsYXNobGlnaHQgYXQgdGhpcyBkZWZhdWx0IGJyaWdodG5lc3MgdW50aWwgYSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdHMKKyAgICAgKiBhIGJyaWdodGVyIGxldmVsLgorICAgICAqIE5vdGUgdGhhdCB0aGUgdmFsdWUgZm9yIHRoaXMga2V5IHdpbGwgYmUgbnVsbCBmb3IgZGV2aWNlcyB3aXRoIG5vIGZsYXNoIHVuaXQuCisgICAgICogVGhlIGRlZmF1bHQgbGV2ZWwgc2hvdWxkIGFsd2F5cyBiZSAmZ3Q7IDAuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0ZMQVNIX0lORk9fU1RSRU5HVEhfREVGQVVMVF9MRVZFTAorICAgICAqIEBzZWUgQUNBTUVSQV9GTEFTSF9JTkZPX1NUUkVOR1RIX01BWElNVU1fTEVWRUwKKyAgICAgKi8KKyAgICBBQ0FNRVJBX0ZMQVNIX0lORk9fU1RSRU5HVEhfREVGQVVMVF9MRVZFTCA9ICAgICAgICAgICAgICAgICAvLyBpbnQzMgorICAgICAgICAgICAgQUNBTUVSQV9GTEFTSF9JTkZPX1NUQVJUICsgMywKICAgICBBQ0FNRVJBX0ZMQVNIX0lORk9fRU5ELAogCiAgICAgLyoqCkBAIC0yMzQxLDcgKzI0MjUsNyBAQAogICAgICAqICAgYW5kIGtlZXAganBlZyBhbmQgdGh1bWJuYWlsIGltYWdlIGRhdGEgdW5yb3RhdGVkLjwvbGk+CiAgICAgICogPGxpPlJvdGF0ZSB0aGUganBlZyBhbmQgdGh1bWJuYWlsIGltYWdlIGRhdGEgYW5kIG5vdCBzZXQKICAgICAgKiAgIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0V4aWZJbnRlcmZhY2UuaHRtbCNUQUdfT1JJRU5UQVRJT04iPkVYSUYgb3JpZW50YXRpb24gZmxhZzwvYT4uIEluIHRoaXMKLSAgICAgKiAgIGNhc2UsIExJTUlURUQgb3IgRlVMTCBoYXJkd2FyZSBsZXZlbCBkZXZpY2VzIHdpbGwgcmVwb3J0IHJvdGF0ZWQgdGh1bW5haWwgc2l6ZSBpbgorICAgICAqICAgY2FzZSwgTElNSVRFRCBvciBGVUxMIGhhcmR3YXJlIGxldmVsIGRldmljZXMgd2lsbCByZXBvcnQgcm90YXRlZCB0aHVtYm5haWwgc2l6ZSBpbgogICAgICAqICAgY2FwdHVyZSByZXN1bHQsIHNvIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgYmUgaW50ZXJjaGFuZ2VkIGlmIDkwIG9yIDI3MCBkZWdyZWUKICAgICAgKiAgIG9yaWVudGF0aW9uIGlzIHJlcXVlc3RlZC4gTEVHQUNZIGRldmljZSB3aWxsIGFsd2F5cyByZXBvcnQgdW5yb3RhdGVkIHRodW1ibmFpbAogICAgICAqICAgc2l6ZS48L2xpPgpAQCAtMjM3MCw3ICsyNDU0LDcgQEAKICAgICAgKgogICAgICAqIDxwPlRoaXMgbGlzdCB3aWxsIGluY2x1ZGUgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIHJlc29sdXRpb24sIHBsdXMgPGNvZGU+KDAsMCk8L2NvZGU+IGZvciBpbmRpY2F0aW5nIG5vCiAgICAgICogdGh1bWJuYWlsIHNob3VsZCBiZSBnZW5lcmF0ZWQuPC9wPgotICAgICAqIDxwPkJlbG93IGNvbmRpZGl0aW9ucyB3aWxsIGJlIHNhdGlzZmllZCBmb3IgdGhpcyBzaXplIGxpc3Q6PC9wPgorICAgICAqIDxwPkJlbG93IGNvbmRpdGlvbnMgd2lsbCBiZSBzYXRpc2ZpZWQgZm9yIHRoaXMgc2l6ZSBsaXN0OjwvcD4KICAgICAgKiA8dWw+CiAgICAgICogPGxpPlRoZSBzaXplcyB3aWxsIGJlIHNvcnRlZCBieSBpbmNyZWFzaW5nIHBpeGVsIGFyZWEgKHdpZHRoIHggaGVpZ2h0KS4KICAgICAgKiBJZiBzZXZlcmFsIHJlc29sdXRpb25zIGhhdmUgdGhlIHNhbWUgYXJlYSwgdGhleSB3aWxsIGJlIHNvcnRlZCBieSBpbmNyZWFzaW5nIHdpZHRoLjwvbGk+CkBAIC0yNTI2LDEyICsyNjEwLDE4IEBACiAgICAgICogPHA+SWYgYSBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzIGJvdGggT0lTIGFuZCBkaWdpdGFsIGltYWdlIHN0YWJpbGl6YXRpb24KICAgICAgKiAoQUNBTUVSQV9DT05UUk9MX1ZJREVPX1NUQUJJTElaQVRJT05fTU9ERSksIHR1cm5pbmcgYm90aCBtb2RlcyBvbiBtYXkgcHJvZHVjZSB1bmRlc2lyYWJsZQogICAgICAqIGludGVyYWN0aW9uLCBzbyBpdCBpcyByZWNvbW1lbmRlZCBub3QgdG8gZW5hYmxlIGJvdGggYXQgdGhlIHNhbWUgdGltZS48L3A+CisgICAgICogPHA+SWYgQUNBTUVSQV9DT05UUk9MX1ZJREVPX1NUQUJJTElaQVRJT05fTU9ERSBpcyBzZXQgdG8gIlBSRVZJRVdfU1RBQklMSVpBVElPTiIsCisgICAgICogQUNBTUVSQV9MRU5TX09QVElDQUxfU1RBQklMSVpBVElPTl9NT0RFIGlzIG92ZXJyaWRkZW4uIFRoZSBjYW1lcmEgc3ViLXN5c3RlbSBtYXkgY2hvb3NlCisgICAgICogdG8gdHVybiBvbiBoYXJkd2FyZSBiYXNlZCBpbWFnZSBzdGFiaWxpemF0aW9uIGluIGFkZGl0aW9uIHRvIHNvZnR3YXJlIGJhc2VkIHN0YWJpbGl6YXRpb24KKyAgICAgKiBpZiBpdCBkZWVtcyB0aGF0IGFwcHJvcHJpYXRlLiBUaGlzIGtleSdzIHZhbHVlIGluIHRoZSBjYXB0dXJlIHJlc3VsdCB3aWxsIHJlZmxlY3Qgd2hpY2gKKyAgICAgKiBPSVMgbW9kZSB3YXMgY2hvc2VuLjwvcD4KICAgICAgKiA8cD5Ob3QgYWxsIGRldmljZXMgd2lsbCBzdXBwb3J0IE9JUzsgc2VlCiAgICAgICogQUNBTUVSQV9MRU5TX0lORk9fQVZBSUxBQkxFX09QVElDQUxfU1RBQklMSVpBVElPTiBmb3IKICAgICAgKiBhdmFpbGFibGUgY29udHJvbHMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfVklERU9fU1RBQklMSVpBVElPTl9NT0RFCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfSU5GT19BVkFJTEFCTEVfT1BUSUNBTF9TVEFCSUxJWkFUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREUKICAgICAgKi8KICAgICBBQ0FNRVJBX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREUgPSAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9sZW5zX29wdGljYWxfc3RhYmlsaXphdGlvbl9tb2RlX3QpCiAgICAgICAgICAgICBBQ0FNRVJBX0xFTlNfU1RBUlQgKyA0LApAQCAtMjYzNCw2ICsyNzI0LDkgQEAKICAgICAgKiB3aXRoIFBSSU1BUllfQ0FNRVJBLjwvcD4KICAgICAgKiA8cD5XaGVuIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRSBpcyBVTkRFRklORUQsIHRoaXMgcG9zaXRpb24gY2Fubm90IGJlIGFjY3VyYXRlbHkKICAgICAgKiByZXByZXNlbnRlZCBieSB0aGUgY2FtZXJhIGRldmljZSwgYW5kIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgPGNvZGU+KDAsIDAsIDApPC9jb2RlPi48L3A+CisgICAgICogPHA+V2hlbiBBQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0UgaXMgQVVUT01PVElWRSwgdGhlbiB0aGlzIHBvc2l0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZQorICAgICAqIG9yaWdpbiBvZiB0aGUgYXV0b21vdGl2ZSBzZW5zb3IgY29vcmRpbmF0ZSBzeXN0ZW0sIHdoaWNoIGlzIGF0IHRoZSBjZW50ZXIgb2YgdGhlIHJlYXIKKyAgICAgKiBheGxlLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04KICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04KQEAgLTI2NzUsNyArMjc2OCw3IEBACiAgICAgICogPHA+V2hlbiB0aGUgc3RhdGUgaXMgU1RBVElPTkFSWSwgdGhlIGxlbnMgcGFyYW1ldGVycyBhcmUgbm90IGNoYW5naW5nLiBUaGlzIGNvdWxkIGJlCiAgICAgICogZWl0aGVyIGJlY2F1c2UgdGhlIHBhcmFtZXRlcnMgYXJlIGFsbCBmaXhlZCwgb3IgYmVjYXVzZSB0aGUgbGVucyBoYXMgaGFkIGVub3VnaAogICAgICAqIHRpbWUgdG8gcmVhY2ggdGhlIG1vc3QgcmVjZW50bHktcmVxdWVzdGVkIHZhbHVlcy4KLSAgICAgKiBJZiBhbGwgdGhlc2UgbGVucyBwYXJhbWV0ZXJzIGFyZSBub3QgY2hhbmdhYmxlIGZvciBhIGNhbWVyYSBkZXZpY2UsIGFzIGxpc3RlZCBiZWxvdzo8L3A+CisgICAgICogSWYgYWxsIHRoZXNlIGxlbnMgcGFyYW1ldGVycyBhcmUgbm90IGNoYW5nZWFibGUgZm9yIGEgY2FtZXJhIGRldmljZSwgYXMgbGlzdGVkIGJlbG93OjwvcD4KICAgICAgKiA8dWw+CiAgICAgICogPGxpPkZpeGVkIGZvY3VzICg8Y29kZT5BQ0FNRVJBX0xFTlNfSU5GT19NSU5JTVVNX0ZPQ1VTX0RJU1RBTkNFID09IDA8L2NvZGU+KSwgd2hpY2ggbWVhbnMKICAgICAgKiBBQ0FNRVJBX0xFTlNfRk9DVVNfRElTVEFOQ0UgcGFyYW1ldGVyIHdpbGwgYWx3YXlzIGJlIDAuPC9saT4KQEAgLTMxMjcsNyArMzIyMCw3IEBACiAgICAgICogdGhlIGNhbWVyYSBkZXZpY2UuIFVzaW5nIG1vcmUgc3RyZWFtcyBzaW11bHRhbmVvdXNseSBtYXkgcmVxdWlyZSBtb3JlIGhhcmR3YXJlIGFuZAogICAgICAqIENQVSByZXNvdXJjZXMgdGhhdCB3aWxsIGNvbnN1bWUgbW9yZSBwb3dlci4gVGhlIGltYWdlIGZvcm1hdCBmb3IgYW4gb3V0cHV0IHN0cmVhbSBjYW4KICAgICAgKiBiZSBhbnkgc3VwcG9ydGVkIGZvcm1hdCBwcm92aWRlZCBieSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TLgotICAgICAqIFRoZSBmb3JtYXRzIGRlZmluZWQgaW4gQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyBjYW4gYmUgY2F0ZXJnb3JpemVkCisgICAgICogVGhlIGZvcm1hdHMgZGVmaW5lZCBpbiBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TIGNhbiBiZSBjYXRlZ29yaXplZAogICAgICAqIGludG8gdGhlIDMgc3RyZWFtIHR5cGVzIGFzIGJlbG93OjwvcD4KICAgICAgKiA8dWw+CiAgICAgICogPGxpPlByb2Nlc3NlZCAoYnV0IHN0YWxsaW5nKTogYW55IG5vbi1SQVcgZm9ybWF0IHdpdGggYSBzdGFsbER1cmF0aW9ucyAmZ3Q7IDAuCkBAIC0zMzU0LDcgKzM0NDcsNyBAQAogICAgICAqIGJ1dCBjbGllbnRzIHNob3VsZCBiZSBhd2FyZSBhbmQgZXhwZWN0IGRlbGF5cyBkdXJpbmcgdGhlaXIgYXBwbGljYXRpb24uCiAgICAgICogQW4gZXhhbXBsZSB1c2FnZSBzY2VuYXJpbyBjb3VsZCBsb29rIGxpa2UgdGhpczo8L3A+CiAgICAgICogPHVsPgotICAgICAqIDxsaT5UaGUgY2FtZXJhIGNsaWVudCBzdGFydHMgYnkgcXVlcmluZyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXIga2V5IGxpc3QgdmlhCisgICAgICogPGxpPlRoZSBjYW1lcmEgY2xpZW50IHN0YXJ0cyBieSBxdWVyeWluZyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXIga2V5IGxpc3QgdmlhCiAgICAgICogICB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIH0uPC9saT4KICAgICAgKiA8bGk+QmVmb3JlIHRyaWdnZXJpbmcgdGhlIGNhcHR1cmUgc2Vzc2lvbiBjcmVhdGUgc2VxdWVuY2UsIGEgY2FwdHVyZSByZXF1ZXN0CiAgICAgICogICBtdXN0IGJlIGJ1aWx0IHZpYQpAQCAtMzM5MywxNiArMzQ4NiwzNiBAQAogICAgICAqIDwvdWw+PC9wPgogICAgICAqCiAgICAgICogPHA+VGhpcyBpcyBhIHN1YnNldCBvZiBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUyB3aGljaCBjb250YWlucyBhIGxpc3QKLSAgICAgKiBvZiBrZXlzIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gdXNpbmcgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL0NhcHR1cmVSZXF1ZXN0L0J1aWxkZXIuaHRtbCNzZXRQaHlzaWNhbENhbWVyYUtleSI+QnVpbGRlciNzZXRQaHlzaWNhbENhbWVyYUtleTwvYT4uCisgICAgICogb2Yga2V5cyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5CdWlsZGVyLmh0bWwjc2V0UGh5c2ljYWxDYW1lcmFLZXkiPkJ1aWxkZXIjc2V0UGh5c2ljYWxDYW1lcmFLZXk8L2E+LgogICAgICAqIFRoZSByZXNwZWN0aXZlIHZhbHVlIG9mIHN1Y2ggcmVxdWVzdCBrZXkgY2FuIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcKLSAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvQ2FwdHVyZVJlcXVlc3QvQnVpbGRlci5odG1sI2dldFBoeXNpY2FsQ2FtZXJhS2V5Ij5CdWlsZGVyI2dldFBoeXNpY2FsQ2FtZXJhS2V5PC9hPi4gQ2FwdHVyZSByZXF1ZXN0cyB0aGF0IGNvbnRhaW4KLSAgICAgKiBpbmRpdmlkdWFsIHBoeXNpY2FsIGRldmljZSByZXF1ZXN0cyBtdXN0IGJlIGJ1aWx0IHZpYQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuQnVpbGRlci5odG1sI2dldFBoeXNpY2FsQ2FtZXJhS2V5Ij5CdWlsZGVyI2dldFBoeXNpY2FsQ2FtZXJhS2V5PC9hPi4KKyAgICAgKiBDYXB0dXJlIHJlcXVlc3RzIHRoYXQgY29udGFpbiBpbmRpdmlkdWFsIHBoeXNpY2FsIGRldmljZSByZXF1ZXN0cyBtdXN0IGJlIGJ1aWx0IHZpYQogICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhRGV2aWNlLmh0bWwjY3JlYXRlQ2FwdHVyZVJlcXVlc3QoaW50LCI+U2V0KTwvYT4uPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUwogICAgICAqLwogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZUyA9ICAgIC8vIGludDMyW25dCiAgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfU1RBUlQgKyAxNywKKyAgICAvKioKKyAgICAgKiA8cD5BIG1hcCBvZiBhbGwgYXZhaWxhYmxlIDEwLWJpdCBkeW5hbWljIHJhbmdlIHByb2ZpbGVzIGFsb25nIHdpdGggdGhlaXIKKyAgICAgKiBjYXB0dXJlIHJlcXVlc3QgY29uc3RyYWludHMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbbiozXSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfcmVxdWVzdF9hdmFpbGFibGVfZHluYW1pY19yYW5nZV9wcm9maWxlc19tYXBfdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+RGV2aWNlcyBzdXBwb3J0aW5nIHRoZSAxMC1iaXQgb3V0cHV0IGNhcGFiaWxpdHkKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19EWU5BTUlDX1JBTkdFX1RFTl9CSVQiPkNhbWVyYUNoYXJhY3RlcmlzdGljcyNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfRFlOQU1JQ19SQU5HRV9URU5fQklUPC9hPgorICAgICAqIG11c3QgbGlzdCB0aGVpciBzdXBwb3J0ZWQgZHluYW1pYyByYW5nZSBwcm9maWxlcy4gSW4gY2FzZSB0aGUgY2FtZXJhIGlzIG5vdCBhYmxlIHRvCisgICAgICogc3VwcG9ydCBldmVyeSBwb3NzaWJsZSBwcm9maWxlIGNvbWJpbmF0aW9uIHdpdGhpbiBhIHNpbmdsZSBjYXB0dXJlIHJlcXVlc3QsIHRoZW4gdGhlCisgICAgICogY29uc3RyYWludHMgbXVzdCBiZSBsaXN0ZWQgaGVyZSBhcyB3ZWxsLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQID0gICAgICAvLyBpbnQ2NFtuKjNdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9yZXF1ZXN0X2F2YWlsYWJsZV9keW5hbWljX3JhbmdlX3Byb2ZpbGVzX21hcF90KQorICAgICAgICAgICAgQUNBTUVSQV9SRVFVRVNUX1NUQVJUICsgMTksCiAgICAgQUNBTUVSQV9SRVFVRVNUX0VORCwKIAogICAgIC8qKgpAQCAtMzYwMCw3ICszNzEzLDggQEAKICAgICAgKiBZVVZfNDIwXzg4OCAgICB8IGFsbCBvdXRwdXQgc2l6ZXMgYXZhaWxhYmxlIGZvciBKUEVHLCB1cCB0byB0aGUgbWF4aW11bSB2aWRlbyBzaXplIHwgTElNSVRFRCAgICAgICAgfAogICAgICAqIElNUExFTUVOVEFUSU9OX0RFRklORUQgfCBzYW1lIGFzIFlVVl80MjBfODg4ICAgICAgICAgICAgICAgICAgfCBBbnkgICAgICAgICAgICB8PC9wPgogICAgICAqIDxwPkZvciBhcHBsaWNhdGlvbnMgdGFyZ2V0aW5nIFNESyB2ZXJzaW9uIDMxIG9yIG5ld2VyLCBpZiB0aGUgbW9iaWxlIGRldmljZSBkZWNsYXJlcyB0byBiZQotICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0J1aWxkL1ZFUlNJT05fQ0RPRVMvTUVESUFfUEVSRk9STUFOQ0VfQ0xBU1MuaHRtbCI+bWVkaWEgcGVyZm9ybWFuY2UgY2xhc3M8L2E+IFMsCisgICAgICogbWVkaWEgcGVyZm9ybWFuY2UgY2xhc3MgMTIgb3IgaGlnaGVyIGJ5IHNldHRpbmcKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9vcy9CdWlsZC5WRVJTSU9OLmh0bWwjTUVESUFfUEVSRk9STUFOQ0VfQ0xBU1MiPlZFUlNJT04jTUVESUFfUEVSRk9STUFOQ0VfQ0xBU1M8L2E+IHRvIGJlIDMxIG9yIGxhcmdlciwKICAgICAgKiB0aGUgcHJpbWFyeSBjYW1lcmEgZGV2aWNlcyAoZmlyc3QgcmVhci9mcm9udCBjYW1lcmEgaW4gdGhlIGNhbWVyYSBJRCBsaXN0KSB3aWxsIG5vdAogICAgICAqIHN1cHBvcnQgSlBFRyBzaXplcyBzbWFsbGVyIHRoYW4gMTA4MHAuIElmIHRoZSBhcHBsaWNhdGlvbiBjb25maWd1cmVzIGEgSlBFRyBzdHJlYW0KICAgICAgKiBzbWFsbGVyIHRoYW4gMTA4MHAsIHRoZSBjYW1lcmEgZGV2aWNlIHdpbGwgcm91bmQgdXAgdGhlIEpQRUcgaW1hZ2Ugc2l6ZSB0byBhdCBsZWFzdApAQCAtMzYxOCw5ICszNzMyLDExIEBACiAgICAgICogWVVWXzQyMF84ODggICAgfCBhbGwgb3V0cHV0IHNpemVzIGF2YWlsYWJsZSBmb3IgRlVMTCBoYXJkd2FyZSBsZXZlbCwgdXAgdG8gdGhlIG1heGltdW0gdmlkZW8gc2l6ZSB8IExJTUlURUQgICAgICAgIHwKICAgICAgKiBJTVBMRU1FTlRBVElPTl9ERUZJTkVEIHwgc2FtZSBhcyBZVVZfNDIwXzg4OCAgICAgICAgICAgICAgICAgIHwgQW55ICAgICAgICAgICAgfDwvcD4KICAgICAgKiA8cD5Gb3IgYXBwbGljYXRpb25zIHRhcmdldGluZyBTREsgdmVyc2lvbiAzMSBvciBuZXdlciwgaWYgdGhlIG1vYmlsZSBkZXZpY2UgZG9lc24ndCBkZWNsYXJlCi0gICAgICogdG8gYmUgbWVkaWEgcGVyZm9ybWFuY2UgY2xhc3MgUywgb3IgaWYgdGhlIGNhbWVyYSBkZXZpY2UgaXNuJ3QgYSBwcmltYXJ5IHJlYXIvZnJvbnQKLSAgICAgKiBjYW1lcmEsIHRoZSBtaW5pbXVtIHJlcXVpcmVkIG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciBhcHBsaWNhdGlvbnMKLSAgICAgKiB0YXJnZXRpbmcgU0RLIHZlcnNpb24gb2xkZXIgdGhhbiAzMS48L3A+CisgICAgICogdG8gYmUgbWVkaWEgcGVyZm9ybWFuY2UgY2xhc3MgMTIgb3IgYmV0dGVyIGJ5IHNldHRpbmcKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9vcy9CdWlsZC5WRVJTSU9OLmh0bWwjTUVESUFfUEVSRk9STUFOQ0VfQ0xBU1MiPlZFUlNJT04jTUVESUFfUEVSRk9STUFOQ0VfQ0xBU1M8L2E+IHRvIGJlIDMxIG9yIGxhcmdlciwKKyAgICAgKiBvciBpZiB0aGUgY2FtZXJhIGRldmljZSBpc24ndCBhIHByaW1hcnkgcmVhci9mcm9udCBjYW1lcmEsIHRoZSBtaW5pbXVtIHJlcXVpcmVkIG91dHB1dAorICAgICAqIHN0cmVhbSBjb25maWd1cmF0aW9ucyBhcmUgdGhlIHNhbWUgYXMgZm9yIGFwcGxpY2F0aW9ucyB0YXJnZXRpbmcgU0RLIHZlcnNpb24gb2xkZXIgdGhhbgorICAgICAqIDMxLjwvcD4KICAgICAgKiA8cD5SZWZlciB0byBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyBmb3IgYWRkaXRpb25hbAogICAgICAqIG1hbmRhdG9yeSBzdHJlYW0gY29uZmlndXJhdGlvbnMgb24gYSBwZXItY2FwYWJpbGl0eSBiYXNpcy48L3A+CiAgICAgICogPHA+RXhjZXB0aW9uIG9uIDE3NngxNDQgKFFDSUYpIHJlc29sdXRpb246IGNhbWVyYSBkZXZpY2VzIHVzdWFsbHkgaGF2ZSBhIGZpeGVkIGNhcGFiaWxpdHkgZm9yCkBAIC00MTExLDE5ICs0MjI3LDcwIEBACiAgICAgICogdG8gb3V0cHV0IGRpZmZlcmVudCByZXNvbHV0aW9uIGltYWdlcyBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBvcgogICAgICAqIHBpeGVsIG1vZGUuIFdpdGggbXVsdGktcmVzb2x1dGlvbiBpbnB1dCBzdHJlYW1zLCB0aGUgY2FtZXJhIGRldmljZSBjYW4gcmVwcm9jZXNzIGltYWdlcwogICAgICAqIG9mIGRpZmZlcmVudCByZXNvbHV0aW9ucyBmcm9tIGRpZmZlcmVudCBwaHlzaWNhbCBjYW1lcmFzIG9yIHNlbnNvciBwaXhlbCBtb2Rlcy48L3A+Ci0gICAgICogPHA+V2hlbiBzZXQgdG8gVFJVRToKLSAgICAgKiAqIEZvciBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCB0aGUgY2FtZXJhIGZyYW1ld29yayBkZXJpdmVzCisgICAgICogPHA+V2hlbiBzZXQgdG8gVFJVRTo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5Gb3IgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgdGhlIGNhbWVyYSBmcmFtZXdvcmsgZGVyaXZlcwogICAgICAqIGFuZHJvaWQuc2NhbGVyLm11bHRpUmVzb2x1dGlvblN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgYnkgY29tYmluaW5nIHRoZQogICAgICAqIEFDQU1FUkFfU0NBTEVSX1BIWVNJQ0FMX0NBTUVSQV9NVUxUSV9SRVNPTFVUSU9OX1NUUkVBTV9DT05GSUdVUkFUSU9OUyBmcm9tIGl0cyBwaHlzaWNhbAotICAgICAqIGNhbWVyYXMuCi0gICAgICogKiBGb3IgYW4gdWx0cmEtaGlnaCByZXNvbHV0aW9uIHNlbnNvciBjYW1lcmEsIHRoZSBjYW1lcmEgZnJhbWV3b3JrIGRpcmVjdGx5IGNvcGllcworICAgICAqIGNhbWVyYXMuPC9saT4KKyAgICAgKiA8bGk+Rm9yIGFuIHVsdHJhLWhpZ2ggcmVzb2x1dGlvbiBzZW5zb3IgY2FtZXJhLCB0aGUgY2FtZXJhIGZyYW1ld29yayBkaXJlY3RseSBjb3BpZXMKICAgICAgKiB0aGUgdmFsdWUgb2YgQUNBTUVSQV9TQ0FMRVJfUEhZU0lDQUxfQ0FNRVJBX01VTFRJX1JFU09MVVRJT05fU1RSRUFNX0NPTkZJR1VSQVRJT05TIHRvCi0gICAgICogYW5kcm9pZC5zY2FsZXIubXVsdGlSZXNvbHV0aW9uU3RyZWFtQ29uZmlndXJhdGlvbk1hcC48L3A+CisgICAgICogYW5kcm9pZC5zY2FsZXIubXVsdGlSZXNvbHV0aW9uU3RyZWFtQ29uZmlndXJhdGlvbk1hcC48L2xpPgorICAgICAqIDwvdWw+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX1BIWVNJQ0FMX0NBTUVSQV9NVUxUSV9SRVNPTFVUSU9OX1NUUkVBTV9DT05GSUdVUkFUSU9OUwogICAgICAqLwogICAgIEFDQU1FUkFfU0NBTEVSX01VTFRJX1JFU09MVVRJT05fU1RSRUFNX1NVUFBPUlRFRCA9ICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9tdWx0aV9yZXNvbHV0aW9uX3N0cmVhbV9zdXBwb3J0ZWRfdCkKICAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMjQsCisgICAgLyoqCisgICAgICogPHA+VGhlIHN0cmVhbSB1c2UgY2FzZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY2FtZXJhIGRldmljZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQ2NFtuXSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2F2YWlsYWJsZV9zdHJlYW1fdXNlX2Nhc2VzX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoZSBzdHJlYW0gdXNlIGNhc2UgaW5kaWNhdGVzIHRoZSBwdXJwb3NlIG9mIGEgcGFydGljdWxhciBjYW1lcmEgc3RyZWFtIGZyb20KKyAgICAgKiB0aGUgZW5kLXVzZXIgcGVyc3BlY3RpdmUuIFNvbWUgZXhhbXBsZXMgb2YgY2FtZXJhIHVzZSBjYXNlcyBhcmU6IHByZXZpZXcgc3RyZWFtIGZvcgorICAgICAqIGxpdmUgdmlld2ZpbmRlciBzaG93biB0byB0aGUgdXNlciwgc3RpbGwgY2FwdHVyZSBmb3IgZ2VuZXJhdGluZyBoaWdoIHF1YWxpdHkgcGhvdG8KKyAgICAgKiBjYXB0dXJlLCB2aWRlbyByZWNvcmQgZm9yIGVuY29kaW5nIHRoZSBjYW1lcmEgb3V0cHV0IGZvciB0aGUgcHVycG9zZSBvZiBmdXR1cmUgcGxheWJhY2ssCisgICAgICogYW5kIHZpZGVvIGNhbGwgZm9yIGxpdmUgcmVhbHRpbWUgdmlkZW8gY29uZmVyZW5jaW5nLjwvcD4KKyAgICAgKiA8cD5XaXRoIHRoaXMgZmxhZywgdGhlIGNhbWVyYSBkZXZpY2UgY2FuIG9wdGltaXplIHRoZSBpbWFnZSBwcm9jZXNzaW5nIHBpcGVsaW5lCisgICAgICogcGFyYW1ldGVycywgc3VjaCBhcyB0dW5pbmcsIHNlbnNvciBtb2RlLCBhbmQgSVNQIHNldHRpbmdzLCBpbmRlcGVuZGVudCBvZgorICAgICAqIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBpbW1lZGlhdGUgY2FtZXJhIG91dHB1dCBzdXJmYWNlLiBGb3IgZXhhbXBsZSwgaWYgdGhlIG91dHB1dAorICAgICAqIHN1cmZhY2UgaXMgYSBTdXJmYWNlVGV4dHVyZSwgdGhlIHN0cmVhbSB1c2UgY2FzZSBmbGFnIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIKKyAgICAgKiB0aGUgY2FtZXJhIGZyYW1lcyBldmVudHVhbGx5IGdvIHRvIGRpc3BsYXksIHZpZGVvIGVuY29kZXIsCisgICAgICogc3RpbGwgaW1hZ2UgY2FwdHVyZSwgb3IgYWxsIG9mIHRoZW0gY29tYmluZWQuPC9wPgorICAgICAqIDxwPlRoZSBhcHBsaWNhdGlvbiBzZXRzIHRoZSB1c2UgY2FzZSBvZiBhIGNhbWVyYSBzdHJlYW0gYnkgY2FsbGluZworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvcGFyYW1zL091dHB1dENvbmZpZ3VyYXRpb24uaHRtbCNzZXRTdHJlYW1Vc2VDYXNlIj5PdXRwdXRDb25maWd1cmF0aW9uI3NldFN0cmVhbVVzZUNhc2U8L2E+LjwvcD4KKyAgICAgKiA8cD5BIGNhbWVyYSBkZXZpY2Ugd2l0aAorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmh0bWwjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1NUUkVBTV9VU0VfQ0FTRSI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19TVFJFQU1fVVNFX0NBU0U8L2E+CisgICAgICogY2FwYWJpbGl0eSBtdXN0IHN1cHBvcnQgdGhlIGZvbGxvd2luZyBzdHJlYW0gdXNlIGNhc2VzOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPkRFRkFVTFQ8L2xpPgorICAgICAqIDxsaT5QUkVWSUVXPC9saT4KKyAgICAgKiA8bGk+U1RJTExfQ0FQVFVSRTwvbGk+CisgICAgICogPGxpPlZJREVPX1JFQ09SRDwvbGk+CisgICAgICogPGxpPlBSRVZJRVdfVklERU9fU1RJTEw8L2xpPgorICAgICAqIDxsaT5WSURFT19DQUxMPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPlRoZSBndWFyYW50ZWVkIHN0cmVhbSBjb21iaW5hdGlvbnMgcmVsYXRlZCB0byBzdHJlYW0gdXNlIGNhc2UgZm9yIGEgY2FtZXJhIGRldmljZSB3aXRoCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuaHRtbCNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfU1RSRUFNX1VTRV9DQVNFIj5DYW1lcmFDaGFyYWN0ZXJpc3RpY3MjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1NUUkVBTV9VU0VfQ0FTRTwvYT4KKyAgICAgKiBjYXBhYmlsaXR5IGlzIGRvY3VtZW50ZWQgaW4gdGhlIGNhbWVyYSBkZXZpY2UKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYURldmljZS5odG1sI2NyZWF0ZUNhcHR1cmVTZXNzaW9uIj5ndWlkZWxpbmU8L2E+LiBUaGUKKyAgICAgKiBhcHBsaWNhdGlvbiBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byB1c2Ugb25lIG9mIHRoZSBndWFyYW50ZWVkIHN0cmVhbSBjb21iaW5hdGlvbnMuCisgICAgICogSWYgdGhlIGFwcGxpY2F0aW9uIGNyZWF0ZXMgYSBzZXNzaW9uIHdpdGggYSBzdHJlYW0gY29tYmluYXRpb24gbm90IGluIHRoZSBndWFyYW50ZWVkCisgICAgICogbGlzdCwgb3Igd2l0aCBtaXhlZCBERUZBVUxUIGFuZCBub24tREVGQVVMVCB1c2UgY2FzZXMgd2l0aGluIHRoZSBzYW1lIHNlc3Npb24sCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgbWF5IGlnbm9yZSBzb21lIHN0cmVhbSB1c2UgY2FzZXMgZHVlIHRvIGhhcmR3YXJlIGNvbnN0cmFpbnRzCisgICAgICogYW5kIGltcGxlbWVudGF0aW9uIGRldGFpbHMuPC9wPgorICAgICAqIDxwPkZvciBzdHJlYW0gY29tYmluYXRpb25zIG5vdCBjb3ZlcmVkIGJ5IHRoZSBzdHJlYW0gdXNlIGNhc2UgbWFuZGF0b3J5IGxpc3RzLCBzdWNoIGFzCisgICAgICogcmVwcm9jZXNzYWJsZSBzZXNzaW9uLCBjb25zdHJhaW5lZCBoaWdoIHNwZWVkIHNlc3Npb24sIG9yIFJBVyBzdHJlYW0gY29tYmluYXRpb25zLCB0aGUKKyAgICAgKiBhcHBsaWNhdGlvbiBzaG91bGQgbGVhdmUgc3RyZWFtIHVzZSBjYXNlcyB3aXRoaW4gdGhlIHNlc3Npb24gYXMgREVGQVVMVC48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVMgPSAgICAgICAgICAgICAgICAgLy8gaW50NjRbbl0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9hdmFpbGFibGVfc3RyZWFtX3VzZV9jYXNlc190KQorICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAyNSwKICAgICBBQ0FNRVJBX1NDQUxFUl9FTkQsCiAKICAgICAvKioKQEAgLTQ1NzgsNiArNDc0NSwyNSBAQAogICAgICAqCiAgICAgICogPHA+QWxzbyBkZWZpbmVzIHRoZSBkaXJlY3Rpb24gb2Ygcm9sbGluZyBzaHV0dGVyIHJlYWRvdXQsIHdoaWNoIGlzIGZyb20gdG9wIHRvIGJvdHRvbSBpbgogICAgICAqIHRoZSBzZW5zb3IncyBjb29yZGluYXRlIHN5c3RlbS48L3A+CisgICAgICogPHA+U3RhcnRpbmcgd2l0aCBBbmRyb2lkIEFQSSBsZXZlbCAzMiwgY2FtZXJhIGNsaWVudHMgdGhhdCBxdWVyeSB0aGUgb3JpZW50YXRpb24gdmlhCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuaHRtbCNnZXQiPkNhbWVyYUNoYXJhY3RlcmlzdGljcyNnZXQ8L2E+IG9uIGZvbGRhYmxlIGRldmljZXMgd2hpY2gKKyAgICAgKiBpbmNsdWRlIGxvZ2ljYWwgY2FtZXJhcyBjYW4gcmVjZWl2ZSBhIHZhbHVlIHRoYXQgY2FuIGR5bmFtaWNhbGx5IGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlCisgICAgICogZGV2aWNlL2ZvbGQgc3RhdGUuCisgICAgICogQ2xpZW50cyBhcmUgYWR2aXNlZCB0byBub3QgY2FjaGUgb3Igc3RvcmUgdGhlIG9yaWVudGF0aW9uIHZhbHVlIG9mIHN1Y2ggbG9naWNhbCBzZW5zb3JzLgorICAgICAqIEluIGNhc2UgcmVwZWF0ZWQgcXVlcmllcyB0byBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgYXJlIG5vdCBwcmVmZXJyZWQsIHRoZW4gY2xpZW50cyBjYW4KKyAgICAgKiBhbHNvIGFjY2VzcyB0aGUgZW50aXJlIG1hcHBpbmcgZnJvbSBkZXZpY2Ugc3RhdGUgdG8gc2Vuc29yIG9yaWVudGF0aW9uIGluCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvRGV2aWNlU3RhdGVTZW5zb3JPcmllbnRhdGlvbk1hcC5odG1sIj5EZXZpY2VTdGF0ZVNlbnNvck9yaWVudGF0aW9uTWFwPC9hPi4KKyAgICAgKiBEbyBub3RlIHRoYXQgYSBkeW5hbWljYWxseSBjaGFuZ2luZyBzZW5zb3Igb3JpZW50YXRpb24gdmFsdWUgaW4gY2FtZXJhIGNoYXJhY3RlcmlzdGljcworICAgICAqIHdpbGwgbm90IGJlIHRoZSBiZXN0IHdheSB0byBlc3RhYmxpc2ggdGhlIG9yaWVudGF0aW9uIHBlciBmcmFtZS4gQ2xpZW50cyB0aGF0IHdhbnQgdG8KKyAgICAgKiBrbm93IHRoZSBzZW5zb3Igb3JpZW50YXRpb24gb2YgYSBwYXJ0aWN1bGFyIGNhcHR1cmVkIGZyYW1lIHNob3VsZCBxdWVyeSB0aGUKKyAgICAgKiBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX0FDVElWRV9QSFlTSUNBTF9JRCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGNhcHR1cmUgcmVzdWx0IGFuZAorICAgICAqIGNoZWNrIHRoZSByZXNwZWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBvcmllbnRhdGlvbi48L3A+CisgICAgICogPHA+TmF0aXZlIGNhbWVyYSBjbGllbnRzIG11c3QgcXVlcnkgQUNBTUVSQV9JTkZPX0RFVklDRV9TVEFURV9PUklFTlRBVElPTlMgZm9yIHRoZSBtYXBwaW5nCisgICAgICogYmV0d2VlbiBkZXZpY2Ugc3RhdGUgYW5kIGNhbWVyYSBzZW5zb3Igb3JpZW50YXRpb24uIER5bmFtaWMgdXBkYXRlcyB0byB0aGUgc2Vuc29yCisgICAgICogb3JpZW50YXRpb24gYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBjb2RlIHBhdGguPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0lORk9fREVWSUNFX1NUQVRFX09SSUVOVEFUSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9BQ1RJVkVfUEhZU0lDQUxfSUQKICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9PUklFTlRBVElPTiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMgogICAgICAgICAgICAgQUNBTUVSQV9TRU5TT1JfU1RBUlQgKyAxNCwKQEAgLTQ2NTgsNyArNDg0NCw3IEBACiAgICAgICogbm9pc2UgbW9kZWwgdXNlZCBoZXJlIGlzOjwvcD4KICAgICAgKiA8cD5OKHgpID0gc3FydChTeCArIE8pPC9wPgogICAgICAqIDxwPldoZXJlIHggcmVwcmVzZW50cyB0aGUgcmVjb3JkZWQgc2lnbmFsIG9mIGEgQ0ZBIGNoYW5uZWwgbm9ybWFsaXplZCB0bwotICAgICAqIHRoZSByYW5nZSBbMCwgMV0sIGFuZCBTIGFuZCBPIGFyZSB0aGUgbm9pc2UgbW9kZWwgY29lZmZpZWNpZW50cyBmb3IKKyAgICAgKiB0aGUgcmFuZ2UgWzAsIDFdLCBhbmQgUyBhbmQgTyBhcmUgdGhlIG5vaXNlIG1vZGVsIGNvZWZmaWNpZW50cyBmb3IKICAgICAgKiB0aGF0IGNoYW5uZWwuPC9wPgogICAgICAqIDxwPkEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgbm9pc2UgbW9kZWwgY2FuIGJlIGZvdW5kIGluIHRoZQogICAgICAqIEFkb2JlIERORyBzcGVjaWZpY2F0aW9uIGZvciB0aGUgTm9pc2VQcm9maWxlIHRhZy48L3A+CkBAIC00NzA3LDcgKzQ4OTMsNyBAQAogICAgICAqIDxsaT4xLjIwICZsdDs9IFIgJmd0Oz0gMS4wMyB3aWxsIHJlcXVpcmUgc29tZSBzb2Z0d2FyZQogICAgICAqIGNvcnJlY3Rpb24gdG8gYXZvaWQgZGVtb3NhaWMgZXJyb3JzICgzLTIwJSBkaXZlcmdlbmNlKS48L2xpPgogICAgICAqIDxsaT5SICZndDsgMS4yMCB3aWxsIHJlcXVpcmUgc3Ryb25nIHNvZnR3YXJlIGNvcnJlY3Rpb24gdG8gcHJvZHVjZQotICAgICAqIGEgdXN1YWJsZSBpbWFnZSAoJmd0OzIwJSBkaXZlcmdlbmNlKS48L2xpPgorICAgICAqIGEgdXNhYmxlIGltYWdlICgmZ3Q7MjAlIGRpdmVyZ2VuY2UpLjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgogICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CkBAIC00OTY0LDcgKzUxNTAsNyBAQAogICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IGNhbGxiYWNrczwvbGk+CiAgICAgICogPC91bD48L3A+CiAgICAgICoKLSAgICAgKiA8cD5UaGlzIGtleSB3aWxsIG9ubHkgYmUgcHJlc2VudCBpbiBkZXZpY2VzIGFkdmVydGlzdGluZyB0aGUKKyAgICAgKiA8cD5UaGlzIGtleSB3aWxsIG9ubHkgYmUgcHJlc2VudCBpbiBkZXZpY2VzIGFkdmVydGlzaW5nIHRoZQogICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiI+Q2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1I8L2E+CiAgICAgICogY2FwYWJpbGl0eSB3aGljaCBhbHNvIGFkdmVydGlzZSA8Y29kZT5SRU1PU0FJQ19SRVBST0NFU1NJTkc8L2NvZGU+IGNhcGFiaWxpdHkuIE9uIGFsbCBvdGhlciBkZXZpY2VzCiAgICAgICogUkFXIHRhcmdldHMgd2lsbCBoYXZlIGEgcmVndWxhciBiYXllciBwYXR0ZXJuLjwvcD4KQEAgLTYxNDksOSArNjMzNSwxMSBAQAogICAgICAqICAgPGxpPkFDYXB0dXJlUmVxdWVzdDwvbGk+CiAgICAgICogPC91bD48L3A+CiAgICAgICoKLSAgICAgKiA8cD5UaGUgdG9uZW1hcCBjdXJ2ZSB3aWxsIGJlIGRlZmluZWQgdGhlIGZvbGxvd2luZyBmb3JtdWxhOgotICAgICAqICogT1VUID0gcG93KElOLCAxLjAgLyBnYW1tYSkKLSAgICAgKiB3aGVyZSBJTiBhbmQgT1VUIGlzIHRoZSBpbnB1dCBwaXhlbCB2YWx1ZSBzY2FsZWQgdG8gcmFuZ2UgWzAuMCwgMS4wXSwKKyAgICAgKiA8cD5UaGUgdG9uZW1hcCBjdXJ2ZSB3aWxsIGJlIGRlZmluZWQgdGhlIGZvbGxvd2luZyBmb3JtdWxhOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPk9VVCA9IHBvdyhJTiwgMS4wIC8gZ2FtbWEpPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPndoZXJlIElOIGFuZCBPVVQgaXMgdGhlIGlucHV0IHBpeGVsIHZhbHVlIHNjYWxlZCB0byByYW5nZSBbMC4wLCAxLjBdLAogICAgICAqIHBvdyBpcyB0aGUgcG93ZXIgZnVuY3Rpb24gYW5kIGdhbW1hIGlzIHRoZSBnYW1tYSB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhpcwogICAgICAqIGtleS48L3A+CiAgICAgICogPHA+VGhlIHNhbWUgY3VydmUgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBjb2xvciBjaGFubmVscy4gVGhlIGNhbWVyYSBkZXZpY2UKQEAgLTYyODQsNiArNjQ3MiwyMSBAQAogICAgICAqLwogICAgIEFDQU1FUkFfSU5GT19WRVJTSU9OID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUKICAgICAgICAgICAgIEFDQU1FUkFfSU5GT19TVEFSVCArIDEsCisgICAgLyoqCisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQ2NFsyKm5dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPkhBTCBtdXN0IHBvcHVsYXRlIHRoZSBhcnJheSB3aXRoCisgICAgICogKGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZSwgc2Vuc29yT3JpZW50YXRpb24pIHBhaXJzIGZvciBlYWNoCisgICAgICogc3VwcG9ydGVkIGRldmljZSBzdGF0ZSBiaXR3aXNlIGNvbWJpbmF0aW9uLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0lORk9fREVWSUNFX1NUQVRFX09SSUVOVEFUSU9OUyA9ICAgICAgICAgICAgICAgICAgICAvLyBpbnQ2NFsyKm5dCisgICAgICAgICAgICBBQ0FNRVJBX0lORk9fU1RBUlQgKyAzLAogICAgIEFDQU1FUkFfSU5GT19FTkQsCiAKICAgICAvKioKQEAgLTcwMzQsNiArNzIzNyw4NyBAQAogICAgICAgICAgICAgQUNBTUVSQV9IRUlDX1NUQVJUICsgNSwKICAgICBBQ0FNRVJBX0hFSUNfRU5ELAogCisgICAgLyoqCisgICAgICogPHA+TG9jYXRpb24gb2YgdGhlIGNhbWVyYXMgb24gdGhlIGF1dG9tb3RpdmUgZGV2aWNlcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9hdXRvbW90aXZlX2xvY2F0aW9uX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZW51bSBkZWZpbmVzIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGNhbWVyYXMgcmVsYXRpdmUgdG8gdGhlIHZlaGljbGUgYm9keSBmcmFtZSBvbgorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvc2Vuc29ycy9zZW5zb3ItdHlwZXMjYXV0b19heGVzIj50aGUgYXV0b21vdGl2ZSBzZW5zb3IgY29vcmRpbmF0ZSBzeXN0ZW08L2E+LgorICAgICAqIElmIHRoZSBzeXN0ZW0gaGFzIEZFQVRVUkVfQVVUT01PVElWRSwgdGhlIGNhbWVyYSB3aWxsIGhhdmUgdGhpcyBlbnRyeSBpbiBpdHMgc3RhdGljCisgICAgICogbWV0YWRhdGEuPC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+SU5URVJJT1IgaXMgdGhlIGluc2lkZSBvZiB0aGUgdmVoaWNsZSBib2R5IGZyYW1lIChvciB0aGUgcGFzc2VuZ2VyIGNhYmluKS48L2xpPgorICAgICAqIDxsaT5FWFRFUklPUiBpcyB0aGUgb3V0c2lkZSBvZiB0aGUgdmVoaWNsZSBib2R5IGZyYW1lLjwvbGk+CisgICAgICogPGxpPkVYVFJBIGlzIHRoZSBleHRyYSB2ZWhpY2xlIHN1Y2ggYXMgYSB0cmFpbGVyLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD5FYWNoIHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZSBvbiB0aGlzIGNvb3JkaW5hdGUgc3lzdGVtIGlzIGRlZmluZWQgYXMgYmVsb3c6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+RlJPTlQgaXMgd2hlcmUgdGhlIFktYXhpcyBpbmNyZWFzZXMgdG93YXJkLjwvbGk+CisgICAgICogPGxpPlJFQVIgaXMgd2hlcmUgdGhlIFktYXhpcyBkZWNyZWFzZXMgdG93YXJkLjwvbGk+CisgICAgICogPGxpPkxFRlQgaXMgd2hlcmUgdGhlIFgtYXhpcyBkZWNyZWFzZXMgdG93YXJkLjwvbGk+CisgICAgICogPGxpPlJJR0hUIGlzIHdoZXJlIHRoZSBYLWF4aXMgaW5jcmVhc2VzIHRvd2FyZC48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+SWYgdGhlIGNhbWVyYSBoYXMgZWl0aGVyIEVYVEVSSU9SX09USEVSIG9yIEVYVFJBX09USEVSLCBpdHMgc3RhdGljIG1ldGFkYXRhIHdpbGwgbGlzdAorICAgICAqIHRoZSBmb2xsb3dpbmcgZW50cmllcywgc28gdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGRldGVybWluZSB0aGUgY2FtZXJhJ3MgZXhhY3QgbG9jYXRpb246PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT048L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTE9DQVRJT04gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9hdXRvbW90aXZlX2xvY2F0aW9uX3QpCisgICAgICAgICAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfU1RBUlQsCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0VORCwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBkaXJlY3Rpb24gb2YgdGhlIGNhbWVyYSBmYWNlcyByZWxhdGl2ZSB0byB0aGUgdmVoaWNsZSBib2R5IGZyYW1lIGFuZCB0aGUKKyAgICAgKiBwYXNzZW5nZXIgc2VhdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZVtuXSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfYXV0b21vdGl2ZV9sZW5zX2ZhY2luZ190KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGVudW0gZGVmaW5lcyB0aGUgbGVucyBmYWNpbmcgY2hhcmFjdGVyaXN0aWMgb2YgdGhlIGNhbWVyYXMgb24gdGhlIGF1dG9tb3RpdmUKKyAgICAgKiBkZXZpY2VzIHdpdGggbG9jYXRpb25zIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTiBkZWZpbmVzLiAgSWYgdGhlIHN5c3RlbSBoYXMKKyAgICAgKiBGRUFUVVJFX0FVVE9NT1RJVkUsIHRoZSBjYW1lcmEgd2lsbCBoYXZlIHRoaXMgZW50cnkgaW4gaXRzIHN0YXRpYyBtZXRhZGF0YS48L3A+CisgICAgICogPHA+V2hlbiBBQ0FNRVJBX0FVVE9NT1RJVkVfTE9DQVRJT04gaXMgSU5URVJJT1IsIHRoaXMgaGFzIG9uZSBvciBtb3JlIElOVEVSSU9SXyoKKyAgICAgKiB2YWx1ZXMgb3IgYSBzaW5nbGUgRVhURVJJT1JfKiB2YWx1ZS4gIFdoZW4gdGhpcyBoYXMgbW9yZSB0aGFuIG9uZSBJTlRFUklPUl8qLAorICAgICAqIHRoZSBmaXJzdCB2YWx1ZSBtdXN0IGJlIHRoZSBvbmUgZm9yIHRoZSBzZWF0IGNsb3Nlc3QgdG8gdGhlIG9wdGljYWwgYXhpcy4gSWYgdGhpcworICAgICAqIGNvbnRhaW5zIElOVEVSSU9SX09USEVSLCBhbGwgb3RoZXIgdmFsdWVzIHdpbGwgYmUgaW5lZmZlY3RpdmUuPC9wPgorICAgICAqIDxwPldoZW4gQUNBTUVSQV9BVVRPTU9USVZFX0xPQ0FUSU9OIGlzIEVYVEVSSU9SXyogb3IgRVhUUkEsIHRoaXMgaGFzIGEgc2luZ2xlCisgICAgICogRVhURVJJT1JfKiB2YWx1ZS48L3A+CisgICAgICogPHA+SWYgYSBjYW1lcmEgaGFzIElOVEVSSU9SX09USEVSIG9yIEVYVEVSSU9SX09USEVSLCBvciBtb3JlIHRoYW4gb25lIGNhbWVyYSBpcyBhdCB0aGUKKyAgICAgKiBzYW1lIGxvY2F0aW9uIGFuZCBmYWNpbmcgdGhlIHNhbWUgZGlyZWN0aW9uLCB0aGVpciBzdGF0aWMgbWV0YWRhdGEgd2lsbCBsaXN0IHRoZQorICAgICAqIGZvbGxvd2luZyBlbnRyaWVzLCBzbyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gZGV0ZXJtaW5lIHRoZWlyIGxlbnNlcycgZXhhY3QgZmFjaW5nCisgICAgICogZGlyZWN0aW9uczo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0U8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0FVVE9NT1RJVkVfTE9DQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRQorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OCisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZVtuXSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfYXV0b21vdGl2ZV9sZW5zX2ZhY2luZ190KQorICAgICAgICAgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfU1RBUlQsCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRU5ELAorCiB9IGFjYW1lcmFfbWV0YWRhdGFfdGFnX3Q7CiAKIC8qKgpAQCAtNzkzNSw2ICs4MjE5LDE3IEBACiAgICAgICovCiAgICAgQUNBTUVSQV9DT05UUk9MX1ZJREVPX1NUQUJJTElaQVRJT05fTU9ERV9PTiAgICAgICAgICAgICAgICAgICAgICA9IDEsCiAKKyAgICAvKioKKyAgICAgKiA8cD5QcmV2aWV3IHN0YWJpbGl6YXRpb24sIHdoZXJlIHRoZSBwcmV2aWV3IGluIGFkZGl0aW9uIHRvIGFsbCBvdGhlciBub24tUkFXIHN0cmVhbXMgYXJlCisgICAgICogc3RhYmlsaXplZCB3aXRoIHRoZSBzYW1lIHF1YWxpdHkgb2Ygc3RhYmlsaXphdGlvbiwgaXMgZW5hYmxlZC4gVGhpcyBtb2RlIGFpbXMgdG8gZ2l2ZQorICAgICAqIGNsaWVudHMgYSAnd2hhdCB5b3Ugc2VlIGlzIHdoYXQgeW91IGdldCcgZWZmZWN0LiBJbiB0aGlzIG1vZGUsIHRoZSBGb1YgcmVkdWN0aW9uIHdpbGwKKyAgICAgKiBiZSBhIG1heGltdW0gb2YgMjAgJSBib3RoIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseQorICAgICAqICgxMCUgZnJvbSBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20pIGZvciB0aGUgZ2l2ZW4gem9vbSByYXRpbyAvIGNyb3AgcmVnaW9uLgorICAgICAqIFRoZSByZXN1bHRhbnQgRm9WIHdpbGwgYWxzbyBiZSB0aGUgc2FtZSBhY3Jvc3MgYWxsIHByb2Nlc3NlZCBzdHJlYW1zCisgICAgICogKHRoYXQgaGF2ZSB0aGUgc2FtZSBhc3BlY3QgcmF0aW8pLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0NPTlRST0xfVklERU9fU1RBQklMSVpBVElPTl9NT0RFX1BSRVZJRVdfU1RBQklMSVpBVElPTiAgID0gMiwKKwogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9jb250cm9sX3ZpZGVvX3N0YWJpbGl6YXRpb25fbW9kZV90OwogCiAvLyBBQ0FNRVJBX0NPTlRST0xfQUVfU1RBVEUKQEAgLTg0MTUsNiArODcxMCwxNCBAQAogICAgICAqLwogICAgIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRV9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLAogCisgICAgLyoqCisgICAgICogPHA+VGhlIHZhbHVlIG9mIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OIGlzIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW4gb2YgdGhlCisgICAgICogYXV0b21vdGl2ZSBzZW5zb3IgY29vcmRpbmF0ZSBzeXN0ZW0sIHdoaWNoIGlzIGF0IHRoZSBjZW50ZXIgb2YgdGhlIHJlYXIgYXhsZS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OCisgICAgICovCisgICAgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFX0FVVE9NT1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfbGVuc19wb3NlX3JlZmVyZW5jZV90OwogCiAKQEAgLTg3MjgsNyArOTAzMSw3IEBACiAgICAgICogZm9yIHRoZSBsYXJnZXN0IFlVVl80MjBfODg4IHNpemUuPC9wPgogICAgICAqIDxwPklmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwIH0sIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIH0sIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IH0sIHRoZW4gdGhvc2UgY2FuIGFsc28gYmUKICAgICAgKiBjYXB0dXJlZCBhdCB0aGUgc2FtZSByYXRlIGFzIHRoZSBtYXhpbXVtLXNpemUgWVVWXzQyMF84ODggcmVzb2x1dGlvbiBpcy48L3A+Ci0gICAgICogPHA+SW4gYWRkaXRpb24sIHRoZSBBQ0FNRVJBX1NZTkNfTUFYX0xBVEVOQ1kgZmllbGQgaXMgZ3VhcmFudGVkIHRvIGhhdmUgYSB2YWx1ZSBiZXR3ZWVuIDAKKyAgICAgKiA8cD5JbiBhZGRpdGlvbiwgdGhlIEFDQU1FUkFfU1lOQ19NQVhfTEFURU5DWSBmaWVsZCBpcyBndWFyYW50ZWVkIHRvIGhhdmUgYSB2YWx1ZSBiZXR3ZWVuIDAKICAgICAgKiBhbmQgNCwgaW5jbHVzaXZlLiBBQ0FNRVJBX0NPTlRST0xfQUVfTE9DS19BVkFJTEFCTEUgYW5kIEFDQU1FUkFfQ09OVFJPTF9BV0JfTE9DS19BVkFJTEFCTEUKICAgICAgKiBhcmUgYWxzbyBndWFyYW50ZWVkIHRvIGJlIDxjb2RlPnRydWU8L2NvZGU+IHNvIGJ1cnN0IGNhcHR1cmUgd2l0aCB0aGVzZSB0d28gbG9ja3MgT04geWllbGRzCiAgICAgICogY29uc2lzdGVudCBpbWFnZSBvdXRwdXQuPC9wPgpAQCAtODg5NCw3ICs5MTk3LDcgQEAKICAgICAgKiBub24tYWN0aXZlIHBoeXNpY2FsIGNhbWVyYXMuIEZvciBleGFtcGxlLCBpZiB0aGUgbG9naWNhbCBjYW1lcmEgaGFzIGEgd2lkZS11bHRyYXdpZGUKICAgICAgKiBjb25maWd1cmF0aW9uIHdoZXJlIHRoZSB3aWRlIGxlbnMgaXMgdGhlIGRlZmF1bHQsIHdoZW4gdGhlIGNyb3AgcmVnaW9uIGlzIHNldCB0byB0aGUKICAgICAgKiBsb2dpY2FsIGNhbWVyYSdzIGFjdGl2ZSBhcnJheSBzaXplLCAoYW5kIHRoZSB6b29tIHJhdGlvIHNldCB0byAxLjAgc3RhcnRpbmcgZnJvbQotICAgICAqIEFuZHJvaWQgMTEpLCBhIHBoeXNpY2FsIHN0cmVhbSBmb3IgdGhlIHVsdHJhd2lkZSBjYW1lcmEgbWF5IHByZWZlciBvdXRwdXRpbmcgaW1hZ2VzCisgICAgICogQW5kcm9pZCAxMSksIGEgcGh5c2ljYWwgc3RyZWFtIGZvciB0aGUgdWx0cmF3aWRlIGNhbWVyYSBtYXkgcHJlZmVyIG91dHB1dHRpbmcgaW1hZ2VzCiAgICAgICogd2l0aCBsYXJnZXIgZmllbGQtb2YtdmlldyB0aGFuIHRoYXQgb2YgdGhlIHdpZGUgY2FtZXJhIGZvciBiZXR0ZXIgc3RlcmVvIG1hdGNoaW5nCiAgICAgICogbWFyZ2luIG9yIG1vcmUgcm9idXN0IG1vdGlvbiB0cmFja2luZy4gQXQgdGhlIHNhbWUgdGltZSwgdGhlIHBoeXNpY2FsIG5vbi1SQVcgc3RyZWFtcycKICAgICAgKiBmaWVsZCBvZiB2aWV3IG11c3Qgbm90IGJlIHNtYWxsZXIgdGhhbiB0aGUgcmVxdWVzdGVkIGNyb3AgcmVnaW9uIGFuZCB6b29tIHJhdGlvLCBhcwpAQCAtOTAxNSw4ICs5MzE4LDEzMiBAQAogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LAogCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydHMgc2VsZWN0aW5nIGEgcGVyLXN0cmVhbSB1c2UgY2FzZSB2aWEKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9PdXRwdXRDb25maWd1cmF0aW9uLmh0bWwjc2V0U3RyZWFtVXNlQ2FzZSI+T3V0cHV0Q29uZmlndXJhdGlvbiNzZXRTdHJlYW1Vc2VDYXNlPC9hPgorICAgICAqIHNvIHRoYXQgdGhlIGRldmljZSBjYW4gb3B0aW1pemUgY2FtZXJhIHBpcGVsaW5lIHBhcmFtZXRlcnMgc3VjaCBhcyB0dW5pbmcsIHNlbnNvcgorICAgICAqIG1vZGUsIG9yIElTUCBzZXR0aW5ncyBmb3IgYSBzcGVjaWZpYyB1c2VyIHNjZW5hcmlvLgorICAgICAqIFNvbWUgc2FtcGxlIHVzYWdlcyBvZiB0aGlzIGNhcGFiaWxpdHkgYXJlOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPkRpc3Rpbmd1aXNoIGhpZ2ggcXVhbGl0eSBZVVYgY2FwdHVyZXMgZnJvbSBhIHJlZ3VsYXIgWVVWIHN0cmVhbSB3aGVyZQorICAgICAqICAgdGhlIGltYWdlIHF1YWxpdHkgbWF5IG5vdCBiZSBhcyBnb29kIGFzIHRoZSBKUEVHIHN0cmVhbSwgb3I8L2xpPgorICAgICAqIDxsaT5Vc2Ugb25lIHN0cmVhbSB0byBzZXJ2ZSBtdWx0aXBsZSBwdXJwb3Nlczogdmlld2ZpbmRlciwgdmlkZW8gcmVjb3JkaW5nIGFuZAorICAgICAqICAgc3RpbGwgY2FwdHVyZS4gVGhpcyBpcyBjb21tb24gd2l0aCBhcHBsaWNhdGlvbnMgdGhhdCB3aXNoIHRvIGFwcGx5IGVkaXRzIGVxdWFsbHkKKyAgICAgKiAgIHRvIHByZXZpZXcsIHNhdmVkIGltYWdlcywgYW5kIHNhdmVkIHZpZGVvcy48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+VGhpcyBjYXBhYmlsaXR5IHJlcXVpcmVzIHRoZSBjYW1lcmEgZGV2aWNlIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZworICAgICAqIHN0cmVhbSB1c2UgY2FzZXM6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+REVGQVVMVCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aGVyZSB0aGUgYXBwbGljYXRpb24gZG9lc24ndCBzZXQKKyAgICAgKiAgIGEgc3RyZWFtIHVzZSBjYXNlPC9saT4KKyAgICAgKiA8bGk+UFJFVklFVyBmb3IgbGl2ZSB2aWV3ZmluZGVyIGFuZCBpbi1hcHAgaW1hZ2UgYW5hbHlzaXM8L2xpPgorICAgICAqIDxsaT5TVElMTF9DQVBUVVJFIGZvciBzdGlsbCBwaG90byBjYXB0dXJlPC9saT4KKyAgICAgKiA8bGk+VklERU9fUkVDT1JEIGZvciByZWNvcmRpbmcgdmlkZW8gY2xpcHM8L2xpPgorICAgICAqIDxsaT5QUkVWSUVXX1ZJREVPX1NUSUxMIGZvciBvbmUgc2luZ2xlIHN0cmVhbSB1c2VkIGZvciB2aWV3ZmluZGVyLCB2aWRlbworICAgICAqICAgcmVjb3JkaW5nLCBhbmQgc3RpbGwgY2FwdHVyZS48L2xpPgorICAgICAqIDxsaT5WSURFT19DQUxMIGZvciBsb25nIHJ1bm5pbmcgdmlkZW8gY2FsbHM8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+PGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuaHRtbCNTQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVMiPkNhbWVyYUNoYXJhY3RlcmlzdGljcyNTQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVM8L2E+CisgICAgICogbGlzdHMgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgc3RyZWFtIHVzZSBjYXNlcy48L3A+CisgICAgICogPHA+UmVmZXIgdG8gPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFEZXZpY2UuaHRtbCNjcmVhdGVDYXB0dXJlU2Vzc2lvbiI+Q2FtZXJhRGV2aWNlI2NyZWF0ZUNhcHR1cmVTZXNzaW9uPC9hPiBmb3IgdGhlCisgICAgICogbWFuZGF0b3J5IHN0cmVhbSBjb21iaW5hdGlvbnMgaW52b2x2aW5nIHN0cmVhbSB1c2UgY2FzZXMsIHdoaWNoIGNhbiBhbHNvIGJlIHF1ZXJpZWQKKyAgICAgKiB2aWEgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvTWFuZGF0b3J5U3RyZWFtQ29tYmluYXRpb24uaHRtbCI+TWFuZGF0b3J5U3RyZWFtQ29tYmluYXRpb248L2E+LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19TVFJFQU1fVVNFX0NBU0UgICAgICAgICAgID0gMTksCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfcmVxdWVzdF9hdmFpbGFibGVfY2FwYWJpbGl0aWVzX3Q7CiAKKy8vIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVAKK3R5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9yZXF1ZXN0X2F2YWlsYWJsZV9keW5hbWljX3JhbmdlX3Byb2ZpbGVzX21hcCB7CisgICAgLyoqCisgICAgICogPHA+OC1iaXQgU0RSIHByb2ZpbGUgd2hpY2ggaXMgdGhlIGRlZmF1bHQgZm9yIGFsbCBub24gMTAtYml0IG91dHB1dCBjYXBhYmxlIGRldmljZXMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQgICAgPSAweDEsCisKKyAgICAvKioKKyAgICAgKiA8cD4xMC1iaXQgcGl4ZWwgc2FtcGxlcyBlbmNvZGVkIHVzaW5nIHRoZSBIeWJyaWQgbG9nLWdhbW1hIHRyYW5zZmVyIGZ1bmN0aW9uLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0hMRzEwICAgICAgID0gMHgyLAorCisgICAgLyoqCisgICAgICogPHA+MTAtYml0IHBpeGVsIHNhbXBsZXMgZW5jb2RlZCB1c2luZyB0aGUgU01QVEUgU1QgMjA4NCB0cmFuc2ZlciBmdW5jdGlvbi4KKyAgICAgKiBUaGlzIHByb2ZpbGUgdXRpbGl6ZXMgaW50ZXJuYWwgc3RhdGljIG1ldGFkYXRhIHRvIGluY3JlYXNlIHRoZSBxdWFsaXR5CisgICAgICogb2YgdGhlIGNhcHR1cmUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfSERSMTAgICAgICAgPSAweDQsCisKKyAgICAvKioKKyAgICAgKiA8cD4xMC1iaXQgcGl4ZWwgc2FtcGxlcyBlbmNvZGVkIHVzaW5nIHRoZSBTTVBURSBTVCAyMDg0IHRyYW5zZmVyIGZ1bmN0aW9uLgorICAgICAqIEluIGNvbnRyYXN0IHRvIEhEUjEwLCB0aGlzIHByb2ZpbGUgdXNlcyBpbnRlcm5hbCBwZXItZnJhbWUgbWV0YWRhdGEKKyAgICAgKiB0byBmdXJ0aGVyIGVuaGFuY2UgdGhlIHF1YWxpdHkgb2YgdGhlIGNhcHR1cmUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfSERSMTBfUExVUyAgPSAweDgsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGlzIGEgY2FtZXJhIG1vZGUgZm9yIERvbGJ5IFZpc2lvbiBjYXB0dXJlIG9wdGltaXplZCBmb3IgYSBtb3JlIHNjZW5lCisgICAgICogYWNjdXJhdGUgY2FwdHVyZS4gVGhpcyB3b3VsZCB0eXBpY2FsbHkgZGlmZmVyIGZyb20gd2hhdCBhIHNwZWNpZmljIGRldmljZQorICAgICAqIG1pZ2h0IHdhbnQgdG8gdHVuZSBmb3IgYSBjb25zdW1lciBvcHRpbWl6ZWQgRG9sYnkgVmlzaW9uIGdlbmVyYWwgY2FwdHVyZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9SRUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTAsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGlzIHRoZSBwb3dlciBvcHRpbWl6ZWQgbW9kZSBmb3IgMTAtYml0IERvbGJ5IFZpc2lvbiBIRFIgUmVmZXJlbmNlIE1vZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzEwQl9IRFJfUkVGX1BPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIwLAorCisgICAgLyoqCisgICAgICogPHA+VGhpcyBpcyB0aGUgY2FtZXJhIG1vZGUgZm9yIHRoZSBkZWZhdWx0IERvbGJ5IFZpc2lvbiBjYXB0dXJlIG1vZGUgZm9yIHRoZQorICAgICAqIHNwZWNpZmljIGRldmljZS4gVGhpcyB3b3VsZCBiZSB0dW5lZCBieSBlYWNoIHNwZWNpZmljIGRldmljZSBmb3IgY29uc3VtZXIKKyAgICAgKiBwbGVhc2luZyByZXN1bHRzIHRoYXQgcmVzb25hdGUgd2l0aCB0aGVpciBwYXJ0aWN1bGFyIGF1ZGllbmNlLiBXZSBleHBlY3QKKyAgICAgKiB0aGF0IGVhY2ggc3BlY2lmaWMgZGV2aWNlIHdvdWxkIGhhdmUgYSBkaWZmZXJlbnQgbG9vayBmb3IgdGhlaXIgZGVmYXVsdAorICAgICAqIERvbGJ5IFZpc2lvbiBjYXB0dXJlLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl8xMEJfSERSX09FTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MCwKKworICAgIC8qKgorICAgICAqIDxwPlRoaXMgaXMgdGhlIHBvd2VyIG9wdGltaXplZCBtb2RlIGZvciAxMC1iaXQgRG9sYnkgVmlzaW9uIEhEUiBkZXZpY2Ugc3BlY2lmaWMKKyAgICAgKiBjYXB0dXJlIE1vZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzEwQl9IRFJfT0VNX1BPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwLAorCisgICAgLyoqCisgICAgICogPHA+VGhpcyBpcyB0aGUgOC1iaXQgdmVyc2lvbiBvZiB0aGUgRG9sYnkgVmlzaW9uIHJlZmVyZW5jZSBjYXB0dXJlIG1vZGUgb3B0aW1pemVkCisgICAgICogZm9yIHNjZW5lIGFjY3VyYWN5LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl84Ql9IRFJfUkVGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEwMCwKKworICAgIC8qKgorICAgICAqIDxwPlRoaXMgaXMgdGhlIHBvd2VyIG9wdGltaXplZCBtb2RlIGZvciA4LWJpdCBEb2xieSBWaXNpb24gSERSIFJlZmVyZW5jZSBNb2RlLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl84Ql9IRFJfUkVGX1BPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIwMCwKKworICAgIC8qKgorICAgICAqIDxwPlRoaXMgaXMgdGhlIDgtYml0IHZlcnNpb24gb2YgZGV2aWNlIHNwZWNpZmljIHR1bmVkIGFuZCBvcHRpbWl6ZWQgRG9sYnkgVmlzaW9uCisgICAgICogY2FwdHVyZSBtb2RlLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl84Ql9IRFJfT0VNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMCwKKworICAgIC8qKgorICAgICAqIDxwPlRoaXMgaXMgdGhlIHBvd2VyIG9wdGltaXplZCBtb2RlIGZvciA4LWJpdCBEb2xieSBWaXNpb24gSERSIGRldmljZSBzcGVjaWZpYworICAgICAqIGNhcHR1cmUgTW9kZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fOEJfSERSX09FTV9QTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDAsCisKKyAgICAvKioKKyAgICAgKgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfTUFYICAgICAgICAgPSAweDEwMDAsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfcmVxdWVzdF9hdmFpbGFibGVfZHluYW1pY19yYW5nZV9wcm9maWxlc19tYXBfdDsKKwogCiAvLyBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TCiB0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfc2NhbGVyX2F2YWlsYWJsZV9zdHJlYW1fY29uZmlndXJhdGlvbnMgewpAQCAtOTEwOCw2ICs5NTM1LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDcsCiAKICAgICAvKioKKyAgICAgKiA8cD5JZiBzdXBwb3J0ZWQsIHRoZSByZWNvbW1lbmRlZCAxMC1iaXQgb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9ucyBtdXN0IGluY2x1ZGUKKyAgICAgKiBhIHN1YnNldCBvZiB0aGUgYWR2ZXJ0aXNlZCA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI1lDQkNSX1AwMTAiPkltYWdlRm9ybWF0I1lDQkNSX1AwMTA8L2E+IGFuZAorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2dyYXBoaWNzL0ltYWdlRm9ybWF0Lmh0bWwjUFJJVkFURSI+SW1hZ2VGb3JtYXQjUFJJVkFURTwvYT4gb3V0cHV0cyB0aGF0IGFyZSBvcHRpbWl6ZWQgZm9yIHBvd2VyCisgICAgICogYW5kIHBlcmZvcm1hbmNlIHdoZW4gcmVnaXN0ZXJlZCBhbG9uZyB3aXRoIGEgc3VwcG9ydGVkIDEwLWJpdCBkeW5hbWljIHJhbmdlIHByb2ZpbGUuCisgICAgICogc2VlIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuT3V0cHV0Q29uZmlndXJhdGlvbiNzZXREeW5hbWljUmFuZ2VQcm9maWxlIGZvcgorICAgICAqIGRldGFpbHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfMTBCSVRfT1VUUFVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgsCisKKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1BVQkxJQ19FTkRfM184CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDksCisKKyAgICAvKioKICAgICAgKiA8cD5WZW5kb3IgZGVmaW5lZCB1c2UgY2FzZXMuIFRoZXNlIGRlcGVuZCBvbiB0aGUgdmVuZG9yIGltcGxlbWVudGF0aW9uLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1ZFTkRPUl9TVEFSVApAQCAtOTE4OCw2ICs5NjI5LDc2IEBACiAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX211bHRpX3Jlc29sdXRpb25fc3RyZWFtX3N1cHBvcnRlZF90OwogCisvLyBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFUwordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3NjYWxlcl9hdmFpbGFibGVfc3RyZWFtX3VzZV9jYXNlcyB7CisgICAgLyoqCisgICAgICogPHA+RGVmYXVsdCBzdHJlYW0gdXNlIGNhc2UuPC9wPgorICAgICAqIDxwPlRoaXMgdXNlIGNhc2UgaXMgdGhlIHNhbWUgYXMgd2hlbiB0aGUgYXBwbGljYXRpb24gZG9lc24ndCBzZXQgYW55IHVzZSBjYXNlIGZvcgorICAgICAqIHRoZSBzdHJlYW0uIFRoZSBjYW1lcmEgZGV2aWNlIHVzZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIG91dHB1dCB0YXJnZXQsIHN1Y2ggYXMKKyAgICAgKiBmb3JtYXQsIGRhdGFTcGFjZSwgb3Igc3VyZmFjZSBjbGFzcyB0eXBlLCB0byBvcHRpbWl6ZSB0aGUgaW1hZ2UgcHJvY2Vzc2luZyBwaXBlbGluZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCAgICAgICAgICAgICAgICA9IDB4MCwKKworICAgIC8qKgorICAgICAqIDxwPkxpdmUgc3RyZWFtIHNob3duIHRvIHRoZSB1c2VyLjwvcD4KKyAgICAgKiA8cD5PcHRpbWl6ZWQgZm9yIHBlcmZvcm1hbmNlIGFuZCB1c2FiaWxpdHkgYXMgYSB2aWV3ZmluZGVyLCBidXQgbm90IG5lY2Vzc2FyaWx5IGZvcgorICAgICAqIGltYWdlIHF1YWxpdHkuIFRoZSBvdXRwdXQgaXMgbm90IG1lYW50IHRvIGJlIHBlcnNpc3RlZCBhcyBzYXZlZCBpbWFnZXMgb3IgdmlkZW8uPC9wPgorICAgICAqIDxwPk5vIHN0YWxsIGlmIEFDQU1FUkFfQ09OVFJPTF8qIGFyZSBzZXQgdG8gRkFTVC4gVGhlcmUgbWF5IGJlIHN0YWxsIGlmCisgICAgICogdGhleSBhcmUgc2V0IHRvIEhJR0hfUVVBTElUWS4gVGhpcyB1c2UgY2FzZSBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlCisgICAgICogZGVmYXVsdCBTdXJmYWNlVmlldyBhbmQgU3VyZmFjZVRleHR1cmUgdGFyZ2V0cy4gQWRkaXRpb25hbGx5LCB0aGlzIHVzZSBjYXNlIGNhbiBiZQorICAgICAqIHVzZWQgZm9yIGluLWFwcCBpbWFnZSBhbmFseXNpcy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfUFJFVklFVyAgICAgICAgICAgICAgICA9IDB4MSwKKworICAgIC8qKgorICAgICAqIDxwPlN0aWxsIHBob3RvIGNhcHR1cmUuPC9wPgorICAgICAqIDxwPk9wdGltaXplZCBmb3IgaGlnaC1xdWFsaXR5IGhpZ2gtcmVzb2x1dGlvbiBjYXB0dXJlLCBhbmQgbm90IGV4cGVjdGVkIHRvIG1haW50YWluCisgICAgICogcHJldmlldy1saWtlIGZyYW1lIHJhdGVzLjwvcD4KKyAgICAgKiA8cD5UaGUgc3RyZWFtIG1heSBoYXZlIHN0YWxscyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgQUNBTUVSQV9DT05UUk9MXyogaXMgSElHSF9RVUFMSVRZLgorICAgICAqIFRoaXMgdXNlIGNhc2UgaGFzIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHRoZSBkZWZhdWx0IEpQRUcgYW5kIFJBVyByZWxhdGVkIGZvcm1hdHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX1NUSUxMX0NBUFRVUkUgICAgICAgICAgPSAweDIsCisKKyAgICAvKioKKyAgICAgKiA8cD5SZWNvcmRpbmcgdmlkZW8gY2xpcHMuPC9wPgorICAgICAqIDxwPk9wdGltaXplZCBmb3IgaGlnaC1xdWFsaXR5IHZpZGVvIGNhcHR1cmUsIGluY2x1ZGluZyBoaWdoLXF1YWxpdHkgaW1hZ2Ugc3RhYmlsaXphdGlvbgorICAgICAqIGlmIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIGFuZCBlbmFibGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gQXMgYSByZXN1bHQsIG1heSBwcm9kdWNlCisgICAgICogb3V0cHV0IGZyYW1lcyB3aXRoIGEgc3Vic3RhbnRpYWwgbGFnIGZyb20gcmVhbCB0aW1lLCB0byBhbGxvdyBmb3IgaGlnaGVzdC1xdWFsaXR5CisgICAgICogc3RhYmlsaXphdGlvbiBvciBvdGhlciBwcm9jZXNzaW5nLiBBcyBzdWNoLCBzdWNoIGFuIG91dHB1dCBpcyBub3Qgc3VpdGFibGUgZm9yIGRyYXdpbmcKKyAgICAgKiB0byBzY3JlZW4gZGlyZWN0bHksIGFuZCBpcyBleHBlY3RlZCB0byBiZSBwZXJzaXN0ZWQgdG8gZGlzayBvciBzaW1pbGFyIGZvciBsYXRlcgorICAgICAqIHBsYXliYWNrIG9yIHByb2Nlc3NpbmcuIE9ubHkgc3RyZWFtcyB0aGF0IHNldCB0aGUgVklERU9fUkVDT1JEIHVzZSBjYXNlIGFyZSBndWFyYW50ZWVkCisgICAgICogdG8gaGF2ZSB2aWRlbyBzdGFiaWxpemF0aW9uIGFwcGxpZWQgd2hlbiB0aGUgdmlkZW8gc3RhYmlsaXphdGlvbiBjb250cm9sIGlzIHNldAorICAgICAqIHRvIE9OLCBhcyBvcHBvc2VkIHRvIFBSRVZJRVdfU1RBQklMSVpBVElPTi48L3A+CisgICAgICogPHA+VGhpcyB1c2UgY2FzZSBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIGRlZmF1bHQgTWVkaWFSZWNvcmRlciBhbmQgTWVkaWFDb2RlYworICAgICAqIHRhcmdldHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX1ZJREVPX1JFQ09SRCAgICAgICAgICAgPSAweDMsCisKKyAgICAvKioKKyAgICAgKiA8cD5PbmUgc2luZ2xlIHN0cmVhbSB1c2VkIGZvciBjb21iaW5lZCBwdXJwb3NlcyBvZiBwcmV2aWV3LCB2aWRlbywgYW5kIHN0aWxsIGNhcHR1cmUuPC9wPgorICAgICAqIDxwPkZvciBzdWNoIG11bHRpLXB1cnBvc2Ugc3RyZWFtcywgdGhlIGNhbWVyYSBkZXZpY2UgYWltcyB0byBtYWtlIHRoZSBiZXN0IHRyYWRlb2ZmCisgICAgICogYmV0d2VlbiB0aGUgaW5kaXZpZHVhbCB1c2UgY2FzZXMuIEZvciBleGFtcGxlLCB0aGUgU1RJTExfQ0FQVFVSRSB1c2UgY2FzZSBieSBpdHNlbGYKKyAgICAgKiBtYXkgaGF2ZSBzdGFsbHMgZm9yIGFjaGlldmluZyBiZXN0IGltYWdlIHF1YWxpdHkuIEJ1dCBpZiBjb21iaW5lZCB3aXRoIFBSRVZJRVcgYW5kCisgICAgICogVklERU9fUkVDT1JELCB0aGUgY2FtZXJhIGRldmljZSBuZWVkcyB0byB0cmFkZSBvZmYgdGhlIGFkZGl0aW9uYWwgaW1hZ2UgcHJvY2Vzc2luZworICAgICAqIGZvciBzcGVlZCBzbyB0aGF0IHByZXZpZXcgYW5kIHZpZGVvIHJlY29yZGluZyBhcmVuJ3Qgc2xvd2VkIGRvd24uPC9wPgorICAgICAqIDxwPlNpbWlsYXJseSwgVklERU9fUkVDT1JEIG1heSBwcm9kdWNlIGZyYW1lcyB3aXRoIGEgc3Vic3RhbnRpYWwgbGFnLCBidXQKKyAgICAgKiBQUkVWSUVXX1ZJREVPX1NUSUxMIG11c3QgaGF2ZSBtaW5pbWFsIG91dHB1dCBkZWxheS4gVGhpcyBtZWFucyB0aGF0IHRvIGVuYWJsZSB2aWRlbworICAgICAqIHN0YWJpbGl6YXRpb24gd2l0aCB0aGlzIHVzZSBjYXNlLCB0aGUgZGV2aWNlIG11c3Qgc3VwcG9ydCBhbmQgdGhlIGFwcCBtdXN0IHNlbGVjdCB0aGUKKyAgICAgKiBQUkVWSUVXX1NUQUJJTElaQVRJT04gbW9kZSBmb3IgdmlkZW8gc3RhYmlsaXphdGlvbi48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfUFJFVklFV19WSURFT19TVElMTCAgICA9IDB4NCwKKworICAgIC8qKgorICAgICAqIDxwPkxvbmctcnVubmluZyB2aWRlbyBjYWxsIG9wdGltaXplZCBmb3IgYm90aCBwb3dlciBlZmZpY2llbmN5IGFuZCB2aWRlbyBxdWFsaXR5LjwvcD4KKyAgICAgKiA8cD5UaGUgY2FtZXJhIHNlbnNvciBtYXkgcnVuIGluIGEgbG93ZXItcmVzb2x1dGlvbiBtb2RlIHRvIHJlZHVjZSBwb3dlciBjb25zdW1wdGlvbgorICAgICAqIGF0IHRoZSBjb3N0IG9mIHNvbWUgaW1hZ2UgYW5kIGRpZ2l0YWwgem9vbSBxdWFsaXR5LiBVbmxpa2UgVklERU9fUkVDT1JELCBWSURFT19DQUxMCisgICAgICogb3V0cHV0cyBhcmUgZXhwZWN0ZWQgdG8gd29yayBpbiBkYXJrIGNvbmRpdGlvbnMsIHNvIGFyZSB1c3VhbGx5IGFjY29tcGFuaWVkIHdpdGgKKyAgICAgKiB2YXJpYWJsZSBmcmFtZSByYXRlIHNldHRpbmdzIHRvIGFsbG93IHN1ZmZpY2llbnQgZXhwb3N1cmUgdGltZSBpbiBsb3cgbGlnaHQuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX1ZJREVPX0NBTEwgICAgICAgICAgICAgPSAweDUsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2F2YWlsYWJsZV9zdHJlYW1fdXNlX2Nhc2VzX3Q7CisKIAogLy8gQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxCiB0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfc2Vuc29yX3JlZmVyZW5jZV9pbGx1bWluYW50MSB7CkBAIC05NjA1LDcgKzEwMTE2LDcgQEAKICAgICBBQ0FNRVJBX1RPTkVNQVBfTU9ERV9ISUdIX1FVQUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwKIAogICAgIC8qKgotICAgICAqIDxwPlVzZSB0aGUgZ2FtbWEgdmFsdWUgc3BlY2lmaWVkIGluIEFDQU1FUkFfVE9ORU1BUF9HQU1NQSB0byBwZWZvcm0KKyAgICAgKiA8cD5Vc2UgdGhlIGdhbW1hIHZhbHVlIHNwZWNpZmllZCBpbiBBQ0FNRVJBX1RPTkVNQVBfR0FNTUEgdG8gcGVyZm9ybQogICAgICAqIHRvbmVtYXBwaW5nLjwvcD4KICAgICAgKiA8cD5BbGwgY29sb3IgZW5oYW5jZW1lbnQgYW5kIHRvbmVtYXBwaW5nIG11c3QgYmUgZGlzYWJsZWQsIGV4Y2VwdAogICAgICAqIGZvciBhcHBseWluZyB0aGUgdG9uZW1hcHBpbmcgY3VydmUgc3BlY2lmaWVkIGJ5IEFDQU1FUkFfVE9ORU1BUF9HQU1NQS48L3A+CkBAIC05NjE3LDcgKzEwMTI4LDcgQEAKIAogICAgIC8qKgogICAgICAqIDxwPlVzZSB0aGUgcHJlc2V0IHRvbmVtYXBwaW5nIGN1cnZlIHNwZWNpZmllZCBpbgotICAgICAqIEFDQU1FUkFfVE9ORU1BUF9QUkVTRVRfQ1VSVkUgdG8gcGVmb3JtIHRvbmVtYXBwaW5nLjwvcD4KKyAgICAgKiBBQ0FNRVJBX1RPTkVNQVBfUFJFU0VUX0NVUlZFIHRvIHBlcmZvcm0gdG9uZW1hcHBpbmcuPC9wPgogICAgICAqIDxwPkFsbCBjb2xvciBlbmhhbmNlbWVudCBhbmQgdG9uZW1hcHBpbmcgbXVzdCBiZSBkaXNhYmxlZCwgZXhjZXB0CiAgICAgICogZm9yIGFwcGx5aW5nIHRoZSB0b25lbWFwcGluZyBjdXJ2ZSBzcGVjaWZpZWQgYnkKICAgICAgKiBBQ0FNRVJBX1RPTkVNQVBfUFJFU0VUX0NVUlZFLjwvcD4KQEAgLTk3MTUsNyArMTAyMjYsNyBAQAogICAgICAqIGZpcmUgdGhlIGZsYXNoIGZvciBmbGFzaCBwb3dlciBtZXRlcmluZyBkdXJpbmcgcHJlY2FwdHVyZSwgYW5kIHRoZW4gZmlyZSB0aGUgZmxhc2gKICAgICAgKiBmb3IgdGhlIGZpbmFsIGNhcHR1cmUsIGlmIGEgZmxhc2ggaXMgYXZhaWxhYmxlIG9uIHRoZSBkZXZpY2UgYW5kIHRoZSBBRSBtb2RlIGlzIHNldCB0bwogICAgICAqIGVuYWJsZSB0aGUgZmxhc2guPC9wPgotICAgICAqIDxwPkRldmljZXMgdGhhdCBpbml0aWFsbHkgc2hpcHBlZCB3aXRoIEFuZHJvaWQgdmVyc2lvbiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9vcy9CdWlsZC9WRVJTSU9OX0NPREVTLmh0bWwjUSI+UTwvYT4gb3IgbmV3ZXIgd2lsbCBub3QgaW5jbHVkZSBhbnkgTEVHQUNZLWxldmVsIGRldmljZXMuPC9wPgorICAgICAqIDxwPkRldmljZXMgdGhhdCBpbml0aWFsbHkgc2hpcHBlZCB3aXRoIEFuZHJvaWQgdmVyc2lvbiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9vcy9CdWlsZC5WRVJTSU9OX0NPREVTLmh0bWwjUSI+UTwvYT4gb3IgbmV3ZXIgd2lsbCBub3QgaW5jbHVkZSBhbnkgTEVHQUNZLWxldmVsIGRldmljZXMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSCiAgICAgICogQHNlZSBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwpAQCAtOTk0OSw2ICsxMDQ2MCwxNjcgQEAKIAogCiAKKy8vIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTgordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX2F1dG9tb3RpdmVfbG9jYXRpb24geworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGV4aXN0cyBpbnNpZGUgb2YgdGhlIHZlaGljbGUgY2FiaW4uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9JTlRFUklPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBleGlzdHMgb3V0c2lkZSBvZiB0aGUgdmVoaWNsZSBib2R5IGZyYW1lIGJ1dCBub3QgZXhhY3RseSBvbiBvbmUgb2YgdGhlCisgICAgICogZXh0ZXJpb3IgbG9jYXRpb25zIHRoaXMgZW51bSBkZWZpbmVzLiAgVGhlIGFwcGxpY2F0aW9ucyBzaG91bGQgZGV0ZXJtaW5lIHRoZSBleGFjdAorICAgICAqIGxvY2F0aW9uIGZyb20gQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRFUklPUl9PVEhFUiAgICAgICAgICAgICAgICAgICAgICAgPSAxLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZXhpc3RzIG91dHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZSBhbmQgb24gaXRzIGZyb250IHNpZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRFUklPUl9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgPSAyLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZXhpc3RzIG91dHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZSBhbmQgb24gaXRzIHJlYXIgc2lkZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xPQ0FUSU9OX0VYVEVSSU9SX1JFQVIgICAgICAgICAgICAgICAgICAgICAgICA9IDMsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBleGlzdHMgb3V0c2lkZSBhbmQgb24gbGVmdCBzaWRlIG9mIHRoZSB2ZWhpY2xlIGJvZHkgZnJhbWUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRFUklPUl9MRUZUICAgICAgICAgICAgICAgICAgICAgICAgPSA0LAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZXhpc3RzIG91dHNpZGUgYW5kIG9uIHJpZ2h0IHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xPQ0FUSU9OX0VYVEVSSU9SX1JJR0hUICAgICAgICAgICAgICAgICAgICAgICA9IDUsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBleGlzdHMgb24gYW4gZXh0cmEgdmVoaWNsZSwgc3VjaCBhcyB0aGUgdHJhaWxlciwgYnV0IG5vdCBleGFjdGx5CisgICAgICogb24gb25lIG9mIGZyb250LCByZWFyLCBsZWZ0LCBvciByaWdodCBzaWRlLiAgQXBwbGljYXRpb25zIHNob3VsZCBkZXRlcm1pbmUgdGhlIGV4YWN0CisgICAgICogbG9jYXRpb24gZnJvbSBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OCisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xPQ0FUSU9OX0VYVFJBX09USEVSICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBleGlzdHMgb3V0c2lkZSBvZiB0aGUgZXh0cmEgdmVoaWNsZSdzIGJvZHkgZnJhbWUgYW5kIG9uIGl0cyBmcm9udAorICAgICAqIHNpZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRSQV9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZXhpc3RzIG91dHNpZGUgb2YgdGhlIGV4dHJhIHZlaGljbGUncyBib2R5IGZyYW1lIGFuZCBvbiBpdHMgcmVhcgorICAgICAqIHNpZGUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRSQV9SRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZXhpc3RzIG91dHNpZGUgYW5kIG9uIGxlZnQgc2lkZSBvZiB0aGUgZXh0cmEgdmVoaWNsZSBib2R5LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTE9DQVRJT05fRVhUUkFfTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGV4aXN0cyBvdXRzaWRlIGFuZCBvbiByaWdodCBzaWRlIG9mIHRoZSBleHRyYSB2ZWhpY2xlIGJvZHkuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MT0NBVElPTl9FWFRSQV9SSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9hdXRvbW90aXZlX2xvY2F0aW9uX3Q7CisKKworLy8gQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfYXV0b21vdGl2ZV9sZW5zX2ZhY2luZyB7CisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZmFjZXMgdGhlIG91dHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZSBidXQgbm90IGV4YWN0bHkKKyAgICAgKiBvbmUgb2YgdGhlIGV4dGVyaW9yIHNpZGVzIGRlZmluZWQgYnkgdGhpcyBlbnVtLiAgQXBwbGljYXRpb25zIHNob3VsZCBkZXRlcm1pbmUKKyAgICAgKiB0aGUgZXhhY3QgZmFjaW5nIGRpcmVjdGlvbiBmcm9tIEFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OIGFuZAorICAgICAqIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OCisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HX0VYVEVSSU9SX09USEVSICAgICAgICAgICAgICAgICAgICA9IDAsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBmYWNlcyB0aGUgZnJvbnQgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HX0VYVEVSSU9SX0ZST05UICAgICAgICAgICAgICAgICAgICA9IDEsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBmYWNlcyB0aGUgcmVhciBvZiB0aGUgdmVoaWNsZSBib2R5IGZyYW1lLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfRVhURVJJT1JfUkVBUiAgICAgICAgICAgICAgICAgICAgID0gMiwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HX0VYVEVSSU9SX0xFRlQgICAgICAgICAgICAgICAgICAgICA9IDMsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBmYWNlcyB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgdmVoaWNsZSBib2R5IGZyYW1lLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfRVhURVJJT1JfUklHSFQgICAgICAgICAgICAgICAgICAgID0gNCwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBpbnNpZGUgb2YgdGhlIHZlaGljbGUgYm9keSBmcmFtZSBidXQgbm90IGV4YWN0bHkKKyAgICAgKiBvbmUgb2Ygc2VhdHMgZGVzY3JpYmVkIGJ5IHRoaXMgZW51bS4gIEFwcGxpY2F0aW9ucyBzaG91bGQgZGV0ZXJtaW5lIHRoZSBleGFjdAorICAgICAqIGZhY2luZyBkaXJlY3Rpb24gZnJvbSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTiBhbmQgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfT1RIRVIgICAgICAgICAgICAgICAgICAgID0gNSwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBsZWZ0IHNpZGUgc2VhdCBvZiB0aGUgZmlyc3Qgcm93LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfU0VBVF9ST1dfMV9MRUZUICAgICAgICAgID0gNiwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBjZW50ZXIgc2VhdCBvZiB0aGUgZmlyc3Qgcm93LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfU0VBVF9ST1dfMV9DRU5URVIgICAgICAgID0gNywKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSByaWdodCBzZWF0IG9mIHRoZSBmaXJzdCByb3cuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MRU5TX0ZBQ0lOR19JTlRFUklPUl9TRUFUX1JPV18xX1JJR0hUICAgICAgICAgPSA4LAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZmFjZXMgdGhlIGxlZnQgc2lkZSBzZWF0IG9mIHRoZSBzZWNvbmQgcm93LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfU0VBVF9ST1dfMl9MRUZUICAgICAgICAgID0gOSwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBjZW50ZXIgc2VhdCBvZiB0aGUgc2Vjb25kIHJvdy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HX0lOVEVSSU9SX1NFQVRfUk9XXzJfQ0VOVEVSICAgICAgICA9IDEwLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZmFjZXMgdGhlIHJpZ2h0IHNpZGUgc2VhdCBvZiB0aGUgc2Vjb25kIHJvdy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9BVVRPTU9USVZFX0xFTlNfRkFDSU5HX0lOVEVSSU9SX1NFQVRfUk9XXzJfUklHSFQgICAgICAgICA9IDExLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgZmFjZXMgdGhlIGxlZnQgc2lkZSBzZWF0IG9mIHRoZSB0aGlyZCByb3cuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQVVUT01PVElWRV9MRU5TX0ZBQ0lOR19JTlRFUklPUl9TRUFUX1JPV18zX0xFRlQgICAgICAgICAgPSAxMiwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGZhY2VzIHRoZSBjZW50ZXIgc2VhdCBvZiB0aGUgdGhpcmQgcm93LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfU0VBVF9ST1dfM19DRU5URVIgICAgICAgID0gMTMsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBmYWNlcyB0aGUgcmlnaHQgc2VhdCBvZiB0aGUgdGhpcmQgcm93LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0FVVE9NT1RJVkVfTEVOU19GQUNJTkdfSU5URVJJT1JfU0VBVF9ST1dfM19SSUdIVCAgICAgICAgID0gMTQsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfYXV0b21vdGl2ZV9sZW5zX2ZhY2luZ190OworCisKIAogX19FTkRfREVDTFMKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9saWJjYW1lcmEybmRrLm1hcC50eHQgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAppbmRleCAyYjYzMGRiLi5iMzk3N2ZmIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAorKysgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dApAQCAtMiwxMSArMiwxNSBAQAogICBnbG9iYWw6CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2Fib3J0Q2FwdHVyZXM7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmU7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVWMjsgIyBpbnRyb2R1Y2VkPTMzCiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZTsgIyBpbnRyb2R1Y2VkPTI5CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZVYyOyAjIGludHJvZHVjZWQ9MzMKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2xvc2U7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2dldERldmljZTsKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc2V0UmVwZWF0aW5nUmVxdWVzdDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc2V0UmVwZWF0aW5nUmVxdWVzdFYyOyAjIGludHJvZHVjZWQ9MzMKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0OyAjIGludHJvZHVjZWQ9MjkKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0VjI7ICMgaW50cm9kdWNlZD0zMwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdG9wUmVwZWF0aW5nOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl91cGRhdGVTaGFyZWRPdXRwdXQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFDYW1lcmFEZXZpY2VfY2xvc2U7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDlmNjMwOTkuLjBhNTc1OTAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCkBAIC0yOSw4ICsyOSw2IEBACiAjaW5jbHVkZSAiQUNhcHR1cmVSZXF1ZXN0LmgiCiAjaW5jbHVkZSAidXRpbHMuaCIKIAotI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMiCi0KICNkZWZpbmUgQ0hFQ0tfVFJBTlNBQ1RJT05fQU5EX1JFVChyZW1vdGVSZXQsIHN0YXR1cywgY2FsbE5hbWUpIFwKICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsgXAogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGR1cmluZyAlcyBjYWxsICVzIiwgX19GVU5DVElPTl9fLCBjYWxsTmFtZSwgXApAQCAtMzMyLDcgKzMzMCw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKLSAgICBtQ29uZmlndXJlZE91dHB1dHNbc3RyZWFtSWRdID0gc3RkOjptYWtlX3BhaXIob3V0cHV0LT5tV2luZG93LCBvdXRDb25maWdXKTsKKyAgICBtQ29uZmlndXJlZE91dHB1dHNbc3RyZWFtSWRdID0KKyAgICAgICAgICAgIHN0ZDo6bW92ZShzdGQ6Om1ha2VfcGFpcihzdGQ6Om1vdmUob3V0cHV0LT5tV2luZG93KSwgc3RkOjptb3ZlKG91dENvbmZpZ1cpKSk7CiAKICAgICByZXR1cm4gQUNBTUVSQV9PSzsKIH0KQEAgLTQ5Miw2ICs0OTEsNyBAQAogICAgIH0KIAogICAgIGlmIChtUmVtb3RlICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIiVzOiBiaW5kZXIgZGlzY29ubmVjdCByZWFjaGVkIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgYXV0byByZXQgPSBtUmVtb3RlLT5kaXNjb25uZWN0KCk7CiAgICAgICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciB3aGlsZSBkaXNjb25uZWN0aW5nIGRldmljZSAlcyIsIF9fRlVOQ1RJT05fXywKQEAgLTYyNSw3ICs2MjUsOCBAQAogICAgICAgICBvdXRDb25maWdJbnNlcnQud2luZG93SGFuZGxlc1swXSA9IGFudzsKICAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LnBoeXNpY2FsQ2FtZXJhSWQgPSBvdXRDb25maWcubVBoeXNpY2FsQ2FtZXJhSWQ7CiAgICAgICAgIG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgd3JhcChhbncpOwotICAgICAgICBvdXRwdXRTZXQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGFudywgb3V0Q29uZmlnSW5zZXJ0VykpOworCisgICAgICAgIG91dHB1dFNldC5lbXBsYWNlKHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bW92ZShhbncpLCBzdGQ6Om1vdmUob3V0Q29uZmlnSW5zZXJ0VykpKTsKICAgICB9CiAgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIsIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyPj4gYWRkU2V0ID0gb3V0cHV0U2V0OwogICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGRlbGV0ZUxpc3Q7CkBAIC02ODIsNyArNjgzLDcgQEAKICAgICB9CiAKICAgICAvLyBhZGQgbmV3IHN0cmVhbXMKLSAgICBmb3IgKGF1dG8gb3V0cHV0UGFpciA6IGFkZFNldCkgeworICAgIGZvciAoY29uc3QgYXV0byAmb3V0cHV0UGFpciA6IGFkZFNldCkgewogICAgICAgICBpbnQgc3RyZWFtSWQ7CiAgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6OlVOS05PV05fRVJST1I7CiAgICAgICAgIGF1dG8gcmV0ID0gbVJlbW90ZS0+Y3JlYXRlU3RyZWFtKG91dHB1dFBhaXIuc2Vjb25kLApAQCAtODQ3LDEyICs4NDgsMzIgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGNvbnN0IGF1dG8mIHdpbmRvd0hhbmRsZXMgPSBvdXRwdXRQYWlySXQtPnNlY29uZC5zZWNvbmQubU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlczsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRIYW5kbGUgOiB3aW5kb3dIYW5kbGVzKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gc3RyZWFtQW5kV2luZG93SWQgOiByZXF1ZXN0LT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCB3aW5kb3dJZCA9IHN0cmVhbUFuZFdpbmRvd0lkLndpbmRvd0lkOwotICAgICAgICAgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbCh3aW5kb3dIYW5kbGVzW3dpbmRvd0lkXSxvdXRIYW5kbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogYW53ID0gd2luZG93SGFuZGxlc1t3aW5kb3dJZF0uZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgICAgIC8vIEdldCB0aGUgc3VyZmFjZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZXJyb3Igc3RyZWFtIGlkLCBnbyB0aHJvdWdoCisgICAgICAgIC8vIHRoZW0gYW5kIHRyeSB0byBtYXRjaCB0aGUgc3VyZmFjZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgLy8gQ2FwdHVyZVJlcXVlc3QuCisgICAgICAgIGNvbnN0IGF1dG8mIGVycm9yV2luZG93SGFuZGxlcyA9CisgICAgICAgICAgICAgICAgb3V0cHV0UGFpckl0LT5zZWNvbmQuc2Vjb25kLm1PdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXM7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZXJyb3JXaW5kb3dIYW5kbGUgOiBlcnJvcldpbmRvd0hhbmRsZXMpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmcmVxdWVzdFN0cmVhbUFuZFdpbmRvd0lkIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMpIHsKKyAgICAgICAgICAgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdXJmYWNlcyBpbiB0aGUgY2FwdHVyZSByZXF1ZXN0IGFuZCBzZWUgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyBvbmVzIG1hdGNoIHRoZSBzdXJmYWNlcyBpbiB0aGUgZXJyb3Igc3RyZWFtLgorICAgICAgICAgICAgICAgIGludDMyX3QgcmVxdWVzdFdpbmRvd0lkID0gcmVxdWVzdFN0cmVhbUFuZFdpbmRvd0lkLndpbmRvd0lkOworICAgICAgICAgICAgICAgIGF1dG8gcmVxdWVzdFN1cmZhY2VQYWlySXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLmZpbmQocmVxdWVzdFN0cmVhbUFuZFdpbmRvd0lkLnN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFN1cmZhY2VQYWlySXQgPT0gbUNvbmZpZ3VyZWRPdXRwdXRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHJlcXVlc3Qgc3RyZWFtIGlkICVkIGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0cmVhbUFuZFdpbmRvd0lkLnN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZyZXF1ZXN0V2luZG93SGFuZGxlcyA9CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3VyZmFjZVBhaXJJdC0+c2Vjb25kLnNlY29uZC5tT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dIYW5kbGVzOworICAgICAgICAgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RXaW5kb3dIYW5kbGVzW3JlcXVlc3RXaW5kb3dJZF0sIGVycm9yV2luZG93SGFuZGxlKSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFudyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFdpbmRvd0hhbmRsZXNbcmVxdWVzdFdpbmRvd0lkXS5nZXROYXRpdmVIYW5kbGUoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSAlcyBMb3N0IG91dHB1dCBidWZmZXIgZm9yIEFOVyAlcCBmcmFtZSAlIiBQUklkNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWQoKSwgYW53LCBmcmFtZU51bWJlcik7CiAKQEAgLTkxMCw2ICs5MzEsNyBAQAogICAgICAgICBjYXNlIGtXaGF0T25FcnJvcjoKICAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0MjoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgpAQCAtOTgyLDYgKzEwMDQsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uU3RhdGVDYjoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDI6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKQEAgLTEwMDIsNiArMTAyNSw3IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICppZF9jc3RyID0gbUlkLmNfc3RyKCk7CiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0MjoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgpAQCAtMTA1Myw2ICsxMDc3LDM1IEBACiAgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0MjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnRWMiBvblN0YXJ0MjsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25TdGFydDIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgc3RhcnRWMiBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblN0YXJ0MiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50NjQoa1RpbWVTdGFtcEtleSwgJnRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgdGltZXN0YW1wISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQ2NChrRnJhbWVOdW1iZXJLZXksICZmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3AsIGlkX2NzdHIpOworICAgICAgICAgICAgICAgICAgICAoKm9uU3RhcnQyKShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCB0aW1lc3RhbXAsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQ7CkBAIC0xMjgxLDYgKzEzMzQsNyBAQAogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSA6CiAgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAogICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAorICAgICAgICBtSXMyQ2FsbGJhY2soZmFsc2UpLAogICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2soZmFsc2UpIHsKICAgICBpbml0Q2FwdHVyZUNhbGxiYWNrcyhjYnMpOwogCkBAIC0xMjk3LDYgKzEzNTEsNyBAQAogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzKSA6CiAgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAogICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAorICAgICAgICBtSXMyQ2FsbGJhY2soZmFsc2UpLAogICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2sodHJ1ZSkgewogICAgIGluaXRDYXB0dXJlQ2FsbGJhY2tzKGxjYnMpOwogCkBAIC0xMzA2LDYgKzEzNjEsNDAgQEAKICAgICB9CiB9CiAKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzVjIqIGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzMkNhbGxiYWNrKHRydWUpLAorICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2soZmFsc2UpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrc1YyKGNicyk7CisKKyAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IGNicy0+b25DYXB0dXJlQ29tcGxldGVkOworICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gY2JzLT5vbkNhcHR1cmVGYWlsZWQ7CisgICAgfQorfQorCitDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSG9sZGVyOjpDYWxsYmFja0hvbGRlcigKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzVjIqIGxjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1JczJDYWxsYmFjayh0cnVlKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKHRydWUpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrc1YyKGxjYnMpOworCisgICAgaWYgKGxjYnMgIT0gbnVsbHB0cikgeworICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IGxjYnMtPm9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CisgICAgICAgIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkID0gbGNicy0+b25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZDsKKyAgICB9Cit9CisKIHZvaWQKIENhbWVyYURldmljZTo6Y2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKAogICAgIGNvbnN0IGludCBzZXF1ZW5jZUlkLCBjb25zdCBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcikgewpAQCAtMTU0MiwxMSArMTYzMSwxNCBAQAogCiAgICAgaW50MzJfdCBzZXF1ZW5jZUlkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKICAgICBpbnQzMl90IGJ1cnN0SWQgPSByZXN1bHRFeHRyYXMuYnVyc3RJZDsKKyAgICBpbnQ2NF90IGZyYW1lTnVtYmVyID0gcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOwogCiAgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKICAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgewogICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydCA9IGNiaC5tT25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydFYyIG9uU3RhcnQyID0gY2JoLm1PbkNhcHR1cmVTdGFydGVkMjsKKyAgICAgICAgYm9vbCB2MkNhbGxiYWNrID0gY2JoLm1JczJDYWxsYmFjazsKICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOwogICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCkBAIC0xNTU0LDEyICsxNjQ2LDE5IEBACiAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOwogICAgICAgICB9CiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTdGFydCwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBudWxscHRyOworICAgICAgICBpZiAodjJDYWxsYmFjaykgeworICAgICAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0MiwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25TdGFydDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0LCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblN0YXJ0KTsKKyAgICAgICAgfQogICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25TdGFydCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CiAgICAgICAgIG1zZy0+c2V0SW50NjQoa1RpbWVTdGFtcEtleSwgdGltZXN0YW1wKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGZyYW1lTnVtYmVyKTsKICAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9CiAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaAppbmRleCAwYjZjN2M4Li5jMzA2MjA2IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oCkBAIC0yNDUsNiArMjQ1LDcgQEAKICAgICAgICAga1doYXRTZXNzaW9uU3RhdGVDYiwgICAvLyBvblJlYWR5LCBvbkFjdGl2ZQogICAgICAgICAvLyBDYXB0dXJlIGNhbGxiYWNrcwogICAgICAgICBrV2hhdENhcHR1cmVTdGFydCwgICAgIC8vIG9uQ2FwdHVyZVN0YXJ0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlU3RhcnQyLCAgICAgLy8gb25DYXB0dXJlU3RhcnRlZDIKICAgICAgICAga1doYXRDYXB0dXJlUmVzdWx0LCAgICAvLyBvbkNhcHR1cmVQcm9ncmVzc2VkLCBvbkNhcHR1cmVDb21wbGV0ZWQKICAgICAgICAga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdCwgLy8gb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZAogICAgICAgICBrV2hhdENhcHR1cmVGYWlsLCAgICAgIC8vIG9uQ2FwdHVyZUZhaWxlZApAQCAtMzA5LDExICszMTAsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0Pj4mICByZXF1ZXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKICAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogbGNicyk7Ci0KLSAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gICAgICAgIHZvaWQgaW5pdENhcHR1cmVDYWxsYmFja3MoVCogY2JzKSB7CisgICAgICAgIENhbGxiYWNrSG9sZGVyKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3NWMiogY2JzKTsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzVjIqIGxjYnMpOworICAgICAgICB2b2lkIGNsZWFyQ2FsbGJhY2tzKCkgewogICAgICAgICAgICAgbUNvbnRleHQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQyID0gbnVsbHB0cjsKICAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gbnVsbHB0cjsKICAgICAgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOwpAQCAtMzIyLDYgKzMzMCwyNCBAQAogICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkID0gbnVsbHB0cjsKICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQgPSBudWxscHRyOwogICAgICAgICAgICAgbU9uQ2FwdHVyZUJ1ZmZlckxvc3QgPSBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICAgIHZvaWQgaW5pdENhcHR1cmVDYWxsYmFja3NWMihUKiBjYnMpIHsKKyAgICAgICAgICAgIGNsZWFyQ2FsbGJhY2tzKCk7CisgICAgICAgICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtQ29udGV4dCA9IGNicy0+Y29udGV4dDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZDIgPSBjYnMtPm9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVByb2dyZXNzZWQgPSBjYnMtPm9uQ2FwdHVyZVByb2dyZXNzZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZUJ1ZmZlckxvc3QgPSBjYnMtPm9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgICAgdm9pZCBpbml0Q2FwdHVyZUNhbGxiYWNrcyhUKiBjYnMpIHsKKyAgICAgICAgICAgIGNsZWFyQ2FsbGJhY2tzKCk7CiAgICAgICAgICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBtQ29udGV4dCA9IGNicy0+Y29udGV4dDsKICAgICAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZCA9IGNicy0+b25DYXB0dXJlU3RhcnRlZDsKQEAgLTMzNSwxMCArMzYxLDEyIEBACiAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICBtU2Vzc2lvbjsKICAgICAgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0Pj4gIG1SZXF1ZXN0czsKICAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc1JlcGVhdGluZzsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1JczJDYWxsYmFjazsKICAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjazsKIAogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgbU9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnRWMiBtT25DYXB0dXJlU3RhcnRlZDI7CiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVQcm9ncmVzc2VkOwogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlQ29tcGxldGVkOwogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKaW5kZXggODM1OWJiMS4uNDY2MzUyOSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCkBAIC0xMzYsNiArMTM2LDggQEAKICAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKICAgICAgICAgfQogICAgICAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1Xb3JkZXJlZC1jb21wYXJlLWZ1bmN0aW9uLXBvaW50ZXJzIgogICAgICAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICBpZiAobUNvbnRleHQgIT0gb3RoZXIubUNvbnRleHQpIHJldHVybiBtQ29udGV4dCA8IG90aGVyLm1Db250ZXh0OwogICAgICAgICAgICAgaWYgKG1BdmFpbGFibGUgIT0gb3RoZXIubUF2YWlsYWJsZSkgcmV0dXJuIG1BdmFpbGFibGUgPCBvdGhlci5tQXZhaWxhYmxlOwpAQCAtMTQ2LDYgKzE0OCw3IEBACiAgICAgICAgICAgICBpZiAobVBoeXNpY2FsQ2FtVW5hdmFpbGFibGUgIT0gb3RoZXIubVBoeXNpY2FsQ2FtVW5hdmFpbGFibGUpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtUGh5c2ljYWxDYW1VbmF2YWlsYWJsZSA8IG90aGVyLm1QaHlzaWNhbENhbVVuYXZhaWxhYmxlOwogICAgICAgICAgICAgcmV0dXJuIG1VbmF2YWlsYWJsZSA8IG90aGVyLm1VbmF2YWlsYWJsZTsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCiAgICAgICAgIH0KICAgICAgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgICAgIHJldHVybiAoKnRoaXMgIT0gb3RoZXIgJiYgISgqdGhpcyA8IG90aGVyKSk7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuaAppbmRleCA2ZjU4MjBlLi42Mjc3OWE0IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmgKQEAgLTEwOSw4ICsxMDksMzAgQEAKICAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93R3JvdXBJZCA9IC0xOwogICAgIH07CiAKLSAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcihPdXRwdXRDb25maWd1cmF0aW9uICZvdXRwdXRDb25maWd1cmF0aW9uKQotICAgICAgICAgICAgOiBtT3V0cHV0Q29uZmlndXJhdGlvbigob3V0cHV0Q29uZmlndXJhdGlvbikpIHsgfQorICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyICZvdGhlcikgeworICAgICAgICAqdGhpcyA9IG90aGVyOworICAgIH0KKworICAgIC8vIE5lZWRlZCB0byBtYWtlIHN1cmUgdGhhdCBPdXRwdXRDb25maWd1cmF0aW9uIGluCisgICAgLy8gT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIsIHdoZW4gY29waWVkIGRvZXNuJ3QgY2FsbCBoaWRsX2hhbmRsZSdzCisgICAgLy8gYXNzaWdubWVudCBvcGVyYXRvciAvIGNvcHkgY29uc3RydWN0b3IsIHdoaWNoIHdpbGwgbGVhZCB0byBuYXRpdmUgaGFuZGxlCisgICAgLy8gY2xvbmluZywgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudCBmb3IgYXBwIGNhbGxiYWNrcyB3aGljaCBoYXZlIHRoZSBuYXRpdmUKKyAgICAvLyBoYW5kbGUgYXMgcGFyYW1ldGVyLgorICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyICZvcGVyYXRvcj0oY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIgJm90aGVyKSB7CisgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm91dHB1dENvbmZpZ3VyYXRpb24gPSBvdGhlci5tT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24ucm90YXRpb24gPSBvdXRwdXRDb25maWd1cmF0aW9uLnJvdGF0aW9uOworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi5pc0RlZmVycmVkID0gb3V0cHV0Q29uZmlndXJhdGlvbi5pc0RlZmVycmVkOworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi53aWR0aCA9IG91dHB1dENvbmZpZ3VyYXRpb24ud2lkdGg7CisgICAgICAgIG1PdXRwdXRDb25maWd1cmF0aW9uLmhlaWdodCA9IG91dHB1dENvbmZpZ3VyYXRpb24uaGVpZ2h0OworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dHcm91cElkID0gb3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dHcm91cElkOworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dIYW5kbGVzLnJlc2l6ZShvdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXMuc2l6ZSgpKTsKKyAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24ucGh5c2ljYWxDYW1lcmFJZCA9IG91dHB1dENvbmZpZ3VyYXRpb24ucGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmhhbmRsZSA6IG91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlcykgeworICAgICAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlc1tpKytdID0gaGFuZGxlLmdldE5hdGl2ZUhhbmRsZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CiAKICAgICBib29sIG9wZXJhdG9yID09KGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CiAgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJnNlbGYgPSBtT3V0cHV0Q29uZmlndXJhdGlvbjsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcAppbmRleCBiYTE0YzVjLi42M2NkYjc2IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwCkBAIC0yMzYsNiArMjM2LDExIEBACiAgICAgICAgIHJldHVybiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZShtU2Vzc2lvbiwgJm1DYXB0dXJlQ2FsbGJhY2tzLCAxLCAmbVN0aWxsUmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXFJZCk7CiAgICAgfQorICAgIGludCB0YWtlUGljdHVyZTIoKSB7CisgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgcmV0dXJuIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlVjIobVNlc3Npb24sICZtQ2FwdHVyZUNhbGxiYWNrc1YyLCAxLAorICAgICAgICAgICAgICAgICZtU3RpbGxSZXF1ZXN0LCAmc2VxSWQpOworICAgIH0KIAogICAgIGludCB0YWtlTG9naWNhbENhbWVyYVBpY3R1cmUoKSB7CiAgICAgICAgIGludCBzZXFJZDsKQEAgLTI0MywxNSArMjQ4LDMxIEBACiAgICAgICAgICAgICAgICAgMSwgJm1TdGlsbFJlcXVlc3QsICZzZXFJZCk7CiAgICAgfQogCisgICAgaW50IHRha2VMb2dpY2FsQ2FtZXJhUGljdHVyZTIoKSB7CisgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgcmV0dXJuIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVWMihtU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAmbUxvZ2ljYWxDYXB0dXJlQ2FsbGJhY2tzVjIsIDEsICZtU3RpbGxSZXF1ZXN0LCAmc2VxSWQpOworICAgIH0KKwogICAgIGJvb2wgY2hlY2tDYWxsYmFja3MoaW50IHBpY3R1cmVDb3VudCkgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOwogICAgICAgICBpZiAobUNvbXBsZXRlZENhcHR1cmVDYWxsYmFja0NvdW50ICE9IHBpY3R1cmVDb3VudCkgewotICAgICAgICAgICAgQUxPR0UoIkNvbXBsZXRlZCBjYXB0dXJlIGNhbGxhYmFjayBjb3VudCBub3QgYXMgZXhwZWN0ZWQuIGV4cGVjdGVkICVkIGFjdHVhbCAlZCIsCisgICAgICAgICAgICBBTE9HRSgiQ29tcGxldGVkIGNhcHR1cmUgY2FsbGJhY2sgY291bnQgbm90IGFzIGV4cGVjdGVkLiBleHBlY3RlZCAlZCBhY3R1YWwgJWQiLAogICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50LCBtQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKyAgICBib29sIGNoZWNrQ2FsbGJhY2tzVjIoaW50IHBpY3R1cmVDb3VudCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAobUNhcHR1cmVTdGFydGVkQ2FsbGJhY2tDb3VudCAhPSBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHN0YXJ0ZWQgY2FsbGJhY2sgY291bnQgbm90IGFzIGV4cGVjdGVkLiBleHBlY3RlZCAlZCBhY3R1YWwgJWQiLAorICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50LCBtQ2FwdHVyZVN0YXJ0ZWRDYWxsYmFja0NvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKIAogICAgcHJpdmF0ZToKICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIG1EZXZpY2VDYnt0aGlzLCBudWxscHRyLCBudWxscHRyfTsKQEAgLTI3Niw2ICsyOTcsNyBAQAogICAgIGNvbnN0IGNoYXIqIG1DYW1lcmFJZDsKICAgICBBQ2FtZXJhTWFuYWdlciogbUNhbWVyYU1hbmFnZXI7CiAgICAgaW50IG1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCA9IDA7CisgICAgaW50IG1DYXB0dXJlU3RhcnRlZENhbGxiYWNrQ291bnQgPSAwOwogICAgIHN0ZDo6bXV0ZXggbU11dGV4OwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzIG1DYXB0dXJlQ2FsbGJhY2tzID0gewogICAgICAgICAvLyBUT0RPOiBBZGQgdGVzdHMgZm9yIG90aGVyIGNhbGxiYWNrcwpAQCAtMjkzLDggKzMxNSwyNSBAQAogICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQKICAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlQnVmZmVyTG9zdAogICAgIH07CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3NWMiBtQ2FwdHVyZUNhbGxiYWNrc1YyID0geworICAgICAgICB0aGlzLCAvLyBjb250ZXh0CisgICAgICAgIFtdKHZvaWQqIGN0eCAsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiAqLGNvbnN0IEFDYXB0dXJlUmVxdWVzdCAqLCBpbnQ2NF90LAorICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyICkgeworICAgICAgICAgICAgQ2FtZXJhSGVscGVyICpjaCA9IHN0YXRpY19jYXN0PENhbWVyYUhlbHBlciAqPihjdHgpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZnJhbWVOdW1iZXIgPj0gMCk7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhjaC0+bU11dGV4KTsKKyAgICAgICAgICAgIGNoLT5tQ2FwdHVyZVN0YXJ0ZWRDYWxsYmFja0NvdW50Kys7CisgICAgICAgIH0sCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlQ29tcGxldGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUZhaWxlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlQnVmZmVyTG9zdAorICAgIH07CiAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVBoeXNpY2FsQ2FtZXJhSWRzOworCiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyBtTG9naWNhbENhcHR1cmVDYWxsYmFja3MgPSB7CiAgICAgICAgIC8vIFRPRE86IEFkZCB0ZXN0cyBmb3Igb3RoZXIgY2FsbGJhY2tzCiAgICAgICAgIHRoaXMsIC8vIGNvbnRleHQKQEAgLTMzNiw2ICszNzUsMjMgQEAKICAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCiAgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKICAgICB9OworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3NWMiBtTG9naWNhbENhcHR1cmVDYWxsYmFja3NWMiA9IHsKKyAgICAgICAgdGhpcywgLy8gY29udGV4dAorICAgICAgICBbXSh2b2lkKiBjdHggLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24gKixjb25zdCBBQ2FwdHVyZVJlcXVlc3QgKiwgaW50NjRfdCwKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICBDYW1lcmFIZWxwZXIgKmNoID0gc3RhdGljX2Nhc3Q8Q2FtZXJhSGVscGVyICo+KGN0eCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmcmFtZU51bWJlciA+PSAwKTsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGNoLT5tTXV0ZXgpOworICAgICAgICAgICAgY2gtPm1DYXB0dXJlU3RhcnRlZENhbGxiYWNrQ291bnQrKzsKKyAgICAgICAgfSwKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlUHJvZ3Jlc3NlZAorICAgICAgICBudWxscHRyLCAvL29uTG9naWNhbENhcHR1cmVDb21wbGV0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy9vbkxvZ2ljYWxDcGF0dXJlRmFpbGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVCdWZmZXJMb3N0CisgICAgfTsKKwogfTsKIAogY2xhc3MgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB7CkBAIC01NzAsNyArNjI2LDcgQEAKICAgICB9CiAKICAgICBib29sIHRha2VQaWN0dXJlcyhjb25zdCBjaGFyKiBpZCwgdWludDY0X3QgcmVhZGVyVXNhZ2UsIGludCByZWFkZXJNYXhJbWFnZXMsCi0gICAgICAgICAgICBib29sIHJlYWRlckFzeW5jLCBpbnQgcGljdHVyZUNvdW50KSB7CisgICAgICAgICAgICBib29sIHJlYWRlckFzeW5jLCBpbnQgcGljdHVyZUNvdW50LCBib29sIHYyID0gZmFsc2UpIHsKICAgICAgICAgaW50IHJldCA9IDA7CiAKICAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB0ZXN0Q2FzZSgKQEAgLTYwMCw3ICs2NTYsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGljdHVyZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHJldCA9IGNhbWVyYUhlbHBlci50YWtlUGljdHVyZSgpOworICAgICAgICAgICAgaWYgKHYyKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VQaWN0dXJlMigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSBjYW1lcmFIZWxwZXIudGFrZVBpY3R1cmUoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byB0YWtlIHBpY3R1cmUiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC02MTcsNyArNjc3LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gdGVzdENhc2UuZ2V0QWNxdWlyZWRJbWFnZUNvdW50KCkgPT0gcGljdHVyZUNvdW50ICYmCi0gICAgICAgICAgICAgICAgY2FtZXJhSGVscGVyLmNoZWNrQ2FsbGJhY2tzKHBpY3R1cmVDb3VudCk7CisgICAgICAgICAgICAgICB2MiA/IGNhbWVyYUhlbHBlci5jaGVja0NhbGxiYWNrc1YyKHBpY3R1cmVDb3VudCkgOgorICAgICAgICAgICAgICAgICAgICBjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KTsKICAgICB9CiAKICAgICBib29sIHRlc3RUYWtlUGljdHVyZXNOYXRpdmUoY29uc3QgY2hhciogaWQpIHsKQEAgLTYyNiwxMiArNjg3LDE0IEBACiAgICAgICAgICAgICBmb3IgKGF1dG8mIHJlYWRlck1heEltYWdlcyA6IHsxLCA0LCA4fSkgewogICAgICAgICAgICAgICAgIGZvciAoYXV0byYgcmVhZGVyQXN5bmMgOiB7dHJ1ZSwgZmFsc2V9KSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byYgcGljdHVyZUNvdW50IDogezEsIDQsIDh9KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRha2VQaWN0dXJlcyhpZCwgcmVhZGVyVXNhZ2UsIHJlYWRlck1heEltYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyQXN5bmMsIHBpY3R1cmVDb3VudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVGVzdCB0YWtlUGljdHVyZXMgZmFpbGVkIGZvciB0ZXN0IGNhc2UgdXNhZ2U9JSIgUFJJdTY0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgbWF4SW1hZ2VzPSVkLCBhc3luYz0lZCwgcGljdHVyZUNvdW50PSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLCByZWFkZXJBc3luYywgcGljdHVyZUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBhdXRvICYgdjIgOiB7dHJ1ZSwgZmFsc2V9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWtlUGljdHVyZXMoaWQsIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJBc3luYywgcGljdHVyZUNvdW50LCB2MikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlRlc3QgdGFrZVBpY3R1cmVzIGZhaWxlZCBmb3IgdGVzdCBjYXNlIHVzYWdlPSUiIFBSSXU2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBtYXhJbWFnZXM9JWQsIGFzeW5jPSVkLCBwaWN0dXJlQ291bnQ9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLCByZWFkZXJBc3luYywgcGljdHVyZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTcyNSw3ICs3ODgsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgdm9pZCB0ZXN0TG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKGJvb2wgdXNlUGh5c2ljYWxTZXR0aW5ncykgeworICAgIHZvaWQgdGVzdExvZ2ljYWxDYW1lcmFQaHlzaWNhbFN0cmVhbShib29sIHVzZVBoeXNpY2FsU2V0dGluZ3MsIGJvb2wgdjIpIHsKICAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQgPSBudWxscHRyOwogICAgICAgICBBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY01ldGFkYXRhID0gbnVsbHB0cjsKICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IHBoeXNpY2FsQ2FtZXJhSWRzOwpAQCAtNzcyLDcgKzgzNSwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaWN0dXJlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VMb2dpY2FsQ2FtZXJhUGljdHVyZSgpOworICAgICAgICAgICAgaWYgKHYyKSB7CisgICAgICAgICAgICAgIHJldCA9IGNhbWVyYUhlbHBlci50YWtlTG9naWNhbENhbWVyYVBpY3R1cmUyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VMb2dpY2FsQ2FtZXJhUGljdHVyZSgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgQVNTRVJUX0VRKHJldCwgMCk7CiAgICAgICAgIH0KIApAQCAtNzkzLDggKzg2MSwxMSBAQAogICAgICAgICAgICAgQUxPR0koIlRlc3Rpbmcgd2luZG93ICVwIiwgdGVzdENhc2UtPmdldE5hdGl2ZVdpbmRvdygpKTsKICAgICAgICAgICAgIEFTU0VSVF9FUSh0ZXN0Q2FzZS0+Z2V0QWNxdWlyZWRJbWFnZUNvdW50KCksIHBpY3R1cmVDb3VudCk7CiAgICAgICAgIH0KLQotICAgICAgICBBU1NFUlRfVFJVRShjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KSk7CisgICAgICAgIGlmICh2MikgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoY2FtZXJhSGVscGVyLmNoZWNrQ2FsbGJhY2tzVjIocGljdHVyZUNvdW50KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KSk7CisgICAgICAgIH0KIAogICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZShzdGF0aWNNZXRhZGF0YSk7CiAgICAgfQpAQCAtODM0LDggKzkwNSwxMCBAQAogfQogCiBURVNUX0YoQUltYWdlUmVhZGVyVmVuZG9yVGVzdCwgTG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKSB7Ci0gICAgdGVzdExvZ2ljYWxDYW1lcmFQaHlzaWNhbFN0cmVhbShmYWxzZS8qdXNlUGh5c2ljYWxTZXR0aW5ncyovKTsKLSAgICB0ZXN0TG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKHRydWUvKnVzZVBoeXNpY2FsU2V0dGluZ3MqLyk7CisgICAgZm9yIChhdXRvICYgdjIgOiB7dHJ1ZSwgZmFsc2V9KSB7CisgICAgICAgIHRlc3RMb2dpY2FsQ2FtZXJhUGh5c2ljYWxTdHJlYW0oZmFsc2UvKnVzZVBoeXNpY2FsU2V0dGluZ3MqLywgdjIpOworICAgICAgICB0ZXN0TG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKHRydWUvKnVzZVBoeXNpY2FsU2V0dGluZ3MqLywgdjIpOworICAgIH0KIH0KIAogfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcAppbmRleCA5ZjJmNDMwLi4xN2VhNTEyIDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCisrKyBiL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKQEAgLTk2LDYgKzk2LDEyIEBACiAgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICB9OwogCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblRvcmNoU3RyZW5ndGhMZXZlbENoYW5nZWQoY29uc3QgU3RyaW5nMTYmIC8qY2FtZXJhSWQqLywKKyAgICAgICAgICAgIGludDMyX3QgLyp0b3JjaFN0cmVuZ3RoKi8pIHsKKyAgICAgICAgLy8gTm8gb3AKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH0KKwogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpIHsKICAgICAgICAgLy8gTm8gb3AKICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwpkaWZmIC0tZ2l0IGEvY21kcy9PV05FUlMgYi9jbWRzL09XTkVSUwppbmRleCAwZDMyYWFjLi5hNDhjMzdhIDEwMDY0NAotLS0gYS9jbWRzL09XTkVSUworKysgYi9jbWRzL09XTkVSUwpAQCAtMSwzICsxLDMgQEAKIGVsYXVyZW50QGdvb2dsZS5jb20KK2Vzc2lja0Bnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCi1tYXJjb25lQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQuYnAgYi9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLmJwCmluZGV4IDM1OWE4MzUuLmQwYjNjZTAgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQuYnAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvQW5kcm9pZC5icApAQCAtNTUsMTIgKzU1LDYgQEAKICAgICAgICAgImxpYkdMRVN2MiIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCmluZGV4IGU2ZTM0NzMuLjJlMGI2NzggMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcApAQCAtNzAxLDcgKzcwMSw3IEBACiAgICAgICAgIHByaW50ZigiRGlzcGxheSBpcyAlZHglZCBAJS4yZmZwcyAob3JpZW50YXRpb249JXMpLCBsYXllclN0YWNrPSV1XG4iLAogICAgICAgICAgICAgICAgIGxheWVyU3RhY2tTcGFjZVJlY3QuZ2V0V2lkdGgoKSwgbGF5ZXJTdGFja1NwYWNlUmVjdC5nZXRIZWlnaHQoKSwKICAgICAgICAgICAgICAgICBkaXNwbGF5TW9kZS5yZWZyZXNoUmF0ZSwgdG9DU3RyaW5nKGRpc3BsYXlTdGF0ZS5vcmllbnRhdGlvbiksCi0gICAgICAgICAgICAgICAgZGlzcGxheVN0YXRlLmxheWVyU3RhY2spOworICAgICAgICAgICAgICAgIGRpc3BsYXlTdGF0ZS5sYXllclN0YWNrLmlkKTsKICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgfQogCkBAIC0xMDY3LDcgKzEwNjcsNyBAQAogCiAgICAgc3RkOjpvcHRpb25hbDxQaHlzaWNhbERpc3BsYXlJZD4gZGlzcGxheUlkID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcm5hbERpc3BsYXlJZCgpOwogICAgIGlmICghZGlzcGxheUlkKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdldCB0b2tlbiBmb3IgaW50ZXJuYWwgZGlzcGxheVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdldCBJRCBmb3IgaW50ZXJuYWwgZGlzcGxheVxuIik7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIApAQCAtMTE2OCwxNyArMTE2OCwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgZ1BoeXNpY2FsRGlzcGxheUlkID0gUGh5c2ljYWxEaXNwbGF5SWQoYXRvbGwob3B0YXJnKSk7Ci0gICAgICAgICAgICBpZiAoZ1BoeXNpY2FsRGlzcGxheUlkLnZhbHVlID09IDApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgcGh5c2ljYWwgZGlzcGxheSBpZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFN1cmZhY2VDb21wb3NlckNsaWVudDo6Ci0gICAgICAgICAgICAgICAgICAgIGdldFBoeXNpY2FsRGlzcGxheVRva2VuKGdQaHlzaWNhbERpc3BsYXlJZCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwaHlzaWNhbCBkaXNwbGF5IGlkOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvX3N0cmluZyhnUGh5c2ljYWxEaXNwbGF5SWQpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgaWYgKGNvbnN0IGF1dG8gaWQgPSBhbmRyb2lkOjpEaXNwbGF5SWQ6OmZyb21WYWx1ZTxQaHlzaWNhbERpc3BsYXlJZD4oYXRvbGwob3B0YXJnKSk7CisgICAgICAgICAgICAgICAgaWQgJiYgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRQaHlzaWNhbERpc3BsYXlUb2tlbigqaWQpKSB7CisgICAgICAgICAgICAgICAgZ1BoeXNpY2FsRGlzcGxheUlkID0gKmlkOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwaHlzaWNhbCBkaXNwbGF5IElEXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKGljICE9ICc/JykgewogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2V0b3B0X2xvbmcgcmV0dXJuZWQgdW5leHBlY3RlZCB2YWx1ZSAweCV4XG4iLCBpYyk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQuYnAgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmZTA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5icApAQCAtMCwwICsxLDI3NiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfY21kc19zdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X2NtZHNfc3RhZ2VmcmlnaHRfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAic3RhZ2VmcmlnaHQiLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKKyAgICAgICAgInN0YWdlZnJpZ2h0LmNwcCIsCisgICAgICAgICJqcGVnLmNwcCIsCisgICAgICAgICJTaW5lU291cmNlLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX2NvZGVjbGlzdCIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJqcGVnIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgIF0sCisKKyAgICBzeXN0ZW1fZXh0X3NwZWNpZmljOiB0cnVlLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJyZWNvcmQiLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKKyAgICAgICAgIlNpbmVTb3VyY2UuY3BwIiwKKyAgICAgICAgInJlY29yZC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJjYW1lcmFfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgIF0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogInJlY29yZHZpZGVvIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkF1ZGlvUGxheWVyLmNwcCIsCisgICAgICAgICJyZWNvcmR2aWRlby5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICBdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJhdWRpb2xvb3AiLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKKyAgICAgICAgIlNpbmVTb3VyY2UuY3BwIiwKKyAgICAgICAgImF1ZGlvbG9vcC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICBdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJzdHJlYW0iLAorCisgICAgc3JjczogWyJzdHJlYW0uY3BwIl0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgXSwKK30KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiY29kZWMiLAorCisgICAgc3JjczogWworICAgICAgICAiY29kZWMuY3BwIiwKKyAgICAgICAgIlNpbXBsZVBsYXllci5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFkcm1faGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgIF0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogIm1lZGlhZmlsdGVyIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImZpbHRlcnMvYXJnYnRvcmdiYS5yc2NyaXB0IiwKKyAgICAgICAgImZpbHRlcnMvbmlnaHR2aXNpb24ucnNjcmlwdCIsCisgICAgICAgICJmaWx0ZXJzL3NhdHVyYXRpb24ucnNjcmlwdCIsCisgICAgICAgICJtZWRpYWZpbHRlci5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFkcm1faGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgInJzLWhlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliUlNjcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tZWRpYWZpbHRlciJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJtdXhlciIsCisKKyAgICBzcmNzOiBbIm11eGVyLmNwcCJdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzYzRhNC4uMDAwMDAwMAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICBcCi0gICAgICAgIEF1ZGlvUGxheWVyLmNwcCBcCi0gICAgICAgIHN0YWdlZnJpZ2h0LmNwcCBcCi0gICAgICAgIGpwZWcuY3BwICAgICAgICBcCi0gICAgICAgIFNpbmVTb3VyY2UuY3BwCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYV9jb2RlY2xpc3QgbGlidXRpbHMgbGliYmluZGVyIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJqcGVnIGxpYnVpIGxpYmd1aSBsaWJjdXRpbHMgbGlibG9nIFwKLSAgICAgICAgbGliaGlkbGJhc2UgbGliZGF0YXNvdXJjZSBsaWJhdWRpb2NsaWVudCBcCi0gICAgICAgIGFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCBcCi0gICAgICAgIGZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NZU1RFTV9FWFRfTU9EVUxFOj0gdHJ1ZQotTE9DQUxfTU9EVUxFOj0gc3RhZ2VmcmlnaHQKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgIFwKLSAgICAgICAgQXVkaW9QbGF5ZXIuY3BwIFwKLSAgICAgICAgU2luZVNvdXJjZS5jcHAgICAgXAotICAgICAgICByZWNvcmQuY3BwCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJkYXRhc291cmNlIGxpYmF1ZGlvY2xpZW50IFwKLSAgICAgICAgZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9jYW1lcmEvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX01PRFVMRTo9IHJlY29yZAotTE9DQUxfTElDRU5TRV9LSU5EUzo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUzo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEU6PSAkKExPQ0FMX1BBVEgpL05PVElDRQotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgXAotICAgICAgICBBdWRpb1BsYXllci5jcHAgXAotICAgICAgICByZWNvcmR2aWRlby5jcHAKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYm1lZGlhbWV0cmljc19oZWFkZXJzIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYmF1ZGlvY2xpZW50Ci0KLUxPQ0FMX0NfSU5DTFVERVM6PSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIFwKLSAgICAgICAgZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFOj0gcmVjb3JkdmlkZW8KLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgXAotICAgICAgICBBdWRpb1BsYXllci5jcHAgXAotICAgICAgICBTaW5lU291cmNlLmNwcCAgICBcCi0gICAgICAgIGF1ZGlvbG9vcC5jcHAKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYm1lZGlhbWV0cmljc19oZWFkZXJzIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYmF1ZGlvY2xpZW50IFwKLSAgICAgICAgZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9NT0RVTEU6PSBhdWRpb2xvb3AKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgIFwKLSAgICAgICAgc3RyZWFtLmNwcCAgICBcCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYnVpIGxpYmd1aSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlibWVkaWEgbGliY3V0aWxzIGxpYmRhdGFzb3VyY2UKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9NT0RVTEU6PSBzdHJlYW0KLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKLSAgICAgICAgY29kZWMuY3BwICAgICAgICAgICAgICAgXAotICAgICAgICBTaW1wbGVQbGF5ZXIuY3BwICAgICAgICBcCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYWRybV9oZWFkZXJzIFwKLSAgICAgICAgbGlibWVkaWFtZXRyaWNzX2hlYWRlcnMgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGlibWVkaWEgbGlibWVkaWFfb214IGxpYmF1ZGlvY2xpZW50IGxpYnVpIGxpYmd1aSBsaWJjdXRpbHMKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9NT0RVTEU6PSBjb2RlYwotTE9DQUxfTElDRU5TRV9LSU5EUzo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUzo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEU6PSAkKExPQ0FMX1BBVEgpL05PVElDRQotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICAgICAgZmlsdGVycy9hcmdidG9yZ2JhLnJzY3JpcHQgXAotICAgICAgICBmaWx0ZXJzL25pZ2h0dmlzaW9uLnJzY3JpcHQgXAotICAgICAgICBmaWx0ZXJzL3NhdHVyYXRpb24ucnNjcmlwdCBcCi0gICAgICAgIG1lZGlhZmlsdGVyLmNwcCBcCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJtZWRpYWRybV9oZWFkZXJzIFwKLSAgICAgICAgbGlibWVkaWFtZXRyaWNzX2hlYWRlcnMgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBsaWJsb2cgXAotICAgICAgICBsaWJ1dGlscyBcCi0gICAgICAgIGxpYmJpbmRlciBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgICAgICBsaWJtZWRpYV9vbXggXAotICAgICAgICBsaWJ1aSBcCi0gICAgICAgIGxpYmd1aSBcCi0gICAgICAgIGxpYlJTY3BwIFwKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0gICAgICAgIGZyYW1ld29ya3MvcnMvY3BwIFwKLSAgICAgICAgZnJhbWV3b3Jrcy9ycyBcCi0KLWludGVybWVkaWF0ZXMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixTVEFUSUNfTElCUkFSSUVTLGxpYlJTLFRBUkdFVCwpCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoaW50ZXJtZWRpYXRlcykKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUzo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfbWVkaWFmaWx0ZXIKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFOj0gbWVkaWFmaWx0ZXIKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotTE9DQUxfU0FOSVRJWkUgOj0gY2ZpCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCi0gICAgICAgIG11eGVyLmNwcCAgICAgICAgICAgIFwKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYm1lZGlhbWV0cmljc19oZWFkZXJzIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgICAgIGxpYmN1dGlscyBsaWJjCi0KLUxPQ0FMX0NfSU5DTFVERVM6PSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFOj0gbXV4ZXIKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCmluZGV4IDU1NDI3Y2EuLjZjZGRmNDcgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCkBAIC0yNDksNyArMjQ5LDggQEAKIAogICAgICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKAogICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgbVNhbXBsZVJhdGUsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBhdWRpb01hc2ssCi0gICAgICAgICAgICAgICAgMCAvKmZyYW1lQ291bnQqLywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJkF1ZGlvQ2FsbGJhY2ssIHRoaXMsCisgICAgICAgICAgICAgICAgMCAvKmZyYW1lQ291bnQqLywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICB3cDxJQXVkaW9UcmFja0NhbGxiYWNrPjo6ZnJvbUV4aXN0aW5nKHRoaXMpLAogICAgICAgICAgICAgICAgIDAgLypub3RpZmljYXRpb25GcmFtZXMqLyk7CiAKICAgICAgICAgaWYgKChlcnIgPSBtQXVkaW9UcmFjay0+aW5pdENoZWNrKCkpICE9IE9LKSB7CkBAIC0zOTcsMTAgKzM5OCw2IEBACiAgICAgbVN0YXJ0UG9zVXMgPSAwOwogfQogCi0vLyBzdGF0aWMKLXZvaWQgQXVkaW9QbGF5ZXI6OkF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICp1c2VyLCB2b2lkICppbmZvKSB7Ci0gICAgc3RhdGljX2Nhc3Q8QXVkaW9QbGF5ZXIgKj4odXNlciktPkF1ZGlvQ2FsbGJhY2soZXZlbnQsIGluZm8pOwotfQogCiBib29sIEF1ZGlvUGxheWVyOjpyZWFjaGVkRU9TKHN0YXR1c190ICpmaW5hbFN0YXR1cykgewogICAgICpmaW5hbFN0YXR1cyA9IE9LOwpAQCAtNDU1LDIwICs0NTIsMTIgQEAKICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBBdWRpb1BsYXllcjo6QXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIHsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6Ci0gICAgICAgIHsKLSAgICAgICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoQXVkaW9UcmFjazo6QnVmZmVyICopaW5mbzsKLSAgICAgICAgc2l6ZV90IG51bUJ5dGVzV3JpdHRlbiA9IGZpbGxCdWZmZXIoYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSk7Ci0gICAgICAgIGJ1ZmZlci0+c2l6ZSA9IG51bUJ5dGVzV3JpdHRlbjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKK3NpemVfdCBBdWRpb1BsYXllcjo6b25Nb3JlRGF0YShjb25zdCBBdWRpb1RyYWNrOjpCdWZmZXImIGJ1ZmZlcikgeworICAgIHJldHVybiBmaWxsQnVmZmVyKGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCkpOworfQogCi0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9TVFJFQU1fRU5EOgotICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KK3ZvaWQgQXVkaW9QbGF5ZXI6Om9uU3RyZWFtRW5kKCkgeworICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKIH0KIAogc2l6ZV90IEF1ZGlvUGxheWVyOjpmaWxsQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmggYi9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmgKaW5kZXggNDM1NTBlYS4uNjA4ZjU0YiAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBBVURJT19QTEFZRVJfSF8KIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgpAQCAtMjYsMTAgKzI3LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBdWRpb1RyYWNrOwogc3RydWN0IEF3ZXNvbWVQbGF5ZXI7CiAKLWNsYXNzIEF1ZGlvUGxheWVyIHsKK2NsYXNzIEF1ZGlvUGxheWVyIDogQXVkaW9UcmFjazo6SUF1ZGlvVHJhY2tDYWxsYmFjayB7CiBwdWJsaWM6CiAgICAgZW51bSB7CiAgICAgICAgIFJFQUNIRURfRU9TLApAQCAtNjYsNiArNjYsOSBAQAogICAgIHN0YXR1c190IGdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKTsKIAogcHJpdmF0ZToKKyAgICBmcmllbmQgc3A8QXVkaW9QbGF5ZXI+OworICAgIHNpemVfdCBvbk1vcmVEYXRhKGNvbnN0IEF1ZGlvVHJhY2s6OkJ1ZmZlciYgYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uU3RyZWFtRW5kKCkgb3ZlcnJpZGU7CiAgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgc3A8QXVkaW9UcmFjaz4gbUF1ZGlvVHJhY2s7CiAKQEAgLTk5LDkgKzEwMiw2IEBACiAgICAgaW50NjRfdCBtU3RhcnRQb3NVczsKICAgICBjb25zdCB1aW50MzJfdCBtQ3JlYXRlRmxhZ3M7CiAKLSAgICBzdGF0aWMgdm9pZCBBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqdXNlciwgdm9pZCAqaW5mbyk7Ci0gICAgdm9pZCBBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbyk7Ci0KICAgICBzdGF0aWMgc2l6ZV90IEF1ZGlvU2lua0NhbGxiYWNrKAogICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKmF1ZGlvU2luaywKICAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICptZSwKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcAppbmRleCA0YjQxZmY4Li44M2Y4ZmU5IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwCkBAIC0xNjYsOSArMTY2LDkgQEAKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGRlY29kZXIgPSBTaW1wbGVEZWNvZGluZ1NvdXJjZTo6Q3JlYXRlKGVuY29kZXIpOwogCiAgICAgICAgIGlmIChwbGF5VG9TcGVha2VyKSB7Ci0gICAgICAgICAgICBBdWRpb1BsYXllciBwbGF5ZXIoTlVMTCk7Ci0gICAgICAgICAgICBwbGF5ZXIuc2V0U291cmNlKGRlY29kZXIpOwotICAgICAgICAgICAgcGxheWVyLnN0YXJ0KCk7CisgICAgICAgICAgICBzcDxBdWRpb1BsYXllcj4gcGxheWVyID0gc3A8QXVkaW9QbGF5ZXI+OjptYWtlKG51bGxwdHIpOworICAgICAgICAgICAgcGxheWVyLT5zZXRTb3VyY2UoZGVjb2Rlcik7CisgICAgICAgICAgICBwbGF5ZXItPnN0YXJ0KCk7CiAgICAgICAgICAgICBzbGVlcChkdXJhdGlvbik7CiAKIEFMT0dJKCJMaW5lOiAlZCIsIF9fTElORV9fKTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcAppbmRleCAwOThjMjc4Li41NzQzYWQ2IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgogCi0jaW5jbHVkZSAiQXVkaW9QbGF5ZXIuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTI3NCwxNyArMjczLDYgQEAKICAgICBjb25zdCBpbnQzMl90IGtOdW1DaGFubmVscyA9IDI7CiAgICAgc3A8TWVkaWFTb3VyY2U+IGF1ZGlvU291cmNlID0gbmV3IFNpbmVTb3VyY2Uoa1NhbXBsZVJhdGUsIGtOdW1DaGFubmVscyk7CiAKLSNpZiAwCi0gICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IGF1ZGlvU2luazsKLSAgICBBdWRpb1BsYXllciAqcGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKGF1ZGlvU2luayk7Ci0gICAgcGxheWVyLT5zZXRTb3VyY2UoYXVkaW9Tb3VyY2UpOwotICAgIHBsYXllci0+c3RhcnQoKTsKLQotICAgIHNsZWVwKDEwKTsKLQotICAgIHBsYXllci0+c3RvcCgpOwotI2VuZGlmCi0KICAgICBzcDxBTWVzc2FnZT4gZW5jTWV0YSA9IG5ldyBBTWVzc2FnZTsKICAgICBlbmNNZXRhLT5zZXRTdHJpbmcoIm1pbWUiLAogICAgICAgICAgICAgMCA/IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCmluZGV4IGM0MzBmMDUuLjk3ODM4NTUgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCkBAIC03MCw2ICs3MCwxMCBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAorbmFtZXNwYWNlIHsKKyAgICBjb25zdGV4cHIgc3RhdGljIGludCBQSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyX0FTXzg4ODggPSAtSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI7Cit9CisKIHN0YXRpYyBsb25nIGdOdW1SZXBldGl0aW9uczsKIHN0YXRpYyBsb25nIGdNYXhOdW1GcmFtZXM7ICAvLyAwIG1lYW5zIGRlY29kZSBhbGwgYXZhaWxhYmxlLgogc3RhdGljIGxvbmcgZ1JlcHJvZHVjZUJ1ZzsgIC8vIGlmIG5vdCAtMS4KQEAgLTIyMCw3ICsyMjQsNyBAQAogICAgIH0KIAogICAgIGlmIChnUGxheWJhY2tBdWRpbykgewotICAgICAgICBBdWRpb1BsYXllciAqcGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKE5VTEwpOworICAgICAgICBzcDxBdWRpb1BsYXllcj4gcGxheWVyID0gc3A8QXVkaW9QbGF5ZXI+OjptYWtlKG51bGxwdHIpOwogICAgICAgICBwbGF5ZXItPnNldFNvdXJjZShyYXdTb3VyY2UpOwogICAgICAgICByYXdTb3VyY2UuY2xlYXIoKTsKIApAQCAtMjM1LDkgKzIzOSw2IEBACiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBzdGFydCBwbGF5YmFjayBlcnI9JWQgKDB4JTA4eClcbiIsIGVyciwgZXJyKTsKICAgICAgICAgfQogCi0gICAgICAgIGRlbGV0ZSBwbGF5ZXI7Ci0gICAgICAgIHBsYXllciA9IE5VTEw7Ci0KICAgICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSBpZiAoZ1JlcHJvZHVjZUJ1ZyA+PSAzICYmIGdSZXByb2R1Y2VCdWcgPD0gNSkgewogICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CkBAIC02MjksNyArNjMwLDE0IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLW0gbWF4LW51bWJlci1vZi1mcmFtZXMtdG8tZGVjb2RlIGluIGVhY2ggcGFzc1xuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWIgYnVnIHRvIHJlcHJvZHVjZVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWkobmZvKSBkdW1wIGNvZGVjIGluZm8gKHByb2ZpbGVzIGFuZCBjb2xvciBmb3JtYXRzIHN1cHBvcnRlZCwgZGV0YWlscylcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC10KGh1bWJuYWlsKSBleHRyYWN0IHZpZGVvIHRodW1ibmFpbCBvciBhbGJ1bSBhcnRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC10KGh1bWJuYWlsKSBleHRyYWN0IHZpZGVvIHRodW1ibmFpbCBvciBhbGJ1bSBhcnQgKC9zZGNhcmQvb3V0LmpwZylcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1QKGl4ZWxGb3JtYXQpIHBpeGVsIGZvcm1hdCB0byB1c2UgZm9yIHJhdyB0aHVtYm5haWwgIgorICAgICAgICAgICAgICAgICAgICAiKC9zZGNhcmQvb3V0LnJhdylcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICVkOiBSR0JBXzU2NVxuIiwgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAlZDogUkdCQV84ODg4XG4iLCBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCk7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgJWQ6IEJHUkFfODg4OFxuIiwgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODgpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICVkOiBSR0JBXzEwMTAxMDJcbiIsIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAlZDogUkdCQV8xMDEwMTAyIGFzIFJHQkFfODg4OFxuIiwgUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMl9BU184ODg4KTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcyhvZnR3YXJlKSBwcmVmZXIgc29mdHdhcmUgY29kZWNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1yKGhhcmR3YXJlKSBmb3JjZSB0byB1c2UgaGFyZHdhcmUgY29kZWNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1vIHBsYXliYWNrIGF1ZGlvXG4iKTsKQEAgLTc4Nyw2ICs3OTUsNyBAQAogICAgIGJvb2wgdXNlU3VyZmFjZVRleEFsbG9jID0gZmFsc2U7CiAgICAgYm9vbCBkdW1wU3RyZWFtID0gZmFsc2U7CiAgICAgYm9vbCBkdW1wUENNU3RyZWFtID0gZmFsc2U7CisgICAgaW50MzJfdCBwaXhlbEZvcm1hdCA9IDA7ICAgICAgICAvLyB0aHVtYm5haWwgcGl4ZWwgZm9ybWF0CiAgICAgU3RyaW5nOCBkdW1wU3RyZWFtRmlsZW5hbWU7CiAgICAgZ051bVJlcGV0aXRpb25zID0gMTsKICAgICBnTWF4TnVtRnJhbWVzID0gMDsKQEAgLTgwMCw3ICs4MDksNyBAQAogICAgIHNwPGFuZHJvaWQ6OkFMb29wZXI+IGxvb3BlcjsKIAogICAgIGludCByZXM7Ci0gICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgInZoYXFuOmxtOmI6aXRzcm93OmtOOnhTVGQ6RDoiKSkgPj0gMCkgeworICAgIHdoaWxlICgocmVzID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ2aGFxbjpsbTpiOml0c3JvdzprTjp4U1RkOkQ6UDoiKSkgPj0gMCkgewogICAgICAgICBzd2l0Y2ggKHJlcykgewogICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgICB7CkBAIC04NDEsNiArODUwLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSAnUCc6CiAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICAgY2FzZSAnYic6CkBAIC04NTYsNiArODY2LDggQEAKICAgICAgICAgICAgICAgICAgICAgZ051bVJlcGV0aXRpb25zID0geDsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PSAnbScpIHsKICAgICAgICAgICAgICAgICAgICAgZ01heE51bUZyYW1lcyA9IHg7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMgPT0gJ1AnKSB7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0ID0geDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShyZXMsICdiJyk7CiAgICAgICAgICAgICAgICAgICAgIGdSZXByb2R1Y2VCdWcgPSB4OwpAQCAtOTc4LDI0ICs5OTAsNzEgQEAKICAgICAgICAgICAgIGNsb3NlKGZkKTsKICAgICAgICAgICAgIGZkID0gLTE7CiAKKyAgICAgICAgICAgIHVpbnQzMl90IHJldHJpZXZlclBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OworICAgICAgICAgICAgaWYgKHBpeGVsRm9ybWF0ID09IFBJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDJfQVNfODg4OCkgeworICAgICAgICAgICAgICAgIHJldHJpZXZlclBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBpeGVsRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgcmV0cmlldmVyUGl4ZWxGb3JtYXQgPSBwaXhlbEZvcm1hdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9CiAgICAgICAgICAgICAgICAgICAgIHJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUoLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qbWV0YU9ubHkqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVyUGl4ZWxGb3JtYXQsIGZhbHNlIC8qbWV0YU9ubHkqLyk7CiAKICAgICAgICAgICAgIGlmIChtZW0gIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGZhaWxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHByaW50ZigiZ2V0RnJhbWVBdFRpbWUoJXMpID0+IE9LXG4iLCBmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJnZXRGcmFtZUF0VGltZSglcykgZm9ybWF0PSVkID0+IE9LXG4iLCBmaWxlbmFtZSwgcmV0cmlldmVyUGl4ZWxGb3JtYXQpOwogCiAgICAgICAgICAgICAgICAgVmlkZW9GcmFtZSAqZnJhbWUgPSAoVmlkZW9GcmFtZSAqKW1lbS0+dW5zZWN1cmVQb2ludGVyKCk7CiAKLSAgICAgICAgICAgICAgICBDSEVDS19FUSh3cml0ZUpwZWdGaWxlKCIvc2RjYXJkL291dC5qcGciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5nZXRGbGF0dGVuZWREYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm1XaWR0aCwgZnJhbWUtPm1IZWlnaHQpLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAocGl4ZWxGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJwcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGl4ZWxGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU6CisgICAgICAgICAgICAgICAgICAgICAgICBicHAgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMl9BU184ODg4OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCBSR0JBXzEwMTAxMDIgdG8gUkdCQV84ODg4CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRhdGEgPSAodWludDMyX3QgKilmcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICplbmQgPSBkYXRhICsgZnJhbWUtPm1XaWR0aCAqIGZyYW1lLT5tSGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBkYXRhIDwgZW5kOyArK2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGljayBvdXQgOC1iaXQgUiwgRywgQiB2YWx1ZXMgYW5kIG1vdmUgdGhlbSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3QgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCpkYXRhICYgICAgICAweDNmYykgPj4gMikgfCAvLyBSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgqZGF0YSAmICAgIDB4ZmYwMDApID4+IDQpIHwgLy8gRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoKmRhdGEgJiAweDNmYzAwMDAwKSA+PiA2KSB8IC8vIEIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY2sgb3V0IDItYml0IEEgYW5kIGV4cGFuZCB0byA4LWJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCpkYXRhICYgMHhjMDAwMDAwMCkgPj4gNikgKiAweDU1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6CisgICAgICAgICAgICAgICAgICAgICAgICBicHAgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJwcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRklMRSAqb3V0ID0gZm9wZW4oIi9zZGNhcmQvb3V0LnJhdyIsICJ3YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZndyaXRlKGZyYW1lLT5nZXRGbGF0dGVuZWREYXRhKCksIGJwcCAqIGZyYW1lLT5tV2lkdGgsIGZyYW1lLT5tSGVpZ2h0LCBvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKG91dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigid3JpdGUgb3V0ICVkIHggJWQgeCAlZGJwcFxuIiwgZnJhbWUtPm1XaWR0aCwgZnJhbWUtPm1IZWlnaHQsIGJwcCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoInVua25vd24gcGl4ZWwgZm9ybWF0LlxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSh3cml0ZUpwZWdGaWxlKCIvc2RjYXJkL291dC5qcGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLCBmcmFtZS0+bUhlaWdodCksIDApOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCFwaXhlbEZvcm1hdCkgewogICAgICAgICAgICAgICAgIG1lbSA9IHJldHJpZXZlci0+ZXh0cmFjdEFsYnVtQXJ0KCk7CiAKICAgICAgICAgICAgICAgICBpZiAobWVtICE9IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RybS9PV05FUlMgYi9kcm0vT1dORVJTCmluZGV4IGU3ODg3NTQuLjA5MGMwMjEgMTAwNjQ0Ci0tLSBhL2RybS9PV05FUlMKKysrIGIvZHJtL09XTkVSUwpAQCAtMSArMSwzIEBACiBqdGlua2VyQGdvb2dsZS5jb20KK2tlbHpoYW5AZ29vZ2xlLmNvbQorcm9iZXJ0c2hpaEBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcAppbmRleCA3NGUzMjIzLi5mNzk4OWJkIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKQEAgLTIwOCw3ICsyMDgsMTEgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6bG9hZFBsdWdJbnMoKSB7CisjaWYgX19MUDY0X18KKyAgICBTdHJpbmc4IHBsdWdpbkRpclBhdGgoIi9zeXN0ZW0vbGliNjQvZHJtIik7CisjZWxzZQogICAgIFN0cmluZzggcGx1Z2luRGlyUGF0aCgiL3N5c3RlbS9saWIvZHJtIik7CisjZW5kaWYKICAgICBsb2FkUGx1Z0lucyhwbHVnaW5EaXJQYXRoKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9kcm1zZXJ2ZXIucmMgYi9kcm0vZHJtc2VydmVyL2RybXNlcnZlci5yYwppbmRleCBlYjE3NmMxLi4wMzE5ZmY5IDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL2RybXNlcnZlci5yYworKysgYi9kcm0vZHJtc2VydmVyL2RybXNlcnZlci5yYwpAQCAtMyw3ICszLDcgQEAKICAgICBjbGFzcyBtYWluCiAgICAgdXNlciBkcm0KICAgICBncm91cCBkcm0gc3lzdGVtIGluZXQgZHJtcnBjIHJlYWRwcm9jCi0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaAogCiBvbiBwcm9wZXJ0eTpkcm0uc2VydmljZS5lbmFibGVkPXRydWUKICAgICBzdGFydCBkcm0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwIGIvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKaW5kZXggMGZmZTYyNi4uNDA4ZDIxNiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKQEAgLTI4LDggKzI4LDEzIEBACiAgICAgICAgICJEcm1TZXNzaW9uTWFuYWdlci5jcHAiLAogICAgICAgICAiU2hhcmVkTGlicmFyeS5jcHAiLAogICAgICAgICAiRHJtSGFsLmNwcCIsCisgICAgICAgICJEcm1IYWxIaWRsLmNwcCIsCisgICAgICAgICJEcm1IYWxBaWRsLmNwcCIsCiAgICAgICAgICJDcnlwdG9IYWwuY3BwIiwKKyAgICAgICAgIkNyeXB0b0hhbEhpZGwuY3BwIiwKKyAgICAgICAgIkNyeXB0b0hhbEFpZGwuY3BwIiwKICAgICAgICAgIkRybVV0aWxzLmNwcCIsCisgICAgICAgICJEcm1IYWxMaXN0ZW5lci5jcHAiLAogICAgIF0sCiAKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKQEAgLTYzLDEwICs2OCwxMiBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40IiwKICAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybS1WMS1uZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrIiwKKyAgICAgICAgImxpYmFpZGxjb21tb25zdXBwb3J0IiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpAQCAtMTYyLDEwICsxNjksNiBAQAogICAgICAgICAiRHJtTWV0cmljc0NvbnN1bWVyLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlIgotICAgIF0sCi0KICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCkBAIC0xODEsNSArMTg0LDYgQEAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcCBiL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwCmluZGV4IGUwZGIxYzQuLmY5NWQ1MjcgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwCkBAIC0xNiwzODkgKzE2LDEwMCBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkNyeXB0b0hhbCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMi9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxoaWRsL1NlcnZpY2VNYW5hZ2VtZW50Lmg+Ci0jaW5jbHVkZSA8aGlkbG1lbW9yeS9GcmFtZXdvcmtVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYWRybS9DcnlwdG9IYWwuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9DcnlwdG9IYWxIaWRsLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsQWlkbC5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0RybVV0aWxzLmg+CiAKLXVzaW5nIGRybTo6VjFfMDo6QnVmZmVyVHlwZTsKLXVzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Ci11c2luZyBkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwotdXNpbmcgZHJtOjpWMV8wOjpNb2RlOwotdXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwotdXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Ci11c2luZyBkcm06OlYxXzA6OlN0YXR1czsKLXVzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOwotCi11c2luZyA6OmFuZHJvaWQ6OkRybVV0aWxzOjp0b1N0YXR1c1Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpIaWRsTWVtb3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIDo6YW5kcm9pZDo6c3A7Ci0KLXR5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIGhpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbFZlYyhjb25zdCBWZWN0b3I8dWludDhfdD4gJnZlY3RvcikgewotICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHZlYzsKLSAgICB2ZWMuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4odmVjdG9yLmFycmF5KCkpLCB2ZWN0b3Iuc2l6ZSgpKTsKLSAgICByZXR1cm4gdmVjOworQ3J5cHRvSGFsOjpDcnlwdG9IYWwoKSB7CisgICAgbUNyeXB0b0hhbEFpZGwgPSBzcDxDcnlwdG9IYWxBaWRsPjo6bWFrZSgpOworICAgIG1DcnlwdG9IYWxIaWRsID0gc3A8Q3J5cHRvSGFsSGlkbD46Om1ha2UoKTsKIH0KIAotc3RhdGljIGhpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbFZlYyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBzaXplKSB7Ci0gICAgaGlkbF92ZWM8dWludDhfdD4gdmVjOwotICAgIHZlYy5yZXNpemUoc2l6ZSk7Ci0gICAgbWVtY3B5KHZlYy5kYXRhKCksIHB0ciwgc2l6ZSk7Ci0gICAgcmV0dXJuIHZlYzsKLX0KLQotc3RhdGljIGhpZGxfYXJyYXk8dWludDhfdCwgMTY+IHRvSGlkbEFycmF5MTYoY29uc3QgdWludDhfdCAqcHRyKSB7Ci0gICAgaWYgKCFwdHIpIHsKLSAgICAgICAgcmV0dXJuIGhpZGxfYXJyYXk8dWludDhfdCwgMTY+KCk7Ci0gICAgfQotICAgIHJldHVybiBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PihwdHIpOwotfQotCi0KLXN0YXRpYyBTdHJpbmc4IHRvU3RyaW5nOChoaWRsX3N0cmluZyBoU3RyaW5nKSB7Ci0gICAgcmV0dXJuIFN0cmluZzgoaFN0cmluZy5jX3N0cigpKTsKLX0KLQotCi1DcnlwdG9IYWw6OkNyeXB0b0hhbCgpCi0gICAgOiBtRmFjdG9yaWVzKG1ha2VDcnlwdG9GYWN0b3JpZXMoKSksCi0gICAgICBtSW5pdENoZWNrKChtRmFjdG9yaWVzLnNpemUoKSA9PSAwKSA/IEVSUk9SX1VOU1VQUE9SVEVEIDogTk9fSU5JVCksCi0gICAgICBtSGVhcFNlcU51bSgwKSB7Ci19Ci0KLUNyeXB0b0hhbDo6fkNyeXB0b0hhbCgpIHsKLX0KLQotVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gQ3J5cHRvSGFsOjptYWtlQ3J5cHRvRmFjdG9yaWVzKCkgewotICAgIFZlY3RvcjxzcDxJQ3J5cHRvRmFjdG9yeT4+IGZhY3RvcmllczsKLQotICAgIGF1dG8gbWFuYWdlciA9IGhhcmR3YXJlOjpkZWZhdWx0U2VydmljZU1hbmFnZXIxXzIoKTsKLSAgICBpZiAobWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1hbmFnZXItPmxpc3RNYW5pZmVzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk6OmRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgWyZmYWN0b3JpZXNdKGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAmcmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8wOjpJQ3J5cHRvRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGRybUAxLjAgSUNyeXB0b0ZhY3RvcnkgJXMiLCBpbnN0YW5jZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgbWFuYWdlci0+bGlzdE1hbmlmZXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8xOjpJQ3J5cHRvRmFjdG9yeTo6ZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICBbJmZhY3Rvcmllc10oY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICZyZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaW5zdGFuY2UgOiByZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgZHJtQDEuMSBJQ3J5cHRvRmFjdG9yeSAlcyIsIGluc3RhbmNlLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgIH0KLQotICAgIGlmIChmYWN0b3JpZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgLy8gbXVzdCBiZSBpbiBwYXNzdGhyb3VnaCBtb2RlLCBsb2FkIHRoZSBkZWZhdWx0IHBhc3N0aHJvdWdoIHNlcnZpY2UKLSAgICAgICAgYXV0byBwYXNzdGhyb3VnaCA9IElDcnlwdG9GYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChwYXNzdGhyb3VnaCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HSSgibWFrZUNyeXB0b0ZhY3RvcmllczogdXNpbmcgZGVmYXVsdCBwYXNzdGhyb3VnaCBjcnlwdG8gaW5zdGFuY2UiKTsKLSAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2socGFzc3Rocm91Z2gpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmaW5kIGFueSBjcnlwdG8gZmFjdG9yaWVzIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhY3RvcmllczsKLX0KLQotc3A8SUNyeXB0b1BsdWdpbj4gQ3J5cHRvSGFsOjptYWtlQ3J5cHRvUGx1Z2luKGNvbnN0IHNwPElDcnlwdG9GYWN0b3J5PiYgZmFjdG9yeSwKLSAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3Qgdm9pZCAqaW5pdERhdGEsIHNpemVfdCBpbml0RGF0YVNpemUpIHsKLQotICAgIHNwPElDcnlwdG9QbHVnaW4+IHBsdWdpbjsKLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IGZhY3RvcnktPmNyZWF0ZVBsdWdpbih0b0hpZGxBcnJheTE2KHV1aWQpLAotICAgICAgICAgICAgdG9IaWRsVmVjKGluaXREYXRhLCBpbml0RGF0YVNpemUpLAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IHNwPElDcnlwdG9QbHVnaW4+JiBoUGx1Z2luKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFrZSBjcnlwdG8gcGx1Z2luIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGx1Z2luID0gaFBsdWdpbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgcmV0dXJuIHBsdWdpbjsKLX0KLQorQ3J5cHRvSGFsOjp+Q3J5cHRvSGFsKCkge30KIAogc3RhdHVzX3QgQ3J5cHRvSGFsOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSyB8fCBtQ3J5cHRvSGFsSGlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBPSzsKKyAgICBpZiAobUNyeXB0b0hhbEFpZGwtPmluaXRDaGVjaygpID09IE5PX0lOSVQgfHwgbUNyeXB0b0hhbEhpZGwtPmluaXRDaGVjaygpID09IE5PX0lOSVQpCisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtQ3J5cHRvSGFsSGlkbC0+aW5pdENoZWNrKCk7CiB9CiAKLQogYm9vbCBDcnlwdG9IYWw6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBtQ3J5cHRvSGFsQWlkbC0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkgfHwKKyAgICAgICAgICAgbUNyeXB0b0hhbEhpZGwtPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpOwogfQogCi1zdGF0dXNfdCBDcnlwdG9IYWw6OmNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICpkYXRhLAotICAgICAgICBzaXplX3Qgc2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7Ci0gICAgICAgICAgICBtUGx1Z2luID0gbWFrZUNyeXB0b1BsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBkYXRhLCBzaXplKTsKLSAgICAgICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IGRybTo6VjFfMjo6SUNyeXB0b1BsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUluaXRDaGVjayA9PSBOT19JTklUKSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBtUGx1Z2luID09IE5VTEwgPyBFUlJPUl9VTlNVUFBPUlRFRCA6IE9LOwotICAgIH0KLQotICAgIHJldHVybiBtSW5pdENoZWNrOworc3RhdHVzX3QgQ3J5cHRvSGFsOjpjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUNyeXB0b0hhbEFpZGwtPmNyZWF0ZVBsdWdpbih1dWlkLCBkYXRhLCBzaXplKSAhPSBPSykKKyAgICAgICAgcmV0dXJuIG1DcnlwdG9IYWxIaWRsLT5jcmVhdGVQbHVnaW4odXVpZCwgZGF0YSwgc2l6ZSk7CisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDcnlwdG9IYWw6OmRlc3Ryb3lQbHVnaW4oKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIG1QbHVnaW4uY2xlYXIoKTsKLSAgICBtUGx1Z2luVjFfMi5jbGVhcigpOwotICAgIHJldHVybiBPSzsKKyAgICAvLyBUaGlzIHJlcXVpcmVzIHBsdWdpbiB0byBiZSBjcmVhdGVkLgorICAgIGlmIChtQ3J5cHRvSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtQ3J5cHRvSGFsQWlkbC0+ZGVzdHJveVBsdWdpbigpOworICAgIHJldHVybiBtQ3J5cHRvSGFsSGlkbC0+ZGVzdHJveVBsdWdpbigpOwogfQogCi1ib29sIENyeXB0b0hhbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFJldHVybjxib29sPiBoUmVzdWx0ID0gbVBsdWdpbi0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGhpZGxfc3RyaW5nKG1pbWUpKTsKLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGhSZXN1bHQ7Ci19Ci0KLQotLyoqCi0gKiBJZiB0aGUgaGVhcCBiYXNlIGlzbid0IHNldCwgZ2V0IHRoZSBoZWFwIGJhc2UgZnJvbSB0aGUgSGlkbE1lbW9yeQotICogYW5kIHNlbmQgaXQgdG8gdGhlIEhBTCBzbyBpdCBjYW4gbWFwIGEgcmVtb3RlIGhlYXAgb2YgdGhlIHNhbWUKLSAqIHNpemUuICBPbmNlIHRoZSBoZWFwIGJhc2UgaXMgZXN0YWJsaXNoZWQsIHNoYXJlZCBtZW1vcnkgYnVmZmVycwotICogYXJlIHNlbnQgYnkgcHJvdmlkaW5nIGFuIG9mZnNldCBpbnRvIHRoZSBoZWFwIGFuZCBhIGJ1ZmZlciBzaXplLgotICovCi1pbnQzMl90IENyeXB0b0hhbDo6c2V0SGVhcEJhc2UoY29uc3Qgc3A8SGlkbE1lbW9yeT4mIGhlYXApIHsKLSAgICBpZiAoaGVhcCA9PSBOVUxMIHx8IG1IZWFwU2VxTnVtIDwgMCkgewotICAgICAgICBBTE9HRSgic2V0SGVhcEJhc2UoKTogaGVhcCAlcCBtSGVhcFNlcU51bSAlZCIsIGhlYXAuZ2V0KCksIG1IZWFwU2VxTnVtKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpbnQzMl90IHNlcU51bSA9IG1IZWFwU2VxTnVtKys7Ci0gICAgdWludDMyX3QgYnVmZmVySWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VxTnVtKTsKLSAgICBtSGVhcFNpemVzLmFkZChzZXFOdW0sIGhlYXAtPnNpemUoKSk7Ci0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zZXRTaGFyZWRCdWZmZXJCYXNlKCpoZWFwLCBidWZmZXJJZCk7Ci0gICAgQUxPR0VfSUYoIWhSZXN1bHQuaXNPaygpLCAic2V0U2hhcmVkQnVmZmVyQmFzZSgpOiByZW1vdGUgY2FsbCBmYWlsZWQiKTsKLSAgICByZXR1cm4gc2VxTnVtOwotfQotCi12b2lkIENyeXB0b0hhbDo6Y2xlYXJIZWFwQmFzZShpbnQzMl90IHNlcU51bSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAvKgotICAgICAqIENsZWFyIHRoZSByZW1vdGUgc2hhcmVkIG1lbW9yeSBtYXBwaW5nIGJ5IHNldHRpbmcgdGhlIHNoYXJlZAotICAgICAqIGJ1ZmZlciBiYXNlIHRvIGEgbnVsbCBoaWRsX21lbW9yeS4KLSAgICAgKgotICAgICAqIFRPRE86IEFkZCBhIHJlbGVhc2VTaGFyZWRCdWZmZXIgbWV0aG9kIGluIGEgZnV0dXJlIERSTSBIQUwKLSAgICAgKiBBUEkgdmVyc2lvbiB0byBtYWtlIHRoaXMgZXhwbGljaXQuCi0gICAgICovCi0gICAgc3NpemVfdCBpbmRleCA9IG1IZWFwU2l6ZXMuaW5kZXhPZktleShzZXFOdW0pOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcklkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlcU51bSk7Ci0gICAgICAgICAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnNldFNoYXJlZEJ1ZmZlckJhc2UoaGlkbF9tZW1vcnkoKSwgYnVmZmVySWQpOwotICAgICAgICAgICAgQUxPR0VfSUYoIWhSZXN1bHQuaXNPaygpLCAic2V0U2hhcmVkQnVmZmVyQmFzZSgpOiByZW1vdGUgY2FsbCBmYWlsZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtSGVhcFNpemVzLnJlbW92ZUl0ZW0oc2VxTnVtKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENyeXB0b0hhbDo6Y2hlY2tTaGFyZWRCdWZmZXIoY29uc3QgOjpTaGFyZWRCdWZmZXIgJmJ1ZmZlcikgewotICAgIGludDMyX3Qgc2VxTnVtID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oYnVmZmVyLmJ1ZmZlcklkKTsKLSAgICAvLyBtZW1vcnkgbXVzdCBiZSBpbiBvbmUgb2YgdGhlIGhlYXBzIHRoYXQgaGF2ZSBiZWVuIHNldAotICAgIGlmIChtSGVhcFNpemVzLmluZGV4T2ZLZXkoc2VxTnVtKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgLy8gbWVtb3J5IG11c3QgYmUgd2l0aGluIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBoZWFwCi0gICAgc2l6ZV90IGhlYXBTaXplID0gbUhlYXBTaXplcy52YWx1ZUZvcihzZXFOdW0pOwotICAgIGlmIChoZWFwU2l6ZSA8IGJ1ZmZlci5vZmZzZXQgKyBidWZmZXIuc2l6ZSB8fAotICAgICAgICAgICAgU0laRV9NQVggLSBidWZmZXIub2Zmc2V0IDwgYnVmZmVyLnNpemUpIHsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3NjIyMTEyMyIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNzaXplX3QgQ3J5cHRvSGFsOjpkZWNyeXB0KGNvbnN0IHVpbnQ4X3Qga2V5SWRbMTZdLCBjb25zdCB1aW50OF90IGl2WzE2XSwKLSAgICAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsIGNvbnN0IENyeXB0b1BsdWdpbjo6UGF0dGVybiAmcGF0dGVybiwKLSAgICAgICAgY29uc3QgOjpTaGFyZWRCdWZmZXIgJmhTb3VyY2UsIHNpemVfdCBvZmZzZXQsCi0gICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKLSAgICAgICAgY29uc3QgOjpEZXN0aW5hdGlvbkJ1ZmZlciAmaERlc3RpbmF0aW9uLCBBU3RyaW5nICplcnJvckRldGFpbE1zZykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBNb2RlIGhNb2RlOwotICAgIHN3aXRjaChtb2RlKSB7Ci0gICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX1VuZW5jcnlwdGVkOgotICAgICAgICBoTW9kZSA9IE1vZGU6OlVORU5DUllQVEVEIDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI6Ci0gICAgICAgIGhNb2RlID0gTW9kZTo6QUVTX0NUUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19XVjoKLSAgICAgICAgaE1vZGUgPSBNb2RlOjpBRVNfQ0JDX0NUUzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DQkM6Ci0gICAgICAgIGhNb2RlID0gTW9kZTo6QUVTX0NCQzsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgUGF0dGVybiBoUGF0dGVybjsKLSAgICBoUGF0dGVybi5lbmNyeXB0QmxvY2tzID0gcGF0dGVybi5tRW5jcnlwdEJsb2NrczsKLSAgICBoUGF0dGVybi5za2lwQmxvY2tzID0gcGF0dGVybi5tU2tpcEJsb2NrczsKLQotICAgIHN0ZDo6dmVjdG9yPFN1YlNhbXBsZT4gc3RkU3ViU2FtcGxlczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN1YlNhbXBsZXM7IGkrKykgewotICAgICAgICBTdWJTYW1wbGUgc3ViU2FtcGxlOwotICAgICAgICBzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGE7Ci0gICAgICAgIHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhOwotICAgICAgICBzdGRTdWJTYW1wbGVzLnB1c2hfYmFjayhzdWJTYW1wbGUpOwotICAgIH0KLSAgICBhdXRvIGhTdWJTYW1wbGVzID0gaGlkbF92ZWM8U3ViU2FtcGxlPihzdGRTdWJTYW1wbGVzKTsKLQotICAgIGJvb2wgc2VjdXJlOwotICAgIGlmIChoRGVzdGluYXRpb24udHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNoZWNrU2hhcmVkQnVmZmVyKGhEZXN0aW5hdGlvbi5ub25zZWN1cmVNZW1vcnkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHNlY3VyZSA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoaERlc3RpbmF0aW9uLnR5cGUgPT0gQnVmZmVyVHlwZTo6TkFUSVZFX0hBTkRMRSkgewotICAgICAgICBzZWN1cmUgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzA1MjY3MDIiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gY2hlY2tTaGFyZWRCdWZmZXIoaFNvdXJjZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0gICAgdWludDMyX3QgYnl0ZXNXcml0dGVuID0gMDsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwotCi0gICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKLSAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5kZWNyeXB0XzFfMihzZWN1cmUsIHRvSGlkbEFycmF5MTYoa2V5SWQpLCB0b0hpZGxBcnJheTE2KGl2KSwKLSAgICAgICAgICAgICAgICBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLCBoU291cmNlLCBvZmZzZXQsIGhEZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCB1aW50MzJfdCBoQnl0ZXNXcml0dGVuLCBoaWRsX3N0cmluZyBoRGV0YWlsZWRFcnJvcikgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gaEJ5dGVzV3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICplcnJvckRldGFpbE1zZyA9IHRvU3RyaW5nOChoRGV0YWlsZWRFcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICB9IGVsc2UgewotICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+ZGVjcnlwdChzZWN1cmUsIHRvSGlkbEFycmF5MTYoa2V5SWQpLCB0b0hpZGxBcnJheTE2KGl2KSwKLSAgICAgICAgICAgICAgICBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLCBoU291cmNlLCBvZmZzZXQsIGhEZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgdWludDMyX3QgaEJ5dGVzV3JpdHRlbiwgaGlkbF9zdHJpbmcgaERldGFpbGVkRXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBoQnl0ZXNXcml0dGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yRGV0YWlsTXNnID0gdG9TdHJpbmc4KGhEZXRhaWxlZEVycm9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgIH0KLQotICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICByZXR1cm4gYnl0ZXNXcml0dGVuOwotICAgIH0KLSAgICByZXR1cm4gZXJyOworYm9vbCBDcnlwdG9IYWw6OnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyKiBtaW1lKSBjb25zdCB7CisgICAgLy8gVGhpcyByZXF1aXJlcyBwbHVnaW4gdG8gYmUgY3JlYXRlZC4KKyAgICBpZiAobUNyeXB0b0hhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKQorICAgICAgICByZXR1cm4gbUNyeXB0b0hhbEFpZGwtPnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChtaW1lKTsKKyAgICByZXR1cm4gbUNyeXB0b0hhbEhpZGwtPnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChtaW1lKTsKIH0KIAogdm9pZCBDcnlwdG9IYWw6Om5vdGlmeVJlc29sdXRpb24odWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgIC8vIFRoaXMgcmVxdWlyZXMgcGx1Z2luIHRvIGJlIGNyZWF0ZWQuCisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgeworICAgICAgICBtQ3J5cHRvSGFsQWlkbC0+bm90aWZ5UmVzb2x1dGlvbih3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGF1dG8gaFJlc3VsdCA9IG1QbHVnaW4tPm5vdGlmeVJlc29sdXRpb24od2lkdGgsIGhlaWdodCk7Ci0gICAgQUxPR0VfSUYoIWhSZXN1bHQuaXNPaygpLCAibm90aWZ5UmVzb2x1dGlvbiB0eG4gZmFpbGVkICVzIiwgaFJlc3VsdC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIG1DcnlwdG9IYWxIaWRsLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOwogfQogCi1zdGF0dXNfdCBDcnlwdG9IYWw6OnNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CitzdGF0dXNfdCBDcnlwdG9IYWw6OnNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIC8vIFRoaXMgcmVxdWlyZXMgcGx1Z2luIHRvIGJlIGNyZWF0ZWQuCisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1DcnlwdG9IYWxBaWRsLT5zZXRNZWRpYURybVNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICByZXR1cm4gbUNyeXB0b0hhbEhpZGwtPnNldE1lZGlhRHJtU2Vzc2lvbihzZXNzaW9uSWQpOworfQogCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Citzc2l6ZV90IENyeXB0b0hhbDo6ZGVjcnlwdChjb25zdCB1aW50OF90IGtleVsxNl0sIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLCBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6UGF0dGVybiYgcGF0dGVybiwgY29uc3QgOjpTaGFyZWRCdWZmZXImIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlKiBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsIGNvbnN0IDo6RGVzdGluYXRpb25CdWZmZXImIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyogZXJyb3JEZXRhaWxNc2cpIHsKKyAgICAvLyBUaGlzIHJlcXVpcmVzIHBsdWdpbiB0byBiZSBjcmVhdGVkLgorICAgIGlmIChtQ3J5cHRvSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spCisgICAgICAgIHJldHVybiBtQ3J5cHRvSGFsQWlkbC0+ZGVjcnlwdChrZXksIGl2LCBtb2RlLCBwYXR0ZXJuLCBzb3VyY2UsIG9mZnNldCwgc3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsIGRlc3RpbmF0aW9uLCBlcnJvckRldGFpbE1zZyk7CisgICAgcmV0dXJuIG1DcnlwdG9IYWxIaWRsLT5kZWNyeXB0KGtleSwgaXYsIG1vZGUsIHBhdHRlcm4sIHNvdXJjZSwgb2Zmc2V0LCBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TdWJTYW1wbGVzLCBkZXN0aW5hdGlvbiwgZXJyb3JEZXRhaWxNc2cpOworfQorCitpbnQzMl90IENyeXB0b0hhbDo6c2V0SGVhcChjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCkgeworICAgIC8vIFRoaXMgcmVxdWlyZXMgcGx1Z2luIHRvIGJlIGNyZWF0ZWQuCisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1DcnlwdG9IYWxBaWRsLT5zZXRIZWFwKGhlYXApOworICAgIHJldHVybiBtQ3J5cHRvSGFsSGlkbC0+c2V0SGVhcChoZWFwKTsKK30KKwordm9pZCBDcnlwdG9IYWw6OnVuc2V0SGVhcChpbnQzMl90IHNlcU51bSkgeworICAgIC8vIFRoaXMgcmVxdWlyZXMgcGx1Z2luIHRvIGJlIGNyZWF0ZWQuCisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgeworICAgICAgICBtQ3J5cHRvSGFsQWlkbC0+dW5zZXRIZWFwKHNlcU51bSk7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBhdXRvIGVyciA9IG1QbHVnaW4tPnNldE1lZGlhRHJtU2Vzc2lvbih0b0hpZGxWZWMoc2Vzc2lvbklkKSk7Ci0gICAgcmV0dXJuIGVyci5pc09rKCkgPyB0b1N0YXR1c1QoZXJyKSA6IERFQURfT0JKRUNUOworICAgIG1DcnlwdG9IYWxIaWRsLT51bnNldEhlYXAoc2VxTnVtKTsKIH0KIAotc3RhdHVzX3QgQ3J5cHRvSGFsOjpnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiAmbG9ncykgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIERybVV0aWxzOjpHZXRMb2dNZXNzYWdlczxkcm06OlYxXzQ6OklDcnlwdG9QbHVnaW4+KG1QbHVnaW4sIGxvZ3MpOworc3RhdHVzX3QgQ3J5cHRvSGFsOjpnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgY29uc3QgeworICAgIC8vIFRoaXMgcmVxdWlyZXMgcGx1Z2luIHRvIGJlIGNyZWF0ZWQuCisgICAgaWYgKG1DcnlwdG9IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1DcnlwdG9IYWxBaWRsLT5nZXRMb2dNZXNzYWdlcyhsb2dzKTsKKyAgICByZXR1cm4gbUNyeXB0b0hhbEhpZGwtPmdldExvZ01lc3NhZ2VzKGxvZ3MpOwogfQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsQWlkbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsQWlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5ZDFkZQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWxBaWRsLmNwcApAQCAtMCwwICsxLDQyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ3J5cHRvSGFsQWlkbCIKKworI2luY2x1ZGUgPGFpZGxjb21tb25zdXBwb3J0L05hdGl2ZUhhbmRsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2F1dG9fdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0NyeXB0b0hhbEFpZGwuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1VdGlscy5oPgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OkNyeXB0b1NjaGVtZXM7Cit1c2luZyBEZXN0aW5hdGlvbkJ1ZmZlckFpZGwgPSA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OkRlc3RpbmF0aW9uQnVmZmVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpNb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpQYXR0ZXJuOwordXNpbmcgU2hhcmVkQnVmZmVyQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2hhcmVkQnVmZmVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN1YlNhbXBsZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIE5hdGl2ZUhhbmRsZUFpZGxDb21tb24gPSA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RGVjcnlwdEFyZ3M7CisKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OkRybVV0aWxzOjpzdGF0dXNBaWRsVG9TdGF0dXNUOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SGlkbE1lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZDsKKy8vIC0tLS0tLS1IaWRsIGludGVyZmFjZSByZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRPRE86IHJlcGxhY2UgYmVmb3JlIHJlbW92aW5nIGhpZGwgaW50ZXJmYWNlCisKK3VzaW5nIEJ1ZmZlclR5cGVIaWRsID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpCdWZmZXJUeXBlOwordXNpbmcgU2hhcmVkQnVmZmVySGlkbCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwordXNpbmcgRGVzdGluYXRpb25CdWZmZXJIaWRsID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKKworLy8gLS0tLS0tLUhpZGwgaW50ZXJmYWNlIHJlbGF0ZWQgZW5kLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCeXRlID0gdWludDhfdD4KK3N0YXRpYyBzdGQ6OnZlY3RvcjxCeXRlPiB0b1N0ZFZlYyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHZlY3RvcikgeworICAgIGF1dG8gdiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQnl0ZSo+KHZlY3Rvci5hcnJheSgpKTsKKyAgICBzdGQ6OnZlY3RvcjxCeXRlPiB2ZWModiwgdiArIHZlY3Rvci5zaXplKCkpOworICAgIHJldHVybiB2ZWM7Cit9CisKKy8vIC0tLS0tLS1IaWRsIGludGVyZmFjZSByZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRPRE86IHJlcGxhY2UgYmVmb3JlIHJlbW92aW5nIGhpZGwgaW50ZXJmYWNlCitzdGF0dXNfdCBDcnlwdG9IYWxBaWRsOjpjaGVja1NoYXJlZEJ1ZmZlcihjb25zdCBTaGFyZWRCdWZmZXJIaWRsJiBidWZmZXIpIHsKKyAgICBpbnQzMl90IHNlcU51bSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGJ1ZmZlci5idWZmZXJJZCk7CisgICAgLy8gbWVtb3J5IG11c3QgYmUgaW4gb25lIG9mIHRoZSBoZWFwcyB0aGF0IGhhdmUgYmVlbiBzZXQKKyAgICBpZiAobUhlYXBTaXplcy5pbmRleE9mS2V5KHNlcU51bSkgPCAwKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIG1lbW9yeSBtdXN0IGJlIHdpdGhpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgaGVhcAorICAgIHNpemVfdCBoZWFwU2l6ZSA9IG1IZWFwU2l6ZXMudmFsdWVGb3Ioc2VxTnVtKTsKKyAgICBpZiAoaGVhcFNpemUgPCBidWZmZXIub2Zmc2V0ICsgYnVmZmVyLnNpemUgfHwgU0laRV9NQVggLSBidWZmZXIub2Zmc2V0IDwgYnVmZmVyLnNpemUpIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3NjIyMTEyMyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBTaGFyZWRCdWZmZXJBaWRsIGhpZGxTaGFyZWRCdWZmZXJUb0FpZGxTaGFyZWRCdWZmZXIoY29uc3QgU2hhcmVkQnVmZmVySGlkbCYgYnVmZmVyKSB7CisgICAgU2hhcmVkQnVmZmVyQWlkbCBhaWRsc2I7CisgICAgYWlkbHNiLmJ1ZmZlcklkID0gYnVmZmVyLmJ1ZmZlcklkOworICAgIGFpZGxzYi5vZmZzZXQgPSBidWZmZXIub2Zmc2V0OworICAgIGFpZGxzYi5zaXplID0gYnVmZmVyLnNpemU7CisgICAgcmV0dXJuIGFpZGxzYjsKK30KKworc3RhdGljIERlc3RpbmF0aW9uQnVmZmVyQWlkbCBoaWRsRGVzdGluYXRpb25CdWZmZXJUb0FpZGxEZXN0aW5hdGlvbkJ1ZmZlcigKKyAgICAgICAgY29uc3QgRGVzdGluYXRpb25CdWZmZXJIaWRsJiBidWZmZXIpIHsKKyAgICBEZXN0aW5hdGlvbkJ1ZmZlckFpZGwgYWlkbGRiOworICAgIC8vIHNraXAgbmVnYXRpdmUgY29udmVydCBjaGVjayBhcyBjb3VudCBvZiBlbnVtIGVsZW1lbnRzIGFyZSAyCisgICAgc3dpdGNoKGJ1ZmZlci50eXBlKSB7CisgICAgICAgIGNhc2UgQnVmZmVyVHlwZUhpZGw6OlNIQVJFRF9NRU1PUlk6CisgICAgICAgICAgICBhaWRsZGIuc2V0PERlc3RpbmF0aW9uQnVmZmVyQWlkbDo6VGFnOjpub25zZWN1cmVNZW1vcnk+KAorICAgICAgICAgICAgICAgIGhpZGxTaGFyZWRCdWZmZXJUb0FpZGxTaGFyZWRCdWZmZXIoYnVmZmVyLm5vbnNlY3VyZU1lbW9yeSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdXRvIGhhbmRsZSA9IGJ1ZmZlci5zZWN1cmVNZW1vcnkuZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgYWlkbGRiLnNldDxEZXN0aW5hdGlvbkJ1ZmZlckFpZGw6OlRhZzo6c2VjdXJlTWVtb3J5PigKKyAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpkdXBUb0FpZGwoaGFuZGxlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIE5hdGl2ZUhhbmRsZUFpZGxDb21tb24gZW1wdHloYW5kbGU7CisgICAgICAgICAgICAgICAgYWlkbGRiLnNldDxEZXN0aW5hdGlvbkJ1ZmZlckFpZGw6OlRhZzo6c2VjdXJlTWVtb3J5PigKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGVtcHR5aGFuZGxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gYWlkbGRiOworfQorCitzdGF0aWMgaGlkbF92ZWM8dWludDhfdD4gdG9IaWRsVmVjKGNvbnN0IHZvaWQqIHB0ciwgc2l6ZV90IHNpemUpIHsKKyAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWM7CisgICAgdmVjLnJlc2l6ZShzaXplKTsKKyAgICBtZW1jcHkodmVjLmRhdGEoKSwgcHRyLCBzaXplKTsKKyAgICByZXR1cm4gdmVjOworfQorCitzdGF0aWMgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+IHRvVmVjdG9yKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB2ZWMpIHsKKyAgICBWZWN0b3I8dWludDhfdD4gdmVjdG9yOworICAgIHZlY3Rvci5hcHBlbmRBcnJheSh2ZWMuZGF0YSgpLCB2ZWMuc2l6ZSgpKTsKKyAgICByZXR1cm4gKmNvbnN0X2Nhc3Q8Y29uc3QgVmVjdG9yPHVpbnQ4X3Q+Kj4oJnZlY3Rvcik7Cit9CisKK3N0YXRpYyBTdHJpbmc4IHRvU3RyaW5nOChjb25zdCBzdGQ6OnN0cmluZyYgc3RyaW5nKSB7CisgICAgcmV0dXJuIFN0cmluZzgoc3RyaW5nLmNfc3RyKCkpOworfQorCitzdGF0aWMgc3RkOjp2ZWN0b3I8dWludDhfdD4gdG9TdGRWZWMoY29uc3QgdWludDhfdCogcHRyLCBzaXplX3QgbikgeworICAgIGlmICghcHRyKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnZlY3Rvcjx1aW50OF90PigpOworICAgIH0KKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8dWludDhfdD4ocHRyLCBwdHIgKyBuKTsKK30KKworLy8gLS0tLS0tLUhpZGwgaW50ZXJmYWNlIHJlbGF0ZWQgZW5kLS0tLS0tLS0tLS0tLS0KKworYm9vbCBDcnlwdG9IYWxBaWRsOjppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZEludGVybmFsKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGludCogZmFjdG9yeUlkeCkgeworICAgIFV1aWQgdXVpZEFpZGwgPSBEcm1VdGlsczo6dG9BaWRsVXVpZCh1dWlkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQ3J5cHRvU2NoZW1lcyBzY2hlbWVze307CisgICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5nZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKCZzY2hlbWVzKS5pc09rKCkpIHsKKyAgICAgICAgICAgIGlmIChzdGQ6OmNvdW50KHNjaGVtZXMudXVpZHMuYmVnaW4oKSwgc2NoZW1lcy51dWlkcy5lbmQoKSwgdXVpZEFpZGwpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnlJZHggIT0gTlVMTCkgKmZhY3RvcnlJZHggPSBpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitDcnlwdG9IYWxBaWRsOjpDcnlwdG9IYWxBaWRsKCkKKyAgICA6IG1GYWN0b3JpZXMoRHJtVXRpbHM6Om1ha2VEcm1GYWN0b3JpZXNBaWRsKCkpLAorICAgICAgbUluaXRDaGVjaygobUZhY3Rvcmllcy5zaXplKCkgPT0gMCkgPyBFUlJPUl9VTlNVUFBPUlRFRCA6IE5PX0lOSVQpLAorICAgICAgbUhlYXBTZXFOdW0oMCkge30KKworQ3J5cHRvSGFsQWlkbDo6fkNyeXB0b0hhbEFpZGwoKSB7fQorCitzdGF0dXNfdCBDcnlwdG9IYWxBaWRsOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK2Jvb2wgQ3J5cHRvSGFsQWlkbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICByZXR1cm4gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWRJbnRlcm5hbCh1dWlkLCBOVUxMKTsKK30KKworc3RhdHVzX3QgQ3J5cHRvSGFsQWlkbDo6Y3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIFV1aWQgdXVpZEFpZGwgPSBEcm1VdGlsczo6dG9BaWRsVXVpZCh1dWlkKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhQWlkbCA9IHRvU3RkVmVjKHRvVmVjdG9yKHRvSGlkbFZlYyhkYXRhLCBzaXplKSkpOworICAgIGludCBpID0gMDsKKyAgICBpZiAoaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWRJbnRlcm5hbCh1dWlkLCAmaSkpIHsKKyAgICAgICAgbVBsdWdpbiA9IG1ha2VDcnlwdG9QbHVnaW4obUZhY3Rvcmllc1tpXSwgdXVpZEFpZGwsIGRhdGFBaWRsKTsKKyAgICB9CisKKyAgICBpZiAobUluaXRDaGVjayA9PSBOT19JTklUKSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBtUGx1Z2luID09IE5VTEwgPyBFUlJPUl9VTlNVUFBPUlRFRCA6IE9LOworICAgIH0KKworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SUNyeXB0b1BsdWdpbkFpZGw+IENyeXB0b0hhbEFpZGw6Om1ha2VDcnlwdG9QbHVnaW4oCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRHJtRmFjdG9yeUFpZGw+JiBmYWN0b3J5LCBjb25zdCBVdWlkJiB1dWlkQWlkbCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW5pdERhdGEpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SUNyeXB0b1BsdWdpbkFpZGw+IHBsdWdpbkFpZGw7CisgICAgaWYgKGZhY3RvcnktPmNyZWF0ZUNyeXB0b1BsdWdpbih1dWlkQWlkbCwgaW5pdERhdGEsICZwbHVnaW5BaWRsKS5pc09rKCkpIHsKKyAgICAgICAgQUxPR0koIkNyZWF0ZSBJQ3J5cHRvUGx1Z2luQWlkbC4gVVVJRDpbJXNdIiwgdXVpZEFpZGwudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIElDcnlwdG9QbHVnaW5BaWRsLiBVVUlEOlslc10iLCB1dWlkQWlkbC50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiBwbHVnaW5BaWRsOworfQorCitzdGF0dXNfdCBDcnlwdG9IYWxBaWRsOjpkZXN0cm95UGx1Z2luKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBtUGx1Z2luLnJlc2V0KCk7CisgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIENyeXB0b0hhbEFpZGw6OnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyKiBtaW1lKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBtaW1lU3RyID0gc3RkOjpzdHJpbmcobWltZSk7CisgICAgYm9vbCByZXN1bHQ7CisgICAgaWYgKCFtUGx1Z2luLT5yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQobWltZVN0ciwgJnJlc3VsdCkuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50LiBtaW1lOlslc10iLCBtaW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgQ3J5cHRvSGFsQWlkbDo6bm90aWZ5UmVzb2x1dGlvbih1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDaGVjayBuZWdhdGl2ZSB3aWR0aCBhbmQgaGVpZ2h0IGFmdGVyIHR5cGUgY29udmVyc2lvbgorICAgIC8vIExvZyBlcnJvciBhbmQgcmV0dXJuIGlmIGFueSBpcyBuZWdhdGl2ZQorICAgIGlmICgoaW50MzJfdCl3aWR0aCA8IDAgfHwgKGludDMyX3QpaGVpZ2h0IDwgMCkgeworICAgICAgICBBTE9HRSgiTmVnYXRpdmUgd2lkdGg6ICVkIG9yIGhlaWdodCAlZCBpbiBub3RpZnlSZXNvbHV0aW9uIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgibm90aWZ5UmVzb2x1dGlvbiB0eG4gZmFpbGVkIHN0YXR1cyBjb2RlOiAlZCIsIHN0YXR1cy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENyeXB0b0hhbEFpZGw6OnNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBhdXRvIGVyciA9IG1QbHVnaW4tPnNldE1lZGlhRHJtU2Vzc2lvbih0b1N0ZFZlYyhzZXNzaW9uSWQpKTsKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChlcnIpOworfQorCitzc2l6ZV90IENyeXB0b0hhbEFpZGw6OmRlY3J5cHQoY29uc3QgdWludDhfdCBrZXlJZFsxNl0sIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4mIHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVySGlkbCYgaFNvdXJjZSwgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSogc3ViU2FtcGxlcywgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzdGluYXRpb25CdWZmZXJIaWRsJiBoRGVzdGluYXRpb24sIEFTdHJpbmcqIGVycm9yRGV0YWlsTXNnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIE1vZGUgYU1vZGU7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9VbmVuY3J5cHRlZDoKKyAgICAgICAgICAgIGFNb2RlID0gTW9kZTo6VU5FTkNSWVBURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI6CisgICAgICAgICAgICBhTW9kZSA9IE1vZGU6OkFFU19DVFI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19XVjoKKyAgICAgICAgICAgIGFNb2RlID0gTW9kZTo6QUVTX0NCQ19DVFM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DQkM6CisgICAgICAgICAgICBhTW9kZSA9IE1vZGU6OkFFU19DQkM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIFBhdHRlcm4gYVBhdHRlcm47CisgICAgYVBhdHRlcm4uZW5jcnlwdEJsb2NrcyA9IHBhdHRlcm4ubUVuY3J5cHRCbG9ja3M7CisgICAgYVBhdHRlcm4uc2tpcEJsb2NrcyA9IHBhdHRlcm4ubVNraXBCbG9ja3M7CisKKyAgICBzdGQ6OnZlY3RvcjxTdWJTYW1wbGU+IHN0ZFN1YlNhbXBsZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyBpKyspIHsKKyAgICAgICAgU3ViU2FtcGxlIHN1YlNhbXBsZTsKKyAgICAgICAgc3ViU2FtcGxlLm51bUJ5dGVzT2ZDbGVhckRhdGEgPSBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhOworICAgICAgICBzdWJTYW1wbGUubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPSBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKKyAgICAgICAgc3RkU3ViU2FtcGxlcy5wdXNoX2JhY2soc3ViU2FtcGxlKTsKKyAgICB9CisKKyAgICBib29sIHNlY3VyZTsKKyAgICBpZiAoaERlc3RpbmF0aW9uLnR5cGUgPT0gQnVmZmVyVHlwZUhpZGw6OlNIQVJFRF9NRU1PUlkpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2hlY2tTaGFyZWRCdWZmZXIoaERlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc2VjdXJlID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChoRGVzdGluYXRpb24udHlwZSA9PSBCdWZmZXJUeXBlSGlkbDo6TkFUSVZFX0hBTkRMRSkgeworICAgICAgICBzZWN1cmUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzA1MjY3MDIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2hlY2tTaGFyZWRCdWZmZXIoaFNvdXJjZSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisgICAgbUxvY2sudW5sb2NrKCk7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlJZEFpZGwodG9TdGRWZWMoa2V5SWQsIDE2KSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaXZBaWRsKHRvU3RkVmVjKGl2LCAxNikpOworCisgICAgRGVjcnlwdEFyZ3MgYXJnczsKKyAgICBhcmdzLnNlY3VyZSA9IHNlY3VyZTsKKyAgICBhcmdzLmtleUlkID0ga2V5SWRBaWRsOworICAgIGFyZ3MuaXYgPSBpdkFpZGw7CisgICAgYXJncy5tb2RlID0gYU1vZGU7CisgICAgYXJncy5wYXR0ZXJuID0gYVBhdHRlcm47CisgICAgYXJncy5zdWJTYW1wbGVzID0gc3RkOjptb3ZlKHN0ZFN1YlNhbXBsZXMpOworICAgIGFyZ3Muc291cmNlID0gaGlkbFNoYXJlZEJ1ZmZlclRvQWlkbFNoYXJlZEJ1ZmZlcihoU291cmNlKTsKKyAgICBhcmdzLm9mZnNldCA9IG9mZnNldDsKKyAgICBhcmdzLmRlc3RpbmF0aW9uID0gaGlkbERlc3RpbmF0aW9uQnVmZmVyVG9BaWRsRGVzdGluYXRpb25CdWZmZXIoaERlc3RpbmF0aW9uKTsKKworCisgICAgaW50MzJfdCByZXN1bHQgPSAwOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1c0FpZGwgPSBtUGx1Z2luLT5kZWNyeXB0KGFyZ3MsICZyZXN1bHQpOworCisgICAgZXJyID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXNBaWRsKTsKKyAgICBzdGQ6OnN0cmluZyBtc2dTdHIoc3RhdHVzQWlkbC5nZXRNZXNzYWdlKCkpOworICAgIGlmIChlcnJvckRldGFpbE1zZyAhPSBudWxscHRyKSB7CisgICAgICAgICplcnJvckRldGFpbE1zZyA9IHRvU3RyaW5nOChtc2dTdHIpOworICAgIH0KKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgb24gZGVjcnlwdCwgZXJyb3IgZGVzY3JpcHRpb246JXMiLCBzdGF0dXNBaWRsLmdldERlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50MzJfdCBDcnlwdG9IYWxBaWRsOjpzZXRIZWFwKGNvbnN0IHNwPEhpZGxNZW1vcnk+JiBoZWFwKSB7CisgICAgaWYgKGhlYXAgPT0gTlVMTCB8fCBtSGVhcFNlcU51bSA8IDApIHsKKyAgICAgICAgQUxPR0UoInNldEhlYXAoKTogaGVhcCAlcCBtSGVhcFNlcU51bSAlZCIsIGhlYXAuZ2V0KCksIG1IZWFwU2VxTnVtKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW50MzJfdCBzZXFOdW0gPSBtSGVhcFNlcU51bSsrOworICAgIHVpbnQzMl90IGJ1ZmZlcklkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlcU51bSk7CisgICAgbUhlYXBTaXplcy5hZGQoc2VxTnVtLCBoZWFwLT5zaXplKCkpOworCisgICAgU2hhcmVkQnVmZmVyQWlkbCBtZW1BaWRsOworICAgIG1lbUFpZGwuaGFuZGxlID0gOjphbmRyb2lkOjpkdXBUb0FpZGwoaGVhcC0+aGFuZGxlKCkpOworICAgIG1lbUFpZGwuc2l6ZSA9IGhlYXAtPnNpemUoKTsKKyAgICBtZW1BaWRsLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisKKyAgICBhdXRvIHN0YXR1cyA9IG1QbHVnaW4tPnNldFNoYXJlZEJ1ZmZlckJhc2UobWVtQWlkbCk7CisgICAgICAgQUxPR0VfSUYoIXN0YXR1cy5pc09rKCksCisgICAgICAgICAgICAgInNldFNoYXJlZEJ1ZmZlckJhc2UoKTogcmVtb3RlIGNhbGwgZmFpbGVkIik7CisgICAgcmV0dXJuIHNlcU51bTsKK30KKwordm9pZCBDcnlwdG9IYWxBaWRsOjp1bnNldEhlYXAoaW50MzJfdCBzZXFOdW0pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgLyoKKyAgICAgKiBDbGVhciB0aGUgcmVtb3RlIHNoYXJlZCBtZW1vcnkgbWFwcGluZyBieSBzZXR0aW5nIHRoZSBzaGFyZWQKKyAgICAgKiBidWZmZXIgYmFzZSB0byBhIG51bGwgaGlkbF9tZW1vcnkuCisgICAgICoKKyAgICAgKiBUT0RPOiBBZGQgYSByZWxlYXNlU2hhcmVkQnVmZmVyIG1ldGhvZCBpbiBhIGZ1dHVyZSBEUk0gSEFMCisgICAgICogQVBJIHZlcnNpb24gdG8gbWFrZSB0aGlzIGV4cGxpY2l0LgorICAgICAqLworICAgIHNzaXplX3QgaW5kZXggPSBtSGVhcFNpemVzLmluZGV4T2ZLZXkoc2VxTnVtKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJJZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXFOdW0pOworICAgICAgICAgICAgU2hhcmVkQnVmZmVyQWlkbCBtZW1BaWRse307CisgICAgICAgICAgICBtZW1BaWRsLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisgICAgICAgICAgICBhdXRvIHN0YXR1cyA9IG1QbHVnaW4tPnNldFNoYXJlZEJ1ZmZlckJhc2UobWVtQWlkbCk7CisgICAgICAgICAgICBBTE9HRV9JRighc3RhdHVzLmlzT2soKSwKKyAgICAgICAgICAgICAgICAgICAgICJzZXRTaGFyZWRCdWZmZXJCYXNlKCk6IHJlbW90ZSBjYWxsIGZhaWxlZCIpOworICAgICAgICB9CisgICAgICAgIG1IZWFwU2l6ZXMucmVtb3ZlSXRlbShzZXFOdW0pOworICAgIH0KK30KKworc3RhdHVzX3QgQ3J5cHRvSGFsQWlkbDo6Z2V0TG9nTWVzc2FnZXMoVmVjdG9yPGRybTo6VjFfNDo6TG9nTWVzc2FnZT4mIGxvZ3MpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIC8vIE5lZWQgdG8gY29udmVydCBsb2dtZXNzYWdlCisKKyAgICByZXR1cm4gRHJtVXRpbHM6OkdldExvZ01lc3NhZ2VzQWlkbDxJQ3J5cHRvUGx1Z2luQWlkbD4obVBsdWdpbiwgbG9ncyk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbEhpZGwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MzY0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsSGlkbC5jcHAKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNyeXB0b0hhbEhpZGwiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgorI2luY2x1ZGUgPGhpZGxtZW1vcnkvRnJhbWV3b3JrVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsSGlkbC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVV0aWxzLmg+CisKK3VzaW5nIGRybTo6VjFfMDo6QnVmZmVyVHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwordXNpbmcgZHJtOjpWMV8wOjpNb2RlOwordXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwordXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOworCit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpEcm1VdGlsczo6dG9TdGF0dXNUOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SGlkbE1lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGhpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbFZlYyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHZlY3RvcikgeworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHZlYzsKKyAgICB2ZWMuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QqPih2ZWN0b3IuYXJyYXkoKSksIHZlY3Rvci5zaXplKCkpOworICAgIHJldHVybiB2ZWM7Cit9CisKK3N0YXRpYyBoaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxWZWMoY29uc3Qgdm9pZCogcHRyLCBzaXplX3Qgc2l6ZSkgeworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHZlYzsKKyAgICB2ZWMucmVzaXplKHNpemUpOworICAgIG1lbWNweSh2ZWMuZGF0YSgpLCBwdHIsIHNpemUpOworICAgIHJldHVybiB2ZWM7Cit9CisKK3N0YXRpYyBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiB0b0hpZGxBcnJheTE2KGNvbnN0IHVpbnQ4X3QqIHB0cikgeworICAgIGlmICghcHRyKSB7CisgICAgICAgIHJldHVybiBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PigpOworICAgIH0KKyAgICByZXR1cm4gaGlkbF9hcnJheTx1aW50OF90LCAxNj4ocHRyKTsKK30KKworc3RhdGljIFN0cmluZzggdG9TdHJpbmc4KGhpZGxfc3RyaW5nIGhTdHJpbmcpIHsKKyAgICByZXR1cm4gU3RyaW5nOChoU3RyaW5nLmNfc3RyKCkpOworfQorCitDcnlwdG9IYWxIaWRsOjpDcnlwdG9IYWxIaWRsKCkKKyAgICA6IG1GYWN0b3JpZXMobWFrZUNyeXB0b0ZhY3RvcmllcygpKSwKKyAgICAgIG1Jbml0Q2hlY2soKG1GYWN0b3JpZXMuc2l6ZSgpID09IDApID8gRVJST1JfVU5TVVBQT1JURUQgOiBOT19JTklUKSwKKyAgICAgIG1IZWFwU2VxTnVtKDApIHt9CisKK0NyeXB0b0hhbEhpZGw6On5DcnlwdG9IYWxIaWRsKCkge30KKworVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gQ3J5cHRvSGFsSGlkbDo6bWFrZUNyeXB0b0ZhY3RvcmllcygpIHsKKyAgICBWZWN0b3I8c3A8SUNyeXB0b0ZhY3Rvcnk+PiBmYWN0b3JpZXM7CisKKyAgICBhdXRvIG1hbmFnZXIgPSBoYXJkd2FyZTo6ZGVmYXVsdFNlcnZpY2VNYW5hZ2VyMV8yKCk7CisgICAgaWYgKG1hbmFnZXIgIT0gTlVMTCkgeworICAgICAgICBtYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OjpkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBkcm1AMS4wIElDcnlwdG9GYWN0b3J5ICVzIiwgaW5zdGFuY2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBtYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OjpkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBkcm1AMS4xIElDcnlwdG9GYWN0b3J5ICVzIiwgaW5zdGFuY2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIGlmIChmYWN0b3JpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gbXVzdCBiZSBpbiBwYXNzdGhyb3VnaCBtb2RlLCBsb2FkIHRoZSBkZWZhdWx0IHBhc3N0aHJvdWdoIHNlcnZpY2UKKyAgICAgICAgYXV0byBwYXNzdGhyb3VnaCA9IElDcnlwdG9GYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CisgICAgICAgIGlmIChwYXNzdGhyb3VnaCAhPSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HSSgibWFrZUNyeXB0b0ZhY3RvcmllczogdXNpbmcgZGVmYXVsdCBwYXNzdGhyb3VnaCBjcnlwdG8gaW5zdGFuY2UiKTsKKyAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2socGFzc3Rocm91Z2gpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmaW5kIGFueSBjcnlwdG8gZmFjdG9yaWVzIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhY3RvcmllczsKK30KKworc3A8SUNyeXB0b1BsdWdpbj4gQ3J5cHRvSGFsSGlkbDo6bWFrZUNyeXB0b1BsdWdpbihjb25zdCBzcDxJQ3J5cHRvRmFjdG9yeT4mIGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQqIGluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5pdERhdGFTaXplKSB7CisgICAgc3A8SUNyeXB0b1BsdWdpbj4gcGx1Z2luOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0KKyAgICAgICAgICAgIGZhY3RvcnktPmNyZWF0ZVBsdWdpbih0b0hpZGxBcnJheTE2KHV1aWQpLCB0b0hpZGxWZWMoaW5pdERhdGEsIGluaXREYXRhU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IHNwPElDcnlwdG9QbHVnaW4+JiBoUGx1Z2luKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBtYWtlIGNyeXB0byBwbHVnaW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4gPSBoUGx1Z2luOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmICghaFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gcGx1Z2luOworfQorCitzdGF0dXNfdCBDcnlwdG9IYWxIaWRsOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK2Jvb2wgQ3J5cHRvSGFsSGlkbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IENyeXB0b0hhbEhpZGw6OmNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CisgICAgICAgICAgICBtUGx1Z2luID0gbWFrZUNyeXB0b1BsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IGRybTo6VjFfMjo6SUNyeXB0b1BsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUluaXRDaGVjayA9PSBOT19JTklUKSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBtUGx1Z2luID09IE5VTEwgPyBFUlJPUl9VTlNVUFBPUlRFRCA6IE9LOworICAgIH0KKworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzdGF0dXNfdCBDcnlwdG9IYWxIaWRsOjpkZXN0cm95UGx1Z2luKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBtUGx1Z2luLmNsZWFyKCk7CisgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKKyAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQ3J5cHRvSGFsSGlkbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIqIG1pbWUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFJldHVybjxib29sPiBoUmVzdWx0ID0gbVBsdWdpbi0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGhpZGxfc3RyaW5nKG1pbWUpKTsKKyAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGhSZXN1bHQ7Cit9CisKKy8qKgorICogSWYgdGhlIGhlYXAgYmFzZSBpc24ndCBzZXQsIGdldCB0aGUgaGVhcCBiYXNlIGZyb20gdGhlIEhpZGxNZW1vcnkKKyAqIGFuZCBzZW5kIGl0IHRvIHRoZSBIQUwgc28gaXQgY2FuIG1hcCBhIHJlbW90ZSBoZWFwIG9mIHRoZSBzYW1lCisgKiBzaXplLiAgT25jZSB0aGUgaGVhcCBiYXNlIGlzIGVzdGFibGlzaGVkLCBzaGFyZWQgbWVtb3J5IGJ1ZmZlcnMKKyAqIGFyZSBzZW50IGJ5IHByb3ZpZGluZyBhbiBvZmZzZXQgaW50byB0aGUgaGVhcCBhbmQgYSBidWZmZXIgc2l6ZS4KKyAqLworaW50MzJfdCBDcnlwdG9IYWxIaWRsOjpzZXRIZWFwQmFzZShjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCkgeworICAgIGlmIChoZWFwID09IE5VTEwgfHwgbUhlYXBTZXFOdW0gPCAwKSB7CisgICAgICAgIEFMT0dFKCJzZXRIZWFwQmFzZSgpOiBoZWFwICVwIG1IZWFwU2VxTnVtICVkIiwgaGVhcC5nZXQoKSwgbUhlYXBTZXFOdW0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnQzMl90IHNlcU51bSA9IG1IZWFwU2VxTnVtKys7CisgICAgdWludDMyX3QgYnVmZmVySWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VxTnVtKTsKKyAgICBtSGVhcFNpemVzLmFkZChzZXFOdW0sIGhlYXAtPnNpemUoKSk7CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zZXRTaGFyZWRCdWZmZXJCYXNlKCpoZWFwLCBidWZmZXJJZCk7CisgICAgQUxPR0VfSUYoIWhSZXN1bHQuaXNPaygpLCAic2V0U2hhcmVkQnVmZmVyQmFzZSgpOiByZW1vdGUgY2FsbCBmYWlsZWQiKTsKKyAgICByZXR1cm4gc2VxTnVtOworfQorCit2b2lkIENyeXB0b0hhbEhpZGw6OmNsZWFySGVhcEJhc2UoaW50MzJfdCBzZXFOdW0pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgLyoKKyAgICAgKiBDbGVhciB0aGUgcmVtb3RlIHNoYXJlZCBtZW1vcnkgbWFwcGluZyBieSBzZXR0aW5nIHRoZSBzaGFyZWQKKyAgICAgKiBidWZmZXIgYmFzZSB0byBhIG51bGwgaGlkbF9tZW1vcnkuCisgICAgICoKKyAgICAgKiBUT0RPOiBBZGQgYSByZWxlYXNlU2hhcmVkQnVmZmVyIG1ldGhvZCBpbiBhIGZ1dHVyZSBEUk0gSEFMCisgICAgICogQVBJIHZlcnNpb24gdG8gbWFrZSB0aGlzIGV4cGxpY2l0LgorICAgICAqLworICAgIHNzaXplX3QgaW5kZXggPSBtSGVhcFNpemVzLmluZGV4T2ZLZXkoc2VxTnVtKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJJZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXFOdW0pOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zZXRTaGFyZWRCdWZmZXJCYXNlKGhpZGxfbWVtb3J5KCksIGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIEFMT0dFX0lGKCFoUmVzdWx0LmlzT2soKSwgInNldFNoYXJlZEJ1ZmZlckJhc2UoKTogcmVtb3RlIGNhbGwgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICAgICAgbUhlYXBTaXplcy5yZW1vdmVJdGVtKHNlcU51bSk7CisgICAgfQorfQorCitzdGF0dXNfdCBDcnlwdG9IYWxIaWRsOjpjaGVja1NoYXJlZEJ1ZmZlcihjb25zdCA6OlNoYXJlZEJ1ZmZlciYgYnVmZmVyKSB7CisgICAgaW50MzJfdCBzZXFOdW0gPSBzdGF0aWNfY2FzdDxpbnQzMl90PihidWZmZXIuYnVmZmVySWQpOworICAgIC8vIG1lbW9yeSBtdXN0IGJlIGluIG9uZSBvZiB0aGUgaGVhcHMgdGhhdCBoYXZlIGJlZW4gc2V0CisgICAgaWYgKG1IZWFwU2l6ZXMuaW5kZXhPZktleShzZXFOdW0pIDwgMCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBtZW1vcnkgbXVzdCBiZSB3aXRoaW4gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIGhlYXAKKyAgICBzaXplX3QgaGVhcFNpemUgPSBtSGVhcFNpemVzLnZhbHVlRm9yKHNlcU51bSk7CisgICAgaWYgKGhlYXBTaXplIDwgYnVmZmVyLm9mZnNldCArIGJ1ZmZlci5zaXplIHx8IFNJWkVfTUFYIC0gYnVmZmVyLm9mZnNldCA8IGJ1ZmZlci5zaXplKSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzYyMjExMjMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzc2l6ZV90IENyeXB0b0hhbEhpZGw6OmRlY3J5cHQoY29uc3QgdWludDhfdCBrZXlJZFsxNl0sIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4mIHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXImIGhTb3VyY2UsIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUqIHN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXImIGhEZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nKiBlcnJvckRldGFpbE1zZykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBNb2RlIGhNb2RlOworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIENyeXB0b1BsdWdpbjo6a01vZGVfVW5lbmNyeXB0ZWQ6CisgICAgICAgICAgICBoTW9kZSA9IE1vZGU6OlVORU5DUllQVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ1RSOgorICAgICAgICAgICAgaE1vZGUgPSBNb2RlOjpBRVNfQ1RSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfV1Y6CisgICAgICAgICAgICBoTW9kZSA9IE1vZGU6OkFFU19DQkNfQ1RTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ0JDOgorICAgICAgICAgICAgaE1vZGUgPSBNb2RlOjpBRVNfQ0JDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBQYXR0ZXJuIGhQYXR0ZXJuOworICAgIGhQYXR0ZXJuLmVuY3J5cHRCbG9ja3MgPSBwYXR0ZXJuLm1FbmNyeXB0QmxvY2tzOworICAgIGhQYXR0ZXJuLnNraXBCbG9ja3MgPSBwYXR0ZXJuLm1Ta2lwQmxvY2tzOworCisgICAgc3RkOjp2ZWN0b3I8U3ViU2FtcGxlPiBzdGRTdWJTYW1wbGVzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgaSsrKSB7CisgICAgICAgIFN1YlNhbXBsZSBzdWJTYW1wbGU7CisgICAgICAgIHN1YlNhbXBsZS5udW1CeXRlc09mQ2xlYXJEYXRhID0gc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YTsKKyAgICAgICAgc3ViU2FtcGxlLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGE7CisgICAgICAgIHN0ZFN1YlNhbXBsZXMucHVzaF9iYWNrKHN1YlNhbXBsZSk7CisgICAgfQorICAgIGF1dG8gaFN1YlNhbXBsZXMgPSBoaWRsX3ZlYzxTdWJTYW1wbGU+KHN0ZFN1YlNhbXBsZXMpOworCisgICAgYm9vbCBzZWN1cmU7CisgICAgaWYgKGhEZXN0aW5hdGlvbi50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2hlY2tTaGFyZWRCdWZmZXIoaERlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc2VjdXJlID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChoRGVzdGluYXRpb24udHlwZSA9PSBCdWZmZXJUeXBlOjpOQVRJVkVfSEFORExFKSB7CisgICAgICAgIHNlY3VyZSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3MDUyNjcwMiIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBjaGVja1NoYXJlZEJ1ZmZlcihoU291cmNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICB1aW50MzJfdCBieXRlc1dyaXR0ZW4gPSAwOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQ7CisKKyAgICBtTG9jay51bmxvY2soKTsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmRlY3J5cHRfMV8yKAorICAgICAgICAgICAgICAgIHNlY3VyZSwgdG9IaWRsQXJyYXkxNihrZXlJZCksIHRvSGlkbEFycmF5MTYoaXYpLCBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgIGhTb3VyY2UsIG9mZnNldCwgaERlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIHVpbnQzMl90IGhCeXRlc1dyaXR0ZW4sIGhpZGxfc3RyaW5nIGhEZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBoQnl0ZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yRGV0YWlsTXNnICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JEZXRhaWxNc2cgPSB0b1N0cmluZzgoaERldGFpbGVkRXJyb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luLT5kZWNyeXB0KAorICAgICAgICAgICAgICAgIHNlY3VyZSwgdG9IaWRsQXJyYXkxNihrZXlJZCksIHRvSGlkbEFycmF5MTYoaXYpLCBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgIGhTb3VyY2UsIG9mZnNldCwgaERlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCB1aW50MzJfdCBoQnl0ZXNXcml0dGVuLCBoaWRsX3N0cmluZyBoRGV0YWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGhCeXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JEZXRhaWxNc2cgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICplcnJvckRldGFpbE1zZyA9IHRvU3RyaW5nOChoRGV0YWlsZWRFcnJvcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIHJldHVybiBieXRlc1dyaXR0ZW47CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgQ3J5cHRvSGFsSGlkbDo6bm90aWZ5UmVzb2x1dGlvbih1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGhSZXN1bHQgPSBtUGx1Z2luLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOworICAgIEFMT0dFX0lGKCFoUmVzdWx0LmlzT2soKSwgIm5vdGlmeVJlc29sdXRpb24gdHhuIGZhaWxlZCAlcyIsIGhSZXN1bHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKK30KKworc3RhdHVzX3QgQ3J5cHRvSGFsSGlkbDo6c2V0TWVkaWFEcm1TZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGF1dG8gZXJyID0gbVBsdWdpbi0+c2V0TWVkaWFEcm1TZXNzaW9uKHRvSGlkbFZlYyhzZXNzaW9uSWQpKTsKKyAgICByZXR1cm4gZXJyLmlzT2soKSA/IHRvU3RhdHVzVChlcnIpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IENyeXB0b0hhbEhpZGw6OmdldExvZ01lc3NhZ2VzKFZlY3Rvcjxkcm06OlYxXzQ6OkxvZ01lc3NhZ2U+JiBsb2dzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gRHJtVXRpbHM6OkdldExvZ01lc3NhZ2VzPGRybTo6VjFfNDo6SUNyeXB0b1BsdWdpbj4obVBsdWdpbiwgbG9ncyk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAppbmRleCA0MGQxZTBjLi5jMzk0ZDVhIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcApAQCAtMTcsMTU1NyArMTcsMjgwIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkRybUhhbCIKIAotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblJlc291cmNlTWFuYWdlckNsaWVudC5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL0V2ZW50TWV0cmljLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oPgotI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYWRybS9Ecm1IYWwuaD4KLSNpbmNsdWRlIDxtZWRpYWRybS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaD4KLSNpbmNsdWRlIDxtZWRpYWRybS9JRHJtTWV0cmljc0NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsQWlkbC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybUhhbEhpZGwuaD4KICNpbmNsdWRlIDxtZWRpYWRybS9Ecm1VdGlscy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8aW9tYW5pcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLXVzaW5nIGRybTo6VjFfMDo6S2V5ZWRWZWN0b3I7Ci11c2luZyBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOwotdXNpbmcgZHJtOjpWMV8wOjpLZXlUeXBlOwotdXNpbmcgZHJtOjpWMV8wOjpLZXlWYWx1ZTsKLXVzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcDsKLXVzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcElkOwotdXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Ci11c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDsKLXVzaW5nIGRybTo6VjFfMTo6U2VjdXJlU3RvcFJlbGVhc2U7Ci11c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Ci11c2luZyBkcm06OlYxXzI6OktleVNldElkOwotdXNpbmcgZHJtOjpWMV8yOjpLZXlTdGF0dXNUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpEcm1VdGlsczo6dG9TdGF0dXNUOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIDo6YW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpzcDsKLQotdHlwZWRlZiBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlIEtleVJlcXVlc3RUeXBlX1YxXzE7Ci10eXBlZGVmIGRybTo6VjFfMjo6U3RhdHVzIFN0YXR1c19WMV8yOwotdHlwZWRlZiBkcm06OlYxXzI6OkhkY3BMZXZlbCBIZGNwTGV2ZWxfVjFfMjsKLQotbmFtZXNwYWNlIHsKLQotLy8gVGhpcyBjb25zdGFudCBjb3JyZXNwb25kcyB0byB0aGUgUFJPUEVSVFlfREVWSUNFX1VOSVFVRV9JRCBjb25zdGFudAotLy8gaW4gdGhlIE1lZGlhRHJtIEFQSS4KLWNvbnN0ZXhwciBjaGFyIGtQcm9wZXJ0eURldmljZVVuaXF1ZUlkW10gPSAiZGV2aWNlVW5pcXVlSWQiOwotY29uc3RleHByIGNoYXIga0VxdWFsc1NpZ25bXSA9ICI9IjsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0ZDo6c3RyaW5nIHRvQmFzZTY0U3RyaW5nTm9QYWQoY29uc3QgVCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAvLyBOb3RlIHRoYXQgdGhlIGJhc2UgNjQgY29udmVyc2lvbiBvbmx5IHdvcmtzIHdpdGggYXJyYXlzIG9mIHNpbmdsZS1ieXRlCi0gICAgLy8gdmFsdWVzLiBJZiB0aGUgc291cmNlIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBhcnJheSBvZiBzaW5nbGUtYnl0ZSB2YWx1ZXMsCi0gICAgLy8gcmV0dXJuIGVtcHR5IHN0cmluZy4KLSAgICBpZiAoc2l6ZSA9PSAwIHx8IHNpemVvZihkYXRhWzBdKSAhPSAxKSB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgYW5kcm9pZDo6QVN0cmluZyBvdXRwdXRTdHJpbmc7Ci0gICAgZW5jb2RlQmFzZTY0KGRhdGEsIHNpemUsICZvdXRwdXRTdHJpbmcpOwotICAgIC8vIFJlbW92ZSB0cmFpbGluZyBlcXVhbHMgcGFkZGluZyBpZiBpdCBleGlzdHMuCi0gICAgd2hpbGUgKG91dHB1dFN0cmluZy5zaXplKCkgPiAwICYmIG91dHB1dFN0cmluZy5lbmRzV2l0aChrRXF1YWxzU2lnbikpIHsKLSAgICAgICAgb3V0cHV0U3RyaW5nLmVyYXNlKG91dHB1dFN0cmluZy5zaXplKCkgLSAxLCAxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RkOjpzdHJpbmcob3V0cHV0U3RyaW5nLmNfc3RyKCksIG91dHB1dFN0cmluZy5zaXplKCkpOwotfQotCi19ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotI2RlZmluZSBJTklUX0NIRUNLKCkge2lmIChtSW5pdENoZWNrICE9IE9LKSByZXR1cm4gbUluaXRDaGVjazt9Ci0KLXN0YXRpYyBjb25zdCBWZWN0b3I8dWludDhfdD4gdG9WZWN0b3IoY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJnZlYykgewotICAgIFZlY3Rvcjx1aW50OF90PiB2ZWN0b3I7Ci0gICAgdmVjdG9yLmFwcGVuZEFycmF5KHZlYy5kYXRhKCksIHZlYy5zaXplKCkpOwotICAgIHJldHVybiAqY29uc3RfY2FzdDxjb25zdCBWZWN0b3I8dWludDhfdD4gKj4oJnZlY3Rvcik7CitEcm1IYWw6OkRybUhhbCgpIHsKKyAgICBtRHJtSGFsSGlkbCA9IHNwPERybUhhbEhpZGw+OjptYWtlKCk7CisgICAgbURybUhhbEFpZGwgPSBzcDxEcm1IYWxBaWRsPjo6bWFrZSgpOwogfQogCi1zdGF0aWMgaGlkbF92ZWM8dWludDhfdD4gdG9IaWRsVmVjKGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmdmVjdG9yKSB7Ci0gICAgaGlkbF92ZWM8dWludDhfdD4gdmVjOwotICAgIHZlYy5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCAqPih2ZWN0b3IuYXJyYXkoKSksIHZlY3Rvci5zaXplKCkpOwotICAgIHJldHVybiB2ZWM7Ci19Ci0KLXN0YXRpYyBTdHJpbmc4IHRvU3RyaW5nOChjb25zdCBoaWRsX3N0cmluZyAmc3RyaW5nKSB7Ci0gICAgcmV0dXJuIFN0cmluZzgoc3RyaW5nLmNfc3RyKCkpOwotfQotCi1zdGF0aWMgaGlkbF9zdHJpbmcgdG9IaWRsU3RyaW5nKGNvbnN0IFN0cmluZzgmIHN0cmluZykgewotICAgIHJldHVybiBoaWRsX3N0cmluZyhzdHJpbmcuc3RyaW5nKCkpOwotfQotCi1zdGF0aWMgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHRvU2VjdXJpdHlMZXZlbChTZWN1cml0eUxldmVsIGxldmVsKSB7Ci0gICAgc3dpdGNoKGxldmVsKSB7Ci0gICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlQ3J5cHRvOwotICAgIGNhc2UgU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0RFQ09ERToKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZTsKLSAgICBjYXNlIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9DUllQVE86Ci0gICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG87Ci0gICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlRGVjb2RlOwotICAgIGNhc2UgU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0FMTDoKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd247Ci0gICAgfQotfQotCi1zdGF0aWMgU2VjdXJpdHlMZXZlbCB0b0hpZGxTZWN1cml0eUxldmVsKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCkgewotICAgIHN3aXRjaChsZXZlbCkgewotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlQ3J5cHRvOgotICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZToKLSAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9ERUNPREU7Ci0gICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG86Ci0gICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOwotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlRGVjb2RlOgotICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0RFQ09ERTsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDoKLSAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9BTEw7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlVOS05PV047Ci0gICAgfQotfQotCi1zdGF0aWMgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlIHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZSgKLSAgICAgICAgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBsaWNlbnNlU3RhdGUpIHsKLSAgICBzd2l0Y2gobGljZW5zZVN0YXRlKSB7Ci0gICAgY2FzZSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVU0FCTEU6Ci0gICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVXNhYmxlOwotICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6SU5BQ1RJVkU6Ci0gICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlUmVsZWFzZWQ7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOwotICAgIH0KLX0KLQotc3RhdGljIERybVBsdWdpbjo6SGRjcExldmVsIHRvSGRjcExldmVsKEhkY3BMZXZlbF9WMV8yIGxldmVsKSB7Ci0gICAgc3dpdGNoKGxldmVsKSB7Ci0gICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT05FOgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vbmU7Ci0gICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMToKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMTsKLSAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyOgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyOwotICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMToKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8xOwotICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMjoKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8yOwotICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMzoKLSAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8zOwotICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfTk9fT1VUUFVUOgotICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vT3V0cHV0OwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOwotICAgIH0KLX0KLXN0YXRpYyA6OktleWVkVmVjdG9yIHRvSGlkbEtleWVkVmVjdG9yKGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JgotICAgICAgICBrZXllZFZlY3RvcikgewotICAgIHN0ZDo6dmVjdG9yPEtleVZhbHVlPiBzdGRLZXllZFZlY3RvcjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleWVkVmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEtleVZhbHVlIGtleVZhbHVlOwotICAgICAgICBrZXlWYWx1ZS5rZXkgPSB0b0hpZGxTdHJpbmcoa2V5ZWRWZWN0b3Iua2V5QXQoaSkpOwotICAgICAgICBrZXlWYWx1ZS52YWx1ZSA9IHRvSGlkbFN0cmluZyhrZXllZFZlY3Rvci52YWx1ZUF0KGkpKTsKLSAgICAgICAgc3RkS2V5ZWRWZWN0b3IucHVzaF9iYWNrKGtleVZhbHVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIDo6S2V5ZWRWZWN0b3Ioc3RkS2V5ZWRWZWN0b3IpOwotfQotCi1zdGF0aWMgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gdG9LZXllZFZlY3Rvcihjb25zdCA6OktleWVkVmVjdG9yJgotICAgICAgICBoS2V5ZWRWZWN0b3IpIHsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBrZXllZFZlY3RvcjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXllZFZlY3Rvci5zaXplKCk7IGkrKykgewotICAgICAgICBrZXllZFZlY3Rvci5hZGQodG9TdHJpbmc4KGhLZXllZFZlY3RvcltpXS5rZXkpLAotICAgICAgICAgICAgICAgIHRvU3RyaW5nOChoS2V5ZWRWZWN0b3JbaV0udmFsdWUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGtleWVkVmVjdG9yOwotfQotCi1zdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcHMoY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcD4mCi0gICAgICAgIGhTZWN1cmVTdG9wcykgewotICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhTZWN1cmVTdG9wcy5zaXplKCk7IGkrKykgewotICAgICAgICBzZWN1cmVTdG9wcy5wdXNoX2JhY2sodG9WZWN0b3IoaFNlY3VyZVN0b3BzW2ldLm9wYXF1ZURhdGEpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlY3VyZVN0b3BzOwotfQotCi1zdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcElkcyhjb25zdCBoaWRsX3ZlYzxTZWN1cmVTdG9wSWQ+JgotICAgICAgICBoU2VjdXJlU3RvcElkcykgewotICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wSWRzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaFNlY3VyZVN0b3BJZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc2VjdXJlU3RvcElkcy5wdXNoX2JhY2sodG9WZWN0b3IoaFNlY3VyZVN0b3BJZHNbaV0pKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlY3VyZVN0b3BJZHM7Ci19Ci0KLXN0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9LZXlTZXRJZHMoY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JgotICAgICAgICBoS2V5U2V0SWRzKSB7Ci0gICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IGtleVNldElkczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXlTZXRJZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoS2V5U2V0SWRzW2ldKSk7Ci0gICAgfQotICAgIHJldHVybiBrZXlTZXRJZHM7Ci19Ci0KLU11dGV4IERybUhhbDo6bUxvY2s7Ci0KLXN0cnVjdCBEcm1IYWw6OkRybVNlc3Npb25DbGllbnQgOiBwdWJsaWMgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OkJuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IHsKLSAgICBleHBsaWNpdCBEcm1TZXNzaW9uQ2xpZW50KERybUhhbCogZHJtLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkKLSAgICAgIDogbVNlc3Npb25JZChzZXNzaW9uSWQpLAotICAgICAgICBtRHJtKGRybSkge30KLQotICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlY2xhaW1SZXNvdXJjZShib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldE5hbWUoOjpzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLQotICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiBtU2Vzc2lvbklkOwotCi0gICAgdmlydHVhbCB+RHJtU2Vzc2lvbkNsaWVudCgpOwotCi1wcml2YXRlOgotICAgIHdwPERybUhhbD4gbURybTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERybVNlc3Npb25DbGllbnQpOwotfTsKLQotOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtSGFsOjpEcm1TZXNzaW9uQ2xpZW50OjpyZWNsYWltUmVzb3VyY2UoYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gICAgYXV0byBzZXNzaW9uSWQgPSBtU2Vzc2lvbklkOwotICAgIHNwPERybUhhbD4gZHJtID0gbURybS5wcm9tb3RlKCk7Ci0gICAgaWYgKGRybSA9PSBOVUxMKSB7Ci0gICAgICAgICpfYWlkbF9yZXR1cm4gPSB0cnVlOwotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Ci0gICAgfQotICAgIHN0YXR1c190IGVyciA9IGRybS0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKLSAgICB9Ci0gICAgZHJtLT5zZW5kRXZlbnQoRXZlbnRUeXBlOjpTRVNTSU9OX1JFQ0xBSU1FRCwKLSAgICAgICAgICAgIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCBoaWRsX3ZlYzx1aW50OF90PigpKTsKLSAgICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKLSAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Ci19Ci0KLTo6bmRrOjpTY29wZWRBU3RhdHVzIERybUhhbDo6RHJtU2Vzc2lvbkNsaWVudDo6Z2V0TmFtZSg6OnN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKLSAgICBTdHJpbmc4IG5hbWU7Ci0gICAgc3A8RHJtSGFsPiBkcm0gPSBtRHJtLnByb21vdGUoKTsKLSAgICBpZiAoZHJtID09IE5VTEwpIHsKLSAgICAgICAgbmFtZS5hcHBlbmQoIjxkZWxldGVkPiIpOwotICAgIH0gZWxzZSBpZiAoZHJtLT5nZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoInZlbmRvciIpLCBuYW1lKSAhPSBPSwotICAgICAgICB8fCBuYW1lLmlzRW1wdHkoKSkgewotICAgICAgbmFtZS5hcHBlbmQoIjxHZXQgdmVuZG9yIGZhaWxlZCBvciBpcyBlbXB0eT4iKTsKLSAgICB9Ci0gICAgbmFtZS5hcHBlbmQoIlsiKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZXNzaW9uSWQuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbmFtZS5hcHBlbmRGb3JtYXQoIiUwMngiLCBtU2Vzc2lvbklkW2ldKTsKLSAgICB9Ci0gICAgbmFtZS5hcHBlbmQoIl0iKTsKLSAgICAqX2FpZGxfcmV0dXJuID0gbmFtZTsKLSAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Ci19Ci0KLURybUhhbDo6RHJtU2Vzc2lvbkNsaWVudDo6fkRybVNlc3Npb25DbGllbnQoKSB7Ci0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW92ZVNlc3Npb24obVNlc3Npb25JZCk7Ci19Ci0KLURybUhhbDo6RHJtSGFsKCkKLSAgIDogbUZhY3RvcmllcyhtYWtlRHJtRmFjdG9yaWVzKCkpLAotICAgICBtSW5pdENoZWNrKChtRmFjdG9yaWVzLnNpemUoKSA9PSAwKSA/IEVSUk9SX1VOU1VQUE9SVEVEIDogTk9fSU5JVCkgewotfQotCi12b2lkIERybUhhbDo6Y2xvc2VPcGVuU2Vzc2lvbnMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBhdXRvIG9wZW5TZXNzaW9ucyA9IG1PcGVuU2Vzc2lvbnM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIGNsb3NlU2Vzc2lvbihvcGVuU2Vzc2lvbnNbaV0tPm1TZXNzaW9uSWQpOwotICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgfQotICAgIG1PcGVuU2Vzc2lvbnMuY2xlYXIoKTsKLX0KLQotRHJtSGFsOjp+RHJtSGFsKCkgewotfQotCi12b2lkIERybUhhbDo6Y2xlYW51cCgpIHsKLSAgICBjbG9zZU9wZW5TZXNzaW9ucygpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXBvcnRGcmFtZXdvcmtNZXRyaWNzKHJlcG9ydFBsdWdpbk1ldHJpY3MoKSk7Ci0KLSAgICBzZXRMaXN0ZW5lcihOVUxMKTsKLSAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKLSAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgewotICAgICAgICBpZiAoIW1QbHVnaW5WMV8yLT5zZXRMaXN0ZW5lcihOVUxMKS5pc09rKCkpIHsKLSAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobVBsdWdpbiAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIoTlVMTCkuaXNPaygpKSB7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbVBsdWdpbi5jbGVhcigpOwotICAgIG1QbHVnaW5WMV8xLmNsZWFyKCk7Ci0gICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKLSAgICBtUGx1Z2luVjFfNC5jbGVhcigpOwotfQotCi1zdGQ6OnZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IERybUhhbDo6bWFrZURybUZhY3RvcmllcygpIHsKLSAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBmYWN0b3JpZXMoRHJtVXRpbHM6Ok1ha2VEcm1GYWN0b3JpZXMoKSk7Ci0gICAgaWYgKGZhY3Rvcmllcy5zaXplKCkgPT0gMCkgewotICAgICAgICAvLyBtdXN0IGJlIGluIHBhc3N0aHJvdWdoIG1vZGUsIGxvYWQgdGhlIGRlZmF1bHQgcGFzc3Rocm91Z2ggc2VydmljZQotICAgICAgICBhdXRvIHBhc3N0aHJvdWdoID0gSURybUZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICAgICAgaWYgKHBhc3N0aHJvdWdoICE9IE5VTEwpIHsKLSAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkkoIm1ha2VEcm1GYWN0b3JpZXM6IHVzaW5nIGRlZmF1bHQgcGFzc3Rocm91Z2ggZHJtIGluc3RhbmNlIik7Ci0gICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKHBhc3N0aHJvdWdoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkUoIkZhaWxlZCB0byBmaW5kIGFueSBkcm0gZmFjdG9yaWVzIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhY3RvcmllczsKLX0KLQotc3A8SURybVBsdWdpbj4gRHJtSGFsOjptYWtlRHJtUGx1Z2luKGNvbnN0IHNwPElEcm1GYWN0b3J5PiYgZmFjdG9yeSwKLSAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKLSAgICBtQXBwUGFja2FnZU5hbWUgPSBhcHBQYWNrYWdlTmFtZTsKLSAgICBtTWV0cmljcy5TZXRBcHBQYWNrYWdlTmFtZShhcHBQYWNrYWdlTmFtZSk7Ci0gICAgbU1ldHJpY3MuU2V0QXBwVWlkKEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSk7Ci0KLSAgICBzcDxJRHJtUGx1Z2luPiBwbHVnaW47Ci0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBmYWN0b3J5LT5jcmVhdGVQbHVnaW4odXVpZCwgYXBwUGFja2FnZU5hbWUuc3RyaW5nKCksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3Qgc3A8SURybVBsdWdpbj4mIGhQbHVnaW4pIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSh1dWlkLCAiRmFpbGVkIHRvIG1ha2UgZHJtIHBsdWdpbjogJWQiLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBsdWdpbiA9IGhQbHVnaW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0KLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIERybVV0aWxzOjpMT0cyQkUodXVpZCwgImNyZWF0ZVBsdWdpbiByZW1vdGUgY2FsbCBmYWlsZWQ6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoUmVzdWx0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBsdWdpbjsKLX0KK0RybUhhbDo6fkRybUhhbCgpIHt9CiAKIHN0YXR1c190IERybUhhbDo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0sgfHwgbURybUhhbEhpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gT0s7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBOT19JTklUIHx8IG1Ecm1IYWxIaWRsLT5pbml0Q2hlY2soKSA9PSBOT19JTklUKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmluaXRDaGVjaygpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1DbGllbnQ+JiBsaXN0ZW5lcikKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRXZlbnRMb2NrKTsKLSAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICByZXR1cm4gTk9fRVJST1I7CitzdGF0dXNfdCBEcm1IYWw6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwgYm9vbCogcmVzdWx0KSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzUmVzdWx0OworICAgIHN0YXR1c1Jlc3VsdCA9IG1Ecm1IYWxBaWRsLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSwgc2VjdXJpdHlMZXZlbCwgcmVzdWx0KTsKKyAgICBpZiAoKnJlc3VsdCkgcmV0dXJuIHN0YXR1c1Jlc3VsdDsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQsIG1pbWVUeXBlLCBzZWN1cml0eUxldmVsLCByZXN1bHQpOwogfQogCi1SZXR1cm48dm9pZD4gRHJtSGFsOjpzZW5kRXZlbnQoRXZlbnRUeXBlIGhFdmVudFR5cGUsCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSB7Ci0gICAgbU1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoaEV2ZW50VHlwZSk7Ci0KLSAgICBtRXZlbnRMb2NrLmxvY2soKTsKLSAgICBzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lciA9IG1MaXN0ZW5lcjsKLSAgICBtRXZlbnRMb2NrLnVubG9jaygpOwotCi0gICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU5vdGlmeUxvY2spOwotICAgICAgICBEcm1QbHVnaW46OkV2ZW50VHlwZSBldmVudFR5cGU7Ci0gICAgICAgIHN3aXRjaChoRXZlbnRUeXBlKSB7Ci0gICAgICAgIGNhc2UgRXZlbnRUeXBlOjpQUk9WSVNJT05fUkVRVUlSRUQ6Ci0gICAgICAgICAgICBldmVudFR5cGUgPSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFByb3Zpc2lvblJlcXVpcmVkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRXZlbnRUeXBlOjpLRVlfTkVFREVEOgotICAgICAgICAgICAgZXZlbnRUeXBlID0gRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRLZXlOZWVkZWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFdmVudFR5cGU6OktFWV9FWFBJUkVEOgotICAgICAgICAgICAgZXZlbnRUeXBlID0gRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRLZXlFeHBpcmVkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRDoKLSAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50VmVuZG9yRGVmaW5lZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEV2ZW50VHlwZTo6U0VTU0lPTl9SRUNMQUlNRUQ6Ci0gICAgICAgICAgICBldmVudFR5cGUgPSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFNlc3Npb25SZWNsYWltZWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudChldmVudFR5cGUsIHNlc3Npb25JZCwgZGF0YSk7Ci0gICAgfQotICAgIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjx2b2lkPiBEcm1IYWw6OnNlbmRFeHBpcmF0aW9uVXBkYXRlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMpIHsKLQotICAgIG1FdmVudExvY2subG9jaygpOwotICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOwotICAgIG1FdmVudExvY2sudW5sb2NrKCk7Ci0KLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7Ci0gICAgICAgIGxpc3RlbmVyLT5zZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIGV4cGlyeVRpbWVJbk1TKTsKLSAgICB9Ci0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPHZvaWQ+IERybUhhbDo6c2VuZEtleXNDaGFuZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKLSAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5U3RhdHVzX1YxXzA+JiBrZXlTdGF0dXNMaXN0X1YxXzAsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KSB7Ci0gICAgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzPiBrZXlTdGF0dXNWZWM7Ci0gICAgZm9yIChjb25zdCBhdXRvICZrZXlTdGF0dXNfVjFfMCA6IGtleVN0YXR1c0xpc3RfVjFfMCkgewotICAgICAgICBrZXlTdGF0dXNWZWMucHVzaF9iYWNrKHtrZXlTdGF0dXNfVjFfMC5rZXlJZCwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxLZXlTdGF0dXNUeXBlPihrZXlTdGF0dXNfVjFfMC50eXBlKX0pOwotICAgIH0KLSAgICBoaWRsX3ZlYzxLZXlTdGF0dXM+IGtleVN0YXR1c0xpc3RfVjFfMihrZXlTdGF0dXNWZWMpOwotICAgIHJldHVybiBzZW5kS2V5c0NoYW5nZV8xXzIoc2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0X1YxXzIsIGhhc05ld1VzYWJsZUtleSk7Ci19Ci0KLVJldHVybjx2b2lkPiBEcm1IYWw6OnNlbmRLZXlzQ2hhbmdlXzFfMihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXM+JiBoS2V5U3RhdHVzTGlzdCwgYm9vbCBoYXNOZXdVc2FibGVLZXkpIHsKLQotICAgIG1FdmVudExvY2subG9jaygpOwotICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOwotICAgIG1FdmVudExvY2sudW5sb2NrKCk7Ci0KLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBzdGQ6OnZlY3RvcjxEcm1LZXlTdGF0dXM+IGtleVN0YXR1c0xpc3Q7Ci0gICAgICAgIHNpemVfdCBuS2V5cyA9IGhLZXlTdGF0dXNMaXN0LnNpemUoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuS2V5czsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBLZXlTdGF0dXMgJmtleVN0YXR1cyA9IGhLZXlTdGF0dXNMaXN0W2ldOwotICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgICAgIHN3aXRjaChrZXlTdGF0dXMudHlwZSkgewotICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpVU0FCTEU6Ci0gICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfVXNhYmxlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpFWFBJUkVEOgotICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX0V4cGlyZWQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6Ok9VVFBVVE5PVEFMTE9XRUQ6Ci0gICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfT3V0cHV0Tm90QWxsb3dlZDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6U1RBVFVTUEVORElORzoKLSAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9TdGF0dXNQZW5kaW5nOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpVU0FCTEVJTkZVVFVSRToKLSAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9Vc2FibGVJbkZ1dHVyZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUjoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfSW50ZXJuYWxFcnJvcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGtleVN0YXR1c0xpc3QucHVzaF9iYWNrKHt0eXBlLCBrZXlTdGF0dXMua2V5SWR9KTsKLSAgICAgICAgICAgIG1NZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChrZXlTdGF0dXMudHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7Ci0gICAgICAgIGxpc3RlbmVyLT5zZW5kS2V5c0NoYW5nZShzZXNzaW9uSWQsIGtleVN0YXR1c0xpc3QsIGhhc05ld1VzYWJsZUtleSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhlcmUncyBubyBsaXN0ZW5lci4gQnV0IHdlIHN0aWxsIHdhbnQgdG8gY291bnQgdGhlIGtleSBjaGFuZ2UKLSAgICAgICAgLy8gZXZlbnRzLgotICAgICAgICBzaXplX3QgbktleXMgPSBoS2V5U3RhdHVzTGlzdC5zaXplKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbktleXM7IGkrKykgewotICAgICAgICAgICAgbU1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KGhLZXlTdGF0dXNMaXN0W2ldLnR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPHZvaWQ+IERybUhhbDo6c2VuZFNlc3Npb25Mb3N0U3RhdGUoCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKLQotICAgIG1FdmVudExvY2subG9jaygpOwotICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOwotICAgIG1FdmVudExvY2sudW5sb2NrKCk7Ci0KLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7Ci0gICAgICAgIGxpc3RlbmVyLT5zZW5kU2Vzc2lvbkxvc3RTdGF0ZShzZXNzaW9uSWQpOwotICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi1zdGF0dXNfdCBEcm1IYWw6Om1hdGNoTWltZVR5cGVBbmRTZWN1cml0eUxldmVsKGNvbnN0IHNwPElEcm1GYWN0b3J5PiAmZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKLSAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKLQotICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlIGNhc2VzCi0gICAgaWYgKGxldmVsID09IERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duKSB7Ci0gICAgICAgIGlmIChtaW1lVHlwZSA9PSAiIikgewotICAgICAgICAgICAgLy8gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkKLSAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSkKLSAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhY3RvcnktPmlzQ29udGVudFR5cGVTdXBwb3J0ZWQobWltZVR5cGUuc3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYgKG1pbWVUeXBlID09ICIiKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3A8ZHJtOjpWMV8yOjpJRHJtRmFjdG9yeT4gZmFjdG9yeVYxXzIgPSBkcm06OlYxXzI6OklEcm1GYWN0b3J5OjpjYXN0RnJvbShmYWN0b3J5KTsKLSAgICBpZiAoZmFjdG9yeVYxXzIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmlzU3VwcG9ydGVkID0gZmFjdG9yeVYxXzItPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkXzFfMih1dWlkLAotICAgICAgICAgICAgICAgIG1pbWVUeXBlLnN0cmluZygpLCB0b0hpZGxTZWN1cml0eUxldmVsKGxldmVsKSk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERybUhhbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOwotICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChtRmFjdG9yaWVzW2ldLAotICAgICAgICAgICAgICAgICAgICB1dWlkLCBtaW1lVHlwZSwgbGV2ZWwsIGlzU3VwcG9ydGVkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERybUhhbDo6Y3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICBhdXRvIGhSZXN1bHQgPSBtRmFjdG9yaWVzW2ldLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKTsKLSAgICAgICAgaWYgKGhSZXN1bHQuaXNPaygpICYmIGhSZXN1bHQpIHsKLSAgICAgICAgICAgIGF1dG8gcGx1Z2luID0gbWFrZURybVBsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBhcHBQYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICBpZiAocGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtUGx1Z2luID0gcGx1Z2luOwotICAgICAgICAgICAgICAgIG1QbHVnaW5WMV8xID0gZHJtOjpWMV8xOjpJRHJtUGx1Z2luOjpjYXN0RnJvbShtUGx1Z2luKTsKLSAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IGRybTo6VjFfMjo6SURybVBsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7Ci0gICAgICAgICAgICAgICAgbVBsdWdpblYxXzQgPSBkcm06OlYxXzQ6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1QbHVnaW4gPT0gTlVMTCkgewotICAgICAgICBEcm1VdGlsczo6TE9HMkJFKHV1aWQsICJObyBzdXBwb3J0ZWQgaGFsIGluc3RhbmNlIGZvdW5kIik7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9IGVsc2UgewotICAgICAgICBtSW5pdENoZWNrID0gT0s7Ci0gICAgICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoIW1QbHVnaW5WMV8yLT5zZXRMaXN0ZW5lcih0aGlzKS5pc09rKCkpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIW1QbHVnaW4tPnNldExpc3RlbmVyKHRoaXMpLmlzT2soKSkgewotICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgICAgICBtUGx1Z2luLmNsZWFyKCk7Ci0gICAgICAgICAgICBtUGx1Z2luVjFfMS5jbGVhcigpOwotICAgICAgICAgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKLSAgICAgICAgICAgIG1QbHVnaW5WMV80LmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHJldHVybiBtSW5pdENoZWNrOworc3RhdHVzX3QgRHJtSGFsOjpjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXNSZXN1bHQ7CisgICAgc3RhdHVzUmVzdWx0ID0gbURybUhhbEFpZGwtPmNyZWF0ZVBsdWdpbih1dWlkLCBhcHBQYWNrYWdlTmFtZSk7CisgICAgaWYgKHN0YXR1c1Jlc3VsdCAhPSBPSykgcmV0dXJuIG1Ecm1IYWxIaWRsLT5jcmVhdGVQbHVnaW4odXVpZCwgYXBwUGFja2FnZU5hbWUpOworICAgIHJldHVybiBzdGF0dXNSZXN1bHQ7CiB9CiAKIHN0YXR1c190IERybUhhbDo6ZGVzdHJveVBsdWdpbigpIHsKLSAgICBjbGVhbnVwKCk7Ci0gICAgcmV0dXJuIE9LOworICAgIHN0YXR1c190IHN0YXR1c1Jlc3VsdCA9IG1Ecm1IYWxBaWRsLT5kZXN0cm95UGx1Z2luKCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzUmVzdWx0SGlkbCA9IG1Ecm1IYWxIaWRsLT5kZXN0cm95UGx1Z2luKCk7CisgICAgaWYgKHN0YXR1c1Jlc3VsdCAhPSBPSykgcmV0dXJuIHN0YXR1c1Jlc3VsdDsKKyAgICByZXR1cm4gc3RhdHVzUmVzdWx0SGlkbDsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBTZWN1cml0eUxldmVsIGhTZWN1cml0eUxldmVsID0gdG9IaWRsU2VjdXJpdHlMZXZlbChsZXZlbCk7Ci0gICAgYm9vbCBzZXRTZWN1cml0eUxldmVsID0gdHJ1ZTsKLQotICAgIGlmIChsZXZlbCA9PSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsTWF4KSB7Ci0gICAgICAgIHNldFNlY3VyaXR5TGV2ZWwgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoaFNlY3VyaXR5TGV2ZWwgPT0gU2VjdXJpdHlMZXZlbDo6VU5LTk9XTikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgIGVyciA9IFVOS05PV05fRVJST1I7Ci0gICAgYm9vbCByZXRyeSA9IHRydWU7Ci0gICAgZG8gewotICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiBoU2Vzc2lvbklkOwotCi0gICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwotICAgICAgICBpZiAobVBsdWdpblYxXzEgPT0gTlVMTCB8fCAhc2V0U2VjdXJpdHlMZXZlbCkgewotICAgICAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW4tPm9wZW5TZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cyxjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IHRvVmVjdG9yKGlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+b3BlblNlc3Npb25fMV8xKGhTZWN1cml0eUxldmVsLAotICAgICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSB0b1ZlY3RvcihpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlcnIgPSBERUFEX09CSkVDVDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgPT0gRVJST1JfRFJNX1JFU09VUkNFX0JVU1kgJiYgcmV0cnkpIHsKLSAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgLy8gcmVjbGFpbVNlc3Npb24gbWF5IGNhbGwgYmFjayB0byBjbG9zZVNlc3Npb24sIHNpbmNlIG1Mb2NrIGlzCi0gICAgICAgICAgICAvLyBzaGFyZWQgYmV0d2VlbiBEcm0gaW5zdGFuY2VzLCB3ZSBzaG91bGQgdW5sb2NrIGhlcmUgdG8gYXZvaWQKLSAgICAgICAgICAgIC8vIGRlYWRsb2NrLgotICAgICAgICAgICAgcmV0cnkgPSBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVjbGFpbVNlc3Npb24oQUlCaW5kZXJfZ2V0Q2FsbGluZ1BpZCgpKTsKLSAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHJ5ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChyZXRyeSk7Ci0KLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxEcm1TZXNzaW9uQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgICAgIG5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxEcm1TZXNzaW9uQ2xpZW50Pih0aGlzLCBzZXNzaW9uSWQpOwotICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+YWRkU2Vzc2lvbihBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCksCi0gICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+KGNsaWVudCksIHNlc3Npb25JZCk7Ci0gICAgICAgIG1PcGVuU2Vzc2lvbnMucHVzaF9iYWNrKGNsaWVudCk7Ci0gICAgICAgIG1NZXRyaWNzLlNldFNlc3Npb25TdGFydChzZXNzaW9uSWQpOwotICAgIH0KLQotICAgIG1NZXRyaWNzLm1PcGVuU2Vzc2lvbkNvdW50ZXIuSW5jcmVtZW50KGVycik7Ci0gICAgcmV0dXJuIGVycjsKK3N0YXR1c190IERybUhhbDo6b3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsIFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5vcGVuU2Vzc2lvbihzZWN1cml0eUxldmVsLCBzZXNzaW9uSWQpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+b3BlblNlc3Npb24oc2VjdXJpdHlMZXZlbCwgc2Vzc2lvbklkKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPmNsb3NlU2Vzc2lvbih0b0hpZGxWZWMoc2Vzc2lvbklkKSk7Ci0gICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlU2Vzc2lvbihzZXNzaW9uSWQpOwotICAgICAgICAgICAgZm9yIChhdXRvIGkgPSBtT3BlblNlc3Npb25zLmJlZ2luKCk7IGkgIT0gbU9wZW5TZXNzaW9ucy5lbmQoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRXF1YWxTZXNzaW9uSWQoKCppKS0+bVNlc3Npb25JZCwgc2Vzc2lvbklkKSkgewotICAgICAgICAgICAgICAgICAgICBtT3BlblNlc3Npb25zLmVyYXNlKGkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzX3QgcmVzcG9uc2UgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgbU1ldHJpY3MuU2V0U2Vzc2lvbkVuZChzZXNzaW9uSWQpOwotICAgICAgICBtTWV0cmljcy5tQ2xvc2VTZXNzaW9uQ291bnRlci5JbmNyZW1lbnQocmVzcG9uc2UpOwotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotICAgIG1NZXRyaWNzLm1DbG9zZVNlc3Npb25Db3VudGVyLkluY3JlbWVudChERUFEX09CSkVDVCk7Ci0gICAgcmV0dXJuIERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7CiB9CiAKLXN0YXRpYyBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIHRvS2V5UmVxdWVzdFR5cGUoCi0gICAgICAgIEtleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlKSB7Ci0gICAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgewotICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOgotICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6UkVORVdBTDoKLSAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZW5ld2FsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U6Ci0gICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVsZWFzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9CitzdGF0dXNfdCBEcm1IYWw6OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCYgbWltZVR5cGUsIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUqIGtleVJlcXVlc3RUeXBlKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5nZXRLZXlSZXF1ZXN0KHNlc3Npb25JZCwgaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJzLCByZXF1ZXN0LCBkZWZhdWx0VXJsLCBrZXlSZXF1ZXN0VHlwZSk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRLZXlSZXF1ZXN0KHNlc3Npb25JZCwgaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsIGRlZmF1bHRVcmwsIGtleVJlcXVlc3RUeXBlKTsKIH0KIAotc3RhdGljIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZV8xXzEoCi0gICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUpIHsKLSAgICBzd2l0Y2ggKGtleVJlcXVlc3RUeXBlKSB7Ci0gICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6Tk9ORToKLSAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6VVBEQVRFOgotICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1VwZGF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIHRvS2V5UmVxdWVzdFR5cGUoc3RhdGljX2Nhc3Q8S2V5UmVxdWVzdFR5cGU+KGtleVJlcXVlc3RUeXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9CitzdGF0dXNfdCBEcm1IYWw6OnByb3ZpZGVLZXlSZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsIFZlY3Rvcjx1aW50OF90PiYga2V5U2V0SWQpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKQorICAgICAgICByZXR1cm4gbURybUhhbEFpZGwtPnByb3ZpZGVLZXlSZXNwb25zZShzZXNzaW9uSWQsIHJlc3BvbnNlLCBrZXlTZXRJZCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5wcm92aWRlS2V5UmVzcG9uc2Uoc2Vzc2lvbklkLCByZXNwb25zZSwga2V5U2V0SWQpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsIFN0cmluZzggY29uc3QgJm1pbWVUeXBlLAotICAgICAgICBEcm1QbHVnaW46OktleVR5cGUga2V5VHlwZSwgS2V5ZWRWZWN0b3I8U3RyaW5nOCwKLSAgICAgICAgU3RyaW5nOD4gY29uc3QgJm9wdGlvbmFsUGFyYW1ldGVycywgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LAotICAgICAgICBTdHJpbmc4ICZkZWZhdWx0VXJsLCBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlICprZXlSZXF1ZXN0VHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlcXVlc3RUaW1lcigmbU1ldHJpY3MubUdldEtleVJlcXVlc3RUaW1lVXMpOwotCi0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIEtleVR5cGUgaEtleVR5cGU7Ci0gICAgaWYgKGtleVR5cGUgPT0gRHJtUGx1Z2luOjprS2V5VHlwZV9TdHJlYW1pbmcpIHsKLSAgICAgICAgaEtleVR5cGUgPSBLZXlUeXBlOjpTVFJFQU1JTkc7Ci0gICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfT2ZmbGluZSkgewotICAgICAgICBoS2V5VHlwZSA9IEtleVR5cGU6Ok9GRkxJTkU7Ci0gICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfUmVsZWFzZSkgewotICAgICAgICBoS2V5VHlwZSA9IEtleVR5cGU6OlJFTEVBU0U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAga2V5UmVxdWVzdFRpbWVyLlNldEF0dHJpYnV0ZShCQURfVkFMVUUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIDo6S2V5ZWRWZWN0b3IgaE9wdGlvbmFsUGFyYW1ldGVycyA9IHRvSGlkbEtleWVkVmVjdG9yKG9wdGlvbmFsUGFyYW1ldGVycyk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwotCi0gICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKLSAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRLZXlSZXF1ZXN0XzFfMigKLSAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwKLSAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGhLZXlSZXF1ZXN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gdG9LZXlSZXF1ZXN0VHlwZV8xXzEoaEtleVJlcXVlc3RUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKLSAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRLZXlSZXF1ZXN0XzFfMSgKLSAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwKLSAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBoS2V5UmVxdWVzdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlXzFfMShoS2V5UmVxdWVzdFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRLZXlSZXF1ZXN0KAotICAgICAgICAgICAgICAgIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoaW5pdERhdGEpLAotICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLCBoT3B0aW9uYWxQYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZSBoS2V5UmVxdWVzdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlKGhLZXlSZXF1ZXN0VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKLSAgICBrZXlSZXF1ZXN0VGltZXIuU2V0QXR0cmlidXRlKGVycik7Ci0gICAgcmV0dXJuIGVycjsKK3N0YXR1c190IERybUhhbDo6cmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5yZW1vdmVLZXlzKGtleVNldElkKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPnJlbW92ZUtleXMoa2V5U2V0SWQpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnByb3ZpZGVLZXlSZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwgVmVjdG9yPHVpbnQ4X3Q+ICZrZXlTZXRJZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlc3BvbnNlVGltZXIoJm1NZXRyaWNzLm1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMpOwotCi0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnByb3ZpZGVLZXlSZXNwb25zZSh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIHRvSGlkbFZlYyhyZXNwb25zZSksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhLZXlTZXRJZCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZCA9IHRvVmVjdG9yKGhLZXlTZXRJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICApOwotICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAga2V5UmVzcG9uc2VUaW1lci5TZXRBdHRyaWJ1dGUoZXJyKTsKLSAgICByZXR1cm4gZXJyOworc3RhdHVzX3QgRHJtSGFsOjpyZXN0b3JlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlTZXRJZCkgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+cmVzdG9yZUtleXMoc2Vzc2lvbklkLCBrZXlTZXRJZCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5yZXN0b3JlS2V5cyhzZXNzaW9uSWQsIGtleVNldElkKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnJlbW92ZUtleXModG9IaWRsVmVjKGtleVNldElkKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpxdWVyeUtleVN0YXR1cyhWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0IHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPnF1ZXJ5S2V5U3RhdHVzKHNlc3Npb25JZCwgaW5mb01hcCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5xdWVyeUtleVN0YXR1cyhzZXNzaW9uSWQsIGluZm9NYXApOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwotCi0gICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+cmVzdG9yZUtleXModG9IaWRsVmVjKHNlc3Npb25JZCksCi0gICAgICAgICAgICB0b0hpZGxWZWMoa2V5U2V0SWQpKTsKLSAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OmdldFByb3Zpc2lvblJlcXVlc3QoU3RyaW5nOCBjb25zdCYgY2VydFR5cGUsIFN0cmluZzggY29uc3QmIGNlcnRBdXRob3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5nZXRQcm92aXNpb25SZXF1ZXN0KGNlcnRUeXBlLCBjZXJ0QXV0aG9yaXR5LCByZXF1ZXN0LCBkZWZhdWx0VXJsKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmdldFByb3Zpc2lvblJlcXVlc3QoY2VydFR5cGUsIGNlcnRBdXRob3JpdHksIHJlcXVlc3QsIGRlZmF1bHRVcmwpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaW5mb01hcCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIDo6S2V5ZWRWZWN0b3IgaEluZm9NYXA7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5xdWVyeUtleVN0YXR1cyh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG1hcCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBpbmZvTWFwID0gdG9LZXllZFZlY3RvcihtYXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLQotICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHdyYXBwZWRLZXkpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKQorICAgICAgICByZXR1cm4gbURybUhhbEFpZGwtPnByb3ZpZGVQcm92aXNpb25SZXNwb25zZShyZXNwb25zZSwgY2VydGlmaWNhdGUsIHdyYXBwZWRLZXkpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKHJlc3BvbnNlLCBjZXJ0aWZpY2F0ZSwgd3JhcHBlZEtleSk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6Z2V0UHJvdmlzaW9uUmVxdWVzdChTdHJpbmc4IGNvbnN0ICZjZXJ0VHlwZSwKLSAgICAgICAgU3RyaW5nOCBjb25zdCAmY2VydEF1dGhvcml0eSwgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LAotICAgICAgICBTdHJpbmc4ICZkZWZhdWx0VXJsKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwotCi0gICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKLSAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRQcm92aXNpb25SZXF1ZXN0XzFfMigKLSAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCi0gICAgICAgICAgICAgICAgWyZdKFN0YXR1c19WMV8yIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICB9IGVsc2UgewotICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0UHJvdmlzaW9uUmVxdWVzdCgKLSAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCi0gICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgIH0KLQotICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAgbU1ldHJpY3MubUdldFByb3Zpc2lvblJlcXVlc3RDb3VudGVyLkluY3JlbWVudChlcnIpOwotICAgIHJldHVybiBlcnI7CitzdGF0dXNfdCBEcm1IYWw6OmdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYgc2VjdXJlU3RvcHMpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmdldFNlY3VyZVN0b3BzKHNlY3VyZVN0b3BzKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmdldFNlY3VyZVN0b3BzKHNlY3VyZVN0b3BzKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZjZXJ0aWZpY2F0ZSwgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5wcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UodG9IaWRsVmVjKHJlc3BvbnNlKSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaENlcnRpZmljYXRlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFdyYXBwZWRLZXkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUgPSB0b1ZlY3RvcihoQ2VydGlmaWNhdGUpOwotICAgICAgICAgICAgICAgICAgICB3cmFwcGVkS2V5ID0gdG9WZWN0b3IoaFdyYXBwZWRLZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLQotICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAgbU1ldHJpY3MubVByb3ZpZGVQcm92aXNpb25SZXNwb25zZUNvdW50ZXIuSW5jcmVtZW50KGVycik7Ci0gICAgcmV0dXJuIGVycjsKK3N0YXR1c190IERybUhhbDo6Z2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4mIHNlY3VyZVN0b3BJZHMpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmdldFNlY3VyZVN0b3BJZHMoc2VjdXJlU3RvcElkcyk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRTZWN1cmVTdG9wSWRzKHNlY3VyZVN0b3BJZHMpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcHMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldFNlY3VyZVN0b3BzKAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPFNlY3VyZVN0b3A+JiBoU2VjdXJlU3RvcHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgc2VjdXJlU3RvcHMgPSB0b1NlY3VyZVN0b3BzKGhTZWN1cmVTdG9wcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6Z2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQsIFZlY3Rvcjx1aW50OF90PiYgc2VjdXJlU3RvcCkgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+Z2V0U2VjdXJlU3RvcChzc2lkLCBzZWN1cmVTdG9wKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmdldFNlY3VyZVN0b3Aoc3NpZCwgc2VjdXJlU3RvcCk7CiB9CiAKLQotc3RhdHVzX3QgRHJtSGFsOjpnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcElkcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBpZiAobVBsdWdpblYxXzEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldFNlY3VyZVN0b3BJZHMoCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcElkPiYgaFNlY3VyZVN0b3BJZHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgc2VjdXJlU3RvcElkcyA9IHRvU2VjdXJlU3RvcElkcyhoU2VjdXJlU3RvcElkcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6cmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc3NSZWxlYXNlKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5yZWxlYXNlU2VjdXJlU3RvcHMoc3NSZWxlYXNlKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPnJlbGVhc2VTZWN1cmVTdG9wcyhzc1JlbGVhc2UpOwogfQogCi0KLXN0YXR1c190IERybUhhbDo6Z2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQsIFZlY3Rvcjx1aW50OF90PiAmc2VjdXJlU3RvcCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0U2VjdXJlU3RvcCh0b0hpZGxWZWMoc3NpZCksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgU2VjdXJlU3RvcCYgaFNlY3VyZVN0b3ApIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgc2VjdXJlU3RvcCA9IHRvVmVjdG9yKGhTZWN1cmVTdG9wLm9wYXF1ZURhdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci19Ci0KLXN0YXR1c190IERybUhhbDo6cmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTik7Ci0gICAgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKLSAgICAgICAgU2VjdXJlU3RvcFJlbGVhc2Ugc2VjdXJlU3RvcFJlbGVhc2U7Ci0gICAgICAgIHNlY3VyZVN0b3BSZWxlYXNlLm9wYXF1ZURhdGEgPSB0b0hpZGxWZWMoc3NSZWxlYXNlKTsKLSAgICAgICAgc3RhdHVzID0gbVBsdWdpblYxXzEtPnJlbGVhc2VTZWN1cmVTdG9wcyhzZWN1cmVTdG9wUmVsZWFzZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gbVBsdWdpbi0+cmVsZWFzZVNlY3VyZVN0b3AodG9IaWRsVmVjKHNzUmVsZWFzZSkpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Ci19Ci0KLXN0YXR1c190IERybUhhbDo6cmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5yZW1vdmVTZWN1cmVTdG9wKHRvSGlkbFZlYyhzc2lkKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc3NpZCkgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+cmVtb3ZlU2VjdXJlU3RvcChzc2lkKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPnJlbW92ZVNlY3VyZVN0b3Aoc3NpZCk7CiB9CiAKIHN0YXR1c190IERybUhhbDo6cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTik7Ci0gICAgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzID0gbVBsdWdpblYxXzEtPnJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gbVBsdWdpbi0+cmVsZWFzZUFsbFNlY3VyZVN0b3BzKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPnJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5yZW1vdmVBbGxTZWN1cmVTdG9wcygpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKmNvbm5lY3RlZCwKLSAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsICptYXgpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIGlmIChjb25uZWN0ZWQgPT0gTlVMTCB8fCBtYXggPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgKmNvbm5lY3RlZCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247Ci0gICAgKm1heCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKLSAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgewotICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldEhkY3BMZXZlbHNfMV8yKAotICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbF9WMV8yJiBoQ29ubmVjdGVkLCBjb25zdCBIZGNwTGV2ZWxfVjFfMiYgaE1heCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKGhDb25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKGhNYXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgewotICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldEhkY3BMZXZlbHMoCi0gICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbCYgaENvbm5lY3RlZCwgY29uc3QgSGRjcExldmVsJiBoTWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKHN0YXRpY19jYXN0PEhkY3BMZXZlbF9WMV8yPihoQ29ubmVjdGVkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqbWF4ID0gdG9IZGNwTGV2ZWwoc3RhdGljX2Nhc3Q8SGRjcExldmVsX1YxXzI+KGhNYXgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OmdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwqIGNvbm5lY3RlZExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsKiBtYXhMZXZlbCkgY29uc3QgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+Z2V0SGRjcExldmVscyhjb25uZWN0ZWRMZXZlbCwgbWF4TGV2ZWwpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+Z2V0SGRjcExldmVscyhjb25uZWN0ZWRMZXZlbCwgbWF4TGV2ZWwpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QgKm9wZW4sIHVpbnQzMl90ICptYXgpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIGlmIChvcGVuID09IE5VTEwgfHwgbWF4ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgICpvcGVuID0gMDsKLSAgICAqbWF4ID0gMDsKLQotICAgIGlmIChtUGx1Z2luVjFfMSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXROdW1iZXJPZlNlc3Npb25zKAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIHVpbnQzMl90IGhPcGVuLCB1aW50MzJfdCBoTWF4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvcGVuID0gaE9wZW47Ci0gICAgICAgICAgICAgICAgICAgICptYXggPSBoTWF4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OmdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QqIGN1cnJlbnRTZXNzaW9ucywgdWludDMyX3QqIG1heFNlc3Npb25zKSBjb25zdCB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5nZXROdW1iZXJPZlNlc3Npb25zKGN1cnJlbnRTZXNzaW9ucywgbWF4U2Vzc2lvbnMpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+Z2V0TnVtYmVyT2ZTZXNzaW9ucyhjdXJyZW50U2Vzc2lvbnMsIG1heFNlc3Npb25zKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgKmxldmVsKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBpZiAobGV2ZWwgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgICpsZXZlbCA9IERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duOwotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0U2VjdXJpdHlMZXZlbCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBTZWN1cml0eUxldmVsIGhMZXZlbCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAqbGV2ZWwgPSB0b1NlY3VyaXR5TGV2ZWwoaExldmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgKTsKLQotICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCogbGV2ZWwpIGNvbnN0IHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmdldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBsZXZlbCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRTZWN1cml0eUxldmVsKHNlc3Npb25JZCwgbGV2ZWwpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JiBoS2V5U2V0SWRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGtleVNldElkcyA9IHRvS2V5U2V0SWRzKGhLZXlTZXRJZHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYga2V5U2V0SWRzKSBjb25zdCB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5nZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhrZXlTZXRJZHMpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoa2V5U2V0SWRzKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtUGx1Z2luVjFfMi0+cmVtb3ZlT2ZmbGluZUxpY2Vuc2UodG9IaWRsVmVjKGtleVNldElkKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5yZW1vdmVPZmZsaW5lTGljZW5zZShrZXlTZXRJZCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5yZW1vdmVPZmZsaW5lTGljZW5zZShrZXlTZXRJZCk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAotICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgKmxpY2Vuc2VTdGF0ZSkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBpZiAobVBsdWdpblYxXzIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotICAgICpsaWNlbnNlU3RhdGUgPSBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVW5rbm93bjsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZVN0YXRlKHRvSGlkbFZlYyhrZXlTZXRJZCksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBoTGljZW5zZVN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpsaWNlbnNlU3RhdGUgPSB0b09mZmxpbmVMaWNlbnNlU3RhdGUoaExpY2Vuc2VTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSogbGljZW5zZVN0YXRlKSBjb25zdCB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5nZXRPZmZsaW5lTGljZW5zZVN0YXRlKGtleVNldElkLCBsaWNlbnNlU3RhdGUpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShrZXlTZXRJZCwgbGljZW5zZVN0YXRlKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSApIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKG5hbWUsIHZhbHVlKTsKK3N0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0IHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmdldFByb3BlcnR5U3RyaW5nKG5hbWUsIHZhbHVlKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmdldFByb3BlcnR5U3RyaW5nKG5hbWUsIHZhbHVlKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdCB7Ci0gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBpbnRlcm5hbCB0byB0aGUgY2xhc3MgYW5kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGlsZQotICAgIC8vIG1Mb2NrIGlzIGFscmVhZHkgaGVsZC4KLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRQcm9wZXJ0eVN0cmluZyh0b0hpZGxTdHJpbmcobmFtZSksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF9zdHJpbmcmIGhWYWx1ZSkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvU3RyaW5nOChoVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QmIG5hbWUsIFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIGNvbnN0IHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKSByZXR1cm4gbURybUhhbEFpZGwtPmdldFByb3BlcnR5Qnl0ZUFycmF5KG5hbWUsIHZhbHVlKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmdldFByb3BlcnR5Qnl0ZUFycmF5KG5hbWUsIHZhbHVlKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLCBWZWN0b3I8dWludDhfdD4gJnZhbHVlICkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwobmFtZSwgdmFsdWUpOworc3RhdHVzX3QgRHJtSGFsOjpzZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0JiBuYW1lLCBTdHJpbmc4IGNvbnN0JiB2YWx1ZSkgY29uc3QgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+c2V0UHJvcGVydHlTdHJpbmcobmFtZSwgdmFsdWUpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+c2V0UHJvcGVydHlTdHJpbmcobmFtZSwgdmFsdWUpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSApIGNvbnN0IHsKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGludGVybmFsIHRvIHRoZSBjbGFzcyBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoaWxlCi0gICAgLy8gbUxvY2sgaXMgYWxyZWFkeSBoZWxkLgotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldFByb3BlcnR5Qnl0ZUFycmF5KHRvSGlkbFN0cmluZyhuYW1lKSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG9WZWN0b3IoaFZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgKTsKLQotICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAgaWYgKG5hbWUgPT0ga1Byb3BlcnR5RGV2aWNlVW5pcXVlSWQpIHsKLSAgICAgICAgbU1ldHJpY3MubUdldERldmljZVVuaXF1ZUlkQ291bnRlci5JbmNyZW1lbnQoZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKK3N0YXR1c190IERybUhhbDo6c2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCYgbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiB2YWx1ZSkgY29uc3QgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+c2V0UHJvcGVydHlCeXRlQXJyYXkobmFtZSwgdmFsdWUpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+c2V0UHJvcGVydHlCeXRlQXJyYXkobmFtZSwgdmFsdWUpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggY29uc3QgJnZhbHVlICkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+c2V0UHJvcGVydHlTdHJpbmcodG9IaWRsU3RyaW5nKG5hbWUpLAotICAgICAgICAgICAgdG9IaWRsU3RyaW5nKHZhbHVlKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpnZXRNZXRyaWNzKGNvbnN0IHNwPElEcm1NZXRyaWNzQ29uc3VtZXI+JiBjb25zdW1lcikgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+Z2V0TWV0cmljcyhjb25zdW1lcik7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRNZXRyaWNzKGNvbnN1bWVyKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpzZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJnZhbHVlICkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+c2V0UHJvcGVydHlCeXRlQXJyYXkodG9IaWRsU3RyaW5nKG5hbWUpLAotICAgICAgICAgICAgdG9IaWRsVmVjKHZhbHVlKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjpzZXRDaXBoZXJBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFN0cmluZzggY29uc3QmIGFsZ29yaXRobSkgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spCisgICAgICAgIHJldHVybiBtRHJtSGFsQWlkbC0+c2V0Q2lwaGVyQWxnb3JpdGhtKHNlc3Npb25JZCwgYWxnb3JpdGhtKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPnNldENpcGhlckFsZ29yaXRobShzZXNzaW9uSWQsIGFsZ29yaXRobSk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6Z2V0TWV0cmljcyhjb25zdCBzcDxJRHJtTWV0cmljc0NvbnN1bWVyPiAmY29uc3VtZXIpIHsKLSAgICBpZiAoY29uc3VtZXIgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gVU5FWFBFQ1RFRF9OVUxMOwotICAgIH0KLSAgICBjb25zdW1lci0+Y29uc3VtZUZyYW1ld29ya01ldHJpY3MobU1ldHJpY3MpOwotCi0gICAgLy8gQXBwZW5kIHZlbmRvciBtZXRyaWNzIGlmIHRoZXkgYXJlIHN1cHBvcnRlZC4KLSAgICBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgewotICAgICAgICBTdHJpbmc4IHZlbmRvcjsKLSAgICAgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKLSAgICAgICAgaWYgKGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcikgIT0gT0sKLSAgICAgICAgICAgIHx8IHZlbmRvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICBBTE9HRSgiR2V0IHZlbmRvciBmYWlsZWQgb3IgaXMgZW1wdHkiKTsKLSAgICAgICAgICB2ZW5kb3IgPSAiTk9ORSI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgiZGVzY3JpcHRpb24iKSwgZGVzY3JpcHRpb24pICE9IE9LCi0gICAgICAgICAgICB8fCBkZXNjcmlwdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICBBTE9HRSgiR2V0IGRlc2NyaXB0aW9uIGZhaWxlZCBvciBpcyBlbXB0eS4iKTsKLSAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJOT05FIjsKLSAgICAgICAgfQotICAgICAgICB2ZW5kb3IgKz0gIi4iOwotICAgICAgICB2ZW5kb3IgKz0gZGVzY3JpcHRpb247Ci0KLSAgICAgICAgaGlkbF92ZWM8RHJtTWV0cmljR3JvdXA+IHBsdWdpbk1ldHJpY3M7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICAgICAgUmV0dXJuPHZvaWQ+IHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5nZXRNZXRyaWNzKAotICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBoaWRsX3ZlYzxEcm1NZXRyaWNHcm91cD4gcGx1Z2luTWV0cmljcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiRXJyb3IgZ2V0dGluZyBwbHVnaW4gbWV0cmljczogJWQiLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyLT5jb25zdW1lSGlkbE1ldHJpY3ModmVuZG9yLCBwbHVnaW5NZXRyaWNzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7CitzdGF0dXNfdCBEcm1IYWw6OnNldE1hY0FsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgU3RyaW5nOCBjb25zdCYgYWxnb3JpdGhtKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5zZXRNYWNBbGdvcml0aG0oc2Vzc2lvbklkLCBhbGdvcml0aG0pOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+c2V0TWFjQWxnb3JpdGhtKHNlc3Npb25JZCwgYWxnb3JpdGhtKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpzZXRDaXBoZXJBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7Ci0KLSAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtUGx1Z2luLT5zZXRDaXBoZXJBbGdvcml0aG0odG9IaWRsVmVjKHNlc3Npb25JZCksCi0gICAgICAgICAgICB0b0hpZGxTdHJpbmcoYWxnb3JpdGhtKSk7Ci0gICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworc3RhdHVzX3QgRHJtSGFsOjplbmNyeXB0KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5wdXQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBvdXRwdXQpIHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKQorICAgICAgICByZXR1cm4gbURybUhhbEFpZGwtPmVuY3J5cHQoc2Vzc2lvbklkLCBrZXlJZCwgaW5wdXQsIGl2LCBvdXRwdXQpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+ZW5jcnlwdChzZXNzaW9uSWQsIGtleUlkLCBpbnB1dCwgaXYsIG91dHB1dCk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6c2V0TWFjQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwotCi0gICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+c2V0TWFjQWxnb3JpdGhtKHRvSGlkbFZlYyhzZXNzaW9uSWQpLAotICAgICAgICAgICAgdG9IaWRsU3RyaW5nKGFsZ29yaXRobSkpOwotICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6ZGVjcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIGlucHV0LCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5kZWNyeXB0KHNlc3Npb25JZCwga2V5SWQsIGlucHV0LCBpdiwgb3V0cHV0KTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPmRlY3J5cHQoc2Vzc2lvbklkLCBrZXlJZCwgaW5wdXQsIGl2LCBvdXRwdXQpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OmVuY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5wdXQsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaXYsIFZlY3Rvcjx1aW50OF90PiAmb3V0cHV0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+ZW5jcnlwdCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIHRvSGlkbFZlYyhrZXlJZCksIHRvSGlkbFZlYyhpbnB1dCksIHRvSGlkbFZlYyhpdiksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gdG9WZWN0b3IoaE91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6c2lnbihWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIG1lc3NhZ2UsIFZlY3Rvcjx1aW50OF90PiYgc2lnbmF0dXJlKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT5zaWduKHNlc3Npb25JZCwga2V5SWQsIG1lc3NhZ2UsIHNpZ25hdHVyZSk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5zaWduKHNlc3Npb25JZCwga2V5SWQsIG1lc3NhZ2UsIHNpZ25hdHVyZSk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6ZGVjcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbnB1dCwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpdiwgVmVjdG9yPHVpbnQ4X3Q+ICZvdXRwdXQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIElOSVRfQ0hFQ0soKTsKLQotICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7Ci0KLSAgICBzdGF0dXNfdCAgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+ZGVjcnlwdCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIHRvSGlkbFZlYyhrZXlJZCksIHRvSGlkbFZlYyhpbnB1dCksIHRvSGlkbFZlYyhpdiksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gdG9WZWN0b3IoaE91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6dmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBtZXNzYWdlLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIG1hdGNoKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykKKyAgICAgICAgcmV0dXJuIG1Ecm1IYWxBaWRsLT52ZXJpZnkoc2Vzc2lvbklkLCBrZXlJZCwgbWVzc2FnZSwgc2lnbmF0dXJlLCBtYXRjaCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT52ZXJpZnkoc2Vzc2lvbklkLCBrZXlJZCwgbWVzc2FnZSwgc2lnbmF0dXJlLCBtYXRjaCk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6c2lnbihWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAotICAgICAgICBWZWN0b3I8dWludDhfdD4gJnNpZ25hdHVyZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnNpZ24odG9IaWRsVmVjKHNlc3Npb25JZCksCi0gICAgICAgICAgICB0b0hpZGxWZWMoa2V5SWQpLCB0b0hpZGxWZWMobWVzc2FnZSksCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhTaWduYXR1cmUpICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA9IHRvVmVjdG9yKGhTaWduYXR1cmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OnNpZ25SU0EoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFN0cmluZzggY29uc3QmIGFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIG1lc3NhZ2UsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgd3JhcHBlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHNpZ25hdHVyZSkgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spCisgICAgICAgIHJldHVybiBtRHJtSGFsQWlkbC0+c2lnblJTQShzZXNzaW9uSWQsIGFsZ29yaXRobSwgbWVzc2FnZSwgd3JhcHBlZEtleSwgc2lnbmF0dXJlKTsKKyAgICByZXR1cm4gbURybUhhbEhpZGwtPnNpZ25SU0Eoc2Vzc2lvbklkLCBhbGdvcml0aG0sIG1lc3NhZ2UsIHdyYXBwZWRLZXksIHNpZ25hdHVyZSk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6dmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLCBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2lnbmF0dXJlLCBib29sICZtYXRjaCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgSU5JVF9DSEVDSygpOwotCi0gICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnZlcmlmeSh0b0hpZGxWZWMoc2Vzc2lvbklkKSx0b0hpZGxWZWMoa2V5SWQpLAotICAgICAgICAgICAgdG9IaWRsVmVjKG1lc3NhZ2UpLCB0b0hpZGxWZWMoc2lnbmF0dXJlKSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBib29sIGhNYXRjaCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGhNYXRjaDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CitzdGF0dXNfdCBEcm1IYWw6OnNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1DbGllbnQ+JiBsaXN0ZW5lcikgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnNpZ25SU0EoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAotICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJndyYXBwZWRLZXksIFZlY3Rvcjx1aW50OF90PiAmc2lnbmF0dXJlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBJTklUX0NIRUNLKCk7Ci0KLSAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+c2lnblJTQSh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIHRvSGlkbFN0cmluZyhhbGdvcml0aG0pLCB0b0hpZGxWZWMobWVzc2FnZSksIHRvSGlkbFZlYyh3cmFwcGVkS2V5KSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFNpZ25hdHVyZSkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUgPSB0b1ZlY3RvcihoU2lnbmF0dXJlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0KLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK3N0YXR1c190IERybUhhbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIqIG1pbWUsIGJvb2wqIHJlcXVpcmVkKSBjb25zdCB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5yZXF1aXJlc1NlY3VyZURlY29kZXIobWltZSwgcmVxdWlyZWQpOworICAgIHJldHVybiBtRHJtSGFsSGlkbC0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyKG1pbWUsIHJlcXVpcmVkKTsKIH0KIAotc3RkOjpzdHJpbmcgRHJtSGFsOjpyZXBvcnRGcmFtZXdvcmtNZXRyaWNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwbHVnaW5NZXRyaWNzKSBjb25zdAotewotICAgIG1lZGlhbWV0cmljc19oYW5kbGVfdCBpdGVtKG1lZGlhbWV0cmljc19jcmVhdGUoIm1lZGlhZHJtIikpOwotICAgIG1lZGlhbWV0cmljc19zZXRVaWQoaXRlbSwgbU1ldHJpY3MuR2V0QXBwVWlkKCkpOwotICAgIFN0cmluZzggdmVuZG9yOwotICAgIFN0cmluZzggZGVzY3JpcHRpb247Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKTsKLSAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHZlbmRvciBmcm9tIGRybSBwbHVnaW46ICVkIiwgcmVzdWx0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhpdGVtLCAidmVuZG9yIiwgdmVuZG9yLmNfc3RyKCkpOwotICAgIH0KLSAgICByZXN1bHQgPSBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKTsKLSAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGRlc2NyaXB0aW9uIGZyb20gZHJtIHBsdWdpbjogJWQiLCByZXN1bHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKGl0ZW0sICJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uLmNfc3RyKCkpOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRNZXRyaWNzOwotICAgIHJlc3VsdCA9IG1NZXRyaWNzLkdldFNlcmlhbGl6ZWRNZXRyaWNzKCZzZXJpYWxpemVkTWV0cmljcyk7Ci0gICAgaWYgKHJlc3VsdCAhPSBPSykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBmcmFtZXdvcmsgbWV0cmljczogJWQiLCByZXN1bHQpOwotICAgIH0KLSAgICBzdGQ6OnN0cmluZyBiNjRFbmNvZGVkTWV0cmljcyA9IHRvQmFzZTY0U3RyaW5nTm9QYWQoc2VyaWFsaXplZE1ldHJpY3MuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkTWV0cmljcy5zaXplKCkpOwotICAgIGlmICghYjY0RW5jb2RlZE1ldHJpY3MuZW1wdHkoKSkgewotICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhpdGVtLCAic2VyaWFsaXplZF9tZXRyaWNzIiwgYjY0RW5jb2RlZE1ldHJpY3MuY19zdHIoKSk7Ci0gICAgfQotICAgIGlmICghcGx1Z2luTWV0cmljcy5lbXB0eSgpKSB7Ci0gICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKGl0ZW0sICJwbHVnaW5fbWV0cmljcyIsIHBsdWdpbk1ldHJpY3MuY19zdHIoKSk7Ci0gICAgfQotICAgIGlmICghbWVkaWFtZXRyaWNzX3NlbGZSZWNvcmQoaXRlbSkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZWxmIHJlY29yZCBmcmFtZXdvcmsgbWV0cmljcyIpOwotICAgIH0KLSAgICBtZWRpYW1ldHJpY3NfZGVsZXRlKGl0ZW0pOwotICAgIHJldHVybiBzZXJpYWxpemVkTWV0cmljczsKK3N0YXR1c190IERybUhhbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIqIG1pbWUsIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmVxdWlyZWQpIGNvbnN0IHsKKyAgICBpZiAobURybUhhbEFpZGwtPmluaXRDaGVjaygpID09IE9LKQorICAgICAgICByZXR1cm4gbURybUhhbEFpZGwtPnJlcXVpcmVzU2VjdXJlRGVjb2RlcihtaW1lLCBzZWN1cml0eUxldmVsLCByZXF1aXJlZCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5yZXF1aXJlc1NlY3VyZURlY29kZXIobWltZSwgc2VjdXJpdHlMZXZlbCwgcmVxdWlyZWQpOwogfQogCi1zdGQ6OnN0cmluZyBEcm1IYWw6OnJlcG9ydFBsdWdpbk1ldHJpY3MoKSBjb25zdAotewotICAgIFZlY3Rvcjx1aW50OF90PiBtZXRyaWNzVmVjdG9yOwotICAgIFN0cmluZzggdmVuZG9yOwotICAgIFN0cmluZzggZGVzY3JpcHRpb247Ci0gICAgc3RkOjpzdHJpbmcgbWV0cmljc1N0cmluZzsKLSAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKSA9PSBPSyAmJgotICAgICAgICAgICAgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbikgPT0gT0sgJiYKLSAgICAgICAgICAgIGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCgibWV0cmljcyIpLCBtZXRyaWNzVmVjdG9yKSA9PSBPSykgewotICAgICAgICBtZXRyaWNzU3RyaW5nID0gdG9CYXNlNjRTdHJpbmdOb1BhZChtZXRyaWNzVmVjdG9yLmFycmF5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3NWZWN0b3Iuc2l6ZSgpKTsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gYW5kcm9pZDo6cmVwb3J0RHJtUGx1Z2luTWV0cmljcyhtZXRyaWNzU3RyaW5nLCB2ZW5kb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sIG1NZXRyaWNzLkdldEFwcFVpZCgpKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIk1ldHJpY3Mgd2VyZSByZXRyaWV2ZWQgYnV0IGNvdWxkIG5vdCBiZSByZXBvcnRlZDogJWQiLCByZXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtZXRyaWNzU3RyaW5nOworc3RhdHVzX3QgRHJtSGFsOjpzZXRQbGF5YmFja0lkKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBjb25zdCBjaGFyKiBwbGF5YmFja0lkKSB7CisgICAgaWYgKG1Ecm1IYWxBaWRsLT5pbml0Q2hlY2soKSA9PSBPSykgcmV0dXJuIG1Ecm1IYWxBaWRsLT5zZXRQbGF5YmFja0lkKHNlc3Npb25JZCwgcGxheWJhY2tJZCk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5zZXRQbGF5YmFja0lkKHNlc3Npb25JZCwgcGxheWJhY2tJZCk7CiB9CiAKLXN0YXR1c190IERybUhhbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgKnJlcXVpcmVkKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAobVBsdWdpblYxXzQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGF1dG8gaFJlc3VsdCA9IG1QbHVnaW5WMV80LT5yZXF1aXJlc1NlY3VyZURlY29kZXJEZWZhdWx0KGhpZGxfc3RyaW5nKG1pbWUpKTsKLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIERybVV0aWxzOjpMT0cyQkUoInJlcXVpcmVzU2VjdXJlRGVjb2RlciB0eG4gZmFpbGVkOiAlcyIsIGhSZXN1bHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBpZiAocmVxdWlyZWQpIHsKLSAgICAgICAgKnJlcXVpcmVkID0gaFJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOworc3RhdHVzX3QgRHJtSGFsOjpnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgY29uc3QgeworICAgIGlmIChtRHJtSGFsQWlkbC0+aW5pdENoZWNrKCkgPT0gT0spIHJldHVybiBtRHJtSGFsQWlkbC0+Z2V0TG9nTWVzc2FnZXMobG9ncyk7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRMb2dNZXNzYWdlcyhsb2dzKTsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpyZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciAqbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpyZXF1aXJlZCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKG1QbHVnaW5WMV80ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBhdXRvIGhMZXZlbCA9IHRvSGlkbFNlY3VyaXR5TGV2ZWwoc2VjdXJpdHlMZXZlbCk7Ci0gICAgYXV0byBoUmVzdWx0ID0gbVBsdWdpblYxXzQtPnJlcXVpcmVzU2VjdXJlRGVjb2RlcihoaWRsX3N0cmluZyhtaW1lKSwgaExldmVsKTsKLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIERybVV0aWxzOjpMT0cyQkUoInJlcXVpcmVzU2VjdXJlRGVjb2RlciB0eG4gZmFpbGVkOiAlcyIsIGhSZXN1bHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBpZiAocmVxdWlyZWQpIHsKLSAgICAgICAgKnJlcXVpcmVkID0gaFJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEcm1IYWw6OnNldFBsYXliYWNrSWQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsIGNvbnN0IGNoYXIgKnBsYXliYWNrSWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmIChtUGx1Z2luVjFfNCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0gICAgYXV0byBlcnIgPSBtUGx1Z2luVjFfNC0+c2V0UGxheWJhY2tJZCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwgaGlkbF9zdHJpbmcocGxheWJhY2tJZCkpOwotICAgIHJldHVybiBlcnIuaXNPaygpID8gdG9TdGF0dXNUKGVycikgOiBERUFEX09CSkVDVDsKLX0KLQotc3RhdHVzX3QgRHJtSGFsOjpnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiAmbG9ncykgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIERybVV0aWxzOjpHZXRMb2dNZXNzYWdlczxkcm06OlYxXzQ6OklEcm1QbHVnaW4+KG1QbHVnaW4sIGxvZ3MpOworc3RhdHVzX3QgRHJtSGFsOjpnZXRTdXBwb3J0ZWRTY2hlbWVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZzY2hlbWVzKSBjb25zdCB7CisgICAgc3RhdHVzX3Qgc3RhdHVzUmVzdWx0OworICAgIHN0YXR1c1Jlc3VsdCA9IG1Ecm1IYWxBaWRsLT5nZXRTdXBwb3J0ZWRTY2hlbWVzKHNjaGVtZXMpOworICAgIGlmIChzdGF0dXNSZXN1bHQgPT0gT0spIHJldHVybiBzdGF0dXNSZXN1bHQ7CisgICAgcmV0dXJuIG1Ecm1IYWxIaWRsLT5nZXRTdXBwb3J0ZWRTY2hlbWVzKHNjaGVtZXMpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbEFpZGwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0RybUhhbEFpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZDgzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsQWlkbC5jcHAKQEAgLTAsMCArMSwxMjU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJEcm1IYWxBaWRsIgorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9hdXRvX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsQWlkbC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtVXRpbHMuaD4KKwordXNpbmcgOjphbmRyb2lkOjpEcm1VdGlsczo6c3RhdHVzQWlkbFRvU3RhdHVzVDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6Q3J5cHRvU2NoZW1lczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RHJtTWV0cmljTmFtZWRWYWx1ZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RHJtTWV0cmljVmFsdWU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OkhkY3BMZXZlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SGRjcExldmVsczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5UmVxdWVzdDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5UmVxdWVzdFR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVN0YXR1c1R5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVZhbHVlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpOdW1iZXJPZlNlc3Npb25zOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpPZmZsaW5lTGljZW5zZVN0YXRlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpPcGFxdWVEYXRhOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpQcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VSZXN1bHQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlByb3Zpc2lvblJlcXVlc3Q7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3A7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3BJZDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTdXBwb3J0ZWRDb250ZW50VHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZDsKK3VzaW5nIERybU1ldHJpY0dyb3VwQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RHJtTWV0cmljR3JvdXA7Cit1c2luZyBEcm1NZXRyaWNHcm91cEhpZGwgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwordXNpbmcgRHJtTWV0cmljQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RHJtTWV0cmljOwordXNpbmcgRHJtTWV0cmljSGlkbCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA6Ok1ldHJpYzsKK3VzaW5nIFZhbHVlSGlkbCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA6OlZhbHVlOwordXNpbmcgQXR0cmlidXRlSGlkbCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA6OkF0dHJpYnV0ZTsKK3VzaW5nIElEcm1QbHVnaW5BaWRsID0gOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpJRHJtUGx1Z2luOwordXNpbmcgRXZlbnRUeXBlQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RXZlbnRUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIGtQcm9wZXJ0eURldmljZVVuaXF1ZUlkW10gPSAiZGV2aWNlVW5pcXVlSWQiOworY29uc3RleHByIGNoYXIga0VxdWFsc1NpZ25bXSA9ICI9IjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b0Jhc2U2NFN0cmluZ05vUGFkKGNvbnN0IFQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgLy8gTm90ZSB0aGF0IHRoZSBiYXNlIDY0IGNvbnZlcnNpb24gb25seSB3b3JrcyB3aXRoIGFycmF5cyBvZiBzaW5nbGUtYnl0ZQorICAgIC8vIHZhbHVlcy4gSWYgdGhlIHNvdXJjZSBpcyBlbXB0eSBvciBpcyBub3QgYW4gYXJyYXkgb2Ygc2luZ2xlLWJ5dGUgdmFsdWVzLAorICAgIC8vIHJldHVybiBlbXB0eSBzdHJpbmcuCisgICAgaWYgKHNpemUgPT0gMCB8fCBzaXplb2YoZGF0YVswXSkgIT0gMSkgeworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgYW5kcm9pZDo6QVN0cmluZyBvdXRwdXRTdHJpbmc7CisgICAgZW5jb2RlQmFzZTY0KGRhdGEsIHNpemUsICZvdXRwdXRTdHJpbmcpOworICAgIC8vIFJlbW92ZSB0cmFpbGluZyBlcXVhbHMgcGFkZGluZyBpZiBpdCBleGlzdHMuCisgICAgd2hpbGUgKG91dHB1dFN0cmluZy5zaXplKCkgPiAwICYmIG91dHB1dFN0cmluZy5lbmRzV2l0aChrRXF1YWxzU2lnbikpIHsKKyAgICAgICAgb3V0cHV0U3RyaW5nLmVyYXNlKG91dHB1dFN0cmluZy5zaXplKCkgLSAxLCAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcob3V0cHV0U3RyaW5nLmNfc3RyKCksIG91dHB1dFN0cmluZy5zaXplKCkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBJTklUX0NIRUNLKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSByZXR1cm4gbUluaXRDaGVjazsgXAorICAgIH0KKwordGVtcGxhdGUgPHR5cGVuYW1lIEJ5dGUgPSB1aW50OF90Pgorc3RhdGljIHN0ZDo6dmVjdG9yPEJ5dGU+IHRvU3RkVmVjKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgdmVjdG9yKSB7CisgICAgYXV0byB2ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBCeXRlKj4odmVjdG9yLmFycmF5KCkpOworICAgIHN0ZDo6dmVjdG9yPEJ5dGU+IHZlYyh2LCB2ICsgdmVjdG9yLnNpemUoKSk7CisgICAgcmV0dXJuIHZlYzsKK30KKworc3RhdGljIGNvbnN0IFZlY3Rvcjx1aW50OF90PiB0b1ZlY3Rvcihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmVjKSB7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHZlY3RvcjsKKyAgICB2ZWN0b3IuYXBwZW5kQXJyYXkodmVjLmRhdGEoKSwgdmVjLnNpemUoKSk7CisgICAgcmV0dXJuICpjb25zdF9jYXN0PGNvbnN0IFZlY3Rvcjx1aW50OF90Pio+KCZ2ZWN0b3IpOworfQorCitzdGF0aWMgU3RyaW5nOCB0b1N0cmluZzgoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZykgeworICAgIHJldHVybiBTdHJpbmc4KHN0cmluZy5jX3N0cigpKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIHRvU3RkU3RyaW5nKGNvbnN0IFN0cmluZzgmIHN0cmluZzgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoc3RyaW5nOC5zdHJpbmcoKSk7Cit9CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gdG9LZXlWYWx1ZVZlY3Rvcihjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYga2V5ZWRWZWN0b3IpIHsKKyAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gc3RkS2V5ZWRWZWN0b3I7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrZXllZFZlY3Rvci5zaXplKCk7IGkrKykgeworICAgICAgICBLZXlWYWx1ZSBrZXlWYWx1ZTsKKyAgICAgICAga2V5VmFsdWUua2V5ID0gdG9TdGRTdHJpbmcoa2V5ZWRWZWN0b3Iua2V5QXQoaSkpOworICAgICAgICBrZXlWYWx1ZS52YWx1ZSA9IHRvU3RkU3RyaW5nKGtleWVkVmVjdG9yLnZhbHVlQXQoaSkpOworICAgICAgICBzdGRLZXllZFZlY3Rvci5wdXNoX2JhY2soa2V5VmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gc3RkS2V5ZWRWZWN0b3I7Cit9CisKK3N0YXRpYyBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiB0b0tleWVkVmVjdG9yKGNvbnN0IHN0ZDo6dmVjdG9yPEtleVZhbHVlPiYga2V5VmFsdWVWZWMpIHsKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBrZXllZFZlY3RvcjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleVZhbHVlVmVjLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGtleWVkVmVjdG9yLmFkZCh0b1N0cmluZzgoa2V5VmFsdWVWZWNbaV0ua2V5KSwgdG9TdHJpbmc4KGtleVZhbHVlVmVjW2ldLnZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiBrZXllZFZlY3RvcjsKK30KKworc3RhdGljIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZShLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSkgeworICAgIHN3aXRjaCAoa2V5UmVxdWVzdFR5cGUpIHsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6SU5JVElBTDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Jbml0aWFsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlJFTkVXQUw6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVuZXdhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpSRUxFQVNFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbGVhc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlVQREFURToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9VcGRhdGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Vbmtub3duOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcHMoY29uc3Qgc3RkOjp2ZWN0b3I8U2VjdXJlU3RvcD4mIGFTZWN1cmVTdG9wcykgeworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFTZWN1cmVTdG9wcy5zaXplKCk7IGkrKykgeworICAgICAgICBzZWN1cmVTdG9wcy5wdXNoX2JhY2sodG9WZWN0b3IoYVNlY3VyZVN0b3BzW2ldLm9wYXF1ZURhdGEpKTsKKyAgICB9CisgICAgcmV0dXJuIHNlY3VyZVN0b3BzOworfQorCitzdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcElkcyhjb25zdCBzdGQ6OnZlY3RvcjxTZWN1cmVTdG9wSWQ+JiBhU2VjdXJlU3RvcElkcykgeworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wSWRzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYVNlY3VyZVN0b3BJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc2VjdXJlU3RvcElkcy5wdXNoX2JhY2sodG9WZWN0b3IoYVNlY3VyZVN0b3BJZHNbaV0uc2VjdXJlU3RvcElkKSk7CisgICAgfQorICAgIHJldHVybiBzZWN1cmVTdG9wSWRzOworfQorCitzdGF0aWMgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgdG9IZGNwTGV2ZWwoSGRjcExldmVsIGxldmVsKSB7CisgICAgc3dpdGNoIChsZXZlbCkgeworICAgICAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9OT05FOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BOb25lOworICAgICAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9WMToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjE7CisgICAgICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YyOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMjsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjJfMToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMTsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjJfMjoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMjsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjJfMzoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMzsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfTk9fT1VUUFVUOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BOb091dHB1dDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOworICAgIH0KK30KKworc3RhdGljIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCB0b1NlY3VyaXR5TGV2ZWwoU2VjdXJpdHlMZXZlbCBsZXZlbCkgeworICAgIHN3aXRjaCAobGV2ZWwpIHsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZTsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZTsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpERUZBVUxUOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxNYXg7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd247CisgICAgfQorfQorCitzdGF0aWMgU2VjdXJpdHlMZXZlbCB0b0FpZGxTZWN1cml0eUxldmVsKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCkgeworICAgIHN3aXRjaCAobGV2ZWwpIHsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVDcnlwdG86CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVEZWNvZGU6CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0RFQ09ERTsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG86CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0NSWVBUTzsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVEZWNvZGU6CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0RFQ09ERTsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVBbGw6CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0FMTDsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsTWF4OgorICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OkRFRkFVTFQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6VU5LTk9XTjsKKyAgICB9Cit9CisKK3N0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9LZXlTZXRJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8S2V5U2V0SWQ+JiBoS2V5U2V0SWRzKSB7CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IGtleVNldElkczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXlTZXRJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoS2V5U2V0SWRzW2ldLmtleVNldElkKSk7CisgICAgfQorICAgIHJldHVybiBrZXlTZXRJZHM7Cit9CisKK3N0YXRpYyBoaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxWZWMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiB2ZWN0b3IpIHsKKyAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWM7CisgICAgdmVjLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90Kj4odmVjdG9yLmFycmF5KCkpLCB2ZWN0b3Iuc2l6ZSgpKTsKKyAgICByZXR1cm4gdmVjOworfQorCitzdGF0aWMgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlIHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZShPZmZsaW5lTGljZW5zZVN0YXRlIGxpY2Vuc2VTdGF0ZSkgeworICAgIHN3aXRjaCAobGljZW5zZVN0YXRlKSB7CisgICAgICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VVNBQkxFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVc2FibGU7CisgICAgICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6SU5BQ1RJVkU6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVJlbGVhc2VkOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworICAgIH0KK30KKworTXV0ZXggRHJtSGFsQWlkbDo6bUxvY2s7CisKK3N0YXRpYyBoaWRsX3ZlYzxEcm1NZXRyaWNHcm91cEhpZGw+IHRvRHJtTWV0cmljR3JvdXBIaWRsKHN0ZDo6dmVjdG9yPERybU1ldHJpY0dyb3VwQWlkbD4gcmVzdWx0KSB7CisgICAgc3RkOjp2ZWN0b3I8RHJtTWV0cmljR3JvdXBIaWRsPiByZXN1bHRIaWRsOworICAgIGZvciAoYXV0byByIDogcmVzdWx0KSB7CisgICAgICAgIERybU1ldHJpY0dyb3VwSGlkbCByZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8RHJtTWV0cmljSGlkbD4gdG1wTWV0cmljOworICAgICAgICBmb3IgKGF1dG8gbSA6IHIubWV0cmljcykgeworICAgICAgICAgICAgRHJtTWV0cmljSGlkbCBtZTsKKyAgICAgICAgICAgIG1lLm5hbWUgPSBtLm5hbWU7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGVIaWRsPiBhVG1wOworICAgICAgICAgICAgZm9yIChhdXRvIGF0dHIgOiBtLmF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGVIaWRsIGF0dHJIaWRsOworICAgICAgICAgICAgICAgIGF0dHJIaWRsLm5hbWUgPSBhdHRyLm5hbWU7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGF0dHIudmFsdWUuZ2V0VGFnKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEcm1NZXRyaWNWYWx1ZTo6VGFnOjppbnQ2NFZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckhpZGwudHlwZSA9IERybU1ldHJpY0dyb3VwSGlkbDo6VmFsdWVUeXBlOjpJTlQ2NF9UWVBFOworICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckhpZGwuaW50NjRWYWx1ZSA9IGF0dHIudmFsdWUuZ2V0PERybU1ldHJpY1ZhbHVlOjpUYWc6OmludDY0VmFsdWU+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEcm1NZXRyaWNWYWx1ZTo6VGFnOjpkb3VibGVWYWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJIaWRsLnR5cGUgPSBEcm1NZXRyaWNHcm91cEhpZGw6OlZhbHVlVHlwZTo6RE9VQkxFX1RZUEU7CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRySGlkbC5kb3VibGVWYWx1ZSA9IGF0dHIudmFsdWUuZ2V0PERybU1ldHJpY1ZhbHVlOjpUYWc6OmRvdWJsZVZhbHVlPigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRHJtTWV0cmljVmFsdWU6OlRhZzo6c3RyaW5nVmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRySGlkbC50eXBlID0gRHJtTWV0cmljR3JvdXBIaWRsOjpWYWx1ZVR5cGU6OlNUUklOR19UWVBFOworICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckhpZGwuc3RyaW5nVmFsdWUgPSBhdHRyLnZhbHVlLmdldDxEcm1NZXRyaWNWYWx1ZTo6VGFnOjpzdHJpbmdWYWx1ZT4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYVRtcC5wdXNoX2JhY2soYXR0ckhpZGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZS5hdHRyaWJ1dGVzID0gYVRtcDsKKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VmFsdWVIaWRsPiB2VG1wOworICAgICAgICAgICAgZm9yIChhdXRvIHZhbHVlIDogbS52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBWYWx1ZUhpZGwgdmFsdWVIaWRsOworICAgICAgICAgICAgICAgIHZhbHVlSGlkbC5jb21wb25lbnROYW1lID0gdmFsdWUubmFtZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLnZhbHVlLmdldFRhZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRHJtTWV0cmljVmFsdWU6OlRhZzo6aW50NjRWYWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSGlkbC50eXBlID0gRHJtTWV0cmljR3JvdXBIaWRsOjpWYWx1ZVR5cGU6OklOVDY0X1RZUEU7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUhpZGwuaW50NjRWYWx1ZSA9IHZhbHVlLnZhbHVlLmdldDxEcm1NZXRyaWNWYWx1ZTo6VGFnOjppbnQ2NFZhbHVlPigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRHJtTWV0cmljVmFsdWU6OlRhZzo6ZG91YmxlVmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUhpZGwudHlwZSA9IERybU1ldHJpY0dyb3VwSGlkbDo6VmFsdWVUeXBlOjpET1VCTEVfVFlQRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSGlkbC5kb3VibGVWYWx1ZSA9IHZhbHVlLnZhbHVlLmdldDxEcm1NZXRyaWNWYWx1ZTo6VGFnOjpkb3VibGVWYWx1ZT4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIERybU1ldHJpY1ZhbHVlOjpUYWc6OnN0cmluZ1ZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVIaWRsLnR5cGUgPSBEcm1NZXRyaWNHcm91cEhpZGw6OlZhbHVlVHlwZTo6U1RSSU5HX1RZUEU7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUhpZGwuc3RyaW5nVmFsdWUgPSB2YWx1ZS52YWx1ZS5nZXQ8RHJtTWV0cmljVmFsdWU6OlRhZzo6c3RyaW5nVmFsdWU+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZUbXAucHVzaF9iYWNrKHZhbHVlSGlkbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lLnZhbHVlcyA9IHZUbXA7CisgICAgICAgICAgICB0bXBNZXRyaWMucHVzaF9iYWNrKG1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlLm1ldHJpY3MgPSB0bXBNZXRyaWM7CisgICAgICAgIHJlc3VsdEhpZGwucHVzaF9iYWNrKHJlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0SGlkbDsKK30KKworLy8gRHJtU2Vzc2lvbkNsaWVudCBEZWZpbml0aW9uCisKK3N0cnVjdCBEcm1IYWxBaWRsOjpEcm1TZXNzaW9uQ2xpZW50IDogcHVibGljIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpCblJlc291cmNlTWFuYWdlckNsaWVudCB7CisgICAgZXhwbGljaXQgRHJtU2Vzc2lvbkNsaWVudChEcm1IYWxBaWRsKiBkcm0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKQorICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwgbURybShkcm0pIHt9CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZWNsYWltUmVzb3VyY2UoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXROYW1lKDo6c3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICBjb25zdCBWZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDsKKworICAgIHZpcnR1YWwgfkRybVNlc3Npb25DbGllbnQoKTsKKworICBwcml2YXRlOgorICAgIHdwPERybUhhbEFpZGw+IG1Ecm07CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1TZXNzaW9uQ2xpZW50KTsKK307CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybUhhbEFpZGw6OkRybVNlc3Npb25DbGllbnQ6OnJlY2xhaW1SZXNvdXJjZShib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdXRvIHNlc3Npb25JZCA9IG1TZXNzaW9uSWQ7CisgICAgc3A8RHJtSGFsQWlkbD4gZHJtID0gbURybS5wcm9tb3RlKCk7CisgICAgaWYgKGRybSA9PSBOVUxMKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSB0cnVlOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHN0YXR1c190IGVyciA9IGRybS0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisgICAgZHJtLT5vbkV2ZW50KEV2ZW50VHlwZUFpZGw6OlNFU1NJT05fUkVDTEFJTUVELCB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgaGlkbF92ZWM8dWludDhfdD4oKSk7CisgICAgKl9haWRsX3JldHVybiA9IHRydWU7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxBaWRsOjpEcm1TZXNzaW9uQ2xpZW50OjpnZXROYW1lKDo6c3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgeworICAgIFN0cmluZzggbmFtZTsKKyAgICBzcDxEcm1IYWxBaWRsPiBkcm0gPSBtRHJtLnByb21vdGUoKTsKKyAgICBpZiAoZHJtID09IE5VTEwpIHsKKyAgICAgICAgbmFtZS5hcHBlbmQoIjxkZWxldGVkPiIpOworICAgIH0gZWxzZSBpZiAoZHJtLT5nZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoInZlbmRvciIpLCBuYW1lKSAhPSBPSyB8fCBuYW1lLmlzRW1wdHkoKSkgeworICAgICAgICBuYW1lLmFwcGVuZCgiPEdldCB2ZW5kb3IgZmFpbGVkIG9yIGlzIGVtcHR5PiIpOworICAgIH0KKyAgICBuYW1lLmFwcGVuZCgiWyIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNlc3Npb25JZC5zaXplKCk7ICsraSkgeworICAgICAgICBuYW1lLmFwcGVuZEZvcm1hdCgiJTAyeCIsIG1TZXNzaW9uSWRbaV0pOworICAgIH0KKyAgICBuYW1lLmFwcGVuZCgiXSIpOworICAgICpfYWlkbF9yZXR1cm4gPSBuYW1lOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworRHJtSGFsQWlkbDo6RHJtU2Vzc2lvbkNsaWVudDo6fkRybVNlc3Npb25DbGllbnQoKSB7CisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW92ZVNlc3Npb24obVNlc3Npb25JZCk7Cit9CisKKy8vIERybUhhbEFpZGwgbWV0aG9kcworRHJtSGFsQWlkbDo6RHJtSGFsQWlkbCgpCisgICAgOiBtTGlzdGVuZXIoOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8RHJtSGFsTGlzdGVuZXI+KCZtTWV0cmljcykpLAorICAgICAgbUZhY3RvcmllcyhEcm1VdGlsczo6bWFrZURybUZhY3Rvcmllc0FpZGwoKSksCisgICAgICBtSW5pdENoZWNrKChtRmFjdG9yaWVzLnNpemUoKSA9PSAwKSA/IEVSUk9SX1VOU1VQUE9SVEVEIDogTk9fSU5JVCkge30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitEcm1IYWxBaWRsOjp+RHJtSGFsQWlkbCgpIHt9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1DbGllbnQ+JiBsaXN0ZW5lcikgeworICAgIG1MaXN0ZW5lci0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsIGJvb2wqIGlzU3VwcG9ydGVkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBVdWlkIHV1aWRBaWRsID0gRHJtVXRpbHM6OnRvQWlkbFV1aWQodXVpZCk7CisgICAgU2VjdXJpdHlMZXZlbCBsZXZlbEFpZGwgPSB0b0FpZGxTZWN1cml0eUxldmVsKGxldmVsKTsKKyAgICBzdGQ6OnN0cmluZyBtaW1lVHlwZVN0ciA9IG1pbWVUeXBlLnN0cmluZygpOworCisgICAgZm9yIChzc2l6ZV90IGkgPSBtRmFjdG9yaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIENyeXB0b1NjaGVtZXMgc2NoZW1lc3t9OworICAgICAgICBhdXRvIGVyciA9IG1GYWN0b3JpZXNbaV0tPmdldFN1cHBvcnRlZENyeXB0b1NjaGVtZXMoJnNjaGVtZXMpOworICAgICAgICBpZiAoIWVyci5pc09rKCkgfHwgIXN0ZDo6Y291bnQoc2NoZW1lcy51dWlkcy5iZWdpbigpLCBzY2hlbWVzLnV1aWRzLmVuZCgpLCB1dWlkQWlkbCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoInN1cHBvcnRlZCBzY2hlbWVzOiAlczsgcXVlcnk6IGxldmVsICVkIG1pbWUgJXMiLAorICAgICAgICAgICAgICBzY2hlbWVzLnRvU3RyaW5nKCkuY19zdHIoKSwgbGV2ZWxBaWRsLCBtaW1lVHlwZS5jX3N0cigpKTsKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFN1cHBvcnRlZENvbnRlbnRUeXBlPiBjb250ZW50VHlwZXM7CisgICAgICAgIGZvciAoYXV0byBjdCA6IHNjaGVtZXMubWltZVR5cGVzKSB7CisgICAgICAgICAgICBjb250ZW50VHlwZXNbY3QubWltZV0gPSBjdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlIGNhc2VzCisgICAgICAgIGlmIChsZXZlbEFpZGwgPT0gU2VjdXJpdHlMZXZlbDo6REVGQVVMVCB8fCBsZXZlbEFpZGwgPT0gU2VjdXJpdHlMZXZlbDo6VU5LTk9XTikgeworICAgICAgICAgICAgaWYgKG1pbWVUeXBlID09ICIiKSB7CisgICAgICAgICAgICAgICAgLy8gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkKKyAgICAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSkKKyAgICAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBjb250ZW50VHlwZXMuY291bnQobWltZVR5cGVTdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9IGVsc2UgaWYgKG1pbWVUeXBlID09ICIiKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBjdCA9IGNvbnRlbnRUeXBlc1ttaW1lVHlwZVN0cl07CisgICAgICAgIGlmIChsZXZlbEFpZGwgPiBjdC5tYXhMZXZlbCB8fCBsZXZlbEFpZGwgPCBjdC5taW5MZXZlbCkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6Y3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIFV1aWQgdXVpZEFpZGwgPSBEcm1VdGlsczo6dG9BaWRsVXVpZCh1dWlkKTsKKyAgICBzdGQ6OnN0cmluZyBhcHBQYWNrYWdlTmFtZUFpZGwgPSB0b1N0ZFN0cmluZyhhcHBQYWNrYWdlTmFtZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPElEcm1QbHVnaW5BaWRsPiBwbHVnaW5BaWRsOworICAgIG1NZXRyaWNzLlNldEFwcFBhY2thZ2VOYW1lKGFwcFBhY2thZ2VOYW1lKTsKKyAgICBtTWV0cmljcy5TZXRBcHBVaWQoQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICBmb3IgKHNzaXplX3QgaSA9IG1GYWN0b3JpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBtRmFjdG9yaWVzW2ldLT5jcmVhdGVEcm1QbHVnaW4odXVpZEFpZGwsIGFwcFBhY2thZ2VOYW1lQWlkbCwgJnBsdWdpbkFpZGwpOworICAgICAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgaWYgKHBsdWdpbkFpZGwgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1QbHVnaW4gPSBwbHVnaW5BaWRsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSh1dWlkLCAiRmFpbGVkIHRvIG1ha2UgZHJtIHBsdWdpbjogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVBsdWdpbiA9PSBOVUxMKSB7CisgICAgICAgIERybVV0aWxzOjpMT0cyQkUodXVpZCwgIk5vIHN1cHBvcnRlZCBoYWwgaW5zdGFuY2UgZm91bmQiKTsKKyAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICAgICAgLy8gU3RvcmVkIHBvaW50ZXIgbUxpc3RlbmVyIHVwY2FzdCB0byBiYXNlIEJuRHJtUGx1Z2luTGlzdGVuZXIKKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbgorICAgICAgICAgICAgLT5zZXRMaXN0ZW5lcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Qm5Ecm1QbHVnaW5MaXN0ZW5lcj4obUxpc3RlbmVyKSk7CisgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgICAgICAgICAgQUxPR0UoInNldExpc3RlbmVyIGZhaWxlZDogZXggJWQgc3ZjIGVyciAlZCIsCisgICAgICAgICAgICAgICAgc3RhdHVzLmdldEV4Y2VwdGlvbkNvZGUoKSwKKyAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICAgICAgbVBsdWdpbi5yZXNldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6Om9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIFNlY3VyaXR5TGV2ZWwgYVNlY3VyaXR5TGV2ZWwgPSB0b0FpZGxTZWN1cml0eUxldmVsKGxldmVsKTsKKworICAgIGlmIChhU2VjdXJpdHlMZXZlbCA9PSBTZWN1cml0eUxldmVsOjpVTktOT1dOKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIGJvb2wgcmV0cnkgPSB0cnVlOworICAgIGRvIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYVNlc3Npb25JZDsKKworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5vcGVuU2Vzc2lvbihhU2VjdXJpdHlMZXZlbCwgJmFTZXNzaW9uSWQpOworICAgICAgICBpZiAoc3RhdHVzLmlzT2soKSkgc2Vzc2lvbklkID0gdG9WZWN0b3IoYVNlc3Npb25JZCk7CisgICAgICAgIGVyciA9IHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKKworICAgICAgICBpZiAoZXJyID09IEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZICYmIHJldHJ5KSB7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIC8vIHJlY2xhaW1TZXNzaW9uIG1heSBjYWxsIGJhY2sgdG8gY2xvc2VTZXNzaW9uLCBzaW5jZSBtTG9jayBpcworICAgICAgICAgICAgLy8gc2hhcmVkIGJldHdlZW4gRHJtIGluc3RhbmNlcywgd2Ugc2hvdWxkIHVubG9jayBoZXJlIHRvIGF2b2lkCisgICAgICAgICAgICAvLyBkZWFkbG9jay4KKyAgICAgICAgICAgIHJldHJ5ID0gRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlY2xhaW1TZXNzaW9uKEFJQmluZGVyX2dldENhbGxpbmdQaWQoKSk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXRyeSA9IGZhbHNlOworICAgICAgICB9CisgICAgfSB3aGlsZSAocmV0cnkpOworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RHJtU2Vzc2lvbkNsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgICAgICBuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8RHJtU2Vzc2lvbkNsaWVudD4odGhpcywgc2Vzc2lvbklkKTsKKyAgICAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPmFkZFNlc3Npb24oCisgICAgICAgICAgICAgICAgQUlCaW5kZXJfZ2V0Q2FsbGluZ1BpZCgpLCBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8SVJlc291cmNlTWFuYWdlckNsaWVudD4oY2xpZW50KSwKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgICAgICBtT3BlblNlc3Npb25zLnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICBtTWV0cmljcy5TZXRTZXNzaW9uU3RhcnQoc2Vzc2lvbklkKTsKKyAgICB9CisKKyAgICBtTWV0cmljcy5tT3BlblNlc3Npb25Db3VudGVyLkluY3JlbWVudChlcnIpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmNsb3NlU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkQWlkbCA9IHRvU3RkVmVjKHNlc3Npb25JZCk7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZEFpZGwpOworICAgIHN0YXR1c190IHJlc3BvbnNlID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZW1vdmVTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgIGZvciAoYXV0byBpID0gbU9wZW5TZXNzaW9ucy5iZWdpbigpOyBpICE9IG1PcGVuU2Vzc2lvbnMuZW5kKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGlzRXF1YWxTZXNzaW9uSWQoKCppKS0+bVNlc3Npb25JZCwgc2Vzc2lvbklkKSkgeworICAgICAgICAgICAgICAgIG1PcGVuU2Vzc2lvbnMuZXJhc2UoaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtTWV0cmljcy5TZXRTZXNzaW9uRW5kKHNlc3Npb25JZCk7CisgICAgfQorCisgICAgbU1ldHJpY3MubUNsb3NlU2Vzc2lvbkNvdW50ZXIuSW5jcmVtZW50KHJlc3BvbnNlKTsKKyAgICByZXR1cm4gcmVzcG9uc2U7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5pdERhdGEsIFN0cmluZzggY29uc3QmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OktleVR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gY29uc3QmIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlKiBrZXlSZXF1ZXN0VHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlcXVlc3RUaW1lcigmbU1ldHJpY3MubUdldEtleVJlcXVlc3RUaW1lVXMpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIEtleVR5cGUgYUtleVR5cGU7CisgICAgaWYgKGtleVR5cGUgPT0gRHJtUGx1Z2luOjprS2V5VHlwZV9TdHJlYW1pbmcpIHsKKyAgICAgICAgYUtleVR5cGUgPSBLZXlUeXBlOjpTVFJFQU1JTkc7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfT2ZmbGluZSkgeworICAgICAgICBhS2V5VHlwZSA9IEtleVR5cGU6Ok9GRkxJTkU7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfUmVsZWFzZSkgeworICAgICAgICBhS2V5VHlwZSA9IEtleVR5cGU6OlJFTEVBU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAga2V5UmVxdWVzdFRpbWVyLlNldEF0dHJpYnV0ZShCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWRBaWRsID0gdG9TdGRWZWMoc2Vzc2lvbklkKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpbml0RGF0YUFpZGwgPSB0b1N0ZFZlYyhpbml0RGF0YSk7CisgICAgS2V5UmVxdWVzdCBrZXlSZXF1ZXN0OworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgIG1QbHVnaW4tPmdldEtleVJlcXVlc3Qoc2Vzc2lvbklkQWlkbCwgaW5pdERhdGFBaWRsLCB0b1N0ZFN0cmluZyhtaW1lVHlwZSksIGFLZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0tleVZhbHVlVmVjdG9yKG9wdGlvbmFsUGFyYW1ldGVycyksICZrZXlSZXF1ZXN0KTsKKyAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3Ioa2V5UmVxdWVzdC5yZXF1ZXN0KTsKKyAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChrZXlSZXF1ZXN0LmRlZmF1bHRVcmwpOworICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlKGtleVJlcXVlc3QucmVxdWVzdFR5cGUpOworICAgIH0KKworICAgIGVyciA9IHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICBrZXlSZXF1ZXN0VGltZXIuU2V0QXR0cmlidXRlKGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlc3BvbnNlVGltZXIoJm1NZXRyaWNzLm1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWRBaWRsID0gdG9TdGRWZWMoc2Vzc2lvbklkKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXNwb25zZUFpZGwgPSB0b1N0ZFZlYyhyZXNwb25zZSk7CisgICAgS2V5U2V0SWQga2V5U2V0SWRzQWlkbDsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPQorICAgICAgICAgICAgbVBsdWdpbi0+cHJvdmlkZUtleVJlc3BvbnNlKHNlc3Npb25JZEFpZGwsIHJlc3BvbnNlQWlkbCwgJmtleVNldElkc0FpZGwpOworCisgICAgaWYgKHN0YXR1cy5pc09rKCkpIGtleVNldElkID0gdG9WZWN0b3Ioa2V5U2V0SWRzQWlkbC5rZXlTZXRJZCk7CisgICAgZXJyID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworICAgIGtleVJlc3BvbnNlVGltZXIuU2V0QXR0cmlidXRlKGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5yZW1vdmVLZXlzKHRvU3RkVmVjKGtleVNldElkKSk7CisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cmVzdG9yZUtleXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCisgICAgS2V5U2V0SWQga2V5U2V0SWRzQWlkbDsKKyAgICBrZXlTZXRJZHNBaWRsLmtleVNldElkID0gdG9TdGRWZWMoa2V5U2V0SWQpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPnJlc3RvcmVLZXlzKHRvU3RkVmVjKHNlc3Npb25JZCksIGtleVNldElkc0FpZGwpOworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gaW5mb01hcEFpZGw7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+cXVlcnlLZXlTdGF0dXModG9TdGRWZWMoc2Vzc2lvbklkKSwgJmluZm9NYXBBaWRsKTsKKworICAgIGluZm9NYXAgPSB0b0tleWVkVmVjdG9yKGluZm9NYXBBaWRsKTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldFByb3Zpc2lvblJlcXVlc3QoU3RyaW5nOCBjb25zdCYgY2VydFR5cGUsIFN0cmluZzggY29uc3QmIGNlcnRBdXRob3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgcmVxdWVzdCwgU3RyaW5nOCYgZGVmYXVsdFVybCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFByb3Zpc2lvblJlcXVlc3QgcmVxdWVzdEFpZGw7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0UHJvdmlzaW9uUmVxdWVzdCgKKyAgICAgICAgICAgIHRvU3RkU3RyaW5nKGNlcnRUeXBlKSwgdG9TdGRTdHJpbmcoY2VydEF1dGhvcml0eSksICZyZXF1ZXN0QWlkbCk7CisKKyAgICByZXF1ZXN0ID0gdG9WZWN0b3IocmVxdWVzdEFpZGwucmVxdWVzdCk7CisgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChyZXF1ZXN0QWlkbC5kZWZhdWx0VXJsKTsKKworICAgIGVyciA9IHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICBtTWV0cmljcy5tR2V0UHJvdmlzaW9uUmVxdWVzdENvdW50ZXIuSW5jcmVtZW50KGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHdyYXBwZWRLZXkpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisgICAgUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlUmVzdWx0IHJlc3VsdDsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5wcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UodG9TdGRWZWMocmVzcG9uc2UpLCAmcmVzdWx0KTsKKworICAgIGNlcnRpZmljYXRlID0gdG9WZWN0b3IocmVzdWx0LmNlcnRpZmljYXRlKTsKKyAgICB3cmFwcGVkS2V5ID0gdG9WZWN0b3IocmVzdWx0LndyYXBwZWRLZXkpOworICAgIGVyciA9IHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICBtTWV0cmljcy5tUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlci5JbmNyZW1lbnQoZXJyKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4mIHNlY3VyZVN0b3BzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxTZWN1cmVTdG9wPiByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0U2VjdXJlU3RvcHMoJnJlc3VsdCk7CisKKyAgICBzZWN1cmVTdG9wcyA9IHRvU2VjdXJlU3RvcHMocmVzdWx0KTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldFNlY3VyZVN0b3BJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+JiBzZWN1cmVTdG9wSWRzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxTZWN1cmVTdG9wSWQ+IHJlc3VsdDsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5nZXRTZWN1cmVTdG9wSWRzKCZyZXN1bHQpOworCisgICAgc2VjdXJlU3RvcElkcyA9IHRvU2VjdXJlU3RvcElkcyhyZXN1bHQpOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6Z2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQsIFZlY3Rvcjx1aW50OF90PiYgc2VjdXJlU3RvcCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgU2VjdXJlU3RvcElkIHNzaWRBaWRsOworICAgIHNzaWRBaWRsLnNlY3VyZVN0b3BJZCA9IHRvU3RkVmVjKHNzaWQpOworCisgICAgU2VjdXJlU3RvcCByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0U2VjdXJlU3RvcChzc2lkQWlkbCwgJnJlc3VsdCk7CisKKyAgICBzZWN1cmVTdG9wID0gdG9WZWN0b3IocmVzdWx0Lm9wYXF1ZURhdGEpOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc3NSZWxlYXNlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBPcGFxdWVEYXRhIHNzSWQ7CisgICAgc3NJZC5vcGFxdWVEYXRhID0gdG9TdGRWZWMoc3NSZWxlYXNlKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5yZWxlYXNlU2VjdXJlU3RvcHMoc3NJZCk7CisKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpyZW1vdmVTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc3NpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBTZWN1cmVTdG9wSWQgc3NpZEFpZGw7CisgICAgc3NpZEFpZGwuc2VjdXJlU3RvcElkID0gdG9TdGRWZWMoc3NpZCk7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+cmVtb3ZlU2VjdXJlU3RvcChzc2lkQWlkbCk7CisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5yZWxlYXNlQWxsU2VjdXJlU3RvcHMoKTsKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRIZGNwTGV2ZWxzKERybVBsdWdpbjo6SGRjcExldmVsKiBjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsKiBtYXgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIGlmIChjb25uZWN0ZWQgPT0gTlVMTCB8fCBtYXggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgICpjb25uZWN0ZWQgPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOworICAgICptYXggPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOworCisgICAgSGRjcExldmVscyBsdmxzQWlkbDsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5nZXRIZGNwTGV2ZWxzKCZsdmxzQWlkbCk7CisKKyAgICAqY29ubmVjdGVkID0gdG9IZGNwTGV2ZWwobHZsc0FpZGwuY29ubmVjdGVkTGV2ZWwpOworICAgICptYXggPSB0b0hkY3BMZXZlbChsdmxzQWlkbC5tYXhMZXZlbCk7CisKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXROdW1iZXJPZlNlc3Npb25zKHVpbnQzMl90KiBvcGVuLCB1aW50MzJfdCogbWF4KSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBpZiAob3BlbiA9PSBOVUxMIHx8IG1heCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKm9wZW4gPSAwOworICAgICptYXggPSAwOworCisgICAgTnVtYmVyT2ZTZXNzaW9ucyByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0TnVtYmVyT2ZTZXNzaW9ucygmcmVzdWx0KTsKKworICAgICpvcGVuID0gcmVzdWx0LmN1cnJlbnRTZXNzaW9uczsKKyAgICAqbWF4ID0gcmVzdWx0Lm1heFNlc3Npb25zOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6Z2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsKiBsZXZlbCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgaWYgKGxldmVsID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqbGV2ZWwgPSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93bjsKKworICAgIFNlY3VyaXR5TGV2ZWwgcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPmdldFNlY3VyaXR5TGV2ZWwodG9TdGRWZWMoc2Vzc2lvbklkKSwgJnJlc3VsdCk7CisKKyAgICAqbGV2ZWwgPSB0b1NlY3VyaXR5TGV2ZWwocmVzdWx0KTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYga2V5U2V0SWRzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxLZXlTZXRJZD4gcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKCZyZXN1bHQpOworCisgICAga2V5U2V0SWRzID0gdG9LZXlTZXRJZHMocmVzdWx0KTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5U2V0SWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIEtleVNldElkIGtleVNldElkQWlkbDsKKyAgICBrZXlTZXRJZEFpZGwua2V5U2V0SWQgPSB0b1N0ZFZlYyhrZXlTZXRJZCk7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+cmVtb3ZlT2ZmbGluZUxpY2Vuc2Uoa2V5U2V0SWRBaWRsKTsKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRPZmZsaW5lTGljZW5zZVN0YXRlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5U2V0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSogbGljZW5zZVN0YXRlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIElOSVRfQ0hFQ0soKTsKKyAgICAqbGljZW5zZVN0YXRlID0gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVua25vd247CisKKyAgICBLZXlTZXRJZCBrZXlTZXRJZEFpZGw7CisgICAga2V5U2V0SWRBaWRsLmtleVNldElkID0gdG9TdGRWZWMoa2V5U2V0SWQpOworCisgICAgT2ZmbGluZUxpY2Vuc2VTdGF0ZSByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShrZXlTZXRJZEFpZGwsICZyZXN1bHQpOworCisgICAgKmxpY2Vuc2VTdGF0ZSA9IHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZShyZXN1bHQpOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKG5hbWUsIHZhbHVlKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6Z2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4IGNvbnN0JiBuYW1lLCBTdHJpbmc4JiB2YWx1ZSkgY29uc3QgeworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgaW50ZXJuYWwgdG8gdGhlIGNsYXNzIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUKKyAgICAvLyBtTG9jayBpcyBhbHJlYWR5IGhlbGQuCisgICAgSU5JVF9DSEVDSygpOworCisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPmdldFByb3BlcnR5U3RyaW5nKHRvU3RkU3RyaW5nKG5hbWUpLCAmcmVzdWx0KTsKKworICAgIHZhbHVlID0gdG9TdHJpbmc4KHJlc3VsdCk7CisKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0JiBuYW1lLCBWZWN0b3I8dWludDhfdD4mIHZhbHVlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChuYW1lLCB2YWx1ZSk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgY29uc3QgeworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgaW50ZXJuYWwgdG8gdGhlIGNsYXNzIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUKKyAgICAvLyBtTG9jayBpcyBhbHJlYWR5IGhlbGQuCisgICAgSU5JVF9DSEVDSygpOworCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlc3VsdDsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5nZXRQcm9wZXJ0eUJ5dGVBcnJheSh0b1N0ZFN0cmluZyhuYW1lKSwgJnJlc3VsdCk7CisKKyAgICB2YWx1ZSA9IHRvVmVjdG9yKHJlc3VsdCk7CisgICAgZXJyID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworICAgIGlmIChuYW1lID09IGtQcm9wZXJ0eURldmljZVVuaXF1ZUlkKSB7CisgICAgICAgIG1NZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KGVycik7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QmIG5hbWUsIFN0cmluZzggY29uc3QmIHZhbHVlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5zZXRQcm9wZXJ0eVN0cmluZyh0b1N0ZFN0cmluZyhuYW1lKSwgdG9TdGRTdHJpbmcodmFsdWUpKTsKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpzZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0JiBuYW1lLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIHZhbHVlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5zZXRQcm9wZXJ0eUJ5dGVBcnJheSh0b1N0ZFN0cmluZyhuYW1lKSwgdG9TdGRWZWModmFsdWUpKTsKKyAgICByZXR1cm4gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRNZXRyaWNzKGNvbnN0IHNwPElEcm1NZXRyaWNzQ29uc3VtZXI+JiBjb25zdW1lcikgeworICAgIGlmIChjb25zdW1lciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBVTkVYUEVDVEVEX05VTEw7CisgICAgfQorICAgIGNvbnN1bWVyLT5jb25zdW1lRnJhbWV3b3JrTWV0cmljcyhtTWV0cmljcyk7CisKKyAgICAvLyBBcHBlbmQgdmVuZG9yIG1ldHJpY3MgaWYgdGhleSBhcmUgc3VwcG9ydGVkLgorCisgICAgU3RyaW5nOCB2ZW5kb3I7CisgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKKyAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKSAhPSBPSyB8fCB2ZW5kb3IuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJHZXQgdmVuZG9yIGZhaWxlZCBvciBpcyBlbXB0eSIpOworICAgICAgICB2ZW5kb3IgPSAiTk9ORSI7CisgICAgfQorICAgIGlmIChnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKSAhPSBPSyB8fAorICAgICAgICBkZXNjcmlwdGlvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIkdldCBkZXNjcmlwdGlvbiBmYWlsZWQgb3IgaXMgZW1wdHkuIik7CisgICAgICAgIGRlc2NyaXB0aW9uID0gIk5PTkUiOworICAgIH0KKyAgICB2ZW5kb3IgKz0gIi4iOworICAgIHZlbmRvciArPSBkZXNjcmlwdGlvbjsKKworICAgIGhpZGxfdmVjPERybU1ldHJpY0dyb3VwSGlkbD4gcGx1Z2luTWV0cmljczsKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgc3RkOjp2ZWN0b3I8RHJtTWV0cmljR3JvdXBBaWRsPiByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+Z2V0TWV0cmljcygmcmVzdWx0KTsKKworICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHBsdWdpbk1ldHJpY3MgPSB0b0RybU1ldHJpY0dyb3VwSGlkbChyZXN1bHQpOworICAgICAgICBjb25zdW1lci0+Y29uc3VtZUhpZGxNZXRyaWNzKHZlbmRvciwgcGx1Z2luTWV0cmljcyk7CisgICAgfQorCisgICAgZXJyID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6c2V0Q2lwaGVyQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QmIGFsZ29yaXRobSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9CisgICAgICAgICAgICBtUGx1Z2luLT5zZXRDaXBoZXJBbGdvcml0aG0odG9TdGRWZWMoc2Vzc2lvbklkKSwgdG9TdGRTdHJpbmcoYWxnb3JpdGhtKSk7CisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6c2V0TWFjQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBTdHJpbmc4IGNvbnN0JiBhbGdvcml0aG0pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPQorICAgICAgICAgICAgbVBsdWdpbi0+c2V0TWFjQWxnb3JpdGhtKHRvU3RkVmVjKHNlc3Npb25JZCksIHRvU3RkU3RyaW5nKGFsZ29yaXRobSkpOworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmVuY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5wdXQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPmVuY3J5cHQodG9TdGRWZWMoc2Vzc2lvbklkKSwgdG9TdGRWZWMoa2V5SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdGRWZWMoaW5wdXQpLCB0b1N0ZFZlYyhpdiksICZyZXN1bHQpOworCisgICAgb3V0cHV0ID0gdG9WZWN0b3IocmVzdWx0KTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmRlY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5wdXQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPmRlY3J5cHQodG9TdGRWZWMoc2Vzc2lvbklkKSwgdG9TdGRWZWMoa2V5SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdGRWZWMoaW5wdXQpLCB0b1N0ZFZlYyhpdiksICZyZXN1bHQpOworCisgICAgb3V0cHV0ID0gdG9WZWN0b3IocmVzdWx0KTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnNpZ24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXN1bHQ7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgIG1QbHVnaW4tPnNpZ24odG9TdGRWZWMoc2Vzc2lvbklkKSwgdG9TdGRWZWMoa2V5SWQpLCB0b1N0ZFZlYyhtZXNzYWdlKSwgJnJlc3VsdCk7CisKKyAgICBzaWduYXR1cmUgPSB0b1ZlY3RvcihyZXN1bHQpOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6dmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgbWF0Y2gpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT52ZXJpZnkodG9TdGRWZWMoc2Vzc2lvbklkKSwgdG9TdGRWZWMoa2V5SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0ZFZlYyhtZXNzYWdlKSwgdG9TdGRWZWMoc2lnbmF0dXJlKSwgJm1hdGNoKTsKKworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OnNpZ25SU0EoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFN0cmluZzggY29uc3QmIGFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBtZXNzYWdlLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIHdyYXBwZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgc2lnbmF0dXJlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzdWx0OworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9CisgICAgICAgICAgICBtUGx1Z2luLT5zaWduUlNBKHRvU3RkVmVjKHNlc3Npb25JZCksIHRvU3RkU3RyaW5nKGFsZ29yaXRobSksIHRvU3RkVmVjKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0ZFZlYyh3cmFwcGVkS2V5KSwgJnJlc3VsdCk7CisKKyAgICBzaWduYXR1cmUgPSB0b1ZlY3RvcihyZXN1bHQpOworCisgICAgcmV0dXJuIHN0YXR1c0FpZGxUb1N0YXR1c1Qoc3RhdHVzKTsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIqIG1pbWUsIGJvb2wqIHJlcXVpcmVkKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGQ6OnN0cmluZyBtaW1lQWlkbChtaW1lKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPQorICAgICAgICBtUGx1Z2luLT5yZXF1aXJlc1NlY3VyZURlY29kZXIobWltZUFpZGwsIFNlY3VyaXR5TGV2ZWw6OkRFRkFVTFQsIHJlcXVpcmVkKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSgicmVxdWlyZXNTZWN1cmVEZWNvZGVyIHR4biBmYWlsZWQ6ICVkIiwgc3RhdHVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpyZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciogbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmVxdWlyZWQpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIGF1dG8gYUxldmVsID0gdG9BaWRsU2VjdXJpdHlMZXZlbChzZWN1cml0eUxldmVsKTsKKyAgICBzdGQ6OnN0cmluZyBtaW1lQWlkbChtaW1lKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5yZXF1aXJlc1NlY3VyZURlY29kZXIobWltZUFpZGwsIGFMZXZlbCwgcmVxdWlyZWQpOworCisgICAgc3RhdHVzX3QgZXJyID0gc3RhdHVzQWlkbFRvU3RhdHVzVChzdGF0dXMpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBEcm1VdGlsczo6TE9HMkJFKCJyZXF1aXJlc1NlY3VyZURlY29kZXIgdHhuIGZhaWxlZDogJWQiLCBzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsQWlkbDo6c2V0UGxheWJhY2tJZChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgY29uc3QgY2hhciogcGxheWJhY2tJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworICAgIHN0ZDo6c3RyaW5nIHBsYXliYWNrSWRBaWRsKHBsYXliYWNrSWQpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IG1QbHVnaW4tPnNldFBsYXliYWNrSWQodG9TdGRWZWMoc2Vzc2lvbklkKSwgcGxheWJhY2tJZEFpZGwpOworICAgIHJldHVybiBzdGF0dXNBaWRsVG9TdGF0dXNUKHN0YXR1cyk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmdldExvZ01lc3NhZ2VzKFZlY3Rvcjxkcm06OlYxXzQ6OkxvZ01lc3NhZ2U+JiBsb2dzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gRHJtVXRpbHM6OkdldExvZ01lc3NhZ2VzQWlkbDxJRHJtUGx1Z2luQWlkbD4obVBsdWdpbiwgbG9ncyk7Cit9CisKK3ZvaWQgRHJtSGFsQWlkbDo6Y2xvc2VPcGVuU2Vzc2lvbnMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBhdXRvIG9wZW5TZXNzaW9ucyA9IG1PcGVuU2Vzc2lvbnM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIGNsb3NlU2Vzc2lvbihvcGVuU2Vzc2lvbnNbaV0tPm1TZXNzaW9uSWQpOworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgfQorICAgIG1PcGVuU2Vzc2lvbnMuY2xlYXIoKTsKK30KKworc3RkOjpzdHJpbmcgRHJtSGFsQWlkbDo6cmVwb3J0UGx1Z2luTWV0cmljcygpIGNvbnN0IHsKKyAgICBWZWN0b3I8dWludDhfdD4gbWV0cmljc1ZlY3RvcjsKKyAgICBTdHJpbmc4IHZlbmRvcjsKKyAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOworICAgIHN0ZDo6c3RyaW5nIG1ldHJpY3NTdHJpbmc7CisgICAgaWYgKGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcikgPT0gT0sgJiYKKyAgICAgICAgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbikgPT0gT0sgJiYKKyAgICAgICAgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4KCJtZXRyaWNzIiksIG1ldHJpY3NWZWN0b3IpID09IE9LKSB7CisgICAgICAgIG1ldHJpY3NTdHJpbmcgPSB0b0Jhc2U2NFN0cmluZ05vUGFkKG1ldHJpY3NWZWN0b3IuYXJyYXkoKSwgbWV0cmljc1ZlY3Rvci5zaXplKCkpOworICAgICAgICBzdGF0dXNfdCByZXMgPSBhbmRyb2lkOjpyZXBvcnREcm1QbHVnaW5NZXRyaWNzKG1ldHJpY3NTdHJpbmcsIHZlbmRvciwgZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1ldHJpY3MuR2V0QXBwVWlkKCkpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiTWV0cmljcyB3ZXJlIHJldHJpZXZlZCBidXQgY291bGQgbm90IGJlIHJlcG9ydGVkOiAlZCIsIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1ldHJpY3NTdHJpbmc7Cit9CisKK3N0ZDo6c3RyaW5nIERybUhhbEFpZGw6OnJlcG9ydEZyYW1ld29ya01ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbk1ldHJpY3MpIGNvbnN0IHsKKyAgICBtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaXRlbShtZWRpYW1ldHJpY3NfY3JlYXRlKCJtZWRpYWRybSIpKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0VWlkKGl0ZW0sIG1NZXRyaWNzLkdldEFwcFVpZCgpKTsKKyAgICBTdHJpbmc4IHZlbmRvcjsKKyAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOworICAgIHN0YXR1c190IHJlc3VsdCA9IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcik7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB2ZW5kb3IgZnJvbSBkcm0gcGx1Z2luOiAlZCIsIHJlc3VsdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcoaXRlbSwgInZlbmRvciIsIHZlbmRvci5jX3N0cigpKTsKKyAgICB9CisgICAgcmVzdWx0ID0gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbik7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBkZXNjcmlwdGlvbiBmcm9tIGRybSBwbHVnaW46ICVkIiwgcmVzdWx0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhpdGVtLCAiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbi5jX3N0cigpKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkTWV0cmljczsKKyAgICByZXN1bHQgPSBtTWV0cmljcy5HZXRTZXJpYWxpemVkTWV0cmljcygmc2VyaWFsaXplZE1ldHJpY3MpOworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXJpYWxpemUgZnJhbWV3b3JrIG1ldHJpY3M6ICVkIiwgcmVzdWx0KTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgYjY0RW5jb2RlZE1ldHJpY3MgPQorICAgICAgICAgICAgdG9CYXNlNjRTdHJpbmdOb1BhZChzZXJpYWxpemVkTWV0cmljcy5kYXRhKCksIHNlcmlhbGl6ZWRNZXRyaWNzLnNpemUoKSk7CisgICAgaWYgKCFiNjRFbmNvZGVkTWV0cmljcy5lbXB0eSgpKSB7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKGl0ZW0sICJzZXJpYWxpemVkX21ldHJpY3MiLCBiNjRFbmNvZGVkTWV0cmljcy5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKCFwbHVnaW5NZXRyaWNzLmVtcHR5KCkpIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcoaXRlbSwgInBsdWdpbl9tZXRyaWNzIiwgcGx1Z2luTWV0cmljcy5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKCFtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZChpdGVtKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlbGYgcmVjb3JkIGZyYW1ld29yayBtZXRyaWNzIik7CisgICAgfQorICAgIG1lZGlhbWV0cmljc19kZWxldGUoaXRlbSk7CisgICAgcmV0dXJuIHNlcmlhbGl6ZWRNZXRyaWNzOworfQorCitzdGF0dXNfdCBEcm1IYWxBaWRsOjpnZXRTdXBwb3J0ZWRTY2hlbWVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZzY2hlbWVzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtRmFjdG9yaWVzLmVtcHR5KCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBDcnlwdG9TY2hlbWVzIGN1clNjaGVtZXN7fTsKKyAgICAgICAgYXV0byBlcnIgPSBtRmFjdG9yaWVzW2ldLT5nZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKCZjdXJTY2hlbWVzKTsKKyAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byB1dWlkT2JqIDogY3VyU2NoZW1lcy51dWlkcykgeworICAgICAgICAgICAgc2NoZW1lcy5pbnNlcnQoc2NoZW1lcy5lbmQoKSwgdXVpZE9iai51dWlkLmJlZ2luKCksIHV1aWRPYmoudXVpZC5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgRHJtSGFsQWlkbDo6Y2xlYW51cCgpIHsKKyAgICBjbG9zZU9wZW5TZXNzaW9ucygpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXBvcnRGcmFtZXdvcmtNZXRyaWNzKHJlcG9ydFBsdWdpbk1ldHJpY3MoKSk7CisKKyAgICBzZXRMaXN0ZW5lcihOVUxMKTsKKyAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKKyAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIoTlVMTCkuaXNPaygpKSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtUGx1Z2luLnJlc2V0KCk7Cit9CisKK3N0YXR1c190IERybUhhbEFpZGw6OmRlc3Ryb3lQbHVnaW4oKSB7CisgICAgY2xlYW51cCgpOworICAgIHJldHVybiBPSzsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtSGFsQWlkbDo6b25FdmVudChFdmVudFR5cGVBaWRsIGV2ZW50VHlwZUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKSB7CisgICAgcmV0dXJuIG1MaXN0ZW5lci0+b25FdmVudChldmVudFR5cGVBaWRsLCBzZXNzaW9uSWQsIGRhdGEpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxBaWRsOjpvbkV4cGlyYXRpb25VcGRhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKSB7CisgICAgcmV0dXJuIG1MaXN0ZW5lci0+b25FeHBpcmF0aW9uVXBkYXRlKHNlc3Npb25JZCwgZXhwaXJ5VGltZUluTVMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxBaWRsOjpvbktleXNDaGFuZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxLZXlTdGF0dXM+JiBrZXlTdGF0dXNMaXN0QWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc05ld1VzYWJsZUtleSkgeworICAgIHJldHVybiBtTGlzdGVuZXItPm9uS2V5c0NoYW5nZShzZXNzaW9uSWQsIGtleVN0YXR1c0xpc3RBaWRsLCBoYXNOZXdVc2FibGVLZXkpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxBaWRsOjpvblNlc3Npb25Mb3N0U3RhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIHJldHVybiBtTGlzdGVuZXItPm9uU2Vzc2lvbkxvc3RTdGF0ZShzZXNzaW9uSWQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9Ecm1IYWxIaWRsLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzhkYmVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0RybUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMTUzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRHJtSGFsSGlkbCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblJlc291cmNlTWFuYWdlckNsaWVudC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjMvSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0V2ZW50TWV0cmljLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzLmg+CisjaW5jbHVkZSA8bWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oPgorI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1IYWxIaWRsLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtTWV0cmljc0NvbnN1bWVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6RHJtVXRpbHM6OnRvU3RhdHVzVDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7Cit1c2luZyA6OmFuZHJvaWQ6Om9zOjpQZXJzaXN0YWJsZUJ1bmRsZTsKK3VzaW5nIGRybTo6VjFfMDo6S2V5ZWRWZWN0b3I7Cit1c2luZyBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpLZXlUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpLZXlWYWx1ZTsKK3VzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcDsKK3VzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcElkOwordXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJlU3RvcFJlbGVhc2U7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Cit1c2luZyBkcm06OlYxXzI6OktleVNldElkOwordXNpbmcgZHJtOjpWMV8yOjpLZXlTdGF0dXNUeXBlOworCit0eXBlZGVmIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGUgS2V5UmVxdWVzdFR5cGVfVjFfMTsKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7Cit0eXBlZGVmIGRybTo6VjFfMjo6SGRjcExldmVsIEhkY3BMZXZlbF9WMV8yOworCituYW1lc3BhY2UgeworCisvLyBUaGlzIGNvbnN0YW50IGNvcnJlc3BvbmRzIHRvIHRoZSBQUk9QRVJUWV9ERVZJQ0VfVU5JUVVFX0lEIGNvbnN0YW50CisvLyBpbiB0aGUgTWVkaWFEcm0gQVBJLgorY29uc3RleHByIGNoYXIga1Byb3BlcnR5RGV2aWNlVW5pcXVlSWRbXSA9ICJkZXZpY2VVbmlxdWVJZCI7Citjb25zdGV4cHIgY2hhciBrRXF1YWxzU2lnbltdID0gIj0iOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvQmFzZTY0U3RyaW5nTm9QYWQoY29uc3QgVCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAvLyBOb3RlIHRoYXQgdGhlIGJhc2UgNjQgY29udmVyc2lvbiBvbmx5IHdvcmtzIHdpdGggYXJyYXlzIG9mIHNpbmdsZS1ieXRlCisgICAgLy8gdmFsdWVzLiBJZiB0aGUgc291cmNlIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBhcnJheSBvZiBzaW5nbGUtYnl0ZSB2YWx1ZXMsCisgICAgLy8gcmV0dXJuIGVtcHR5IHN0cmluZy4KKyAgICBpZiAoc2l6ZSA9PSAwIHx8IHNpemVvZihkYXRhWzBdKSAhPSAxKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBhbmRyb2lkOjpBU3RyaW5nIG91dHB1dFN0cmluZzsKKyAgICBlbmNvZGVCYXNlNjQoZGF0YSwgc2l6ZSwgJm91dHB1dFN0cmluZyk7CisgICAgLy8gUmVtb3ZlIHRyYWlsaW5nIGVxdWFscyBwYWRkaW5nIGlmIGl0IGV4aXN0cy4KKyAgICB3aGlsZSAob3V0cHV0U3RyaW5nLnNpemUoKSA+IDAgJiYgb3V0cHV0U3RyaW5nLmVuZHNXaXRoKGtFcXVhbHNTaWduKSkgeworICAgICAgICBvdXRwdXRTdHJpbmcuZXJhc2Uob3V0cHV0U3RyaW5nLnNpemUoKSAtIDEsIDEpOworICAgIH0KKworICAgIHJldHVybiBzdGQ6OnN0cmluZyhvdXRwdXRTdHJpbmcuY19zdHIoKSwgb3V0cHV0U3RyaW5nLnNpemUoKSk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIElOSVRfQ0hFQ0soKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHJldHVybiBtSW5pdENoZWNrOyBcCisgICAgfQorCitzdGF0aWMgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+IHRvVmVjdG9yKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiB2ZWMpIHsKKyAgICBWZWN0b3I8dWludDhfdD4gdmVjdG9yOworICAgIHZlY3Rvci5hcHBlbmRBcnJheSh2ZWMuZGF0YSgpLCB2ZWMuc2l6ZSgpKTsKKyAgICByZXR1cm4gKmNvbnN0X2Nhc3Q8Y29uc3QgVmVjdG9yPHVpbnQ4X3Q+Kj4oJnZlY3Rvcik7Cit9CisKK3N0YXRpYyBoaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxWZWMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiB2ZWN0b3IpIHsKKyAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWM7CisgICAgdmVjLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90Kj4odmVjdG9yLmFycmF5KCkpLCB2ZWN0b3Iuc2l6ZSgpKTsKKyAgICByZXR1cm4gdmVjOworfQorCitzdGF0aWMgU3RyaW5nOCB0b1N0cmluZzgoY29uc3QgaGlkbF9zdHJpbmcmIHN0cmluZykgeworICAgIHJldHVybiBTdHJpbmc4KHN0cmluZy5jX3N0cigpKTsKK30KKworc3RhdGljIGhpZGxfc3RyaW5nIHRvSGlkbFN0cmluZyhjb25zdCBTdHJpbmc4JiBzdHJpbmcpIHsKKyAgICByZXR1cm4gaGlkbF9zdHJpbmcoc3RyaW5nLnN0cmluZygpKTsKK30KKworc3RhdGljIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCB0b1NlY3VyaXR5TGV2ZWwoU2VjdXJpdHlMZXZlbCBsZXZlbCkgeworICAgIHN3aXRjaCAobGV2ZWwpIHsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZTsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZTsKKyAgICAgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93bjsKKyAgICB9Cit9CisKK3N0YXRpYyBTZWN1cml0eUxldmVsIHRvSGlkbFNlY3VyaXR5TGV2ZWwoRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsKSB7CisgICAgc3dpdGNoIChsZXZlbCkgeworICAgICAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzoKKyAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZToKKyAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzoKKyAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZToKKyAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDoKKyAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlVOS05PV047CisgICAgfQorfQorCitzdGF0aWMgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlIHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZShPZmZsaW5lTGljZW5zZVN0YXRlIGxpY2Vuc2VTdGF0ZSkgeworICAgIHN3aXRjaCAobGljZW5zZVN0YXRlKSB7CisgICAgICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VVNBQkxFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVc2FibGU7CisgICAgICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6SU5BQ1RJVkU6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVJlbGVhc2VkOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworICAgIH0KK30KKworc3RhdGljIERybVBsdWdpbjo6SGRjcExldmVsIHRvSGRjcExldmVsKEhkY3BMZXZlbF9WMV8yIGxldmVsKSB7CisgICAgc3dpdGNoIChsZXZlbCkgeworICAgICAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX05PTkU6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vbmU7CisgICAgICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjE6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYxOworICAgICAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMjsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMl8xOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8xOworICAgICAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyXzI6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyXzI7CisgICAgICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMzoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMzsKKyAgICAgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT19PVVRQVVQ6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vT3V0cHV0OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CisgICAgfQorfQorc3RhdGljIDo6S2V5ZWRWZWN0b3IgdG9IaWRsS2V5ZWRWZWN0b3IoY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGtleWVkVmVjdG9yKSB7CisgICAgc3RkOjp2ZWN0b3I8S2V5VmFsdWU+IHN0ZEtleWVkVmVjdG9yOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5ZWRWZWN0b3Iuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgS2V5VmFsdWUga2V5VmFsdWU7CisgICAgICAgIGtleVZhbHVlLmtleSA9IHRvSGlkbFN0cmluZyhrZXllZFZlY3Rvci5rZXlBdChpKSk7CisgICAgICAgIGtleVZhbHVlLnZhbHVlID0gdG9IaWRsU3RyaW5nKGtleWVkVmVjdG9yLnZhbHVlQXQoaSkpOworICAgICAgICBzdGRLZXllZFZlY3Rvci5wdXNoX2JhY2soa2V5VmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gOjpLZXllZFZlY3RvcihzdGRLZXllZFZlY3Rvcik7Cit9CisKK3N0YXRpYyBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiB0b0tleWVkVmVjdG9yKGNvbnN0IDo6S2V5ZWRWZWN0b3ImIGhLZXllZFZlY3RvcikgeworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGtleWVkVmVjdG9yOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaEtleWVkVmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGtleWVkVmVjdG9yLmFkZCh0b1N0cmluZzgoaEtleWVkVmVjdG9yW2ldLmtleSksIHRvU3RyaW5nOChoS2V5ZWRWZWN0b3JbaV0udmFsdWUpKTsKKyAgICB9CisgICAgcmV0dXJuIGtleWVkVmVjdG9yOworfQorCitzdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcHMoY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcD4mIGhTZWN1cmVTdG9wcykgeworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhTZWN1cmVTdG9wcy5zaXplKCk7IGkrKykgeworICAgICAgICBzZWN1cmVTdG9wcy5wdXNoX2JhY2sodG9WZWN0b3IoaFNlY3VyZVN0b3BzW2ldLm9wYXF1ZURhdGEpKTsKKyAgICB9CisgICAgcmV0dXJuIHNlY3VyZVN0b3BzOworfQorCitzdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvU2VjdXJlU3RvcElkcyhjb25zdCBoaWRsX3ZlYzxTZWN1cmVTdG9wSWQ+JiBoU2VjdXJlU3RvcElkcykgeworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wSWRzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaFNlY3VyZVN0b3BJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc2VjdXJlU3RvcElkcy5wdXNoX2JhY2sodG9WZWN0b3IoaFNlY3VyZVN0b3BJZHNbaV0pKTsKKyAgICB9CisgICAgcmV0dXJuIHNlY3VyZVN0b3BJZHM7Cit9CisKK3N0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9LZXlTZXRJZHMoY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JiBoS2V5U2V0SWRzKSB7CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IGtleVNldElkczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXlTZXRJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoS2V5U2V0SWRzW2ldKSk7CisgICAgfQorICAgIHJldHVybiBrZXlTZXRJZHM7Cit9CisKK011dGV4IERybUhhbEhpZGw6Om1Mb2NrOworCitzdHJ1Y3QgRHJtSGFsSGlkbDo6RHJtU2Vzc2lvbkNsaWVudCA6IHB1YmxpYyBhaWRsOjphbmRyb2lkOjptZWRpYTo6Qm5SZXNvdXJjZU1hbmFnZXJDbGllbnQgeworICAgIGV4cGxpY2l0IERybVNlc3Npb25DbGllbnQoRHJtSGFsSGlkbCogZHJtLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkKKyAgICAgICAgOiBtU2Vzc2lvbklkKHNlc3Npb25JZCksIG1Ecm0oZHJtKSB7fQorCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVjbGFpbVJlc291cmNlKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0TmFtZSg6OnN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCisgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+IG1TZXNzaW9uSWQ7CisKKyAgICB2aXJ0dWFsIH5Ecm1TZXNzaW9uQ2xpZW50KCk7CisKKyAgcHJpdmF0ZToKKyAgICB3cDxEcm1IYWxIaWRsPiBtRHJtOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtU2Vzc2lvbkNsaWVudCk7Cit9OworCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxIaWRsOjpEcm1TZXNzaW9uQ2xpZW50OjpyZWNsYWltUmVzb3VyY2UoYm9vbCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXV0byBzZXNzaW9uSWQgPSBtU2Vzc2lvbklkOworICAgIHNwPERybUhhbEhpZGw+IGRybSA9IG1Ecm0ucHJvbW90ZSgpOworICAgIGlmIChkcm0gPT0gTlVMTCkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBkcm0tPmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IGZhbHNlOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIGRybS0+c2VuZEV2ZW50KEV2ZW50VHlwZTo6U0VTU0lPTl9SRUNMQUlNRUQsIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybUhhbEhpZGw6OkRybVNlc3Npb25DbGllbnQ6OmdldE5hbWUoOjpzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgICAgU3RyaW5nOCBuYW1lOworICAgIHNwPERybUhhbEhpZGw+IGRybSA9IG1Ecm0ucHJvbW90ZSgpOworICAgIGlmIChkcm0gPT0gTlVMTCkgeworICAgICAgICBuYW1lLmFwcGVuZCgiPGRlbGV0ZWQ+Iik7CisgICAgfSBlbHNlIGlmIChkcm0tPmdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIG5hbWUpICE9IE9LIHx8IG5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgIG5hbWUuYXBwZW5kKCI8R2V0IHZlbmRvciBmYWlsZWQgb3IgaXMgZW1wdHk+Iik7CisgICAgfQorICAgIG5hbWUuYXBwZW5kKCJbIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2Vzc2lvbklkLnNpemUoKTsgKytpKSB7CisgICAgICAgIG5hbWUuYXBwZW5kRm9ybWF0KCIlMDJ4IiwgbVNlc3Npb25JZFtpXSk7CisgICAgfQorICAgIG5hbWUuYXBwZW5kKCJdIik7CisgICAgKl9haWRsX3JldHVybiA9IG5hbWU7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCitEcm1IYWxIaWRsOjpEcm1TZXNzaW9uQ2xpZW50Ojp+RHJtU2Vzc2lvbkNsaWVudCgpIHsKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlU2Vzc2lvbihtU2Vzc2lvbklkKTsKK30KKworRHJtSGFsSGlkbDo6RHJtSGFsSGlkbCgpCisgICAgOiBtRmFjdG9yaWVzKG1ha2VEcm1GYWN0b3JpZXMoKSksCisgICAgICBtSW5pdENoZWNrKChtRmFjdG9yaWVzLnNpemUoKSA9PSAwKSA/IEVSUk9SX1VOU1VQUE9SVEVEIDogTk9fSU5JVCkge30KKwordm9pZCBEcm1IYWxIaWRsOjpjbG9zZU9wZW5TZXNzaW9ucygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGF1dG8gb3BlblNlc3Npb25zID0gbU9wZW5TZXNzaW9uczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZW5TZXNzaW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgY2xvc2VTZXNzaW9uKG9wZW5TZXNzaW9uc1tpXS0+bVNlc3Npb25JZCk7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICB9CisgICAgbU9wZW5TZXNzaW9ucy5jbGVhcigpOworfQorCitEcm1IYWxIaWRsOjp+RHJtSGFsSGlkbCgpIHt9CisKK3ZvaWQgRHJtSGFsSGlkbDo6Y2xlYW51cCgpIHsKKyAgICBjbG9zZU9wZW5TZXNzaW9ucygpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXBvcnRGcmFtZXdvcmtNZXRyaWNzKHJlcG9ydFBsdWdpbk1ldHJpY3MoKSk7CisKKyAgICBzZXRMaXN0ZW5lcihOVUxMKTsKKyAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBpZiAoIW1QbHVnaW5WMV8yLT5zZXRMaXN0ZW5lcihOVUxMKS5pc09rKCkpIHsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIoTlVMTCkuaXNPaygpKSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisgICAgbVBsdWdpbi5jbGVhcigpOworICAgIG1QbHVnaW5WMV8xLmNsZWFyKCk7CisgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKKyAgICBtUGx1Z2luVjFfNC5jbGVhcigpOworfQorCitzdGQ6OnZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IERybUhhbEhpZGw6Om1ha2VEcm1GYWN0b3JpZXMoKSB7CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gZmFjdG9yaWVzKERybVV0aWxzOjpNYWtlRHJtRmFjdG9yaWVzKCkpOworICAgIGlmIChmYWN0b3JpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgRHJtVXRpbHM6OkxPRzJCSSgiTm8gaGlkbCBkcm0gZmFjdG9yaWVzIGZvdW5kIik7CisgICAgICAgIC8vIGNvdWxkIGJlIGluIHBhc3N0aHJvdWdoIG1vZGUsIGxvYWQgdGhlIGRlZmF1bHQgcGFzc3Rocm91Z2ggc2VydmljZQorICAgICAgICBhdXRvIHBhc3N0aHJvdWdoID0gSURybUZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKKyAgICAgICAgaWYgKHBhc3N0aHJvdWdoICE9IE5VTEwpIHsKKyAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkkoIm1ha2VEcm1GYWN0b3JpZXM6IHVzaW5nIGRlZmF1bHQgcGFzc3Rocm91Z2ggZHJtIGluc3RhbmNlIik7CisgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKHBhc3N0aHJvdWdoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkUoIkZhaWxlZCB0byBmaW5kIHBhc3N0aHJvdWdoIGRybSBmYWN0b3JpZXMiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFjdG9yaWVzOworfQorCitzcDxJRHJtUGx1Z2luPiBEcm1IYWxIaWRsOjptYWtlRHJtUGx1Z2luKGNvbnN0IHNwPElEcm1GYWN0b3J5PiYgZmFjdG9yeSwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKKyAgICBtQXBwUGFja2FnZU5hbWUgPSBhcHBQYWNrYWdlTmFtZTsKKyAgICBtTWV0cmljcy5TZXRBcHBQYWNrYWdlTmFtZShhcHBQYWNrYWdlTmFtZSk7CisgICAgbU1ldHJpY3MuU2V0QXBwVWlkKEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSk7CisKKyAgICBzcDxJRHJtUGx1Z2luPiBwbHVnaW47CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBmYWN0b3J5LT5jcmVhdGVQbHVnaW4oCisgICAgICAgICAgICB1dWlkLCBhcHBQYWNrYWdlTmFtZS5zdHJpbmcoKSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IHNwPElEcm1QbHVnaW4+JiBoUGx1Z2luKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkUodXVpZCwgIkZhaWxlZCB0byBtYWtlIGRybSBwbHVnaW46ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbHVnaW4gPSBoUGx1Z2luOworICAgICAgICAgICAgfSk7CisKKyAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIERybVV0aWxzOjpMT0cyQkUodXVpZCwgImNyZWF0ZVBsdWdpbiByZW1vdGUgY2FsbCBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoUmVzdWx0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHBsdWdpbjsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpzZXRMaXN0ZW5lcihjb25zdCBzcDxJRHJtQ2xpZW50PiYgbGlzdGVuZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRXZlbnRMb2NrKTsKKyAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1JldHVybjx2b2lkPiBEcm1IYWxIaWRsOjpzZW5kRXZlbnQoRXZlbnRUeXBlIGhFdmVudFR5cGUsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSB7CisgICAgbU1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KWhFdmVudFR5cGUpOworCisgICAgbUV2ZW50TG9jay5sb2NrKCk7CisgICAgc3A8SURybUNsaWVudD4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgRHJtUGx1Z2luOjpFdmVudFR5cGUgZXZlbnRUeXBlOworICAgICAgICBzd2l0Y2ggKGhFdmVudFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlOjpQUk9WSVNJT05fUkVRVUlSRUQ6CisgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRQcm92aXNpb25SZXF1aXJlZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlOjpLRVlfTkVFREVEOgorICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50S2V5TmVlZGVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFdmVudFR5cGU6OktFWV9FWFBJUkVEOgorICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50S2V5RXhwaXJlZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRDoKKyAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFZlbmRvckRlZmluZWQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEV2ZW50VHlwZTo6U0VTU0lPTl9SRUNMQUlNRUQ6CisgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRTZXNzaW9uUmVjbGFpbWVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQoZXZlbnRUeXBlLCBzZXNzaW9uSWQsIGRhdGEpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtSGFsSGlkbDo6c2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKSB7CisgICAgbUV2ZW50TG9jay5sb2NrKCk7CisgICAgc3A8SURybUNsaWVudD4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgbGlzdGVuZXItPnNlbmRFeHBpcmF0aW9uVXBkYXRlKHNlc3Npb25JZCwgZXhwaXJ5VGltZUluTVMpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtSGFsSGlkbDo6c2VuZEtleXNDaGFuZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXNfVjFfMD4mIGtleVN0YXR1c0xpc3RfVjFfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc05ld1VzYWJsZUtleSkgeworICAgIHN0ZDo6dmVjdG9yPEtleVN0YXR1cz4ga2V5U3RhdHVzVmVjOworICAgIGZvciAoY29uc3QgYXV0byYga2V5U3RhdHVzX1YxXzAgOiBrZXlTdGF0dXNMaXN0X1YxXzApIHsKKyAgICAgICAga2V5U3RhdHVzVmVjLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICB7a2V5U3RhdHVzX1YxXzAua2V5SWQsIHN0YXRpY19jYXN0PEtleVN0YXR1c1R5cGU+KGtleVN0YXR1c19WMV8wLnR5cGUpfSk7CisgICAgfQorICAgIGhpZGxfdmVjPEtleVN0YXR1cz4ga2V5U3RhdHVzTGlzdF9WMV8yKGtleVN0YXR1c1ZlYyk7CisgICAgcmV0dXJuIHNlbmRLZXlzQ2hhbmdlXzFfMihzZXNzaW9uSWQsIGtleVN0YXR1c0xpc3RfVjFfMiwgaGFzTmV3VXNhYmxlS2V5KTsKK30KKworUmV0dXJuPHZvaWQ+IERybUhhbEhpZGw6OnNlbmRLZXlzQ2hhbmdlXzFfMihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXM+JiBoS2V5U3RhdHVzTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNOZXdVc2FibGVLZXkpIHsKKyAgICBtRXZlbnRMb2NrLmxvY2soKTsKKyAgICBzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lciA9IG1MaXN0ZW5lcjsKKyAgICBtRXZlbnRMb2NrLnVubG9jaygpOworCisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8RHJtS2V5U3RhdHVzPiBrZXlTdGF0dXNMaXN0OworICAgICAgICBzaXplX3QgbktleXMgPSBoS2V5U3RhdHVzTGlzdC5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbktleXM7ICsraSkgeworICAgICAgICAgICAgY29uc3QgS2V5U3RhdHVzJiBrZXlTdGF0dXMgPSBoS2V5U3RhdHVzTGlzdFtpXTsKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgICAgICBzd2l0Y2ggKGtleVN0YXR1cy50eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpVU0FCTEU6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX1VzYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpFWFBJUkVEOgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9FeHBpcmVkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6Ok9VVFBVVE5PVEFMTE9XRUQ6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX091dHB1dE5vdEFsbG93ZWQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6U1RBVFVTUEVORElORzoKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfU3RhdHVzUGVuZGluZzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpVU0FCTEVJTkZVVFVSRToKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfVXNhYmxlSW5GdXR1cmU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUjoKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9JbnRlcm5hbEVycm9yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtleVN0YXR1c0xpc3QucHVzaF9iYWNrKHt0eXBlLCBrZXlTdGF0dXMua2V5SWR9KTsKKyAgICAgICAgICAgIG1NZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3Qpa2V5U3RhdHVzLnR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU5vdGlmeUxvY2spOworICAgICAgICBsaXN0ZW5lci0+c2VuZEtleXNDaGFuZ2Uoc2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0LCBoYXNOZXdVc2FibGVLZXkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZXJlJ3Mgbm8gbGlzdGVuZXIuIEJ1dCB3ZSBzdGlsbCB3YW50IHRvIGNvdW50IHRoZSBrZXkgY2hhbmdlCisgICAgICAgIC8vIGV2ZW50cy4KKyAgICAgICAgc2l6ZV90IG5LZXlzID0gaEtleVN0YXR1c0xpc3Quc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5LZXlzOyBpKyspIHsKKyAgICAgICAgICAgIG1NZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpaEtleVN0YXR1c0xpc3RbaV0udHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtSGFsSGlkbDo6c2VuZFNlc3Npb25Mb3N0U3RhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIG1FdmVudExvY2subG9jaygpOworICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIG1FdmVudExvY2sudW5sb2NrKCk7CisKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7CisgICAgICAgIGxpc3RlbmVyLT5zZW5kU2Vzc2lvbkxvc3RTdGF0ZShzZXNzaW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjptYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChjb25zdCBzcDxJRHJtRmFjdG9yeT4mIGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGlzU3VwcG9ydGVkKSB7CisgICAgKmlzU3VwcG9ydGVkID0gZmFsc2U7CisKKyAgICAvLyBoYW5kbGUgZGVmYXVsdCB2YWx1ZSBjYXNlcworICAgIGlmIChsZXZlbCA9PSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93bikgeworICAgICAgICBpZiAobWltZVR5cGUgPT0gIiIpIHsKKyAgICAgICAgICAgIC8vIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpCisgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVR5cGUpCisgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBmYWN0b3J5LT5pc0NvbnRlbnRUeXBlU3VwcG9ydGVkKG1pbWVUeXBlLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChtaW1lVHlwZSA9PSAiIikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPGRybTo6VjFfMjo6SURybUZhY3Rvcnk+IGZhY3RvcnlWMV8yID0gZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTo6Y2FzdEZyb20oZmFjdG9yeSk7CisgICAgaWYgKGZhY3RvcnlWMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0gZWxzZSB7CisgICAgICAgICppc1N1cHBvcnRlZCA9IGZhY3RvcnlWMV8yLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZF8xXzIodXVpZCwgbWltZVR5cGUuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9IaWRsU2VjdXJpdHlMZXZlbChsZXZlbCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwgYm9vbCogaXNTdXBwb3J0ZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOworICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChtRmFjdG9yaWVzW2ldLCB1dWlkLCBtaW1lVHlwZSwgbGV2ZWwsIGlzU3VwcG9ydGVkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBhcHBQYWNrYWdlTmFtZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBmb3IgKHNzaXplX3QgaSA9IG1GYWN0b3JpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgYXV0byBoUmVzdWx0ID0gbUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCk7CisgICAgICAgIGlmIChoUmVzdWx0LmlzT2soKSAmJiBoUmVzdWx0KSB7CisgICAgICAgICAgICBhdXRvIHBsdWdpbiA9IG1ha2VEcm1QbHVnaW4obUZhY3Rvcmllc1tpXSwgdXVpZCwgYXBwUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVBsdWdpbiA9IHBsdWdpbjsKKyAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMSA9IGRybTo6VjFfMTo6SURybVBsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzIgPSBkcm06OlYxXzI6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOworICAgICAgICAgICAgICAgIG1QbHVnaW5WMV80ID0gZHJtOjpWMV80OjpJRHJtUGx1Z2luOjpjYXN0RnJvbShtUGx1Z2luKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtUGx1Z2luID09IE5VTEwpIHsKKyAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSh1dWlkLCAiTm8gc3VwcG9ydGVkIGhhbCBpbnN0YW5jZSBmb3VuZCIpOworICAgICAgICBtSW5pdENoZWNrID0gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUluaXRDaGVjayA9IE9LOworICAgICAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFtUGx1Z2luVjFfMi0+c2V0TGlzdGVuZXIodGhpcykuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFtUGx1Z2luLT5zZXRMaXN0ZW5lcih0aGlzKS5pc09rKCkpIHsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICAgICAgbVBsdWdpbi5jbGVhcigpOworICAgICAgICAgICAgbVBsdWdpblYxXzEuY2xlYXIoKTsKKyAgICAgICAgICAgIG1QbHVnaW5WMV8yLmNsZWFyKCk7CisgICAgICAgICAgICBtUGx1Z2luVjFfNC5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmRlc3Ryb3lQbHVnaW4oKSB7CisgICAgY2xlYW51cCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6b3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgU2VjdXJpdHlMZXZlbCBoU2VjdXJpdHlMZXZlbCA9IHRvSGlkbFNlY3VyaXR5TGV2ZWwobGV2ZWwpOworICAgIGJvb2wgc2V0U2VjdXJpdHlMZXZlbCA9IHRydWU7CisKKyAgICBpZiAobGV2ZWwgPT0gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbE1heCkgeworICAgICAgICBzZXRTZWN1cml0eUxldmVsID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGhTZWN1cml0eUxldmVsID09IFNlY3VyaXR5TGV2ZWw6OlVOS05PV04pIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisgICAgYm9vbCByZXRyeSA9IHRydWU7CisgICAgZG8geworICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiBoU2Vzc2lvbklkOworCisgICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OworICAgICAgICBpZiAobVBsdWdpblYxXzEgPT0gTlVMTCB8fCAhc2V0U2VjdXJpdHlMZXZlbCkgeworICAgICAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW4tPm9wZW5TZXNzaW9uKFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gdG9WZWN0b3IoaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5vcGVuU2Vzc2lvbl8xXzEoaFNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IHRvVmVjdG9yKGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVyciA9IERFQURfT0JKRUNUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWSAmJiByZXRyeSkgeworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAvLyByZWNsYWltU2Vzc2lvbiBtYXkgY2FsbCBiYWNrIHRvIGNsb3NlU2Vzc2lvbiwgc2luY2UgbUxvY2sgaXMKKyAgICAgICAgICAgIC8vIHNoYXJlZCBiZXR3ZWVuIERybSBpbnN0YW5jZXMsIHdlIHNob3VsZCB1bmxvY2sgaGVyZSB0byBhdm9pZAorICAgICAgICAgICAgLy8gZGVhZGxvY2suCisgICAgICAgICAgICByZXRyeSA9IERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZWNsYWltU2Vzc2lvbihBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCkpOworICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0cnkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHJldHJ5KTsKKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPERybVNlc3Npb25DbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgbmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPERybVNlc3Npb25DbGllbnQ+KHRoaXMsIHNlc3Npb25JZCk7CisgICAgICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5hZGRTZXNzaW9uKAorICAgICAgICAgICAgICAgIEFJQmluZGVyX2dldENhbGxpbmdQaWQoKSwgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+KGNsaWVudCksCisgICAgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgICAgICAgbU9wZW5TZXNzaW9ucy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgbU1ldHJpY3MuU2V0U2Vzc2lvblN0YXJ0KHNlc3Npb25JZCk7CisgICAgfQorCisgICAgbU1ldHJpY3MubU9wZW5TZXNzaW9uQ291bnRlci5JbmNyZW1lbnQoZXJyKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPmNsb3NlU2Vzc2lvbih0b0hpZGxWZWMoc2Vzc2lvbklkKSk7CisgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICAgICAgZm9yIChhdXRvIGkgPSBtT3BlblNlc3Npb25zLmJlZ2luKCk7IGkgIT0gbU9wZW5TZXNzaW9ucy5lbmQoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzRXF1YWxTZXNzaW9uSWQoKCppKS0+bVNlc3Npb25JZCwgc2Vzc2lvbklkKSkgeworICAgICAgICAgICAgICAgICAgICBtT3BlblNlc3Npb25zLmVyYXNlKGkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgcmVzcG9uc2UgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgbU1ldHJpY3MuU2V0U2Vzc2lvbkVuZChzZXNzaW9uSWQpOworICAgICAgICBtTWV0cmljcy5tQ2xvc2VTZXNzaW9uQ291bnRlci5JbmNyZW1lbnQocmVzcG9uc2UpOworICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgfQorICAgIG1NZXRyaWNzLm1DbG9zZVNlc3Npb25Db3VudGVyLkluY3JlbWVudChERUFEX09CSkVDVCk7CisgICAgcmV0dXJuIERFQURfT0JKRUNUOworfQorCitzdGF0aWMgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSB0b0tleVJlcXVlc3RUeXBlKEtleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlKSB7CisgICAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgeworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6UkVORVdBTDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZW5ld2FsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVsZWFzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIHRvS2V5UmVxdWVzdFR5cGVfMV8xKEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUpIHsKKyAgICBzd2l0Y2ggKGtleVJlcXVlc3RUeXBlKSB7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6VVBEQVRFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1VwZGF0ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHRvS2V5UmVxdWVzdFR5cGUoc3RhdGljX2Nhc3Q8S2V5UmVxdWVzdFR5cGU+KGtleVJlcXVlc3RUeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5pdERhdGEsIFN0cmluZzggY29uc3QmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OktleVR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gY29uc3QmIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlKiBrZXlSZXF1ZXN0VHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlcXVlc3RUaW1lcigmbU1ldHJpY3MubUdldEtleVJlcXVlc3RUaW1lVXMpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIEtleVR5cGUgaEtleVR5cGU7CisgICAgaWYgKGtleVR5cGUgPT0gRHJtUGx1Z2luOjprS2V5VHlwZV9TdHJlYW1pbmcpIHsKKyAgICAgICAgaEtleVR5cGUgPSBLZXlUeXBlOjpTVFJFQU1JTkc7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfT2ZmbGluZSkgeworICAgICAgICBoS2V5VHlwZSA9IEtleVR5cGU6Ok9GRkxJTkU7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IERybVBsdWdpbjo6a0tleVR5cGVfUmVsZWFzZSkgeworICAgICAgICBoS2V5VHlwZSA9IEtleVR5cGU6OlJFTEVBU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAga2V5UmVxdWVzdFRpbWVyLlNldEF0dHJpYnV0ZShCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIDo6S2V5ZWRWZWN0b3IgaE9wdGlvbmFsUGFyYW1ldGVycyA9IHRvSGlkbEtleWVkVmVjdG9yKG9wdGlvbmFsUGFyYW1ldGVycyk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OworCisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRLZXlSZXF1ZXN0XzFfMigKKyAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwgdG9IaWRsU3RyaW5nKG1pbWVUeXBlKSwgaEtleVR5cGUsCisgICAgICAgICAgICAgICAgaE9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEgaEtleVJlcXVlc3RUeXBlLCBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IHRvS2V5UmVxdWVzdFR5cGVfMV8xKGhLZXlSZXF1ZXN0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0S2V5UmVxdWVzdF8xXzEoCisgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhpbml0RGF0YSksIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLAorICAgICAgICAgICAgICAgIGhPcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBoS2V5UmVxdWVzdFR5cGUsIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IHRvS2V5UmVxdWVzdFR5cGVfMV8xKGhLZXlSZXF1ZXN0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW4tPmdldEtleVJlcXVlc3QoCisgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhpbml0RGF0YSksIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLAorICAgICAgICAgICAgICAgIGhPcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGUgaEtleVJlcXVlc3RUeXBlLCBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlKGhLZXlSZXF1ZXN0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBrZXlSZXF1ZXN0VGltZXIuU2V0QXR0cmlidXRlKGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6cHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlc3BvbnNlVGltZXIoJm1NZXRyaWNzLm1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9CisgICAgICAgICAgICBtUGx1Z2luLT5wcm92aWRlS2V5UmVzcG9uc2UodG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhyZXNwb25zZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoS2V5U2V0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZCA9IHRvVmVjdG9yKGhLZXlTZXRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBrZXlSZXNwb25zZVRpbWVyLlNldEF0dHJpYnV0ZShlcnIpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnJlbW92ZUtleXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+cmVtb3ZlS2V5cyh0b0hpZGxWZWMoa2V5U2V0SWQpKTsKKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnJlc3RvcmVLZXlzKHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoa2V5U2V0SWQpKTsKKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICA6OktleWVkVmVjdG9yIGhJbmZvTWFwOworCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+cXVlcnlLZXlTdGF0dXMoCisgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgbWFwKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm9NYXAgPSB0b0tleWVkVmVjdG9yKG1hcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0UHJvdmlzaW9uUmVxdWVzdChTdHJpbmc4IGNvbnN0JiBjZXJ0VHlwZSwgU3RyaW5nOCBjb25zdCYgY2VydEF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OworCisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRQcm92aXNpb25SZXF1ZXN0XzFfMigKKyAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1c19WMV8yIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0UHJvdmlzaW9uUmVxdWVzdCh0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBtTWV0cmljcy5tR2V0UHJvdmlzaW9uUmVxdWVzdENvdW50ZXIuSW5jcmVtZW50KGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHdyYXBwZWRLZXkpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnByb3ZpZGVQcm92aXNpb25SZXNwb25zZSgKKyAgICAgICAgICAgIHRvSGlkbFZlYyhyZXNwb25zZSksIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaENlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoV3JhcHBlZEtleSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSA9IHRvVmVjdG9yKGhDZXJ0aWZpY2F0ZSk7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRLZXkgPSB0b1ZlY3RvcihoV3JhcHBlZEtleSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfSk7CisKKyAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworICAgIG1NZXRyaWNzLm1Qcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VDb3VudGVyLkluY3JlbWVudChlcnIpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYgc2VjdXJlU3RvcHMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9CisgICAgICAgICAgICBtUGx1Z2luLT5nZXRTZWN1cmVTdG9wcyhbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcD4mIGhTZWN1cmVTdG9wcykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBzZWN1cmVTdG9wcyA9IHRvU2VjdXJlU3RvcHMoaFNlY3VyZVN0b3BzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICB9KTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYgc2VjdXJlU3RvcElkcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpblYxXzEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldFNlY3VyZVN0b3BJZHMoCisgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcElkPiYgaFNlY3VyZVN0b3BJZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgc2VjdXJlU3RvcElkcyA9IHRvU2VjdXJlU3RvcElkcyhoU2VjdXJlU3RvcElkcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQsIFZlY3Rvcjx1aW50OF90PiYgc2VjdXJlU3RvcCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0U2VjdXJlU3RvcCgKKyAgICAgICAgICAgIHRvSGlkbFZlYyhzc2lkKSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IFNlY3VyZVN0b3AmIGhTZWN1cmVTdG9wKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY3VyZVN0b3AgPSB0b1ZlY3RvcihoU2VjdXJlU3RvcC5vcGFxdWVEYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICB9KTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpyZWxlYXNlU2VjdXJlU3RvcHMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzc1JlbGVhc2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOKTsKKyAgICBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgeworICAgICAgICBTZWN1cmVTdG9wUmVsZWFzZSBzZWN1cmVTdG9wUmVsZWFzZTsKKyAgICAgICAgc2VjdXJlU3RvcFJlbGVhc2Uub3BhcXVlRGF0YSA9IHRvSGlkbFZlYyhzc1JlbGVhc2UpOworICAgICAgICBzdGF0dXMgPSBtUGx1Z2luVjFfMS0+cmVsZWFzZVNlY3VyZVN0b3BzKHNlY3VyZVN0b3BSZWxlYXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBtUGx1Z2luLT5yZWxlYXNlU2VjdXJlU3RvcCh0b0hpZGxWZWMoc3NSZWxlYXNlKSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6cmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5yZW1vdmVTZWN1cmVTdG9wKHRvSGlkbFZlYyhzc2lkKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpyZW1vdmVBbGxTZWN1cmVTdG9wcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOKTsKKyAgICBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSBtUGx1Z2luVjFfMS0+cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBtUGx1Z2luLT5yZWxlYXNlQWxsU2VjdXJlU3RvcHMoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpnZXRIZGNwTGV2ZWxzKERybVBsdWdpbjo6SGRjcExldmVsKiBjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsKiBtYXgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIGlmIChjb25uZWN0ZWQgPT0gTlVMTCB8fCBtYXggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgKmNvbm5lY3RlZCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CisgICAgKm1heCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldEhkY3BMZXZlbHNfMV8yKFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhkY3BMZXZlbF9WMV8yJiBoQ29ubmVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIZGNwTGV2ZWxfVjFfMiYgaE1heCkgeworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAqY29ubmVjdGVkID0gdG9IZGNwTGV2ZWwoaENvbm5lY3RlZCk7CisgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKGhNYXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgIH0pOworICAgIH0gZWxzZSBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldEhkY3BMZXZlbHMoCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbCYgaENvbm5lY3RlZCwgY29uc3QgSGRjcExldmVsJiBoTWF4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKHN0YXRpY19jYXN0PEhkY3BMZXZlbF9WMV8yPihoQ29ubmVjdGVkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqbWF4ID0gdG9IZGNwTGV2ZWwoc3RhdGljX2Nhc3Q8SGRjcExldmVsX1YxXzI+KGhNYXgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QqIG9wZW4sIHVpbnQzMl90KiBtYXgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIGlmIChvcGVuID09IE5VTEwgfHwgbWF4ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgICpvcGVuID0gMDsKKyAgICAqbWF4ID0gMDsKKworICAgIGlmIChtUGx1Z2luVjFfMSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9CisgICAgICAgICAgICBtUGx1Z2luVjFfMS0+Z2V0TnVtYmVyT2ZTZXNzaW9ucyhbJl0oU3RhdHVzIHN0YXR1cywgdWludDMyX3QgaE9wZW4sIHVpbnQzMl90IGhNYXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKm9wZW4gPSBoT3BlbjsKKyAgICAgICAgICAgICAgICAgICAgKm1heCA9IGhNYXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsKiBsZXZlbCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgaWYgKGxldmVsID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIGlmIChtUGx1Z2luVjFfMSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICAqbGV2ZWwgPSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93bjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldFNlY3VyaXR5TGV2ZWwodG9IaWRsVmVjKHNlc3Npb25JZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgU2VjdXJpdHlMZXZlbCBoTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxldmVsID0gdG9TZWN1cml0eUxldmVsKGhMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+JiBrZXlTZXRJZHMpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZUtleVNldElkcygKKyAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzxLZXlTZXRJZD4mIGhLZXlTZXRJZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAga2V5U2V0SWRzID0gdG9LZXlTZXRJZHMoaEtleVNldElkcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6cmVtb3ZlT2ZmbGluZUxpY2Vuc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpblYxXzIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpblYxXzItPnJlbW92ZU9mZmxpbmVMaWNlbnNlKHRvSGlkbFZlYyhrZXlTZXRJZCkpOworICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUqIGxpY2Vuc2VTdGF0ZSkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpblYxXzIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgICpsaWNlbnNlU3RhdGUgPSBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVW5rbm93bjsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZVN0YXRlKAorICAgICAgICAgICAgdG9IaWRsVmVjKGtleVNldElkKSwgWyZdKFN0YXR1cyBzdGF0dXMsIE9mZmxpbmVMaWNlbnNlU3RhdGUgaExpY2Vuc2VTdGF0ZSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqbGljZW5zZVN0YXRlID0gdG9PZmZsaW5lTGljZW5zZVN0YXRlKGhMaWNlbnNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0pOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QmIG5hbWUsIFN0cmluZzgmIHZhbHVlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChuYW1lLCB2YWx1ZSk7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGludGVybmFsIHRvIHRoZSBjbGFzcyBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoaWxlCisgICAgLy8gbUxvY2sgaXMgYWxyZWFkeSBoZWxkLgorICAgIElOSVRfQ0hFQ0soKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldFByb3BlcnR5U3RyaW5nKAorICAgICAgICAgICAgdG9IaWRsU3RyaW5nKG5hbWUpLCBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF9zdHJpbmcmIGhWYWx1ZSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvU3RyaW5nOChoVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0pOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OmdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QmIG5hbWUsIFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKG5hbWUsIHZhbHVlKTsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6Z2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4IGNvbnN0JiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHZhbHVlKSBjb25zdCB7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBpbnRlcm5hbCB0byB0aGUgY2xhc3MgYW5kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGlsZQorICAgIC8vIG1Mb2NrIGlzIGFscmVhZHkgaGVsZC4KKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgICAgICAgIHRvSGlkbFN0cmluZyhuYW1lKSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoVmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b1ZlY3RvcihoVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0pOworCisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBpZiAobmFtZSA9PSBrUHJvcGVydHlEZXZpY2VVbmlxdWVJZCkgeworICAgICAgICBtTWV0cmljcy5tR2V0RGV2aWNlVW5pcXVlSWRDb3VudGVyLkluY3JlbWVudChlcnIpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpzZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0JiBuYW1lLCBTdHJpbmc4IGNvbnN0JiB2YWx1ZSkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+c2V0UHJvcGVydHlTdHJpbmcodG9IaWRsU3RyaW5nKG5hbWUpLCB0b0hpZGxTdHJpbmcodmFsdWUpKTsKKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnNldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QmIG5hbWUsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgdmFsdWUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnNldFByb3BlcnR5Qnl0ZUFycmF5KHRvSGlkbFN0cmluZyhuYW1lKSwgdG9IaWRsVmVjKHZhbHVlKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpnZXRNZXRyaWNzKGNvbnN0IHNwPElEcm1NZXRyaWNzQ29uc3VtZXI+JiBjb25zdW1lcikgeworICAgIGlmIChjb25zdW1lciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBVTkVYUEVDVEVEX05VTEw7CisgICAgfQorICAgIGNvbnN1bWVyLT5jb25zdW1lRnJhbWV3b3JrTWV0cmljcyhtTWV0cmljcyk7CisKKyAgICAvLyBBcHBlbmQgdmVuZG9yIG1ldHJpY3MgaWYgdGhleSBhcmUgc3VwcG9ydGVkLgorICAgIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7CisgICAgICAgIFN0cmluZzggdmVuZG9yOworICAgICAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOworICAgICAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKSAhPSBPSyB8fCB2ZW5kb3IuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiR2V0IHZlbmRvciBmYWlsZWQgb3IgaXMgZW1wdHkiKTsKKyAgICAgICAgICAgIHZlbmRvciA9ICJOT05FIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbikgIT0gT0sgfHwKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIkdldCBkZXNjcmlwdGlvbiBmYWlsZWQgb3IgaXMgZW1wdHkuIik7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJOT05FIjsKKyAgICAgICAgfQorICAgICAgICB2ZW5kb3IgKz0gIi4iOworICAgICAgICB2ZW5kb3IgKz0gZGVzY3JpcHRpb247CisKKyAgICAgICAgaGlkbF92ZWM8RHJtTWV0cmljR3JvdXA+IHBsdWdpbk1ldHJpY3M7CisgICAgICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzEtPmdldE1ldHJpY3MoWyZdKFN0YXR1cyBzdGF0dXMsIGhpZGxfdmVjPERybU1ldHJpY0dyb3VwPiBwbHVnaW5NZXRyaWNzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkVycm9yIGdldHRpbmcgcGx1Z2luIG1ldHJpY3M6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyLT5jb25zdW1lSGlkbE1ldHJpY3ModmVuZG9yLCBwbHVnaW5NZXRyaWNzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnNldENpcGhlckFsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0JiBhbGdvcml0aG0pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPQorICAgICAgICAgICAgbVBsdWdpbi0+c2V0Q2lwaGVyQWxnb3JpdGhtKHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxTdHJpbmcoYWxnb3JpdGhtKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpzZXRNYWNBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFN0cmluZzggY29uc3QmIGFsZ29yaXRobSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnNldE1hY0FsZ29yaXRobSh0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsU3RyaW5nKGFsZ29yaXRobSkpOworICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6ZW5jcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBpbnB1dCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBvdXRwdXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPQorICAgICAgICAgICAgbVBsdWdpbi0+ZW5jcnlwdCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGtleUlkKSwgdG9IaWRsVmVjKGlucHV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9IaWRsVmVjKGl2KSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSB0b1ZlY3RvcihoT3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpkZWNyeXB0KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIGlucHV0LCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIG91dHB1dCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9CisgICAgICAgICAgICBtUGx1Z2luLT5kZWNyeXB0KHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoa2V5SWQpLCB0b0hpZGxWZWMoaW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0hpZGxWZWMoaXYpLCBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHRvVmVjdG9yKGhPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbEhpZGw6OnNpZ24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zaWduKHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoa2V5SWQpLCB0b0hpZGxWZWMobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFNpZ25hdHVyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlID0gdG9WZWN0b3IoaFNpZ25hdHVyZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6dmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgbWF0Y2gpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIElOSVRfQ0hFQ0soKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPQorICAgICAgICAgICAgbVBsdWdpbi0+dmVyaWZ5KHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoa2V5SWQpLCB0b0hpZGxWZWMobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNpZ25hdHVyZSksIFsmXShTdGF0dXMgc3RhdHVzLCBib29sIGhNYXRjaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gaE1hdGNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpzaWduUlNBKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBTdHJpbmc4IGNvbnN0JiBhbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiB3cmFwcGVkS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHNpZ25hdHVyZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPnNpZ25SU0EoCisgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsU3RyaW5nKGFsZ29yaXRobSksIHRvSGlkbFZlYyhtZXNzYWdlKSwKKyAgICAgICAgICAgIHRvSGlkbFZlYyh3cmFwcGVkS2V5KSwgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoU2lnbmF0dXJlKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA9IHRvVmVjdG9yKGhTaWduYXR1cmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0pOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0ZDo6c3RyaW5nIERybUhhbEhpZGw6OnJlcG9ydEZyYW1ld29ya01ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbk1ldHJpY3MpIGNvbnN0IHsKKyAgICBtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaXRlbShtZWRpYW1ldHJpY3NfY3JlYXRlKCJtZWRpYWRybSIpKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0VWlkKGl0ZW0sIG1NZXRyaWNzLkdldEFwcFVpZCgpKTsKKyAgICBTdHJpbmc4IHZlbmRvcjsKKyAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOworICAgIHN0YXR1c190IHJlc3VsdCA9IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcik7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB2ZW5kb3IgZnJvbSBkcm0gcGx1Z2luOiAlZCIsIHJlc3VsdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcoaXRlbSwgInZlbmRvciIsIHZlbmRvci5jX3N0cigpKTsKKyAgICB9CisgICAgcmVzdWx0ID0gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbik7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBkZXNjcmlwdGlvbiBmcm9tIGRybSBwbHVnaW46ICVkIiwgcmVzdWx0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhpdGVtLCAiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbi5jX3N0cigpKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkTWV0cmljczsKKyAgICByZXN1bHQgPSBtTWV0cmljcy5HZXRTZXJpYWxpemVkTWV0cmljcygmc2VyaWFsaXplZE1ldHJpY3MpOworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXJpYWxpemUgZnJhbWV3b3JrIG1ldHJpY3M6ICVkIiwgcmVzdWx0KTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgYjY0RW5jb2RlZE1ldHJpY3MgPQorICAgICAgICAgICAgdG9CYXNlNjRTdHJpbmdOb1BhZChzZXJpYWxpemVkTWV0cmljcy5kYXRhKCksIHNlcmlhbGl6ZWRNZXRyaWNzLnNpemUoKSk7CisgICAgaWYgKCFiNjRFbmNvZGVkTWV0cmljcy5lbXB0eSgpKSB7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKGl0ZW0sICJzZXJpYWxpemVkX21ldHJpY3MiLCBiNjRFbmNvZGVkTWV0cmljcy5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKCFwbHVnaW5NZXRyaWNzLmVtcHR5KCkpIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcoaXRlbSwgInBsdWdpbl9tZXRyaWNzIiwgcGx1Z2luTWV0cmljcy5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKCFtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZChpdGVtKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlbGYgcmVjb3JkIGZyYW1ld29yayBtZXRyaWNzIik7CisgICAgfQorICAgIG1lZGlhbWV0cmljc19kZWxldGUoaXRlbSk7CisgICAgcmV0dXJuIHNlcmlhbGl6ZWRNZXRyaWNzOworfQorCitzdGQ6OnN0cmluZyBEcm1IYWxIaWRsOjpyZXBvcnRQbHVnaW5NZXRyaWNzKCkgY29uc3QgeworICAgIFZlY3Rvcjx1aW50OF90PiBtZXRyaWNzVmVjdG9yOworICAgIFN0cmluZzggdmVuZG9yOworICAgIFN0cmluZzggZGVzY3JpcHRpb247CisgICAgc3RkOjpzdHJpbmcgbWV0cmljc1N0cmluZzsKKyAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKSA9PSBPSyAmJgorICAgICAgICBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKSA9PSBPSyAmJgorICAgICAgICBnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKFN0cmluZzgoIm1ldHJpY3MiKSwgbWV0cmljc1ZlY3RvcikgPT0gT0spIHsKKyAgICAgICAgbWV0cmljc1N0cmluZyA9IHRvQmFzZTY0U3RyaW5nTm9QYWQobWV0cmljc1ZlY3Rvci5hcnJheSgpLCBtZXRyaWNzVmVjdG9yLnNpemUoKSk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IGFuZHJvaWQ6OnJlcG9ydERybVBsdWdpbk1ldHJpY3MobWV0cmljc1N0cmluZywgdmVuZG9yLCBkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWV0cmljcy5HZXRBcHBVaWQoKSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRyaWNzIHdlcmUgcmV0cmlldmVkIGJ1dCBjb3VsZCBub3QgYmUgcmVwb3J0ZWQ6ICVkIiwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWV0cmljc1N0cmluZzsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIqIG1pbWUsIGJvb2wqIHJlcXVpcmVkKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobVBsdWdpblYxXzQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gaFJlc3VsdCA9IG1QbHVnaW5WMV80LT5yZXF1aXJlc1NlY3VyZURlY29kZXJEZWZhdWx0KGhpZGxfc3RyaW5nKG1pbWUpKTsKKyAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIERybVV0aWxzOjpMT0cyQkUoInJlcXVpcmVzU2VjdXJlRGVjb2RlciB0eG4gZmFpbGVkOiAlcyIsIGhSZXN1bHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBpZiAocmVxdWlyZWQpIHsKKyAgICAgICAgKnJlcXVpcmVkID0gaFJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpyZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciogbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmVxdWlyZWQpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtUGx1Z2luVjFfNCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBoTGV2ZWwgPSB0b0hpZGxTZWN1cml0eUxldmVsKHNlY3VyaXR5TGV2ZWwpOworICAgIGF1dG8gaFJlc3VsdCA9IG1QbHVnaW5WMV80LT5yZXF1aXJlc1NlY3VyZURlY29kZXIoaGlkbF9zdHJpbmcobWltZSksIGhMZXZlbCk7CisgICAgaWYgKCFoUmVzdWx0LmlzT2soKSkgeworICAgICAgICBEcm1VdGlsczo6TE9HMkJFKCJyZXF1aXJlc1NlY3VyZURlY29kZXIgdHhuIGZhaWxlZDogJXMiLCBoUmVzdWx0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKHJlcXVpcmVkKSB7CisgICAgICAgICpyZXF1aXJlZCA9IGhSZXN1bHQ7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRHJtSGFsSGlkbDo6c2V0UGxheWJhY2tJZChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgY29uc3QgY2hhciogcGxheWJhY2tJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1QbHVnaW5WMV80ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBhdXRvIGVyciA9IG1QbHVnaW5WMV80LT5zZXRQbGF5YmFja0lkKHRvSGlkbFZlYyhzZXNzaW9uSWQpLCBoaWRsX3N0cmluZyhwbGF5YmFja0lkKSk7CisgICAgcmV0dXJuIGVyci5pc09rKCkgPyB0b1N0YXR1c1QoZXJyKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIERybVV0aWxzOjpHZXRMb2dNZXNzYWdlczxkcm06OlYxXzQ6OklEcm1QbHVnaW4+KG1QbHVnaW4sIGxvZ3MpOworfQorCitzdGF0dXNfdCBEcm1IYWxIaWRsOjpnZXRTdXBwb3J0ZWRTY2hlbWVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZzY2hlbWVzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gJmZhY3RvcnkgOiBtRmFjdG9yaWVzKSB7CisgICAgICAgIHNwPGRybTo6VjFfMzo6SURybUZhY3Rvcnk+IGZhY3RvcnlWMV8zID0gZHJtOjpWMV8zOjpJRHJtRmFjdG9yeTo6Y2FzdEZyb20oZmFjdG9yeSk7CisgICAgICAgIGlmIChmYWN0b3J5VjFfMyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZhY3RvcnlWMV8zLT5nZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKAorICAgICAgICAgICAgWyZdKGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9hcnJheTx1aW50OF90LCAxNj4+JiBzY2hlbWVzX2hpZGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnNjaGVtZSA6IHNjaGVtZXNfaGlkbCkgeworICAgICAgICAgICAgICAgICAgICBzY2hlbWVzLmluc2VydChzY2hlbWVzLmVuZCgpLCBzY2hlbWUuZGF0YSgpLCBzY2hlbWUuZGF0YSgpICsgc2NoZW1lLnNpemUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbExpc3RlbmVyLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWxMaXN0ZW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjZjQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWxMaXN0ZW5lci5jcHAKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRybUhhbExpc3RlbmVyIgorCisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsTGlzdGVuZXIuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTdGF0dXNUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IFZlY3Rvcjx1aW50OF90PiB0b1ZlY3Rvcihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdmVjKSB7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHZlY3RvcjsKKyAgICB2ZWN0b3IuYXBwZW5kQXJyYXkodmVjLmRhdGEoKSwgdmVjLnNpemUoKSk7CisgICAgcmV0dXJuICpjb25zdF9jYXN0PGNvbnN0IFZlY3Rvcjx1aW50OF90Pio+KCZ2ZWN0b3IpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCA9IHVpbnQ4X3Q+CitzdGF0aWMgaGlkbF92ZWM8VD4gdG9IaWRsVmVjKGNvbnN0IFZlY3RvcjxUPiYgdmVjdG9yKSB7CisgICAgaGlkbF92ZWM8VD4gdmVjOworICAgIHZlYy5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8VCo+KHZlY3Rvci5hcnJheSgpKSwgdmVjdG9yLnNpemUoKSk7CisgICAgcmV0dXJuIHZlYzsKK30KKworRHJtSGFsTGlzdGVuZXI6OkRybUhhbExpc3RlbmVyKE1lZGlhRHJtTWV0cmljcyogbWV0cmljcykKKyAgICA6IG1NZXRyaWNzKG1ldHJpY3MpIHt9CisKK0RybUhhbExpc3RlbmVyOjp+RHJtSGFsTGlzdGVuZXIoKSB7fQorCit2b2lkIERybUhhbExpc3RlbmVyOjpzZXRMaXN0ZW5lcihzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lcikgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1FdmVudExvY2spOworICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1IYWxMaXN0ZW5lcjo6b25FdmVudChFdmVudFR5cGVBaWRsIGV2ZW50VHlwZUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKSB7CisgICAgbU1ldHJpY3MtPm1FdmVudENvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClldmVudFR5cGVBaWRsKTsKKworICAgIG1FdmVudExvY2subG9jaygpOworICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIG1FdmVudExvY2sudW5sb2NrKCk7CisKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7CisgICAgICAgIERybVBsdWdpbjo6RXZlbnRUeXBlIGV2ZW50VHlwZTsKKyAgICAgICAgc3dpdGNoIChldmVudFR5cGVBaWRsKSB7CisgICAgICAgICAgICBjYXNlIEV2ZW50VHlwZUFpZGw6OlBST1ZJU0lPTl9SRVFVSVJFRDoKKyAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFByb3Zpc2lvblJlcXVpcmVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFdmVudFR5cGVBaWRsOjpLRVlfTkVFREVEOgorICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50S2V5TmVlZGVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFdmVudFR5cGVBaWRsOjpLRVlfRVhQSVJFRDoKKyAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudEtleUV4cGlyZWQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEV2ZW50VHlwZUFpZGw6OlZFTkRPUl9ERUZJTkVEOgorICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50VmVuZG9yRGVmaW5lZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlQWlkbDo6U0VTU0lPTl9SRUNMQUlNRUQ6CisgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRTZXNzaW9uUmVjbGFpbWVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgICAgIH0KKworICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KGV2ZW50VHlwZSwgdG9IaWRsVmVjKHRvVmVjdG9yKHNlc3Npb25JZCkpLCB0b0hpZGxWZWModG9WZWN0b3IoZGF0YSkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybUhhbExpc3RlbmVyOjpvbkV4cGlyYXRpb25VcGRhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKSB7CisgICAgbUV2ZW50TG9jay5sb2NrKCk7CisgICAgc3A8SURybUNsaWVudD4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgbGlzdGVuZXItPnNlbmRFeHBpcmF0aW9uVXBkYXRlKHRvSGlkbFZlYyh0b1ZlY3RvcihzZXNzaW9uSWQpKSwgZXhwaXJ5VGltZUluTVMpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtSGFsTGlzdGVuZXI6Om9uS2V5c0NoYW5nZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEtleVN0YXR1c0FpZGw+JiBrZXlTdGF0dXNMaXN0QWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc05ld1VzYWJsZUtleSkgeworICAgIG1FdmVudExvY2subG9jaygpOworICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIG1FdmVudExvY2sudW5sb2NrKCk7CisKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxEcm1LZXlTdGF0dXM+IGtleVN0YXR1c0xpc3Q7CisgICAgICAgIHNpemVfdCBuS2V5cyA9IGtleVN0YXR1c0xpc3RBaWRsLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuS2V5czsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBLZXlTdGF0dXNBaWRsIGtleVN0YXR1cyA9IGtleVN0YXR1c0xpc3RBaWRsW2ldOworICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgICAgIHN3aXRjaCAoa2V5U3RhdHVzLnR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OlVTQUJMRToKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfVXNhYmxlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OkVYUElSRUQ6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX0V4cGlyZWQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6T1VUUFVUX05PVF9BTExPV0VEOgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9PdXRwdXROb3RBbGxvd2VkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OlNUQVRVU19QRU5ESU5HOgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9TdGF0dXNQZW5kaW5nOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OlVTQUJMRV9JTl9GVVRVUkU6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX1VzYWJsZUluRnV0dXJlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OklOVEVSTkFMX0VSUk9SOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX0ludGVybmFsRXJyb3I7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAga2V5U3RhdHVzTGlzdC5wdXNoX2JhY2soe3R5cGUsIHRvSGlkbFZlYyh0b1ZlY3RvcihrZXlTdGF0dXMua2V5SWQpKX0pOworICAgICAgICAgICAgbU1ldHJpY3MtPm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3Qpa2V5U3RhdHVzLnR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU5vdGlmeUxvY2spOworICAgICAgICBsaXN0ZW5lci0+c2VuZEtleXNDaGFuZ2UodG9IaWRsVmVjKHRvVmVjdG9yKHNlc3Npb25JZCkpLCBrZXlTdGF0dXNMaXN0LCBoYXNOZXdVc2FibGVLZXkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gVGhlcmUncyBubyBsaXN0ZW5lci4gQnV0IHdlIHN0aWxsIHdhbnQgdG8gY291bnQgdGhlIGtleSBjaGFuZ2UKKyAgICAgICAgLy8gZXZlbnRzLgorICAgICAgICBzaXplX3QgbktleXMgPSBrZXlTdGF0dXNMaXN0QWlkbC5zaXplKCk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuS2V5czsgaSsrKSB7CisgICAgICAgICAgICBtTWV0cmljcy0+bUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClrZXlTdGF0dXNMaXN0QWlkbFtpXS50eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtSGFsTGlzdGVuZXI6Om9uU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgX2FpZGxfc3RhdHVzOworICAgIG1FdmVudExvY2subG9jaygpOworICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIG1FdmVudExvY2sudW5sb2NrKCk7CisKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7CisgICAgICAgIGxpc3RlbmVyLT5zZW5kU2Vzc2lvbkxvc3RTdGF0ZSh0b0hpZGxWZWModG9WZWN0b3Ioc2Vzc2lvbklkKSkpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljcy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljcy5jcHAKaW5kZXggOTk2ZmQxOS4uNzdiNTM0MyAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3MuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1NZXRyaWNzLmNwcApAQCAtMTIzLDIwICsxMjMsMTkgQEAKICAgICAgICAgfSk7CiAKICAgICBtS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5FeHBvcnRWYWx1ZXMoCi0gICAgICAgIFsmXShjb25zdCBLZXlTdGF0dXNUeXBlIGtleV9zdGF0dXNfdHlwZSwgY29uc3QgaW50NjRfdCB2YWx1ZSkgeworICAgICAgICBbJl0oY29uc3QgdWludDMyX3Qga2V5X3N0YXR1c190eXBlLCBjb25zdCBpbnQ2NF90IHZhbHVlKSB7CiAgICAgICAgICAgICBEcm1GcmFtZXdvcmtNZXRyaWNzOjpDb3VudGVyICpjb3VudGVyID0KICAgICAgICAgICAgICAgICBtZXRyaWNzLmFkZF9rZXlfc3RhdHVzX2NoYW5nZV9jb3VudGVyKCk7CiAgICAgICAgICAgICBjb3VudGVyLT5zZXRfY291bnQodmFsdWUpOwotICAgICAgICAgICAgY291bnRlci0+bXV0YWJsZV9hdHRyaWJ1dGVzKCktPnNldF9rZXlfc3RhdHVzX3R5cGUoCi0gICAgICAgICAgICAgICAgKHVpbnQzMl90KWtleV9zdGF0dXNfdHlwZSk7CisgICAgICAgICAgICBjb3VudGVyLT5tdXRhYmxlX2F0dHJpYnV0ZXMoKS0+c2V0X2tleV9zdGF0dXNfdHlwZShrZXlfc3RhdHVzX3R5cGUpOwogICAgICAgICB9KTsKIAogICAgIG1FdmVudENvdW50ZXIuRXhwb3J0VmFsdWVzKAotICAgICAgICBbJl0oY29uc3QgRXZlbnRUeXBlIGV2ZW50X3R5cGUsIGNvbnN0IGludDY0X3QgdmFsdWUpIHsKKyAgICAgICAgWyZdKGNvbnN0IHVpbnQzMl90IGV2ZW50X3R5cGUsIGNvbnN0IGludDY0X3QgdmFsdWUpIHsKICAgICAgICAgICAgIERybUZyYW1ld29ya01ldHJpY3M6OkNvdW50ZXIgKmNvdW50ZXIgPQogICAgICAgICAgICAgICAgIG1ldHJpY3MuYWRkX2V2ZW50X2NhbGxiYWNrX2NvdW50ZXIoKTsKICAgICAgICAgICAgIGNvdW50ZXItPnNldF9jb3VudCh2YWx1ZSk7Ci0gICAgICAgICAgICBjb3VudGVyLT5tdXRhYmxlX2F0dHJpYnV0ZXMoKS0+c2V0X2V2ZW50X3R5cGUoKHVpbnQzMl90KWV2ZW50X3R5cGUpOworICAgICAgICAgICAgY291bnRlci0+bXV0YWJsZV9hdHRyaWJ1dGVzKCktPnNldF9ldmVudF90eXBlKGV2ZW50X3R5cGUpOwogICAgICAgICB9KTsKIAogICAgIG1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuRXhwb3J0VmFsdWVzKApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3NDb25zdW1lci5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljc0NvbnN1bWVyLmNwcAppbmRleCA1ZjBiMjZlLi5jMDZmMDliIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljc0NvbnN1bWVyLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljc0NvbnN1bWVyLmNwcApAQCAtMzIsMjYgKzMyLDI0IEBACiAKIG5hbWVzcGFjZSB7CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGQ6OnN0cmluZyBHZXRBdHRyaWJ1dGVOYW1lKFQgdHlwZSk7Ci0KLXRlbXBsYXRlIDw+IHN0ZDo6c3RyaW5nIEdldEF0dHJpYnV0ZU5hbWU8S2V5U3RhdHVzVHlwZT4oS2V5U3RhdHVzVHlwZSB0eXBlKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVfbmFtZXNbXSA9IHsiVVNBQkxFIiwgIkVYUElSRUQiLAorc3RkOjpzdHJpbmcgR2V0QXR0cmlidXRlTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsIHVpbnQzMl90IGF0dHJpYnV0ZSkgeworICAgIGlmICh0eXBlTmFtZSA9PSAiS2V5U3RhdHVzQ2hhbmdlIikgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqdHlwZV9uYW1lc1tdID0geyJVU0FCTEUiLCAiRVhQSVJFRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1VUUFVUX05PVF9BTExPV0VEIiwgIlNUQVRVU19QRU5ESU5HIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlRFUk5BTF9FUlJPUiIsICJVU0FCTEVfSU5fRlVUVVJFIn07Ci0gICAgaWYgKCgoc2l6ZV90KXR5cGUpID49IGFycmF5c2l6ZSh0eXBlX25hbWVzKSkgewotICAgICAgICByZXR1cm4gIlVOS05PV05fVFlQRSI7CisgICAgICAgIGlmIChhdHRyaWJ1dGUgPj0gYXJyYXlzaXplKHR5cGVfbmFtZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gIlVOS05PV05fVFlQRSI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHR5cGVfbmFtZXNbYXR0cmlidXRlXTsKICAgICB9Ci0gICAgcmV0dXJuIHR5cGVfbmFtZXNbKHNpemVfdCl0eXBlXTsKLX0KLQotdGVtcGxhdGUgPD4gc3RkOjpzdHJpbmcgR2V0QXR0cmlidXRlTmFtZTxFdmVudFR5cGU+KEV2ZW50VHlwZSB0eXBlKSB7CisgICAgCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVfbmFtZXNbXSA9IHsiUFJPVklTSU9OX1JFUVVJUkVEIiwgIktFWV9ORUVERUQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktFWV9FWFBJUkVEIiwgIlZFTkRPUl9ERUZJTkVEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRVNTSU9OX1JFQ0xBSU1FRCJ9OwotICAgIGlmICgoKHNpemVfdCl0eXBlKSA+PSBhcnJheXNpemUodHlwZV9uYW1lcykpIHsKKyAgICBpZiAoYXR0cmlidXRlID49IGFycmF5c2l6ZSh0eXBlX25hbWVzKSkgewogICAgICAgICByZXR1cm4gIlVOS05PV05fVFlQRSI7CiAgICAgfQotICAgIHJldHVybiB0eXBlX25hbWVzWyhzaXplX3QpdHlwZV07CisgICAgcmV0dXJuIHR5cGVfbmFtZXNbYXR0cmlidXRlXTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CkBAIC04NywxNCArODUsMTQgQEAKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiB2b2lkIEV4cG9ydENvdW50ZXJNZXRyaWNXaXRoQXR0cmlidXRlTmFtZXMoCi0gICAgY29uc3QgYW5kcm9pZDo6Q291bnRlck1ldHJpYzxUPiAmY291bnRlciwgUGVyc2lzdGFibGVCdW5kbGUgKm1ldHJpY3MpIHsKKyAgICBjb25zdCBhbmRyb2lkOjpDb3VudGVyTWV0cmljPFQ+ICZjb3VudGVyLCBjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsIFBlcnNpc3RhYmxlQnVuZGxlICptZXRyaWNzKSB7CiAgICAgaWYgKCFtZXRyaWNzKSB7CiAgICAgICAgIEFMT0dFKCJtZXRyaWNzIHdhcyB1bmV4cGVjdGVkbHkgbnVsbC4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBjb3VudGVyLkV4cG9ydFZhbHVlcyhbJl0oY29uc3QgVCAmYXR0cmlidXRlLCBjb25zdCBpbnQ2NF90IHZhbHVlKSB7CisgICAgY291bnRlci5FeHBvcnRWYWx1ZXMoWyZdKGNvbnN0IHVpbnQzMl90IGF0dHJpYnV0ZSwgY29uc3QgaW50NjRfdCB2YWx1ZSkgewogICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gY291bnRlci5tZXRyaWNfbmFtZSgpICsgIi4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlKSArICIuY291bnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0QXR0cmlidXRlTmFtZSh0eXBlTmFtZSwgYXR0cmlidXRlKSArICIuY291bnQiOwogICAgICAgICBtZXRyaWNzLT5wdXRMb25nKGFuZHJvaWQ6OlN0cmluZzE2KG5hbWUuY19zdHIoKSksIHZhbHVlKTsKICAgICB9KTsKIH0KQEAgLTE5Niw4ICsxOTQsOCBAQAogICAgIEV4cG9ydEV2ZW50TWV0cmljKG1ldHJpY3MubVByb3ZpZGVLZXlSZXNwb25zZVRpbWVVcywgbUJ1bmRsZSk7CiAgICAgRXhwb3J0Q291bnRlck1ldHJpYyhtZXRyaWNzLm1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlciwgbUJ1bmRsZSk7CiAgICAgRXhwb3J0Q291bnRlck1ldHJpYyhtZXRyaWNzLm1Qcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VDb3VudGVyLCBtQnVuZGxlKTsKLSAgICBFeHBvcnRDb3VudGVyTWV0cmljV2l0aEF0dHJpYnV0ZU5hbWVzKG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIsIG1CdW5kbGUpOwotICAgIEV4cG9ydENvdW50ZXJNZXRyaWNXaXRoQXR0cmlidXRlTmFtZXMobWV0cmljcy5tRXZlbnRDb3VudGVyLCBtQnVuZGxlKTsKKyAgICBFeHBvcnRDb3VudGVyTWV0cmljV2l0aEF0dHJpYnV0ZU5hbWVzKG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIsICJLZXlTdGF0dXNDaGFuZ2UiLCBtQnVuZGxlKTsKKyAgICBFeHBvcnRDb3VudGVyTWV0cmljV2l0aEF0dHJpYnV0ZU5hbWVzKG1ldHJpY3MubUV2ZW50Q291bnRlciwgIkV2ZW50IiwgbUJ1bmRsZSk7CiAgICAgRXhwb3J0Q291bnRlck1ldHJpYyhtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIsIG1CdW5kbGUpOwogICAgIEV4cG9ydFNlc3Npb25MaWZlc3BhbnMobWV0cmljcy5HZXRTZXNzaW9uTGlmZXNwYW5zKCksIG1CdW5kbGUpOwogICAgIHJldHVybiBhbmRyb2lkOjpPSzsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9Ecm1VdGlscy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtVXRpbHMuY3BwCmluZGV4IDBiMTE3YTMuLmJlMGNkNGIgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9Ecm1VdGlscy5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0RybVV0aWxzLmNwcApAQCAtMTcsNiArMTcsNyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJEcm1VdGlscyIKIAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b1BsdWdpbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtRmFjdG9yeS5oPgpAQCAtMzIsMTAgKzMzLDEwIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4yL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KIAorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsLmg+CkBAIC01NywxMCArNTgsMTAgQEAKIAogbmFtZXNwYWNlIHsKIAotdGVtcGxhdGU8dHlwZW5hbWUgSGFsPgotSGFsICpNYWtlT2JqZWN0KHN0YXR1c190ICpwc3RhdHVzKSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFsPgorSGFsKiBNYWtlT2JqZWN0KHN0YXR1c190KiBwc3RhdHVzKSB7CiAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgc3RhdHVzX3QgJnN0YXR1cyA9IHBzdGF0dXMgPyAqcHN0YXR1cyA6IGVycjsKKyAgICBzdGF0dXNfdCYgc3RhdHVzID0gcHN0YXR1cyA/ICpwc3RhdHVzIDogZXJyOwogICAgIGF1dG8gb2JqID0gbmV3IEhhbCgpOwogICAgIHN0YXR1cyA9IG9iai0+aW5pdENoZWNrKCk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSyAmJiBzdGF0dXMgIT0gTk9fSU5JVCkgewpAQCAtNzAsNDMgKzcxLDQ0IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBIYWwsIHR5cGVuYW1lIFYsIHR5cGVuYW1lIE0+Ci12b2lkIE1ha2VIaWRsRmFjdG9yaWVzKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIFYgJmZhY3RvcmllcywgTSYgaW5zdGFuY2VzKSB7Cit2b2lkIE1ha2VIaWRsRmFjdG9yaWVzKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIFYmIGZhY3RvcmllcywgTSYgaW5zdGFuY2VzKSB7CiAgICAgc3A8SFNlcnZpY2VNYW5hZ2VyPiBzZXJ2aWNlTWFuYWdlciA9IEhTZXJ2aWNlTWFuYWdlcjo6Z2V0U2VydmljZSgpOwogICAgIGlmIChzZXJ2aWNlTWFuYWdlciA9PSBudWxscHRyKSB7CiAgICAgICAgIExPRzJCRSgiRmFpbGVkIHRvIGdldCBzZXJ2aWNlIG1hbmFnZXIiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNlcnZpY2VNYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZShIYWw6OmRlc2NyaXB0b3IsIFsmXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gJnJlZ2lzdGVyZWQpIHsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IEhhbDo6Z2V0U2VydmljZShpbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgaW5zdGFuY2VzW2luc3RhbmNlLmNfc3RyKCldID0gSGFsOjpkZXNjcmlwdG9yOwotICAgICAgICAgICAgICAgIGlmICghdXVpZCkgewotICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICBzZXJ2aWNlTWFuYWdlci0+bGlzdE1hbmlmZXN0QnlJbnRlcmZhY2UoCisgICAgICAgICAgICBIYWw6OmRlc2NyaXB0b3IsIFsmXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGluc3RhbmNlIDogcmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBIYWw6OmdldFNlcnZpY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXNbaW5zdGFuY2UuY19zdHIoKV0gPSBIYWw6OmRlc2NyaXB0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXV1aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBzdXBwb3J0ZWQgPSBmYWN0b3J5LT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3VwcG9ydGVkLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRzJCRSh1dWlkLCAiaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQgdHhuIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF1dG8gc3VwcG9ydGVkID0gZmFjdG9yeS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdXBwb3J0ZWQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRzJCRSh1dWlkLCAiaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQgdHhuIGZhaWxlZDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSk7CisgICAgICAgICAgICB9KTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEhhbCwgdHlwZW5hbWUgVj4KLXZvaWQgTWFrZUhpZGxGYWN0b3JpZXMoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgViAmZmFjdG9yaWVzKSB7Cit2b2lkIE1ha2VIaWRsRmFjdG9yaWVzKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIFYmIGZhY3RvcmllcykgewogICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gaW5zdGFuY2VzOwogICAgIE1ha2VIaWRsRmFjdG9yaWVzPEhhbD4odXVpZCwgZmFjdG9yaWVzLCBpbnN0YW5jZXMpOwogfQogCi1oaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxWZWMoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkgeworaGlkbF92ZWM8dWludDhfdD4gdG9IaWRsVmVjKGNvbnN0IHZvaWQqIHB0ciwgc2l6ZV90IHNpemUpIHsKICAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWMoc2l6ZSk7CiAgICAgaWYgKHB0ciAhPSBudWxscHRyKSB7CiAgICAgICAgIG1lbWNweSh2ZWMuZGF0YSgpLCBwdHIsIHNpemUpOwpAQCAtMTE0LDE5ICsxMTYsMTkgQEAKICAgICByZXR1cm4gdmVjOwogfQogCi1oaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiB0b0hpZGxBcnJheTE2KGNvbnN0IHVpbnQ4X3QgKnB0cikgeworaGlkbF9hcnJheTx1aW50OF90LCAxNj4gdG9IaWRsQXJyYXkxNihjb25zdCB1aW50OF90KiBwdHIpIHsKICAgICBpZiAocHRyID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIGhpZGxfYXJyYXk8dWludDhfdCwgMTY+KCk7CiAgICAgfQogICAgIHJldHVybiBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PihwdHIpOwogfQogCi1zcDw6OlYxXzA6OklEcm1QbHVnaW4+IE1ha2VEcm1QbHVnaW4oY29uc3Qgc3A8OjpWMV8wOjpJRHJtRmFjdG9yeT4gJmZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgY2hhciAqYXBwUGFja2FnZU5hbWUpIHsKK3NwPDo6VjFfMDo6SURybVBsdWdpbj4gTWFrZURybVBsdWdpbihjb25zdCBzcDw6OlYxXzA6OklEcm1GYWN0b3J5PiYgZmFjdG9yeSwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhcHBQYWNrYWdlTmFtZSkgewogICAgIHNwPDo6VjFfMDo6SURybVBsdWdpbj4gcGx1Z2luOwogICAgIGF1dG8gZXJyID0gZmFjdG9yeS0+Y3JlYXRlUGx1Z2luKAogICAgICAgICAgICAgdG9IaWRsQXJyYXkxNih1dWlkKSwgaGlkbF9zdHJpbmcoYXBwUGFja2FnZU5hbWUpLAotICAgICAgICAgICAgWyZdKDo6VjFfMDo6U3RhdHVzIHN0YXR1cywgY29uc3Qgc3A8OjpWMV8wOjpJRHJtUGx1Z2luPiAmaFBsdWdpbikgeworICAgICAgICAgICAgWyZdKDo6VjFfMDo6U3RhdHVzIHN0YXR1cywgY29uc3Qgc3A8OjpWMV8wOjpJRHJtUGx1Z2luPiYgaFBsdWdpbikgewogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gOjpWMV8wOjpTdGF0dXM6Ok9LKSB7CiAgICAgICAgICAgICAgICAgICAgIExPRzJCRSh1dWlkLCAiTWFrZURybVBsdWdpbiBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTQxLDEzICsxNDMsMTMgQEAKICAgICB9CiB9CiAKLXNwPDo6VjFfMDo6SUNyeXB0b1BsdWdpbj4gTWFrZUNyeXB0b1BsdWdpbihjb25zdCBzcDw6OlYxXzA6OklDcnlwdG9GYWN0b3J5PiAmZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICppbml0RGF0YSwKK3NwPDo6VjFfMDo6SUNyeXB0b1BsdWdpbj4gTWFrZUNyeXB0b1BsdWdpbihjb25zdCBzcDw6OlYxXzA6OklDcnlwdG9GYWN0b3J5PiYgZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkKiBpbml0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5pdERhdGFTaXplKSB7CiAgICAgc3A8OjpWMV8wOjpJQ3J5cHRvUGx1Z2luPiBwbHVnaW47CiAgICAgYXV0byBlcnIgPSBmYWN0b3J5LT5jcmVhdGVQbHVnaW4oCiAgICAgICAgICAgICB0b0hpZGxBcnJheTE2KHV1aWQpLCB0b0hpZGxWZWMoaW5pdERhdGEsIGluaXREYXRhU2l6ZSksCi0gICAgICAgICAgICBbJl0oOjpWMV8wOjpTdGF0dXMgc3RhdHVzLCBjb25zdCBzcDw6OlYxXzA6OklDcnlwdG9QbHVnaW4+ICZoUGx1Z2luKSB7CisgICAgICAgICAgICBbJl0oOjpWMV8wOjpTdGF0dXMgc3RhdHVzLCBjb25zdCBzcDw6OlYxXzA6OklDcnlwdG9QbHVnaW4+JiBoUGx1Z2luKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSA6OlYxXzA6OlN0YXR1czo6T0spIHsKICAgICAgICAgICAgICAgICAgICAgTE9HMkJFKHV1aWQsICJNYWtlQ3J5cHRvUGx1Z2luIGZhaWxlZDogJWQiLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0xNjIsMTcgKzE2NCwzOCBAQAogICAgIH0KIH0KIAotfSAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZQogCiBib29sIFVzZURybVNlcnZpY2UoKSB7CiAgICAgcmV0dXJuIHByb3BlcnR5X2dldF9ib29sKCJtZWRpYWRybS51c2VfbWVkaWFkcm1zZXJ2ZXIiLCB0cnVlKTsKIH0KIAotc3A8SURybT4gTWFrZURybShzdGF0dXNfdCAqcHN0YXR1cykgeworc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElEcm1GYWN0b3J5QWlkbD4+IG1ha2VEcm1GYWN0b3JpZXNBaWRsKCkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJRHJtRmFjdG9yeUFpZGw+PiBmYWN0b3JpZXM7CisgICAgQVNlcnZpY2VNYW5hZ2VyX2ZvckVhY2hEZWNsYXJlZEluc3RhbmNlKAorICAgICAgICBJRHJtRmFjdG9yeUFpZGw6OmRlc2NyaXB0b3IsIHN0YXRpY19jYXN0PHZvaWQqPigmZmFjdG9yaWVzKSwKKyAgICAgICAgW10oY29uc3QgY2hhciogaW5zdGFuY2UsIHZvaWQqIGNvbnRleHQpIHsKKyAgICAgICAgICAgIGF1dG8gZnVsbE5hbWUgPSBzdGQ6OnN0cmluZyhJRHJtRmFjdG9yeUFpZGw6OmRlc2NyaXB0b3IpICsgIi8iICsgc3RkOjpzdHJpbmcoaW5zdGFuY2UpOworICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gSURybUZhY3RvcnlBaWRsOjpmcm9tQmluZGVyKAorICAgICAgICAgICAgICAgICAgICA6Om5kazo6U3BBSUJpbmRlcihBU2VydmljZU1hbmFnZXJfd2FpdEZvclNlcnZpY2UoZnVsbE5hbWUuY19zdHIoKSkpKTsKKyAgICAgICAgICAgIGlmIChmYWN0b3J5ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibm90IGZvdW5kIElEcm1GYWN0b3J5LiBJbnN0YW5jZSBuYW1lOlslc10iLCBmdWxsTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBJRHJtRmFjdG9yeS4gSW5zdGFuY2UgbmFtZTpbJXNdIiwgZnVsbE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SURybUZhY3RvcnlBaWRsPj4qPihjb250ZXh0KS0+ZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgICAgICBmYWN0b3J5KTsKKyAgICAgICAgfSk7CisKKyAgICByZXR1cm4gZmFjdG9yaWVzOworfQorCitzcDxJRHJtPiBNYWtlRHJtKHN0YXR1c190KiBwc3RhdHVzKSB7CiAgICAgcmV0dXJuIE1ha2VPYmplY3Q8RHJtSGFsPihwc3RhdHVzKTsKIH0KIAotc3A8SUNyeXB0bz4gTWFrZUNyeXB0byhzdGF0dXNfdCAqcHN0YXR1cykgeworc3A8SUNyeXB0bz4gTWFrZUNyeXB0byhzdGF0dXNfdCogcHN0YXR1cykgewogICAgIHJldHVybiBNYWtlT2JqZWN0PENyeXB0b0hhbD4ocHN0YXR1cyk7CiB9CiAKQEAgLTE5MSw5ICsyMTQsOSBAQAogfQogCiBzdGQ6OnZlY3RvcjxzcDw6OlYxXzA6OklEcm1QbHVnaW4+PiBNYWtlRHJtUGx1Z2lucyhjb25zdCB1aW50OF90IHV1aWRbMTZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFwcFBhY2thZ2VOYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhcHBQYWNrYWdlTmFtZSkgewogICAgIHN0ZDo6dmVjdG9yPHNwPDo6VjFfMDo6SURybVBsdWdpbj4+IHBsdWdpbnM7Ci0gICAgZm9yIChjb25zdCBhdXRvICZmYWN0b3J5IDogTWFrZURybUZhY3Rvcmllcyh1dWlkKSkgeworICAgIGZvciAoY29uc3QgYXV0byYgZmFjdG9yeSA6IE1ha2VEcm1GYWN0b3JpZXModXVpZCkpIHsKICAgICAgICAgcGx1Z2lucy5wdXNoX2JhY2soTWFrZURybVBsdWdpbihmYWN0b3J5LCB1dWlkLCBhcHBQYWNrYWdlTmFtZSkpOwogICAgIH0KICAgICByZXR1cm4gcGx1Z2luczsKQEAgLTIwOSwxMCArMjMyLDExIEBACiAgICAgcmV0dXJuIGNyeXB0b0ZhY3RvcmllczsKIH0KIAotc3RkOjp2ZWN0b3I8c3A8SUNyeXB0b1BsdWdpbj4+IE1ha2VDcnlwdG9QbHVnaW5zKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQgKmluaXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbml0RGF0YVNpemUpIHsKLSAgICBzdGQ6OnZlY3RvcjxzcDxJQ3J5cHRvUGx1Z2luPj4gcGx1Z2luczsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJmZhY3RvcnkgOiBNYWtlQ3J5cHRvRmFjdG9yaWVzKHV1aWQpKSB7CitzdGQ6OnZlY3RvcjxzcDw6OlYxXzA6OklDcnlwdG9QbHVnaW4+PiBNYWtlQ3J5cHRvUGx1Z2lucyhjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5pdERhdGFTaXplKSB7CisgICAgc3RkOjp2ZWN0b3I8c3A8OjpWMV8wOjpJQ3J5cHRvUGx1Z2luPj4gcGx1Z2luczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZhY3RvcnkgOiBNYWtlQ3J5cHRvRmFjdG9yaWVzKHV1aWQpKSB7CiAgICAgICAgIHBsdWdpbnMucHVzaF9iYWNrKE1ha2VDcnlwdG9QbHVnaW4oZmFjdG9yeSwgdXVpZCwgaW5pdERhdGEsIGluaXREYXRhU2l6ZSkpOwogICAgIH0KICAgICByZXR1cm4gcGx1Z2luczsKQEAgLTIyMCw5MCArMjQ0LDkwIEBACiAKIHN0YXR1c190IHRvU3RhdHVzVF8xXzQoOjpWMV80OjpTdGF0dXMgc3RhdHVzKSB7CiAgICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpPSzoKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkJBRF9WQUxVRToKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9ERUNSWVBUOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0RFQ1JZUFQ7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX0RFVklDRV9SRVZPS0VEOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0RFVklDRV9SRVZPS0VEOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfT1VUUFVUX1BST1RFQ1RJT046Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0lOVkFMSURfU1RBVEU7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX0xJQ0VOU0VfRVhQSVJFRDoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX0VYUElSRUQ7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX05PX0xJQ0VOU0U6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX05PVF9QUk9WSVNJT05FRDsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9SRVNPVVJDRV9DT05URU5USU9OOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT047Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6Ok9LOgorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpCQURfVkFMVUU6CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRToKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX0RFQ1JZUFQ6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0RFQ1JZUFQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9ERVZJQ0VfUkVWT0tFRDoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRTsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX0lOU1VGRklDSUVOVF9PVVRQVVRfUFJPVEVDVElPTjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fTElDRU5TRV9FWFBJUkVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX0VYUElSRUQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9OT19MSUNFTlNFOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT1RfUFJPVklTSU9ORUQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURToKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CiAKLSAgICAvLyBOZXcgaW4gUyAvIGRybUAxLjQ6Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6Q0FOTk9UX0RFQ1JZUFRfWkVST19TVUJTQU1QTEVTOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1pFUk9fU1VCU0FNUExFUzsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpDUllQVE9fTElCUkFSWV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DUllQVE9fTElCUkFSWTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpHRU5FUkFMX09FTV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9HRU5FUklDX09FTTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpHRU5FUkFMX1BMVUdJTl9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9HRU5FUklDX1BMVUdJTjsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpJTklUX0RBVEFfSU5WQUxJRDoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTklUX0RBVEE7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6S0VZX05PVF9MT0FERUQ6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fS0VZX05PVF9MT0FERUQ7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9QQVJTRV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1BBUlNFOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkxJQ0VOU0VfUE9MSUNZX0VSUk9SOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUE9MSUNZOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkxJQ0VOU0VfUkVMRUFTRV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1JFTEVBU0U7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9SRVFVRVNUX1JFSkVDVEVEOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUkVRVUVTVF9SRUpFQ1RFRDsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpMSUNFTlNFX1JFU1RPUkVfRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9SRVNUT1JFOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkxJQ0VOU0VfU1RBVEVfRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9TVEFURTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpNQUxGT1JNRURfQ0VSVElGSUNBVEU6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0VSVElGSUNBVEVfTUFMRk9STUVEOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6Ok1FRElBX0ZSQU1FV09SS19FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9NRURJQV9GUkFNRVdPUks7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TUlTU0lOR19DRVJUSUZJQ0FURToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DRVJUSUZJQ0FURV9NSVNTSU5HOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlBST1ZJU0lPTklOR19DRVJUSUZJQ0FURV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9QUk9WSVNJT05JTkdfQ0VSVElGSUNBVEU7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6UFJPVklTSU9OSU5HX0NPTkZJR1VSQVRJT05fRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX0NPTkZJRzsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpQUk9WSVNJT05JTkdfUEFSU0VfRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1BBUlNFOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlBST1ZJU0lPTklOR19SRVFVRVNUX1JFSkVDVEVEOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1BST1ZJU0lPTklOR19SRVFVRVNUX1JFSkVDVEVEOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlJFVFJZQUJMRV9QUk9WSVNJT05JTkdfRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1JFVFJZOwotICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlNFQ1VSRV9TVE9QX1JFTEVBU0VfRVJST1I6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VDVVJFX1NUT1BfUkVMRUFTRTsKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpTVE9SQUdFX1JFQURfRkFJTFVSRToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TVE9SQUdFX1JFQUQ7Ci0gICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6U1RPUkFHRV9XUklURV9GQUlMVVJFOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NUT1JBR0VfV1JJVEU7CisgICAgICAgIC8vIE5ldyBpbiBTIC8gZHJtQDEuNDoKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6Q0FOTk9UX0RFQ1JZUFRfWkVST19TVUJTQU1QTEVTOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9aRVJPX1NVQlNBTVBMRVM7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkNSWVBUT19MSUJSQVJZX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DUllQVE9fTElCUkFSWTsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6R0VORVJBTF9PRU1fRVJST1I6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0dFTkVSSUNfT0VNOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpHRU5FUkFMX1BMVUdJTl9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fR0VORVJJQ19QTFVHSU47CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OklOSVRfREFUQV9JTlZBTElEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTklUX0RBVEE7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OktFWV9OT1RfTE9BREVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9LRVlfTk9UX0xPQURFRDsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9QQVJTRV9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9QQVJTRTsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9QT0xJQ1lfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUE9MSUNZOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpMSUNFTlNFX1JFTEVBU0VfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUkVMRUFTRTsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9SRVFVRVNUX1JFSkVDVEVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1JFUVVFU1RfUkVKRUNURUQ7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkxJQ0VOU0VfUkVTVE9SRV9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9SRVNUT1JFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpMSUNFTlNFX1NUQVRFX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1NUQVRFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpNQUxGT1JNRURfQ0VSVElGSUNBVEU6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NFUlRJRklDQVRFX01BTEZPUk1FRDsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TUVESUFfRlJBTUVXT1JLX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9NRURJQV9GUkFNRVdPUks7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6Ok1JU1NJTkdfQ0VSVElGSUNBVEU6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NFUlRJRklDQVRFX01JU1NJTkc7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlBST1ZJU0lPTklOR19DRVJUSUZJQ0FURV9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX0NFUlRJRklDQVRFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpQUk9WSVNJT05JTkdfQ09ORklHVVJBVElPTl9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX0NPTkZJRzsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6UFJPVklTSU9OSU5HX1BBUlNFX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9QUk9WSVNJT05JTkdfUEFSU0U7CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlBST1ZJU0lPTklOR19SRVFVRVNUX1JFSkVDVEVEOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9QUk9WSVNJT05JTkdfUkVRVUVTVF9SRUpFQ1RFRDsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6UkVUUllBQkxFX1BST1ZJU0lPTklOR19FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1JFVFJZOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpTRUNVUkVfU1RPUF9SRUxFQVNFX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRUNVUkVfU1RPUF9SRUxFQVNFOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpTVE9SQUdFX1JFQURfRkFJTFVSRToKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU1RPUkFHRV9SRUFEOworICAgICAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpTVE9SQUdFX1dSSVRFX0ZBSUxVUkU6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NUT1JBR0VfV1JJVEU7CiAKLSAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTjoKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1VOS05PV047CisgICAgICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9VTktOT1dOOwogICAgIH0KICAgICByZXR1cm4gRVJST1JfRFJNX1VOS05PV047CiB9CkBAIC0zMTIsMjAgKzMzNiwzNCBAQAogY2hhciBsb2dQcmlvcml0eVRvQ2hhcig6OlYxXzQ6OkxvZ1ByaW9yaXR5IHByaW9yaXR5KSB7CiAgICAgY2hhciBwID0gJ1UnOwogICAgIHN3aXRjaCAocHJpb3JpdHkpIHsKLSAgICAgICAgY2FzZSA6OlYxXzQ6OkxvZ1ByaW9yaXR5OjpWRVJCT1NFOiAgcCA9ICdWJzsgYnJlYWs7Ci0gICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6REVCVUc6ICAgIHAgPSAnRCc7IGJyZWFrOwotICAgICAgICBjYXNlIDo6VjFfNDo6TG9nUHJpb3JpdHk6OklORk86ICAgICBwID0gJ0knOyBicmVhazsKLSAgICAgICAgY2FzZSA6OlYxXzQ6OkxvZ1ByaW9yaXR5OjpXQVJOOiAgICAgcCA9ICdXJzsgYnJlYWs7Ci0gICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6RVJST1I6ICAgIHAgPSAnRSc7IGJyZWFrOwotICAgICAgICBjYXNlIDo6VjFfNDo6TG9nUHJpb3JpdHk6OkZBVEFMOiAgICBwID0gJ0YnOyBicmVhazsKLSAgICAgICAgZGVmYXVsdDogcCA9ICdVJzsgYnJlYWs7CisgICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6VkVSQk9TRToKKyAgICAgICAgICAgIHAgPSAnVic7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OkxvZ1ByaW9yaXR5OjpERUJVRzoKKyAgICAgICAgICAgIHAgPSAnRCc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OkxvZ1ByaW9yaXR5OjpJTkZPOgorICAgICAgICAgICAgcCA9ICdJJzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDo6VjFfNDo6TG9nUHJpb3JpdHk6OldBUk46CisgICAgICAgICAgICBwID0gJ1cnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6RVJST1I6CisgICAgICAgICAgICBwID0gJ0UnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6RkFUQUw6CisgICAgICAgICAgICBwID0gJ0YnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwID0gJ1UnOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBwOwogfQogfSAgLy8gbmFtZXNwYWNlCiAKLXN0ZDo6c3RyaW5nIEdldEV4Y2VwdGlvbk1lc3NhZ2Uoc3RhdHVzX3QgZXJyLCBjb25zdCBjaGFyICptc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjw6OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSB7CitzdGQ6OnN0cmluZyBHZXRFeGNlcHRpb25NZXNzYWdlKHN0YXR1c190IGVyciwgY29uc3QgY2hhciogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8OjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgewogICAgIHN0ZDo6c3RyaW5nIHJ1bGVyKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKICAgICBzdGQ6OnN0cmluZyBoZWFkZXIoIkJlZ2lubmluZyBvZiBEUk0gUGx1Z2luIExvZyIpOwogICAgIHN0ZDo6c3RyaW5nIGZvb3RlcigiRW5kIG9mIERSTSBQbHVnaW4gTG9nIik7CkBAIC0zNTUsNyArMzkzLDcgQEAKICAgICByZXR1cm4gbXNnOC5jX3N0cigpOwogfQogCi12b2lkIExvZ0J1ZmZlcjo6YWRkTG9nKGNvbnN0IDo6VjFfNDo6TG9nTWVzc2FnZSAmbG9nKSB7Cit2b2lkIExvZ0J1ZmZlcjo6YWRkTG9nKGNvbnN0IDo6VjFfNDo6TG9nTWVzc2FnZSYgbG9nKSB7CiAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CiAgICAgbUJ1ZmZlci5wdXNoX2JhY2sobG9nKTsKICAgICB3aGlsZSAobUJ1ZmZlci5zaXplKCkgPiBNQVhfQ0FQQUNJVFkpIHsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvQW5kcm9pZC5icCBiL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvQW5kcm9pZC5icAppbmRleCA3MjgxMDY2Li5hODVlM2NmIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vZnV6emVyL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9BbmRyb2lkLmJwCkBAIC0zNSw3ICszNSw4IEBACiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhZHJtIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGsiLAorICAgICAgICAibGliYWlkbGNvbW1vbnN1cHBvcnQiLAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLApAQCAtNTksNiArNjAsNyBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40IiwKICAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybS1WMS1uZGsiLAogICAgIF0sCiAgICAgZnV6el9jb25maWc6IHsKICAgICAgICAgY2M6IFsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvbWVkaWFkcm1fZnV6emVyLmNwcCBiL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvbWVkaWFkcm1fZnV6emVyLmNwcAppbmRleCA4ZGYwNDc3Li41OTdiNzJkIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vZnV6emVyL21lZGlhZHJtX2Z1enplci5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9tZWRpYWRybV9mdXp6ZXIuY3BwCkBAIC0yMCwxMCArMjAsMTMgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KICNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKyNpbmNsdWRlIDxiaW5kZXIvUGVyc2lzdGFibGVCdW5kbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KIAogI2RlZmluZSBBRVNfQkxPQ0tfU0laRSAxNgogI2RlZmluZSBVTlVTRURfUEFSQU0gX19hdHRyaWJ1dGVfXygodW51c2VkKSkKQEAgLTMzLDYgKzM2LDcgQEAKIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpmcm9tSGVhcDsKIHVzaW5nIDo6YW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwogdXNpbmcgZHJtOjpWMV8wOjpCdWZmZXJUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKIAogZW51bSB7CiAgICAgSU5WQUxJRF9VVUlEID0gMCwKQEAgLTM5OCw3ICs0MDIsNyBAQAogICAgICAgICAuc2VjdXJlTWVtb3J5ID0gbnVsbHB0cn07CiAKICAgICBjb25zdCB1aW50NjRfdCBvZmZzZXQgPSAwOwotICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnID0gbnVsbHB0cjsKKyAgICBBU3RyaW5nIGVycm9yRGV0YWlsTXNnOwogICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlOwogICAgIGJvb2wgc2hvdWxkUGFzc1JhbmRvbUNyeXB0b01vZGUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOwogICAgIGlmIChzaG91bGRQYXNzUmFuZG9tQ3J5cHRvTW9kZSkgewpAQCAtNDA4LDcgKzQxMiw3IEBACiAgICAgICAgICAgICBrQ3J5cHRvTW9kZVttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwga051bUNyeXB0b01vZGUgLSAxKV07CiAgICAgfQogICAgIG1DcnlwdG8tPmRlY3J5cHQoa2V5SWQsIGl2LCBtb2RlLCBwYXR0ZXJuLCBzb3VyY2VCdWZmZXIsIG9mZnNldCwgc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgIGRlc3RCdWZmZXIsIGVycm9yRGV0YWlsTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgIGRlc3RCdWZmZXIsICZlcnJvckRldGFpbE1zZyk7CiAKICAgICBpZiAoaGVhcFNlcU51bSA+PSAwKSB7CiAgICAgICAgIG1DcnlwdG8tPnVuc2V0SGVhcChoZWFwU2VxTnVtKTsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbC5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsLmgKaW5kZXggNWZkMzllNi4uMzJhNjc0MSAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsLmgKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsLmgKQEAgLTE1LDI1ICsxNSwxMiBAQAogICovCiAKICNpZm5kZWYgQ1JZUFRPX0hBTF9IXwotCiAjZGVmaW5lIENSWVBUT19IQUxfSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lDcnlwdG9QbHVnaW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjQvSUNyeXB0b1BsdWdpbi5oPgotCiAjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCi1uYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwotdXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvRmFjdG9yeTsKLXVzaW5nIGRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKLXVzaW5nIGRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwotdXNpbmcgZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKLQogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SGlkbE1lbW9yeTsKIAogY2xhc3MgSU1lbW9yeUhlYXA7CkBAIC00Myw2NyArMzAsMzAgQEAKIHN0cnVjdCBDcnlwdG9IYWwgOiBwdWJsaWMgSUNyeXB0byB7CiAgICAgQ3J5cHRvSGFsKCk7CiAgICAgdmlydHVhbCB+Q3J5cHRvSGFsKCk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCiAgICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oCiAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKTsKLQogICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lKSBjb25zdDsKLQogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlSZXNvbHV0aW9uKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYURybVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpOwotCiAgICAgdmlydHVhbCBzc2l6ZV90IGRlY3J5cHQoY29uc3QgdWludDhfdCBrZXlbMTZdLCBjb25zdCB1aW50OF90IGl2WzE2XSwKICAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4gJnBhdHRlcm4sCi0gICAgICAgICAgICBjb25zdCA6OlNoYXJlZEJ1ZmZlciAmc291cmNlLCBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgY29uc3QgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXIgJnNvdXJjZSwgc2l6ZV90IG9mZnNldCwKICAgICAgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKLSAgICAgICAgICAgIGNvbnN0IDo6RGVzdGluYXRpb25CdWZmZXIgJmRlc3RpbmF0aW9uLAorICAgICAgICAgICAgY29uc3QgZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlciAmZGVzdGluYXRpb24sCiAgICAgICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZyk7Ci0KLSAgICB2aXJ0dWFsIGludDMyX3Qgc2V0SGVhcChjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCkgewotICAgICAgICByZXR1cm4gc2V0SGVhcEJhc2UoaGVhcCk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCB1bnNldEhlYXAoaW50MzJfdCBzZXFOdW0pIHsgY2xlYXJIZWFwQmFzZShzZXFOdW0pOyB9Ci0KKyAgICB2aXJ0dWFsIGludDMyX3Qgc2V0SGVhcChjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCk7CisgICAgdmlydHVhbCB2b2lkIHVuc2V0SGVhcChpbnQzMl90IHNlcU51bSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiAmbG9ncykgY29uc3Q7Ci0KIHByaXZhdGU6Ci0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLQotICAgIGNvbnN0IFZlY3RvcjxzcDxJQ3J5cHRvRmFjdG9yeT4+IG1GYWN0b3JpZXM7Ci0gICAgc3A8SUNyeXB0b1BsdWdpbj4gbVBsdWdpbjsKLSAgICBzcDxkcm06OlYxXzI6OklDcnlwdG9QbHVnaW4+IG1QbHVnaW5WMV8yOwotCi0gICAgLyoqCi0gICAgICogbUluaXRDaGVjayBpczoKLSAgICAgKiAgIE5PX0lOSVQgaWYgYSBwbHVnaW4gaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQKLSAgICAgKiAgIEVSUk9SX1VOU1VQUE9SVEVEIGlmIGEgcGx1Z2luIGNhbid0IGJlIGNyZWF0ZWQgZm9yIHRoZSB1dWlkCi0gICAgICogICBPSyBhZnRlciBhIHBsdWdpbiBoYXMgYmVlbiBjcmVhdGVkIGFuZCBtUGx1Z2luIGlzIHZhbGlkCi0gICAgICovCi0gICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLQotICAgIEtleWVkVmVjdG9yPGludDMyX3QsIHNpemVfdD4gbUhlYXBTaXplczsKLSAgICBpbnQzMl90IG1IZWFwU2VxTnVtOwotCi0gICAgVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gbWFrZUNyeXB0b0ZhY3RvcmllcygpOwotICAgIHNwPElDcnlwdG9QbHVnaW4+IG1ha2VDcnlwdG9QbHVnaW4oY29uc3Qgc3A8SUNyeXB0b0ZhY3Rvcnk+JiBmYWN0b3J5LAotICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3Qgdm9pZCAqaW5pdERhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIGludDMyX3Qgc2V0SGVhcEJhc2UoY29uc3Qgc3A8SGlkbE1lbW9yeT4mIGhlYXApOwotICAgIHZvaWQgY2xlYXJIZWFwQmFzZShpbnQzMl90IHNlcU51bSk7Ci0KLSAgICBzdGF0dXNfdCBjaGVja1NoYXJlZEJ1ZmZlcihjb25zdCA6OlNoYXJlZEJ1ZmZlciYgYnVmZmVyKTsKLQorICAgIHNwPElDcnlwdG8+IG1DcnlwdG9IYWxIaWRsOworICAgIHNwPElDcnlwdG8+IG1DcnlwdG9IYWxBaWRsOwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENyeXB0b0hhbCk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCi0jZW5kaWYgIC8vIENSWVBUT19IQUxfSF8KKyNlbmRpZiAgLy8gQ1JZUFRPX0hBTF9IXwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbEFpZGwuaCBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbEFpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDg3OGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsQWlkbC5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENSWVBUT19IQUxfQUlETF9IXworI2RlZmluZSBDUllQVE9fSEFMX0FJRExfSF8KKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSUNyeXB0b1BsdWdpbi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK3VzaW5nIElEcm1GYWN0b3J5QWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybUZhY3Rvcnk7Cit1c2luZyBJQ3J5cHRvUGx1Z2luQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SUNyeXB0b1BsdWdpbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZDsKKworLy8gLS0tLS0tLUhpZGwgaW50ZXJmYWNlIHJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLQorLy8gVE9ETzogcmVwbGFjZSBiZWZvcmUgcmVtb3ZpbmcgaGlkbCBpbnRlcmZhY2UKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SGlkbE1lbW9yeTsKKworLy8gLS0tLS0tLUhpZGwgaW50ZXJmYWNlIHJlbGF0ZWQgZW5kLS0tLS0tLS0tLS0tLQorCitjbGFzcyBJTWVtb3J5SGVhcDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQ3J5cHRvSGFsQWlkbCA6IHB1YmxpYyBJQ3J5cHRvIHsKKyAgICBDcnlwdG9IYWxBaWRsKCk7CisgICAgdmlydHVhbCB+Q3J5cHRvSGFsQWlkbCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIqIG1pbWUpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlSZXNvbHV0aW9uKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFEcm1TZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsIHNzaXplX3QgZGVjcnlwdChjb25zdCB1aW50OF90IGtleVsxNl0sIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLCBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4mIHBhdHRlcm4sIGNvbnN0IDo6U2hhcmVkQnVmZmVyJiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUqIHN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsIGNvbnN0IDo6RGVzdGluYXRpb25CdWZmZXImIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcqIGVycm9yRGV0YWlsTXNnKTsKKyAgICB2aXJ0dWFsIGludDMyX3Qgc2V0SGVhcChjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCk7CisgICAgdmlydHVhbCB2b2lkIHVuc2V0SGVhcChpbnQzMl90IHNlcU51bSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElEcm1GYWN0b3J5QWlkbD4+IG1GYWN0b3JpZXM7CisgICAgc3RkOjpzaGFyZWRfcHRyPElDcnlwdG9QbHVnaW5BaWRsPiBtUGx1Z2luOworCisgICAgLyoqCisgICAgICogbUluaXRDaGVjayBpczoKKyAgICAgKiAgIE5PX0lOSVQgaWYgYSBwbHVnaW4gaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQKKyAgICAgKiAgIEVSUk9SX1VOU1VQUE9SVEVEIGlmIGEgcGx1Z2luIGNhbid0IGJlIGNyZWF0ZWQgZm9yIHRoZSB1dWlkCisgICAgICogICBPSyBhZnRlciBhIHBsdWdpbiBoYXMgYmVlbiBjcmVhdGVkIGFuZCBtUGx1Z2luIGlzIHZhbGlkCisgICAgICovCisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKworICAgIEtleWVkVmVjdG9yPGludDMyX3QsIHNpemVfdD4gbUhlYXBTaXplczsKKyAgICBpbnQzMl90IG1IZWFwU2VxTnVtOworCisgICAgc3RkOjpzaGFyZWRfcHRyPElDcnlwdG9QbHVnaW5BaWRsPiBtYWtlQ3J5cHRvUGx1Z2luKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElEcm1GYWN0b3J5QWlkbD4mIGZhY3RvcnksIGNvbnN0IFV1aWQmIHV1aWRBaWRsLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW5pdERhdGEpOworCisgICAgc3RhdHVzX3QgY2hlY2tTaGFyZWRCdWZmZXIoY29uc3QgOjpTaGFyZWRCdWZmZXImIGJ1ZmZlcik7CisgICAgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZEludGVybmFsKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGludCogZmFjdG9yeUlkeCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDcnlwdG9IYWxBaWRsKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDUllQVE9fSEFMX0FJRExfSF8KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbEhpZGwuaCBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGIxZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsSGlkbC5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDUllQVE9fSEFMX0hJRExfSF8KKyNkZWZpbmUgQ1JZUFRPX0hBTF9ISURMX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b1BsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JQ3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JQ3J5cHRvUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS40L0lDcnlwdG9QbHVnaW4uaD4KKworI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGRybSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTsKK3VzaW5nIGRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBkcm06OlYxXzA6OklDcnlwdG9QbHVnaW47Cit1c2luZyBkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKK3VzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkhpZGxNZW1vcnk7CisKK2NsYXNzIElNZW1vcnlIZWFwOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDcnlwdG9IYWxIaWRsIDogcHVibGljIElDcnlwdG8geworICAgIENyeXB0b0hhbEhpZGwoKTsKKyAgICB2aXJ0dWFsIH5DcnlwdG9IYWxIaWRsKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oCisgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKTsKKworICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlSZXNvbHV0aW9uKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYURybVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzc2l6ZV90IGRlY3J5cHQoY29uc3QgdWludDhfdCBrZXlbMTZdLCBjb25zdCB1aW50OF90IGl2WzE2XSwKKyAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4gJnBhdHRlcm4sCisgICAgICAgICAgICBjb25zdCA6OlNoYXJlZEJ1ZmZlciAmc291cmNlLCBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgY29uc3QgOjpEZXN0aW5hdGlvbkJ1ZmZlciAmZGVzdGluYXRpb24sCisgICAgICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZyk7CisKKyAgICB2aXJ0dWFsIGludDMyX3Qgc2V0SGVhcChjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCkgeworICAgICAgICByZXR1cm4gc2V0SGVhcEJhc2UoaGVhcCk7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCB1bnNldEhlYXAoaW50MzJfdCBzZXFOdW0pIHsgY2xlYXJIZWFwQmFzZShzZXFOdW0pOyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExvZ01lc3NhZ2VzKFZlY3Rvcjxkcm06OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworCisgICAgY29uc3QgVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gbUZhY3RvcmllczsKKyAgICBzcDxJQ3J5cHRvUGx1Z2luPiBtUGx1Z2luOworICAgIHNwPGRybTo6VjFfMjo6SUNyeXB0b1BsdWdpbj4gbVBsdWdpblYxXzI7CisKKyAgICAvKioKKyAgICAgKiBtSW5pdENoZWNrIGlzOgorICAgICAqICAgTk9fSU5JVCBpZiBhIHBsdWdpbiBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldAorICAgICAqICAgRVJST1JfVU5TVVBQT1JURUQgaWYgYSBwbHVnaW4gY2FuJ3QgYmUgY3JlYXRlZCBmb3IgdGhlIHV1aWQKKyAgICAgKiAgIE9LIGFmdGVyIGEgcGx1Z2luIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIG1QbHVnaW4gaXMgdmFsaWQKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgc2l6ZV90PiBtSGVhcFNpemVzOworICAgIGludDMyX3QgbUhlYXBTZXFOdW07CisKKyAgICBWZWN0b3I8c3A8SUNyeXB0b0ZhY3Rvcnk+PiBtYWtlQ3J5cHRvRmFjdG9yaWVzKCk7CisgICAgc3A8SUNyeXB0b1BsdWdpbj4gbWFrZUNyeXB0b1BsdWdpbihjb25zdCBzcDxJQ3J5cHRvRmFjdG9yeT4mIGZhY3RvcnksCisgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICppbml0RGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgaW50MzJfdCBzZXRIZWFwQmFzZShjb25zdCBzcDxIaWRsTWVtb3J5PiYgaGVhcCk7CisgICAgdm9pZCBjbGVhckhlYXBCYXNlKGludDMyX3Qgc2VxTnVtKTsKKworICAgIHN0YXR1c190IGNoZWNrU2hhcmVkQnVmZmVyKGNvbnN0IDo6U2hhcmVkQnVmZmVyJiBidWZmZXIpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ3J5cHRvSGFsSGlkbCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENSWVBUT19IQUxfSF8KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbC5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsLmgKaW5kZXggN2ViMWRlYy4uZWFiNTk3YiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsLmgKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsLmgKQEAgLTE0LDc3ICsxNCwyNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBEUk1fSEFMX0hfCi0KLSNkZWZpbmUgRFJNX0hBTF9IXwotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1GYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1QbHVnaW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuNC9JRHJtUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS40L3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9kcm0vRHJtQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWFkcm0vRHJtTWV0cmljcy5oPgotI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vSURybS5oPgotI2luY2x1ZGUgPG1lZGlhZHJtL0lEcm1DbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYWRybS9JRHJtTWV0cmljc0NvbnN1bWVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCi1uYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwotdXNpbmcgZHJtOjpWMV8wOjpFdmVudFR5cGU7Ci11c2luZyBkcm06OlYxXzA6OklEcm1GYWN0b3J5OwotdXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luOwotdXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luTGlzdGVuZXI7Ci11c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Ci11c2luZyBkcm06OlYxXzI6OktleVN0YXR1czsKLXVzaW5nIGRybTo6VjFfMjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLQotdHlwZWRlZiBkcm06OlYxXzI6OklEcm1QbHVnaW5MaXN0ZW5lciBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMjsKLXR5cGVkZWYgZHJtOjpWMV8wOjpLZXlTdGF0dXMgS2V5U3RhdHVzX1YxXzA7CisjaWZuZGVmIERSTV9IQUxfSF8KKyNkZWZpbmUgRFJNX0hBTF9IXwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlOwotCi1pbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmbCwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZyKSB7Ci0gICAgaWYgKGwuc2l6ZSgpICE9IHIuc2l6ZSgpKSByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIG1lbWNtcChsLmFycmF5KCksIHIuYXJyYXkoKSwgbC5zaXplKCkpID09IDA7Ci19Ci0KLXN0cnVjdCBEcm1IYWwgOiBwdWJsaWMgSURybSwKLSAgICAgICAgICAgICAgICBwdWJsaWMgSURybVBsdWdpbkxpc3RlbmVyX1YxXzIgewotCi0gICAgc3RydWN0IERybVNlc3Npb25DbGllbnQ7Ci0KK3N0cnVjdCBEcm1IYWwgOiBwdWJsaWMgSURybSB7CiAgICAgRHJtSGFsKCk7CiAgICAgdmlydHVhbCB+RHJtSGFsKCk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpyZXN1bHQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmYXBwUGFja2FnZU5hbWUpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXN0cm95UGx1Z2luKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLAogICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdAogICAgICAgICBnZXRLZXlSZXF1ZXN0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsCkBAIC05MiwxNjggKzQyLDg5IEBACiAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gY29uc3QgJm9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsIFN0cmluZzggJmRlZmF1bHRVcmwsCiAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aWRlS2V5UmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmtleVNldElkKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZUtleXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlLZXlTdGF0dXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaW5mb01hcCkgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3Zpc2lvblJlcXVlc3QoU3RyaW5nOCBjb25zdCAmY2VydFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmNlcnRBdXRob3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAmZGVmYXVsVXJsKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICZkZWZhdWx0VXJsKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmY2VydGlmaWNhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcElkcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKmNvbm5lY3RlZExldmVsLAogICAgICAgICAgICAgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKm1heExldmVsKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QgKmN1cnJlbnRTZXNzaW9ucywKICAgICAgICAgICAgIHVpbnQzMl90ICptYXhTZXNzaW9ucykgY29uc3Q7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsICpsZXZlbCkgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAogICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSApIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUgKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggY29uc3QgJnZhbHVlICkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnZhbHVlKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZ2YWx1ZSApIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmFsdWUgKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmFsdWUpIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0cmljcyhjb25zdCBzcDxJRHJtTWV0cmljc0NvbnN1bWVyPiAmY29uc3VtZXIpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDaXBoZXJBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFjQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmb3V0cHV0KTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZvdXRwdXQpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzaWduKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2lnbmF0dXJlKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2lnbmF0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJm1hdGNoKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnblJTQShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmd3JhcHBlZEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzaWduYXR1cmUpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJRHJtQ2xpZW50PiYgbGlzdGVuZXIpOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciAqbWltZSwgYm9vbCAqcmVxdWlyZWQpIGNvbnN0OwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciAqbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqcmVxdWlyZWQpIGNvbnN0OwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja0lkKAogICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpwbGF5YmFja0lkKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TG9nTWVzc2FnZXMoVmVjdG9yPGRybTo6VjFfNDo6TG9nTWVzc2FnZT4gJmxvZ3MpIGNvbnN0OwotCi0gICAgLy8gTWV0aG9kcyBvZiBJRHJtUGx1Z2luTGlzdGVuZXIKLSAgICBSZXR1cm48dm9pZD4gc2VuZEV2ZW50KEV2ZW50VHlwZSBldmVudFR5cGUsCi0gICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGF0YSk7Ci0KLSAgICBSZXR1cm48dm9pZD4gc2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKLSAgICAgICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMpOwotCi0gICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXNfVjFfMD4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKLQotICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZV8xXzIoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKLSAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKLQotICAgIFJldHVybjx2b2lkPiBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZFNjaGVtZXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gJnNjaGVtZXMpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIHN0YXRpYyBNdXRleCBtTG9jazsKLQotICAgIHNwPElEcm1DbGllbnQ+IG1MaXN0ZW5lcjsKLSAgICBtdXRhYmxlIE11dGV4IG1FdmVudExvY2s7Ci0gICAgbXV0YWJsZSBNdXRleCBtTm90aWZ5TG9jazsKLQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gbUZhY3RvcmllczsKLSAgICBzcDxJRHJtUGx1Z2luPiBtUGx1Z2luOwotICAgIHNwPGRybTo6VjFfMTo6SURybVBsdWdpbj4gbVBsdWdpblYxXzE7Ci0gICAgc3A8ZHJtOjpWMV8yOjpJRHJtUGx1Z2luPiBtUGx1Z2luVjFfMjsKLSAgICBzcDxkcm06OlYxXzQ6OklEcm1QbHVnaW4+IG1QbHVnaW5WMV80OwotICAgIFN0cmluZzggbUFwcFBhY2thZ2VOYW1lOwotCi0gICAgLy8gTXV0YWJsZSB0byBhbGxvdyBtb2RpZmljYXRpb24gd2l0aGluIEdldFByb3BlcnR5Qnl0ZUFycmF5LgotICAgIG11dGFibGUgTWVkaWFEcm1NZXRyaWNzIG1NZXRyaWNzOwotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPERybVNlc3Npb25DbGllbnQ+PiBtT3BlblNlc3Npb25zOwotICAgIHZvaWQgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKLSAgICB2b2lkIGNsZWFudXAoKTsKLQotICAgIC8qKgotICAgICAqIG1Jbml0Q2hlY2sgaXM6Ci0gICAgICogICBOT19JTklUIGlmIGEgcGx1Z2luIGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0Ci0gICAgICogICBFUlJPUl9VTlNVUFBPUlRFRCBpZiBhIHBsdWdpbiBjYW4ndCBiZSBjcmVhdGVkIGZvciB0aGUgdXVpZAotICAgICAqICAgT0sgYWZ0ZXIgYSBwbHVnaW4gaGFzIGJlZW4gY3JlYXRlZCBhbmQgbVBsdWdpbiBpcyB2YWxpZAotICAgICAqLwotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0KLSAgICBzdGQ6OnZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IG1ha2VEcm1GYWN0b3JpZXMoKTsKLSAgICBzcDxJRHJtUGx1Z2luPiBtYWtlRHJtUGx1Z2luKGNvbnN0IHNwPElEcm1GYWN0b3J5PiYgZmFjdG9yeSwKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKTsKLQotICAgIHZvaWQgd3JpdGVCeXRlQXJyYXkoUGFyY2VsICZvYmosIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBhcnJheSk7Ci0KLSAgICBzdGQ6OnN0cmluZyByZXBvcnRQbHVnaW5NZXRyaWNzKCkgY29uc3Q7Ci0gICAgc3RkOjpzdHJpbmcgcmVwb3J0RnJhbWV3b3JrTWV0cmljcyhjb25zdCBzdGQ6OnN0cmluZyYgcGx1Z2luTWV0cmljcykgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgbWF0Y2hNaW1lVHlwZUFuZFNlY3VyaXR5TGV2ZWwoY29uc3Qgc3A8SURybUZhY3Rvcnk+ICZmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmlzU3VwcG9ydGVkKTsKLQorICAgIHNwPElEcm0+IG1Ecm1IYWxIaWRsOworICAgIHNwPElEcm0+IG1Ecm1IYWxBaWRsOwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERybUhhbCk7CiB9OwogCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCi0jZW5kaWYgIC8vIERSTV9IQUxfSF8KKyNlbmRpZiAgLy8gRFJNX0hBTF9IXwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbEFpZGwuaCBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbEFpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjUxY2U5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsQWlkbC5oCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEUk1fSEFMX0FJRExfSF8KKyNkZWZpbmUgRFJNX0hBTF9BSURMX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9CbkRybVBsdWdpbkxpc3RlbmVyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblJlc291cmNlTWFuYWdlckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybU1ldHJpY3MuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybUhhbExpc3RlbmVyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSURybS5oPgorCit1c2luZyBJRHJtUGx1Z2luQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybVBsdWdpbjsKK3VzaW5nIElEcm1GYWN0b3J5QWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybUZhY3Rvcnk7Cit1c2luZyBFdmVudFR5cGVBaWRsID0gOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpFdmVudFR5cGU7Cit1c2luZyBLZXlTdGF0dXNBaWRsID0gOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlV1aWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK3N0cnVjdCBEcm1IYWxBaWRsIDogcHVibGljIElEcm17CisgICAgc3RydWN0IERybVNlc3Npb25DbGllbnQ7CisgICAgRHJtSGFsQWlkbCgpOworICAgIHZpcnR1YWwgfkRybUhhbEFpZGwoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwgYm9vbCogcmVzdWx0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBhcHBQYWNrYWdlTmFtZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkZXN0cm95UGx1Z2luKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRLZXlSZXF1ZXN0KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIGluaXREYXRhLCBTdHJpbmc4IGNvbnN0JiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgcmVxdWVzdCwgU3RyaW5nOCYgZGVmYXVsdFVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSoga2V5UmVxdWVzdFR5cGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgcmVzcG9uc2UsIFZlY3Rvcjx1aW50OF90PiYga2V5U2V0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvdmlzaW9uUmVxdWVzdChTdHJpbmc4IGNvbnN0JiBjZXJ0VHlwZSwgU3RyaW5nOCBjb25zdCYgY2VydEF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LCBTdHJpbmc4JiBkZWZhdWx0VXJsKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QmIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiB3cmFwcGVkS2V5KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiYgc2VjdXJlU3RvcHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4mIHNlY3VyZVN0b3BJZHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQsIFZlY3Rvcjx1aW50OF90PiYgc2VjdXJlU3RvcCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU2VjdXJlU3RvcHMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzc1JlbGVhc2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNzaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlQWxsU2VjdXJlU3RvcHMoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwqIGNvbm5lY3RlZExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OkhkY3BMZXZlbCogbWF4TGV2ZWwpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TnVtYmVyT2ZTZXNzaW9ucyh1aW50MzJfdCogY3VycmVudFNlc3Npb25zLCB1aW50MzJfdCogbWF4U2Vzc2lvbnMpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsKiBsZXZlbCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4mIGtleVNldElkcykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleVNldElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBrZXlTZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlKiBsaWNlbnNlU3RhdGUpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCYgbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0JiBuYW1lLCBTdHJpbmc4IGNvbnN0JiB2YWx1ZSkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0JiBuYW1lLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIHZhbHVlKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldHJpY3MoY29uc3Qgc3A8SURybU1ldHJpY3NDb25zdW1lcj4mIGNvbnN1bWVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENpcGhlckFsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgU3RyaW5nOCBjb25zdCYgYWxnb3JpdGhtKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hY0FsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgU3RyaW5nOCBjb25zdCYgYWxnb3JpdGhtKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5wdXQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaW5wdXQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzZXNzaW9uSWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYga2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCYgc2Vzc2lvbklkLCBWZWN0b3I8dWludDhfdD4gY29uc3QmIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgbWVzc2FnZSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0JiBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgbWF0Y2gpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnblJTQShWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgU3RyaW5nOCBjb25zdCYgYWxnb3JpdGhtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QmIG1lc3NhZ2UsIFZlY3Rvcjx1aW50OF90PiBjb25zdCYgd3JhcHBlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SURybUNsaWVudD4mIGxpc3RlbmVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlcXVpcmVzU2VjdXJlRGVjb2Rlcihjb25zdCBjaGFyKiBtaW1lLCBib29sKiByZXF1aXJlZCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciogbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmVxdWlyZWQpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tJZChWZWN0b3I8dWludDhfdD4gY29uc3QmIHNlc3Npb25JZCwgY29uc3QgY2hhciogcGxheWJhY2tJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiYgbG9ncykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWRTY2hlbWVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZzY2hlbWVzKSBjb25zdDsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRXZlbnQoRXZlbnRUeXBlQWlkbCBpbl9ldmVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2RhdGEpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRXhwaXJhdGlvblVwZGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGluX2V4cGlyeVRpbWVJbk1TKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvbktleXNDaGFuZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzQWlkbD4mIGluX2tleVN0YXR1c0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faGFzTmV3VXNhYmxlS2V5KTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvblNlc3Npb25Mb3N0U3RhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCk7CisgIHByaXZhdGU6CisgICAgc3RhdGljIE11dGV4IG1Mb2NrOworICAgIG11dGFibGUgTWVkaWFEcm1NZXRyaWNzIG1NZXRyaWNzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxEcm1IYWxMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJRHJtRmFjdG9yeUFpZGw+PiBtRmFjdG9yaWVzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJRHJtUGx1Z2luQWlkbD4gbVBsdWdpbjsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxEcm1TZXNzaW9uQ2xpZW50Pj4gbU9wZW5TZXNzaW9uczsKKyAgICB2b2lkIGNsZWFudXAoKTsKKyAgICB2b2lkIGNsb3NlT3BlblNlc3Npb25zKCk7CisgICAgc3RkOjpzdHJpbmcgcmVwb3J0UGx1Z2luTWV0cmljcygpIGNvbnN0OworICAgIHN0ZDo6c3RyaW5nIHJlcG9ydEZyYW1ld29ya01ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbk1ldHJpY3MpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCYgbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgY29uc3Q7CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtSGFsQWlkbCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gRFJNX0hBTF9BSURMX0hfClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsSGlkbC5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZjA2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1IYWxIaWRsLmgKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERSTV9IQUxfSElETF9IXworI2RlZmluZSBEUk1fSEFMX0hJRExfSF8KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuNC9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS40L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9kcm0vRHJtQVBJLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtTWV0cmljcy5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSURybS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lEcm1DbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtTWV0cmljc0NvbnN1bWVyLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgZHJtOjpWMV8wOjpFdmVudFR5cGU7Cit1c2luZyBkcm06OlYxXzA6OklEcm1GYWN0b3J5OwordXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luOwordXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luTGlzdGVuZXI7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Cit1c2luZyBkcm06OlYxXzI6OktleVN0YXR1czsKK3VzaW5nIGRybTo6VjFfMjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKKwordHlwZWRlZiBkcm06OlYxXzI6OklEcm1QbHVnaW5MaXN0ZW5lciBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMjsKK3R5cGVkZWYgZHJtOjpWMV8wOjpLZXlTdGF0dXMgS2V5U3RhdHVzX1YxXzA7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U7CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZsLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnIpIHsKKyAgICBpZiAobC5zaXplKCkgIT0gci5zaXplKCkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gbWVtY21wKGwuYXJyYXkoKSwgci5hcnJheSgpLCBsLnNpemUoKSkgPT0gMDsKK30KKworc3RydWN0IERybUhhbEhpZGwgOiBwdWJsaWMgSURybSwKKyAgICAgICAgICAgICAgICBwdWJsaWMgSURybVBsdWdpbkxpc3RlbmVyX1YxXzIgeworCisgICAgc3RydWN0IERybVNlc3Npb25DbGllbnQ7CisKKyAgICBEcm1IYWxIaWRsKCk7CisgICAgdmlydHVhbCB+RHJtSGFsSGlkbCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZhcHBQYWNrYWdlTmFtZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdAorICAgICAgICBnZXRLZXlSZXF1ZXN0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmbWltZVR5cGUsIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0ICZvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LCBTdHJpbmc4ICZkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUtleXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gJmluZm9NYXApIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm92aXNpb25SZXF1ZXN0KFN0cmluZzggY29uc3QgJmNlcnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZjZXJ0QXV0aG9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggJmRlZmF1bHRVcmwpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmd3JhcHBlZEtleSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJnNlY3VyZVN0b3BJZHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQsIFZlY3Rvcjx1aW50OF90PiAmc2VjdXJlU3RvcCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTZWN1cmVTdG9wcyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzUmVsZWFzZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVBbGxTZWN1cmVTdG9wcygpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRIZGNwTGV2ZWxzKERybVBsdWdpbjo6SGRjcExldmVsICpjb25uZWN0ZWRMZXZlbCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsICptYXhMZXZlbCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROdW1iZXJPZlNlc3Npb25zKHVpbnQzMl90ICpjdXJyZW50U2Vzc2lvbnMsCisgICAgICAgICAgICB1aW50MzJfdCAqbWF4U2Vzc2lvbnMpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCAqbGV2ZWwpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJmtleVNldElkcykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUgKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnZhbHVlICkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4IGNvbnN0ICZ2YWx1ZSApIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmFsdWUgKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldHJpY3MoY29uc3Qgc3A8SURybU1ldHJpY3NDb25zdW1lcj4gJmNvbnN1bWVyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2lwaGVyQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hY0FsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmNyeXB0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJm91dHB1dCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmb3V0cHV0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbihWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnNpZ25hdHVyZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZtYXRjaCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25SU0EoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJndyYXBwZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2lnbmF0dXJlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SURybUNsaWVudD4mIGxpc3RlbmVyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgKnJlcXVpcmVkKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIgKm1pbWUsIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnJlcXVpcmVkKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tJZCgKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgY2hhciAqcGxheWJhY2tJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExvZ01lc3NhZ2VzKFZlY3Rvcjxkcm06OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZFNjaGVtZXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gJnNjaGVtZXMpIGNvbnN0OworCisgICAgLy8gTWV0aG9kcyBvZiBJRHJtUGx1Z2luTGlzdGVuZXIKKyAgICBSZXR1cm48dm9pZD4gc2VuZEV2ZW50KEV2ZW50VHlwZSBldmVudFR5cGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGF0YSk7CisKKyAgICBSZXR1cm48dm9pZD4gc2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMpOworCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXNfVjFfMD4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKKworICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZV8xXzIoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKKworICAgIFJldHVybjx2b2lkPiBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgTXV0ZXggbUxvY2s7CisKKyAgICBzcDxJRHJtQ2xpZW50PiBtTGlzdGVuZXI7CisgICAgbXV0YWJsZSBNdXRleCBtRXZlbnRMb2NrOworICAgIG11dGFibGUgTXV0ZXggbU5vdGlmeUxvY2s7CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IG1GYWN0b3JpZXM7CisgICAgc3A8SURybVBsdWdpbj4gbVBsdWdpbjsKKyAgICBzcDxkcm06OlYxXzE6OklEcm1QbHVnaW4+IG1QbHVnaW5WMV8xOworICAgIHNwPGRybTo6VjFfMjo6SURybVBsdWdpbj4gbVBsdWdpblYxXzI7CisgICAgc3A8ZHJtOjpWMV80OjpJRHJtUGx1Z2luPiBtUGx1Z2luVjFfNDsKKyAgICBTdHJpbmc4IG1BcHBQYWNrYWdlTmFtZTsKKworICAgIC8vIE11dGFibGUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIHdpdGhpbiBHZXRQcm9wZXJ0eUJ5dGVBcnJheS4KKyAgICBtdXRhYmxlIE1lZGlhRHJtTWV0cmljcyBtTWV0cmljczsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxEcm1TZXNzaW9uQ2xpZW50Pj4gbU9wZW5TZXNzaW9uczsKKyAgICB2b2lkIGNsb3NlT3BlblNlc3Npb25zKCk7CisgICAgdm9pZCBjbGVhbnVwKCk7CisKKyAgICAvKioKKyAgICAgKiBtSW5pdENoZWNrIGlzOgorICAgICAqICAgTk9fSU5JVCBpZiBhIHBsdWdpbiBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldAorICAgICAqICAgRVJST1JfVU5TVVBQT1JURUQgaWYgYSBwbHVnaW4gY2FuJ3QgYmUgY3JlYXRlZCBmb3IgdGhlIHV1aWQKKyAgICAgKiAgIE9LIGFmdGVyIGEgcGx1Z2luIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIG1QbHVnaW4gaXMgdmFsaWQKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgc3RkOjp2ZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBtYWtlRHJtRmFjdG9yaWVzKCk7CisgICAgc3A8SURybVBsdWdpbj4gbWFrZURybVBsdWdpbihjb25zdCBzcDxJRHJtRmFjdG9yeT4mIGZhY3RvcnksCisgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBhcHBQYWNrYWdlTmFtZSk7CisKKyAgICB2b2lkIHdyaXRlQnl0ZUFycmF5KFBhcmNlbCAmb2JqLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgYXJyYXkpOworCisgICAgc3RkOjpzdHJpbmcgcmVwb3J0UGx1Z2luTWV0cmljcygpIGNvbnN0OworICAgIHN0ZDo6c3RyaW5nIHJlcG9ydEZyYW1ld29ya01ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbk1ldHJpY3MpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUpIGNvbnN0OworICAgIHN0YXR1c190IG1hdGNoTWltZVR5cGVBbmRTZWN1cml0eUxldmVsKGNvbnN0IHNwPElEcm1GYWN0b3J5PiAmZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1IYWxIaWRsKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBEUk1fSEFMX0hJRExfSF8KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbExpc3RlbmVyLmggYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1IYWxMaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMzYxYWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1IYWxMaXN0ZW5lci5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERSTV9IQUxfTElTVEVORVJfSF8KKyNkZWZpbmUgRFJNX0hBTF9MSVNURU5FUl9IXworCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9CbkRybVBsdWdpbkxpc3RlbmVyLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtTWV0cmljcy5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lEcm1DbGllbnQuaD4KKwordXNpbmcgRXZlbnRUeXBlQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RXZlbnRUeXBlOwordXNpbmcgS2V5U3RhdHVzQWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5U3RhdHVzOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6Qm5Ecm1QbHVnaW5MaXN0ZW5lcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworc3RydWN0IERybUhhbExpc3RlbmVyIDogcHVibGljIEJuRHJtUGx1Z2luTGlzdGVuZXIgeworICAgIGV4cGxpY2l0IERybUhhbExpc3RlbmVyKE1lZGlhRHJtTWV0cmljcyogbU1ldHJpY3MpOworICAgIH5Ecm1IYWxMaXN0ZW5lcigpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRXZlbnQoRXZlbnRUeXBlQWlkbCBpbl9ldmVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2RhdGEpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRXhwaXJhdGlvblVwZGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGluX2V4cGlyeVRpbWVJbk1TKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvbktleXNDaGFuZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzQWlkbD4mIGluX2tleVN0YXR1c0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faGFzTmV3VXNhYmxlS2V5KTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvblNlc3Npb25Mb3N0U3RhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCk7CisgICAgdm9pZCBzZXRMaXN0ZW5lcihzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lcik7Citwcml2YXRlOgorICAgIG11dGFibGUgTWVkaWFEcm1NZXRyaWNzKiBtTWV0cmljczsKKyAgICBzcDxJRHJtQ2xpZW50PiBtTGlzdGVuZXI7CisgICAgbXV0YWJsZSBNdXRleCBtRXZlbnRMb2NrOworICAgIG11dGFibGUgTXV0ZXggbU5vdGlmeUxvY2s7Cit9OworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIERSTV9IQUxfTElTVEVORVJfSF8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1NZXRyaWNzLmggYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1NZXRyaWNzLmgKaW5kZXggMTAwYjhmNy4uZTE3NzVjNyAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtTWV0cmljcy5oCisrKyBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybU1ldHJpY3MuaApAQCAtNTAsMTIgKzUwLDEwIEBACiAgIENvdW50ZXJNZXRyaWM8c3RhdHVzX3Q+IG1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlcjsKICAgLy8gQ291bnQgb2YgcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlIGNhbGxzLgogICBDb3VudGVyTWV0cmljPHN0YXR1c190PiBtUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlcjsKLQogICAvLyBDb3VudCBvZiBrZXkgc3RhdHVzIGV2ZW50cyBicm9rZW4gb3V0IGJ5IHN0YXR1cyB0eXBlLgotICBDb3VudGVyTWV0cmljPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6S2V5U3RhdHVzVHlwZT4KLSAgICAgIG1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyOworICBDb3VudGVyTWV0cmljPHVpbnQzMl90PiBtS2V5U3RhdHVzQ2hhbmdlQ291bnRlcjsKICAgLy8gQ291bnQgb2YgZXZlbnRzIGJyb2tlbiBvdXQgYnkgZXZlbnQgdHlwZQotICBDb3VudGVyTWV0cmljPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RXZlbnRUeXBlPiBtRXZlbnRDb3VudGVyOworICBDb3VudGVyTWV0cmljPHVpbnQzMl90PiBtRXZlbnRDb3VudGVyOwogCiAgIC8vIENvdW50IGdldFByb3BlcnR5Qnl0ZUFycmF5IGNhbGxzIHRvIHJldHJpZXZlIHRoZSBkZXZpY2UgdW5pcXVlIGlkLgogICBDb3VudGVyTWV0cmljPHN0YXR1c190PiBtR2V0RGV2aWNlVW5pcXVlSWRDb3VudGVyOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vSURybS5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vSURybS5oCmluZGV4IGE4ODc4NGQuLmVlMmJlNmEgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0lEcm0uaAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9JRHJtLmgKQEAgLTE2NSw2ICsxNjUsOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiAmbG9ncykgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWRTY2hlbWVzKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZzY2hlbWVzKSBjb25zdCA9IDA7CisKIHByb3RlY3RlZDoKICAgICBJRHJtKCkge30KIApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2ludGVyZmFjZS9tZWRpYWRybS9Ecm1VdGlscy5oIGIvZHJtL2xpYm1lZGlhZHJtL2ludGVyZmFjZS9tZWRpYWRybS9Ecm1VdGlscy5oCmluZGV4IGVjMGI4NzguLjk4MGNlNTUgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9pbnRlcmZhY2UvbWVkaWFkcm0vRHJtVXRpbHMuaAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW50ZXJmYWNlL21lZGlhZHJtL0RybVV0aWxzLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8Y3N0ZGRlZj4KICNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdHJpbmc+CiAjaW5jbHVkZSA8Y3RpbWU+CiAjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8ZW5kaWFuLmg+CkBAIC0zOCwxMiArMzksMjAgQEAKICNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgotCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9Mb2dNZXNzYWdlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9TdGF0dXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZHJtL0lEcm1GYWN0b3J5Lmg+CiAKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm07CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKIAordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dQcmlvcml0eTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6TG9nTWVzc2FnZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZDsKK3VzaW5nIFN0YXR1c0FpZGwgPSA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN0YXR1czsKK3VzaW5nIElEcm1GYWN0b3J5QWlkbCA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybUZhY3Rvcnk7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IElDcnlwdG87CkBAIC05Miw3ICsxMDEsOCBAQAogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KIHZvaWQgTG9nVG9CdWZmZXIoYW5kcm9pZF9Mb2dQcmlvcml0eSBsZXZlbCwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgY2hhciAqZm10LCBBcmdzLi4uIGFyZ3MpIHsKLSAgICBjb25zdCB1aW50NjRfdCogdXVpZDIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4odXVpZCk7CisgICAgdWludDY0X3QgdXVpZDJbMl0gPSB7fTsKKyAgICBzdGQ6Om1lbWNweSh1dWlkMiwgdXVpZCwgc2l6ZW9mKHV1aWQyKSk7CiAgICAgc3RkOjpzdHJpbmcgdXVpZEZtdCgidXVpZD1bJWx4ICVseF0gIik7CiAgICAgdXVpZEZtdCArPSBmbXQ7CiAgICAgTG9nVG9CdWZmZXIobGV2ZWwsIHV1aWRGbXQuY19zdHIoKSwgaHRvYmU2NCh1dWlkMlswXSksIGh0b2JlNjQodXVpZDJbMV0pLCBhcmdzLi4uKTsKQEAgLTE1NSw2ICsxNjUsMTQgQEAKICAgICBvYmoud3JpdGVJbnQzMihoYXNOZXdVc2FibGVLZXkpOwogfQogCitpbmxpbmUgVXVpZCB0b0FpZGxVdWlkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIHsKKyAgICBVdWlkIHV1aWRBaWRsOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgdXVpZEFpZGwudXVpZFtpXSA9IHV1aWRbaV07CisgICAgcmV0dXJuIHV1aWRBaWRsOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SURybUZhY3RvcnlBaWRsPj4gbWFrZURybUZhY3Rvcmllc0FpZGwoKTsKKwogc3RkOjp2ZWN0b3I8c3A8OjpWMV8wOjpJRHJtRmFjdG9yeT4+IE1ha2VEcm1GYWN0b3JpZXMoY29uc3QgdWludDhfdCB1dWlkWzE2XSA9IG51bGxwdHIpOwogCiBzdGQ6OnZlY3RvcjxzcDw6OlYxXzA6OklEcm1QbHVnaW4+PiBNYWtlRHJtUGx1Z2lucyhjb25zdCB1aW50OF90IHV1aWRbMTZdLApAQCAtMTgwLDYgKzE5OCwxMzggQEAKICAgICByZXR1cm4gdG9TdGF0dXNUXzFfNChlcnIpOwogfQogCitpbmxpbmUgc3RhdHVzX3Qgc3RhdHVzQWlkbFRvU3RhdHVzVCg6Om5kazo6U2NvcGVkQVN0YXR1cyAmc3RhdHVzQWlkbCkgeworICAgIGlmIChzdGF0dXNBaWRsLmlzT2soKSkgcmV0dXJuIE9LOworICAgIGlmIChzdGF0dXNBaWRsLmdldEV4Y2VwdGlvbkNvZGUoKSAhPSBFWF9TRVJWSUNFX1NQRUNJRklDKSByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgYXV0byBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXNBaWRsPihzdGF0dXNBaWRsLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCkpOworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpPSzoKKyAgICAgICAgcmV0dXJuIE9LOworICAgIGNhc2UgU3RhdHVzQWlkbDo6QkFEX1ZBTFVFOgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkVSUk9SX0RSTV9ERUNSWVBUOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0RFQ1JZUFQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfT1VUUFVUX1BST1RFQ1RJT046CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX0lOU1VGRklDSUVOVF9TRUNVUklUWToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX0xJQ0VOU0VfRVhQSVJFRDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX0VYUElSRUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fTk9fTElDRU5TRToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX05PVF9QUk9WSVNJT05FRDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT1RfUFJPVklTSU9ORUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT046CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOworICAgIGNhc2UgU3RhdHVzQWlkbDo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisKKyAgICAvLyBOZXcgaW4gUyAvIGRybUAxLjQ6CisgICAgY2FzZSBTdGF0dXNBaWRsOjpDQU5OT1RfREVDUllQVF9aRVJPX1NVQlNBTVBMRVM6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fWkVST19TVUJTQU1QTEVTOworICAgIGNhc2UgU3RhdHVzQWlkbDo6Q1JZUFRPX0xJQlJBUllfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ1JZUFRPX0xJQlJBUlk7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpHRU5FUkFMX09FTV9FUlJPUjoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9HRU5FUklDX09FTTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkdFTkVSQUxfUExVR0lOX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0dFTkVSSUNfUExVR0lOOworICAgIGNhc2UgU3RhdHVzQWlkbDo6SU5JVF9EQVRBX0lOVkFMSUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5JVF9EQVRBOworICAgIGNhc2UgU3RhdHVzQWlkbDo6S0VZX05PVF9MT0FERUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fS0VZX05PVF9MT0FERUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpMSUNFTlNFX1BBUlNFX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUEFSU0U7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpMSUNFTlNFX1BPTElDWV9FUlJPUjoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1BPTElDWTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkxJQ0VOU0VfUkVMRUFTRV9FUlJPUjoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1JFTEVBU0U7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpMSUNFTlNFX1JFUVVFU1RfUkVKRUNURUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9SRVFVRVNUX1JFSkVDVEVEOworICAgIGNhc2UgU3RhdHVzQWlkbDo6TElDRU5TRV9SRVNUT1JFX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUkVTVE9SRTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OkxJQ0VOU0VfU1RBVEVfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9TVEFURTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6Ok1BTEZPUk1FRF9DRVJUSUZJQ0FURToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DRVJUSUZJQ0FURV9NQUxGT1JNRUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpNRURJQV9GUkFNRVdPUktfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTUVESUFfRlJBTUVXT1JLOworICAgIGNhc2UgU3RhdHVzQWlkbDo6TUlTU0lOR19DRVJUSUZJQ0FURToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DRVJUSUZJQ0FURV9NSVNTSU5HOworICAgIGNhc2UgU3RhdHVzQWlkbDo6UFJPVklTSU9OSU5HX0NFUlRJRklDQVRFX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1BST1ZJU0lPTklOR19DRVJUSUZJQ0FURTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OlBST1ZJU0lPTklOR19DT05GSUdVUkFUSU9OX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1BST1ZJU0lPTklOR19DT05GSUc7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpQUk9WSVNJT05JTkdfUEFSU0VfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1BBUlNFOworICAgIGNhc2UgU3RhdHVzQWlkbDo6UFJPVklTSU9OSU5HX1JFUVVFU1RfUkVKRUNURUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1JFUVVFU1RfUkVKRUNURUQ7CisgICAgY2FzZSBTdGF0dXNBaWRsOjpSRVRSWUFCTEVfUFJPVklTSU9OSU5HX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1BST1ZJU0lPTklOR19SRVRSWTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OlNFQ1VSRV9TVE9QX1JFTEVBU0VfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VDVVJFX1NUT1BfUkVMRUFTRTsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OlNUT1JBR0VfUkVBRF9GQUlMVVJFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NUT1JBR0VfUkVBRDsKKyAgICBjYXNlIFN0YXR1c0FpZGw6OlNUT1JBR0VfV1JJVEVfRkFJTFVSRToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TVE9SQUdFX1dSSVRFOworCisgICAgY2FzZSBTdGF0dXNBaWRsOjpFUlJPUl9EUk1fVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1VOS05PV047CisgICAgfQorICAgIHJldHVybiBFUlJPUl9EUk1fVU5LTk9XTjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0YXR1c190IEdldExvZ01lc3NhZ2VzQWlkbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VT4gJm9iaiwgVmVjdG9yPDo6VjFfNDo6TG9nTWVzc2FnZT4gJmxvZ3MpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gcGx1Z2luID0gb2JqOworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICBMT0cyQlcoIiVzIG9iaiBpcyBudWxsIiwgVTo6ZGVzY3JpcHRvcik7CisgICAgfSBlbHNlIGlmIChwbHVnaW4gPT0gTlVMTCkgeworICAgICAgICBMT0cyQlcoIkNhbm5vdCBjYXN0ICVzIG9iaiB0byAlcyBwbHVnaW4iLCBVOjpkZXNjcmlwdG9yLCBUOjpkZXNjcmlwdG9yKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxMb2dNZXNzYWdlPiBwbHVnaW5Mb2dzQWlkbDsKKyAgICBpZiAocGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgaWYoIXBsdWdpbi0+Z2V0TG9nTWVzc2FnZXMoJnBsdWdpbkxvZ3NBaWRsKS5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRzJCVygiJXM6OmdldExvZ01lc3NhZ2VzIHJlbW90ZSBjYWxsIGZhaWxlZCIsIFQ6OmRlc2NyaXB0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8OjpWMV80OjpMb2dNZXNzYWdlPiBwbHVnaW5Mb2dzOworICAgIGZvciAoTG9nTWVzc2FnZSBsb2cgOiBwbHVnaW5Mb2dzQWlkbCkgeworICAgICAgICA6OlYxXzQ6OkxvZ01lc3NhZ2UgbG9nSGlkbDsKKyAgICAgICAgbG9nSGlkbC50aW1lTXMgPSBsb2cudGltZU1zOworICAgICAgICAvLyBza2lwIG5lZ2F0aXZlIGNvbnZlcnQgY2hlY2sgYXMgY291bnQgb2YgZW51bSBlbGVtZW50cyBpcyA3CisgICAgICAgIGxvZ0hpZGwucHJpb3JpdHkgPSAgc3RhdGljX2Nhc3Q8OjpWMV80OjpMb2dQcmlvcml0eT4oKGludDMyX3QpbG9nLnByaW9yaXR5KTsKKyAgICAgICAgbG9nSGlkbC5tZXNzYWdlID0gbG9nLm1lc3NhZ2U7CisgICAgICAgIHBsdWdpbkxvZ3MucHVzaF9iYWNrKGxvZ0hpZGwpOworICAgIH0KKworICAgIGF1dG8gYWxsTG9ncyhnTG9nQnVmLmdldExvZ3MoKSk7CisgICAgTE9HMkJEKCJmcmFtZXdvcmsgbG9ncyBzaXplICV6dTsgcGx1Z2luIGxvZ3Mgc2l6ZSAlenUiLAorICAgICAgICAgICBhbGxMb2dzLnNpemUoKSwgcGx1Z2luTG9ncy5zaXplKCkpOworICAgIHN0ZDo6Y29weShwbHVnaW5Mb2dzLmJlZ2luKCksIHBsdWdpbkxvZ3MuZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcihhbGxMb2dzKSk7CisgICAgc3RkOjpzb3J0KGFsbExvZ3MuYmVnaW4oKSwgYWxsTG9ncy5lbmQoKSwKKyAgICAgICAgICAgICAgW10oY29uc3QgOjpWMV80OjpMb2dNZXNzYWdlICZhLCBjb25zdCA6OlYxXzQ6OkxvZ01lc3NhZ2UgJmIpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBhLnRpbWVNcyA8IGIudGltZU1zOworICAgICAgICAgICAgICB9KTsKKworICAgIGxvZ3MuYXBwZW5kVmVjdG9yKGFsbExvZ3MpOworICAgIHJldHVybiBPSzsKK30KKwogdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KIHN0YXR1c190IEdldExvZ01lc3NhZ2VzKGNvbnN0IHNwPFU+ICZvYmosIFZlY3Rvcjw6OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSB7CiAgICAgc3A8VD4gcGx1Z2luID0gVDo6Y2FzdEZyb20ob2JqKTsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9Ecm1NZXRyaWNzX3Rlc3QuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0RybU1ldHJpY3NfdGVzdC5jcHAKaW5kZXggZjM2MmQ2MC4uMjM3YTg4YiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0RybU1ldHJpY3NfdGVzdC5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0RybU1ldHJpY3NfdGVzdC5jcHAKQEAgLTgzLDggKzgzLDggQEAKICAgbWV0cmljcy5tUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlci5JbmNyZW1lbnQoT0spOwogICBtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KE9LKTsKIAotICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChLZXlTdGF0dXNUeXBlOjpVU0FCTEUpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUtleVN0YXR1c1R5cGU6OlVTQUJMRSk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKIAogICBQZXJzaXN0YWJsZUJ1bmRsZSBidW5kbGU7CiAgIERybU1ldHJpY3NDb25zdW1lciBjb25zdW1lcigmYnVuZGxlKTsKQEAgLTE1MSwxNiArMTUxLDE2IEBACiAgIG1ldHJpY3MubUdldERldmljZVVuaXF1ZUlkQ291bnRlci5JbmNyZW1lbnQoT0spOwogICBtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KFVORVhQRUNURURfTlVMTCk7CiAKLSAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6VVNBQkxFKTsKLSAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6RVhQSVJFRCk7Ci0gIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6Ok9VVFBVVE5PVEFMTE9XRUQpOwotICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChLZXlTdGF0dXNUeXBlOjpTVEFUVVNQRU5ESU5HKTsKLSAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUik7Ci0gIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpQUk9WSVNJT05fUkVRVUlSRUQpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6S0VZX05FRURFRCk7Ci0gIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpLRVlfRVhQSVJFRCk7Ci0gIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRCk7Ci0gIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpTRVNTSU9OX1JFQ0xBSU1FRCk7CisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClLZXlTdGF0dXNUeXBlOjpVU0FCTEUpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpS2V5U3RhdHVzVHlwZTo6RVhQSVJFRCk7CisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClLZXlTdGF0dXNUeXBlOjpPVVRQVVROT1RBTExPV0VEKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUtleVN0YXR1c1R5cGU6OlNUQVRVU1BFTkRJTkcpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUik7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKKyAgbWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpRXZlbnRUeXBlOjpLRVlfTkVFREVEKTsKKyAgbWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpRXZlbnRUeXBlOjpLRVlfRVhQSVJFRCk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClFdmVudFR5cGU6OlNFU1NJT05fUkVDTEFJTUVEKTsKIAogICBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkMTsKICAgc2Vzc2lvbklkMS5wdXNoX2JhY2soMSk7CkBAIC0yODQsMTYgKzI4NCwxNiBAQAogICBtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KE9LKTsKICAgbWV0cmljcy5tR2V0RGV2aWNlVW5pcXVlSWRDb3VudGVyLkluY3JlbWVudChVTkVYUEVDVEVEX05VTEwpOwogCi0gIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6OlVTQUJMRSk7Ci0gIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6OkVYUElSRUQpOwotICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChLZXlTdGF0dXNUeXBlOjpPVVRQVVROT1RBTExPV0VEKTsKLSAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6U1RBVFVTUEVORElORyk7Ci0gIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6OklOVEVSTkFMRVJST1IpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKLSAgbWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudChFdmVudFR5cGU6OktFWV9ORUVERUQpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6S0VZX0VYUElSRUQpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQpOwotICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6U0VTU0lPTl9SRUNMQUlNRUQpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpS2V5U3RhdHVzVHlwZTo6VVNBQkxFKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUtleVN0YXR1c1R5cGU6OkVYUElSRUQpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpS2V5U3RhdHVzVHlwZTo6T1VUUFVUTk9UQUxMT1dFRCk7CisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClLZXlTdGF0dXNUeXBlOjpTVEFUVVNQRU5ESU5HKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUtleVN0YXR1c1R5cGU6OklOVEVSTkFMRVJST1IpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClFdmVudFR5cGU6OlBST1ZJU0lPTl9SRVFVSVJFRCk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUV2ZW50VHlwZTo6S0VZX05FRURFRCk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoKHVpbnQzMl90KUV2ZW50VHlwZTo6S0VZX0VYUElSRUQpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KCh1aW50MzJfdClFdmVudFR5cGU6OlZFTkRPUl9ERUZJTkVEKTsKKyAgbWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudCgodWludDMyX3QpRXZlbnRUeXBlOjpTRVNTSU9OX1JFQ0xBSU1FRCk7CiAKICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZE1ldHJpY3M7CiAgIEFTU0VSVF9FUShPSywgbWV0cmljcy5HZXRTZXJpYWxpemVkTWV0cmljcygmc2VyaWFsaXplZE1ldHJpY3MpKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL1RFU1RfTUFQUElORyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL1RFU1RfTUFQUElORwppbmRleCA3YmQxNTY4Li45OTE5ZTkwIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9URVNUX01BUFBJTkcKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvVEVTVF9NQVBQSU5HCkBAIC0xLDE2ICsxLDEwIEBACiB7CiAgICJwcmVzdWJtaXQiOiBbCiAgICAgewotICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFUZXN0Q2FzZXMiLAorICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFEcm1GcmFtZXdvcmtUZXN0Q2FzZXMiLAogICAgICAgIm9wdGlvbnMiIDogWwogICAgICAgICB7CiAgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLk1lZGlhRHJtQ2xlYXJrZXlUZXN0IgotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLk1lZGlhRHJtTWV0cmljc1Rlc3QiCiAgICAgICAgIH0KICAgICAgIF0KICAgICB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxZjc0MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvQW5kcm9pZC5icApAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiaGFyZHdhcmVfaW50ZXJmYWNlc19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiYWlkbF9jbGVhcmtleV9zZXJ2aWNlX2RlZmF1bHRzIiwKKyAgICB2ZW5kb3I6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwIiwKKyAgICAgICAgIkNyeXB0b1BsdWdpbi5jcHAiLAorICAgICAgICAiRHJtRmFjdG9yeS5jcHAiLAorICAgICAgICAiRHJtUGx1Z2luLmNwcCIsCisgICAgXSwKKworICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKworICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIiwgIi1XdGhyZWFkLXNhZmV0eSJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvaW5jbHVkZSJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtLVYxLW5kayIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi1WMi1uZGsiLAorICAgICAgICAibGliY2xlYXJrZXliYXNlIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCisgICAgfSwKK30KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleSIsCisgICAgZGVmYXVsdHM6IFsiYWlkbF9jbGVhcmtleV9zZXJ2aWNlX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJTZXJ2aWNlLmNwcCJdLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleS5yYyJdLAorICAgIHZpbnRmX2ZyYWdtZW50czogWyJhbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLmNsZWFya2V5LnhtbCJdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLWxhenkuY2xlYXJrZXkiLAorICAgIGRlZmF1bHRzOiBbImFpZGxfY2xlYXJrZXlfc2VydmljZV9kZWZhdWx0cyJdLAorICAgIG92ZXJyaWRlczogWyJhbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLmNsZWFya2V5Il0sCisgICAgc3JjczogWyJTZXJ2aWNlTGF6eS5jcHAiXSwKKyAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYyJdLAorICAgIHZpbnRmX2ZyYWdtZW50czogWyJhbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLmNsZWFya2V5LnhtbCJdLAorfQorCitwaG9ueSB7CisgICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUuZHJtQGxhdGVzdC1zZXJ2aWNlLmNsZWFya2V5IiwKKyAgICByZXF1aXJlZDogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTZmZTNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oIgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitzdGQ6OnNoYXJlZF9wdHI8RHJtRmFjdG9yeT4gY3JlYXRlRHJtRmFjdG9yeSgpIHsKKyAgcmV0dXJuIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPERybUZhY3Rvcnk+KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIGRybQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvQ3J5cHRvUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvQ3J5cHRvUGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDFjZjAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9DcnlwdG9QbHVnaW4uY3BwCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiY2xlYXJrZXktQ3J5cHRvUGx1Z2luIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpbmNsdWRlICJDcnlwdG9QbHVnaW4uaCIKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorI2luY2x1ZGUgIkFpZGxVdGlscy5oIgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN0YXR1czsKKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQ3J5cHRvUGx1Z2luOjpkZWNyeXB0KGNvbnN0IERlY3J5cHRBcmdzJiBpbl9hcmdzLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBjb25zdCBjaGFyKiBkZXRhaWxlZEVycm9yID0gIiI7CisKKyAgICAqX2FpZGxfcmV0dXJuID0gMDsKKyAgICBpZiAoaW5fYXJncy5zZWN1cmUpIHsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9ICJzZWN1cmUgZGVjcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggQ2xlYXJLZXkiOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBzaGFyZWRfYnVmZmVyX2xvY2sobVNoYXJlZEJ1ZmZlckxvY2spOworICAgIGlmIChtU2hhcmVkQnVmZmVyTWFwLmZpbmQoaW5fYXJncy5zb3VyY2UuYnVmZmVySWQpID09IG1TaGFyZWRCdWZmZXJNYXAuZW5kKCkpIHsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9ICJzb3VyY2UgZGVjcnlwdCBidWZmZXIgYmFzZSBub3Qgc2V0IjsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCBkZXRhaWxlZEVycm9yKTsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvIE5PTl9TRUNVUkUgPSBEZXN0aW5hdGlvbkJ1ZmZlcjo6VGFnOjpub25zZWN1cmVNZW1vcnk7CisgICAgaWYgKGluX2FyZ3MuZGVzdGluYXRpb24uZ2V0VGFnKCkgIT0gTk9OX1NFQ1VSRSkgeworICAgICAgICBkZXRhaWxlZEVycm9yID0gImRlc3RpbmF0aW9uIHR5cGUgbm90IHN1cHBvcnRlZCI7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgZGV0YWlsZWRFcnJvcik7CisgICAgfQorCisgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBkZXN0QnVmZmVyID0gaW5fYXJncy5kZXN0aW5hdGlvbi5nZXQ8Tk9OX1NFQ1VSRT4oKTsKKyAgICBpZiAobVNoYXJlZEJ1ZmZlck1hcC5maW5kKGRlc3RCdWZmZXIuYnVmZmVySWQpID09IG1TaGFyZWRCdWZmZXJNYXAuZW5kKCkpIHsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9ICJkZXN0aW5hdGlvbiBkZWNyeXB0IGJ1ZmZlciBiYXNlIG5vdCBzZXQiOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIGF1dG8gc3JjID0gbVNoYXJlZEJ1ZmZlck1hcFtpbl9hcmdzLnNvdXJjZS5idWZmZXJJZF07CisgICAgaWYgKHNyYy0+bUJhc2UgPT0gbnVsbHB0cikgeworICAgICAgICBkZXRhaWxlZEVycm9yID0gInNvdXJjZSBpcyBhIG51bGxwdHIiOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOworICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KGluX2FyZ3Muc291cmNlLm9mZnNldCwgaW5fYXJncy5vZmZzZXQsICZ0b3RhbFNpemUpIHx8CisgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3codG90YWxTaXplLCBpbl9hcmdzLnNvdXJjZS5zaXplLCAmdG90YWxTaXplKSB8fAorICAgICAgICB0b3RhbFNpemUgPiBzcmMtPm1TaXplKSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTc2NDk2MTYwIik7CisgICAgICAgIGRldGFpbGVkRXJyb3IgPSAiaW52YWxpZCBidWZmZXIgc2l6ZSI7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgZGV0YWlsZWRFcnJvcik7CisgICAgfQorCisgICAgLy8gZGVzdGluYXRpb24gdHlwZSBtdXN0IGJlIG5vbi1zZWN1cmUgc2hhcmVkIG1lbW9yeQorICAgIGF1dG8gZGVzdCA9IG1TaGFyZWRCdWZmZXJNYXBbZGVzdEJ1ZmZlci5idWZmZXJJZF07CisgICAgaWYgKGRlc3QtPm1CYXNlID09IG51bGxwdHIpIHsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9ICJkZXN0aW5hdGlvbiBpcyBhIG51bGxwdHIiOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIHRvdGFsU2l6ZSA9IDA7CisgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coZGVzdEJ1ZmZlci5vZmZzZXQsIGRlc3RCdWZmZXIuc2l6ZSwgJnRvdGFsU2l6ZSkgfHwKKyAgICAgICAgdG90YWxTaXplID4gZGVzdC0+bVNpemUpIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxNzY0NDQ2MjIiKTsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9ICJpbnZhbGlkIGJ1ZmZlciBzaXplIjsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0UsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSB0aGUgb3V0cHV0IGJ1ZmZlciBzaXplIGFuZCBkZXRlcm1pbmUgaWYgYW55IHN1YnNhbXBsZXMgYXJlCisgICAgLy8gZW5jcnlwdGVkLgorICAgIHVpbnQ4X3QqIHNyY1B0ciA9IHNyYy0+bUJhc2UgKyBpbl9hcmdzLnNvdXJjZS5vZmZzZXQgKyBpbl9hcmdzLm9mZnNldDsKKyAgICB1aW50OF90KiBkZXN0UHRyID0gZGVzdC0+bUJhc2UgKyBkZXN0QnVmZmVyLm9mZnNldDsKKyAgICBzaXplX3QgZGVzdFNpemUgPSAwOworICAgIHNpemVfdCBzcmNTaXplID0gMDsKKyAgICBib29sIGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbl9hcmdzLnN1YlNhbXBsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgU3ViU2FtcGxlJiBzdWJTYW1wbGUgPSBpbl9hcmdzLnN1YlNhbXBsZXNbaV07CisgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlc3RTaXplLCBzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSwgJmRlc3RTaXplKSB8fAorICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhzcmNTaXplLCBzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSwgJnNyY1NpemUpKSB7CisgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gInN1YnNhbXBsZSBjbGVhciBzaXplIG92ZXJmbG93IjsKKyAgICAgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFLCBkZXRhaWxlZEVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19idWlsdGluX2FkZF9vdmVyZmxvdyhkZXN0U2l6ZSwgc3ViU2FtcGxlLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhLCAmZGVzdFNpemUpIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNyY1NpemUsIHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSwgJnNyY1NpemUpKSB7CisgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gInN1YnNhbXBsZSBlbmNyeXB0ZWQgc2l6ZSBvdmVyZmxvdyI7CisgICAgICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRSwgZGV0YWlsZWRFcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA+IDApIHsKKyAgICAgICAgICAgIGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkZXN0U2l6ZSA+IGRlc3RCdWZmZXIuc2l6ZSB8fCBzcmNTaXplID4gaW5fYXJncy5zb3VyY2Uuc2l6ZSkgeworICAgICAgICBkZXRhaWxlZEVycm9yID0gInN1YnNhbXBsZSBzdW0gdG9vIGxhcmdlIjsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0UsIGRldGFpbGVkRXJyb3IpOworICAgIH0KKworICAgIGlmIChpbl9hcmdzLm1vZGUgPT0gTW9kZTo6VU5FTkNSWVBURUQpIHsKKyAgICAgICAgaWYgKGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzKSB7CisgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gIkVuY3J5cHRlZCBzdWJzYW1wbGVzIGZvdW5kIGluIGFsbGVnZWRseSB1bmVuY3J5cHRlZCBkYXRhLiI7CisgICAgICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5fYXJncy5zdWJTYW1wbGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBTdWJTYW1wbGUmIHN1YlNhbXBsZSA9IGluX2FyZ3Muc3ViU2FtcGxlc1tpXTsKKyAgICAgICAgICAgIGlmIChzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRlc3RQdHIpICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzcmNQdHIpICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHN1YlNhbXBsZS5udW1CeXRlc09mQ2xlYXJEYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKl9haWRsX3JldHVybiA9IHN0YXRpY19jYXN0PHNzaXplX3Q+KG9mZnNldCk7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7CisgICAgfSBlbHNlIGlmIChpbl9hcmdzLm1vZGUgPT0gTW9kZTo6QUVTX0NUUikgeworICAgICAgICBzaXplX3QgYnl0ZXNEZWNyeXB0ZWR7fTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gY2xlYXJEYXRhTGVuZ3RoczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gZW5jcnlwdGVkRGF0YUxlbmd0aHM7CisgICAgICAgIGZvciAoYXV0byBzcyA6IGluX2FyZ3Muc3ViU2FtcGxlcykgeworICAgICAgICAgICAgY2xlYXJEYXRhTGVuZ3Rocy5wdXNoX2JhY2soc3MubnVtQnl0ZXNPZkNsZWFyRGF0YSk7CisgICAgICAgICAgICBlbmNyeXB0ZWREYXRhTGVuZ3Rocy5wdXNoX2JhY2soc3MubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEpOworICAgICAgICB9CisgICAgICAgIGF1dG8gcmVzID0KKyAgICAgICAgICAgICAgICBtU2Vzc2lvbi0+ZGVjcnlwdChpbl9hcmdzLmtleUlkLmRhdGEoKSwgaW5fYXJncy5pdi5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyLCBzdGF0aWNfY2FzdDx1aW50OF90Kj4oZGVzdFB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJEYXRhTGVuZ3RocywgZW5jcnlwdGVkRGF0YUxlbmd0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzRGVjcnlwdGVkKTsKKyAgICAgICAgaWYgKHJlcyA9PSBjbGVhcmtleWRybTo6T0spIHsKKyAgICAgICAgICAgICpfYWlkbF9yZXR1cm4gPSBzdGF0aWNfY2FzdDxzc2l6ZV90PihieXRlc0RlY3J5cHRlZCk7CisgICAgICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKl9haWRsX3JldHVybiA9IDA7CisgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gIkRlY3J5cHRpb24gRXJyb3IiOworICAgICAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0aWNfY2FzdDxTdGF0dXM+KHJlcyksIGRldGFpbGVkRXJyb3IpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IDA7CisgICAgICAgIGRldGFpbGVkRXJyb3IgPSAic2VsZWN0ZWQgZW5jcnlwdGlvbiBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIENsZWFyS2V5IERSTSBQbHVnaW4iOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGRldGFpbGVkRXJyb3IpOworICAgIH0KK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQ3J5cHRvUGx1Z2luOjpnZXRMb2dNZXNzYWdlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dNZXNzYWdlPiogX2FpZGxfcmV0dXJuKSB7CisgICAgdXNpbmcgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q7CisgICAgdXNpbmcgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kczsKKyAgICB1c2luZyBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOworCisgICAgYXV0byB0aW1lTWlsbGlzID0gZHVyYXRpb25fY2FzdDxtaWxsaXNlY29uZHM+KHN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOworCisgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dNZXNzYWdlPiBsb2dzID0geworICAgICAgICAgICAge3RpbWVNaWxsaXMsIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6TG9nUHJpb3JpdHk6OkVSUk9SLAorICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJOb3QgaW1wbGVtZW50ZWQiKX19OworICAgICpfYWlkbF9yZXR1cm4gPSBsb2dzOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIENyeXB0b1BsdWdpbjo6bm90aWZ5UmVzb2x1dGlvbihpbnQzMl90IGluX3dpZHRoLCBpbnQzMl90IGluX2hlaWdodCkgeworICAgIFVOVVNFRChpbl93aWR0aCk7CisgICAgVU5VU0VEKGluX2hlaWdodCk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBDcnlwdG9QbHVnaW46OnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBzdGQ6OnN0cmluZyYgaW5fbWltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgeworICAgIFVOVVNFRChpbl9taW1lKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBDcnlwdG9QbHVnaW46OnNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgaWYgKCFpbl9zZXNzaW9uSWQuc2l6ZSgpKSB7CisgICAgICAgIG1TZXNzaW9uID0gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2Vzc2lvbiA9IFNlc3Npb25MaWJyYXJ5OjpnZXQoKS0+ZmluZFNlc3Npb24oaW5fc2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKCFtU2Vzc2lvbi5nZXQoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQ3J5cHRvUGx1Z2luOjpzZXRTaGFyZWRCdWZmZXJCYXNlKGNvbnN0IFNoYXJlZEJ1ZmZlciYgaW5fYmFzZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBzaGFyZWRfYnVmZmVyX2xvY2sobVNoYXJlZEJ1ZmZlckxvY2spOworICAgIG1TaGFyZWRCdWZmZXJNYXBbaW5fYmFzZS5idWZmZXJJZF0gPSBzdGQ6Om1ha2Vfc2hhcmVkPFNoYXJlZEJ1ZmZlckJhc2U+KGluX2Jhc2UpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworU2hhcmVkQnVmZmVyQmFzZTo6U2hhcmVkQnVmZmVyQmFzZShjb25zdCBTaGFyZWRCdWZmZXImIG1lbSkKKyAgICAgICAgOiBtQmFzZShudWxscHRyKSwKKyAgICAgICAgICBtU2l6ZShtZW0uc2l6ZSkgeworICAgIGlmIChtZW0uaGFuZGxlLmZkcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXV0byBmZCA9IG1lbS5oYW5kbGUuZmRzWzBdLmdldCgpOworICAgIGF1dG8gYWRkciA9IG1tYXAobnVsbHB0ciwgbWVtLnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKTsKKyAgICBpZiAoYWRkciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIEFMT0dFKCJtbWFwIGVycjogZmQgJWQ7IGVycm5vICVzIiwgZmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUJhc2UgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYWRkcik7CisgICAgfQorfQorCitTaGFyZWRCdWZmZXJCYXNlOjp+U2hhcmVkQnVmZmVyQmFzZSgpIHsKKyAgICBpZiAobUJhc2UgJiYgbXVubWFwKG1CYXNlLCBtU2l6ZSkpIHsKKyAgICAgICAgQUxPR0UoIm11bm1hcCBlcnI6IGJhc2UgJXA7IGVycm5vICVzIiwKKyAgICAgICAgICAgICAgbUJhc2UsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorfQorfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9ICAvLyBuYW1lc3BhY2UgZHJtCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9Ecm1GYWN0b3J5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvRHJtRmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkYjRjMAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvRHJtRmFjdG9yeS5jcHAKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJjbGVhcmtleS1Ecm1GYWN0b3J5IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEcm1GYWN0b3J5LmgiCisKKyNpbmNsdWRlICJDbGVhcktleVVVSUQuaCIKKyNpbmNsdWRlICJDcnlwdG9QbHVnaW4uaCIKKyNpbmNsdWRlICJEcm1QbHVnaW4uaCIKKyNpbmNsdWRlICJNaW1lVHlwZVN0ZFN0ci5oIgorI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCisjaW5jbHVkZSAiQWlkbFV0aWxzLmgiCisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpVdWlkOworCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1GYWN0b3J5OjpjcmVhdGVEcm1QbHVnaW4oCisgICAgICAgIGNvbnN0IFV1aWQmIGluX3V1aWQsIGNvbnN0IHN0cmluZyYgaW5fYXBwUGFja2FnZU5hbWUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OklEcm1QbHVnaW4+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBVTlVTRUQoaW5fYXBwUGFja2FnZU5hbWUpOworCisgICAgaWYgKCFpc0NsZWFyS2V5VVVJRChpbl91dWlkLnV1aWQuZGF0YSgpKSkgeworICAgICAgICBBTE9HRSgiQ2xlYXJrZXkgRHJtIEhBTDogZmFpbGVkIHRvIGNyZWF0ZSBkcm0gcGx1Z2luLCAiCisgICAgICAgICAgICAgICJpbnZhbGlkIGNyeXB0byBzY2hlbWUiKTsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxEcm1QbHVnaW4+IHBsdWdpbiA9CisgICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxEcm1QbHVnaW4+KFNlc3Npb25MaWJyYXJ5OjpnZXQoKSk7CisgICAgKl9haWRsX3JldHVybiA9IHBsdWdpbjsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1GYWN0b3J5OjpjcmVhdGVDcnlwdG9QbHVnaW4oCisgICAgICAgIGNvbnN0IFV1aWQmIGluX3V1aWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9pbml0RGF0YSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SUNyeXB0b1BsdWdpbj4qIF9haWRsX3JldHVybikgeworICAgIGlmICghaXNDbGVhcktleVVVSUQoaW5fdXVpZC51dWlkLmRhdGEoKSkpIHsKKyAgICAgICAgQUxPR0UoIkNsZWFya2V5IERybSBIQUw6IGZhaWxlZCB0byBjcmVhdGUgY3J5cHRvIHBsdWdpbiwgIgorICAgICAgICAgICAgICAiaW52YWxpZCBjcnlwdG8gc2NoZW1lIik7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBudWxscHRyOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q3J5cHRvUGx1Z2luPiBwbHVnaW4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxDcnlwdG9QbHVnaW4+KGluX2luaXREYXRhKTsKKyAgICBTdGF0dXMgc3RhdHVzID0gcGx1Z2luLT5nZXRJbml0U3RhdHVzKCk7CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIHBsdWdpbi5yZXNldCgpOworICAgICAgICBwbHVnaW4gPSBudWxscHRyOworICAgIH0KKyAgICAqX2FpZGxfcmV0dXJuID0gcGx1Z2luOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtRmFjdG9yeTo6Z2V0U3VwcG9ydGVkQ3J5cHRvU2NoZW1lcyhDcnlwdG9TY2hlbWVzKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBDcnlwdG9TY2hlbWVzIHNjaGVtZXN7fTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHV1aWQgOiA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OmNsZWFya2V5OjpnZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKCkpIHsKKyAgICAgICAgc2NoZW1lcy51dWlkcy5wdXNoX2JhY2soe3V1aWR9KTsKKyAgICB9CisgICAgZm9yIChhdXRvIG1pbWUgOiB7a0lzb0JtZmZWaWRlb01pbWVUeXBlLCBrSXNvQm1mZkF1ZGlvTWltZVR5cGUsIGtDZW5jSW5pdERhdGFGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAga1dlYm1WaWRlb01pbWVUeXBlLCBrV2VibUF1ZGlvTWltZVR5cGUsIGtXZWJtSW5pdERhdGFGb3JtYXR9KSB7CisgICAgICAgIGNvbnN0IGF1dG8gbWluTGV2ZWwgPSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOworICAgICAgICBjb25zdCBhdXRvIG1heExldmVsID0gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKKyAgICAgICAgc2NoZW1lcy5taW1lVHlwZXMucHVzaF9iYWNrKHttaW1lLCBtaW5MZXZlbCwgbWF4TGV2ZWx9KTsKKyAgICB9CisgICAgKl9haWRsX3JldHVybiA9IHNjaGVtZXM7CisgICAgcmV0dXJuIG5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworYmluZGVyX3N0YXR1c190IERybUZhY3Rvcnk6OmR1bXAoaW50IGZkLCBjb25zdCBjaGFyKiogYXJncywgdWludDMyX3QgbnVtQXJncykgeworICAgIFVOVVNFRChhcmdzKTsKKyAgICBVTlVTRUQobnVtQXJncyk7CisKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogbmVnYXRpdmUgZmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gU1RBVFVTX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjdXJyZW50U2Vzc2lvbnMgPSBTZXNzaW9uTGlicmFyeTo6Z2V0KCktPm51bU9wZW5TZXNzaW9ucygpOworICAgIGRwcmludGYoZmQsICJjdXJyZW50IG9wZW4gc2Vzc2lvbnM6ICV1XG4iLCBjdXJyZW50U2Vzc2lvbnMpOworCisgICAgcmV0dXJuIFNUQVRVU19PSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9ICAvLyBuYW1lc3BhY2UgZHJtCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL0RybVBsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL0RybVBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1MWU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvRHJtUGx1Z2luLmNwcApAQCAtMCwwICsxLDEwMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJjbGVhcmtleS1Ecm1QbHVnaW4iCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZHJtL0RybU1ldHJpYy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlICJBaWRsVXRpbHMuaCIKKyNpbmNsdWRlICJDbGVhcktleURybVByb3BlcnRpZXMuaCIKKyNpbmNsdWRlICJEcm1QbHVnaW4uaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKyNpbmNsdWRlICJBaWRsQ2xlYXJLZXJ5UHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgeworY29uc3Qgc3RkOjpzdHJpbmcga0tleVNldElkUHJlZml4KCJja2lkIik7Citjb25zdCBpbnQga0tleVNldElkTGVuZ3RoID0gMTY7Citjb25zdCBpbnQga1NlY3VyZVN0b3BJZFN0YXJ0ID0gMTAwOworY29uc3Qgc3RkOjpzdHJpbmcga09mZmxpbmVMaWNlbnNlKCJcInR5cGVcIjpcInBlcnNpc3RlbnQtbGljZW5zZVwiIik7Citjb25zdCBzdGQ6OnN0cmluZyBrU3RyZWFtaW5nKCJTdHJlYW1pbmciKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtUZW1wb3JhcnlMaWNlbnNlKCJcInR5cGVcIjpcInRlbXBvcmFyeVwiIik7Citjb25zdCBzdGQ6OnN0cmluZyBrVHJ1ZSgiVHJ1ZSIpOworCitjb25zdCBzdGQ6OnN0cmluZyBrUXVlcnlLZXlMaWNlbnNlVHlwZSgiTGljZW5zZVR5cGUiKTsKKy8vIFZhbHVlOiAiU3RyZWFtaW5nIiBvciAiT2ZmbGluZSIKK2NvbnN0IHN0ZDo6c3RyaW5nIGtRdWVyeUtleVBsYXlBbGxvd2VkKCJQbGF5QWxsb3dlZCIpOworLy8gVmFsdWU6ICJUcnVlIiBvciAiRmFsc2UiCitjb25zdCBzdGQ6OnN0cmluZyBrUXVlcnlLZXlSZW5ld0FsbG93ZWQoIlJlbmV3QWxsb3dlZCIpOworLy8gVmFsdWU6ICJUcnVlIiBvciAiRmFsc2UiCisKK2NvbnN0IGludCBrU2VjdXJlU3RvcElkU2l6ZSA9IDEwOworCitzdGQ6OnZlY3Rvcjx1aW50OF90PiB1aW50MzJUb1ZlY3Rvcih1aW50MzJfdCB2YWx1ZSkgeworICAgIC8vIDEwIGJ5dGVzIHRvIGRpc3BsYXkgbWF4IHZhbHVlIDQyOTQ5NjcyOTUgKyBvbmUgYnl0ZSBudWxsIHRlcm1pbmF0b3IKKyAgICBjaGFyIGJ1ZmZlcltrU2VjdXJlU3RvcElkU2l6ZV07CisgICAgbWVtc2V0KGJ1ZmZlciwgMCwga1NlY3VyZVN0b3BJZFNpemUpOworICAgIHNucHJpbnRmKGJ1ZmZlciwga1NlY3VyZVN0b3BJZFNpemUsICIlIiBQUkl1MzIsIHZhbHVlKTsKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8dWludDhfdD4oYnVmZmVyLCBidWZmZXIgKyBzaXplb2YoYnVmZmVyKSk7Cit9CisKK307ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4OworCitEcm1QbHVnaW46OkRybVBsdWdpbihTZXNzaW9uTGlicmFyeSogc2Vzc2lvbkxpYnJhcnkpCisgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpLAorICAgICAgbU9wZW5TZXNzaW9uT2tDb3VudCgwKSwKKyAgICAgIG1DbG9zZVNlc3Npb25Pa0NvdW50KDApLAorICAgICAgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50KDApLAorICAgICAgbU5leHRTZWN1cmVTdG9wSWQoa1NlY3VyZVN0b3BJZFN0YXJ0KSwKKyAgICAgIG1Nb2NrRXJyb3IoU3RhdHVzOjpPSykgeworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CisgICAgaW5pdFByb3BlcnRpZXMoKTsKKyAgICBtU2VjdXJlU3RvcHMuY2xlYXIoKTsKKyAgICBtUmVsZWFzZUtleXNNYXAuY2xlYXIoKTsKKyAgICBzdGQ6OnNyYW5kKHN0ZDo6dGltZShudWxscHRyKSk7Cit9CisKK3ZvaWQgRHJtUGx1Z2luOjppbml0UHJvcGVydGllcygpIHsKKyAgICBtU3RyaW5nUHJvcGVydGllcy5jbGVhcigpOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tWZW5kb3JLZXldID0ga0FpZGxWZW5kb3JWYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trVmVyc2lvbktleV0gPSBrQWlkbFZlcnNpb25WYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trUGx1Z2luRGVzY3JpcHRpb25LZXldID0ga0FpZGxQbHVnaW5EZXNjcmlwdGlvblZhbHVlOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tBbGdvcml0aG1zS2V5XSA9IGtBaWRsQWxnb3JpdGhtc1ZhbHVlOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tMaXN0ZW5lclRlc3RTdXBwb3J0S2V5XSA9IGtBaWRsTGlzdGVuZXJUZXN0U3VwcG9ydFZhbHVlOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tEcm1FcnJvclRlc3RLZXldID0ga0FpZGxEcm1FcnJvclRlc3RWYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trQWlkbFZlcnNpb25LZXldID0ga0FpZGxWZXJzaW9uVmFsdWU7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZVZlY3RvcjsKKyAgICB2YWx1ZVZlY3Rvci5jbGVhcigpOworICAgIHZhbHVlVmVjdG9yLmluc2VydCh2YWx1ZVZlY3Rvci5lbmQoKSwga1Rlc3REZXZpY2VJZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0RGV2aWNlSWREYXRhICsgc2l6ZW9mKGtUZXN0RGV2aWNlSWREYXRhKSAvIHNpemVvZih1aW50OF90KSk7CisgICAgbUJ5dGVBcnJheVByb3BlcnRpZXNba0RldmljZUlkS2V5XSA9IHZhbHVlVmVjdG9yOworCisgICAgdmFsdWVWZWN0b3IuY2xlYXIoKTsKKyAgICB2YWx1ZVZlY3Rvci5pbnNlcnQodmFsdWVWZWN0b3IuZW5kKCksIGtNZXRyaWNzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAga01ldHJpY3NEYXRhICsgc2l6ZW9mKGtNZXRyaWNzRGF0YSkgLyBzaXplb2YodWludDhfdCkpOworICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzW2tNZXRyaWNzS2V5XSA9IHZhbHVlVmVjdG9yOworfQorCisvLyBUaGUgc2VjdXJlIHN0b3AgaW4gQ2xlYXJLZXkgaW1wbGVtZW50YXRpb24gaXMgbm90IGluc3RhbGxlZCBzZWN1cmVseS4KKy8vIFRoaXMgZnVuY3Rpb24gbWVyZWx5IGNyZWF0ZXMgYSB0ZXN0IGVudmlyb25tZW50IGZvciB0ZXN0aW5nIHNlY3VyZSBzdG9wcyBBUElzLgorLy8gVGhlIGNvbnRlbnQgaW4gdGhpcyBzZWN1cmUgc3RvcCBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQsIHRoZSBjbGVhcmtleQorLy8gc2VjdXJlU3RvcCBkb2VzIG5vdCBzZXJ2ZSBhcyBhIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4KK3ZvaWQgRHJtUGx1Z2luOjppbnN0YWxsU2VjdXJlU3RvcChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgOjphbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VjdXJlU3RvcExvY2spOworCisgICAgQ2xlYXJrZXlTZWN1cmVTdG9wIGNsZWFya2V5U2VjdXJlU3RvcDsKKyAgICBjbGVhcmtleVNlY3VyZVN0b3AuaWQgPSB1aW50MzJUb1ZlY3RvcigrK21OZXh0U2VjdXJlU3RvcElkKTsKKyAgICBjbGVhcmtleVNlY3VyZVN0b3AuZGF0YS5hc3NpZ24oc2Vzc2lvbklkLmJlZ2luKCksIHNlc3Npb25JZC5lbmQoKSk7CisKKyAgICBtU2VjdXJlU3RvcHMuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90PiwgQ2xlYXJrZXlTZWN1cmVTdG9wPihjbGVhcmtleVNlY3VyZVN0b3AuaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJrZXlTZWN1cmVTdG9wKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Y2xvc2VTZXNzaW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQpIHsKKyAgICBpZiAoaW5fc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oaW5fc2Vzc2lvbklkKTsKKyAgICBpZiAoc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICBtU2Vzc2lvbkxpYnJhcnktPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb24pOworICAgICAgICBpZiAoc2Vzc2lvbi0+Z2V0TW9ja0Vycm9yKCkgIT0gY2xlYXJrZXlkcm06Ok9LKSB7CisgICAgICAgICAgICBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShpbl9zZXNzaW9uSWQpOworICAgICAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xvc2VTZXNzaW9uT2tDb3VudCsrOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworICAgIH0KKyAgICBtQ2xvc2VTZXNzaW9uTm90T3BlbmVkQ291bnQrKzsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6ZGVjcnlwdChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9rZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2l2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0ge307CisgICAgaWYgKGluX3Nlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBpbl9rZXlJZC5zaXplKCkgPT0gMCB8fCBpbl9pbnB1dC5zaXplKCkgPT0gMCB8fAorICAgICAgICBpbl9pdi5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjplbmNyeXB0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2tleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSB7fTsKKyAgICBpZiAoaW5fc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGluX2tleUlkLnNpemUoKSA9PSAwIHx8IGluX2lucHV0LnNpemUoKSA9PSAwIHx8CisgICAgICAgIGluX2l2LnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OmdldEhkY3BMZXZlbHMoCisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SGRjcExldmVscyogX2FpZGxfcmV0dXJuKSB7CisgICAgX2FpZGxfcmV0dXJuLT5jb25uZWN0ZWRMZXZlbCA9IEhkY3BMZXZlbDo6SERDUF9OT05FOworICAgIF9haWRsX3JldHVybi0+bWF4TGV2ZWwgPSBIZGNwTGV2ZWw6OkhEQ1BfTk9fT1VUUFVUOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Njb3BlLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faW5pdERhdGEsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9taW1lVHlwZSwgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlUeXBlIGluX2tleVR5cGUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5VmFsdWU+JiBpbl9vcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5UmVxdWVzdCogX2FpZGxfcmV0dXJuKSB7CisgICAgVU5VU0VEKGluX29wdGlvbmFsUGFyYW1ldGVycyk7CisKKyAgICBLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpVTktOT1dOOworICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRVcmwoImh0dHBzOi8vZGVmYXVsdC51cmwiKTsKKworICAgIF9haWRsX3JldHVybi0+cmVxdWVzdCA9IHt9OworICAgIF9haWRsX3JldHVybi0+cmVxdWVzdFR5cGUgPSBrZXlSZXF1ZXN0VHlwZTsKKyAgICBfYWlkbF9yZXR1cm4tPmRlZmF1bHRVcmwgPSBkZWZhdWx0VXJsOworCisgICAgaWYgKGluX3Njb3BlLnNpemUoKSA9PSAwIHx8CisgICAgICAgIChpbl9rZXlUeXBlICE9IEtleVR5cGU6OlNUUkVBTUlORyAmJiBpbl9rZXlUeXBlICE9IEtleVR5cGU6Ok9GRkxJTkUgJiYKKyAgICAgICAgIGluX2tleVR5cGUgIT0gS2V5VHlwZTo6UkVMRUFTRSkpIHsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkJBRF9WQUxVRSk7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2NvcGVJZCA9IGluX3Njb3BlOworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbjsKKyAgICBzdGQ6OnNldDxLZXlUeXBlPiBpbml0X3R5cGVze0tleVR5cGU6OlNUUkVBTUlORywgS2V5VHlwZTo6T0ZGTElORX07CisgICAgaWYgKGluaXRfdHlwZXMuY291bnQoaW5fa2V5VHlwZSkpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkKHNjb3BlSWQuYmVnaW4oKSwgc2NvcGVJZC5lbmQoKSk7CisgICAgICAgIHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgIGlmICghc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQpOworICAgICAgICB9IGVsc2UgaWYgKHNlc3Npb24tPmdldE1vY2tFcnJvcigpICE9IGNsZWFya2V5ZHJtOjpPSykgeworICAgICAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzZXNzaW9uLT5nZXRNb2NrRXJyb3IoKSk7CisgICAgICAgIH0KKyAgICAgICAga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZTo6SU5JVElBTDsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXF1ZXN0ID0ge307CisgICAgYXV0byBrZXlUeXBlID0gc3RhdGljX2Nhc3Q8Q2RtS2V5VHlwZT4oaW5fa2V5VHlwZSk7CisgICAgYXV0byBzdGF0dXMgPSBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluX2luaXREYXRhLCBpbl9taW1lVHlwZSwga2V5VHlwZSwgJnJlcXVlc3QpOworCisgICAgaWYgKGluX2tleVR5cGUgPT0gS2V5VHlwZTo6UkVMRUFTRSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZChzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworICAgICAgICBzdGQ6OnN0cmluZyByZXF1ZXN0U3RyaW5nKHJlcXVlc3QuYmVnaW4oKSwgcmVxdWVzdC5lbmQoKSk7CisgICAgICAgIGlmIChyZXF1ZXN0U3RyaW5nLmZpbmQoa09mZmxpbmVMaWNlbnNlKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZW1wdHlSZXNwb25zZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtleVNldElkU3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKTsKKyAgICAgICAgICAgIGlmICghbUZpbGVIYW5kbGUuU3RvcmVMaWNlbnNlKGtleVNldElkU3RyaW5nLCBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVJlbGVhc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5UmVzcG9uc2UpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlByb2JsZW0gcmVsZWFzaW5nIG9mZmxpbmUgbGljZW5zZSIpOworICAgICAgICAgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVJlbGVhc2VLZXlzTWFwLmZpbmQoa2V5U2V0SWRTdHJpbmcpID09IG1SZWxlYXNlS2V5c01hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOworICAgICAgICAgICAgICAgIG1SZWxlYXNlS2V5c01hcFtrZXlTZXRJZFN0cmluZ10gPSBzZXNzaW9uLT5zZXNzaW9uSWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koImtleSBpcyBpbiB1c2UsIGlnbm9yZSByZWxlYXNlIHJlcXVlc3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJPZmZsaW5lIGxpY2Vuc2Ugbm90IGZvdW5kLCBub3RoaW5nIHRvIHJlbGVhc2UiKTsKKyAgICAgICAgfQorICAgICAgICBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpSRUxFQVNFOworICAgIH0KKyAgICBfYWlkbF9yZXR1cm4tPnJlcXVlc3QgPSByZXF1ZXN0OworICAgIF9haWRsX3JldHVybi0+cmVxdWVzdFR5cGUgPSBrZXlSZXF1ZXN0VHlwZTsKKyAgICBfYWlkbF9yZXR1cm4tPmRlZmF1bHRVcmwgPSBkZWZhdWx0VXJsOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpnZXRMb2dNZXNzYWdlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dNZXNzYWdlPiogX2FpZGxfcmV0dXJuKSB7CisgICAgdXNpbmcgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q7CisgICAgdXNpbmcgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kczsKKyAgICB1c2luZyBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOworCisgICAgYXV0byB0aW1lTWlsbGlzID0gZHVyYXRpb25fY2FzdDxtaWxsaXNlY29uZHM+KHN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOworCisgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dNZXNzYWdlPiBsb2dzID0geworICAgICAgICAgICAge3RpbWVNaWxsaXMsIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6TG9nUHJpb3JpdHk6OkVSUk9SLAorICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJOb3QgaW1wbGVtZW50ZWQiKX19OworICAgICpfYWlkbF9yZXR1cm4gPSBsb2dzOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Z2V0TWV0cmljcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpEcm1NZXRyaWNHcm91cD4qIF9haWRsX3JldHVybikgeworICAgIC8vIFNldCB0aGUgb3BlbiBzZXNzaW9uIGNvdW50IG1ldHJpYy4KKyAgICBEcm1NZXRyaWNOYW1lZFZhbHVlIG9wZW5TZXNzaW9uT2tBdHRyaWJ1dGUgPSB7InN0YXR1cyIsIHN0YXRpY19jYXN0PGludDY0X3Q+KFN0YXR1czo6T0spfTsKKyAgICBEcm1NZXRyaWNOYW1lZFZhbHVlIG9wZW5TZXNzaW9uTWV0cmljVmFsdWUgPSB7ImNvdW50IiwgbU9wZW5TZXNzaW9uT2tDb3VudH07CisgICAgRHJtTWV0cmljIG9wZW5TZXNzaW9uTWV0cmljID0geworICAgICAgICAgICAgIm9wZW5fc2Vzc2lvbiIsIHtvcGVuU2Vzc2lvbk9rQXR0cmlidXRlfSwge29wZW5TZXNzaW9uTWV0cmljVmFsdWV9fTsKKworICAgIC8vIFNldCB0aGUgY2xvc2Ugc2Vzc2lvbiBjb3VudCBtZXRyaWMuCisgICAgRHJtTWV0cmljTmFtZWRWYWx1ZSBjbG9zZVNlc3Npb25Pa0F0dHJpYnV0ZSA9IHsic3RhdHVzIiwgc3RhdGljX2Nhc3Q8aW50NjRfdD4oU3RhdHVzOjpPSyl9OworICAgIERybU1ldHJpY05hbWVkVmFsdWUgY2xvc2VTZXNzaW9uTWV0cmljVmFsdWUgPSB7ImNvdW50IiwgbUNsb3NlU2Vzc2lvbk9rQ291bnR9OworICAgIERybU1ldHJpYyBjbG9zZVNlc3Npb25NZXRyaWMgPSB7CisgICAgICAgICAgICAiY2xvc2Vfc2Vzc2lvbiIsIHtjbG9zZVNlc3Npb25Pa0F0dHJpYnV0ZX0sIHtjbG9zZVNlc3Npb25NZXRyaWNWYWx1ZX19OworCisgICAgLy8gU2V0IHRoZSBjbG9zZSBzZXNzaW9uLCBub3Qgb3BlbmVkIG1ldHJpYy4KKyAgICBEcm1NZXRyaWNOYW1lZFZhbHVlIGNsb3NlU2Vzc2lvbk5vdE9wZW5lZEF0dHJpYnV0ZSA9IHsic3RhdHVzIiwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCl9OworICAgIERybU1ldHJpY05hbWVkVmFsdWUgY2xvc2VTZXNzaW9uTm90T3BlbmVkTWV0cmljVmFsdWUgPSB7ImNvdW50IiwgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50fTsKKyAgICBEcm1NZXRyaWMgY2xvc2VTZXNzaW9uTm90T3BlbmVkTWV0cmljID0geworICAgICAgICAgICAgImNsb3NlX3Nlc3Npb24iLCB7Y2xvc2VTZXNzaW9uTm90T3BlbmVkQXR0cmlidXRlfSwge2Nsb3NlU2Vzc2lvbk5vdE9wZW5lZE1ldHJpY1ZhbHVlfX07CisKKyAgICAvLyBTZXQgdGhlIHNldFBsYXliYWNrSWQgbWV0cmljLgorICAgIHN0ZDo6dmVjdG9yPERybU1ldHJpY05hbWVkVmFsdWU+IHNpZHMgPSB7fTsKKyAgICBzdGQ6OnZlY3RvcjxEcm1NZXRyaWNOYW1lZFZhbHVlPiBwbGF5YmFja0lkcyA9IHt9OworICAgIGZvciAoY29uc3QgYXV0byYgW2tleSwgdmFsdWVdIDogbVBsYXliYWNrSWQpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2lkKGtleS5iZWdpbigpLCBrZXkuZW5kKCkpOworICAgICAgICBEcm1NZXRyaWNOYW1lZFZhbHVlIHNlc3Npb25JZEF0dHJpYnV0ZSA9IHsic2lkIiwgc2lkfTsKKyAgICAgICAgc2lkcy5wdXNoX2JhY2soc2Vzc2lvbklkQXR0cmlidXRlKTsKKworICAgICAgICBEcm1NZXRyaWNOYW1lZFZhbHVlIHBsYXliYWNrSWRNZXRyaWNWYWx1ZSA9IHsicGxheWJhY2tJZCIsIHZhbHVlfTsKKyAgICAgICAgcGxheWJhY2tJZHMucHVzaF9iYWNrKHBsYXliYWNrSWRNZXRyaWNWYWx1ZSk7CisgICAgfQorICAgIERybU1ldHJpYyBzZXRQbGF5YmFja0lkTWV0cmljID0geyJzZXRfcGxheWJhY2tfaWQiLCBzaWRzLCBwbGF5YmFja0lkc307CisKKyAgICBEcm1NZXRyaWNHcm91cCBtZXRyaWNzID0ge3tvcGVuU2Vzc2lvbk1ldHJpYywgY2xvc2VTZXNzaW9uTWV0cmljLCBjbG9zZVNlc3Npb25Ob3RPcGVuZWRNZXRyaWMsCisgICAgICAgICAgICBzZXRQbGF5YmFja0lkTWV0cmljfX07CisKKyAgICAqX2FpZGxfcmV0dXJuID0ge21ldHJpY3N9OworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Z2V0TnVtYmVyT2ZTZXNzaW9ucygKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpOdW1iZXJPZlNlc3Npb25zKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBfYWlkbF9yZXR1cm4tPmN1cnJlbnRTZXNzaW9ucyA9IG1TZXNzaW9uTGlicmFyeS0+bnVtT3BlblNlc3Npb25zKCk7CisgICAgX2FpZGxfcmV0dXJuLT5tYXhTZXNzaW9ucyA9IDEwOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoCisgICAgICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5U2V0SWQ+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGljZW5zZU5hbWVzID0gbUZpbGVIYW5kbGUuTGlzdExpY2Vuc2VzKCk7CisgICAgc3RkOjp2ZWN0b3I8S2V5U2V0SWQ+IGtleVNldElkcyA9IHt9OworICAgIGlmIChtTW9ja0Vycm9yICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IGtleVNldElkczsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyh0b01vY2tTdGF0dXMobU1vY2tFcnJvcikpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiBsaWNlbnNlTmFtZXMpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWQobmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpKTsKKyAgICAgICAgS2V5U2V0SWQgaWQgPSB7fTsKKyAgICAgICAgaWQua2V5U2V0SWQgPSBrZXlTZXRJZDsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayhpZCk7CisgICAgfQorICAgICpfYWlkbF9yZXR1cm4gPSBrZXlTZXRJZHM7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6Ok9LKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpnZXRPZmZsaW5lTGljZW5zZVN0YXRlKAorICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkJiBpbl9rZXlTZXRJZCwKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpPZmZsaW5lTGljZW5zZVN0YXRlKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlTmFtZShpbl9rZXlTZXRJZC5rZXlTZXRJZC5iZWdpbigpLCBpbl9rZXlTZXRJZC5rZXlTZXRJZC5lbmQoKSk7CisgICAgRGV2aWNlRmlsZXM6OkxpY2Vuc2VTdGF0ZSBzdGF0ZTsKKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlOworICAgIE9mZmxpbmVMaWNlbnNlU3RhdGUgbGljZW5zZVN0YXRlID0gT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VU5LTk9XTjsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBpZiAobU1vY2tFcnJvciAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBsaWNlbnNlU3RhdGU7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXModG9Nb2NrU3RhdHVzKG1Nb2NrRXJyb3IpKTsKKyAgICB9IGVsc2UgaWYgKG1GaWxlSGFuZGxlLlJldHJpZXZlTGljZW5zZShsaWNlbnNlTmFtZSwgJnN0YXRlLCAmbGljZW5zZSkpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZUFjdGl2ZToKKyAgICAgICAgICAgICAgICBsaWNlbnNlU3RhdGUgPSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVU0FCTEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nOgorICAgICAgICAgICAgICAgIGxpY2Vuc2VTdGF0ZSA9IE9mZmxpbmVMaWNlbnNlU3RhdGU6OklOQUNUSVZFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVVua25vd246CisgICAgICAgICAgICAgICAgbGljZW5zZVN0YXRlID0gT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VU5LTk9XTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKyAgICAqX2FpZGxfcmV0dXJuID0gbGljZW5zZVN0YXRlOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheShjb25zdCBzdGQ6OnN0cmluZyYgaW5fcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+Pjo6aXRlcmF0b3IgaXRyID0KKyAgICAgICAgICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzLmZpbmQoc3RkOjpzdHJpbmcoaW5fcHJvcGVydHlOYW1lLmNfc3RyKCkpKTsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBpZiAoaXRyICE9IG1CeXRlQXJyYXlQcm9wZXJ0aWVzLmVuZCgpKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBpdHItPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQXBwIHJlcXVlc3RlZCB1bmtub3duIHByb3BlcnR5OiAlcyIsIGluX3Byb3BlcnR5TmFtZS5jX3N0cigpKTsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSB7fTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OmdldFByb3BlcnR5U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9wcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lKGluX3Byb3BlcnR5TmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyB2YWx1ZTsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKworICAgIGlmIChuYW1lID09IGtWZW5kb3JLZXkpIHsKKyAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trVmVuZG9yS2V5XTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0ga1ZlcnNpb25LZXkpIHsKKyAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trVmVyc2lvbktleV07CisgICAgfSBlbHNlIGlmIChuYW1lID09IGtQbHVnaW5EZXNjcmlwdGlvbktleSkgeworICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tQbHVnaW5EZXNjcmlwdGlvbktleV07CisgICAgfSBlbHNlIGlmIChuYW1lID09IGtBbGdvcml0aG1zS2V5KSB7CisgICAgICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXNba0FsZ29yaXRobXNLZXldOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSBrTGlzdGVuZXJUZXN0U3VwcG9ydEtleSkgeworICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tMaXN0ZW5lclRlc3RTdXBwb3J0S2V5XTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0ga0RybUVycm9yVGVzdEtleSkgeworICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tEcm1FcnJvclRlc3RLZXldOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSBrQWlkbFZlcnNpb25LZXkpIHsKKyAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trQWlkbFZlcnNpb25LZXldOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJBcHAgcmVxdWVzdGVkIHVua25vd24gc3RyaW5nIHByb3BlcnR5ICVzIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgKl9haWRsX3JldHVybiA9IHZhbHVlOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpnZXRQcm92aXNpb25SZXF1ZXN0KAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5fY2VydGlmaWNhdGVUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgaW5fY2VydGlmaWNhdGVBdXRob3JpdHksCisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6UHJvdmlzaW9uUmVxdWVzdCogX2FpZGxfcmV0dXJuKSB7CisgICAgVU5VU0VEKGluX2NlcnRpZmljYXRlVHlwZSk7CisgICAgVU5VU0VEKGluX2NlcnRpZmljYXRlQXV0aG9yaXR5KTsKKyAgICBfYWlkbF9yZXR1cm4tPnJlcXVlc3QgPSB7fTsKKyAgICBfYWlkbF9yZXR1cm4tPmRlZmF1bHRVcmwgPSB7fTsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OmdldFNlY3VyZVN0b3AoCisgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcElkJiBpbl9zZWN1cmVTdG9wSWQsCisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcCogX2FpZGxfcmV0dXJuKSB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc3RvcCA9IHt9OworCisgICAgbVNlY3VyZVN0b3BMb2NrLmxvY2soKTsKKyAgICBhdXRvIGl0ciA9IG1TZWN1cmVTdG9wcy5maW5kKGluX3NlY3VyZVN0b3BJZC5zZWN1cmVTdG9wSWQpOworICAgIGlmIChpdHIgIT0gbVNlY3VyZVN0b3BzLmVuZCgpKSB7CisgICAgICAgIENsZWFya2V5U2VjdXJlU3RvcCBjbGVhcmtleVN0b3AgPSBpdHItPnNlY29uZDsKKyAgICAgICAgc3RvcC5pbnNlcnQoc3RvcC5lbmQoKSwgY2xlYXJrZXlTdG9wLmlkLmJlZ2luKCksIGNsZWFya2V5U3RvcC5pZC5lbmQoKSk7CisgICAgICAgIHN0b3AuaW5zZXJ0KHN0b3AuZW5kKCksIGNsZWFya2V5U3RvcC5kYXRhLmJlZ2luKCksIGNsZWFya2V5U3RvcC5kYXRhLmVuZCgpKTsKKyAgICB9CisgICAgbVNlY3VyZVN0b3BMb2NrLnVubG9jaygpOworCisgICAgU2VjdXJlU3RvcCBzZWN1cmVTdG9wID0ge307CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgaWYgKCFzdG9wLmVtcHR5KCkpIHsKKyAgICAgICAgc2VjdXJlU3RvcC5vcGFxdWVEYXRhID0gc3RvcDsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisgICAgKl9haWRsX3JldHVybiA9IHNlY3VyZVN0b3A7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OmdldFNlY3VyZVN0b3BJZHMoCisgICAgICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcElkPiogX2FpZGxfcmV0dXJuKSB7CisgICAgbVNlY3VyZVN0b3BMb2NrLmxvY2soKTsKKyAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3BJZD4gaWRzOworICAgIGZvciAoYXV0byBpdHIgPSBtU2VjdXJlU3RvcHMuYmVnaW4oKTsgaXRyICE9IG1TZWN1cmVTdG9wcy5lbmQoKTsgKytpdHIpIHsKKyAgICAgICAgU2VjdXJlU3RvcElkIGlkOworICAgICAgICBpZC5zZWN1cmVTdG9wSWQgPSBpdHItPmZpcnN0OworICAgICAgICBpZHMucHVzaF9iYWNrKGlkKTsKKyAgICB9CisgICAgbVNlY3VyZVN0b3BMb2NrLnVubG9jaygpOworCisgICAgKl9haWRsX3JldHVybiA9IGlkczsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OmdldFNlY3VyZVN0b3BzKAorICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3A+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBtU2VjdXJlU3RvcExvY2subG9jaygpOworICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcD4gc3RvcHM7CisgICAgZm9yIChhdXRvIGl0ciA9IG1TZWN1cmVTdG9wcy5iZWdpbigpOyBpdHIgIT0gbVNlY3VyZVN0b3BzLmVuZCgpOyArK2l0cikgeworICAgICAgICBDbGVhcmtleVNlY3VyZVN0b3AgY2xlYXJrZXlTdG9wID0gaXRyLT5zZWNvbmQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHN0b3B7fTsKKyAgICAgICAgc3RvcC5pbnNlcnQoc3RvcC5lbmQoKSwgY2xlYXJrZXlTdG9wLmlkLmJlZ2luKCksIGNsZWFya2V5U3RvcC5pZC5lbmQoKSk7CisgICAgICAgIHN0b3AuaW5zZXJ0KHN0b3AuZW5kKCksIGNsZWFya2V5U3RvcC5kYXRhLmJlZ2luKCksIGNsZWFya2V5U3RvcC5kYXRhLmVuZCgpKTsKKworICAgICAgICBTZWN1cmVTdG9wIHNlY3VyZVN0b3A7CisgICAgICAgIHNlY3VyZVN0b3Aub3BhcXVlRGF0YSA9IHN0b3A7CisgICAgICAgIHN0b3BzLnB1c2hfYmFjayhzZWN1cmVTdG9wKTsKKyAgICB9CisgICAgbVNlY3VyZVN0b3BMb2NrLnVubG9jaygpOworCisgICAgKl9haWRsX3JldHVybiA9IHN0b3BzOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6Z2V0U2VjdXJpdHlMZXZlbCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cml0eUxldmVsKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoaW5fc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyaXR5TGV2ZWw6OlVOS05PV047CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNpZCA9IGluX3Nlc3Npb25JZDsKKyAgICA6OmFuZHJvaWQ6OnNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNpZCk7CisgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBTZWN1cml0eUxldmVsOjpVTktOT1dOOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCk7CisgICAgfQorCisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJpdHlMZXZlbD46Oml0ZXJhdG9yIGl0ciA9CisgICAgICAgICAgICBtU2VjdXJpdHlMZXZlbC5maW5kKHNpZCk7CisgICAgaWYgKGl0ciA9PSBtU2VjdXJpdHlMZXZlbC5lbmQoKSkgeworICAgICAgICBBTE9HRSgiU2Vzc2lvbiBpZCBub3QgZm91bmQiKTsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IFNlY3VyaXR5TGV2ZWw6OlVOS05PV047CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURSk7CisgICAgfQorCisgICAgKl9haWRsX3JldHVybiA9IFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE87CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6Ok9LKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpvcGVuU2Vzc2lvbigKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cml0eUxldmVsIGluX3NlY3VyaXR5TGV2ZWwsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICA6OmFuZHJvaWQ6OnNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmNyZWF0ZVNlc3Npb24oKTsKKyAgICBwcm9jZXNzTW9ja0Vycm9yKHNlc3Npb24pOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOworCisgICAgU3RhdHVzIHN0YXR1cyA9IHNldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBpbl9zZWN1cml0eUxldmVsKTsKKyAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgbU9wZW5TZXNzaW9uT2tDb3VudCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZXNzaW9uTGlicmFyeS0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgIHNlc3Npb25JZC5jbGVhcigpOworICAgIH0KKyAgICAqX2FpZGxfcmV0dXJuID0gc2Vzc2lvbklkOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpwcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zY29wZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Jlc3BvbnNlLAorICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoaW5fc2NvcGUuc2l6ZSgpID09IDAgfHwgaW5fcmVzcG9uc2Uuc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gUmV0dXJucyBlbXB0eSBrZXlTZXRJZAorICAgICAgICAqX2FpZGxfcmV0dXJuID0ge307CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHJlc3BvbnNlU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGluX3Jlc3BvbnNlLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fcmVzcG9uc2Uuc2l6ZSgpKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY29wZUlkID0gaW5fc2NvcGU7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkID0ge307CisgICAgc3RkOjpzdHJpbmcga2V5U2V0SWQ7CisKKyAgICBib29sIGlzT2ZmbGluZUxpY2Vuc2UgPSByZXNwb25zZVN0cmluZy5maW5kKGtPZmZsaW5lTGljZW5zZSkgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgaWYgKHNjb3BlSWQuc2l6ZSgpIDwga0tleVNldElkUHJlZml4LnNpemUoKSkgeworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjE0NDUwNzA5NiIpOworICAgICAgICAqX2FpZGxfcmV0dXJuID0ge307CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSk7CisgICAgfQorICAgIGJvb2wgaXNSZWxlYXNlID0gKG1lbWNtcChzY29wZUlkLmRhdGEoKSwga0tleVNldElkUHJlZml4LmRhdGEoKSwga0tleVNldElkUHJlZml4LnNpemUoKSkgPT0gMCk7CisgICAgaWYgKGlzUmVsZWFzZSkgeworICAgICAgICBrZXlTZXRJZC5hc3NpZ24oc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKworICAgICAgICBhdXRvIGl0ZXIgPSBtUmVsZWFzZUtleXNNYXAuZmluZChzdGQ6OnN0cmluZyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSkpOworICAgICAgICBpZiAoaXRlciAhPSBtUmVsZWFzZUtleXNNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIHNlc3Npb25JZC5hc3NpZ24oaXRlci0+c2Vjb25kLmJlZ2luKCksIGl0ZXItPnNlY29uZC5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzZXNzaW9uSWQuYXNzaWduKHNjb3BlSWQuYmVnaW4oKSwgc2NvcGVJZC5lbmQoKSk7CisgICAgICAgIC8vIG5vbiBvZmZsaW5lIGxpY2Vuc2UgcmV0dXJucyBlbXB0eSBrZXlTZXRJZAorICAgICAgICBrZXlTZXRJZC5jbGVhcigpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IHt9OworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCk7CisgICAgfQorICAgIHNldFBsYXlQb2xpY3koKTsKKworICAgIGF1dG8gcmVzID0gc2Vzc2lvbi0+cHJvdmlkZUtleVJlc3BvbnNlKGluX3Jlc3BvbnNlKTsKKyAgICBpZiAocmVzID09IGNsZWFya2V5ZHJtOjpPSykgeworICAgICAgICBpZiAoaXNPZmZsaW5lTGljZW5zZSkgeworICAgICAgICAgICAgaWYgKGlzUmVsZWFzZSkgeworICAgICAgICAgICAgICAgIG1GaWxlSGFuZGxlLkRlbGV0ZUxpY2Vuc2Uoa2V5U2V0SWQpOworICAgICAgICAgICAgICAgIG1TZXNzaW9uTGlicmFyeS0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbWFrZUtleVNldElkKCZrZXlTZXRJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKl9haWRsX3JldHVybiA9IHt9OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1VOS05PV04pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2wgb2sgPSBtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZCwgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhpbl9yZXNwb25zZS5iZWdpbigpLCBpbl9yZXNwb25zZS5lbmQoKSkpOworICAgICAgICAgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdG9yZSBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IGNhbGxpbmcgQU1lZGlhRHJtIGxpc3RlbmVycy4KKyAgICAgICAgc2VuZEV2ZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQsIHNlc3Npb25JZCwgc2Vzc2lvbklkKTsKKworICAgICAgICBzZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIDEwMCk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzPiBrZXlzU3RhdHVzID0ge307CisgICAgICAgIEtleVN0YXR1cyBrZXlTdGF0dXM7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWQxID0gezB4QSwgMHhCLCAweEN9OworICAgICAgICBrZXlTdGF0dXMua2V5SWQgPSBrZXlJZDE7CisgICAgICAgIGtleVN0YXR1cy50eXBlID0gS2V5U3RhdHVzVHlwZTo6VVNBQkxFOworICAgICAgICBrZXlzU3RhdHVzLnB1c2hfYmFjayhrZXlTdGF0dXMpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtleUlkMiA9IHsweEQsIDB4RSwgMHhGfTsKKyAgICAgICAga2V5U3RhdHVzLmtleUlkID0ga2V5SWQyOworICAgICAgICBrZXlTdGF0dXMudHlwZSA9IEtleVN0YXR1c1R5cGU6OkVYUElSRUQ7CisgICAgICAgIGtleXNTdGF0dXMucHVzaF9iYWNrKGtleVN0YXR1cyk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWQzID0gezB4MCwgMHgxLCAweDJ9OworICAgICAgICBrZXlTdGF0dXMua2V5SWQgPSBrZXlJZDM7CisgICAgICAgIGtleVN0YXR1cy50eXBlID0gS2V5U3RhdHVzVHlwZTo6VVNBQkxFX0lOX0ZVVFVSRTsKKyAgICAgICAga2V5c1N0YXR1cy5wdXNoX2JhY2soa2V5U3RhdHVzKTsKKworICAgICAgICBzZW5kS2V5c0NoYW5nZShzZXNzaW9uSWQsIGtleXNTdGF0dXMsIHRydWUpOworCisgICAgICAgIGluc3RhbGxTZWN1cmVTdG9wKHNlc3Npb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInByb3ZpZGVLZXlSZXNwb25zZSByZXR1cm5zIGVycm9yPSVkIiwgcmVzKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZFZlYyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7CisgICAgX2FpZGxfcmV0dXJuLT5rZXlTZXRJZCA9IGtleVNldElkVmVjOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMocmVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9yZXNwb25zZSwKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpQcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VSZXN1bHQqIF9haWRsX3JldHVybikgeworICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIF9haWRsX3JldHVybi0+Y2VydGlmaWNhdGUgPSB7fTsKKyAgICBfYWlkbF9yZXR1cm4tPndyYXBwZWRLZXkgPSB7fTsKKyAgICBpZiAoaW5fcmVzcG9uc2Uuc2l6ZSgpID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpxdWVyeUtleVN0YXR1cygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlWYWx1ZT4qIF9haWRsX3JldHVybikgeworICAgIGlmIChpbl9zZXNzaW9uSWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gUmV0dXJucyBlbXB0eSBrZXkgc3RhdHVzIEtleVZhbHVlIHBhaXIKKyAgICAgICAgKl9haWRsX3JldHVybiA9IHt9OworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gaW5mb01hcCA9IHt9OworICAgIG1QbGF5UG9saWN5TG9jay5sb2NrKCk7CisgICAgS2V5VmFsdWUga2V5VmFsdWVQYWlyOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXlQb2xpY3kuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAga2V5VmFsdWVQYWlyLmtleSA9IG1QbGF5UG9saWN5W2ldLmtleTsKKyAgICAgICAga2V5VmFsdWVQYWlyLnZhbHVlID0gbVBsYXlQb2xpY3lbaV0udmFsdWU7CisgICAgICAgIGluZm9NYXAucHVzaF9iYWNrKGtleVZhbHVlUGFpcik7CisgICAgfQorICAgIG1QbGF5UG9saWN5TG9jay51bmxvY2soKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gaW5mb01hcDsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnJlbGVhc2VBbGxTZWN1cmVTdG9wcygpIHsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBjb25zdCBhdXRvIHJlcyA9IHJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7CisgICAgaWYgKCFyZXMuaXNPaygpICYmIHJlcy5nZXRFeGNlcHRpb25Db2RlKCkgPT0gRVhfU0VSVklDRV9TUEVDSUZJQykgeworICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHJlcy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpKTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnJlbGVhc2VTZWN1cmVTdG9wKAorICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3BJZCYgaW5fc2VjdXJlU3RvcElkKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgY29uc3QgYXV0byByZXMgPSByZW1vdmVTZWN1cmVTdG9wKGluX3NlY3VyZVN0b3BJZCk7CisgICAgaWYgKCFyZXMuaXNPaygpICYmIHJlcy5nZXRFeGNlcHRpb25Db2RlKCkgPT0gRVhfU0VSVklDRV9TUEVDSUZJQykgeworICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHJlcy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpKTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnJlbGVhc2VTZWN1cmVTdG9wcygKKyAgICAgICAgY29uc3QgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpPcGFxdWVEYXRhJiBpbl9zc1JlbGVhc2UpIHsKKyAgICAvLyBPcGFxdWVEYXRhIHN0YXJ0cyB3aXRoIDQgYnl0ZSBkZWNpbWFsIGludGVnZXIgc3RyaW5nCisgICAgY29uc3Qgc2l6ZV90IGtGb3VyQnl0ZXNPZmZzZXQgPSA0OworICAgIGlmIChpbl9zc1JlbGVhc2Uub3BhcXVlRGF0YS5zaXplKCkgPCBrRm91ckJ5dGVzT2Zmc2V0KSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHNlY3VyZVN0b3BSZWxlYXNlIGxlbmd0aCIpOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpbnB1dCA9IGluX3NzUmVsZWFzZS5vcGFxdWVEYXRhOworCisgICAgaWYgKGlucHV0LnNpemUoKSA8IGtTZWN1cmVTdG9wSWRTaXplICsga0ZvdXJCeXRlc09mZnNldCkgeworICAgICAgICAvLyBUaGUgbWluaW11bSBzaXplIG9mIHNlY3VyZSBzdG9wIGhhcyB0byBjb250YWluCisgICAgICAgIC8vIGEgNCBieXRlcyBjb3VudCBhbmQgb25lIHNlY3VyZVN0b3AgaWQKKyAgICAgICAgQUxPR0UoIlRvdGFsIHNpemUgb2Ygc2VjdXJlU3RvcHMgaXMgdG9vIHNob3J0Iik7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIC8vIFRoZSBmb3JtYXQgb2Ygb3BhcXVlRGF0YSBpcyBzaGFyZWQgYmV0d2VlbiB0aGUgc2VydmVyCisgICAgLy8gYW5kIHRoZSBkcm0gc2VydmljZS4gVGhlIGNsZWFya2V5IGltcGxlbWVudGF0aW9uIGNvbnNpc3RzIG9mOgorICAgIC8vICAgIGNvdW50IC0gbnVtYmVyIG9mIHNlY3VyZSBzdG9wcworICAgIC8vICAgIGxpc3Qgb2YgZml4ZWQgbGVuZ3RoIHNlY3VyZSBzdG9wcworICAgIHNpemVfdCBjb3VudEJ1ZmZlclNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgIGlmIChpbnB1dC5zaXplKCkgPCBjb3VudEJ1ZmZlclNpemUpIHsKKyAgICAgICAgLy8gU2FmZXR5TmV0IGxvZ2dpbmcKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxNDQ3NjY0NTUiKTsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkJBRF9WQUxVRSk7CisgICAgfQorICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBzc2NhbmYocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oaW5wdXQuZGF0YSgpKSwgIiUwNCIgUFJJdTMyLCAmY291bnQpOworCisgICAgLy8gQXZvaWQgZGl2aWRlIGJ5IDAgYmVsb3cuCisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgMCBzZWN1cmVTdG9wIGNvdW50Iik7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKworICAgIC8vIENvbXB1dGVzIHRoZSBmaXhlZCBsZW5ndGggc2VjdXJlU3RvcCBzaXplCisgICAgc2l6ZV90IHNlY3VyZVN0b3BTaXplID0gKGlucHV0LnNpemUoKSAtIGtGb3VyQnl0ZXNPZmZzZXQpIC8gY291bnQ7CisgICAgaWYgKHNlY3VyZVN0b3BTaXplIDwga1NlY3VyZVN0b3BJZFNpemUpIHsKKyAgICAgICAgLy8gQSB2YWxpZCBzZWN1cmVTdG9wIGNvbnRhaW5zIHRoZSBpZCBwbHVzIGRhdGEKKyAgICAgICAgQUxPR0UoIkludmFsaWQgc2VjdXJlU3RvcCBzaXplIik7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpCQURfVkFMVUUpOworICAgIH0KKyAgICB1aW50OF90KiBidWZmZXIgPSBuZXcgdWludDhfdFtzZWN1cmVTdG9wU2l6ZV07CisgICAgc2l6ZV90IG9mZnNldCA9IGtGb3VyQnl0ZXNPZmZzZXQ7ICAvLyBza2lwIHRoZSBjb3VudAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSwgb2Zmc2V0ICs9IHNlY3VyZVN0b3BTaXplKSB7CisgICAgICAgIG1lbWNweShidWZmZXIsIGlucHV0LmRhdGEoKSArIG9mZnNldCwgc2VjdXJlU3RvcFNpemUpOworCisgICAgICAgIC8vIEEgc2VjdXJlU3RvcCBjb250YWlucyBpZCtkYXRhLCB3ZSBvbmx5IHVzZSB0aGUgaWQgZm9yIHJlbW92YWwKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaWQoYnVmZmVyLCBidWZmZXIgKyBrU2VjdXJlU3RvcElkU2l6ZSk7CisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcElkIHNlY3VyZVN0b3BJZHtpZH07CisgICAgICAgIGNvbnN0IGF1dG8gcmVzID0gcmVtb3ZlU2VjdXJlU3RvcChzZWN1cmVTdG9wSWQpOworICAgICAgICBpZiAoIXJlcy5pc09rKCkgJiYgcmVzLmdldEV4Y2VwdGlvbkNvZGUoKSA9PSBFWF9TRVJWSUNFX1NQRUNJRklDKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHJlcy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoU3RhdHVzOjpPSyAhPSBzdGF0dXMpIGJyZWFrOworICAgIH0KKworICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKHN0YXR1cyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlY3VyZVN0b3BMb2NrKTsKKworICAgIG1TZWN1cmVTdG9wcy5jbGVhcigpOworICAgIG1OZXh0U2VjdXJlU3RvcElkID0ga1NlY3VyZVN0b3BJZFN0YXJ0OworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6cmVtb3ZlS2V5cyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgaWYgKGluX3Nlc3Npb25JZC5zaXplKCkgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnJlbW92ZU9mZmxpbmVMaWNlbnNlKAorICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkJiBpbl9rZXlTZXRJZCkgeworICAgIGlmIChtTW9ja0Vycm9yICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyh0b01vY2tTdGF0dXMobU1vY2tFcnJvcikpOworICAgIH0KKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgc3RkOjpzdHJpbmcgbGljZW5zZU5hbWUoaW5fa2V5U2V0SWQua2V5U2V0SWQuYmVnaW4oKSwgaW5fa2V5U2V0SWQua2V5U2V0SWQuZW5kKCkpOworICAgIGlmIChtRmlsZUhhbmRsZS5EZWxldGVMaWNlbnNlKGxpY2Vuc2VOYW1lKSkgeworICAgICAgICBzdGF0dXMgPSBTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKHN0YXR1cyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6cmVtb3ZlU2VjdXJlU3RvcCgKKyAgICAgICAgY29uc3QgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cmVTdG9wSWQmIGluX3NlY3VyZVN0b3BJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZWN1cmVTdG9wTG9jayk7CisKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBpZiAoMSAhPSBtU2VjdXJlU3RvcHMuZXJhc2UoaW5fc2VjdXJlU3RvcElkLnNlY3VyZVN0b3BJZCkpIHsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoc3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpyZXF1aXJlc1NlY3VyZURlY29kZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9taW1lLCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyaXR5TGV2ZWwgaW5fbGV2ZWwsCisgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgeworICAgIFVOVVNFRChpbl9taW1lKTsKKyAgICBVTlVTRUQoaW5fbGV2ZWwpOworICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6cmVzdG9yZUtleXMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5U2V0SWQmIGluX2tleVNldElkKSB7CisgICAgaWYgKGluX3Nlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBpbl9rZXlTZXRJZC5rZXlTZXRJZC5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICBEZXZpY2VGaWxlczo6TGljZW5zZVN0YXRlIGxpY2Vuc2VTdGF0ZTsKKyAgICBzdGQ6OnN0cmluZyBvZmZsaW5lTGljZW5zZTsKKyAgICBpZiAoIW1GaWxlSGFuZGxlLlJldHJpZXZlTGljZW5zZSgKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhpbl9rZXlTZXRJZC5rZXlTZXRJZC5iZWdpbigpLCBpbl9rZXlTZXRJZC5rZXlTZXRJZC5lbmQoKSksCisgICAgICAgICAgICAgICAgJmxpY2Vuc2VTdGF0ZSwgJm9mZmxpbmVMaWNlbnNlKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlc3RvcmUgb2ZmbGluZSBsaWNlbnNlIik7CisgICAgICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fTk9fTElDRU5TRSk7CisgICAgfQorCisgICAgaWYgKERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlVW5rbm93biA9PSBsaWNlbnNlU3RhdGUgfHwKKyAgICAgICAgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVSZWxlYXNpbmcgPT0gbGljZW5zZVN0YXRlKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGxpY2Vuc2Ugc3RhdGU9JWQiLCBsaWNlbnNlU3RhdGUpOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX05PX0xJQ0VOU0UpOworICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oaW5fc2Vzc2lvbklkKTsKKyAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQpOworICAgIH0KKyAgICBhdXRvIHJlcyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KG9mZmxpbmVMaWNlbnNlLmJlZ2luKCksIG9mZmxpbmVMaWNlbnNlLmVuZCgpKSk7CisgICAgaWYgKHJlcyAhPSBjbGVhcmtleWRybTo6T0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXN0b3JlIGtleXMiKTsKKyAgICB9CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhyZXMpOworfQorCit2b2lkIERybVBsdWdpbjo6c2VuZEV2ZW50KDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6RXZlbnRUeXBlIGluX2V2ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fZGF0YSkgeworICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtTGlzdGVuZXItPm9uRXZlbnQoaW5fZXZlbnRUeXBlLCBpbl9zZXNzaW9uSWQsIGluX2RhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgRHJtUGx1Z2luOjpzZW5kRXhwaXJhdGlvblVwZGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGluX2V4cGlyeVRpbWVJbk1TKSB7CisgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxscHRyKSB7CisgICAgICAgIG1MaXN0ZW5lci0+b25FeHBpcmF0aW9uVXBkYXRlKGluX3Nlc3Npb25JZCwgaW5fZXhwaXJ5VGltZUluTVMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgRHJtUGx1Z2luOjpzZW5kS2V5c0NoYW5nZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTdGF0dXM+JiBpbl9rZXlTdGF0dXNMaXN0LAorICAgICAgICBib29sIGluX2hhc05ld1VzYWJsZUtleSkgeworICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtTGlzdGVuZXItPm9uS2V5c0NoYW5nZShpbl9zZXNzaW9uSWQsIGluX2tleVN0YXR1c0xpc3QsIGluX2hhc05ld1VzYWJsZUtleSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIk51bGwgZXZlbnQgbGlzdGVuZXIsIGV2ZW50IG5vdCBzZW50Iik7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBEcm1QbHVnaW46OnNlbmRTZXNzaW9uTG9zdFN0YXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQpIHsKKyAgICBpZiAobUxpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUxpc3RlbmVyLT5vblNlc3Npb25Mb3N0U3RhdGUoaW5fc2Vzc2lvbklkKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnNldENpcGhlckFsZ29yaXRobShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9zZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKmluX2FsZ29yaXRobSovKSB7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpzZXRMaXN0ZW5lcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SURybVBsdWdpbkxpc3RlbmVyPiYgaW5fbGlzdGVuZXIpIHsKKyAgICBtTGlzdGVuZXIgPSBpbl9saXN0ZW5lcjsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6T0spOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBEcm1QbHVnaW46OnNldE1hY0FsZ29yaXRobShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9zZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKmluX2FsZ29yaXRobSovKSB7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpzZXRQbGF5YmFja0lkKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluX3BsYXliYWNrSWQpIHsKKyAgICBpZiAoaW5fc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVtcHR5IHNlc3Npb24gaWQiKTsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkJBRF9WQUxVRSk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2lkID0gaW5fc2Vzc2lvbklkOworICAgIG1QbGF5YmFja0lkW3NpZF0gPSBpbl9wbGF5YmFja0lkOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6c2V0UHJvcGVydHlCeXRlQXJyYXkoY29uc3Qgc3RkOjpzdHJpbmcmIGluX3Byb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3ZhbHVlKSB7CisgICAgaWYgKGluX3Byb3BlcnR5TmFtZSA9PSBrRGV2aWNlSWRLZXkpIHsKKyAgICAgICAgQUxPR0QoIkNhbm5vdCBzZXQgaW1tdXRhYmxlIHByb3BlcnR5OiAlcyIsIGluX3Byb3BlcnR5TmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkJBRF9WQUxVRSk7CisgICAgfSBlbHNlIGlmIChpbl9wcm9wZXJ0eU5hbWUgPT0ga0NsaWVudElkS2V5KSB7CisgICAgICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzW2tDbGllbnRJZEtleV0gPSBpbl92YWx1ZTsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6Ok9LKTsKKyAgICB9CisKKyAgICAvLyBTZXR0aW5nIG9mIHVuZGVmaW5lZCBwcm9wZXJ0aWVzIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSBieXRlIGFycmF5LCBrZXk9JXMiLCBpbl9wcm9wZXJ0eU5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjpzZXRQcm9wZXJ0eVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgaW5fcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5fdmFsdWUpIHsKKyAgICBzdGQ6OnN0cmluZyBpbW11dGFibGVLZXlzOworICAgIGltbXV0YWJsZUtleXMuYXBwZW5kKGtBbGdvcml0aG1zS2V5ICsgIiwiKTsKKyAgICBpbW11dGFibGVLZXlzLmFwcGVuZChrUGx1Z2luRGVzY3JpcHRpb25LZXkgKyAiLCIpOworICAgIGltbXV0YWJsZUtleXMuYXBwZW5kKGtWZW5kb3JLZXkgKyAiLCIpOworICAgIGltbXV0YWJsZUtleXMuYXBwZW5kKGtWZXJzaW9uS2V5ICsgIiwiKTsKKworICAgIHN0ZDo6c3RyaW5nIGtleSA9IHN0ZDo6c3RyaW5nKGluX3Byb3BlcnR5TmFtZS5jX3N0cigpKTsKKyAgICBpZiAoaW1tdXRhYmxlS2V5cy5maW5kKGtleSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0QoIkNhbm5vdCBzZXQgaW1tdXRhYmxlIHByb3BlcnR5OiAlcyIsIGtleS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkJBRF9WQUxVRSk7CisgICAgfQorCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXRyID0gbVN0cmluZ1Byb3BlcnRpZXMuZmluZChrZXkpOworICAgIGlmIChpdHIgPT0gbVN0cmluZ1Byb3BlcnRpZXMuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgdW5kZWZpbmVkIHByb3BlcnR5IHN0cmluZywga2V5PSVzIiwga2V5LmNfc3RyKCkpOworICAgICAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKFN0YXR1czo6QkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICBpZiAoaW5fcHJvcGVydHlOYW1lID09IGtEcm1FcnJvclRlc3RLZXkpIHsKKyAgICAgICAgaWYgKGluX3ZhbHVlID09IGtSZXNvdXJjZUNvbnRlbnRpb25WYWx1ZSkgeworICAgICAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1czo6RVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT047CisgICAgICAgIH0gZWxzZSBpZiAoaW5fdmFsdWUgPT0ga0xvc3RTdGF0ZVZhbHVlKSB7CisgICAgICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOworICAgICAgICB9IGVsc2UgaWYgKGluX3ZhbHVlID09IGtGcmFtZVRvb0xhcmdlVmFsdWUpIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXM6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U7CisgICAgICAgIH0gZWxzZSBpZiAoaW5fdmFsdWUgPT0ga0ludmFsaWRTdGF0ZVZhbHVlKSB7CisgICAgICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOOworICAgICAgICB9CisgICAgfQorCisgICAgbVN0cmluZ1Byb3BlcnRpZXNba2V5XSA9IHN0ZDo6c3RyaW5nKGluX3ZhbHVlLmNfc3RyKCkpOworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpPSyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6c2lnbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9zZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9rZXlJZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiAvKmluX21lc3NhZ2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSB7CisgICAgKl9haWRsX3JldHVybiA9IHt9OworICAgIHJldHVybiB0b05ka1Njb3BlZEFTdGF0dXMoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIERybVBsdWdpbjo6c2lnblJTQShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9zZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgLyppbl9hbGdvcml0aG0qLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9tZXNzYWdlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIC8qaW5fd3JhcHBlZGtleSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0ge307CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgRHJtUGx1Z2luOjp2ZXJpZnkoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIC8qaW5fc2Vzc2lvbklkKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgLyppbl9rZXlJZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIC8qaW5fbWVzc2FnZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIC8qaW5fc2lnbmF0dXJlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7CisgICAgcmV0dXJuIHRvTmRrU2NvcGVkQVN0YXR1cyhTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFKTsKK30KKworLy8gUHJpdmF0ZSBtZXRob2RzIGJlbG93Lgordm9pZCBEcm1QbHVnaW46OnNldFBsYXlQb2xpY3koKSB7CisgICAgOjphbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgbG9jayhtUGxheVBvbGljeUxvY2spOworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CisKKyAgICBLZXlWYWx1ZSBwb2xpY3k7CisgICAgcG9saWN5LmtleSA9IGtRdWVyeUtleUxpY2Vuc2VUeXBlOworICAgIHBvbGljeS52YWx1ZSA9IGtTdHJlYW1pbmc7CisgICAgbVBsYXlQb2xpY3kucHVzaF9iYWNrKHBvbGljeSk7CisKKyAgICBwb2xpY3kua2V5ID0ga1F1ZXJ5S2V5UGxheUFsbG93ZWQ7CisgICAgcG9saWN5LnZhbHVlID0ga1RydWU7CisgICAgbVBsYXlQb2xpY3kucHVzaF9iYWNrKHBvbGljeSk7CisKKyAgICBwb2xpY3kua2V5ID0ga1F1ZXJ5S2V5UmVuZXdBbGxvd2VkOworICAgIG1QbGF5UG9saWN5LnB1c2hfYmFjayhwb2xpY3kpOworfQorCitib29sIERybVBsdWdpbjo6bWFrZUtleVNldElkKHN0ZDo6c3RyaW5nKiBrZXlTZXRJZCkgeworICAgIGlmICgha2V5U2V0SWQpIHsKKyAgICAgICAgQUxPR0UoImtleVNldElkIGRlc3RpbmF0aW9uIG5vdCBwcm92aWRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtzaWQoa0tleVNldElkUHJlZml4LmJlZ2luKCksIGtLZXlTZXRJZFByZWZpeC5lbmQoKSk7CisgICAga3NpZC5yZXNpemUoa0tleVNldElkTGVuZ3RoKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByYW5kb21EYXRhKChrS2V5U2V0SWRMZW5ndGggLSBrS2V5U2V0SWRQcmVmaXguc2l6ZSgpKSAvIDIsIDApOworCisgICAgd2hpbGUgKGtleVNldElkLT5lbXB0eSgpKSB7CisgICAgICAgIGZvciAoYXV0byBpdHIgPSByYW5kb21EYXRhLmJlZ2luKCk7IGl0ciAhPSByYW5kb21EYXRhLmVuZCgpOyArK2l0cikgeworICAgICAgICAgICAgKml0ciA9IHN0ZDo6cmFuZCgpICUgMHhmZjsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGlkID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmFuZG9tRGF0YS5kYXRhKCkpOworICAgICAgICAqa2V5U2V0SWQgPSBrS2V5U2V0SWRQcmVmaXggKyA6OmFuZHJvaWQ6OkJ5dGVBcnJheVRvSGV4U3RyaW5nKGlkLCByYW5kb21EYXRhLnNpemUoKSk7CisgICAgICAgIGlmIChtRmlsZUhhbmRsZS5MaWNlbnNlRXhpc3RzKCprZXlTZXRJZCkpIHsKKyAgICAgICAgICAgIC8vIGNvbGxpc2lvbiwgcmVnZW5lcmF0ZQorICAgICAgICAgICAgQUxPR1YoIlJldHJ5IGdlbmVyYXRpbmcgS2V5U2V0SWQiKTsKKyAgICAgICAgICAgIGtleVNldElkLT5jbGVhcigpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitTdGF0dXMgRHJtUGx1Z2luOjpzZXRTZWN1cml0eUxldmVsKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIFNlY3VyaXR5TGV2ZWwgbGV2ZWwpIHsKKyAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVtcHR5IHNlc3Npb24gaWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChsZXZlbCAhPSBTZWN1cml0eUxldmVsOjpERUZBVUxUICYmIGxldmVsICE9IFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE8pIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgc2VjdXJpdHkgbGV2ZWwgPiBtYXgiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2lkID0gc2Vzc2lvbklkOworICAgIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2lkKTsKKyAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CisKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90PiwgU2VjdXJpdHlMZXZlbD46Oml0ZXJhdG9yIGl0ciA9IG1TZWN1cml0eUxldmVsLmZpbmQoc2lkKTsKKyAgICBpZiAoaXRyICE9IG1TZWN1cml0eUxldmVsLmVuZCgpKSB7CisgICAgICAgIG1TZWN1cml0eUxldmVsW3NpZF0gPSBsZXZlbDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIW1TZWN1cml0eUxldmVsLmluc2VydChzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8dWludDhfdD4sIFNlY3VyaXR5TGV2ZWw+KHNpZCwgbGV2ZWwpKQorICAgICAgICAgICAgICAgICAgICAgLnNlY29uZCkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgc2VjdXJpdHkgbGV2ZWwiKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gIC8vIG5hbWVzcGFjZSBkcm0KK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL1NlcnZpY2UuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9TZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjA3ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9TZXJ2aWNlLmNwcApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfTkRFQlVHIDEKKyNkZWZpbmUgTE9HX1RBRyAiY2xlYXJrZXktbWFpbiIKKworI2luY2x1ZGUgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6SW5pdExvZ2dpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OkxvZ2RMb2dnZXI7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6Y2xlYXJrZXk6OmNyZWF0ZURybUZhY3Rvcnk7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OmNsZWFya2V5OjpEcm1GYWN0b3J5OworCitpbnQgbWFpbihpbnQgLyphcmdjKi8sIGNoYXIqIGFyZ3ZbXSkgeworICAgIEluaXRMb2dnaW5nKGFyZ3YsIExvZ2RMb2dnZXIoKSk7CisgICAgOjphbmRyb2lkOjpiYXNlOjpTZXRNaW5pbXVtTG9nU2V2ZXJpdHkoOjphbmRyb2lkOjpiYXNlOjpWRVJCT1NFKTsKKyAgICBBQmluZGVyUHJvY2Vzc19zZXRUaHJlYWRQb29sTWF4VGhyZWFkQ291bnQoOCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8RHJtRmFjdG9yeT4gZHJtRmFjdG9yeSA9IGNyZWF0ZURybUZhY3RvcnkoKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBkcm1JbnN0YW5jZSA9IHN0ZDo6c3RyaW5nKCkgKyBEcm1GYWN0b3J5OjpkZXNjcmlwdG9yICsgIi9jbGVhcmtleSI7CisgICAgYmluZGVyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBBU2VydmljZU1hbmFnZXJfYWRkU2VydmljZShkcm1GYWN0b3J5LT5hc0JpbmRlcigpLmdldCgpLCBkcm1JbnN0YW5jZS5jX3N0cigpKTsKKyAgICBDSEVDSyhzdGF0dXMgPT0gU1RBVFVTX09LKTsKKworICAgIEFCaW5kZXJQcm9jZXNzX2pvaW5UaHJlYWRQb29sKCk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsgIC8vIHNob3VsZCBub3QgcmVhY2hlZAorfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9TZXJ2aWNlTGF6eS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL1NlcnZpY2VMYXp5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2EzM2JiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9TZXJ2aWNlTGF6eS5jcHAKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX05ERUJVRyAxCisjZGVmaW5lIExPR19UQUcgImNsZWFya2V5LW1haW4iCisKKyNpbmNsdWRlICJDcmVhdGVQbHVnaW5GYWN0b3JpZXMuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcHJvY2Vzcy5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OkluaXRMb2dnaW5nOwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpMb2dkTG9nZ2VyOworCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OmNsZWFya2V5OjpjcmVhdGVEcm1GYWN0b3J5OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpjbGVhcmtleTo6RHJtRmFjdG9yeTsKKworaW50IG1haW4oaW50IC8qYXJnYyovLCBjaGFyKiBhcmd2W10pIHsKKyAgICBJbml0TG9nZ2luZyhhcmd2LCBMb2dkTG9nZ2VyKCkpOworICAgIDo6YW5kcm9pZDo6YmFzZTo6U2V0TWluaW11bUxvZ1NldmVyaXR5KDo6YW5kcm9pZDo6YmFzZTo6VkVSQk9TRSk7CisgICAgQUJpbmRlclByb2Nlc3Nfc2V0VGhyZWFkUG9vbE1heFRocmVhZENvdW50KDgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPERybUZhY3Rvcnk+IGRybUZhY3RvcnkgPSBjcmVhdGVEcm1GYWN0b3J5KCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZHJtSW5zdGFuY2UgPSBzdGQ6OnN0cmluZygpICsgRHJtRmFjdG9yeTo6ZGVzY3JpcHRvciArICIvY2xlYXJrZXkiOworICAgIGJpbmRlcl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgQVNlcnZpY2VNYW5hZ2VyX3JlZ2lzdGVyTGF6eVNlcnZpY2UoZHJtRmFjdG9yeS0+YXNCaW5kZXIoKS5nZXQoKSwgZHJtSW5zdGFuY2UuY19zdHIoKSk7CisgICAgQ0hFQ0soc3RhdHVzID09IFNUQVRVU19PSyk7CisKKyAgICBBQmluZGVyUHJvY2Vzc19qb2luVGhyZWFkUG9vbCgpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7ICAvLyBzaG91bGQgbm90IHJlYWNoZWQKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS1sYXp5LmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3YWFiYwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCkBAIC0wLDAgKzEsOSBAQAorc2VydmljZSB2ZW5kb3IuZHJtLWNsZWFya2V5LXNlcnZpY2UgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS1sYXp5LmNsZWFya2V5CisgICAgb25lc2hvdAorICAgIGRpc2FibGVkCisgICAgY2xhc3MgaGFsCisgICAgdXNlciBtZWRpYQorICAgIGdyb3VwIG1lZGlhZHJtIGRybXJwYworICAgIGlvcHJpbyBydCA0CisgICAgdGFza19wcm9maWxlcyBQcm9jZXNzQ2FwYWNpdHlIaWdoCisgICAgaW50ZXJmYWNlIGFpZGwgYW5kcm9pZC5oYXJkd2FyZS5kcm0uSURybUZhY3RvcnkvY2xlYXJrZXkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtLXNlcnZpY2UuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtLXNlcnZpY2UuY2xlYXJrZXkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyNTJjZAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleS5yYwpAQCAtMCwwICsxLDcgQEAKK3NlcnZpY2UgdmVuZG9yLmRybS1jbGVhcmtleS1zZXJ2aWNlIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuZHJtLXNlcnZpY2UuY2xlYXJrZXkKKyAgICBjbGFzcyBoYWwKKyAgICB1c2VyIG1lZGlhCisgICAgZ3JvdXAgbWVkaWFkcm0gZHJtcnBjCisgICAgaW9wcmlvIHJ0IDQKKyAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2gKKyAgICBpbnRlcmZhY2UgYWlkbCBhbmRyb2lkLmhhcmR3YXJlLmRybS5JRHJtRmFjdG9yeS9jbGVhcmtleQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybS1zZXJ2aWNlLmNsZWFya2V5LnhtbCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzZTkyMgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleS54bWwKQEAgLTAsMCArMSw3IEBACis8bWFuaWZlc3QgdmVyc2lvbj0iMS4wIiB0eXBlPSJkZXZpY2UiPgorICAgIDxoYWwgZm9ybWF0PSJhaWRsIj4KKyAgICAgICAgPG5hbWU+YW5kcm9pZC5oYXJkd2FyZS5kcm08L25hbWU+CisgICAgICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+CisgICAgICAgIDxmcW5hbWU+SURybUZhY3RvcnkvY2xlYXJrZXk8L2ZxbmFtZT4KKyAgICA8L2hhbD4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2luY2x1ZGUvQWlkbENsZWFyS2VyeVByb3BlcnRpZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9BaWRsQ2xlYXJLZXJ5UHJvcGVydGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMmNjZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2luY2x1ZGUvQWlkbENsZWFyS2VyeVByb3BlcnRpZXMuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQUlETF9DTEVBUktFWV9QUk9QRVJUSUVTX0gKKyNkZWZpbmUgQUlETF9DTEVBUktFWV9QUk9QRVJUSUVTX0gKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FpZGxWZW5kb3JWYWx1ZSgiR29vZ2xlIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FpZGxWZXJzaW9uVmFsdWUoImFpZGwtMSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBaWRsUGx1Z2luRGVzY3JpcHRpb25WYWx1ZSgiQ2xlYXJLZXkgQ0RNIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FpZGxBbGdvcml0aG1zVmFsdWUoIiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBaWRsTGlzdGVuZXJUZXN0U3VwcG9ydFZhbHVlKCJ0cnVlIik7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWlkbERybUVycm9yVGVzdFZhbHVlKCIiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWlkbFJlc291cmNlQ29udGVudGlvblZhbHVlKCJyZXNvdXJjZUNvbnRlbnRpb24iKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWlkbExvc3RTdGF0ZVZhbHVlKCJsb3N0U3RhdGUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWlkbEZyYW1lVG9vTGFyZ2VWYWx1ZSgiZnJhbWVUb29MYXJnZSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBaWRsSW52YWxpZFN0YXRlVmFsdWUoImludmFsaWRTdGF0ZSIpOworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9BaWRsVXRpbHMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9BaWRsVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjU3YjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0FpZGxVdGlscy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfYXV0b191dGlscy5oPgorI2luY2x1ZGUgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vU3RhdHVzLmgiCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitpbmxpbmUgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTdGF0dXMgdG9Nb2NrU3RhdHVzKAorICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN0YXR1cyBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOjpFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOgorICAgICAgICBjYXNlIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOgorICAgICAgICBjYXNlIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOgorICAgICAgICAgICAgcmV0dXJuIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorfQorCitpbmxpbmUgOjpuZGs6OlNjb3BlZEFTdGF0dXMgdG9OZGtTY29wZWRBU3RhdHVzKDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbXNnID0gbnVsbHB0cikgeworICAgIGlmIChTdGF0dXM6Ok9LID09IHN0YXR1cykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXV0byBlcnIgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpOworICAgICAgICBpZiAobXNnKSB7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcldpdGhNZXNzYWdlKGVyciwgbXNnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKGVycik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2lubGluZSA6Om5kazo6U2NvcGVkQVN0YXR1cyB0b05ka1Njb3BlZEFTdGF0dXMoY2xlYXJrZXlkcm06OkNkbVJlc3BvbnNlVHlwZSByZXMpIHsKKyAgICByZXR1cm4gdG9OZGtTY29wZWRBU3RhdHVzKHN0YXRpY19jYXN0PDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzPihyZXMpKTsKK30KKworI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpOworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gIC8vIG5hbWVzcGFjZSBkcm0KK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCnNpbWlsYXJpdHkgaW5kZXggNjclCmNvcHkgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsCmNvcHkgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCmluZGV4IGIwOGE2MDQuLmUyYWZjZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCkBAIC0xMywxNyArMTMsMjAgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisjcHJhZ21hIG9uY2UKIAotcGFja2FnZSBhbmRyb2lkLm1lZGlhOworI2luY2x1ZGUgIkRybUZhY3RvcnkuaCIKIAotLyoqCi0gKiBBdWRpbyBlbmNhcHN1bGF0aW9uIHR5cGUgaXMgdXNlZCB0byBkZXNjcmliZSBpZiB0aGUgYXVkaW8gZGF0YSBzaG91bGQgYmUgc2VudCB3aXRoIGEgcGFydGljdWxhcgotICogZW5jYXBzdWxhdGlvbiB0eXBlIG9yIG5vdC4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvRW5jYXBzdWxhdGlvblR5cGUgewotICAgIE5PTkUgICAgID0gMCwKLSAgICBJRUM2MTkzNyA9IDEsCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworc3RkOjpzaGFyZWRfcHRyPERybUZhY3Rvcnk+IGNyZWF0ZURybUZhY3RvcnkoKTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9ICAvLyBuYW1lc3BhY2UgZHJtCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZGJmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9haWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vQm5DcnlwdG9QbHVnaW4uaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZHJtL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NvbW1vbi9Bc2htZW0uaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2F1dG9fdXRpbHMuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisKK25hbWVzcGFjZSB7CitzdGF0aWMgY29uc3Qgc2l6ZV90IEtFWV9JRF9TSVpFID0gMTY7CitzdGF0aWMgY29uc3Qgc2l6ZV90IEtFWV9JVl9TSVpFID0gMTY7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgbmFtZXNwYWNlIGNsZWFya2V5ZHJtOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpEZWNyeXB0QXJnczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzOworCitzdHJ1Y3QgU2hhcmVkQnVmZmVyQmFzZSB7CisgICAgdWludDhfdCogbUJhc2U7CisgICAgaW50NjRfdCBtU2l6ZTsKKyAgICBTaGFyZWRCdWZmZXJCYXNlKGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2hhcmVkQnVmZmVyJiBtZW0pOworICAgIH5TaGFyZWRCdWZmZXJCYXNlKCk7Cit9OworCitzdHJ1Y3QgQ3J5cHRvUGx1Z2luIDogcHVibGljIEJuQ3J5cHRvUGx1Z2luIHsKKyAgICBleHBsaWNpdCBDcnlwdG9QbHVnaW4oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgICAgICBjb25zdCBhdXRvIHJlcyA9IHNldE1lZGlhRHJtU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICBtSW5pdFN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgICAgIGlmICghcmVzLmlzT2soKSAmJiByZXMuZ2V0RXhjZXB0aW9uQ29kZSgpID09IEVYX1NFUlZJQ0VfU1BFQ0lGSUMpIHsKKyAgICAgICAgICAgIG1Jbml0U3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihyZXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdmlydHVhbCB+Q3J5cHRvUGx1Z2luKCkge30KKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGRlY3J5cHQoY29uc3QgRGVjcnlwdEFyZ3MmIGluX2FyZ3MsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRMb2dNZXNzYWdlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6TG9nTWVzc2FnZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBub3RpZnlSZXNvbHV0aW9uKGludDMyX3QgaW5fd2lkdGgsIGludDMyX3QgaW5faGVpZ2h0KSBvdmVycmlkZTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBzdGQ6OnN0cmluZyYgaW5fbWltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkKSBvdmVycmlkZTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldFNoYXJlZEJ1ZmZlckJhc2UoCisgICAgICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNoYXJlZEJ1ZmZlciYgaW5fYmFzZSkgb3ZlcnJpZGU7CisKKyAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN0YXR1cyBnZXRJbml0U3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbUluaXRTdGF0dXM7IH0KKworICBwcml2YXRlOgorICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDcnlwdG9QbHVnaW4pOworCisgICAgc3RkOjptdXRleCBtU2hhcmVkQnVmZmVyTG9jazsKKyAgICBzdGQ6Om1hcDx1aW50MzJfdCwgc3RkOjpzaGFyZWRfcHRyPFNoYXJlZEJ1ZmZlckJhc2U+PiBtU2hhcmVkQnVmZmVyTWFwCisgICAgICAgICAgICBHVUFSREVEX0JZKG1TaGFyZWRCdWZmZXJMb2NrKTsKKyAgICA6OmFuZHJvaWQ6OnNwPFNlc3Npb24+IG1TZXNzaW9uOworICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U3RhdHVzIG1Jbml0U3RhdHVzOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9ICAvLyBuYW1lc3BhY2UgZHJtCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzOWFhNAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vQm5Ecm1GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSUNyeXB0b1BsdWdpbi5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworc3RydWN0IERybUZhY3RvcnkgOiBwdWJsaWMgQm5Ecm1GYWN0b3J5IHsKKyAgICBEcm1GYWN0b3J5KCkge30KKyAgICB2aXJ0dWFsIH5Ecm1GYWN0b3J5KCkge30KKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNyZWF0ZURybVBsdWdpbigKKyAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VXVpZCYgaW5fdXVpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9hcHBQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OklEcm1QbHVnaW4+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY3JlYXRlQ3J5cHRvUGx1Z2luKAorICAgICAgICAgICAgY29uc3QgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpVdWlkJiBpbl91dWlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2luaXREYXRhLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6SUNyeXB0b1BsdWdpbj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpDcnlwdG9TY2hlbWVzKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCisgICAgYmluZGVyX3N0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBjaGFyKiogYXJncywgdWludDMyX3QgbnVtQXJncykgb3ZlcnJpZGU7CisKKworICBwcml2YXRlOgorICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEcm1GYWN0b3J5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIGRybQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2FpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWMwNWYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvYWlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9CbkRybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9kcm0vSURybVBsdWdpbkxpc3RlbmVyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2RybS9TdGF0dXMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorCisjaW5jbHVkZSAiRGV2aWNlRmlsZXMuaCIKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyBuYW1lc3BhY2UgY2xlYXJrZXlkcm07Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlN0YXR1czsKKworc3RydWN0IERybVBsdWdpbiA6IHB1YmxpYyBCbkRybVBsdWdpbiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KTsKKyAgICB2aXJ0dWFsIH5Ecm1QbHVnaW4oKSB7IG1GaWxlSGFuZGxlLkRlbGV0ZUFsbExpY2Vuc2VzKCk7IH0KKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlU2Vzc2lvbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBkZWNyeXB0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fa2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBlbmNyeXB0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fa2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5faXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRIZGNwTGV2ZWxzKAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpIZGNwTGV2ZWxzKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEtleVJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2NvcGUsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9pbml0RGF0YSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9taW1lVHlwZSwgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlUeXBlIGluX2tleVR5cGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVZhbHVlPiYgaW5fb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlSZXF1ZXN0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldExvZ01lc3NhZ2VzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpMb2dNZXNzYWdlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldE1ldHJpY3MoCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OkRybU1ldHJpY0dyb3VwPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXROdW1iZXJPZlNlc3Npb25zKAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpOdW1iZXJPZlNlc3Npb25zKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTZXRJZD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZSgKKyAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5U2V0SWQmIGluX2tleVNldElkLAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpPZmZsaW5lTGljZW5zZVN0YXRlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFByb3BlcnR5Qnl0ZUFycmF5KGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9wcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0UHJvcGVydHlTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGluX3Byb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRQcm92aXNpb25SZXF1ZXN0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluX2NlcnRpZmljYXRlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGluX2NlcnRpZmljYXRlQXV0aG9yaXR5LAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpQcm92aXNpb25SZXF1ZXN0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFNlY3VyZVN0b3AoCisgICAgICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3BJZCYgaW5fc2VjdXJlU3RvcElkLAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cmVTdG9wKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFNlY3VyZVN0b3BJZHMoCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3BJZD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0U2VjdXJlU3RvcHMoCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyZVN0b3A+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFNlY3VyaXR5TGV2ZWwoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpTZWN1cml0eUxldmVsKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5TZXNzaW9uKDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJpdHlMZXZlbCBpbl9zZWN1cml0eUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHByb3ZpZGVLZXlSZXNwb25zZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zY29wZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Jlc3BvbnNlLAorICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpLZXlTZXRJZCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fcmVzcG9uc2UsCisgICAgICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlByb3ZpZGVQcm92aXNpb25SZXNwb25zZVJlc3VsdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBxdWVyeUtleVN0YXR1cygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVZhbHVlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZWxlYXNlQWxsU2VjdXJlU3RvcHMoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZWxlYXNlU2VjdXJlU3RvcCgKKyAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcElkJiBpbl9zZWN1cmVTdG9wSWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlbGVhc2VTZWN1cmVTdG9wcygKKyAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6T3BhcXVlRGF0YSYgaW5fc3NSZWxlYXNlKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZW1vdmVBbGxTZWN1cmVTdG9wcygpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlbW92ZUtleXMoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVtb3ZlT2ZmbGluZUxpY2Vuc2UoCisgICAgICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVNldElkJiBpbl9rZXlTZXRJZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVtb3ZlU2VjdXJlU3RvcCgKKyAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6U2VjdXJlU3RvcElkJiBpbl9zZWN1cmVTdG9wSWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlcXVpcmVzU2VjdXJlRGVjb2RlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9taW1lLCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlNlY3VyaXR5TGV2ZWwgaW5fbGV2ZWwsCisgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlc3RvcmVLZXlzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6S2V5U2V0SWQmIGluX2tleVNldElkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRDaXBoZXJBbGdvcml0aG0oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluX2FsZ29yaXRobSkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0TGlzdGVuZXIoCisgICAgICAgICAgICAvLyAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpJRHJtUGx1Z2luTGlzdGVuZXI+JgorICAgICAgICAgICAgLy8gICAgICAgICAgICBpbl9saXN0ZW5lcikKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJRHJtUGx1Z2luTGlzdGVuZXI+JiBpbl9saXN0ZW5lcikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0TWFjQWxnb3JpdGhtKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9hbGdvcml0aG0pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldFBsYXliYWNrSWQoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9wbGF5YmFja0lkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRQcm9wZXJ0eUJ5dGVBcnJheShjb25zdCBzdGQ6OnN0cmluZyYgaW5fcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl92YWx1ZSkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0UHJvcGVydHlTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGluX3Byb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5fdmFsdWUpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNpZ24oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9rZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2lnblJTQShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluX2FsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3dyYXBwZWRrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyB2ZXJpZnkoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX2tleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIHZvaWQgaW5pdFByb3BlcnRpZXMoKTsKKyAgICB2b2lkIGluc3RhbGxTZWN1cmVTdG9wKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworICAgIGJvb2wgbWFrZUtleVNldElkKHN0ZDo6c3RyaW5nKiBrZXlTZXRJZCk7CisgICAgdm9pZCBzZXRQbGF5UG9saWN5KCk7CisKKyAgICB2b2lkIHNlbmRFdmVudCg6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OkV2ZW50VHlwZSBpbl9ldmVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fZGF0YSk7CisgICAgdm9pZCBzZW5kRXhwaXJhdGlvblVwZGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBpbl9leHBpcnlUaW1lSW5NUyk7CisgICAgdm9pZCBzZW5kS2V5c0NoYW5nZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OktleVN0YXR1cz4mIGluX2tleVN0YXR1c0xpc3QsCisgICAgICAgICAgICBib29sIGluX2hhc05ld1VzYWJsZUtleSk7CisgICAgdm9pZCBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5fc2Vzc2lvbklkKTsKKworICAgIFN0YXR1cyBzZXRTZWN1cml0eUxldmVsKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIFNlY3VyaXR5TGV2ZWwgbGV2ZWwpOworCisgICAgU3RhdHVzIGdldEtleVJlcXVlc3RDb21tb24oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleVR5cGUga2V5VHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8S2V5VmFsdWU+JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIHJlcXVlc3QsIEtleVJlcXVlc3RUeXBlKiBnZXRLZXlSZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZGVmYXVsdFVybCk7CisKKyAgICBzdHJ1Y3QgQ2xlYXJrZXlTZWN1cmVTdG9wIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaWQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGE7CisgICAgfTsKKworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBDbGVhcmtleVNlY3VyZVN0b3A+IG1TZWN1cmVTdG9wczsKKyAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gbVBsYXlQb2xpY3k7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtU3RyaW5nUHJvcGVydGllczsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8dWludDhfdD4+IG1CeXRlQXJyYXlQcm9wZXJ0aWVzOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gbVJlbGVhc2VLZXlzTWFwOworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnN0cmluZz4gbVBsYXliYWNrSWQ7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIFNlY3VyaXR5TGV2ZWw+IG1TZWN1cml0eUxldmVsOworICAgIDo6c3RkOjpzaGFyZWRfcHRyPElEcm1QbHVnaW5MaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIFNlc3Npb25MaWJyYXJ5KiBtU2Vzc2lvbkxpYnJhcnk7CisgICAgaW50NjRfdCBtT3BlblNlc3Npb25Pa0NvdW50OworICAgIGludDY0X3QgbUNsb3NlU2Vzc2lvbk9rQ291bnQ7CisgICAgaW50NjRfdCBtQ2xvc2VTZXNzaW9uTm90T3BlbmVkQ291bnQ7CisgICAgdWludDMyX3QgbU5leHRTZWN1cmVTdG9wSWQ7CisgICAgOjphbmRyb2lkOjpNdXRleCBtUGxheVBvbGljeUxvY2s7CisKKyAgICAvLyBzZXQgYnkgcHJvcGVydHkgdG8gbW9jayBlcnJvciBzY2VuYXJpb3MKKyAgICBTdGF0dXMgbU1vY2tFcnJvcjsKKworICAgIHZvaWQgcHJvY2Vzc01vY2tFcnJvcihjb25zdCA6OmFuZHJvaWQ6OnNwPFNlc3Npb24+JiBzZXNzaW9uKSB7CisgICAgICAgIHNlc3Npb24tPnNldE1vY2tFcnJvcihzdGF0aWNfY2FzdDxDZG1SZXNwb25zZVR5cGU+KG1Nb2NrRXJyb3IpKTsKKyAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1czo6T0s7CisgICAgfQorCisgICAgRGV2aWNlRmlsZXMgbUZpbGVIYW5kbGU7CisgICAgOjphbmRyb2lkOjpNdXRleCBtU2VjdXJlU3RvcExvY2s7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fQU5EX05FVyhEcm1QbHVnaW4pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9ICAvLyBuYW1lc3BhY2UgZHJtCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0Flc0N0ckRlY3J5cHRvci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vQWVzQ3RyRGVjcnlwdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjk3ODIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0Flc0N0ckRlY3J5cHRvci5jcHAKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgImNsZWFya2V5LUFlc0RlY3J5cHRvciIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKworI2luY2x1ZGUgIkFlc0N0ckRlY3J5cHRvci5oIgorI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrQmxvY2tCaXRDb3VudCA9IGtCbG9ja1NpemUgKiA4OworCitDZG1SZXNwb25zZVR5cGUgQWVzQ3RyRGVjcnlwdG9yOjpkZWNyeXB0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBrZXksIGNvbnN0IEl2IGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzb3VyY2UsIHVpbnQ4X3QqIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgY2xlYXJEYXRhTGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGVuY3J5cHRlZERhdGFMZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KSB7CisKKyAgICBpZiAoa2V5LnNpemUoKSAhPSBrQmxvY2tTaXplIHx8IGNsZWFyRGF0YUxlbmd0aHMuc2l6ZSgpICE9IGVuY3J5cHRlZERhdGFMZW5ndGhzLnNpemUoKSkgeworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjYzOTgyNzY4Iik7CisgICAgICAgIHJldHVybiBjbGVhcmtleWRybTo6RVJST1JfREVDUllQVDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBibG9ja09mZnNldCA9IDA7CisgICAgdWludDhfdCBwcmV2aW91c0VuY3J5cHRlZENvdW50ZXJba0Jsb2NrU2l6ZV07CisgICAgbWVtc2V0KHByZXZpb3VzRW5jcnlwdGVkQ291bnRlciwgMCwga0Jsb2NrU2l6ZSk7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBBRVNfS0VZIG9wZW5zc2xLZXk7CisgICAgQUVTX3NldF9lbmNyeXB0X2tleShrZXkuZGF0YSgpLCBrQmxvY2tCaXRDb3VudCwgJm9wZW5zc2xLZXkpOworICAgIEl2IG9wZW5zc2xJdjsKKyAgICBtZW1jcHkob3BlbnNzbEl2LCBpdiwgc2l6ZW9mKG9wZW5zc2xJdikpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjbGVhckRhdGFMZW5ndGhzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGludDMyX3QgbnVtQnl0ZXNPZkNsZWFyRGF0YSA9IGNsZWFyRGF0YUxlbmd0aHNbaV07CisgICAgICAgIGlmIChudW1CeXRlc09mQ2xlYXJEYXRhID4gMCkgeworICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uICsgb2Zmc2V0LCBzb3VyY2UgKyBvZmZzZXQsIG51bUJ5dGVzT2ZDbGVhckRhdGEpOworICAgICAgICAgICAgb2Zmc2V0ICs9IG51bUJ5dGVzT2ZDbGVhckRhdGE7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IG51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gZW5jcnlwdGVkRGF0YUxlbmd0aHNbaV07CisgICAgICAgIGlmIChudW1CeXRlc09mRW5jcnlwdGVkRGF0YSA+IDApIHsKKyAgICAgICAgICAgIEFFU19jdHIxMjhfZW5jcnlwdChzb3VyY2UgKyBvZmZzZXQsIGRlc3RpbmF0aW9uICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhLCAmb3BlbnNzbEtleSwgb3BlbnNzbEl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzRW5jcnlwdGVkQ291bnRlciwgJmJsb2NrT2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSBudW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpieXRlc0RlY3J5cHRlZE91dCA9IG9mZnNldDsKKyAgICByZXR1cm4gY2xlYXJrZXlkcm06Ok9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0FuZHJvaWQuYnAKaW5kZXggN2VkOGI4OC4uYTZhNWIyOCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTQ0LDMgKzQ0LDU2IEBACiAgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCiAgICAgfSwKIH0KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJjbGVhcmtleWRldmljZWZpbGVzLXByb3Rvcy5jb21tb24iLAorICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIHByb3RvOiB7CisgICAgICAgIGV4cG9ydF9wcm90b19oZWFkZXJzOiB0cnVlLAorICAgICAgICB0eXBlOiAibGl0ZSIsCisgICAgfSwKKyAgICBzcmNzOiBbInByb3Rvcy9EZXZpY2VGaWxlcy5wcm90byJdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmNsZWFya2V5YmFzZSIsCisgICAgdmVuZG9yOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQWVzQ3RyRGVjcnlwdG9yLmNwcCIsCisgICAgICAgICJCYXNlNjQuY3BwIiwKKyAgICAgICAgIkJ1ZmZlci5jcHAiLAorICAgICAgICAiQ2xlYXJLZXlVVUlELmNwcCIsCisgICAgICAgICJEZXZpY2VGaWxlcy5jcHAiLAorICAgICAgICAiSW5pdERhdGFQYXJzZXIuY3BwIiwKKyAgICAgICAgIkpzb25XZWJLZXkuY3BwIiwKKyAgICAgICAgIk1lbW9yeUZpbGVTeXN0ZW0uY3BwIiwKKyAgICAgICAgIlNlc3Npb24uY3BwIiwKKyAgICAgICAgIlNlc3Npb25MaWJyYXJ5LmNwcCIsCisgICAgICAgICJVdGlscy5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvaW5jbHVkZSJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgXSwKKworICAgIHdob2xlX3N0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJqc21uIiwKKyAgICAgICAgImxpYmNsZWFya2V5ZGV2aWNlZmlsZXMtcHJvdG9zLmNvbW1vbiIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgICAgICAiaW5jbHVkZS9jbGVhcmtleWRybSIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9CYXNlNjQuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0Jhc2U2NC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ5OTc5MwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9CYXNlNjQuY3BwCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiY2xlYXJrZXktQmFzZTY0IgorCisjaW5jbHVkZSAiQmFzZTY0LmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKKzo6YW5kcm9pZDo6c3A8QnVmZmVyPiBkZWNvZGVCYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKKyAgICBzaXplX3QgbiA9IHMuc2l6ZSgpOworCisgICAgaWYgKChuICUgNCkgIT0gMCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzaXplX3QgcGFkZGluZyA9IDA7CisgICAgaWYgKG4gPj0gMSAmJiBzLmNfc3RyKClbbiAtIDFdID09ICc9JykgeworICAgICAgICBwYWRkaW5nID0gMTsKKworICAgICAgICBpZiAobiA+PSAyICYmIHMuY19zdHIoKVtuIC0gMl0gPT0gJz0nKSB7CisgICAgICAgICAgICBwYWRkaW5nID0gMjsKKworICAgICAgICAgICAgaWYgKG4gPj0gMyAmJiBzLmNfc3RyKClbbiAtIDNdID09ICc9JykgeworICAgICAgICAgICAgICAgIHBhZGRpbmcgPSAzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2UgZGl2aWRlIGZpcnN0IHRvIGF2b2lkIG92ZXJmbG93LiBJdCdzIE9LIHRvIGRvIHRoaXMgYmVjYXVzZSB3ZQorICAgIC8vIGFscmVhZHkgbWFkZSBzdXJlIHRoYXQgbiAlIDQgPT0gMC4KKyAgICBzaXplX3Qgb3V0TGVuID0gKG4gLyA0KSAqIDMgLSBwYWRkaW5nOworCisgICAgOjphbmRyb2lkOjpzcDxCdWZmZXI+IGJ1ZmZlciA9IG5ldyBCdWZmZXIob3V0TGVuKTsKKyAgICB1aW50OF90KiBvdXQgPSBidWZmZXItPmRhdGEoKTsKKyAgICBpZiAob3V0ID09IG51bGxwdHIgfHwgYnVmZmVyLT5zaXplKCkgPCBvdXRMZW4pIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc2l6ZV90IGogPSAwOworICAgIHVpbnQzMl90IGFjY3VtID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBjaGFyIGMgPSBzLmNfc3RyKClbaV07CisgICAgICAgIHVuc2lnbmVkIHZhbHVlOworICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgIHZhbHVlID0gYyAtICdBJzsKKyAgICAgICAgfSBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworICAgICAgICAgICAgdmFsdWUgPSAyNiArIGMgLSAnYSc7CisgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgIHZhbHVlID0gNTIgKyBjIC0gJzAnOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDYyOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJy8nIHx8IGMgPT0gJ18nKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDYzOworICAgICAgICB9IGVsc2UgaWYgKGMgIT0gJz0nKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpIDwgbiAtIHBhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgYWNjdW0gPSAoYWNjdW0gPDwgNikgfCB2YWx1ZTsKKworICAgICAgICBpZiAoKChpICsgMSkgJSA0KSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoaiA8IG91dExlbikgeworICAgICAgICAgICAgICAgIG91dFtqKytdID0gKGFjY3VtID4+IDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqIDwgb3V0TGVuKSB7CisgICAgICAgICAgICAgICAgb3V0W2orK10gPSAoYWNjdW0gPj4gOCkgJiAweGZmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGogPCBvdXRMZW4pIHsKKyAgICAgICAgICAgICAgICBvdXRbaisrXSA9IGFjY3VtICYgMHhmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWNjdW0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIGNoYXIgZW5jb2RlNkJpdCh1bnNpZ25lZCB4KSB7CisgICAgaWYgKHggPD0gMjUpIHsKKyAgICAgICAgcmV0dXJuICdBJyArIHg7CisgICAgfSBlbHNlIGlmICh4IDw9IDUxKSB7CisgICAgICAgIHJldHVybiAnYScgKyB4IC0gMjY7CisgICAgfSBlbHNlIGlmICh4IDw9IDYxKSB7CisgICAgICAgIHJldHVybiAnMCcgKyB4IC0gNTI7CisgICAgfSBlbHNlIGlmICh4ID09IDYyKSB7CisgICAgICAgIHJldHVybiAnKyc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICcvJzsKKyAgICB9Cit9CisKK3ZvaWQgZW5jb2RlQmFzZTY0KGNvbnN0IHZvaWQqIF9kYXRhLCBzaXplX3Qgc2l6ZSwgc3RkOjpzdHJpbmcqIG91dCkgeworICAgIG91dC0+Y2xlYXIoKTsKKworICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSAoY29uc3QgdWludDhfdCopX2RhdGE7CisKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemUgLyAzKSAqIDM7IGkgKz0gMykgeworICAgICAgICB1aW50OF90IHgxID0gZGF0YVtpXTsKKyAgICAgICAgdWludDhfdCB4MiA9IGRhdGFbaSArIDFdOworICAgICAgICB1aW50OF90IHgzID0gZGF0YVtpICsgMl07CisKKyAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCh4MSA+PiAyKSk7CisgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoKHgxIDw8IDQgfCB4MiA+PiA0KSAmIDB4M2YpKTsKKyAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCgoeDIgPDwgMiB8IHgzID4+IDYpICYgMHgzZikpOworICAgICAgICBvdXQtPnB1c2hfYmFjayhlbmNvZGU2Qml0KHgzICYgMHgzZikpOworICAgIH0KKyAgICBzd2l0Y2ggKHNpemUgJSAzKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IHsKKyAgICAgICAgICAgIHVpbnQ4X3QgeDEgPSBkYXRhW2ldOworICAgICAgICAgICAgdWludDhfdCB4MiA9IGRhdGFbaSArIDFdOworICAgICAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCh4MSA+PiAyKSk7CisgICAgICAgICAgICBvdXQtPnB1c2hfYmFjayhlbmNvZGU2Qml0KCh4MSA8PCA0IHwgeDIgPj4gNCkgJiAweDNmKSk7CisgICAgICAgICAgICBvdXQtPnB1c2hfYmFjayhlbmNvZGU2Qml0KCh4MiA8PCAyKSAmIDB4M2YpKTsKKyAgICAgICAgICAgIG91dC0+cHVzaF9iYWNrKCc9Jyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICB1aW50OF90IHgxID0gZGF0YVtpXTsKKyAgICAgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoeDEgPj4gMikpOworICAgICAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCgoeDEgPDwgNCkgJiAweDNmKSk7CisgICAgICAgICAgICBvdXQtPmFwcGVuZCgiPT0iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGVuY29kZUJhc2U2NFVybChjb25zdCB2b2lkKiBfZGF0YSwgc2l6ZV90IHNpemUsIHN0ZDo6c3RyaW5nKiBvdXQpIHsKKyAgICBlbmNvZGVCYXNlNjQoX2RhdGEsIHNpemUsIG91dCk7CisKKyAgICBpZiAoKHN0ZDo6c3RyaW5nOjpucG9zICE9IG91dC0+ZmluZCgiKyIpKSB8fCAoc3RkOjpzdHJpbmc6Om5wb3MgIT0gb3V0LT5maW5kKCIvIikpKSB7CisgICAgICAgIHNpemVfdCBvdXRMZW4gPSBvdXQtPnNpemUoKTsKKyAgICAgICAgY2hhciogYmFzZTY0dXJsID0gbmV3IGNoYXJbb3V0TGVuXTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRMZW47ICsraSkgeworICAgICAgICAgICAgaWYgKG91dC0+Y19zdHIoKVtpXSA9PSAnKycpCisgICAgICAgICAgICAgICAgYmFzZTY0dXJsW2ldID0gJy0nOworICAgICAgICAgICAgZWxzZSBpZiAob3V0LT5jX3N0cigpW2ldID09ICcvJykKKyAgICAgICAgICAgICAgICBiYXNlNjR1cmxbaV0gPSAnXyc7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYmFzZTY0dXJsW2ldID0gb3V0LT5jX3N0cigpW2ldOworICAgICAgICB9CisKKyAgICAgICAgb3V0LT5hc3NpZ24oYmFzZTY0dXJsLCBvdXRMZW4pOworICAgICAgICBkZWxldGVbXSBiYXNlNjR1cmw7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9CdWZmZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0J1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3MTU5OAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9CdWZmZXIuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkJ1ZmZlci5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitCdWZmZXI6OkJ1ZmZlcihzaXplX3QgY2FwYWNpdHkpIDogbVJhbmdlT2Zmc2V0KDApLCBtT3duc0RhdGEodHJ1ZSkgeworICAgIG1EYXRhID0gbWFsbG9jKGNhcGFjaXR5KTsKKyAgICBpZiAobURhdGEgPT0gbnVsbHB0cikgeworICAgICAgICBtQ2FwYWNpdHkgPSAwOworICAgICAgICBtUmFuZ2VMZW5ndGggPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DYXBhY2l0eSA9IGNhcGFjaXR5OworICAgICAgICBtUmFuZ2VMZW5ndGggPSBjYXBhY2l0eTsKKyAgICB9Cit9CisKK0J1ZmZlcjo6fkJ1ZmZlcigpIHsKKyAgICBpZiAobU93bnNEYXRhKSB7CisgICAgICAgIGlmIChtRGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmcmVlKG1EYXRhKTsKKyAgICAgICAgICAgIG1EYXRhID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vRGV2aWNlRmlsZXMuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0RldmljZUZpbGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk5MjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0RldmljZUZpbGVzLmNwcApAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgIkRldmljZUZpbGVzLmgiCisjaW5jbHVkZSAicHJvdG9zL0RldmljZUZpbGVzLnBiLmgiCisKKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorCisvLyBQcm90b2J1ZiBnZW5lcmF0ZWQgY2xhc3Nlcy4KK3VzaW5nIGNsZWFya2V5ZHJtOjpIYXNoZWRGaWxlOwordXNpbmcgY2xlYXJrZXlkcm06OkxpY2Vuc2U7Cit1c2luZyBjbGVhcmtleWRybTo6TGljZW5zZV9MaWNlbnNlU3RhdGVfQUNUSVZFOwordXNpbmcgY2xlYXJrZXlkcm06OkxpY2Vuc2VfTGljZW5zZVN0YXRlX1JFTEVBU0lORzsKK3VzaW5nIGNsZWFya2V5ZHJtOjpPZmZsaW5lRmlsZTsKKworbmFtZXNwYWNlIHsKK2NvbnN0IGNoYXIga0xpY2Vuc2VGaWxlTmFtZUV4dFtdID0gIi5saWMiOworCitib29sIEhhc2goY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEsIHN0ZDo6c3RyaW5nKiBoYXNoKSB7CisgICAgaWYgKCFoYXNoKSByZXR1cm4gZmFsc2U7CisKKyAgICBoYXNoLT5yZXNpemUoU0hBMjU2X0RJR0VTVF9MRU5HVEgpOworCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5wdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihkYXRhLmRhdGEoKSk7CisgICAgdW5zaWduZWQgY2hhciogb3V0cHV0ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oJigqaGFzaClbMF0pOworICAgIFNIQTI1NihpbnB1dCwgZGF0YS5zaXplKCksIG91dHB1dCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitib29sIERldmljZUZpbGVzOjpTdG9yZUxpY2Vuc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkLCBMaWNlbnNlU3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxpY2Vuc2VSZXNwb25zZSkgeworICAgIE9mZmxpbmVGaWxlIGZpbGU7CisgICAgZmlsZS5zZXRfdHlwZShPZmZsaW5lRmlsZTo6TElDRU5TRSk7CisgICAgZmlsZS5zZXRfdmVyc2lvbihPZmZsaW5lRmlsZTo6VkVSU0lPTl8xKTsKKworICAgIExpY2Vuc2UqIGxpY2Vuc2UgPSBmaWxlLm11dGFibGVfbGljZW5zZSgpOworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBrTGljZW5zZVN0YXRlQWN0aXZlOgorICAgICAgICAgICAgbGljZW5zZS0+c2V0X3N0YXRlKExpY2Vuc2VfTGljZW5zZVN0YXRlX0FDVElWRSk7CisgICAgICAgICAgICBsaWNlbnNlLT5zZXRfbGljZW5zZShsaWNlbnNlUmVzcG9uc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0xpY2Vuc2VTdGF0ZVJlbGVhc2luZzoKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9zdGF0ZShMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9SRUxFQVNJTkcpOworICAgICAgICAgICAgbGljZW5zZS0+c2V0X2xpY2Vuc2UobGljZW5zZVJlc3BvbnNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIlN0b3JlTGljZW5zZTogVW5rbm93biBsaWNlbnNlIHN0YXRlOiAldSIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkRmlsZTsKKyAgICBmaWxlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkRmlsZSk7CisKKyAgICByZXR1cm4gU3RvcmVGaWxlV2l0aEhhc2goa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0LCBzZXJpYWxpemVkRmlsZSk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlRmlsZVdpdGhIYXNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkRmlsZSkgeworICAgIHN0ZDo6c3RyaW5nIGhhc2g7CisgICAgaWYgKCFIYXNoKHNlcmlhbGl6ZWRGaWxlLCAmaGFzaCkpIHsKKyAgICAgICAgQUxPR0UoIlN0b3JlRmlsZVdpdGhIYXNoOiBGYWlsZWQgdG8gY29tcHV0ZSBoYXNoIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBIYXNoZWRGaWxlIGhhc2hGaWxlOworICAgIGhhc2hGaWxlLnNldF9maWxlKHNlcmlhbGl6ZWRGaWxlKTsKKyAgICBoYXNoRmlsZS5zZXRfaGFzaChoYXNoKTsKKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRIYXNoRmlsZTsKKyAgICBoYXNoRmlsZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZEhhc2hGaWxlKTsKKworICAgIHJldHVybiBTdG9yZUZpbGVSYXcoZmlsZU5hbWUsIHNlcmlhbGl6ZWRIYXNoRmlsZSk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlRmlsZVJhdyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkSGFzaEZpbGUpIHsKKyAgICBNZW1vcnlGaWxlU3lzdGVtOjpNZW1vcnlGaWxlIG1lbUZpbGU7CisgICAgbWVtRmlsZS5zZXRGaWxlTmFtZShmaWxlTmFtZSk7CisgICAgbWVtRmlsZS5zZXRDb250ZW50KHNlcmlhbGl6ZWRIYXNoRmlsZSk7CisgICAgbWVtRmlsZS5zZXRGaWxlU2l6ZShzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpKTsKKyAgICBzaXplX3QgbGVuID0gbUZpbGVIYW5kbGUuV3JpdGUoZmlsZU5hbWUsIG1lbUZpbGUpOworCisgICAgaWYgKGxlbiAhPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCJTdG9yZUZpbGVSYXc6IEZhaWxlZCB0byB3cml0ZSAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HRCgiU3RvcmVGaWxlUmF3OiBleHBlY3RlZD0lemQsIGFjdHVhbD0lenUiLCBzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpLCBsZW4pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR0QoIlN0b3JlRmlsZVJhdzogd3JvdGUgJXp1IGJ5dGVzIHRvICVzIiwgc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlJldHJpZXZlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQsIExpY2Vuc2VTdGF0ZSogc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG9mZmxpbmVMaWNlbnNlKSB7CisgICAgT2ZmbGluZUZpbGUgZmlsZTsKKyAgICBpZiAoIVJldHJpZXZlSGFzaGVkRmlsZShrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQsICZmaWxlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGZpbGUudHlwZSgpICE9IE9mZmxpbmVGaWxlOjpMSUNFTlNFKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUxpY2Vuc2U6IEludmFsaWQgZmlsZSB0eXBlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZmlsZS52ZXJzaW9uKCkgIT0gT2ZmbGluZUZpbGU6OlZFUlNJT05fMSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVMaWNlbnNlOiBJbnZhbGlkIGZpbGUgdmVyc2lvbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFmaWxlLmhhc19saWNlbnNlKCkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlTGljZW5zZTogTGljZW5zZSBub3QgcHJlc2VudCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgTGljZW5zZSBsaWNlbnNlID0gZmlsZS5saWNlbnNlKCk7CisgICAgc3dpdGNoIChsaWNlbnNlLnN0YXRlKCkpIHsKKyAgICAgICAgY2FzZSBMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9BQ1RJVkU6CisgICAgICAgICAgICAqc3RhdGUgPSBrTGljZW5zZVN0YXRlQWN0aXZlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTGljZW5zZV9MaWNlbnNlU3RhdGVfUkVMRUFTSU5HOgorICAgICAgICAgICAgKnN0YXRlID0ga0xpY2Vuc2VTdGF0ZVJlbGVhc2luZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIlJldHJpZXZlTGljZW5zZTogVW5yZWNvZ25pemVkIGxpY2Vuc2Ugc3RhdGU6ICV1Iiwga0xpY2Vuc2VTdGF0ZVVua25vd24pOworICAgICAgICAgICAgKnN0YXRlID0ga0xpY2Vuc2VTdGF0ZVVua25vd247CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgKm9mZmxpbmVMaWNlbnNlID0gbGljZW5zZS5saWNlbnNlKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkRlbGV0ZUxpY2Vuc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLlJlbW92ZUZpbGUoa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0KTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6RGVsZXRlQWxsTGljZW5zZXMoKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLlJlbW92ZUFsbEZpbGVzKCk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkxpY2Vuc2VFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLkZpbGVFeGlzdHMoa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0KTsKK30KKworc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IERldmljZUZpbGVzOjpMaXN0TGljZW5zZXMoKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpY2Vuc2VzID0gbUZpbGVIYW5kbGUuTGlzdEZpbGVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaWNlbnNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBzdGQ6OnN0cmluZyYgbGljZW5zZSA9IGxpY2Vuc2VzW2ldOworICAgICAgICBsaWNlbnNlID0gbGljZW5zZS5zdWJzdHIoMCwgbGljZW5zZS5zaXplKCkgLSBzdHJsZW4oa0xpY2Vuc2VGaWxlTmFtZUV4dCkpOworICAgIH0KKyAgICByZXR1cm4gbGljZW5zZXM7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlJldHJpZXZlSGFzaGVkRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIE9mZmxpbmVGaWxlKiBkZVNlcmlhbGl6ZWRGaWxlKSB7CisgICAgaWYgKCFkZVNlcmlhbGl6ZWRGaWxlKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IGludmFsaWQgZmlsZSBwYXJhbWV0ZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghRmlsZUV4aXN0cyhmaWxlTmFtZSkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogJXMgZG9lcyBub3QgZXhpc3QiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNzaXplX3QgYnl0ZXMgPSBHZXRGaWxlU2l6ZShmaWxlTmFtZSk7CisgICAgaWYgKGJ5dGVzIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogaW52YWxpZCBmaWxlIHNpemU6ICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgY29ycnVwdGVkIGZpbGUgc28gdGhlIGNhbGxlciB3aWxsIG5vdCBnZXQgdGhlIHNhbWUgZXJyb3IKKyAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gYWNjZXNzIHRoZSBmaWxlIHJlcGVhdGVkbHksIGNhdXNpbmcgdGhlIHN5c3RlbSB0byBzdGFsbC4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkSGFzaEZpbGU7CisgICAgc2VyaWFsaXplZEhhc2hGaWxlLnJlc2l6ZShieXRlcyk7CisgICAgYnl0ZXMgPSBtRmlsZUhhbmRsZS5SZWFkKGZpbGVOYW1lLCAmc2VyaWFsaXplZEhhc2hGaWxlKTsKKworICAgIGlmIChieXRlcyAhPSBzdGF0aWNfY2FzdDxzc2l6ZV90PihzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBGYWlsZWQgdG8gcmVhZCBmcm9tICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIEFMT0dWKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IGV4cGVjdGVkOiAlemQsIGFjdHVhbDogJXpkIiwgc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSwgYnl0ZXMpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGNvcnJ1cHRlZCBmaWxlIHNvIHRoZSBjYWxsZXIgd2lsbCBub3QgZ2V0IHRoZSBzYW1lIGVycm9yCisgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyB0aGUgZmlsZSByZXBlYXRlZGx5LCBjYXVzaW5nIHRoZSBzeXN0ZW0gdG8gc3RhbGwuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoIlJldHJpZXZlSGFzaGVkRmlsZTogcmVhZCAlemQgZnJvbSAlcyIsIGJ5dGVzLCBmaWxlTmFtZS5jX3N0cigpKTsKKworICAgIEhhc2hlZEZpbGUgaGFzaEZpbGU7CisgICAgaWYgKCFoYXNoRmlsZS5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZEhhc2hGaWxlKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBVbmFibGUgdG8gcGFyc2UgaGFzaCBmaWxlIik7CisgICAgICAgIC8vIFJlbW92ZSBjb3JydXB0IGZpbGUuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgaGFzaDsKKyAgICBpZiAoIUhhc2goaGFzaEZpbGUuZmlsZSgpLCAmaGFzaCkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogSGFzaCBjb21wdXRhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChoYXNoICE9IGhhc2hGaWxlLmhhc2goKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBIYXNoIG1pc21hdGNoIik7CisgICAgICAgIC8vIFJlbW92ZSBjb3JydXB0IGZpbGUuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFkZVNlcmlhbGl6ZWRGaWxlLT5QYXJzZUZyb21TdHJpbmcoaGFzaEZpbGUuZmlsZSgpKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBVbmFibGUgdG8gcGFyc2UgZmlsZSIpOworICAgICAgICAvLyBSZW1vdmUgY29ycnVwdCBmaWxlLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERldmljZUZpbGVzOjpGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5GaWxlRXhpc3RzKGZpbGVOYW1lKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6UmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuUmVtb3ZlRmlsZShmaWxlTmFtZSk7Cit9CisKK3NzaXplX3QgRGV2aWNlRmlsZXM6OkdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5HZXRGaWxlU2l6ZShmaWxlTmFtZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0luaXREYXRhUGFyc2VyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9Jbml0RGF0YVBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4MzllOQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9Jbml0RGF0YVBhcnNlci5jcHAKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjbGVhcmtleS1Jbml0RGF0YVBhcnNlciIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkluaXREYXRhUGFyc2VyLmgiCisKKyNpbmNsdWRlICJCYXNlNjQuaCIKKworI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgorI2luY2x1ZGUgIk1pbWVUeXBlLmgiCisKK25hbWVzcGFjZSB7Citjb25zdCBzaXplX3Qga0tleUlkU2l6ZSA9IDE2OworY29uc3Qgc2l6ZV90IGtTeXN0ZW1JZFNpemUgPSAxNjsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBTdHJUb1ZlY3Rvcihjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjKHN0ci5iZWdpbigpLCBzdHIuZW5kKCkpOworICAgIHJldHVybiB2ZWM7Cit9CisKK0NkbVJlc3BvbnNlVHlwZSBJbml0RGF0YVBhcnNlcjo6cGFyc2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENkbUtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGxpY2Vuc2VSZXF1ZXN0KSB7CisgICAgLy8gQnVpbGQgYSBsaXN0IG9mIHRoZSBrZXkgSURzCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+IGtleUlkczsKKworICAgIGlmIChtaW1lVHlwZSA9PSBrSXNvQm1mZlZpZGVvTWltZVR5cGUuY19zdHIoKSB8fCBtaW1lVHlwZSA9PSBrSXNvQm1mZkF1ZGlvTWltZVR5cGUuY19zdHIoKSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrQ2VuY0luaXREYXRhRm9ybWF0LmNfc3RyKCkpIHsKKyAgICAgICAgYXV0byByZXMgPSBwYXJzZVBzc2goaW5pdERhdGEsICZrZXlJZHMpOworICAgICAgICBpZiAocmVzICE9IGNsZWFya2V5ZHJtOjpPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobWltZVR5cGUgPT0ga1dlYm1WaWRlb01pbWVUeXBlLmNfc3RyKCkgfHwgbWltZVR5cGUgPT0ga1dlYm1BdWRpb01pbWVUeXBlLmNfc3RyKCkgfHwKKyAgICAgICAgICAgICAgIG1pbWVUeXBlID09IGtXZWJtSW5pdERhdGFGb3JtYXQuY19zdHIoKSkgeworICAgICAgICAvLyBXZWJNICJpbml0IGRhdGEiIGlzIGp1c3QgYSBzaW5nbGUga2V5IElECisgICAgICAgIGlmIChpbml0RGF0YS5zaXplKCkgIT0ga0tleUlkU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9DQU5OT1RfSEFORExFOworICAgICAgICB9CisgICAgICAgIGtleUlkcy5wdXNoX2JhY2soaW5pdERhdGEuZGF0YSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gY2xlYXJrZXlkcm06OkVSUk9SX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgaWYgKGtleVR5cGUgPT0gY2xlYXJrZXlkcm06OktFWV9UWVBFX1JFTEVBU0UpIHsKKyAgICAgICAgLy8gcmVzdG9yZSBrZXkKKyAgICB9CisKKyAgICAvLyBCdWlsZCB0aGUgcmVxdWVzdAorICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3RKc29uID0gZ2VuZXJhdGVSZXF1ZXN0KGtleVR5cGUsIGtleUlkcyk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdEpzb25WZWMgPSBTdHJUb1ZlY3RvcihyZXF1ZXN0SnNvbik7CisKKyAgICBsaWNlbnNlUmVxdWVzdC0+Y2xlYXIoKTsKKyAgICBsaWNlbnNlUmVxdWVzdC0+aW5zZXJ0KGxpY2Vuc2VSZXF1ZXN0LT5lbmQoKSwgcmVxdWVzdEpzb25WZWMuYmVnaW4oKSwgcmVxdWVzdEpzb25WZWMuZW5kKCkpOworICAgIHJldHVybiBjbGVhcmtleWRybTo6T0s7Cit9CisKK0NkbVJlc3BvbnNlVHlwZSBJbml0RGF0YVBhcnNlcjo6cGFyc2VQc3NoKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPioga2V5SWRzKSB7CisgICAgLy8gRGVzY3JpcHRpb24gb2YgUFNTSCBmb3JtYXQ6CisgICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2VuY3J5cHRlZC1tZWRpYS9mb3JtYXQtcmVnaXN0cnkvaW5pdGRhdGEvY2VuYy5odG1sCisgICAgc2l6ZV90IHJlYWRQb3NpdGlvbiA9IDA7CisKKyAgICB1aW50MzJfdCBleHBlY3RlZFNpemUgPSBpbml0RGF0YS5zaXplKCk7CisgICAgY29uc3QgY2hhciBwc3NoSWRlbnRpZmllcls0XSA9IHsncCcsICdzJywgJ3MnLCAnaCd9OworICAgIGNvbnN0IHVpbnQ4X3QgcHNzaFZlcnNpb24xWzRdID0gezEsIDAsIDAsIDB9OworICAgIHVpbnQzMl90IGtleUlkQ291bnQgPSAwOworICAgIHNpemVfdCBoZWFkZXJTaXplID0gc2l6ZW9mKGV4cGVjdGVkU2l6ZSkgKyBzaXplb2YocHNzaElkZW50aWZpZXIpICsgc2l6ZW9mKHBzc2hWZXJzaW9uMSkgKworICAgICAgICAgICAgICAgICAgICAgICAga1N5c3RlbUlkU2l6ZSArIHNpemVvZihrZXlJZENvdW50KTsKKyAgICBpZiAoaW5pdERhdGEuc2l6ZSgpIDwgaGVhZGVyU2l6ZSkgeworICAgICAgICByZXR1cm4gY2xlYXJrZXlkcm06OkVSUk9SX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgc2l6ZSBmaWVsZAorICAgIGV4cGVjdGVkU2l6ZSA9IGh0b25sKGV4cGVjdGVkU2l6ZSk7CisgICAgaWYgKG1lbWNtcCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSwgJmV4cGVjdGVkU2l6ZSwgc2l6ZW9mKGV4cGVjdGVkU2l6ZSkpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKGV4cGVjdGVkU2l6ZSk7CisKKyAgICAvLyBWYWxpZGF0ZSBQU1NIIGJveCBpZGVudGlmaWVyCisgICAgaWYgKG1lbWNtcCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSwgcHNzaElkZW50aWZpZXIsIHNpemVvZihwc3NoSWRlbnRpZmllcikpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKHBzc2hJZGVudGlmaWVyKTsKKworICAgIC8vIFZhbGlkYXRlIEVNRSB2ZXJzaW9uIG51bWJlcgorICAgIGlmIChtZW1jbXAoJmluaXREYXRhW3JlYWRQb3NpdGlvbl0sIHBzc2hWZXJzaW9uMSwgc2l6ZW9mKHBzc2hWZXJzaW9uMSkpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKHBzc2hWZXJzaW9uMSk7CisKKyAgICAvLyBWYWxpZGF0ZSBzeXN0ZW0gSUQKKyAgICBpZiAoIWlzQ2xlYXJLZXlVVUlEKCZpbml0RGF0YVtyZWFkUG9zaXRpb25dKSkgeworICAgICAgICByZXR1cm4gY2xlYXJrZXlkcm06OkVSUk9SX0NBTk5PVF9IQU5ETEU7CisgICAgfQorICAgIHJlYWRQb3NpdGlvbiArPSBrU3lzdGVtSWRTaXplOworCisgICAgLy8gUmVhZCBrZXkgSUQgY291bnQKKyAgICBtZW1jcHkoJmtleUlkQ291bnQsICZpbml0RGF0YVtyZWFkUG9zaXRpb25dLCBzaXplb2Yoa2V5SWRDb3VudCkpOworICAgIGtleUlkQ291bnQgPSBudG9obChrZXlJZENvdW50KTsKKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKGtleUlkQ291bnQpOworCisgICAgdWludDY0X3QgcHNzaFNpemUgPSAwOworICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KGtleUlkQ291bnQsIGtLZXlJZFNpemUsICZwc3NoU2l6ZSkgfHwKKyAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhyZWFkUG9zaXRpb24sIHBzc2hTaXplLCAmcHNzaFNpemUpIHx8CisgICAgICAgIHBzc2hTaXplICE9IGluaXREYXRhLnNpemUoKSAtIHNpemVvZih1aW50MzJfdCkgLyogRGF0YVNpemUoMCkgKi8pIHsKKyAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSB0aGUga2V5IElEIG9mZnNldHMKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga2V5SWRDb3VudDsgKytpKSB7CisgICAgICAgIHNpemVfdCBrZXlJZFBvc2l0aW9uID0gcmVhZFBvc2l0aW9uICsgKGkgKiBrS2V5SWRTaXplKTsKKyAgICAgICAga2V5SWRzLT5wdXNoX2JhY2soJmluaXREYXRhW2tleUlkUG9zaXRpb25dKTsKKyAgICB9CisgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpPSzsKK30KKworc3RkOjpzdHJpbmcgSW5pdERhdGFQYXJzZXI6OmdlbmVyYXRlUmVxdWVzdChDZG1LZXlUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiYga2V5SWRzKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga1JlcXVlc3RQcmVmaXgoIntcImtpZHNcIjpbIik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga1RlbXBvcmFyeVNlc3Npb24oIl0sXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIn0iKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrUGVyc2lzdGVudFNlc3Npb24oIl0sXCJ0eXBlXCI6XCJwZXJzaXN0ZW50LWxpY2Vuc2VcIn0iKTsKKworICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3Qoa1JlcXVlc3RQcmVmaXgpOworICAgIHN0ZDo6c3RyaW5nIGVuY29kZWRJZDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleUlkcy5zaXplKCk7ICsraSkgeworICAgICAgICBlbmNvZGVkSWQuY2xlYXIoKTsKKyAgICAgICAgZW5jb2RlQmFzZTY0VXJsKGtleUlkc1tpXSwga0tleUlkU2l6ZSwgJmVuY29kZWRJZCk7CisgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIsIik7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5wdXNoX2JhY2soJ1wiJyk7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKGVuY29kZWRJZCk7CisgICAgICAgIHJlcXVlc3QucHVzaF9iYWNrKCdcIicpOworICAgIH0KKyAgICBpZiAoa2V5VHlwZSA9PSBjbGVhcmtleWRybTo6S0VZX1RZUEVfU1RSRUFNSU5HKSB7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKGtUZW1wb3JhcnlTZXNzaW9uKTsKKyAgICB9IGVsc2UgaWYgKGtleVR5cGUgPT0gY2xlYXJrZXlkcm06OktFWV9UWVBFX09GRkxJTkUgfHwKKyAgICAgICAgICAgICAgIGtleVR5cGUgPT0gY2xlYXJrZXlkcm06OktFWV9UWVBFX1JFTEVBU0UpIHsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoa1BlcnNpc3RlbnRTZXNzaW9uKTsKKyAgICB9CisKKyAgICAvLyBBbmRyb2lkJ3MgQmFzZTY0IGVuY29kZXIgcHJvZHVjZXMgcGFkZGluZy4gRU1FIGZvcmJpZHMgcGFkZGluZy4KKyAgICBjb25zdCBjaGFyIGtCYXNlNjRQYWRkaW5nID0gJz0nOworICAgIHJlcXVlc3QuZXJhc2Uoc3RkOjpyZW1vdmUocmVxdWVzdC5iZWdpbigpLCByZXF1ZXN0LmVuZCgpLCBrQmFzZTY0UGFkZGluZyksIHJlcXVlc3QuZW5kKCkpOworCisgICAgcmV0dXJuIHJlcXVlc3Q7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0pzb25XZWJLZXkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0pzb25XZWJLZXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYmM1OTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vSnNvbldlYktleS5jcHAKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJjbGVhcmtleS1Kc29uV2ViS2V5IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJKc29uV2ViS2V5LmgiCisKKyNpbmNsdWRlICJCYXNlNjQuaCIKKworbmFtZXNwYWNlIHsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtCYXNlNjRQYWRkaW5nKCI9Iik7Citjb25zdCBzdGQ6OnN0cmluZyBrS2V5c1RhZygia2V5cyIpOworY29uc3Qgc3RkOjpzdHJpbmcga0tleVR5cGVUYWcoImt0eSIpOworY29uc3Qgc3RkOjpzdHJpbmcga0tleVRhZygiayIpOworY29uc3Qgc3RkOjpzdHJpbmcga0tleUlkVGFnKCJraWQiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtNZWRpYVNlc3Npb25UeXBlKCJ0eXBlIik7Citjb25zdCBzdGQ6OnN0cmluZyBrUGVyc2lzdGVudExpY2Vuc2VTZXNzaW9uKCJwZXJzaXN0ZW50LWxpY2Vuc2UiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtTeW1tZXRyaWNLZXlWYWx1ZSgib2N0Iik7Citjb25zdCBzdGQ6OnN0cmluZyBrVGVtcG9yYXJ5TGljZW5zZVNlc3Npb24oInRlbXBvcmFyeSIpOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK0pzb25XZWJLZXk6Okpzb25XZWJLZXkoKSB7fQorCitKc29uV2ViS2V5Ojp+SnNvbldlYktleSgpIHt9CisKKy8qCisgKiBQYXJzZXMgYSBKU09OIFdlYiBLZXkgU2V0IHN0cmluZywgaW5pdGlhbGl6ZXMgYSBLZXlNYXAgd2l0aCBrZXkgaWQ6a2V5CisgKiBwYWlycyBmcm9tIHRoZSBKU09OIFdlYiBLZXkgU2V0LiBCb3RoIGtleSBpZHMgYW5kIGtleXMgYXJlIGJhc2U2NHVybAorICogZW5jb2RlZC4gVGhlIEtleU1hcCBjb250YWlucyBiYXNlNjR1cmwgZGVjb2RlZCBrZXkgaWQ6a2V5IHBhaXJzLgorICoKKyAqIEByZXR1cm4gUmV0dXJucyBmYWxzZSBmb3IgZXJyb3JzLCB0cnVlIGZvciBzdWNjZXNzLgorICovCitib29sIEpzb25XZWJLZXk6OmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25XZWJLZXlTZXQsIEtleU1hcCoga2V5cykgeworICAgIGtleXMtPmNsZWFyKCk7CisKKyAgICBpZiAoIXBhcnNlSnNvbldlYktleVNldChqc29uV2ViS2V5U2V0LCAmbUpzb25PYmplY3RzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gbUpzb25PYmplY3RzWzBdIGNvbnRhaW5zIHRoZSBlbnRpcmUgSlNPTiBXZWIgS2V5IFNldCwgaW5jbHVkaW5nCisgICAgLy8gYWxsIHRoZSBiYXNlNjQgZW5jb2RlZCBrZXlzLiBFYWNoIGtleSBpcyBhbHNvIHN0b3JlZCBzZXBhcmF0ZWx5IGFzCisgICAgLy8gYSBKU09OIG9iamVjdCBpbiBtSnNvbk9iamVjdHNbMS4ubl0gd2hlcmUgbiBpcyB0aGUgdG90YWwKKyAgICAvLyBudW1iZXIgb2Yga2V5cyBpbiB0aGUgc2V0LgorICAgIGlmIChtSnNvbk9iamVjdHMuc2l6ZSgpID09IDAgfHwgIWlzSnNvbldlYktleVNldChtSnNvbk9iamVjdHNbMF0pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBlbmNvZGVkS2V5LCBlbmNvZGVkS2V5SWQ7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGVjb2RlZEtleSwgZGVjb2RlZEtleUlkOworCisgICAgLy8gbUpzb25PYmplY3RzWzFdIGNvbnRhaW5zIHRoZSBmaXJzdCBKU09OIFdlYiBLZXkgaW4gdGhlIHNldAorICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbUpzb25PYmplY3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGVuY29kZWRLZXlJZC5jbGVhcigpOworICAgICAgICBlbmNvZGVkS2V5LmNsZWFyKCk7CisKKyAgICAgICAgaWYgKCFwYXJzZUpzb25PYmplY3QobUpzb25PYmplY3RzW2ldLCAmbVRva2VucykpIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoZmluZEtleShtSnNvbk9iamVjdHNbaV0sICZlbmNvZGVkS2V5SWQsICZlbmNvZGVkS2V5KSkgeworICAgICAgICAgICAgaWYgKGVuY29kZWRLZXlJZC5lbXB0eSgpIHx8IGVuY29kZWRLZXkuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNdXN0IGhhdmUgYm90aCBrZXkgaWQgYW5kIGtleSBpbiB0aGUgSnNvbldlYktleSBzZXQuIik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZGVjb2RlQmFzZTY0U3RyaW5nKGVuY29kZWRLZXlJZCwgJmRlY29kZWRLZXlJZCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSBrZXkgaWQoJXMpIiwgZW5jb2RlZEtleUlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWRlY29kZUJhc2U2NFN0cmluZyhlbmNvZGVkS2V5LCAmZGVjb2RlZEtleSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSBrZXkoJXMpIiwgZW5jb2RlZEtleS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAga2V5cy0+aW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3RkOjp2ZWN0b3I8dWludDhfdD4+KGRlY29kZWRLZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkS2V5KSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSnNvbldlYktleTo6ZGVjb2RlQmFzZTY0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmNvZGVkVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBkZWNvZGVkVGV4dCkgeworICAgIGRlY29kZWRUZXh0LT5jbGVhcigpOworCisgICAgLy8gZW5jb2RlZFRleHQgc2hvdWxkIG5vdCBjb250YWluIHBhZGRpbmcgY2hhcmFjdGVycyBhcyBwZXIgRU1FIHNwZWMuCisgICAgaWYgKGVuY29kZWRUZXh0LmZpbmQoa0Jhc2U2NFBhZGRpbmcpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTaW5jZSBkZWNvZGVCYXNlNjQoKSByZXF1aXJlcyBwYWRkaW5nIGNoYXJhY3RlcnMsCisgICAgLy8gYWRkIHRoZW0gc28gbGVuZ3RoIG9mIGVuY29kZWRUZXh0IGlzIGV4YWN0bHkgYSBtdWx0aXBsZSBvZiA0LgorICAgIGludCByZW1haW5kZXIgPSBlbmNvZGVkVGV4dC5sZW5ndGgoKSAlIDQ7CisgICAgc3RkOjpzdHJpbmcgcGFkZGVkVGV4dChlbmNvZGVkVGV4dCk7CisgICAgaWYgKHJlbWFpbmRlciA+IDApIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0IC0gcmVtYWluZGVyOyArK2kpIHsKKyAgICAgICAgICAgIHBhZGRlZFRleHQuYXBwZW5kKGtCYXNlNjRQYWRkaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIDo6YW5kcm9pZDo6c3A8QnVmZmVyPiBidWZmZXIgPSBkZWNvZGVCYXNlNjQocGFkZGVkVGV4dCk7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJNYWxmb3JtZWQgYmFzZTY0IGVuY29kZWQgY29udGVudCBmb3VuZC4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRlY29kZWRUZXh0LT5pbnNlcnQoZGVjb2RlZFRleHQtPmVuZCgpLCBidWZmZXItPmJhc2UoKSwgYnVmZmVyLT5iYXNlKCkgKyBidWZmZXItPnNpemUoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSnNvbldlYktleTo6ZmluZEtleShjb25zdCBzdGQ6OnN0cmluZyYganNvbk9iamVjdCwgc3RkOjpzdHJpbmcqIGtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlbmNvZGVkS2V5KSB7CisgICAgc3RkOjpzdHJpbmcga2V5LCB2YWx1ZTsKKworICAgIC8vIE9ubHkgYWxsb3cgc3ltbWV0cmljIGtleSwgaS5lLiAia3R5Ijoib2N0IiBwYWlyLgorICAgIGlmIChqc29uT2JqZWN0LmZpbmQoa0tleVR5cGVUYWcpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGZpbmRWYWx1ZShrS2V5VHlwZVRhZywgJnZhbHVlKTsKKyAgICAgICAgaWYgKDAgIT0gdmFsdWUuY29tcGFyZShrU3ltbWV0cmljS2V5VmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGpzb25PYmplY3QuZmluZChrS2V5SWRUYWcpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGZpbmRWYWx1ZShrS2V5SWRUYWcsIGtleUlkKTsKKyAgICB9CisKKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlUYWcpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGZpbmRWYWx1ZShrS2V5VGFnLCBlbmNvZGVkS2V5KTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSnNvbldlYktleTo6ZmluZFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiB2YWx1ZSkgeworICAgIHZhbHVlLT5jbGVhcigpOworICAgIGNvbnN0IGNoYXIqIHZhbHVlVG9rZW47CisgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG5leHRUb2tlbiA9IG1Ub2tlbnMuYmVnaW4oKTsKKyAgICAgICAgIG5leHRUb2tlbiAhPSBtVG9rZW5zLmVuZCgpOyArK25leHRUb2tlbikgeworICAgICAgICBpZiAoMCA9PSAoKm5leHRUb2tlbikuY29tcGFyZShrZXkpKSB7CisgICAgICAgICAgICBpZiAobmV4dFRva2VuICsgMSA9PSBtVG9rZW5zLmVuZCgpKSBicmVhazsKKyAgICAgICAgICAgIHZhbHVlVG9rZW4gPSAoKihuZXh0VG9rZW4gKyAxKSkuY19zdHIoKTsKKyAgICAgICAgICAgIHZhbHVlLT5hc3NpZ24odmFsdWVUb2tlbik7CisgICAgICAgICAgICBuZXh0VG9rZW4rKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIEpzb25XZWJLZXk6OmlzSnNvbldlYktleVNldChjb25zdCBzdGQ6OnN0cmluZyYganNvbk9iamVjdCkgY29uc3QgeworICAgIGlmIChqc29uT2JqZWN0LmZpbmQoa0tleXNUYWcpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJKU09OIFdlYiBLZXkgZG9lcyBub3QgY29udGFpbiBrZXlzLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogUGFyc2VzIGEgSlNPTiBvYmplY3RzIHN0cmluZyBhbmQgaW5pdGlhbGl6ZXMgYSB2ZWN0b3Igb2YgdG9rZW5zLgorICoKKyAqIEByZXR1cm4gUmV0dXJucyBmYWxzZSBmb3IgZXJyb3JzLCB0cnVlIGZvciBzdWNjZXNzLgorICovCitib29sIEpzb25XZWJLZXk6OnBhcnNlSnNvbk9iamVjdChjb25zdCBzdGQ6OnN0cmluZyYganNvbk9iamVjdCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiB0b2tlbnMpIHsKKyAgICBqc21uX3BhcnNlciBwYXJzZXI7CisKKyAgICBqc21uX2luaXQoJnBhcnNlcik7CisgICAgaW50IG51bVRva2VucyA9IGpzbW5fcGFyc2UoJnBhcnNlciwganNvbk9iamVjdC5jX3N0cigpLCBqc29uT2JqZWN0LnNpemUoKSwgbnVsbHB0ciwgMCk7CisgICAgaWYgKG51bVRva2VucyA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBhcnNlciByZXR1cm5zIGVycm9yIGNvZGU9JWQiLCBudW1Ub2tlbnMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgaW50IGpzbW5Ub2tlbnNTaXplID0gbnVtVG9rZW5zICogc2l6ZW9mKGpzbW50b2tfdCk7CisgICAgbUpzbW5Ub2tlbnMuY2xlYXIoKTsKKyAgICBtSnNtblRva2Vucy5yZXNpemUoanNtblRva2Vuc1NpemUpOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBzdGF0dXMgPSBqc21uX3BhcnNlKCZwYXJzZXIsIGpzb25PYmplY3QuY19zdHIoKSwganNvbk9iamVjdC5zaXplKCksIG1Kc21uVG9rZW5zLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Ub2tlbnMpOworICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgIEFMT0dFKCJQYXJzZXIgcmV0dXJucyBlcnJvciBjb2RlPSVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRva2Vucy0+Y2xlYXIoKTsKKyAgICBzdGQ6OnN0cmluZyB0b2tlbjsKKyAgICBjb25zdCBjaGFyKiBwanM7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1Ub2tlbnM7ICsraikgeworICAgICAgICBwanMgPSBqc29uT2JqZWN0LmNfc3RyKCkgKyBtSnNtblRva2Vuc1tqXS5zdGFydDsKKyAgICAgICAgaWYgKG1Kc21uVG9rZW5zW2pdLnR5cGUgPT0gSlNNTl9TVFJJTkcgfHwgbUpzbW5Ub2tlbnNbal0udHlwZSA9PSBKU01OX1BSSU1JVElWRSkgeworICAgICAgICAgICAgdG9rZW4uYXNzaWduKHBqcywgbUpzbW5Ub2tlbnNbal0uZW5kIC0gbUpzbW5Ub2tlbnNbal0uc3RhcnQpOworICAgICAgICAgICAgdG9rZW5zLT5wdXNoX2JhY2sodG9rZW4pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogUGFyc2VzIEpTT04gV2ViIEtleSBTZXQgc3RyaW5nIGFuZCBpbml0aWFsaXplcyBhIHZlY3RvciBvZiBKU09OIG9iamVjdHMuCisgKgorICogQHJldHVybiBSZXR1cm5zIGZhbHNlIGZvciBlcnJvcnMsIHRydWUgZm9yIHN1Y2Nlc3MuCisgKi8KK2Jvb2wgSnNvbldlYktleTo6cGFyc2VKc29uV2ViS2V5U2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uV2ViS2V5U2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBqc29uT2JqZWN0cykgeworICAgIGlmIChqc29uV2ViS2V5U2V0LmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIkVtcHR5IEpTT04gV2ViIEtleSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVGhlIGpzbW4gcGFyc2VyIG9ubHkgc3VwcG9ydHMgdW5pY29kZSBlbmNvZGluZy4KKyAgICBqc21uX3BhcnNlciBwYXJzZXI7CisKKyAgICAvLyBDb21wdXRlcyBudW1iZXIgb2YgdG9rZW5zLiBBIHRva2VuIG1hcmtzIHRoZSB0eXBlLCBvZmZzZXQgaW4KKyAgICAvLyB0aGUgb3JpZ2luYWwgc3RyaW5nLgorICAgIGpzbW5faW5pdCgmcGFyc2VyKTsKKyAgICBpbnQgbnVtVG9rZW5zID0ganNtbl9wYXJzZSgmcGFyc2VyLCBqc29uV2ViS2V5U2V0LmNfc3RyKCksIGpzb25XZWJLZXlTZXQuc2l6ZSgpLCBudWxscHRyLCAwKTsKKyAgICBpZiAobnVtVG9rZW5zIDwgMCkgeworICAgICAgICBBTE9HRSgiUGFyc2VyIHJldHVybnMgZXJyb3IgY29kZT0lZCIsIG51bVRva2Vucyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBpbnQganNtblRva2Vuc1NpemUgPSBudW1Ub2tlbnMgKiBzaXplb2YoanNtbnRva190KTsKKyAgICBtSnNtblRva2Vucy5yZXNpemUoanNtblRva2Vuc1NpemUpOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBzdGF0dXMgPSBqc21uX3BhcnNlKCZwYXJzZXIsIGpzb25XZWJLZXlTZXQuY19zdHIoKSwganNvbldlYktleVNldC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUpzbW5Ub2tlbnMuZGF0YSgpLCBudW1Ub2tlbnMpOworICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgIEFMT0dFKCJQYXJzZXIgcmV0dXJucyBlcnJvciBjb2RlPSVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHRva2VuOworICAgIGNvbnN0IGNoYXIqIHBqczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRva2VuczsgKytpKSB7CisgICAgICAgIHBqcyA9IGpzb25XZWJLZXlTZXQuY19zdHIoKSArIG1Kc21uVG9rZW5zW2ldLnN0YXJ0OworICAgICAgICBpZiAobUpzbW5Ub2tlbnNbaV0udHlwZSA9PSBKU01OX09CSkVDVCkgeworICAgICAgICAgICAgdG9rZW4uYXNzaWduKHBqcywgbUpzbW5Ub2tlbnNbaV0uZW5kIC0gbUpzbW5Ub2tlbnNbaV0uc3RhcnQpOworICAgICAgICAgICAganNvbk9iamVjdHMtPnB1c2hfYmFjayh0b2tlbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL01lbW9yeUZpbGVTeXN0ZW0uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL01lbW9yeUZpbGVTeXN0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNDU0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vTWVtb3J5RmlsZVN5c3RlbS5jcHAKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIk1lbW9yeUZpbGVTeXN0ZW0uaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworc3RkOjpzdHJpbmcgTWVtb3J5RmlsZVN5c3RlbTo6R2V0RmlsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKKyAgICBzaXplX3QgaW5kZXggPSBwYXRoLmZpbmRfbGFzdF9vZignLycpOworICAgIGlmIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICByZXR1cm4gcGF0aC5zdWJzdHIoaW5kZXggKyAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9Cit9CisKK2Jvb2wgTWVtb3J5RmlsZVN5c3RlbTo6RmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoZmlsZU5hbWUpOworICAgIHJldHVybiByZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCk7Cit9CisKK3NzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6R2V0RmlsZVNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXN1bHQtPnNlY29uZC5nZXRGaWxlU2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBzaXplIGZvciAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTWVtb3J5RmlsZVN5c3RlbTo6TGlzdEZpbGVzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaXN0OworICAgIGZvciAoY29uc3QgYXV0byYgZmlsZW5hbWUgOiBtTWVtb3J5RmlsZVN5c3RlbSkgeworICAgICAgICBsaXN0LnB1c2hfYmFjayhmaWxlbmFtZS5maXJzdCk7CisgICAgfQorICAgIHJldHVybiBsaXN0OworfQorCitzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6UmVhZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGJ1ZmZlcikgeworICAgIHN0ZDo6c3RyaW5nIGtleSA9IEdldEZpbGVOYW1lKHBhdGgpOworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChrZXkpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEhhc2hGaWxlID0gcmVzdWx0LT5zZWNvbmQuZ2V0Q29udGVudCgpOworICAgICAgICBidWZmZXItPmFzc2lnbihzZXJpYWxpemVkSGFzaEZpbGUpOworICAgICAgICByZXR1cm4gYnVmZmVyLT5zaXplKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGZyb20gJXMiLCBwYXRoLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6V3JpdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpIHsKKyAgICBzdGQ6OnN0cmluZyBrZXkgPSBHZXRGaWxlTmFtZShwYXRoKTsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoa2V5KTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIG1NZW1vcnlGaWxlU3lzdGVtLmVyYXNlKGtleSk7CisgICAgfQorICAgIG1NZW1vcnlGaWxlU3lzdGVtLmluc2VydChzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIE1lbW9yeUZpbGU+KGtleSwgbWVtb3J5RmlsZSkpOworICAgIHJldHVybiBtZW1vcnlGaWxlLmdldEZpbGVTaXplKCk7Cit9CisKK2Jvb2wgTWVtb3J5RmlsZVN5c3RlbTo6UmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIHsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoZmlsZU5hbWUpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgbU1lbW9yeUZpbGVTeXN0ZW0uZXJhc2UocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBmaW5kIGxpY2Vuc2UgdG8gcmVtb3ZlOiAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIE1lbW9yeUZpbGVTeXN0ZW06OlJlbW92ZUFsbEZpbGVzKCkgeworICAgIG1NZW1vcnlGaWxlU3lzdGVtLmNsZWFyKCk7CisgICAgcmV0dXJuIG1NZW1vcnlGaWxlU3lzdGVtLmVtcHR5KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1Nlc3Npb24uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1Nlc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZmQxM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vU2Vzc2lvbi5jcHAKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgImNsZWFya2V5LVNlc3Npb24iCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlNlc3Npb24uaCIKKworI2luY2x1ZGUgIkFlc0N0ckRlY3J5cHRvci5oIgorI2luY2x1ZGUgIkluaXREYXRhUGFyc2VyLmgiCisjaW5jbHVkZSAiSnNvbldlYktleS5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4OwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworQ2RtUmVzcG9uc2VUeXBlIFNlc3Npb246OmdldEtleVJlcXVlc3QoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2RtS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGtleVJlcXVlc3QpIGNvbnN0IHsKKyAgICBJbml0RGF0YVBhcnNlciBwYXJzZXI7CisgICAgcmV0dXJuIHBhcnNlci5wYXJzZShpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIGtleVJlcXVlc3QpOworfQorCitDZG1SZXNwb25zZVR5cGUgU2Vzc2lvbjo6cHJvdmlkZUtleVJlc3BvbnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSkgeworICAgIHN0ZDo6c3RyaW5nIHJlc3BvbnNlU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlc3BvbnNlLmRhdGEoKSksIHJlc3BvbnNlLnNpemUoKSk7CisgICAgS2V5TWFwIGtleXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTWFwTG9jayk7CisgICAgSnNvbldlYktleSBwYXJzZXI7CisgICAgaWYgKHBhcnNlci5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KHJlc3BvbnNlU3RyaW5nLCAma2V5cykpIHsKKyAgICAgICAgZm9yIChhdXRvJiBrZXkgOiBrZXlzKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaXJzdChrZXkuZmlyc3QuYmVnaW4oKSwga2V5LmZpcnN0LmVuZCgpKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNlY29uZChrZXkuc2Vjb25kLmJlZ2luKCksIGtleS5zZWNvbmQuZW5kKCkpOworICAgICAgICAgICAgbUtleU1hcC5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3RkOjp2ZWN0b3I8dWludDhfdD4+KGtleS5maXJzdCwga2V5LnNlY29uZCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGVhcmtleWRybTo6T0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjpFUlJPUl9VTktOT1dOOworICAgIH0KK30KKworQ2RtUmVzcG9uc2VUeXBlIFNlc3Npb246OmRlY3J5cHQoY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjUHRyLCB1aW50OF90KiBkZXN0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGNsZWFyRGF0YUxlbmd0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgZW5jcnlwdGVkRGF0YUxlbmd0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOworCisgICAgaWYgKGdldE1vY2tFcnJvcigpICE9IGNsZWFya2V5ZHJtOjpPSykgeworICAgICAgICByZXR1cm4gZ2V0TW9ja0Vycm9yKCk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWRWZWN0b3I7CisgICAga2V5SWRWZWN0b3IuY2xlYXIoKTsKKyAgICBrZXlJZFZlY3Rvci5pbnNlcnQoa2V5SWRWZWN0b3IuZW5kKCksIGtleUlkLCBrZXlJZCArIGtCbG9ja1NpemUpOworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj46Oml0ZXJhdG9yIGl0cjsKKyAgICBpdHIgPSBtS2V5TWFwLmZpbmQoa2V5SWRWZWN0b3IpOworICAgIGlmIChpdHIgPT0gbUtleU1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gY2xlYXJrZXlkcm06OkVSUk9SX05PX0xJQ0VOU0U7CisgICAgfQorCisgICAgY2xlYXJrZXlkcm06OkFlc0N0ckRlY3J5cHRvciBkZWNyeXB0b3I7CisgICAgYXV0byBzdGF0dXMgPSBkZWNyeXB0b3IuZGVjcnlwdChpdHItPnNlY29uZCAvKmtleSovLCBpdiwgc3JjUHRyLCBkZXN0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJEYXRhTGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZERhdGFMZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNEZWNyeXB0ZWRPdXQpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1Nlc3Npb25MaWJyYXJ5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9TZXNzaW9uTGlicmFyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyZmYzOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9TZXNzaW9uTGlicmFyeS5jcHAKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgImNsZWFya2V5LVNlc3Npb25MaWJyYXJ5IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4OwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworTXV0ZXggU2Vzc2lvbkxpYnJhcnk6OnNTaW5nbGV0b25Mb2NrOworU2Vzc2lvbkxpYnJhcnkqIFNlc3Npb25MaWJyYXJ5OjpzU2luZ2xldG9uID0gTlVMTDsKKworU2Vzc2lvbkxpYnJhcnkqIFNlc3Npb25MaWJyYXJ5OjpnZXQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc1NpbmdsZXRvbkxvY2spOworCisgICAgaWYgKHNTaW5nbGV0b24gPT0gTlVMTCkgeworICAgICAgICBBTE9HRCgiSW5zdGFudGlhdGluZyBTZXNzaW9uIExpYnJhcnkgU2luZ2xldG9uLiIpOworICAgICAgICBzU2luZ2xldG9uID0gbmV3IFNlc3Npb25MaWJyYXJ5KCk7CisgICAgfQorCisgICAgcmV0dXJuIHNTaW5nbGV0b247Cit9CisKK3NwPFNlc3Npb24+IFNlc3Npb25MaWJyYXJ5OjpjcmVhdGVTZXNzaW9uKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spOworCisgICAgY2hhciBzZXNzaW9uSWRSYXdbMTZdOworICAgIHNucHJpbnRmKHNlc3Npb25JZFJhdywgc2l6ZW9mKHNlc3Npb25JZFJhdyksICIldSIsIG1OZXh0U2Vzc2lvbklkKTsKKworICAgIG1OZXh0U2Vzc2lvbklkICs9IDE7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgc2Vzc2lvbklkLmluc2VydChzZXNzaW9uSWQuZW5kKCksIHNlc3Npb25JZFJhdywKKyAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZFJhdyArIHNpemVvZihzZXNzaW9uSWRSYXcpIC8gc2l6ZW9mKHVpbnQ4X3QpKTsKKworICAgIG1TZXNzaW9ucy5pbnNlcnQoCisgICAgICAgICAgICBzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+PihzZXNzaW9uSWQsIG5ldyBTZXNzaW9uKHNlc3Npb25JZCkpKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4+OjppdGVyYXRvciBpdHIgPSBtU2Vzc2lvbnMuZmluZChzZXNzaW9uSWQpOworICAgIGlmIChpdHIgIT0gbVNlc3Npb25zLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdHItPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9Cit9CisKK3NwPFNlc3Npb24+IFNlc3Npb25MaWJyYXJ5OjpmaW5kU2Vzc2lvbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+Pjo6aXRlcmF0b3IgaXRyID0gbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKKyAgICBpZiAoaXRyICE9IG1TZXNzaW9ucy5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfQorCit2b2lkIFNlc3Npb25MaWJyYXJ5OjpkZXN0cm95U2Vzc2lvbihjb25zdCBzcDxTZXNzaW9uPiYgc2Vzc2lvbikgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spOworICAgIG1TZXNzaW9ucy5lcmFzZShzZXNzaW9uLT5zZXNzaW9uSWQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvQ2xlYXJLZXlVVUlELmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9DbGVhcktleVVVSUQuaAppbmRleCBmZTEwZmJhLi44OTExMDI0IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9DbGVhcktleVVVSUQuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9DbGVhcktleVVVSUQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEzLDkgKzEzLDcgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0KLSNpZm5kZWYgQ0xFQVJLRVlfVVVJRF9IXwotI2RlZmluZSBDTEVBUktFWV9VVUlEX0hfCisjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgPGNzdGRpbnQ+CkBAIC0yNyw2ICsyNSw0IEBACiAKIHN0ZDo6dmVjdG9yPHN0ZDo6YXJyYXk8dWludDhfdCwgMTY+PiBnZXRTdXBwb3J0ZWRDcnlwdG9TY2hlbWVzKCk7CiAKLX0gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCi0KLSNlbmRpZiAvLyBDTEVBUktFWV9VVUlEX0hfCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0Flc0N0ckRlY3J5cHRvci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vQWVzQ3RyRGVjcnlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmMzA5OAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0Flc0N0ckRlY3J5cHRvci5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjc3RkaW50PgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBBZXNDdHJEZWNyeXB0b3IgeworICBwdWJsaWM6CisgICAgQWVzQ3RyRGVjcnlwdG9yKCkge30KKworICAgIENkbVJlc3BvbnNlVHlwZSBkZWNyeXB0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBrZXksIGNvbnN0IEl2IGl2LCBjb25zdCB1aW50OF90KiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGNsZWFyRGF0YUxlbmd0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGVuY3J5cHRlZERhdGFMZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpOworCisgIHByaXZhdGU6CisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEFlc0N0ckRlY3J5cHRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9CYXNlNjQuaApzaW1pbGFyaXR5IGluZGV4IDY2JQpjb3B5IGZyb20gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUuYWlkbApjb3B5IHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0Jhc2U2NC5oCmluZGV4IGIwOGE2MDQuLjA3NWQyNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vQmFzZTY0LmgKQEAgLTEzLDE3ICsxMywxOCBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKyNwcmFnbWEgb25jZQogCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7CisjaW5jbHVkZSAiQnVmZmVyLmgiCiAKLS8qKgotICogQXVkaW8gZW5jYXBzdWxhdGlvbiB0eXBlIGlzIHVzZWQgdG8gZGVzY3JpYmUgaWYgdGhlIGF1ZGlvIGRhdGEgc2hvdWxkIGJlIHNlbnQgd2l0aCBhIHBhcnRpY3VsYXIKLSAqIGVuY2Fwc3VsYXRpb24gdHlwZSBvciBub3QuCi0gKgotICoge0BoaWRlfQotICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb0VuY2Fwc3VsYXRpb25UeXBlIHsKLSAgICBOT05FICAgICA9IDAsCi0gICAgSUVDNjE5MzcgPSAxLAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3N0cnVjdCBCdWZmZXI7CisKKzo6YW5kcm9pZDo6c3A8QnVmZmVyPiBkZWNvZGVCYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcmIHMpOworCit2b2lkIGVuY29kZUJhc2U2NChjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwgc3RkOjpzdHJpbmcqIG91dCk7CisKK3ZvaWQgZW5jb2RlQmFzZTY0VXJsKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLCBzdGQ6OnN0cmluZyogb3V0KTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9CdWZmZXIuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MWM0ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9CdWZmZXIuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworc3RydWN0IEJ1ZmZlciA6IHB1YmxpYyA6OmFuZHJvaWQ6OlJlZkJhc2UgeworICAgIGV4cGxpY2l0IEJ1ZmZlcihzaXplX3QgY2FwYWNpdHkpOworCisgICAgdWludDhfdCogYmFzZSgpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG1EYXRhKTsgfQorICAgIHVpbnQ4X3QqIGRhdGEoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihtRGF0YSkgKyBtUmFuZ2VPZmZzZXQ7IH0KKyAgICBzaXplX3QgY2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBtQ2FwYWNpdHk7IH0KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1SYW5nZUxlbmd0aDsgfQorICAgIHNpemVfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtUmFuZ2VPZmZzZXQ7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QnVmZmVyKCk7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkKiBtRGF0YTsKKyAgICBzaXplX3QgbUNhcGFjaXR5OworICAgIHNpemVfdCBtUmFuZ2VPZmZzZXQ7CisgICAgc2l6ZV90IG1SYW5nZUxlbmd0aDsKKworICAgIGJvb2wgbU93bnNEYXRhOworCisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJ1ZmZlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkYTM4OAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlbmRvcktleSgidmVuZG9yIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlbmRvclZhbHVlKCJHb29nbGUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVyc2lvbktleSgidmVyc2lvbiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZXJzaW9uVmFsdWUoIjEuMiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtQbHVnaW5EZXNjcmlwdGlvbktleSgiZGVzY3JpcHRpb24iKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUGx1Z2luRGVzY3JpcHRpb25WYWx1ZSgiQ2xlYXJLZXkgQ0RNIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FsZ29yaXRobXNLZXkoImFsZ29yaXRobXMiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWxnb3JpdGhtc1ZhbHVlKCIiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTGlzdGVuZXJUZXN0U3VwcG9ydEtleSgibGlzdGVuZXJUZXN0U3VwcG9ydCIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtMaXN0ZW5lclRlc3RTdXBwb3J0VmFsdWUoInRydWUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRHJtRXJyb3JUZXN0S2V5KCJkcm1FcnJvclRlc3QiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRHJtRXJyb3JUZXN0VmFsdWUoIiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtSZXNvdXJjZUNvbnRlbnRpb25WYWx1ZSgicmVzb3VyY2VDb250ZW50aW9uIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0xvc3RTdGF0ZVZhbHVlKCJsb3N0U3RhdGUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRnJhbWVUb29MYXJnZVZhbHVlKCJmcmFtZVRvb0xhcmdlIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0ludmFsaWRTdGF0ZVZhbHVlKCJpbnZhbGlkU3RhdGUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWlkbFZlcnNpb25LZXkoImFpZGxWZXJzaW9uIik7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRGV2aWNlSWRLZXkoImRldmljZUlkIik7CitzdGF0aWMgY29uc3QgdWludDhfdCBrVGVzdERldmljZUlkRGF0YVtdID0gezB4MCwgMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgsIDB4OSwgMHhhLCAweGIsIDB4YywgMHhkLCAweGUsIDB4Zn07CisKKy8vIHNldHRhYmxlIGJ5dGUgYXJyYXkgcHJvcGVydHkKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQ2xpZW50SWRLZXkoImNsaWVudElkIik7CisKKy8vIFRPRE8gc3R1YiBvdXQgbWV0cmljcyBmb3IgbncKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTWV0cmljc0tleSgibWV0cmljcyIpOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01ldHJpY3NEYXRhW10gPSB7MH07CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vQ2xlYXJLZXlUeXBlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vQ2xlYXJLZXlUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzk1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9DbGVhcktleVR5cGVzLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjb25zdCB1aW50OF90IGtCbG9ja1NpemUgPSAxNjsgIC8vIEFFU19CTE9DS19TSVpFOwordHlwZWRlZiB1aW50OF90IEtleUlkW2tCbG9ja1NpemVdOwordHlwZWRlZiB1aW50OF90IEl2W2tCbG9ja1NpemVdOworCit0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gS2V5TWFwOworCisjZGVmaW5lIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUeXBlTmFtZSkgXAorICAgIFR5cGVOYW1lKGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGU7ICAgICAgICAgICAgIFwKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBUeXBlTmFtZSYpID0gZGVsZXRlOworCisjZGVmaW5lIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl9BTkRfTkVXKFR5cGVOYW1lKSBcCisgICAgVHlwZU5hbWUoKSA9IGRlbGV0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVHlwZU5hbWUoY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsKKworZW51bSBDZG1SZXNwb25zZVR5cGUgOiBpbnQzMl90IHsKKyAgICBPSyA9IDAsCisgICAgRVJST1JfTk9fTElDRU5TRSA9IDEsCisgICAgRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVEID0gMywKKyAgICBFUlJPUl9DQU5OT1RfSEFORExFID0gNCwKKyAgICBFUlJPUl9JTlZBTElEX1NUQVRFID0gNSwKKyAgICBCQURfVkFMVUUgPSA2LAorICAgIEVSUk9SX0RFQ1JZUFQgPSAxMSwKKyAgICBFUlJPUl9VTktOT1dOID0gMTIsCisgICAgRVJST1JfSU5TVUZGSUNJRU5UX1NFQ1VSSVRZID0gMTMsCisgICAgRVJST1JfRlJBTUVfVE9PX0xBUkdFID0gMTQsCisgICAgRVJST1JfU0VTU0lPTl9MT1NUX1NUQVRFID0gMTUsCisgICAgRVJST1JfUkVTT1VSQ0VfQ09OVEVOVElPTiA9IDE2LAorfTsKKworZW51bSBDZG1LZXlUeXBlIDogaW50MzJfdCB7CisgICAgS0VZX1RZUEVfT0ZGTElORSA9IDAsCisgICAgS0VZX1RZUEVfU1RSRUFNSU5HID0gMSwKKyAgICBLRVlfVFlQRV9SRUxFQVNFID0gMiwKK307CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vRGV2aWNlRmlsZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0RldmljZUZpbGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5ODQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0RldmljZUZpbGVzLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorI2luY2x1ZGUgIk1lbW9yeUZpbGVTeXN0ZW0uaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKK2NsYXNzIE9mZmxpbmVGaWxlOworY2xhc3MgRGV2aWNlRmlsZXMgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAga0xpY2Vuc2VTdGF0ZVVua25vd24sCisgICAgICAgIGtMaWNlbnNlU3RhdGVBY3RpdmUsCisgICAgICAgIGtMaWNlbnNlU3RhdGVSZWxlYXNpbmcsCisgICAgfSBMaWNlbnNlU3RhdGU7CisKKyAgICBEZXZpY2VGaWxlcygpe307CisgICAgdmlydHVhbCB+RGV2aWNlRmlsZXMoKXt9OworCisgICAgdmlydHVhbCBib29sIFN0b3JlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQsIExpY2Vuc2VTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlSZXNwb25zZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgUmV0cmlldmVMaWNlbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc2V0X2lkLCBMaWNlbnNlU3RhdGUqIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG9mZmxpbmVMaWNlbnNlKTsKKworICAgIHZpcnR1YWwgYm9vbCBMaWNlbnNlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBMaXN0TGljZW5zZXMoKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBEZWxldGVMaWNlbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgRGVsZXRlQWxsTGljZW5zZXMoKTsKKworICBwcml2YXRlOgorICAgIGJvb2wgRmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgY29uc3Q7CisgICAgc3NpemVfdCBHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0OworICAgIGJvb2wgUmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpOworCisgICAgYm9vbCBSZXRyaWV2ZUhhc2hlZEZpbGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsCisgICAgICAgICAgICBPZmZsaW5lRmlsZSogZGVTZXJpYWxpemVkRmlsZSk7CisgICAgYm9vbCBTdG9yZUZpbGVSYXcoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpOworICAgIGJvb2wgU3RvcmVGaWxlV2l0aEhhc2goY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpOworCisgICAgTWVtb3J5RmlsZVN5c3RlbSBtRmlsZUhhbmRsZTsKKworICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEZXZpY2VGaWxlcyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0luaXREYXRhUGFyc2VyLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9Jbml0RGF0YVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlY2M4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9Jbml0RGF0YVBhcnNlci5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NsYXNzIEluaXREYXRhUGFyc2VyIHsKKyAgcHVibGljOgorICAgIEluaXREYXRhUGFyc2VyKCkge30KKworICAgIENkbVJlc3BvbnNlVHlwZSBwYXJzZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2RtS2V5VHlwZSBrZXlUeXBlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiogbGljZW5zZVJlcXVlc3QpOworCisgIHByaXZhdGU6CisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEluaXREYXRhUGFyc2VyKTsKKworICAgIENkbVJlc3BvbnNlVHlwZSBwYXJzZVBzc2goY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+KiBrZXlJZHMpOworCisgICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVSZXF1ZXN0KENkbUtleVR5cGUga2V5VHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9Kc29uV2ViS2V5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9Kc29uV2ViS2V5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4MTU1MwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL0pzb25XZWJLZXkuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImpzbW4uaCIKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NsYXNzIEpzb25XZWJLZXkgeworICBwdWJsaWM6CisgICAgSnNvbldlYktleSgpOworICAgIHZpcnR1YWwgfkpzb25XZWJLZXkoKTsKKworICAgIGJvb2wgZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChjb25zdCBzdGQ6OnN0cmluZyYganNvbldlYktleVNldCwgS2V5TWFwKiBrZXlzKTsKKworICBwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPGpzbW50b2tfdD4gbUpzbW5Ub2tlbnM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1Kc29uT2JqZWN0czsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVRva2VuczsKKworICAgIGJvb2wgZGVjb2RlQmFzZTY0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmNvZGVkVGV4dCwgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGRlY29kZWRUZXh0KTsKKyAgICBib29sIGZpbmRLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25PYmplY3QsIHN0ZDo6c3RyaW5nKiBrZXlJZCwgc3RkOjpzdHJpbmcqIGVuY29kZWRLZXkpOworICAgIHZvaWQgZmluZFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiB2YWx1ZSk7CisgICAgYm9vbCBpc0pzb25XZWJLZXlTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25PYmplY3QpIGNvbnN0OworICAgIGJvb2wgcGFyc2VKc29uT2JqZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uT2JqZWN0LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHRva2Vucyk7CisgICAgYm9vbCBwYXJzZUpzb25XZWJLZXlTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25XZWJLZXlTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBqc29uT2JqZWN0cyk7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oSnNvbldlYktleSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL01lbW9yeUZpbGVTeXN0ZW0uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL01lbW9yeUZpbGVTeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjQyYTBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vTWVtb3J5RmlsZVN5c3RlbS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCisvLyBVc2luZyBhbmRyb2lkIGZpbGUgc3lzdGVtIHJlcXVpcmVzIGNsZWFya2V5IHBsdWdpbiB0byB1cGRhdGUKKy8vIGl0cyBzZXBvbGljeS4gSG93ZXZlciwgd2UgYXJlIHVuYWJsZSB0byB1cGRhdGUgc2Vwb2xpY3kgZm9yCisvLyBvbGRlciB2ZW5kb3IgcGFydGl0aW9ucy4gVG8gcHJvdmlkZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LAorLy8gY2xlYXJrZXkgcGx1Z2luIGltcGxlbWVudHMgYSB2ZXJ5IHNpbXBsZSBmaWxlIHN5c3RlbSBpbiBtZW1vcnkuCisvLyBUaGlzIG1lbW9yeSBmaWxlIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCitjbGFzcyBNZW1vcnlGaWxlU3lzdGVtIHsKKyAgcHVibGljOgorICAgIHN0cnVjdCBNZW1vcnlGaWxlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZmlsZU5hbWU7ICAvLyBleGNsdWRlcyBwYXRoCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnQ7CisgICAgICAgIHNpemVfdCBmaWxlU2l6ZTsKKworICAgICAgICBzdGQ6OnN0cmluZyBnZXRDb250ZW50KCkgY29uc3QgeyByZXR1cm4gY29udGVudDsgfQorICAgICAgICBzaXplX3QgZ2V0RmlsZVNpemUoKSBjb25zdCB7IHJldHVybiBmaWxlU2l6ZTsgfQorICAgICAgICB2b2lkIHNldENvbnRlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUpIHsgY29udGVudCA9IGZpbGU7IH0KKyAgICAgICAgdm9pZCBzZXRGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeyBmaWxlTmFtZSA9IG5hbWU7IH0KKyAgICAgICAgdm9pZCBzZXRGaWxlU2l6ZShzaXplX3Qgc2l6ZSkgeworICAgICAgICAgICAgY29udGVudC5yZXNpemUoc2l6ZSk7CisgICAgICAgICAgICBmaWxlU2l6ZSA9IHNpemU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgTWVtb3J5RmlsZVN5c3RlbSgpe307CisgICAgdmlydHVhbCB+TWVtb3J5RmlsZVN5c3RlbSgpe307CisKKyAgICBib29sIEZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdDsKKyAgICBzc2l6ZV90IEdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3Q7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IExpc3RGaWxlcygpIGNvbnN0OworICAgIHNpemVfdCBSZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoTmFtZSwgc3RkOjpzdHJpbmcqIGJ1ZmZlcik7CisgICAgYm9vbCBSZW1vdmVBbGxGaWxlcygpOworICAgIGJvb2wgUmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpOworICAgIHNpemVfdCBXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aE5hbWUsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpOworCisgIHByaXZhdGU6CisgICAgLy8gTGljZW5zZSBmaWxlIG5hbWUgaXMgbWFkZSB1cCBvZiBhIHVuaXF1ZSBrZXlTZXRJZCwgdGhlcmVmb3JlLAorICAgIC8vIHRoZSBmaWxlbmFtZSBjYW4gYmUgdXNlZCBhcyB0aGUga2V5IHRvIGxvY2F0ZSBsaWNlbnNlcyBpbiB0aGUKKyAgICAvLyBtZW1vcnkgZmlsZSBzeXN0ZW0uCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIE1lbW9yeUZpbGU+IG1NZW1vcnlGaWxlU3lzdGVtOworCisgICAgc3RkOjpzdHJpbmcgR2V0RmlsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOworCisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1lbW9yeUZpbGVTeXN0ZW0pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vTWltZVR5cGVTdGRTdHIuaApzaW1pbGFyaXR5IGluZGV4IDYyJQpjb3B5IGZyb20gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUuYWlkbApjb3B5IHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL2NsZWFya2V5ZHJtL01pbWVUeXBlU3RkU3RyLmgKaW5kZXggYjA4YTYwNC4uZGVhMjk3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUuYWlkbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9NaW1lVHlwZVN0ZFN0ci5oCkBAIC0xMywxNyArMTMsMTUgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisjcHJhZ21hIG9uY2UKIAotcGFja2FnZSBhbmRyb2lkLm1lZGlhOworI2luY2x1ZGUgPHN0cmluZz4KIAotLyoqCi0gKiBBdWRpbyBlbmNhcHN1bGF0aW9uIHR5cGUgaXMgdXNlZCB0byBkZXNjcmliZSBpZiB0aGUgYXVkaW8gZGF0YSBzaG91bGQgYmUgc2VudCB3aXRoIGEgcGFydGljdWxhcgotICogZW5jYXBzdWxhdGlvbiB0eXBlIG9yIG5vdC4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvRW5jYXBzdWxhdGlvblR5cGUgewotICAgIE5PTkUgICAgID0gMCwKLSAgICBJRUM2MTkzNyA9IDEsCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorbmFtZXNwYWNlIHsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtDZW5jSW5pdERhdGFGb3JtYXQoImNlbmMiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtJc29CbWZmQXVkaW9NaW1lVHlwZSgiYXVkaW8vbXA0Iik7Citjb25zdCBzdGQ6OnN0cmluZyBrSXNvQm1mZlZpZGVvTWltZVR5cGUoInZpZGVvL21wNCIpOworY29uc3Qgc3RkOjpzdHJpbmcga1dlYm1Jbml0RGF0YUZvcm1hdCgid2VibSIpOworY29uc3Qgc3RkOjpzdHJpbmcga1dlYm1BdWRpb01pbWVUeXBlKCJhdWRpby93ZWJtIik7Citjb25zdCBzdGQ6OnN0cmluZyBrV2VibVZpZGVvTWltZVR5cGUoInZpZGVvL3dlYm0iKTsKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vU2Vzc2lvbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vU2Vzc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDRlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9TZXNzaW9uLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NsYXNzIFNlc3Npb24gOiBwdWJsaWMgOjphbmRyb2lkOjpSZWZCYXNlIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFNlc3Npb24oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkKKyAgICAgICAgOiBtU2Vzc2lvbklkKHNlc3Npb25JZCksIG1Nb2NrRXJyb3IoY2xlYXJrZXlkcm06Ok9LKSB7fQorICAgIHZpcnR1YWwgflNlc3Npb24oKSB7fQorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCgpIGNvbnN0IHsgcmV0dXJuIG1TZXNzaW9uSWQ7IH0KKworICAgIENkbVJlc3BvbnNlVHlwZSBnZXRLZXlSZXF1ZXN0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENkbUtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90Pioga2V5UmVxdWVzdCkgY29uc3Q7CisKKyAgICBDZG1SZXNwb25zZVR5cGUgcHJvdmlkZUtleVJlc3BvbnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSk7CisKKyAgICBDZG1SZXNwb25zZVR5cGUgZGVjcnlwdChjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsIGNvbnN0IHVpbnQ4X3QqIHNyY1B0ciwgdWludDhfdCogZHN0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBjbGVhckRhdGFMZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBlbmNyeXB0ZWREYXRhTGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KTsKKworICAgIHZvaWQgc2V0TW9ja0Vycm9yKENkbVJlc3BvbnNlVHlwZSBlcnJvcikgeyBtTW9ja0Vycm9yID0gZXJyb3I7IH0KKyAgICBDZG1SZXNwb25zZVR5cGUgZ2V0TW9ja0Vycm9yKCkgY29uc3QgeyByZXR1cm4gbU1vY2tFcnJvcjsgfQorCisgIHByaXZhdGU6CisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNlc3Npb24pOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDsKKyAgICBLZXlNYXAgbUtleU1hcDsKKyAgICA6OmFuZHJvaWQ6Ok11dGV4IG1NYXBMb2NrOworCisgICAgLy8gRm9yIG1vY2tpbmcgZXJyb3IgcmV0dXJuIHNjZW5hcmlvcworICAgIENkbVJlc3BvbnNlVHlwZSBtTW9ja0Vycm9yOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9jbGVhcmtleWRybS9TZXNzaW9uTGlicmFyeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vU2Vzc2lvbkxpYnJhcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2Q0YTIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvY2xlYXJrZXlkcm0vU2Vzc2lvbkxpYnJhcnkuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBTZXNzaW9uTGlicmFyeSB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgU2Vzc2lvbkxpYnJhcnkqIGdldCgpOworCisgICAgOjphbmRyb2lkOjpzcDxTZXNzaW9uPiBjcmVhdGVTZXNzaW9uKCk7CisKKyAgICA6OmFuZHJvaWQ6OnNwPFNlc3Npb24+IGZpbmRTZXNzaW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgICAgdm9pZCBkZXN0cm95U2Vzc2lvbihjb25zdCA6OmFuZHJvaWQ6OnNwPFNlc3Npb24+JiBzZXNzaW9uKTsKKworICAgIHNpemVfdCBudW1PcGVuU2Vzc2lvbnMoKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbnMuc2l6ZSgpOyB9CisKKyAgcHJpdmF0ZToKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2Vzc2lvbkxpYnJhcnkpOworCisgICAgU2Vzc2lvbkxpYnJhcnkoKSA6IG1OZXh0U2Vzc2lvbklkKDEpIHt9CisKKyAgICBzdGF0aWMgOjphbmRyb2lkOjpNdXRleCBzU2luZ2xldG9uTG9jazsKKyAgICBzdGF0aWMgU2Vzc2lvbkxpYnJhcnkqIHNTaW5nbGV0b247CisKKyAgICA6OmFuZHJvaWQ6Ok11dGV4IG1TZXNzaW9uc0xvY2s7CisgICAgdWludDMyX3QgbU5leHRTZXNzaW9uSWQ7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIDo6YW5kcm9pZDo6c3A8U2Vzc2lvbj4+IG1TZXNzaW9uczsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL3Byb3Rvcy9EZXZpY2VGaWxlcy5wcm90byBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5ODY1NgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8KQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBjbGVhcmtleWRybTsKKworLy8gbmVlZCB0aGlzIGlmIHdlIGFyZSB1c2luZyBsaWJwcm90b2J1Zi1jcHAtMi4zLjAtbGl0ZQorb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKKworbWVzc2FnZSBMaWNlbnNlIHsKKyAgZW51bSBMaWNlbnNlU3RhdGUgeworICAgIEFDVElWRSA9IDE7CisgICAgUkVMRUFTSU5HID0gMjsKKyAgfQorCisgIG9wdGlvbmFsIExpY2Vuc2VTdGF0ZSBzdGF0ZSA9IDE7CisgIG9wdGlvbmFsIGJ5dGVzIGxpY2Vuc2UgPSAyOworfQorCittZXNzYWdlIE9mZmxpbmVGaWxlIHsKKyAgZW51bSBGaWxlVHlwZSB7CisgICAgTElDRU5TRSA9IDE7CisgIH0KKworICBlbnVtIEZpbGVWZXJzaW9uIHsKKyAgICBWRVJTSU9OXzEgPSAxOworICB9CisKKyAgb3B0aW9uYWwgRmlsZVR5cGUgdHlwZSA9IDE7CisgIG9wdGlvbmFsIEZpbGVWZXJzaW9uIHZlcnNpb24gPSAyIFtkZWZhdWx0ID0gVkVSU0lPTl8xXTsKKyAgb3B0aW9uYWwgTGljZW5zZSBsaWNlbnNlID0gMzsKKworfQorCittZXNzYWdlIEhhc2hlZEZpbGUgeworICBvcHRpb25hbCBieXRlcyBmaWxlID0gMTsKKyAgLy8gQSByYXcgKG5vdCBoZXgtZW5jb2RlZCkgU0hBMjU2LCB0YWtlbiBvdmVyIHRoZSBieXRlcyBvZiAnZmlsZScuCisgIG9wdGlvbmFsIGJ5dGVzIGhhc2ggPSAyOworfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Ecm1QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Ecm1QbHVnaW4uY3BwCmluZGV4IDZhYzM1MTAuLjA4OWViMWMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvRHJtUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0RybVBsdWdpbi5jcHAKQEAgLTIwNyw2ICsyMDcsNyBAQAogICAgIH0KIAogICAgIGluZm9NYXAuY2xlYXIoKTsKKyAgICBhbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgbG9jayhtUGxheVBvbGljeUxvY2spOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXlQb2xpY3kuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaW5mb01hcC5hZGQobVBsYXlQb2xpY3kua2V5QXQoaSksIG1QbGF5UG9saWN5LnZhbHVlQXQoaSkpOwogICAgIH0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9Ecm1QbHVnaW4uaAppbmRleCBhYTliNTlkLi45NWYxNWNhIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvRHJtUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0RybVBsdWdpbi5oCkBAIC0yNjIsNyArMjYyLDcgQEAKICAgICB2b2lkIGluaXRQcm9wZXJ0aWVzKCk7CiAgICAgdm9pZCBzZXRQbGF5UG9saWN5KCk7CiAKLSAgICBhbmRyb2lkOjpNdXRleCBtUGxheVBvbGljeUxvY2s7CisgICAgbXV0YWJsZSBhbmRyb2lkOjpNdXRleCBtUGxheVBvbGljeUxvY2s7CiAgICAgYW5kcm9pZDo6S2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVBsYXlQb2xpY3k7CiAgICAgYW5kcm9pZDo6S2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVN0cmluZ1Byb3BlcnRpZXM7CiAgICAgYW5kcm9pZDo6S2V5ZWRWZWN0b3I8U3RyaW5nOCwgVmVjdG9yPHVpbnQ4X3Q+PiBtQnl0ZUFycmF5UHJvcGVydGllczsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icAppbmRleCA2YzY4NTMyLi5iODJkOTk2IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCkBAIC05Myw2ICs5MywxMSBAQAogICAgIHNyY3M6IFsicHJvdG9zL0RldmljZUZpbGVzLnByb3RvIl0sCiB9CiAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJjbGVhcmtleWhpZGwiLAorICAgIGRlZmF1bHRzOiBbImNsZWFya2V5X3NlcnZpY2VfZGVmYXVsdHMiXSwKK30KKwogY2NfYmluYXJ5IHsKICAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkiLAogICAgIGRlZmF1bHRzOiBbImNsZWFya2V5X3NlcnZpY2VfZGVmYXVsdHMiXSwKQEAgLTEyNiwzICsxMzEsMzcgQEAKICAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMiXSwKICAgICB2aW50Zl9mcmFnbWVudHM6IFsibWFuaWZlc3RfYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UuY2xlYXJrZXkueG1sIl0sCiB9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJjbGVhcmtleVYxLjRfZnV6emVyIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiZnV6emVyL2NsZWFya2V5VjEuNF9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJjbGVhcmtleWhpZGwiLAorICAgICAgICAibGliY2xlYXJrZXljb21tb24iLAorICAgICAgICAibGliY2xlYXJrZXlkZXZpY2VmaWxlcy1wcm90b3MiLAorICAgICAgICAibGlianNtbiIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNCIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwCmluZGV4IDA0ODU0YjEuLmUwNGRkN2UgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAKQEAgLTE4Nyw3ICsxODcsNyBAQAogICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwogICAgIH0KIAotICAgICpkZWZhdWx0VXJsID0gIiI7CisgICAgKmRlZmF1bHRVcmwgPSAiaHR0cHM6Ly9kZWZhdWx0LnVybCI7CiAgICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGVfVjFfMTo6VU5LTk9XTjsKICAgICAqcmVxdWVzdCA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KCk7CiAKQEAgLTIyMSw3ICsyMjEsNiBAQAogICAgICAgICBpZiAocmVxdWVzdFN0cmluZy5maW5kKGtPZmZsaW5lTGljZW5zZSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVtcHR5UmVzcG9uc2U7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBrZXlTZXRJZFN0cmluZyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRmlsZUhhbmRsZUxvY2spOwogICAgICAgICAgICAgaWYgKCFtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2Uoa2V5U2V0SWRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nLAogICAgICAgICAgICAgICAgICAgICBlbXB0eVJlc3BvbnNlKSkgewpAQCAtMzM3LDcgKzMzNiw2IEBACiAgICAgICAgIH0KICAgICAgICAgKmtleVNldElkID0ga0tleVNldElkUHJlZml4ICsgQnl0ZUFycmF5VG9IZXhTdHJpbmcoCiAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmFuZG9tRGF0YS5kYXRhKCkpLCByYW5kb21EYXRhLnNpemUoKSk7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GaWxlSGFuZGxlTG9jayk7CiAgICAgICAgIGlmIChtRmlsZUhhbmRsZS5MaWNlbnNlRXhpc3RzKCprZXlTZXRJZCkpIHsKICAgICAgICAgICAgIC8vIGNvbGxpc2lvbiwgcmVnZW5lcmF0ZQogICAgICAgICAgICAgQUxPR1YoIlJldHJ5IGdlbmVyYXRpbmcgS2V5U2V0SWQiKTsKQEAgLTM5NSw3ICszOTMsNiBAQAogICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewogICAgICAgICBpZiAoaXNPZmZsaW5lTGljZW5zZSkgewogICAgICAgICAgICAgaWYgKGlzUmVsZWFzZSkgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GaWxlSGFuZGxlTG9jayk7CiAgICAgICAgICAgICAgICAgbUZpbGVIYW5kbGUuRGVsZXRlTGljZW5zZShrZXlTZXRJZCk7CiAgICAgICAgICAgICAgICAgbVNlc3Npb25MaWJyYXJ5LT5kZXN0cm95U2Vzc2lvbihzZXNzaW9uKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00MDQsNyArNDAxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRmlsZUhhbmRsZUxvY2spOwogICAgICAgICAgICAgICAgIGJvb2wgb2sgPSBtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2UoCiAgICAgICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlQWN0aXZlLApAQCAtNDU5LDcgKzQ1NSw2IEBACiAgICAgICAgIERldmljZUZpbGVzOjpMaWNlbnNlU3RhdGUgbGljZW5zZVN0YXRlOwogICAgICAgICBzdGQ6OnN0cmluZyBvZmZsaW5lTGljZW5zZTsKICAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GaWxlSGFuZGxlTG9jayk7CiAgICAgICAgIGlmICghbUZpbGVIYW5kbGUuUmV0cmlldmVMaWNlbnNlKHN0ZDo6c3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKSwKICAgICAgICAgICAgICAgICAmbGljZW5zZVN0YXRlLCAmb2ZmbGluZUxpY2Vuc2UpKSB7CiAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlc3RvcmUgb2ZmbGluZSBsaWNlbnNlIik7CkBAIC01ODIsNyArNTc3LDYgQEAKIFJldHVybjx2b2lkPiBEcm1QbHVnaW46OnF1ZXJ5S2V5U3RhdHVzKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAogICAgICAgICBxdWVyeUtleVN0YXR1c19jYiBfaGlkbF9jYikgewotCiAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCkgewogICAgICAgICAvLyBSZXR1cm5zIGVtcHR5IGtleSBzdGF0dXMgS2V5VmFsdWUgcGFpcgogICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgaGlkbF92ZWM8S2V5VmFsdWU+KCkpOwpAQCAtNTkyLDEyICs1ODYsMTQgQEAKICAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gaW5mb01hcFZlYzsKICAgICBpbmZvTWFwVmVjLmNsZWFyKCk7CiAKKyAgICBtUGxheVBvbGljeUxvY2subG9jaygpOwogICAgIEtleVZhbHVlIGtleVZhbHVlUGFpcjsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5UG9saWN5LnNpemUoKTsgKytpKSB7CiAgICAgICAgIGtleVZhbHVlUGFpci5rZXkgPSBtUGxheVBvbGljeVtpXS5rZXk7CiAgICAgICAgIGtleVZhbHVlUGFpci52YWx1ZSA9IG1QbGF5UG9saWN5W2ldLnZhbHVlOwogICAgICAgICBpbmZvTWFwVmVjLnB1c2hfYmFjayhrZXlWYWx1ZVBhaXIpOwogICAgIH0KKyAgICBtUGxheVBvbGljeUxvY2sudW5sb2NrKCk7CiAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgdG9IaWRsVmVjKGluZm9NYXBWZWMpKTsKICAgICByZXR1cm4gVm9pZCgpOwogfQpAQCAtNzcwLDggKzc2Niw2IEBACiB9CiAKIFJldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzX2NiIF9oaWRsX2NiKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUZpbGVIYW5kbGVMb2NrKTsKLQogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaWNlbnNlTmFtZXMgPSBtRmlsZUhhbmRsZS5MaXN0TGljZW5zZXMoKTsKICAgICBzdGQ6OnZlY3RvcjxLZXlTZXRJZD4ga2V5U2V0SWRzOwogICAgIGlmIChtTW9ja0Vycm9yICE9IFN0YXR1c19WMV8yOjpPSykgewpAQCAtNzkyLDcgKzc4Niw2IEBACiAgICAgICAgIHJldHVybiB0b1N0YXR1c18xXzAobU1vY2tFcnJvcik7CiAgICAgfQogICAgIHN0ZDo6c3RyaW5nIGxpY2Vuc2VOYW1lKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRmlsZUhhbmRsZUxvY2spOwogICAgIGlmIChtRmlsZUhhbmRsZS5EZWxldGVMaWNlbnNlKGxpY2Vuc2VOYW1lKSkgewogICAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKICAgICB9CkBAIC04MDEsOCArNzk0LDYgQEAKIAogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShjb25zdCBLZXlTZXRJZCYga2V5U2V0SWQsCiAgICAgICAgIGdldE9mZmxpbmVMaWNlbnNlU3RhdGVfY2IgX2hpZGxfY2IpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRmlsZUhhbmRsZUxvY2spOwotCiAgICAgc3RkOjpzdHJpbmcgbGljZW5zZU5hbWUoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOwogICAgIERldmljZUZpbGVzOjpMaWNlbnNlU3RhdGUgc3RhdGU7CiAgICAgc3RkOjpzdHJpbmcgbGljZW5zZTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCmluZGV4IGU2MWRiM2YuLjU2OTEwYmUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcApAQCAtMjQsMTMgKzI0LDExIEBACiB9CiAKIGJvb2wgTWVtb3J5RmlsZVN5c3RlbTo6RmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWVtb3J5RmlsZVN5c3RlbUxvY2spOwogICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChmaWxlTmFtZSk7CiAgICAgcmV0dXJuIHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKTsKIH0KIAogc3NpemVfdCBNZW1vcnlGaWxlU3lzdGVtOjpHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWVtb3J5RmlsZVN5c3RlbUxvY2spOwogICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChmaWxlTmFtZSk7CiAgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgewogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3NpemVfdD4ocmVzdWx0LT5zZWNvbmQuZ2V0RmlsZVNpemUoKSk7CkBAIC00Miw3ICs0MCw2IEBACiAKIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBNZW1vcnlGaWxlU3lzdGVtOjpMaXN0RmlsZXMoKSBjb25zdCB7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpc3Q7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1lbW9yeUZpbGVTeXN0ZW1Mb2NrKTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGZpbGVuYW1lIDogbU1lbW9yeUZpbGVTeXN0ZW0pIHsKICAgICAgICAgbGlzdC5wdXNoX2JhY2soZmlsZW5hbWUuZmlyc3QpOwogICAgIH0KQEAgLTUxLDcgKzQ4LDYgQEAKIAogc2l6ZV90IE1lbW9yeUZpbGVTeXN0ZW06OlJlYWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBidWZmZXIpIHsKICAgICBzdGQ6OnN0cmluZyBrZXkgPSBHZXRGaWxlTmFtZShwYXRoKTsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWVtb3J5RmlsZVN5c3RlbUxvY2spOwogICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChrZXkpOwogICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKICAgICAgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEhhc2hGaWxlID0gcmVzdWx0LT5zZWNvbmQuZ2V0Q29udGVudCgpOwpAQCAtNjUsNyArNjEsNiBAQAogCiBzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6V3JpdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpIHsKICAgICBzdGQ6OnN0cmluZyBrZXkgPSBHZXRGaWxlTmFtZShwYXRoKTsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWVtb3J5RmlsZVN5c3RlbUxvY2spOwogICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChrZXkpOwogICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKICAgICAgICAgbU1lbW9yeUZpbGVTeXN0ZW0uZXJhc2Uoa2V5KTsKQEAgLTc1LDcgKzcwLDYgQEAKIH0KIAogYm9vbCBNZW1vcnlGaWxlU3lzdGVtOjpSZW1vdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NZW1vcnlGaWxlU3lzdGVtTG9jayk7CiAgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKICAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CiAgICAgICAgIG1NZW1vcnlGaWxlU3lzdGVtLmVyYXNlKHJlc3VsdCk7CkBAIC04Nyw3ICs4MSw2IEBACiB9CiAKIGJvb2wgTWVtb3J5RmlsZVN5c3RlbTo6UmVtb3ZlQWxsRmlsZXMoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1lbW9yeUZpbGVTeXN0ZW1Mb2NrKTsKICAgICBtTWVtb3J5RmlsZVN5c3RlbS5jbGVhcigpOwogICAgIHJldHVybiBtTWVtb3J5RmlsZVN5c3RlbS5lbXB0eSgpOwogfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCmluZGV4IDlhZmQzZDcuLmVjNDUxN2QgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKQEAgLTExLDQgKzExLDQgQEAKICAgICB1c2VyIG1lZGlhCiAgICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KICAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKyAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2gKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjCmluZGV4IGMxYWJlN2YuLjNiNDhjZjIgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYwpAQCAtMTAsNCArMTAsNCBAQAogICAgIHVzZXIgbWVkaWEKICAgICBncm91cCBtZWRpYSBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjMtc2VydmljZS1sYXp5LmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjMtc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCmluZGV4IDFlMGQ0MzEuLjZlNjQ5NzggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMy1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKQEAgLTEzLDQgKzEzLDQgQEAKICAgICB1c2VyIG1lZGlhCiAgICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KICAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKyAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2gKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zLXNlcnZpY2UuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMy1zZXJ2aWNlLmNsZWFya2V5LnJjCmluZGV4IDgxMzA1MTEuLmUzMDJlMWIgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zLXNlcnZpY2UuY2xlYXJrZXkucmMKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjMtc2VydmljZS5jbGVhcmtleS5yYwpAQCAtMTEsNCArMTEsNCBAQAogICAgIHVzZXIgbWVkaWEKICAgICBncm91cCBtZWRpYSBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS1sYXp5LmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCmluZGV4IDQ2YWJhODguLjg0YTYzYTEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKQEAgLTE1LDQgKzE1LDQgQEAKICAgICB1c2VyIG1lZGlhCiAgICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KICAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKyAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2gKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLmNsZWFya2V5LnJjCmluZGV4IDgxODY5MzMuLjY0OTU5OWUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UuY2xlYXJrZXkucmMKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS5jbGVhcmtleS5yYwpAQCAtMTMsNCArMTMsNCBAQAogICAgIHVzZXIgbWVkaWEKICAgICBncm91cCBtZWRpYSBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9mdXp6ZXIvUkVBRE1FLm1kIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDU0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw1MiBAQAorIyBGdXp6ZXIgZm9yIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLmNsZWFya2V5CisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS5jbGVhcmtleSBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK3NvdXJjZSBjb2RlIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLmNsZWFya2V5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIFNlY3VyaXR5IExldmVsIChwYXJhbWV0ZXIgbmFtZTogYHNlY3VyaXR5TGV2ZWxgKQorMi4gTWltZSBUeXBlIChwYXJhbWV0ZXIgbmFtZTogYG1pbWVUeXBlYCkKKzMuIEtleSBUeXBlIChwYXJhbWV0ZXIgbmFtZTogYGtleVR5cGVgKQorNC4gQ3J5cHRvIE1vZGUgKHBhcmFtZXRlciBuYW1lOiBgY3J5cHRvTW9kZWApCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgc2VjdXJpdHlMZXZlbGAgfCAwLmBTZWN1cml0eUxldmVsOjpVTktOT1dOYCAxLmBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPYCAyLmBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFYCAzLmBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPYCAgNC5gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0RFQ09ERWAgNS5gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0FMTGB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIGluIHRoZSByYW5nZSAwIHRvIDV8Cit8IGBtaW1lVHlwZWAgfCAwLmB2aWRlby9tcDRgIDEuYHZpZGVvL21wZWdgIDIuYHZpZGVvL3gtZmx2YCAzLmB2aWRlby9tajJgIDQuYHZpZGVvLzNncDJgIDUuYHZpZGVvLzNncHBgIDYuYHZpZGVvLzNncHAyYCA3LmBhdWRpby9tcDRgIDguYGF1ZGlvL21wZWdgIDkuYGF1ZGlvL2FhY2AgMTAuYGF1ZGlvLzNncDJgIDExLmBhdWRpby8zZ3BwYCAxMi5gYXVkaW8vM2dwcDJgIDEzLmBhdWRpby93ZWJtYCAxNC5gdmlkZW8vd2VibWAgMTUuYHdlYm1gIDE2LmBjZW5jYCAxNy5gdmlkZW8vdW5rbm93bmAgMTguYGF1ZGlvL3Vua25vd25gfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciBpbiB0aGUgcmFuZ2UgMCB0byAxOHwKK3wgYGtleVR5cGVgIHwgMC5gS2V5VHlwZTo6T0ZGTElORWAgMS5gS2V5VHlwZTo6U1RSRUFNSU5HYCAyLmBLZXlUeXBlOjpSRUxFQVNFYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIGluIHRoZSByYW5nZSAwIHRvIDJ8Cit8IGBjcnlwdG9Nb2RlYCB8IDAuYE1vZGU6OlVORU5DUllQVEVEYCAxLmBNb2RlOjpBRVNfQ1RSYCAyLmBNb2RlOjpBRVNfQ0JDX0NUU2AgMy5gTW9kZTo6QUVTX0NCQ2AgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciBpbiB0aGUgcmFuZ2UgMCB0byAzfAorCitUaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gaXMgYWx3YXlzIGRldGVybWluaXN0aWMgZm9yIGFueSBnaXZlbiBpbnB1dC4KKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIG1vZHVsZS4KK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKK21hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc250IGBleGl0KClgIG9uIGFueSBpbnB1dCBhbmQgdGhlcmVieSBpbmNyZWFzaW5nIHRoZQorY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHZ1bG5lcmFiaWxpdGllcy4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgY2xlYXJrZXlWMS40X2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgY2xlYXJrZXlWMS40X2Z1enplcgorYGBgCisjIyMjIFN0ZXBzIHRvIHJ1bgorVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6LyR7VEFSR0VUX0FSQ0h9L2NsZWFya2V5VjEuNF9mdXp6ZXIvdmVuZG9yL2h3L2NsZWFya2V5VjEuNF9mdXp6ZXIKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvZnV6emVyL2NsZWFya2V5VjEuNF9mdXp6ZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9mdXp6ZXIvY2xlYXJrZXlWMS40X2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlMGU2YwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvZnV6emVyL2NsZWFya2V5VjEuNF9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNzE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGluY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgorI2luY2x1ZGUgPGluY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8aW5jbHVkZS9DcnlwdG9GYWN0b3J5Lmg+CisjaW5jbHVkZSA8aW5jbHVkZS9DcnlwdG9QbHVnaW4uaD4KKyNpbmNsdWRlIDxpbmNsdWRlL0RybVBsdWdpbi5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGRybSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKK3VzaW5nIGRybTo6VjFfMDo6QnVmZmVyVHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OkV2ZW50VHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKK3VzaW5nIGRybTo6VjFfMDo6SURybVBsdWdpbjsKK3VzaW5nIGRybTo6VjFfMDo6SURybVBsdWdpbkxpc3RlbmVyOwordXNpbmcgZHJtOjpWMV8wOjpLZXllZFZlY3RvcjsKK3VzaW5nIGRybTo6VjFfMDo6S2V5U3RhdHVzOwordXNpbmcgZHJtOjpWMV8wOjpLZXlTdGF0dXNUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpLZXlUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpNb2RlOwordXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwordXNpbmcgZHJtOjpWMV8wOjpTZWN1cmVTdG9wOwordXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOwordXNpbmcgZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKK3VzaW5nIGRybTo6VjFfMTo6SGRjcExldmVsOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cmVTdG9wUmVsZWFzZTsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIGRybTo6VjFfMjo6S2V5U2V0SWQ7Cit1c2luZyBkcm06OlYxXzI6Ok9mZmxpbmVMaWNlbnNlU3RhdGU7Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjpJQ3J5cHRvRmFjdG9yeTsKK3VzaW5nIGRybTo6VjFfNDo6Y2xlYXJrZXk6OklEcm1GYWN0b3J5OwordXNpbmcgZHJtOjpWMV80OjpjbGVhcmtleTo6a0FsZ29yaXRobXNLZXk7Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjprQ2xpZW50SWRLZXk7Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjprRGV2aWNlSWRLZXk7Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjprRHJtRXJyb3JUZXN0S2V5OwordXNpbmcgZHJtOjpWMV80OjpjbGVhcmtleTo6a0xpc3RlbmVyVGVzdFN1cHBvcnRLZXk7Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjprTWV0cmljc0tleTsKK3VzaW5nIGRybTo6VjFfNDo6Y2xlYXJrZXk6OmtQbHVnaW5EZXNjcmlwdGlvbktleTsKK3VzaW5nIGRybTo6VjFfNDo6Y2xlYXJrZXk6OmtWZW5kb3JLZXk7Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjprVmVyc2lvbktleTsKKwordHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiBTZXNzaW9uSWQ7Cit0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+IFNlY3VyZVN0b3BJZDsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0ludmFsaWRVVUlEW10gPSB7MHgxMCwgMHgyMCwgMHgzMCwgMHg0MCwgMHg1MCwgMHg2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzAsIDB4ODAsIDB4MTAsIDB4MjAsIDB4MzAsIDB4NDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwLCAweDYwLCAweDcwLCAweDgwfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NsZWFyS2V5VVVJRFtdID0gezB4RTIsIDB4NzEsIDB4OUQsIDB4NTgsIDB4QTksIDB4ODUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCMywgMHhDOSwgMHg3OCwgMHgxQSwgMHhCMCwgMHgzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEFGLCAweDc4LCAweEQzLCAweDBFfTsKKworY29uc3QgU2VjdXJpdHlMZXZlbCBrU2VjdXJpdHlMZXZlbFtdID0geworICAgIFNlY3VyaXR5TGV2ZWw6OlVOS05PV04sICAgICAgICAgIFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE8sCisgICAgU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0RFQ09ERSwgU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0NSWVBUTywKKyAgICBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFLCBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMfTsKKworY29uc3QgY2hhciAqa01pbWVUeXBlW10gPSB7CisgICAgInZpZGVvL21wNCIsICAidmlkZW8vbXBlZyIsICAidmlkZW8veC1mbHYiLCAgICJ2aWRlby9tajIiLCAgICAidmlkZW8vM2dwMiIsCisgICAgInZpZGVvLzNncHAiLCAidmlkZW8vM2dwcDIiLCAiYXVkaW8vbXA0IiwgICAgICJhdWRpby9tcGVnIiwgICAiYXVkaW8vYWFjIiwKKyAgICAiYXVkaW8vM2dwMiIsICJhdWRpby8zZ3BwIiwgICJhdWRpby8zZ3BwMiIsICAgImF1ZGlvL3dlYm0iLCAgICJ2aWRlby93ZWJtIiwKKyAgICAid2VibSIsICAgICAgICJjZW5jIiwgICAgICAgICJ2aWRlby91bmtub3duIiwgImF1ZGlvL3Vua25vd24ifTsKKworY29uc3QgY2hhciAqa0NpcGhlckFsZ29yaXRobVtdID0geyJBRVMvQ0JDL05vUGFkZGluZyIsICIifTsKKworY29uc3QgY2hhciAqa01hY0FsZ29yaXRobVtdID0geyJIbWFjU0hBMjU2IiwgIiJ9OworCitjb25zdCBjaGFyICprUlNBQWxnb3JpdGhtW10gPSB7IlJTQVNTQS1QU1MtU0hBMSIsICIifTsKKworY29uc3Qgc3RkOjpzdHJpbmcga1Byb3BlcnR5W10gPSB7a1ZlbmRvcktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWZXJzaW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1BsdWdpbkRlc2NyaXB0aW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0FsZ29yaXRobXNLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTGlzdGVuZXJUZXN0U3VwcG9ydEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEcm1FcnJvclRlc3RLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGV2aWNlSWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ2xpZW50SWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWV0cmljc0tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwbGFjZWhvbGRlciJ9OworCitjb25zdCBLZXlUeXBlIGtLZXlUeXBlW10gPSB7S2V5VHlwZTo6T0ZGTElORSwgS2V5VHlwZTo6U1RSRUFNSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleVR5cGU6OlJFTEVBU0V9OworCitjb25zdCBNb2RlIGtDcnlwdG9Nb2RlW10gPSB7TW9kZTo6VU5FTkNSWVBURUQsIE1vZGU6OkFFU19DVFIsIE1vZGU6OkFFU19DQkNfQ1RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGU6OkFFU19DQkN9OworCitjb25zdCBoaWRsX3ZlYzx1aW50OF90PiB2YWxpZEluaXREYXRhID0geworICAgIC8vIEJNRkYgYm94IGhlYWRlciAoNCBieXRlcyBzaXplICsgJ3Bzc2gnKQorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzQsIDB4NzAsIDB4NzMsIDB4NzMsIDB4NjgsCisgICAgLy8gZnVsbCBib3ggaGVhZGVyICh2ZXJzaW9uID0gMSBmbGFncyA9IDApCisgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAvLyBzeXN0ZW0gaWQKKyAgICAweDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAyLCAweGFjLCAweGUzLCAweDNjLCAweDFlLAorICAgIDB4NTIsIDB4ZTIsIDB4ZmIsIDB4NGIsCisgICAgLy8gbnVtYmVyIG9mIGtleSBpZHMKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLAorICAgIC8vIGtleSBpZAorICAgIDB4NjAsIDB4MDYsIDB4MWUsIDB4MDEsIDB4N2UsIDB4NDcsIDB4N2UsIDB4ODcsIDB4N2UsIDB4NTcsIDB4ZDAsIDB4MGQsCisgICAgMHgxZSwgMHhkMCwgMHgwZCwgMHgxZSwKKyAgICAvLyBzaXplIG9mIGRhdGEsIG11c3QgYmUgemVybworICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCitjb25zdCBoaWRsX3ZlYzx1aW50OF90PiB2YWxpZEtleVJlc3BvbnNlID0geworICAgIDB4N2IsIDB4MjIsIDB4NmIsIDB4NjUsIDB4NzksIDB4NzMsIDB4MjIsIDB4M2EsIDB4NWIsIDB4N2IsIDB4MjIsCisgICAgMHg2YiwgMHg3NCwgMHg3OSwgMHgyMiwgMHgzYSwgMHgyMiwgMHg2ZiwgMHg2MywgMHg3NCwgMHgyMiwgMHgyYywKKyAgICAweDIyLCAweDZiLCAweDY5LCAweDY0LCAweDIyLCAweDNhLCAweDIyLCAweDU5LCAweDQxLCAweDU5LCAweDY1LAorICAgIDB4NDEsIDB4NTgsIDB4MzUsIDB4NDgsIDB4NjYsIDB4NmYsIDB4NjQsIDB4MmQsIDB4NTYsIDB4MzksIDB4NDEsCisgICAgMHg0ZSwgMHg0OCwgMHg3NCwgMHg0MSwgMHg0ZSwgMHg0OCwgMHg2NywgMHgyMiwgMHgyYywgMHgyMiwgMHg2YiwKKyAgICAweDIyLCAweDNhLCAweDIyLCAweDQ3LCAweDZmLCAweDZmLCAweDY3LCAweDZjLCAweDY1LCAweDU0LCAweDY1LAorICAgIDB4NzMsIDB4NzQsIDB4NGIsIDB4NjUsIDB4NzksIDB4NDIsIDB4NjEsIDB4NzMsIDB4NjUsIDB4MzYsIDB4MzQsCisgICAgMHg2NywgMHg2NywgMHg2NywgMHgyMiwgMHg3ZCwgMHg1ZCwgMHg3ZCwgMHgwYX07CisKK2NvbnN0IHNpemVfdCBrQUVTQmxvY2tTaXplID0gMTY7Citjb25zdCBzaXplX3Qga01heFN0cmluZ0xlbmd0aCA9IDEwMDsKK2NvbnN0IHNpemVfdCBrTWF4U3ViU2FtcGxlcyA9IDEwOworY29uc3Qgc2l6ZV90IGtNYXhOdW1CeXRlcyA9IDEwMDA7Citjb25zdCBzaXplX3Qga1NlZ21lbnRJbmRleCA9IDA7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3Qgc2l6ZT4KK1QgZ2V0VmFsdWVGcm9tQXJyYXkoRnV6emVkRGF0YVByb3ZpZGVyICpmZHAsIGNvbnN0IFQgKCZhcnIpW3NpemVdKSB7CisgIHJldHVybiBhcnJbZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KDAsIHNpemUgLSAxKV07Cit9CisKK2NsYXNzIFRlc3REcm1QbHVnaW5MaXN0ZW5lciA6IHB1YmxpYyBJRHJtUGx1Z2luTGlzdGVuZXIgeworcHVibGljOgorICBUZXN0RHJtUGx1Z2luTGlzdGVuZXIoKSB7fQorICB2aXJ0dWFsIH5UZXN0RHJtUGx1Z2luTGlzdGVuZXIoKSB7fQorCisgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IHNlbmRFdmVudChFdmVudFR5cGUgLypldmVudFR5cGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYgLypzZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYgLypkYXRhKi8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7CisgIH0KKworICB2aXJ0dWFsIFJldHVybjx2b2lkPgorICBzZW5kRXhwaXJhdGlvblVwZGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmIC8qc2Vzc2lvbklkKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgLypleHBpcnlUaW1lSW5NUyovKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFJldHVybjx2b2lkPigpOworICB9CisKKyAgdmlydHVhbCBSZXR1cm48dm9pZD4KKyAgc2VuZEtleXNDaGFuZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJiAvKnNlc3Npb25JZCovLAorICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXM+ICYgLyprZXlTdGF0dXNMaXN0Ki8sCisgICAgICAgICAgICAgICAgIGJvb2wgLypoYXNOZXdVc2FibGVLZXkqLykgb3ZlcnJpZGUgeworICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKKyAgfQorfTsKKworY2xhc3MgQ2xlYXJLZXlGdXp6ZXIgeworcHVibGljOgorICB+Q2xlYXJLZXlGdXp6ZXIoKSB7IGRlSW5pdCgpOyB9CisgIGJvb2wgaW5pdCgpOworICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCitwcml2YXRlOgorICB2b2lkIGRlSW5pdCgpOworICB2b2lkIGludm9rZURybVBsdWdpbihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgaW52b2tlQ3J5cHRvUGx1Z2luKGNvbnN0IHVpbnQ4X3QgKmRhdGEpOworICB2b2lkIGludm9rZURybShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgaW52b2tlQ3J5cHRvKGNvbnN0IHVpbnQ4X3QgKmRhdGEpOworICB2b2lkIGludm9rZURybURlY3J5cHRFbmNyeXB0QVBJKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgYm9vbCBpbnZva2VEcm1GYWN0b3J5KCk7CisgIGJvb2wgaW52b2tlQ3J5cHRvRmFjdG9yeSgpOworICB2b2lkIGludm9rZURybVYxXzRBUEkoKTsKKyAgdm9pZCBpbnZva2VEcm1TZXRBbGdvcml0aG1BUEkoKTsKKyAgdm9pZCBpbnZva2VEcm1Qcm9wZXJ0eUFQSSgpOworICB2b2lkIGludm9rZURybVNlY3VyZVN0b3BBUEkoKTsKKyAgdm9pZCBpbnZva2VEcm1PZmZsaW5lTGljZW5zZUFQSShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgIFNlc3Npb25JZCBnZXRTZXNzaW9uSWQoKTsKKyAgU2VjdXJlU3RvcFJlbGVhc2UgbWFrZVNlY3VyZVJlbGVhc2UoY29uc3QgU2VjdXJlU3RvcCAmc3RvcCk7CisgIHNwPElEcm1GYWN0b3J5PiBtRHJtRmFjdG9yeSA9IG51bGxwdHI7CisgIHNwPElDcnlwdG9GYWN0b3J5PiBtQ3J5cHRvRmFjdG9yeSA9IG51bGxwdHI7CisgIHNwPElEcm1QbHVnaW4+IG1Ecm1QbHVnaW4gPSBudWxscHRyOworICBzcDxkcm06OlYxXzE6OklEcm1QbHVnaW4+IG1Ecm1QbHVnaW5WMV8xID0gbnVsbHB0cjsKKyAgc3A8ZHJtOjpWMV8yOjpJRHJtUGx1Z2luPiBtRHJtUGx1Z2luVjFfMiA9IG51bGxwdHI7CisgIHNwPGRybTo6VjFfNDo6SURybVBsdWdpbj4gbURybVBsdWdpblYxXzQgPSBudWxscHRyOworICBzcDxkcm06OlYxXzQ6OklDcnlwdG9QbHVnaW4+IG1DcnlwdG9QbHVnaW5WMV80ID0gbnVsbHB0cjsKKyAgc3A8SUNyeXB0b1BsdWdpbj4gbUNyeXB0b1BsdWdpbiA9IG51bGxwdHI7CisgIEZ1enplZERhdGFQcm92aWRlciAqbUZEUCA9IG51bGxwdHI7CisgIFNlc3Npb25JZCBtU2Vzc2lvbklkID0ge307CisgIFNlc3Npb25JZCBtU2Vzc2lvbklkVjEgPSB7fTsKK307CisKK3ZvaWQgQ2xlYXJLZXlGdXp6ZXI6OmRlSW5pdCgpIHsKKyAgaWYgKG1Ecm1QbHVnaW5WMV8xKSB7CisgICAgbURybVBsdWdpblYxXzEtPmNsb3NlU2Vzc2lvbihtU2Vzc2lvbklkVjEpOworICB9CisgIGlmIChtRHJtUGx1Z2luVjFfMikgeworICAgIG1Ecm1QbHVnaW5WMV8yLT5jbG9zZVNlc3Npb24obVNlc3Npb25JZCk7CisgIH0KKyAgbURybUZhY3RvcnkuY2xlYXIoKTsKKyAgbUNyeXB0b0ZhY3RvcnkuY2xlYXIoKTsKKyAgbURybVBsdWdpbi5jbGVhcigpOworICBtRHJtUGx1Z2luVjFfMS5jbGVhcigpOworICBtRHJtUGx1Z2luVjFfMi5jbGVhcigpOworICBtRHJtUGx1Z2luVjFfNC5jbGVhcigpOworICBtQ3J5cHRvUGx1Z2luLmNsZWFyKCk7CisgIG1DcnlwdG9QbHVnaW5WMV80LmNsZWFyKCk7CisgIG1TZXNzaW9uSWQgPSB7fTsKKyAgbVNlc3Npb25JZFYxID0ge307Cit9CisKK3ZvaWQgQ2xlYXJLZXlGdXp6ZXI6Omludm9rZURybVYxXzRBUEkoKSB7CisgIG1Ecm1QbHVnaW5WMV80LT5yZXF1aXJlc1NlY3VyZURlY29kZXJEZWZhdWx0KAorICAgICAgZ2V0VmFsdWVGcm9tQXJyYXkobUZEUCwga01pbWVUeXBlKSk7CisgIG1Ecm1QbHVnaW5WMV80LT5yZXF1aXJlc1NlY3VyZURlY29kZXIoCisgICAgICBnZXRWYWx1ZUZyb21BcnJheShtRkRQLCBrTWltZVR5cGUpLAorICAgICAgZ2V0VmFsdWVGcm9tQXJyYXkobUZEUCwga1NlY3VyaXR5TGV2ZWwpKTsKKyAgbURybVBsdWdpblYxXzQtPnNldFBsYXliYWNrSWQoCisgICAgICBtU2Vzc2lvbklkLCBtRkRQLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW5ndGgpLmNfc3RyKCkpOworICBkcm06OlYxXzQ6OklEcm1QbHVnaW46OmdldExvZ01lc3NhZ2VzX2NiIGNiID0KKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIGRybTo6VjFfNDo6U3RhdHVzIHN0YXR1cywKKyAgICAgICAgICBbW21heWJlX3VudXNlZF1dIGhpZGxfdmVjPGRybTo6VjFfNDo6TG9nTWVzc2FnZT4gbG9ncykge307CisgIG1Ecm1QbHVnaW5WMV80LT5nZXRMb2dNZXNzYWdlcyhjYik7Cit9CisKK3ZvaWQgQ2xlYXJLZXlGdXp6ZXI6Omludm9rZURybVNldEFsZ29yaXRobUFQSSgpIHsKKyAgY29uc3QgaGlkbF9zdHJpbmcgY2lwaGVyQWxnbyA9CisgICAgICBtRkRQLT5Db25zdW1lQm9vbCgpCisgICAgICAgICAgPyBtRkRQLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW5ndGgpLmNfc3RyKCkKKyAgICAgICAgICA6IGhpZGxfc3RyaW5nKGtDaXBoZXJBbGdvcml0aG1bbUZEUC0+Q29uc3VtZUJvb2woKV0pOworICBtRHJtUGx1Z2luVjFfMi0+c2V0Q2lwaGVyQWxnb3JpdGhtKG1TZXNzaW9uSWQsIGNpcGhlckFsZ28pOworCisgIGNvbnN0IGhpZGxfc3RyaW5nIG1hY0FsZ28gPQorICAgICAgbUZEUC0+Q29uc3VtZUJvb2woKQorICAgICAgICAgID8gbUZEUC0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4U3RyaW5nTGVuZ3RoKS5jX3N0cigpCisgICAgICAgICAgOiBoaWRsX3N0cmluZyhrTWFjQWxnb3JpdGhtW21GRFAtPkNvbnN1bWVCb29sKCldKTsKKyAgbURybVBsdWdpblYxXzItPnNldE1hY0FsZ29yaXRobShtU2Vzc2lvbklkLCBtYWNBbGdvKTsKK30KKwordm9pZCBDbGVhcktleUZ1enplcjo6aW52b2tlRHJtUHJvcGVydHlBUEkoKSB7CisgIG1Ecm1QbHVnaW5WMV8yLT5zZXRQcm9wZXJ0eVN0cmluZygKKyAgICAgIGhpZGxfc3RyaW5nKGdldFZhbHVlRnJvbUFycmF5KG1GRFAsIGtQcm9wZXJ0eSkpLCBoaWRsX3N0cmluZygidmFsdWUiKSk7CisKKyAgaGlkbF9zdHJpbmcgc3RyaW5nVmFsdWU7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRQcm9wZXJ0eVN0cmluZygKKyAgICAgIGdldFZhbHVlRnJvbUFycmF5KG1GRFAsIGtQcm9wZXJ0eSksCisgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF9zdHJpbmcgJmhWYWx1ZSkgeworICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICBzdHJpbmdWYWx1ZSA9IGhWYWx1ZTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgaGlkbF92ZWM8dWludDhfdD4gdmFsdWUgPSB7fTsKKyAgbURybVBsdWdpblYxXzItPnNldFByb3BlcnR5Qnl0ZUFycmF5KAorICAgICAgaGlkbF9zdHJpbmcoZ2V0VmFsdWVGcm9tQXJyYXkobUZEUCwga1Byb3BlcnR5KSksIHZhbHVlKTsKKworICBoaWRsX3ZlYzx1aW50OF90PiBieXRlVmFsdWU7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgIGdldFZhbHVlRnJvbUFycmF5KG1GRFAsIGtQcm9wZXJ0eSksCisgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJmhWYWx1ZSkgeworICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICBieXRlVmFsdWUgPSBoVmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0pOworfQorCitTZXNzaW9uSWQgQ2xlYXJLZXlGdXp6ZXI6OmdldFNlc3Npb25JZCgpIHsKKyAgU2Vzc2lvbklkIGVtcHR5U2Vzc2lvbklkID0ge307CisgIHJldHVybiBtRkRQLT5Db25zdW1lQm9vbCgpID8gbVNlc3Npb25JZCA6IGVtcHR5U2Vzc2lvbklkOworfQorCit2b2lkIENsZWFyS2V5RnV6emVyOjppbnZva2VEcm1EZWNyeXB0RW5jcnlwdEFQSShjb25zdCB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKKyAgdWludDMyX3QgY3VyclNlc3Npb25zLCBtYXhpbXVtU2Vzc2lvbnM7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXROdW1iZXJPZlNlc3Npb25zKAorICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIHVpbnQzMl90IGhDdXJyZW50U2Vzc2lvbnMsIHVpbnQzMl90IGhNYXhTZXNzaW9ucykgeworICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICBjdXJyU2Vzc2lvbnMgPSBoQ3VycmVudFNlc3Npb25zOworICAgICAgICAgIG1heGltdW1TZXNzaW9ucyA9IGhNYXhTZXNzaW9uczsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgSGRjcExldmVsIGNvbm5lY3RlZCwgbWF4aW11bTsKKyAgbURybVBsdWdpblYxXzItPmdldEhkY3BMZXZlbHMoWyZdKFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIZGNwTGV2ZWwgJmhDb25uZWN0ZWRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhkY3BMZXZlbCAmaE1heExldmVsKSB7CisgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICBjb25uZWN0ZWQgPSBoQ29ubmVjdGVkTGV2ZWw7CisgICAgICBtYXhpbXVtID0gaE1heExldmVsOworICAgIH0KKyAgfSk7CisKKyAgZHJtOjpWMV8yOjpIZGNwTGV2ZWwgY29ubmVjdGVkVjFfMiwgbWF4aW11bVYxXzI7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRIZGNwTGV2ZWxzXzFfMigKKyAgICAgIFsmXShkcm06OlYxXzI6OlN0YXR1cyBzdGF0dXMsIGNvbnN0IGRybTo6VjFfMjo6SGRjcExldmVsICZjb25uZWN0ZWRMZXZlbCwKKyAgICAgICAgICBjb25zdCBkcm06OlYxXzI6OkhkY3BMZXZlbCAmbWF4TGV2ZWwpIHsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBkcm06OlYxXzI6OlN0YXR1czo6T0spIHsKKyAgICAgICAgICBjb25uZWN0ZWRWMV8yID0gY29ubmVjdGVkTGV2ZWw7CisgICAgICAgICAgbWF4aW11bVYxXzIgPSBtYXhMZXZlbDsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgU2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsOworICBtRHJtUGx1Z2luVjFfMi0+Z2V0U2VjdXJpdHlMZXZlbChtU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgU2VjdXJpdHlMZXZlbCBoTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5TGV2ZWwgPSBoTGV2ZWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICBoaWRsX3ZlYzxEcm1NZXRyaWNHcm91cD4gbWV0cmljczsKKyAgbURybVBsdWdpblYxXzItPmdldE1ldHJpY3MoCisgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgaGlkbF92ZWM8RHJtTWV0cmljR3JvdXA+IGhNZXRyaWNHcm91cHMpIHsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgbWV0cmljcyA9IGhNZXRyaWNHcm91cHM7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgIGhpZGxfc3RyaW5nIGNlcnRpZmljYXRlVHlwZTsKKyAgaGlkbF9zdHJpbmcgY2VydGlmaWNhdGVBdXRob3JpdHk7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRQcm92aXNpb25SZXF1ZXN0KGNlcnRpZmljYXRlVHlwZSwgY2VydGlmaWNhdGVBdXRob3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcgJikge30pOworCisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRQcm92aXNpb25SZXF1ZXN0XzFfMigKKyAgICAgIGNlcnRpZmljYXRlVHlwZSwgY2VydGlmaWNhdGVBdXRob3JpdHksCisgICAgICBbJl0oW1ttYXliZV91bnVzZWRdXSBkcm06OlYxXzI6OlN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYsCisgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcgJikge30pOworCisgIGhpZGxfdmVjPHVpbnQ4X3Q+IHJlc3BvbnNlOworICBtRHJtUGx1Z2luVjFfMi0+cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKAorICAgICAgcmVzcG9uc2UsIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYpIHt9KTsKKworICBoaWRsX3ZlYzx1aW50OF90PiBpbml0RGF0YSA9IHt9OworICBpZiAobUZEUC0+Q29uc3VtZUJvb2woKSkgeworICAgIGluaXREYXRhID0gdmFsaWRJbml0RGF0YTsKKyAgfSBlbHNlIHsKKyAgICBpbml0RGF0YS5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCAqPihkYXRhKSwga0FFU0Jsb2NrU2l6ZSk7CisgIH0KKyAgaGlkbF9zdHJpbmcgbWltZVR5cGUgPSBnZXRWYWx1ZUZyb21BcnJheShtRkRQLCBrTWltZVR5cGUpOworICBLZXlUeXBlIGtleVR5cGUgPSBtRkRQLT5Db25zdW1lQm9vbCgpCisgICAgICAgICAgICAgICAgICAgICAgICA/IHN0YXRpY19jYXN0PEtleVR5cGU+KG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDxzaXplX3Q+KCkpCisgICAgICAgICAgICAgICAgICAgICAgICA6IGdldFZhbHVlRnJvbUFycmF5KG1GRFAsIGtLZXlUeXBlKTsKKyAgS2V5ZWRWZWN0b3Igb3B0aW9uYWxQYXJhbWV0ZXJzOworICBtRHJtUGx1Z2luVjFfMi0+Z2V0S2V5UmVxdWVzdF8xXzIoCisgICAgICBtU2Vzc2lvbklkLCBpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIGRybTo6VjFfMjo6U3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJiwKKyAgICAgICAgICBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlLCBjb25zdCBoaWRsX3N0cmluZyAmKSB7fSk7CisgIG1Ecm1QbHVnaW5WMV8xLT5nZXRLZXlSZXF1ZXN0XzFfMSgKKyAgICAgIG1TZXNzaW9uSWRWMSwgaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICBbJl0oW1ttYXliZV91bnVzZWRdXSBkcm06OlYxXzA6OlN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYsCisgICAgICAgICAgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZSwgY29uc3QgaGlkbF9zdHJpbmcgJikge30pOworICBoaWRsX3ZlYzx1aW50OF90PiBlbXB0eUluaXREYXRhID0ge307CisgIG1Ecm1QbHVnaW4tPmdldEtleVJlcXVlc3QoCisgICAgICBtU2Vzc2lvbklkLCBtRkRQLT5Db25zdW1lQm9vbCgpID8gaW5pdERhdGEgOiBlbXB0eUluaXREYXRhLCBtaW1lVHlwZSwKKyAgICAgIGtleVR5cGUsIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIGRybTo6VjFfMDo6U3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJiwKKyAgICAgICAgICBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlLCBjb25zdCBoaWRsX3N0cmluZyAmKSB7fSk7CisKKyAgaGlkbF92ZWM8dWludDhfdD4ga2V5UmVzcG9uc2UgPSB7fTsKKyAgaWYgKG1GRFAtPkNvbnN1bWVCb29sKCkpIHsKKyAgICBrZXlSZXNwb25zZSA9IHZhbGlkS2V5UmVzcG9uc2U7CisgIH0gZWxzZSB7CisgICAga2V5UmVzcG9uc2Uuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZGF0YSksIHNpemUpOworICB9CisgIGhpZGxfdmVjPHVpbnQ4X3Q+IGtleVNldElkOworICBoaWRsX3ZlYzx1aW50OF90PiBlbXB0eUtleVJlc3BvbnNlID0ge307CisgIG1Ecm1QbHVnaW5WMV8yLT5wcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICBnZXRTZXNzaW9uSWQoKSwgbUZEUC0+Q29uc3VtZUJvb2woKSA/IGtleVJlc3BvbnNlIDogZW1wdHlLZXlSZXNwb25zZSwKKyAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmaEtleVNldElkKSB7CisgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgIGtleVNldElkID0gaEtleVNldElkOworICAgICAgICB9CisgICAgICB9KTsKKworICBtRHJtUGx1Z2luVjFfMi0+cmVzdG9yZUtleXMoZ2V0U2Vzc2lvbklkKCksIGtleVNldElkKTsKKworICBtRHJtUGx1Z2luVjFfMi0+cXVlcnlLZXlTdGF0dXMoCisgICAgICBnZXRTZXNzaW9uSWQoKSwKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsIEtleWVkVmVjdG9yIC8qIGluZm8gKi8pIHt9KTsKKworICBoaWRsX3ZlYzx1aW50OF90PiBrZXlJZCwgaW5wdXQsIGl2OworICBrZXlJZC5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCAqPihkYXRhKSwgc2l6ZSk7CisgIGlucHV0LnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpLCBzaXplKTsKKyAgaXYuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZGF0YSksIHNpemUpOworICBtRHJtUGx1Z2luVjFfMi0+ZW5jcnlwdCgKKyAgICAgIGdldFNlc3Npb25JZCgpLCBrZXlJZCwgaW5wdXQsIGl2LAorICAgICAgWyZdKFtbbWF5YmVfdW51c2VkXV0gU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJikge30pOworCisgIG1Ecm1QbHVnaW5WMV8yLT5kZWNyeXB0KAorICAgICAgZ2V0U2Vzc2lvbklkKCksIGtleUlkLCBpbnB1dCwgaXYsCisgICAgICBbJl0oW1ttYXliZV91bnVzZWRdXSBTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmKSB7fSk7CisKKyAgaGlkbF92ZWM8dWludDhfdD4gbWVzc2FnZTsKKyAgbWVzc2FnZS5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCAqPihkYXRhKSwgc2l6ZSk7CisgIG1Ecm1QbHVnaW5WMV8yLT5zaWduKAorICAgICAgZ2V0U2Vzc2lvbklkKCksIGtleUlkLCBtZXNzYWdlLAorICAgICAgWyZdKFtbbWF5YmVfdW51c2VkXV0gU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJikge30pOworCisgIGhpZGxfdmVjPHVpbnQ4X3Q+IHNpZ25hdHVyZTsKKyAgc2lnbmF0dXJlLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpLCBzaXplKTsKKyAgbURybVBsdWdpblYxXzItPnZlcmlmeShnZXRTZXNzaW9uSWQoKSwga2V5SWQsIG1lc3NhZ2UsIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oW1ttYXliZV91bnVzZWRdXSBTdGF0dXMgc3RhdHVzLCBib29sKSB7fSk7CisKKyAgaGlkbF92ZWM8dWludDhfdD4gd3JhcHBlZEtleTsKKyAgc2lnbmF0dXJlLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpLCBzaXplKTsKKyAgbURybVBsdWdpblYxXzItPnNpZ25SU0EoCisgICAgICBnZXRTZXNzaW9uSWQoKSwga1JTQUFsZ29yaXRobVttRkRQLT5Db25zdW1lQm9vbCgpXSwgbWVzc2FnZSwgd3JhcHBlZEtleSwKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICYpIHt9KTsKKworICBtRHJtUGx1Z2luVjFfMi0+cmVtb3ZlS2V5cyhnZXRTZXNzaW9uSWQoKSk7Cit9CisKKy8qKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHNlY3VyZSByZWxlYXNlIG1lc3NhZ2UgZm9yCisgKiBhIHNlY3VyZSBzdG9wLiBUaGUgY2xlYXJrZXkgc2VjdXJlIHN0b3AgcmVsZWFzZSBmb3JtYXQKKyAqIGlzIGp1c3QgYSBjb3VudCBmb2xsb3dlZCBieSB0aGUgc2VjdXJlIHN0b3Agb3BhcXVlIGRhdGEuCisgKi8KK1NlY3VyZVN0b3BSZWxlYXNlIENsZWFyS2V5RnV6emVyOjptYWtlU2VjdXJlUmVsZWFzZShjb25zdCBTZWN1cmVTdG9wICZzdG9wKSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHN0b3BEYXRhID0gc3RvcC5vcGFxdWVEYXRhOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXI7CisgIHN0ZDo6c3RyaW5nIGNvdW50ID0gIjAwMDEiOworCisgIGF1dG8gaXQgPSBidWZmZXIuaW5zZXJ0KGJ1ZmZlci5iZWdpbigpLCBjb3VudC5iZWdpbigpLCBjb3VudC5lbmQoKSk7CisgIGJ1ZmZlci5pbnNlcnQoaXQgKyBjb3VudC5zaXplKCksIHN0b3BEYXRhLmJlZ2luKCksIHN0b3BEYXRhLmVuZCgpKTsKKyAgU2VjdXJlU3RvcFJlbGVhc2UgcmVsZWFzZSA9IHsub3BhcXVlRGF0YSA9IGhpZGxfdmVjPHVpbnQ4X3Q+KGJ1ZmZlcil9OworICByZXR1cm4gcmVsZWFzZTsKK30KKwordm9pZCBDbGVhcktleUZ1enplcjo6aW52b2tlRHJtU2VjdXJlU3RvcEFQSSgpIHsKKyAgU2VjdXJlU3RvcElkIHNzaWQ7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRTZWN1cmVTdG9wKAorICAgICAgc3NpZCwgWyZdKFtbbWF5YmVfdW51c2VkXV0gU3RhdHVzIHN0YXR1cywgY29uc3QgU2VjdXJlU3RvcCAmKSB7fSk7CisKKyAgbURybVBsdWdpblYxXzItPmdldFNlY3VyZVN0b3BJZHMoCisgICAgICBbJl0oW1ttYXliZV91bnVzZWRdXSBTdGF0dXMgc3RhdHVzLAorICAgICAgICAgIFtbbWF5YmVfdW51c2VkXV0gY29uc3QgaGlkbF92ZWM8U2VjdXJlU3RvcElkPiAmc2VjdXJlU3RvcElkcykge30pOworCisgIFNlY3VyZVN0b3BSZWxlYXNlIHJlbGVhc2U7CisgIG1Ecm1QbHVnaW5WMV8yLT5nZXRTZWN1cmVTdG9wcygKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPFNlY3VyZVN0b3A+ICZzdG9wcykgeworICAgICAgICBpZiAoc3RvcHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgIHJlbGVhc2UgPSBtYWtlU2VjdXJlUmVsZWFzZSgKKyAgICAgICAgICAgICAgc3RvcHNbbUZEUC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIHN0b3BzLnNpemUoKSAtIDEpXSk7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgIG1Ecm1QbHVnaW5WMV8yLT5yZWxlYXNlU2VjdXJlU3RvcHMocmVsZWFzZSk7CisKKyAgbURybVBsdWdpblYxXzItPnJlbW92ZVNlY3VyZVN0b3Aoc3NpZCk7CisKKyAgbURybVBsdWdpblYxXzItPnJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7CisKKyAgbURybVBsdWdpblYxXzItPnJlbGVhc2VTZWN1cmVTdG9wKHNzaWQpOworCisgIG1Ecm1QbHVnaW5WMV8yLT5yZWxlYXNlQWxsU2VjdXJlU3RvcHMoKTsKK30KKwordm9pZCBDbGVhcktleUZ1enplcjo6aW52b2tlRHJtT2ZmbGluZUxpY2Vuc2VBUEkoY29uc3QgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CisgIGhpZGxfdmVjPEtleVNldElkPiBrZXlTZXRJZHMgPSB7fTsKKyAgbURybVBsdWdpblYxXzItPmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKAorICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPEtleVNldElkPiAmaEtleVNldElkcykgeworICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICBrZXlTZXRJZHMgPSBoS2V5U2V0SWRzOworICAgICAgICB9CisgICAgICB9KTsKKworICBPZmZsaW5lTGljZW5zZVN0YXRlIGxpY2Vuc2VTdGF0ZTsKKyAgS2V5U2V0SWQga2V5U2V0SWQgPSB7fTsKKyAgaWYgKGtleVNldElkcy5zaXplKCkgPiAwKSB7CisgICAga2V5U2V0SWQgPSBrZXlTZXRJZHNbbUZEUC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KAorICAgICAgICAwLCBrZXlTZXRJZHMuc2l6ZSgpIC0gMSldOworICB9IGVsc2UgeworICAgIGtleVNldElkLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpLCBzaXplKTsKKyAgfQorICBtRHJtUGx1Z2luVjFfMi0+Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZSgKKyAgICAgIGtleVNldElkLCBbJl0oU3RhdHVzIHN0YXR1cywgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBoTGljZW5zZVN0YXRlKSB7CisgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgIGxpY2Vuc2VTdGF0ZSA9IGhMaWNlbnNlU3RhdGU7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgIG1Ecm1QbHVnaW5WMV8yLT5yZW1vdmVPZmZsaW5lTGljZW5zZShrZXlTZXRJZCk7Cit9CisKK3ZvaWQgQ2xlYXJLZXlGdXp6ZXI6Omludm9rZURybVBsdWdpbihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBTZWN1cml0eUxldmVsIHNlY0xldmVsID0KKyAgICAgIG1GRFAtPkNvbnN1bWVCb29sKCkKKyAgICAgICAgICA/IGdldFZhbHVlRnJvbUFycmF5KG1GRFAsIGtTZWN1cml0eUxldmVsKQorICAgICAgICAgIDogc3RhdGljX2Nhc3Q8U2VjdXJpdHlMZXZlbD4obUZEUC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpKTsKKyAgbURybVBsdWdpblYxXzEtPm9wZW5TZXNzaW9uXzFfMSgKKyAgICAgIHNlY0xldmVsLCBbJl0oW1ttYXliZV91bnVzZWRdXSBTdGF0dXMgc3RhdHVzLCBjb25zdCBTZXNzaW9uSWQgJmlkKSB7CisgICAgICAgIG1TZXNzaW9uSWRWMSA9IGlkOworICAgICAgfSk7CisgIG1Ecm1QbHVnaW5WMV8yLT5vcGVuU2Vzc2lvbihbJl0oW1ttYXliZV91bnVzZWRdXSBTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlc3Npb25JZCAmaWQpIHsgbVNlc3Npb25JZCA9IGlkOyB9KTsKKworICBzcDxUZXN0RHJtUGx1Z2luTGlzdGVuZXI+IGxpc3RlbmVyID0gbmV3IFRlc3REcm1QbHVnaW5MaXN0ZW5lcigpOworICBtRHJtUGx1Z2luVjFfMi0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOworICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXM+IGtleVN0YXR1c0xpc3QgPSB7CisgICAgICB7ezF9LCBLZXlTdGF0dXNUeXBlOjpVU0FCTEV9LAorICAgICAge3syfSwgS2V5U3RhdHVzVHlwZTo6RVhQSVJFRH0sCisgICAgICB7ezN9LCBLZXlTdGF0dXNUeXBlOjpPVVRQVVROT1RBTExPV0VEfSwKKyAgICAgIHt7NH0sIEtleVN0YXR1c1R5cGU6OlNUQVRVU1BFTkRJTkd9LAorICAgICAge3s1fSwgS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUn0sCisgIH07CisgIG1Ecm1QbHVnaW5WMV8yLT5zZW5kS2V5c0NoYW5nZShtU2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0LCB0cnVlKTsKKworICBpbnZva2VEcm1WMV80QVBJKCk7CisgIGludm9rZURybVNldEFsZ29yaXRobUFQSSgpOworICBpbnZva2VEcm1Qcm9wZXJ0eUFQSSgpOworICBpbnZva2VEcm1EZWNyeXB0RW5jcnlwdEFQSShkYXRhLCBzaXplKTsKKyAgaW52b2tlRHJtU2VjdXJlU3RvcEFQSSgpOworICBpbnZva2VEcm1PZmZsaW5lTGljZW5zZUFQSShkYXRhLCBzaXplKTsKK30KKwordm9pZCBDbGVhcktleUZ1enplcjo6aW52b2tlQ3J5cHRvUGx1Z2luKGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKKyAgbUNyeXB0b1BsdWdpbi0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KAorICAgICAgZ2V0VmFsdWVGcm9tQXJyYXkobUZEUCwga01pbWVUeXBlKSk7CisKKyAgY29uc3QgdWludDMyX3Qgd2lkdGggPSBtRkRQLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgbUNyeXB0b1BsdWdpbi0+bm90aWZ5UmVzb2x1dGlvbih3aWR0aCwgaGVpZ2h0KTsKKworICBtQ3J5cHRvUGx1Z2luLT5zZXRNZWRpYURybVNlc3Npb24obVNlc3Npb25JZCk7CisKKyAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7CisgIGNvbnN0IHNpemVfdCBudW1TdWJTYW1wbGVzID0KKyAgICAgIG1GRFAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigxLCBrTWF4U3ViU2FtcGxlcyk7CisKKyAgY29uc3QgUGF0dGVybiBwYXR0ZXJuID0gezAsIDB9OworICBoaWRsX3ZlYzxTdWJTYW1wbGU+IHN1YlNhbXBsZXM7CisgIHN1YlNhbXBsZXMucmVzaXplKG51bVN1YlNhbXBsZXMpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgY2xlYXJCeXRlcyA9CisgICAgICAgIG1GRFAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KDAsIGtNYXhOdW1CeXRlcyk7CisgICAgY29uc3QgdWludDMyX3QgZW5jcnlwdGVkQnl0ZXMgPQorICAgICAgICBtRkRQLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PigwLCBrTWF4TnVtQnl0ZXMpOworICAgIHN1YlNhbXBsZXNbaV0ubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IGNsZWFyQnl0ZXM7CisgICAgc3ViU2FtcGxlc1tpXS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IGVuY3J5cHRlZEJ5dGVzOworICAgIHRvdGFsU2l6ZSArPSBzdWJTYW1wbGVzW2ldLm51bUJ5dGVzT2ZDbGVhckRhdGE7CisgICAgdG90YWxTaXplICs9IHN1YlNhbXBsZXNbaV0ubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGE7CisgIH0KKworICAvLyBUaGUgZmlyc3QgdG90YWxTaXplIGJ5dGVzIG9mIHNoYXJlZCBtZW1vcnkgaXMgdGhlIGVuY3J5cHRlZAorICAvLyBpbnB1dCwgdGhlIHNlY29uZCB0b3RhbFNpemUgYnl0ZXMgaXMgdGhlIGRlY3J5cHRlZCBvdXRwdXQuCisgIHNpemVfdCBtZW1vcnlCeXRlcyA9IHRvdGFsU2l6ZSAqIDI7CisKKyAgc3A8SUFsbG9jYXRvcj4gYXNobWVtQWxsb2NhdG9yID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7CisgIGlmICghYXNobWVtQWxsb2NhdG9yLmdldCgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaGlkbF9tZW1vcnkgaGlkbE1lbW9yeTsKKyAgYXNobWVtQWxsb2NhdG9yLT5hbGxvY2F0ZShtZW1vcnlCeXRlcywgWyZdKFtbbWF5YmVfdW51c2VkXV0gYm9vbCBzdWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9tZW1vcnkgJm1lbW9yeSkgeworICAgIG1DcnlwdG9QbHVnaW4tPnNldFNoYXJlZEJ1ZmZlckJhc2UobWVtb3J5LCBrU2VnbWVudEluZGV4KTsKKyAgICBoaWRsTWVtb3J5ID0gbWVtb3J5OworICB9KTsKKworICBzcDxJTWVtb3J5PiBtYXBwZWRNZW1vcnkgPSBtYXBNZW1vcnkoaGlkbE1lbW9yeSk7CisgIGlmICghbWFwcGVkTWVtb3J5LmdldCgpKSB7CisgICAgcmV0dXJuOworICB9CisgIG1DcnlwdG9QbHVnaW4tPnNldFNoYXJlZEJ1ZmZlckJhc2UoaGlkbE1lbW9yeSwga1NlZ21lbnRJbmRleCk7CisKKyAgdWludDMyX3Qgc3JjQnVmZmVySWQgPQorICAgICAgbUZEUC0+Q29uc3VtZUJvb2woKSA/IGtTZWdtZW50SW5kZXggOiBtRkRQLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgIGNvbnN0IFNoYXJlZEJ1ZmZlciBzb3VyY2VCdWZmZXIgPSB7CisgICAgICAuYnVmZmVySWQgPSBzcmNCdWZmZXJJZCwgLm9mZnNldCA9IDAsIC5zaXplID0gdG90YWxTaXplfTsKKworICBCdWZmZXJUeXBlIHR5cGUgPSBtRkRQLT5Db25zdW1lQm9vbCgpID8gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQnVmZmVyVHlwZTo6TkFUSVZFX0hBTkRMRTsKKyAgdWludDMyX3QgZGVzdEJ1ZmZlcklkID0KKyAgICAgIG1GRFAtPkNvbnN1bWVCb29sKCkgPyBrU2VnbWVudEluZGV4IDogbUZEUC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciBkZXN0QnVmZmVyID0geworICAgICAgLnR5cGUgPSB0eXBlLAorICAgICAgey5idWZmZXJJZCA9IGRlc3RCdWZmZXJJZCwgLm9mZnNldCA9IHRvdGFsU2l6ZSwgLnNpemUgPSB0b3RhbFNpemV9LAorICAgICAgLnNlY3VyZU1lbW9yeSA9IG51bGxwdHJ9OworCisgIGNvbnN0IHVpbnQ2NF90IG9mZnNldCA9IDA7CisgIHVpbnQzMl90IGJ5dGVzV3JpdHRlbiA9IDA7CisgIGhpZGxfYXJyYXk8dWludDhfdCwga0FFU0Jsb2NrU2l6ZT4ga2V5SWQgPQorICAgICAgaGlkbF9hcnJheTx1aW50OF90LCBrQUVTQmxvY2tTaXplPihkYXRhKTsKKyAgaGlkbF9hcnJheTx1aW50OF90LCBrQUVTQmxvY2tTaXplPiBpdiA9CisgICAgICBoaWRsX2FycmF5PHVpbnQ4X3QsIGtBRVNCbG9ja1NpemU+KGRhdGEpOworICBNb2RlIG1vZGUgPSBnZXRWYWx1ZUZyb21BcnJheShtRkRQLCBrQ3J5cHRvTW9kZSk7CisgIG1DcnlwdG9QbHVnaW4tPmRlY3J5cHQoCisgICAgICBtRkRQLT5Db25zdW1lQm9vbCgpLCBrZXlJZCwgaXYsIG1vZGUsIHBhdHRlcm4sIHN1YlNhbXBsZXMsIHNvdXJjZUJ1ZmZlciwKKyAgICAgIG9mZnNldCwgZGVzdEJ1ZmZlciwKKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIFN0YXR1cyBzdGF0dXMsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgIFtbbWF5YmVfdW51c2VkXV0gc3RyaW5nIGRldGFpbGVkRXJyb3IpIHsgYnl0ZXNXcml0dGVuID0gY291bnQ7IH0pOworICBkcm06OlYxXzQ6OklEcm1QbHVnaW46OmdldExvZ01lc3NhZ2VzX2NiIGNiID0KKyAgICAgIFsmXShbW21heWJlX3VudXNlZF1dIGRybTo6VjFfNDo6U3RhdHVzIHN0YXR1cywKKyAgICAgICAgICBbW21heWJlX3VudXNlZF1dIGhpZGxfdmVjPGRybTo6VjFfNDo6TG9nTWVzc2FnZT4gbG9ncykge307CisgIG1DcnlwdG9QbHVnaW5WMV80LT5nZXRMb2dNZXNzYWdlcyhjYik7Cit9CisKK2Jvb2wgQ2xlYXJLZXlGdXp6ZXI6Omludm9rZURybUZhY3RvcnkoKSB7CisgIGhpZGxfc3RyaW5nIHBhY2thZ2VOYW1lKAorICAgICAgbUZEUC0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4U3RyaW5nTGVuZ3RoKS5jX3N0cigpKTsKKyAgaGlkbF9zdHJpbmcgbWltZVR5cGUoZ2V0VmFsdWVGcm9tQXJyYXkobUZEUCwga01pbWVUeXBlKSk7CisgIFNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCA9CisgICAgICBtRkRQLT5Db25zdW1lQm9vbCgpCisgICAgICAgICAgPyBnZXRWYWx1ZUZyb21BcnJheShtRkRQLCBrU2VjdXJpdHlMZXZlbCkKKyAgICAgICAgICA6IHN0YXRpY19jYXN0PFNlY3VyaXR5TGV2ZWw+KG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKSk7CisgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+IHV1aWQgPQorICAgICAgbUZEUC0+Q29uc3VtZUJvb2woKSA/IGtDbGVhcktleVVVSUQgOiBrSW52YWxpZFVVSUQ7CisgIG1Ecm1GYWN0b3J5LT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZF8xXzIodXVpZCwgbWltZVR5cGUsIHNlY3VyaXR5TGV2ZWwpOworICBtRHJtRmFjdG9yeS0+Y3JlYXRlUGx1Z2luKAorICAgICAgdXVpZCwgcGFja2FnZU5hbWUsIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBzcDxJRHJtUGx1Z2luPiAmcGx1Z2luKSB7CisgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgIG1Ecm1QbHVnaW4gPSBwbHVnaW4uZ2V0KCk7CisgICAgICAgICAgbURybVBsdWdpblYxXzEgPSBkcm06OlYxXzE6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1Ecm1QbHVnaW4pOworICAgICAgICAgIG1Ecm1QbHVnaW5WMV8yID0gZHJtOjpWMV8yOjpJRHJtUGx1Z2luOjpjYXN0RnJvbShtRHJtUGx1Z2luKTsKKyAgICAgICAgICBtRHJtUGx1Z2luVjFfNCA9IGRybTo6VjFfNDo6SURybVBsdWdpbjo6Y2FzdEZyb20obURybVBsdWdpbik7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgIHN0ZDo6dmVjdG9yPGhpZGxfYXJyYXk8dWludDhfdCwgMTY+PiBzdXBwb3J0ZWRTY2hlbWVzOworICBtRHJtRmFjdG9yeS0+Z2V0U3VwcG9ydGVkQ3J5cHRvU2NoZW1lcygKKyAgICAgIFsmXShjb25zdCBoaWRsX3ZlYzxoaWRsX2FycmF5PHVpbnQ4X3QsIDE2Pj4gJnNjaGVtZXMpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZzY2hlbWUgOiBzY2hlbWVzKSB7CisgICAgICAgICAgc3VwcG9ydGVkU2NoZW1lcy5wdXNoX2JhY2soc2NoZW1lKTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgaWYgKCEobURybVBsdWdpbiAmJiBtRHJtUGx1Z2luVjFfMSAmJiBtRHJtUGx1Z2luVjFfMiAmJiBtRHJtUGx1Z2luVjFfNCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ2xlYXJLZXlGdXp6ZXI6Omludm9rZUNyeXB0b0ZhY3RvcnkoKSB7CisgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+IHV1aWQgPQorICAgICAgbUZEUC0+Q29uc3VtZUJvb2woKSA/IGtDbGVhcktleVVVSUQgOiBrSW52YWxpZFVVSUQ7CisgIG1DcnlwdG9GYWN0b3J5LT5jcmVhdGVQbHVnaW4oCisgICAgICB1dWlkLCBtU2Vzc2lvbklkLCBbdGhpc10oU3RhdHVzIHN0YXR1cywgY29uc3Qgc3A8SUNyeXB0b1BsdWdpbj4gJnBsdWdpbikgeworICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICBtQ3J5cHRvUGx1Z2luID0gcGx1Z2luOworICAgICAgICAgIG1DcnlwdG9QbHVnaW5WMV80ID0gZHJtOjpWMV80OjpJQ3J5cHRvUGx1Z2luOjpjYXN0RnJvbShtQ3J5cHRvUGx1Z2luKTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgaWYgKCFtQ3J5cHRvUGx1Z2luICYmICFtQ3J5cHRvUGx1Z2luVjFfNCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDbGVhcktleUZ1enplcjo6aW52b2tlRHJtKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICghaW52b2tlRHJtRmFjdG9yeSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIGludm9rZURybVBsdWdpbihkYXRhLCBzaXplKTsKK30KKwordm9pZCBDbGVhcktleUZ1enplcjo6aW52b2tlQ3J5cHRvKGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKKyAgaWYgKCFpbnZva2VDcnlwdG9GYWN0b3J5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW52b2tlQ3J5cHRvUGx1Z2luKGRhdGEpOworfQorCit2b2lkIENsZWFyS2V5RnV6emVyOjpwcm9jZXNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIG1GRFAgPSBuZXcgRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICBpbnZva2VEcm0oZGF0YSwgc2l6ZSk7CisgIGludm9rZUNyeXB0byhkYXRhKTsKKyAgZGVsZXRlIG1GRFA7Cit9CisKK2Jvb2wgQ2xlYXJLZXlGdXp6ZXI6OmluaXQoKSB7CisgIG1DcnlwdG9GYWN0b3J5ID0KKyAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzQ6OmNsZWFya2V5OjpjcmVhdGVDcnlwdG9GYWN0b3J5KCk7CisgIG1Ecm1GYWN0b3J5ID0gYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfNDo6Y2xlYXJrZXk6OmNyZWF0ZURybUZhY3RvcnkoKTsKKyAgaWYgKCFtRHJtRmFjdG9yeSAmJiAhbUNyeXB0b0ZhY3RvcnkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKHNpemUgPCBrQUVTQmxvY2tTaXplKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ2xlYXJLZXlGdXp6ZXIgY2xlYXJLZXlGdXp6ZXI7CisgIGlmIChjbGVhcktleUZ1enplci5pbml0KCkpIHsKKyAgICBjbGVhcktleUZ1enplci5wcm9jZXNzKGRhdGEsIHNpemUpOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCmluZGV4IDc4MzZmOTYuLjEwMTk1MjAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmgKQEAgLTQzMyw4ICs0MzMsNyBAQAogICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzX1YxXzI6Ok9LOwogICAgIH0KIAotICAgIERldmljZUZpbGVzIG1GaWxlSGFuZGxlIEdVQVJERURfQlkobUZpbGVIYW5kbGVMb2NrKTsKLSAgICBNdXRleCBtRmlsZUhhbmRsZUxvY2s7CisgICAgRGV2aWNlRmlsZXMgbUZpbGVIYW5kbGU7CiAgICAgTXV0ZXggbVNlY3VyZVN0b3BMb2NrOwogICAgIE11dGV4IG1TZWN1cml0eUxldmVsTG9jazsKIApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKaW5kZXggYTkwZDgxOC4uMWQ5ODg2MCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvTWVtb3J5RmlsZVN5c3RlbS5oCkBAIC01LDkgKzUsNyBAQAogI2lmbmRlZiBDTEVBUktFWV9NRU1PUllfRklMRV9TWVNURU1fSF8KICNkZWZpbmUgQ0xFQVJLRVlfTUVNT1JZX0ZJTEVfU1lTVEVNX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CiAjaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKQEAgLTUxLDEyICs0OSwxMCBAQAogICAgIHNpemVfdCBXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aE5hbWUsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpOwogCiAgcHJpdmF0ZToKLSAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbU1lbW9yeUZpbGVTeXN0ZW1Mb2NrOwotCiAgICAgLy8gTGljZW5zZSBmaWxlIG5hbWUgaXMgbWFkZSB1cCBvZiBhIHVuaXF1ZSBrZXlTZXRJZCwgdGhlcmVmb3JlLAogICAgIC8vIHRoZSBmaWxlbmFtZSBjYW4gYmUgdXNlZCBhcyB0aGUga2V5IHRvIGxvY2F0ZSBsaWNlbnNlcyBpbiB0aGUKICAgICAvLyBtZW1vcnkgZmlsZSBzeXN0ZW0uCi0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIE1lbW9yeUZpbGU+IG1NZW1vcnlGaWxlU3lzdGVtIEdVQVJERURfQlkobU1lbW9yeUZpbGVTeXN0ZW1Mb2NrKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTWVtb3J5RmlsZT4gbU1lbW9yeUZpbGVTeXN0ZW07CiAKICAgICBzdGQ6OnN0cmluZyBHZXRGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9zZXJ2aWNlLWxhenkubWsKc2ltaWxhcml0eSBpbmRleCA3NyUKcmVuYW1lIGZyb20gc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawpyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvc2VydmljZS1sYXp5Lm1rCmluZGV4IDRjZmVjZmQuLjBkMTZmNGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvc2VydmljZS1sYXp5Lm1rCkBAIC0xLDQgKzEsNSBAQAotIyBDb3B5cmlnaHQgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMSwxMiArMTIsNSBAQAogIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIEJ1aWxkIHRlc3RzCi0KLWluY2x1ZGUgJChMT0NBTF9QQVRIKS90ZXN0cy9BbmRyb2lkLm1rCi0KKyMKK1BST0RVQ1RfUEFDS0FHRVMgKz0gYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS1sYXp5LmNsZWFya2V5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvc2VydmljZS5tawpzaW1pbGFyaXR5IGluZGV4IDc3JQpjb3B5IGZyb20gc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawpjb3B5IHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3NlcnZpY2UubWsKaW5kZXggNGNmZWNmZC4uMTU5ODhmYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5taworKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9zZXJ2aWNlLm1rCkBAIC0xLDQgKzEsNSBAQAotIyBDb3B5cmlnaHQgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMSwxMiArMTIsNSBAQAogIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIEJ1aWxkIHRlc3RzCi0KLWluY2x1ZGUgJChMT0NBTF9QQVRIKS90ZXN0cy9BbmRyb2lkLm1rCi0KKyMKK1BST0RVQ1RfUEFDS0FHRVMgKz0gYW5kcm9pZC5oYXJkd2FyZS5kcm0tc2VydmljZS5jbGVhcmtleQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9PV05FUlMgYi9pbmNsdWRlL09XTkVSUwppbmRleCBkNmJkOTk4Li5lMWQ0ZGI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL09XTkVSUworKysgYi9pbmNsdWRlL09XTkVSUwpAQCAtMSw2ICsxLDYgQEAKIGVsYXVyZW50QGdvb2dsZS5jb20KLWdrYXN0ZW5AZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQoganRpbmtlckBnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCi1tYXJjb25lQGdvb2dsZS5jb20KK2Vzc2lja0Bnb29nbGUuY29tCitwaGlsYnVya0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAppbmRleCAyMDBlOTJkLi5hMWUxNzAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKQEAgLTUzLDYgKzUzLDg0IEBACiAvL0VMX0ZJWE1FIDIwIHNlY29uZHMgbWF5IG5vdCBiZSBlbm91Z2ggYW5kIG11c3QgYmUgcmVjb25jaWxlZCB3aXRoIG5ldyBvYnRhaW5CdWZmZXIgaW1wbGVtZW50YXRpb24KICNkZWZpbmUgTUFYX1JVTl9PRkZMT0FERURfVElNRU9VVF9NUyAyMDAwMCAvLyBhc3N1bWluZyB1cCB0byBhIG1heGltdW0gb2YgMjAgc2Vjb25kcyBvZiBvZmZsb2FkZWQKIAorLy8gZm9yIGF1ZGlvX3RyYWNrX2NibGtfdDo6bVN0YXRlLCB0byBtYXRjaCBUcmFja0Jhc2UuaAorc3RhdGljIGlubGluZSBjb25zdGV4cHIgaW50IENCTEtfU1RBVEVfSURMRSA9IDA7CitzdGF0aWMgaW5saW5lIGNvbnN0ZXhwciBpbnQgQ0JMS19TVEFURV9BQ1RJVkUgPSA2Oworc3RhdGljIGlubGluZSBjb25zdGV4cHIgaW50IENCTEtfU1RBVEVfUEFVU0lORyA9IDc7CisKKy8qKgorICogTWlycm9yZWRWYXJpYWJsZSBpcyBhIGxvY2FsIHZhcmlhYmxlIHdoaWNoIHNpbXVsdGFuZW91c2x5IHVwZGF0ZXMKKyAqIGEgbWlycm9yZWQgc3RvcmFnZSBsb2NhdGlvbi4gIFRoaXMgaXMgdXNlZnVsIGZvciBzZXJ2ZXIgc2lkZSB2YXJpYWJsZXMKKyAqIHdoZXJlIGEgbG9jYWwgY29weSBpcyBrZXB0LCBidXQgYSBjbGllbnQgdmlzaWJsZSBjb3B5IGlzIG9mZmVyZWQgdGhyb3VnaCBzaGFyZWQgbWVtb3J5LgorICoKKyAqIFdlIHVzZSBzdGQ6OmF0b21pYyBhcyB0aGUgZGVmYXVsdCBjb250YWluZXIgY2xhc3MgdG8gYWNjZXNzIHRoaXMgbWVtb3J5LgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBDb250YWluZXIgPSBzdGQ6OmF0b21pYz4KK2NsYXNzIE1pcnJvcmVkVmFyaWFibGUgeworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDPgorICAgIHN0cnVjdCBDb25zdHJhaW50cyB7CisgICAgICAgIC8vIElmIHNldE1pcnJvciBpcyB1c2VkIHdpdGggYSBkaWZmZXJlbnQgdHlwZSBVICE9IFQgcGFzc2VkIGluLAorICAgICAgICAvLyBhcyBhIGdlbmVyYWwgcnVsZSwgdGhlIENvbnRhaW5lciBtdXN0IGlzc3VlIGEgbWVtY3B5IHRvIHJlYWQgb3Igd3JpdGUKKyAgICAgICAgLy8gKG9yIGl0cyBlcXVpdmFsZW50KSB0byBhdm9pZCBwb3NzaWJsZSBzdHJpY3QgYWxpYXNpbmcgaXNzdWVzLgorICAgICAgICAvLyBUaGUgbWVtY3B5IGFsc28gYXZvaWRzIGdhcHMgaW4gc3RydWN0cyBhbmQgYWxpZ25tZW50IGlzc3VlcyB3aXRoIGRpZmZlcmVudCB0eXBlcy4KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIG9rXyA9IGZhbHNlOyAgLy8gQ29udGFpbmVycyBtdXN0IHNwZWNpZnkgY29uc3RyYWludHMuCisgICAgfTsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgWD4KKyAgICBzdHJ1Y3QgQ29uc3RyYWludHM8c3RkOjphdG9taWM8WD4+IHsKKyAgICAgICAgLy8gQXRvbWljcyBmb3JjZSByZWFkIGFuZCB3cml0ZSB0byBtZW1vcnkuCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBvayA9IHN0ZDo6aXNfc2FtZV92PFgsIFQ+IHx8CisgICAgICAgICAgICAgICAgKHN0ZDo6YXRvbWljPFg+Ojppc19hbHdheXNfbG9ja19mcmVlICAgICAgICAgICAgICAgICAgIC8vIG5vIGFkZGl0aW9uYWwgbG9ja2luZworICAgICAgICAgICAgICAgICYmIHNpemVvZihzdGQ6OmF0b21pYzxYPikgPT0gc2l6ZW9mKFgpICAgICAgICAgICAgICAgICAvLyBsYXlvdXQgaWRlbnRpY2FsIHRvIFguCisgICAgICAgICAgICAgICAgJiYgKHN0ZDo6aXNfYXJpdGhtZXRpY192PFg+IHx8IHN0ZDo6aXNfZW51bV92PFg+KSk7ICAgIC8vIE5vIGdhcHMgaW4gdGhlIGxheW91dC4KKyAgICB9OworCitzdGF0aWNfYXNzZXJ0KENvbnN0cmFpbnRzPENvbnRhaW5lcjxUPj46Om9rKTsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNaXJyb3JlZFZhcmlhYmxlKGNvbnN0IFQmIHQpIDogdF97dH0ge30KKworICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gb3BlcmF0b3IKKyAgICBvcGVyYXRvciBUKCkgY29uc3QgeworICAgICAgICByZXR1cm4gdF87CisgICAgfQorCisgICAgTWlycm9yZWRWYXJpYWJsZSYgb3BlcmF0b3I9KGNvbnN0IFQmIHQpIHsKKyAgICAgICAgdF8gPSB0OworICAgICAgICBpZiAobWlycm9yXyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAqbWlycm9yXyA9IHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICAgIHZvaWQgc2V0TWlycm9yKENvbnRhaW5lcjxVPiAqb3RoZXJfbWlycm9yKSB7CisgICAgICAgIC8vIE11Y2ggb2YgdGhlIGNvbmNlcm4gaXMgd2l0aCBUICE9IFUsIGhvd2V2ZXIgdGhlcmUgYXJlIGFkZGl0aW9uYWwgY29uY2VybnMKKyAgICAgICAgLy8gd2hlbiBzdG9yYWdlIHVzZXMgc2hhcmVkIG1lbW9yeSBiZXR3ZWVuIHByb2Nlc3Nlcy4gIEZvciBhdG9taWNzLCBpdCBtdXN0IGJlCisgICAgICAgIC8vIGxvY2sgZnJlZS4KKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoVSkgPT0gc2l6ZW9mKFQpKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChhbGlnbm9mKFUpID09IGFsaWdub2YoVCkpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KENvbnN0cmFpbnRzPENvbnRhaW5lcjxVPj46Om9rKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQ29udGFpbmVyPFU+KSA9PSBzaXplb2YoQ29udGFpbmVyPFQ+KSk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoYWxpZ25vZihDb250YWluZXI8VT4pID09IGFsaWdub2YoQ29udGFpbmVyPFQ+KSk7CisgICAgICAgIGF1dG8gbWlycm9yID0gcmVpbnRlcnByZXRfY2FzdDxDb250YWluZXI8VD4qPihvdGhlcl9taXJyb3IpOworICAgICAgICBpZiAobWlycm9yXyAhPSBtaXJyb3IpIHsKKyAgICAgICAgICAgIG1pcnJvcl8gPSBtaXJyb3I7CisgICAgICAgICAgICBpZiAobWlycm9yICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAqbWlycm9yID0gdF87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBtaXJyb3JfID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBNaXJyb3JlZFZhcmlhYmxlJiBvcGVyYXRvciYoKSBjb25zdCA9IGRlbGV0ZTsKKworcHJvdGVjdGVkOgorICAgIFQgdF97fTsKKyAgICBDb250YWluZXI8VD4qIG1pcnJvcl8gPSBudWxscHRyOworfTsKKwogc3RydWN0IEF1ZGlvVHJhY2tTaGFyZWRTdHJlYW1pbmcgewogICAgIC8vIHNpbWlsYXIgdG8gTkJBSU8gTW9ub1BpcGUKICAgICAvLyBpbiBjb250aW51b3VzbHkgaW5jcmVtZW50aW5nIGZyYW1lIHVuaXRzLCB0YWtlIG1vZHVsbyBidWZmZXIgc2l6ZSwgd2hpY2ggbXVzdCBiZSBhIHBvd2VyIG9mIDIKQEAgLTE4OCw2ICsyNjYsOCBAQAogCiAgICAgdm9sYXRpbGUgICAgaW50MzJfdCAgICAgbUZsYWdzOyAgICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBDQkxLXyoKIAorICAgICAgICAgICAgICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+ICBtU3RhdGU7IC8vIGN1cnJlbnQgVHJhY2tCYXNlIHN0YXRlLgorCiBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdW5pb24gewogICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrU2hhcmVkU3RyZWFtaW5nICAgbVN0cmVhbWluZzsKQEAgLTE5OCw2ICsyNzgsOSBAQAogICAgICAgICAgICAgICAgIC8vIENhY2hlIGxpbmUgYm91bmRhcnkgKDMyIGJ5dGVzKQogfTsKIAorLy8gVE9ETzogZW5zdXJlIHN0YW5kYXJkIGxheW91dC4KKy8vIHN0YXRpY19hc3NlcnQoc3RkOjppc19zdGFuZGFyZF9sYXlvdXRfdjxhdWRpb190cmFja19jYmxrX3Q+KTsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBQcm94eSBmb3Igc2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrLCB0byBpc29sYXRlIGNhbGxlcnMgZnJvbSBuZWVkaW5nIHRvIGtub3cgdGhlIGRldGFpbHMuCkBAIC0zMjMsNiArNDA2LDcgQEAKICAgICAgICAgcmV0dXJuIG1FcG9jaDsKICAgICB9CiAKKyAgICBpbnQzMl90IGdldFN0YXRlKCkgY29uc3QgeyByZXR1cm4gbUNibGstPm1TdGF0ZTsgfQogICAgIHVpbnQzMl90ICAgICAgZ2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclNpemVJbkZyYW1lczsgfQogICAgIC8vIFNlZSBkb2N1bWVudGF0aW9uIGZvciBBdWRpb1RyYWNrOjpzZXRCdWZmZXJTaXplSW5GcmFtZXMoKQogICAgIHVpbnQzMl90ICAgICAgc2V0QnVmZmVyU2l6ZUluRnJhbWVzKHVpbnQzMl90IHJlcXVlc3RlZFNpemUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmgKaW5kZXggMTZlNzk0YS4uZDQwMjVlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oCkBAIC0zOCwxMyArMzgsMTMgQEAKICAgICBWaWRlb0ZyYW1lKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICB1aW50MzJfdCBkaXNwbGF5V2lkdGgsIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICB1aW50MzJfdCB0aWxlV2lkdGgsIHVpbnQzMl90IHRpbGVIZWlnaHQsCi0gICAgICAgICAgICB1aW50MzJfdCBhbmdsZSwgdWludDMyX3QgYnBwLCBib29sIGhhc0RhdGEsIHNpemVfdCBpY2NTaXplKToKKyAgICAgICAgICAgIHVpbnQzMl90IGFuZ2xlLCB1aW50MzJfdCBicHAsIHVpbnQzMl90IGJpdERlcHRoLCBib29sIGhhc0RhdGEsIHNpemVfdCBpY2NTaXplKToKICAgICAgICAgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpLAogICAgICAgICBtRGlzcGxheVdpZHRoKGRpc3BsYXlXaWR0aCksIG1EaXNwbGF5SGVpZ2h0KGRpc3BsYXlIZWlnaHQpLAogICAgICAgICBtVGlsZVdpZHRoKHRpbGVXaWR0aCksIG1UaWxlSGVpZ2h0KHRpbGVIZWlnaHQpLCBtRHVyYXRpb25VcygwKSwKICAgICAgICAgbVJvdGF0aW9uQW5nbGUoYW5nbGUpLCBtQnl0ZXNQZXJQaXhlbChicHApLCBtUm93Qnl0ZXMoYnBwICogd2lkdGgpLAogICAgICAgICBtU2l6ZShoYXNEYXRhID8gKGJwcCAqIHdpZHRoICogaGVpZ2h0KSA6IDApLAotICAgICAgICBtSWNjU2l6ZShpY2NTaXplKSwgbVJlc2VydmVkKDApIHsKKyAgICAgICAgbUljY1NpemUoaWNjU2l6ZSksIG1CaXREZXB0aChiaXREZXB0aCkgewogICAgIH0KIAogICAgIHZvaWQgaW5pdChjb25zdCBWaWRlb0ZyYW1lJiBjb3B5LCBjb25zdCB2b2lkKiBpY2NEYXRhLCBzaXplX3QgaWNjU2l6ZSkgewpAQCAtODQsNyArODQsOSBAQAogICAgIHVpbnQzMl90IG1Sb3dCeXRlczsgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBwZXIgcm93IGJlZm9yZSByb3RhdGlvbgogICAgIHVpbnQzMl90IG1TaXplOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBvZiBmcmFtZSBkYXRhCiAgICAgdWludDMyX3QgbUljY1NpemU7ICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIG9mIElDQyBkYXRhCi0gICAgdWludDMyX3QgbVJlc2VydmVkOyAgICAgICAgLy8gKHBhZGRpbmcgdG8gbWFrZSBtRGF0YSA2NC1iaXQgYWxpZ25lZCkKKyAgICB1aW50MzJfdCBtQml0RGVwdGg7ICAgICAgICAvLyBudW1iZXIgb2YgYml0cyBwZXIgUiAvIEcgLyBCIGNoYW5uZWwKKworICAgIC8vIEFkZGluZyBuZXcgaXRlbXMgbXVzdCBiZSA2NC1iaXQgYWxpZ25lZC4KIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9BbmRyb2lkLm1rIGIvbWVkaWEvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjBhMzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvQW5kcm9pZC5tawpAQCAtMCwwICsxLDUgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzLGF1ZGlvX2VmZmVjdHMuY29uZikpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMsYXVkaW9fZWZmZWN0cy54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCwpKQpkaWZmIC0tZ2l0IGEvbWVkaWEvT1dORVJTIGIvbWVkaWEvT1dORVJTCmluZGV4IDRjZjQ4NzAuLjRhMjViNjggMTAwNjQ0Ci0tLSBhL21lZGlhL09XTkVSUworKysgYi9tZWRpYS9PV05FUlMKQEAgLTEsNyArMSw2IEBACiAjIEJ1ZyBjb21wb25lbnQ6IDEzNDQKIGVsYXVyZW50QGdvb2dsZS5jb20KIGVzc2lja0Bnb29nbGUuY29tCi1oa3VhbmdAZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQogamlhYmluQGdvb2dsZS5jb20KIGptdHJpdmlAZ29vZ2xlLmNvbQpAQCAtMTUsNiArMTQsNyBAQAogcm9iZXJ0c2hpaEBnb29nbGUuY29tCiB0YWtsZWVAZ29vZ2xlLmNvbQogd29uc2lrQGdvb2dsZS5jb20KK3l0YWlAZ29vZ2xlLmNvbQogCiAjIGdvL2FuZHJvaWQtZndrLW1lZGlhLXNvbHV0aW9ucyBmb3IgaW5mbyBvbiBhcmVhcyBvZiBvd25lcnNoaXAuCiBpbmNsdWRlIHBsYXRmb3JtL2ZyYW1ld29ya3MvYXY6L21lZGlhL2phbml0b3JzL21lZGlhX3NvbHV0aW9uc19PV05FUlMKZGlmZiAtLWdpdCBhL21lZGlhL1RFU1RfTUFQUElORyBiL21lZGlhL1RFU1RfTUFQUElORwppbmRleCA1YmM3MjYyLi5hNGMwM2JhIDEwMDY0NAotLS0gYS9tZWRpYS9URVNUX01BUFBJTkcKKysrIGIvbWVkaWEvVEVTVF9NQVBQSU5HCkBAIC0xLDI0ICsxLDcgQEAKIC8vIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhCiB7Ci0gICAgInByZXN1Ym1pdC1sYXJnZSI6IFsKLSAgICAgICAgLy8gcnVucyB3aGVuZXZlciB3ZSBjaGFuZ2Ugc29tZXRoaW5nIGluIHRoaXMgdHJlZQotICAgICAgICB7Ci0gICAgICAgICAgICAibmFtZSI6ICJDdHNNZWRpYVRlc3RDYXNlcyIsCi0gICAgICAgICAgICAib3B0aW9ucyI6IFsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5FbmNvZGVEZWNvZGVUZXN0IgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF0KLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFUZXN0Q2FzZXMiLAotICAgICAgICAgICAgIm9wdGlvbnMiOiBbCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5jdHMuRGVjb2RlRWRpdEVuY29kZVRlc3QiCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgXQotICAgICAgICB9Ci0gICAgXSwKKyAgICAvLyBUT0RPIChiLzIyOTI4NjQwNykgQWRkIEVuY29kZURlY29kZVRlc3QgYW5kIERlY29kZUVkaXRFbmNvZGVUZXN0IHRvCisgICAgLy8gcHJlc3VibWl0LWxhcmdlIG9uY2UgaXNzdWVzIGluIGN1dHRsZWZpc2ggYXJlIGZpeGVkCiAgICAgInByZXN1Ym1pdCI6IFsKICAgICAgICAgewogICAgICAgICAgICAgIm5hbWUiOiAiR3RzTWVkaWFUZXN0Q2FzZXMiLApAQCAtNDAsMjYgKzIzLDggQEAKICAgICAgICAgewogICAgICAgICAgICAgInBhdGgiOiAiZnJhbWV3b3Jrcy9hdi9kcm0vbWVkaWFkcm0vcGx1Z2lucyIKICAgICAgICAgfQotICAgIF0sCi0KLSAgICAicGxhdGludW0tcG9zdHN1Ym1pdCI6IFsKLSAgICAgICAgLy8gcnVucyByZWd1bGFybHksIGluZGVwZW5kZW50IG9mIGNoYW5nZXMgaW4gdGhpcyB0cmVlLgotICAgICAgICAvLyBzaWduYWxzIGlmIGNoYW5nZXMgZWxzZXdoZXJlIGJyZWFrIG1lZGlhIGZ1bmN0aW9uYWxpdHkKLSAgICAgICAgewotICAgICAgICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFUZXN0Q2FzZXMiLAotICAgICAgICAgICAgIm9wdGlvbnMiOiBbCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5jdHMuRW5jb2RlRGVjb2RlVGVzdCIKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBdCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKLSAgICAgICAgICAgICJvcHRpb25zIjogWwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLkRlY29kZUVkaXRFbmNvZGVUZXN0IgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF0KLSAgICAgICAgfQogICAgIF0KKworICAgIC8vIFRPRE8gKGIvMjI5Mjg2NDA3KSBBZGQgRW5jb2RlRGVjb2RlVGVzdCBhbmQgRGVjb2RlRWRpdEVuY29kZVRlc3QgdG8KKyAgICAvLyBwbGF0aW51bS1wb3N0c3VibWl0IG9uY2UgaXNzdWVzIGluIGN1dHRsZWZpc2ggYXJlIGZpeGVkCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLmJwIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5icAppbmRleCBiZTI1ZmZiLi44MjhkODYxIDEwMDY0NAotLS0gYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQuYnAKQEAgLTIxLDExICsyMSwxNCBAQAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvaGFsX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgICAgICJsaWJhYXVkaW9zZXJ2aWNlIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKICAgICAgICAgImxpYmF1ZGlvZmxpbmdlciIsCiAgICAgICAgICJsaWJhdWRpb3BvbGljeXNlcnZpY2UiLAogICAgICAgICAibGliYXVkaW9wcm9jZXNzaW5nIiwKQEAgLTQxLDcgKzQ0LDYgQEAKICAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJ2aWJyYXRvciIsCi0KICAgICBdLAogCiAgICAgLy8gVE9ETyBjaGVjayBpZiB3ZSBzdGlsbCBuZWVkIGFsbCBvZiB0aGVzZSBpbmNsdWRlIGRpcmVjdG9yaWVzCkBAIC01MCw3ICs1Miw2IEBACiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYyIsCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZyIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhL2luY2x1ZGUiLAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIiLAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSIsCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIiwKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKaW5kZXggOGVlMWVmYi4uZTNkYjViNCAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKQEAgLTE3LDExICsxNywxNyBAQAogI2RlZmluZSBMT0dfVEFHICJhdWRpb3NlcnZlciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKwogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5SW5mby5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeVR5cGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lBdWRpb0ZsaW5nZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KQEAgLTMwLDcgKzM2LDYgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogLy8gZnJvbSBpbmNsdWRlX2RpcnMKLSNpbmNsdWRlICJhYXVkaW8vQUF1ZGlvVGVzdGluZy5oIiAvLyBhYXVkaW9fcG9saWN5X3QsIEFBVURJT19QUk9QX01NQVBfUE9MSUNZLCBBQVVESU9fUE9MSUNZXyoKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKICNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlLmgiCkBAIC0zOSw2ICs0NCwxMCBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAordXNpbmcgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeTsKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lJbmZvOwordXNpbmcgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeVR5cGU7CisKIGludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndikKIHsKICAgICAvLyBUT0RPOiB1cGRhdGUgd2l0aCByZWZpbmVkIHBhcmFtZXRlcnMKQEAgLTczLDEwICs4Miw4IEBACiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CiAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgIHNpZ2luZm9fdCBpbmZvOwotICAgICAgICAgICAgaW50IHJldCA9IHdhaXRpZChQX1BJRCwgY2hpbGRQaWQsICZpbmZvLCBXRVhJVEVEIHwgV1NUT1BQRUQgfCBXQ09OVElOVUVEKTsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gRUlOVFIpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCByZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkod2FpdGlkKFBfUElELCBjaGlsZFBpZCwgJmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRVhJVEVEIHwgV1NUT1BQRUQgfCBXQ09OVElOVUVEKSk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTQ2LDEwICsxNTMsMjQgQEAKICAgICAgICAgLy8gQUF1ZGlvU2VydmljZSBzaG91bGQgb25seSBiZSB1c2VkIGluIE9DLU1SMSBhbmQgbGF0ZXIuCiAgICAgICAgIC8vIEFuZCBvbmx5IGVuYWJsZSB0aGUgQUF1ZGlvU2VydmljZSBpZiB0aGUgc3lzdGVtIE1NQVAgcG9saWN5IGV4cGxpY2l0bHkgYWxsb3dzIGl0LgogICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgY2xpZW50IGZyb20gbWlzdXNpbmcgQUF1ZGlvU2VydmljZSB3aGVuIGl0IGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAgIGFhdWRpb19wb2xpY3lfdCBtbWFwUG9saWN5ID0gcHJvcGVydHlfZ2V0X2ludDMyKEFBVURJT19QUk9QX01NQVBfUE9MSUNZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUE9MSUNZX05FVkVSKTsKLSAgICAgICAgaWYgKG1tYXBQb2xpY3kgPT0gQUFVRElPX1BPTElDWV9BVVRPIHx8IG1tYXBQb2xpY3kgPT0gQUFVRElPX1BPTElDWV9BTFdBWVMpIHsKKyAgICAgICAgLy8gSWYgd2UgY2Fubm90IGdldCBhdWRpbyBmbGluZ2VyIGhlcmUsIHRoZXJlIG11c3QgYmUgc29tZSBzZXJpb3VzIHByb2JsZW1zLiBJbiB0aGF0IGNhc2UsCisgICAgICAgIC8vIGF0dGVtcHRpbmcgdG8gY2FsbCBhdWRpbyBmbGluZ2VyIG9uIGEgbnVsbCBwb2ludGVyIGNvdWxkIG1ha2UgdGhlIHByb2Nlc3MgY3Jhc2gKKyAgICAgICAgLy8gYW5kIGF0dHJhY3QgYXR0ZW50aW9ucy4KKyAgICAgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXVkaW9NTWFwUG9saWN5SW5mbz4gcG9saWN5SW5mb3M7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFmLT5nZXRNbWFwUG9saWN5SW5mb3MoCisgICAgICAgICAgICAgICAgQXVkaW9NTWFwUG9saWN5VHlwZTo6REVGQVVMVCwgJnBvbGljeUluZm9zKTsKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBhYXVkaW8gc2VydmljZSB3aGVuIHF1ZXJ5aW5nIG1tYXAgcG9saWN5IHN1Y2NlZWRzIGFuZAorICAgICAgICAvLyBhbnkgb2YgdGhlIHBvbGljeSBzdXBwb3J0cyBNTUFQLgorICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmCisgICAgICAgICAgICBzdGQ6OmFueV9vZihwb2xpY3lJbmZvcy5iZWdpbigpLCBwb2xpY3lJbmZvcy5lbmQoKSwgW10oY29uc3QgYXV0byYgaW5mbykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mby5tbWFwUG9saWN5ID09IEF1ZGlvTU1hcFBvbGljeTo6QVVUTyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tbWFwUG9saWN5ID09IEF1ZGlvTU1hcFBvbGljeTo6QUxXQVlTOworICAgICAgICAgICAgfSkpIHsKICAgICAgICAgICAgIEFBdWRpb1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRCgiRG8gbm90IGluaXQgYWF1ZGlvIHNlcnZpY2UsIHN0YXR1cyAlZCwgcG9saWN5IGluZm8gc2l6ZSAlenUiLAorICAgICAgICAgICAgICAgICAgc3RhdHVzLCBwb2xpY3lJbmZvcy5zaXplKCkpOwogICAgICAgICB9CiAKICAgICAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9PV05FUlMKaW5kZXggNjczM2UwYy4uZGI1NGQ0NSAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUworKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvT1dORVJTCkBAIC0xLDYgKzEsNSBAQAogIyBNZWRpYSB0ZWFtCiBsYWpvc0Bnb29nbGUuY29tCi1wYXdpbkBnb29nbGUuY29tCiB0YWtsZWVAZ29vZ2xlLmNvbQogd29uc2lrQGdvb2dsZS5jb20KIApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAKaW5kZXggMGQxZmUyNy4uOTMwYjAyNiAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwCkBAIC00MCw2ICs0MCwxMiBAQAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wLWRlZmF1bHQiXSwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICAgICAgInRlc3RfY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKKwogICAgIC8vIFRPRE86IGIvMTQ3MTQ3OTkyCiAgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggODAzYTgxMy4uNWUyNmUzYSAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwCkBAIC04MCwzICs4MCwyMiBAQAogICAgIF0sCiAgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAogfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQnVmZmVycG9vbFVuaXRUZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgIkJ1ZmZlcnBvb2xVbml0VGVzdC5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wLjEiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyN2FkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgYnVmZmVycG9vbCB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iQnVmZmVycG9vbFVuaXRUZXN0IiAvPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJCdWZmZXJwb29sVW5pdFRlc3QiIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQnVmZmVycG9vbFVuaXRUZXN0LmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0J1ZmZlcnBvb2xVbml0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0ODQwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0J1ZmZlcnBvb2xVbml0VGVzdC5jcHAKQEAgLTAsMCArMSw1NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlcnBvb2xVbml0VGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGhpZGwvTGVnYWN5U3VwcG9ydC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgdHlwZXMgYmV0d2VlbiBwcm9jZXNzZXMuCitlbnVtIFBpcGVDb21tYW5kIDogaW50MzJfdCB7CisgICAgSU5JVCwKKyAgICBUUkFOU0ZFUiwKKyAgICBTVE9QLAorCisgICAgSU5JVF9PSywKKyAgICBJTklUX0VSUk9SLAorICAgIFRSQU5TRkVSX09LLAorICAgIFRSQU5TRkVSX0VSUk9SLAorICAgIFNUT1BfT0ssCisgICAgU1RPUF9FUlJPUiwKK307CisKKy8vIGNvbW11bmljYXRpb24gbWVzc2FnZSBiZXR3ZWVuIHByb2Nlc3Nlcy4KK3VuaW9uIFBpcGVNZXNzYWdlIHsKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQzMl90IGNvbW1hbmQ7CisgICAgICAgIGludDMyX3QgbWVtc2V0VmFsdWU7CisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkOworICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkOworICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXM7CisgICAgfSBkYXRhOworICAgIGNoYXIgYXJyYXlbMF07Cit9OworCitzdGF0aWMgaW50MzJfdCBrTnVtSXRlcmF0aW9uQ291bnQgPSAxMDsKKworY2xhc3MgQnVmZmVycG9vbFRlc3QgeworICBwdWJsaWM6CisgICAgQnVmZmVycG9vbFRlc3QoKSA6IG1Db25uZWN0aW9uVmFsaWQoZmFsc2UpLCBtTWFuYWdlcihudWxscHRyKSwgbUFsbG9jYXRvcihudWxscHRyKSB7CisgICAgICAgIG1Db25uZWN0aW9uSWQgPSAtMTsKKyAgICAgICAgbVJlY2VpdmVySWQgPSAtMTsKKyAgICB9CisKKyAgICB+QnVmZmVycG9vbFRlc3QoKSB7CisgICAgICAgIGlmIChtQ29ubmVjdGlvblZhbGlkKSB7CisgICAgICAgICAgICBtTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIGJvb2wgbUNvbm5lY3Rpb25WYWxpZDsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgICBDb25uZWN0aW9uSWQgbVJlY2VpdmVySWQ7CisKKyAgICBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtTWFuYWdlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKworICAgIHZvaWQgc2V0dXBCdWZmZXJwb29sTWFuYWdlcigpOworfTsKKwordm9pZCBCdWZmZXJwb29sVGVzdDo6c2V0dXBCdWZmZXJwb29sTWFuYWdlcigpIHsKKyAgICAvLyByZXRyaWV2aW5nIHBlciBwcm9jZXNzIGJ1ZmZlcnBvb2wgb2JqZWN0IHNwPENsaWVudE1hbmFnZXI+CisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIEFTU0VSVF9ORShtTWFuYWdlciwgbnVsbHB0cikgPDwgInVuYWJsZSB0byBnZXQgQ2xpZW50TWFuYWdlclxuIjsKKworICAgIG1BbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yPigpOworICAgIEFTU0VSVF9ORShtQWxsb2NhdG9yLCBudWxscHRyKSA8PCAidW5hYmxlIHRvIGNyZWF0ZSBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvclxuIjsKKworICAgIC8vIHNldC11cCBsb2NhbCBidWZmZXJwb29sIGNvbm5lY3Rpb24gZm9yIHNlbmRlcgorICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTWFuYWdlci0+Y3JlYXRlKG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKQorICAgICAgICAgICAgPDwgInVuYWJsZSB0byBzZXQtdXAgbG9jYWwgYnVmZmVycG9vbCBjb25uZWN0aW9uIGZvciBzZW5kZXJcbiI7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IHRydWU7Cit9CisKK2NsYXNzIEJ1ZmZlcnBvb2xVbml0VGVzdCA6IHB1YmxpYyBCdWZmZXJwb29sVGVzdCwgcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IHNldHVwQnVmZmVycG9vbE1hbmFnZXIoKTsgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUge30KK307CisKK2NsYXNzIEJ1ZmZlcnBvb2xGdW5jdGlvbmFsaXR5VGVzdCA6IHB1YmxpYyBCdWZmZXJwb29sVGVzdCwgcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIG1SZWNlaXZlclBpZCA9IC0xOworCisgICAgICAgIEFTU0VSVF9UUlVFKHBpcGUobUNvbW1hbmRQaXBlRmRzKSA9PSAwKSA8PCAicGlwZSBjb25uZWN0aW9uIGZhaWxlZCBmb3IgY29tbWFuZFBpcGVcbiI7CisgICAgICAgIEFTU0VSVF9UUlVFKHBpcGUobVJlc3VsdFBpcGVGZHMpID09IDApIDw8ICJwaXBlIGNvbm5lY3Rpb24gZmFpbGVkIGZvciByZXN1bHRQaXBlXG4iOworCisgICAgICAgIG1SZWNlaXZlclBpZCA9IGZvcmsoKTsKKyAgICAgICAgQVNTRVJUX1RSVUUobVJlY2VpdmVyUGlkID49IDApIDw8ICJmb3JrIGZhaWxlZFxuIjsKKworICAgICAgICBpZiAobVJlY2VpdmVyUGlkID09IDApIHsKKyAgICAgICAgICAgIGRvUmVjZWl2ZXIoKTsKKyAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGlnbm9yZSBndGVzdCBiZWhhdmlvdXIsIHdhaXQgZm9yIGJlaW5nIGtpbGxlZCBmcm9tIHRlYXJEb3duCisgICAgICAgICAgICBwYXVzZSgpOworICAgICAgICB9CisgICAgICAgIHNldHVwQnVmZmVycG9vbE1hbmFnZXIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtUmVjZWl2ZXJQaWQgPiAwKSB7CisgICAgICAgICAgICBraWxsKG1SZWNlaXZlclBpZCwgU0lHS0lMTCk7CisgICAgICAgICAgICBpbnQgd3N0YXR1czsKKyAgICAgICAgICAgIHdhaXQoJndzdGF0dXMpOworICAgICAgICB9CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBwaWRfdCBtUmVjZWl2ZXJQaWQ7CisgICAgaW50IG1Db21tYW5kUGlwZUZkc1syXTsKKyAgICBpbnQgbVJlc3VsdFBpcGVGZHNbMl07CisKKyAgICBib29sIHNlbmRNZXNzYWdlKGludCogcGlwZXMsIGNvbnN0IFBpcGVNZXNzYWdlJiBtZXNzYWdlKSB7CisgICAgICAgIGludCByZXQgPSB3cml0ZShwaXBlc1sxXSwgbWVzc2FnZS5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgICAgIHJldHVybiByZXQgPT0gc2l6ZW9mKFBpcGVNZXNzYWdlKTsKKyAgICB9CisKKyAgICBib29sIHJlY2VpdmVNZXNzYWdlKGludCogcGlwZXMsIFBpcGVNZXNzYWdlKiBtZXNzYWdlKSB7CisgICAgICAgIGludCByZXQgPSByZWFkKHBpcGVzWzBdLCBtZXNzYWdlLT5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgICAgIHJldHVybiByZXQgPT0gc2l6ZW9mKFBpcGVNZXNzYWdlKTsKKyAgICB9CisKKyAgICB2b2lkIGRvUmVjZWl2ZXIoKTsKK307CisKK3ZvaWQgQnVmZmVycG9vbEZ1bmN0aW9uYWxpdHlUZXN0Ojpkb1JlY2VpdmVyKCkgeworICAgIC8vIENvbmZpZ3VyZXMgdGhlIHRocmVhZHBvb2wgdXNlZCBmb3IgaGFuZGxpbmcgaW5jb21pbmcgUlBDIGNhbGxzIGluIHRoaXMgcHJvY2Vzcy4KKyAgICBjb25maWd1cmVScGNUaHJlYWRwb29sKDEgLyp0aHJlYWRzKi8sIGZhbHNlIC8qd2lsbEpvaW4qLyk7CisgICAgYm9vbCByZWNlaXZlclJ1bm5pbmcgPSB0cnVlOworICAgIHdoaWxlIChyZWNlaXZlclJ1bm5pbmcpIHsKKyAgICAgICAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgcmVjZWl2ZU1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCAmbWVzc2FnZSk7CisgICAgICAgIFJlc3VsdFN0YXR1cyBlcnIgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UuZGF0YS5jb21tYW5kKSB7CisgICAgICAgICAgICBjYXNlIFBpcGVDb21tYW5kOjpJTklUOiB7CisgICAgICAgICAgICAgICAgLy8gcmVjZWl2ZXIgbWFuYWdlciBjcmVhdGlvbgorICAgICAgICAgICAgICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1NYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlckFzU2VydmljZSgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfT0s7CisgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBQaXBlQ29tbWFuZDo6VFJBTlNGRVI6IHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIHJlY2VpdmVIYW5kbGUgPSBudWxscHRyOworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gcmVjZWl2ZUJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBlcnIgPSBtTWFuYWdlci0+cmVjZWl2ZShtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkLCBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQsIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjZWl2ZUhhbmRsZSwgJnJlY2VpdmVCdWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpUUkFOU0ZFUl9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShyZWNlaXZlSGFuZGxlLCBtZXNzYWdlLmRhdGEubWVtc2V0VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlRSQU5TRkVSX0VSUk9SOworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShyZWNlaXZlSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUocmVjZWl2ZUhhbmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlY2VpdmVIYW5kbGUgPSBudWxscHRyOworICAgICAgICAgICAgICAgIHJlY2VpdmVCdWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpUUkFOU0ZFUl9PSzsKKyAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFBpcGVDb21tYW5kOjpTVE9QOiB7CisgICAgICAgICAgICAgICAgZXJyID0gbU1hbmFnZXItPmNsb3NlKG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpTVE9QX0VSUk9SOworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6U1RPUF9PSzsKKyAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgcmVjZWl2ZXJSdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCJ1bmtub3duIGNvbW1hbmQuIHRyeSBhZ2FpbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvLyBCdWZmZXIgYWxsb2NhdGlvbiB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBlYWNoIGJ1ZmZlciBhbGxvY2F0aW9uIGlzIGRvbmUgc3VjY2Vzc2Z1bGx5IHdpdGggdW5pcXVlIGJ1ZmZlciBpZC4KK1RFU1RfRihCdWZmZXJwb29sVW5pdFRlc3QsIEFsbG9jYXRlQnVmZmVyKSB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICAgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+PiBidWZmZXJze307CisgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gYWxsb2NIYW5kbGV7fTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUl0ZXJhdGlvbkNvdW50OyArK2kpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBudWxscHRyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcnt9OworICAgICAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmaGFuZGxlLCAmYnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykgPDwgImFsbG9jYXRlIGZhaWxlZCBmb3IgIiA8PCBpIDw8ICJpdGVyYXRpb24iOworCisgICAgICAgIGJ1ZmZlcnMucHVzaF9iYWNrKHN0ZDo6bW92ZShidWZmZXIpKTsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgYWxsb2NIYW5kbGUucHVzaF9iYWNrKHN0ZDo6bW92ZShoYW5kbGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUl0ZXJhdGlvbkNvdW50OyArK2kpIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwga051bUl0ZXJhdGlvbkNvdW50OyArK2opIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGJ1ZmZlcnNbaV0tPm1JZCAhPSBidWZmZXJzW2pdLT5tSWQpIDw8ICJhbGxvY2F0ZWQgYnVmZmVycyBhcmUgbm90IHVuaXF1ZSI7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gZGVsZXRlIHRoZSBidWZmZXIgaGFuZGxlcworICAgIGZvciAoYXV0byBoYW5kbGUgOiBhbGxvY0hhbmRsZSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CisgICAgfQorICAgIC8vIGNsZWFyIHRoZSB2ZWN0b3JzCisgICAgYnVmZmVycy5jbGVhcigpOworICAgIGFsbG9jSGFuZGxlLmNsZWFyKCk7Cit9CisKKy8vIEJ1ZmZlciByZWN5Y2xlIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGRlLWFsbG9jYXRlZCBidWZmZXJzIGFyZSByZWN5Y2xlZC4KK1RFU1RfRihCdWZmZXJwb29sVW5pdFRlc3QsIFJlY3ljbGVCdWZmZXIpIHsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgICAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgc3RkOjp2ZWN0b3I8QnVmZmVySWQ+IGJpZHt9OworICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+IGFsbG9jSGFuZGxle307CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtSXRlcmF0aW9uQ291bnQ7ICsraSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyOworICAgICAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmaGFuZGxlLCAmYnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykgPDwgImFsbG9jYXRlIGZhaWxlZCBmb3IgIiA8PCBpIDw8ICJpdGVyYXRpb24iOworCisgICAgICAgIGJpZC5wdXNoX2JhY2soYnVmZmVyLT5tSWQpOworICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICBhbGxvY0hhbmRsZS5wdXNoX2JhY2soc3RkOjptb3ZlKGhhbmRsZSkpOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgIH0KKworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxCdWZmZXJJZD4gc2V0KGJpZC5iZWdpbigpLCBiaWQuZW5kKCkpOworICAgIEFTU0VSVF9FUShzZXQuc2l6ZSgpLCAxKSA8PCAiYnVmZmVycyBhcmUgbm90IHJlY3ljbGVkIHByb3Blcmx5IjsKKworICAgIC8vIGRlbGV0ZSB0aGUgYnVmZmVyIGhhbmRsZXMKKyAgICBmb3IgKGF1dG8gaGFuZGxlIDogYWxsb2NIYW5kbGUpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOworICAgIH0KKyAgICBhbGxvY0hhbmRsZS5jbGVhcigpOworfQorCisvLyBWYWxpZGF0ZSBjYWNoZSBldmljdCBhbmQgaW52YWxpZGF0ZSBBUElzLgorVEVTVF9GKEJ1ZmZlcnBvb2xVbml0VGVzdCwgRmx1c2hUZXN0KSB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICAgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKG1NYW5hZ2VyLCBtQ29ubmVjdGlvbklkLCAmbVJlY2VpdmVySWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTICYmIG1SZWNlaXZlcklkID09IG1Db25uZWN0aW9uSWQpOworCisgICAgLy8gdGVzdGluZyBlbXB0eSBmbHVzaAorICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5mbHVzaChtQ29ubmVjdGlvbklkKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKSA8PCAiZmFpbGVkIHRvIGZsdXNoIGNvbm5lY3Rpb24gOiAiIDw8IG1Db25uZWN0aW9uSWQ7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+PiBzZW5kZXJCdWZmZXJ7fTsKKyAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiBhbGxvY0hhbmRsZXt9OworICAgIHN0ZDo6dmVjdG9yPFRyYW5zYWN0aW9uSWQ+IHRpZHt9OworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IHRpbWVzdGFtcFVze307CisKKyAgICBzdGQ6Om1hcDxUcmFuc2FjdGlvbklkLCBCdWZmZXJJZD4gYnVmZmVyTWFwe307CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1JdGVyYXRpb25Db3VudDsgaSsrKSB7CisgICAgICAgIGludDY0X3QgcG9zdFVzOworICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXJ7fTsKKyAgICAgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmhhbmRsZSwgJmJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spIDw8ICJhbGxvY2F0ZSBmYWlsZWQgZm9yICIgPDwgaSA8PCAiIGl0ZXJhdGlvbiI7CisKKyAgICAgICAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoaGFuZGxlLCBpKSk7CisKKyAgICAgICAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKG1SZWNlaXZlcklkLCBidWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykgPDwgInVuYWJsZSB0byBwb3N0IHNlbmQgdHJhbnNhY3Rpb24gb24gYnVmZmVycG9vbCI7CisKKyAgICAgICAgdGltZXN0YW1wVXMucHVzaF9iYWNrKHBvc3RVcyk7CisgICAgICAgIHRpZC5wdXNoX2JhY2sodHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGJ1ZmZlck1hcC5pbnNlcnQoe3RyYW5zYWN0aW9uSWQsIGJ1ZmZlci0+bUlkfSk7CisKKyAgICAgICAgc2VuZGVyQnVmZmVyLnB1c2hfYmFjayhzdGQ6Om1vdmUoYnVmZmVyKSk7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIGFsbG9jSGFuZGxlLnB1c2hfYmFjayhzdGQ6Om1vdmUoaGFuZGxlKSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgfQorCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmZsdXNoKG1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spIDw8ICJmYWlsZWQgdG8gZmx1c2ggY29ubmVjdGlvbiA6ICIgPDwgbUNvbm5lY3Rpb25JZDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gcmVjZWl2ZXJCdWZmZXJ7fTsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIHJlY3ZIYW5kbGUgPSBudWxscHRyOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUl0ZXJhdGlvbkNvdW50OyBpKyspIHsKKyAgICAgICAgc3RhdHVzID0gbU1hbmFnZXItPnJlY2VpdmUobVJlY2VpdmVySWQsIHRpZFtpXSwgc2VuZGVyQnVmZmVyW2ldLT5tSWQsIHRpbWVzdGFtcFVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdkhhbmRsZSwgJnJlY2VpdmVyQnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykgPDwgInJlY2VpdmUgZmFpbGVkIGZvciBidWZmZXIgIiA8PCBzZW5kZXJCdWZmZXJbaV0tPm1JZDsKKworICAgICAgICAvLyBmaW5kIHRoZSBidWZmZXIgaWQgZnJvbSB0cmFuc2FjdGlvbiBpZAorICAgICAgICBhdXRvIGZpbmRJdCA9IGJ1ZmZlck1hcC5maW5kKHRpZFtpXSk7CisgICAgICAgIEFTU0VSVF9ORShmaW5kSXQsIGJ1ZmZlck1hcC5lbmQoKSkgPDwgImluY29uc2lzdGVudCBidWZmZXIgbWFwcGluZyI7CisKKyAgICAgICAgLy8gYnVmZmVyIGlkIHJlY2VpdmVkIG11c3QgYmUgc2FtZSBhcyB0aGUgYnVmZmVyIGlkIHNlbnQKKyAgICAgICAgQVNTRVJUX0VRKGZpbmRJdC0+c2Vjb25kLCByZWNlaXZlckJ1ZmZlci0+bUlkKSA8PCAiaW52YWxpZCBidWZmZXIgcmVjZWl2ZWQiOworCisgICAgICAgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmVjdkhhbmRsZSwgaSkpCisgICAgICAgICAgICAgICAgPDwgIk1lc3NhZ2UgcmVjZWl2ZWQgbm90IHNhbWUgYXMgdGhhdCBzZW50IjsKKworICAgICAgICBidWZmZXJNYXAuZXJhc2UoZmluZEl0KTsKKyAgICAgICAgaWYgKHJlY3ZIYW5kbGUpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UocmVjdkhhbmRsZSk7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShyZWN2SGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICByZWN2SGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgcmVjZWl2ZXJCdWZmZXIucmVzZXQoKTsKKyAgICB9CisKKyAgICBBU1NFUlRfRVEoYnVmZmVyTWFwLnNpemUoKSwgMCkgPDwgImJ1ZmZlcnMgcmVjZWl2ZWQgaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgYnVmZmVycyBzZW50IjsKKworICAgIGZvciAoYXV0byBoYW5kbGUgOiBhbGxvY0hhbmRsZSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CisgICAgfQorICAgIGFsbG9jSGFuZGxlLmNsZWFyKCk7CisgICAgc2VuZGVyQnVmZmVyLmNsZWFyKCk7CisgICAgdGltZXN0YW1wVXMuY2xlYXIoKTsKK30KKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QgYmV0d2VlbiBwcm9jZXNzZXMuCitURVNUX0YoQnVmZmVycG9vbEZ1bmN0aW9uYWxpdHlUZXN0LCBUcmFuc2ZlckJ1ZmZlcikgeworICAgIC8vIGluaXRpYWxpemUgdGhlIHJlY2VpdmVyCisgICAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUOworICAgIHNlbmRNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgbWVzc2FnZSk7CisgICAgQVNTRVJUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSkgPDwgInJlY2VpdmVNZXNzYWdlIGZhaWxlZFxuIjsKKyAgICBBU1NFUlRfRVEobWVzc2FnZS5kYXRhLmNvbW1hbmQsIFBpcGVDb21tYW5kOjpJTklUX09LKSA8PCAicmVjZWl2ZXIgaW5pdCBmYWlsZWQiOworCisgICAgYW5kcm9pZDo6c3A8SUNsaWVudE1hbmFnZXI+IHJlY2VpdmVyID0gSUNsaWVudE1hbmFnZXI6OmdldFNlcnZpY2UoKTsKKyAgICBBU1NFUlRfTkUocmVjZWl2ZXIsIG51bGxwdHIpIDw8ICJnZXRTZXJ2aWNlIGZhaWxlZCBmb3IgcmVjZWl2ZXJcbiI7CisKKyAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZDsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKHJlY2VpdmVyLCBtQ29ubmVjdGlvbklkLCAmcmVjZWl2ZXJJZCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykKKyAgICAgICAgICAgIDw8ICJyZWdpc3RlclNlbmRlciBmYWlsZWQgZm9yIGNvbm5lY3Rpb24gaWQgIiA8PCBtQ29ubmVjdGlvbklkIDw8ICJcbiI7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgICAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUl0ZXJhdGlvbkNvdW50OyArK2kpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBudWxscHRyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmhhbmRsZSwgJmJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spIDw8ICJhbGxvY2F0ZSBmYWlsZWQgZm9yICIgPDwgaSA8PCAiaXRlcmF0aW9uIjsKKworICAgICAgICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChoYW5kbGUsIGkpKQorICAgICAgICAgICAgICAgIDw8ICJGaWxsIGZhaWwgZm9yIGJ1ZmZlciBoYW5kbGUgIiA8PCBoYW5kbGUgPDwgIlxuIjsKKworICAgICAgICAvLyBzZW5kIHRoZSBidWZmZXIgdG8gdGhlIHJlY2VpdmVyCisgICAgICAgIGludDY0X3QgcG9zdFVzOworICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChyZWNlaXZlcklkLCBidWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykKKyAgICAgICAgICAgICAgICA8PCAicG9zdFNlbmQgZmFpbGVkIGZvciByZWNlaXZlciAiIDw8IHJlY2VpdmVySWQgPDwgIlxuIjsKKworICAgICAgICAvLyBQaXBlTWVzc2FnZSBtZXNzYWdlOworICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpUUkFOU0ZFUjsKKyAgICAgICAgbWVzc2FnZS5kYXRhLm1lbXNldFZhbHVlID0gaTsKKyAgICAgICAgbWVzc2FnZS5kYXRhLmJ1ZmZlcklkID0gYnVmZmVyLT5tSWQ7CisgICAgICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQgPSByZWNlaXZlcklkOworICAgICAgICBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgICAgIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcyA9IHBvc3RVczsKKyAgICAgICAgc2VuZE1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgLy8gZGVsZXRlIGJ1ZmZlciBoYW5kbGUKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKSA8PCAicmVjZWl2ZU1lc3NhZ2UgZmFpbGVkXG4iOworICAgICAgICBBU1NFUlRfRVEobWVzc2FnZS5kYXRhLmNvbW1hbmQsIFBpcGVDb21tYW5kOjpUUkFOU0ZFUl9PSykKKyAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgZXJyb3IgZHVyaW5nIGJ1ZmZlciB0cmFuc2ZlclxuIjsKKyAgICB9CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6U1RPUDsKKyAgICBzZW5kTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsIG1lc3NhZ2UpOworICAgIEFTU0VSVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpIDw8ICJyZWNlaXZlTWVzc2FnZSBmYWlsZWRcbiI7CisgICAgQVNTRVJUX0VRKG1lc3NhZ2UuZGF0YS5jb21tYW5kLCBQaXBlQ29tbWFuZDo6U1RPUF9PSykKKyAgICAgICAgICAgIDw8ICJyZWNlaXZlZCBlcnJvciBkdXJpbmcgYnVmZmVyIHRyYW5zZmVyXG4iOworfQorCisvKiBWYWxpZGF0ZSBidWZmZXJwb29sIGZvciBmb2xsb3dpbmcgY29ybmVyIGNhc2VzOgorIDEuIGludmFsaWQgY29ubmVjdGlvbklECisgMi4gaW52YWxpZCByZWNlaXZlcgorIDMuIHdoZW4gc2VuZGVyIGlzIG5vdCByZWdpc3RlcmVkCisgNC4gd2hlbiBjb25uZWN0aW9uIGlzIGNsb3NlZAorKi8KKy8vIFRPRE86IEVuYWJsZSB3aGVuIHRoZSBpc3N1ZSBpbiBiLzIxMjE5NjQ5NSBpcyBmaXhlZAorVEVTVF9GKEJ1ZmZlcnBvb2xGdW5jdGlvbmFsaXR5VGVzdCwgRElTQUJMRURfVmFsaWRpdHlUZXN0KSB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICAgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHNlbmRlckJ1ZmZlcjsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKworICAgIC8vIGNhbGwgYWxsb2NhdGUoKSBvbiBhIHJhbmRvbSBjb25uZWN0aW9uIGlkCisgICAgQ29ubmVjdGlvbklkIHJhbmRvbUlkID0gcmFuZCgpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUocmFuZG9tSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmc2VuZGVyQnVmZmVyKTsKKyAgICBFWFBFQ1RfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQpOworCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZXIKKyAgICBQaXBlTWVzc2FnZSBtZXNzYWdlOworICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVQ7CisgICAgc2VuZE1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICBBU1NFUlRfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKSA8PCAicmVjZWl2ZU1lc3NhZ2UgZmFpbGVkXG4iOworICAgIEFTU0VSVF9FUShtZXNzYWdlLmRhdGEuY29tbWFuZCwgUGlwZUNvbW1hbmQ6OklOSVRfT0spIDw8ICJyZWNlaXZlciBpbml0IGZhaWxlZCI7CisKKyAgICBhbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgICAgc2VuZGVyQnVmZmVyLnJlc2V0KCk7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmc2VuZGVyQnVmZmVyKTsKKworICAgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGFsbG9jSGFuZGxlLCAweDc3KSk7CisKKyAgICAvLyBzZW5kIGJ1ZmZlcnMgdy9vIHJlZ2lzdGVyaW5nIHNlbmRlcgorICAgIGludDY0X3QgcG9zdFVzOworICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKworICAgIC8vIHJhbmRvbSByZWNlaXZlcgorICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChyYW5kb21JZCwgc2VuZGVyQnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgICAgQVNTRVJUX05FKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykgPDwgImJ1ZmZlcnBvb2wgc2hvdWxkbid0IGFsbG93IHNlbmQgb24gcmFuZG9tIHJlY2VpdmVyIjsKKworICAgIC8vIGVzdGFibGlzaCBjb25uZWN0aW9uCisgICAgYW5kcm9pZDo6c3A8SUNsaWVudE1hbmFnZXI+IHJlY2VpdmVyID0gSUNsaWVudE1hbmFnZXI6OmdldFNlcnZpY2UoKTsKKyAgICBBU1NFUlRfTkUocmVjZWl2ZXIsIG51bGxwdHIpIDw8ICJnZXRTZXJ2aWNlIGZhaWxlZCBmb3IgcmVjZWl2ZXJcbiI7CisKKyAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZDsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIG1Db25uZWN0aW9uSWQsICZyZWNlaXZlcklkKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKQorICAgICAgICAgICAgPDwgInJlZ2lzdGVyU2VuZGVyIGZhaWxlZCBmb3IgY29ubmVjdGlvbiBpZCAiIDw8IG1Db25uZWN0aW9uSWQgPDwgIlxuIjsKKworICAgIGFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICBzZW5kZXJCdWZmZXIucmVzZXQoKTsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZzZW5kZXJCdWZmZXIpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIFJlc3VsdFN0YXR1czo6T0spIDw8ICJhbGxvY2F0ZSBmYWlsZWQgZm9yIGNvbm5lY3Rpb24gIiA8PCBtQ29ubmVjdGlvbklkOworCisgICAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoYWxsb2NIYW5kbGUsIDB4ODgpKTsKKworICAgIC8vIHNlbmQgdGhlIGJ1ZmZlciB0byB0aGUgcmVjZWl2ZXIKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgc2VuZGVyQnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgUmVzdWx0U3RhdHVzOjpPSykgPDwgInBvc3RTZW5kIGZhaWxlZCBmb3IgcmVjZWl2ZXIgIiA8PCByZWNlaXZlcklkIDw8ICJcbiI7CisKKyAgICAvLyBQaXBlTWVzc2FnZSBtZXNzYWdlOworICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlRSQU5TRkVSOworICAgIG1lc3NhZ2UuZGF0YS5tZW1zZXRWYWx1ZSA9IDB4ODg7CisgICAgbWVzc2FnZS5kYXRhLmJ1ZmZlcklkID0gc2VuZGVyQnVmZmVyLT5tSWQ7CisgICAgbWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCA9IHJlY2VpdmVySWQ7CisgICAgbWVzc2FnZS5kYXRhLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcyA9IHBvc3RVczsKKyAgICBzZW5kTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsIG1lc3NhZ2UpOworICAgIEFTU0VSVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpIDw8ICJyZWNlaXZlTWVzc2FnZSBmYWlsZWRcbiI7CisgICAgQVNTRVJUX0VRKG1lc3NhZ2UuZGF0YS5jb21tYW5kLCBQaXBlQ29tbWFuZDo6VFJBTlNGRVJfT0spCisgICAgICAgICAgICA8PCAicmVjZWl2ZWQgZXJyb3IgZHVyaW5nIGJ1ZmZlciB0cmFuc2ZlclxuIjsKKworICAgIGlmIChhbGxvY0hhbmRsZSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGFsbG9jSGFuZGxlKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoYWxsb2NIYW5kbGUpOworICAgIH0KKworICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlNUT1A7CisgICAgc2VuZE1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICBBU1NFUlRfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKSA8PCAicmVjZWl2ZU1lc3NhZ2UgZmFpbGVkXG4iOworICAgIEFTU0VSVF9FUShtZXNzYWdlLmRhdGEuY29tbWFuZCwgUGlwZUNvbW1hbmQ6OlNUT1BfT0spCisgICAgICAgICAgICA8PCAicmVjZWl2ZWQgZXJyb3IgZHVyaW5nIGJ1ZmZlciB0cmFuc2ZlclxuIjsKKworICAgIC8vIHRyeSB0byBzZW5kIG1zZyB0byBjbG9zZWQgY29ubmVjdGlvbgorICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChyZWNlaXZlcklkLCBzZW5kZXJCdWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgICBBU1NFUlRfTkUoc3RhdHVzLCBSZXN1bHRTdGF0dXM6Ok9LKSA8PCAiYnVmZmVycG9vbCBzaG91bGRuJ3QgYWxsb3cgc2VuZCBvbiBjbG9zZWQgY29ubmVjdGlvbiI7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpkZXRhaWxzOjpzZXRUcmVibGVUZXN0aW5nT3ZlcnJpZGUodHJ1ZSk7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvT1dORVJTIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvT1dORVJTCmluZGV4IDY3MzNlMGMuLmRiNTRkNDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL09XTkVSUworKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9PV05FUlMKQEAgLTEsNiArMSw1IEBACiAjIE1lZGlhIHRlYW0KIGxham9zQGdvb2dsZS5jb20KLXBhd2luQGdvb2dsZS5jb20KIHRha2xlZUBnb29nbGUuY29tCiB3b25zaWtAZ29vZ2xlLmNvbQogCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9SRUFETUUubWQgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmZDk2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL1JFQURNRS5tZApAQCAtMCwwICsxLDMzIEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgQnVmZmVycG9vbCA6CitUaGUgQnVmZmVycG9vbCBUZXN0IFN1aXRlIHZhbGlkYXRlcyBidWZmZXJwb29sIGxpYnJhcnkgaW4gYW5kcm9pZC4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gQnVmZmVycG9vbFVuaXRUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L0J1ZmZlcnBvb2xVbml0VGVzdC9CdWZmZXJwb29sVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9CdWZmZXJwb29sVW5pdFRlc3QvQnVmZmVycG9vbFVuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogQnVmZmVycG9vbFVuaXRUZXN0CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvQnVmZmVycG9vbFVuaXRUZXN0CitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IEJ1ZmZlcnBvb2xVbml0VGVzdAorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvT1dORVJTIGIvbWVkaWEvY29kZWMyL09XTkVSUwppbmRleCA0NmE5ZmNhLi43ZDQwMDQxIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvT1dORVJTCisrKyBiL21lZGlhL2NvZGVjMi9PV05FUlMKQEAgLTEsNSArMSw0IEBACiBzZXQgbm9wYXJlbnQKIHdvbnNpa0Bnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCi1wYXdpbkBnb29nbGUuY29tCiB0YWtsZWVAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL1RFU1RfTUFQUElORyBiL21lZGlhL2NvZGVjMi9URVNUX01BUFBJTkcKaW5kZXggNmFjNDIxMC4uOTBiYjA1NCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL1RFU1RfTUFQUElORworKysgYi9tZWRpYS9jb2RlYzIvVEVTVF9NQVBQSU5HCkBAIC04LDcgKzgsMTggQEAKICAgXSwKICAgInByZXN1Ym1pdC1sYXJnZSI6IFsKICAgICB7Ci0gICAgICAibmFtZSI6ICJDdHNNZWRpYVRlc3RDYXNlcyIsCisgICAgICAibmFtZSI6ICJDdHNNZWRpYU1pc2NUZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAiZXhjbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFBdWRpb1Rlc3RDYXNlcyIsCiAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgewogICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdCIKQEAgLTE4LDEwICsyOSw1NCBAQAogICAgICAgICB9LAogICAgICAgICAvLyBUT0RPOiBiLzE0OTMxNDQxOQogICAgICAgICB7Ci0gICAgICAgICAgImV4Y2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLkF1ZGlvUGxheWJhY2tDYXB0dXJlVGVzdCIKKyAgICAgICAgICAiZXhjbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5hdWRpby5jdHMuQXVkaW9QbGF5YmFja0NhcHR1cmVUZXN0IgogICAgICAgICB9LAogICAgICAgICB7Ci0gICAgICAgICAgImV4Y2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLkF1ZGlvUmVjb3JkVGVzdCIKKyAgICAgICAgICAiZXhjbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5hdWRpby5jdHMuQXVkaW9SZWNvcmRUZXN0IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNNZWRpYURlY29kZXJUZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAiZXhjbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFFbmNvZGVyVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhQ29kZWNUZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAiZXhjbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZSIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFQbGF5ZXJUZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAiZXhjbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5SZXF1aXJlc0RldmljZSIKICAgICAgICAgfQogICAgICAgXQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKaW5kZXggNTdjZGNkMC4uNGU0YTlhMSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKQEAgLTIyMSw2ICsyMjEsMTIgQEAKICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNPdXRwdXRMb3VkbmVzcywgdmFsdWUpLmluUmFuZ2UoLTU3Ljc1LCAwLjI1KX0pCiAgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjT3V0cHV0TG91ZG5lc3MpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obUNoYW5uZWxNYXNrLCBDMl9QQVJBTUtFWV9DSEFOTkVMX01BU0spCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxNYXNrSW5mbzo6b3V0cHV0KDB1LCAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsTWFzaywgdmFsdWUpLmluUmFuZ2UoMCwgNDI5NDk2NzI5Mil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxNYXNrKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgfQogCiAgICAgYm9vbCBpc0FkdHMoKSBjb25zdCB7IHJldHVybiBtQWFjRm9ybWF0LT52YWx1ZSA9PSBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTOyB9CkBAIC0yNTUsNiArMjYxLDcgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNBbGJ1bU1vZGVUdW5pbmc6OmlucHV0PiBtRHJjQWxidW1Nb2RlOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heENoYW5uZWxDb3VudEluZm86OmlucHV0PiBtTWF4Q2hhbm5lbENvdW50OwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY091dHB1dExvdWRuZXNzVHVuaW5nOjpvdXRwdXQ+IG1EcmNPdXRwdXRMb3VkbmVzczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsTWFza0luZm86Om91dHB1dD4gbUNoYW5uZWxNYXNrOwogICAgIC8vIFRPRE8gQWRkIDogQzJTdHJlYW1BYWNTYnJNb2RlVHVuaW5nCiB9OwogCkBAIC04MjksOSArODM2LDExIEBACiAKICAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlKTsKICAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbE1hc2tJbmZvOjpvdXRwdXQgY2hhbm5lbE1hc2tJbmZvKDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgbWFza0Zyb21Db3VudChtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpKTsKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CiAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvLCAmY2hhbm5lbE1hc2tJbmZvIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAmZmFpbHVyZXMpOwogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKQEAgLTg0MCw2ICs4NDksNyBAQAogICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YSAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0OwogICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KGNoYW5uZWxNYXNrSW5mbykpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOwogICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwpAQCAtMTA1Niw2ICsxMDY2LDQ3IEBACiAgICAgfQogfQogCisvLyBkZWZpbml0aW9ucyBiYXNlZCBvbiBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9ybWF0LkNIQU5ORUxfT1VUXyoKKyNkZWZpbmUgQ0hBTk5FTF9PVVRfRkwgIDB4NAorI2RlZmluZSBDSEFOTkVMX09VVF9GUiAgMHg4CisjZGVmaW5lIENIQU5ORUxfT1VUX0ZDICAweDEwCisjZGVmaW5lIENIQU5ORUxfT1VUX0xGRSAweDIwCisjZGVmaW5lIENIQU5ORUxfT1VUX0JMICAweDQwCisjZGVmaW5lIENIQU5ORUxfT1VUX0JSICAweDgwCisjZGVmaW5lIENIQU5ORUxfT1VUX1NMICAweDgwMAorI2RlZmluZSBDSEFOTkVMX09VVF9TUiAgMHgxMDAwCisKK3VpbnQzMl90IEMyU29mdEFhY0RlYzo6bWFza0Zyb21Db3VudCh1aW50MzJfdCBjaGFubmVsQ291bnQpIHsKKyAgICAvLyBLRVlfQ0hBTk5FTF9NQVNLIGV4cGVjdHMgbWFza3MgZm9ybWF0dGVkIGFjY29yZGluZyB0byBKYXZhIGFuZHJvaWQubWVkaWEuQXVkaW9Gb3JtYXQKKyAgICAvLyB3aGVyZSB0aGUgdHdvIGxlZnQtbW9zdCBiaXRzIGFyZSAwIGZvciBvdXRwdXQgY2hhbm5lbCBtYXNrCisgICAgc3dpdGNoIChjaGFubmVsQ291bnQpIHsKKyAgICAgICAgY2FzZSAxOiAvLyBtb25vIGlzIGZyb250IGxlZnQKKyAgICAgICAgICAgIHJldHVybiAoQ0hBTk5FTF9PVVRfRkwpOworICAgICAgICBjYXNlIDI6IC8vIHN0ZXJlbworICAgICAgICAgICAgcmV0dXJuIChDSEFOTkVMX09VVF9GTCB8IENIQU5ORUxfT1VUX0ZSKTsKKyAgICAgICAgY2FzZSA0OiAvLyA0LjAgPSBzdGVyZW8gd2l0aCBiYWNrcworICAgICAgICAgICAgcmV0dXJuIChDSEFOTkVMX09VVF9GTCB8IENIQU5ORUxfT1VUX0ZDCisgICAgICAgICAgICAgICAgICAgIHwgQ0hBTk5FTF9PVVRfQkwgfCBDSEFOTkVMX09VVF9CUik7CisgICAgICAgIGNhc2UgNTogLy8gNS4wCisgICAgICAgICAgICByZXR1cm4gKENIQU5ORUxfT1VUX0ZMIHwgQ0hBTk5FTF9PVVRfRkMgfCBDSEFOTkVMX09VVF9GUgorICAgICAgICAgICAgICAgICAgICB8IENIQU5ORUxfT1VUX0JMIHwgQ0hBTk5FTF9PVVRfQlIpOworICAgICAgICBjYXNlIDY6IC8vIDUuMSA9IDUuMCArIExGRQorICAgICAgICAgICAgcmV0dXJuIChDSEFOTkVMX09VVF9GTCB8IENIQU5ORUxfT1VUX0ZDIHwgQ0hBTk5FTF9PVVRfRlIKKyAgICAgICAgICAgICAgICAgICAgfCBDSEFOTkVMX09VVF9CTCB8IENIQU5ORUxfT1VUX0JSCisgICAgICAgICAgICAgICAgICAgIHwgQ0hBTk5FTF9PVVRfTEZFKTsKKyAgICAgICAgY2FzZSA3OiAvLyA3LjAgPSA1LjAgKyBTaWRlcworICAgICAgICAgICAgcmV0dXJuIChDSEFOTkVMX09VVF9GTCB8IENIQU5ORUxfT1VUX0ZDIHwgQ0hBTk5FTF9PVVRfRlIKKyAgICAgICAgICAgICAgICAgICAgfCBDSEFOTkVMX09VVF9CTCB8IENIQU5ORUxfT1VUX0JSCisgICAgICAgICAgICAgICAgICAgIHwgQ0hBTk5FTF9PVVRfU0wgfCBDSEFOTkVMX09VVF9TUik7CisgICAgICAgIGNhc2UgODogLy8gNy4xID0gNy4wICsgTEZFCisgICAgICAgICAgICByZXR1cm4gKENIQU5ORUxfT1VUX0ZMIHwgQ0hBTk5FTF9PVVRfRkMgfCBDSEFOTkVMX09VVF9GUgorICAgICAgICAgICAgICAgICAgICB8IENIQU5ORUxfT1VUX0JMIHwgQ0hBTk5FTF9PVVRfQlIgfCBDSEFOTkVMX09VVF9TTCB8IENIQU5ORUxfT1VUX1NSCisgICAgICAgICAgICAgICAgICAgIHwgQ0hBTk5FTF9PVVRfTEZFKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKwogY2xhc3MgQzJTb2Z0QWFjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgewogcHVibGljOgogICAgIEMyU29mdEFhY0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuaAppbmRleCBhMDNmYzcwLi5iNDVmMTQ4IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5oCkBAIC0xMDEsNiArMTAxLDcgQEAKICAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50IG51bVNhbXBsZXMpOwogICAgIGludDMyX3Qgb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOwogICAgIGludDMyX3Qgb3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCk7CisgICAgdWludDMyX3QgbWFza0Zyb21Db3VudCh1aW50MzJfdCBjaGFubmVsQ291bnQpOwogCiAgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QWFjRGVjKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcAppbmRleCBiYjYzZTFmLi43YWZlYTkxIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAKQEAgLTIyNSw3ICsyMjUsNyBAQAogICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgdWludDY0X3Qgb3V0VGltZVN0YW1wID0KKyAgICBpbnQ2NF90IG91dFRpbWVTdGFtcCA9CiAgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKICAgICBzaXplX3QgaW5Qb3MgPSAwOwogICAgIHNpemVfdCBvdXRQb3MgPSAwOwpAQCAtMjY2LDcgKzI2Niw3IEBACiAgICAgQUxPR1YoImNhdXNhbCBzYW1wbGUgc2l6ZSAlZCIsIG1GaWxsZWRMZW4pOwogICAgIGlmIChtSXNGaXJzdCAmJiBvdXRQb3MgIT0gMCkgewogICAgICAgICBtSXNGaXJzdCA9IGZhbHNlOwotICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCk7CiAgICAgfQogICAgIGZpbGxFbXB0eVdvcmsod29yayk7CiAgICAgaWYgKG91dFBvcyAhPSAwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5oCmluZGV4IDZhYjE0ZGIuLjQ5MjBiMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5oCkBAIC01NCw3ICs1NCw3IEBACiAgICAgYm9vbCBtSXNGaXJzdDsKICAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKICAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7Ci0gICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICBpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CiAgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CiAgICAgaW50MzJfdCBtRmlsbGVkTGVuOwogICAgIGludDE2X3QgbUlucHV0RnJhbWVba051bVNhbXBsZXNQZXJGcmFtZV07CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcAppbmRleCA4NDcyOGFlLi4yOWIxMDQwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAKQEAgLTMwNyw3ICszMDcsNyBAQAogICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9CisgICAgaW50NjRfdCBvdXRUaW1lU3RhbXAgPQogICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIG1JbnRmLT5nZXRTYW1wbGVSYXRlKCk7CiAgICAgc2l6ZV90IGluUG9zID0gMDsKICAgICBzaXplX3Qgb3V0UG9zID0gMDsKQEAgLTM0MSw3ICszNDEsNyBAQAogICAgIEFMT0dWKCJjYXVzYWwgc2FtcGxlIHNpemUgJWQiLCBtRmlsbGVkTGVuKTsKICAgICBpZiAobUlzRmlyc3QgJiYgb3V0UG9zICE9IDApIHsKICAgICAgICAgbUlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpOwogICAgIH0KICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOwogICAgIGlmIChvdXRQb3MgIT0gMCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuaAppbmRleCAwY2M5ZTlmLi43Mjk5MGMzIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuaApAQCAtNTUsNyArNTUsNyBAQAogICAgIGJvb2wgbUlzRmlyc3Q7CiAgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CiAgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOwotICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgaW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOwogICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOwogICAgIGludDMyX3QgbUZpbGxlZExlbjsKICAgICBpbnQxNl90IG1JbnB1dEZyYW1lW2tOdW1TYW1wbGVzUGVyRnJhbWVdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQW5kcm9pZC5icAppbmRleCBjYjk4MzdmLi5hMmE3OWQ1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQW5kcm9pZC5icApAQCAtMjIsOCArMjIsNCBAQAogCiAgICAgc3JjczogWyJDMlNvZnRBb21EZWMuY3BwIl0sCiAgICAgc3RhdGljX2xpYnM6IFsibGliYW9tIl0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL2xpYmFvbS8iLAotICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCmluZGV4IGMwOGNkNTkuLjk2YjgxZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCkBAIC0yNjEsOCArMjYxLDcgQEAKICAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOwogICAgIENSRUFURV9EVU1QX0ZJTEUobU91dEZpbGUpOwogCi0gICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICBtVGltZVN0YXJ0ID0gbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CiB9CiAKIEMyU29mdEFvbURlYzo6fkMyU29mdEFvbURlYygpIHsKQEAgLTQ2MywxOSArNDYyLDE3IEBACiAgICAgaW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpOwogICAgIGlmIChpblNpemUpIHsKICAgICAgICAgdWludDhfdCogYml0c3RyZWFtID0gY29uc3RfY2FzdDx1aW50OF90Kj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOwotICAgICAgICBpbnQzMl90IGRlY29kZVRpbWUgPSAwOwotICAgICAgICBpbnQzMl90IGRlbGF5ID0gMDsKIAogICAgICAgICBEVU1QX1RPX0ZJTEUobU91dEZpbGUsIGJpdHN0cmVhbSwgaW5TaXplKTsKLSAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7Ci0gICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworICAgICAgICBtVGltZVN0YXJ0ID0gc3lzdGVtVGltZSgpOworICAgICAgICBuc2Vjc190IGRlbGF5ID0gbVRpbWVTdGFydCAtIG1UaW1lRW5kOwogCiAgICAgICAgIGFvbV9jb2RlY19lcnJfdCBlcnIgPQogICAgICAgICAgICAgYW9tX2NvZGVjX2RlY29kZShtQ29kZWNDdHgsIGJpdHN0cmVhbSwgaW5TaXplLCAmZnJhbWVJbmRleCk7CiAKLSAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOwotICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOwotICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNGQgZGVsYXk9JTRkXG4iLCBkZWNvZGVUaW1lLCBkZWxheSk7CisgICAgICAgIG1UaW1lRW5kID0gc3lzdGVtVGltZSgpOworICAgICAgICBuc2Vjc190IGRlY29kZVRpbWUgPSBtVGltZUVuZCAtIG1UaW1lU3RhcnQ7CisgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU0IiBQUklkNjQgIiBkZWxheT0lNCIgUFJJZDY0ICJcbiIsIGRlY29kZVRpbWUsIGRlbGF5KTsKIAogICAgICAgICBpZiAoZXJyICE9IEFPTV9DT0RFQ19PSykgewogICAgICAgICAgICAgQUxPR0UoImF2MSBkZWNvZGVyIGZhaWxlZCB0byBkZWNvZGUgZnJhbWUgZXJyOiAlZCIsIGVycik7CkBAIC01MDUsMTI0ICs1MDIsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCi0gICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCi0gICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKLSAgICAgICAgbWVtY3B5KGRzdFksIHNyY1ksIHdpZHRoKTsKLSAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOwotICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGU7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgbWVtY3B5KGRzdFYsIHNyY1YsIHdpZHRoIC8gMik7Ci0gICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICBtZW1jcHkoZHN0VSwgc3JjVSwgd2lkdGggLyAyKTsKLSAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKHVpbnQzMl90ICpkc3QsCi0gICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCi0gICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCi0gICAgICAgIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewotCi0gICAgLy8gQ29udmVydGluZyB0d28gbGluZXMgYXQgYSB0aW1lLCBzbGlnaHRseSBmYXN0ZXIKLSAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyKSB7Ci0gICAgICAgIHVpbnQzMl90ICpkc3RUb3AgPSAodWludDMyX3QgKikgZHN0OwotICAgICAgICB1aW50MzJfdCAqZHN0Qm90ID0gKHVpbnQzMl90ICopIChkc3QgKyBkc3RTdHJpZGUpOwotICAgICAgICB1aW50MTZfdCAqeVNyY1RvcCA9ICh1aW50MTZfdCopIHNyY1k7Ci0gICAgICAgIHVpbnQxNl90ICp5U3JjQm90ID0gKHVpbnQxNl90KikgKHNyY1kgKyBzcmNZU3RyaWRlKTsKLSAgICAgICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QqKSBzcmNVOwotICAgICAgICB1aW50MTZfdCAqdlNyYyA9ICh1aW50MTZfdCopIHNyY1Y7Ci0KLSAgICAgICAgdWludDMyX3QgdTAxLCB2MDEsIHkwMSwgeTIzLCB5NDUsIHk2NywgdXYwLCB1djE7Ci0gICAgICAgIHNpemVfdCB4ID0gMDsKLSAgICAgICAgZm9yICg7IHggPCB3aWR0aCAtIDM7IHggKz0gNCkgewotCi0gICAgICAgICAgICB1MDEgPSAqKCh1aW50MzJfdCopdVNyYyk7IHVTcmMgKz0gMjsKLSAgICAgICAgICAgIHYwMSA9ICooKHVpbnQzMl90Kil2U3JjKTsgdlNyYyArPSAyOwotCi0gICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKLSAgICAgICAgICAgIHkyMyA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsgeVNyY1RvcCArPSAyOwotICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7Ci0gICAgICAgICAgICB5NjcgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7IHlTcmNCb3QgKz0gMjsKLQotICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKLSAgICAgICAgICAgIHV2MSA9ICh1MDEgPj4gMTYpIHwgKCh2MDEgPj4gMTYpIDw8IDIwKTsKLQotICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKLSAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyA+PiAxNikgPDwgMTApIHwgdXYxOwotCi0gICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7Ci0gICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgJiAweDNGRikgPDwgMTApIHwgdXYxOwotICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ID4+IDE2KSA8PCAxMCkgfCB1djE7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYXQgbW9zdCAyIG1vcmUgcGl4ZWxzIHRvIHByb2Nlc3MuIE5vdGUgdGhhdCB3ZSBkb24ndAotICAgICAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KLSAgICAgICAgaWYgKHggPCB3aWR0aCkgewotICAgICAgICAgICAgdTAxID0gKnVTcmM7Ci0gICAgICAgICAgICB2MDEgPSAqdlNyYzsKLSAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsKLSAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsKLSAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7Ci0gICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7Ci0gICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgfQotCi0gICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAqIDI7Ci0gICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKLSAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOwotICAgICAgICBkc3QgKz0gZHN0U3RyaWRlICogMjsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKAotICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAotICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAotICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAotICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKLQotICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICAgICAgICBkc3RZW3hdID0gKHVpbnQ4X3QpKHNyY1lbeF0gPj4gMik7Ci0gICAgICAgIH0KLQotICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7Ci0gICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgewotICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8ICh3aWR0aCArIDEpIC8gMjsgKyt4KSB7Ci0gICAgICAgICAgICBkc3RVW3hdID0gKHVpbnQ4X3QpKHNyY1VbeF0gPj4gMik7Ci0gICAgICAgICAgICBkc3RWW3hdID0gKHVpbnQ4X3QpKHNyY1ZbeF0gPj4gMik7Ci0gICAgICAgIH0KLQotICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7Ci0gICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKLSAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQogYm9vbCBDMlNvZnRBb21EZWM6Om91dHB1dEJ1ZmZlcigKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspCkBAIC02NTcsOSArNTM2LDEwIEBACiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOwogICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gZGVmYXVsdENvbG9yQXNwZWN0czsKICAgICBpZiAoaW1nLT5mbXQgPT0gQU9NX0lNR19GTVRfSTQyMDE2KSB7CiAgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOwotICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gZGVmYXVsdENvbG9yQXNwZWN0cyA9IG1JbnRmLT5nZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKTsKKyAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cyA9IG1JbnRmLT5nZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKTsKIAogICAgICAgICBpZiAoZGVmYXVsdENvbG9yQXNwZWN0cy0+cHJpbWFyaWVzID09IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjAgJiYKICAgICAgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPm1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwICYmCkBAIC03MDYsMjYgKzU4NiwyMSBAQAogICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjViA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9WXTsKIAogICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKSB7Ci0gICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoKHVpbnQzMl90ICopZHN0WSwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlIC8gc2l6ZW9mKHVpbnQzMl90KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTBPclJHQkExMDEwMTAyKAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKilkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgIHNyY1ZTdHJpZGUgLyAyLCBkc3RZU3RyaWRlIC8gc2l6ZW9mKHVpbnQzMl90KSwgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJDb2xvckFzcGVjdHNTdHJ1Y3Q+KGRlZmF1bHRDb2xvckFzcGVjdHMpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdFksIGRzdFUsIGRzdFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZLCBzcmNVLCBzcmNWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVYxMihkc3RZLCBkc3RVLCBkc3RWLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfWV07CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9VXTsKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ZdOwotICAgICAgICBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgICAgICAgICBkc3RZLCBkc3RVLCBkc3RWLCBzcmNZLCBzcmNVLCBzcmNWLAotICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsCi0gICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCi0gICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjhUb1lWMTIoZHN0WSwgZHN0VSwgZHN0Viwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVlN0cmlkZSwgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgfQogICAgIGZpbmlzaFdvcmsoKihpbnQ2NF90KilpbWctPnVzZXJfcHJpdiwgd29yaywgc3RkOjptb3ZlKGJsb2NrKSk7CiAgICAgYmxvY2sgPSBudWxscHRyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5oCmluZGV4IDRjODI2NDcuLjhiOTUzZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmgKQEAgLTE3LDE1ICsxNywxMiBAQAogI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQVYxX0RFQ19IXwogI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQVYxX0RFQ19IXwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSAiYW9tL2FvbV9kZWNvZGVyLmgiCiAjaW5jbHVkZSAiYW9tL2FvbWR4LmgiCiAKLSNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYik7Ci0jZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSAgICAgXAotICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAotICAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOwotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBDMlNvZnRBb21EZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgewpAQCAtNjAsOCArNTcsOCBAQAogICAgIGNoYXIgbU91dEZpbGVbMjAwXTsKICAgICAjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLwogCi0gICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQotICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCisgICAgbnNlY3NfdCBtVGltZVN0YXJ0ID0gMDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQorICAgIG5zZWNzX3QgbVRpbWVFbmQgPSAwOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCiAKICAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOwogICAgIHN0YXR1c190IGRlc3Ryb3lEZWNvZGVyKCk7CkBAIC04NSwxNCArODIsMTMgQEAKICNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICJhdjEiCiAjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEFMT0dEKCJHRU5FUkFURV9GSUxFX05BTUVTIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsIG1UaW1lU3RhcnQudHZfc2VjLCBcCi0gICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl91c2VjLCBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyUiIFBSSWQ2NCAiLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbm93LCBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHNwcmludGYobU91dEZpbGUsICIlc18lbGQuJWxkLiVzIiwgT1VUUFVUX0RVTVBfUEFUSCwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgT1VUUFVUX0RVTVBfRVhUKTsgICAgICBcCisgICAgICAgIHNwcmludGYobU91dEZpbGUsICIlc18lIiBQUklkNjQgIi4lcyIsIE9VVFBVVF9EVU1QX1BBVEgsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbm93LCBPVVRQVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfQogCiAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwCmluZGV4IDBiZTFiZWQuLmE3YWU4NWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwCkBAIC0xOSwxMCArMTksNyBAQAogCiAgICAgc3JjczogWyJDMlNvZnRBdmNEZWMuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9kZWNvZGVyIiwKLSAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9jb21tb24iLAotICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCiB9CiAKIGNjX2xpYnJhcnkgewpAQCAtMzcsMTAgKzM0LDcgQEAKIAogICAgIHNyY3M6IFsiQzJTb2Z0QXZjRW5jLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9saWJhdmMvZW5jb2RlciIsCi0gICAgICAgICJleHRlcm5hbC9saWJhdmMvY29tbW9uIiwKLSAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV25vLXVudXNlZC12YXJpYWJsZSIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCmluZGV4IGNjNDUxN2QuLjk1M2FmYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCkBAIC02NzAsOCArNjcwLDcgQEAKIAogdm9pZCBDMlNvZnRBdmNEZWM6OnJlc2V0UGx1Z2luKCkgewogICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKLSAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOwotICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgIG1UaW1lU3RhcnQgPSBtVGltZUVuZCA9IHN5c3RlbVRpbWUoKTsKIH0KIAogc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpkZWxldGVEZWNvZGVyKCkgewpAQCAtODY2LDE0ICs4NjUsMTMgQEAKICAgICAgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBXT1JEMzIgZGVsYXk7Ci0gICAgICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICAgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworICAgICAgICAgICAgbVRpbWVTdGFydCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgIG5zZWNzX3QgZGVsYXkgPSBtVGltZVN0YXJ0IC0gbVRpbWVFbmQ7CiAgICAgICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2gyNjRkX2RlY29kZV9pcCwgJnNfaDI2NGRfZGVjb2RlX29wKTsKLSAgICAgICAgICAgIFdPUkQzMiBkZWNvZGVUaW1lOwotICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOwotICAgICAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKLSAgICAgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgZGVjb2RlVGltZSwgZGVsYXksCisKKyAgICAgICAgICAgIG1UaW1lRW5kID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgbnNlY3NfdCBkZWNvZGVUaW1lID0gbVRpbWVFbmQgLSBtVGltZVN0YXJ0OworICAgICAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JSIgUFJJZDY0ICIgZGVsYXk9JSIgUFJJZDY0ICIgbnVtQnl0ZXM9JTZkIiwgZGVjb2RlVGltZSwgZGVsYXksCiAgICAgICAgICAgICAgICAgICBwc19kZWNvZGVfb3AtPnU0X251bV9ieXRlc19jb25zdW1lZCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKElWRF9NRU1fQUxMT0NfRkFJTEVEID09IChwc19kZWNvZGVfb3AtPnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuaAppbmRleCA1OWQ1MTg0Li4zNmE0NjNlIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BVkNfREVDX0hfCiAKICNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KIApAQCAtNDMsMTkgKzQ0LDE1IEBACiAjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAogICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIMjY0RF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKICNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCi0jZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOwotI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKLSAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKLSAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKIAogI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKICAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvY2xpcHMvYXZjZF9pbnB1dCIKICAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgImgyNjQiCiAgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCi0gICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyUiIFBSSWQ2NCAiZC4lcyIsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgSU5QVVRfRFVNUF9QQVRILCBub3csICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfQogICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXApAQCAtMTgzLDggKzE4MCw4IEBACiAgICAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOwogCiAgICAgLy8gcHJvZmlsZQotICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7Ci0gICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisgICAgbnNlY3NfdCBtVGltZVN0YXJ0ID0gMDsKKyAgICBuc2Vjc190IG1UaW1lRW5kID0gMDsKICNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCiAgICAgY2hhciBtSW5GaWxlWzIwMF07CiAjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcAppbmRleCBkNjVmZmE1Li44YjQ2ZDNmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcApAQCAtNjU2LDggKzY1Niw3IEBACiAgICAgbUVudHJvcHlNb2RlID0gREVGQVVMVF9FTlRST1BZX01PREU7CiAgICAgbUJmcmFtZXMgPSBERUZBVUxUX0JfRlJBTUVTOwogCi0gICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICBtVGltZVN0YXJ0ID0gbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CiB9CiAKIGMyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0RGltZW5zaW9ucygpIHsKQEAgLTE1MTUsNyArMTUxNCw4IEBACiAgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKICAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKICAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0geVN0cmlkZSAvIDI7Ci0gICAgICAgICAgICBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoeVBsYW5lLCB5U3RyaWRlLCBoZWlnaHQsIGNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqaW5wdXQpOworICAgICAgICAgICAgQ29udmVydFJHQlRvUGxhbmFyWVVWKHlQbGFuZSwgeVN0cmlkZSwgaGVpZ2h0LCBjb252ZXJzaW9uQnVmZmVyLnNpemUoKSwgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2xvckFzcGVjdHMtPm1hdHJpeCwgbUNvbG9yQXNwZWN0cy0+cmFuZ2UpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6IHsKQEAgLTE2NTAsOCArMTY1MCw3IEBACiAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CiAKICAgICBJVl9TVEFUVVNfVCBzdGF0dXM7Ci0gICAgV09SRDMyIHRpbWVEZWxheSA9IDA7Ci0gICAgV09SRDMyIHRpbWVUYWtlbiA9IDA7CisgICAgbnNlY3NfdCB0aW1lRGVsYXkgPSAwOwogICAgIHVpbnQ2NF90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdWxsKCk7CiAKICAgICAvLyBJbml0aWFsaXplIGVuY29kZXIgaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQKQEAgLTE4MTcsMTAgKzE4MTYsMTAgQEAKICAgICAgICAgLy8gICAgICAgICBtSW5GaWxlLCBzX2VuY29kZV9pcC5zX2lucF9idWYuYXB2X2J1ZnNbMF0sCiAgICAgICAgIC8vICAgICAgICAgKG1IZWlnaHQgKiBtU3RyaWRlICogMyAvIDIpKTsKIAotICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKICAgICAgICAgLyogQ29tcHV0ZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZGVjb2RlKCkKICAgICAgICAgICogdG8gc3RhcnQgb2YgY3VycmVudCBkZWNvZGUoKSAqLwotICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIHRpbWVEZWxheSk7CisgICAgICAgIG1UaW1lU3RhcnQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIHRpbWVEZWxheSA9IG1UaW1lU3RhcnQgLSBtVGltZUVuZDsKICAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3ZpZGVvX2VuY29kZV9pcCwgJnNfdmlkZW9fZW5jb2RlX29wKTsKIAogICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKQEAgLTE4NDQsMTEgKzE4NDMsMTEgQEAKICAgICAgICAgbUJ1ZmZlcnNbcHNfZW5jb2RlX2lwLT5zX2lucF9idWYuYXB2X2J1ZnNbMF1dID0gaW5wdXRCdWZmZXI7CiAgICAgfQogCi0gICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOwogICAgIC8qIENvbXB1dGUgdGltZSB0YWtlbiBmb3IgZGVjb2RlKCkgKi8KLSAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIHRpbWVUYWtlbik7CisgICAgbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CisgICAgbnNlY3NfdCB0aW1lVGFrZW4gPSBtVGltZUVuZCAtIG1UaW1lU3RhcnQ7CiAKLSAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgdGltZVRha2VuLCB0aW1lRGVsYXksCisgICAgQUxPR1YoInRpbWVUYWtlbj0lIiBQUklkNjQgImQgZGVsYXk9JSIgUFJJZDY0ICIgbnVtQnl0ZXM9JTZkIiwgdGltZVRha2VuLCB0aW1lRGVsYXksCiAgICAgICAgICAgICBwc19lbmNvZGVfb3AtPnNfb3V0X2J1Zi51NF9ieXRlcyk7CiAKICAgICB2b2lkICpmcmVlZCA9IHBzX2VuY29kZV9vcC0+c19pbnBfYnVmLmFwdl9idWZzWzBdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5oCmluZGV4IDFmZWNkOWUuLjI5Mzg2N2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FWQ19FTkNfSF9fCiAKICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCkBAIC0xMTUsMTQgKzExNiw2IEBACiAvKiogVXNlZCB0byByZW1vdmUgd2FybmluZ3MgYWJvdXQgdW51c2VkIHBhcmFtZXRlcnMgKi8KICNkZWZpbmUgVU5VU0VEKHgpICgodm9pZCkoeCkpCiAKLS8qKiBHZXQgdGltZSAqLwotI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKTsKLQotLyoqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgKi8KLSNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpIFwKLSAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKLSAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKLQogI2RlZmluZSBpdmVfYWxpZ25lZF9tYWxsb2MoYWxpZ25tZW50LCBzaXplKSBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpCiAjZGVmaW5lIGl2ZV9hbGlnbmVkX2ZyZWUoYnVmKSBmcmVlKGJ1ZikKIApAQCAtMTQ4LDYgKzE0MSw3IEBACiAgICAgdmlydHVhbCB+QzJTb2Z0QXZjRW5jKCk7CiAKIHByaXZhdGU6CisgICAgLy8gUkJFIFdoYXQgZG9lcyBPTVggaGF2ZSB0byBkbyB3aXRoIHRoZSBjMiBwbHVnaW4/CiAgICAgLy8gT01YIGlucHV0IGJ1ZmZlcidzIHRpbWVzdGFtcCBhbmQgZmxhZ3MKICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgIGludDY0X3QgbVRpbWVVczsKQEAgLTE1OCw4ICsxNTIsOCBAQAogCiAgICAgaW50MzJfdCBtU3RyaWRlOwogCi0gICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQotICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCisgICAgbnNlY3NfdCBtVGltZVN0YXJ0ID0gMDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQorICAgIG5zZWNzX3QgbVRpbWVFbmQgPSAwOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCiAKICNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCiAgICAgY2hhciBtSW5GaWxlWzIwMF07CkBAIC0yNTksMTQgKzI1MywxNCBAQAogI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQgICAgICJoMjY0IgogCiAjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgXAotICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJSIgUFJJZDY0ICJkLiVzIiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIElOUFVUX0RVTVBfUEFUSCwgbm93LCAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgc3RyY3B5KG1PdXRGaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzcHJpbnRmKG1PdXRGaWxlLCAiJXNfJWxkLiVsZC4lcyIsIE9VVFBVVF9EVU1QX1BBVEgsXAotICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyUiIFBSSWQ2NCAiZC4lcyIsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE9VVFBVVF9EVU1QX1BBVEgsIG5vdywgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgT1VUUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvQW5kcm9pZC5icAppbmRleCAxNjBlMjUwLi42NjQ2NDdhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwCkBAIC05LDYgKzksMTYgQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCiB9CiAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2NvbW1vbl9oZWFkZXJzIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKICAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLApAQCAtMjcsNiArMzcsMTEgQEAKICAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhcmVjdF9oZWFkZXJzIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvd19oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmN1dGlscyIsIC8vIGZvciBwcm9wZXJ0aWVzCiAgICAgICAgICJsaWJsb2ciLCAvLyBmb3IgQUxPRwpAQCAtMzQsNiArNDksMTIgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLCAvLyBmb3IgTXV0ZXhlZAogICAgIF0sCiAKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKKwogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCkBAIC02MSw2ICs4MiwxMSBAQAogICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKICAgICBdLAogCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmFyZWN0X2hlYWRlcnMiLAorICAgICAgICAibGlibmF0aXZld2luZG93X2hlYWRlcnMiLAorICAgIF0sCisKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKICAgICAgICAgImxpYmN1dGlscyIsIC8vIGZvciBwcm9wZXJ0aWVzCkBAIC03NSw2ICsxMDEsMTIgQEAKICAgICBdLAogCiAgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiB9CiAKIC8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBzb2Z0d2FyZSBjb2RlYyBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMyQ29tcG9uZW50LmNwcAppbmRleCA2YzRiN2Q5Li45ZDRmMDQ5IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMyQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMyQ29tcG9uZW50LmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJTaW1wbGVDMkNvbXBvbmVudCIKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlX2J1ZmZlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogCkBAIC0yNiwxMCArMjcsMzkzIEBACiAjaW5jbHVkZSA8QzJDb25maWcuaD4KICNpbmNsdWRlIDxDMkRlYnVnLmg+CiAjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgorI2luY2x1ZGUgPENvZGVjMkNvbW1vblV0aWxzLmg+CiAjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgeworY29uc3RleHByIHVpbnQ4X3Qga05ldXRyYWxVVkJpdERlcHRoOCA9IDEyODsKK2NvbnN0ZXhwciB1aW50MTZfdCBrTmV1dHJhbFVWQml0RGVwdGgxMCA9IDUxMjsKIAordm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyOFRvWVYxMih1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLCBjb25zdCB1aW50OF90ICpzcmNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLCBzaXplX3QgZHN0WVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdFVWU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTW9ub2Nocm9tZSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICAgICAgbWVtY3B5KGRzdFksIHNyY1ksIHdpZHRoKTsKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGU7CisgICAgfQorCisgICAgaWYgKGlzTW9ub2Nocm9tZSkgeworICAgICAgICAvLyBGaWxsIHdpdGggbmV1dHJhbCBVL1YgdmFsdWVzLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChoZWlnaHQgKyAxKSAvIDI7ICsraSkgeworICAgICAgICAgICAgbWVtc2V0KGRzdFYsIGtOZXV0cmFsVVZCaXREZXB0aDgsICh3aWR0aCArIDEpIC8gMik7CisgICAgICAgICAgICBtZW1zZXQoZHN0VSwga05ldXRyYWxVVkJpdERlcHRoOCwgKHdpZHRoICsgMSkgLyAyKTsKKyAgICAgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChoZWlnaHQgKyAxKSAvIDI7ICsraSkgeworICAgICAgICBtZW1jcHkoZHN0Viwgc3JjViwgKHdpZHRoICsgMSkgLyAyKTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgKGhlaWdodCArIDEpIC8gMjsgKytpKSB7CisgICAgICAgIG1lbWNweShkc3RVLCBzcmNVLCAod2lkdGggKyAxKSAvIDIpOworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorfQorCit2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCh1aW50MzJfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1ZTdHJpZGUsIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworICAgIC8vIENvbnZlcnRpbmcgdHdvIGxpbmVzIGF0IGEgdGltZSwgc2xpZ2h0bHkgZmFzdGVyCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMikgeworICAgICAgICB1aW50MzJfdCAqZHN0VG9wID0gKHVpbnQzMl90ICopZHN0OworICAgICAgICB1aW50MzJfdCAqZHN0Qm90ID0gKHVpbnQzMl90ICopKGRzdCArIGRzdFN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICp5U3JjVG9wID0gKHVpbnQxNl90ICopc3JjWTsKKyAgICAgICAgdWludDE2X3QgKnlTcmNCb3QgPSAodWludDE2X3QgKikoc3JjWSArIHNyY1lTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqdVNyYyA9ICh1aW50MTZfdCAqKXNyY1U7CisgICAgICAgIHVpbnQxNl90ICp2U3JjID0gKHVpbnQxNl90ICopc3JjVjsKKworICAgICAgICB1aW50MzJfdCB1MDEsIHYwMSwgeTAxLCB5MjMsIHk0NSwgeTY3LCB1djAsIHV2MTsKKyAgICAgICAgc2l6ZV90IHggPSAwOworICAgICAgICBmb3IgKDsgeCA8IHdpZHRoIC0gMzsgeCArPSA0KSB7CisgICAgICAgICAgICB1MDEgPSAqKCh1aW50MzJfdCAqKXVTcmMpOworICAgICAgICAgICAgdVNyYyArPSAyOworICAgICAgICAgICAgdjAxID0gKigodWludDMyX3QgKil2U3JjKTsKKyAgICAgICAgICAgIHZTcmMgKz0gMjsKKworICAgICAgICAgICAgeTAxID0gKigodWludDMyX3QgKil5U3JjVG9wKTsKKyAgICAgICAgICAgIHlTcmNUb3AgKz0gMjsKKyAgICAgICAgICAgIHkyMyA9ICooKHVpbnQzMl90ICopeVNyY1RvcCk7CisgICAgICAgICAgICB5U3JjVG9wICs9IDI7CisgICAgICAgICAgICB5NDUgPSAqKCh1aW50MzJfdCAqKXlTcmNCb3QpOworICAgICAgICAgICAgeVNyY0JvdCArPSAyOworICAgICAgICAgICAgeTY3ID0gKigodWludDMyX3QgKil5U3JjQm90KTsKKyAgICAgICAgICAgIHlTcmNCb3QgKz0gMjsKKworICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKKyAgICAgICAgICAgIHV2MSA9ICh1MDEgPj4gMTYpIHwgKCh2MDEgPj4gMTYpIDw8IDIwKTsKKworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyA+PiAxNikgPDwgMTApIHwgdXYxOworCisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgJiAweDNGRikgPDwgMTApIHwgdXYxOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ID4+IDE2KSA8PCAxMCkgfCB1djE7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYXQgbW9zdCAyIG1vcmUgcGl4ZWxzIHRvIHByb2Nlc3MuIE5vdGUgdGhhdCB3ZSBkb24ndAorICAgICAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KKyAgICAgICAgaWYgKHggPCB3aWR0aCkgeworICAgICAgICAgICAgdTAxID0gKnVTcmM7CisgICAgICAgICAgICB2MDEgPSAqdlNyYzsKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90ICopeVNyY1RvcCk7CisgICAgICAgICAgICB5NDUgPSAqKCh1aW50MzJfdCAqKXlTcmNCb3QpOworICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9ICgoeTAxID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAoKHk0NSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICB9CisKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlICogMjsKKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RTdHJpZGUgKiAyOworICAgIH0KK30KKworbmFtZXNwYWNlIHsKKworc3RhdGljIEMyQ29sb3JBc3BlY3RzU3RydWN0IEZpbGxNaXNzaW5nQ29sb3JBc3BlY3RzKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb2xvckFzcGVjdHNTdHJ1Y3Q+IGFzcGVjdHMsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgQzJDb2xvckFzcGVjdHNTdHJ1Y3QgX2FzcGVjdHM7CisgICAgaWYgKGFzcGVjdHMpIHsKKyAgICAgICAgX2FzcGVjdHMgPSAqYXNwZWN0czsKKyAgICB9CisKKyAgICAvLyB1c2UgbWF0cml4IGZvciBjb252ZXJzaW9uCisgICAgaWYgKF9hc3BlY3RzLm1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgLy8gaWYgbm90IHNwZWNpZmllZCwgZGVkdWNlIG1hdHJpeCBmcm9tIHByaW1hcmllcworICAgICAgICBpZiAoX2FzcGVjdHMucHJpbWFyaWVzID09IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgLy8gaWYgdGhvc2UgYXJlIGFsc28gbm90IHNwZWNpZmllZCwgZGVkdWNlIHByaW1hcmllcyBmaXJzdCBmcm9tIHRyYW5zZmVyLCB0aGVuIGZyb20KKyAgICAgICAgICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQKKyAgICAgICAgICAgIGlmIChfYXNwZWN0cy50cmFuc2ZlciA9PSBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQKKyAgICAgICAgICAgICAgICAgICAgfHwgX2FzcGVjdHMudHJhbnNmZXIgPT0gQzJDb2xvcjo6VFJBTlNGRVJfSExHKSB7CisgICAgICAgICAgICAgICAgX2FzcGVjdHMucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGggPj0gMzg0MCB8fCBoZWlnaHQgPj0gMzg0MCB8fCB3aWR0aCAqIChpbnQ2NF90KWhlaWdodCA+PSAzODQwICogMTYzNCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHN0YWdlZnJpZ2h0IGRlZmF1bHRzIHRvIEJULjIwMjAgZm9yIFVIRCwgYnV0IHBlcmhhcHMgd2Ugc2hvdWxkIGRlZmF1bHQgdG8KKyAgICAgICAgICAgICAgICAvLyBCVC43MDkgZm9yIG5vbi1IRFIgMTAtYml0IFVIRCBjb250ZW50CisgICAgICAgICAgICAgICAgLy8gKHNlZSBtZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwKQorICAgICAgICAgICAgICAgIF9hc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCh3aWR0aCA8PSA3MjAgJiYgaGVpZ2h0IDw9IDU3NikKKyAgICAgICAgICAgICAgICAgICAgfHwgKGhlaWdodCA8PSA3MjAgJiYgd2lkdGggPD0gNTc2KSkgeworICAgICAgICAgICAgICAgIC8vIG5vdGU6IGl0IGRvZXMgbm90IGFjdHVhbGx5IG1hdHRlciB3aGV0aGVyIHRvIHVzZSA1MjUgb3IgNjI1IGhlcmUgYXMgdGhlCisgICAgICAgICAgICAgICAgLy8gY29udmVyc2lvbiBpcyB0aGUgc2FtZQorICAgICAgICAgICAgICAgIF9hc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19CVDYwMV82MjU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9hc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19CVDcwOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoX2FzcGVjdHMucHJpbWFyaWVzKSB7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzUyNToKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpQUklNQVJJRVNfQlQ2MDFfNjI1OgorICAgICAgICAgICAgX2FzcGVjdHMubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX0JUNjAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpQUklNQVJJRVNfQlQ3MDk6CisgICAgICAgICAgICBfYXNwZWN0cy5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfQlQ3MDk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjA6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBfYXNwZWN0cy5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIF9hc3BlY3RzOworfQorCisvLyBtYXRyaXggY29udmVyc2lvbiBjb2VmZmljaWVudHMKKy8vIChzZWUgbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJ0ZXIvQ29sb3JDb252ZXJ0ZXIuY3BwIGZvciBtb3JlIGRldGFpbHMpCitzdHJ1Y3QgQ29lZmZzIHsKKyAgICBpbnQzMl90IF95LCBfYl91LCBfZ191LCBfZ192LCBfcl92LCBfYzE2OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBDb2VmZnMgR2V0Q29lZmZzRm9yQXNwZWN0cyhjb25zdCBDMkNvbG9yQXNwZWN0c1N0cnVjdCAmYXNwZWN0cykgeworICAgIGJvb2wgaXNGdWxsUmFuZ2UgPSBhc3BlY3RzLnJhbmdlID09IEMyQ29sb3I6OlJBTkdFX0ZVTEw7CisKKyAgICBzd2l0Y2ggKGFzcGVjdHMubWF0cml4KSB7CisgICAgY2FzZSBDMkNvbG9yOjpNQVRSSVhfQlQ2MDE6CisgICAgICAgIC8qKgorICAgICAgICAgKiBCVC42MDE6ICBLX1IgPSAwLjI5OTsgIEtfQiA9IDAuMTE0CisgICAgICAgICAqLworICAgICAgICBpZiAoaXNGdWxsUmFuZ2UpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2VmZnMgeyAxMDI0LCAxNDM2LCAzNTIsIDczMSwgMTgxNSwgMCB9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIENvZWZmcyB7IDExOTYsIDE2MzksIDQwMiwgODM1LCAyMDcyLCA2NCB9OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDMkNvbG9yOjpNQVRSSVhfQlQ3MDk6CisgICAgICAgIC8qKgorICAgICAgICAgKiBCVC43MDk6ICBLX1IgPSAwLjIxMjY7ICBLX0IgPSAwLjA3MjIKKyAgICAgICAgICovCisgICAgICAgIGlmIChpc0Z1bGxSYW5nZSkgeworICAgICAgICAgICAgcmV0dXJuIENvZWZmcyB7IDEwMjQsIDE2MTMsIDE5MiwgNDc5LCAxOTAwLCAwIH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQ29lZmZzIHsgMTE5NiwgMTg0MSwgMjE5LCA1NDcsIDIxNjksIDY0IH07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjA6CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJULjIwMjA6ICBLX1IgPSAwLjI2Mjc7ICBLX0IgPSAwLjA1OTMKKyAgICAgICAgICovCisgICAgICAgIGlmIChpc0Z1bGxSYW5nZSkgeworICAgICAgICAgICAgcmV0dXJuIENvZWZmcyB7IDEwMjQsIDE1MTAsIDE2OSwgNTg1LCAxOTI3LCAwIH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQ29lZmZzIHsgMTE5NiwgMTcyNCwgMTkyLCA2NjgsIDIyMDAsIDY0IH07CisgICAgICAgIH0KKyAgICB9Cit9CisKK30KKworI2RlZmluZSBDTElQMyhtaW4sIHYsIG1heCkgKCgodikgPCAobWluKSkgPyAobWluKSA6ICgoKG1heCkgPiAodikpID8gKHYpIDogKG1heCkpKQordm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1JHQkExMDEwMTAyKAorICAgICAgICB1aW50MzJfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsCisgICAgICAgIHNpemVfdCBzcmNWU3RyaWRlLCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsCisgICAgICAgIHNpemVfdCBoZWlnaHQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbG9yQXNwZWN0c1N0cnVjdD4gYXNwZWN0cykgeworCisgICAgQzJDb2xvckFzcGVjdHNTdHJ1Y3QgX2FzcGVjdHMgPSBGaWxsTWlzc2luZ0NvbG9yQXNwZWN0cyhhc3BlY3RzLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIHN0cnVjdCBDb2VmZnMgY29lZmZzID0gR2V0Q29lZmZzRm9yQXNwZWN0cyhfYXNwZWN0cyk7CisKKyAgICBpbnQzMl90IF95ID0gY29lZmZzLl95OworICAgIGludDMyX3QgX2JfdSA9IGNvZWZmcy5fYl91OworICAgIGludDMyX3QgX25lZ19nX3UgPSAtY29lZmZzLl9nX3U7CisgICAgaW50MzJfdCBfbmVnX2dfdiA9IC1jb2VmZnMuX2dfdjsKKyAgICBpbnQzMl90IF9yX3YgPSBjb2VmZnMuX3JfdjsKKyAgICBpbnQzMl90IF9jMTYgPSBjb2VmZnMuX2MxNjsKKworICAgIC8vIENvbnZlcnRpbmcgdHdvIGxpbmVzIGF0IGEgdGltZSwgc2xpZ2h0bHkgZmFzdGVyCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMikgeworICAgICAgICB1aW50MzJfdCAqZHN0VG9wID0gKHVpbnQzMl90ICopZHN0OworICAgICAgICB1aW50MzJfdCAqZHN0Qm90ID0gKHVpbnQzMl90ICopKGRzdCArIGRzdFN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICp5U3JjVG9wID0gKHVpbnQxNl90ICopc3JjWTsKKyAgICAgICAgdWludDE2X3QgKnlTcmNCb3QgPSAodWludDE2X3QgKikoc3JjWSArIHNyY1lTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqdVNyYyA9ICh1aW50MTZfdCAqKXNyY1U7CisgICAgICAgIHVpbnQxNl90ICp2U3JjID0gKHVpbnQxNl90ICopc3JjVjsKKworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgIGludDMyX3QgdSwgdiwgeTAwLCB5MDEsIHkxMCwgeTExOworICAgICAgICAgICAgdSA9ICp1U3JjIC0gNTEyOworICAgICAgICAgICAgdVNyYyArPSAxOworICAgICAgICAgICAgdiA9ICp2U3JjIC0gNTEyOworICAgICAgICAgICAgdlNyYyArPSAxOworCisgICAgICAgICAgICB5MDAgPSAqeVNyY1RvcCAtIF9jMTY7CisgICAgICAgICAgICB5U3JjVG9wICs9IDE7CisgICAgICAgICAgICB5MDEgPSAqeVNyY1RvcCAtIF9jMTY7CisgICAgICAgICAgICB5U3JjVG9wICs9IDE7CisgICAgICAgICAgICB5MTAgPSAqeVNyY0JvdCAtIF9jMTY7CisgICAgICAgICAgICB5U3JjQm90ICs9IDE7CisgICAgICAgICAgICB5MTEgPSAqeVNyY0JvdCAtIF9jMTY7CisgICAgICAgICAgICB5U3JjQm90ICs9IDE7CisKKyAgICAgICAgICAgIGludDMyX3QgdV9iID0gdSAqIF9iX3U7CisgICAgICAgICAgICBpbnQzMl90IHVfZyA9IHUgKiBfbmVnX2dfdTsKKyAgICAgICAgICAgIGludDMyX3Qgdl9nID0gdiAqIF9uZWdfZ192OworICAgICAgICAgICAgaW50MzJfdCB2X3IgPSB2ICogX3JfdjsKKworICAgICAgICAgICAgaW50MzJfdCB5TXVsdCwgYiwgZywgcjsKKyAgICAgICAgICAgIHlNdWx0ID0geTAwICogX3kgKyA1MTI7CisgICAgICAgICAgICBiID0gKHlNdWx0ICsgdV9iKSAvIDEwMjQ7CisgICAgICAgICAgICBnID0gKHlNdWx0ICsgdl9nICsgdV9nKSAvIDEwMjQ7CisgICAgICAgICAgICByID0gKHlNdWx0ICsgdl9yKSAvIDEwMjQ7CisgICAgICAgICAgICBiID0gQ0xJUDMoMCwgYiwgMTAyMyk7CisgICAgICAgICAgICBnID0gQ0xJUDMoMCwgZywgMTAyMyk7CisgICAgICAgICAgICByID0gQ0xJUDMoMCwgciwgMTAyMyk7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKGIgPDwgMjApIHwgKGcgPDwgMTApIHwgcjsKKworICAgICAgICAgICAgeU11bHQgPSB5MDEgKiBfeSArIDUxMjsKKyAgICAgICAgICAgIGIgPSAoeU11bHQgKyB1X2IpIC8gMTAyNDsKKyAgICAgICAgICAgIGcgPSAoeU11bHQgKyB2X2cgKyB1X2cpIC8gMTAyNDsKKyAgICAgICAgICAgIHIgPSAoeU11bHQgKyB2X3IpIC8gMTAyNDsKKyAgICAgICAgICAgIGIgPSBDTElQMygwLCBiLCAxMDIzKTsKKyAgICAgICAgICAgIGcgPSBDTElQMygwLCBnLCAxMDIzKTsKKyAgICAgICAgICAgIHIgPSBDTElQMygwLCByLCAxMDIzKTsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoYiA8PCAyMCkgfCAoZyA8PCAxMCkgfCByOworCisgICAgICAgICAgICB5TXVsdCA9IHkxMCAqIF95ICsgNTEyOworICAgICAgICAgICAgYiA9ICh5TXVsdCArIHVfYikgLyAxMDI0OworICAgICAgICAgICAgZyA9ICh5TXVsdCArIHZfZyArIHVfZykgLyAxMDI0OworICAgICAgICAgICAgciA9ICh5TXVsdCArIHZfcikgLyAxMDI0OworICAgICAgICAgICAgYiA9IENMSVAzKDAsIGIsIDEwMjMpOworICAgICAgICAgICAgZyA9IENMSVAzKDAsIGcsIDEwMjMpOworICAgICAgICAgICAgciA9IENMSVAzKDAsIHIsIDEwMjMpOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8IChiIDw8IDIwKSB8IChnIDw8IDEwKSB8IHI7CisKKyAgICAgICAgICAgIHlNdWx0ID0geTExICogX3kgKyA1MTI7CisgICAgICAgICAgICBiID0gKHlNdWx0ICsgdV9iKSAvIDEwMjQ7CisgICAgICAgICAgICBnID0gKHlNdWx0ICsgdl9nICsgdV9nKSAvIDEwMjQ7CisgICAgICAgICAgICByID0gKHlNdWx0ICsgdl9yKSAvIDEwMjQ7CisgICAgICAgICAgICBiID0gQ0xJUDMoMCwgYiwgMTAyMyk7CisgICAgICAgICAgICBnID0gQ0xJUDMoMCwgZywgMTAyMyk7CisgICAgICAgICAgICByID0gQ0xJUDMoMCwgciwgMTAyMyk7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKGIgPDwgMjApIHwgKGcgPDwgMTApIHwgcjsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAqIDI7CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlICogMjsKKyAgICB9Cit9CisKK3ZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwT3JSR0JBMTAxMDEwMigKKyAgICAgICAgdWludDMyX3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyY1ksCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLAorICAgICAgICBzaXplX3Qgc3JjVlN0cmlkZSwgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb2xvckFzcGVjdHNTdHJ1Y3Q+IGFzcGVjdHMpIHsKKyAgICBpZiAoaXNBdExlYXN0VCgpKSB7CisgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvUkdCQTEwMTAxMDIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ZTdHJpZGUsIGRzdFN0cmlkZSwgd2lkdGgsIGhlaWdodCwgYXNwZWN0cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0cmlkZSwgd2lkdGgsIGhlaWdodCk7CisgICAgfQorfQorCit2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVYxMih1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLCBjb25zdCB1aW50MTZfdCAqc3JjWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsIHNpemVfdCBkc3RZU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdFVWU3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTW9ub2Nocm9tZSkgeworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICAgICAgICBkc3RZW3hdID0gKHVpbnQ4X3QpKHNyY1lbeF0gPj4gMik7CisgICAgICAgIH0KKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGU7CisgICAgfQorCisgICAgaWYgKGlzTW9ub2Nocm9tZSkgeworICAgICAgICAvLyBGaWxsIHdpdGggbmV1dHJhbCBVL1YgdmFsdWVzLgorICAgICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgeworICAgICAgICAgICAgbWVtc2V0KGRzdFYsIGtOZXV0cmFsVVZCaXREZXB0aDgsICh3aWR0aCArIDEpIC8gMik7CisgICAgICAgICAgICBtZW1zZXQoZHN0VSwga05ldXRyYWxVVkJpdERlcHRoOCwgKHdpZHRoICsgMSkgLyAyKTsKKyAgICAgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8ICh3aWR0aCArIDEpIC8gMjsgKyt4KSB7CisgICAgICAgICAgICBkc3RVW3hdID0gKHVpbnQ4X3QpKHNyY1VbeF0gPj4gMik7CisgICAgICAgICAgICBkc3RWW3hdID0gKHVpbnQ4X3QpKHNyY1ZbeF0gPj4gMik7CisgICAgICAgIH0KKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorfQorCit2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvUDAxMCh1aW50MTZfdCAqZHN0WSwgdWludDE2X3QgKmRzdFVWLCBjb25zdCB1aW50MTZfdCAqc3JjWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsIHNpemVfdCBkc3RZU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdFVWU3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTW9ub2Nocm9tZSkgeworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICAgICAgICBkc3RZW3hdID0gc3JjWVt4XSA8PCA2OworICAgICAgICB9CisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOworICAgIH0KKworICAgIGlmIChpc01vbm9jaHJvbWUpIHsKKyAgICAgICAgLy8gRmlsbCB3aXRoIG5ldXRyYWwgVS9WIHZhbHVlcy4KKyAgICAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgKHdpZHRoICsgMSkgLyAyOyArK3gpIHsKKyAgICAgICAgICAgICAgICBkc3RVVlsyICogeF0gPSBrTmV1dHJhbFVWQml0RGVwdGgxMCA8PCA2OworICAgICAgICAgICAgICAgIGRzdFVWWzIgKiB4ICsgMV0gPSBrTmV1dHJhbFVWQml0RGVwdGgxMCA8PCA2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0VVYgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgKGhlaWdodCArIDEpIC8gMjsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgKHdpZHRoICsgMSkgLyAyOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFVWWzIgKiB4XSA9IHNyY1VbeF0gPDwgNjsKKyAgICAgICAgICAgIGRzdFVWWzIgKiB4ICsgMV0gPSBzcmNWW3hdIDw8IDY7CisgICAgICAgIH0KKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdFVWICs9IGRzdFVWU3RyaWRlOworICAgIH0KK30KIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OnBvcF9mcm9udCgpIHsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrID0gc3RkOjptb3ZlKG1RdWV1ZS5mcm9udCgpLndvcmspOwogICAgIG1RdWV1ZS5wb3BfZnJvbnQoKTsKQEAgLTU5MSw2ICs5NzUsMzcgQEAKICAgICByZXR1cm4gaGFzUXVldWVkV29yazsKIH0KIAoraW50IFNpbXBsZUMyQ29tcG9uZW50OjpnZXRIYWxQaXhlbEZvcm1hdEZvckJpdERlcHRoMTAoYm9vbCBhbGxvd1JHQkExMDEwMTAyKSB7CisgICAgLy8gU2F2ZSBzdXBwb3J0ZWQgaGFsIHBpeGVsIGZvcm1hdHMgZm9yIGJpdCBkZXB0aCBvZiAxMCwgdGhlIGZpcnN0IHRpbWUgdGhpcyBpcyBjYWxsZWQKKyAgICBpZiAoIW1CaXREZXB0aDEwSGFsUGl4ZWxGb3JtYXRzLnNpemUoKSkgeworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGhhbFBpeGVsRm9ybWF0czsKKyAgICAgICAgaGFsUGl4ZWxGb3JtYXRzLnB1c2hfYmFjayhIQUxfUElYRUxfRk9STUFUX1lDQkNSX1AwMTApOworCisgICAgICAgIC8vIHNpbmNlIGFsbG93UkdCQTEwMTAxMDIgY2FuIGNoYW5jZSBpbiBlYWNoIGNhbGwsIGJ1dCBtQml0RGVwdGgxMEhhbFBpeGVsRm9ybWF0cworICAgICAgICAvLyBpcyBwb3B1bGF0ZWQgb25seSBvbmNlLCBhbGxvd1JHQkExMDEwMTAyIGlzIG5vdCBjb25zaWRlcmVkIGF0IHRoaXMgc3RhZ2UuCisgICAgICAgIGhhbFBpeGVsRm9ybWF0cy5wdXNoX2JhY2soSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIpOworCisgICAgICAgIGZvciAoaW50IGhhbFBpeGVsRm9ybWF0IDogaGFsUGl4ZWxGb3JtYXRzKSB7CisgICAgICAgICAgICBpZiAoaXNIYWxQaXhlbEZvcm1hdFN1cHBvcnRlZCgoQUhhcmR3YXJlQnVmZmVyX0Zvcm1hdCloYWxQaXhlbEZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBtQml0RGVwdGgxMEhhbFBpeGVsRm9ybWF0cy5wdXNoX2JhY2soaGFsUGl4ZWxGb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEFkZCBZVjEyIGluIHRoZSBlbmQgYXMgYSBmYWxsLWJhY2sgb3B0aW9uCisgICAgICAgIG1CaXREZXB0aDEwSGFsUGl4ZWxGb3JtYXRzLnB1c2hfYmFjayhIQUxfUElYRUxfRk9STUFUX1lWMTIpOworICAgIH0KKyAgICAvLyBGcm9tIEFuZHJvaWQgVCBvbndhcmRzLCBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMiBjb3JyZXNwb25kcyB0byB0cnVlCisgICAgLy8gUkdCQSAxMDEwMTAyIGZvcm1hdCB1bmxpa2UgZWFybGllciB2ZXJzaW9ucyB3aGVyZSBpdCB3YXMgdXNlZCB0byByZXByZXNlbnQKKyAgICAvLyBZVVZBIDEwMTAxMDIgZGF0YQorICAgIGlmICghaXNBdExlYXN0VCgpKSB7CisgICAgICAgIC8vIFdoZW4gUkdCQTEwMTAxMDIgaXMgbm90IGFsbG93ZWQgYW5kIGlmIHRoZSBmaXJzdCBzdXBwb3J0ZWQgaGFsIHBpeGVsIGlzIGZvcm1hdCBpcworICAgICAgICAvLyBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMiwgdGhlbiByZXR1cm4gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyCisgICAgICAgIGlmICghYWxsb3dSR0JBMTAxMDEwMiAmJiBtQml0RGVwdGgxMEhhbFBpeGVsRm9ybWF0c1swXSA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgeworICAgICAgICAgICAgcmV0dXJuIEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBSZXR1cm4gdGhlIGZpcnN0IGVudHJ5IGZyb20gc3VwcG9ydGVkIGZvcm1hdHMKKyAgICByZXR1cm4gbUJpdERlcHRoMTBIYWxQaXhlbEZvcm1hdHNbMF07Cit9CiBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IFNpbXBsZUMyQ29tcG9uZW50OjpjcmVhdGVMaW5lYXJCdWZmZXIoCiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2ssIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CiAgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2stPnNoYXJlKG9mZnNldCwgc2l6ZSwgOjpDMkZlbmNlKCkpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkludGVyZmFjZS5jcHAKaW5kZXggMjk3NDBkMS4uOTkzZTYwMiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkludGVyZmFjZS5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkludGVyZmFjZS5jcHAKQEAgLTI4LDYgKzI4LDE0IEBACiAKIC8qIFNpbXBsZUludGVyZmFjZSAqLwogCitzdGF0aWMgQzJSIFN1YnNjcmliZWRQYXJhbUluZGljZXNTZXR0ZXIoCisgICAgICAgIGJvb2wgbWF5QmxvY2ssIEMySW50ZXJmYWNlSGVscGVyOjpDMlA8QzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nPiAmbWUpIHsKKyAgICAodm9pZCltYXlCbG9jazsKKyAgICAodm9pZCltZTsKKworICAgIHJldHVybiBDMlI6Ok9rKCk7Cit9CisKIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6QmFzZVBhcmFtcygKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmcmVmbGVjdG9yLAogICAgICAgICBDMlN0cmluZyBuYW1lLApAQCAtMTg2LDcgKzE5NCw3IEBACiAgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nOjpBbGxvY1NoYXJlZCgwdSkpCiAgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtU3Vic2NyaWJlZFBhcmFtSW5kaWNlcywgbS52YWx1ZXNbMF0pLmFueSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobVN1YnNjcmliZWRQYXJhbUluZGljZXMsIG0udmFsdWVzKS5hbnkoKSB9KQotICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZz46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAud2l0aFNldHRlcihTdWJzY3JpYmVkUGFyYW1JbmRpY2VzU2V0dGVyKQogICAgICAgICAgICAgLmJ1aWxkKCkpOwogCiAgICAgLyogVE9ETwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMyQ29tcG9uZW50LmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaAppbmRleCBlNWUxNmQ4Li43NjAwYzViIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaApAQCAtMjYsOCArMjYsMzUgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KIAorc3RydWN0IEMyQ29sb3JBc3BlY3RzU3RydWN0OworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3ZvaWQgY29udmVydFlVVjQyMFBsYW5hcjhUb1lWMTIodWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgY29uc3QgdWludDhfdCAqc3JjWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwgc2l6ZV90IGRzdFlTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc01vbm9jaHJvbWUgPSBmYWxzZSk7CisKK3ZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwT3JSR0JBMTAxMDEwMigKKyAgICAgICAgdWludDMyX3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyY1ksCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLAorICAgICAgICBzaXplX3Qgc3JjVlN0cmlkZSwgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb2xvckFzcGVjdHNTdHJ1Y3Q+IGFzcGVjdHMgPSBudWxscHRyKTsKKwordm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lWMTIodWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgY29uc3QgdWludDE2X3QgKnNyY1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsIHNpemVfdCBzcmNZU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLCBzaXplX3QgZHN0WVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc01vbm9jaHJvbWUgPSBmYWxzZSk7CisKK3ZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9QMDEwKHVpbnQxNl90ICpkc3RZLCB1aW50MTZfdCAqZHN0VVYsIGNvbnN0IHVpbnQxNl90ICpzcmNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwgc2l6ZV90IGRzdFlTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZHN0VVZTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNNb25vY2hyb21lID0gZmFsc2UpOworCiBjbGFzcyBTaW1wbGVDMkNvbXBvbmVudAogICAgICAgICA6IHB1YmxpYyBDMkNvbXBvbmVudCwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8U2ltcGxlQzJDb21wb25lbnQ+IHsKIHB1YmxpYzoKQEAgLTE0OSw2ICsxNzYsNyBAQAogICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgTk9fRFJBSU4gPSB+MHU7CiAKICAgICBDMlJlYWRWaWV3IG1EdW1teVJlYWRWaWV3OworICAgIGludCBnZXRIYWxQaXhlbEZvcm1hdEZvckJpdERlcHRoMTAoYm9vbCBhbGxvd1JHQkExMDEwMTAyKTsKIAogcHJpdmF0ZToKICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IG1JbnRmOwpAQCAtMjMyLDYgKzI2MCw3IEBACiAgICAgY2xhc3MgQmxvY2tpbmdCbG9ja1Bvb2w7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEJsb2NraW5nQmxvY2tQb29sPiBtT3V0cHV0QmxvY2tQb29sOwogCisgICAgc3RkOjp2ZWN0b3I8aW50PiBtQml0RGVwdGgxMEhhbFBpeGVsRm9ybWF0czsKICAgICBTaW1wbGVDMkNvbXBvbmVudCgpID0gZGVsZXRlOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJJbnRlcmZhY2UuaAppbmRleCAyMDUxZDNkLi45MTZmMzkyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJJbnRlcmZhY2UuaApAQCAtMjA5LDYgKzIwOSw3IEBACiAgICAgICAgIHJldHVybiBtZS5GKG1lLnYudmFsdWUpLnZhbGlkYXRlUG9zc2libGUobWUudi52YWx1ZSk7CiAgICAgfQogCisgICAgLy8gVE9ETyhiLzIzMDE0Njc3MSk6IGZpeCBjcmFzaAogICAgIHN0YXRpYyBDMlIgTm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcygKICAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssIEMySW50ZXJmYWNlSGVscGVyOjpDMlA8dHlwZT4gJm1lKSB7CiAgICAgICAgICh2b2lkKW1heUJsb2NrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwCmluZGV4IGQ2ZmZkMTIuLjJhMTFjMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL0FuZHJvaWQuYnAKQEAgLTE1LDkgKzE1LDYgQEAKICAgICAgICAgImNvZGVjMi5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICBdLAotCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhZHJtX2hlYWRlcnMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0FuZHJvaWQuYnAKaW5kZXggNzY5MmQzNy4uMTYyMzM5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQW5kcm9pZC5icApAQCAtMjIsNCArMjIsMTAgQEAKIAogICAgIHNyY3M6IFsiQzJTb2Z0R2F2MURlYy5jcHAiXSwKICAgICBzdGF0aWNfbGliczogWyJsaWJnYXYxIl0sCisKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAorCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmNwcAppbmRleCAxY2NlYWYyLi40ZGVjNTdmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAKQEAgLTIwLDYgKzIwLDggQEAKIAogI2luY2x1ZGUgPEMyRGVidWcuaD4KICNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CisjaW5jbHVkZSA8Q29kZWMyQ29tbW9uVXRpbHMuaD4KICNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KICNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KQEAgLTI3LDExICsyOSw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHsKLQotY29uc3RleHByIHVpbnQ4X3QgTkVVVFJBTF9VVl9WQUxVRSA9IDEyODsKLQotfSAgLy8gbmFtZXNwYWNlCiAKIC8vIGNvZGVjbmFtZSBzZXQgYW5kIHBhc3NlZCBpbiBhcyBhIGNvbXBpbGUgZmxhZyBmcm9tIEFuZHJvaWQuYnAKIGNvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSBDT0RFQ05BTUU7CkBAIC0xOTQsMTEgKzE5MSwyMyBAQAogICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2xvckFzcGVjdHNTZXR0ZXIsIG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtQ29kZWRDb2xvckFzcGVjdHMpCiAgICAgICAgICAgICAgIC5idWlsZCgpKTsKIAorICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBwaXhlbEZvcm1hdHMgPSB7SEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4fTsKKyAgICBpZiAoaXNIYWxQaXhlbEZvcm1hdFN1cHBvcnRlZCgoQUhhcmR3YXJlQnVmZmVyX0Zvcm1hdClIQUxfUElYRUxfRk9STUFUX1lDQkNSX1AwMTApKSB7CisgICAgICAgIHBpeGVsRm9ybWF0cy5wdXNoX2JhY2soSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl9QMDEwKTsKKyAgICB9CisgICAgLy8gSWYgY29sb3IgZm9ybWF0IHN1cmZhY2UgaXNuJ3QgYWRkZWQgdG8gc3VwcG9ydGVkIGZvcm1hdHMsIHRoZXJlIGlzIG5vIHdheSB0byBrbm93CisgICAgLy8gd2hlbiB0aGUgY29sb3ItZm9ybWF0IGlzIGNvbmZpZ3VyZWQgdG8gc3VyZmFjZS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYmUgYWJsZSB0bworICAgIC8vIGNob29zZSAxMC1iaXQgZm9ybWF0IHdoaWxlIGRlY29kaW5nIDEwLWJpdCBjbGlwcyBpbiBzdXJmYWNlIG1vZGUuCisgICAgcGl4ZWxGb3JtYXRzLnB1c2hfYmFjayhIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworCiAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/Ci0gICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQotICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQotICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QaXhlbEZvcm1hdCwgdmFsdWUpLm9uZU9mKHBpeGVsRm9ybWF0cyl9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVBpeGVsRm9ybWF0KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAuYnVpbGQoKSk7CiAgIH0KIAogICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywKQEAgLTMxOSw2ICszMjgsOSBAQAogICAgIHJldHVybiBDMlI6Ok9rKCk7CiAgIH0KIAorICAvLyB1bnNhZmUgZ2V0dGVycworICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gZ2V0UGl4ZWxGb3JtYXRfbCgpIGNvbnN0IHsgcmV0dXJuIG1QaXhlbEZvcm1hdDsgfQorCiAgcHJpdmF0ZToKICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CiAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKQEAgLTMzOSw4ICszNTEsNyBAQAogICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCiAgICAgICBtSW50ZihpbnRmSW1wbCksCiAgICAgICBtQ29kZWNDdHgobnVsbHB0cikgewotICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOwotICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgbVRpbWVTdGFydCA9IG1UaW1lRW5kID0gc3lzdGVtVGltZSgpOwogfQogCiBDMlNvZnRHYXYxRGVjOjp+QzJTb2Z0R2F2MURlYygpIHsgb25SZWxlYXNlKCk7IH0KQEAgLTQwNyw2ICs0MTgsMTEgQEAKIGJvb2wgQzJTb2Z0R2F2MURlYzo6aW5pdERlY29kZXIoKSB7CiAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOwogICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgIG1IYWxQaXhlbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgeworICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICBtUGl4ZWxGb3JtYXRJbmZvID0gbUludGYtPmdldFBpeGVsRm9ybWF0X2woKTsKKyAgfQogICBtQ29kZWNDdHgucmVzZXQobmV3IGxpYmdhdjE6OkRlY29kZXIoKSk7CiAKICAgaWYgKG1Db2RlY0N0eCA9PSBudWxscHRyKSB7CkBAIC01MTAsMTkgKzUyNiwxNyBAQAogICBpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCk7CiAgIGlmIChpblNpemUpIHsKICAgICB1aW50OF90ICpiaXRzdHJlYW0gPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOwotICAgIGludDMyX3QgZGVjb2RlVGltZSA9IDA7Ci0gICAgaW50MzJfdCBkZWxheSA9IDA7CiAKLSAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKyAgICBtVGltZVN0YXJ0ID0gc3lzdGVtVGltZSgpOworICAgIG5zZWNzX3QgZGVsYXkgPSBtVGltZVN0YXJ0IC0gbVRpbWVFbmQ7CiAKICAgICBjb25zdCBMaWJnYXYxU3RhdHVzQ29kZSBzdGF0dXMgPQogICAgICAgICBtQ29kZWNDdHgtPkVucXVldWVGcmFtZShiaXRzdHJlYW0sIGluU2l6ZSwgZnJhbWVJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypidWZmZXJfcHJpdmF0ZV9kYXRhPSovbnVsbHB0cik7CiAKLSAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7Ci0gICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKLSAgICBBTE9HVigiZGVjb2RlVGltZT0lNGQgZGVsYXk9JTRkXG4iLCBkZWNvZGVUaW1lLCBkZWxheSk7CisgICAgbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CisgICAgbnNlY3NfdCBkZWNvZGVUaW1lID0gbVRpbWVFbmQgLSBtVGltZVN0YXJ0OworICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU0IiBQUklkNjQgIiBkZWxheT0lNCIgUFJJZDY0ICJcbiIsIGRlY29kZVRpbWUsIGRlbGF5KTsKIAogICAgIGlmIChzdGF0dXMgIT0ga0xpYmdhdjFTdGF0dXNPaykgewogICAgICAgQUxPR0UoImF2MSBkZWNvZGVyIGZhaWxlZCB0byBkZWNvZGUgZnJhbWUuIHN0YXR1czogJWQuIiwgc3RhdHVzKTsKQEAgLTU0NCwxNTAgKzU1OCw2IEBACiAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTW9ub2Nocm9tZSkgewotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKLSAgICBtZW1jcHkoZHN0WSwgc3JjWSwgd2lkdGgpOwotICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKLSAgICBkc3RZICs9IGRzdFlTdHJpZGU7Ci0gIH0KLQotICBpZiAoaXNNb25vY2hyb21lKSB7Ci0gICAgLy8gRmlsbCB3aXRoIG5ldXRyYWwgVS9WIHZhbHVlcy4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChoZWlnaHQgKyAxKSAvIDI7ICsraSkgewotICAgICAgbWVtc2V0KGRzdFYsIE5FVVRSQUxfVVZfVkFMVUUsICh3aWR0aCArIDEpIC8gMik7Ci0gICAgICBtZW1zZXQoZHN0VSwgTkVVVFJBTF9VVl9WQUxVRSwgKHdpZHRoICsgMSkgLyAyKTsKLSAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7Ci0gICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChoZWlnaHQgKyAxKSAvIDI7ICsraSkgewotICAgIG1lbWNweShkc3RWLCBzcmNWLCAod2lkdGggKyAxKSAvIDIpOwotICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwotICB9Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK2kpIHsKLSAgICBtZW1jcHkoZHN0VSwgc3JjVSwgKHdpZHRoICsgMSkgLyAyKTsKLSAgICBzcmNVICs9IHNyY1VTdHJpZGU7Ci0gICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAodWludDMyX3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyY1ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1YsIHNpemVfdCBzcmNZU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGhlaWdodCkgewotICAvLyBDb252ZXJ0aW5nIHR3byBsaW5lcyBhdCBhIHRpbWUsIHNsaWdodGx5IGZhc3RlcgotICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyKSB7Ci0gICAgdWludDMyX3QgKmRzdFRvcCA9ICh1aW50MzJfdCAqKWRzdDsKLSAgICB1aW50MzJfdCAqZHN0Qm90ID0gKHVpbnQzMl90ICopKGRzdCArIGRzdFN0cmlkZSk7Ci0gICAgdWludDE2X3QgKnlTcmNUb3AgPSAodWludDE2X3QgKilzcmNZOwotICAgIHVpbnQxNl90ICp5U3JjQm90ID0gKHVpbnQxNl90ICopKHNyY1kgKyBzcmNZU3RyaWRlKTsKLSAgICB1aW50MTZfdCAqdVNyYyA9ICh1aW50MTZfdCAqKXNyY1U7Ci0gICAgdWludDE2X3QgKnZTcmMgPSAodWludDE2X3QgKilzcmNWOwotCi0gICAgdWludDMyX3QgdTAxLCB2MDEsIHkwMSwgeTIzLCB5NDUsIHk2NywgdXYwLCB1djE7Ci0gICAgc2l6ZV90IHggPSAwOwotICAgIGZvciAoOyB4IDwgd2lkdGggLSAzOyB4ICs9IDQpIHsKLSAgICAgIHUwMSA9ICooKHVpbnQzMl90ICopdVNyYyk7Ci0gICAgICB1U3JjICs9IDI7Ci0gICAgICB2MDEgPSAqKCh1aW50MzJfdCAqKXZTcmMpOwotICAgICAgdlNyYyArPSAyOwotCi0gICAgICB5MDEgPSAqKCh1aW50MzJfdCAqKXlTcmNUb3ApOwotICAgICAgeVNyY1RvcCArPSAyOwotICAgICAgeTIzID0gKigodWludDMyX3QgKil5U3JjVG9wKTsKLSAgICAgIHlTcmNUb3AgKz0gMjsKLSAgICAgIHk0NSA9ICooKHVpbnQzMl90ICopeVNyY0JvdCk7Ci0gICAgICB5U3JjQm90ICs9IDI7Ci0gICAgICB5NjcgPSAqKCh1aW50MzJfdCAqKXlTcmNCb3QpOwotICAgICAgeVNyY0JvdCArPSAyOwotCi0gICAgICB1djAgPSAodTAxICYgMHgzRkYpIHwgKCh2MDEgJiAweDNGRikgPDwgMjApOwotICAgICAgdXYxID0gKHUwMSA+PiAxNikgfCAoKHYwMSA+PiAxNikgPDwgMjApOwotCi0gICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOwotICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxID4+IDE2KSA8PCAxMCkgfCB1djA7Ci0gICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgJiAweDNGRikgPDwgMTApIHwgdXYxOwotICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzID4+IDE2KSA8PCAxMCkgfCB1djE7Ci0KLSAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7Ci0gICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7Ci0gICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgPj4gMTYpIDw8IDEwKSB8IHV2MTsKLSAgICB9Ci0KLSAgICAvLyBUaGVyZSBzaG91bGQgYmUgYXQgbW9zdCAyIG1vcmUgcGl4ZWxzIHRvIHByb2Nlc3MuIE5vdGUgdGhhdCB3ZSBkb24ndAotICAgIC8vIG5lZWQgdG8gY29uc2lkZXIgb2RkIGNhc2UgYXMgdGhlIGJ1ZmZlciBpcyBhbHdheXMgYWxpZ25lZCB0byBldmVuLgotICAgIGlmICh4IDwgd2lkdGgpIHsKLSAgICAgIHUwMSA9ICp1U3JjOwotICAgICAgdjAxID0gKnZTcmM7Ci0gICAgICB5MDEgPSAqKCh1aW50MzJfdCAqKXlTcmNUb3ApOwotICAgICAgeTQ1ID0gKigodWludDMyX3QgKil5U3JjQm90KTsKLSAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7Ci0gICAgICAqZHN0VG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7Ci0gICAgICAqZHN0VG9wKysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOwotICAgICAgKmRzdEJvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOwotICAgICAgKmRzdEJvdCsrID0gKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKLSAgICB9Ci0KLSAgICBzcmNZICs9IHNyY1lTdHJpZGUgKiAyOwotICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKLSAgICBzcmNWICs9IHNyY1ZTdHJpZGU7Ci0gICAgZHN0ICs9IGRzdFN0cmlkZSAqIDI7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoCi0gICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKLSAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAotICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCi0gICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKLSAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsIGJvb2wgaXNNb25vY2hyb21lKSB7Ci0KLSAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgZHN0WVt4XSA9ICh1aW50OF90KShzcmNZW3hdID4+IDIpOwotICAgIH0KLQotICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKLSAgICBkc3RZICs9IGRzdFlTdHJpZGU7Ci0gIH0KLQotICBpZiAoaXNNb25vY2hyb21lKSB7Ci0gICAgLy8gRmlsbCB3aXRoIG5ldXRyYWwgVS9WIHZhbHVlcy4KLSAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgewotICAgICAgbWVtc2V0KGRzdFYsIE5FVVRSQUxfVVZfVkFMVUUsICh3aWR0aCArIDEpIC8gMik7Ci0gICAgICBtZW1zZXQoZHN0VSwgTkVVVFJBTF9VVl9WQUxVRSwgKHdpZHRoICsgMSkgLyAyKTsKLSAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7Ci0gICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgewotICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgKHdpZHRoICsgMSkgLyAyOyArK3gpIHsKLSAgICAgIGRzdFVbeF0gPSAodWludDhfdCkoc3JjVVt4XSA+PiAyKTsKLSAgICAgIGRzdFZbeF0gPSAodWludDhfdCkoc3JjVlt4XSA+PiAyKTsKLSAgICB9Ci0KLSAgICBzcmNVICs9IHNyY1VTdHJpZGU7Ci0gICAgc3JjViArPSBzcmNWU3RyaWRlOwotICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7Ci0gICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKLSAgfQotfQotCiB2b2lkIEMyU29mdEdhdjFEZWM6OmdldFZ1aVBhcmFtcyhjb25zdCBsaWJnYXYxOjpEZWNvZGVyQnVmZmVyICpidWZmZXIpIHsKICAgICBWdWlDb2xvckFzcGVjdHMgdnVpQ29sb3JBc3BlY3RzOwogICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMgPSBidWZmZXItPmNvbG9yX3ByaW1hcnk7CkBAIC03NzYsMjQgKzY0Niw0NCBAQAogCiAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CiAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKLSAgaWYgKGJ1ZmZlci0+Yml0ZGVwdGggPT0gMTApIHsKKyAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBjb2RlZENvbG9yQXNwZWN0czsKKyAgaWYgKGJ1ZmZlci0+Yml0ZGVwdGggPT0gMTAgJiYgbVBpeGVsRm9ybWF0SW5mby0+dmFsdWUgIT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSB7CiAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBjb2RlZENvbG9yQXNwZWN0cyA9Ci0gICAgICAgIG1JbnRmLT5nZXRDb2xvckFzcGVjdHNfbCgpOwotCisgICAgY29kZWRDb2xvckFzcGVjdHMgPSBtSW50Zi0+Z2V0Q29sb3JBc3BlY3RzX2woKTsKKyAgICBib29sIGFsbG93UkdCQTEwMTAxMDIgPSBmYWxzZTsKICAgICBpZiAoY29kZWRDb2xvckFzcGVjdHMtPnByaW1hcmllcyA9PSBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwICYmCiAgICAgICAgIGNvZGVkQ29sb3JBc3BlY3RzLT5tYXRyaXggPT0gQzJDb2xvcjo6TUFUUklYX0JUMjAyMCAmJgogICAgICAgICBjb2RlZENvbG9yQXNwZWN0cy0+dHJhbnNmZXIgPT0gQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0KSB7Ci0gICAgICBpZiAoYnVmZmVyLT5pbWFnZV9mb3JtYXQgIT0gbGliZ2F2MTo6a0ltYWdlRm9ybWF0WXV2NDIwKSB7CisgICAgICBhbGxvd1JHQkExMDEwMTAyID0gdHJ1ZTsKKyAgICB9CisgICAgZm9ybWF0ID0gZ2V0SGFsUGl4ZWxGb3JtYXRGb3JCaXREZXB0aDEwKGFsbG93UkdCQTEwMTAxMDIpOworICAgIGlmICgoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKSAmJgorICAgICAgICAoYnVmZmVyLT5pbWFnZV9mb3JtYXQgIT0gbGliZ2F2MTo6a0ltYWdlRm9ybWF0WXV2NDIwKSkgewogICAgICAgICBBTE9HRSgiT25seSBZVVY0MjAgb3V0cHV0IGlzIHN1cHBvcnRlZCB3aGVuIHRhcmdldGluZyBSR0JBXzEwMTAxMDIiKTsKLSAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT01JVFRFRDsKLSAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI7CisgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgd29yay0+cmVzdWx0ID0gQzJfT01JVFRFRDsKKyAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICB9CisKKyAgaWYgKG1IYWxQaXhlbEZvcm1hdCAhPSBmb3JtYXQpIHsKKyAgICBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0IHBpeGVsRm9ybWF0KDB1LCBmb3JtYXQpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmcGl4ZWxGb3JtYXQgfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgIEMyUGFyYW06OkNvcHkocGl4ZWxGb3JtYXQpKTsKKyAgICB9IGVsc2UgeworICAgICAgQUxPR0UoIkNvbmZpZyB1cGRhdGUgcGl4ZWxGb3JtYXQgZmFpbGVkIik7CisgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtSGFsUGl4ZWxGb3JtYXQgPSBmb3JtYXQ7CisgIH0KKwogICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OwogCiAgIC8vIFdlIGFsd2F5cyBjcmVhdGUgYSBncmFwaGljIGJsb2NrIHRoYXQgaXMgd2lkdGggYWxpZ25lZCB0byAxNiBhbmQgaGVpZ2h0CkBAIC04MzcsMjIgKzcyNywyNiBAQAogICAgIGNvbnN0IHVpbnQxNl90ICpzcmNWID0gKGNvbnN0IHVpbnQxNl90ICopYnVmZmVyLT5wbGFuZVsyXTsKIAogICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIpIHsKLSAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgKLSAgICAgICAgICAodWludDMyX3QgKilkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsCi0gICAgICAgICAgc3JjVlN0cmlkZSAvIDIsIGRzdFlTdHJpZGUgLyBzaXplb2YodWludDMyX3QpLCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTBPclJHQkExMDEwMTAyKAorICAgICAgICAgICAgICAgICh1aW50MzJfdCAqKWRzdFksIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICBkc3RZU3RyaWRlIC8gc2l6ZW9mKHVpbnQzMl90KSwgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxjb25zdCBDMkNvbG9yQXNwZWN0c1N0cnVjdD4oY29kZWRDb2xvckFzcGVjdHMpKTsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1lDQkNSX1AwMTApIHsKKyAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9QMDEwKCh1aW50MTZfdCAqKWRzdFksICh1aW50MTZfdCAqKWRzdFUsIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLCBkc3RZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFVWU3RyaWRlIC8gMiwgbVdpZHRoLCBtSGVpZ2h0LCBpc01vbm9jaHJvbWUpOwogICAgIH0gZWxzZSB7Ci0gICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcigKLSAgICAgICAgICBkc3RZLCBkc3RVLCBkc3RWLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsCi0gICAgICAgICAgc3JjVlN0cmlkZSAvIDIsIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLCBtV2lkdGgsIG1IZWlnaHQsCi0gICAgICAgICAgaXNNb25vY2hyb21lKTsKKyAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVjEyKGRzdFksIGRzdFUsIGRzdFYsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLCBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwgbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlaWdodCwgaXNNb25vY2hyb21lKTsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopYnVmZmVyLT5wbGFuZVswXTsKICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPnBsYW5lWzFdOwogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+cGxhbmVbMl07Ci0gICAgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKAotICAgICAgICBkc3RZLCBkc3RVLCBkc3RWLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLAotICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwgbVdpZHRoLCBtSGVpZ2h0LCBpc01vbm9jaHJvbWUpOworICAgIGNvbnZlcnRZVVY0MjBQbGFuYXI4VG9ZVjEyKGRzdFksIGRzdFUsIGRzdFYsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVlN0cmlkZSwgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsIG1XaWR0aCwgbUhlaWdodCwgaXNNb25vY2hyb21lKTsKICAgfQogICBmaW5pc2hXb3JrKGJ1ZmZlci0+dXNlcl9wcml2YXRlX2RhdGEsIHdvcmssIHN0ZDo6bW92ZShibG9jaykpOwogICBibG9jayA9IG51bGxwdHI7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5oCmluZGV4IDEzNGZhMGQuLjNkNGRiNTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfQzJfU09GVF9HQVYxX0RFQ19IXwogI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfR0FWMV9ERUNfSF8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KIAogI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CkBAIC0yNCwxMSArMjYsNiBAQAogI2luY2x1ZGUgImxpYmdhdjEvc3JjL2dhdjEvZGVjb2Rlci5oIgogI2luY2x1ZGUgImxpYmdhdjEvc3JjL2dhdjEvZGVjb2Rlcl9zZXR0aW5ncy5oIgogCi0jZGVmaW5lIEdFVFRJTUUoYSwgYikgZ2V0dGltZW9mZGF5KGEsIGIpOwotI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKLSAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKLSAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQzJTb2Z0R2F2MURlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CkBAIC01NCw2ICs1MSwxMSBAQAogICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOwogICBzdGQ6OnVuaXF1ZV9wdHI8bGliZ2F2MTo6RGVjb2Rlcj4gbUNvZGVjQ3R4OwogCisgIC8vIGNvbmZpZ3VyYXRpb25zIHVzZWQgYnkgY29tcG9uZW50IGluIHByb2Nlc3MKKyAgLy8gKFRPRE86IGtlZXAgdGhpcyBpbiBpbnRmIGJ1dCBtYWtlIHRoZW0gaW50ZXJuYWwgb25seSkKKyAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdEluZm87CisKKyAgdWludDMyX3QgbUhhbFBpeGVsRm9ybWF0OwogICB1aW50MzJfdCBtV2lkdGg7CiAgIHVpbnQzMl90IG1IZWlnaHQ7CiAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKQEAgLTgwLDggKzgyLDggQEAKICAgICAgIH0KICAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOwogCi0gIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7ICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQotICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCisgIG5zZWNzX3QgbVRpbWVTdGFydCA9IDA7ICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQorICBuc2Vjc190IG1UaW1lRW5kID0gMDsgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCiAKICAgYm9vbCBpbml0RGVjb2RlcigpOwogICB2b2lkIGdldFZ1aVBhcmFtcyhjb25zdCBsaWJnYXYxOjpEZWNvZGVyQnVmZmVyICpidWZmZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAKaW5kZXggMmE2YWRjYS4uNWE2NjBjNSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwCkBAIC02NjMsOCArNjYzLDcgQEAKIAogdm9pZCBDMlNvZnRIZXZjRGVjOjpyZXNldFBsdWdpbigpIHsKICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7Ci0gICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICBtVGltZVN0YXJ0ID0gbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CiB9CiAKIHN0YXR1c190IEMyU29mdEhldmNEZWM6OmRlbGV0ZURlY29kZXIoKSB7CkBAIC04NTgsMTQgKzg1NywxMyBAQAogICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IGRpbWVuc2lvbnMgKi8KICAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0hFQURFUik7CiAgICAgICAgIH0KLSAgICAgICAgV09SRDMyIGRlbGF5OwotICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisKKyAgICAgICAgbVRpbWVTdGFydCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgbnNlY3NfdCBkZWxheSA9IG1UaW1lU3RhcnQgLSBtVGltZUVuZDsKICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCBwc19kZWNvZGVfaXAsIHBzX2RlY29kZV9vcCk7Ci0gICAgICAgIFdPUkQzMiBkZWNvZGVUaW1lOwotICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7Ci0gICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7Ci0gICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgZGVjb2RlVGltZSwgZGVsYXksCisgICAgICAgIG1UaW1lRW5kID0gc3lzdGVtVGltZSgpOworICAgICAgICBuc2Vjc190IGRlY29kZVRpbWUgPSBtVGltZUVuZCAtIG1UaW1lU3RhcnQ7CisgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU2IiBQUklkNjQgIiBkZWxheT0lNiIgUFJJZDY0ICIgbnVtQnl0ZXM9JTZkIiwgZGVjb2RlVGltZSwgZGVsYXksCiAgICAgICAgICAgICAgIHBzX2RlY29kZV9vcC0+dTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKICAgICAgICAgaWYgKElWRF9NRU1fQUxMT0NfRkFJTEVEID09IChwc19kZWNvZGVfb3AtPnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKICAgICAgICAgICAgIEFMT0dFKCJhbGxvY2F0aW9uIGZhaWx1cmUgaW4gZGVjb2RlciIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaAppbmRleCBiOTI5NmU5Li42YWJmNjllIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogCiAjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KIAogI2luY2x1ZGUgImloZXZjX3R5cGVkZWZzLmgiCkBAIC00MSwxMCArNDIsNiBAQAogI2RlZmluZSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTICAgIFwKICAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJSEVWQ0RfQ1hBX0NNRF9DVExfU0VUX05VTV9DT1JFUwogI2RlZmluZSBNSU4oYSwgYikgICAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKLSNkZWZpbmUgR0VUVElNRShhLCBiKSAgICAgICAgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoYSwgYik7Ci0jZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSAgICAgXAotICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAotICAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOwogCiAKIHN0cnVjdCBDMlNvZnRIZXZjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKQEAgLTE0Miw4ICsxMzksOCBAQAogICAgIH0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0czsKIAogICAgIC8vIHByb2ZpbGUKLSAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OwotICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOworICAgIG5zZWNzX3QgbVRpbWVTdGFydCA9IDA7CisgICAgbnNlY3NfdCBtVGltZUVuZCA9IDA7CiAKICAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRIZXZjRGVjKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmNwcAppbmRleCA2NGNjMTc1Li42MGQ1ODc1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5jcHAKQEAgLTI0NSw2ICsyNDUsMTkgQEAKICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyLCBtQ29sb3JBc3BlY3RzKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpY3R1cmVRdWFudGl6YXRpb24sIEMyX1BBUkFNS0VZX1BJQ1RVUkVfUVVBTlRJWkFUSU9OKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlN0cmVhbVBpY3R1cmVRdWFudGl6YXRpb25UdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGZsZXhDb3VudCAqLywgMHUgLyogc3RyZWFtICovKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QaWN0dXJlUXVhbnRpemF0aW9uLCBtLnZhbHVlc1swXS50eXBlXykub25lT2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoSV9GUkFNRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KFBfRlJBTUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChCX0ZSQU1FKX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobVBpY3R1cmVRdWFudGl6YXRpb24sIG0udmFsdWVzWzBdLm1pbikuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtUGljdHVyZVF1YW50aXphdGlvbiwgbS52YWx1ZXNbMF0ubWF4KS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUGljdHVyZVF1YW50aXphdGlvblNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgfQogCiAgICAgc3RhdGljIEMyUiBJbnB1dERlbGF5U2V0dGVyKApAQCAtNDY0LDkgKzQ3Nyw2OSBAQAogICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeDsKICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKICAgICB9CisgICAgc3RhdGljIEMyUiBQaWN0dXJlUXVhbnRpemF0aW9uU2V0dGVyKGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVRdWFudGl6YXRpb25UdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworCisgICAgICAgIC8vIHRoZXNlIGFyZSB0aGUgb25lcyB3ZSdyZSBnb2luZyB0byBzZXQsIHNvIHdhbnQgdGhlbSB0byBkZWZhdWx0CisgICAgICAgIC8vIHRvIHRoZSBERUZBVUxUIHZhbHVlcyBmb3IgdGhlIGNvZGVjCisgICAgICAgIGludDMyX3QgaU1pbiA9IEhFVkNfUVBfTUlOLCBwTWluID0gSEVWQ19RUF9NSU4sIGJNaW4gPSBIRVZDX1FQX01JTjsKKyAgICAgICAgaW50MzJfdCBpTWF4ID0gSEVWQ19RUF9NQVgsIHBNYXggPSBIRVZDX1FQX01BWCwgYk1heCA9IEhFVkNfUVBfTUFYOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWUudi5mbGV4Q291bnQoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBDMlBpY3R1cmVRdWFudGl6YXRpb25TdHJ1Y3QgJmxheWVyID0gbWUudi5tLnZhbHVlc1tpXTsKKworICAgICAgICAgICAgLy8gbGF5ZXJNaW4gaXMgY2xhbXBlZCB0byBbSEVWQ19RUF9NSU4sIGxheWVyTWF4XSB0byBhdm9pZCBlcnJvcgorICAgICAgICAgICAgLy8gY2FzZXMgd2hlcmUgbGF5ZXIubWluID4gbGF5ZXIubWF4CisgICAgICAgICAgICBpbnQzMl90IGxheWVyTWF4ID0gc3RkOjpjbGFtcChsYXllci5tYXgsIEhFVkNfUVBfTUlOLCBIRVZDX1FQX01BWCk7CisgICAgICAgICAgICBpbnQzMl90IGxheWVyTWluID0gc3RkOjpjbGFtcChsYXllci5taW4sIEhFVkNfUVBfTUlOLCBsYXllck1heCk7CisgICAgICAgICAgICBpZiAobGF5ZXIudHlwZV8gPT0gQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KElfRlJBTUUpKSB7CisgICAgICAgICAgICAgICAgaU1heCA9IGxheWVyTWF4OworICAgICAgICAgICAgICAgIGlNaW4gPSBsYXllck1pbjsKKyAgICAgICAgICAgICAgICBBTE9HVigiaU1pbiAlZCBpTWF4ICVkIiwgaU1pbiwgaU1heCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChQX0ZSQU1FKSkgeworICAgICAgICAgICAgICAgIHBNYXggPSBsYXllck1heDsKKyAgICAgICAgICAgICAgICBwTWluID0gbGF5ZXJNaW47CisgICAgICAgICAgICAgICAgQUxPR1YoInBNaW4gJWQgcE1heCAlZCIsIHBNaW4sIHBNYXgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoQl9GUkFNRSkpIHsKKyAgICAgICAgICAgICAgICBiTWF4ID0gbGF5ZXJNYXg7CisgICAgICAgICAgICAgICAgYk1pbiA9IGxheWVyTWluOworICAgICAgICAgICAgICAgIEFMT0dWKCJiTWluICVkIGJNYXggJWQiLCBiTWluLCBiTWF4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJQaWN0dXJlUXVhbnRpemF0aW9uU2V0dGVyKGVudHJ5KTogaSAlZC0lZCBwICVkLSVkIGIgJWQtJWQiLAorICAgICAgICAgICAgICBpTWluLCBpTWF4LCBwTWluLCBwTWF4LCBiTWluLCBiTWF4KTsKKworICAgICAgICBpbnQzMl90IG1heEZyYW1lUVAgPSBzdGQ6Om1pbihzdGQ6Om1pbihpTWF4LCBwTWF4KSwgYk1heCk7CisgICAgICAgIGludDMyX3QgbWluRnJhbWVRUCA9IHN0ZDo6bWF4KHN0ZDo6bWF4KGlNaW4sIHBNaW4pLCBiTWluKTsKKyAgICAgICAgaWYgKG1pbkZyYW1lUVAgPiBtYXhGcmFtZVFQKSB7CisgICAgICAgICAgICBtaW5GcmFtZVFQID0gbWF4RnJhbWVRUDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHB1dCB0aGVtIGJhY2sgaW50byB0aGUgc3RydWN0dXJlCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWUudi5mbGV4Q291bnQoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBDMlBpY3R1cmVRdWFudGl6YXRpb25TdHJ1Y3QgJmxheWVyID0gbWUudi5tLnZhbHVlc1tpXTsKKworICAgICAgICAgICAgaWYgKGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChJX0ZSQU1FKSB8fAorICAgICAgICAgICAgICAgIGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChQX0ZSQU1FKSB8fAorICAgICAgICAgICAgICAgIGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChCX0ZSQU1FKSkgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm0udmFsdWVzW2ldLm1heCA9IG1heEZyYW1lUVA7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubS52YWx1ZXNbaV0ubWluID0gbWluRnJhbWVRUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJQaWN0dXJlUXVhbnRpemF0aW9uU2V0dGVyKGV4aXQpOiBpID0gcCA9IGIgPSAlZC0lZCIsCisgICAgICAgICAgICAgIG1pbkZyYW1lUVAsIG1heEZyYW1lUVApOworCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gZ2V0Q29kZWRDb2xvckFzcGVjdHNfbCgpIHsKICAgICAgICAgcmV0dXJuIG1Db2RlZENvbG9yQXNwZWN0czsKICAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVF1YW50aXphdGlvblR1bmluZzo6b3V0cHV0PiBnZXRQaWN0dXJlUXVhbnRpemF0aW9uX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUGljdHVyZVF1YW50aXphdGlvbjsKKyAgICB9CiAKICAgIHByaXZhdGU6CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CkBAIC00ODIsNiArNTU1LDcgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dD4gbUdvcDsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gbUNvbG9yQXNwZWN0czsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2RlZENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlUXVhbnRpemF0aW9uVHVuaW5nOjpvdXRwdXQ+IG1QaWN0dXJlUXVhbnRpemF0aW9uOwogfTsKIAogc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CkBAIC01MTcsOCArNTkxLDcgQEAKICAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOwogICAgIENSRUFURV9EVU1QX0ZJTEUobU91dEZpbGUpOwogCi0gICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICBtVGltZVN0YXJ0ID0gbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CiB9CiAKIEMyU29mdEhldmNFbmM6On5DMlNvZnRIZXZjRW5jKCkgewpAQCAtNjU0LDEyICs3MjcsNDEgQEAKICAgICAgICAgbUVuY1BhcmFtcy5zX2NvZGluZ190b29sc19wcm1zLmk0X21heF90ZW1wb3JhbF9sYXllcnMgPSAzOwogICAgIH0KIAotICAgIHN3aXRjaCAobUJpdHJhdGVNb2RlLT52YWx1ZSkgewotICAgICAgICBjYXNlIEMyQ29uZmlnOjpCSVRSQVRFX0lHTk9SRToKLSAgICAgICAgICAgIG1FbmNQYXJhbXMuc19jb25maWdfcHJtcy5pNF9yYXRlX2NvbnRyb2xfbW9kZSA9IDM7Ci0gICAgICAgICAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X2ZyYW1lX3FwWzBdID0KLSAgICAgICAgICAgICAgICBnZXRRcEZyb21RdWFsaXR5KG1RdWFsaXR5LT52YWx1ZSk7CisgICAgLy8gd2UgcmVzb2x2ZWQgb3V0LW9mLWJvdW5kIGFuZCB1bnNwZWNpZmllZCB2YWx1ZXMgaW4gUGljdHVyZVF1YW50aXphdGlvblNldHRlcigpCisgICAgLy8gc28gd2UgY2FuIHN0YXJ0IHdpdGggZGVmYXVsdHMgdGhhdCBhcmUgb3ZlcnJpZGRlbiBhcyBuZWVkZWQuCisgICAgaW50MzJfdCBtYXhGcmFtZVFQID0gbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X21heF9mcmFtZV9xcDsKKyAgICBpbnQzMl90IG1pbkZyYW1lUVAgPSBtRW5jUGFyYW1zLnNfY29uZmlnX3BybXMuaTRfbWluX2ZyYW1lX3FwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUXBCb3VuZHMtPmZsZXhDb3VudCgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgQzJQaWN0dXJlUXVhbnRpemF0aW9uU3RydWN0ICZsYXllciA9IG1RcEJvdW5kcy0+bS52YWx1ZXNbaV07CisKKyAgICAgICAgLy8gbm8gbmVlZCB0byBsb29wLCBoZXZjIGxpYnJhcnkgdGFrZXMgc2FtZSByYW5nZSBmb3IgSS9QL0IgcGljdHVyZSB0eXBlCisgICAgICAgIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoSV9GUkFNRSkgfHwKKyAgICAgICAgICAgIGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChQX0ZSQU1FKSB8fAorICAgICAgICAgICAgbGF5ZXIudHlwZV8gPT0gQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KEJfRlJBTUUpKSB7CisKKyAgICAgICAgICAgIG1heEZyYW1lUVAgPSBsYXllci5tYXg7CisgICAgICAgICAgICBtaW5GcmFtZVFQID0gbGF5ZXIubWluOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X21heF9mcmFtZV9xcCA9IG1heEZyYW1lUVA7CisgICAgbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X21pbl9mcmFtZV9xcCA9IG1pbkZyYW1lUVA7CisKKyAgICBBTE9HVigiTWF4RnJhbWVRcDogJWQgTWluRnJhbWVRcDogJWQiLCBtYXhGcmFtZVFQLCBtaW5GcmFtZVFQKTsKKworICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfZnJhbWVfcXBbMF0gPQorICAgICAgICBzdGQ6OmNsYW1wKGtEZWZhdWx0SW5pdFFQLCBtaW5GcmFtZVFQLCBtYXhGcmFtZVFQKTsKKworICAgIHN3aXRjaCAobUJpdHJhdGVNb2RlLT52YWx1ZSkgeworICAgICAgICBjYXNlIEMyQ29uZmlnOjpCSVRSQVRFX0lHTk9SRTogeworICAgICAgICAgICAgbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X3JhdGVfY29udHJvbF9tb2RlID0gMzsKKyAgICAgICAgICAgIC8vIGVuc3VyZSBpbml0aWFsIHFwIHZhbHVlcyBhcmUgd2l0aGluIG91ciBuZXdseSBjb25maWd1cmVkIGJvdW5kcworICAgICAgICAgICAgaW50MzJfdCBmcmFtZVFwID0gZ2V0UXBGcm9tUXVhbGl0eShtUXVhbGl0eS0+dmFsdWUpOworICAgICAgICAgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmFpNF9mcmFtZV9xcFswXSA9CisgICAgICAgICAgICAgICAgc3RkOjpjbGFtcChmcmFtZVFwLCBtaW5GcmFtZVFQLCBtYXhGcmFtZVFQKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICAgIGNhc2UgQzJDb25maWc6OkJJVFJBVEVfQ09OU1Q6CiAgICAgICAgICAgICBtRW5jUGFyYW1zLnNfY29uZmlnX3BybXMuaTRfcmF0ZV9jb250cm9sX21vZGUgPSA1OwogICAgICAgICAgICAgYnJlYWs7CkBAIC03MjMsNiArODI1LDcgQEAKICAgICAgICAgbUdvcCA9IG1JbnRmLT5nZXRHb3BfbCgpOwogICAgICAgICBtUmVxdWVzdFN5bmMgPSBtSW50Zi0+Z2V0UmVxdWVzdFN5bmNfbCgpOwogICAgICAgICBtQ29sb3JBc3BlY3RzID0gbUludGYtPmdldENvZGVkQ29sb3JBc3BlY3RzX2woKTsKKyAgICAgICAgbVFwQm91bmRzID0gbUludGYtPmdldFBpY3R1cmVRdWFudGl6YXRpb25fbCgpOzsKICAgICB9CiAKICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBpbml0RW5jUGFyYW1zKCk7CkBAIC03OTgsNyArOTAxLDggQEAKICAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKICAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0geVN0cmlkZSAvIDI7CiAgICAgICAgICAgICBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoeVBsYW5lLCB5U3RyaWRlLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlci5zaXplKCksICppbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlci5zaXplKCksICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29sb3JBc3BlY3RzLT5tYXRyaXgsIG1Db2xvckFzcGVjdHMtPnJhbmdlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOiB7CkBAIC0xMDk5LDExICsxMjAzLDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB1aW50NjRfdCB0aW1lRGVsYXkgPSAwOwotICAgIHVpbnQ2NF90IHRpbWVUYWtlbiA9IDA7CisgICAgbnNlY3NfdCB0aW1lRGVsYXkgPSAwOworICAgIG5zZWNzX3QgdGltZVRha2VuID0gMDsKICAgICBtZW1zZXQoJnNfZW5jb2RlX29wLCAwLCBzaXplb2Yoc19lbmNvZGVfb3ApKTsKLSAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIHRpbWVEZWxheSk7CisgICAgbVRpbWVTdGFydCA9IHN5c3RlbVRpbWUoKTsKKyAgICB0aW1lRGVsYXkgPSBtVGltZVN0YXJ0IC0gbVRpbWVFbmQ7CiAKICAgICBpZiAoaW5wdXRCdWZmZXIpIHsKICAgICAgICAgZXJyID0gaWhldmNlX2VuY29kZShtQ29kZWNDdHgsICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKQEAgLTExMTgsMTIgKzEyMjIsMTIgQEAKICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKICAgICB9CiAKLSAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CiAgICAgLyogQ29tcHV0ZSB0aW1lIHRha2VuIGZvciBkZWNvZGUoKSAqLwotICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgdGltZVRha2VuKTsKKyAgICBtVGltZUVuZCA9IHN5c3RlbVRpbWUoKTsKKyAgICB0aW1lVGFrZW4gPSBtVGltZUVuZCAtIG1UaW1lU3RhcnQ7CiAKLSAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgKGludCl0aW1lVGFrZW4sCi0gICAgICAgICAgKGludCl0aW1lRGVsYXksIHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCk7CisgICAgQUxPR1YoInRpbWVUYWtlbj0lNiIgUFJJZDY0ICIgZGVsYXk9JTYiIFBSSWQ2NCAiIG51bUJ5dGVzPSU2ZCIsIHRpbWVUYWtlbiwKKyAgICAgICAgICB0aW1lRGVsYXksIHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCk7CiAKICAgICBpZiAoc19lbmNvZGVfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKSB7CiAgICAgICAgIGZpbmlzaFdvcmsoc19lbmNvZGVfb3AudThfcHRzLCB3b3JrLCBwb29sLCAmc19lbmNvZGVfb3ApOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaAppbmRleCA5ZGJmNjgyLi5jZTljZWM4IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CkBAIC0yNywxNCArMjgsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8qKiBHZXQgdGltZSAqLwotI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKQotCi0vKiogQ29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gc3RhcnQgYW5kIGVuZCAqLwotI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAotICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7Ci0KICNkZWZpbmUgQ09ERUNfTUFYX0NPUkVTICA0CiAjZGVmaW5lIE1BWF9CX0ZSQU1FUyAgICAgMQogI2RlZmluZSBNQVhfUkNfTE9PS0FIRUFEIDEKQEAgLTQyLDYgKzM1LDExIEBACiAjZGVmaW5lIERFRkFVTFRfQl9GUkFNRVMgICAgIDAKICNkZWZpbmUgREVGQVVMVF9SQ19MT09LQUhFQUQgMAogCisjZGVmaW5lIEhFVkNfUVBfTUlOIDEKKyNkZWZpbmUgSEVWQ19RUF9NQVggNTEKKworY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRJbml0UVAgPSAzMjsKKwogc3RydWN0IEMyU29mdEhldmNFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgewogICAgIGNsYXNzIEludGZJbXBsOwogCkBAIC05MCwxNCArODgsMTUgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dD4gbUdvcDsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0U3luYzsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVF1YW50aXphdGlvblR1bmluZzo6b3V0cHV0PiBtUXBCb3VuZHM7CiAjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQogICAgIGNoYXIgbUluRmlsZVsyMDBdOwogICAgIGNoYXIgbU91dEZpbGVbMjAwXTsKICNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCiAKICAgICAvLyBwcm9maWxlCi0gICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsKLSAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsKKyAgICBuc2Vjc190IG1UaW1lU3RhcnQgPSAwOworICAgIG5zZWNzX3QgbVRpbWVFbmQgPSAwOwogCiAgICAgYzJfc3RhdHVzX3QgaW5pdEVuY1BhcmFtcygpOwogICAgIGMyX3N0YXR1c190IGluaXRFbmNvZGVyKCk7CkBAIC0xMjEsMTQgKzEyMCwxMiBAQAogI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQgImgyNjUiCiAjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIEFMT0dEKCJHRU5FUkFURV9GSUxFX05BTUVTIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgbVRpbWVTdGFydC50dl9zZWMsIFwKLSAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfdXNlYywgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsIE9VVFBVVF9EVU1QX0VYVCk7ICAgICAgXAorICAgIHNwcmludGYobUluRmlsZSwgIiVzXyUiIFBSSWQ2NCAiLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtVGltZVN0YXJ0LCBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcHJpbnRmKG11dEZpbGUsICIlc18lIiBQUklkNjQgIi4lcyIsIE9VVFBVVF9EVU1QX1BBVEgsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbVRpbWVTdGFydCwgT1VUUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAKaW5kZXggZGFhMTBhZS4uYTU4MDQ0YyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0xNyw5ICsxNyw0IEBACiAgICAgc3JjczogWyJDMlNvZnRNcGVnMkRlYy5jcHAiXSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYm1wZWcyZGVjIl0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL2xpYm1wZWcyL2RlY29kZXIiLAotICAgICAgICAiZXh0ZXJuYWwvbGlibXBlZzIvY29tbW9uIiwKLSAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwCmluZGV4IDVmOWIzMGIuLjlhNDE5MTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAKQEAgLTczMSw4ICs3MzEsNyBAQAogCiB2b2lkIEMyU29mdE1wZWcyRGVjOjpyZXNldFBsdWdpbigpIHsKICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7Ci0gICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICBtVGltZVN0YXJ0ID0gbVRpbWVFbmQgPSBzeXN0ZW1UaW1lKCk7CiB9CiAKIHN0YXR1c190IEMyU29mdE1wZWcyRGVjOjpkZWxldGVEZWNvZGVyKCkgewpAQCAtOTI5LDE0ICs5MjgsMTIgQEAKICAgICAgICAgfQogICAgICAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gd3JpdGUgdG8gZmlsZQogICAgICAgICBEVU1QX1RPX0ZJTEUobUluRmlsZSwgc19kZWNvZGVfaXAucHZfc3RyZWFtX2J1ZmZlciwgc19kZWNvZGVfaXAudTRfbnVtX0J5dGVzKTsKLSAgICAgICAgV09SRDMyIGRlbGF5OwotICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKLSAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisgICAgICAgIG5zZWNzX3QgZGVsYXkgPSBtVGltZVN0YXJ0IC0gbVRpbWVFbmQ7CiAgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOwotICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKLSAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOwotICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOwotICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCAiLCBkZWNvZGVUaW1lLCBkZWxheSwKKworICAgICAgICBtVGltZUVuZCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgbnNlY3NfdCBkZWNvZGVUaW1lID0gbVRpbWVFbmQgLSBtVGltZVN0YXJ0OworICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lIiBQUklkNjQgIiBkZWxheT0lIiBQUklkNjQgIiBudW1CeXRlcz0lNmQgIiwgZGVjb2RlVGltZSwgZGVsYXksCiAgICAgICAgICAgICAgIHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CiAgICAgICAgIGlmIChJTVBFRzJEX1VOU1VQUE9SVEVEX0RJTUVOU0lPTlMgPT0gc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSkgewogICAgICAgICAgICAgQUxPR1YoInVuc3VwcG9ydGVkIHJlc29sdXRpb24gOiAlZHglZCIsIHNfZGVjb2RlX29wLnU0X3BpY193ZCwgc19kZWNvZGVfb3AudTRfcGljX2h0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5oCmluZGV4IDhhMjljMTQuLjM5NjViY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfTVBFRzJfREVDX0hfCiAKICNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CkBAIC00MiwxOSArNDMsMTQgQEAKICNkZWZpbmUgSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUyAgICBcCiAgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSU1QRUcyRF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKICNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCi0jZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOwotI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKLSAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKLSAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKIAogI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKICAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvY2xpcHMvbXBlZzJkX2lucHV0IgogICAgICNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgICAgICAibTJ2IgogICAgICNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgXAotICAgICAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lIiBQUklkNjQgIi4lcyIsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIElOUFVUX0RVTVBfUEFUSCwgbm93LCAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0KICAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgeyAgICAgICAgICAgICAgICAgIFwKQEAgLTE4Myw4ICsxNzksOCBAQAogICAgIH0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0czsKIAogICAgIC8vIHByb2ZpbGUKLSAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OwotICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOworICAgIG5zZWNzX3QgbVRpbWVTdGFydCA9IDA7CisgICAgbnNlY3NfdCBtVGltZUVuZCA9IDA7CiAjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQogICAgIGNoYXIgbUluRmlsZVsyMDBdOwogI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAKaW5kZXggODFmNDY3OS4uNTRhMWQwZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAKQEAgLTQxOSw0MCArNDE5LDYgQEAKICAgICByZXR1cm4gcmVzQ2hhbmdlZDsKIH0KIAotLyogVE9ETzogY2FuIHJlbW92ZSB0ZW1wb3JhcnkgY29weSBhZnRlciBsaWJyYXJ5IHN1cHBvcnRzIHdyaXRpbmcgdG8gZGlzcGxheQotICogYnVmZmVyIFksIFUgYW5kIFYgcGxhbmUgcG9pbnRlcnMgdXNpbmcgc3RyaWRlIGluZm8uICovCi1zdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgdWludDhfdCAqc3JjLAotICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAotICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgdWludDMyX3Qgd2lkdGgsCi0gICAgICAgIHVpbnQzMl90IGhlaWdodCkgewotICAgIHNpemVfdCBzcmNVVlN0cmlkZSA9IHNyY1lTdHJpZGUgLyAyOwotICAgIHVpbnQ4X3QgKnNyY1N0YXJ0ID0gc3JjOwotCi0gICAgc2l6ZV90IHZTdHJpZGUgPSBhbGlnbihoZWlnaHQsIDE2KTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0WSwgc3JjLCB3aWR0aCk7Ci0gICAgICAgICBzcmMgKz0gc3JjWVN0cmlkZTsKLSAgICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKLSAgICB9Ci0KLSAgICAvKiBVIGJ1ZmZlciAqLwotICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3RVLCBzcmMsIHdpZHRoIC8gMik7Ci0gICAgICAgICBzcmMgKz0gc3JjVVZTdHJpZGU7Ci0gICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOwotICAgIH0KLQotICAgIC8qIFYgYnVmZmVyICovCi0gICAgc3JjID0gc3JjU3RhcnQgKyB2U3RyaWRlICogc3JjWVN0cmlkZSAqIDUgLyA0OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0Viwgc3JjLCB3aWR0aCAvIDIpOwotICAgICAgICAgc3JjICs9IHNyY1VWU3RyaWRlOwotICAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKLSAgICB9Ci19Ci0KIHZvaWQgQzJTb2Z0TXBlZzREZWM6OnByb2Nlc3MoCiAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CkBAIC02MzYsMTEgKzYwMiwxNyBAQAogICAgICAgICBDMlBsYW5hckxheW91dCBsYXlvdXQgPSB3Vmlldy5sYXlvdXQoKTsKICAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CiAgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKLSAgICAgICAgKHZvaWQpY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyWSwgb3V0cHV0QnVmZmVyVSwgb3V0cHV0QnVmZmVyViwKLSAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0sCi0gICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCi0gICAgICAgICAgICAgICAgYWxpZ24obVdpZHRoLCAxNiksIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlID0gYWxpZ24obVdpZHRoLCAxNik7CisgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlID0gc3JjWVN0cmlkZSAvIDI7CisgICAgICAgIHNpemVfdCBzcmNWU3RyaWRlID0gc3JjWVN0cmlkZSAvIDI7CisgICAgICAgIHNpemVfdCB2U3RyaWRlID0gYWxpZ24obUhlaWdodCwgMTYpOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKiltT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKXNyY1kgKyB2U3RyaWRlICogc3JjWVN0cmlkZTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopc3JjWSArIHZTdHJpZGUgKiBzcmNZU3RyaWRlICogNSAvIDQ7CisKKyAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjhUb1lWMTIob3V0cHV0QnVmZmVyWSwgb3V0cHV0QnVmZmVyVSwgb3V0cHV0QnVmZmVyViwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CiAKICAgICAgICAgaW5Qb3MgKz0gaW5TaXplIC0gKHNpemVfdCl0bXBJblNpemU7CiAgICAgICAgIGZpbmlzaFdvcmsod29ya0luZGV4LCB3b3JrKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDNjNjhlZWUuLmJlMmFiZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5icApAQCAtOSw0NCArOSwxMyBAQAogCiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogIkMyU29mdENvZGVjVGVzdC1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsgImxpYmNvZGVjMi1zdGF0aWMtZGVmYXVsdHMiIF0sCiAgICAgZ3Rlc3Q6IHRydWUsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IGZhbHNlLAogICAgIHNyY3M6IFsKICAgICAgICAgIkMyU29mdENvZGVjVGVzdC5jcHAiLAogICAgIF0sCiAKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmlvbiIsCi0gICAgICAgICJsaWJmbXEiLAotICAgICAgICAibGliYmFzZSIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliY29kZWMyIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmRtYWJ1ZmhlYXAiLAotICAgICAgICAibGliY29kZWMyX3ZuZGsiLAotICAgICAgICAibGlibmF0aXZld2luZG93IiwKLSAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2NvbW1vbiIsCi0gICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMC4xIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAzLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMy4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMi4wIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnVpIiwKLSAgICAgICAgImxpYmRsIiwKLSAgICAgICAgImxpYmhhcmR3YXJlIiwKLSAgICAgICAgImxpYnZuZGtzdXBwb3J0IiwKLSAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCi0gICAgXSwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCmluZGV4IDQ1ZTJjYTguLjgwODczOTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCkBAIC0xOSwxMiArMTksMTMgQEAKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CiAKICNpbmNsdWRlIDxDMkRlYnVnLmg+CiAjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgorI2luY2x1ZGUgPENvZGVjMkNvbW1vblV0aWxzLmg+CiAjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KIAogI2luY2x1ZGUgIkMyU29mdFZweERlYy5oIgpAQCAtMjE3LDExICsyMTgsMjQgQEAKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAKICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBwaXhlbEZvcm1hdHMgPSB7SEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4fTsKKyNpZmRlZiBWUDkKKyAgICAgICAgaWYgKGlzSGFsUGl4ZWxGb3JtYXRTdXBwb3J0ZWQoKEFIYXJkd2FyZUJ1ZmZlcl9Gb3JtYXQpSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl9QMDEwKSkgeworICAgICAgICAgICAgcGl4ZWxGb3JtYXRzLnB1c2hfYmFjayhIQUxfUElYRUxfRk9STUFUX1lDQkNSX1AwMTApOworICAgICAgICB9CisgICAgICAgIC8vIElmIGNvbG9yIGZvcm1hdCBzdXJmYWNlIGlzbid0IGFkZGVkIHRvIHN1cHBvcnRlZCBmb3JtYXRzLCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdworICAgICAgICAvLyB3aGVuIHRoZSBjb2xvci1mb3JtYXQgaXMgY29uZmlndXJlZCB0byBzdXJmYWNlLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBiZSBhYmxlIHRvCisgICAgICAgIC8vIGNob29zZSAxMC1iaXQgZm9ybWF0IHdoaWxlIGRlY29kaW5nIDEwLWJpdCBjbGlwcyBpbiBzdXJmYWNlIG1vZGUKKyAgICAgICAgcGl4ZWxGb3JtYXRzLnB1c2hfYmFjayhIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworI2VuZGlmCiAgICAgICAgIGFkZFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKLSAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVBpeGVsRm9ybWF0LCB2YWx1ZSkub25lT2YocGl4ZWxGb3JtYXRzKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVBpeGVsRm9ybWF0KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCiAgICAgfQogCiAgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCkBAIC0yOTcsNiArMzExLDExIEBACiAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CiAgICAgfQogCisgICAgLy8gdW5zYWZlIGdldHRlcnMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gZ2V0UGl4ZWxGb3JtYXRfbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QaXhlbEZvcm1hdDsKKyAgICB9CisKIHByaXZhdGU6CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOwpAQCAtNDIzLDYgKzQ0MiwxMSBAQAogI2Vsc2UKICAgICBtTW9kZSA9IE1PREVfVlA4OwogI2VuZGlmCisgICAgbUhhbFBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIG1QaXhlbEZvcm1hdEluZm8gPSBtSW50Zi0+Z2V0UGl4ZWxGb3JtYXRfbCgpOworICAgIH0KIAogICAgIG1XaWR0aCA9IDMyMDsKICAgICBtSGVpZ2h0ID0gMjQwOwpAQCAtNjM4LDEyNSArNjYyLDYgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAotICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAotICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0WSwgc3JjWSwgd2lkdGgpOwotICAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOwotICAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0Viwgc3JjViwgd2lkdGggLyAyKTsKLSAgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3RVLCBzcmNVLCB3aWR0aCAvIDIpOwotICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKLSAgICB9Ci0KLX0KLQotc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKHVpbnQzMl90ICpkc3QsCi0gICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCi0gICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCi0gICAgICAgIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewotCi0gICAgLy8gQ29udmVydGluZyB0d28gbGluZXMgYXQgYSB0aW1lLCBzbGlnaHRseSBmYXN0ZXIKLSAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyKSB7Ci0gICAgICAgIHVpbnQzMl90ICpkc3RUb3AgPSAodWludDMyX3QgKikgZHN0OwotICAgICAgICB1aW50MzJfdCAqZHN0Qm90ID0gKHVpbnQzMl90ICopIChkc3QgKyBkc3RTdHJpZGUpOwotICAgICAgICB1aW50MTZfdCAqeVNyY1RvcCA9ICh1aW50MTZfdCopIHNyY1k7Ci0gICAgICAgIHVpbnQxNl90ICp5U3JjQm90ID0gKHVpbnQxNl90KikgKHNyY1kgKyBzcmNZU3RyaWRlKTsKLSAgICAgICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QqKSBzcmNVOwotICAgICAgICB1aW50MTZfdCAqdlNyYyA9ICh1aW50MTZfdCopIHNyY1Y7Ci0KLSAgICAgICAgdWludDMyX3QgdTAxLCB2MDEsIHkwMSwgeTIzLCB5NDUsIHk2NywgdXYwLCB1djE7Ci0gICAgICAgIHNpemVfdCB4ID0gMDsKLSAgICAgICAgZm9yICg7IHggPCB3aWR0aCAtIDM7IHggKz0gNCkgewotCi0gICAgICAgICAgICB1MDEgPSAqKCh1aW50MzJfdCopdVNyYyk7IHVTcmMgKz0gMjsKLSAgICAgICAgICAgIHYwMSA9ICooKHVpbnQzMl90Kil2U3JjKTsgdlNyYyArPSAyOwotCi0gICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKLSAgICAgICAgICAgIHkyMyA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsgeVNyY1RvcCArPSAyOwotICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7Ci0gICAgICAgICAgICB5NjcgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7IHlTcmNCb3QgKz0gMjsKLQotICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKLSAgICAgICAgICAgIHV2MSA9ICh1MDEgPj4gMTYpIHwgKCh2MDEgPj4gMTYpIDw8IDIwKTsKLQotICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKLSAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyA+PiAxNikgPDwgMTApIHwgdXYxOwotCi0gICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7Ci0gICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgJiAweDNGRikgPDwgMTApIHwgdXYxOwotICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ID4+IDE2KSA8PCAxMCkgfCB1djE7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYXQgbW9zdCAyIG1vcmUgcGl4ZWxzIHRvIHByb2Nlc3MuIE5vdGUgdGhhdCB3ZSBkb24ndAotICAgICAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KLSAgICAgICAgaWYgKHggPCB3aWR0aCkgewotICAgICAgICAgICAgdTAxID0gKnVTcmM7Ci0gICAgICAgICAgICB2MDEgPSAqdlNyYzsKLSAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsKLSAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsKLSAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7Ci0gICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7Ci0gICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOwotICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKLSAgICAgICAgfQotCi0gICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAqIDI7Ci0gICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKLSAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOwotICAgICAgICBkc3QgKz0gZHN0U3RyaWRlICogMjsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKAotICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAotICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAotICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAotICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKLQotICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICAgICAgICBkc3RZW3hdID0gKHVpbnQ4X3QpKHNyY1lbeF0gPj4gMik7Ci0gICAgICAgIH0KLQotICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7Ci0gICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgewotICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8ICh3aWR0aCArIDEpIC8gMjsgKyt4KSB7Ci0gICAgICAgICAgICBkc3RVW3hdID0gKHVpbnQ4X3QpKHNyY1VbeF0gPj4gMik7Ci0gICAgICAgICAgICBkc3RWW3hdID0gKHVpbnQ4X3QpKHNyY1ZbeF0gPj4gMik7Ci0gICAgICAgIH0KLQotICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7Ci0gICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKLSAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKLSAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQogc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjpvdXRwdXRCdWZmZXIoCiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCiAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKQpAQCAtNzk3LDE2ICs3MDIsMzcgQEAKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CiAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOwotICAgIGlmIChpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwMTYpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gZGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICBpZiAoaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMDE2ICYmCisgICAgICAgICAgICBtUGl4ZWxGb3JtYXRJbmZvLT52YWx1ZSAhPSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpIHsKICAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7Ci0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JBc3BlY3RzID0gbUludGYtPmdldERlZmF1bHRDb2xvckFzcGVjdHNfbCgpOwotCisgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMgPSBtSW50Zi0+Z2V0RGVmYXVsdENvbG9yQXNwZWN0c19sKCk7CisgICAgICAgIGJvb2wgYWxsb3dSR0JBMTAxMDEwMiA9IGZhbHNlOwogICAgICAgICBpZiAoZGVmYXVsdENvbG9yQXNwZWN0cy0+cHJpbWFyaWVzID09IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjAgJiYKICAgICAgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPm1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwICYmCiAgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT50cmFuc2ZlciA9PSBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQpIHsKLSAgICAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyOworICAgICAgICAgICAgYWxsb3dSR0JBMTAxMDEwMiA9IHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgZm9ybWF0ID0gZ2V0SGFsUGl4ZWxGb3JtYXRGb3JCaXREZXB0aDEwKGFsbG93UkdCQTEwMTAxMDIpOwogICAgIH0KKworICAgIGlmIChtSGFsUGl4ZWxGb3JtYXQgIT0gZm9ybWF0KSB7CisgICAgICAgIEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQgcGl4ZWxGb3JtYXQoMHUsIGZvcm1hdCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnBpeGVsRm9ybWF0IH0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShwaXhlbEZvcm1hdCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyB1cGRhdGUgcGl4ZWxGb3JtYXQgZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1IYWxQaXhlbEZvcm1hdCA9IGZvcm1hdDsKKyAgICB9CisKICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CiAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soYWxpZ24obVdpZHRoLCAxNiksIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZibG9jayk7CiAgICAgaWYgKGVyciAhPSBDMl9PSykgewpAQCAtODUwLDExICs3NzYsMTQgQEAKICAgICAgICAgICAgICAgICBxdWV1ZS0+ZW50cmllcy5wdXNoX2JhY2soCiAgICAgICAgICAgICAgICAgICAgICAgICBbZHN0WSwgc3JjWSwgc3JjVSwgc3JjViwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLCBkc3RZU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gbVdpZHRoLCBoZWlnaHQgPSBzdGQ6Om1pbihtSGVpZ2h0IC0gaSwga0hlaWdodCldIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoCisgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBtV2lkdGgsIGhlaWdodCA9IHN0ZDo6bWluKG1IZWlnaHQgLSBpLCBrSGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwT3JSR0JBMTAxMDEwMigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCAqKWRzdFksIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLCBkc3RZU3RyaWRlIC8gc2l6ZW9mKHVpbnQzMl90KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxjb25zdCBDMkNvbG9yQXNwZWN0c1N0cnVjdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAvIDIgKiBrSGVpZ2h0OwogICAgICAgICAgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZSAvIDIgKiAoa0hlaWdodCAvIDIpOwpAQCAtODY3LDI0ICs3OTYsMjIgQEAKICAgICAgICAgICAgICAgICBxdWV1ZS0+Y29uZC5zaWduYWwoKTsKICAgICAgICAgICAgICAgICBxdWV1ZS53YWl0Rm9yQ29uZGl0aW9uKHF1ZXVlLT5jb25kKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl9QMDEwKSB7CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1AwMTAoKHVpbnQxNl90ICopZHN0WSwgKHVpbnQxNl90ICopZHN0VSwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUgLyAyLCBkc3RVVlN0cmlkZSAvIDIsIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3RZLCBkc3RVLCBkc3RWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWSwgc3JjVSwgc3JjViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUgLyAyLCBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lWMTIoZHN0WSwgZHN0VSwgZHN0Viwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLCBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ldOwogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVV07CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXTsKIAotICAgICAgICBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgICAgICAgICBkc3RZLCBkc3RVLCBkc3RWLAotICAgICAgICAgICAgICAgIHNyY1ksIHNyY1UsIHNyY1YsCi0gICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwKLSAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKLSAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyOFRvWVYxMihkc3RZLCBkc3RVLCBkc3RWLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNWU3RyaWRlLCBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICB9CiAgICAgZmluaXNoV29yaygoKGMyX2NudHI2NF90ICopaW1nLT51c2VyX3ByaXYpLT5wZWVrdWxsKCksIHdvcmssIHN0ZDo6bW92ZShibG9jaykpOwogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuaAppbmRleCAyMDY1MTY1Li5lOWQ2ZGM5IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5oCkBAIC02MywxMCArNjMsMTUgQEAKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE11dGV4ZWQ8Q29udmVyc2lvblF1ZXVlPj4gbVF1ZXVlOwogICAgIH07CiAKKyAgICAvLyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGNvbXBvbmVudCBpbiBwcm9jZXNzCisgICAgLy8gKFRPRE86IGtlZXAgdGhpcyBpbiBpbnRmIGJ1dCBtYWtlIHRoZW0gaW50ZXJuYWwgb25seSkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0SW5mbzsKKwogICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CiAgICAgdnB4X2NvZGVjX2N0eF90ICptQ29kZWNDdHg7CiAgICAgYm9vbCBtRnJhbWVQYXJhbGxlbE1vZGU7ICAvLyBGcmFtZSBwYXJhbGxlbCBpcyBvbmx5IHN1cHBvcnRlZCBieSBWUDkgZGVjb2Rlci4KIAorICAgIHVpbnQzMl90IG1IYWxQaXhlbEZvcm1hdDsKICAgICB1aW50MzJfdCBtV2lkdGg7CiAgICAgdWludDMyX3QgbUhlaWdodDsKICAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuY3BwCmluZGV4IDYxNzc2OWIuLmY5OWVlMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuY3BwCkBAIC03MzMsOCArNzMzLDE0IEBACiAgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgewogICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKICAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBOiB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGNvbG9yQXNwZWN0czsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgICAgICAgICBjb2xvckFzcGVjdHMgPSBtSW50Zi0+Z2V0Q29kZWRDb2xvckFzcGVjdHNfbCgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgQ29udmVydFJHQlRvUGxhbmFyWVVWKG1Db252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgc3RyaWRlLCB2c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyLnNpemUoKSwgKnJWaWV3LmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlci5zaXplKCksICpyVmlldy5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckFzcGVjdHMtPm1hdHJpeCwgY29sb3JBc3BlY3RzLT5yYW5nZSk7CiAgICAgICAgICAgICB2cHhfaW1nX3dyYXAoJnJhd19mcmFtZSwgVlBYX0lNR19GTVRfSTQyMCwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyaWRlQWxpZ24sIG1Db252ZXJzaW9uQnVmZmVyLmRhdGEoKSk7CiAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuaAppbmRleCBlMjk2YzhmLi43MTRmYWRiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oCkBAIC0yNjUsNiArMjY1LDkgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ+IGdldFRlbXBvcmFsTGF5ZXJzX2woKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtTGF5ZXJpbmc7CiAgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gZ2V0Q29kZWRDb2xvckFzcGVjdHNfbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Db2RlZENvbG9yQXNwZWN0czsKKyAgICB9CiAgICAgdWludDMyX3QgZ2V0U3luY0ZyYW1lUGVyaW9kKCkgY29uc3Q7CiAgICAgc3RhdGljIEMyUiBDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSk7CiAgICAgc3RhdGljIEMyUiBDb2RlZENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+ICZtZSwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCmluZGV4IDY0OTk5YjcuLjdkNTc0MGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvQW5kcm9pZC5icApAQCAtMTEsNiArMTEsMTAgQEAKICAgICBuYW1lOiAibGliY29kZWMyX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CiAKQEAgLTE4LDYgKzIyLDEwIEBACiAgICAgbmFtZTogImxpYmNvZGVjMiIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKICAgICB2bmRrOiB7CiAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgfSwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb25maWcuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb25maWcuaAppbmRleCAyY2M3YWI3Li42ZmYzZGJjIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oCkBAIC01OSw2ICs1OSw4IEBACiAgICAgZW51bSBkcmNfY29tcHJlc3Npb25fbW9kZV90IDogaW50MzJfdDsgIC8vLzwgRFJDIGNvbXByZXNzaW9uIG1vZGUKICAgICBlbnVtIGRyY19lZmZlY3RfdHlwZV90IDogaW50MzJfdDsgICAgICAgLy8vPCBEUkMgZWZmZWN0IHR5cGUKICAgICBlbnVtIGRyY19hbGJ1bV9tb2RlX3QgOiBpbnQzMl90OyAgICAgICAgLy8vPCBEUkMgYWxidW0gbW9kZQorICAgIGVudW0gaGRyX2R5bmFtaWNfbWV0YWRhdGFfdHlwZV90IDogdWludDMyX3Q7ICAvLy88IEhEUiBkeW5hbWljIG1ldGFkYXRhIHR5cGUKKyAgICBlbnVtIGhkcl9mb3JtYXRfdCA6IHVpbnQzMl90OyAgICAgICAgICAgLy8vPCBIRFIgZm9ybWF0CiAgICAgZW51bSBpbnRyYV9yZWZyZXNoX21vZGVfdCA6IHVpbnQzMl90OyAgIC8vLzwgaW50cmEgcmVmcmVzaCBtb2RlcwogICAgIGVudW0gbGV2ZWxfdCA6IHVpbnQzMl90OyAgICAgICAgICAgICAgICAvLy88IGNvZGluZyBsZXZlbAogICAgIGVudW0gb3JkaW5hbF9rZXlfdCA6IHVpbnQzMl90OyAgICAgICAgICAvLy88IHdvcmsgb3JkZXJpbmcga2V5cwpAQCAtNzcsNiArNzksNyBAQAogCiBzdHJ1Y3QgQzJQbGF0Zm9ybUNvbmZpZyB7CiAgICAgZW51bSBlbmNvZGluZ19xdWFsaXR5X2xldmVsX3QgOiB1aW50MzJfdDsgLy8vPCBlbmNvZGluZyBxdWFsaXR5IGxldmVsCisgICAgZW51bSB0dW5uZWxfcGVla19tb2RlX3Q6IHVpbnQzMl90OyAgICAgIC8vLzwgdHVubmVsIHBlZWsgbW9kZQogfTsKIAogbmFtZXNwYWNlIHsKQEAgLTE4OSw5ICsxOTIsMTEgQEAKIAogICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGVNYXNrLAogICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGUsCisgICAgLy8gZGVwcmVjYXRlZAogICAgIGtQYXJhbUluZGV4SGRyMTBQbHVzTWV0YWRhdGEsCi0KICAgICBrUGFyYW1JbmRleFBpY3R1cmVRdWFudGl6YXRpb24sCisgICAga1BhcmFtSW5kZXhIZHJEeW5hbWljTWV0YWRhdGEsCisgICAga1BhcmFtSW5kZXhIZHJGb3JtYXQsCiAKICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdmlkZW8gY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMjcwLDYgKzI3NSwxNSBAQAogCiAgICAgLy8gZW5jb2RpbmcgcXVhbGl0eSByZXF1aXJlbWVudHMKICAgICBrUGFyYW1JbmRleEVuY29kaW5nUXVhbGl0eUxldmVsLCAvLyBlbmNvZGVycywgZW51bQorCisgICAgLy8gZW5jb2Rpbmcgc3RhdGlzdGljcywgYXZlcmFnZSBibG9jayBxcCBvZiBhIGZyYW1lCisgICAga1BhcmFtSW5kZXhBdmVyYWdlQmxvY2tRdWFudGl6YXRpb24sIC8vIGludDMyCisKKyAgICAvLyBjaGFubmVsIG1hc2sgZm9yIGRlY29kZWQgYXVkaW8KKyAgICBrUGFyYW1JbmRleEFuZHJvaWRDaGFubmVsTWFzaywgLy8gdWludDMyCisKKyAgICAvLyBhbGxvdyB0dW5uZWwgcGVlayBiZWhhdmlvciB0byBiZSB1bnNwZWNpZmllZCBmb3IgYXBwIGNvbXBhdGliaWxpdHkKKyAgICBrUGFyYW1JbmRleFR1bm5lbFBlZWtNb2RlLCAvLyB0dW5uZWwgbW9kZSwgZW51bQogfTsKIAogfQpAQCAtNjgwLDYgKzY5NCw5IEBACiAgICAgTEVWRUxfRFZfTUFJTl9VSERfMzAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkMzAKICAgICBMRVZFTF9EVl9NQUlOX1VIRF80OCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciB1aGQ0OAogICAgIExFVkVMX0RWX01BSU5fVUhEXzYwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIHVoZDYwCisgICAgTEVWRUxfRFZfTUFJTl9VSERfMTIwLCAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkMTIwCisgICAgTEVWRUxfRFZfTUFJTl84S18zMCwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgOGszMAorICAgIExFVkVMX0RWX01BSU5fOEtfNjAsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIDhrNjAKIAogICAgIExFVkVMX0RWX0hJR0hfSERfMjQgPSBfQzJfUExfRFZfQkFTRSArIDB4MTAwLCAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGhkMjQKICAgICBMRVZFTF9EVl9ISUdIX0hEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciBoZDMwCkBAIC02OTAsNiArNzA3LDkgQEAKICAgICBMRVZFTF9EVl9ISUdIX1VIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciB1aGQzMAogICAgIExFVkVMX0RWX0hJR0hfVUhEXzQ4LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIHVoZDQ4CiAgICAgTEVWRUxfRFZfSElHSF9VSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkNjAKKyAgICBMRVZFTF9EVl9ISUdIX1VIRF8xMjAsICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciB1aGQxMjAKKyAgICBMRVZFTF9EVl9ISUdIXzhLXzMwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciA4azMwCisgICAgTEVWRUxfRFZfSElHSF84S182MCwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgOGs2MAogCiAgICAgLy8gQVYxIGxldmVscwogICAgIExFVkVMX0FWMV8yICAgID0gX0MyX1BMX0FWMV9CQVNFICwgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMgpAQCAtMTYwMiwxNiArMTYyMiw4MiBAQAogICAgIEMyRklFTEQobWF4RmFsbCwgIm1heC1mYWxsIikKIH07CiB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkhkclN0YXRpY01ldGFkYXRhU3RydWN0LCBrUGFyYW1JbmRleEhkclN0YXRpY01ldGFkYXRhPgotICAgICAgICBDMlN0cmVhbUhkclN0YXRpY0luZm87CisgICAgICAgIEMyU3RyZWFtSGRyU3RhdGljTWV0YWRhdGFJbmZvOwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCwga1BhcmFtSW5kZXhIZHJTdGF0aWNNZXRhZGF0YT4KKyAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOyAgLy8gZGVwcmVjYXRlZAogY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPW10gPSAicmF3Lmhkci1zdGF0aWMtaW5mbyI7CiAKIC8qKgogICogSERSMTArIE1ldGFkYXRhIEluZm8uCisgKgorICogRGVwcmVjYXRlZC4gVXNlIEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbyB3aXRoCisgKiBIRFJfRFlOQU1JQ19NRVRBREFUQV9UWVBFX1NNUFRFXzIwOTRfNDAKICAqLwogdHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJCbG9iVmFsdWUsIGtQYXJhbUluZGV4SGRyMTBQbHVzTWV0YWRhdGE+Ci0gICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzsKLWNvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0hEUjEwX1BMVVNfSU5GT1tdID0gImlucHV0LmhkcjEwLXBsdXMtaW5mbyI7Ci1jb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfSERSMTBfUExVU19JTkZPW10gPSAib3V0cHV0LmhkcjEwLXBsdXMtaW5mbyI7CisgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzsgIC8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0hEUjEwX1BMVVNfSU5GT1tdID0gImlucHV0LmhkcjEwLXBsdXMtaW5mbyI7ICAvLyBkZXByZWNhdGVkCitjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfSERSMTBfUExVU19JTkZPW10gPSAib3V0cHV0LmhkcjEwLXBsdXMtaW5mbyI7ICAvLyBkZXByZWNhdGVkCisKKy8qKgorICogSERSIGR5bmFtaWMgbWV0YWRhdGEgdHlwZXMKKyAqLworQzJFTlVNKEMyQ29uZmlnOjpoZHJfZHluYW1pY19tZXRhZGF0YV90eXBlX3QsIHVpbnQzMl90LAorICAgIEhEUl9EWU5BTUlDX01FVEFEQVRBX1RZUEVfU01QVEVfMjA5NF8xMCwgIC8vLzwgU01QVEUgU1QgMjA5NC0xMAorICAgIEhEUl9EWU5BTUlDX01FVEFEQVRBX1RZUEVfU01QVEVfMjA5NF80MCwgIC8vLzwgU01QVEUgU1QgMjA5NC00MAorKQorCitzdHJ1Y3QgQzJIZHJEeW5hbWljTWV0YWRhdGFTdHJ1Y3QgeworICAgIGlubGluZSBDMkhkckR5bmFtaWNNZXRhZGF0YVN0cnVjdCgpIHsgbWVtc2V0KHRoaXMsIDAsIHNpemVvZigqdGhpcykpOyB9CisKKyAgICBpbmxpbmUgQzJIZHJEeW5hbWljTWV0YWRhdGFTdHJ1Y3QoCisgICAgICAgICAgICBzaXplX3QgZmxleENvdW50LCBDMkNvbmZpZzo6aGRyX2R5bmFtaWNfbWV0YWRhdGFfdHlwZV90IHR5cGUpCisgICAgICAgIDogdHlwZV8odHlwZSkgeworICAgICAgICBtZW1zZXQoZGF0YSwgMCwgZmxleENvdW50KTsKKyAgICB9CisKKyAgICBDMkNvbmZpZzo6aGRyX2R5bmFtaWNfbWV0YWRhdGFfdHlwZV90IHR5cGVfOworICAgIHVpbnQ4X3QgZGF0YVtdOworCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKEhkckR5bmFtaWNNZXRhZGF0YSwgZGF0YSkKKyAgICBDMkZJRUxEKHR5cGVfLCAidHlwZSIpCisgICAgQzJGSUVMRChkYXRhLCAiZGF0YSIpCit9OworCisvKioKKyAqIER5bmFtaWMgSERSIE1ldGFkYXRhIEluZm8uCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMySGRyRHluYW1pY01ldGFkYXRhU3RydWN0LCBrUGFyYW1JbmRleEhkckR5bmFtaWNNZXRhZGF0YT4KKyAgICAgICAgQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfSERSX0RZTkFNSUNfSU5GT1tdID0gImlucHV0Lmhkci1keW5hbWljLWluZm8iOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0hEUl9EWU5BTUlDX0lORk9bXSA9ICJvdXRwdXQuaGRyLWR5bmFtaWMtaW5mbyI7CisKKy8qKgorICogSERSIEZvcm1hdAorICovCitDMkVOVU0oQzJDb25maWc6Omhkcl9mb3JtYXRfdCwgdWludDMyX3QsCisgICAgVU5LTk9XTiwgICAgIC8vLzwgSERSIGZvcm1hdCBub3Qga25vd24gKGRlZmF1bHQpCisgICAgU0RSLCAgICAgICAgIC8vLzwgbm90IEhEUiAoU0RSKQorICAgIEhMRywgICAgICAgICAvLy88IEhMRworICAgIEhEUjEwLCAgICAgICAvLy88IEhEUjEwCisgICAgSERSMTBfUExVUywgIC8vLzwgSERSMTArCispOworCisvKioKKyAqIEhEUiBGb3JtYXQgSW5mbworICoKKyAqIFRoaXMgaW5mb3JtYXRpb24gbWF5IGJlIHByZXNlbnQgZHVyaW5nIGNvbmZpZ3VyYXRpb24gdG8gYWxsb3cgZW5jb2RlcnMgdG8KKyAqIHByZXBhcmUgZW5jb2RpbmcgY2VydGFpbiBIRFIgZm9ybWF0cy4gV2hlbiB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdCBwcmVzZW50CisgKiBiZWZvcmUgc3RhcnQsIGVuY29kZXJzIHNob3VsZCBkZXRlcm1pbmUgdGhlIEhEUiBmb3JtYXQgYmFzZWQgb24gdGhlIGF2YWlsYWJsZQorICogSERSIG1ldGFkYXRhIG9uIHRoZSBmaXJzdCBpbnB1dCBmcmFtZS4KKyAqCisgKiBXaGlsZSB0aGlzIGluZm9ybWF0aW9uIGlzIG9wdGlvbmFsLCBpdCBpcyBub3QgYSBoaW50LiBXaGVuIHByZXNlbnQsIGVuY29kZXJzCisgKiB0aGF0IGRvIG5vdCBzdXBwb3J0IGR5bmFtaWMgcmVjb25maWd1cmF0aW9uIGRvIG5vdCBuZWVkIHRvIHN3aXRjaCB0byB0aGUgSERSCisgKiBmb3JtYXQgYmFzZWQgb24gdGhlIG1ldGFkYXRhIG9uIHRoZSBmaXJzdCBpbnB1dCBmcmFtZS4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q+PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleEhkckZvcm1hdD4KKyAgICAgICAgQzJTdHJlYW1IZHJGb3JtYXRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSERSX0ZPUk1BVFtdID0gImNvZGVkLmhkci1mb3JtYXQiOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYmxvY2stYmFzZWQgY29kaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTE2NzMsNyArMTc1OSw3IEBACiAgICAgU1lOQ19GUkFNRSA9ICgxIDw8IDApLCAgLy8vPCBzeW5jIGZyYW1lLCBlLmcuIElEUgogICAgIElfRlJBTUUgICAgPSAoMSA8PCAxKSwgIC8vLzwgaW50cmEgZnJhbWUgdGhhdCBpcyBjb21wbGV0ZWx5IGVuY29kZWQKICAgICBQX0ZSQU1FICAgID0gKDEgPDwgMiksICAvLy88IGludGVyIHByZWRpY3RlZCBmcmFtZSBmcm9tIHByZXZpb3VzIGZyYW1lcwotICAgIEJfRlJBTUUgICAgPSAoMSA8PCAzKSwgIC8vLzwgYmFja3dhcmQgcHJlZGljdGVkIChvdXQtb2Ytb3JkZXIpIGZyYW1lCisgICAgQl9GUkFNRSAgICA9ICgxIDw8IDMpLCAgLy8vPCBiaWRpcmVjdGlvbmFsIHByZWRpY3RlZCAob3V0LW9mLW9yZGVyKSBmcmFtZQogKQogCiAvKioKQEAgLTE5MzAsNiArMjAxNiwxNCBAQAogY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTUFYX0NPREVEX0NIQU5ORUxfQ09VTlRbXSA9ICJjb2RlZC5tYXgtY2hhbm5lbC1jb3VudCI7CiAKIC8qKgorICogQXVkaW8gY2hhbm5lbCBtYXNrLiBVc2VkIGJ5IGRlY29kZXIgdG8gZXhwcmVzcyBhdWRpbyBjaGFubmVsIG1hc2sgb2YgZGVjb2RlZCBjb250ZW50LgorICogQ2hhbm5lbCByZXByZXNlbnRhdGlvbiBpcyBzcGVjaWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBKYXZhIGFuZHJvaWQubWVkaWEuQXVkaW9Gb3JtYXQKKyAqIENIQU5ORUxfT1VUXyogY29uc3RhbnRzLgorICovCisgdHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhBbmRyb2lkQ2hhbm5lbE1hc2s+IEMyU3RyZWFtQ2hhbm5lbE1hc2tJbmZvOworIGNvbnN0IGNoYXIgQzJfUEFSQU1LRVlfQ0hBTk5FTF9NQVNLW10gPSAicmF3LmNoYW5uZWwtbWFzayI7CisKKy8qKgogICogQXVkaW8gc2FtcGxlIGZvcm1hdCAoUENNIGVuY29kaW5nKQogICovCiBDMkVOVU0oQzJDb25maWc6OnBjbV9lbmNvZGluZ190LCB1aW50MzJfdCwKQEAgLTIzOTIsNiArMjQ4NiwyOCBAQAogICAgICAgICBDMlN0cmVhbVR1bm5lbFN0YXJ0UmVuZGVyOwogY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVFVOTkVMX1NUQVJUX1JFTkRFUltdID0gIm91dHB1dC50dW5uZWwtc3RhcnQtcmVuZGVyIjsKIAorLyoqIFR1bm5lbCBQZWVrIE1vZGUuICovCitDMkVOVU0oQzJQbGF0Zm9ybUNvbmZpZzo6dHVubmVsX3BlZWtfbW9kZV90LCB1aW50MzJfdCwKKyAgICBVTlNQRUNJRklFRF9QRUVLID0gMCwKKyAgICBTUEVDSUZJRURfUEVFSyA9IDEKKyk7CisKKy8qKgorICogVHVubmVsIFBlZWsgTW9kZSBUdW5pbmcgcGFyYW1ldGVyLgorICoKKyAqIElmIHNldCB0byBVTlNQRUNJRklFRF9QRUVLX01PREUsIHRoZSBkZWNvZGVyIGlzIGZyZWUgdG8gaWdub3JlIHRoZQorICogQzJTdHJlYW1UdW5uZWxIb2xkUmVuZGVyIGFuZCBDMlN0cmVhbVR1bm5lbFN0YXJ0UmVuZGVyIGZsYWdzIGFuZCBhc3NvY2lhdGVkCisgKiBmZWF0dXJlcy4gQWRkaXRpb25hbGx5LCBpdCBiZWNvbWVzIHVwIHRvIHRoZSBkZWNvZGVyIHRvIGRpc3BsYXkgYW55IGZyYW1lCisgKiBiZWZvcmUgcmVjZWl2aW5nIHN5bmNocm9uaXphdGlvbiBpbmZvcm1hdGlvbi4KKyAqCisgKiBOb3RlOiBUaGlzIHBhcmFtZXRlciBhbGxvd3MgYSBkZWNvZGVyIHRvIGlnbm9yZSB0aGUgdmlkZW8gcGVlayBtYWNoaW5lcnkgYW5kCisgKiB0byByZXZlcnQgdG8gaXRzIHByZWZlcnJlZCBiZWhhdmlvci4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMkVhc3lFbnVtPEMyUGxhdGZvcm1Db25maWc6OnR1bm5lbF9wZWVrX21vZGVfdD4sCisgICAgICAgIGtQYXJhbUluZGV4VHVubmVsUGVla01vZGU+IEMyU3RyZWFtVHVubmVsUGVla01vZGVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9UVU5ORUxfUEVFS19NT0RFW10gPQorICAgICAgICAib3V0cHV0LnR1bm5lbC1wZWVrLW1vZGUiOworCiAvKioKICAqIEVuY29kaW5nIHF1YWxpdHkgbGV2ZWwgc2lnbmFsaW5nLgogICoKQEAgLTI0MTEsNiArMjUyNywxNyBAQAogICAgIFNfSEFOREhFTEQgPSAxICAgICAgICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBWTUFGPTcwCiApOwogCisvKioKKyAqIFZpZGVvIEVuY29kaW5nIFN0YXRpc3RpY3MgRXhwb3J0CisgKi8KKworLyoqCisgKiBBdmVyYWdlIGJsb2NrIFFQIGV4cG9ydGVkIGZyb20gdmlkZW8gZW5jb2Rlci4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxpbnQzMl90Piwga1BhcmFtSW5kZXhBdmVyYWdlQmxvY2tRdWFudGl6YXRpb24+CisgICAgICAgIEMyQW5kcm9pZFN0cmVhbUF2ZXJhZ2VCbG9ja1F1YW50aXphdGlvbkluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9BVkVSQUdFX1FQW10gPSAiY29kZWQuYXZlcmFnZS1xcCI7CisKIC8vLyBAfQogCiAjZW5kaWYgIC8vIEMyQ09ORklHX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvZnV6emVyL0FuZHJvaWQuYnAKaW5kZXggYmQxZmFjNi4uMTQ3YTUyZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2Z1enplci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMjgsNDcgKzI4LDIyIEBACiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogIkMyRnV6emVyLWRlZmF1bHRzIiwKIAorICAgIGRlZmF1bHRzOiBbICJsaWJjb2RlYzItc3RhdGljLWRlZmF1bHRzIiBdLAorCiAgICAgc3JjczogWwogICAgICAgICAiQzJGdXp6ZXIuY3BwIiwKICAgICBdLAogCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJpb24iLAotICAgICAgICAibGliZm1xIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmNvZGVjMiIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJkbWFidWZoZWFwIiwKLSAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKLSAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCi0gICAgICAgICJsaWJjb2RlYzJfc29mdF9jb21tb24iLAotICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAuMSIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMy4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDMuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDIuMCIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJ1aSIsCi0gICAgICAgICJsaWJkbCIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliaGFyZHdhcmUiLAotICAgICAgICAibGlidm5ka3N1cHBvcnQiLAotICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKLSAgICBdLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAorCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJ3b25zaWtAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgfSwKIH0KIAogY2NfZnV6eiB7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZnV6emVyL0MyRnV6emVyLmNwcCBiL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuY3BwCmluZGV4IDUxZTEwMTMuLmU0NjlkOGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuY3BwCkBAIC0xOTQsMTIgKzE5NCwxMiBAQAogICB9CiAKICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFtczsKKyAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0IGlucHV0U2l6ZSgwdSwga1dpZHRoT2ZWaWRlbywga0hlaWdodE9mVmlkZW8pOworICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIGtTYW1wbGluZ1JhdGVPZkF1ZGlvKTsKKyAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwga0NoYW5uZWxzT2ZBdWRpbyk7CiAgIGlmIChkb21haW4udmFsdWUgPT0gRE9NQUlOX1ZJREVPKSB7Ci0gICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0IGlucHV0U2l6ZSgwdSwga1dpZHRoT2ZWaWRlbywga0hlaWdodE9mVmlkZW8pOwogICAgIGNvbmZpZ1BhcmFtcy5wdXNoX2JhY2soJmlucHV0U2l6ZSk7CiAgIH0gZWxzZSBpZiAoZG9tYWluLnZhbHVlID09IERPTUFJTl9BVURJTykgewotICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwga1NhbXBsaW5nUmF0ZU9mQXVkaW8pOwotICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIGtDaGFubmVsc09mQXVkaW8pOwogICAgIGNvbmZpZ1BhcmFtcy5wdXNoX2JhY2soJnNhbXBsZVJhdGVJbmZvKTsKICAgICBjb25maWdQYXJhbXMucHVzaF9iYWNrKCZjaGFubmVsQ291bnRJbmZvKTsKICAgfQpAQCAtMjM5LDE3ICsyMzksMTcgQEAKIH0KIAogdm9pZCBDb2RlYzJGdXp6ZXI6OmRlY29kZUZyYW1lcyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBtQnVmZmVyU291cmNlID0gbmV3IEJ1ZmZlclNvdXJjZShkYXRhLCBzaXplKTsKLSAgaWYgKCFtQnVmZmVyU291cmNlKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTb3VyY2U+IGJ1ZmZlclNvdXJjZSA9IHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU291cmNlPihkYXRhLCBzaXplKTsKKyAgaWYgKCFidWZmZXJTb3VyY2UpIHsKICAgICByZXR1cm47CiAgIH0KLSAgbUJ1ZmZlclNvdXJjZS0+cGFyc2UoKTsKKyAgYnVmZmVyU291cmNlLT5wYXJzZSgpOwogICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBDMl9PSzsKICAgc2l6ZV90IG51bUZyYW1lcyA9IDA7Ci0gIHdoaWxlICghbUJ1ZmZlclNvdXJjZS0+aXNFb3MoKSkgeworICB3aGlsZSAoIWJ1ZmZlclNvdXJjZS0+aXNFb3MoKSkgewogICAgIHVpbnQ4X3QqIGZyYW1lID0gbnVsbHB0cjsKICAgICBzaXplX3QgZnJhbWVTaXplID0gMDsKLSAgICBGcmFtZURhdGEgZnJhbWVEYXRhID0gbUJ1ZmZlclNvdXJjZS0+Z2V0RnJhbWUoKTsKKyAgICBGcmFtZURhdGEgZnJhbWVEYXRhID0gYnVmZmVyU291cmNlLT5nZXRGcmFtZSgpOwogICAgIGZyYW1lID0gc3RkOjpnZXQ8MD4oZnJhbWVEYXRhKTsKICAgICBmcmFtZVNpemUgPSBzdGQ6OmdldDwxPihmcmFtZURhdGEpOwogCkBAIC0yOTgsNyArMjk4LDYgQEAKICAgbUNvbmRpdGlvbmFsVmFyaWFibGUud2FpdF9mb3Iod2FpdEZvckRlY29kZUNvbXBsZXRlLCBrQzJGdXp6ZXJUaW1lT3V0LCBbdGhpc10geyByZXR1cm4gbUVvczsgfSk7CiAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJmbHVzaGVkV29ya3M7CiAgIG1Db21wb25lbnQtPmZsdXNoX3NtKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZjMmZsdXNoZWRXb3Jrcyk7Ci0gIGRlbGV0ZSBtQnVmZmVyU291cmNlOwogfQogCiBleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZnV6emVyL0MyRnV6emVyLmggYi9tZWRpYS9jb2RlYzIvZnV6emVyL0MyRnV6emVyLmgKaW5kZXggZDVhYzgxYS4uZGE3Njg4NSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2Z1enplci9DMkZ1enplci5oCisrKyBiL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuaApAQCAtMTA0LDcgKzEwNCw2IEBACiAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01hcmtlclN1ZmZpeFNpemUgPSAzOwogICB9OwogCi0gIEJ1ZmZlclNvdXJjZSogbUJ1ZmZlclNvdXJjZTsKICAgYm9vbCBtRW9zID0gZmFsc2U7CiAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icAppbmRleCAxMjJhYWNkLi5kYjc4NzRkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icApAQCAtNTcsNiArNTcsMTAgQEAKICAgICBuYW1lOiAibGliY29kZWMyX2hpZGxAMS4wIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogCiAgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwCmluZGV4IDA4MmM1ZTMuLmRmMzBkYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwCkBAIC00ODIsNiArNDgyLDM3IEBACiAgICAgaWYgKHJlcyAhPSBDMl9PSykgewogICAgICAgICBtSW5pdCA9IHJlczsKICAgICB9CisKKyAgICBzdHJ1Y3QgTGlzdGVuZXJEZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBId0RlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgTGlzdGVuZXJEZWF0aFJlY2lwaWVudChjb25zdCB3cDxDb21wb25lbnQ+JiBjb21wKQorICAgICAgICAgICAgOiBtQ29tcG9uZW50e2NvbXB9IHsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAgICAgYXV0byBzdHJvbmdDb21wb25lbnQgPSBtQ29tcG9uZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzdHJvbmdDb21wb25lbnQpIHsKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIkNsaWVudCBkaWVkICEgcmVsZWFzZSB0aGUgY29tcG9uZW50ICEhIjsKKyAgICAgICAgICAgICAgICBzdHJvbmdDb21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2xpZW50IGRpZWQgISBubyBjb21wb25lbnQgdG8gcmVsZWFzZSAhISI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3cDxDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgfTsKKworICAgIG1EZWF0aFJlY2lwaWVudCA9IG5ldyBMaXN0ZW5lckRlYXRoUmVjaXBpZW50KHNlbGYpOworICAgIFJldHVybjxib29sPiB0cmFuc1N0YXR1cyA9IG1MaXN0ZW5lci0+bGlua1RvRGVhdGgoCisgICAgICAgICAgICBtRGVhdGhSZWNpcGllbnQsIDApOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkxpc3RlbmVyIGxpbmtUb0RlYXRoKCkgdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgfQorICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4odHJhbnNTdGF0dXMpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkxpc3RlbmVyIGxpbmtUb0RlYXRoKCkgY2FsbCBmYWlsZWQuIjsKKyAgICB9CiB9CiAKIENvbXBvbmVudDo6fkNvbXBvbmVudCgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaAppbmRleCA4NmRjY2QwLi5lMzQzNjU1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oCkBAIC0xMzIsNiArMTMyLDkgQEAKICAgICBmcmllbmQgc3RydWN0IENvbXBvbmVudFN0b3JlOwogCiAgICAgc3RydWN0IExpc3RlbmVyOworCisgICAgdXNpbmcgSHdEZWF0aFJlY2lwaWVudCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50OworICAgIHNwPEh3RGVhdGhSZWNpcGllbnQ+IG1EZWF0aFJlY2lwaWVudDsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSB1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy90eXBlcy5jcHAKaW5kZXggNzJmN2M0My4uNWMyNGJkNyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CiAjaW5jbHVkZSA8QzJCdWZmZXIuaD4KICNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyRmVuY2VGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8QzJQYXJhbS5oPgogI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgogI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CkBAIC03NTksMTcgKzc2MCwxNCBAQAogLy8gTm90ZTogRmlsZSBkZXNjcmlwdG9ycyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBmaWxlIGRlc2NyaXB0b3IgbXVzdAogLy8gbm90IGJlIGNsb3NlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgogYm9vbCBvYmpjcHkoaGlkbF9oYW5kbGUqIGQsIGNvbnN0IEMyRmVuY2UmIHMpIHsKLSAgICAodm9pZClzOyAvLyBUT0RPOiBpbXBsZW1lbnQgcy5mZCgpCi0gICAgaW50IGZlbmNlRmQgPSAtMTsKICAgICBkLT5zZXRUbyhudWxscHRyKTsKLSAgICBpZiAoZmVuY2VGZCA+PSAwKSB7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgICAgIGlmICghaGFuZGxlKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGEgbmF0aXZlIGhhbmRsZS4iOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGhhbmRsZS0+ZGF0YVswXSA9IGZlbmNlRmQ7CisgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBfQzJGZW5jZUZhY3Rvcnk6OkNyZWF0ZU5hdGl2ZUhhbmRsZShzKTsKKyAgICBpZiAoaGFuZGxlKSB7CiAgICAgICAgIGQtPnNldFRvKGhhbmRsZSwgdHJ1ZSAvKiBvd25zICovKTsKKy8vICB9IGVsc2UgaWYgKCFzLnJlYWR5KCkpIHsKKy8vICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIHdhaXQgZm9yIHVubWFyc2hhbGxhYmxlIGZlbmNlcyBidXQgdGhpcyBtYXkgbm90IGJlCisvLyAgICAgIC8vIHRoZSBiZXN0IHBsYWNlIGZvciBpdC4gV2UgY2FuIHNhZmVseSBpZ25vcmUgaGVyZSBhcyBhdCB0aGlzIHRpbWUKKy8vICAgICAgLy8gYWxsIGZlbmNlcyB1c2VkIGhlcmUgYXJlIG1hcnNoYWxsYWJsZS4KICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC0xMTg0LDkgKzExODIsOCBAQAogLy8gTm90ZTogRmlsZSBkZXNjcmlwdG9ycyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBmaWxlIGRlc2NyaXB0b3IgbXVzdAogLy8gbm90IGJlIGNsb3NlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgogYm9vbCBvYmpjcHkoQzJGZW5jZSogZCwgY29uc3QgaGlkbF9oYW5kbGUmIHMpIHsKLSAgICAvLyBUT0RPOiBJbXBsZW1lbnQuCi0gICAgKHZvaWQpczsKLSAgICAqZCA9IEMyRmVuY2UoKTsKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IHMuZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgKmQgPSBfQzJGZW5jZUZhY3Rvcnk6OkNyZWF0ZUZyb21OYXRpdmVIYW5kbGUoaGFuZGxlKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy8uY2xhbmctZm9ybWF0IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy8uY2xhbmctZm9ybWF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAxMzYyNzljLi4wMDAwMDAwCi0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvLmNsYW5nLWZvcm1hdAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uLy4uLy4uLy4uLy4uL2J1aWxkL3Nvb25nL3NjcmlwdHMvc3lzdGVtLWNsYW5nLWZvcm1hdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvT1dORVJTIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9PV05FUlMKaW5kZXggZGJlODljZi4uMzJiMTFiOCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9PV05FUlMKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9PV05FUlMKQEAgLTEsOCArMSw1IEBACisjIEJ1ZyBjb21wb25lbnQ6IDI1NjkwCiAjIE1lZGlhIHRlYW0KIGxham9zQGdvb2dsZS5jb20KLXBhd2luQGdvb2dsZS5jb20KIHRha2xlZUBnb29nbGUuY29tCiB3b25zaWtAZ29vZ2xlLmNvbQotCi0jIFZUUyB0ZWFtCi1kc2hpQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwCmluZGV4IDllM2E4MjMuLmQ0N2VmNjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcApAQCAtNDY1LDYgKzQ2NSwxMSBAQAogICAgIGlmIChtTWltZS5maW5kKCJyYXciKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgICAgICBiaXRTdHJlYW1JbmZvWzBdID0gODAwMDsKICAgICAgICAgYml0U3RyZWFtSW5mb1sxXSA9IDE7CisgICAgfSBlbHNlIGlmICgobU1pbWUuZmluZCgiZzcxMS1hbGF3IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHx8CisgICAgICAgICAgICAgICAobU1pbWUuZmluZCgiZzcxMS1tbGF3IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKSB7CisgICAgICAgIC8vIGc3MTEgdGVzdCBkYXRhIGlzIGFsbCAxLWNoYW5uZWwgYW5kIGhhcyBubyBlbWJlZGRlZCBjb25maWcgaW5mby4KKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbU1pbWUsIGJpdFN0cmVhbUluZm8pKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL0FuZHJvaWQuYnAKaW5kZXggNDEwNmJlOC4uYmU0YmFmYSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vQW5kcm9pZC5icApAQCAtMTQsOCArMTQsOCBAQAogICAgICAgICAibGliY29kZWMyLWhpZGwtY2xpZW50LWRlZmF1bHRzIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlIiwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY29kZWMyX2NsaWVudF9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc3JjczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwCmluZGV4IGZmZWM4OTcuLjI3NWE3MjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAKQEAgLTYxLDYgKzYxLDcgQEAKICAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKICAgICAgICAgZ2V0UGFyYW1zKCk7CisgICAgICAgIG1EaXNhYmxlVGVzdCA9IGZhbHNlOwogICAgICAgICBtRW9zID0gZmFsc2U7CiAgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKG1JbnN0YW5jZU5hbWUuY19zdHIoKSk7CiAgICAgICAgIEFTU0VSVF9ORShtQ2xpZW50LCBudWxscHRyKTsKQEAgLTczLDYgKzc0LDE0IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgewogICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CiAgICAgICAgIH0KKworICAgICAgICBDMlNlY3VyZU1vZGVUdW5pbmcgc2VjdXJlTW9kZVR1bmluZ3t9OworICAgICAgICBtQ29tcG9uZW50LT5xdWVyeSh7JnNlY3VyZU1vZGVUdW5pbmd9LCB7fSwgQzJfTUFZX0JMT0NLLCBudWxscHRyKTsKKyAgICAgICAgaWYgKHNlY3VyZU1vZGVUdW5pbmcudmFsdWUgIT0gQzJDb25maWc6OlNNX1VOUFJPVEVDVEVEKSB7CisgICAgICAgICAgICBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewpAQCAtMTA1LDYgKzExNCw3IEBACiAgICAgc3RkOjpzdHJpbmcgbUluc3RhbmNlTmFtZTsKICAgICBzdGQ6OnN0cmluZyBtQ29tcG9uZW50TmFtZTsKICAgICBib29sIG1Fb3M7CisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CiAgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOwogICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CkBAIC0zMjQsNiArMzM0LDcgQEAKIH07CiAKIFRFU1RfUChDb2RlYzJDb21wb25lbnRJbnB1dFRlc3RzLCBJbnB1dEJ1ZmZlclRlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSBHVEVTVF9TS0lQKCkgPDwgIlRlc3QgaXMgZGlzYWJsZWQiOwogICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBmb3IgZGlmZmVyZW50IGlucHV0cyIpOwogCiAgICAgdWludDMyX3QgZmxhZ3MgPSBzdGQ6OmdldDwyPihHZXRQYXJhbSgpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL0FuZHJvaWQuYnAKaW5kZXggMGVlZWRiNi4uZWQ3N2ExNSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTY3LDYgKzY3LDExIEBACiAgICAgbmFtZTogImxpYmNvZGVjMl9oaWRsQDEuMSIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKKwogCiAgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQ29tcG9uZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9Db21wb25lbnQuY3BwCmluZGV4IDFkN2QzZDguLjJkZDkyMmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9Db21wb25lbnQuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9Db21wb25lbnQuY3BwCkBAIC00ODksNiArNDg5LDM3IEBACiAgICAgaWYgKHJlcyAhPSBDMl9PSykgewogICAgICAgICBtSW5pdCA9IHJlczsKICAgICB9CisKKyAgICBzdHJ1Y3QgTGlzdGVuZXJEZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBId0RlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgTGlzdGVuZXJEZWF0aFJlY2lwaWVudChjb25zdCB3cDxDb21wb25lbnQ+JiBjb21wKQorICAgICAgICAgICAgOiBjb21wb25lbnR7Y29tcH0geworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKAorICAgICAgICAgICAgICAgIHVpbnQ2NF90IC8qIGNvb2tpZSAqLywKKyAgICAgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgICAgICBhdXRvIHN0cm9uZ0NvbXBvbmVudCA9IGNvbXBvbmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoc3Ryb25nQ29tcG9uZW50KSB7CisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJDbGllbnQgZGllZCAhIHJlbGVhc2UgdGhlIGNvbXBvbmVudCAhISI7CisgICAgICAgICAgICAgICAgc3Ryb25nQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNsaWVudCBkaWVkICEgbm8gY29tcG9uZW50IHRvIHJlbGVhc2UgISEiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd3A8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgfTsKKworICAgIG1EZWF0aFJlY2lwaWVudCA9IG5ldyBMaXN0ZW5lckRlYXRoUmVjaXBpZW50KHNlbGYpOworICAgIFJldHVybjxib29sPiB0cmFuc1N0YXR1cyA9IG1MaXN0ZW5lci0+bGlua1RvRGVhdGgoCisgICAgICAgICAgICBtRGVhdGhSZWNpcGllbnQsIDApOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkxpc3RlbmVyIGxpbmtUb0RlYXRoKCkgdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgfQorICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4odHJhbnNTdGF0dXMpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkxpc3RlbmVyIGxpbmtUb0RlYXRoKCkgY2FsbCBmYWlsZWQuIjsKKyAgICB9CiB9CiAKIENvbXBvbmVudDo6fkNvbXBvbmVudCgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMS9Db21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMS9Db21wb25lbnQuaAppbmRleCAxNmM4MWQ0Li4xYzhjMjBjIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjEvQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4xL0NvbXBvbmVudC5oCkBAIC0xMzcsNiArMTM3LDkgQEAKICAgICBmcmllbmQgc3RydWN0IENvbXBvbmVudFN0b3JlOwogCiAgICAgc3RydWN0IExpc3RlbmVyOworCisgICAgdXNpbmcgSHdEZWF0aFJlY2lwaWVudCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50OworICAgIHNwPEh3RGVhdGhSZWNpcGllbnQ+IG1EZWF0aFJlY2lwaWVudDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIHV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvQ29tcG9uZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9Db21wb25lbnQuY3BwCmluZGV4IDg5MjRlNmQuLjc5OTRkMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9Db21wb25lbnQuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9Db21wb25lbnQuY3BwCkBAIC01MjAsNiArNTIwLDM3IEBACiAgICAgaWYgKHJlcyAhPSBDMl9PSykgewogICAgICAgICBtSW5pdCA9IHJlczsKICAgICB9CisKKyAgICBzdHJ1Y3QgTGlzdGVuZXJEZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBId0RlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgTGlzdGVuZXJEZWF0aFJlY2lwaWVudChjb25zdCB3cDxDb21wb25lbnQ+JiBjb21wKQorICAgICAgICAgICAgOiBjb21wb25lbnR7Y29tcH0geworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKAorICAgICAgICAgICAgICAgIHVpbnQ2NF90IC8qIGNvb2tpZSAqLywKKyAgICAgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgICAgICBhdXRvIHN0cm9uZ0NvbXBvbmVudCA9IGNvbXBvbmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoc3Ryb25nQ29tcG9uZW50KSB7CisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJDbGllbnQgZGllZCAhIHJlbGVhc2UgdGhlIGNvbXBvbmVudCAhISI7CisgICAgICAgICAgICAgICAgc3Ryb25nQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNsaWVudCBkaWVkICEgbm8gY29tcG9uZW50IHRvIHJlbGVhc2UgISEiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd3A8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgfTsKKworICAgIG1EZWF0aFJlY2lwaWVudCA9IG5ldyBMaXN0ZW5lckRlYXRoUmVjaXBpZW50KHNlbGYpOworICAgIFJldHVybjxib29sPiB0cmFuc1N0YXR1cyA9IG1MaXN0ZW5lci0+bGlua1RvRGVhdGgoCisgICAgICAgICAgICBtRGVhdGhSZWNpcGllbnQsIDApOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkxpc3RlbmVyIGxpbmtUb0RlYXRoKCkgdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgfQorICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4odHJhbnNTdGF0dXMpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkxpc3RlbmVyIGxpbmtUb0RlYXRoKCkgY2FsbCBmYWlsZWQuIjsKKyAgICB9CiB9CiAKIENvbXBvbmVudDo6fkNvbXBvbmVudCgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9Db21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9Db21wb25lbnQuaAppbmRleCA3OTM3NjY0Li5kMDk3MmVlIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjIvQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4yL0NvbXBvbmVudC5oCkBAIC0xNDIsNiArMTQyLDEwIEBACiAgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnRTdG9yZTsKIAogICAgIHN0cnVjdCBMaXN0ZW5lcjsKKworICAgIHVzaW5nIEh3RGVhdGhSZWNpcGllbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudDsKKyAgICBzcDxId0RlYXRoUmVjaXBpZW50PiBtRGVhdGhSZWNpcGllbnQ7CisKIH07CiAKIH0gLy8gbmFtZXNwYWNlIHV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9BbmRyb2lkLmJwCmluZGV4IDBlNTI4MTMuLmYzMjcxMWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9BbmRyb2lkLmJwCkBAIC03LDYgKzcsMjQgQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCiB9CiAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9jbGllbnRfaGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX2NsaWVudCIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2NsaWVudC5jcHAKaW5kZXggNDJiM2M0My4uMGFjZjdkNyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2NsaWVudC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2NsaWVudC5jcHAKQEAgLTE1MDIsNiArMTUwMiw3IEBACiAgICAgICAgIGlnYnAgPSBuZXcgQjJIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMihzdXJmYWNlKTsKICAgICB9CiAKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2sobU91dHB1dE11dGV4KTsKICAgICBzdGQ6OnNoYXJlZF9wdHI8U3VyZmFjZVN5bmNPYmo+IHN5bmNPYmo7CiAKICAgICBpZiAoIXN1cmZhY2UpIHsKQEAgLTE1ODYsNiArMTU4NywyNCBAQAogICAgIG1PdXRwdXRCdWZmZXJRdWV1ZS0+dXBkYXRlTWF4RGVxdWV1ZUJ1ZmZlckNvdW50KG1heERlcXVldWVDb3VudCk7CiB9CiAKK3ZvaWQgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnN0b3BVc2luZ091dHB1dFN1cmZhY2UoCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKG1PdXRwdXRNdXRleCk7CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlLT5zdG9wKCk7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBtQmFzZTFfMC0+c2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihibG9ja1Bvb2xJZCksIG51bGxwdHIpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInNldE91dHB1dFN1cmZhY2Uoc3RvcFVzaW5nT3V0cHV0U3VyZmFjZSkgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJzZXRPdXRwdXRTdXJmYWNlKHN0b3BVc2luZ091dHB1dFN1cmZhY2UpIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKIGMyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50Ojpjb25uZWN0VG9JbnB1dFN1cmZhY2UoCiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiogY29ubmVjdGlvbikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmggYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9jbGllbnQuaAppbmRleCAzNDdlNThhLi40OWQ5YjI4IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9jbGllbnQuaAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9jbGllbnQuaApAQCAtNDExLDYgKzQxMSwxMCBAQAogICAgIC8vIFNldCBtYXggZGVxdWV1ZSBjb3VudCBmb3Igb3V0cHV0IHN1cmZhY2UuCiAgICAgdm9pZCBzZXRPdXRwdXRTdXJmYWNlTWF4RGVxdWV1ZUNvdW50KGludCBtYXhEZXF1ZXVlQ291bnQpOwogCisgICAgLy8gU3RvcCB1c2luZyB0aGUgY3VycmVudCBvdXRwdXQgc3VyZmFjZS4KKyAgICB2b2lkIHN0b3BVc2luZ091dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCk7CisKICAgICAvLyBDb25uZWN0IHRvIGEgZ2l2ZW4gSW5wdXRTdXJmYWNlLgogICAgIGMyX3N0YXR1c190IGNvbm5lY3RUb0lucHV0U3VyZmFjZSgKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCkBAIC00NDEsNiArNDQ1LDExIEBACiAgICAgc3RydWN0IE91dHB1dEJ1ZmZlclF1ZXVlOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJRdWV1ZT4gbU91dHB1dEJ1ZmZlclF1ZXVlOwogCisgICAgLy8gKGIvMjAyOTAzMTE3KSBTb21ldGltZXMgTWVkaWFDb2RlYzo6c2V0U3VyZmFjZSByYWNlcyBiZXR3ZWVuIG5vcm1hbAorICAgIC8vIHNldFN1cmZhY2UgYW5kIHNldFN1cmZhY2Ugd2l0aCBSZWxlYXNlU3VyZmFjZSBkdWUgdG8gdGltaW5nIGlzc3Vlcy4KKyAgICAvLyBJbiBvcmRlciB0byBwcmV2ZW50IHRoZSByYWNlIGNvbmRpdGlvbiBtdXRleCBpcyBhZGRlZC4KKyAgICBzdGQ6Om11dGV4IG1PdXRwdXRNdXRleDsKKwogICAgIHN0YXRpYyBjMl9zdGF0dXNfdCBzZXREZWF0aExpc3RlbmVyKAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4mIGNvbXBvbmVudCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL291dHB1dC5oIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvb3V0cHV0LmgKaW5kZXggODc3MTQ4YS4uYTEzZWRmMyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvb3V0cHV0LmgKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvb3V0cHV0LmgKQEAgLTUwLDYgKzUwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgaW50IG1heERlcXVldWVCdWZmZXJDb3VudCwKICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VjFfMjo6U3VyZmFjZVN5bmNPYmo+ICpzeW5jT2JqKTsKIAorICAgIC8vIFN0b3AgdXNpbmcgdGhlIGN1cnJlbnQgb3V0cHV0IHN1cmZhY2UuIFBlbmRpbmcgYnVmZmVyIG9wZWF0aW9ucyB3aWxsIG5vdAorICAgIC8vIHBlcmZvcm0gYW55bW9yZS4KKyAgICB2b2lkIHN0b3AoKTsKKwogICAgIC8vIFJlbmRlciBhIGdyYXBoaWMgYmxvY2sgdG8gY3VycmVudCBzdXJmYWNlLgogICAgIHN0YXR1c190IG91dHB1dEJ1ZmZlcigKICAgICAgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLApAQCAtODEsNiArODUsNyBAQAogICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1CdWZmZXJzW0J1ZmZlclF1ZXVlRGVmczo6TlVNX0JVRkZFUl9TTE9UU107IC8vIGZpbmQgYSBiZXR0ZXIgd2F5CiAgICAgc3RkOjp3ZWFrX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBtUG9vbERhdGFzW0J1ZmZlclF1ZXVlRGVmczo6TlVNX0JVRkZFUl9TTE9UU107CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+IG1TeW5jTWVtOworICAgIGJvb2wgbVN0b3BwZWQ7CiAKICAgICBib29sIHJlZ2lzdGVyQnVmZmVyKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvb3V0cHV0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9vdXRwdXQuY3BwCmluZGV4IGRlMzRjMjQuLmY3ODkwMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9vdXRwdXQuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9vdXRwdXQuY3BwCkBAIC0xNjksNyArMTY5LDcgQEAKIH0gLy8gdW5uYW1lZCBuYW1lc3BhY2UKIAogT3V0cHV0QnVmZmVyUXVldWU6Ok91dHB1dEJ1ZmZlclF1ZXVlKCkKLSAgICAgIDogbUdlbmVyYXRpb257MH0sIG1CcUlkezB9IHsKKyAgICAgIDogbUdlbmVyYXRpb257MH0sIG1CcUlkezB9LCBtU3RvcHBlZHtmYWxzZX0gewogfQogCiBPdXRwdXRCdWZmZXJRdWV1ZTo6fk91dHB1dEJ1ZmZlclF1ZXVlKCkgewpAQCAtMjE5LDYgKzIxOSw4IEBACiAgICAgICAgICAgICBwb29sRGF0YXNbQnVmZmVyUXVldWVEZWZzOjpOVU1fQlVGRkVSX1NMT1RTXTsKICAgICB7CiAgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbChtTXV0ZXgpOworICAgICAgICBib29sIHN0b3BwZWQgPSBtU3RvcHBlZDsKKyAgICAgICAgbVN0b3BwZWQgPSBmYWxzZTsKICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbUdlbmVyYXRpb24pIHsKICAgICAgICAgICAgIC8vIGNhc2Ugb2Ygb2xkIEJsb2NrUG9vbCBkZXN0cnVjdGlvbgogICAgICAgICAgICAgQzJTeW5jVmFyaWFibGVzICp2YXIgPSBtU3luY01lbSA/IG1TeW5jTWVtLT5tZW0oKSA6IG51bGxwdHI7CkBAIC0yNTgsNyArMjYwLDcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJ1ZmZlclF1ZXVlRGVmczo6TlVNX0JVRkZFUl9TTE9UUzsgKytpKSB7Ci0gICAgICAgICAgICBpZiAobUJxSWQgPT0gMCB8fCAhbUJ1ZmZlcnNbaV0pIHsKKyAgICAgICAgICAgIGlmIChtQnFJZCA9PSAwIHx8ICFtQnVmZmVyc1tpXSB8fCBzdG9wcGVkKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gZGF0YSA9IG1Qb29sRGF0YXNbaV0ubG9jaygpOwpAQCAtMzE3LDYgKzMxOSwxMiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCit2b2lkIE91dHB1dEJ1ZmZlclF1ZXVlOjpzdG9wKCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbChtTXV0ZXgpOworICAgIG1TdG9wcGVkID0gdHJ1ZTsKKyAgICBtT3duZXIucmVzZXQoKTsgLy8gZGVzdHJ1Y3RvciBvZiB0aGUgYmxvY2sgd2lsbCBub3QgdHJpZ2VyIElHQlA6OmNhbmNlbCgpCit9CisKIGJvb2wgT3V0cHV0QnVmZmVyUXVldWU6OnJlZ2lzdGVyQnVmZmVyKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrKSB7CiAgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IGRhdGEgPQogICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShibG9jayk7CkBAIC0zMjUsNyArMzMzLDcgQEAKICAgICB9CiAgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsKG1NdXRleCk7CiAKLSAgICBpZiAoIW1JZ2JwKSB7CisgICAgaWYgKCFtSWdicCB8fCBtU3RvcHBlZCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC0zNzEsMTEgKzM3OSwxNyBAQAogCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBzeW5jTWVtOwogICAgICAgICBtTXV0ZXgubG9jaygpOworICAgICAgICBib29sIHN0b3BwZWQgPSBtU3RvcHBlZDsKICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0SWdicCA9IG1JZ2JwOwogICAgICAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uID0gbUdlbmVyYXRpb247CiAgICAgICAgIHN5bmNNZW0gPSBtU3luY01lbTsKICAgICAgICAgbU11dGV4LnVubG9jaygpOwogCisgICAgICAgIGlmIChzdG9wcGVkKSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIm91dHB1dEJ1ZmZlciAtLSBhbHJlYWR5IHN0b3BwZWQuIjsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorCiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dGFjaFRvQnVmZmVyUXVldWUoCiAgICAgICAgICAgICAgICAgYmxvY2ssIG91dHB1dElnYnAsIG91dHB1dEdlbmVyYXRpb24sICZicVNsb3QsIHN5bmNNZW0pOwogCkBAIC00MDgsMTIgKzQyMiwxOCBAQAogCiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+IHN5bmNNZW07CiAgICAgbU11dGV4LmxvY2soKTsKKyAgICBib29sIHN0b3BwZWQgPSBtU3RvcHBlZDsKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRJZ2JwID0gbUlnYnA7CiAgICAgdWludDMyX3Qgb3V0cHV0R2VuZXJhdGlvbiA9IG1HZW5lcmF0aW9uOwogICAgIHVpbnQ2NF90IG91dHB1dEJxSWQgPSBtQnFJZDsKICAgICBzeW5jTWVtID0gbVN5bmNNZW07CiAgICAgbU11dGV4LnVubG9jaygpOwogCisgICAgaWYgKHN0b3BwZWQpIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJvdXRwdXRCdWZmZXIgLS0gYWxyZWFkeSBzdG9wcGVkLiI7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKICAgICBpZiAoIW91dHB1dElnYnApIHsKICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJvdXRwdXRCdWZmZXIgLS0gb3V0cHV0IHN1cmZhY2UgaXMgbnVsbC4iOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTQ2Nyw3ICs0ODcsNyBAQAogICAgIG1NdXRleC5sb2NrKCk7CiAgICAgbU1heERlcXVldWVCdWZmZXJDb3VudCA9IG1heERlcXVldWVCdWZmZXJDb3VudDsKICAgICBhdXRvIHN5bmNWYXIgPSBtU3luY01lbSA/IG1TeW5jTWVtLT5tZW0oKSA6IG51bGxwdHI7Ci0gICAgaWYgKHN5bmNWYXIpIHsKKyAgICBpZiAoc3luY1ZhciAmJiAhbVN0b3BwZWQpIHsKICAgICAgICAgc3luY1Zhci0+bG9jaygpOwogICAgICAgICBzeW5jVmFyLT51cGRhdGVNYXhEZXF1ZXVlQ291bnRMb2NrZWQobWF4RGVxdWV1ZUJ1ZmZlckNvdW50KTsKICAgICAgICAgc3luY1Zhci0+dW5sb2NrKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vRmlsdGVyV3JhcHBlci5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vRmlsdGVyV3JhcHBlci5jcHAKaW5kZXggNzBjNjNmMi4uZDUxMjRmZCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL0ZpbHRlcldyYXBwZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJXcmFwcGVyLmNwcApAQCAtNDksNiArNDksMTEgQEAKICAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8RmlsdGVyV3JhcHBlcj4gZmlsdGVyV3JhcHBlcikKICAgICAgICAgOiBtSW50ZihpbnRmKSwgbUZpbHRlcldyYXBwZXIoZmlsdGVyV3JhcHBlcikgewogICAgICAgICB0YWtlRmlsdGVycyhzdGQ6Om1vdmUoZmlsdGVycykpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GaWx0ZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBtQ29udHJvbFBhcmFtVHlwZXMuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICBtRmlsdGVyc1tpXS5kZXNjLmNvbnRyb2xQYXJhbXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgbUZpbHRlcnNbaV0uZGVzYy5jb250cm9sUGFyYW1zLmVuZCgpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIH5XcmFwcGVkRGVjb2RlckludGVyZmFjZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKQEAgLTE4Nyw3ICsxOTIsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gc3RhY2tQYXJhbXNGb3JJbnRmOwotICAgICAgICBzdGQ6OmNvcHlfbihzdGFja1BhcmFtc0xpc3QuYmVnaW4oKSwgc3RhY2tQYXJhbXNMaXN0LnNpemUoKSwgc3RhY2tQYXJhbXNGb3JJbnRmLmJlZ2luKCkpOworICAgICAgICBmb3IgKEMyUGFyYW0gKnBhcmFtIDogc3RhY2tQYXJhbXNMaXN0KSB7CisgICAgICAgICAgICBpZiAobUNvbnRyb2xQYXJhbVR5cGVzLmNvdW50KHBhcmFtLT50eXBlKCkpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YWNrUGFyYW1zRm9ySW50Zi5wdXNoX2JhY2socGFyYW0pOworICAgICAgICB9CiAKICAgICAgICAgLy8gR2F0aGVyIGhlYXAgcGFyYW1zIHRoYXQgZGlkIG5vdCBnZXQgcXVlcmllZCBmcm9tIHRoZSBmaWx0ZXIgaW50ZXJmYWNlcyBhYm92ZS4KICAgICAgICAgLy8gVGhlc2UgbmVlZCB0byBiZSBxdWVyaWVkIGZyb20gdGhlIGRlY29kZXIgaW50ZXJmYWNlLgpAQCAtMTk3LDYgKzIwNyw5IEBACiAgICAgICAgICAgICBpZiAobVR5cGVUb0luZGV4Rm9yUXVlcnkuZmluZCh0eXBlKSAhPSBtVHlwZVRvSW5kZXhGb3JRdWVyeS5lbmQoKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Db250cm9sUGFyYW1UeXBlcy5jb3VudCh0eXBlKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBoZWFwUGFyYW1JbmRpY2VzRm9ySW50Zi5wdXNoX2JhY2soaGVhcFBhcmFtSW5kaWNlc1tqXSk7CiAgICAgICAgIH0KIApAQCAtMjUxLDExICsyNjQsMTQgQEAKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gcGFyYW1zRm9yRmlsdGVyOwogICAgICAgICAgICAgZm9yIChDMlBhcmFtKiBwYXJhbSA6IHBhcmFtcykgewogICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBtVHlwZVRvSW5kZXhGb3JDb25maWcuZmluZChwYXJhbS0+dHlwZSgpLnR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ICE9IG1UeXBlVG9JbmRleEZvckNvbmZpZy5lbmQoKSAmJiBpdC0+c2Vjb25kICE9IGkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXQgPT0gbVR5cGVUb0luZGV4Rm9yQ29uZmlnLmVuZCgpIHx8IGl0LT5zZWNvbmQgIT0gaSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcGFyYW1zRm9yRmlsdGVyLnB1c2hfYmFjayhwYXJhbSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW1zRm9yRmlsdGVyLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGZpbHRlci0+Y29uZmlnX3ZiKHBhcmFtc0ZvckZpbHRlciwgbWF5QmxvY2ssICZmaWx0ZXJGYWlsdXJlcyk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CiAgICAgICAgICAgICAgICAgTE9HKGVyciA9PSBDMl9CQURfSU5ERVggPyBWRVJCT1NFIDogV0FSTklORykKQEAgLTM1Niw2ICszNzIsNyBAQAogICAgIHN0ZDo6d2Vha19wdHI8RmlsdGVyV3JhcHBlcj4gbUZpbHRlcldyYXBwZXI7CiAgICAgc3RkOjptYXA8dWludDMyX3QsIHNpemVfdD4gbVR5cGVUb0luZGV4Rm9yUXVlcnk7CiAgICAgc3RkOjptYXA8dWludDMyX3QsIHNpemVfdD4gbVR5cGVUb0luZGV4Rm9yQ29uZmlnOworICAgIHN0ZDo6c2V0PEMyUGFyYW06OlR5cGU+IG1Db250cm9sUGFyYW1UeXBlczsKIAogICAgIGMyX3N0YXR1c190IHRyYW5zZmVyUGFyYW1zX2woCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZjdXJyLApAQCAtNDMwLDYgKzQ0NywxMCBAQAogICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiV3JhcHBlZERlY29kZXJJbnRlcmZhY2U6IEZpbHRlcldyYXBwZXIgbm90IGZvdW5kIjsKICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKICAgICAgICAgfQorICAgICAgICBpZiAoIWZpbHRlcldyYXBwZXItPmlzRmlsdGVyaW5nRW5hYmxlZChuZXh0KSkgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJXcmFwcGVkRGVjb2RlckludGVyZmFjZTogZmlsdGVyaW5nIG5vdCBlbmFibGVkIjsKKyAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgfQogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZmlsdGVyV3JhcHBlci0+cXVlcnlQYXJhbXNGb3JQcmV2aW91c0NvbXBvbmVudChuZXh0LCAmcGFyYW1zKTsKICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgewpAQCAtNTk0LDYgKzYxNSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbVJ1bm5pbmdGaWx0ZXJzLmNsZWFyKCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEZpbHRlcldyYXBwZXI6OkNvbXBvbmVudD4gZmlsdGVycyhtRmlsdGVycyk7CisgICAgICAgIG1JbnRmLT50YWtlRmlsdGVycyhzdGQ6Om1vdmUoZmlsdGVycykpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL3NhbXBsZXMvU2FtcGxlRmlsdGVyUGx1Z2luLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9zYW1wbGVzL1NhbXBsZUZpbHRlclBsdWdpbi5jcHAKaW5kZXggYjk0MmJlNy4uNWMxM2IwZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL3NhbXBsZXMvU2FtcGxlRmlsdGVyUGx1Z2luLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vc2FtcGxlcy9TYW1wbGVGaWx0ZXJQbHVnaW4uY3BwCkBAIC04MDcsNyArODA3LDggQEAKICAgICAvLyBhZmZlY3RlZFBhcmFtcwogICAgIHsKICAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCi0gICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwgIC8vIHdpbGwgYmUgZGVwcmVjYXRlZAorICAgICAgICBDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKICAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCiAgICAgfSwKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icAppbmRleCBiYjlmNTFmLi5iMzZlODBhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKQEAgLTUyLDcgKzUyLDcgQEAKIAogICAgIC8vIG1pbmlqYWlsIGlzIHVzZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IHVuZXhwZWN0ZWQgc3lzdGVtIGNhbGxzLgogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3ZlbmRvciIsCisgICAgICAgICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgXSwKICAgICByZXF1aXJlZDogWyJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LXNlY2NvbXBfcG9saWN5Il0sCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LXNlcnZpY2UucmMgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LXNlcnZpY2UucmMKaW5kZXggMDNmNmUzZC4uMTJkYTU5MyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItZGVmYXVsdC1zZXJ2aWNlLnJjCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4yLWRlZmF1bHQtc2VydmljZS5yYwpAQCAtMyw1ICszLDUgQEAKICAgICB1c2VyIG1lZGlhY29kZWMKICAgICBncm91cCBjYW1lcmEgbWVkaWFkcm0gZHJtcnBjCiAgICAgaW9wcmlvIHJ0IDQKLSAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCisgICAgdGFza19wcm9maWxlcyBQcm9jZXNzQ2FwYWNpdHlIaWdoCiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0FuZHJvaWQuYnAKaW5kZXggMmJjNzQ4Zi4uNWE2NTJhMyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0FuZHJvaWQuYnAKQEAgLTcsNiArNywxMiBAQAogICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKIH0KIAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGlic2ZwbHVnaW5fY2NvZGVjX2ludGVybmFsX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorICAgIC8vIG9ubHkgZm9yIGludGVybmFsIHRlc3RzLCBwZXJoYXBzIHJlc3RyaWN0IHZpYSB2aXNpYmlsaXR5IGNsYXVzZQorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnNmcGx1Z2luX2Njb2RlYyIsCiAKQEAgLTM3LDE3ICs0MywyMyBAQAogICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCiAKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiU3VyZmFjZUZsaW5nZXJQcm9wZXJ0aWVzIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckA0LjAiLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY29kZWMyIiwKICAgICAgICAgImxpYmNvZGVjMl9jbGllbnQiLAogICAgICAgICAibGliY29kZWMyX3ZuZGsiLAogICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmdyYWxsb2N0eXBlcyIsCiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKQEAgLTU5LDYgKzcxLDcgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2NvZGVjYmFzZSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCisJImxpYnN0YWdlZnJpZ2h0X3N1cmZhY2VfdXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAKaW5kZXggYzA0OTE4Ny4uZWQ3ZDY5YyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAKQEAgLTQyLDYgKzQyLDcgQEAKIAogI2luY2x1ZGUgInV0aWxzL0NvZGVjMk1hcHBlci5oIgogI2luY2x1ZGUgIkMyT01YTm9kZS5oIgorI2luY2x1ZGUgIkNvZGVjMkJ1ZmZlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ2Niw2ICs0NjcsMTggQEAKICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyMkQoYmxvY2stPnNoYXJlKAogICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCkpLCA6OkMyRmVuY2UoKSkpKTsKICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5wdXNoX2JhY2soYzJCdWZmZXIpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHJTdGF0aWNJbmZvOjppbnB1dD4gc3RhdGljSW5mbzsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6aW5wdXQ+IGR5bmFtaWNJbmZvOworICAgICAgICBHZXRIZHJNZXRhZGF0YUZyb21HcmFsbG9jNEhhbmRsZSgKKyAgICAgICAgICAgICAgICBibG9jay0+aGFuZGxlKCksCisgICAgICAgICAgICAgICAgJnN0YXRpY0luZm8sCisgICAgICAgICAgICAgICAgJmR5bmFtaWNJbmZvKTsKKyAgICAgICAgaWYgKHN0YXRpY0luZm8gJiYgKnN0YXRpY0luZm8pIHsKKyAgICAgICAgICAgIGMyQnVmZmVyLT5zZXRJbmZvKHN0YXRpY0luZm8pOworICAgICAgICB9CisgICAgICAgIGlmIChkeW5hbWljSW5mbyAmJiAqZHluYW1pY0luZm8pIHsKKyAgICAgICAgICAgIGMyQnVmZmVyLT5zZXRJbmZvKGR5bmFtaWNJbmZvKTsKKyAgICAgICAgfQogICAgIH0KICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOwogICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKaW5kZXggODI0NjBjOS4uMjk2ZDdlZCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTdXJmYWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lHcmFwaGljQnVmZmVyU291cmNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CkBAIC0yMTIsOSArMjEzLDggQEAKICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzLAogICAgICAgICAgICAgICAgICZ1c2FnZSwgc2l6ZW9mKHVzYWdlKSk7CiAKLSAgICAgICAgbVNvdXJjZS0+Y29uZmlndXJlKAotICAgICAgICAgICAgICAgIG1PbXhOb2RlLCBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6RGF0YXNwYWNlPihtRGF0YVNwYWNlKSk7Ci0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEdldFN0YXR1cyhtU291cmNlLT5jb25maWd1cmUoCisgICAgICAgICAgICAgICAgbU9teE5vZGUsIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpEYXRhc3BhY2U+KG1EYXRhU3BhY2UpKSk7CiAgICAgfQogCiAgICAgdm9pZCBkaXNjb25uZWN0KCkgb3ZlcnJpZGUgewpAQCAtODcyLDYgKzg3MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tVHVubmVsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwdXNoQmxhbmtCdWZmZXJzT25TdG9wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKEtFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUCwgJnB1c2hCbGFua0J1ZmZlcnNPblN0b3ApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm1QdXNoQmxhbmtCdWZmZXJzT25TdG9wID0gcHVzaEJsYW5rQnVmZmVyc09uU3RvcCA9PSAxOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2V0U3VyZmFjZShzdXJmYWNlKTsKQEAgLTEwMDcsNyArMTAxMiw5IEBACiAgICAgICAgICAgICAvLyBRdWVyeSB2ZW5kb3IgZm9ybWF0IGZvciBGbGV4aWJsZSBZVVYKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaGVhcFBhcmFtczsKICAgICAgICAgICAgIEMyU3RvcmVGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnNJbmZvICpwaXhlbEZvcm1hdEluZm8gPSBudWxscHRyOwotICAgICAgICAgICAgaWYgKG1DbGllbnQtPnF1ZXJ5KAorICAgICAgICAgICAgaW50IHZlbmRvclNka1ZlcnNpb24gPSBiYXNlOjpHZXRJbnRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAgICAgInJvLnZlbmRvci5idWlsZC52ZXJzaW9uLnNkayIsIGFuZHJvaWRfZ2V0X2RldmljZV9hcGlfbGV2ZWwoKSk7CisgICAgICAgICAgICBpZiAodmVuZG9yU2RrVmVyc2lvbiA+PSBfX0FORFJPSURfQVBJX1NfXyAmJiBtQ2xpZW50LT5xdWVyeSgKICAgICAgICAgICAgICAgICAgICAgICAgIHt9LAogICAgICAgICAgICAgICAgICAgICAgICAge0MyU3RvcmVGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnNJbmZvOjpQQVJBTV9UWVBFfSwKICAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKQEAgLTEwMTgsMjkgKzEwMjUsMzEgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcGl4ZWxGb3JtYXRJbmZvID0gbnVsbHB0cjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dWludDMyX3Q+IGZsZXhQaXhlbEZvcm1hdHt9OwotICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx1aW50MzJfdD4gZmxleFBsYW5hclBpeGVsRm9ybWF0e307Ci0gICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0e307CisgICAgICAgICAgICAvLyBiaXQgZGVwdGggLT4gZm9ybWF0CisgICAgICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgdWludDMyX3Q+IGZsZXhQaXhlbEZvcm1hdDsKKyAgICAgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCB1aW50MzJfdD4gZmxleFBsYW5hclBpeGVsRm9ybWF0OworICAgICAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIHVpbnQzMl90PiBmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0OwogICAgICAgICAgICAgaWYgKHBpeGVsRm9ybWF0SW5mbyAmJiAqcGl4ZWxGb3JtYXRJbmZvKSB7CiAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaXhlbEZvcm1hdEluZm8tPmZsZXhDb3VudCgpOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvclN0cnVjdCAmZGVzYyA9CiAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdEluZm8tPm0udmFsdWVzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYy5iaXREZXB0aCAhPSA4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVzYy5zdWJzYW1wbGluZyAhPSBDMkNvbG9yOjpZVVZfNDIwCisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLnN1YnNhbXBsaW5nICE9IEMyQ29sb3I6OllVVl80MjAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTgwMDc2MTA1KTogc29tZSBkZXZpY2UgcmVwb3J0IHdyb25nIGxheW91dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHx8IGRlc2MubGF5b3V0ID09IEMyQ29sb3I6OklOVEVSTEVBVkVEX1BBQ0tFRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHx8IGRlc2MubGF5b3V0ID09IEMyQ29sb3I6OklOVEVSTEVBVkVEX0FMSUdORUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpVTktOT1dOX0xBWU9VVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmbGV4UGl4ZWxGb3JtYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhQaXhlbEZvcm1hdCA9IGRlc2MucGl4ZWxGb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChmbGV4UGl4ZWxGb3JtYXQuY291bnQoZGVzYy5iaXREZXB0aCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxleFBpeGVsRm9ybWF0LmVtcGxhY2UoZGVzYy5iaXREZXB0aCwgZGVzYy5waXhlbEZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MubGF5b3V0ID09IEMyQ29sb3I6OlBMQU5BUl9QQUNLRUQgJiYgIWZsZXhQbGFuYXJQaXhlbEZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxleFBsYW5hclBpeGVsRm9ybWF0ID0gZGVzYy5waXhlbEZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MubGF5b3V0ID09IEMyQ29sb3I6OlBMQU5BUl9QQUNLRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmbGV4UGxhbmFyUGl4ZWxGb3JtYXQuY291bnQoZGVzYy5iaXREZXB0aCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxleFBsYW5hclBpeGVsRm9ybWF0LmVtcGxhY2UoZGVzYy5iaXREZXB0aCwgZGVzYy5waXhlbEZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MubGF5b3V0ID09IEMyQ29sb3I6OlNFTUlQTEFOQVJfUEFDS0VEICYmICFmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0ID0gZGVzYy5waXhlbEZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MubGF5b3V0ID09IEMyQ29sb3I6OlNFTUlQTEFOQVJfUEFDS0VECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdC5jb3VudChkZXNjLmJpdERlcHRoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0LmVtcGxhY2UoZGVzYy5iaXREZXB0aCwgZGVzYy5waXhlbEZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMDUwLDcgKzEwNTksNyBAQAogICAgICAgICAgICAgICAgIGlmICghKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cmZhY2UgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXQuY291bnQoOCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gInNlbWktIjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMDY1LDE5ICsxMDc0LDQ3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgfHwgIXN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZlbmRvclNka1ZlcnNpb24gPCBfX0FORFJPSURfQVBJX1NfXyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgPT0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID09IENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPT0gQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlLVMgZnJhbWV3b3JrIHVzZWQgdG8gbWFwIHRoZXNlIGNvbG9yIGZvcm1hdHMgaW50byBZVjEyLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29kZWNzIGZyb20gb2xkZXIgdmVuZG9yIHBhcnRpdGlvbiBtYXkgYmUgcmVseWluZyBvbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBhc3N1bXB0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZsZXhQaXhlbEZvcm1hdC52YWx1ZV9vcihDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxleFBpeGVsRm9ybWF0LmNvdW50KDgpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gZmxleFBpeGVsRm9ybWF0WzhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gZmxleFBsYW5hclBpeGVsRm9ybWF0LnZhbHVlX29yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxleFBpeGVsRm9ybWF0LnZhbHVlX29yKGZvcm1hdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGV4UGxhbmFyUGl4ZWxGb3JtYXQuY291bnQoOCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBmbGV4UGxhbmFyUGl4ZWxGb3JtYXRbOF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbGV4UGl4ZWxGb3JtYXQuY291bnQoOCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBmbGV4UGl4ZWxGb3JtYXRbOF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXQudmFsdWVfb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGV4UGl4ZWxGb3JtYXQudmFsdWVfb3IoZm9ybWF0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXQuY291bnQoOCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0WzhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxleFBpeGVsRm9ybWF0LmNvdW50KDgpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gZmxleFBpeGVsRm9ybWF0WzhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWUDAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVZQMDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0LmNvdW50KDEwKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXRbMTBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxleFBpeGVsRm9ybWF0LmNvdW50KDEwKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZsZXhQaXhlbEZvcm1hdFsxMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOby1vcApAQCAtMTIxMywxMSArMTI1MCwyNSBAQAogICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMgewogICAgICAgICAgICAgY29sb3JBc3BlY3RzUmVxdWVzdEluZGV4LndpdGhTdHJlYW0oMHUpLAogICAgICAgICB9OwotICAgICAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXAtPnF1ZXJ5KAotICAgICAgICAgICAgICAgIHsgJnVzYWdlLCAmbWF4SW5wdXRTaXplLCAmcHJlcGVuZCB9LAotICAgICAgICAgICAgICAgIGluZGljZXMsCi0gICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKLSAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgaW50MzJfdCBjb2xvclRyYW5zZmVyUmVxdWVzdCA9IDA7CisgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19JTUFHRSB8IENvbmZpZzo6SVNfVklERU8pCisgICAgICAgICAgICAgICAgJiYgIXNka1BhcmFtcy0+ZmluZEludDMyKCJjb2xvci10cmFuc2Zlci1yZXF1ZXN0IiwgJmNvbG9yVHJhbnNmZXJSZXF1ZXN0KSkgeworICAgICAgICAgICAgY29sb3JUcmFuc2ZlclJlcXVlc3QgPSAwOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IGMyZXJyID0gQzJfT0s7CisgICAgICAgIGlmIChjb2xvclRyYW5zZmVyUmVxdWVzdCAhPSAwKSB7CisgICAgICAgICAgICBjMmVyciA9IGNvbXAtPnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICB7ICZ1c2FnZSwgJm1heElucHV0U2l6ZSwgJnByZXBlbmQgfSwKKyAgICAgICAgICAgICAgICAgICAgaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjMmVyciA9IGNvbXAtPnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICB7ICZ1c2FnZSwgJm1heElucHV0U2l6ZSwgJnByZXBlbmQgfSwKKyAgICAgICAgICAgICAgICAgICAge30sCisgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICB9CiAgICAgICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBjMmVyciAhPSBDMl9CQURfSU5ERVgpIHsKICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcXVlcnkgY29tcG9uZW50IGludGVyZmFjZTogJWQiLCBjMmVycik7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKQEAgLTEzMzIsOCArMTM4Myw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBzZXQgY2hhbm5lbC1tYXNrCiAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSB7CisgICAgICAgICAgICAvLyBzZXQgY2hhbm5lbC1tYXNrCiAgICAgICAgICAgICBpbnQzMl90IG1hc2s7CiAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoS0VZX0NIQU5ORUxfTUFTSywgJm1hc2spKSB7CiAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgewpAQCAtMTM0Miw2ICsxMzkzLDE1IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NIQU5ORUxfTUFTSywgbWFzayk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZXQgUENNIGVuY29kaW5nCisgICAgICAgICAgICBpbnQzMl90IHBjbUVuY29kaW5nID0ga0F1ZGlvRW5jb2RpbmdQY20xNmJpdDsKKyAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKEtFWV9QQ01fRU5DT0RJTkcsICZwY21FbmNvZGluZyk7CisgICAgICAgICAgICBpZiAoZW5jb2RlcikgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fY29uZmlnLXBjbS1lbmNvZGluZyIsIHBjbUVuY29kaW5nKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fY29uZmlnLXBjbS1lbmNvZGluZyIsIHBjbUVuY29kaW5nKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBjb2xvclRyYW5zZmVyUmVxdWVzdFBhcmFtOwpAQCAtMTM1MSwxMSArMTQxMSw2IEBACiAgICAgICAgICAgICAgICAgY29sb3JUcmFuc2ZlclJlcXVlc3RQYXJhbSA9IHN0ZDo6bW92ZShwYXJhbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBjb2xvclRyYW5zZmVyUmVxdWVzdCA9IDA7Ci0gICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19JTUFHRSB8IENvbmZpZzo6SVNfVklERU8pCi0gICAgICAgICAgICAgICAgJiYgIXNka1BhcmFtcy0+ZmluZEludDMyKCJjb2xvci10cmFuc2Zlci1yZXF1ZXN0IiwgJmNvbG9yVHJhbnNmZXJSZXF1ZXN0KSkgewotICAgICAgICAgICAgY29sb3JUcmFuc2ZlclJlcXVlc3QgPSAwOwotICAgICAgICB9CiAKICAgICAgICAgaWYgKGNvbG9yVHJhbnNmZXJSZXF1ZXN0ICE9IDApIHsKICAgICAgICAgICAgIGlmIChjb2xvclRyYW5zZmVyUmVxdWVzdFBhcmFtICYmICpjb2xvclRyYW5zZmVyUmVxdWVzdFBhcmFtKSB7CkBAIC0xMzgwLDcgKzE0MzUsNyBAQAogICAgICAgICAgICAgICAgIGludDY0X3QgYmxvY2tVc2FnZSA9CiAgICAgICAgICAgICAgICAgICAgIHVzYWdlLnZhbHVlIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQgfCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEU7CiAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jayA9IEZldGNoR3JhcGhpY0Jsb2NrKAotICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcGl4ZWxGb3JtYXQsIGJsb2NrVXNhZ2UsIHtjb21wLT5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNvbXBvbmVudENvbG9yRm9ybWF0LCBibG9ja1VzYWdlLCB7Y29tcC0+Z2V0TmFtZSgpfSk7CiAgICAgICAgICAgICAgICAgc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBidWZmZXI7CiAgICAgICAgICAgICAgICAgaWYgKGJsb2NrKSB7CiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCkBAIC0xNDIxLDYgKzE0NzYsMzUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGlmIChjb25maWctPm1UdW5uZWxlZCkgeworICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fdHVubmVsZWQiLCAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnZlcnQgYW4gZW5jb2Rpbmcgc3RhdGlzdGljcyBsZXZlbCB0byBjb3JyZXNwb25kaW5nIGVuY29kaW5nIHN0YXRpc3RpY3MKKyAgICAgICAgLy8ga2luZHMKKyAgICAgICAgaW50MzJfdCBlbmNvZGluZ1N0YXRpc3RpY3NMZXZlbCA9IFZJREVPX0VOQ09ESU5HX1NUQVRJU1RJQ1NfTEVWRUxfTk9ORTsKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpCisgICAgICAgICAgICAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19WSURFTykKKyAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKEtFWV9WSURFT19FTkNPRElOR19TVEFUSVNUSUNTX0xFVkVMLCAmZW5jb2RpbmdTdGF0aXN0aWNzTGV2ZWwpKSB7CisgICAgICAgICAgICAvLyBIaWdoZXIgbGV2ZWwgaW5jbHVkZSBhbGwgdGhlIGVuYyBzdGF0cyBiZWxvbmcgdG8gbG93ZXIgbGV2ZWwuCisgICAgICAgICAgICBzd2l0Y2ggKGVuY29kaW5nU3RhdGlzdGljc0xldmVsKSB7CisgICAgICAgICAgICAgICAgLy8gY2FzZSBWSURFT19FTkNPRElOR19TVEFUSVNUSUNTX0xFVkVMXzI6IC8vIHJlc2VydmVkIGZvciB0aGUgZnV0dXJlIGxldmVsIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBtb3JlIGVuYyBzdGF0IGtpbmRzCisgICAgICAgICAgICAgICAgLy8gRnV0dXJlIGV4dGVuZGVkIGVuY29kaW5nIHN0YXRpc3RpY3MgZm9yIHRoZSBsZXZlbCAyIHNob3VsZCBiZSBhZGRlZCBoZXJlCisgICAgICAgICAgICAgICAgY2FzZSBWSURFT19FTkNPRElOR19TVEFUSVNUSUNTX0xFVkVMXzE6CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c3Vic2NyaWJlVG9Db25maWdVcGRhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQW5kcm9pZFN0cmVhbUF2ZXJhZ2VCbG9ja1F1YW50aXphdGlvbkluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlVHlwZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWSURFT19FTkNPRElOR19TVEFUSVNUSUNTX0xFVkVMX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dEKCJlbmNvZGluZyBzdGF0aXN0aWNzIGxldmVsID0gJWQiLCBlbmNvZGluZ1N0YXRpc3RpY3NMZXZlbCk7CisKICAgICAgICAgQUxPR0QoInNldHVwIGZvcm1hdHMgaW5wdXQ6ICVzIiwKICAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgQUxPR0QoInNldHVwIGZvcm1hdHMgb3V0cHV0OiAlcyIsCkBAIC0xNDY1LDYgKzE1NDksOSBAQAogICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczsKICAgICB0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjpTdGF0dXMgT214U3RhdHVzOwogICAgIGFuZHJvaWQ6OnNwPElPbXg+IG9teCA9IElPbXg6OmdldFNlcnZpY2UoKTsKKyAgICBpZiAob214ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogICAgIHR5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CiAgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CiAgICAgdHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CkBAIC0xNzQyLDkgKzE4MjksMjEgQEAKICAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihzZXRSdW5uaW5nKSAhPSBPSykgewogICAgICAgICByZXR1cm47CiAgICAgfQorCisgICAgLy8gcHJlcGFyYXRpb24gb2YgaW5wdXQgYnVmZmVycyBtYXkgbm90IHN1Y2NlZWQgZHVlIHRvIHRoZSBsYWNrIG9mCisgICAgLy8gbWVtb3J5OyByZXR1cm5pbmcgY29ycmVjdCBlcnJvciBjb2RlIChOT19NRU1PUlkpIGFzIGFuIGVycm9yIGFsbG93cworICAgIC8vIE1lZGlhQ29kZWMgdG8gdHJ5IHJlY2xhaW0gYW5kIHJlc3RhcnQgY29kZWMgZ3JhY2VmdWxseS4KKyAgICBzdGQ6Om1hcDxzaXplX3QsIHNwPE1lZGlhQ29kZWNCdWZmZXI+PiBjbGllbnRJbnB1dEJ1ZmZlcnM7CisgICAgZXJyMiA9IG1DaGFubmVsLT5wcmVwYXJlSW5pdGlhbElucHV0QnVmZmVycygmY2xpZW50SW5wdXRCdWZmZXJzKTsKKyAgICBpZiAoZXJyMiAhPSBPSykgeworICAgICAgICBBTE9HRSgiSW5pdGlhbCBwcmVwYXJhdGlvbiBmb3IgSW5wdXQgQnVmZmVycyBmYWlsZWQiKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKGVycjIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIG1DYWxsYmFjay0+b25TdGFydENvbXBsZXRlZCgpOwogCi0gICAgKHZvaWQpbUNoYW5uZWwtPnJlcXVlc3RJbml0aWFsSW5wdXRCdWZmZXJzKCk7CisgICAgbUNoYW5uZWwtPnJlcXVlc3RJbml0aWFsSW5wdXRCdWZmZXJzKHN0ZDo6bW92ZShjbGllbnRJbnB1dEJ1ZmZlcnMpKTsKIH0KIAogdm9pZCBDQ29kZWM6OmluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSB7CkBAIC0xNzcwLDcgKzE4NjksMTMgQEAKICAgICAgICAgfQogICAgICAgICBzdGF0ZS0+c2V0KFNUT1BQSU5HKTsKICAgICB9Ci0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOworICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiAmY29uZmlnID0gKmNvbmZpZ0xvY2tlZDsKKyAgICAgICAgaWYgKGNvbmZpZy0+bVB1c2hCbGFua0J1ZmZlcnNPblN0b3ApIHsKKyAgICAgICAgICAgIG1DaGFubmVsLT5wdXNoQmxhbmtCdWZmZXJUb091dHB1dFN1cmZhY2UoKTsKKyAgICAgICAgfQorICAgIH0KICAgICBtQ2hhbm5lbC0+cmVzZXQoKTsKICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgdGhpcykpLT5wb3N0KCk7CiB9CkBAIC0xODU4LDYgKzE5NjMsMTMgQEAKICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZURhdGFzcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKICAgICAgICAgfQogICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOworICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiAmY29uZmlnID0gKmNvbmZpZ0xvY2tlZDsKKyAgICAgICAgaWYgKGNvbmZpZy0+bVB1c2hCbGFua0J1ZmZlcnNPblN0b3ApIHsKKyAgICAgICAgICAgIG1DaGFubmVsLT5wdXNoQmxhbmtCdWZmZXJUb091dHB1dFN1cmZhY2UoKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG1DaGFubmVsLT5yZXNldCgpOwogICAgIC8vIHRoaXogaG9sZHMgc3Ryb25nIHJlZiB0byB0aGlzIHdoaWxlIHRoZSB0aHJlYWQgaXMgcnVubmluZy4KQEAgLTE4OTYsOSArMjAwOCwxMSBAQAogICAgIHsKICAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPj46OkxvY2tlZCBjb25maWdMb2NrZWQobUNvbmZpZyk7CiAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+ICZjb25maWcgPSAqY29uZmlnTG9ja2VkOworICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBuYXRpdmVXaW5kb3cgPSBzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93ICo+KHN1cmZhY2UuZ2V0KCkpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKwogICAgICAgICBpZiAoY29uZmlnLT5tVHVubmVsZWQgJiYgY29uZmlnLT5tU2lkZWJhbmRIYW5kbGUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93ID0gc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyAqPihzdXJmYWNlLmdldCgpKTsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3NpZGViYW5kX3N0cmVhbSgKKyAgICAgICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3NpZGViYW5kX3N0cmVhbSgKICAgICAgICAgICAgICAgICAgICAgbmF0aXZlV2luZG93LmdldCgpLAogICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihjb25maWctPm1TaWRlYmFuZEhhbmRsZS0+aGFuZGxlKCkpKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE5MDYsNiArMjAyMCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlV2luZG93LmdldCgpLCBjb25maWctPm1TaWRlYmFuZEhhbmRsZS0+aGFuZGxlKCksIGVycik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgcmVzZXQgdGhlIHNpZGViYW5kIGhhbmRsZSBvZiB0aGUgd2luZG93IGZvcgorICAgICAgICAgICAgLy8gbm9uLXR1bm5lbGVkIHZpZGVvIGluIGNhc2UgdGhlIHdpbmRvdyB3YXMgcHJldmlvdXNseSB1c2VkCisgICAgICAgICAgICAvLyBmb3IgYSB0dW5uZWxlZCB2aWRlbyBwbGF5YmFjay4KKyAgICAgICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3NpZGViYW5kX3N0cmVhbShuYXRpdmVXaW5kb3cuZ2V0KCksIG51bGxwdHIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9zaWRlYmFuZF9zdHJlYW0obnVsbHB0cikgZmFpbGVkISAoZXJyICVkKS4iLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG1DaGFubmVsLT5zZXRTdXJmYWNlKHN1cmZhY2UpOwpAQCAtMjAxNCw3ICsyMTM3LDE0IEBACiAgICAgICAgIHN0YXRlLT5zZXQoUlVOTklORyk7CiAgICAgfQogCi0gICAgKHZvaWQpbUNoYW5uZWwtPnJlcXVlc3RJbml0aWFsSW5wdXRCdWZmZXJzKCk7CisgICAgc3RkOjptYXA8c2l6ZV90LCBzcDxNZWRpYUNvZGVjQnVmZmVyPj4gY2xpZW50SW5wdXRCdWZmZXJzOworICAgIHN0YXR1c190IGVyciA9IG1DaGFubmVsLT5wcmVwYXJlSW5pdGlhbElucHV0QnVmZmVycygmY2xpZW50SW5wdXRCdWZmZXJzKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJSZXN1bWUgcmVxdWVzdCBmb3IgSW5wdXQgQnVmZmVycyBmYWlsZWQiKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKGVyciwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1DaGFubmVsLT5yZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycyhzdGQ6Om1vdmUoY2xpZW50SW5wdXRCdWZmZXJzKSk7CiB9CiAKIHZvaWQgQ0NvZGVjOjpzaWduYWxTZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CkBAIC0yMjk5LDcgKzI0MjksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbURhdGFTcGFjZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKICAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwgIC8vIHdpbGwgYmUgZGVwcmVjYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVBpeGVsQXNwZWN0UmF0aW9JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFCiAgICAgICAgICAgICAgICAgICAgIH07CkBAIC0yNTQ2LDcgKzI2NzcsMTAgQEAKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CiAgICAgICAgIGVyciA9IGludGYtPnF1ZXJ5KAogICAgICAgICAgICAgICAgIHsmbUFwaUZlYXR1cmVzfSwKLSAgICAgICAgICAgICAgICB7QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFCisgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCiAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CiAgICAgICAgIGlmIChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgewpAQCAtMjU1OSw3ICsyNjkzLDEwIEBACiAgICAgICAgICAgICBpZiAoIXBhcmFtKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyYW0tPnR5cGUoKSA9PSBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSkgeworICAgICAgICAgICAgaWYgKHBhcmFtLT50eXBlKCkgPT0gQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRTdHJlYW1Gb3JtYXQucmVzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dDo6RnJvbShwYXJhbSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS0+dHlwZSgpID09IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKSB7CiAgICAgICAgICAgICAgICAgbUlucHV0QWxsb2NhdG9ycy5yZXNldCgKICAgICAgICAgICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpGcm9tKHBhcmFtKSk7CiAgICAgICAgICAgICB9CkBAIC0yNTc5LDYgKzI3MTYsMTYgQEAKICAgICAgICAgcmV0dXJuIG1BcGlGZWF0dXJlczsKICAgICB9CiAKKyAgICBjb25zdCBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCAmZ2V0SW5wdXRTdHJlYW1Gb3JtYXQoKSBjb25zdCB7CisgICAgICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IHNJbnZhbGlkYXRlZCA9IFtdeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBwYXJhbTsKKyAgICAgICAgICAgIHBhcmFtLnJlc2V0KG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpJTlZBTElEKSk7CisgICAgICAgICAgICBwYXJhbS0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIHBhcmFtOworICAgICAgICB9KCk7CisgICAgICAgIHJldHVybiBtSW5wdXRTdHJlYW1Gb3JtYXQgPyAqbUlucHV0U3RyZWFtRm9ybWF0IDogKnNJbnZhbGlkYXRlZDsKKyAgICB9CisKICAgICBjb25zdCBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dCAmZ2V0SW5wdXRBbGxvY2F0b3JzKCkgY29uc3QgewogICAgICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0PiBzSW52YWxpZGF0ZWQgPSBbXXsKICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dD4gcGFyYW0gPQpAQCAtMjU5NCw2ICsyNzQxLDcgQEAKIAogICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gbUZpZWxkczsKICAgICBDMkFwaUZlYXR1cmVzU2V0dGluZyBtQXBpRmVhdHVyZXM7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRTdHJlYW1Gb3JtYXQ7CiAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0PiBtSW5wdXRBbGxvY2F0b3JzOwogfTsKIApAQCAtMjYzNSw2ICsyNzgzLDI0IEBACiAgICAgICAgIGlmIChpbnRmQ2FjaGUuaW5pdENoZWNrKCkgIT0gT0spIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0ICZzdHJlYW1Gb3JtYXQgPSBpbnRmQ2FjaGUuZ2V0SW5wdXRTdHJlYW1Gb3JtYXQoKTsKKyAgICAgICAgaWYgKHN0cmVhbUZvcm1hdCkgeworICAgICAgICAgICAgQzJBbGxvY2F0b3I6OnR5cGVfdCBhbGxvY2F0b3JUeXBlID0gQzJBbGxvY2F0b3I6OkxJTkVBUjsKKyAgICAgICAgICAgIGlmIChzdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDCisgICAgICAgICAgICAgICAgICAgIHx8IHN0cmVhbUZvcm1hdC52YWx1ZSA9PSBDMkJ1ZmZlckRhdGE6OkdSQVBISUNfQ0hVTktTKSB7CisgICAgICAgICAgICAgICAgYWxsb2NhdG9yVHlwZSA9IEMyQWxsb2NhdG9yOjpHUkFQSElDOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHlwZSAhPSBhbGxvY2F0b3JUeXBlKSB7CisgICAgICAgICAgICAgICAgLy8gcmVxdWVzdGVkIHR5cGUgaXMgbm90IHN1cHBvcnRlZCBhdCBpbnB1dCBhbGxvY2F0b3JzCisgICAgICAgICAgICAgICAgaWRzLT5jbGVhcigpOworICAgICAgICAgICAgICAgIGlkcy0+aW5zZXJ0KGRlZmF1bHRBbGxvY2F0b3JJZCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIm5hbWUoJXMpIGRvZXMgbm90IHN1cHBvcnQgYSB0eXBlKDB4JXgpIGFzIGlucHV0IGFsbG9jYXRvci4iCisgICAgICAgICAgICAgICAgICAgICAgICAiIHVzZXMgZGVmYXVsdCBhbGxvY2F0b3IgaWQoJWQpIiwgbmFtZS5jX3N0cigpLCB0eXBlLCBkZWZhdWx0QWxsb2NhdG9ySWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgY29uc3QgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQgJmFsbG9jYXRvcnMgPSBpbnRmQ2FjaGUuZ2V0SW5wdXRBbGxvY2F0b3JzKCk7CiAgICAgICAgIGlmIChmaXJzdEl0ZXJhdGlvbikgewogICAgICAgICAgICAgZmlyc3RJdGVyYXRpb24gPSBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcAppbmRleCBlOWFkZmM5Li41ZWNiMTMwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCkBAIC0xNSwxMCArMTUsMTQgQEAKICAqLwogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjZGVmaW5lIExPR19UQUcgIkNDb2RlY0J1ZmZlckNoYW5uZWwiCisjZGVmaW5lIEFUUkFDRV9UQUcgIEFUUkFDRV9UQUdfVklERU8KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGF0b21pYz4KICNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPG51bWVyaWM+CiAKQEAgLTQzLDkgKzQ3LDkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgogI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KQEAgLTE1NSw2ICsxNTksNyBAQAogICAgICAgICBpbnB1dC0+cGlwZWxpbmVEZWxheSA9IDB1OwogICAgICAgICBpbnB1dC0+bnVtU2xvdHMgPSBrU21vb3RobmVzc0ZhY3RvcjsKICAgICAgICAgaW5wdXQtPm51bUV4dHJhU2xvdHMgPSAwdTsKKyAgICAgICAgaW5wdXQtPmxhc3RGbHVzaEluZGV4ID0gMHU7CiAgICAgfQogICAgIHsKICAgICAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOwpAQCAtMjUyLDcgKzI1Nyw3IEBACiAgICAgICAgICAgICAgICAgYm9vbCByZWxlYXNlZCA9IGlucHV0LT5idWZmZXJzLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgbnVsbHB0ciwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gcXVldWVJbnB1dEJ1ZmZlcjogYnVmZmVyIGNvcGllZDsgJXNyZWxlYXNlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHJlbGVhc2VkID8gIiIgOiAibm90ICIpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGNvcHk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEFMT0dXKCJbJXNdIHF1ZXVlSW5wdXRCdWZmZXI6IGZhaWxlZCB0byBjb3B5IGEgYnVmZmVyOyB0aGlzIG1heSBjYXVzZSBpbnB1dCAiCiAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciBzdGFydmF0aW9uIG9uIGNvbXBvbmVudC4iLCBtTmFtZSk7CkBAIC0yODAsNiArMjg1LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGVvcykgeworICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CisgICAgICAgIGlmIChpbnB1dC0+ZnJhbWVSZWFzc2VtYmxlcikgeworICAgICAgICAgICAgdXNlc0ZyYW1lUmVhc3NlbWJsZXIgPSB0cnVlOworICAgICAgICAgICAgLy8gZHJhaW4gYW55IHBlbmRpbmcgaXRlbXMgd2l0aCBlb3MKKyAgICAgICAgICAgIGlucHV0LT5mcmFtZVJlYXNzZW1ibGVyLnByb2Nlc3MoYnVmZmVyLCAmaXRlbXMpOworICAgICAgICB9CiAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CiAgICAgfQogICAgIGlmICh1c2VzRnJhbWVSZWFzc2VtYmxlcikgewpAQCAtMzE5LDYgKzMzMCw4IEBACiAgICAgfQogICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOwogICAgIGlmICghaXRlbXMuZW1wdHkoKSkgeworICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgIkNDb2RlY0J1ZmZlckNoYW5uZWw6OnF1ZXVlKCVzQHRzPSVsbGQpIiwgbU5hbWUsIChsb25nIGxvbmcpdGltZVVzKS5jX3N0cigpKTsKICAgICAgICAgewogICAgICAgICAgICAgTXV0ZXhlZDxQaXBlbGluZVdhdGNoZXI+OjpMb2NrZWQgd2F0Y2hlcihtUGlwZWxpbmVXYXRjaGVyKTsKICAgICAgICAgICAgIFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OnRpbWVfcG9pbnQgbm93ID0gUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6bm93KCk7CkBAIC0zMzksMTAgKzM1MiwxMCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKICAgICAgICAgYm9vbCByZWxlYXNlZCA9IGZhbHNlOwotICAgICAgICBpZiAoYnVmZmVyKSB7Ci0gICAgICAgICAgICByZWxlYXNlZCA9IGlucHV0LT5idWZmZXJzLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgbnVsbHB0ciwgdHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29weSkgeworICAgICAgICBpZiAoY29weSkgewogICAgICAgICAgICAgcmVsZWFzZWQgPSBpbnB1dC0+ZXh0cmFCdWZmZXJzLnJlbGVhc2VTbG90KGNvcHksIG51bGxwdHIsIHRydWUpOworICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgcmVsZWFzZWQgPSBpbnB1dC0+YnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsIG51bGxwdHIsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJbJXNdIHF1ZXVlSW5wdXRCdWZmZXI6IGJ1ZmZlciVzICVzcmVsZWFzZWQiLAogICAgICAgICAgICAgICBtTmFtZSwgKGJ1ZmZlciA9PSBudWxscHRyKSA/ICIoY29weSkiIDogIiIsIHJlbGVhc2VkID8gIiIgOiAibm90ICIpOwpAQCAtNDE5LDYgKzQzMiwxMCBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgKytpKSB7CiAgICAgICAgIHNpemUgKz0gc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSArIHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhOwogICAgIH0KKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwb29sID0gbUJsb2NrUG9vbHMubG9jaygpLT5pbnB1dFBvb2w7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOwogICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soCkBAIC00MjYsNiArNDQzLDggQEAKICAgICAgICAgICAgIHNlY3VyZSA/IGtTZWN1cmVVc2FnZSA6IGtEZWZhdWx0UmVhZFdyaXRlVXNhZ2UsCiAgICAgICAgICAgICAmYmxvY2spOwogICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0koIlslc10gYXR0YWNoRW5jcnlwdGVkQnVmZmVyOiBmZXRjaExpbmVhckJsb2NrIGZhaWxlZDogc2l6ZSA9ICV6dSAoJXMpIGVyciA9ICVkIiwKKyAgICAgICAgICAgICAgbU5hbWUsIHNpemUsIHNlY3VyZSA/ICJzZWN1cmUiIDogIm5vbi1zZWN1cmUiLCBlcnIpOwogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgIH0KICAgICBpZiAoIXNlY3VyZSkgewpAQCAtNDUwLDE4ICs0NjksOSBAQAogICAgICAgICAgICAgICAgIGtleSwgaXYsIG1vZGUsIHBhdHRlcm4sIHNyYywgMCwgc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywKICAgICAgICAgICAgICAgICBkc3QsICZlcnJvckRldGFpbE1zZyk7CiAgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBhdHRhY2hFbmNyeXB0ZWRCdWZmZXI6IGRlY3J5cHQgZmFpbGVkOiByZXN1bHQgPSAlemQiLCBtTmFtZSwgcmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGRzdC50eXBlID09IERybUJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKLSAgICAgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZpZXcuc2l6ZSgpIDwgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KHZpZXcuZGF0YSgpLCBtRGVjcnlwdERlc3RpbmF0aW9uLT51bnNlY3VyZVBvaW50ZXIoKSwgcmVzdWx0KTsKLSAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEhlcmUgd2UgY2FzdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSB0byBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlN1YlNhbXBsZQogICAgICAgICAvLyBkaXJlY3RseSwgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBzaG91bGQgbWF0Y2ggYXMgY2hlY2tlZCBpbiBEZXNjcmFtYmxlckltcGwuY3BwLgpAQCAtNTEwLDE2ICs1MjAsMjIgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChyZXN1bHQgPCBjb2RlY0RhdGFPZmZzZXQpIHsKLSAgICAgICAgICAgIEFMT0dEKCJpbnZhbGlkIGNvZGVjIGRhdGEgb2Zmc2V0OiAlemQsIHJlc3VsdCAlemQiLCBjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCk7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBpbnZhbGlkIGNvZGVjIGRhdGEgb2Zmc2V0OiAlemQsIHJlc3VsdCAlemQiLAorICAgICAgICAgICAgICAgICAgbU5hbWUsIGNvZGVjRGF0YU9mZnNldCwgcmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCFzZWN1cmUpIHsKICAgICAgICAgQzJXcml0ZVZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKICAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0koIlslc10gYXR0YWNoRW5jcnlwdGVkQnVmZmVyOiBibG9jayBtYXAgZXJyb3I6ICVkIChub24tc2VjdXJlKSIsCisgICAgICAgICAgICAgICAgICBtTmFtZSwgdmlldy5lcnJvcigpKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAgICAgICAgIGlmICh2aWV3LnNpemUoKSA8IHJlc3VsdCkgeworICAgICAgICAgICAgQUxPR0koIlslc10gYXR0YWNoRW5jcnlwdGVkQnVmZmVyOiBibG9jayBzaXplIHRvbyBzbWFsbDogc2l6ZT0ldSByZXN1bHQ9JXpkICIKKyAgICAgICAgICAgICAgICAgICIobm9uLXNlY3VyZSkiLAorICAgICAgICAgICAgICAgICAgbU5hbWUsIHZpZXcuc2l6ZSgpLCByZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KICAgICAgICAgbWVtY3B5KHZpZXcuZGF0YSgpLCBtRGVjcnlwdERlc3RpbmF0aW9uLT51bnNlY3VyZVBvaW50ZXIoKSwgcmVzdWx0KTsKQEAgLTUyNyw2ICs1NDMsNyBAQAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXJ7QzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcigKICAgICAgICAgICAgIGJsb2NrLT5zaGFyZShjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCAtIGNvZGVjRGF0YU9mZnNldCwgQzJGZW5jZXt9KSl9OwogICAgIGlmICghYnVmZmVyLT5jb3B5KGMyQnVmZmVyKSkgeworICAgICAgICBBTE9HSSgiWyVzXSBhdHRhY2hFbmNyeXB0ZWRCdWZmZXI6IGJ1ZmZlciBjb3B5IGZhaWxlZCIsIG1OYW1lKTsKICAgICAgICAgcmV0dXJuIC1FTk9TWVM7CiAgICAgfQogICAgIHJldHVybiBPSzsKQEAgLTgzMiwxMiArODQ5LDU0IEBACiAgICAgICAgIGhkcjEwUGx1c0luZm8ucmVzZXQoKTsKICAgICB9CiAKKyAgICAvLyBIRFIgZHluYW1pYyBpbmZvCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6b3V0cHV0PiBoZHJEeW5hbWljSW5mbyA9CisgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxjb25zdCBDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgYzJCdWZmZXItPmdldEluZm8oQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpKTsKKyAgICAvLyBUT0RPOiBtYWtlIHRoaXMgc3RpY2t5ICYgZW5hYmxlIHVuc2V0CisgICAgaWYgKGhkckR5bmFtaWNJbmZvICYmIGhkckR5bmFtaWNJbmZvLT5mbGV4Q291bnQoKSA9PSAwKSB7CisgICAgICAgIGhkckR5bmFtaWNJbmZvLnJlc2V0KCk7CisgICAgfQorCisgICAgaWYgKGhkcjEwUGx1c0luZm8pIHsKKyAgICAgICAgLy8gQzJTdHJlYW1IZHIxMFBsdXNJbmZvIGlzIGRlcHJlY2F0ZWQ7IGNvbXBvbmVudHMgc2hvdWxkIHVzZQorICAgICAgICAvLyBDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm8KKyAgICAgICAgLy8gVE9ETzogI21ldHJpYworICAgICAgICBpZiAoaGRyRHluYW1pY0luZm8pIHsKKyAgICAgICAgICAgIC8vIEl0IGlzIHVuZXhwZWN0ZWQgdGhhdCBDMlN0cmVhbUhkcjEwUGx1c0luZm8gYW5kCisgICAgICAgICAgICAvLyBDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm8gaXMgYm90aCBwcmVzZW50LgorICAgICAgICAgICAgLy8gQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvIHRha2VzIHByaW9yaXR5LgorICAgICAgICAgICAgLy8gVE9ETzogI21ldHJpYworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6b3V0cHV0PiBpbmZvID0KKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPmZsZXhDb3VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpIRFJfRFlOQU1JQ19NRVRBREFUQV9UWVBFX1NNUFRFXzIwOTRfNDApOworICAgICAgICAgICAgbWVtY3B5KGluZm8tPm0uZGF0YSwgaGRyMTBQbHVzSW5mby0+bS52YWx1ZSwgaGRyMTBQbHVzSW5mby0+ZmxleENvdW50KCkpOworICAgICAgICAgICAgaGRyRHluYW1pY0luZm8gPSBpbmZvOworICAgICAgICB9CisgICAgfQorCiAgICAgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gYmxvY2tzID0gYzJCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCk7CiAgICAgaWYgKGJsb2Nrcy5zaXplKCkgIT0gMXUpIHsKICAgICAgICAgQUxPR0QoIlslc10gZXhwZWN0ZWQgMSBncmFwaGljIGJsb2NrLCBidXQgZ290ICV6dSIsIG1OYW1lLCBibG9ja3Muc2l6ZSgpKTsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrID0gYmxvY2tzLmZyb250KCk7CisgICAgQzJGZW5jZSBjMmZlbmNlID0gYmxvY2suZmVuY2UoKTsKKyAgICBzcDxGZW5jZT4gZmVuY2UgPSBGZW5jZTo6Tk9fRkVOQ0U7CisgICAgLy8gVE9ETzogaXQncyBub3Qgc3VmZmljaWVudCB0byBqdXN0IGNoZWNrIGlzSFcoKSBhbmQgdGhlbiBjb25zdHJ1Y3QgYW5kcm9pZDo6ZmVuY2UgZnJvbSBpdC4KKyAgICAvLyBPbmNlIEMyRmVuY2U6OnR5cGUoKSBpcyBhZGRlZCwgY2hlY2sgdGhlIGV4YWN0IEMyRmVuY2UgdHlwZQorICAgIGlmIChjMmZlbmNlLmlzSFcoKSkgeworICAgICAgICBpbnQgZmVuY2VGZCA9IGMyZmVuY2UuZmQoKTsKKyAgICAgICAgZmVuY2UgPSBzcDxGZW5jZT46Om1ha2UoZmVuY2VGZCk7CisgICAgICAgIGlmICghZmVuY2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJbJXNdIEZhaWxlZCB0byBhbGxvY2F0ZSBhIGZlbmNlIiwgbU5hbWUpOworICAgICAgICAgICAgY2xvc2UoZmVuY2VGZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfQogCiAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIGFmdGVyIEMyRmVuY2UgaW1wbGVtZW50YXRpb24uCiAgICAgYW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBxYmkoCkBAIC04NTAsOCArOTA5LDggQEAKICAgICAgICAgICAgICAgICAgYmxvY2tzLmZyb250KCkuY3JvcCgpLmJvdHRvbSgpKSwKICAgICAgICAgICAgIHZpZGVvU2NhbGluZ01vZGUsCiAgICAgICAgICAgICB0cmFuc2Zvcm0sCi0gICAgICAgICAgICBGZW5jZTo6Tk9fRkVOQ0UsIDApOwotICAgIGlmIChoZHJTdGF0aWNJbmZvIHx8IGhkcjEwUGx1c0luZm8pIHsKKyAgICAgICAgICAgIGZlbmNlLCAwKTsKKyAgICBpZiAoaGRyU3RhdGljSW5mbyB8fCBoZHJEeW5hbWljSW5mbykgewogICAgICAgICBIZHJNZXRhZGF0YSBoZHI7CiAgICAgICAgIGlmIChoZHJTdGF0aWNJbmZvKSB7CiAgICAgICAgICAgICAvLyBJZiBtYXN0ZXJpbmcgbWF4IGFuZCBtaW4gbHVtaW5hbmNlIGZpZWxkcyBhcmUgMCwgZG8gbm90IHVzZSB0aGVtLgpAQCAtODg3LDE0ICs5NDYsMjIgQEAKICAgICAgICAgICAgICAgICBoZHIudmFsaWRUeXBlcyB8PSBIZHJNZXRhZGF0YTo6Q1RBODYxXzM7CiAgICAgICAgICAgICAgICAgaGRyLmN0YTg2MTMgPSBjdGE4NjFfbWV0YTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZG9lcyBub3QgaGF2ZSB2YWxpZCBpbmZvCisgICAgICAgICAgICBpZiAoIShoZHIudmFsaWRUeXBlcyAmIChIZHJNZXRhZGF0YTo6U01QVEUyMDg2IHwgSGRyTWV0YWRhdGE6OkNUQTg2MV8zKSkpIHsKKyAgICAgICAgICAgICAgICBoZHJTdGF0aWNJbmZvLnJlc2V0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGhkcjEwUGx1c0luZm8pIHsKKyAgICAgICAgaWYgKGhkckR5bmFtaWNJbmZvCisgICAgICAgICAgICAgICAgJiYgaGRyRHluYW1pY0luZm8tPm0udHlwZV8gPT0gQzJDb25maWc6OkhEUl9EWU5BTUlDX01FVEFEQVRBX1RZUEVfU01QVEVfMjA5NF80MCkgewogICAgICAgICAgICAgaGRyLnZhbGlkVHlwZXMgfD0gSGRyTWV0YWRhdGE6OkhEUjEwUExVUzsKICAgICAgICAgICAgIGhkci5oZHIxMHBsdXMuYXNzaWduKAotICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5tLnZhbHVlLAotICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5tLnZhbHVlICsgaGRyMTBQbHVzSW5mby0+ZmxleENvdW50KCkpOworICAgICAgICAgICAgICAgICAgICBoZHJEeW5hbWljSW5mby0+bS5kYXRhLAorICAgICAgICAgICAgICAgICAgICBoZHJEeW5hbWljSW5mby0+bS5kYXRhICsgaGRyRHluYW1pY0luZm8tPmZsZXhDb3VudCgpKTsKICAgICAgICAgfQogICAgICAgICBxYmkuc2V0SGRyTWV0YWRhdGEoaGRyKTsKKworICAgICAgICBTZXRIZHJNZXRhZGF0YVRvR3JhbGxvYzRIYW5kbGUoaGRyU3RhdGljSW5mbywgaGRyRHluYW1pY0luZm8sIGJsb2NrLmhhbmRsZSgpKTsKICAgICB9CiAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBkaXJ0eSByZWdpb25zCiAgICAgcWJpLnNldFN1cmZhY2VEYW1hZ2UoUmVnaW9uOjpJTlZBTElEX1JFR0lPTik7CkBAIC05NDksNiArMTAxNiwxMCBAQAogICAgIGFycmF5LT5jbGVhcigpOwogICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKIAorICAgIGlmICghaW5wdXQtPmJ1ZmZlcnMpIHsKKyAgICAgICAgQUxPR0UoImdldElucHV0QnVmZmVyQXJyYXk6IE5vIElucHV0IEJ1ZmZlcnMgYWxsb2NhdGVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKCFpbnB1dC0+YnVmZmVycy0+aXNBcnJheU1vZGUoKSkgewogICAgICAgICBpbnB1dC0+YnVmZmVycyA9IGlucHV0LT5idWZmZXJzLT50b0FycmF5TW9kZShpbnB1dC0+bnVtU2xvdHMpOwogICAgIH0KQEAgLTk1OSw3ICsxMDMwLDEwIEBACiB2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmdldE91dHB1dEJ1ZmZlckFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSB7CiAgICAgYXJyYXktPmNsZWFyKCk7CiAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOwotCisgICAgaWYgKCFvdXRwdXQtPmJ1ZmZlcnMpIHsKKyAgICAgICAgQUxPR0UoImdldE91dHB1dEJ1ZmZlckFycmF5OiBObyBPdXRwdXQgQnVmZmVycyBhbGxvY2F0ZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoIW91dHB1dC0+YnVmZmVycy0+aXNBcnJheU1vZGUoKSkgewogICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMgPSBvdXRwdXQtPmJ1ZmZlcnMtPnRvQXJyYXlNb2RlKG91dHB1dC0+bnVtU2xvdHMpOwogICAgIH0KQEAgLTExMTYsNiArMTE5MCw3IEBACiAgICAgICAgIGlucHV0LT5udW1TbG90cyA9IG51bUlucHV0U2xvdHM7CiAgICAgICAgIGlucHV0LT5leHRyYUJ1ZmZlcnMuZmx1c2goKTsKICAgICAgICAgaW5wdXQtPm51bUV4dHJhU2xvdHMgPSAwdTsKKyAgICAgICAgaW5wdXQtPmxhc3RGbHVzaEluZGV4ID0gbUZyYW1lSW5kZXgubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKICAgICAgICAgaWYgKGF1ZGlvRW5jb2RlciAmJiBlbmNvZGVyRnJhbWVTaXplICYmIHNhbXBsZVJhdGUgJiYgY2hhbm5lbENvdW50KSB7CiAgICAgICAgICAgICBpbnB1dC0+ZnJhbWVSZWFzc2VtYmxlci5pbml0KAogICAgICAgICAgICAgICAgICAgICBwb29sLApAQCAtMTM3OSw2ICsxNDU0LDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCB0dW5uZWxlZCA9IDA7CisgICAgICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImFuZHJvaWQuX3R1bm5lbGVkIiwgJnR1bm5lbGVkKSkgeworICAgICAgICAgICAgdHVubmVsZWQgPSAwOworICAgICAgICB9CisgICAgICAgIG1UdW5uZWxlZCA9ICh0dW5uZWxlZCAhPSAwKTsKICAgICB9CiAKICAgICAvLyBTZXQgdXAgcGlwZWxpbmUgY29udHJvbC4gVGhpcyBoYXMgdG8gYmUgZG9uZSBhZnRlciBtSW5wdXRCdWZmZXJzIGFuZApAQCAtMTQwMCw1OCArMTQ4MSw2MSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKSB7CitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpwcmVwYXJlSW5pdGlhbElucHV0QnVmZmVycygKKyAgICAgICAgc3RkOjptYXA8c2l6ZV90LCBzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmNsaWVudElucHV0QnVmZmVycykgewogICAgIGlmIChtSW5wdXRTdXJmYWNlKSB7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKKyAgICBzaXplX3QgbnVtSW5wdXRTbG90cyA9IG1JbnB1dC5sb2NrKCktPm51bVNsb3RzOworCisgICAgeworICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CisgICAgICAgIHdoaWxlIChjbGllbnRJbnB1dEJ1ZmZlcnMtPnNpemUoKSA8IG51bUlucHV0U2xvdHMpIHsKKyAgICAgICAgICAgIHNpemVfdCBpbmRleDsKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgIGlmICghaW5wdXQtPmJ1ZmZlcnMtPnJlcXVlc3ROZXdCdWZmZXIoJmluZGV4LCAmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xpZW50SW5wdXRCdWZmZXJzLT5lbXBsYWNlKGluZGV4LCBidWZmZXIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjbGllbnRJbnB1dEJ1ZmZlcnMtPmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1coIlslc10gc3RhcnQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgYXQgYWxsIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0gZWxzZSBpZiAoY2xpZW50SW5wdXRCdWZmZXJzLT5zaXplKCkgPCBudW1JbnB1dFNsb3RzKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIHN0YXJ0OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgc2xvdHMsICIKKyAgICAgICAgICAgICAgIm9ubHkgJXp1IGJ1ZmZlcnMgYWxsb2NhdGVkIiwKKyAgICAgICAgICAgICAgbU5hbWUsIGNsaWVudElucHV0QnVmZmVycy0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiWyVzXSAlenUgaW5pdGlhbCBpbnB1dCBidWZmZXJzIGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgIG1OYW1lLCBjbGllbnRJbnB1dEJ1ZmZlcnMtPnNpemUoKSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoCisgICAgICAgIHN0ZDo6bWFwPHNpemVfdCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICYmY2xpZW50SW5wdXRCdWZmZXJzKSB7CiAgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0IG9TdHJlYW1Gb3JtYXQoMHUpOwogICAgIEMyUHJlcGVuZEhlYWRlck1vZGVTZXR0aW5nIHByZXBlbmQoUFJFUEVORF9IRUFERVJfVE9fTk9ORSk7CiAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoeyAmb1N0cmVhbUZvcm1hdCwgJnByZXBlbmQgfSwge30sIEMyX0RPTlRfQkxPQ0ssIG51bGxwdHIpOwogICAgIGlmIChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9Ci0gICAgc2l6ZV90IG51bUlucHV0U2xvdHMgPSBtSW5wdXQubG9jaygpLT5udW1TbG90czsKLQotICAgIHN0cnVjdCBDbGllbnRJbnB1dEJ1ZmZlciB7Ci0gICAgICAgIHNpemVfdCBpbmRleDsKLSAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyOwotICAgICAgICBzaXplX3QgY2FwYWNpdHk7Ci0gICAgfTsKLSAgICBzdGQ6Omxpc3Q8Q2xpZW50SW5wdXRCdWZmZXI+IGNsaWVudElucHV0QnVmZmVyczsKLQotICAgIHsKLSAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOwotICAgICAgICB3aGlsZSAoY2xpZW50SW5wdXRCdWZmZXJzLnNpemUoKSA8IG51bUlucHV0U2xvdHMpIHsKLSAgICAgICAgICAgIENsaWVudElucHV0QnVmZmVyIGNsaWVudElucHV0QnVmZmVyOwotICAgICAgICAgICAgaWYgKCFpbnB1dC0+YnVmZmVycy0+cmVxdWVzdE5ld0J1ZmZlcigmY2xpZW50SW5wdXRCdWZmZXIuaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnRJbnB1dEJ1ZmZlci5idWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGllbnRJbnB1dEJ1ZmZlci5jYXBhY2l0eSA9IGNsaWVudElucHV0QnVmZmVyLmJ1ZmZlci0+Y2FwYWNpdHkoKTsKLSAgICAgICAgICAgIGNsaWVudElucHV0QnVmZmVycy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGNsaWVudElucHV0QnVmZmVyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGNsaWVudElucHV0QnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dXKCJbJXNdIHN0YXJ0OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGF0IGFsbCIsIG1OYW1lKTsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9IGVsc2UgaWYgKGNsaWVudElucHV0QnVmZmVycy5zaXplKCkgPCBudW1JbnB1dFNsb3RzKSB7Ci0gICAgICAgIEFMT0dEKCJbJXNdIHN0YXJ0OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgc2xvdHMsICIKLSAgICAgICAgICAgICAgIm9ubHkgJXp1IGJ1ZmZlcnMgYWxsb2NhdGVkIiwKLSAgICAgICAgICAgICAgbU5hbWUsIGNsaWVudElucHV0QnVmZmVycy5zaXplKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJbJXNdICV6dSBpbml0aWFsIGlucHV0IGJ1ZmZlcnMgYXZhaWxhYmxlIiwKLSAgICAgICAgICAgICAgbU5hbWUsIGNsaWVudElucHV0QnVmZmVycy5zaXplKCkpOwotICAgIH0KLSAgICAvLyBTb3J0IGlucHV0IGJ1ZmZlcnMgYnkgdGhlaXIgY2FwYWNpdGllcyBpbiBpbmNyZWFzaW5nIG9yZGVyLgotICAgIGNsaWVudElucHV0QnVmZmVycy5zb3J0KAotICAgICAgICAgICAgW10oY29uc3QgQ2xpZW50SW5wdXRCdWZmZXImIGEsIGNvbnN0IENsaWVudElucHV0QnVmZmVyJiBiKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGEuY2FwYWNpdHkgPCBiLmNhcGFjaXR5OwotICAgICAgICAgICAgfSk7CiAKICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRDb25maWdzOwogICAgIG1GbHVzaGVkQ29uZmlncy5sb2NrKCktPnN3YXAoZmx1c2hlZENvbmZpZ3MpOwogICAgIGlmICghZmx1c2hlZENvbmZpZ3MuZW1wdHkoKSkgeworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPFBpcGVsaW5lV2F0Y2hlcj46OkxvY2tlZCB3YXRjaGVyKG1QaXBlbGluZVdhdGNoZXIpOworICAgICAgICAgICAgUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6dGltZV9wb2ludCBub3cgPSBQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjpub3coKTsKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiBmbHVzaGVkQ29uZmlncykgeworICAgICAgICAgICAgICAgIHdhdGNoZXItPm9uV29ya1F1ZXVlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3Iod29yay0+aW5wdXQuYnVmZmVycyksCisgICAgICAgICAgICAgICAgICAgICAgICBub3cpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZmbHVzaGVkQ29uZmlncyk7CiAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKICAgICAgICAgICAgIEFMT0dXKCJbJXNdIEVycm9yIHdoaWxlIHF1ZXVlaW5nIGEgZmx1c2hlZCBjb25maWciLCBtTmFtZSk7CkBAIC0xNDU5LDI1ICsxNTQzLDMxIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG9TdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpMSU5FQVIgJiYKLSAgICAgICAgICAgICghcHJlcGVuZCB8fCBwcmVwZW5kLnZhbHVlID09IFBSRVBFTkRfSEVBREVSX1RPX05PTkUpKSB7Ci0gICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlciA9IGNsaWVudElucHV0QnVmZmVycy5mcm9udCgpLmJ1ZmZlcjsKKyAgICAgICAgICAgICghcHJlcGVuZCB8fCBwcmVwZW5kLnZhbHVlID09IFBSRVBFTkRfSEVBREVSX1RPX05PTkUpICYmCisgICAgICAgICAgICAhY2xpZW50SW5wdXRCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgc2l6ZV90IG1pbkluZGV4ID0gY2xpZW50SW5wdXRCdWZmZXJzLmJlZ2luKCktPmZpcnN0OworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBtaW5CdWZmZXIgPSBjbGllbnRJbnB1dEJ1ZmZlcnMuYmVnaW4oKS0+c2Vjb25kOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJltpbmRleCwgYnVmZmVyXSA6IGNsaWVudElucHV0QnVmZmVycykgeworICAgICAgICAgICAgaWYgKG1pbkJ1ZmZlci0+Y2FwYWNpdHkoKSA+IGJ1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAgICAgICAgIG1pbkluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICAgICAgbWluQnVmZmVyID0gYnVmZmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIC8vIFdPUktBUk9VTkQ6IFNvbWUgYXBwcyBleHBlY3QgQ1NEIGF2YWlsYWJsZSB3aXRob3V0IHF1ZXVlaW5nCiAgICAgICAgIC8vICAgICAgICAgICAgIGFueSBpbnB1dC4gUXVldWUgYW4gZW1wdHkgYnVmZmVyIHRvIGdldCB0aGUgQ1NELgotICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDApOwotICAgICAgICBidWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKLSAgICAgICAgaWYgKHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChidWZmZXIpICE9IE9LKSB7CisgICAgICAgIG1pbkJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgIG1pbkJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOworICAgICAgICBtaW5CdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICBpZiAocXVldWVJbnB1dEJ1ZmZlckludGVybmFsKG1pbkJ1ZmZlcikgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dXKCJbJXNdIEVycm9yIHdoaWxlIHF1ZXVlaW5nIGFuIGVtcHR5IGJ1ZmZlciB0byBnZXQgQ1NEIiwKICAgICAgICAgICAgICAgICAgIG1OYW1lKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIGNsaWVudElucHV0QnVmZmVycy5wb3BfZnJvbnQoKTsKKyAgICAgICAgY2xpZW50SW5wdXRCdWZmZXJzLmVyYXNlKG1pbkluZGV4KTsKICAgICB9CiAKLSAgICBmb3IgKGNvbnN0IENsaWVudElucHV0QnVmZmVyJiBjbGllbnRJbnB1dEJ1ZmZlcjogY2xpZW50SW5wdXRCdWZmZXJzKSB7Ci0gICAgICAgIG1DYWxsYmFjay0+b25JbnB1dEJ1ZmZlckF2YWlsYWJsZSgKLSAgICAgICAgICAgICAgICBjbGllbnRJbnB1dEJ1ZmZlci5pbmRleCwKLSAgICAgICAgICAgICAgICBjbGllbnRJbnB1dEJ1ZmZlci5idWZmZXIpOworICAgIGZvciAoY29uc3QgYXV0byAmW2luZGV4LCBidWZmZXJdIDogY2xpZW50SW5wdXRCdWZmZXJzKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgYnVmZmVyKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC0xNTAzLDYgKzE1OTMsMTQgQEAKICAgICAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOwogICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMucmVzZXQoKTsKICAgICB9CisgICAgaWYgKG1PdXRwdXRTdXJmYWNlLmxvY2soKS0+c3VyZmFjZSkgeworICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBvdXRwdXRQb29sSWQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8QmxvY2tQb29scz46OkxvY2tlZCBwb29scyhtQmxvY2tQb29scyk7CisgICAgICAgICAgICBvdXRwdXRQb29sSWQgPSBwb29scy0+b3V0cHV0UG9vbElkOworICAgICAgICB9CisgICAgICAgIG1Db21wb25lbnQtPnN0b3BVc2luZ091dHB1dFN1cmZhY2Uob3V0cHV0UG9vbElkKTsKKyAgICB9CiB9CiAKIHZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cmVsZWFzZSgpIHsKQEAgLTE1MTgsNDAgKzE2MTYsNDUgQEAKICAgICBzZXREZXNjcmFtYmxlcihudWxscHRyKTsKIH0KIAotCiB2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSB7CiAgICAgQUxPR1YoIlslc10gZmx1c2giLCBtTmFtZSk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGluZGljZXM7CiAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBjb25maWdzOwotICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiBmbHVzaGVkV29yaykgewotICAgICAgICBpbmRpY2VzLnB1c2hfYmFjayh3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7Ci0gICAgICAgIGlmICghKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSkgewotICAgICAgICAgICAgY29udGludWU7CisgICAgbUlucHV0LmxvY2soKS0+bGFzdEZsdXNoSW5kZXggPSBtRnJhbWVJbmRleC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxQaXBlbGluZVdhdGNoZXI+OjpMb2NrZWQgd2F0Y2hlcihtUGlwZWxpbmVXYXRjaGVyKTsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBpZiAoISh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykpIHsKKyAgICAgICAgICAgICAgICB3YXRjaGVyLT5vbldvcmtEb25lKGZyYW1lSW5kZXgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCkgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICB8fCB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCktPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gbm8gbGluZWFyIGNvZGVjIGNvbmZpZyBkYXRhIGZvdW5kIiwgbU5hbWUpOworICAgICAgICAgICAgICAgIHdhdGNoZXItPm9uV29ya0RvbmUoZnJhbWVJbmRleCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiBjb3B5KG5ldyBDMldvcmspOworICAgICAgICAgICAgY29weS0+aW5wdXQuZmxhZ3MgPSBDMkZyYW1lRGF0YTo6ZmxhZ3NfdCgKKyAgICAgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgfCBDMkZyYW1lRGF0YTo6RkxBR19EUk9QX0ZSQU1FKTsKKyAgICAgICAgICAgIGNvcHktPmlucHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgY29weS0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd29yay0+aW5wdXQuYnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGNvcHktPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKHdhdGNoZXItPm9uSW5wdXRCdWZmZXJSZWxlYXNlZChmcmFtZUluZGV4LCBpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcGFyYW0gOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICBjb3B5LT5pbnB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoKnBhcmFtKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3B5LT5pbnB1dC5pbmZvQnVmZmVycy5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgIGNvcHktPmlucHV0LmluZm9CdWZmZXJzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmluZm9CdWZmZXJzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmluZm9CdWZmZXJzLmVuZCgpKTsKKyAgICAgICAgICAgIGNvcHktPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICAgICAgICAgIGNvbmZpZ3MucHVzaF9iYWNrKHN0ZDo6bW92ZShjb3B5KSk7CisgICAgICAgICAgICB3YXRjaGVyLT5vbldvcmtEb25lKGZyYW1lSW5kZXgpOworICAgICAgICAgICAgQUxPR1YoIlslc10gc3Rhc2hlZCBmbHVzaGVkIGNvZGVjIGNvbmZpZyBkYXRhIiwgbU5hbWUpOwogICAgICAgICB9Ci0gICAgICAgIGlmICh3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkKLSAgICAgICAgICAgICAgICB8fCB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCkgPT0gbnVsbHB0cgotICAgICAgICAgICAgICAgIHx8IHdvcmstPmlucHV0LmJ1ZmZlcnMuZnJvbnQoKS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dEKCJbJXNdIG5vIGxpbmVhciBjb2RlYyBjb25maWcgZGF0YSBmb3VuZCIsIG1OYW1lKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IGNvcHkobmV3IEMyV29yayk7Ci0gICAgICAgIGNvcHktPmlucHV0LmZsYWdzID0gQzJGcmFtZURhdGE6OmZsYWdzX3Qod29yay0+aW5wdXQuZmxhZ3MgfCBDMkZyYW1lRGF0YTo6RkxBR19EUk9QX0ZSQU1FKTsKLSAgICAgICAgY29weS0+aW5wdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7Ci0gICAgICAgIGNvcHktPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4Kys7Ci0gICAgICAgIGNvcHktPmlucHV0LmJ1ZmZlcnMuaW5zZXJ0KAotICAgICAgICAgICAgICAgIGNvcHktPmlucHV0LmJ1ZmZlcnMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbmQoKSk7Ci0gICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbSA6IHdvcmstPmlucHV0LmNvbmZpZ1VwZGF0ZSkgewotICAgICAgICAgICAgY29weS0+aW5wdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KCpwYXJhbSkpOwotICAgICAgICB9Ci0gICAgICAgIGNvcHktPmlucHV0LmluZm9CdWZmZXJzLmluc2VydCgKLSAgICAgICAgICAgICAgICBjb3B5LT5pbnB1dC5pbmZvQnVmZmVycy5iZWdpbigpLAotICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmluZm9CdWZmZXJzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgd29yay0+aW5wdXQuaW5mb0J1ZmZlcnMuZW5kKCkpOwotICAgICAgICBjb3B5LT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7Ci0gICAgICAgIGNvbmZpZ3MucHVzaF9iYWNrKHN0ZDo6bW92ZShjb3B5KSk7Ci0gICAgICAgIEFMT0dWKCJbJXNdIHN0YXNoZWQgZmx1c2hlZCBjb2RlYyBjb25maWcgZGF0YSIsIG1OYW1lKTsKICAgICB9CiAgICAgbUZsdXNoZWRDb25maWdzLmxvY2soKS0+c3dhcChjb25maWdzKTsKICAgICB7CkBAIC0xNTY2LDEyICsxNjY5LDYgQEAKICAgICAgICAgICAgIG91dHB1dC0+YnVmZmVycy0+Zmx1c2hTdGFzaCgpOwogICAgICAgICB9CiAgICAgfQotICAgIHsKLSAgICAgICAgTXV0ZXhlZDxQaXBlbGluZVdhdGNoZXI+OjpMb2NrZWQgd2F0Y2hlcihtUGlwZWxpbmVXYXRjaGVyKTsKLSAgICAgICAgZm9yICh1aW50NjRfdCBpbmRleCA6IGluZGljZXMpIHsKLSAgICAgICAgICAgIHdhdGNoZXItPm9uV29ya0RvbmUoaW5kZXgpOwotICAgICAgICB9Ci0gICAgfQogfQogCiB2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6Om9uV29ya0RvbmUoCkBAIC0xNTg5LDEyICsxNjg2LDE4IEBACiAgICAgfQogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0KICAgICAgICAgICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbklucHV0QnVmZmVyUmVsZWFzZWQoZnJhbWVJbmRleCwgYXJyYXlJbmRleCk7Ci0gICAgYm9vbCBuZXdJbnB1dFNsb3RBdmFpbGFibGU7CisgICAgYm9vbCBuZXdJbnB1dFNsb3RBdmFpbGFibGUgPSBmYWxzZTsKICAgICB7CiAgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKLSAgICAgICAgbmV3SW5wdXRTbG90QXZhaWxhYmxlID0gaW5wdXQtPmJ1ZmZlcnMtPmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihidWZmZXIpOwotICAgICAgICBpZiAoIW5ld0lucHV0U2xvdEF2YWlsYWJsZSkgewotICAgICAgICAgICAgKHZvaWQpaW5wdXQtPmV4dHJhQnVmZmVycy5leHBpcmVDb21wb25lbnRCdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgaWYgKGlucHV0LT5sYXN0Rmx1c2hJbmRleCA+PSBmcmFtZUluZGV4KSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBJZ25vcmluZyBzdGFsZSBpbnB1dCBidWZmZXIgZG9uZSBjYWxsYmFjazogIgorICAgICAgICAgICAgICAgICAgImxhc3QgZmx1c2ggaW5kZXggPSAlbGxkLCBmcmFtZUluZGV4ID0gJWxsZCIsCisgICAgICAgICAgICAgICAgICBtTmFtZSwgaW5wdXQtPmxhc3RGbHVzaEluZGV4LnBlZWtsbCgpLCAobG9uZyBsb25nKWZyYW1lSW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV3SW5wdXRTbG90QXZhaWxhYmxlID0gaW5wdXQtPmJ1ZmZlcnMtPmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihidWZmZXIpOworICAgICAgICAgICAgaWYgKCFuZXdJbnB1dFNsb3RBdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICAodm9pZClpbnB1dC0+ZXh0cmFCdWZmZXJzLmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihidWZmZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIGlmIChuZXdJbnB1dFNsb3RBdmFpbGFibGUpIHsKQEAgLTE4MzAsNyArMTkzMyw3IEBACiAKICAgICBpbnQzMl90IGZsYWdzID0gMDsKICAgICBpZiAod29ya2xldC0+b3V0cHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgewotICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgICAgIGZsYWdzIHw9IEJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU07CiAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IG91dHB1dCBFT1MiLCBtTmFtZSk7CiAgICAgfQogCkBAIC0xODQ3LDYgKzE5NTAsOCBAQAogICAgICAgICAvLyBXaGVuIHVzaW5nIGlucHV0IHN1cmZhY2Ugd2UgbmVlZCB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCBpbnB1dCB0aW1lc3RhbXAuCiAgICAgICAgIHRpbWVzdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbDsKICAgICB9CisgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgIkNDb2RlY0J1ZmZlckNoYW5uZWw6Om9uV29ya0RvbmUoJXNAdHM9JWxsZCkiLCBtTmFtZSwgdGltZXN0YW1wLnBlZWtsbCgpKS5jX3N0cigpKTsKICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBpbnB1dCAlbGxkLCBjb2RlYyAlbGxkID0+IG91dHB1dCAlbGxkID0+ICVsbGQiLAogICAgICAgICAgIG1OYW1lLAogICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbC5wZWVrbGwoKSwKQEAgLTE4NjgsNyArMTk3Myw3IEBACiAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IG91dEJ1ZmZlcjsKICAgICAgICAgaWYgKG91dHB1dC0+YnVmZmVycyAmJiBvdXRwdXQtPmJ1ZmZlcnMtPnJlZ2lzdGVyQ3NkKGluaXREYXRhLCAmaW5kZXgsICZvdXRCdWZmZXIpID09IE9LKSB7CiAgICAgICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVzdGFtcC5wZWVrKCkpOwotICAgICAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJmbGFncyIsIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHKTsKKyAgICAgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZmxhZ3MiLCBCVUZGRVJfRkxBR19DT0RFQ19DT05GSUcpOwogICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogY3NkIGluZGV4ID0gJXp1IFslcF0iLCBtTmFtZSwgaW5kZXgsIG91dEJ1ZmZlci5nZXQoKSk7CiAKICAgICAgICAgICAgIG91dHB1dC51bmxvY2soKTsKQEAgLTE4ODEsMTAgKzE5ODYsMjEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGJvb2wgZHJvcCA9IGZhbHNlOworICAgIGlmICh3b3JrbGV0LT5vdXRwdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19EUk9QX0ZSQU1FKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IGRyb3AgYnVmZmVyIGJ1dCBrZWVwIG1ldGFkYXRhIiwgbU5hbWUpOworICAgICAgICBkcm9wID0gdHJ1ZTsKKyAgICB9CisKICAgICBpZiAobm90aWZ5Q2xpZW50ICYmICFidWZmZXIgJiYgIWZsYWdzKSB7Ci0gICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IE5vdCByZXBvcnRpbmcgb3V0cHV0IGJ1ZmZlciAoJWxsZCkiLAotICAgICAgICAgICAgICBtTmFtZSwgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1bGwoKSk7Ci0gICAgICAgIG5vdGlmeUNsaWVudCA9IGZhbHNlOworICAgICAgICBpZiAobVR1bm5lbGVkICYmIGRyb3AgJiYgb3V0cHV0Rm9ybWF0KSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBLZWVwIHR1bm5lbGVkLCBkcm9wIGZyYW1lIHdpdGggZm9ybWF0IGNoYW5nZSAoJWxsZCkiLAorICAgICAgICAgICAgICAgICAgbU5hbWUsIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdWxsKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogTm90IHJlcG9ydGluZyBvdXRwdXQgYnVmZmVyICglbGxkKSIsCisgICAgICAgICAgICAgICAgICBtTmFtZSwgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1bGwoKSk7CisgICAgICAgICAgICBub3RpZnlDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChidWZmZXIpIHsKQEAgLTE4OTMsNyArMjAwOSw3IEBACiAgICAgICAgICAgICBzd2l0Y2ggKGluZm8tPmNvcmVJbmRleCgpLmNvcmVJbmRleCgpKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86OkNPUkVfSU5ERVg6CiAgICAgICAgICAgICAgICAgICAgIGlmICgoKEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbyAqKWluZm8uZ2V0KCkpLT52YWx1ZSAmIEMyQ29uZmlnOjpTWU5DX0ZSQU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19TWU5DRlJBTUU7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBCVUZGRVJfRkxBR19LRVlfRlJBTUU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTE5MjUsNiArMjA0MSw5IEBACiAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gb3V0QnVmZmVyOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXI7CiAKKyAgICBjb25zdGV4cHIgaW50IGtNYXhSZWFsbG9jVHJ5ID0gNTsKKyAgICBpbnQgcmVhbGxvY1RyeU51bSA9IDA7CisKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CiAgICAgICAgIGlmICghb3V0cHV0LT5idWZmZXJzKSB7CkBAIC0xOTMyLDYgKzIwNTEsOSBAQAogICAgICAgICB9CiAgICAgICAgIGFjdGlvbiA9IG91dHB1dC0+YnVmZmVycy0+cG9wRnJvbVN0YXNoQW5kUmVnaXN0ZXIoCiAgICAgICAgICAgICAgICAgJmMyQnVmZmVyLCAmaW5kZXgsICZvdXRCdWZmZXIpOworICAgICAgICBpZiAoYWN0aW9uICE9IE91dHB1dEJ1ZmZlcnM6OlJFQUxMT0NBVEUpIHsKKyAgICAgICAgICAgIHJlYWxsb2NUcnlOdW0gPSAwOworICAgICAgICB9CiAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICAgICAgIGNhc2UgT3V0cHV0QnVmZmVyczo6U0tJUDoKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE5NDIsNiArMjA2NCwxMyBAQAogICAgICAgICAgICAgbUNhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgb3V0QnVmZmVyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE91dHB1dEJ1ZmZlcnM6OlJFQUxMT0NBVEU6CisgICAgICAgICAgICBpZiAoKytyZWFsbG9jVHJ5TnVtID4ga01heFJlYWxsb2NUcnkpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgQUxPR0UoIlslc10gc2VuZE91dHB1dEJ1ZmZlcnM6IHRyaWVkICVkIHJlYWxsb2MgYW5kIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBrTWF4UmVhbGxvY1RyeSk7CisgICAgICAgICAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIW91dHB1dC0+YnVmZmVycy0+aXNBcnJheU1vZGUoKSkgewogICAgICAgICAgICAgICAgIG91dHB1dC0+YnVmZmVycyA9CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+YnVmZmVycy0+dG9BcnJheU1vZGUob3V0cHV0LT5udW1TbG90cyk7CkBAIC0yMDEzLDEyICsyMTQyLDEzIEBACiB9CiAKIFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OmR1cmF0aW9uIENDb2RlY0J1ZmZlckNoYW5uZWw6OmVsYXBzZWQoKSB7Ci0gICAgLy8gV2hlbiBjbGllbnQgcHVzaGVkIEVPUywgd2Ugd2FudCBhbGwgdGhlIHdvcmsgdG8gYmUgZG9uZSBxdWlja2x5LgogICAgIC8vIE90aGVyd2lzZSwgY29tcG9uZW50IG1heSBoYXZlIHN0YWxsZWQgd29yayBkdWUgdG8gaW5wdXQgc3RhcnZhdGlvbiB1cCB0bwogICAgIC8vIHRoZSBzdW0gb2YgdGhlIGRlbGF5IGluIHRoZSBwaXBlbGluZS4KKyAgICAvLyBUT0RPKGIvMjMxMjUzMzAxKTogV2hlbiBjbGllbnQgcHVzaGVkIEVPUywgdGhlIHBpcGVsaW5lIGNvdWxkIGhhdmUgbGVzcworICAgIC8vICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZnJhbWVzLgogICAgIHNpemVfdCBuID0gMDsKLSAgICBpZiAoIW1JbnB1dE1ldEVvcykgewotICAgICAgICBzaXplX3Qgb3V0cHV0RGVsYXkgPSBtT3V0cHV0LmxvY2soKS0+b3V0cHV0RGVsYXk7CisgICAgc2l6ZV90IG91dHB1dERlbGF5ID0gbU91dHB1dC5sb2NrKCktPm91dHB1dERlbGF5OworICAgIHsKICAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOwogICAgICAgICBuID0gaW5wdXQtPmlucHV0RGVsYXkgKyBpbnB1dC0+cGlwZWxpbmVEZWxheSArIG91dHB1dERlbGF5OwogICAgIH0KQEAgLTIwOTcsNCArMjIyNywxMyBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cHVzaEJsYW5rQnVmZmVyVG9PdXRwdXRTdXJmYWNlKCkgeworICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93ID0gc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyAqPihvdXRwdXQtPnN1cmZhY2UuZ2V0KCkpOworICBpZiAobmF0aXZlV2luZG93ID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgfQorICByZXR1cm4gcHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdy5nZXQoKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaAppbmRleCA1YTJhY2EyLi5mMjlhMjI1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKQEAgLTEzMCw5ICsxMzAsMjMgQEAKICAgICAgICAgICAgIGJvb2wgYnVmZmVyc0JvdW5kVG9Db2RlYyk7CiAKICAgICAvKioKLSAgICAgKiBSZXF1ZXN0IGluaXRpYWwgaW5wdXQgYnVmZmVycyB0byBiZSBmaWxsZWQgYnkgY2xpZW50LgorICAgICAqIFByZXBhcmUgaW5pdGlhbCBpbnB1dCBidWZmZXJzIHRvIGJlIGZpbGxlZCBieSBjbGllbnQuCisgICAgICoKKyAgICAgKiBccGFyYW0gY2xpZW50SW5wdXRCdWZmZXJzW291dF0gICBwb2ludGVyIHRvIHNsb3QgaW5kZXggLT4gYnVmZmVyIG1hcC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiBzdWNjZXNzLCBpdCBjb250YWlucyBwcmVwYXJlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWwgaW5wdXQgYnVmZmVycy4KICAgICAgKi8KLSAgICBzdGF0dXNfdCByZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworICAgIHN0YXR1c190IHByZXBhcmVJbml0aWFsSW5wdXRCdWZmZXJzKAorICAgICAgICAgICAgc3RkOjptYXA8c2l6ZV90LCBzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmNsaWVudElucHV0QnVmZmVycyk7CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IGluaXRpYWwgaW5wdXQgYnVmZmVycyBhcyBwcmVwYXJlZCBpbiBjbGllbnRJbnB1dEJ1ZmZlcnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gY2xpZW50SW5wdXRCdWZmZXJzW2luXSAgICBzbG90IGluZGV4IC0+IGJ1ZmZlciBtYXAgd2l0aCBwcmVwYXJlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWwgaW5wdXQgYnVmZmVycy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCByZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygKKyAgICAgICAgICAgIHN0ZDo6bWFwPHNpemVfdCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICYmY2xpZW50SW5wdXRCdWZmZXJzKTsKIAogICAgIC8qKgogICAgICAqIFN0b3AgcXVldWVpbmcgYnVmZmVycyB0byB0aGUgY29tcG9uZW50LiBUaGlzIG9iamVjdCBzaG91bGQgbmV2ZXIgcXVldWUKQEAgLTE4MSw2ICsxOTUsMTEgQEAKIAogICAgIHZvaWQgc2V0TWV0YU1vZGUoTWV0YU1vZGUgbW9kZSk7CiAKKyAgICAvKioKKyAgICAgKiBQdXNoIGEgYmxhbmsgYnVmZmVyIHRvIHRoZSBjb25maWd1cmVkIG5hdGl2ZSBvdXRwdXQgc3VyZmFjZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBwdXNoQmxhbmtCdWZmZXJUb091dHB1dFN1cmZhY2UoKTsKKwogcHJpdmF0ZToKICAgICBjbGFzcyBRdWV1ZUd1YXJkOwogCkBAIC0yNzMsNiArMjkyLDcgQEAKICAgICAgICAgc2l6ZV90IG51bUV4dHJhU2xvdHM7CiAgICAgICAgIHVpbnQzMl90IGlucHV0RGVsYXk7CiAgICAgICAgIHVpbnQzMl90IHBpcGVsaW5lRGVsYXk7CisgICAgICAgIGMyX2NudHI2NF90IGxhc3RGbHVzaEluZGV4OwogCiAgICAgICAgIEZyYW1lUmVhc3NlbWJsZXIgZnJhbWVSZWFzc2VtYmxlcjsKICAgICB9OwpAQCAtMzIzLDYgKzM0Myw4IEBACiAgICAgICAgIHJldHVybiBtQ3J5cHRvICE9IG51bGxwdHIgfHwgbURlc2NyYW1ibGVyICE9IG51bGxwdHI7CiAgICAgfQogICAgIHN0ZDo6YXRvbWljX2Jvb2wgbVNlbmRFbmNyeXB0ZWRJbmZvQnVmZmVyOworCisgICAgc3RkOjphdG9taWNfYm9vbCBtVHVubmVsZWQ7CiB9OwogCiAvLyBDb252ZXJzaW9uIG9mIGEgYzJfc3RhdHVzX3QgdmFsdWUgdG8gYSBzdGF0dXNfdCB2YWx1ZSBtYXkgZGVwZW5kIG9uIHRoZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuY3BwCmluZGV4IDMzM2EyY2EuLjBmNGE4ZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KQEAgLTMzLDcgKzMzLDkgQEAKIAogbmFtZXNwYWNlIHsKIAotc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZUdyYXBoaWNCdWZmZXIoCitjb25zdGV4cHIgdWludDMyX3QgUElYRUxfRk9STUFUX1VOS05PV04gPSAwOworCitzcDxHcmFwaGljQmxvY2tCdWZmZXI+IEFsbG9jYXRlSW5wdXRHcmFwaGljQnVmZmVyKAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKICAgICAgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQsCkBAIC00NSw5ICs0NywxMyBAQAogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKKyAgICBpbnQ2NF90IHVzYWdlVmFsdWUgPSAwOworICAgICh2b2lkKWZvcm1hdC0+ZmluZEludDY0KCJhbmRyb2lkLl9DMk1lbW9yeVVzYWdlIiwgJnVzYWdlVmFsdWUpOworICAgIEMyTWVtb3J5VXNhZ2UgZnVsbFVzYWdle3VzYWdlVmFsdWUgfCB1c2FnZS5leHBlY3RlZH07CisKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOwogICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAotICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcGl4ZWxGb3JtYXQsIHVzYWdlLCAmYmxvY2spOworICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcGl4ZWxGb3JtYXQsIGZ1bGxVc2FnZSwgJmJsb2NrKTsKICAgICBpZiAoZXJyICE9IEMyX09LKSB7CiAgICAgICAgIEFMT0dEKCJmZXRjaCBncmFwaGljIGJsb2NrIGZhaWxlZDogJWQiLCBlcnIpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTEzMiw2ICsxMzgsNyBAQAogICAgIGlmICghY29weS0+Y29weShjMmJ1ZmZlcikpIHsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQorICAgIGNvcHktPm1ldGEoKS0+ZXh0ZW5kKGJ1ZmZlci0+bWV0YSgpKTsKICAgICByZXR1cm4gY29weTsKIH0KIApAQCAtMTk5LDYgKzIwNiw2MSBAQAogICAgIG1Ta2lwQ3V0QnVmZmVyID0gbmV3IFNraXBDdXRCdWZmZXIoc2tpcCwgY3V0LCBtQ2hhbm5lbENvdW50KTsKIH0KIAorYm9vbCBPdXRwdXRCdWZmZXJzOjpjb252ZXJ0KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZzcmMsIHNwPENvZGVjMkJ1ZmZlcj4gKmRzdCkgeworICAgIGlmIChzcmMgJiYgc3JjLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6TElORUFSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaW50MzJfdCBjb25maWdFbmNvZGluZyA9IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQ7CisgICAgaW50MzJfdCBjb2RlY0VuY29kaW5nID0ga0F1ZGlvRW5jb2RpbmdQY20xNmJpdDsKKyAgICBpZiAobUZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl9jb2RlYy1wY20tZW5jb2RpbmciLCAmY29kZWNFbmNvZGluZykKKyAgICAgICAgICAgICYmIG1Gb3JtYXQtPmZpbmRJbnQzMigiYW5kcm9pZC5fY29uZmlnLXBjbS1lbmNvZGluZyIsICZjb25maWdFbmNvZGluZykpIHsKKyAgICAgICAgaWYgKG1TcmNFbmNvZGluZyAhPSBjb2RlY0VuY29kaW5nIHx8IG1Ec3RFbmNvZGluZyAhPSBjb25maWdFbmNvZGluZykgeworICAgICAgICAgICAgaWYgKGNvZGVjRW5jb2RpbmcgIT0gY29uZmlnRW5jb2RpbmcpIHsKKyAgICAgICAgICAgICAgICBtRGF0YUNvbnZlcnRlciA9IEF1ZGlvQ29udmVydGVyOjpDcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAoQXVkaW9FbmNvZGluZyljb2RlY0VuY29kaW5nLCAoQXVkaW9FbmNvZGluZyljb25maWdFbmNvZGluZyk7CisgICAgICAgICAgICAgICAgQUxPR0RfSUYobURhdGFDb252ZXJ0ZXIsICJbJXNdIENvbnZlcnRlciBjcmVhdGVkIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBjb2RlY0VuY29kaW5nLCBjb25maWdFbmNvZGluZyk7CisgICAgICAgICAgICAgICAgbUZvcm1hdFdpdGhDb252ZXJ0ZXIgPSBtRm9ybWF0LT5kdXAoKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0V2l0aENvbnZlcnRlci0+c2V0SW50MzIoS0VZX1BDTV9FTkNPRElORywgY29uZmlnRW5jb2RpbmcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRGF0YUNvbnZlcnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgbUZvcm1hdFdpdGhDb252ZXJ0ZXIgPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNyY0VuY29kaW5nID0gY29kZWNFbmNvZGluZzsKKyAgICAgICAgICAgIG1Ec3RFbmNvZGluZyA9IGNvbmZpZ0VuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGlmIChpbnQgZW5jb2Rpbmc7ICFtRm9ybWF0LT5maW5kSW50MzIoS0VZX1BDTV9FTkNPRElORywgJmVuY29kaW5nKQorICAgICAgICAgICAgICAgIHx8IGVuY29kaW5nICE9IG1Ec3RFbmNvZGluZykgeworICAgICAgICB9CisgICAgfQorICAgIGlmICghbURhdGFDb252ZXJ0ZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBzcmNCdWZmZXI7CisgICAgaWYgKHNyYykgeworICAgICAgICBzcmNCdWZmZXIgPSBDb25zdExpbmVhckJsb2NrQnVmZmVyOjpBbGxvY2F0ZShtRm9ybWF0LCBzcmMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNyY0J1ZmZlciA9IG5ldyBNZWRpYUNvZGVjQnVmZmVyKG1Gb3JtYXQsIG5ldyBBQnVmZmVyKDApKTsKKyAgICB9CisgICAgaWYgKCFzcmNCdWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoISpkc3QpIHsKKyAgICAgICAgKmRzdCA9IG5ldyBDb2RlYzJCdWZmZXIoCisgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICBuZXcgQUJ1ZmZlcihtRGF0YUNvbnZlcnRlci0+dGFyZ2V0U2l6ZShzcmNCdWZmZXItPnNpemUoKSkpKTsKKyAgICB9CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gZHN0QnVmZmVyID0gKmRzdDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtRGF0YUNvbnZlcnRlci0+Y29udmVydChzcmNCdWZmZXIsIGRzdEJ1ZmZlcik7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRCgiWyVzXSBidWZmZXIgY29udmVyc2lvbiBmYWlsZWQ6ICVkIiwgbU5hbWUsIGVycik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZHN0QnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdFdpdGhDb252ZXJ0ZXIpOworICAgIHJldHVybiB0cnVlOworfQorCiB2b2lkIE91dHB1dEJ1ZmZlcnM6OmNsZWFyU3Rhc2goKSB7CiAgICAgbVBlbmRpbmcuY2xlYXIoKTsKICAgICBtUmVvcmRlclN0YXNoLmNsZWFyKCk7CkBAIC0yMzYsNyArMjk4LDcgQEAKICAgICAgICAgaW50MzJfdCBmbGFncywKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQsCiAgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QmIG9yZGluYWwpIHsKLSAgICBib29sIGVvcyA9IGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgIGJvb2wgZW9zID0gZmxhZ3MgJiBCVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNOwogICAgIGlmICghYnVmZmVyICYmIGVvcykgewogICAgICAgICAvLyBUUklDS1k6IHdlIG1heSBiZSB2aW9sYXRpbmcgb3JkZXJpbmcgb2YgdGhlIHN0YXNoIGhlcmUuIEJlY2F1c2Ugd2UKICAgICAgICAgLy8gZG9uJ3QgZXhwZWN0IGFueSBtb3JlIGVtcGxhY2UoKSBjYWxscyBhZnRlciB0aGlzLCB0aGUgb3JkZXJpbmcgc2hvdWxkCkBAIC0yNDQsNyArMzA2LDcgQEAKICAgICAgICAgbVJlb3JkZXJTdGFzaC5lbXBsYWNlX2JhY2soCiAgICAgICAgICAgICAgICAgYnVmZmVyLCBub3RpZnksIHRpbWVzdGFtcCwgZmxhZ3MsIGZvcm1hdCwgb3JkaW5hbCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZmxhZ3MgPSBmbGFncyAmIH5NZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgICAgIGZsYWdzID0gZmxhZ3MgJiB+QlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTTsKICAgICAgICAgYXV0byBpdCA9IG1SZW9yZGVyU3Rhc2guYmVnaW4oKTsKICAgICAgICAgZm9yICg7IGl0ICE9IG1SZW9yZGVyU3Rhc2guZW5kKCk7ICsraXQpIHsKICAgICAgICAgICAgIGlmIChsZXNzKG9yZGluYWwsIGl0LT5vcmRpbmFsKSkgewpAQCAtMjU1LDcgKzMxNyw3IEBACiAgICAgICAgICAgICAgICAgYnVmZmVyLCBub3RpZnksIHRpbWVzdGFtcCwgZmxhZ3MsIGZvcm1hdCwgb3JkaW5hbCk7CiAgICAgICAgIGlmIChlb3MpIHsKICAgICAgICAgICAgIG1SZW9yZGVyU3Rhc2guYmFjaygpLmZsYWdzID0KLSAgICAgICAgICAgICAgICBtUmVvcmRlclN0YXNoLmJhY2soKS5mbGFncyB8IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKKyAgICAgICAgICAgICAgICBtUmVvcmRlclN0YXNoLmJhY2soKS5mbGFncyB8IEJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU07CiAgICAgICAgIH0KICAgICB9CiAgICAgd2hpbGUgKCFtUmVvcmRlclN0YXNoLmVtcHR5KCkgJiYgbVJlb3JkZXJTdGFzaC5zaXplKCkgPiBtRGVwdGgpIHsKQEAgLTI5Miw3ICszNTQsNyBAQAogCiAgICAgLy8gRmx1c2hpbmcgbVJlb3JkZXJTdGFzaCBiZWNhdXNlIG5vIG90aGVyIGJ1ZmZlcnMgc2hvdWxkIGNvbWUgYWZ0ZXIgb3V0cHV0CiAgICAgLy8gRU9TLgotICAgIGlmIChlbnRyeS5mbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykgeworICAgIGlmIChlbnRyeS5mbGFncyAmIEJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0pIHsKICAgICAgICAgLy8gRmx1c2ggcmVvcmRlciBzdGFzaAogICAgICAgICBzZXRSZW9yZGVyRGVwdGgoMCk7CiAgICAgfQpAQCAtODg3LDYgKzk0OSwxMCBAQAogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKKyAgICBpbnQ2NF90IHVzYWdlVmFsdWUgPSAwOworICAgICh2b2lkKWZvcm1hdC0+ZmluZEludDY0KCJhbmRyb2lkLl9DMk1lbW9yeVVzYWdlIiwgJnVzYWdlVmFsdWUpOworICAgIHVzYWdlID0gQzJNZW1vcnlVc2FnZSh1c2FnZS5leHBlY3RlZCB8IHVzYWdlVmFsdWUpOworCiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOwogICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soY2FwYWNpdHksIHVzYWdlLCAmYmxvY2spOwogICAgIGlmIChlcnIgIT0gQzJfT0sgfHwgYmxvY2sgPT0gbnVsbHB0cikgewpAQCAtMTAzMSw3ICsxMDk3LDcgQEAKICAgICAgICAgICAgIFtwb29sID0gbVBvb2wsIGZvcm1hdCA9IG1Gb3JtYXQsIGxicCA9IG1Mb2NhbEJ1ZmZlclBvb2wsIHBpeGVsRm9ybWF0XSgpCiAgICAgICAgICAgICAgICAgICAgIC0+IHNwPENvZGVjMkJ1ZmZlcj4gewogICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQWxsb2NhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgICAgIHJldHVybiBBbGxvY2F0ZUlucHV0R3JhcGhpY0J1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wsIGZvcm1hdCwgcGl4ZWxGb3JtYXQsIHVzYWdlLCBsYnApOwogICAgICAgICAgICAgfSk7CiAgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7CkBAIC0xMDQyLDEwICsxMTA4LDggQEAKIH0KIAogc3A8Q29kZWMyQnVmZmVyPiBHcmFwaGljSW5wdXRCdWZmZXJzOjpjcmVhdGVOZXdCdWZmZXIoKSB7Ci0gICAgaW50NjRfdCB1c2FnZVZhbHVlID0gMDsKLSAgICAodm9pZCltRm9ybWF0LT5maW5kSW50NjQoImFuZHJvaWQuX0MyTWVtb3J5VXNhZ2UiLCAmdXNhZ2VWYWx1ZSk7Ci0gICAgQzJNZW1vcnlVc2FnZSB1c2FnZXt1c2FnZVZhbHVlIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQgfCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OwotICAgIHJldHVybiBBbGxvY2F0ZUdyYXBoaWNCdWZmZXIoCisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIHJldHVybiBBbGxvY2F0ZUlucHV0R3JhcGhpY0J1ZmZlcigKICAgICAgICAgICAgIG1Qb29sLCBtRm9ybWF0LCBleHRyYWN0UGl4ZWxGb3JtYXQobUZvcm1hdCksIHVzYWdlLCBtTG9jYWxCdWZmZXJQb29sKTsKIH0KIApAQCAtMTA3OCw3ICsxMTQyLDcgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAgICAgYzJCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKLSAgICBpZiAoIWMyQnVmZmVyLT5jb3B5KGJ1ZmZlcikpIHsKKyAgICBpZiAoIWNvbnZlcnQoYnVmZmVyLCAmYzJCdWZmZXIpICYmICFjMkJ1ZmZlci0+Y29weShidWZmZXIpKSB7CiAgICAgICAgIEFMT0dEKCJbJXNdIGNvcHkgYnVmZmVyIGZhaWxlZCIsIG1OYW1lKTsKICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwogICAgIH0KQEAgLTExOTQsMTEgKzEyNTgsMTQgQEAKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAogICAgICAgICBzaXplX3QgKmluZGV4LAogICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSB7Ci0gICAgc3A8Q29kZWMyQnVmZmVyPiBuZXdCdWZmZXIgPSB3cmFwKGJ1ZmZlcik7Ci0gICAgaWYgKG5ld0J1ZmZlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgc3A8Q29kZWMyQnVmZmVyPiBuZXdCdWZmZXI7CisgICAgaWYgKCFjb252ZXJ0KGJ1ZmZlciwgJm5ld0J1ZmZlcikpIHsKKyAgICAgICAgbmV3QnVmZmVyID0gd3JhcChidWZmZXIpOworICAgICAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgbmV3QnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CiAgICAgfQotICAgIG5ld0J1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXQpOwogICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKICAgICBoYW5kbGVJbWFnZURhdGEobmV3QnVmZmVyKTsKICAgICAqY2xpZW50QnVmZmVyID0gbmV3QnVmZmVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmgKaW5kZXggOTk1ZDNhNC4uYzhlOTkzMCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuaAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5oCkBAIC0xOCw5ICsxOCwxMSBAQAogCiAjZGVmaW5lIENDT0RFQ19CVUZGRVJTX0hfCiAKKyNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CiAKICNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPERhdGFDb252ZXJ0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgogCkBAIC0zODIsNiArMzg0LDE0IEBACiAgICAgICovCiAgICAgdm9pZCBzdWJtaXQoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcik7CiAKKyAgICAvKioKKyAgICAgKiBBcHBseSBEYXRhQ29udmVydGVyIGZyb20gfHNyY3wgdG8gfCpkc3R8IGlmIG5lZWRlZC4gSWYgfCpkc3R8IGlzIG51bGxwdHIsCisgICAgICogYSBuZXcgYnVmZmVyIGlzIGFsbG9jYXRlZC4KKyAgICAgKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBjb252ZXJzaW9uIHdhcyBuZWVkZWQgYW5kIGV4ZWN1dGVkOyBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBjb252ZXJ0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJnNyYywgc3A8Q29kZWMyQnVmZmVyPiAqZHN0KTsKKwogcHJpdmF0ZToKICAgICAvLyBTa2lwQ3V0QnVmZmVyCiAgICAgaW50MzJfdCBtRGVsYXk7CkBAIC0zOTEsNiArNDAxLDEyIEBACiAKICAgICB2b2lkIHNldFNraXBDdXRCdWZmZXIoaW50MzJfdCBza2lwLCBpbnQzMl90IGN1dCk7CiAKKyAgICAvLyBEYXRhQ29udmVydGVyCisgICAgc3A8RGF0YUNvbnZlcnRlcj4gbURhdGFDb252ZXJ0ZXI7CisgICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXRXaXRoQ29udmVydGVyOworICAgIHN0ZDo6b3B0aW9uYWw8aW50MzJfdD4gbVNyY0VuY29kaW5nOworICAgIHN0ZDo6b3B0aW9uYWw8aW50MzJfdD4gbURzdEVuY29kaW5nOworCiAgICAgLy8gT3V0cHV0IHN0YXNoCiAKICAgICAvLyBTdHJ1Y3QgZm9yIGFuIGVudHJ5IGluIHRoZSBvdXRwdXQgc3Rhc2ggKG1QZW5kaW5nIGFuZCBtUmVvcmRlclN0YXNoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmNwcAppbmRleCBjMjc1MTg3Li41MjA4YmU2IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmNwcApAQCAtMTYsMTAgKzE2LDE1IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQ0NvZGVjQ29uZmlnIgorCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKwogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL05hdGl2ZUhhbmRsZS5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKwogI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8QzJQYXJhbS5oPgogI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KQEAgLTMyNCw3ICszMjksOCBAQAogICAgIDogbUlucHV0Rm9ybWF0KG5ldyBBTWVzc2FnZSksCiAgICAgICBtT3V0cHV0Rm9ybWF0KG5ldyBBTWVzc2FnZSksCiAgICAgICBtVXNpbmdTdXJmYWNlKGZhbHNlKSwKLSAgICAgIG1UdW5uZWxlZChmYWxzZSkgeyB9CisgICAgICBtVHVubmVsZWQoZmFsc2UpLAorICAgICAgbVB1c2hCbGFua0J1ZmZlcnNPblN0b3AoZmFsc2UpIHsgfQogCiB2b2lkIENDb2RlY0NvbmZpZzo6aW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCkgewogICAgIHR5cGVkZWYgRG9tYWluIEQ7CkBAIC0zOTcsMTAgKzQwMywxMCBAQAogICAgIC8vIFJvdGF0aW9uCiAgICAgLy8gTm90ZTogU0RLIHJvdGF0aW9uIGlzIGNsb2NrLXdpc2UsIHdoaWxlIEMyIHJvdGF0aW9uIGlzIGNvdW50ZXItY2xvY2std2lzZQogICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1JPVEFUSU9OLCBDMl9QQVJBTUtFWV9WVUlfUk9UQVRJT04sICJ2YWx1ZSIpCi0gICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6Q09ERUQpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkNPREVEKQogICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKICAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9ST1RBVElPTiwgQzJfUEFSQU1LRVlfUk9UQVRJT04sICJ2YWx1ZSIpCi0gICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6UkFXKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpCiAgICAgICAgIC53aXRoTWFwcGVycyhuZWdhdGUsIG5lZ2F0ZSkpOwogCiAgICAgLy8gYW5kcm9pZCAndmlkZW8tc2NhbGluZycKQEAgLTUxMCw2ICs1MTYsOSBAQAogICAgIGFkZChDb25maWdNYXBwZXIoImN0YTg2MS5tYXgtZmFsbCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1heC1mYWxsIikKICAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CiAKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEMyX1BBUkFNS0VZX0hEUl9GT1JNQVQsIEMyX1BBUkFNS0VZX0hEUl9GT1JNQVQsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkNPREVEICYgRDo6Q09ORklHKSk7CisKICAgICBhZGQoQ29uZmlnTWFwcGVyKHN0ZDo6c3RyaW5nKEtFWV9GRUFUVVJFXykgKyBGRUFUVVJFX1NlY3VyZVBsYXliYWNrLAogICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfU0VDVVJFX01PREUsICJ2YWx1ZSIpKTsKIApAQCAtNjA5LDEwICs2MTgsMzAgQEAKICAgICBhZGQoQ29uZmlnTWFwcGVyKCJjc2QtMCIsICAgICAgICAgICBDMl9QQVJBTUtFWV9JTklUX0RBVEEsICAgICAgICJ2YWx1ZSIpCiAgICAgICAgIC5saW1pdFRvKEQ6Ok9VVFBVVCAmIEQ6OlJFQUQpKTsKIAotICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0hEUjEwX1BMVVNfSU5GTywgQzJfUEFSQU1LRVlfSU5QVVRfSERSMTBfUExVU19JTkZPLCAidmFsdWUiKQorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9IRFIxMF9QTFVTX0lORk8sIEMyX1BBUkFNS0VZX0lOUFVUX0hEUjEwX1BMVVNfSU5GTywgInZhbHVlIikKICAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpQQVJBTSAmIEQ6OklOUFVUKSk7CiAKLSAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9IRFIxMF9QTFVTX0lORk8sIEMyX1BBUkFNS0VZX09VVFBVVF9IRFIxMF9QTFVTX0lORk8sICJ2YWx1ZSIpCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX0hEUjEwX1BMVVNfSU5GTywgQzJfUEFSQU1LRVlfT1VUUFVUX0hEUjEwX1BMVVNfSU5GTywgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpPVVRQVVQpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoCisgICAgICAgICAgICBzdGQ6OnN0cmluZyhDMl9QQVJBTUtFWV9JTlBVVF9IRFJfRFlOQU1JQ19JTkZPKSArICIudHlwZSIsCisgICAgICAgICAgICBDMl9QQVJBTUtFWV9JTlBVVF9IRFJfRFlOQU1JQ19JTkZPLCAidHlwZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6UEFSQU0gJiBEOjpJTlBVVCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKEMyX1BBUkFNS0VZX0lOUFVUX0hEUl9EWU5BTUlDX0lORk8pICsgIi5kYXRhIiwKKyAgICAgICAgICAgIEMyX1BBUkFNS0VZX0lOUFVUX0hEUl9EWU5BTUlDX0lORk8sICJkYXRhIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpQQVJBTSAmIEQ6OklOUFVUKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoQzJfUEFSQU1LRVlfT1VUUFVUX0hEUl9EWU5BTUlDX0lORk8pICsgIi50eXBlIiwKKyAgICAgICAgICAgIEMyX1BBUkFNS0VZX09VVFBVVF9IRFJfRFlOQU1JQ19JTkZPLCAidHlwZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6T1VUUFVUKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoQzJfUEFSQU1LRVlfT1VUUFVUX0hEUl9EWU5BTUlDX0lORk8pICsgIi5kYXRhIiwKKyAgICAgICAgICAgIEMyX1BBUkFNS0VZX09VVFBVVF9IRFJfRFlOQU1JQ19JTkZPLCAiZGF0YSIpCiAgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6T1VUUFVUKSk7CiAKICAgICBhZGQoQ29uZmlnTWFwcGVyKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgIiIpCkBAIC02NTcsMjQgKzY4NiwyOSBAQAogICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1NBTVBMRV9SQVRFLCAgIEMyX1BBUkFNS0VZX0NPREVEX1NBTVBMRV9SQVRFLCAgInZhbHVlIikKICAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpDT0RFRCkpOwogCi0gICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUENNX0VOQ09ESU5HLCAgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HLCAgICAgICAidmFsdWUiKQorICAgIGF1dG8gcGNtRW5jb2RpbmdNYXBwZXIgPSBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgdG87CisgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIEMyTWFwcGVyOjptYXAodmFsdWUsICZ0bykpIHsKKyAgICAgICAgICAgIHJldHVybiB0bzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgIH07CisgICAgYXV0byBwY21FbmNvZGluZ1JldmVyc2UgPSBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgdmFsdWU7CisgICAgICAgIGludDMyX3QgdG87CisgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8ZGVjbHR5cGUodmFsdWUpPjo6dHlwZTsKKyAgICAgICAgaWYgKHYuZ2V0KChDMlZhbHVlVHlwZSopJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmdG8pKSB7CisgICAgICAgICAgICByZXR1cm4gdG87CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICB9OworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1BDTV9FTkNPRElORywgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1BDTV9FTkNPRElORywgInZhbHVlIikKICAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8pCi0gICAgICAgIC53aXRoTWFwcGVycyhbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgewotICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKLSAgICAgICAgICAgIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCB0bzsKLSAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIEMyTWFwcGVyOjptYXAodmFsdWUsICZ0bykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdG87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOwotICAgICAgICB9LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgewotICAgICAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IHZhbHVlOwotICAgICAgICAgICAgaW50MzJfdCB0bzsKLSAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8ZGVjbHR5cGUodmFsdWUpPjo6dHlwZTsKLSAgICAgICAgICAgIGlmICh2LmdldCgoQzJWYWx1ZVR5cGUqKSZ2YWx1ZSkgJiYgQzJNYXBwZXI6Om1hcCh2YWx1ZSwgJnRvKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0bzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7Ci0gICAgICAgIH0pKTsKKyAgICAgICAgLndpdGhNYXBwZXJzKHBjbUVuY29kaW5nTWFwcGVyLCBwY21FbmNvZGluZ1JldmVyc2UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJhbmRyb2lkLl9jb2RlYy1wY20tZW5jb2RpbmciLCBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkcsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6UkVBRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKHBjbUVuY29kaW5nTWFwcGVyLCBwY21FbmNvZGluZ1JldmVyc2UpKTsKIAogICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0lTX0FEVFMsIEMyX1BBUkFNS0VZX0FBQ19QQUNLQUdJTkcsICJ2YWx1ZSIpCiAgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6Q09ERUQpCkBAIC04OTQsNiArOTI4LDEyIEBACiAgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVCwgQzJfUEFSQU1LRVlfTUFYX0NIQU5ORUxfQ09VTlQsICJ2YWx1ZSIpCiAgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNIHwgRDo6UkVBRCkpKTsKIAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVCwgQzJfUEFSQU1LRVlfTUFYX0NIQU5ORUxfQ09VTlQsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNIHwgRDo6UkVBRCkpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NIQU5ORUxfTUFTSywgQzJfUEFSQU1LRVlfQ0hBTk5FTF9NQVNLLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIgJiBEOjpSRUFEKSk7CisKICAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfU0JSX01PREUsIEMyX1BBUkFNS0VZX0FBQ19TQlJfTU9ERSwgInZhbHVlIikKICAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpFTkNPREVSICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNIHwgRDo6UkVBRCkpCiAgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CkBAIC05NDgsOSArOTg4LDM5IEBACiAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gMCA/IEMyX0ZBTFNFIDogQzJfVFJVRTsKICAgICAgICAgfSkpOwogCi0gICAgLyogc3RpbGwgdG8gZG8KLSAgICBjb25zdGV4cHIgY2hhciBLRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1BbXSA9ICJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iOworICAgIGFkZChDb25maWdNYXBwZXIoImFuZHJvaWQuX3R1bm5lbC1wZWVrLXNldC1sZWdhY3kiLCBDMl9QQVJBTUtFWV9UVU5ORUxfUEVFS19NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpQQVJBTSAmIEQ6OlZJREVPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICBpbnQzMl90IHZhbHVlID0gMDsKKyAgICAgICAgICAodm9pZCl2LmdldCgmdmFsdWUpOworICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSAwCisgICAgICAgICAgICAgID8gQzJWYWx1ZShDMlBsYXRmb3JtQ29uZmlnOjpTUEVDSUZJRURfUEVFSykKKyAgICAgICAgICAgICAgOiBDMlZhbHVlKEMyUGxhdGZvcm1Db25maWc6OlVOU1BFQ0lGSUVEX1BFRUspOworICAgICAgICB9KSk7CiAKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9WSURFT19RUF9BVkVSQUdFLCBDMl9QQVJBTUtFWV9BVkVSQUdFX1FQLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8gJiBEOjpSRUFEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9QSUNUVVJFX1RZUEUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfVFlQRSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPICYgRDo6UkVBRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHNkazsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCBjMjsKKyAgICAgICAgICAgIGlmICh2LmdldCgmc2RrKSAmJiBDMk1hcHBlcjo6bWFwKHNkaywgJmMyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKGMyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgYzI7CisgICAgICAgICAgICBpbnQzMl90IHNkayA9IFBJQ1RVUkVfVFlQRV9VTktOT1dOOworICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxkZWNsdHlwZShjMik+Ojp0eXBlOworICAgICAgICAgICAgaWYgKHYuZ2V0KChDMlZhbHVlVHlwZSopJmMyKSAmJiBDMk1hcHBlcjo6bWFwKGMyLCAmc2RrKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzZGs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICAvKiBzdGlsbCB0byBkbwogICAgICAgIG5vdCB5ZXQgdXNlZCBieSBNZWRpYUNvZGVjLCBidXQgZGVmaW5lZCBhcyBNZWRpYUZvcm1hdAogICAgIEtFWV9BVURJT19TRVNTSU9OX0lEIC8vIHdlIHVzZSAiYXVkaW8taHctc3luYyIKICAgICBLRVlfT1VUUFVUX1JFT1JERVJfREVQVEgKQEAgLTEwNTcsNiArMTEyNywxMyBAQAogICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9TVVJGQUNFX1NDQUxJTkdfTU9ERSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KDB1KSwgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUyk7CisKKyAgICAgICAgICAgIGlmIChkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTykgeworICAgICAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyQW5kcm9pZFN0cmVhbUF2ZXJhZ2VCbG9ja1F1YW50aXphdGlvbkluZm86Om91dHB1dCgwdSwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9BVkVSQUdFX1FQKTsKKyAgICAgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbVBpY3R1cmVUeXBlSW5mbzo6b3V0cHV0KDB1LCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1BJQ1RVUkVfVFlQRSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwOTEsNiArMTE2OCwxNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gUGFyYW1ldGVycyB0aGF0IGFyZSBub3Qgc3Vic2NyaWJlZCBpbml0aWFsbHksIGJ1dCBjYW4gYmUgc3Vic2NyaWJlZAorICAgIC8vIHVwb24gZXhwbGljaXQgcmVxdWVzdC4KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PEMyUGFyYW06OkluZGV4PiBrT3B0aW9uYWxQYXJhbXMgPSB7CisgICAgICAgIEMyQW5kcm9pZFN0cmVhbUF2ZXJhZ2VCbG9ja1F1YW50aXphdGlvbkluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgQzJTdHJlYW1QaWN0dXJlVHlwZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICB9OworICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXggJmluZGV4IDoga09wdGlvbmFsUGFyYW1zKSB7CisgICAgICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lcmFzZShpbmRleCk7CisgICAgfQorICAgIHN1YnNjcmliZVRvQ29uZmlnVXBkYXRlKGNvbmZpZ3VyYWJsZSwge30sIEMyX01BWV9CTE9DSyk7CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTEwOTgsMTUgKzExODYsMjEgQEAKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPiAmY29uZmlndXJhYmxlLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCiAgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcpIHsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrUHJvZHVjdEZpcnN0QXBpTGV2ZWwgPQorICAgICAgICBiYXNlOjpHZXRJbnRQcm9wZXJ0eTxpbnQzMl90Pigicm8ucHJvZHVjdC5maXJzdF9hcGlfbGV2ZWwiLCAwKTsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrQm9hcmRBcGlMZXZlbCA9CisgICAgICAgIGJhc2U6OkdldEludFByb3BlcnR5PGludDMyX3Q+KCJyby5ib2FyZC5maXJzdF9hcGlfbGV2ZWwiLCAwKTsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRmlyc3RBcGlMZXZlbCA9CisgICAgICAgIChrQm9hcmRBcGlMZXZlbCAhPSAwKSA/IGtCb2FyZEFwaUxldmVsIDoga1Byb2R1Y3RGaXJzdEFwaUxldmVsOwogICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5pbnNlcnQoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpKTsKLSAgICAvLyBUT0RPOiBlbmFibGUgdGhpcyB3aGVuIGNvbXBvbmVudHMgbm8gbG9uZ2VyIGNyYXNoIG9uIHRoaXMgY29uZmlnCi0gICAgaWYgKG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCkgIT0gbVN1YnNjcmliZWRJbmRpY2VzU2l6ZSAmJiBmYWxzZSkgewotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gaW5kaWNlczsKKyAgICBpZiAobVN1YnNjcmliZWRJbmRpY2VzLnNpemUoKSAhPSBtU3Vic2NyaWJlZEluZGljZXNTaXplCisgICAgICAgICAgICAmJiBrRmlyc3RBcGlMZXZlbCA+PSBfX0FORFJPSURfQVBJX1RfXykgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gaW5kaWNlc1ZlY3RvcjsKICAgICAgICAgZm9yIChDMlBhcmFtOjpJbmRleCBpeCA6IG1TdWJzY3JpYmVkSW5kaWNlcykgewotICAgICAgICAgICAgaW5kaWNlcy5wdXNoX2JhY2soaXgpOworICAgICAgICAgICAgaW5kaWNlc1ZlY3Rvci5wdXNoX2JhY2soaXgpOwogICAgICAgICB9CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc+IHN1YnNjcmliZVR1bmluZyA9Ci0gICAgICAgICAgICBDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc6OkFsbG9jVW5pcXVlKGluZGljZXMpOworICAgICAgICAgICAgQzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nOjpBbGxvY1VuaXF1ZShpbmRpY2VzVmVjdG9yKTsKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHJlc3VsdHM7CiAgICAgICAgIGMyX3N0YXR1c190IGMyRXJyID0gY29uZmlndXJhYmxlLT5jb25maWcoeyBzdWJzY3JpYmVUdW5pbmcuZ2V0KCkgfSwgYmxvY2tpbmcsICZyZXN1bHRzKTsKICAgICAgICAgaWYgKGMyRXJyICE9IEMyX09LICYmIGMyRXJyICE9IEMyX0JBRF9JTkRFWCkgewpAQCAtMTExNiw2ICsxMjEwLDIwIEBACiAgICAgICAgIEFMT0dWKCJTdWJzY3JpYmVkIHRvICV6dSBwYXJhbXMiLCBtU3Vic2NyaWJlZEluZGljZXMuc2l6ZSgpKTsKICAgICAgICAgbVN1YnNjcmliZWRJbmRpY2VzU2l6ZSA9IG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCk7CiAgICAgfQorI2lmIGRlZmluZWQoTE9HX05ERUJVRykgJiYgIUxPR19OREVCVUcKKyAgICBBTE9HVigic3Vic2NyaWJlZCB0byAlenUgcGFyYW1zOiIsIG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCkpOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXggJmluZGV4IDogbVN1YnNjcmliZWRJbmRpY2VzKSB7CisgICAgICAgIHNzIDw8IGluZGV4IDw8ICIgIjsKKyAgICAgICAgaWYgKHNzLnN0cigpLmxlbmd0aCgpID4gNzApIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyIsIHNzLnN0cigpLmNfc3RyKCkpOworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0oKS5zd2FwKHNzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXNzLnN0cigpLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1YoIiVzIiwgc3Muc3RyKCkuY19zdHIoKSk7CisgICAgfQorI2VuZGlmCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xMTQwLDYgKzEyNDgsMTIgQEAKICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcCA6IGNvbmZpZ1VwZGF0ZSkgewogICAgICAgICBpZiAocCAmJiAqcCkgeworICAgICAgICAgICAgLy8gQWxsb3cgdW5zdWJzY3JpYmVkIHZlbmRvciBwYXJhbWV0ZXJzIHRvIGdvIHRocm91Z2ggLS0tIGl0IG1heSBiZQorICAgICAgICAgICAgLy8gbGF0ZXIgaGFuZGxlZCBieSB0aGUgZm9ybWF0IHNoYXBlci4KKyAgICAgICAgICAgIGlmICghcC0+aXNWZW5kb3IoKSAmJiBtU3Vic2NyaWJlZEluZGljZXMuY291bnQocC0+aW5kZXgoKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ1cGRhdGVDb25maWd1cmF0aW9uOiBza2lwcGVkIHVuc3Vic2NyaWJlZCBwYXJhbSAlMDh4IiwgcC0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdXRvIGluc2VydGlvbiA9IG1DdXJyZW50Q29uZmlnLmVtcGxhY2UocC0+aW5kZXgoKSwgbnVsbHB0cik7CiAgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uLnNlY29uZCB8fCAqaW5zZXJ0aW9uLmZpcnN0LT5zZWNvbmQgIT0gKnApIHsKICAgICAgICAgICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQocC0+aW5kZXgoKSkgfHwgbUxvY2FsUGFyYW1zLmNvdW50KHAtPmluZGV4KCkpKSB7CkBAIC0xNTEwLDYgKzE2MjQsMjIgQEAKICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3RhODYxLm1heC1jbGwiKSk7CiAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImN0YTg2MS5tYXgtZmFsbCIpKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIEhEUiBkeW5hbWljIGluZm8KKyAgICAgICAgc3RkOjpzdHJpbmcga2V5UHJlZml4ID0gaW5wdXQgPyBDMl9QQVJBTUtFWV9JTlBVVF9IRFJfRFlOQU1JQ19JTkZPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQzJfUEFSQU1LRVlfT1VUUFVUX0hEUl9EWU5BTUlDX0lORk87CisgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGVLZXkgPSBrZXlQcmVmaXggKyAiLnR5cGUiOworICAgICAgICBzdGQ6OnN0cmluZyBkYXRhS2V5ID0ga2V5UHJlZml4ICsgIi5kYXRhIjsKKyAgICAgICAgaW50MzJfdCB0eXBlOworICAgICAgICBzcDxBQnVmZmVyPiBkYXRhOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIodHlwZUtleS5jX3N0cigpLCAmdHlwZSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRCdWZmZXIoZGF0YUtleS5jX3N0cigpLCAmZGF0YSkpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IEhEUl9EWU5BTUlDX01FVEFEQVRBX1RZUEVfU01QVEVfMjA5NF80MCkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0QnVmZmVyKEtFWV9IRFIxMF9QTFVTX0lORk8sIGRhdGEpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSh0eXBlS2V5LmNfc3RyKCkpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoZGF0YUtleS5jX3N0cigpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBBTE9HVigiY29udmVydGVkIHRvIFNESyB2YWx1ZXMgYXMgJXMiLCBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CkBAIC0xNTkzLDYgKzE3MjMsMjcgQEAKICAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSCwgY2FwdHVyZVJhdGUgLyBmcmFtZVJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIEhEUiBmb3JtYXQgZm9yIHZpZGVvIGVuY29kaW5nCisgICAgICAgIGlmIChjb25maWdEb21haW4gPT0gSVNfQ09ORklHKSB7CisgICAgICAgICAgICAvLyBkb24ndCBhc3N1bWUgaGVyZSB0aGF0IHRyYW5zZmVyIGlzIHNldCBmb3IgSERSLCBvbmx5IHJlcXVpcmUgaXQgZm9yIEhMRworICAgICAgICAgICAgaW50IHRyYW5zZmVyID0gMDsKKyAgICAgICAgICAgIHBhcmFtcy0+ZmluZEludDMyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgJnRyYW5zZmVyKTsKKworICAgICAgICAgICAgaW50IHByb2ZpbGU7CisgICAgICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoS0VZX1BST0ZJTEUsICZwcm9maWxlKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPiBtYXBwZXIgPQorICAgICAgICAgICAgICAgICAgICBDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKG1Db2RpbmdNZWRpYVR5cGUpOworICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpoZHJfZm9ybWF0X3QgYzIgPSBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpVTktOT1dOOworICAgICAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgbWFwcGVyLT5tYXBIZHJGb3JtYXQocHJvZmlsZSwgJmMyKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYzIgPT0gQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6SExHICYmCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlciAhPSBDT0xPUl9UUkFOU0ZFUl9ITEcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6VU5LTk9XTjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKEMyX1BBUkFNS0VZX0hEUl9GT1JNQVQsIGMyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICB7ICAgLy8gcmVmbGVjdCB0ZW1wb3JhbCBsYXllcmluZyBpbnRvIGEgYmluYXJ5IGJsb2IKQEAgLTE2OTAsNiArMTg0MSwxNiBAQAogICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoImN0YTg2MS5tYXgtZmFsbCIsIG1ldGEtPnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBzcDxBQnVmZmVyPiBoZHJEeW5hbWljSW5mbzsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEJ1ZmZlcihLRVlfSERSMTBfUExVU19JTkZPLCAmaGRyRHluYW1pY0luZm8pKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZwcmVmaXggOiB7IEMyX1BBUkFNS0VZX0lOUFVUX0hEUl9EWU5BTUlDX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX09VVFBVVF9IRFJfRFlOQU1JQ19JTkZPIH0pIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKChwcmVmaXggKyAiLnR5cGUiKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSERSX0RZTkFNSUNfTUVUQURBVEFfVFlQRV9TTVBURV8yMDk0XzQwKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEJ1ZmZlcigocHJlZml4ICsgIi5kYXRhIikuY19zdHIoKSwgaGRyRHluYW1pY0luZm8pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gdGhpcyBpcyB0byB2ZXJpZnkgdGhhdCB3ZSBzZXQgcHJvcGVyIHNpZ25lZG5lc3MgZm9yIHN0YW5kYXJkIHBhcmFtZXRlcnMKQEAgLTE4ODIsNyArMjA0Myw5IEBACiAgICAgbmFtZXMtPmNsZWFyKCk7CiAgICAgLy8gVE9ETzogZXhwYW5kIHRvIHN0YW5kYXJkIHBhcmFtcwogICAgIGZvciAoY29uc3QgYXV0byAmW2tleSwgZGVzY10gOiBtVmVuZG9yUGFyYW1zKSB7Ci0gICAgICAgIG5hbWVzLT5wdXNoX2JhY2soa2V5KTsKKyAgICAgICAgaWYgKGRlc2MtPmlzVmlzaWJsZSgpKSB7CisgICAgICAgICAgICBuYW1lcy0+cHVzaF9iYWNrKGtleSk7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oCmluZGV4IDQxN2I3NzMuLjJlN2I4NjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuaAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmgKQEAgLTE0OCw2ICsxNDgsOCBAQAogICAgIGJvb2wgbVR1bm5lbGVkOwogICAgIHNwPE5hdGl2ZUhhbmRsZT4gbVNpZGViYW5kSGFuZGxlOwogCisgICAgYm9vbCBtUHVzaEJsYW5rQnVmZmVyc09uU3RvcDsKKwogICAgIENDb2RlY0NvbmZpZygpOwogCiAgICAgLy8vIGluaXRpYWxpemVzIHRoZSBtZW1iZXJzIHJlcXVpcmVkIHRvIG1hbmFnZSB0aGUgZm9ybWF0OiBkZXNjcmlwdG9ycywgcmVmbGVjdG9yLApAQCAtMzYzLDExICszNjUsNiBAQAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcywKICAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcgPSBDMl9ET05UX0JMT0NLKTsKIAotcHJpdmF0ZToKLQotICAgIC8vLyBpbml0aWFsaXplcyB0aGUgc3RhbmRhcmQgTWVkaWFDb2RlYyB0byBDb2RlYyAyLjAgcGFyYW1zIG1hcHBpbmcKLSAgICB2b2lkIGluaXRpYWxpemVTdGFuZGFyZFBhcmFtcygpOwotCiAgICAgLy8vIEFkZHMgaW5kaWNlcyB0byB0aGUgc3Vic2NyaWJlZCBpbmRpY2VzLCBhbmQgdXBkYXRlZCBzdWJzY3JpcHRpb24gdG8gY29tcG9uZW50CiAgICAgLy8vIFxwYXJhbSBibG9ja2luZyBibG9ja2luZyBtb2RlIHRvIHVzZSB3aXRoIHRoZSBjb21wb25lbnQKICAgICBzdGF0dXNfdCBzdWJzY3JpYmVUb0NvbmZpZ1VwZGF0ZSgKQEAgLTM3NSw2ICszNzIsMTEgQEAKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKICAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcgPSBDMl9ET05UX0JMT0NLKTsKIAorcHJpdmF0ZToKKworICAgIC8vLyBpbml0aWFsaXplcyB0aGUgc3RhbmRhcmQgTWVkaWFDb2RlYyB0byBDb2RlYyAyLjAgcGFyYW1zIG1hcHBpbmcKKyAgICB2b2lkIGluaXRpYWxpemVTdGFuZGFyZFBhcmFtcygpOworCiAgICAgLy8vIEdldHMgU0RLIGZvcm1hdCBmcm9tIGNvZGVjIDIuMCByZWZsZWN0ZWQgY29uZmlndXJhdGlvbgogICAgIC8vLyBccGFyYW0gZG9tYWluIGlucHV0L291dHB1dCBiaXRtYXNrCiAgICAgc3A8QU1lc3NhZ2U+IGdldEZvcm1hdEZvckRvbWFpbigKQEAgLTM5Niw0ICszOTgsMyBAQAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBDX0NPREVDX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAKaW5kZXggNDA3MDQ3OC4uY2RlNGM3MiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAKQEAgLTE2LDExICsxNiwxOCBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkNvZGVjMkJ1ZmZlciIKKyNkZWZpbmUgQVRSQUNFX1RBRyAgQVRSQUNFX1RBR19WSURFTwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvY29tbW9uL0N0YTg2MV8zLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2NvbW1vbi9TbXB0ZTIwODYuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2NvbW1vbi8xLjIvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL21hcHBlci80LjAvSU1hcHBlci5oPgorI2luY2x1ZGUgPGdyYWxsb2N0eXBlcy9HcmFsbG9jNC5oPgogI2luY2x1ZGUgPGhpZGxtZW1vcnkvRnJhbWV3b3JrVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgpAQCAtMjI0LDYgKzIzMSw3IEBACiAgICAgICAgICAgbUFsbG9jYXRlZERlcHRoKDApLAogICAgICAgICAgIG1CYWNrQnVmZmVyU2l6ZSgwKSwKICAgICAgICAgICBtTWVkaWFJbWFnZShuZXcgQUJ1ZmZlcihzaXplb2YoTWVkaWFJbWFnZTIpKSkgeworICAgICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9GT1JNQVQsICZtQ2xpZW50Q29sb3JGb3JtYXQpKSB7CiAgICAgICAgICAgICBtQ2xpZW50Q29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKICAgICAgICAgfQpAQCAtMjYwLDYgKzI2OCwzOSBAQAogICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8aW50PiBjbGllbnRCaXREZXB0aCA9IHt9OworICAgICAgICAgICAgICAgIHN3aXRjaCAobUNsaWVudENvbG9yRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWUDAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEJpdERlcHRoID0gMTA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MTFQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDExUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMkZsZXhpYmxlOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjJQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMlBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjJTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQ0NEZsZXhpYmxlOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQ0NEludGVybGVhdmVkOgorICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50Qml0RGVwdGggPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuby1vcDsgdXNlZCB3aXRoIG9wdGlvbmFsCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBjb252ZXJzaW9uIGZhaWxzIGlmIGNsaWVudCBiaXQtZGVwdGggYW5kIHRoZSBjb21wb25lbnQgYml0LWRlcHRoIGRpZmZlcnMKKyAgICAgICAgICAgICAgICBpZiAoKGNsaWVudEJpdERlcHRoKSAmJiAoYml0RGVwdGggIT0gY2xpZW50Qml0RGVwdGgudmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkJpdCBkZXB0aCBvZiBjbGllbnQ6ICVkIGFuZCBjb21wb25lbnQ6ICVkIGRpZmZlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgKmNsaWVudEJpdERlcHRoLCBiaXREZXB0aCk7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQzJQbGFuZUluZm8geVBsYW5lID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CiAgICAgICAgICAgICAgICAgQzJQbGFuZUluZm8gdVBsYW5lID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CiAgICAgICAgICAgICAgICAgQzJQbGFuZUluZm8gdlBsYW5lID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CkBAIC0zNTgsMjEgKzM5OSwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVZQMDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyaWRlIGlzIGluIGJ5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubU9mZnNldCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUNvbEluYyA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVJvd0luYyA9IHN0cmlkZSAqIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVJvd0luYyA9IHN0cmlkZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tSG9yaXpTdWJzYW1wbGluZyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVZlcnRTdWJzYW1wbGluZyA9IDE7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tT2Zmc2V0ID0gc3RyaWRlICogdlN0cmlkZSAqIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubU9mZnNldCA9IHN0cmlkZSAqIHZTdHJpZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubUNvbEluYyA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVJvd0luYyA9IHN0cmlkZSAqIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVJvd0luYyA9IHN0cmlkZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tT2Zmc2V0ID0gc3RyaWRlICogdlN0cmlkZSAqIDIgKyAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1PZmZzZXQgPSBzdHJpZGUgKiB2U3RyaWRlICsgMjsKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tQ29sSW5jID0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tUm93SW5jID0gc3RyaWRlICogMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tUm93SW5jID0gc3RyaWRlOwogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnlXcmFwcGluZykgewpAQCAtNTMzLDggKzU3NSw4IEBACiAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXJTaXplICs9IHN0cmlkZSAqIHZTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgLyBwbGFuZS5yb3dTYW1wbGluZyAvIHBsYW5lLmNvbFNhbXBsaW5nICogZGl2VXAobUFsbG9jYXRlZERlcHRoLCA4dSk7CisgICAgICAgICAgICAvLyBzdHJpZGUgaXMgaW4gYnl0ZXMKKyAgICAgICAgICAgIGJ1ZmZlclNpemUgKz0gc3RyaWRlICogdlN0cmlkZSAvIHBsYW5lLnJvd1NhbXBsaW5nIC8gcGxhbmUuY29sU2FtcGxpbmc7CiAgICAgICAgIH0KIAogICAgICAgICBtQmFja0J1ZmZlclNpemUgPSBidWZmZXJTaXplOwpAQCAtNTc1LDYgKzYxNyw3IEBACiAgICAgICogQ29weSBDMkdyYXBoaWNWaWV3IHRvIE1lZGlhSW1hZ2UyLgogICAgICAqLwogICAgIHN0YXR1c190IGNvcHlUb01lZGlhSW1hZ2UoKSB7CisgICAgICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKICAgICAgICAgfQpAQCAtNjEzLDcgKzY1Niw5IEBACiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYykgeworICAgIEFUUkFDRV9CRUdJTigiR3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZSBibG9jay0+bWFwKCkiKTsKICAgICBDMkdyYXBoaWNWaWV3IHZpZXcoYmxvY2stPm1hcCgpLmdldCgpKTsKKyAgICBBVFJBQ0VfRU5EKCk7CiAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgewogICAgICAgICBBTE9HRCgiQzJHcmFwaGljQmxvY2s6Om1hcCBmYWlsZWQ6ICVkIiwgdmlldy5lcnJvcigpKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC02NTgsNiArNzAzLDcgQEAKIH0KIAogc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBHcmFwaGljQmxvY2tCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICB1aW50MzJfdCB3aWR0aCA9IG1WaWV3LndpZHRoKCk7CiAgICAgdWludDMyX3QgaGVpZ2h0ID0gbVZpZXcuaGVpZ2h0KCk7CiAgICAgaWYgKCFtV3JhcHBlZCkgewpAQCAtNzQ2LDggKzc5MiwxMCBAQAogICAgICAgICBBTE9HRCgiQzJCdWZmZXIgcHJlY29uZCBmYWlsIik7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KKyAgICBBVFJBQ0VfQkVHSU4oIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZSBibG9jay0+bWFwKCkiKTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gdmlldyhzdGQ6Om1ha2VfdW5pcXVlPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAogICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpKSk7CisgICAgQVRSQUNFX0VORCgpOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiBob2xkZXI7CiAKICAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigqdmlldywgZm9ybWF0LCBmYWxzZSAvKiBjb3B5ICovKTsKQEAgLTc4Nyw4ICs4MzUsMTQgQEAKICAgICAgICAgQUxPR0QoImZvcm1hdCBoYWQgbm8gd2lkdGggLyBoZWlnaHQiKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQotICAgIC8vIE5PVEU6IHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgWVVWNDIwIGZvcm1hdHMgZm9yIGJ5dGUtYnVmZmVyIG1vZGUuCi0gICAgc3A8QUJ1ZmZlcj4gYUJ1ZmZlcihhbGxvYyhhbGlnbih3aWR0aCwgMTYpICogYWxpZ24oaGVpZ2h0LCAxNikgKiAzIC8gMikpOworICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICBpbnQzMl90IGJwcCA9IDEyOyAgLy8gOChZKSArIDIoVSkgKyAyKFYpCisgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9GT1JNQVQsICZjb2xvckZvcm1hdCkpIHsKKyAgICAgICAgaWYgKGNvbG9yRm9ybWF0ID09IENPTE9SX0Zvcm1hdFlVVlAwMTApIHsKKyAgICAgICAgICAgIGJwcCA9IDI0OyAgLy8gMTYoWSkgKyA0KFUpICsgNChWKQorICAgICAgICB9CisgICAgfQorICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIoYWxsb2MoYWxpZ24od2lkdGgsIDE2KSAqIGFsaWduKGhlaWdodCwgMTYpICogYnBwIC8gOCkpOwogICAgIHJldHVybiBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIoCiAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICBhQnVmZmVyLApAQCAtODQyLDExICs4OTYsMTMgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIEFUUkFDRV9CRUdJTigiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHkgYmxvY2stPm1hcCgpIik7CiAgICAgR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlciBjb252ZXJ0ZXIoCiAgICAgICAgICAgICBidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKClbMF0ubWFwKCkuZ2V0KCksCiAgICAgICAgICAgICAvLyBGSVhNRTogZm9ybWF0KCkgaXMgbm90IGNvbnN0LCBidXQgd2UgY2Fubm90IGNoYW5nZSBpdCwgc28gZG8gYSBjb25zdCBjYXN0IGhlcmUKICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Q29uc3RHcmFwaGljQmxvY2tCdWZmZXIgKj4odGhpcyktPmZvcm1hdCgpLAogICAgICAgICAgICAgdHJ1ZSAvKiBjb3B5ICovKTsKKyAgICBBVFJBQ0VfRU5EKCk7CiAgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgewogICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IGNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC05NDEsNCArOTk3LDI1MCBAQAogICAgIHJldHVybiBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQmxvY2stPmhhbmRsZSgpKTsKIH0KIAordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6Q3RhODYxXzM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpTbXB0ZTIwODY7CisKK3VzaW5nIDo6YW5kcm9pZDo6Z3JhbGxvYzQ6Ok1ldGFkYXRhVHlwZV9DdGE4NjFfMzsKK3VzaW5nIDo6YW5kcm9pZDo6Z3JhbGxvYzQ6Ok1ldGFkYXRhVHlwZV9TbXB0ZTIwODY7Cit1c2luZyA6OmFuZHJvaWQ6OmdyYWxsb2M0OjpNZXRhZGF0YVR5cGVfU21wdGUyMDk0XzQwOworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKwordXNpbmcgRXJyb3I0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6Om1hcHBlcjo6VjRfMDo6RXJyb3I7Cit1c2luZyBJTWFwcGVyNCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlY0XzA6OklNYXBwZXI7CisKK25hbWVzcGFjZSB7CisKK3NwPElNYXBwZXI0PiBHZXRNYXBwZXI0KCkgeworICAgIHN0YXRpYyBzcDxJTWFwcGVyND4gc01hcHBlciA9IElNYXBwZXI0OjpnZXRTZXJ2aWNlKCk7CisgICAgcmV0dXJuIHNNYXBwZXI7Cit9CisKK2NsYXNzIEdyYWxsb2M0QnVmZmVyIHsKK3B1YmxpYzoKKyAgICBHcmFsbG9jNEJ1ZmZlcihjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSA6IG1CdWZmZXIobnVsbHB0cikgeworICAgICAgICBzcDxJTWFwcGVyND4gbWFwcGVyID0gR2V0TWFwcGVyNCgpOworICAgICAgICBpZiAoIW1hcHBlcikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFVud3JhcCByYXcgYnVmZmVyIGhhbmRsZSBmcm9tIHRoZSBDMkhhbmRsZQorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKm5oID0gVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShoYW5kbGUpOworICAgICAgICBpZiAoIW5oKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gSW1wb3J0IHRoZSByYXcgaGFuZGxlIHNvIElNYXBwZXIgY2FuIHVzZSB0aGUgYnVmZmVyLiBUaGUgaW1wb3J0ZWQKKyAgICAgICAgLy8gaGFuZGxlIG11c3QgYmUgZnJlZWQgd2hlbiB0aGUgY2xpZW50IGlzIGRvbmUgd2l0aCB0aGUgYnVmZmVyLgorICAgICAgICBtYXBwZXItPmltcG9ydEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9oYW5kbGUobmgpLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBFcnJvcjQgJmVycm9yLCB2b2lkICpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yID09IEVycm9yNDo6Tk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIC8vIFRSSUNLWTogVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSBjcmVhdGVzIGEgbmV3IGhhbmRsZSBidXQKKyAgICAgICAgLy8gICAgICAgICBkb2VzIG5vdCBjbG9uZSB0aGUgZmRzLiBUaHVzIHdlIG5lZWQgdG8gZGVsZXRlIHRoZSBoYW5kbGUKKyAgICAgICAgLy8gICAgICAgICB3aXRob3V0IGNsb3NpbmcgaXQuCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKKyAgICB9CisKKyAgICB+R3JhbGxvYzRCdWZmZXIoKSB7CisgICAgICAgIHNwPElNYXBwZXI0PiBtYXBwZXIgPSBHZXRNYXBwZXI0KCk7CisgICAgICAgIGlmIChtYXBwZXIgJiYgbUJ1ZmZlcikgeworICAgICAgICAgICAgLy8gRnJlZSB0aGUgaW1wb3J0ZWQgYnVmZmVyIGhhbmRsZS4gVGhpcyBkb2VzIG5vdCByZWxlYXNlIHRoZQorICAgICAgICAgICAgLy8gdW5kZXJseWluZyBidWZmZXIgaXRzZWxmLgorICAgICAgICAgICAgbWFwcGVyLT5mcmVlQnVmZmVyKG1CdWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCAqZ2V0KCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlcjsgfQorICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAobUJ1ZmZlciAhPSBudWxscHRyKTsgfQorcHJpdmF0ZToKKyAgICB2b2lkICptQnVmZmVyOworfTsKKworfSAgLy8gbmFtc3BhY2UKKworYzJfc3RhdHVzX3QgR2V0SGRyTWV0YWRhdGFGcm9tR3JhbGxvYzRIYW5kbGUoCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkclN0YXRpY01ldGFkYXRhSW5mbzo6aW5wdXQ+ICpzdGF0aWNJbmZvLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvOjppbnB1dD4gKmR5bmFtaWNJbmZvKSB7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgc3A8SU1hcHBlcjQ+IG1hcHBlciA9IEdldE1hcHBlcjQoKTsKKyAgICBHcmFsbG9jNEJ1ZmZlciBidWZmZXIoaGFuZGxlKTsKKyAgICBpZiAoIW1hcHBlciB8fCAhYnVmZmVyKSB7CisgICAgICAgIC8vIEdyYWxsb2M0IG5vdCBzdXBwb3J0ZWQ7IG5vdGhpbmcgdG8gZG8KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgRXJyb3I0IG1hcHBlckVyciA9IEVycm9yNDo6Tk9ORTsKKyAgICBpZiAoc3RhdGljSW5mbykgeworICAgICAgICBBTE9HVigiR3JhYmJpbmcgc3RhdGljIEhEUiBpbmZvIGZyb20gZ3JhbGxvYzQgbWV0YWRhdGEiKTsKKyAgICAgICAgc3RhdGljSW5mby0+cmVzZXQobmV3IEMyU3RyZWFtSGRyU3RhdGljTWV0YWRhdGFJbmZvOjppbnB1dCgwdSkpOworICAgICAgICBtZW1zZXQoJigqc3RhdGljSW5mbyktPm1hc3RlcmluZywgMCwgc2l6ZW9mKCgqc3RhdGljSW5mbyktPm1hc3RlcmluZykpOworICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXhDbGwgPSAwOworICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXhGYWxsID0gMDsKKyAgICAgICAgSU1hcHBlcjQ6OmdldF9jYiBjYiA9IFsmbWFwcGVyRXJyLCBzdGF0aWNJbmZvXShFcnJvcjQgZXJyLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmdmVjKSB7CisgICAgICAgICAgICBtYXBwZXJFcnIgPSBlcnI7CisgICAgICAgICAgICBpZiAoZXJyICE9IEVycm9yNDo6Tk9ORSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpvcHRpb25hbDxTbXB0ZTIwODY+IHNtcHRlMjA4NjsKKyAgICAgICAgICAgIGdyYWxsb2M0OjpkZWNvZGVTbXB0ZTIwODYodmVjLCAmc21wdGUyMDg2KTsKKyAgICAgICAgICAgIGlmIChzbXB0ZTIwODYpIHsKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcucmVkLnggICAgPSBzbXB0ZTIwODYtPnByaW1hcnlSZWQueDsKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcucmVkLnkgICAgPSBzbXB0ZTIwODYtPnByaW1hcnlSZWQueTsKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcuZ3JlZW4ueCAgPSBzbXB0ZTIwODYtPnByaW1hcnlHcmVlbi54OworICAgICAgICAgICAgICAgICgqc3RhdGljSW5mbyktPm1hc3RlcmluZy5ncmVlbi55ICA9IHNtcHRlMjA4Ni0+cHJpbWFyeUdyZWVuLnk7CisgICAgICAgICAgICAgICAgKCpzdGF0aWNJbmZvKS0+bWFzdGVyaW5nLmJsdWUueCAgID0gc21wdGUyMDg2LT5wcmltYXJ5Qmx1ZS54OworICAgICAgICAgICAgICAgICgqc3RhdGljSW5mbyktPm1hc3RlcmluZy5ibHVlLnkgICA9IHNtcHRlMjA4Ni0+cHJpbWFyeUJsdWUueTsKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcud2hpdGUueCAgPSBzbXB0ZTIwODYtPndoaXRlUG9pbnQueDsKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcud2hpdGUueSAgPSBzbXB0ZTIwODYtPndoaXRlUG9pbnQueTsKKworICAgICAgICAgICAgICAgICgqc3RhdGljSW5mbyktPm1hc3RlcmluZy5tYXhMdW1pbmFuY2UgPSBzbXB0ZTIwODYtPm1heEx1bWluYW5jZTsKKyAgICAgICAgICAgICAgICAoKnN0YXRpY0luZm8pLT5tYXN0ZXJpbmcubWluTHVtaW5hbmNlID0gc21wdGUyMDg2LT5taW5MdW1pbmFuY2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1hcHBlckVyciA9IEVycm9yNDo6QkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbWFwcGVyLT5nZXQoYnVmZmVyLmdldCgpLCBNZXRhZGF0YVR5cGVfU21wdGUyMDg2LCBjYik7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgZXJyID0gQzJfUkVGVVNFRDsKKyAgICAgICAgfSBlbHNlIGlmIChtYXBwZXJFcnIgIT0gRXJyb3I0OjpOT05FKSB7CisgICAgICAgICAgICBlcnIgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgY2IgPSBbJm1hcHBlckVyciwgc3RhdGljSW5mb10oRXJyb3I0IGVyciwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJnZlYykgeworICAgICAgICAgICAgbWFwcGVyRXJyID0gZXJyOworICAgICAgICAgICAgaWYgKGVyciAhPSBFcnJvcjQ6Ok5PTkUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8Q3RhODYxXzM+IGN0YTg2MV8zOworICAgICAgICAgICAgZ3JhbGxvYzQ6OmRlY29kZUN0YTg2MV8zKHZlYywgJmN0YTg2MV8zKTsKKyAgICAgICAgICAgIGlmIChjdGE4NjFfMykgeworICAgICAgICAgICAgICAgICgqc3RhdGljSW5mbyktPm1heENsbCAgID0gY3RhODYxXzMtPm1heENvbnRlbnRMaWdodExldmVsOworICAgICAgICAgICAgICAgICgqc3RhdGljSW5mbyktPm1heEZhbGwgID0gY3RhODYxXzMtPm1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1hcHBlckVyciA9IEVycm9yNDo6QkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICByZXQgPSBtYXBwZXItPmdldChidWZmZXIuZ2V0KCksIE1ldGFkYXRhVHlwZV9DdGE4NjFfMywgY2IpOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVyciA9IEMyX1JFRlVTRUQ7CisgICAgICAgIH0gZWxzZSBpZiAobWFwcGVyRXJyICE9IEVycm9yNDo6Tk9ORSkgeworICAgICAgICAgICAgZXJyID0gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIGlmIChkeW5hbWljSW5mbykgeworICAgICAgICBBTE9HVigiR3JhYmJpbmcgZHluYW1pYyBIRFIgaW5mbyBmcm9tIGdyYWxsb2M0IG1ldGFkYXRhIik7CisgICAgICAgIGR5bmFtaWNJbmZvLT5yZXNldCgpOworICAgICAgICBJTWFwcGVyNDo6Z2V0X2NiIGNiID0gWyZtYXBwZXJFcnIsIGR5bmFtaWNJbmZvXShFcnJvcjQgZXJyLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmdmVjKSB7CisgICAgICAgICAgICBtYXBwZXJFcnIgPSBlcnI7CisgICAgICAgICAgICBpZiAoZXJyICE9IEVycm9yNDo6Tk9ORSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZHluYW1pY0luZm8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZHluYW1pY0luZm8gPSBDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm86OmlucHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgdmVjLnNpemUoKSwgMHUsIEMyQ29uZmlnOjpIRFJfRFlOQU1JQ19NRVRBREFUQV9UWVBFX1NNUFRFXzIwOTRfNDApOworICAgICAgICAgICAgbWVtY3B5KCgqZHluYW1pY0luZm8pLT5tLmRhdGEsIHZlYy5kYXRhKCksIHZlYy5zaXplKCkpOworICAgICAgICB9OworICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbWFwcGVyLT5nZXQoYnVmZmVyLmdldCgpLCBNZXRhZGF0YVR5cGVfU21wdGUyMDk0XzQwLCBjYik7CisgICAgICAgIGlmICghcmV0LmlzT2soKSB8fCBtYXBwZXJFcnIgIT0gRXJyb3I0OjpOT05FKSB7CisgICAgICAgICAgICBkeW5hbWljSW5mby0+cmVzZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK2MyX3N0YXR1c190IFNldEhkck1ldGFkYXRhVG9HcmFsbG9jNEhhbmRsZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtSGRyU3RhdGljTWV0YWRhdGFJbmZvOjpvdXRwdXQ+ICZzdGF0aWNJbmZvLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1IZHJEeW5hbWljTWV0YWRhdGFJbmZvOjpvdXRwdXQ+ICZkeW5hbWljSW5mbywKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgeworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIHNwPElNYXBwZXI0PiBtYXBwZXIgPSBHZXRNYXBwZXI0KCk7CisgICAgR3JhbGxvYzRCdWZmZXIgYnVmZmVyKGhhbmRsZSk7CisgICAgaWYgKCFtYXBwZXIgfHwgIWJ1ZmZlcikgeworICAgICAgICAvLyBHcmFsbG9jNCBub3Qgc3VwcG9ydGVkOyBub3RoaW5nIHRvIGRvCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGlmIChzdGF0aWNJbmZvICYmICpzdGF0aWNJbmZvKSB7CisgICAgICAgIEFMT0dWKCJTZXR0aW5nIHN0YXRpYyBIRFIgaW5mbyBhcyBncmFsbG9jNCBtZXRhZGF0YSIpOworICAgICAgICBzdGQ6Om9wdGlvbmFsPFNtcHRlMjA4Nj4gc21wdGUyMDg2ID0gU21wdGUyMDg2eworICAgICAgICAgICAge3N0YXRpY0luZm8tPm1hc3RlcmluZy5yZWQueCwgc3RhdGljSW5mby0+bWFzdGVyaW5nLnJlZC55fSwKKyAgICAgICAgICAgIHtzdGF0aWNJbmZvLT5tYXN0ZXJpbmcuZ3JlZW4ueCwgc3RhdGljSW5mby0+bWFzdGVyaW5nLmdyZWVuLnl9LAorICAgICAgICAgICAge3N0YXRpY0luZm8tPm1hc3RlcmluZy5ibHVlLngsIHN0YXRpY0luZm8tPm1hc3RlcmluZy5ibHVlLnl9LAorICAgICAgICAgICAge3N0YXRpY0luZm8tPm1hc3RlcmluZy53aGl0ZS54LCBzdGF0aWNJbmZvLT5tYXN0ZXJpbmcud2hpdGUueX0sCisgICAgICAgICAgICBzdGF0aWNJbmZvLT5tYXN0ZXJpbmcubWF4THVtaW5hbmNlLAorICAgICAgICAgICAgc3RhdGljSW5mby0+bWFzdGVyaW5nLm1pbkx1bWluYW5jZSwKKyAgICAgICAgfTsKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gdmVjOworICAgICAgICBpZiAoMC4wIDw9IHNtcHRlMjA4Ni0+cHJpbWFyeVJlZC54ICYmIHNtcHRlMjA4Ni0+cHJpbWFyeVJlZC54IDw9IDEuMAorICAgICAgICAgICAgICAgICYmIDAuMCA8PSBzbXB0ZTIwODYtPnByaW1hcnlSZWQueSAmJiBzbXB0ZTIwODYtPnByaW1hcnlSZWQueSA8PSAxLjAKKyAgICAgICAgICAgICAgICAmJiAwLjAgPD0gc21wdGUyMDg2LT5wcmltYXJ5R3JlZW4ueCAmJiBzbXB0ZTIwODYtPnByaW1hcnlHcmVlbi54IDw9IDEuMAorICAgICAgICAgICAgICAgICYmIDAuMCA8PSBzbXB0ZTIwODYtPnByaW1hcnlHcmVlbi55ICYmIHNtcHRlMjA4Ni0+cHJpbWFyeUdyZWVuLnkgPD0gMS4wCisgICAgICAgICAgICAgICAgJiYgMC4wIDw9IHNtcHRlMjA4Ni0+cHJpbWFyeUJsdWUueCAmJiBzbXB0ZTIwODYtPnByaW1hcnlCbHVlLnggPD0gMS4wCisgICAgICAgICAgICAgICAgJiYgMC4wIDw9IHNtcHRlMjA4Ni0+cHJpbWFyeUJsdWUueSAmJiBzbXB0ZTIwODYtPnByaW1hcnlCbHVlLnkgPD0gMS4wCisgICAgICAgICAgICAgICAgJiYgMC4wIDw9IHNtcHRlMjA4Ni0+d2hpdGVQb2ludC54ICYmIHNtcHRlMjA4Ni0+d2hpdGVQb2ludC54IDw9IDEuMAorICAgICAgICAgICAgICAgICYmIDAuMCA8PSBzbXB0ZTIwODYtPndoaXRlUG9pbnQueSAmJiBzbXB0ZTIwODYtPndoaXRlUG9pbnQueSA8PSAxLjAKKyAgICAgICAgICAgICAgICAmJiAwLjAgPD0gc21wdGUyMDg2LT5tYXhMdW1pbmFuY2UgJiYgMC4wIDw9IHNtcHRlMjA4Ni0+bWluTHVtaW5hbmNlCisgICAgICAgICAgICAgICAgJiYgZ3JhbGxvYzQ6OmVuY29kZVNtcHRlMjA4NihzbXB0ZTIwODYsICZ2ZWMpID09IE9LKSB7CisgICAgICAgICAgICBSZXR1cm48RXJyb3I0PiByZXQgPSBtYXBwZXItPnNldChidWZmZXIuZ2V0KCksIE1ldGFkYXRhVHlwZV9TbXB0ZTIwODYsIHZlYyk7CisgICAgICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBDMl9SRUZVU0VEOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgIT0gRXJyb3I0OjpOT05FKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0ZDo6b3B0aW9uYWw8Q3RhODYxXzM+IGN0YTg2MV8zID0gQ3RhODYxXzN7CisgICAgICAgICAgICBzdGF0aWNJbmZvLT5tYXhDbGwsCisgICAgICAgICAgICBzdGF0aWNJbmZvLT5tYXhGYWxsLAorICAgICAgICB9OworICAgICAgICBpZiAoMC4wIDw9IGN0YTg2MV8zLT5tYXhDb250ZW50TGlnaHRMZXZlbCAmJiAwLjAgPD0gY3RhODYxXzMtPm1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwKKyAgICAgICAgICAgICAgICAmJiBncmFsbG9jNDo6ZW5jb2RlQ3RhODYxXzMoY3RhODYxXzMsICZ2ZWMpID09IE9LKSB7CisgICAgICAgICAgICBSZXR1cm48RXJyb3I0PiByZXQgPSBtYXBwZXItPnNldChidWZmZXIuZ2V0KCksIE1ldGFkYXRhVHlwZV9DdGE4NjFfMywgdmVjKTsKKyAgICAgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgICAgIGVyciA9IEMyX1JFRlVTRUQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCAhPSBFcnJvcjQ6Ok5PTkUpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGR5bmFtaWNJbmZvICYmICpkeW5hbWljSW5mbyAmJiBkeW5hbWljSW5mby0+ZmxleENvdW50KCkgPiAwKSB7CisgICAgICAgIEFMT0dWKCJTZXR0aW5nIGR5bmFtaWMgSERSIGluZm8gYXMgZ3JhbGxvYzQgbWV0YWRhdGEiKTsKKyAgICAgICAgc3RkOjpvcHRpb25hbDxJTWFwcGVyNDo6TWV0YWRhdGFUeXBlPiBtZXRhZGF0YVR5cGU7CisgICAgICAgIHN3aXRjaCAoZHluYW1pY0luZm8tPm0udHlwZV8pIHsKKyAgICAgICAgY2FzZSBDMkNvbmZpZzo6SERSX0RZTkFNSUNfTUVUQURBVEFfVFlQRV9TTVBURV8yMDk0XzEwOgorICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkhEUl9EWU5BTUlDX01FVEFEQVRBX1RZUEVfU01QVEVfMjA5NF80MDoKKyAgICAgICAgICAgIG1ldGFkYXRhVHlwZSA9IE1ldGFkYXRhVHlwZV9TbXB0ZTIwOTRfNDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZXRhZGF0YVR5cGUpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNtcHRlMjA5NF80MDsKKyAgICAgICAgICAgIHNtcHRlMjA5NF80MC5yZXNpemUoZHluYW1pY0luZm8tPmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgIG1lbWNweShzbXB0ZTIwOTRfNDAuZGF0YSgpLCBkeW5hbWljSW5mby0+bS5kYXRhLCBkeW5hbWljSW5mby0+ZmxleENvdW50KCkpOworCisgICAgICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWM7CisgICAgICAgICAgICBpZiAoZ3JhbGxvYzQ6OmVuY29kZVNtcHRlMjA5NF80MCh7IHNtcHRlMjA5NF80MCB9LCAmdmVjKSA9PSBPSykgeworICAgICAgICAgICAgICAgIFJldHVybjxFcnJvcjQ+IHJldCA9IG1hcHBlci0+c2V0KGJ1ZmZlci5nZXQoKSwgKm1ldGFkYXRhVHlwZSwgdmVjKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gQzJfUkVGVVNFRDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCAhPSBFcnJvcjQ6Ok5PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmgKaW5kZXggZGM3ODhjZC4uYjAyYjA0MiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5oCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBDT0RFQzJfQlVGRkVSX0hfCiAKICNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CkBAIC0zOTEsNiArMzkyLDM2IEBACiAgICAgaW50MzJfdCBtSGVhcFNlcU51bTsKIH07CiAKKy8qKgorICogR2V0IEhEUiBtZXRhZGF0YSBmcm9tIEdyYWxsb2M0IGhhbmRsZS4KKyAqCisgKiBccGFyYW1baW5dICAgaGFuZGxlICAgICAgaGFuZGxlIG9mIHRoZSBhbGxvY2F0aW9uCisgKiBccGFyYW1bb3V0XSAgc3RhdGljSW5mbyAgSERSIHN0YXRpYyBpbmZvIHRvIGJlIGZpbGxlZC4gSWdub3JlZCBpZiBudWxsOworICogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHxoYW5kbGV8IGlzIGludmFsaWQgb3IgZG9lcyBub3QgY29udGFpbiB0aGUgbWV0YWRhdGEsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNoYXJlZF9wdHIgaXMgcmVzZXQuCisgKiBccGFyYW1bb3V0XSAgZHluYW1pY0luZm8gSERSIGR5bmFtaWMgaW5mbyB0byBiZSBmaWxsZWQuIElnbm9yZWQgaWYgbnVsbDsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB8aGFuZGxlfCBpcyBpbnZhbGlkIG9yIGRvZXMgbm90IGNvbnRhaW4gdGhlIG1ldGFkYXRhLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzaGFyZWRfcHRyIGlzIHJlc2V0LgorICogXHJldHVybiBDMl9PSyBpZiBzdWNjZXNzZnVsCisgKi8KK2MyX3N0YXR1c190IEdldEhkck1ldGFkYXRhRnJvbUdyYWxsb2M0SGFuZGxlKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHJTdGF0aWNNZXRhZGF0YUluZm86OmlucHV0PiAqc3RhdGljSW5mbywKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6aW5wdXQ+ICpkeW5hbWljSW5mbyk7CisKKy8qKgorICogU2V0IEhEUiBtZXRhZGF0YSB0byBHcmFsbG9jNCBoYW5kbGUuCisgKgorICogXHBhcmFtW2luXSAgIHN0YXRpY0luZm8gIEhEUiBzdGF0aWMgaW5mbyB0byBzZXQuIElnbm9yZWQgaWYgbnVsbCBvciBpbnZhbGlkLgorICogXHBhcmFtW2luXSAgIGR5bmFtaWNJbmZvIEhEUiBkeW5hbWljIGluZm8gdG8gc2V0LiBJZ25vcmVkIGlmIG51bGwgb3IgaW52YWxpZC4KKyAqIFxwYXJhbVtvdXRdICBoYW5kbGUgICAgICBoYW5kbGUgb2YgdGhlIGFsbG9jYXRpb24uCisgKiBccmV0dXJuIEMyX09LIGlmIHN1Y2Nlc3NmdWwKKyAqLworYzJfc3RhdHVzX3QgU2V0SGRyTWV0YWRhdGFUb0dyYWxsb2M0SGFuZGxlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1IZHJTdGF0aWNNZXRhZGF0YUluZm86Om91dHB1dD4gJnN0YXRpY0luZm8sCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlN0cmVhbUhkckR5bmFtaWNNZXRhZGF0YUluZm86Om91dHB1dD4gJmR5bmFtaWNJbmZvLAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBDT0RFQzJfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcAppbmRleCA3YzRiZmI2Li40NTNhMGQyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxPTVhfVmlkZW8uaD4KICNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KICNpbmNsdWRlIDxPTVhfQXNTdHJpbmcuaD4KKyNpbmNsdWRlIDxTdXJmYWNlRmxpbmdlclByb3BlcnRpZXMuc3lzcHJvcC5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teE9ic2VydmVyLmg+CkBAIC01NCw2ICs1NSw5IEBACiAKIHVzaW5nIFRyYWl0cyA9IEMyQ29tcG9uZW50OjpUcmFpdHM7CiAKKy8vIEhBTCBwaXhlbCBmb3JtYXQgLT4gZnJhbWV3b3JrIGNvbG9yIGZvcm1hdAordHlwZWRlZiBzdGQ6Om1hcDx1aW50MzJfdCwgaW50MzJfdD4gUGl4ZWxGb3JtYXRNYXA7CisKIG5hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKIAogYm9vbCBoYXNQcmVmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIGNvbnN0IGNoYXIqIHByZWZpeCkgewpAQCAtNjcsNiArNzEsMjYgQEAKICAgICAgICAgICAgIHMuY29tcGFyZShzLnNpemUoKSAtIHN1ZmZpeExlbiwgc3VmZml4TGVuLCBzdWZmaXgpID09IDA7CiB9CiAKK3N0ZDo6b3B0aW9uYWw8aW50MzJfdD4gZmluZEZyYW1ld29ya0NvbG9yRm9ybWF0KAorICAgICAgICBjb25zdCBDMkZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yU3RydWN0ICZkZXNjKSB7CisgICAgc3dpdGNoIChkZXNjLmJpdERlcHRoKSB7CisgICAgICAgIGNhc2UgOHU6CisgICAgICAgICAgICBpZiAoZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6UExBTkFSX1BBQ0tFRAorICAgICAgICAgICAgICAgICAgICB8fCBkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpTRU1JUExBTkFSX1BBQ0tFRCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwdToKKyAgICAgICAgICAgIGlmIChkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpTRU1JUExBTkFSX1BBQ0tFRCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDT0xPUl9Gb3JtYXRZVVZQMDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKK30KKwogLy8gcmV0dXJucyB0cnVlIGlmIGNvbXBvbmVudCBhZHZlcnRpc2VkIHN1cHBvcnRlZCBwcm9maWxlIGxldmVsKHMpCiBib29sIGFkZFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4gaW50ZiwKQEAgLTk2LDkgKzEyMCwxMiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLy8gZGV0ZXJtaW5lIGlmIGNvZGVjIHN1cHBvcnRzIEhEUgorICAgIC8vIGRldGVybWluZSBpZiBjb2RlYyBzdXBwb3J0cyBIRFI7IGltcGx5IDEwLWJpdCBzdXBwb3J0CiAgICAgYm9vbCBzdXBwb3J0c0hkciA9IGZhbHNlOworICAgIC8vIGRldGVybWluZSBpZiBjb2RlYyBzdXBwb3J0cyBIRFIxMFBsdXM7IGltcGx5IDEwLWJpdCBzdXBwb3J0CiAgICAgYm9vbCBzdXBwb3J0c0hkcjEwUGx1cyA9IGZhbHNlOworICAgIC8vIGRldGVybWluZSBpZiBjb2RlYyBzdXBwb3J0cyAxMC1iaXQgZm9ybWF0CisgICAgYm9vbCBzdXBwb3J0czEwQml0ID0gZmFsc2U7CiAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBwYXJhbURlc2NzOwogICAgIGMyX3N0YXR1c190IGVycjEgPSBpbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcygmcGFyYW1EZXNjcyk7CkBAIC0xMTAsNyArMTM3LDkgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAodHlwZS5jb3JlSW5kZXgoKSkgewotICAgICAgICAgICAgY2FzZSBDMlN0cmVhbUhkcjEwUGx1c0luZm86OkNPUkVfSU5ERVg6CisgICAgICAgICAgICBjYXNlIEMyU3RyZWFtSGRyRHluYW1pY01ldGFkYXRhSW5mbzo6Q09SRV9JTkRFWDoKKyAgICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgICAgICBjYXNlIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6Q09SRV9JTkRFWDogIC8vIHdpbGwgYmUgZGVwcmVjYXRlZAogICAgICAgICAgICAgICAgIHN1cHBvcnRzSGRyMTBQbHVzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpDT1JFX0lOREVYOgpAQCAtMTIyLDkgKzE1MSwyMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gRm9yIFZQOS9BVjEsIHRoZSBzdGF0aWMgaW5mbyBpcyBhbHdheXMgcHJvcGFnYXRlZCBieSBmcmFtZXdvcmsuCisgICAgLy8gVlA5IGRvZXMgbm90IHN1cHBvcnQgSERSIG1ldGFkYXRhIGluIHRoZSBiaXRzdHJlYW0gYW5kIHN0YXRpYyBtZXRhZGF0YQorICAgIC8vIGNhbiBhbHdheXMgYmUgY2FycmllZCBieSB0aGUgZnJhbWV3b3JrLiAoVGhlIGZyYW1ld29yayBkb2VzIG5vdCBwcm9wYWdhdGUKKyAgICAvLyBkeW5hbWljIG1ldGFkYXRhIGFzIHRoYXQgbmVlZHMgdG8gYmUgZnJhbWUgYWNjdXJhdGUuKQogICAgIHN1cHBvcnRzSGRyIHw9IChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA5KTsKLSAgICBzdXBwb3J0c0hkciB8PSAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0FWMSk7CisKKyAgICAvLyBIRFIgc3VwcG9ydCBpbXBsaWVzIDEwLWJpdCBzdXBwb3J0LiBBVjEgY29kZWNzIGFyZSBhbHNvIHJlcXVpcmVkIHRvCisgICAgLy8gc3VwcG9ydCAxMC1iaXQgcGVyIENERC4KKyAgICAvLyBUT0RPOiBkaXJlY3RseSBjaGVjayB0aGlzIGZyb20gdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKKyAgICBzdXBwb3J0czEwQml0ID0gKHN1cHBvcnRzSGRyIHx8IHN1cHBvcnRzSGRyMTBQbHVzKSB8fCAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0FWMSk7CisKKyAgICAvLyBJZiB0aGUgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBIRFIgZGlzcGxheSwgdGhlbiBubyBjb2RlYyBvbiB0aGUgZGV2aWNlCisgICAgLy8gY2FuIGFkdmVydGlzZSBzdXBwb3J0IGZvciBIRFIgcHJvZmlsZXMuCisgICAgLy8gRGVmYXVsdCB0byB0cnVlIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICBhdXRvIHJldCA9IHN5c3Byb3A6OlN1cmZhY2VGbGluZ2VyUHJvcGVydGllczo6aGFzX0hEUl9kaXNwbGF5KCk7CisgICAgYm9vbCBoYXNIRFJEaXNwbGF5ID0gcmV0Lmhhc192YWx1ZSgpID8gKnJldCA6IHRydWU7CiAKICAgICBib29sIGFkZGVkID0gZmFsc2U7CiAKQEAgLTE1MSw4ICsxOTIsOCBAQAogICAgICAgICBpZiAobWFwcGVyICYmIG1hcHBlci0+bWFwUHJvZmlsZShwbC5wcm9maWxlLCAmc2RrUHJvZmlsZSkKICAgICAgICAgICAgICAgICAmJiBtYXBwZXItPm1hcExldmVsKHBsLmxldmVsLCAmc2RrTGV2ZWwpKSB7CiAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoKHVpbnQzMl90KXNka1Byb2ZpbGUsICh1aW50MzJfdClzZGtMZXZlbCk7Ci0gICAgICAgICAgICAvLyBhbHNvIGxpc3QgSERSIHByb2ZpbGVzIGlmIGNvbXBvbmVudCBzdXBwb3J0cyBIRFIKLSAgICAgICAgICAgIGlmIChzdXBwb3J0c0hkcikgeworICAgICAgICAgICAgLy8gYWxzbyBsaXN0IEhEUiBwcm9maWxlcyBpZiBjb21wb25lbnQgc3VwcG9ydHMgSERSIGFuZCBkZXZpY2UgaGFzIEhEUiBkaXNwbGF5CisgICAgICAgICAgICBpZiAoc3VwcG9ydHNIZHIgJiYgaGFzSERSRGlzcGxheSkgewogICAgICAgICAgICAgICAgIGF1dG8gaGRyTWFwcGVyID0gQzJNYXBwZXI6OkdldEhkclByb2ZpbGVMZXZlbE1hcHBlcih0cmFpdC5tZWRpYVR5cGUpOwogICAgICAgICAgICAgICAgIGlmIChoZHJNYXBwZXIgJiYgaGRyTWFwcGVyLT5tYXBQcm9maWxlKHBsLnByb2ZpbGUsICZzZGtQcm9maWxlKSkgewogICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoKHVpbnQzMl90KXNka1Byb2ZpbGUsICh1aW50MzJfdClzZGtMZXZlbCk7CkBAIC0xNjUsNiArMjA2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3VwcG9ydHMxMEJpdCkgeworICAgICAgICAgICAgICAgIGF1dG8gYml0bmVzc01hcHBlciA9IEMyTWFwcGVyOjpHZXRCaXREZXB0aFByb2ZpbGVMZXZlbE1hcHBlcih0cmFpdC5tZWRpYVR5cGUsIDEwKTsKKyAgICAgICAgICAgICAgICBpZiAoYml0bmVzc01hcHBlciAmJiBiaXRuZXNzTWFwcGVyLT5tYXBQcm9maWxlKHBsLnByb2ZpbGUsICZzZGtQcm9maWxlKSkgeworICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoKHVpbnQzMl90KXNka1Byb2ZpbGUsICh1aW50MzJfdClzZGtMZXZlbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKCFtYXBwZXIpIHsKICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChwbC5wcm9maWxlLCBwbC5sZXZlbCk7CiAgICAgICAgIH0KQEAgLTE5OCwyNyArMjQ1LDc4IEBACiB2b2lkIGFkZFN1cHBvcnRlZENvbG9yRm9ybWF0cygKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPiBpbnRmLAogICAgICAgICBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyICpjYXBzLAotICAgICAgICBjb25zdCBUcmFpdHMmIHRyYWl0LCBjb25zdCBzdGQ6OnN0cmluZyAmbWVkaWFUeXBlKSB7Ci0gICAgKHZvaWQpaW50ZjsKLQorICAgICAgICBjb25zdCBUcmFpdHMmIHRyYWl0LCBjb25zdCBzdGQ6OnN0cmluZyAmbWVkaWFUeXBlLAorICAgICAgICBjb25zdCBQaXhlbEZvcm1hdE1hcCAmcGl4ZWxGb3JtYXRNYXApIHsKICAgICAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIGludGYoKSBhcyB3ZWxsLCBidXQgaG93IGRvIHdlIG1hcCB0aGVtIHRvCiAgICAgLy8gTWVkaWFDb2RlYyBjb2xvciBmb3JtYXRzPwogICAgIGJvb2wgZW5jb2RlciA9IHRyYWl0LmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKICAgICBpZiAobWVkaWFUeXBlLmZpbmQoInZpZGVvIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MKICAgICAgICAgICAgIHx8IG1lZGlhVHlwZS5maW5kKCJpbWFnZSIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBxdWVyeTsKKyAgICAgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgICAgIEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjppbnB1dCBwaXhlbEZvcm1hdDsKKyAgICAgICAgICAgIHF1ZXJ5LnB1c2hfYmFjayhDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGQ6Ok1ha2UocGl4ZWxGb3JtYXQsIHBpeGVsRm9ybWF0LnZhbHVlKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCBwaXhlbEZvcm1hdDsKKyAgICAgICAgICAgIHF1ZXJ5LnB1c2hfYmFjayhDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGQ6Ok1ha2UocGl4ZWxGb3JtYXQsIHBpeGVsRm9ybWF0LnZhbHVlKSkpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6bGlzdDxpbnQzMl90PiBzdXBwb3J0ZWRDb2xvckZvcm1hdHM7CisgICAgICAgIGlmIChpbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhxdWVyeSwgQzJfRE9OVF9CTE9DSykgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGlmIChxdWVyeVswXS5zdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZmc3YgPSBxdWVyeVswXS52YWx1ZXM7CisgICAgICAgICAgICAgICAgaWYgKGZzdi50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEMyVmFsdWU6OlByaW1pdGl2ZSB2YWx1ZSA6IGZzdi52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBwaXhlbEZvcm1hdE1hcC5maW5kKHZhbHVlLnUzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgIT0gcGl4ZWxGb3JtYXRNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGl0MiA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZENvbG9yRm9ybWF0cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkQ29sb3JGb3JtYXRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0MiA9PSBzdXBwb3J0ZWRDb2xvckZvcm1hdHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkQ29sb3JGb3JtYXRzLnB1c2hfYmFjayhpdC0+c2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXV0byBhZGREZWZhdWx0Q29sb3JGb3JtYXQgPSBbY2FwcywgJnN1cHBvcnRlZENvbG9yRm9ybWF0c10oaW50MzJfdCBjb2xvckZvcm1hdCkgeworICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoY29sb3JGb3JtYXQpOworICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkQ29sb3JGb3JtYXRzLmJlZ2luKCksIHN1cHBvcnRlZENvbG9yRm9ybWF0cy5lbmQoKSwgY29sb3JGb3JtYXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IHN1cHBvcnRlZENvbG9yRm9ybWF0cy5lbmQoKSkgeworICAgICAgICAgICAgICAgIHN1cHBvcnRlZENvbG9yRm9ybWF0cy5lcmFzZShpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLy8gVGhlIGNvbG9yIGZvcm1hdCBpcyBvcmRlcmVkIGJ5IHByZWZlcmVuY2UuIFRoZSBpbnRlbnRpb24gaGVyZSBpcyB0byBhZHZlcnRpc2U6CisgICAgICAgIC8vICAgYzIuYW5kcm9pZC4qIGNvZGVjczogWVVWNDIwcywgU3VyZmFjZSwgPHRoZSByZXN0PgorICAgICAgICAvLyAgIGFsbCBvdGhlciBjb2RlY3M6ICAgIFN1cmZhY2UsIFlVVjQyMHMsIDx0aGUgcmVzdD4KKyAgICAgICAgLy8gVE9ETzogZ2V0IHRoaXMgcHJlZmVyZW5jZSB2aWEgQ29kZWMyIEFQSQorCiAgICAgICAgIC8vIHZlbmRvciB2aWRlbyBjb2RlY3MgcHJlZmVyIG9wYXF1ZSBmb3JtYXQKICAgICAgICAgaWYgKHRyYWl0Lm5hbWUuZmluZCgiYW5kcm9pZCIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRTdXJmYWNlKTsKKyAgICAgICAgICAgIGFkZERlZmF1bHRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRTdXJmYWNlKTsKICAgICAgICAgfQotICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSk7Ci0gICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7Ci0gICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpOwotICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXIpOwotICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyKTsKLSAgICAgICAgLy8gZnJhbWV3b3JrIHZpZGVvIGVuY29kZXJzIG11c3Qgc3VwcG9ydCBzdXJmYWNlIGZvcm1hdCwgdGhvdWdoIGl0IGlzIHVuY2xlYXIKLSAgICAgICAgLy8gdGhhdCB0aGV5IHdpbGwgYmUgYWJsZSB0byBtYXAgaXQgaWYgaXQgaXMgb3BhcXVlCi0gICAgICAgIGlmIChlbmNvZGVyICYmIHRyYWl0Lm5hbWUuZmluZCgiYW5kcm9pZCIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRTdXJmYWNlKTsKKyAgICAgICAgYWRkRGVmYXVsdENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlKTsKKyAgICAgICAgYWRkRGVmYXVsdENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7CisgICAgICAgIGFkZERlZmF1bHRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKTsKKyAgICAgICAgYWRkRGVmYXVsdENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcik7CisgICAgICAgIGFkZERlZmF1bHRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyKTsKKyAgICAgICAgLy8gQW5kcm9pZCB2aWRlbyBjb2RlY3MgcHJlZmVyIENQVS1yZWFkYWJsZSBmb3JtYXRzCisgICAgICAgIGlmICh0cmFpdC5uYW1lLmZpbmQoImFuZHJvaWQiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgYWRkRGVmYXVsdENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFN1cmZhY2UpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrVmVuZG9yU2RrVmVyc2lvbiA9IDo6YW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoCisgICAgICAgICAgICAgICAgInJvLnZlbmRvci5idWlsZC52ZXJzaW9uLnNkayIsIGFuZHJvaWRfZ2V0X2RldmljZV9hcGlfbGV2ZWwoKSk7CisgICAgICAgIGlmIChrVmVuZG9yU2RrVmVyc2lvbiA+PSBfX0FORFJPSURfQVBJX1RfXykgeworICAgICAgICAgICAgZm9yIChpbnQzMl90IGNvbG9yRm9ybWF0IDogc3VwcG9ydGVkQ29sb3JGb3JtYXRzKSB7CisgICAgICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoY29sb3JGb3JtYXQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpAQCAtNDEwLDYgKzUwOCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUGl4ZWxGb3JtYXRNYXA+IG5hbWVUb1BpeGVsRm9ybWF0TWFwOwogICAgIGZvciAoY29uc3QgVHJhaXRzJiB0cmFpdCA6IHRyYWl0cykgewogICAgICAgICBDMkNvbXBvbmVudDo6cmFua190IHJhbmsgPSB0cmFpdC5yYW5rOwogCkBAIC00MjMsOCArNTIyLDkgQEAKICAgICAgICAgbmFtZUFuZEFsaWFzZXMuaW5zZXJ0KG5hbWVBbmRBbGlhc2VzLmJlZ2luKCksIHRyYWl0Lm5hbWUpOwogICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lT3JBbGlhcyA6IG5hbWVBbmRBbGlhc2VzKSB7CiAgICAgICAgICAgICBib29sIGlzQWxpYXMgPSB0cmFpdC5uYW1lICE9IG5hbWVPckFsaWFzOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY2xpZW50OwogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPiBpbnRmID0KLSAgICAgICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUludGVyZmFjZUJ5TmFtZShuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUludGVyZmFjZUJ5TmFtZShuYW1lT3JBbGlhcy5jX3N0cigpLCAmY2xpZW50KTsKICAgICAgICAgICAgIGlmICghaW50ZikgewogICAgICAgICAgICAgICAgIEFMT0dEKCJjb3VsZCBub3QgY3JlYXRlIGludGVyZmFjZSBmb3IgJXMnJXMnIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWxpYXMgPyAiYWxpYXMgIiA6ICIiLApAQCAtNjE4LDcgKzcxOCw0MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKFZQOFByb2ZpbGVNYWluLCBWUDhMZXZlbF9WZXJzaW9uMCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkU3VwcG9ydGVkQ29sb3JGb3JtYXRzKGludGYsIGNhcHMuZ2V0KCksIHRyYWl0LCBtZWRpYVR5cGUpOworCisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG5hbWVUb1BpeGVsRm9ybWF0TWFwLmZpbmQoY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoaXQgPT0gbmFtZVRvUGl4ZWxGb3JtYXRNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBuYW1lVG9QaXhlbEZvcm1hdE1hcC50cnlfZW1wbGFjZShjbGllbnQtPmdldFNlcnZpY2VOYW1lKCkpLmZpcnN0OworICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdE1hcCAmcGl4ZWxGb3JtYXRNYXAgPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdE1hcFtIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODhdID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0TWFwW0hBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfUDAxMF0gICAgPSBDT0xPUl9Gb3JtYXRZVVZQMDEwOworICAgICAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdE1hcFtIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMl0gID0gQ09MT1JfRm9ybWF0MzJiaXRBQkdSMjEwMTAxMDsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxGb3JtYXRNYXBbSEFMX1BJWEVMX0ZPUk1BVF9SR0JBX0ZQMTZdICAgICA9IENPTE9SX0Zvcm1hdDY0Yml0QUJHUkZsb2F0OworCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0b3JlRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzSW5mbz4gcGl4ZWxGb3JtYXRJbmZvOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnQtPnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0MyU3RvcmVGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnNJbmZvOjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhcFBhcmFtcykgPT0gQzJfT0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBoZWFwUGFyYW1zLnNpemUoKSA9PSAxdSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxGb3JtYXRJbmZvLnJlc2V0KEMyU3RvcmVGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnNJbmZvOjpGcm9tKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwUGFyYW1zWzBdLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbEZvcm1hdEluZm8gJiYgKnBpeGVsRm9ybWF0SW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaXhlbEZvcm1hdEluZm8tPmZsZXhDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yU3RydWN0ICZkZXNjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxGb3JtYXRJbmZvLT5tLnZhbHVlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPGludDMyX3Q+IGNvbG9yRm9ybWF0ID0gZmluZEZyYW1ld29ya0NvbG9yRm9ybWF0KGRlc2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdE1hcFtkZXNjLnBpeGVsRm9ybWF0XSA9ICpjb2xvckZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkU3VwcG9ydGVkQ29sb3JGb3JtYXRzKAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZiwgY2Fwcy5nZXQoKSwgdHJhaXQsIG1lZGlhVHlwZSwgaXQtPnNlY29uZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vRnJhbWVSZWFzc2VtYmxlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vRnJhbWVSZWFzc2VtYmxlci5jcHAKaW5kZXggYWYwNTRjNy4uY2I4YjZhYiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0ZyYW1lUmVhc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9GcmFtZVJlYXNzZW1ibGVyLmNwcApAQCAtODgsOCArODgsNyBAQAogICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAogICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICppdGVtcykgewogICAgIGludDY0X3QgdGltZVVzOwotICAgIGlmIChidWZmZXItPnNpemUoKSA9PSAwdQotICAgICAgICAgICAgfHwgIWJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7CisgICAgaWYgKCFidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgewogICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icAppbmRleCA5MmYzNzU0Li4yNDZlNTYzIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icApAQCAtMjMsOCArMjMsOCBAQAogICAgICAgICAibGliY29kZWMyLWludGVybmFsLWRlZmF1bHRzIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi9zZnBsdWdpbiIsCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY19pbnRlcm5hbF9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKQEAgLTYwLDEzICs2MCwxMCBAQAogICAgICAgICAiTWVkaWFDb2RlY19zYW5pdHlfdGVzdC5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL3NmcGx1Z2luIiwKLSAgICBdLAotCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhZHJtX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAorICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX2ludGVybmFsX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0NDb2RlY0J1ZmZlcnNfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQnVmZmVyc190ZXN0LmNwcAppbmRleCA0MWU0ZmZmLi5hNDcxMjkxIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQnVmZmVyc190ZXN0LmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQnVmZmVyc190ZXN0LmNwcApAQCAtODYxLDQgKzg2MSw1NyBAQAogICAgICAgICAgICAgICAgICAgICArIHN0ZDo6dG9fc3RyaW5nKHN0ZDo6Z2V0PDM+KGluZm8ucGFyYW0pKTsKICAgICAgICAgfSk7CiAKK1RFU1QoTGluZWFyT3V0cHV0QnVmZmVyc1Rlc3QsIFBjbUNvbnZlcnRGb3JtYXQpIHsKKyAgICAvLyBQcmVwYXJlIExpbmVhck91dHB1dEJ1ZmZlcnMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGluZWFyT3V0cHV0QnVmZmVycz4gYnVmZmVycyA9CisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8TGluZWFyT3V0cHV0QnVmZmVycz4oInRlc3QiKTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0e25ldyBBTWVzc2FnZX07CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ0hBTk5FTF9DT1VOVCwgMSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfU0FNUExFX1JBVEUsIDgwMDApOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX1BDTV9FTkNPRElORywga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fY29uZmlnLXBjbS1lbmNvZGluZyIsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIGZvcm1hdC0+c2V0SW50MzIoImFuZHJvaWQuX2NvZGVjLXBjbS1lbmNvZGluZyIsIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQpOworICAgIGJ1ZmZlcnMtPnNldEZvcm1hdChmb3JtYXQpOworCisgICAgLy8gUHJlcGFyZSBhIGxpbmVhciBDMkJ1ZmZlcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICBBU1NFUlRfRVEoT0ssIEdldENvZGVjMkJsb2NrUG9vbChDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSLCBudWxscHRyLCAmcG9vbCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEFTU0VSVF9FUShPSywgcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIDEwMjQsIEMyTWVtb3J5VXNhZ2V7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sICZibG9jaykpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXIgPQorICAgICAgICBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLT5zaGFyZSgwLCAxMDI0LCBDMkZlbmNlKCkpKTsKKworICAgIC8vIFRlc3QgcmVndWxhciBidWZmZXIgY29udmVydAorICAgIHNpemVfdCBpbmRleDsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgQVNTRVJUX0VRKE9LLCBidWZmZXJzLT5yZWdpc3RlckJ1ZmZlcihjMkJ1ZmZlciwgJmluZGV4LCAmY2xpZW50QnVmZmVyKSk7CisgICAgaW50MzJfdCBwY21FbmNvZGluZyA9IDA7CisgICAgQVNTRVJUX1RSVUUoY2xpZW50QnVmZmVyLT5mb3JtYXQoKS0+ZmluZEludDMyKEtFWV9QQ01fRU5DT0RJTkcsICZwY21FbmNvZGluZykpOworICAgIEVYUEVDVF9FUShrQXVkaW9FbmNvZGluZ1BjbTE2Yml0LCBwY21FbmNvZGluZyk7CisgICAgQVNTRVJUX1RSVUUoYnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihjbGllbnRCdWZmZXIsICZjMkJ1ZmZlcikpOworCisgICAgLy8gVGVzdCBudWxsIGJ1ZmZlciBjb252ZXJ0CisgICAgQVNTRVJUX0VRKE9LLCBidWZmZXJzLT5yZWdpc3RlckJ1ZmZlcihudWxscHRyLCAmaW5kZXgsICZjbGllbnRCdWZmZXIpKTsKKyAgICBBU1NFUlRfVFJVRShjbGllbnRCdWZmZXItPmZvcm1hdCgpLT5maW5kSW50MzIoS0VZX1BDTV9FTkNPRElORywgJnBjbUVuY29kaW5nKSk7CisgICAgRVhQRUNUX0VRKGtBdWRpb0VuY29kaW5nUGNtMTZiaXQsIHBjbUVuY29kaW5nKTsKKyAgICBBU1NFUlRfVFJVRShidWZmZXJzLT5yZWxlYXNlQnVmZmVyKGNsaWVudEJ1ZmZlciwgJmMyQnVmZmVyKSk7CisKKyAgICAvLyBEbyB0aGUgc2FtZSB0ZXN0IGluIHRoZSBhcnJheSBtb2RlCisgICAgc3RkOjpzaGFyZWRfcHRyPE91dHB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkgPSBidWZmZXJzLT50b0FycmF5TW9kZSg4KTsKKworICAgIC8vIFRlc3QgcmVndWxhciBidWZmZXIgY29udmVydAorICAgIEFTU0VSVF9FUShPSywgYnVmZmVycy0+cmVnaXN0ZXJCdWZmZXIoYzJCdWZmZXIsICZpbmRleCwgJmNsaWVudEJ1ZmZlcikpOworICAgIEFTU0VSVF9UUlVFKGNsaWVudEJ1ZmZlci0+Zm9ybWF0KCktPmZpbmRJbnQzMihLRVlfUENNX0VOQ09ESU5HLCAmcGNtRW5jb2RpbmcpKTsKKyAgICBFWFBFQ1RfRVEoa0F1ZGlvRW5jb2RpbmdQY20xNmJpdCwgcGNtRW5jb2RpbmcpOworICAgIEFTU0VSVF9UUlVFKGJ1ZmZlcnMtPnJlbGVhc2VCdWZmZXIoY2xpZW50QnVmZmVyLCAmYzJCdWZmZXIpKTsKKworICAgIC8vIFRlc3QgbnVsbCBidWZmZXIgY29udmVydAorICAgIEFTU0VSVF9FUShPSywgYnVmZmVycy0+cmVnaXN0ZXJCdWZmZXIobnVsbHB0ciwgJmluZGV4LCAmY2xpZW50QnVmZmVyKSk7CisgICAgQVNTRVJUX1RSVUUoY2xpZW50QnVmZmVyLT5mb3JtYXQoKS0+ZmluZEludDMyKEtFWV9QQ01fRU5DT0RJTkcsICZwY21FbmNvZGluZykpOworICAgIEVYUEVDVF9FUShrQXVkaW9FbmNvZGluZ1BjbTE2Yml0LCBwY21FbmNvZGluZyk7CisgICAgQVNTRVJUX1RSVUUoYnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihjbGllbnRCdWZmZXIsICZjMkJ1ZmZlcikpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQ29uZmlnX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0NDb2RlY0NvbmZpZ190ZXN0LmNwcAppbmRleCA3YzY2MGRjLi4zNjE1Mjg5IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQ29uZmlnX3Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9DQ29kZWNDb25maWdfdGVzdC5jcHAKQEAgLTIyNCw2ICsyMjQsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weTxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQsIEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0Qml0cmF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRQcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX1VOVVNFRCwgTEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtT3V0cHV0UHJvZmlsZUxldmVsLCBwcm9maWxlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1PdXRwdXRQcm9maWxlTGV2ZWwsIGxldmVsKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFRPRE86IG1vcmUgU0RLIHBhcmFtcwpAQCAtMjQxLDYgKzI1Miw4IEBACiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0PiBtUGl4ZWxBc3BlY3RSYXRpbzsKICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUlucHV0Qml0cmF0ZTsKICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1PdXRwdXRCaXRyYXRlOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1JbnB1dFByb2ZpbGVMZXZlbDsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbU91dHB1dFByb2ZpbGVMZXZlbDsKIAogICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICAgICAgICAgIHN0YXRpYyBDMlIgU2V0dGVyKGJvb2wsIEMyUDxUPiAmKSB7CkBAIC01NzYsNCArNTg5LDUxIEBACiAgICAgICAgICAgICA8PCAibU91dHB1dEZvcm1hdCA9ICIgPDwgbUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCk7CiB9CiAKK3R5cGVkZWYgc3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgQzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gSGRyUHJvZmlsZXNQYXJhbXM7CisKK2NsYXNzIEhkclByb2ZpbGVzVGVzdAorICAgIDogcHVibGljIENDb2RlY0NvbmZpZ1Rlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8SGRyUHJvZmlsZXNQYXJhbXM+IHsKK307CisKK1RFU1RfUChIZHJQcm9maWxlc1Rlc3QsIFNldEZyb21TZGspIHsKKyAgICBIZHJQcm9maWxlc1BhcmFtcyBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgIHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSA9IHN0ZDo6Z2V0PDA+KHBhcmFtcyk7CisgICAgQzJDb25maWc6OnByb2ZpbGVfdCBjMlByb2ZpbGUgPSBzdGQ6OmdldDwxPihwYXJhbXMpOworICAgIGludDMyX3Qgc2RrUHJvZmlsZSA9IHN0ZDo6Z2V0PDI+KHBhcmFtcyk7CisKKyAgICBpbml0KEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIsIG1lZGlhVHlwZS5jX3N0cigpKTsKKworICAgIEFTU0VSVF9FUShPSywgbUNvbmZpZy5pbml0aWFsaXplKG1SZWZsZWN0b3IsIG1Db25maWd1cmFibGUpKTsKKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXR7bmV3IEFNZXNzYWdlfTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9QUk9GSUxFLCBzZGtQcm9maWxlKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gY29uZmlnVXBkYXRlOworICAgIEFTU0VSVF9FUShPSywgbUNvbmZpZy5nZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICAgICAgbUNvbmZpZ3VyYWJsZSwgZm9ybWF0LCBEOjpBTEwsIEMyX01BWV9CTE9DSywgJmNvbmZpZ1VwZGF0ZSkpOworCisgICAgQVNTRVJUX0VRKDF1LCBjb25maWdVcGRhdGUuc2l6ZSgpKTsKKyAgICBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0ICpwbCA9CisgICAgICAgIEZpbmRQYXJhbTxzdGQ6OnJlbW92ZV9wb2ludGVyPGRlY2x0eXBlKHBsKT46OnR5cGU+KGNvbmZpZ1VwZGF0ZSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIHBsKTsKKyAgICBBU1NFUlRfRVEoYzJQcm9maWxlLCBwbC0+cHJvZmlsZSk7Cit9CisKK0hkclByb2ZpbGVzUGFyYW1zIGtIZHJQcm9maWxlc1BhcmFtc1tdID0geworICAgIHN0ZDo6bWFrZV90dXBsZShNSU1FVFlQRV9WSURFT19IRVZDLCBQUk9GSUxFX0hFVkNfTUFJTl8xMCwgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMCksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX0hFVkMsIFBST0ZJTEVfSEVWQ19NQUlOXzEwLCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwUGx1cyksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX1ZQOSwgIFBST0ZJTEVfVlA5XzIsICAgICAgICBWUDlQcm9maWxlMkhEUiksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX1ZQOSwgIFBST0ZJTEVfVlA5XzIsICAgICAgICBWUDlQcm9maWxlMkhEUjEwUGx1cyksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX1ZQOSwgIFBST0ZJTEVfVlA5XzMsICAgICAgICBWUDlQcm9maWxlM0hEUiksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX1ZQOSwgIFBST0ZJTEVfVlA5XzMsICAgICAgICBWUDlQcm9maWxlM0hEUjEwUGx1cyksCisgICAgc3RkOjptYWtlX3R1cGxlKE1JTUVUWVBFX1ZJREVPX0FWMSwgIFBST0ZJTEVfQVYxXzAsICAgICAgICBBVjFQcm9maWxlTWFpbjEwSERSMTApLAorICAgIHN0ZDo6bWFrZV90dXBsZShNSU1FVFlQRV9WSURFT19BVjEsICBQUk9GSUxFX0FWMV8wLCAgICAgICAgQVYxUHJvZmlsZU1haW4xMEhEUjEwUGx1cyksCit9OworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIENDb2RlY0NvbmZpZywKKyAgICAgICAgSGRyUHJvZmlsZXNUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKGtIZHJQcm9maWxlc1BhcmFtcykpOworCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvRnJhbWVSZWFzc2VtYmxlcl90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9GcmFtZVJlYXNzZW1ibGVyX3Rlc3QuY3BwCmluZGV4IDY3MzhlZTcuLjBiZTkzNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9GcmFtZVJlYXNzZW1ibGVyX3Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9GcmFtZVJlYXNzZW1ibGVyX3Rlc3QuY3BwCkBAIC01Myw3ICs1Myw4IEBACiAgICAgICAgICAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgZW5jb2RpbmcsCiAgICAgICAgICAgICBzaXplX3QgaW5wdXRGcmFtZVNpemVJbkJ5dGVzLAogICAgICAgICAgICAgc2l6ZV90IGNvdW50LAotICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkT3V0cHV0U2l6ZSkgeworICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkT3V0cHV0U2l6ZSwKKyAgICAgICAgICAgIGJvb2wgc2VwYXJhdGVFb3MpIHsKICAgICAgICAgRnJhbWVSZWFzc2VtYmxlciBmcmFtZVJlYXNzZW1ibGVyOwogICAgICAgICBmcmFtZVJlYXNzZW1ibGVyLmluaXQoCiAgICAgICAgICAgICAgICAgbVBvb2wsCkBAIC02Nyw3ICs2OCw3IEBACiAKICAgICAgICAgc2l6ZV90IGlucHV0SW5kZXggPSAwLCBvdXRwdXRJbmRleCA9IDA7CiAgICAgICAgIHNpemVfdCBleHBlY3RDb3VudCA9IDA7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50ICsgKHNlcGFyYXRlRW9zID8gMSA6IDApOyArK2kpIHsKICAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlciA9IG5ldyBNZWRpYUNvZGVjQnVmZmVyKAogICAgICAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2UsIG5ldyBBQnVmZmVyKGlucHV0RnJhbWVTaXplSW5CeXRlcykpOwogICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBpbnB1dEZyYW1lU2l6ZUluQnl0ZXMpOwpAQCAtNzcsOCArNzgsMTIgQEAKICAgICAgICAgICAgIGlmIChpID09IGNvdW50IC0gMSkgewogICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZW9zIiwgMSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGlucHV0RnJhbWVTaXplSW5CeXRlczsgKytqLCArK2lucHV0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICBidWZmZXItPmJhc2UoKVtqXSA9IChpbnB1dEluZGV4ICYgMHhGRik7CisgICAgICAgICAgICBpZiAoaSA9PSBjb3VudCAmJiBzZXBhcmF0ZUVvcykgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5wdXRGcmFtZVNpemVJbkJ5dGVzOyArK2osICsraW5wdXRJbmRleCkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXItPmJhc2UoKVtqXSA9IChpbnB1dEluZGV4ICYgMHhGRik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKICAgICAgICAgICAgIEFTU0VSVF9FUShDMl9PSywgZnJhbWVSZWFzc2VtYmxlci5wcm9jZXNzKGJ1ZmZlciwgJml0ZW1zKSk7CkBAIC0xMDUsNyArMTEwLDggQEAKICAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZW5jb2RlckZyYW1lU2l6ZSAqIEJ5dGVzUGVyU2FtcGxlKGVuY29kaW5nKSwgdmlldy5jYXBhY2l0eSgpKTsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHZpZXcuY2FwYWNpdHkoKTsgKytqLCArK291dHB1dEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKG91dHB1dEluZGV4IDwgaW5wdXRJbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpbnB1dEluZGV4ID09IGlucHV0RnJhbWVTaXplSW5CeXRlcyAqIGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaW5wdXRJbmRleCA9PSBpbnB1dEZyYW1lU2l6ZUluQnl0ZXMgKiBjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnB1dEluZGV4ID0gIiA8PCBpbnB1dEluZGV4IDw8ICIgb3V0cHV0SW5kZXggPSAiIDw8IG91dHB1dEluZGV4OwogICAgICAgICAgICAgICAgICAgICB1aW50OF90IGV4cGVjdGVkID0gb3V0cHV0SW5kZXggPCBpbnB1dEluZGV4ID8gKG91dHB1dEluZGV4ICYgMHhGRikgOiAwOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0Q291bnQgPCAxMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgKytleHBlY3RDb3VudDsKQEAgLTEzNywyMDQgKzE0MywyMzkgQEAKIC8vIFB1c2ggZnJhbWVzIHdpdGggZXhhY3RseSB0aGUgc2FtZSBzaXplIGFzIHRoZSBlbmNvZGVyIHJlcXVlc3RlZC4KIFRFU1RfRihGcmFtZVJlYXNzZW1ibGVyVGVzdCwgUHVzaEV4YWN0RnJhbWVTaXplKSB7CiAgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzgsCi0gICAgICAgICAgICAxMDI0IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI0IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAxIGJ5dGVzL3NhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMTAyNDAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzE2LAotICAgICAgICAgICAgMjA0OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAyNCBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcy9zYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTAgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV9GTE9BVCwKLSAgICAgICAgICAgIDQwOTYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjQgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMvc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICA0MDk2MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogNDA5NiBieXRlcy9mcmFtZSAqLyk7CisgICAgZm9yIChib29sIHNlcGFyYXRlRW9zIDoge2ZhbHNlLCB0cnVlfSkgeworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fOCwKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI0IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAxIGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICAxMDI0MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogMTAyNCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgICAgICAyMDQ4IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI0IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICAyMDQ4MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogMjA0OCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV9GTE9BVCwKKyAgICAgICAgICAgICAgICA0MDk2IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI0IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICA0MDk2MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogNDA5NiBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgfQogfQogCiAvLyBQdXNoIGZyYW1lcyB3aXRoIGhhbGYgdGhlIHNpemUgdGhhdCB0aGUgZW5jb2RlciByZXF1ZXN0ZWQuCiBURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hIYWxmRnJhbWVTaXplKSB7CiAgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzgsCi0gICAgICAgICAgICA1MTIgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDUxMiBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcyBwZXIgc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICA1MTIwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzE2LAotICAgICAgICAgICAgMTAyNCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gNTEyIHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDEwMjQwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDIwNDggYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNX0ZMT0FULAotICAgICAgICAgICAgMjA0OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gNTEyIHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8pOworICAgIGZvciAoYm9vbCBzZXBhcmF0ZUVvcyA6IHtmYWxzZSwgdHJ1ZX0pIHsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzgsCisgICAgICAgICAgICAgICAgNTEyIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSA1MTIgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDUxMjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA1ICogMTAyNCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSA1MTIgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDEwMjQwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNSAqIDIwNDggYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgMjA0OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gNTEyIHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgICAgICAyMDQ4MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDUgKiA0MDk2IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICB9CiB9CiAKIC8vIFB1c2ggZnJhbWVzIHdpdGggdHdpY2UgdGhlIHNpemUgdGhhdCB0aGUgZW5jb2RlciByZXF1ZXN0ZWQuCiBURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hEb3VibGVGcmFtZVNpemUpIHsKICAgICBBU1NFUlRfRVEoT0ssIGluaXRTdGF0dXMoKSk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fOCwKLSAgICAgICAgICAgIDIwNDggLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDIwNDggc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMgcGVyIHNhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMjA0ODAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAyMCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzE2LAotICAgICAgICAgICAgNDA5NiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMjA0OCBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcyBwZXIgc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICA0MDk2MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDIwICogMjA0OCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fRkxPQVQsCi0gICAgICAgICAgICA4MTkyIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAyMDQ4IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDgxOTIwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjAgKiA0MDk2IGJ5dGVzL2ZyYW1lICovKTsKKyAgICBmb3IgKGJvb2wgc2VwYXJhdGVFb3MgOiB7ZmFsc2UsIHRydWV9KSB7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgICAgIDIwNDggLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDIwNDggc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjAgKiAxMDI0IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgICAgIDQwOTYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDIwNDggc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDQwOTYwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjAgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgICAgIDgxOTIgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDIwNDggc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDgxOTIwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjAgKiA0MDk2IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICB9CiB9CiAKIC8vIFB1c2ggZnJhbWVzIHdpdGggYSBsaXR0bGUgYml0IGxhcmdlciAoKzUgc2FtcGxlcykgdGhhbiB0aGUgcmVxdWVzdGVkIHNpemUuCiBURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hMaXR0bGVMYXJnZXJGcmFtZVNpemUpIHsKICAgICBBU1NFUlRfRVEoT0ssIGluaXRTdGF0dXMoKSk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fOCwKLSAgICAgICAgICAgIDEwMjkgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMgcGVyIHNhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMTEyNjQgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMSAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzE2LAotICAgICAgICAgICAgMjA1OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAyOSBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcyBwZXIgc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICAyMjUyOCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDExICogMjA0OCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fRkxPQVQsCi0gICAgICAgICAgICA0MTE2IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI5IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiA0IGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDQ1MDU2IC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTEgKiA0MDk2IGJ5dGVzL2ZyYW1lICovKTsKKyAgICBmb3IgKGJvb2wgc2VwYXJhdGVFb3MgOiB7ZmFsc2UsIHRydWV9KSB7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgICAgIDEwMjkgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDExMjY0IC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTEgKiAxMDI0IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgICAgIDIwNTggLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDIyNTI4IC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTEgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgICAgIDQxMTYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDQ1MDU2IC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTEgKiA0MDk2IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICB9CiB9CiAKIC8vIFB1c2ggZnJhbWVzIHdpdGggYSBsaXR0bGUgYml0IHNtYWxsZXIgKC01IHNhbXBsZXMpIHRoYW4gdGhlIHJlcXVlc3RlZCBzaXplLgogVEVTVF9GKEZyYW1lUmVhc3NlbWJsZXJUZXN0LCBQdXNoTGl0dGxlU21hbGxlckZyYW1lU2l6ZSkgewogICAgIEFTU0VSVF9FUShPSywgaW5pdFN0YXR1cygpKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV84LAotICAgICAgICAgICAgMTAxOSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAxOSBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcyBwZXIgc2FtcGxlICovLAotICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCi0gICAgICAgICAgICAxMDI0MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogMTAyNCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fMTYsCi0gICAgICAgICAgICAyMDM4IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDE5IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzIHBlciBzYW1wbGUgKi8sCi0gICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTAgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV9GTE9BVCwKLSAgICAgICAgICAgIDQwNzYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMTkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMgcGVyIHNhbXBsZSAqLywKLSAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgNDA5NjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8pOworICAgIGZvciAoYm9vbCBzZXBhcmF0ZUVvcyA6IHtmYWxzZSwgdHJ1ZX0pIHsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzgsCisgICAgICAgICAgICAgICAgMTAxOSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAxOSBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAyNDAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fMTYsCisgICAgICAgICAgICAgICAgMjAzOCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAxOSBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMjA0ODAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDIwNDggYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgNDA3NiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAxOSBzYW1wbGVzICogMSBjaGFubmVsICogNCBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgNDA5NjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8sCisgICAgICAgICAgICAgICAgc2VwYXJhdGVFb3MpOworICAgIH0KIH0KIAogLy8gUHVzaCBzaW5nbGUtYnl0ZSBmcmFtZXMKIFRFU1RfRihGcmFtZVJlYXNzZW1ibGVyVGVzdCwgUHVzaFNpbmdsZUJ5dGUpIHsKICAgICBBU1NFUlRfRVEoT0ssIGluaXRTdGF0dXMoKSk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fOCwKLSAgICAgICAgICAgIDEgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKLSAgICAgICAgICAgIDEwMDAwMCAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDEwMDM1MiAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDk4ICogMTAyNCBieXRlcy9mcmFtZSAqLyk7Ci0gICAgdGVzdFB1c2hTYW1lU2l6ZSgKLSAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCi0gICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCi0gICAgICAgICAgICBQQ01fMTYsCi0gICAgICAgICAgICAxIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgKi8sCi0gICAgICAgICAgICAxMDAwMDAgLyogY291bnQgKi8sCi0gICAgICAgICAgICAxMDAzNTIgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA0OSAqIDIwNDggYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNX0ZMT0FULAotICAgICAgICAgICAgMSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAotICAgICAgICAgICAgMTAwMDAwIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMTAyNDAwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjUgKiA0MDk2IGJ5dGVzL2ZyYW1lICovKTsKKyAgICBmb3IgKGJvb2wgc2VwYXJhdGVFb3MgOiB7ZmFsc2UsIHRydWV9KSB7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgICAgIDEgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gOTggKiAxMDI0IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNXzE2LAorICAgICAgICAgICAgICAgIDEgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNDkgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICAgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgICAgIDEgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogY291bnQgKi8sCisgICAgICAgICAgICAgICAgMTAyNDAwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjUgKiA0MDk2IGJ5dGVzL2ZyYW1lICovLAorICAgICAgICAgICAgICAgIHNlcGFyYXRlRW9zKTsKKyAgICB9CiB9CiAKIC8vIFB1c2ggb25lIGJpZyBjaHVuay4KIFRFU1RfRihGcmFtZVJlYXNzZW1ibGVyVGVzdCwgUHVzaEJpZ0NodW5rKSB7CiAgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzgsCi0gICAgICAgICAgICAxMDAwMDAgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKLSAgICAgICAgICAgIDEgLyogY291bnQgKi8sCi0gICAgICAgICAgICAxMDAzNTIgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSA5OCAqIDEwMjQgYnl0ZXMvZnJhbWUgKi8pOwotICAgIHRlc3RQdXNoU2FtZVNpemUoCi0gICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKLSAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAotICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAotICAgICAgICAgICAgUENNXzE2LAotICAgICAgICAgICAgMTAwMDAwIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgKi8sCi0gICAgICAgICAgICAxIC8qIGNvdW50ICovLAotICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gNDkgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKLSAgICB0ZXN0UHVzaFNhbWVTaXplKAotICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCi0gICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKLSAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKLSAgICAgICAgICAgIFBDTV9GTE9BVCwKLSAgICAgICAgICAgIDEwMDAwMCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAotICAgICAgICAgICAgMSAvKiBjb3VudCAqLywKLSAgICAgICAgICAgIDEwMjQwMCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDI1ICogNDA5NiBieXRlcy9mcmFtZSAqLyk7CisgICAgZm9yIChib29sIHNlcGFyYXRlRW9zIDoge2ZhbHNlLCB0cnVlfSkgeworICAgICAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgICAgICBQQ01fOCwKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDEwMDM1MiAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDk4ICogMTAyNCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDEwMDM1MiAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDQ5ICogMjA0OCBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgICAgIFBDTV9GTE9BVCwKKyAgICAgICAgICAgICAgICAxMDAwMDAgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgICAgICAxIC8qIGNvdW50ICovLAorICAgICAgICAgICAgICAgIDEwMjQwMCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDI1ICogNDA5NiBieXRlcy9mcmFtZSAqLywKKyAgICAgICAgICAgICAgICBzZXBhcmF0ZUVvcyk7CisgICAgfQogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwCmluZGV4IDJmNGQ2YjEuLjU0YTZmYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwCkBAIC03LDE0ICs3LDI4IEBACiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAogfQogCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHNfaGVhZGVycyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLCAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICIuIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWyAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwgXSwKKwogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkNvZGVjMkJ1ZmZlclV0aWxzLmNwcCIsCisgICAgICAgICJDb2RlYzJDb21tb25VdGlscy5jcHAiLAogICAgICAgICAiQ29kZWMyTWFwcGVyLmNwcCIsCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKaW5kZXggNWY4N2M2Ni4uODA3ODQxZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuY3BwCkBAIC0xNiw3ICsxNiw5IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQnVmZmVyVXRpbHMiCisjZGVmaW5lIEFUUkFDRV9UQUcgIEFUUkFDRV9UQUdfVklERU8KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCiAjaW5jbHVkZSA8bGlieXV2Lmg+CiAKQEAgLTM2LDggKzM4LDggQEAKIG5hbWVzcGFjZSB7CiAKIC8qKgotICogQSBmbGlwcGFibGUsIG9wdGltaXphYmxlIG1lbWNweS4gQ29uc3RydWN0cyBzdWNoIGFzIChmcm9tID8gc3JjIDogZHN0KSBkbyBub3Qgd29yayBhcyB0aGUgcmVzdWx0cyBhcmUKLSAqIGFsd2F5cyBjb25zdC4KKyAqIEEgZmxpcHBhYmxlLCBvcHRpbWl6YWJsZSBtZW1jcHkuIENvbnN0cnVjdHMgc3VjaCBhcyAoZnJvbSA/IHNyYyA6IGRzdCkKKyAqIGRvIG5vdCB3b3JrIGFzIHRoZSByZXN1bHRzIGFyZSBhbHdheXMgY29uc3QuCiAgKi8KIHRlbXBsYXRlPGJvb2wgVG9BLCBzaXplX3QgUz4KIHN0cnVjdCBNZW1Db3BpZXIgewpAQCAtODgsNyArOTAsNyBAQAogICAgICAgICB1aW50MzJfdCBwbGFuZVcgPSBpbWctPm1XaWR0aCAvIHBsYW5lLmNvbFNhbXBsaW5nOwogICAgICAgICB1aW50MzJfdCBwbGFuZUggPSBpbWctPm1IZWlnaHQgLyBwbGFuZS5yb3dTYW1wbGluZzsKIAotICAgICAgICBib29sIGNhbkNvcHlCeVJvdyA9IChwbGFuZS5jb2xJbmMgPT0gMSkgJiYgKGltZy0+bVBsYW5lW2ldLm1Db2xJbmMgPT0gMSk7CisgICAgICAgIGJvb2wgY2FuQ29weUJ5Um93ID0gKHBsYW5lLmNvbEluYyA9PSBicHApICYmIChpbWctPm1QbGFuZVtpXS5tQ29sSW5jID09IGJwcCk7CiAgICAgICAgIGJvb2wgY2FuQ29weUJ5UGxhbmUgPSBjYW5Db3B5QnlSb3cgJiYgKHBsYW5lLnJvd0luYyA9PSBpbWctPm1QbGFuZVtpXS5tUm93SW5jKTsKICAgICAgICAgaWYgKGNhbkNvcHlCeVBsYW5lKSB7CiAgICAgICAgICAgICBNZW1Db3BpZXI8VG9NZWRpYUltYWdlLCAwPjo6Y29weShpbWdSb3csIHZpZXdSb3csIHBsYW5lLnJvd0luYyAqIHBsYW5lSCk7CkBAIC0xMTksNyArMTIxLDEwIEBACiB9ICAvLyBuYW1lc3BhY2UKIAogc3RhdHVzX3QgSW1hZ2VDb3B5KHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcsIGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpIHsKLSAgICBpZiAodmlldy5jcm9wKCkud2lkdGggIT0gaW1nLT5tV2lkdGggfHwgdmlldy5jcm9wKCkuaGVpZ2h0ICE9IGltZy0+bUhlaWdodCkgeworICAgIGlmIChpbWcgPT0gbnVsbHB0cgorICAgICAgICB8fCBpbWdCYXNlID09IG51bGxwdHIKKyAgICAgICAgfHwgdmlldy5jcm9wKCkud2lkdGggIT0gaW1nLT5tV2lkdGgKKyAgICAgICAgfHwgdmlldy5jcm9wKCkuaGVpZ2h0ICE9IGltZy0+bUhlaWdodCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBjb25zdCB1aW50OF90KiBzcmNfeSA9IHZpZXcuZGF0YSgpWzBdOwpAQCAtMTM5LDE1ICsxNDQsMTggQEAKIAogICAgIGlmIChJc05WMTIodmlldykpIHsKICAgICAgICAgaWYgKElzTlYxMihpbWcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBOVjEyLT5OVjEyIik7CiAgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBkc3RfeSwgZHN0X3N0cmlkZV95LCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoLCBoZWlnaHQgLyAyKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfSBlbHNlIGlmIChJc05WMjEoaW1nKSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogTlYxMi0+TlYyMSIpOwogICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKElzSTQyMChpbWcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBOVjEyLT5JNDIwIik7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYxMlRvSTQyMChzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBkc3RfeSwgZHN0X3N0cmlkZV95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3UsIGRzdF9zdHJpZGVfdSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGgsIGhlaWdodCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CkBAIC0xNTUsMTUgKzE2MywxOCBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChJc05WMjEodmlldykpIHsKICAgICAgICAgaWYgKElzTlYxMihpbWcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBOVjIxLT5OVjEyIik7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYyMVRvTlYxMihzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdiwgc3JjX3N0cmlkZV92LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgd2lkdGgsIGhlaWdodCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoSXNOVjIxKGltZykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IE5WMjEtPk5WMjEiKTsKICAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY195LCBzcmNfc3RyaWRlX3ksIGRzdF95LCBkc3Rfc3RyaWRlX3ksIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3YsIHNyY19zdHJpZGVfdiwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGgsIGhlaWdodCAvIDIpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9IGVsc2UgaWYgKElzSTQyMChpbWcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBOVjIxLT5JNDIwIik7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYyMVRvSTQyMChzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdiwgc3JjX3N0cmlkZV92LCBkc3RfeSwgZHN0X3N0cmlkZV95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3UsIGRzdF9zdHJpZGVfdSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGgsIGhlaWdodCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CkBAIC0xNzEsMjcgKzE4MiwzNCBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChJc0k0MjAodmlldykpIHsKICAgICAgICAgaWYgKElzTlYxMihpbWcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBJNDIwLT5OVjEyIik7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6STQyMFRvTlYxMihzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBzcmNfdiwgc3JjX3N0cmlkZV92LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgd2lkdGgsIGhlaWdodCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoSXNOVjIxKGltZykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IEk0MjAtPk5WMjEiKTsKICAgICAgICAgICAgIGlmICghbGlieXV2OjpJNDIwVG9OVjIxKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIHNyY192LCBzcmNfc3RyaWRlX3YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChJc0k0MjAoaW1nKSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogSTQyMC0+STQyMCIpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3ksIHNyY19zdHJpZGVfeSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfdSwgc3JjX3N0cmlkZV91LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3YsIHNyY19zdHJpZGVfdiwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgIH0KKyAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBnZW5lcmljIik7CiAgICAgcmV0dXJuIF9JbWFnZUNvcHk8dHJ1ZT4odmlldywgaW1nLCBpbWdCYXNlKTsKIH0KIAogc3RhdHVzX3QgSW1hZ2VDb3B5KEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGNvbnN0IHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKLSAgICBpZiAodmlldy5jcm9wKCkud2lkdGggIT0gaW1nLT5tV2lkdGggfHwgdmlldy5jcm9wKCkuaGVpZ2h0ICE9IGltZy0+bUhlaWdodCkgeworICAgIGlmIChpbWcgPT0gbnVsbHB0cgorICAgICAgICB8fCBpbWdCYXNlID09IG51bGxwdHIKKyAgICAgICAgfHwgdmlldy5jcm9wKCkud2lkdGggIT0gaW1nLT5tV2lkdGgKKyAgICAgICAgfHwgdmlldy5jcm9wKCkuaGVpZ2h0ICE9IGltZy0+bUhlaWdodCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBjb25zdCB1aW50OF90KiBzcmNfeSA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVswXS5tT2Zmc2V0OwpAQCAtMjEwLDE1ICsyMjgsMTggQEAKICAgICBpbnQgaGVpZ2h0ID0gdmlldy5jcm9wKCkuaGVpZ2h0OwogICAgIGlmIChJc05WMTIoaW1nKSkgewogICAgICAgICBpZiAoSXNOVjEyKHZpZXcpKSB7CisgICAgICAgICAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBOVjEyLT5OVjEyIik7CiAgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBkc3RfeSwgZHN0X3N0cmlkZV95LCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoLCBoZWlnaHQgLyAyKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfSBlbHNlIGlmIChJc05WMjEodmlldykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IE5WMTItPk5WMjEiKTsKICAgICAgICAgICAgIGlmICghbGlieXV2OjpOVjIxVG9OVjEyKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChJc0k0MjAodmlldykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IE5WMTItPkk0MjAiKTsKICAgICAgICAgICAgIGlmICghbGlieXV2OjpOVjEyVG9JNDIwKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF95LCBkc3Rfc3RyaWRlX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfdSwgZHN0X3N0cmlkZV91LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKQEAgLTIyNiwxNSArMjQ3LDE4IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKElzTlYyMShpbWcpKSB7CiAgICAgICAgIGlmIChJc05WMTIodmlldykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IE5WMjEtPk5WMTIiKTsKICAgICAgICAgICAgIGlmICghbGlieXV2OjpOVjIxVG9OVjEyKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY192LCBzcmNfc3RyaWRlX3YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChJc05WMjEodmlldykpIHsKKyAgICAgICAgICAgIFNjb3BlZFRyYWNlIHRyYWNlKEFUUkFDRV9UQUcsICJJbWFnZUNvcHk6IE5WMjEtPk5WMjEiKTsKICAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY195LCBzcmNfc3RyaWRlX3ksIGRzdF95LCBkc3Rfc3RyaWRlX3ksIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3YsIHNyY19zdHJpZGVfdiwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGgsIGhlaWdodCAvIDIpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9IGVsc2UgaWYgKElzSTQyMCh2aWV3KSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogTlYyMS0+STQyMCIpOwogICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb0k0MjAoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3YsIHNyY19zdHJpZGVfdiwgZHN0X3ksIGRzdF9zdHJpZGVfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF91LCBkc3Rfc3RyaWRlX3UsIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwpAQCAtMjQyLDIyICsyNjYsMjYgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoSXNJNDIwKGltZykpIHsKICAgICAgICAgaWYgKElzTlYxMih2aWV3KSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogSTQyMC0+TlYxMiIpOwogICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Okk0MjBUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgc3JjX3YsIHNyY19zdHJpZGVfdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoLCBoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKElzTlYyMSh2aWV3KSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogSTQyMC0+TlYyMSIpOwogICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Okk0MjBUb05WMjEoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgc3JjX3YsIHNyY19zdHJpZGVfdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKElzSTQyMCh2aWV3KSkgeworICAgICAgICAgICAgU2NvcGVkVHJhY2UgdHJhY2UoQVRSQUNFX1RBRywgIkltYWdlQ29weTogSTQyMC0+STQyMCIpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3ksIHNyY19zdHJpZGVfeSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfdSwgc3JjX3N0cmlkZV91LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpOwogICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3YsIHNyY19zdHJpZGVfdiwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgIH0KKyAgICBTY29wZWRUcmFjZSB0cmFjZShBVFJBQ0VfVEFHLCAiSW1hZ2VDb3B5OiBnZW5lcmljIik7CiAgICAgcmV0dXJuIF9JbWFnZUNvcHk8ZmFsc2U+KHZpZXcsIGltZywgaW1nQmFzZSk7CiB9CiAKQEAgLTUxMCwxMiArNTM4LDE0IEBACiAvLyBNYXRyaXggY29lZmZpY2llbnQgdG8gY29udmVydCBSR0IgdG8gUGxhbmFyIFlVViBkYXRhLgogLy8gRWFjaCBzdWItYXJyYXkgcmVwcmVzZW50cyB0aGUgM1gzIGNvZWZmIHVzZWQgd2l0aCBSLCBHIGFuZCBCCiBzdGF0aWMgY29uc3QgaW50MTZfdCBidDYwMU1hdHJpeFsyXVszXVszXSA9IHsKLSAgICB7IHsgNzYsIDE1MCwgMjkgfSwgeyAtNDMsIC04NSwgMTI4IH0sIHsgMTI4LCAtMTA3LCAtMjEgfSB9LCAvKiBSQU5HRV9GVUxMICovCisgICAgeyB7IDc3LCAxNTAsIDI5IH0sIHsgLTQzLCAtODUsIDEyOCB9LCB7IDEyOCwgLTEwNywgLTIxIH0gfSwgLyogUkFOR0VfRlVMTCAqLwogICAgIHsgeyA2NiwgMTI5LCAyNSB9LCB7IC0zOCwgLTc0LCAxMTIgfSwgeyAxMTIsIC05NCwgLTE4IH0gfSwgIC8qIFJBTkdFX0xJTUlURUQgKi8KIH07CiAKIHN0YXRpYyBjb25zdCBpbnQxNl90IGJ0NzA5TWF0cml4WzJdWzNdWzNdID0gewotICAgIHsgeyA1NCwgMTgzLCAxOCB9LCB7IC0yOSwgLTk5LCAxMjggfSwgeyAxMjgsIC0xMTYsIC0xMiB9IH0sIC8qIFJBTkdFX0ZVTEwgKi8KKyAgICAvLyBUUklDS1k6IDE4IGlzIGFkanVzdGVkIHRvIDE5IHNvIHRoYXQgc3VtIG9mIHJvdyAxIGlzIDI1NgorICAgIHsgeyA1NCwgMTgzLCAxOSB9LCB7IC0yOSwgLTk5LCAxMjggfSwgeyAxMjgsIC0xMTYsIC0xMiB9IH0sIC8qIFJBTkdFX0ZVTEwgKi8KKyAgICAvLyBUUklDS1k6IC04NyBpcyBhZGp1c3RlZCB0byAtODYgc28gdGhhdCBzdW0gb2Ygcm93IDIgaXMgMAogICAgIHsgeyA0NywgMTU3LCAxNiB9LCB7IC0yNiwgLTg2LCAxMTIgfSwgeyAxMTIsIC0xMDIsIC0xMCB9IH0sIC8qIFJBTkdFX0xJTUlURUQgKi8KIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJDb21tb25VdGlscy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQ29tbW9uVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNTgwMGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQ29tbW9uVXRpbHMuY3BwCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQnVmZmVyVXRpbHMiCisjZGVmaW5lIEFUUkFDRV9UQUcgIEFUUkFDRV9UQUdfVklERU8KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmVfYnVmZmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisKKyNpbmNsdWRlICJDb2RlYzJDb21tb25VdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgaXNBdExlYXN0VCgpIHsKKyAgICBjaGFyIGRldmljZUNvZGVOYW1lW1BST1BfVkFMVUVfTUFYXTsKKyAgICBfX3N5c3RlbV9wcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnZlcnNpb24uY29kZW5hbWUiLCBkZXZpY2VDb2RlTmFtZSk7CisgICAgcmV0dXJuIGFuZHJvaWRfZ2V0X2RldmljZV9hcGlfbGV2ZWwoKSA+PSBfX0FORFJPSURfQVBJX1RfXyB8fAorICAgICAgICAgICAhc3RyY21wKGRldmljZUNvZGVOYW1lLCAiVGlyYW1pc3UiKTsKK30KKworYm9vbCBpc1ZlbmRvckFwaU9yRmlyc3RBcGlBdExlYXN0VCgpIHsKKyAgICAvLyBUaGUgZmlyc3QgU0RLIHRoZSBkZXZpY2Ugc2hpcHBlZCB3aXRoLgorICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtQcm9kdWN0Rmlyc3RBcGlMZXZlbCA9CisgICAgICAgIGJhc2U6OkdldEludFByb3BlcnR5PGludDMyX3Q+KCJyby5wcm9kdWN0LmZpcnN0X2FwaV9sZXZlbCIsIDApOworCisgICAgLy8gR1JGIGRldmljZXMgKGludHJvZHVjZWQgaW4gQW5kcm9pZCAxMSkgbGlzdCB0aGUgZmlyc3QgYW5kIHBvc3NpYmx5IHRoZSBjdXJyZW50IGFwaSBsZXZlbHMKKyAgICAvLyB0byBzaWduYWwgd2hpY2ggVlNSIHJlcXVpcmVtZW50cyB0aGV5IGNvbmZvcm0gdG8gZXZlbiBpZiB0aGUgZmlyc3QgZGV2aWNlIFNESyB3YXMgaGlnaGVyLgorICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtCb2FyZEZpcnN0QXBpTGV2ZWwgPQorICAgICAgICBiYXNlOjpHZXRJbnRQcm9wZXJ0eTxpbnQzMl90Pigicm8uYm9hcmQuZmlyc3RfYXBpX2xldmVsIiwgMCk7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0JvYXJkQXBpTGV2ZWwgPQorICAgICAgICBiYXNlOjpHZXRJbnRQcm9wZXJ0eTxpbnQzMl90Pigicm8uYm9hcmQuYXBpX2xldmVsIiwgMCk7CisKKyAgICAvLyBGb3Igbm9uLUdSRiBkZXZpY2VzLCB1c2UgdGhlIGZpcnN0IFNESyB2ZXJzaW9uIGJ5IHRoZSBwcm9kdWN0LgorICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtGaXJzdEFwaUxldmVsID0KKyAgICAgICAga0JvYXJkQXBpTGV2ZWwgIT0gMCA/IGtCb2FyZEFwaUxldmVsIDoKKyAgICAgICAga0JvYXJkRmlyc3RBcGlMZXZlbCAhPSAwID8ga0JvYXJkRmlyc3RBcGlMZXZlbCA6CisgICAgICAgIGtQcm9kdWN0Rmlyc3RBcGlMZXZlbDsKKworICAgIHJldHVybiBrRmlyc3RBcGlMZXZlbCA+PSBfX0FORFJPSURfQVBJX1RfXzsKK30KKworYm9vbCBpc0hhbFBpeGVsRm9ybWF0U3VwcG9ydGVkKEFIYXJkd2FyZUJ1ZmZlcl9Gb3JtYXQgZm9ybWF0KSB7CisgICAgLy8gSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl9QMDEwIHJlcXVpcmVtZW50IHdhcyBhZGRlZCBpbiBUIFZTUiwgYWx0aG91Z2ggaXQgY291bGQgaGF2ZSBiZWVuCisgICAgLy8gc3VwcG9ydGVkIHByaW9yIHRvIHRoaXMuCisgICAgLy8KKyAgICAvLyBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW5ub3QgZGV0ZWN0IGlmIFAwMTAgaXMgcHJvcGVybHkgc3VwcG9ydGVkIHVzaW5nIEFIYXJkd2FyZUJ1ZmZlcgorICAgIC8vIEFQSSBhbG9uZS4gRm9yIG5vdyBsaW1pdCBQMDEwIHRvIGRldmljZXMgdGhhdCBsYXVuY2hlZCB3aXRoIEFuZHJvaWQgVCBvciBrbm93biB0byBjb25mb3JtCisgICAgLy8gdG8gQW5kcm9pZCBUIFZTUiAoYXMgb3Bwb3NlZCB0byBzaW1wbHkgbGltaXRpbmcgdG8gYSBUIHZlbmRvciBpbWFnZSkuCisgICAgaWYgKGZvcm1hdCA9PSAoQUhhcmR3YXJlQnVmZmVyX0Zvcm1hdClIQUxfUElYRUxfRk9STUFUX1lDQkNSX1AwMTAgJiYKKyAgICAgICAgICAgICFpc1ZlbmRvckFwaU9yRmlyc3RBcGlBdExlYXN0VCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBBSGFyZHdhcmVCdWZmZXJfRGVzYyBkZXNjID0geworICAgICAgICAgICAgLndpZHRoID0gMzIwLAorICAgICAgICAgICAgLmhlaWdodCA9IDI0MCwKKyAgICAgICAgICAgIC5mb3JtYXQgPSBmb3JtYXQsCisgICAgICAgICAgICAubGF5ZXJzID0gMSwKKyAgICAgICAgICAgIC51c2FnZSA9IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9SQVJFTFkgfAorICAgICAgICAgICAgICAgICAgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9XUklURV9PRlRFTiB8CisgICAgICAgICAgICAgICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfR1BVX1NBTVBMRURfSU1BR0UgfAorICAgICAgICAgICAgICAgICAgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NPTVBPU0VSX09WRVJMQVksCisgICAgICAgICAgICAuc3RyaWRlID0gMCwKKyAgICAgICAgICAgIC5yZnUwID0gMCwKKyAgICAgICAgICAgIC5yZnUxID0gMCwKKyAgICB9OworCisgICAgcmV0dXJuIEFIYXJkd2FyZUJ1ZmZlcl9pc1N1cHBvcnRlZCgmZGVzYyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQ29tbW9uVXRpbHMuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJDb21tb25VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZGQ2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQ29tbW9uVXRpbHMuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMjIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfQ09NTU9OX1VUSUxTX0hfCisjZGVmaW5lIENPREVDMl9DT01NT05fVVRJTFNfSF8KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmVfYnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworYm9vbCBpc0F0TGVhc3RUKCk7CisKK2Jvb2wgaXNWZW5kb3JBcGlPckZpcnN0QXBpQXRMZWFzdFQoKTsKKworLyoqCisgKiBDaGVjayBpZiBhIGdpdmVuIHBpeGVsIGZvcm1hdCBpcyBzdXBwb3J0ZWQuCisgKiBlbnVtcyBsaXN0ZWQgaW4gYW5kcm9pZF9waXhlbF9mb3JtYXRfdCwgYW5kcm9pZF9waXhlbF9mb3JtYXRfdjFfMV90CisgKiBhbmQgc28gb24gY2FuIGJlIHBhc3NlZCBhcyB0aGVzZSBlbnVtcyBoYXZlIGFuIGVxdWl2YWxlbnQgZGVmaW5pdGlvbiBpbgorICogQUhhcmR3YXJlQnVmZmVyX0Zvcm1hdCBhcyB3ZWxsLgorICovCitib29sIGlzSGFsUGl4ZWxGb3JtYXRTdXBwb3J0ZWQoQUhhcmR3YXJlQnVmZmVyX0Zvcm1hdCBmb3JtYXQpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0NPTU1PTl9VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmNwcAppbmRleCA0ZDkzOWZhLi5jNjA2ZDZmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmNwcApAQCAtMTgsNiArMTgsOSBAQAogI2RlZmluZSBMT0dfVEFHICJDb2RlYzJNYXBwZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CkBAIC0xNjcsNiArMTcwLDkgQEAKICAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX1VIRF8zMCwgRG9sYnlWaXNpb25MZXZlbFVoZDMwIH0sCiAgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9VSERfNDgsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ0OCB9LAogICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fVUhEXzYwLCBEb2xieVZpc2lvbkxldmVsVWhkNjAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX1VIRF8xMjAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQxMjAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOXzhLXzMwLCAgRG9sYnlWaXNpb25MZXZlbDhrMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOXzhLXzYwLCAgRG9sYnlWaXNpb25MZXZlbDhrNjAgfSwKIAogICAgIC8vIGhpZ2ggdGllcnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIG9uIGFuZHJvaWQsIGZvciBub3cgbWFwIHRoZW0gdG8gbWFpbiB0aWVyCiAgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9IRF8yNCwgIERvbGJ5VmlzaW9uTGV2ZWxIZDI0IH0sCkBAIC0xNzgsNiArMTg0LDkgQEAKICAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX1VIRF8zMCwgRG9sYnlWaXNpb25MZXZlbFVoZDMwIH0sCiAgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9VSERfNDgsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ0OCB9LAogICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfVUhEXzYwLCBEb2xieVZpc2lvbkxldmVsVWhkNjAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX1VIRF8xMjAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQxMjAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIXzhLXzMwLCAgRG9sYnlWaXNpb25MZXZlbDhrMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIXzhLXzYwLCAgRG9sYnlWaXNpb25MZXZlbDhrNjAgfSwKIH07CiAKIEFMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0RvbGJ5VmlzaW9uUHJvZmlsZXMgPSB7CkBAIC0yNTUsNiArMjY0LDggQEAKICAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9TVElMTCwgSEVWQ1Byb2ZpbGVNYWluU3RpbGwgfSwKICAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9JTlRSQSwgSEVWQ1Byb2ZpbGVNYWluIH0sCiAgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTBfSU5UUkEsIEhFVkNQcm9maWxlTWFpbjEwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTAsIEhFVkNQcm9maWxlTWFpbjEwSERSMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMCwgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXMgfSwKIH07CiAKIEFMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0hldmNIZHJQcm9maWxlcyA9IHsKQEAgLTI2NSw2ICsyNzYsMTMgQEAKICAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMCwgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXMgfSwKIH07CiAKK0FMb29rdXA8QzJDb25maWc6Omhkcl9mb3JtYXRfdCwgaW50MzJfdD4gc0hldmNIZHJGb3JtYXRzID0geworICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6U0RSLCBIRVZDUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OkhMRywgSEVWQ1Byb2ZpbGVNYWluMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OkhEUjEwLCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwIH0sCisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpIRFIxMF9QTFVTLCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwUGx1cyB9LAorfTsKKwogQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc01wZWcyTGV2ZWxzID0gewogICAgIHsgQzJDb25maWc6OkxFVkVMX01QMlZfTE9XLCAgICAgICAgIE1QRUcyTGV2ZWxMTCB9LAogICAgIHsgQzJDb25maWc6OkxFVkVMX01QMlZfTUFJTiwgICAgICAgIE1QRUcyTGV2ZWxNTCB9LApAQCAtMzU0LDYgKzM3MiwxNyBAQAogICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzMsIFZQOVByb2ZpbGUzSERSMTBQbHVzIH0sCiB9OwogCitBTG9va3VwPEMyQ29uZmlnOjpoZHJfZm9ybWF0X3QsIGludDMyX3Q+IHNWcDlIZHJGb3JtYXRzID0geworICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6U0RSLCBWUDlQcm9maWxlMCB9LAorICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6U0RSLCBWUDlQcm9maWxlMSB9LAorICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6SExHLCBWUDlQcm9maWxlMiB9LAorICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6SExHLCBWUDlQcm9maWxlMyB9LAorICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6SERSMTAsIFZQOVByb2ZpbGUySERSIH0sCisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpIRFIxMCwgVlA5UHJvZmlsZTNIRFIgfSwKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OkhEUjEwX1BMVVMsIFZQOVByb2ZpbGUySERSMTBQbHVzIH0sCisgICAgeyBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpIRFIxMF9QTFVTLCBWUDlQcm9maWxlM0hEUjEwUGx1cyB9LAorfTsKKwogQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc0F2MUxldmVscyA9IHsKICAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfMiwgICAgQVYxTGV2ZWwyICB9LAogICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEsICBBVjFMZXZlbDIxIH0sCkBAIC0zODEsMTUgKzQxMCwxNyBAQAogICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV83XzMsICBBVjFMZXZlbDczIH0sCiB9OwogCi0KIEFMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0F2MVByb2ZpbGVzID0gewotICAgIC8vIFRPRE86IHdpbGwgbmVlZCB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBNYWluOCBhbmQgTWFpbjEwCiAgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW44IH0sCiAgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW4xMCB9LAogICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEFWMVByb2ZpbGVNYWluMTBIRFIxMCB9LAogICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEFWMVByb2ZpbGVNYWluMTBIRFIxMFBsdXMgfSwKIH07CiAKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0F2MVRlbmJpdFByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEFWMVByb2ZpbGVNYWluMTAgfSwKK307CisKIEFMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0F2MUhkclByb2ZpbGVzID0gewogICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEFWMVByb2ZpbGVNYWluMTBIRFIxMCB9LAogfTsKQEAgLTM5OCw2ICs0MjksNDQgQEAKICAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wLCBBVjFQcm9maWxlTWFpbjEwSERSMTBQbHVzIH0sCiB9OwogCitBTG9va3VwPEMyQ29uZmlnOjpoZHJfZm9ybWF0X3QsIGludDMyX3Q+IHNBdjFIZHJGb3JtYXRzID0geworICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6U0RSLCBBVjFQcm9maWxlTWFpbjggfSwKKyAgICB7IEMyQ29uZmlnOjpoZHJfZm9ybWF0X3Q6OkhMRywgQVYxUHJvZmlsZU1haW4xMCB9LAorICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6SERSMTAsIEFWMVByb2ZpbGVNYWluMTBIRFIxMCB9LAorICAgIHsgQzJDb25maWc6Omhkcl9mb3JtYXRfdDo6SERSMTBfUExVUywgQVYxUHJvZmlsZU1haW4xMEhEUjEwUGx1cyB9LAorfTsKKworLy8gSEFMX1BJWEVMX0ZPUk1BVF8qIC0+IENPTE9SX0Zvcm1hdCoKK0FMb29rdXA8dWludDMyX3QsIGludDMyX3Q+IHNQaXhlbEZvcm1hdHMgPSB7CisgICAgeyBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQsIENPTE9SX0Zvcm1hdFN1cmZhY2UgfSwKKworICAgIC8vIFlDQkNSXzQyMF84ODggbWFwcyB0byBZVVY0MjBGbGV4aWJsZSBhbmQgdmljZSB2ZXJzYQorICAgIHsgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4LCAgICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSB9LAorCisgICAgLy8gRmFsbGJhY2sgbWF0Y2hlcyBmb3IgWUNCQ1JfNDIwXzg4OAorICAgIHsgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4LCAgICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgfSwKKyAgICB7IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCwgICAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hciB9LAorICAgIHsgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4LCAgICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXIgfSwKKyAgICB7IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCwgICAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciB9LAorCisgICAgLy8gRmFsbGJhY2sgbWF0Y2hlcyBmb3IgWVVWNDIwRmxleGlibGUKKyAgICB7IEhBTF9QSVhFTF9GT1JNQVRfWUNSQ0JfNDIwX1NQLCAgICAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUgfSwKKyAgICB7IEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwgICAgICAgICAgICAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUgfSwKKworICAgIHsgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjJfU1AsICAgICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjJQYWNrZWRTZW1pUGxhbmFyIH0sCisgICAgeyBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMl9JLCAgICAgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFBsYW5hciB9LAorICAgIHsgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl9QMDEwLCAgICAgICAgICAgICBDT0xPUl9Gb3JtYXRZVVZQMDEwIH0sCisgICAgeyBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMiwgICAgICAgICAgIENPTE9SX0Zvcm1hdDMyYml0QUJHUjIxMDEwMTAgfSwKKyAgICB7IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV9GUDE2LCAgICAgICAgICAgICAgQ09MT1JfRm9ybWF0NjRiaXRBQkdSRmxvYXQgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnBpY3R1cmVfdHlwZV90LCBpbnQzMl90PiBzUGljdHVyZVR5cGUgPSB7CisgICAgeyBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3Q6OlNZTkNfRlJBTUUsICAgICBQSUNUVVJFX1RZUEVfSSB9LAorICAgIHsgQzJDb25maWc6OnBpY3R1cmVfdHlwZV90OjpJX0ZSQU1FLCAgICAgICAgUElDVFVSRV9UWVBFX0kgfSwKKyAgICB7IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdDo6UF9GUkFNRSwgICAgICAgIFBJQ1RVUkVfVFlQRV9QIH0sCisgICAgeyBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3Q6OkJfRlJBTUUsICAgICAgICBQSUNUVVJFX1RZUEVfQiB9LAorfTsKKwogLyoqCiAgKiBBIGhlbHBlciB0aGF0IHBhc3NlcyB0aHJvdWdoIHZlbmRvciBleHRlbnNpb24gcHJvZmlsZSBhbmQgbGV2ZWwgdmFsdWVzLgogICovCkBAIC00NTAsNiArNTE5LDEwIEBACiAgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CiAgICAgICAgIHJldHVybiBzQWFjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKICAgICB9CisgICAgLy8gQUFDIGRvZXMgbm90IGhhdmUgSERSIGZvcm1hdAorICAgIHZpcnR1YWwgYm9vbCBtYXBIZHJGb3JtYXQoaW50MzJfdCwgQzJDb25maWc6Omhkcl9mb3JtYXRfdCopIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIH07CiAKIHN0cnVjdCBBdmNQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgewpAQCAtNDgwLDYgKzU1MywxMiBAQAogICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgewogICAgICAgICByZXR1cm4gc0RvbGJ5VmlzaW9uUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKICAgICB9CisgICAgLy8gRG9sYnkgVmlzaW9uIGlzIGFsd2F5cyBIRFIgYW5kIHRoZSBwcm9maWxlIGlzIGZ1bGx5IGV4cHJlc3NpdmUgc28gdXNlIHVua25vd24KKyAgICAvLyBIRFIgZm9ybWF0CisgICAgdmlydHVhbCBib29sIG1hcEhkckZvcm1hdChpbnQzMl90LCBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90ICp0bykgb3ZlcnJpZGUgeworICAgICAgICAqdG8gPSBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpVTktOT1dOOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiB9OwogCiBzdHJ1Y3QgSDI2M1Byb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CkBAIC01MTgsNiArNTk3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgIG1Jc0hkciA/IHNIZXZjSGRyUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzSGV2Y1Byb2ZpbGVzLm1hcChmcm9tLCB0byk7CiAgICAgfQorICAgIHZpcnR1YWwgYm9vbCBtYXBIZHJGb3JtYXQoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90ICp0bykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc0hldmNIZHJGb3JtYXRzLm1hcChmcm9tLCB0byk7CisgICAgfQogCiBwcml2YXRlOgogICAgIGJvb2wgbUlzSGRyOwpAQCAtNTk2LDYgKzY3OCw5IEBACiAgICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzVnA5SGRyUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVnA5UHJvZmlsZXMubWFwKGZyb20sIHRvKTsKICAgICB9CisgICAgdmlydHVhbCBib29sIG1hcEhkckZvcm1hdChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpoZHJfZm9ybWF0X3QgKnRvKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzVnA5SGRyRm9ybWF0cy5tYXAoZnJvbSwgdG8pOworICAgIH0KIAogcHJpdmF0ZToKICAgICBib29sIG1Jc0hkcjsKQEAgLTYwMyw5ICs2ODgsOSBAQAogfTsKIAogc3RydWN0IEF2MVByb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7Ci0gICAgQXYxUHJvZmlsZUxldmVsTWFwcGVyKGJvb2wgaXNIZHIgPSBmYWxzZSwgYm9vbCBpc0hkcjEwUGx1cyA9IGZhbHNlKSA6CisgICAgQXYxUHJvZmlsZUxldmVsTWFwcGVyKGJvb2wgaXNIZHIgPSBmYWxzZSwgYm9vbCBpc0hkcjEwUGx1cyA9IGZhbHNlLCBpbnQzMl90IGJpdERlcHRoID0gOCkgOgogICAgICAgICBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIoKSwKLSAgICAgICAgbUlzSGRyKGlzSGRyKSwgbUlzSGRyMTBQbHVzKGlzSGRyMTBQbHVzKSB7fQorICAgICAgICBtSXNIZHIoaXNIZHIpLCBtSXNIZHIxMFBsdXMoaXNIZHIxMFBsdXMpLCBtQml0RGVwdGgoYml0RGVwdGgpIHt9CiAKICAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CiAgICAgICAgIHJldHVybiBzQXYxTGV2ZWxzLm1hcChmcm9tLCB0byk7CkBAIC02MTQsMjMgKzY5OSwzNiBAQAogICAgICAgICByZXR1cm4gc0F2MUxldmVscy5tYXAoZnJvbSwgdG8pOwogICAgIH0KICAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKLSAgICAgICAgcmV0dXJuIG1Jc0hkcjEwUGx1cyA/IHNBdjFIZHIxMFBsdXNQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKLSAgICAgICAgICAgICAgICAgICAgIG1Jc0hkciA/IHNBdjFIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNBdjFQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgICAgICByZXR1cm4gKG1CaXREZXB0aCA9PSAxMCkgPyBzQXYxVGVuYml0UHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgIG1Jc0hkcjEwUGx1cyA/IHNBdjFIZHIxMFBsdXNQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc0F2MUhkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQXYxUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKICAgICB9CiAgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7Ci0gICAgICAgIHJldHVybiBtSXNIZHIxMFBsdXMgPyBzQXYxSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6Ci0gICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzQXYxSGRyUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQXYxUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICAgICAgcmV0dXJuIChtQml0RGVwdGggPT0gMTApID8gc0F2MVRlbmJpdFByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICBtSXNIZHIxMFBsdXMgPyBzQXYxSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0hkciA/IHNBdjFIZHJQcm9maWxlcy5tYXAoZnJvbSwgdG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0F2MVByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBtYXBIZHJGb3JtYXQoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90ICp0bykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc0F2MUhkckZvcm1hdHMubWFwKGZyb20sIHRvKTsKICAgICB9CiAKIHByaXZhdGU6CiAgICAgYm9vbCBtSXNIZHI7CiAgICAgYm9vbCBtSXNIZHIxMFBsdXM7CisgICAgaW50MzJfdCBtQml0RGVwdGg7CiB9OwogCiB9IC8vIG5hbWVzcGFjZQogCisvLyB0aGUgZGVmYXVsdCBtYXBwZXIgaXMgdXNlZCBmb3IgbWVkaWEgdHlwZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBIRFIKK2Jvb2wgQzJNYXBwZXI6OlByb2ZpbGVMZXZlbE1hcHBlcjo6bWFwSGRyRm9ybWF0KGludDMyX3QsIEMyQ29uZmlnOjpoZHJfZm9ybWF0X3QgKnRvKSB7CisgICAgLy8gYnkgZGVmYXVsdCBtYXAgYWxsIChpbmNsdWRpbmcgdmVuZG9yKSBwcm9maWxlcyB0byBTRFIKKyAgICAqdG8gPSBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90OjpTRFI7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIC8vIHN0YXRpYwogc3RkOjpzaGFyZWRfcHRyPEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI+CiBDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSkgewpAQCAtNjc0LDYgKzc3MiwxOCBAQAogfQogCiAvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPgorQzJNYXBwZXI6OkdldEJpdERlcHRoUHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSwgaW50MzJfdCBiaXREZXB0aCkgeworICAgIHN0ZDo6dHJhbnNmb3JtKG1lZGlhVHlwZS5iZWdpbigpLCBtZWRpYVR5cGUuZW5kKCksIG1lZGlhVHlwZS5iZWdpbigpLCA6OnRvbG93ZXIpOworICAgIGlmIChiaXREZXB0aCA9PSA4KSB7CisgICAgICAgIHJldHVybiBHZXRQcm9maWxlTGV2ZWxNYXBwZXIobWVkaWFUeXBlKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19BVjEgJiYgYml0RGVwdGggPT0gMTApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QXYxUHJvZmlsZUxldmVsTWFwcGVyPihmYWxzZSwgZmFsc2UsIGJpdERlcHRoKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIHN0YXRpYwogYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCBmcm9tLCBpbnQzMl90ICp0bykgewogICAgIHJldHVybiBzQml0cmF0ZU1vZGVzLm1hcChmcm9tLCB0byk7CiB9CkBAIC05NTYsNDEgKzEwNjYsMjkgQEAKIC8vIHN0YXRpYwogYm9vbCBDMk1hcHBlcjo6bWFwUGl4ZWxGb3JtYXRGcmFtZXdvcmtUb0NvZGVjKAogICAgICAgICBpbnQzMl90IGZyYW1ld29ya1ZhbHVlLCB1aW50MzJfdCAqYzJWYWx1ZSkgewotICAgIHN3aXRjaCAoZnJhbWV3b3JrVmFsdWUpIHsKLSAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRTdXJmYWNlOgotICAgICAgICAgICAgKmMyVmFsdWUgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZToKLSAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6Ci0gICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKLSAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6Ci0gICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKLSAgICAgICAgICAgICpjMlZhbHVlID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBQYXNzdGhyb3VnaAotICAgICAgICAgICAgKmMyVmFsdWUgPSB1aW50MzJfdChmcmFtZXdvcmtWYWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoIXNQaXhlbEZvcm1hdHMubWFwKGZyYW1ld29ya1ZhbHVlLCBjMlZhbHVlKSkgeworICAgICAgICAvLyBwYXNzdGhyb3VnaCBpZiBub3QgbWFwcGVkCisgICAgICAgICpjMlZhbHVlID0gdWludDMyX3QoZnJhbWV3b3JrVmFsdWUpOwogICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLy8gc3RhdGljCiBib29sIEMyTWFwcGVyOjptYXBQaXhlbEZvcm1hdENvZGVjVG9GcmFtZXdvcmsoCiAgICAgICAgIHVpbnQzMl90IGMyVmFsdWUsIGludDMyX3QgKmZyYW1ld29ya1ZhbHVlKSB7Ci0gICAgc3dpdGNoIChjMlZhbHVlKSB7Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOgotICAgICAgICAgICAgKmZyYW1ld29ya1ZhbHVlID0gQ09MT1JfRm9ybWF0U3VyZmFjZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIyX1NQOgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNSQ0JfNDIwX1NQOgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIyX0k6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4OgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxMjoKLSAgICAgICAgICAgICpmcmFtZXdvcmtWYWx1ZSA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBQYXNzdGhyb3VnaAotICAgICAgICAgICAgKmZyYW1ld29ya1ZhbHVlID0gaW50MzJfdChjMlZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmICghc1BpeGVsRm9ybWF0cy5tYXAoYzJWYWx1ZSwgZnJhbWV3b3JrVmFsdWUpKSB7CisgICAgICAgIC8vIHBhc3N0aHJvdWdoIGlmIG5vdCBtYXBwZWQKKyAgICAgICAgKmZyYW1ld29ya1ZhbHVlID0gaW50MzJfdChjMlZhbHVlKTsKICAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgIHJldHVybiBzUGljdHVyZVR5cGUubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgKnRvKSB7CisgICAgcmV0dXJuIHNQaWN0dXJlVHlwZS5tYXAoZnJvbSwgdG8pOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5oCmluZGV4IDc5N2M4YTguLmM4ZTllMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuaAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmgKQEAgLTM0LDYgKzM0LDE2IEBACiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWFwUHJvZmlsZShpbnQzMl90LCBDMkNvbmZpZzo6cHJvZmlsZV90KikgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBib29sIG1hcExldmVsKEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90KikgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBib29sIG1hcExldmVsKGludDMyX3QsIEMyQ29uZmlnOjpsZXZlbF90KikgPSAwOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIE1hcHBlciBtZXRob2QgdGhhdCBtYXBzIGEgTWVkaWFDb2RlYyBwcm9maWxlIHRvIHRoZSBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAqIEhEUiBmb3JtYXQgZm9yIHRoYXQgcHJvZmlsZS4gU2luY2UgMTAtYml0IHByb2ZpbGVzIGFyZSB1c2VkIGZvcgorICAgICAgICAgICAgICogSExHLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBITEcgZm9yIGFsbCAxMC1iaXQgcHJvZmlsZXMsIGJ1dAorICAgICAgICAgICAgICogdGhlIGNhbGxlciBzaG91bGQgYWxzbyB2ZXJpZnkgdGhhdCB0aGUgdHJhbnNmZXIgZnVuY3Rpb24gaXMKKyAgICAgICAgICAgICAqIGluZGVlZCBITEcuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8vIG5vdCBhbiBhYnN0cmFjdCBtZXRob2QgYXMgd2UgaGF2ZSBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIFNEUgorICAgICAgICAgICAgdmlydHVhbCBib29sIG1hcEhkckZvcm1hdChpbnQzMl90LCBDMkNvbmZpZzo6aGRyX2Zvcm1hdF90ICpoZHIpOwogICAgICAgICAgICAgdmlydHVhbCB+UHJvZmlsZUxldmVsTWFwcGVyKCkgPSBkZWZhdWx0OwogICAgICAgICB9OwogCkBAIC00Myw2ICs1Myw5IEBACiAgICAgICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8UHJvZmlsZUxldmVsTWFwcGVyPgogICAgICAgICBHZXRIZHJQcm9maWxlTGV2ZWxNYXBwZXIoc3RkOjpzdHJpbmcgbWVkaWFUeXBlLCBib29sIGlzSGRyMTBQbHVzID0gZmFsc2UpOwogCisgICAgICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8UHJvZmlsZUxldmVsTWFwcGVyPgorICAgICAgICBHZXRCaXREZXB0aFByb2ZpbGVMZXZlbE1hcHBlcihzdGQ6OnN0cmluZyBtZWRpYVR5cGUsIGludDMyX3QgYml0RGVwdGggPSA4KTsKKwogICAgICAgICAvLyBjb252ZXJ0IGJldHdlZW4gYml0cmF0ZXMKICAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCwgaW50MzJfdCopOwogICAgICAgICBzdGF0aWMgYm9vbCBtYXAoaW50MzJfdCwgQzJDb25maWc6OmJpdHJhdGVfbW9kZV90Kik7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGI4NThmYTUuLjljM2JhNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xNSwxMiArMTUsOSBAQAogICAgICAgICAiQzJQYXJhbV90ZXN0LmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlIiwKLSAgICBdLAotCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmNvZGVjMl9oZWFkZXJzIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICAvLyBwYXJhbSB0ZXN0cyBtdXN0IG5vdCBkZXBlbmQgb24gYW55IGNvZGVjMiBsaWJyYXJpZXMgYXMgYWxsIHBhcmFtcyBzaG91bGQgYmUgdGVtcGxhdGVkCkBAIC00Nyw5ICs0NCw2IEBACiAgICAgICAgICJ2bmRrL0MyQnVmZmVyVGVzdC5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICBdLAotCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNvZGVjMiIsCiAgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQW5kcm9pZC5icAppbmRleCBiZTgxYzg0Li4xZDhhZWEzIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAKQEAgLTE4LDYgKzE4LDI1IEBACiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKIAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAorCit9CisKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmNvZGVjMl92bmRrX2hlYWRlcnMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogfQogCiAvLyAhISFETyBOT1QgREVQRU5EIE9OIFRISVMgU0hBUkVEIExJQlJBUlkgRElSRUNUTFkhISEKQEAgLTI4LDYgKzQ3LDExIEBACiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAogICAgIC8vIFRPRE86IGIvMTQ3MTQ3ODgzCiAgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkMyQWxsb2NhdG9yQmxvYi5jcHAiLApAQCAtNTQsNiArNzgsNyBAQAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwogICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJkbWFidWZoZWFwIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAogICAgIF0sCiAKQEAgLTczLDExICs5OCwxMSBAQAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliZGwiLAotICAgICAgICAibGliaGFyZHdhcmUiLAotICAgICAgICAibGliaGlkbGJhc2UiLAotICAgICAgICAibGliaW9uIiwKICAgICAgICAgImxpYmRtYWJ1ZmhlYXAiLAogICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmdyYWxsb2N0eXBlcyIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJpb24iLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKQEAgLTkyLDYgKzExNyw0MyBAQAogICAgIF0sCiB9CiAKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBzdGF0aWNhbGx5IGxpbmtpbmcgdG8gbGliY29kZWMyX3ZuZGsgZm9yIHVuaXQgdGVzdHMKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyLXN0YXRpYy1kZWZhdWx0cyIsCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmlvbiIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmRtYWJ1ZmhlYXAiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2NvbW1vbiIsCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMC4xIiwKKyAgICAgICAgImxpYmdyYWxsb2N0eXBlcyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMy4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDMuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDIuMCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJ2bmRrc3VwcG9ydCIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAorICAgIF0sCit9CisKIC8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBpbXBsZW1lbnRpbmcgQ29kZWMgMiBjb21wb25lbnRzCiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwCmluZGV4IDZhN2YxOWMuLmJjNDA1M2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcApAQCAtMjAsOCArMjAsMTAgQEAKIAogI2luY2x1ZGUgPG11dGV4PgogCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2NvbW1vbi9QbGFuZUxheW91dENvbXBvbmVudFR5cGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2NvbW1vbi8xLjIvdHlwZXMuaD4KICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGdyYWxsb2N0eXBlcy9HcmFsbG9jNC5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyQWxsb2NhdG9yLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgpAQCAtMjksNiArMzEsNyBAQAogCiAjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CiAjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CiAjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7CkBAIC0yMzAsOCArMjMzLDkwIEBACiAgICAgfQogfTsKIAorc3RhdGljCitjMl9zdGF0dXNfdCBHcmFsbG9jNE1hcHBlcl9sb2NrKG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCB1aW50NjRfdCB1c2FnZSwgY29uc3QgUmVjdCYgYm91bmRzLAorICAgICAgICBDMlBsYW5hckxheW91dCAqbGF5b3V0LCB1aW50OF90ICoqYWRkcikgeworICAgIEdyYXBoaWNCdWZmZXJNYXBwZXIgJm1hcHBlciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpOworCisgICAgc3RkOjp2ZWN0b3I8dWk6OlBsYW5lTGF5b3V0PiBwbGFuZXM7CisgICAgLy8gdGhpcyBtZXRob2QgaXMgb25seSBzdXBwb3J0ZWQgb24gR3JhbGxvYyA0IG9yIGxhdGVyCisgICAgc3RhdHVzX3QgZXJyID0gbWFwcGVyLmdldFBsYW5lTGF5b3V0cyhoYW5kbGUsICZwbGFuZXMpOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IgfHwgcGxhbmVzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIEMyX0NBTk5PVF9ETzsKKyAgICB9CisKKyAgICB1aW50OF90ICpwb2ludGVyID0gbnVsbHB0cjsKKyAgICBlcnIgPSBtYXBwZXIubG9jayhoYW5kbGUsIHVzYWdlLCBib3VuZHMsICh2b2lkICoqKSZwb2ludGVyLCBudWxscHRyLCBudWxscHRyKTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SIHx8IHBvaW50ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpQbGFuZUxheW91dENvbXBvbmVudFR5cGU7CisgICAgdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlBsYW5lTGF5b3V0Q29tcG9uZW50OworCisgICAgbGF5b3V0LT50eXBlID0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOworICAgIGxheW91dC0+bnVtUGxhbmVzID0gMDsKKyAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAwOworCisgICAgZm9yIChjb25zdCB1aTo6UGxhbmVMYXlvdXQgJnBsYW5lIDogcGxhbmVzKSB7CisgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcysrOworICAgICAgICB1aW50MzJfdCBsYXN0T2Zmc2V0SW5CaXRzID0gMDsKKyAgICAgICAgdWludDMyX3Qgcm9vdEl4ID0gbGF5b3V0LT5udW1QbGFuZXM7CisKKyAgICAgICAgZm9yIChjb25zdCBQbGFuZUxheW91dENvbXBvbmVudCAmY29tcG9uZW50IDogcGxhbmUuY29tcG9uZW50cykgeworICAgICAgICAgICAgaWYgKCFncmFsbG9jNDo6aXNTdGFuZGFyZFBsYW5lTGF5b3V0Q29tcG9uZW50VHlwZShjb21wb25lbnQudHlwZSkpIHsKKyAgICAgICAgICAgICAgICBtYXBwZXIudW5sb2NrKGhhbmRsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NBTk5PVF9ETzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QgcmlnaHRTaGlmdEJpdHMgPSBjb21wb25lbnQub2Zmc2V0SW5CaXRzIC0gbGFzdE9mZnNldEluQml0czsKKyAgICAgICAgICAgIHVpbnQzMl90IGFsbG9jYXRlZERlcHRoSW5CaXRzID0gY29tcG9uZW50LnNpemVJbkJpdHMgKyByaWdodFNoaWZ0Qml0czsKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpwbGFuZV9pbmRleF90IHBsYW5lSWQ7CisgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Y2hhbm5lbF90IGNoYW5uZWw7CisKKyAgICAgICAgICAgIHN3aXRjaCAoc3RhdGljX2Nhc3Q8UGxhbmVMYXlvdXRDb21wb25lbnRUeXBlPihjb21wb25lbnQudHlwZS52YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBsYW5lTGF5b3V0Q29tcG9uZW50VHlwZTo6WToKKyAgICAgICAgICAgICAgICAgICAgcGxhbmVJZCA9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gQzJQbGFuZUluZm86OkNIQU5ORUxfWTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQbGFuZUxheW91dENvbXBvbmVudFR5cGU6OkNCOgorICAgICAgICAgICAgICAgICAgICBwbGFuZUlkID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1U7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DQjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQbGFuZUxheW91dENvbXBvbmVudFR5cGU6OkNSOgorICAgICAgICAgICAgICAgICAgICBwbGFuZUlkID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1Y7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgbWFwcGVyLnVubG9jayhoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhZGRyW3BsYW5lSWRdID0gcG9pbnRlciArIHBsYW5lLm9mZnNldEluQnl0ZXMgKyAoY29tcG9uZW50Lm9mZnNldEluQml0cyAvIDgpOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbcGxhbmVJZF0gPSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocGxhbmUuc2FtcGxlSW5jcmVtZW50SW5CaXRzIC8gOCksICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihwbGFuZS5zdHJpZGVJbkJ5dGVzKSwgICAgICAgICAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihwbGFuZS5ob3Jpem9udGFsU3Vic2FtcGxpbmcpLCAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBsYW5lLnZlcnRpY2FsU3Vic2FtcGxpbmcpLCAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICBhbGxvY2F0ZWREZXB0aEluQml0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoIChiaXRzKQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb21wb25lbnQuc2l6ZUluQml0cyksICAgICAgICAgICAgLy8gYml0RGVwdGggKGJpdHMpCisgICAgICAgICAgICAgICAgcmlnaHRTaGlmdEJpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0IChiaXRzKQorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIHJvb3RJeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbXBvbmVudC5vZmZzZXRJbkJpdHMgLyA4KSwgICAgICAvLyBvZmZzZXQgKGJ5dGVzKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbGF5b3V0LT5udW1QbGFuZXMrKzsKKyAgICAgICAgICAgIGxhc3RPZmZzZXRJbkJpdHMgPSBjb21wb25lbnQub2Zmc2V0SW5CaXRzICsgY29tcG9uZW50LnNpemVJbkJpdHM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCiB9IC8vIHVubmFtZWQgbmFtZXNwYWNlCiAKKwogbmF0aXZlX2hhbmRsZV90ICpVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKICAgICByZXR1cm4gQzJIYW5kbGVHcmFsbG9jOjpVbndyYXBOYXRpdmVIYW5kbGUoaGFuZGxlKTsKIH0KQEAgLTM4NSw2ICs0NzAsMTAgQEAKICAgICAgICAgICAgICAgICBtQnVmZmVyLCBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQsIG1HcmFsbG9jVXNhZ2UsCiAgICAgICAgICAgICAgICAgbVN0cmlkZSwgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKICAgICB9CisKKyAgICAvLyAnTkFUSVZFJyBvbiBBbmRyb2lkIG1lYW5zIExJVFRMRV9FTkRJQU4KKyAgICBjb25zdGV4cHIgQzJQbGFuZUluZm86OmVuZGlhbm5lc3NfdCBrRW5kaWFubmVzcyA9IEMyUGxhbmVJbmZvOjpOQVRJVkU7CisKICAgICBzd2l0Y2ggKG1Gb3JtYXQpIHsKICAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oUGl4ZWxGb3JtYXQ0OjpSR0JBXzEwMTAxMDIpOiB7CiAgICAgICAgICAgICAvLyBUUklDS1k6IHRoaXMgaXMgdXNlZCBmb3IgbWVkaWEgYXMgWVVWNDQ0IGluIHRoZSBjYXNlIHdoZW4gaXQgaXMgcXVldWVkIGRpcmVjdGx5IHRvIGEKQEAgLTYwOSwxNyArNjk4LDYgQEAKICAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfViwgICAgICAgICAgLy8gcm9vdEl4CiAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAogICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIC8vIGhhbmRsZSBpbnRlcmxlYXZlZCBmb3JtYXRzCi0gICAgICAgICAgICBpbnRwdHJfdCB1dk9mZnNldCA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdIC0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV07Ci0gICAgICAgICAgICBpZiAodXZPZmZzZXQgPiAwICYmIHV2T2Zmc2V0IDwgKGludHB0cl90KXljYmNyTGF5b3V0LmNocm9tYV9zdGVwKSB7Ci0gICAgICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMjsKLSAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1U7Ci0gICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLm9mZnNldCA9IHV2T2Zmc2V0OwotICAgICAgICAgICAgfSBlbHNlIGlmICh1dk9mZnNldCA8IDAgJiYgdXZPZmZzZXQgPiAtKGludHB0cl90KXljYmNyTGF5b3V0LmNocm9tYV9zdGVwKSB7Ci0gICAgICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMjsKLSAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1Y7Ci0gICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLm9mZnNldCA9IC11dk9mZnNldDsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTY0Niw3ICs3MjQsNyBAQAogICAgICAgICAgICAgICAgIDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKICAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCiAgICAgICAgICAgICAgICAgNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0Ci0gICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAga0VuZGlhbm5lc3MsICAgICAgICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCiAgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAogICAgICAgICAgICAgfTsKQEAgLTY1OSw3ICs3MzcsNyBAQAogICAgICAgICAgICAgICAgIDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKICAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCiAgICAgICAgICAgICAgICAgNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0Ci0gICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAga0VuZGlhbm5lc3MsICAgICAgICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCiAgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1UsICAgICAgICAvLyByb290SXgKICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAogICAgICAgICAgICAgfTsKQEAgLTY3Miw3ICs3NTAsNyBAQAogICAgICAgICAgICAgICAgIDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKICAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCiAgICAgICAgICAgICAgICAgNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0Ci0gICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAga0VuZGlhbm5lc3MsICAgICAgICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCiAgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1UsICAgICAgICAvLyByb290SXgKICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAogICAgICAgICAgICAgfTsKQEAgLTY4MCw5ICs3NTgsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgd2hhdCBpdCBpcywgYnV0IGxldCdzIHRyeSB0byBsb2NrIGl0LgorICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB3aGF0IGl0IGlzLCBsZXQncyB0cnkgdG8gbG9jayBpdCB3aXRoIGdyYWxsb2M0CiAgICAgICAgICAgICBhbmRyb2lkX3ljYmNyIHljYmNyTGF5b3V0OworICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gR3JhbGxvYzRNYXBwZXJfbG9jaygKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLCByZWN0LCBsYXlvdXQsIGFkZHIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBmYWxsYmFjayB0byBsb2NrWUNiQ3IKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpLmxvY2tZQ2JDcigKICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLCByZWN0LCAmeWNiY3JMYXlvdXQpOwogICAgICAgICAgICAgaWYgKGVyciA9PSBPSyAmJiB5Y2JjckxheW91dC55ICYmIHljYmNyTGF5b3V0LmNiICYmIHljYmNyTGF5b3V0LmNyCkBAIC03MzQsMTcgKzgxOCw2IEBACiAgICAgICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WLCAgICAgICAgICAvLyByb290SXgKICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAogICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgLy8gaGFuZGxlIGludGVybGVhdmVkIGZvcm1hdHMKLSAgICAgICAgICAgICAgICBpbnRwdHJfdCB1dk9mZnNldCA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdIC0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV07Ci0gICAgICAgICAgICAgICAgaWYgKHV2T2Zmc2V0ID4gMCAmJiB1dk9mZnNldCA8IChpbnRwdHJfdCl5Y2JjckxheW91dC5jaHJvbWFfc3RlcCkgewotICAgICAgICAgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOwotICAgICAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1U7Ci0gICAgICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5vZmZzZXQgPSB1dk9mZnNldDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHV2T2Zmc2V0IDwgMCAmJiB1dk9mZnNldCA+IC0oaW50cHRyX3QpeWNiY3JMYXlvdXQuY2hyb21hX3N0ZXApIHsKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMjsKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvb3RJeCA9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WOwotICAgICAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ub2Zmc2V0ID0gLXV2T2Zmc2V0OwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtNzkwLDYgKzg2MywyOSBAQAogICAgIH0KICAgICBtTG9ja2VkID0gdHJ1ZTsKIAorICAgIC8vIGhhbmRsZSBpbnRlcmxlYXZlZCBmb3JtYXRzCisgICAgaWYgKGxheW91dC0+dHlwZSA9PSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVYgJiYgbGF5b3V0LT5yb290UGxhbmVzID09IDMpIHsKKyAgICAgICAgaW50cHRyX3QgdXZPZmZzZXQgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSAtIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICBpbnRwdHJfdCB1dkNvbEluYyA9IGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5jb2xJbmM7CisgICAgICAgIGlmICh1dk9mZnNldCA+IDAgJiYgdXZPZmZzZXQgPCB1dkNvbEluYykgeworICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMjsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5yb290SXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5vZmZzZXQgPSB1dk9mZnNldDsKKyAgICAgICAgfSBlbHNlIGlmICh1dk9mZnNldCA8IDAgJiYgdXZPZmZzZXQgPiAtdXZDb2xJbmMpIHsKKyAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDI7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1Y7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ub2Zmc2V0ID0gLXV2T2Zmc2V0OworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIkMyQWxsb2NhdGlvbkdyYWxsb2M6Om1hcDogbGF5b3V0OiB0eXBlPSVkIG51bVBsYW5lcz0lZCByb290UGxhbmVzPSVkIiwKKyAgICAgICAgICBsYXlvdXQtPnR5cGUsIGxheW91dC0+bnVtUGxhbmVzLCBsYXlvdXQtPnJvb3RQbGFuZXMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGF5b3V0LT5udW1QbGFuZXM7ICsraSkgeworICAgICAgICBjb25zdCBDMlBsYW5lSW5mbyAmcGxhbmUgPSBsYXlvdXQtPnBsYW5lc1tpXTsKKyAgICAgICAgQUxPR1YoIkMyQWxsb2NhdGlvbkdyYWxsb2M6Om1hcDogcGxhbmVbJWRdOiBjb2xJbmM9JWQgcm93SW5jPSVkIHJvb3RJeD0ldSBvZmZzZXQ9JXUiLAorICAgICAgICAgICAgICBpLCBwbGFuZS5jb2xJbmMsIHBsYW5lLnJvd0luYywgcGxhbmUucm9vdEl4LCBwbGFuZS5vZmZzZXQpOworICAgIH0KKwogICAgIHJldHVybiBDMl9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJGZW5jZS5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkZlbmNlLmNwcAppbmRleCA5YzUxODNlLi4wYjU1NmFhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9DMkZlbmNlLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkZlbmNlLmNwcApAQCAtMTYsMTMgKzE2LDI0IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQzJGZW5jZUZhY3RvcnkiCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1aS9GZW5jZS5oPgogCiAjaW5jbHVkZSA8QzJGZW5jZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxDMlN1cmZhY2VTeW5jT2JqLmg+CiAKKyNkZWZpbmUgTUFYX0ZFTkNFX0ZEUyAxCisKIGNsYXNzIEMyRmVuY2U6OkltcGwgewogcHVibGljOgorICAgIGVudW0gdHlwZV90IDogdWludDMyX3QgeworICAgICAgICBJTlZBTElEX0ZFTkNFLAorICAgICAgICBOVUxMX0ZFTkNFLAorICAgICAgICBTVVJGQUNFX0ZFTkNFLAorICAgICAgICBTWU5DX0ZFTkNFLAorICAgIH07CisKICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHdhaXQoYzJfbnNlY3NfdCB0aW1lb3V0TnMpID0gMDsKIAogICAgIHZpcnR1YWwgYm9vbCB2YWxpZCgpIGNvbnN0ID0gMDsKQEAgLTMzLDkgKzQ0LDI2IEBACiAKICAgICB2aXJ0dWFsIGJvb2wgaXNIVygpIGNvbnN0ID0gMDsKIAorICAgIHZpcnR1YWwgdHlwZV90IHR5cGUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuYXRpdmUgaGFuZGxlIGZvciB0aGUgZmVuY2Ugc28gaXQgY2FuIGJlIG1hcnNoYWxsZWQuCisgICAgICogVGhlIG5hdGl2ZSBoYW5kbGUgbXVzdCBzdG9yZSBmZW5jZSB0eXBlIGluIHRoZSBmaXJzdCBpbnRlZ2VyLgorICAgICAqCisgICAgICogXHJldHVybiBhIHZhbGlkIG5hdGl2ZSBoYW5kbGUgaWYgdGhlIGZlbmNlIGNhbiBiZSBtYXJzaGFsbGVkLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCisgICAgICovCisgICAgdmlydHVhbCBuYXRpdmVfaGFuZGxlX3QgKmNyZWF0ZU5hdGl2ZUhhbmRsZSgpIGNvbnN0ID0gMDsKKwogICAgIHZpcnR1YWwgfkltcGwoKSA9IGRlZmF1bHQ7CiAKICAgICBJbXBsKCkgPSBkZWZhdWx0OworCisgICAgc3RhdGljIHR5cGVfdCBHZXRUeXBlRnJvbU5hdGl2ZUhhbmRsZShjb25zdCBuYXRpdmVfaGFuZGxlX3QqIG5oKSB7CisgICAgICAgIGlmIChuaCAmJiBuaC0+bnVtRmRzID49IDAgJiYgbmgtPm51bUZkcyA8PSBNQVhfRkVOQ0VfRkRTICYmIG5oLT5udW1JbnRzID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVfdD4obmgtPmRhdGFbbmgtPm51bUZkc10pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJTlZBTElEX0ZFTkNFOworICAgIH0KIH07CiAKIGMyX3N0YXR1c190IEMyRmVuY2U6OndhaXQoYzJfbnNlY3NfdCB0aW1lb3V0TnMpIHsKQEAgLTExNSw2ICsxNDMsMTUgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHZpcnR1YWwgdHlwZV90IHR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBTVVJGQUNFX0ZFTkNFOworICAgIH0KKworICAgIHZpcnR1YWwgbmF0aXZlX2hhbmRsZV90ICpjcmVhdGVOYXRpdmVIYW5kbGUoKSBjb25zdCB7CisgICAgICAgIEFMT0dEKCJDYW5ub3QgY3JlYXRlIG5hdGl2ZSBoYW5kbGUgZnJvbSBzdXJmYWNlIGZlbmNlIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKwogICAgIHZpcnR1YWwgflN1cmZhY2VGZW5jZUltcGwoKSB7fTsKIAogICAgIFN1cmZhY2VGZW5jZUltcGwoc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+IHN5bmNNZW0sIHVpbnQzMl90IHdhaXRJZCkgOgpAQCAtMTQzLDMgKzE4MCwxMjAgQEAKICAgICB9CiAgICAgcmV0dXJuIEMyRmVuY2UoKTsKIH0KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIF9DMkZlbmNlRmFjdG9yeTo6U3luY0ZlbmNlSW1wbCA6IHB1YmxpYyBDMkZlbmNlOjpJbXBsIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHdhaXQoYzJfbnNlY3NfdCB0aW1lb3V0TnMpIHsKKyAgICAgICAgYzJfbnNlY3NfdCB0aW1lb3V0TXMgPSB0aW1lb3V0TnMgLyAxMDAwOworICAgICAgICBpZiAodGltZW91dE1zID4gSU5UX01BWCkgeworICAgICAgICAgICAgdGltZW91dE1zID0gSU5UX01BWDsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAobUZlbmNlLT53YWl0KChpbnQpdGltZW91dE1zKSkgeworICAgICAgICAgICAgY2FzZSBOT19FUlJPUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgICAgICBjYXNlIC1FVElNRToKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfVElNRURfT1VUOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHZhbGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUZlbmNlLT5nZXRTdGF0dXMoKSAhPSBGZW5jZTo6U3RhdHVzOjpJbnZhbGlkOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCByZWFkeSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1GZW5jZS0+Z2V0U3RhdHVzKCkgPT0gRmVuY2U6OlN0YXR1czo6U2lnbmFsZWQ7CisgICAgfQorCisgICAgdmlydHVhbCBpbnQgZmQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRmVuY2UtPmR1cCgpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc0hXKCkgY29uc3QgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHR5cGVfdCB0eXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gU1lOQ19GRU5DRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIG5hdGl2ZV9oYW5kbGVfdCAqY3JlYXRlTmF0aXZlSGFuZGxlKCkgY29uc3QgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMSk7CisgICAgICAgIGlmICghbmgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgbmF0aXZlIGhhbmRsZSBmb3Igc3luYyBmZW5jZSIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbmgtPmRhdGFbMF0gPSBmZCgpOworICAgICAgICBuaC0+ZGF0YVsxXSA9IHR5cGUoKTsKKyAgICAgICAgcmV0dXJuIG5oOworICAgIH0KKworICAgIHZpcnR1YWwgflN5bmNGZW5jZUltcGwoKSB7fTsKKworICAgIFN5bmNGZW5jZUltcGwoaW50IGZlbmNlRmQpIDoKKyAgICAgICAgICAgIG1GZW5jZShzcDxGZW5jZT46Om1ha2UoZmVuY2VGZCkpIHt9CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFN5bmNGZW5jZUltcGw+IENyZWF0ZUZyb21OYXRpdmVIYW5kbGUoY29uc3QgbmF0aXZlX2hhbmRsZV90KiBuaCkgeworICAgICAgICBpZiAoIW5oIHx8IG5oLT5udW1GZHMgIT0gMSB8fCBuaC0+bnVtSW50cyAhPSAxKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBoYW5kbGUgZm9yIHN5bmMgZmVuY2UiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGludCBmZCA9IGR1cChuaC0+ZGF0YVswXSk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTeW5jRmVuY2VJbXBsPiBwID0gc3RkOjptYWtlX3NoYXJlZDxTeW5jRmVuY2VJbXBsPihmZCk7CisgICAgICAgIGlmICghcCkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBzeW5jIGZlbmNlIGltcGwiKTsKKyAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3A8RmVuY2U+IG1GZW5jZTsKK307CisKK0MyRmVuY2UgX0MyRmVuY2VGYWN0b3J5OjpDcmVhdGVTeW5jRmVuY2UoaW50IGZlbmNlRmQpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJGZW5jZTo6SW1wbD4gcDsKKyAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgIHAgPSBzdGQ6Om1ha2Vfc2hhcmVkPF9DMkZlbmNlRmFjdG9yeTo6U3luY0ZlbmNlSW1wbD4oZmVuY2VGZCk7CisgICAgICAgIGlmICghcCkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBzeW5jIGZlbmNlIGltcGwiKTsKKyAgICAgICAgICAgIGNsb3NlKGZlbmNlRmQpOworICAgICAgICB9CisgICAgICAgIGlmICghcC0+dmFsaWQoKSkgeworICAgICAgICAgICAgcC5yZXNldCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkNyZWF0ZSBzeW5jIGZlbmNlIGZyb20gaW52YWxpZCBmZCIpOworICAgIH0KKyAgICByZXR1cm4gQzJGZW5jZShwKTsKK30KKworbmF0aXZlX2hhbmRsZV90KiBfQzJGZW5jZUZhY3Rvcnk6OkNyZWF0ZU5hdGl2ZUhhbmRsZShjb25zdCBDMkZlbmNlJiBmZW5jZSkgeworICAgIHJldHVybiBmZW5jZS5tSW1wbD8gZmVuY2UubUltcGwtPmNyZWF0ZU5hdGl2ZUhhbmRsZSgpIDogbnVsbHB0cjsKK30KKworQzJGZW5jZSBfQzJGZW5jZUZhY3Rvcnk6OkNyZWF0ZUZyb21OYXRpdmVIYW5kbGUoY29uc3QgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpIHsKKyAgICBpZiAoIWhhbmRsZSkgeworICAgICAgICByZXR1cm4gQzJGZW5jZSgpOworICAgIH0KKyAgICBDMkZlbmNlOjpJbXBsOjp0eXBlX3QgdHlwZSA9IEMyRmVuY2U6OkltcGw6OkdldFR5cGVGcm9tTmF0aXZlSGFuZGxlKGhhbmRsZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmVuY2U6OkltcGw+IHA7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgQzJGZW5jZTo6SW1wbDo6U1lOQ19GRU5DRToKKyAgICAgICAgICAgIHAgPSBTeW5jRmVuY2VJbXBsOjpDcmVhdGVGcm9tTmF0aXZlSGFuZGxlKGhhbmRsZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dEKCJVbnN1cHBvcnRlZCBmZW5jZSB0eXBlICVkIiwgdHlwZSk7CisgICAgICAgICAgICAvLyByZXR1cm4gYSBudWxsLWZlbmNlIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChwICYmICFwLT52YWxpZCgpKSB7CisgICAgICAgIHAucmVzZXQoKTsKKyAgICB9CisgICAgcmV0dXJuIEMyRmVuY2UocCk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCcUJ1ZmZlclByaXYuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCcUJ1ZmZlclByaXYuaAppbmRleCBiMjYzNmU5Li4yOWFhZDVlIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmgKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oCkBAIC0xMDEsNiArMTAxLDggQEAKICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb25JZCwKICAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UpOwogCisgICAgdmlydHVhbCB2b2lkIGdldENvbnN1bWVyVXNhZ2UodWludDY0X3QgKmNvbnN1bWVyVXNhZ2UpOworCiBwcml2YXRlOgogICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKICAgICBjb25zdCBsb2NhbF9pZF90IG1Mb2NhbElkOwpAQCAtMTI3LDggKzEyOSw5IEBACiAgICAgLy8gQ3JlYXRlIGEgbG9jYWwgQmxvY2tQb29sRGF0YS4KICAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGludD4gJm93bmVyLAogICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+LCBpbnQgbm9Vc2UpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+KTsKIAogICAgIHZpcnR1YWwgfkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKCkgb3ZlcnJpZGU7CiAKQEAgLTEzOCw3ICsxNDEsNiBAQAogICAgICAgICAgICAgICAgIHVpbnQzMl90IHRvR2VuZXJhdGlvbiwgdWludDY0X3QgdG9Vc2FnZSwgdWludDY0X3QgdG9CcUlkLAogICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkdyYXBoaWNCdWZmZXI+JiBncmFwaGljQnVmZmVyLCB1aW50MzJfdCBvbGRHZW5lcmF0aW9uLAogICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBzeW5jTWVtKTsKLQogcHJpdmF0ZToKICAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkZlbmNlRmFjdG9yeS5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkZlbmNlRmFjdG9yeS5oCmluZGV4IGQ0YmVkMjYuLjQ5NDQxMTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJGZW5jZUZhY3RvcnkuaAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRmVuY2VGYWN0b3J5LmgKQEAgLTI4LDYgKzI4LDcgQEAKIHN0cnVjdCBfQzJGZW5jZUZhY3RvcnkgewogCiAgICAgY2xhc3MgU3VyZmFjZUZlbmNlSW1wbDsKKyAgICBjbGFzcyBTeW5jRmVuY2VJbXBsOwogCiAgICAgLyoKICAgICAgKiBDcmVhdGUgQzJGZW5jZSBmb3IgQnVmZmVyUXVldWVCYXNlZCBibG9ja3Bvb2wuCkBAIC0zOCw2ICszOSwzMCBAQAogICAgIHN0YXRpYyBDMkZlbmNlIENyZWF0ZVN1cmZhY2VGZW5jZSgKICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBzeW5jTWVtLAogICAgICAgICAgICAgdWludDMyX3Qgd2FpdElkKTsKKworICAgIC8qCisgICAgICogQ3JlYXRlIEMyRmVuY2UgZnJvbSBhIGZlbmNlIGZpbGUgZmQuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmVuY2VGZCAgICAgICAgICAgRmVuY2UgZmlsZSBkZXNjcmlwdG9yLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBJdCB3aWxsIGJlIG93bmVkIGFuZCBjbG9zZWQgYnkgdGhlIHJldHVybmVkIGZlbmNlIG9iamVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJGZW5jZSBDcmVhdGVTeW5jRmVuY2UoaW50IGZlbmNlRmQpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmF0aXZlIGhhbmRsZSBmcm9tIGZlbmNlIGZvciBtYXJzaGFsbGluZworICAgICAqCisgICAgICogXHJldHVybiBhIG5vbi1udWxsIHBvaW50ZXIgaWYgdGhlIGZlbmNlIGNhbiBiZSBtYXJzaGFsbGVkLCBvdGhlcndpc2UgcmV0dXJuIG51bGxwdHIKKyAgICAgKi8KKyAgICBzdGF0aWMgbmF0aXZlX2hhbmRsZV90KiBDcmVhdGVOYXRpdmVIYW5kbGUoY29uc3QgQzJGZW5jZSYgZmVuY2UpOworCisgICAgLyoKKyAgICAgKiBDcmVhdGUgQzJGZW5jZSBmcm9tIGEgbmF0aXZlIGhhbmRsZS4KKworICAgICAqIFxwYXJhbSBoYW5kbGUgICAgICAgICAgIEEgbmF0aXZlIGhhbmRsZSByZXByZXNlbnRpbmcgYSBmZW5jZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmZCBpbiB0aGUgbmF0aXZlIGhhbmRsZSB3aWxsIGJlIGR1cGxpY2F0ZWQsIHNvIHRoZSBjYWxsZXIgd2lsbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWxsIG93biB0aGUgaGFuZGxlIGFuZCBoYXZlIHRvIGNsb3NlIGl0LgorICAgICAqLworICAgIHN0YXRpYyBDMkZlbmNlIENyZWF0ZUZyb21OYXRpdmVIYW5kbGUoY29uc3QgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpOwogfTsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCmluZGV4IGRjNjFjNGUuLmU2N2U0MmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCkBAIC01NDIsNyArNTQyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlcklkLCBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXIsIG1TeW5jTWVtLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlnYnBWYWxpZGl0eVRva2VuLCBtUHJvZHVjZXIsIG1TeW5jTWVtKTsKICAgICAgICAgICAgICAgICBtUG9vbERhdGFzW3Nsb3RdID0gcG9vbERhdGE7CiAgICAgICAgICAgICAgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CkBAIC01NzEsMTEgKzU3MSwxMiBAQAogcHVibGljOgogICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQogICAgICAgICA6IG1Jbml0KEMyX09LKSwgbVByb2R1Y2VySWQoMCksIG1HZW5lcmF0aW9uKDApLAotICAgICAgICAgIG1EcUZhaWx1cmUoMCksIG1MYXN0RHFUcygwKSwgbUxhc3REcUxvZ1RzKDApLAotICAgICAgICAgIG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7CisgICAgICAgICAgbUNvbnN1bWVyVXNhZ2UoMCksIG1EcUZhaWx1cmUoMCksIG1MYXN0RHFUcygwKSwKKyAgICAgICAgICBtTGFzdERxTG9nVHMoMCksIG1BbGxvY2F0b3IoYWxsb2NhdG9yKSwgbUlnYnBWYWxpZGl0eVRva2VuKHN0ZDo6bWFrZV9zaGFyZWQ8aW50PigwKSkgewogICAgIH0KIAogICAgIH5JbXBsKCkgeworICAgICAgICBtSWdicFZhbGlkaXR5VG9rZW4ucmVzZXQoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fQlVGRkVSX1NMT1RTOyArK2kpIHsKICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNsZWFyKCk7CiAgICAgICAgIH0KQEAgLTYxOCw3ICs2MTksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CiAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICh1aW50NjRfdCkwLCB+MCwgbnVsbHB0ciwgbnVsbHB0ciwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgKHVpbnQ2NF90KTAsIH4wLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKTsKICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CiAgICAgICAgICAgICBBTE9HVigiYWxsb2NhdGVkIGEgYnVmZmVyIHN1Y2Nlc3NmdWxseSIpOwogCkBAIC02OTQsOCArNjk1LDcgQEAKICAgICAgICAgICAgICAgICBtUHJvZHVjZXIgPSBudWxscHRyOwogICAgICAgICAgICAgICAgIG1Qcm9kdWNlcklkID0gMDsKICAgICAgICAgICAgICAgICBtR2VuZXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgQUxPR1coImludmFsaWQgcHJvZHVjZXIgcHJvZHVjZXIoJWQpLCBnZW5lcmF0aW9uKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgKGJvb2wpcHJvZHVjZXIsIGJxSW5mb3JtYXRpb24pOworICAgICAgICAgICAgICAgIEFMT0dEKCJjb25maWd1cmluZyBudWxsIHByb2R1Y2VyOiBpZ2JwX2luZm9ybWF0aW9uKCVkKSIsIGJxSW5mb3JtYXRpb24pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb2xkTWVtID0gbVN5bmNNZW07IC8vIHByZXZlbiBkZXN0cnVjdGlvbiB3aGlsZSBsb2NrZWQuCiAgICAgICAgICAgICBtU3luY01lbSA9IGMyU3luY01lbTsKQEAgLTcyMCw2ICs3MjAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gb2xkIGJ1ZmZlcnMgc2hvdWxkIG5vdCBiZSBjYW5jZWxsZWQgc2luY2UgdGhlIGFzc29jaWF0ZWQgSUdCUAorICAgICAgICAgICAgICAgIC8vIGlzIG5vIGxvbmdlciB2YWxpZC4KKyAgICAgICAgICAgICAgICBtSWdicFZhbGlkaXR5VG9rZW4gPSBzdGQ6Om1ha2Vfc2hhcmVkPGludD4oMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7ICsraSkgewogICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldID0gYnVmZmVyc1tpXTsKQEAgLTczMSw2ICs3MzUsMTEgQEAKICAgICAgICAgICAgICAgICAgICJicUlkOiAlbGx1IG1pZ3JhdGVkIGJ1ZmZlcnMgIyAlZCIsCiAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uLCAodW5zaWduZWQgbG9uZyBsb25nKXByb2R1Y2VySWQsIG1pZ3JhdGVkKTsKICAgICAgICAgfQorICAgICAgICBtQ29uc3VtZXJVc2FnZSA9IHVzYWdlOworICAgIH0KKworICAgIHZvaWQgZ2V0Q29uc3VtZXJVc2FnZSh1aW50NjRfdCAqY29uc3VtZVVzYWdlKSB7CisgICAgICAgICpjb25zdW1lVXNhZ2UgPSBtQ29uc3VtZXJVc2FnZTsKICAgICB9CiAKIHByaXZhdGU6CkBAIC03MzksNiArNzQ4LDcgQEAKICAgICBjMl9zdGF0dXNfdCBtSW5pdDsKICAgICB1aW50NjRfdCBtUHJvZHVjZXJJZDsKICAgICB1aW50MzJfdCBtR2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBtQ29uc3VtZXJVc2FnZTsKICAgICBPblJlbmRlckNhbGxiYWNrIG1SZW5kZXJDYWxsYmFjazsKIAogICAgIHNpemVfdCBtRHFGYWlsdXJlOwpAQCAtNzU1LDYgKzc2NSwyMCBAQAogICAgIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IG1Qb29sRGF0YXNbTlVNX0JVRkZFUl9TTE9UU107CiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gbVN5bmNNZW07CisKKyAgICAvLyBJR0JQIGludmFsaWRhdGlvbiBub3RpZmljYXRpb24gdG9rZW4uCisgICAgLy8gVGhlIGJ1ZmZlcnMoQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEpIGhhcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBJR0JQIHdoZXJlCisgICAgLy8gdGhleSBiZWxvbmcgaW4gb3JkZXIgdG8gY2FsbCBJR0JQOjpjYW5jZWxCdWZmZXIoKSB3aGVuIHRoZXkgYXJlIG9mIG5vIHVzZS4KKyAgICAvLworICAgIC8vIEluIGNlcnRhaW4gY2FzZXMsIElHQlAgaXMgbm8gbG9uZ2VyIHVzZWQgYnkgdGhpcyBjbGFzcyhhY3R1YWxseSBNZWRpYUNvZGVjKQorICAgIC8vIGFueSBtb3JlIGFuZCB0aGUgc2l0dWF0aW9uIG5lZWRzIHRvIGJlIGFkZHJlc3NlZCBxdWlja2x5LiBJbiBvcmRlciB0bworICAgIC8vIGFjaGlldmUgdGhvc2UsIHN0ZDo6c2hhcmVkX3B0cjw+IGlzIHVzZWQgYXMgYSB0b2tlbiBmb3IgcXVpY2sgSUdCUCBpbnZhbGlkYXRpb24KKyAgICAvLyBub3RpZmljYXRpb24gZnJvbSB0aGUgYnVmZmVycy4KKyAgICAvLworICAgIC8vIFRoZSBidWZmZXIgc2lkZSB3aWxsIGhhdmUgdGhlIHJlZmVyZW5jZSBvZiB0aGUgdG9rZW4gYXMgc3RkOjp3ZWFrX3B0cjw+LgorICAgIC8vIGlmIHRoZSB0b2tlbiBoYXMgYmVlbiBleHBpcmVkLCB0aGUgYnVmZmVycyB3aWxsIG5vdCBjYWxsIElHQlA6OmNhbmNlbEJ1ZmZlcigpCisgICAgLy8gd2hlbiB0aGV5IGFyZSBubyBsb25nZXIgdXNlZC4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8aW50PiBtSWdicFZhbGlkaXR5VG9rZW47CiB9OwogCiBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoCkBAIC03NzAsMTQgKzc5NCwxNCBAQAogCiBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoCiAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8aW50PiYgb3duZXIsCiAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKLSAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+IHN5bmNNZW0sIGludCBub1VzZSkgOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gc3luY01lbSkgOgogICAgICAgICBtTG9jYWwodHJ1ZSksIG1IZWxkKHRydWUpLAogICAgICAgICBtR2VuZXJhdGlvbihnZW5lcmF0aW9uKSwgbUJxSWQoYnFJZCksIG1CcVNsb3QoYnFTbG90KSwKICAgICAgICAgbUN1cnJlbnRHZW5lcmF0aW9uKGdlbmVyYXRpb24pLCBtQ3VycmVudEJxSWQoYnFJZCksCiAgICAgICAgIG1UcmFuc2ZlcihmYWxzZSksIG1BdHRhY2goZmFsc2UpLCBtRGlzcGxheShmYWxzZSksCi0gICAgICAgIG1JZ2JwKHByb2R1Y2VyKSwgbVN5bmNNZW0oc3luY01lbSkgewotICAgICAgICAgICAgKHZvaWQpbm9Vc2U7CisgICAgICAgIG1Pd25lcihvd25lciksIG1JZ2JwKHByb2R1Y2VyKSwgbVN5bmNNZW0oc3luY01lbSkgewogfQogCiBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6fkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKCkgewpAQCAtNzg2LDcgKzgxMCw3IEBACiAgICAgfQogCiAgICAgaWYgKG1Mb2NhbCkgewotICAgICAgICBpZiAobUdlbmVyYXRpb24gPT0gbUN1cnJlbnRHZW5lcmF0aW9uICYmIG1CcUlkID09IG1DdXJyZW50QnFJZCkgeworICAgICAgICBpZiAobUdlbmVyYXRpb24gPT0gbUN1cnJlbnRHZW5lcmF0aW9uICYmIG1CcUlkID09IG1DdXJyZW50QnFJZCAmJiAhbU93bmVyLmV4cGlyZWQoKSkgewogICAgICAgICAgICAgQzJTeW5jVmFyaWFibGVzICpzeW5jVmFyID0gbVN5bmNNZW0gPyBtU3luY01lbS0+bWVtKCkgOiBudWxscHRyOwogICAgICAgICAgICAgaWYgKHN5bmNWYXIpIHsKICAgICAgICAgICAgICAgICBzeW5jVmFyLT5sb2NrKCk7CkBAIC0xMDcwLDMgKzEwOTQsMTAgQEAKICAgICAgICAgbUltcGwtPnNldFJlbmRlckNhbGxiYWNrKHJlbmRlckNhbGxiYWNrKTsKICAgICB9CiB9CisKK3ZvaWQgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6Z2V0Q29uc3VtZXJVc2FnZSh1aW50NjRfdCAqY29uc3VtZVVzYWdlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5nZXRDb25zdW1lclVzYWdlKGNvbnN1bWVVc2FnZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMlN1cmZhY2VTeW5jT2JqLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyU3VyZmFjZVN5bmNPYmouY3BwCmluZGV4IGU1NWJkYzAuLjIxMTVjYzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyU3VyZmFjZVN5bmNPYmouY3BwCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyU3VyZmFjZVN5bmNPYmouY3BwCkBAIC0yMjgsMTAgKzIyOCwxMCBAQAogICAgIHR2LnR2X25zZWMgPSB0aW1lb3V0TnMgJSAxMDAwMDAwMDAwOwogCiAgICAgaW50IHJldCA9ICBzeXNjYWxsKF9fTlJfZnV0ZXgsICZtQ29uZCwgRlVURVhfV0FJVCwgd2FpdElkLCAmdHYsIE5VTEwsIDApOwotICAgIGlmIChyZXQgPT0gMCB8fCByZXQgPT0gRUFHQUlOKSB7CisgICAgaWYgKHJldCA9PSAwIHx8IGVycm5vID09IEVBR0FJTikgewogICAgICAgICByZXR1cm4gQzJfT0s7CiAgICAgfQotICAgIGlmIChyZXQgPT0gRUlOVFIgfHwgcmV0ID09IEVUSU1FRE9VVCkgeworICAgIGlmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFVElNRURPVVQpIHsKICAgICAgICAgcmV0dXJuIEMyX1RJTUVEX09VVDsKICAgICB9CiAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icAppbmRleCBiYWU2NWYzLi4wYmM2ZWQyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0yMiw2ICsyMiwxMCBAQAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYWRkLmNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKaW5kZXggMTA4M2I4Mi4uNzA3NDFkMiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icApAQCAtMzUsNiArMzUsMTAgQEAKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogCiAgICAgc3JjczogWwogICAgICAgICAic3JjL2FfcmVmbC5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCmluZGV4IDllOTQ3ZTkuLjNjNjU2NmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKQEAgLTM0LDYgKzM0LDEwIEBACiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogCiAgICAgc3JjczogWwogICAgICAgICAic3JjL2FtcmVuY29kZS5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9BbmRyb2lkLmJwCmluZGV4IDIyOGVhODAuLmYxNmIwZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL0FuZHJvaWQuYnAKQEAgLTM1LDYgKzM1LDEwIEBACiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgInNyYy9hZ2MyX2Ftcl93Yi5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9BbmRyb2lkLmJwCmluZGV4IGQ5NDU1MzEuLjg3ODAxMzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL0FuZHJvaWQuYnAKQEAgLTIxLDYgKzIxLDEwIEBACiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogCiAgICAgc3JjczogWwogICAgICAgICAic3JjL2F1dG9jb3JyLmMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2FwaS5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcAppbmRleCAwMGIyYWI2Li5iMjk1MjU4IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcApAQCAtNTAxLDEzICs1MDEsMTYgQEAKICAgICAvKiBjaGVjayBmcmFtZSByYXRlICovCiAgICAgZm9yIChpID0gMDsgaSA8IGVuY1BhcmFtcy0+bkxheWVyczsgaSsrKQogICAgIHsKKyAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlW2ldIDw9IDAuIHx8IGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlW2ldID4gMTIwKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgICAgICB9CiAgICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaV0gPSBlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVtpXTsKICAgICB9CiAKICAgICBpZiAoZW5jUGFyYW1zLT5uTGF5ZXJzID4gMSkKICAgICB7Ci0gICAgICAgIGlmIChlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVswXSA9PSBlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVsxXSB8fAotICAgICAgICAgICAgICAgIGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzBdID09IDAuIHx8IGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzFdID09IDAuKSAvKiA3LzMxLzAzICovCisgICAgICAgIGlmIChlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVswXSA9PSBlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVsxXSkKICAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CiAgICAgfQogICAgIC8qIHNldCBtYXggZnJhbWUgcmF0ZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9oMjYzX2RlY19mdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9oMjYzX2RlY19mdXp6ZXIuY3BwCmluZGV4IDkxMmM4MjEuLjVlNjEzZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfaDI2M19kZWNfZnV6emVyLmNwcAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAKQEAgLTUwLDcgKzUwLDcgQEAKIAogIHByaXZhdGU6CiAgIHRhZ3ZpZGVvRGVjQ29udHJvbHMgKm1EZWNIYW5kbGUgPSBudWxscHRyOwotICB1aW50OF90ICptT3V0cHV0QnVmZmVyW2tOdW1PdXRwdXRCdWZmZXJzXTsKKyAgdWludDhfdCAqbU91dHB1dEJ1ZmZlcltrTnVtT3V0cHV0QnVmZmVyc10gPSB7fTsKICAgYm9vbCBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgYm9vbCBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOwogI2lmZGVmIE1QRUc0CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKaW5kZXggMWFiMDUxMS4uNjY1OWVhNSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icApAQCAtNDcsNiArNDcsMTAgQEAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXAzZGVjIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogCiAgICAgaG9zdF9zdXBwb3J0ZWQ6dHJ1ZSwKICAgICBzcmNzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAKaW5kZXggNzUxM2NiMS4uZjY1NGVjZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icApAQCAtMjQsMjEgKzI0LDE5IEBACiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogImV4dHJhY3Rvci1kZWZhdWx0cyIsCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgXSwKLQogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCiAKLSAgICAvLyBleHRyYWN0b3JzIGFyZSBzdXBwb3NlZCB0byB3b3JrIG9uIFEoMjkpCisgICAgLy8gZXh0cmFjdG9ycyBhcmUgZXhwZWN0ZWQgdG8gcnVuIG9uIFEoMjkpCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICBdLAogCiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiZXh0cmFjdG9ycyIsCiAKLSAgICBjb21waWxlX211bHRpbGliOiAiZmlyc3QiLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvVEVTVF9NQVBQSU5HIGIvbWVkaWEvZXh0cmFjdG9ycy9URVNUX01BUFBJTkcKaW5kZXggNDk4NGI4Zi4uYTdjMmNmZSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9URVNUX01BUFBJTkcKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9URVNUX01BUFBJTkcKQEAgLTEsNiArMSw5IEBACiB7CiAgICJwcmVzdWJtaXQiOiBbCiAKKyAgICAgICAgeworICAgICAgICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFUcmFuc2NvZGluZ1Rlc3RDYXNlcyIKKyAgICAgICAgfQogICAgIC8vIFRPRE8oYi8xNTM2NjE1OTEpIGVuYWJsZSB0ZXN0IG9uY2UgdGhlIGJ1ZyBpcyBmaXhlZAogICAgIC8vIFRoaXMgdGVzdHMgdGhlIGV4dHJhY3RvciBwYXRoCiAgICAgLy8gewpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKaW5kZXggN2JmM2ExMy4uYTkyNjQyMiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCkBAIC0yMSw2ICsyMSwxMCBAQAogCiAgICAgc3JjczogWyJBQUNFeHRyYWN0b3IuY3BwIl0sCiAKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL2luY2x1ZGUvQUFDRXh0cmFjdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL2FhYy9pbmNsdWRlL0FBQ0V4dHJhY3Rvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icAppbmRleCA3MTIzNjBkLi4xMjFiN2EzIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKQEAgLTIxLDYgKzIxLDEwIEBACiAKICAgICBzcmNzOiBbIkFNUkV4dHJhY3Rvci5jcHAiXSwKIAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvaW5jbHVkZS9BTVJFeHRyYWN0b3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvYW1yL2luY2x1ZGUvQU1SRXh0cmFjdG9yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKaW5kZXggOWEyYTc2Yi4uODM0ZjRhZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKQEAgLTE5LDEyICsxOSwxMiBAQAogCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliZmxhY2V4dHJhY3RvciIsCi0gICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWRlZmF1bHRzIiwgImxpYmJpbmRlcl9uZGtfaG9zdF91c2VyIl0sCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIkZMQUNFeHRyYWN0b3IuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL2ZsYWMvaW5jbHVkZSIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL2luY2x1ZGUvRkxBQ0V4dHJhY3Rvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL2ZsYWMvaW5jbHVkZS9GTEFDRXh0cmFjdG9yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL0FuZHJvaWQuYnAKaW5kZXggMGU1NGI1OC4uNDkwZTE5NSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL0FuZHJvaWQuYnAKQEAgLTgwLDExICs4MCw2IEBACiAgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbXBlZzIiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgXSwKLQogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX3dpdGhvdXRfaW1lbW9yeSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLApAQCAtMTI0LDE0ICsxMTksNiBAQAogICAgICAgICAibXA0X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbXA0IiwKLSAgICBdLAotCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAotICAgIF0sCi0KICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLApAQCAtMTUwLDEwICsxMzcsNiBAQAogICAgICAgICAid2F2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvd2F2IiwKLSAgICBdLAotCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmZpZm8iLAogICAgICAgICAibGlid2F2ZXh0cmFjdG9yIiwKQEAgLTE3MywxMCArMTU2LDYgQEAKICAgICAgICAgImFtcl9leHRyYWN0b3JfZnV6emVyLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL2FtciIsCi0gICAgXSwKLQogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJhbXJleHRyYWN0b3IiLAogICAgIF0sCkBAIC0xOTMsMTAgKzE3Miw2IEBACiAgICAgICAgICJta3ZfZXh0cmFjdG9yX2Z1enplci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9ta3YiLAotICAgIF0sCi0KICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlid2VibSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKQEAgLTIxNyw5ICsxOTIsNiBAQAogICAgICAgICAib2dnX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvb2dnIiwKLSAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLApAQCAtMjY1LDEwICsyMzcsNiBAQAogICAgICAgICAibXAzX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbXAzIiwKLSAgICBdLAotCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmZpZm8iLAogICAgICAgICAibGlibXAzZXh0cmFjdG9yIiwKQEAgLTI4NSwxMCArMjUzLDYgQEAKICAgICAgICAgImFhY19leHRyYWN0b3JfZnV6emVyLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL2FhYyIsCi0gICAgXSwKLQogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJhYWNleHRyYWN0b3IiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCkBAIC0zMDQsMTAgKzI2OCw2IEBACiAgICAgICAgICJmbGFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvZmxhYyIsCi0gICAgXSwKLQogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKICAgICAgICAgImxpYkZMQUMiLApAQCAtMzI5LDEwICsyODksNiBAQAogICAgICAgICAibWlkaV9leHRyYWN0b3JfZnV6emVyLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL21pZGkiLAotICAgIF0sCi0KICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic29uaXZveCIsCiAgICAgICAgICJsaWJtZWRpYV9taWRpaW93cmFwcGVyIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKaW5kZXggMDhhNmZhMC4uZmVhYmY5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKQEAgLTIzLDYgKzIzLDEwIEBACiAKICAgICBzcmNzOiBbIk1pZGlFeHRyYWN0b3IuY3BwIl0sCiAKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2RhdGFzb3VyY2VfaGVhZGVycyIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvaW5jbHVkZS9NaWRpRXh0cmFjdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvbWlkaS9pbmNsdWRlL01pZGlFeHRyYWN0b3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKaW5kZXggNTRjNWIyNy4uOThjZTMwNSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCkBAIC0yMSwxMCArMjEsOCBAQAogCiAgICAgc3JjczogWyJNYXRyb3NrYUV4dHJhY3Rvci5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZXh0ZXJuYWwvZmxhYy9pbmNsdWRlIiwKLSAgICAgICAgImV4dGVybmFsL2xpYnZweC9saWJ3ZWJtIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L2luY2x1ZGUvTWF0cm9za2FFeHRyYWN0b3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaApyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9ta3YvaW5jbHVkZS9NYXRyb3NrYUV4dHJhY3Rvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icAppbmRleCA3NWI5YjdiLi4zOTZhMTNhIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKQEAgLTE2LDYgKzE2LDEwIEBACiAgICAgICAgICAgICAiWElOR1NlZWtlci5jcHAiLAogICAgIF0sCiAKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2lkMyIsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL2luY2x1ZGUvTVAzRXh0cmFjdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wMy9pbmNsdWRlL01QM0V4dHJhY3Rvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNTZWVrZXIuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL2luY2x1ZGUvTVAzU2Vla2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXAzL01QM1NlZWtlci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wMy9pbmNsdWRlL01QM1NlZWtlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9pbmNsdWRlL1ZCUklTZWVrZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wMy9pbmNsdWRlL1ZCUklTZWVrZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvaW5jbHVkZS9YSU5HU2Vla2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaApyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9tcDMvaW5jbHVkZS9YSU5HU2Vla2VyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCmluZGV4IDdmYTZiZmQuLjU0MGQ3NWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icApAQCAtMTUsNiArMTUsMTUgQEAKICAgICBdLAogfQogCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJtcDRleHRyYWN0b3JfaGVhZGVycyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibXA0ZXh0cmFjdG9yIiwKICAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZGVmYXVsdHMiXSwKQEAgLTI3LDYgKzM2LDEwIEBACiAgICAgICAgICJTYW1wbGVUYWJsZS5jcHAiLAogICAgIF0sCiAKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKaW5kZXggNjVjMDIzOC4uN2Y5N2RkYyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcApAQCAtMTEzMiwxMCArMTEzMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2l6ZSA+PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHByb2ZpbGUgPSBwdHJbMl0gPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgYmxfY29tcGF0aWJpbGl0eV9pZCA9IChwdHJbNF0pID4+IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IGJsQ29tcGF0aWJpbGl0eUlkID0gKHB0cls0XSkgPj4gNDsKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY3JlYXRlX3R3b190cmFja3MgPSBmYWxzZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsX2NvbXBhdGliaWxpdHlfaWQgJiYgYmxfY29tcGF0aWJpbGl0eV9pZCAhPSAxNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsQ29tcGF0aWJpbGl0eUlkICYmIGJsQ29tcGF0aWJpbGl0eUlkICE9IDE1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlX3R3b190cmFja3MgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0xMTQ3LDEzICsxMTQ3LDE1IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19iLT50aW1lc2NhbGUgPSBtTGFzdFRyYWNrLT50aW1lc2NhbGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfYi0+c2FtcGxlVGFibGUgPSBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19iLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEgPSBtTGFzdFRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfYi0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ItPnNraXBUcmFjayA9IG1MYXN0VHJhY2stPnNraXBUcmFjazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19iLT5lbHN0X25lZWRzX3Byb2Nlc3NpbmcgPSBtTGFzdFRyYWNrLT5lbHN0X25lZWRzX3Byb2Nlc3Npbmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfYi0+ZWxzdF9tZWRpYV90aW1lID0gbUxhc3RUcmFjay0+ZWxzdF9tZWRpYV90aW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ItPmVsc3Rfc2VnbWVudF9kdXJhdGlvbiA9IG1MYXN0VHJhY2stPmVsc3Rfc2VnbWVudF9kdXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19iLT5lbHN0X3NoaWZ0X3N0YXJ0X3RpY2tzID0gbUxhc3RUcmFjay0+ZWxzdF9zaGlmdF9zdGFydF90aWNrczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19iLT5lbHN0X2luaXRpYWxfZW1wdHlfZWRpdF90aWNrcyA9IG1MYXN0VHJhY2stPmVsc3RfaW5pdGlhbF9lbXB0eV9lZGl0X3RpY2tzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ItPmVsc3RfaW5pdGlhbF9lbXB0eV9lZGl0X3RpY2tzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+ZWxzdF9pbml0aWFsX2VtcHR5X2VkaXRfdGlja3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfYi0+c3Vic2FtcGxlX2VuY3J5cHRpb24gPSBtTGFzdFRyYWNrLT5zdWJzYW1wbGVfZW5jcnlwdGlvbjsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ItPm1UeDNnQnVmZmVyID0gbUxhc3RUcmFjay0+bVR4M2dCdWZmZXI7CkBAIC0yNTkxLDkgKzI1OTMsMTEgQEAKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCJkdmNDIik6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCJkdnZDIik6IHsKIAorICAgICAgICBjYXNlIEZPVVJDQygiZHZjQyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiZHZ2QyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiZHZ3QyIpOgorICAgICAgICB7CiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplICE9IDI0KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KQEAgLTI2MTMsMTMgKzI2MTcsMTQgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCiAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04pOwogCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorCiAgICAgICAgIGNhc2UgRk9VUkNDKCJkMjYzIik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKQEAgLTM0ODAsNyArMzQ4NSw3IEBACiAgICAgICAgIH0KICAgICAgICAgdW5zaWduZWQgbWFzayA9IGJyLmdldEJpdHMoOCk7CiAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCA4OyBpKyspIHsKLSAgICAgICAgICAgIGlmICgoKDB4MSA8PCBpKSAmJiBtYXNrKSA9PSAwKQorICAgICAgICAgICAgaWYgKCgoMHgxIDw8IGkpICYgbWFzaykgPT0gMCkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA4KSB7CkBAIC00NDU4LDcgKzQ0NjMsNiBAQAogICAgIGlmICghQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotCiAgICAgc3A8SXRlbVRhYmxlPiBpdGVtVGFibGU7CiAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKICAgICAgICAgdm9pZCAqZGF0YTsKQEAgLTQ0OTEsMTQgKzQ0OTUsMTQgQEAKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTikpIHsKICAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMiwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsICZkYXRhLCAmc2l6ZSkKKyAgICAgICAgICAgICAgICB8fCBzaXplICE9IDI0KSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKLQogICAgICAgICAvLyBkdl9tYWpvci5kdl9taW5vciBTaG91bGQgYmUgMS4wIG9yIDIuMQotICAgICAgICBpZiAoc2l6ZSAhPSAyNCB8fCAoKHB0clswXSAhPSAxIHx8IHB0clsxXSAhPSAwKSAmJiAocHRyWzBdICE9IDIgfHwgcHRyWzFdICE9IDEpKSkgeworICAgICAgICBpZiAoKHB0clswXSAhPSAxIHx8IHB0clsxXSAhPSAwKSAmJiAocHRyWzBdICE9IDIgfHwgcHRyWzFdICE9IDEpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L2luY2x1ZGUvQUM0UGFyc2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wNC9pbmNsdWRlL0FDNFBhcnNlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L2luY2x1ZGUvSXRlbVRhYmxlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wNC9pbmNsdWRlL0l0ZW1UYWJsZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wNC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9pbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvbXA0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L2luY2x1ZGUvU2FtcGxlVGFibGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaApyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9tcDQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKaW5kZXggN2U2MjQ3Yi4uYWE1OWEwYyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icApAQCAtMzgsNiArMzgsMTAgQEAKICAgICAgICAgIk1QRUcyVFNFeHRyYWN0b3IuY3BwIiwKICAgICBdLAogCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKwogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmNncm91cHJjIzI5IiwKQEAgLTYxLDYgKzY1LDcgQEAKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGlianNvbmNwcCIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl93aXRob3V0X2ltZW1vcnkiLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAKaW5kZXggZDQzMWIwNS4uYWZkMjhlZiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwCkBAIC0yMCw5ICsyMCw2IEBACiAKICNpbmNsdWRlICJNUEVHMlBTRXh0cmFjdG9yLmgiCiAKLSNpbmNsdWRlIDxBbm90aGVyUGFja2V0U291cmNlLmg+Ci0jaW5jbHVkZSA8RVNRdWV1ZS5oPgotCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTMzLDYgKzMwLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0VTUXVldWUuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAKaW5kZXggMmU2ODgwOS4uOWEzY2Q5MiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCkBAIC0zNSwxMCArMzUsOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAotI2luY2x1ZGUgPEFub3RoZXJQYWNrZXRTb3VyY2UuaD4KLQogI2luY2x1ZGUgPGhpZGwvSHlicmlkSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvMS4wL0lDYXMuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL2luY2x1ZGUvTVBFRzJQU0V4dHJhY3Rvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaApyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9pbmNsdWRlL01QRUcyUFNFeHRyYWN0b3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL21wZWcyL2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCmluZGV4IGZkNzdiMDguLjBlM2U0ODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgKQEAgLTIzLDEyICsyMywxMSBAQAogI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0FUU1BhcnNlci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCi0jaW5jbHVkZSA8QVRTUGFyc2VyLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKaW5kZXggZDc1NDBjNC4uZGMzYzI1YyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCkBAIC0yMiw4ICsyMiw4IEBACiAKICAgICBzcmNzOiBbIk9nZ0V4dHJhY3Rvci5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZXh0ZXJuYWwvdHJlbW9sbyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL2luY2x1ZGUvT2dnRXh0cmFjdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCnJlbmFtZSB0byBtZWRpYS9leHRyYWN0b3JzL29nZy9pbmNsdWRlL09nZ0V4dHJhY3Rvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggMjNjNzRmNy4uM2MzYmJkYyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZC5icApAQCAtNzksMTEgKzc5LDYgQEAKICAgICAgICAgImxpYmJhc2UiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy8iLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC8iLAotICAgIF0sCi0KICAgICBjb21waWxlX211bHRpbGliOiAiZmlyc3QiLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0V4dHJhY3RvclVuaXRUZXN0LmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvRXh0cmFjdG9yVW5pdFRlc3QuY3BwCmluZGV4IDg0ZWMxZjIuLjJiZDljNmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvRXh0cmFjdG9yVW5pdFRlc3QuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvRXh0cmFjdG9yVW5pdFRlc3QuY3BwCkBAIC0yNywxOCArMjcsMTggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CiAKLSNpbmNsdWRlICJhYWMvQUFDRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAiYW1yL0FNUkV4dHJhY3Rvci5oIgotI2luY2x1ZGUgImZsYWMvRkxBQ0V4dHJhY3Rvci5oIgotI2luY2x1ZGUgIm1pZGkvTWlkaUV4dHJhY3Rvci5oIgotI2luY2x1ZGUgIm1rdi9NYXRyb3NrYUV4dHJhY3Rvci5oIgotI2luY2x1ZGUgIm1wMy9NUDNFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJtcDQvTVBFRzRFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJtcDQvU2FtcGxlVGFibGUuaCIKLSNpbmNsdWRlICJtcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAibXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oIgotI2luY2x1ZGUgIm9nZy9PZ2dFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJ3YXYvV0FWRXh0cmFjdG9yLmgiCisjaW5jbHVkZSA8QUFDRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8QU1SRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8RkxBQ0V4dHJhY3Rvci5oPgorI2luY2x1ZGUgPE1pZGlFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxNYXRyb3NrYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPE1QM0V4dHJhY3Rvci5oPgorI2luY2x1ZGUgPE1QRUc0RXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8U2FtcGxlVGFibGUuaD4KKyNpbmNsdWRlIDxNUEVHMlBTRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8TVBFRzJUU0V4dHJhY3Rvci5oPgorI2luY2x1ZGUgPE9nZ0V4dHJhY3Rvci5oPgorI2luY2x1ZGUgPFdBVkV4dHJhY3Rvci5oPgogCiAjaW5jbHVkZSAiRXh0cmFjdG9yVW5pdFRlc3RFbnZpcm9ubWVudC5oIgogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icAppbmRleCBjYzVlMWM3Li5jZGY1ODdjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKQEAgLTE4LDEyICsxOCwxMiBAQAogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYndhdmV4dHJhY3RvciIsCiAKLSAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZGVmYXVsdHMiLCAibGliYmluZGVyX25ka19ob3N0X3VzZXIiXSwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiV0FWRXh0cmFjdG9yLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9pbmNsdWRlL1dBVkV4dHJhY3Rvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaApyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy93YXYvaW5jbHVkZS9XQVZFeHRyYWN0b3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvamFuaXRvcnMvY29kZWNfT1dORVJTIGIvbWVkaWEvamFuaXRvcnMvY29kZWNfT1dORVJTCmluZGV4IGUyMDEzOTkuLmQ0ZWU1MWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2phbml0b3JzL2NvZGVjX09XTkVSUworKysgYi9tZWRpYS9qYW5pdG9ycy9jb2RlY19PV05FUlMKQEAgLTIsNCArMiw0IEBACiAjIGRpZmZlcmVudGlhdGVkIGZyb20gcGx1Z2lucyBjb25uZWN0aW5nIHRob3NlIGNvZGVjcyB0byBlaXRoZXIgb214IG9yIGNvZGVjMiBpbmZyYXN0cnVjdHVyZQogZXNzaWNrQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2phbml0b3JzL21lZGlhX2xlYWRzX09XTkVSUyBiL21lZGlhL2phbml0b3JzL21lZGlhX2xlYWRzX09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2RiZGVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamFuaXRvcnMvbWVkaWFfbGVhZHNfT1dORVJTCkBAIC0wLDAgKzEsOSBAQAorIyBnZXJyaXQgb3duZXIvYXBwcm92ZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFRMcyB3aXRoaW4gdGhlIG1lZGlhIHRlYW0KKyMgbG9vc2VseSAoYXMgb2YgMjAyMi8zKSBmZ29sZGZhaW5AIGFuZCBkaXJlY3QgcmVwb3J0cworYXJpZmRpa2ljaUBnb29nbGUuY29tCitlbGF1cmVudEBnb29nbGUuY29tCitmZ29sZGZhaW5AZ29vZ2xlLmNvbSAgICAje0xBU1RfUkVTT1JUX1NVR0dFU1RJT059CitsYWpvc0Bnb29nbGUuY29tCituY2hhbGtvQGdvb2dsZS5jb20KK29sbHlAZ29vZ2xlLmNvbQorcm9iZXJ0c2hpaEBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9qYW5pdG9ycy9yZWxpYWJpbGl0eV9tYWlubGluZV9PV05FUlMgYi9tZWRpYS9qYW5pdG9ycy9yZWxpYWJpbGl0eV9tYWlubGluZV9PV05FUlMKaW5kZXggZTRjNGZjMi4uY2NlZDE5YyAxMDA2NDQKLS0tIGEvbWVkaWEvamFuaXRvcnMvcmVsaWFiaWxpdHlfbWFpbmxpbmVfT1dORVJTCisrKyBiL21lZGlhL2phbml0b3JzL3JlbGlhYmlsaXR5X21haW5saW5lX09XTkVSUwpAQCAtMSw1ICsxLDUgQEAKICMgQnVnIGNvbXBvbmVudDogMTA1MTMwOQotIyBnby9hbmRyb2lkLW1lZGlhLXJlbGFpYmlsaXR5CisjIGdvL2FuZHJvaWQtbWVkaWEtcmVsaWFiaWxpdHkKIAogZXNzaWNrQGdvb2dsZS5jb20KIG5jaGFsa29AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL1RFU1RfTUFQUElORyBiL21lZGlhL2xpYmFhdWRpby9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlNWE5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxMiBAQAoreworICAicHJlc3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkN0c05hdGl2ZU1lZGlhQUF1ZGlvVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIiA6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm5hdGl2ZW1lZGlhLmFhdWRpby5BQXVkaW9UZXN0cyNBQXVkaW9CYXNpYy4qIgorICAgICAgICB9CisgICAgICBdCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKaW5kZXggN2RhYWMyMC4uOTU2YjNjZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaApAQCAtNDAsNiArNDAsMzEgQEAKICAgICBpbnQ2NF90IG5hbm9zZWNvbmRzOwogfSBUaW1lc3RhbXA7CiAKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCAgIGtXb3JrbG9hZFNjYWxlciA9IDUwMDsKKworLy8gTGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KK3N0YXRpYyB1aW50MzJfdCBzX3JhbmRvbTE2KCkgeworICAgIHN0YXRpYyB1aW50MzJfdCBzZWVkID0gMTIzNDsKKyAgICBzZWVkID0gKChzZWVkICogMzE0MjEpICsgNjkyNykgJiAweDBGRkZGOworICAgIHJldHVybiBzZWVkOworfQorCisvKioKKyAqIFRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpcyBnb29kIGZvciBidXJuaW5nIENQVSBiZWNhdXNlIHRoZSBjb21waWxlciBjYW5ub3QKKyAqIGVhc2lseSBvcHRpbWl6ZSBhd2F5IHRoZSBjb21wdXRhdGlvbi4KKyAqIEBwYXJhbSB3b3JrbG9hZCBudW1iZXIgb2YgdGltZXMgdG8gZXhlY3V0ZSB0aGUgbG9vcAorICogQHJldHVybiBhIHdoaXRlIG5vaXNlIHZhbHVlIGJldHdlZW4gLTEuMCBhbmQgKzEuMAorICovCitzdGF0aWMgZmxvYXQgc19idXJuQ1BVKGludDMyX3Qgd29ya2xvYWQpIHsKKyAgICB1aW50MzJfdCByYW5kb20gPSAwOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHdvcmtsb2FkOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgMTA7IGorKykgeworICAgICAgICAgICAgcmFuZG9tID0gcmFuZG9tIF4gc19yYW5kb20xNigpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAocmFuZG9tIC0gMzI3NjgpICogKDEuMCAvIDMyNzY4KTsKK30KKwogLyoqCiAgKiBTaW1wbGUgd3JhcHBlciBmb3IgQUF1ZGlvIHRoYXQgb3BlbnMgYW4gb3V0cHV0IHN0cmVhbSBlaXRoZXIgaW4gY2FsbGJhY2sgb3IgYmxvY2tpbmcgd3JpdGUgbW9kZS4KICAqLwpAQCAtMjY4LDExICsyOTMsMTMgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgdGltZXN0YW1wQ291bnQgPSAwOyAvLyBpbiB0aW1lc3RhbXBzCiAgICAgaW50MzJfdCAgICAgICAgICAgIHNhbXBsZVJhdGUgPSA0ODAwMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgcHJlZml4VG9uZUZyYW1lcyA9IDA7CisgICAgZG91YmxlICAgICAgICAgICAgIHdvcmtsb2FkID0gMC4wOwogICAgIGJvb2wgICAgICAgICAgICAgICBzd2VlcFNldHVwID0gZmFsc2U7CiAKICAgICBpbnQgICAgICAgICAgICAgICAgc2NoZWR1bGVyID0gMDsKICAgICBib29sICAgICAgICAgICAgICAgc2NoZWR1bGVyQ2hlY2tlZCA9IGZhbHNlOwogICAgIGludDMyX3QgICAgICAgICAgICBoYW5nVGltZU1TZWMgPSAwOworICAgIGludCAgICAgICAgICAgICAgICBjcHVBZmZpbml0eSA9IC0xOwogCiAgICAgQUF1ZGlvU2ltcGxlUGxheWVyIHNpbXBsZVBsYXllcjsKICAgICBpbnQzMl90ICAgICAgICAgICAgY2FsbGJhY2tDb3VudCA9IDA7CkBAIC0zMDQsNiArMzMxLDE0IEBACiAKIH0gU2luZVRocmVhZGVkRGF0YV90OwogCitpbnQgc2V0Q3B1QWZmaW5pdHkoaW50IGNwdUluZGV4KSB7CitjcHVfc2V0X3QgY3B1X3NldDsKKyAgICBDUFVfWkVSTygmY3B1X3NldCk7CisgICAgQ1BVX1NFVChjcHVJbmRleCwgJmNwdV9zZXQpOworICAgIGludCBlcnIgPSBzY2hlZF9zZXRhZmZpbml0eSgocGlkX3QpIDAsIHNpemVvZihjcHVfc2V0X3QpLCAmY3B1X3NldCk7CisgICAgcmV0dXJuIGVyciA9PSAwID8gMCA6IC1lcnJubzsKK30KKwogLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBmaWxscyB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlci4KIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IFNpbXBsZVBsYXllckRhdGFDYWxsYmFja1Byb2MoCiAgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLApAQCAtMzE5LDYgKzM1NCwxMCBAQAogICAgIH0KICAgICBTaW5lVGhyZWFkZWREYXRhX3QgKnNpbmVEYXRhID0gKFNpbmVUaHJlYWRlZERhdGFfdCAqKSB1c2VyRGF0YTsKIAorICAgIGlmIChzaW5lRGF0YS0+Y3B1QWZmaW5pdHkgPj0gMCkgeworICAgICAgICBzZXRDcHVBZmZpbml0eShzaW5lRGF0YS0+Y3B1QWZmaW5pdHkpOworICAgICAgICBzaW5lRGF0YS0+Y3B1QWZmaW5pdHkgPSAtMTsKKyAgICB9CiAgICAgLy8gUGxheSBhbiBpbml0aWFsIGhpZ2ggdG9uZSBzbyB3ZSBjYW4gdGVsbCB3aGV0aGVyIHRoZSBiZWdpbm5pbmcgd2FzIHRydW5jYXRlZC4KICAgICBpZiAoIXNpbmVEYXRhLT5zd2VlcFNldHVwICYmIHNpbmVEYXRhLT5mcmFtZXNUb3RhbCA+PSBzaW5lRGF0YS0+cHJlZml4VG9uZUZyYW1lcykgewogICAgICAgICBzaW5lRGF0YS0+c2V0dXBTaW5lU3dlZXBzKCk7CkBAIC0zOTgsNiArNDM3LDggQEAKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CiAgICAgfQogCisgICAgc19idXJuQ1BVKChpbnQzMl90KShzaW5lRGF0YS0+d29ya2xvYWQgKiBrV29ya2xvYWRTY2FsZXIgKiBudW1GcmFtZXMpKTsKKwogICAgIHNpbmVEYXRhLT5jYWxsYmFja0NvdW50Kys7CiAgICAgc2luZURhdGEtPmZyYW1lc1RvdGFsICs9IG51bUZyYW1lczsKICAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAppbmRleCBjZGM5ODdiLi40MDBmYzdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCkBAIC0zMSwxMCArMzEsMTAgQEAKICNpbmNsdWRlICJBQXVkaW9TaW1wbGVQbGF5ZXIuaCIKICNpbmNsdWRlICJBQXVkaW9BcmdzUGFyc2VyLmgiCiAKLSNkZWZpbmUgQVBQX1ZFUlNJT04gICIwLjEuOCIKKyNkZWZpbmUgQVBQX1ZFUlNJT04gICIwLjIuMSIKIAotY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRIYW5nVGltZU1TZWMgPSAxMDsKLQorc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0SGFuZ1RpbWVNU2VjID0gMTA7CitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga1dvcmtQZXJpb2RTZWNvbmRzID0gNjsKIC8qKgogICogT3BlbiBzdHJlYW0sIHBsYXkgc29tZSBzaW5lIHdhdmVzLCB0aGVuIGNsb3NlIHRoZSBzdHJlYW0uCiAgKgpAQCAtNDQsNyArNDQsMTEgQEAKIHN0YXRpYyBhYXVkaW9fcmVzdWx0X3QgdGVzdE9wZW5QbGF5Q2xvc2UoQUF1ZGlvQXJnc1BhcnNlciAmYXJnUGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxvb3BDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmVmaXhUb25lTXNlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoYW5nVGltZU1TZWMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGFuZ1RpbWVNU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgIGNwdUFmZmluaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIGxvd1dvcmtMb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIGhpZ2hXb3JrTG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3b3JrUGVyaW9kU2Vjb25kcykKIHsKICAgICBTaW5lVGhyZWFkZWREYXRhX3QgbXlEYXRhOwogICAgIEFBdWRpb1NpbXBsZVBsYXllciAmcGxheWVyID0gbXlEYXRhLnNpbXBsZVBsYXllcjsKQEAgLTU3LDYgKzYxLDcgQEAKICAgICBteURhdGEuc2NoZWR1bGVyQ2hlY2tlZCA9IGZhbHNlOwogICAgIG15RGF0YS5jYWxsYmFja0NvdW50ID0gMDsKICAgICBteURhdGEuaGFuZ1RpbWVNU2VjID0gaGFuZ1RpbWVNU2VjOyAvLyB0ZXN0IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoKQorICAgIG15RGF0YS5jcHVBZmZpbml0eSA9IGNwdUFmZmluaXR5OwogCiAgICAgcmVzdWx0ID0gcGxheWVyLm9wZW4oYXJnUGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVBsYXllckRhdGFDYWxsYmFja1Byb2MsCkBAIC0xMTEsOCArMTE2LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFBsYXkgYSBzaW5lIHdhdmUgaW4gdGhlIGJhY2tncm91bmQuCi0gICAgICAgIHByaW50ZigiU2xlZXAgZm9yICVkIHNlY29uZHMgd2hpbGUgYXVkaW8gcGxheXMgaW4gYSBjYWxsYmFjayB0aHJlYWQuICVkIG9mICVkXG4iLAotICAgICAgICAgICAgICAgYXJnUGFyc2VyLmdldER1cmF0aW9uU2Vjb25kcygpLCAobG9vcEluZGV4ICsgMSksIGxvb3BDb3VudCk7CisgICAgICAgIHByaW50ZigiTW9uaXRvciBmb3IgJWQgc2Vjb25kcyB3aGlsZSBhdWRpbyBwbGF5cyBpbiBhIGNhbGxiYWNrIHRocmVhZC4gJWQgb2YgJWQsICVkXG4iLAorICAgICAgICAgICAgICAgYXJnUGFyc2VyLmdldER1cmF0aW9uU2Vjb25kcygpLCAobG9vcEluZGV4ICsgMSksIGxvb3BDb3VudCwgd29ya1BlcmlvZFNlY29uZHMpOwogICAgICAgICBzdGFydGVkQXROYW5vcyA9IGdldE5hbm9zZWNvbmRzKENMT0NLX01PTk9UT05JQyk7CiAgICAgICAgIGZvciAoaW50IHNlY29uZCA9IDA7IHNlY29uZCA8IGR1cmF0aW9uU2Vjb25kczsgc2Vjb25kKyspIHsKICAgICAgICAgICAgIC8vIFNsZWVwIGEgd2hpbGUuIFdha2UgdXAgZWFybHkgaWYgdGhlcmUgaXMgYW4gZXJyb3IsIGZvciBleGFtcGxlIGEgRElTQ09OTkVDVC4KQEAgLTEyMywxMyArMTI4LDE3IEBACiAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSAoaW50MzJfdCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ocGxheWVyLmdldFN0cmVhbSgpKTsKICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVzUmVhZCA9IChpbnQzMl90KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChwbGF5ZXIuZ2V0U3RyZWFtKCkpOwogICAgICAgICAgICAgY29uc3QgaW50MzJfdCB4cnVucyA9IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQocGxheWVyLmdldFN0cmVhbSgpKTsKKyAgICAgICAgICAgIG15RGF0YS53b3JrbG9hZCA9ICgoc2Vjb25kICUgKDIgKiB3b3JrUGVyaW9kU2Vjb25kcykpIDwgd29ya1BlcmlvZFNlY29uZHMpCisgICAgICAgICAgICAgICAgICAgID8gbG93V29ya0xvYWQgOiBoaWdoV29ya0xvYWQ7CiAgICAgICAgICAgICBwcmludGYoIiB3YWtlciByZXN1bHQgPSAlZCwgYXQgJTZkIG1pbGxpcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIHNlY29uZCA9ICUzZCwgZnJhbWVzIHdyaXR0ZW4gJThkIC0gcmVhZCAlOGQgPSAlOGQsIHVuZGVycnVucyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICIsIHNlY29uZCA9ICUzZCwgZnJhbWVzIHdyaXR0ZW4gJThkIC0gcmVhZCAlOGQgPSAlOGQiCisgICAgICAgICAgICAgICAgICAgIiwgd29yayA9ICU1LjFmLCB1bmRlcnJ1bnMgPSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICByZXN1bHQsIChpbnQpIG1pbGxpcywKICAgICAgICAgICAgICAgICAgICBzZWNvbmQsCiAgICAgICAgICAgICAgICAgICAgZnJhbWVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICAgICBmcmFtZXNSZWFkLAogICAgICAgICAgICAgICAgICAgIGZyYW1lc1dyaXR0ZW4gLSBmcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgICAgIG15RGF0YS53b3JrbG9hZCwKICAgICAgICAgICAgICAgICAgICB4cnVucyk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZCA9IChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCk7CkBAIC0yMjAsNiArMjI5LDExIEBACiAgICAgQUF1ZGlvQXJnc1BhcnNlcjo6dXNhZ2UoKTsKICAgICBwcmludGYoIiAgICAgIC1se2NvdW50fSBsb29wQ291bnQgc3RhcnQvc3RvcCwgZXZlcnkgb3RoZXIgb25lIGlzIHNpbGVudFxuIik7CiAgICAgcHJpbnRmKCIgICAgICAtdHttc2VjfSAgcGxheSBhIGhpZ2ggcGl0Y2hlZCB0b25lIGF0IHRoZSBiZWdpbm5pbmdcbiIpOworICAgIHByaW50ZigiICAgICAgLXd7d29ya2xvYWR9ICBzZXQgYmFzZSB3b3JrbG9hZCwgZGVmYXVsdCAwLjBcbiIpOworICAgIHByaW50ZigiICAgICAgLVd7d29ya2xvYWR9ICBhbHRlcm5hdGUgYmV0d2VlbiB0aGlzIGhpZ2hlciB3b3JrbG9hZCBhbmQgYmFzZSB3b3JrbG9hZFxuIik7CisgICAgcHJpbnRmKCIgICAgICAtWntkdXJhdGlvbn0gIG51bWJlciBvZiBzZWNvbmRzIHRvIHNwZW5kIGF0IGVhY2ggd29ya2xvYWQsIGRlZmF1bHQgPSAlZFxuIiwKKyAgICAgICAgICAga1dvcmtQZXJpb2RTZWNvbmRzKTsKKyAgICBwcmludGYoIiAgICAgIC1he2NwdX0gICBzZXQgQ1BVIGFmZmluaXR5LCBkZWZhdWx0IG5vbmVcbiIpOwogICAgIHByaW50ZigiICAgICAgLWh7bXNlY30gIGZvcmNlIHBlcmlvZGljIHVuZGVycnVucyBieSBoYW5naW5nIGluIGNhbGxiYWNrXG4iKTsKICAgICBwcmludGYoIiAgICAgICAgICAgICAgICBJZiBubyB2YWx1ZSBzcGVjaWZpZWQgdGhlbiAlZCB1c2VkLlxuIiwKICAgICAgICAgICAgIGtEZWZhdWx0SGFuZ1RpbWVNU2VjKTsKQEAgLTIzMiw2ICsyNDYsMTAgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgbG9vcENvdW50ID0gMTsKICAgICBpbnQzMl90ICAgICAgICAgICAgcHJlZml4VG9uZU1zZWMgPSAwOwogICAgIGludDMyX3QgICAgICAgICAgICBoYW5nVGltZU1TZWMgPSAwOworICAgIGludCAgICAgICAgICAgICAgICBjcHVBZmZpbml0eSA9IC0xOworICAgIGRvdWJsZSAgICAgICAgICAgICBsb3dXb3JrTG9hZCA9IDAuMDsKKyAgICBkb3VibGUgICAgICAgICAgICAgaGlnaFdvcmtMb2FkID0gLTEuMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgd29ya1BlcmlvZFNlY29uZHMgPSBrV29ya1BlcmlvZFNlY29uZHM7CiAKICAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KQEAgLTI0Nyw2ICsyNjUsOSBAQAogICAgICAgICAgICAgaWYgKGFyZ1swXSA9PSAnLScpIHsKICAgICAgICAgICAgICAgICBjaGFyIG9wdGlvbiA9IGFyZ1sxXTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgICAgICAgICAgICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdUFmZmluaXR5ID0gYXRvaSgmYXJnWzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlICdsJzoKICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BDb3VudCA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI1OCw2ICsyNzksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhdG9pKCZhcmdbMl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga0RlZmF1bHRIYW5nVGltZU1TZWM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAndyc6CisgICAgICAgICAgICAgICAgICAgICAgICBsb3dXb3JrTG9hZCA9IGF0b2YoJmFyZ1syXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnVyc6CisgICAgICAgICAgICAgICAgICAgICAgICBoaWdoV29ya0xvYWQgPSBhdG9mKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1onOgorICAgICAgICAgICAgICAgICAgICAgICAgd29ya1BlcmlvZFNlY29uZHMgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwpAQCAtMjcxLDkgKzMwMSwyMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKGhpZ2hXb3JrTG9hZCA+IDApIHsKKyAgICAgICAgaWYgKGhpZ2hXb3JrTG9hZCA8IGxvd1dvcmtMb2FkKSB7CisgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gLVclZiB3b3JrbG9hZCBsb3dlciB0aGFuIC13JWYgd29ya2xvYWQiLCBoaWdoV29ya0xvYWQsIGxvd1dvcmtMb2FkKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBoaWdoV29ya0xvYWQgPSBsb3dXb3JrTG9hZDsgLy8gaGlnaCBub3Qgc3BlY2lmaWVkIHNvIHVzZSBsb3cKKyAgICB9CisKICAgICAvLyBLZWVwIGxvb3BpbmcgdW50aWwgd2UgY2FuIGNvbXBsZXRlIHRoZSB0ZXN0IHdpdGhvdXQgZGlzY29ubmVjdGluZy4KICAgICB3aGlsZSgocmVzdWx0ID0gdGVzdE9wZW5QbGF5Q2xvc2UoYXJnUGFyc2VyLCBsb29wQ291bnQsCi0gICAgICAgICAgICBwcmVmaXhUb25lTXNlYywgaGFuZ1RpbWVNU2VjKSkKKyAgICAgICAgICAgIHByZWZpeFRvbmVNc2VjLCBoYW5nVGltZU1TZWMsCisgICAgICAgICAgICBjcHVBZmZpbml0eSwKKyAgICAgICAgICAgIGxvd1dvcmtMb2FkLCBoaWdoV29ya0xvYWQsCisgICAgICAgICAgICB3b3JrUGVyaW9kU2Vjb25kcykpCiAgICAgICAgICAgICA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKTsKIAogICAgIHJldHVybiAocmVzdWx0KSA/IEVYSVRfRkFJTFVSRSA6IEVYSVRfU1VDQ0VTUzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTEyMTkxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImxpYmFhdWRpb19mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImxpYmFhdWRpb19mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW9faGVhZGVycyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmF1ZGlvbWFuYWdlciIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeSIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJqc29uY3BwIiwKKyAgICAgICAgImxpYmJhc2VfbmRrIiwKKyAgICAgICAgImxpYmNncm91cHJjIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAiYWF1ZGlvLWFpZGwtY3BwIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKKyAgICAgICAgImF2LXR5cGVzLWFpZGwtY3BwIiwKKyAgICAgICAgImxpYmFhdWRpb19pbnRlcm5hbCIsCisgICAgICAgICJsaWJjZ3JvdXByY19mb3JtYXQiLAorICAgICAgICAiYXVkaW9wb2xpY3ktYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9mbGluZ2VyLWFpZGwtY3BwIiwKKyAgICAgICAgImF1ZGlvcG9saWN5LXR5cGVzLWFpZGwtY3BwIiwKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKKyAgICAgICAgInNoYXJlZC1maWxlLXJlZ2lvbi1haWRsLWNwcCIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgICAgICJtZWRpYW1ldHJpY3NzZXJ2aWNlLWFpZGwtY3BwIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGliYWF1ZGlvL2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhMTVjNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNzcgQEAKKyMgRnV6emVyIGZvciBsaWJhYXVkaW8KKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIGBsaWJhYXVkaW9gIGFyZSBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK3NvdXJjZSBjb2RlIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK0Z1enplcnMgYXNzaWducyB2YWx1ZXMgdG8gdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHRvIHBhc3Mgb24gdG8gbGliYWF1ZGlvOgorMS4gRGV2aWNlIElkIChwYXJhbWV0ZXIgbmFtZTogYGRldmljZUlkYCkKKzIuIFNhbXBsaW5nIFJhdGUgKHBhcmFtZXRlciBuYW1lOiBgc2FtcGxlUmF0ZWApCiszLiBOdW1iZXIgb2YgY2hhbm5lbHMgKHBhcmFtZXRlciBuYW1lOiBgY2hhbm5lbENvdW50YCkKKzQuIEF1ZGlvIFRyYXZlbCBEaXJlY3Rpb24gKHBhcmFtZXRlciBuYW1lOiBgZGlyZWN0aW9uYCkKKzUuIEF1ZGlvIEZvcm1hdCAocGFyYW1ldGVyIG5hbWU6IGBmb3JtYXRgKQorNi4gQXVkaW8gU2hhcmluZyBNb2RlIChwYXJhbWV0ZXIgbmFtZTogYHNoYXJpbmdNb2RlYCkKKzcuIEF1ZGlvIFVzYWdlIChwYXJhbWV0ZXIgbmFtZTogYHVzYWdlYCkKKzguIEF1ZGlvIENvbnRlbnQgdHlwZSAocGFyYW1ldGVyIG5hbWU6IGBjb250ZW50VHlwZWApCis5LiBBdWRpbyBJbnB1dCBQcmVzZXQgKHBhcmFtZXRlciBuYW1lOiBgaW5wdXRQcmVzZXRgKQorMTAuIEF1ZGlvIFByaXZhY3kgU2Vuc2l0aXZpdHkgKHBhcmFtZXRlciBuYW1lOiBgcHJpdmFjeVNlbnNpdGl2ZWApCisxMS4gQnVmZmVyIENhcGFjaXR5IEluIEZyYW1lcyAocGFyYW1ldGVyIG5hbWU6IGBmcmFtZXNgKQorMTIuIFBlcmZvcm1hbmNlIE1vZGUgKHBhcmFtZXRlciBuYW1lOiBgbW9kZWApCisxMy4gQWxsb3dlZCBDYXB0dXJlIFBvbGljeSAocGFyYW1ldGVyIG5hbWU6IGBhbGxvd2VkQ2FwdHVyZVBvbGljeWApCisxNC4gU2Vzc2lvbiBJZCAocGFyYW1ldGVyIG5hbWU6IGBzZXNzaW9uSWRgKQorMTUuIEZyYW1lcyBwZXIgRGF0YSBDYWxsYmFjayAocGFyYW1ldGVyIG5hbWU6IGBmcmFtZXNQZXJEYXRhQ2FsbGJhY2tgKQorMTYuIE1NYXAgUG9saWN5IChwYXJhbWV0ZXIgbmFtZTogYHBvbGljeWApCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgZGV2aWNlSWRgIHwgQW55IHZhbHVlIG9mIHR5cGUgYGludDMyX3RgICB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYHNhbXBsZVJhdGVgIHwgQW55IHZhbHVlIG9mIHR5cGUgYGludDMyX3RgICB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYGNoYW5uZWxDb3VudGAgfCAgQW55IHZhbHVlIG9mIHR5cGUgYGludDMyX3RgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgZGlyZWN0aW9uYCB8IDAuIGBBQVVESU9fRElSRUNUSU9OX09VVFBVVGAgMS4gYEFBVURJT19ESVJFQ1RJT05fSU5QVVRgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgZm9ybWF0YCB8IDAuIGBBQVVESU9fRk9STUFUX0lOVkFMSURgIDEuIGBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEYCAyLiBgQUFVRElPX0ZPUk1BVF9QQ01fSTE2YCAzLiBgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVRgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgc2hhcmluZ01vZGVgIHwgMC4gYEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFYCAxLiBgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRURgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgdXNhZ2VgIHwgMC4gYEFBVURJT19VU0FHRV9NRURJQWAgMS4gYEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OYCAyLiBgQUFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElOR2AgMy4gYEFBVURJT19VU0FHRV9BTEFSTWAgNC4gYEFBVURJT19VU0FHRV9OT1RJRklDQVRJT05gIDUuIGBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1JJTkdUT05FYCA2LiBgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVGAgNy4gYEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFlgIDguIGBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFYCA5LiBgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OYCAxMC4gYEFBVURJT19VU0FHRV9HQU1FYCAxMS4gYEFBVURJT19VU0FHRV9BU1NJU1RBTlRgIDEyLiBgQUFVRElPX1NZU1RFTV9VU0FHRV9FTUVSR0VOQ1lgIDEzLiBgQUFVRElPX1NZU1RFTV9VU0FHRV9TQUZFVFlgIDE0LiBgQUFVRElPX1NZU1RFTV9VU0FHRV9WRUhJQ0xFX1NUQVRVU2AgMTUuIGBBQVVESU9fU1lTVEVNX1VTQUdFX0FOTk9VTkNFTUVOVGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBjb250ZW50VHlwZWAgfCAwLiBgQUFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0hgIDEuIGBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDYCAyLiBgQUFVRElPX0NPTlRFTlRfVFlQRV9NT1ZJRWAgMy4gYEFBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYGlucHV0UHJlc2V0YCB8IDAuIGBBQVVESU9fSU5QVVRfUFJFU0VUX0dFTkVSSUNgIDEuIGBBQVVESU9fSU5QVVRfUFJFU0VUX0NBTUNPUkRFUmAgMi4gYEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT05gIDMuIGBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT05gIDQuIGBBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VEYCA1LiBgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9QRVJGT1JNQU5DRWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBwcml2YWN5U2Vuc2l0aXZlYCB8IDAuIGB0cnVlYCAxLiBgZmFsc2VgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgZnJhbWVzYCB8IEFueSB2YWx1ZSBvZiB0eXBlIGBpbnQzMl90YCAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBtb2RlYCB8IDAuIGBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FYCAxLiBgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HYCAyLiBgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1lgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgYWxsb3dlZENhcHR1cmVQb2xpY3lgIHwgMC4gYEFBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTGAgMS4gYEFBVURJT19BTExPV19DQVBUVVJFX0JZX1NZU1RFTWAgMi4gYEFBVURJT19BTExPV19DQVBUVVJFX0JZX05PTkVgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgc2Vzc2lvbklkYCB8IDAuIGBBQVVESU9fU0VTU0lPTl9JRF9OT05FYCAxLiBgQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEVgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgZnJhbWVzUGVyRGF0YUNhbGxiYWNrYCB8IEFueSB2YWx1ZSBvZiB0eXBlIGBpbnQzMl90YCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYHBvbGljeWAgfCAwLiBgQUFVRElPX1BPTElDWV9ORVZFUmAgMS4gYEFBVURJT19QT0xJQ1lfQVVUT2AgMi4gYEFBVURJT19QT0xJQ1lfQUxXQVlTYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKKworVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIGlzIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gZmVlZCB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIG1vZHVsZS4KK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW5zIHRvbGVyYXRlcyBhbnkga2luZCBvZiBpbnB1dCAoZW1wdHksIGh1Z2UsCittYWxmb3JtZWQsIGV0YykgYW5kIGRvZXNuJ3QgYGV4aXQoKWAgb24gYW55IGlucHV0IGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlCitjaGFuY2Ugb2YgaWRlbnRpZnlpbmcgdnVsbmVyYWJpbGl0aWVzLgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBsaWJhYXVkaW9fZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBsaWJhYXVkaW9fZnV6emVyCitgYGAKKyMjIyBTdGVwcyB0byBydW4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2xpYmFhdWRpb19mdXp6ZXIvbGliYWF1ZGlvX2Z1enplcgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2Z1enplci9saWJhYXVkaW9fZnV6emVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9mdXp6ZXIvbGliYWF1ZGlvX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzM2VlMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9mdXp6ZXIvbGliYWF1ZGlvX2Z1enplci5jcHAKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisjaW5jbHVkZSAiYWF1ZGlvL0FBdWRpby5oIgorI2luY2x1ZGUgImFhdWRpby9BQXVkaW9UZXN0aW5nLmgiCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorCitjb25zdGV4cHIgaW50MzJfdCBrUmFuZG9tU3RyaW5nTGVuZ3RoID0gMjU2OworCitjb25zdGV4cHIgaW50NjRfdCBrTmFub3NQZXJNaWxsaXNlY29uZCA9IDEwMDAgKiAxMDAwOworCitjb25zdGV4cHIgYWF1ZGlvX2RpcmVjdGlvbl90IGtEaXJlY3Rpb25zW10gPSB7CisgICAgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQsIEFBVURJT19ESVJFQ1RJT05fSU5QVVQsIEFBVURJT19VTlNQRUNJRklFRH07CisKK2NvbnN0ZXhwciBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IGtQZXJmb3JtYW5jZU1vZGVzW10gPSB7CisgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HLAorICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLCBBQVVESU9fVU5TUEVDSUZJRUR9OworCitjb25zdGV4cHIgYWF1ZGlvX2Zvcm1hdF90IGtGb3JtYXRzW10gPSB7CisgICAgQUFVRElPX0ZPUk1BVF9JTlZBTElELCAgICAgICAgQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCwKKyAgICBBQVVESU9fRk9STUFUX1BDTV9JMTYsICAgICAgICBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCwKKyAgICBBQVVESU9fRk9STUFUX1BDTV9JMjRfUEFDS0VELCBBQVVESU9fRk9STUFUX1BDTV9JMzJ9OworCitjb25zdGV4cHIgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IGtTaGFyaW5nTW9kZXNbXSA9IHsKKyAgICBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUR9OworCitjb25zdGV4cHIgaW50MzJfdCBrU2FtcGxlUmF0ZXNbXSA9IHtBQVVESU9fVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMH07CisKK2NvbnN0ZXhwciBhYXVkaW9fdXNhZ2VfdCBrVXNhZ2VzW10gPSB7CisgICAgQUFVRElPX1VTQUdFX01FRElBLAorICAgIEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OLAorICAgIEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkcsCisgICAgQUFVRElPX1VTQUdFX0FMQVJNLAorICAgIEFBVURJT19VU0FHRV9OT1RJRklDQVRJT04sCisgICAgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTl9SSU5HVE9ORSwKKyAgICBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5ULAorICAgIEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFksCisgICAgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSwKKyAgICBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04sCisgICAgQUFVRElPX1VTQUdFX0dBTUUsCisgICAgQUFVRElPX1VTQUdFX0FTU0lTVEFOVCwKKyAgICBBQVVESU9fU1lTVEVNX1VTQUdFX0VNRVJHRU5DWSwKKyAgICBBQVVESU9fU1lTVEVNX1VTQUdFX1NBRkVUWSwKKyAgICBBQVVESU9fU1lTVEVNX1VTQUdFX1ZFSElDTEVfU1RBVFVTLAorICAgIEFBVURJT19TWVNURU1fVVNBR0VfQU5OT1VOQ0VNRU5ULAorICAgIEFBVURJT19VTlNQRUNJRklFRH07CisKK2NvbnN0ZXhwciBhYXVkaW9fY29udGVudF90eXBlX3Qga0NvbnRlbnRUeXBlc1tdID0geworICAgIEFBVURJT19DT05URU5UX1RZUEVfU1BFRUNILCBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAorICAgIEFBVURJT19DT05URU5UX1RZUEVfTU9WSUUsIEFBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OLAorICAgIEFBVURJT19VTlNQRUNJRklFRH07CisKK2NvbnN0ZXhwciBhYXVkaW9faW5wdXRfcHJlc2V0X3Qga0lucHV0UHJlc2V0c1tdID0geworICAgIEFBVURJT19JTlBVVF9QUkVTRVRfR0VORVJJQywKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX0NBTUNPUkRFUiwKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OLAorICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfQ09NTVVOSUNBVElPTiwKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VELAorICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUEVSRk9STUFOQ0UsCisgICAgQUFVRElPX1VOU1BFQ0lGSUVEfTsKKworY29uc3RleHByIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3Qga0FsbG93ZWRDYXB0dXJlUG9saWNpZXNbXSA9IHsKKyAgICBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEwsIEFBVURJT19BTExPV19DQVBUVVJFX0JZX1NZU1RFTSwKKyAgICBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9OT05FLCBBQVVESU9fVU5TUEVDSUZJRUR9OworCitjb25zdGV4cHIgYWF1ZGlvX3Nlc3Npb25faWRfdCBrU2Vzc2lvbklkc1tdID0geworICAgIEFBVURJT19TRVNTSU9OX0lEX05PTkUsIEFBVURJT19TRVNTSU9OX0lEX0FMTE9DQVRFLCBBQVVESU9fVU5TUEVDSUZJRUR9OworCitjb25zdGV4cHIgYWF1ZGlvX3BvbGljeV90IGtQb2xpY2llc1tdID0geworICAgIEFBVURJT19QT0xJQ1lfTkVWRVIsIEFBVURJT19QT0xJQ1lfQVVUTywgQUFVRElPX1BPTElDWV9BTFdBWVMsCisgICAgQUFVRElPX1VOU1BFQ0lGSUVEfTsKKworY2xhc3MgTGliQWF1ZGlvRnV6emVyIHsKK3B1YmxpYzoKKyAgfkxpYkFhdWRpb0Z1enplcigpIHsgZGVJbml0KCk7IH0KKyAgYm9vbCBpbml0KCk7CisgIHZvaWQgcHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgZGVJbml0KCk7CisKK3ByaXZhdGU6CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKm1BYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKyAgQUF1ZGlvU3RyZWFtICptQWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKK307CisKK2Jvb2wgTGliQWF1ZGlvRnV6emVyOjppbml0KCkgeworICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJm1BYXVkaW9CdWlsZGVyKTsKKyAgaWYgKChyZXN1bHQgIT0gQUFVRElPX09LKSB8fCAoIW1BYXVkaW9CdWlsZGVyKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBMaWJBYXVkaW9GdXp6ZXI6OnByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcChkYXRhLCBzaXplKTsKKyAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBtb2RlID0KKyAgICAgIGZkcC5QaWNrVmFsdWVJbkFycmF5KHtmZHAuUGlja1ZhbHVlSW5BcnJheShrUGVyZm9ybWFuY2VNb2RlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKG1BYXVkaW9CdWlsZGVyLCBtb2RlKTsKKworICBpbnQzMl90IGRldmljZUlkID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoCisgICAgICB7QUFVRElPX1VOU1BFQ0lGSUVELCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCl9KTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREZXZpY2VJZChtQWF1ZGlvQnVpbGRlciwgZGV2aWNlSWQpOworCisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VOYW1lID0gZmRwLlBpY2tWYWx1ZUluQXJyYXk8c3RkOjpzdHJpbmc+KAorICAgICAgeyJhbmRyb2lkLm5hdGl2ZW1lZGlhLmFhdWRpbyIsICJhbmRyb2lkLmFwcC5hcHBvcHMuY3RzIiwKKyAgICAgICBmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrUmFuZG9tU3RyaW5nTGVuZ3RoKX0pOworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBhY2thZ2VOYW1lKG1BYXVkaW9CdWlsZGVyLCBwYWNrYWdlTmFtZS5jX3N0cigpKTsKKworICBzdGQ6OnN0cmluZyBhdHRyaWJ1dGlvblRhZyA9CisgICAgICBmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrUmFuZG9tU3RyaW5nTGVuZ3RoKTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRBdHRyaWJ1dGlvblRhZyhtQWF1ZGlvQnVpbGRlciwgYXR0cmlidXRpb25UYWcuY19zdHIoKSk7CisKKyAgaW50MzJfdCBzYW1wbGVSYXRlID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoa1NhbXBsZVJhdGVzKTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVSYXRlKG1BYXVkaW9CdWlsZGVyLCBzYW1wbGVSYXRlKTsKKworICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGZkcC5QaWNrVmFsdWVJbkFycmF5KAorICAgICAge0FBVURJT19VTlNQRUNJRklFRCwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KG1BYXVkaW9CdWlsZGVyLCBjaGFubmVsQ291bnQpOworCisgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBmZHAuUGlja1ZhbHVlSW5BcnJheSgKKyAgICAgIHtmZHAuUGlja1ZhbHVlSW5BcnJheShrRGlyZWN0aW9ucyksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKX0pOworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihtQWF1ZGlvQnVpbGRlciwgZGlyZWN0aW9uKTsKKworICBhYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoCisgICAgICB7ZmRwLlBpY2tWYWx1ZUluQXJyYXkoa0Zvcm1hdHMpLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCl9KTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGb3JtYXQobUFhdWRpb0J1aWxkZXIsIGZvcm1hdCk7CisKKyAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoCisgICAgICB7ZmRwLlBpY2tWYWx1ZUluQXJyYXkoa1NoYXJpbmdNb2RlcyksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKX0pOworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlKG1BYXVkaW9CdWlsZGVyLCBzaGFyaW5nTW9kZSk7CisKKyAgYWF1ZGlvX3VzYWdlX3QgdXNhZ2UgPSBmZHAuUGlja1ZhbHVlSW5BcnJheSgKKyAgICAgIHtmZHAuUGlja1ZhbHVlSW5BcnJheShrVXNhZ2VzKSwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0VXNhZ2UobUFhdWRpb0J1aWxkZXIsIHVzYWdlKTsKKworICBhYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUgPSBmZHAuUGlja1ZhbHVlSW5BcnJheSgKKyAgICAgIHtmZHAuUGlja1ZhbHVlSW5BcnJheShrQ29udGVudFR5cGVzKSwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q29udGVudFR5cGUobUFhdWRpb0J1aWxkZXIsIGNvbnRlbnRUeXBlKTsKKworICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgaW5wdXRQcmVzZXQgPSBmZHAuUGlja1ZhbHVlSW5BcnJheSgKKyAgICAgIHtmZHAuUGlja1ZhbHVlSW5BcnJheShrSW5wdXRQcmVzZXRzKSwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0SW5wdXRQcmVzZXQobUFhdWRpb0J1aWxkZXIsIGlucHV0UHJlc2V0KTsKKworICBib29sIHByaXZhY3lTZW5zaXRpdmUgPSBmZHAuQ29uc3VtZUJvb2woKTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQcml2YWN5U2Vuc2l0aXZlKG1BYXVkaW9CdWlsZGVyLCBwcml2YWN5U2Vuc2l0aXZlKTsKKworICBpbnQzMl90IGZyYW1lcyA9IGZkcC5QaWNrVmFsdWVJbkFycmF5KAorICAgICAge0FBVURJT19VTlNQRUNJRklFRCwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhtQWF1ZGlvQnVpbGRlciwgZnJhbWVzKTsKKworICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IGFsbG93ZWRDYXB0dXJlUG9saWN5ID0KKyAgICAgIGZkcC5QaWNrVmFsdWVJbkFycmF5KHtmZHAuUGlja1ZhbHVlSW5BcnJheShrQWxsb3dlZENhcHR1cmVQb2xpY2llcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpfSk7CisgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kobUFhdWRpb0J1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZENhcHR1cmVQb2xpY3kpOworCisgIGFhdWRpb19zZXNzaW9uX2lkX3Qgc2Vzc2lvbklkID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoCisgICAgICB7ZmRwLlBpY2tWYWx1ZUluQXJyYXkoa1Nlc3Npb25JZHMpLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCl9KTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQobUFhdWRpb0J1aWxkZXIsIHNlc3Npb25JZCk7CisKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2sobUFhdWRpb0J1aWxkZXIsIG51bGxwdHIsIG51bGxwdHIpOworICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEVycm9yQ2FsbGJhY2sobUFhdWRpb0J1aWxkZXIsIG51bGxwdHIsIG51bGxwdHIpOworCisgIGludDMyX3QgZnJhbWVzUGVyRGF0YUNhbGxiYWNrID0gZmRwLlBpY2tWYWx1ZUluQXJyYXkoCisgICAgICB7QUFVRElPX1VOU1BFQ0lGSUVELCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCl9KTsKKyAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2sobUFhdWRpb0J1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1BlckRhdGFDYWxsYmFjayk7CisKKyAgYWF1ZGlvX3BvbGljeV90IHBvbGljeSA9IGZkcC5QaWNrVmFsdWVJbkFycmF5KAorICAgICAge2ZkcC5QaWNrVmFsdWVJbkFycmF5KGtQb2xpY2llcyksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKX0pOworICBBQXVkaW9fc2V0TU1hcFBvbGljeShwb2xpY3kpOworICAodm9pZClBQXVkaW9fZ2V0TU1hcFBvbGljeSgpOworCisgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPQorICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKG1BYXVkaW9CdWlsZGVyLCAmbUFhdWRpb1N0cmVhbSk7CisgIGlmICgocmVzdWx0ICE9IEFBVURJT19PSykgfHwgKCFtQWF1ZGlvU3RyZWFtKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3QobUFhdWRpb1N0cmVhbSk7CisgIHVpbnQ4X3QgbnVtYmVyT2ZCdXJzdHMgPSBmZHAuQ29uc3VtZUludGVncmFsPHVpbnQ4X3Q+KCk7CisgIGludDMyX3QgbWF4RnJhbWVzID0gbnVtYmVyT2ZCdXJzdHMgKiBmcmFtZXNQZXJCdXJzdDsKKyAgaW50MzJfdCByZXF1ZXN0ZWRCdWZmZXJTaXplID0KKyAgICAgIGZkcC5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCkgKiBmcmFtZXNQZXJCdXJzdDsKKyAgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhtQWF1ZGlvU3RyZWFtLCByZXF1ZXN0ZWRCdWZmZXJTaXplKTsKKworICBpbnQ2NF90IHBvc2l0aW9uID0gMCwgbmFub3NlY29uZHMgPSAwOworICBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKG1BYXVkaW9TdHJlYW0sIENMT0NLX01PTk9UT05JQywgJnBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW5vc2Vjb25kcyk7CisKKyAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChtQWF1ZGlvU3RyZWFtKTsKKworICBhYXVkaW9fZm9ybWF0X3QgYWN0dWFsRm9ybWF0ID0gQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChtQWF1ZGlvU3RyZWFtKTsKKyAgaW50MzJfdCBhY3R1YWxDaGFubmVsQ291bnQgPSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KG1BYXVkaW9TdHJlYW0pOworCisgIGludDMyX3QgY291bnQgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgIGRpcmVjdGlvbiA9IEFBdWRpb1N0cmVhbV9nZXREaXJlY3Rpb24obUFhdWRpb1N0cmVhbSk7CisKKyAgaWYgKGFjdHVhbEZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPGludDE2X3Q+IGlucHV0U2hvcnREYXRhKG1heEZyYW1lcyAqIGFjdHVhbENoYW5uZWxDb3VudCwgMHgwKTsKKyAgICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgeworICAgICAgICAgIEFBdWRpb1N0cmVhbV9yZWFkKG1BYXVkaW9TdHJlYW0sIGlucHV0U2hvcnREYXRhLmRhdGEoKSwgbWF4RnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICoga05hbm9zUGVyTWlsbGlzZWNvbmQpOworICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7CisgICAgICAgIEFBdWRpb1N0cmVhbV93cml0ZShtQWF1ZGlvU3RyZWFtLCBpbnB1dFNob3J0RGF0YS5kYXRhKCksIG1heEZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICoga05hbm9zUGVyTWlsbGlzZWNvbmQpOworICAgIH0KKyAgfSBlbHNlIGlmIChhY3R1YWxGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBpbnB1dEZsb2F0RGF0YShtYXhGcmFtZXMgKiBhY3R1YWxDaGFubmVsQ291bnQsIDB4MCk7CisgICAgICBpZiAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpIHsKKyAgICAgICAgICBBQXVkaW9TdHJlYW1fcmVhZChtQWF1ZGlvU3RyZWFtLCBpbnB1dEZsb2F0RGF0YS5kYXRhKCksIG1heEZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAqIGtOYW5vc1Blck1pbGxpc2Vjb25kKTsKKyAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgeworICAgICAgICBBQXVkaW9TdHJlYW1fd3JpdGUobUFhdWRpb1N0cmVhbSwgaW5wdXRGbG9hdERhdGEuZGF0YSgpLCBtYXhGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAqIGtOYW5vc1Blck1pbGxpc2Vjb25kKTsKKyAgICB9CisgIH0KKworICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOS05PV047CisgIEFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2UobUFhdWRpb1N0cmVhbSwgQUFVRElPX1NUUkVBTV9TVEFURV9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwgY291bnQgKiBrTmFub3NQZXJNaWxsaXNlY29uZCk7CisgICh2b2lkKUFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoc3RhdGUpOworCisgICh2b2lkKUFBdWRpb1N0cmVhbV9nZXRVc2FnZShtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGUobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9nZXRTdGF0ZShtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldENvbnRlbnRUeXBlKG1BYXVkaW9TdHJlYW0pOworICAodm9pZClBQXVkaW9TdHJlYW1fZ2V0SW5wdXRQcmVzZXQobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9pc1ByaXZhY3lTZW5zaXRpdmUobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZShtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldERldmljZUlkKG1BYXVkaW9TdHJlYW0pOworICAodm9pZClBQXVkaW9TdHJlYW1fZ2V0U2hhcmluZ01vZGUobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9nZXRTZXNzaW9uSWQobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKG1BYXVkaW9TdHJlYW0pOworICAodm9pZClBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChtQWF1ZGlvU3RyZWFtKTsKKyAgKHZvaWQpQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9nZXRCdWZmZXJTaXplSW5GcmFtZXMobUFhdWRpb1N0cmVhbSk7CisgICh2b2lkKUFBdWRpb1N0cmVhbV9pc01NYXBVc2VkKG1BYXVkaW9TdHJlYW0pOworCisgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UobUFhdWRpb1N0cmVhbSk7CisgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2gobUFhdWRpb1N0cmVhbSk7CisgIEFBdWRpb1N0cmVhbV9yZWxlYXNlKG1BYXVkaW9TdHJlYW0pOworICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AobUFhdWRpb1N0cmVhbSk7Cit9CisKK3ZvaWQgTGliQWF1ZGlvRnV6emVyOjpkZUluaXQoKSB7CisgIGlmIChtQWF1ZGlvQnVpbGRlcikgeworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKG1BYXVkaW9CdWlsZGVyKTsKKyAgfQorICBpZiAobUFhdWRpb1N0cmVhbSkgeworICAgIEFBdWRpb1N0cmVhbV9jbG9zZShtQWF1ZGlvU3RyZWFtKTsKKyAgfQorfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIExpYkFhdWRpb0Z1enplciBsaWJBYXVkaW9GdXp6ZXI7CisgIGlmIChsaWJBYXVkaW9GdXp6ZXIuaW5pdCgpKSB7CisgICAgbGliQWF1ZGlvRnV6emVyLnByb2Nlc3MoZGF0YSwgc2l6ZSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmggYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKaW5kZXggNGIwODI5NS4uMmZmOWY1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaApAQCAtMjAsNyArMjAsNyBAQAogICovCiAKIC8qKgotICogQGZpbGUgQUF1ZGlvLmgKKyAqIEBmaWxlIGFhdWRpby9BQXVkaW8uaAogICovCiAKIC8qKgpAQCAtNDQ0LDYgKzQ0NCwyMiBAQAogfTsKIHR5cGVkZWYgaW50MzJfdCBhYXVkaW9fY29udGVudF90eXBlX3Q7CiAKK2VudW0geworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgaW5kaWNhdGluZyB0aGUgYXVkaW8gY29udGVudCBhc3NvY2lhdGVkIHdpdGggdGhlc2UgYXR0cmlidXRlcyB3aWxsIGZvbGxvdyB0aGUKKyAgICAgKiBkZWZhdWx0IHBsYXRmb3JtIGJlaGF2aW9yIHdpdGggcmVnYXJkcyB0byB3aGljaCBjb250ZW50IHdpbGwgYmUgc3BhdGlhbGl6ZWQgb3Igbm90LgorICAgICAqLworICAgIEFBVURJT19TUEFUSUFMSVpBVElPTl9CRUhBVklPUl9BVVRPID0gMSwKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGluZGljYXRpbmcgdGhlIGF1ZGlvIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIGF0dHJpYnV0ZXMgc2hvdWxkIG5ldmVyCisgICAgICogYmUgc3BhdGlhbGl6ZWQuCisgICAgICovCisgICAgQUFVRElPX1NQQVRJQUxJWkFUSU9OX0JFSEFWSU9SX05FVkVSID0gMiwKK307Cit0eXBlZGVmIGludDMyX3QgYWF1ZGlvX3NwYXRpYWxpemF0aW9uX2JlaGF2aW9yX3Q7CisKIC8qKgogICogRGVmaW5lcyB0aGUgYXVkaW8gc291cmNlLgogICogQW4gYXVkaW8gc291cmNlIGRlZmluZXMgYm90aCBhIGRlZmF1bHQgcGh5c2ljYWwgc291cmNlIG9mIGF1ZGlvIHNpZ25hbCwgYW5kIGEgcmVjb3JkaW5nCkBAIC01NjUsNiArNTgxLDE0NSBAQAogfTsKIHR5cGVkZWYgaW50MzJfdCBhYXVkaW9fc2Vzc2lvbl9pZF90OwogCisvKioKKyAqIERlZmluZXMgdGhlIGF1ZGlvIGNoYW5uZWwgbWFzay4KKyAqIENoYW5uZWwgbWFza3MgYXJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNhbXBsZXMgYW5kIHRoZWlyCisgKiBhcnJhbmdlbWVudCBpbiB0aGUgYXVkaW8gZnJhbWUuIFRoZXkgYXJlIGFsc28gdXNlZCBpbiB0aGUgZW5kcG9pbnQKKyAqIChlLmcuIGEgVVNCIGF1ZGlvIGludGVyZmFjZSwgYSBEQUMgY29ubmVjdGVkIHRvIGhlYWRwaG9uZXMpIHRvCisgKiBzcGVjaWZ5IGFsbG93YWJsZSBjb25maWd1cmF0aW9ucyBvZiBhIHBhcnRpY3VsYXIgZGV2aWNlLgorICoKKyAqIEFkZGVkIGluIEFQSSBsZXZlbCAzMi4KKyAqLworZW51bSB7CisgICAgLyoqCisgICAgICogSW52YWxpZCBjaGFubmVsIG1hc2sKKyAgICAgKi8KKyAgICBBQVVESU9fQ0hBTk5FTF9JTlZBTElEID0gLTEsCisKKyAgICAvKioKKyAgICAgKiBPdXRwdXQgYXVkaW8gY2hhbm5lbCBtYXNrCisgICAgICovCisgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfTEVGVCA9IDEgPDwgMCwKKyAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9SSUdIVCA9IDEgPDwgMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9DRU5URVIgPSAxIDw8IDIsCisgICAgQUFVRElPX0NIQU5ORUxfTE9XX0ZSRVFVRU5DWSA9IDEgPDwgMywKKyAgICBBQVVESU9fQ0hBTk5FTF9CQUNLX0xFRlQgPSAxIDw8IDQsCisgICAgQUFVRElPX0NIQU5ORUxfQkFDS19SSUdIVCA9IDEgPDwgNSwKKyAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9MRUZUX09GX0NFTlRFUiA9IDEgPDwgNiwKKyAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgPSAxIDw8IDcsCisgICAgQUFVRElPX0NIQU5ORUxfQkFDS19DRU5URVIgPSAxIDw8IDgsCisgICAgQUFVRElPX0NIQU5ORUxfU0lERV9MRUZUID0gMSA8PCA5LAorICAgIEFBVURJT19DSEFOTkVMX1NJREVfUklHSFQgPSAxIDw8IDEwLAorICAgIEFBVURJT19DSEFOTkVMX1RPUF9DRU5URVIgPSAxIDw8IDExLAorICAgIEFBVURJT19DSEFOTkVMX1RPUF9GUk9OVF9MRUZUID0gMSA8PCAxMiwKKyAgICBBQVVESU9fQ0hBTk5FTF9UT1BfRlJPTlRfQ0VOVEVSID0gMSA8PCAxMywKKyAgICBBQVVESU9fQ0hBTk5FTF9UT1BfRlJPTlRfUklHSFQgPSAxIDw8IDE0LAorICAgIEFBVURJT19DSEFOTkVMX1RPUF9CQUNLX0xFRlQgPSAxIDw8IDE1LAorICAgIEFBVURJT19DSEFOTkVMX1RPUF9CQUNLX0NFTlRFUiA9IDEgPDwgMTYsCisgICAgQUFVRElPX0NIQU5ORUxfVE9QX0JBQ0tfUklHSFQgPSAxIDw8IDE3LAorICAgIEFBVURJT19DSEFOTkVMX1RPUF9TSURFX0xFRlQgPSAxIDw8IDE4LAorICAgIEFBVURJT19DSEFOTkVMX1RPUF9TSURFX1JJR0hUID0gMSA8PCAxOSwKKyAgICBBQVVESU9fQ0hBTk5FTF9CT1RUT01fRlJPTlRfTEVGVCA9IDEgPDwgMjAsCisgICAgQUFVRElPX0NIQU5ORUxfQk9UVE9NX0ZST05UX0NFTlRFUiA9IDEgPDwgMjEsCisgICAgQUFVRElPX0NIQU5ORUxfQk9UVE9NX0ZST05UX1JJR0hUID0gMSA8PCAyMiwKKyAgICBBQVVESU9fQ0hBTk5FTF9MT1dfRlJFUVVFTkNZXzIgPSAxIDw8IDIzLAorICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1dJREVfTEVGVCA9IDEgPDwgMjQsCisgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfV0lERV9SSUdIVCA9IDEgPDwgMjUsCisKKyAgICBBQVVESU9fQ0hBTk5FTF9NT05PID0gQUFVRElPX0NIQU5ORUxfRlJPTlRfTEVGVCwKKyAgICBBQVVESU9fQ0hBTk5FTF9TVEVSRU8gPSBBQVVESU9fQ0hBTk5FTF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9SSUdIVCwKKyAgICBBQVVESU9fQ0hBTk5FTF8yUE9JTlQxID0gQUFVRElPX0NIQU5ORUxfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfTE9XX0ZSRVFVRU5DWSwKKyAgICBBQVVESU9fQ0hBTk5FTF9UUkkgPSBBQVVESU9fQ0hBTk5FTF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9SSUdIVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfQ0VOVEVSLAorICAgIEFBVURJT19DSEFOTkVMX1RSSV9CQUNLID0gQUFVRElPX0NIQU5ORUxfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9SSUdIVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9CQUNLX0NFTlRFUiwKKyAgICBBQVVESU9fQ0hBTk5FTF8zUE9JTlQxID0gQUFVRElPX0NIQU5ORUxfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfQ0VOVEVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfTE9XX0ZSRVFVRU5DWSwKKyAgICBBQVVESU9fQ0hBTk5FTF8yUE9JTlQwUE9JTlQyID0gQUFVRElPX0NIQU5ORUxfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfVE9QX1NJREVfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1RPUF9TSURFX1JJR0hULAorICAgIEFBVURJT19DSEFOTkVMXzJQT0lOVDFQT0lOVDIgPSBBQVVESU9fQ0hBTk5FTF8yUE9JTlQwUE9JTlQyIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfTE9XX0ZSRVFVRU5DWSwKKyAgICBBQVVESU9fQ0hBTk5FTF8zUE9JTlQwUE9JTlQyID0gQUFVRElPX0NIQU5ORUxfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfQ0VOVEVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfVE9QX1NJREVfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1RPUF9TSURFX1JJR0hULAorICAgIEFBVURJT19DSEFOTkVMXzNQT0lOVDFQT0lOVDIgPSBBQVVESU9fQ0hBTk5FTF8zUE9JTlQwUE9JTlQyIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfTE9XX0ZSRVFVRU5DWSwKKyAgICBBQVVESU9fQ0hBTk5FTF9RVUFEID0gQUFVRElPX0NIQU5ORUxfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfQkFDS19MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfQkFDS19SSUdIVCwKKyAgICBBQVVESU9fQ0hBTk5FTF9RVUFEX1NJREUgPSBBQVVESU9fQ0hBTk5FTF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9SSUdIVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfU0lERV9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9TSURFX1JJR0hULAorICAgIEFBVURJT19DSEFOTkVMX1NVUlJPVU5EID0gQUFVRElPX0NIQU5ORUxfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9SSUdIVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9DRU5URVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfQkFDS19DRU5URVIsCisgICAgQUFVRElPX0NIQU5ORUxfUEVOVEEgPSBBQVVESU9fQ0hBTk5FTF9RVUFEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX0NFTlRFUiwKKyAgICAvLyBha2EgNVBPSU5UMV9CQUNLCisgICAgQUFVRElPX0NIQU5ORUxfNVBPSU5UMSA9IEFBVURJT19DSEFOTkVMX0ZST05UX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9SSUdIVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX0NFTlRFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0xPV19GUkVRVUVOQ1kgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9CQUNLX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9CQUNLX1JJR0hULAorICAgIEFBVURJT19DSEFOTkVMXzVQT0lOVDFfU0lERSA9IEFBVURJT19DSEFOTkVMX0ZST05UX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9DRU5URVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0xPV19GUkVRVUVOQ1kgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1NJREVfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfU0lERV9SSUdIVCwKKyAgICBBQVVESU9fQ0hBTk5FTF82UE9JTlQxID0gQUFVRElPX0NIQU5ORUxfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfQ0VOVEVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfTE9XX0ZSRVFVRU5DWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0JBQ0tfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX0JBQ0tfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9CQUNLX0NFTlRFUiwKKyAgICBBQVVESU9fQ0hBTk5FTF83UE9JTlQxID0gQUFVRElPX0NIQU5ORUxfNVBPSU5UMSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1NJREVfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1NJREVfUklHSFQsCisgICAgQUFVRElPX0NIQU5ORUxfNVBPSU5UMVBPSU5UMiA9IEFBVURJT19DSEFOTkVMXzVQT0lOVDEgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9UT1BfU0lERV9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfVE9QX1NJREVfUklHSFQsCisgICAgQUFVRElPX0NIQU5ORUxfNVBPSU5UMVBPSU5UNCA9IEFBVURJT19DSEFOTkVMXzVQT0lOVDEgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9UT1BfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1RPUF9GUk9OVF9SSUdIVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1RPUF9CQUNLX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9UT1BfQkFDS19SSUdIVCwKKyAgICBBQVVESU9fQ0hBTk5FTF83UE9JTlQxUE9JTlQyID0gQUFVRElPX0NIQU5ORUxfN1BPSU5UMSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1RPUF9TSURFX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9UT1BfU0lERV9SSUdIVCwKKyAgICBBQVVESU9fQ0hBTk5FTF83UE9JTlQxUE9JTlQ0ID0gQUFVRElPX0NIQU5ORUxfN1BPSU5UMSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1RPUF9GUk9OVF9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfVE9QX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfVE9QX0JBQ0tfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1RPUF9CQUNLX1JJR0hULAorICAgIEFBVURJT19DSEFOTkVMXzlQT0lOVDFQT0lOVDQgPSBBQVVESU9fQ0hBTk5FTF83UE9JTlQxUE9JTlQ0IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfV0lERV9MRUZUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0NIQU5ORUxfRlJPTlRfV0lERV9SSUdIVCwKKyAgICBBQVVESU9fQ0hBTk5FTF85UE9JTlQxUE9JTlQ2ID0gQUFVRElPX0NIQU5ORUxfOVBPSU5UMVBPSU5UNCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19DSEFOTkVMX1RPUF9TSURFX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9UT1BfU0lERV9SSUdIVCwKKworICAgIEFBVURJT19DSEFOTkVMX0ZST05UX0JBQ0sgPSBBQVVESU9fQ0hBTk5FTF9GUk9OVF9DRU5URVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fQ0hBTk5FTF9CQUNLX0NFTlRFUiwKK307Cit0eXBlZGVmIHVpbnQzMl90IGFhdWRpb19jaGFubmVsX21hc2tfdDsKKwogdHlwZWRlZiBzdHJ1Y3QgQUF1ZGlvU3RyZWFtU3RydWN0ICAgICAgICAgQUF1ZGlvU3RyZWFtOwogdHlwZWRlZiBzdHJ1Y3QgQUF1ZGlvU3RyZWFtQnVpbGRlclN0cnVjdCAgQUF1ZGlvU3RyZWFtQnVpbGRlcjsKIApAQCAtNjIzLDggKzc3OCwxNiBAQAogICAgICAgICBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKLSAqIFJlcXVlc3QgYW4gYXVkaW8gZGV2aWNlIGlkZW50aWZpZWQgZGV2aWNlIHVzaW5nIGFuIElELgotICogT24gQW5kcm9pZCwgZm9yIGV4YW1wbGUsIHRoZSBJRCBjb3VsZCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBKYXZhIEF1ZGlvTWFuYWdlci4KKyAqIFJlcXVlc3QgYW4gYXVkaW8gZGV2aWNlIGlkZW50aWZpZWQgYnkgYW4gSUQuCisgKgorICogVGhlIElEIGNvdWxkIGJlIG9idGFpbmVkIGZyb20gdGhlIEphdmEgQXVkaW9NYW5hZ2VyLgorICogQXVkaW9NYW5hZ2VyLmdldERldmljZXMoKSByZXR1cm5zIGFuIGFycmF5IG9mIHtAbGluayBBdWRpb0RldmljZUluZm99LAorICogd2hpY2ggY29udGFpbnMgYSBnZXRJZCgpIG1ldGhvZC4gVGhhdCBJRCBjYW4gYmUgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24uCisgKgorICogSXQgaXMgcG9zc2libGUgdGhhdCB5b3UgbWF5IG5vdCBnZXQgdGhlIGRldmljZSB0aGF0IHlvdSByZXF1ZXN0ZWQuCisgKiBTbyBpZiBpdCBpcyBpbXBvcnRhbnQgdG8geW91LCB5b3Ugc2hvdWxkIGNhbGwKKyAqIEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZCgpIGFmdGVyIHRoZSBzdHJlYW0gaXMgb3BlbmVkIHRvCisgKiB2ZXJpZnkgdGhlIGFjdHVhbCBJRC4KICAqCiAgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfSwKICAqIGluIHdoaWNoIGNhc2UgdGhlIHByaW1hcnkgZGV2aWNlIHdpbGwgYmUgdXNlZC4KQEAgLTY0Myw4ICs4MDYsMTEgQEAKICAqIFRoaXMgaXMgdXN1YWxseSB7QGNvZGUgQ29udGV4dCNnZXRQYWNrYWdlTmFtZSgpfS4KICAqCiAgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIGEgcmFuZG9tIHBhY2thZ2UgaW4gdGhlIGNhbGxpbmcgdWlkLgotICogVGhlIHZhc3QgbWFqb3JpdHkgb2YgYXBwcyBoYXZlIG9ubHkgb25lIHBhY2thZ2UgcGVyIGNhbGxpbmcgVUlELiBJZiB0aGUgcGFja2FnZQotICogbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgY2FsbGluZyBVSUQsIHRoZW4gcmVxdWVzdHMgd2lsbCBiZSByZWplY3RlZC4KKyAqIFRoZSB2YXN0IG1ham9yaXR5IG9mIGFwcHMgaGF2ZSBvbmx5IG9uZSBwYWNrYWdlIHBlciBjYWxsaW5nIFVJRC4KKyAqIElmIGFuIGludmFsaWQgcGFja2FnZSBuYW1lIGlzIHNldCwgaW5wdXQgc3RyZWFtcyBtYXkgbm90IGJlIGdpdmVuIHBlcm1pc3Npb24gdG8KKyAqIHJlY29yZCB3aGVuIHN0YXJ0ZWQuCisgKgorICogVGhlIHBhY2thZ2UgbmFtZSBpcyB1c3VhbGx5IHRoZSBhcHBsaWNhdGlvbklkIGluIHlvdXIgYXBwJ3MgYnVpbGQuZ3JhZGxlIGZpbGUuCiAgKgogICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMS4KICAqCkBAIC02OTksNiArODY1LDExIEBACiAgKiBJZiBhbiBleGFjdCB2YWx1ZSBpcyBzcGVjaWZpZWQgdGhlbiBhbiBvcGVuZWQgc3RyZWFtIHdpbGwgdXNlIHRoYXQgdmFsdWUuCiAgKiBJZiBhIHN0cmVhbSBjYW5ub3QgYmUgb3BlbmVkIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSB0aGVuIHRoZSBvcGVuIHdpbGwgZmFpbC4KICAqCisgKiBBcyB0aGUgY2hhbm5lbCBjb3VudCBwcm92aWRlZCBoZXJlIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIGNvdW50CisgKiBvZiBjaGFubmVsIG1hc2sgdXNlZCBpbiB7QGxpbmsgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsTWFza30sIHRoZSBsYXN0IGNhbGxlZCBmdW5jdGlvbgorICogd2lsbCBiZSByZXNwZWN0ZWQgaWYgYm90aCB0aGlzIGZ1bmN0aW9uIGFuZCB7QGxpbmsgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsTWFza30gYXJlCisgKiBjYWxsZWQuCisgKgogICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KICAqCiAgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQpAQCAtNzE0LDYgKzg4NSw4IEBACiAgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKICAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUgTnVtYmVyIG9mIHNhbXBsZXMgaW4gYSBmcmFtZS4KKyAqCisgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50fQogICovCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKQEAgLTgzNiw2ICsxMDA5LDM3IEBACiAgICAgICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCisgKiBTZXRzIHRoZSBiZWhhdmlvciBhZmZlY3Rpbmcgd2hldGhlciBzcGF0aWFsaXphdGlvbiB3aWxsIGJlIHVzZWQuCisgKgorICogVGhlIEFBdWRpbyBzeXN0ZW0gd2lsbCB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBzZWxlY3Qgd2hldGhlciB0aGUgc3RyZWFtIHdpbGwgZ28KKyAqIHRocm91Z2ggYSBzcGF0aWFsaXplciBlZmZlY3Qgb3Igbm90IHdoZW4gdGhlIGVmZmVjdCBpcyBzdXBwb3J0ZWQgYW5kIGVuYWJsZWQuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMi4KKyAqCisgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQorICogQHBhcmFtIHNwYXRpYWxpemF0aW9uQmVoYXZpb3IgdGhlIGRlc2lyZWQgYmVoYXZpb3Igd2l0aCByZWdhcmRzIHRvIHNwYXRpYWxpemF0aW9uLCBlZy4KKyAqICAgICB7QGxpbmsgI0FBVURJT19TUEFUSUFMSVpBVElPTl9CRUhBVklPUl9BVVRPfQorICovCitBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTcGF0aWFsaXphdGlvbkJlaGF2aW9yKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCisgICAgICAgIGFhdWRpb19zcGF0aWFsaXphdGlvbl9iZWhhdmlvcl90IHNwYXRpYWxpemF0aW9uQmVoYXZpb3IpIF9fSU5UUk9EVUNFRF9JTigzMik7CisKKy8qKgorICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGF1ZGlvIGRhdGEgb2YgdGhpcyBvdXRwdXQgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGZvcgorICogc3BhdGlhbGl6YXRpb24uCisgKgorICogSWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBwcm9jZXNzZWQgZm9yIHNwYXRpYWxpemF0aW9uLCBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSB3aWxsIHByZXZlbnQKKyAqIGlzc3VlcyBzdWNoIGFzIGRvdWJsZS1wcm9jZXNzaW5nIG9uIHBsYXRmb3JtcyB0aGF0IHdpbGwgc3BhdGlhbGl6ZSBhdWRpbyBkYXRhLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMzIuCisgKgorICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKKyAqIEBwYXJhbSBpc1NwYXRpYWxpemVkIHRydWUgaWYgdGhlIGNvbnRlbnQgaXMgYWxyZWFkeSBwcm9jZXNzZWQgZm9yIGJpbmF1cmFsIG9yIHRyYW5zYXVyYWwgc3BhdGlhbAorICogICAgIHJlbmRlcmluZywgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRJc0NvbnRlbnRTcGF0aWFsaXplZChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAorICAgICAgICBib29sIGlzU3BhdGlhbGl6ZWQpIF9fSU5UUk9EVUNFRF9JTigzMik7CisKKy8qKgogICogU2V0IHRoZSBpbnB1dCAoY2FwdHVyZSkgcHJlc2V0IGZvciB0aGUgc3RyZWFtLgogICoKICAqIFRoZSBBQXVkaW8gc3lzdGVtIHdpbGwgdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gb3B0aW1pemUgdGhlCkBAIC0xMTM2LDYgKzEzNDAsMzIgQEAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyKQogICAgIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKKy8qKgorICogU2V0IGF1ZGlvIGNoYW5uZWwgbWFzayBmb3IgdGhlIHN0cmVhbS4KKyAqCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfS4KKyAqIElmIGJvdGggY2hhbm5lbCBtYXNrIGFuZCBjb3VudCBhcmUgbm90IHNldCwgdGhlbiBzdGVyZW8gd2lsbCB0aGVuIGJlIGNob3NlbiB3aGVuIHRoZQorICogc3RyZWFtIGlzIG9wZW5lZC4KKyAqIEFmdGVyIG9wZW5pbmcgYSBzdHJlYW0gd2l0aCBhbiB1bnNwZWNpZmllZCB2YWx1ZSwgdGhlIGFwcGxpY2F0aW9uIG11c3QgcXVlcnkgZm9yIHRoZQorICogYWN0dWFsIHZhbHVlLCB3aGljaCBtYXkgdmFyeSBieSBkZXZpY2UuCisgKgorICogSWYgYW4gZXhhY3QgdmFsdWUgaXMgc3BlY2lmaWVkIHRoZW4gYW4gb3BlbmVkIHN0cmVhbSB3aWxsIHVzZSB0aGF0IHZhbHVlLgorICogSWYgYSBzdHJlYW0gY2Fubm90IGJlIG9wZW5lZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgdGhlbiB0aGUgb3BlbiB3aWxsIGZhaWwuCisgKgorICogQXMgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBjb3VudCBvZiBwcm92aWRlZCBjaGFubmVsIG1hc2sgaGVyZSBtYXkgYmUgZGlmZmVyZW50CisgKiBmcm9tIHRoZSBjaGFubmVsIGNvdW50IHVzZWQgaW4ge0BsaW5rIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50fSBvcgorICoge0BsaW5rIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlc1BlckZyYW1lfSwgdGhlIGxhc3QgY2FsbGVkIGZ1bmN0aW9uIHdpbGwgYmUKKyAqIHJlc3BlY3RlZCBpZiB0aGlzIGZ1bmN0aW9uIGFuZCB7QGxpbmsgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnR9IG9yCisgKiB7QGxpbmsgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWV9IGFyZSBjYWxsZWQuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMi4KKyAqCisgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQorICogQHBhcmFtIGNoYW5uZWxNYXNrIEF1ZGlvIGNoYW5uZWwgbWFzayBkZXNpcmVkLgorICovCitBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsTWFzayhBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAorICAgICAgICBhYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIF9fSU5UUk9EVUNFRF9JTigzMik7CisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gU3RyZWFtIENvbnRyb2wKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTYxNiw2ICsxODQ2LDMxIEBACiAgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgorICogUmV0dXJuIHRoZSBzcGF0aWFsaXphdGlvbiBiZWhhdmlvciBmb3IgdGhlIHN0cmVhbS4KKyAqCisgKiBJZiBub25lIHdhcyBleHBsaWNpdGx5IHNldCwgaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQKKyAqIHtAbGluayAjQUFVRElPX1NQQVRJQUxJWkFUSU9OX0JFSEFWSU9SX0FVVE99IGJlaGF2aW9yLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMzIuCisgKgorICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKKyAqIEByZXR1cm4gc3BhdGlhbGl6YXRpb24gYmVoYXZpb3IsIGZvciBleGFtcGxlIHtAbGluayAjQUFVRElPX1NQQVRJQUxJWkFUSU9OX0JFSEFWSU9SX0FVVE99CisgKi8KK0FBVURJT19BUEkgYWF1ZGlvX3NwYXRpYWxpemF0aW9uX2JlaGF2aW9yX3QgQUF1ZGlvU3RyZWFtX2dldFNwYXRpYWxpemF0aW9uQmVoYXZpb3IoCisgICAgICAgIEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMzIpOworCisvKioKKyAqIFJldHVybiB3aGV0aGVyIHRoZSBjb250ZW50IG9mIHRoZSBzdHJlYW0gaXMgc3BhdGlhbGl6ZWQuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMi4KKyAqCisgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQorICogQHJldHVybiB0cnVlIGlmIHRoZSBjb250ZW50IGlzIHNwYXRpYWxpemVkCisgKi8KK0FBVURJT19BUEkgYm9vbCBBQXVkaW9TdHJlYW1faXNDb250ZW50U3BhdGlhbGl6ZWQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigzMik7CisKKworLyoqCiAgKiBSZXR1cm4gdGhlIGlucHV0IHByZXNldCBmb3IgdGhlIHN0cmVhbS4KICAqCiAgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI4LgpAQCAtMTY1Miw2ICsxOTA3LDE4IEBACiBBQVVESU9fQVBJIGJvb2wgQUF1ZGlvU3RyZWFtX2lzUHJpdmFjeVNlbnNpdGl2ZShBQXVkaW9TdHJlYW0qIHN0cmVhbSkKICAgICAgICAgX19JTlRST0RVQ0VEX0lOKDMwKTsKIAorLyoqCisgKiBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzayBmb3IgdGhlIHN0cmVhbS4gVGhpcyB3aWxsIGJlIHRoZSBtYXNrIHNldCB1c2luZworICoge0BsaW5rICNBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxNYXNrfSwgb3Ige0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9IG90aGVyd2lzZS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMyLgorICoKKyAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCisgKiBAcmV0dXJuIGFjdHVhbCBjaGFubmVsIG1hc2sKKyAqLworQUFVRElPX0FQSSBhYXVkaW9fY2hhbm5lbF9tYXNrX3QgQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxNYXNrKEFBdWRpb1N0cmVhbSogc3RyZWFtKQorICAgICAgICBfX0lOVFJPRFVDRURfSU4oMzIpOworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaCBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW9UZXN0aW5nLmgKaW5kZXggMDJlYzQxMS4uMGYyZDdhMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvVGVzdGluZy5oCkBAIC00OSw2ICs0OSwxMiBAQAogfTsKIHR5cGVkZWYgaW50MzJfdCBhYXVkaW9fcG9saWN5X3Q7CiAKKy8vIEludGVybmFsIGVycm9yIGNvZGVzLiBPbmx5IHVzZWQgYnkgdGhlIGZyYW1ld29yay4KK2VudW0geworICAgIEFBVURJT19JTlRFUk5BTF9FUlJPUl9CQVNFID0gLTEwMDAsCisgICAgQUFVRElPX0VSUk9SX1NUQU5EQlksCit9OworCiAvKioKICAqIENvbnRyb2wgd2hldGhlciBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKSB3aWxsIHVzZSB0aGUgbmV3IE1NQVAgZGF0YSBwYXRoCiAgKiBvciB0aGUgb2xkZXIgIkxlZ2FjeSIgZGF0YSBwYXRoLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NjcmlwdHMvbWVhc3VyZV9kZXZpY2VfcG93ZXIucHkgYi9tZWRpYS9saWJhYXVkaW8vc2NyaXB0cy9tZWFzdXJlX2RldmljZV9wb3dlci5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZjkwOTMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NjcmlwdHMvbWVhc3VyZV9kZXZpY2VfcG93ZXIucHkKQEAgLTAsMCArMSwyODggQEAKKyMhL3Vzci9iaW4vcHl0aG9uMworIiIiCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyIiIgorCisnJycKK01lYXN1cmUgQ1BVIHJlbGF0ZWQgcG93ZXIgb24gUGl4ZWwgNiBvciBsYXRlciBkZXZpY2VzIHVzaW5nIE9EUE0sCit0aGUgT24gRGV2aWNlIFBvd2VyIE1lYXN1cmVtZW50IHRvb2wuCitHZW5lcmF0ZSBhIENTViByZXBvcnQgZm9yIHB1dHRpbmcgaW4gYSBzcHJlYWRzaGVldAorJycnCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorCisjIGRlZmF1bHRzCitQUkVfREVMQVlfU0VDT05EUyA9IDAuNSAjIHRpbWUgdG8gc2xlZXAgYmVmb3JlIGNvbW1hbmQgdG8gYXZvaWQgYWRiIHVucm9vdCBlcnJvcgorREVGQVVMVF9OVU1fSVRFUkFUSU9OUyA9IDUKK0RFRkFVTFRfRklMRV9OQU1FID0gJ2VuZXJneV9jb21tYW5kcy50eHQnCisKKycnJworRGVmYXVsdCByYWlsIGFzc2lnbm1lbnRzCitwaGlsYnVyay1tYWNib29rcHJvMzpleHB0IHBoaWxidXJrJCBhZGIgc2hlbGwgY2F0IC9zeXMvYnVzL2lpby9kZXZpY2VzL2lpb1w6ZGV2aWNlMC9lbmVyZ3lfdmFsdWUKK3Q9MzQ5ODk0CitDSDAoVD0zNDk4OTQpW1MxME1fVkREX1RQVV0sIDU1Nzg3NTYKK0NIMShUPTM0OTg5NClbVlNZU19QV1JfTU9ERU1dLCAyOTExMDk0MAorQ0gyKFQ9MzQ5ODk0KVtWU1lTX1BXUl9SRkZFXSwgMzE2NjA0NgorQ0gzKFQ9MzQ5ODk0KVtTMk1fVkREX0NQVUNMMl0sIDMwMjAzNTAyCitDSDQoVD0zNDk4OTQpW1MzTV9WRERfQ1BVQ0wxXSwgMjMzNzc1MzMKK0NINShUPTM0OTg5NClbUzRNX1ZERF9DUFVDTDBdLCA0NjM1Njk0MgorQ0g2KFQ9MzQ5ODk0KVtTNU1fVkREX0lOVF0sIDEwNzcxODc2CitDSDcoVD0zNDk4OTQpW1MxTV9WRERfTUlGXSwgMjEwOTEzNjMKK3BoaWxidXJrLW1hY2Jvb2twcm8zOmV4cHQgcGhpbGJ1cmskIGFkYiBzaGVsbCBjYXQgL3N5cy9idXMvaWlvL2RldmljZXMvaWlvXDpkZXZpY2UxL2VuZXJneV92YWx1ZQordD0zNTk0NTgKK0NIMChUPTM1OTQ1OClbVlNZU19QV1JfV0xBTl9CVF0sIDQ1OTkzMjA5CitDSDEoVD0zNTk0NTgpW0wyU19WRERfQU9DX1JFVF0sIDI4MjI5MjgKK0NIMihUPTM1OTQ1OClbUzlTX1ZERF9BT0NdLCA2OTIzNzA2CitDSDMoVD0zNTk0NTgpW1M1U19WRERRX01FTV0sIDQ2NTgyMDIKK0NINChUPTM1OTQ1OClbUzEwU19WREQyTF0sIDU1MDYyNzMKK0NINShUPTM1OTQ1OClbUzRTX1ZERDJIX01FTV0sIDE0MjU0NTc0CitDSDYoVD0zNTk0NTgpW1MyU19WRERfRzNEXSwgNTMxNTQyMAorQ0g3KFQ9MzU5NDU4KVtWU1lTX1BXUl9ESVNQTEFZXSwgODEyMjE2NjUKKycnJworCisnJycKK0xETzJNKEwyTV9BTElWRSk6RERSICAtPiBEUkFNIEFycmF5IENvcmUgUG93ZXIKK0JVQ0s0UyhTNFNfVkREMkhfTUVNKTpERFIgLT4gTm9ybWFsIG9wZXJhdGlvbiBkYXRhIGFuZCBjb250cm9sIHBhdGggbG9naWMgY2lyY3VpdHMKK0JVQ0s1UyhTNVNfVkREUV9NRU0pOkREUiAtPiBMUEREUiBJL08gaW50ZXJmYWNlCitCVUNLMTBTKFMxMFNfVkREMkwpOkREUiAgLT4gRFZGU0MgKDE2MDBNYnBzIG9yIGxvd2VyKSBvcGVyYXRpb24gZGF0YSBhbmQgY29udHJvbCBwYXRoIGxvZ2ljIGNpcmN1aXRzCitCVUNLMU0gKFMxTV9WRERfTUlGKTogIFNvQyBzaWRlIE1lbW9yeSBJbnRlckZhY2UgYW5kIENvbnRyb2xsZXIKKycnJworCisjIE1hcCBiZXR3ZWVuIHJhaWwgbmFtZSBhbmQgaHVtYW4gcmVhZGFibGUgbmFtZS4KK0VORVJHWV9ESUNUSU9OQVJZID0geyBcCisgICAgICAgICdTNE1fVkREX0NQVUNMMCc6ICdDUFUwJywgXAorICAgICAgICAnUzNNX1ZERF9DUFVDTDEnOiAnQ1BVMScsIFwKKyAgICAgICAgJ1MyTV9WRERfQ1BVQ0wyJzogJ0NQVTInLCBcCisgICAgICAgICdTMU1fVkREX01JRic6ICdNSUYnLCBcCisgICAgICAgICdMMk1fQUxJVkUnOiAnRERSQUMnLCBcCisgICAgICAgICdTNFNfVkREMkhfTUVNJzogJ0REUk5PJywgXAorICAgICAgICAnUzEwU19WREQyTCc6ICdERFIxNicsIFwKKyAgICAgICAgJ1M1U19WRERRX01FTSc6ICdERFJJTycsIFwKKyAgICAgICAgJ1ZTWVNfUFdSX0RJU1BMQVknOiAnU0NSRUVOJ30KKworU09SVEVEX0VORVJHWV9MSVNUID0gc29ydGVkKEVORVJHWV9ESUNUSU9OQVJZLCBrZXk9RU5FUkdZX0RJQ1RJT05BUlkuZ2V0KQorCisjIFNvbWV0aW1lcyBhZGIgcmV0dXJucyAxIGZvciBubyBhcHBhcmVudCByZWFzb24uCisjIFNvIHRyeSBzZXZlcmFsIHRpbWVzLgorIyBAcmV0dXJuIDAgb24gc3VjY2VzcworZGVmIGFkYlRyeU11bHRpcGxlKGNvbW1hbmQpOgorICAgIHJldHVybkNvZGUgPSAxCisgICAgY291bnQgPSAwCisgICAgbGltaXQgPSA1CisgICAgd2hpbGUgY291bnQgPCBsaW1pdCBhbmQgcmV0dXJuQ29kZSAhPSAwOgorICAgICAgICBwcmludCgoJ1RyeSB0byBhZGIge30ge30gb2Yge30nLmZvcm1hdChjb21tYW5kLCBjb3VudCwgbGltaXQpKSkKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKFsiYWRiIiwgIndhaXQtZm9yLWRldmljZSJdKQorICAgICAgICB0aW1lLnNsZWVwKFBSRV9ERUxBWV9TRUNPTkRTKQorICAgICAgICByZXR1cm5Db2RlID0gc3VicHJvY2Vzcy5jYWxsKFsiYWRiIiwgY29tbWFuZF0pCisgICAgICAgIHByaW50KCgncmV0dXJuQ29kZSA9IHt9Jy5mb3JtYXQocmV0dXJuQ29kZSkpKQorICAgICAgICBjb3VudCArPSAxCisgICAgcmV0dXJuIHJldHVybkNvZGUKKworIyBTb21ldGltZXMgImFkYiByb290IiByZXR1cm5zIDEhCisjIFNvIHRyeSBzZXZlcmFsIHRpbWVzLgorIyBAcmV0dXJuIDAgb24gc3VjY2VzcworZGVmIGFkYlJvb3QoKToKKyAgICByZXR1cm4gYWRiVHJ5TXVsdGlwbGUoInJvb3QiKTsKKworIyBTb21ldGltZXMgImFkYiB1bnJvb3QiIHJldHVybnMgMSEKKyMgU28gdHJ5IHNldmVyYWwgdGltZXMuCisjIEByZXR1cm4gMCBvbiBzdWNjZXNzCitkZWYgYWRiVW5yb290KCk6CisgICAgcmV0dXJuIGFkYlRyeU11bHRpcGxlKCJ1bnJvb3QiKTsKKworIyBAcGFyYW0gY29tbWFuZFN0cmluZyBTdHJpbmcgY29udGFpbmluZyBzaGVsbCBjb21tYW5kCisjIEByZXR1cm4gQm90aCB0aGUgc3Rkb3V0IGFuZCBzdGRlcnIgb2YgdGhlIGNvbW1hbmRzIHJ1bgorZGVmIHJ1bkNvbW1hbmQoY29tbWFuZFN0cmluZyk6CisgICAgcHJpbnQoY29tbWFuZFN0cmluZykKKyAgICBpZiBjb21tYW5kU3RyaW5nID09ICJhZGIgdW5yb290IjoKKyAgICAgICAgcmVzdWx0ID0gYWRiVW5yb290KCkKKyAgICBlbGlmIGNvbW1hbmRTdHJpbmcgPT0gImFkYiByb290IjoKKyAgICAgICAgcmVzdWx0ID0gYWRiUm9vdCgpCisgICAgZWxzZToKKyAgICAgICAgY29tbWFuZEFycmF5ID0gY29tbWFuZFN0cmluZy5zcGxpdCgnICcpCisgICAgICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MucnVuKGNvbW1hbmRBcnJheSwgY2hlY2s9VHJ1ZSwgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSkuc3Rkb3V0CisgICAgcmV0dXJuIHJlc3VsdAorCisjIEBwYXJhbSBjb21tYW5kU3RyaW5nIFN0cmluZyBjb250YWluaW5nIEFEQiBjb21tYW5kCisjIEByZXR1cm4gQm90aCB0aGUgc3Rkb3V0IGFuZCBzdGRlcnIgb2YgdGhlIGNvbW1hbmRzIHJ1bgorZGVmIGFkYkNvbW1hbmQoY29tbWFuZFN0cmluZyk6CisgICAgaWYgY29tbWFuZFN0cmluZyA9PSAidW5yb290IjoKKyAgICAgICAgcmVzdWx0ID0gYWRiVW5yb290KCkKKyAgICBlbGlmIGNvbW1hbmRTdHJpbmcgPT0gInJvb3QiOgorICAgICAgICByZXN1bHQgPSBhZGJSb290KCkKKyAgICBlbHNlOgorICAgICAgICBwcmludCgoImFkYiAiICsgY29tbWFuZFN0cmluZykpCisgICAgICAgIGNvbW1hbmRBcnJheSA9IFsiYWRiIl0gKyBjb21tYW5kU3RyaW5nLnNwbGl0KCcgJykKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKFsiYWRiIiwgIndhaXQtZm9yLWRldmljZSJdKQorICAgICAgICByZXN1bHQgPSBzdWJwcm9jZXNzLnJ1bihjb21tYW5kQXJyYXksIGNoZWNrPVRydWUsIGNhcHR1cmVfb3V0cHV0PVRydWUpLnN0ZG91dAorICAgIHJldHVybiByZXN1bHQKKworIyBQYXJzZSBhIGxpbmUgdGhhdCBsb29rcyBsaWtlICJDSDMoVD0xMDY5NzYzNSlbUzJNX1ZERF9DUFVDTDJdLCAxMTY2NTUzMzUiCisjIFVzZSBTMk1fVkREX0NQVUNMMiBhcyB0aGUgdGFnIGFuZCBzZXQgdmFsdWUgdG8gdGhlIG51bWJlcgorIyBpbiB0aGUgcmVwb3J0IGRpY3Rpb25hcnkuCitkZWYgcGFyc2VFbmVyZ3lWYWx1ZShzdHJpbmcpOgorICAgIHJldHVybiB0dXBsZShyZS5zcGxpdCgnXFt8XF0sICsnLCBzdHJpbmcpWzE6XSkKKworIyBSZWFkIGFjY3VtdWxhdGVkIGVuZXJneSBpbnRvIGEgZGljdGlvbmFyeS4KK2RlZiBtZWFzdXJlRW5lcmd5Rm9yRGV2aWNlKGRldmljZUluZGV4LCByZXBvcnQpOgorICAgICMgcHJpbnQoIm1lYXN1cmVFbmVyZ3lGb3JEZXZpY2UgIiArIHN0cihkZXZpY2VJbmRleCkpCisgICAgdGFibGVCeXRlcyA9IGFkYkNvbW1hbmQoIFwKKyAgICAgICAgICAgICdzaGVsbCBjYXQgL3N5cy9idXMvaWlvL2RldmljZXMvaWlvXDpkZXZpY2V7fS9lbmVyZ3lfdmFsdWUnXAorICAgICAgICAgICAgLmZvcm1hdChkZXZpY2VJbmRleCkpCisgICAgdGFibGUgPSB0YWJsZUJ5dGVzLmRlY29kZSgidXRmLTgiKQorICAgICMgcHJpbnQodGFibGUpCisgICAgZm9yIGNvdW50LCBsaW5lIGluIGVudW1lcmF0ZSh0YWJsZS5zcGxpdGxpbmVzKCkpOgorICAgICAgICBpZiBjb3VudCA+IDA6CisgICAgICAgICAgICB0YWdFbmVyZ3kgPSBwYXJzZUVuZXJneVZhbHVlKGxpbmUpCisgICAgICAgICAgICByZXBvcnRbdGFnRW5lcmd5WzBdXSA9IGludCh0YWdFbmVyZ3lbMV0uc3RyaXAoKSkKKyAgICAjIHByaW50KHJlcG9ydCkKKworZGVmIG1lYXN1cmVFbmVyZ3lPbmNlKCk6CisgICAgYWRiQ29tbWFuZCgicm9vdCIpCisgICAgcmVwb3J0ID0ge30KKyAgICBkMCA9IG1lYXN1cmVFbmVyZ3lGb3JEZXZpY2UoMCwgcmVwb3J0KQorICAgIGQxID0gbWVhc3VyZUVuZXJneUZvckRldmljZSgxLCByZXBvcnQpCisgICAgYWRiVW5yb290KCkKKyAgICByZXR1cm4gcmVwb3J0CisKKyMgU3VidHJhY3QgbnVtZXJpYyB2YWx1ZXMgZm9yIG1hdGNoaW5nIGtleXMuCitkZWYgc3VidHJhY3RSZXBvcnRzKEEsIEIpOgorICAgIHJldHVybiB7eDogQVt4XSAtIEJbeF0gZm9yIHggaW4gQSBpZiB4IGluIEJ9CisKKyMgQWRkIG51bWVyaWMgdmFsdWVzIGZvciBtYXRjaGluZyBrZXlzLgorZGVmIGFkZFJlcG9ydHMoQSwgQik6CisgICAgcmV0dXJuIHt4OiBBW3hdICsgQlt4XSBmb3IgeCBpbiBBIGlmIHggaW4gQn0KKworIyBEaXZpZGUgbnVtZXJpYyB2YWx1ZXMgYnkgZGl2aXNvci4KKyMgQHJldHVybiBNb2RpZmllZCBjb3B5IG9mIHJlcG9ydC4KK2RlZiBkaXZpZGVSZXBvcnQocmVwb3J0LCBkaXZpc29yKToKKyAgICByZXR1cm4ge2tleTogdmFsIC8gZGl2aXNvciBmb3Iga2V5LCB2YWwgaW4gbGlzdChyZXBvcnQuaXRlbXMoKSl9CisKKyMgR2VuZXJhdGUgYSBkaWN0aW9uYXJ5IHRoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gbWVhc3VyZW1lbnRzIG92ZXIgdGltZS4KK2RlZiBtZWFzdXJlRW5lcmd5T3ZlclRpbWUoZHVyYXRpb24pOgorICAgIHJlcG9ydDEgPSBtZWFzdXJlRW5lcmd5T25jZSgpCisgICAgcHJpbnQoKCJNZWFzdXJlIGVuZXJneSBmb3IgIiArIHN0cihkdXJhdGlvbikgKyAiIHNlY29uZHMuIikpCisgICAgdGltZS5zbGVlcChkdXJhdGlvbikKKyAgICByZXBvcnQyID0gbWVhc3VyZUVuZXJneU9uY2UoKQorICAgIHJldHVybiBzdWJ0cmFjdFJlcG9ydHMocmVwb3J0MiwgcmVwb3J0MSkKKworIyBHZW5lcmF0ZSBhIENTViBzdHJpbmcgY29udGFpbmluZyB0aGUgaHVtYW4gcmVhZGFibGUgaGVhZGVycy4KK2RlZiBmb3JtYXRFbmVyZ3lIZWFkZXIoKToKKyAgICBoZWFkZXIgPSAiIgorICAgIGZvciB0YWcgaW4gU09SVEVEX0VORVJHWV9MSVNUOgorICAgICAgICBoZWFkZXIgKz0gRU5FUkdZX0RJQ1RJT05BUllbdGFnXSArICIsICIKKyAgICByZXR1cm4gaGVhZGVyCisKKyMgR2VuZXJhdGUgYSBDU1Ygc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgdmFsdWVzLgorZGVmIGZvcm1hdEVuZXJneURhdGEocmVwb3J0KToKKyAgICBkYXRhID0gIiIKKyAgICBmb3IgdGFnIGluIFNPUlRFRF9FTkVSR1lfTElTVDoKKyAgICAgICAgaWYgdGFnIGluIGxpc3QocmVwb3J0LmtleXMoKSk6CisgICAgICAgICAgICBkYXRhICs9IHN0cihyZXBvcnRbdGFnXSkgKyAiLCAiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhICs9ICItMSwiCisgICAgcmV0dXJuIGRhdGEKKworZGVmIHByaW50RW5lcmd5UmVwb3J0KHJlcG9ydCk6CisgICAgcyA9ICJcbiIKKyAgICBzICs9ICJWYWx1ZXMgYXJlIGluIG1pY3JvV2F0dFNlY29uZHNcbiIKKyAgICBzICs9ICJSZXBvcnQgYmVsb3cgaXMgQ1NWIGZvcm1hdCBmb3IgcGFzdGluZyBpbnRvIGEgc3ByZWFkc2hlZXQ6XG4iCisgICAgcyArPSBmb3JtYXRFbmVyZ3lIZWFkZXIoKSArICJcbiIKKyAgICBzICs9IGZvcm1hdEVuZXJneURhdGEocmVwb3J0KSArICJcbiIKKyAgICBwcmludChzKQorCisjIEdlbmVyYXRlIGEgZGljdGlvbmFyeSB0aGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIG1lYXN1cmVtZW50cworIyBiZWZvcmUgYW5kIGFmdGVyIGV4ZWN1dGluZyB0aGUgY29tbWFuZC4KK2RlZiBtZWFzdXJlRW5lcmd5Rm9yQ29tbWFuZChjb21tYW5kKToKKyAgICByZXBvcnQxID0gbWVhc3VyZUVuZXJneU9uY2UoKQorICAgIHByaW50KCgiTWVhc3VyZSBlbmVyZ3kgZm9yOiAgIiArIGNvbW1hbmQpKQorICAgIHJlc3VsdCA9IHJ1bkNvbW1hbmQoY29tbWFuZCkKKyAgICByZXBvcnQyID0gbWVhc3VyZUVuZXJneU9uY2UoKQorICAgICMgcHJpbnQocmVzdWx0KQorICAgIHJldHVybiBzdWJ0cmFjdFJlcG9ydHMocmVwb3J0MiwgcmVwb3J0MSkKKworIyBBdmVyYWdlIHRoZSByZXN1bHRzIG9mIHNldmVyYWwgbWVhc3VyZW1lbnRzIGZvciBvbmUgY29tbWFuZC4KK2RlZiBhdmVyYWdlRW5lcmd5Rm9yQ29tbWFuZChjb21tYW5kLCBjb3VudCk6CisgICAgcHJpbnQoIj09PT09PT09PT09PT09PT09PT0gIzBcbiIpCisgICAgc3VtUmVwb3J0ID0gbWVhc3VyZUVuZXJneUZvckNvbW1hbmQoY29tbWFuZCkKKyAgICBmb3IgaSBpbiByYW5nZSgxLCBjb3VudCk6CisgICAgICAgIHByaW50KCgiPT09PT09PT09PT09PT09PT09PSAjIiArIHN0cihpKSArICJcbiIpKQorICAgICAgICByZXBvcnQgPSBtZWFzdXJlRW5lcmd5Rm9yQ29tbWFuZChjb21tYW5kKQorICAgICAgICBzdW1SZXBvcnQgPSBhZGRSZXBvcnRzKHN1bVJlcG9ydCwgcmVwb3J0KQorICAgIHByaW50KHN1bVJlcG9ydCkKKyAgICByZXR1cm4gZGl2aWRlUmVwb3J0KHN1bVJlcG9ydCwgY291bnQpCisKKyMgUGFyc2UgYSBsaXN0IG9mIGNvbW1hbmRzIGluIGEgZmlsZS4KKyMgTGluZXMgZW5kaW5nIGluICJcIiBhcmUgY29udGludWF0aW9uIGxpbmVzLgorIyBMaW5lcyBiZWdpbm5pbmcgd2l0aCAiIyIgYXJlIGNvbW1lbnRzLgorZGVmIG1lYXN1cmVFbmVyZ3lGb3JDb21tYW5kcyhmaWxlTmFtZSk6CisgICAgZmluYWxSZXBvcnQgPSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisgICAgZmluYWxSZXBvcnQgKz0gImNvbW1lbnQsIGNvbW1hbmQsICIgKyBmb3JtYXRFbmVyZ3lIZWFkZXIoKSArICJcbiIKKyAgICBjb21tZW50ID0gIiIKKyAgICB0cnk6CisgICAgICAgIGZwID0gb3BlbihmaWxlTmFtZSkKKyAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgd2hpbGUgbGluZToKKyAgICAgICAgICAgIGNvbW1hbmQgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIGNvbW1hbmQuc3RhcnRzd2l0aCgiIyIpOgorICAgICAgICAgICAgICAgICMgaWdub3JlIGNvbW1lbnQKKyAgICAgICAgICAgICAgICBwcmludCgoY29tbWFuZCArICJcbiIpKQorICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tYW5kWzE6XS5zdHJpcCgpICMgcmVtb3ZlIGxlYWRpbmcgJyMnCisgICAgICAgICAgICBlbGlmIGNvbW1hbmQuZW5kc3dpdGgoJ1xcJyk6CisgICAgICAgICAgICAgICAgY29tbWFuZCA9IGNvbW1hbmRbOi0xXS5zdHJpcCgpICMgcmVtb3ZlIHRyYWlsaW5nICdcJworICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQoY29tbWFuZCkKKyAgICAgICAgICAgIGVsaWYgY29tbWFuZDoKKyAgICAgICAgICAgICAgICByZXBvcnQgPSBhdmVyYWdlRW5lcmd5Rm9yQ29tbWFuZChjb21tYW5kLCBERUZBVUxUX05VTV9JVEVSQVRJT05TKQorICAgICAgICAgICAgICAgIGZpbmFsUmVwb3J0ICs9IGNvbW1lbnQgKyAiLCAiICsgY29tbWFuZCArICIsICIgKyBmb3JtYXRFbmVyZ3lEYXRhKHJlcG9ydCkgKyAiXG4iCisgICAgICAgICAgICAgICAgcHJpbnQoZmluYWxSZXBvcnQpCisgICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgIGZpbmFsbHk6CisgICAgICAgIGZwLmNsb3NlKCkKKyAgICByZXR1cm4gZmluYWxSZXBvcnQKKworZGVmIG1haW4oKToKKyAgICAjIHBhcnNlIGNvbW1hbmQgbGluZSBhcmdzCisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1zJywgJy0tc2Vjb25kcycsCisgICAgICAgICAgICBoZWxwPSJNZWFzdXJlIHBvd2VyIGZvciBOIHNlY29uZHMuIElnbm9yZSBzY3JpcHRGaWxlLiIsCisgICAgICAgICAgICB0eXBlPWZsb2F0KQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoImZpbGVOYW1lIiwKKyAgICAgICAgICAgIG5hcmdzID0gJz8nLAorICAgICAgICAgICAgaGVscD0iUGF0aCB0byBmaWxlIGNvbnRhaW5pbmcgY29tbWFuZHMgdG8gYmUgbWVhc3VyZWQuIgorICAgICAgICAgICAgICAgICAgICArICIgRGVmYXVsdCBwYXRoID0gIiArIERFRkFVTFRfRklMRV9OQU1FICsgIi4iCisgICAgICAgICAgICAgICAgICAgICsgIiBMaW5lcyBlbmRpbmcgaW4gJ1wnIGFyZSBjb250aW51YXRpb24gbGluZXMuIgorICAgICAgICAgICAgICAgICAgICArICIgTGluZXMgYmVnaW5uaW5nIHdpdGggJyMnIGFyZSBjb21tZW50cy4iLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PURFRkFVTFRfRklMRV9OQU1FKQorICAgIGFyZ3M9cGFyc2VyLnBhcnNlX2FyZ3MoKTsKKworICAgIHByaW50KCgic2Vjb25kcyAgPSAiICsgc3RyKGFyZ3Muc2Vjb25kcykpKQorICAgIHByaW50KCgiZmlsZU5hbWUgPSAiICsgc3RyKGFyZ3MuZmlsZU5hbWUpKSkKKyAgICAjIFByb2Nlc3MgY29tbWFuZCBsaW5lCisgICAgaWYgYXJncy5zZWNvbmRzOgorICAgICAgICByZXBvcnQgPSBtZWFzdXJlRW5lcmd5T3ZlclRpbWUoYXJncy5zZWNvbmRzKQorICAgICAgICBwcmludEVuZXJneVJlcG9ydChyZXBvcnQpCisgICAgZWxzZToKKyAgICAgICAgcmVwb3J0ID0gbWVhc3VyZUVuZXJneUZvckNvbW1hbmRzKGFyZ3MuZmlsZU5hbWUpCisgICAgICAgIHByaW50KHJlcG9ydCkKKyAgICBwcmludCgiRmluaXNoZWQuXG4iKQorICAgIHJldHVybiAwCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NjcmlwdHMvc2V0dXBfb2RwbV9jcHVfcmFpbHMuc2ggYi9tZWRpYS9saWJhYXVkaW8vc2NyaXB0cy9zZXR1cF9vZHBtX2NwdV9yYWlscy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOTI0MWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NjcmlwdHMvc2V0dXBfb2RwbV9jcHVfcmFpbHMuc2gKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL2Jhc2gKKworIyBDb25maWd1cmUgT0RQTSByYWlscyB0byBtZWFzdXJlIENQVSBzcGVjaWZpYyBwb3dlci4KKyMgU2VlIGdvL29kcG0tcDIxLXVzZXJndWlkZQorCithZGIgcm9vdAorCisjIExETzJNKEwyTV9BTElWRSkgLSBEUkFNIEFycmF5IENvcmUgUG93ZXIKK2FkYiBzaGVsbCAnZWNobyAiQ0gwPUxETzJNIiA+IC9zeXMvYnVzL2lpby9kZXZpY2VzL2lpb1w6ZGV2aWNlMC9lbmFibGVkX3JhaWxzJworCisjIFRoZXNlIGFyZSB0aGUgZGVmYXVsdHMuCisjIEJVQ0syTShTMk1fVkREX0NQVUNMMik6Q1BVKEJJRykKKyMgYWRiIHNoZWxsICdlY2hvICJDSDM9QlVDSzJNIiA+IC9zeXMvYnVzL2lpby9kZXZpY2VzL2lpb1w6ZGV2aWNlMC9lbmFibGVkX3JhaWxzJworIyBCVUNLM00oUzNNX1ZERF9DUFVDTDEpOkNQVShNSUQpCisjIGFkYiBzaGVsbCAnZWNobyAiQ0g0PUJVQ0szTSIgPiAvc3lzL2J1cy9paW8vZGV2aWNlcy9paW9cOmRldmljZTAvZW5hYmxlZF9yYWlscycKKyMgQlVDSzRNKFM0TV9WRERfQ1BVQ0wwKTpDUFUoTElUVExFKQorIyBhZGIgc2hlbGwgJ2VjaG8gIkNINT1CVUNLNE0iID4gL3N5cy9idXMvaWlvL2RldmljZXMvaWlvXDpkZXZpY2UwL2VuYWJsZWRfcmFpbHMnCisjIEJVQ0sxTShTMU1fVkREX01JRik6TUlGCisjIGFkYiBzaGVsbCAnZWNobyAiQ0g3PUJVQ0sxTSIgPiAvc3lzL2J1cy9paW8vZGV2aWNlcy9paW9cOmRldmljZTAvZW5hYmxlZF9yYWlscycKKworIyBUaGVzZSBhcmUgZGVmYXVsdCBvbiBkZXZpY2UxLgorIyBCVUNLNVMoUzVTX1ZERFFfTUVNKTpERFIKKyMgYWRiIHNoZWxsICdlY2hvICJDSDM9QlVDSzVTIiA+IC9zeXMvYnVzL2lpby9kZXZpY2VzL2lpb1w6ZGV2aWNlMS9lbmFibGVkX3JhaWxzJworIyBCVUNLMTBTKFMxMFNfVkREMkwpOkREUgorIyBhZGIgc2hlbGwgJ2VjaG8gIkNIND1CVUNLMTBTIiA+IC9zeXMvYnVzL2lpby9kZXZpY2VzL2lpb1w6ZGV2aWNlMS9lbmFibGVkX3JhaWxzJworIyBCVUNLNFMoUzRTX1ZERDJIX01FTSk6RERSCisjIGFkYiBzaGVsbCAnZWNobyAiQ0g1PUJVQ0s0UyIgPiAvc3lzL2J1cy9paW8vZGV2aWNlcy9paW9cOmRldmljZTEvZW5hYmxlZF9yYWlscycKKworYWRiIHNoZWxsICdjYXQgL3N5cy9idXMvaWlvL2RldmljZXMvaWlvXDpkZXZpY2UwL2VuYWJsZWRfcmFpbHMnCithZGIgc2hlbGwgJ2NhdCAvc3lzL2J1cy9paW8vZGV2aWNlcy9paW9cOmRldmljZTEvZW5hYmxlZF9yYWlscycKKworYWRiIHVucm9vdAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc2NyaXB0cy9zeW50aG1hcmtfdGVzdHMudHh0IGIvbWVkaWEvbGliYWF1ZGlvL3NjcmlwdHMvc3ludGhtYXJrX3Rlc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjZkNDdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NjcmlwdHMvc3ludGhtYXJrX3Rlc3RzLnR4dApAQCAtMCwwICsxLDUwIEBACisjIE1lYXN1cmUgZW5lcmd5IGNvbnN1bXB0aW9uIHdpdGggc3ludGhtYXJrLgorCisjIE5vbmUKK2FkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uMSAtTjUwIC1CMiAtejAKK2FkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uMSAtTjc1IC1CMiAtejAKK2FkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uMSAtTjEwMCAtQjIgLXowCisKKyMgQURQRiBQSUQKK2FkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uMSAtTjUwIC1CMiAtejEKK2FkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uMSAtTjc1IC1CMiAtejEKK2FkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uMSAtTjEwMCAtQjIgLXoxCisKKyMgQURQRiA8NDAwIFJSCisjIGFkYiByb290IFwKKyMgYWRiIHNoZWxsIHNldHByb3AgdmVuZG9yLnBvd2VyaGFsLmFkcGYudWNsYW1wX21pbi5oaWdoX2xpbWl0IDQwMCBcCisjIGFkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uMSAtTjUwIC1CMiAtejEKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONzUgLUIyIC16MQorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU4xMDAgLUIyIC16MQorCisjIEFEUEYgPDUwMCBSUgorIyBhZGIgcm9vdCBcCisjIGFkYiBzaGVsbCBzZXRwcm9wIHZlbmRvci5wb3dlcmhhbC5hZHBmLnVjbGFtcF9taW4uaGlnaF9saW1pdCA1MDAgXAorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU41MCAtQjIgLXoxCisjIGFkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uMSAtTjc1IC1CMiAtejEKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1OMTAwIC1CMiAtejEKKworIyBBRFBGIDw2MDAgUlIKKyMgYWRiIHJvb3QgXAorIyBhZGIgc2hlbGwgc2V0cHJvcCB2ZW5kb3IucG93ZXJoYWwuYWRwZi51Y2xhbXBfbWluLmhpZ2hfbGltaXQgNjAwIFwKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONTAgLUIyIC16MQorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjEgLU43NSAtQjIgLXoxCisjIGFkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uMSAtTjEwMCAtQjIgLXoxCisKKyMgdWNsYW1wCisjIGFkYiByb290IFwKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONzUgLUIyIC11MQorCisjIHN0ZWFkeQorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjc1IC1CMiAtdTAKKworIyBDUFUgYWZmaW5pdHkKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONzUgLUIyIC11MCAtYzEKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONzUgLUIyIC11MCAtYzQKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW4xIC1ONzUgLUIyIC11MCAtYzYKKworIyBzdGVhZHkgKyBhZmZpbml0eQorIyBhZGIgc2hlbGwgc3ludGhtYXJrIC10aiAtbjc1IC1CMiAtdTAgLWMxCisjIGFkYiBzaGVsbCBzeW50aG1hcmsgLXRqIC1uNzUgLUIyIC11MCAtYzQKKyMgYWRiIHNoZWxsIHN5bnRobWFyayAtdGogLW43NSAtQjIgLXUwIC1jNgorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKaW5kZXggMzNhNWM3Zi4uMzYzZDIxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icApAQCAtNyw2ICs3LDY1IEBACiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAogfQogCit0aWR5X2Vycm9ycyA9IFsKKyAgICAvLyBodHRwczovL2NsYW5nLmxsdm0ub3JnL2V4dHJhL2NsYW5nLXRpZHkvY2hlY2tzL2xpc3QuaHRtbAorICAgIC8vIEZvciBtYW55IGNhdGVnb3JpZXMsIHRoZSBjaGVja3MgYXJlIHRvbyBtYW55IHRvIHNwZWNpZnkgaW5kaXZpZHVhbGx5LgorICAgIC8vIEZlZWwgZnJlZSB0byBkaXNhYmxlIGFzIG5lZWRlZCAtIGFzIHdhcm5pbmdzIGFyZSBnZW5lcmFsbHkgaWdub3JlZCwKKyAgICAvLyB3ZSB0cmVhdCB3YXJuaW5ncyBhcyBlcnJvcnMuCisgICAgImFuZHJvaWQtKiIsCisgICAgImJ1Z3Byb25lLSoiLAorICAgICJjZXJ0LSoiLAorICAgICJjbGFuZy1hbmFseXplci1zZWN1cml0eSoiLAorICAgICJnb29nbGUtKiIsCisgICAgIm1pc2MtKiIsCisgICAgLy8ibW9kZXJuaXplLSoiLCAgLy8gZXhwbGljaXRseSBsaXN0IHRoZSBtb2Rlcm5pemUgYXMgdGhleSBjYW4gYmUgc3ViamVjdGl2ZS4KKyAgICAibW9kZXJuaXplLWF2b2lkLWJpbmQiLAorICAgIC8vIm1vZGVybml6ZS1hdm9pZC1jLWFycmF5cyIsIC8vIHN0ZDo6YXJyYXk8PiBjYW4gYmUgdmVyYm9zZQorICAgICJtb2Rlcm5pemUtY29uY2F0LW5lc3RlZC1uYW1lc3BhY2VzIiwKKyAgICAvLyJtb2Rlcm5pemUtZGVwcmVjYXRlZC1oZWFkZXJzIiwgLy8gQyBoZWFkZXJzIHN0aWxsIG9rIGV2ZW4gaWYgdGhlcmUgaXMgQysrIGVxdWl2YWxlbnQuCisgICAgIm1vZGVybml6ZS1kZXByZWNhdGVkLWlvcy1iYXNlLWFsaWFzZXMiLAorICAgICJtb2Rlcm5pemUtbG9vcC1jb252ZXJ0IiwKKyAgICAibW9kZXJuaXplLW1ha2Utc2hhcmVkIiwKKyAgICAibW9kZXJuaXplLW1ha2UtdW5pcXVlIiwKKyAgICAibW9kZXJuaXplLXBhc3MtYnktdmFsdWUiLAorICAgICJtb2Rlcm5pemUtcmF3LXN0cmluZy1saXRlcmFsIiwKKyAgICAibW9kZXJuaXplLXJlZHVuZGFudC12b2lkLWFyZyIsCisgICAgIm1vZGVybml6ZS1yZXBsYWNlLWF1dG8tcHRyIiwKKyAgICAibW9kZXJuaXplLXJlcGxhY2UtcmFuZG9tLXNodWZmbGUiLAorICAgICJtb2Rlcm5pemUtcmV0dXJuLWJyYWNlZC1pbml0LWxpc3QiLAorICAgICJtb2Rlcm5pemUtc2hyaW5rLXRvLWZpdCIsCisgICAgIm1vZGVybml6ZS11bmFyeS1zdGF0aWMtYXNzZXJ0IiwKKyAgICAvLyAibW9kZXJuaXplLXVzZS1hdXRvIiwgLy8gZm91bmQgaW4gQUF1ZGlvQXVkaW8uY3BwCisgICAgIm1vZGVybml6ZS11c2UtYm9vbC1saXRlcmFscyIsCisgICAgIm1vZGVybml6ZS11c2UtZGVmYXVsdC1tZW1iZXItaW5pdCIsCisgICAgIm1vZGVybml6ZS11c2UtZW1wbGFjZSIsCisgICAgIm1vZGVybml6ZS11c2UtZXF1YWxzLWRlZmF1bHQiLAorICAgICJtb2Rlcm5pemUtdXNlLWVxdWFscy1kZWxldGUiLAorICAgIC8vICJtb2Rlcm5pemUtdXNlLW5vZGlzY2FyZCIsIC8vIGZvdW5kIGluIGFpZGwgZ2VuZXJhdGVkIGZpbGVzCisgICAgIm1vZGVybml6ZS11c2Utbm9leGNlcHQiLAorICAgICJtb2Rlcm5pemUtdXNlLW51bGxwdHIiLAorICAgIC8vICJtb2Rlcm5pemUtdXNlLW92ZXJyaWRlIiwgLy8gZm91bmQgaW4gYWlkbCBnZW5lcmF0ZWQgZmlsZXMKKyAgICAvLyAibW9kZXJuaXplLXVzZS10cmFpbGluZy1yZXR1cm4tdHlwZSIsIC8vIG5vdCBuZWNlc3NhcmlseSBtb3JlIHJlYWRhYmxlCisgICAgIm1vZGVybml6ZS11c2UtdHJhbnNwYXJlbnQtZnVuY3RvcnMiLAorICAgICJtb2Rlcm5pemUtdXNlLXVuY2F1Z2h0LWV4Y2VwdGlvbnMiLAorICAgIC8vICJtb2Rlcm5pemUtdXNlLXVzaW5nIiwgLy8gZm91bmQgdHlwZWRlZiBpbiBzZXZlcmFsIGZpbGVzCisgICAgInBlcmZvcm1hbmNlLSoiLAorCisgICAgLy8gUmVtb3ZlIHNvbWUgcGVkYW50aWMgc3R5bGlzdGljIHJlcXVpcmVtZW50cy4KKyAgICAiLWFuZHJvaWQtY2xvZXhlYy1kdXAiLCAvLyBmb3VuZCBpbiBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcAorICAgICItYnVncHJvbmUtbWFjcm8tcGFyZW50aGVzZXMiLCAvLyBmb3VuZCBpbiBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKKyAgICAiLWJ1Z3Byb25lLW5hcnJvd2luZy1jb252ZXJzaW9ucyIsIC8vIGZvdW5kIGluIHNldmVyYWwgaW50ZXJmYWNlIGZyb20gc2l6ZV90IHRvIGludDMyX3QKKworICAgICItZ29vZ2xlLXJlYWRhYmlsaXR5LWNhc3RpbmciLCAvLyBDKysgY2FzdHMgbm90IGFsd2F5cyBuZWNlc3NhcnkgYW5kIG1heSBiZSB2ZXJib3NlCisgICAgIi1nb29nbGUtcmVhZGFiaWxpdHktdG9kbyIsIC8vIGRvIG5vdCByZXF1aXJlIFRPRE8oaW5mbykKKyAgICAiLWdvb2dsZS1idWlsZC11c2luZy1uYW1lc3BhY2UiLCAvLyBSZWVuYWJsZSBhbmQgZml4IGxhdGVyLgorICAgICItZ29vZ2xlLWdsb2JhbC1uYW1lcy1pbi1oZWFkZXJzIiwgLy8gZm91bmQgaW4gc2V2ZXJhbCBmaWxlcworCisgICAgIi1taXNjLW5vbi1wcml2YXRlLW1lbWJlci12YXJpYWJsZXMtaW4tY2xhc3NlcyIsIC8vIGZvdW5kIGluIGFpZGwgZ2VuZXJhdGVkIGZpbGVzCisKKyAgICAiLXBlcmZvcm1hbmNlLW5vLWludC10by1wdHIiLCAvLyBmb3VuZCBpbiBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKK10KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmFhdWRpbyIsCiAKQEAgLTM0LDcgKzkzLDYgQEAKICAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKLQogICAgICAgICAvLyBCeSBkZWZhdWx0LCBhbGwgc3ltYm9scyBhcmUgaGlkZGVuLgogICAgICAgICAvLyAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCiAgICAgICAgIC8vIEFBVURJT19BUEkgaXMgdXNlZCB0byBleHBsaWNpdGx5IGV4cG9ydCBhIGZ1bmN0aW9uIG9yIGEgdmFyaWFibGUgYXMgYSB2aXNpYmxlIHN5bWJvbC4KQEAgLTUyLDcgKzExMCw3IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYnBlcm1pc3Npb24iLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBzYW5pdGl6ZTogewpAQCAtNjQsNiArMTIyLDEzIEBACiAgICAgICAgIHN5bWJvbF9maWxlOiAibGliYWF1ZGlvLm1hcC50eHQiLAogICAgICAgICB2ZXJzaW9uczogWyIyOCJdLAogICAgIH0sCisKKyAgICB0aWR5OiB0cnVlLAorICAgIHRpZHlfY2hlY2tzOiB0aWR5X2Vycm9ycywKKyAgICB0aWR5X2NoZWNrc19hc19lcnJvcnM6IHRpZHlfZXJyb3JzLAorICAgIHRpZHlfZmxhZ3M6IFsKKyAgICAgICAgIi1mb3JtYXQtc3R5bGU9ZmlsZSIsCisgICAgXQogfQogCiBjY19saWJyYXJ5IHsKQEAgLTEwMiw2ICsxNjcsOCBAQAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICAgICAgImFhdWRpby1haWRsLWNwcCIsCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAorICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKICAgICBdLAogCkBAIC0xMzksMTAgKzIwNiwxNiBAQAogICAgICAgICAiYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAiLAogICAgICAgICAiYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwIiwKLSAgICAgICAgImZsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9DaGFubmVsQ291bnRDb252ZXJ0ZXIuY3BwIiwKICAgICAgICAgImZsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL0Zsb3dHcmFwaE5vZGUuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9NYW55VG9NdWx0aUNvbnZlcnRlci5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL01vbm9CbGVuZC5jcHAiLAogICAgICAgICAiZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvTXVsdGlUb01vbm9Db252ZXJ0ZXIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9NdWx0aVRvTWFueUNvbnZlcnRlci5jcHAiLAogICAgICAgICAiZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9TYW1wbGVSYXRlQ29udmVydGVyLmNwcCIsCiAgICAgICAgICJmbG93Z3JhcGgvU2lua0Zsb2F0LmNwcCIsCiAgICAgICAgICJmbG93Z3JhcGgvU2lua0kxNi5jcHAiLAogICAgICAgICAiZmxvd2dyYXBoL1NpbmtJMjQuY3BwIiwKQEAgLTE1MSwxMSArMjI0LDI2IEBACiAgICAgICAgICJmbG93Z3JhcGgvU291cmNlSTE2LmNwcCIsCiAgICAgICAgICJmbG93Z3JhcGgvU291cmNlSTI0LmNwcCIsCiAgICAgICAgICJmbG93Z3JhcGgvU291cmNlSTMyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvcmVzYW1wbGVyL0ludGVnZXJSYXRpby5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL3Jlc2FtcGxlci9MaW5lYXJSZXNhbXBsZXIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9yZXNhbXBsZXIvTXVsdGlDaGFubmVsUmVzYW1wbGVyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlci5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXJNb25vLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlclN0ZXJlby5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL3Jlc2FtcGxlci9TaW5jUmVzYW1wbGVyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvcmVzYW1wbGVyL1NpbmNSZXNhbXBsZXJTdGVyZW8uY3BwIiwKICAgICBdLAogICAgIHNhbml0aXplOiB7CiAgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbImJvdW5kcyJdLAogICAgIH0sCisKKyAgICB0aWR5OiB0cnVlLAorICAgIHRpZHlfY2hlY2tzOiB0aWR5X2Vycm9ycywKKyAgICB0aWR5X2NoZWNrc19hc19lcnJvcnM6IHRpZHlfZXJyb3JzLAorICAgIHRpZHlfZmxhZ3M6IFsKKyAgICAgICAgIi1mb3JtYXQtc3R5bGU9ZmlsZSIsCisgICAgXQogfQogCiBhaWRsX2ludGVyZmFjZSB7CkBAIC0xNzIsMTkgKzI2MCwxNSBAQAogICAgICAgICAiYmluZGluZy9haWRsL2FhdWRpby9JQUF1ZGlvU2VydmljZS5haWRsIiwKICAgICBdLAogICAgIGltcG9ydHM6IFsKLSAgICAgICAgImF1ZGlvX2NvbW1vbi1haWRsIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxIiwKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwiLAogICAgICAgICAic2hhcmVkLWZpbGUtcmVnaW9uLWFpZGwiLAotICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbCIKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwiLAogICAgIF0sCiAgICAgYmFja2VuZDoKICAgICB7Ci0gICAgICAgIGNwcDogewotICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICAgICAgfSwKICAgICAgICAgamF2YTogewotICAgICAgICAgICAgLy8gVE9ETzogbmVlZCB0byBoYXZlIGF1ZGlvX2NvbW1vbi1haWRsIGF2YWlsYWJsZSBpbiBKYXZhIHRvIGVuYWJsZQotICAgICAgICAgICAgLy8gICAgICAgdGhpcy4KLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICAgICAgc2RrX3ZlcnNpb246ICJtb2R1bGVfY3VycmVudCIsCiAgICAgICAgIH0sCiAgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJBZGFwdGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJBZGFwdGVyLmNwcAppbmRleCA2ZTNhMWM4Li40MmQ4MWNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQWRhcHRlci5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuY3BwCkBAIC0xMjQsNCArMTI0LDE2IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckFkYXB0ZXI6OmV4aXRTdGFuZGJ5KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJmVuZHBvaW50T3V0KSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKKyAgICBFbmRwb2ludCBlbmRwb2ludDsKKyAgICBTdGF0dXMgc3RhdHVzID0gbURlbGVnYXRlLT5leGl0U3RhbmRieShzdHJlYW1IYW5kbGUsICZlbmRwb2ludCwgJnJlc3VsdCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKHN0YXR1cykpOworICAgIH0KKyAgICBlbmRwb2ludE91dCA9IHN0ZDo6bW92ZShlbmRwb2ludCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFhdWRpbwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJBZGFwdGVyLmgKaW5kZXggNWU5YWI1Ny4uZDE3MDc4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQWRhcHRlci5oCkBAIC01Nyw2ICs1Nyw5IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHVucmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQpIG92ZXJyaWRlOwogCisgICAgYWF1ZGlvX3Jlc3VsdF90IGV4aXRTdGFuZGJ5KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSBvdmVycmlkZTsKKwogcHJpdmF0ZToKICAgICBJQUF1ZGlvU2VydmljZSogY29uc3QgbURlbGVnYXRlOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKaW5kZXggZmE1YTJkYS4uOGU1ZmFjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKQEAgLTM2LDEzICszNiwxMCBAQAogdXNpbmcgYW5kcm9pZDo6SVNlcnZpY2VNYW5hZ2VyOwogdXNpbmcgYW5kcm9pZDo6ZGVmYXVsdFNlcnZpY2VNYW5hZ2VyOwogdXNpbmcgYW5kcm9pZDo6aW50ZXJmYWNlX2Nhc3Q7Ci11c2luZyBhbmRyb2lkOjpJSW50ZXJmYWNlOwogdXNpbmcgYW5kcm9pZDo6TXV0ZXg7CiB1c2luZyBhbmRyb2lkOjpQcm9jZXNzU3RhdGU7CiB1c2luZyBhbmRyb2lkOjpzcDsKIHVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotdXNpbmcgYW5kcm9pZDo6d3A7Ci11c2luZyBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIApAQCAtOTMsNyArOTAsNyBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSAtIGxpbmtUb0RlYXRoKCkgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYWF1ZGlvU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElBQXVkaW9TZXJ2aWNlPihiaW5kZXIpOwotICAgICAgICAgICAgICAgIG1BZGFwdGVyLnJlc2V0KG5ldyBBZGFwdGVyKGFhdWRpb1NlcnZpY2UsIG1BQXVkaW9DbGllbnQpKTsKKyAgICAgICAgICAgICAgICBtQWRhcHRlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8QWRhcHRlcj4oYWF1ZGlvU2VydmljZSwgbUFBdWRpb0NsaWVudCk7CiAgICAgICAgICAgICAgICAgbmVlZFRvUmVnaXN0ZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBjYWxsYmFja3MgY2FuIGJlIHJlY2VpdmVkIGJ5IG1BQXVkaW9DbGllbnQKICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CkBAIC0yMDQsMyArMjAxLDExIEBACiAKICAgICByZXR1cm4gc2VydmljZS0+dW5yZWdpc3RlckF1ZGlvVGhyZWFkKHN0cmVhbUhhbmRsZSwgY2xpZW50VGhyZWFkSWQpOwogfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQ2xpZW50OjpleGl0U3RhbmRieShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJmVuZHBvaW50T3V0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb1NlcnZpY2VJbnRlcmZhY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CisgICAgaWYgKHNlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworCisgICAgcmV0dXJuIHNlcnZpY2UtPmV4aXRTdGFuZGJ5KHN0cmVhbUhhbmRsZSwgZW5kcG9pbnRPdXQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5oCmluZGV4IDZhN2I2MzkuLjA5NjhmNGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmgKQEAgLTEwOCw3ICsxMDgsMTAgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICB9CiAKLSAgICB2b2lkIG9uU3RyZWFtQ2hhbmdlKGFhdWRpb19oYW5kbGVfdCBoYW5kbGUsIGludDMyX3Qgb3Bjb2RlLCBpbnQzMl90IHZhbHVlKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGV4aXRTdGFuZGJ5KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZlbmRwb2ludE91dCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIG9uU3RyZWFtQ2hhbmdlKGFhdWRpb19oYW5kbGVfdCAvKmhhbmRsZSovLCBpbnQzMl90IC8qb3Bjb2RlKi8sIGludDMyX3QgLyp2YWx1ZSovKSB7CiAgICAgICAgIC8vIFRPRE8gVGhpcyBpcyBqdXN0IGEgc3R1YiBzbyB3ZSBjYW4gaGF2ZSBhIGNsaWVudCBCaW5kZXIgdG8gcGFzcyB0byB0aGUgc2VydmljZS4KICAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnRlZCBpbiBhIGxhdGVyIENMLgogICAgICAgICBBTE9HVygib25TdHJlYW1DaGFuZ2UgY2FsbGVkISIpOwpAQCAtMTE2LDcgKzExOSw3IEBACiAKICAgICBjbGFzcyBBQXVkaW9DbGllbnQgOiBwdWJsaWMgYW5kcm9pZDo6SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsIHB1YmxpYyBCbkFBdWRpb0NsaWVudCB7CiAgICAgcHVibGljOgotICAgICAgICBBQXVkaW9DbGllbnQoYW5kcm9pZDo6d3A8QUF1ZGlvQmluZGVyQ2xpZW50PiBhYXVkaW9CaW5kZXJDbGllbnQpCisgICAgICAgIGV4cGxpY2l0IEFBdWRpb0NsaWVudChjb25zdCBhbmRyb2lkOjp3cDxBQXVkaW9CaW5kZXJDbGllbnQ+JiBhYXVkaW9CaW5kZXJDbGllbnQpCiAgICAgICAgICAgICAgICAgOiBtQmluZGVyQ2xpZW50KGFhdWRpb0JpbmRlckNsaWVudCkgewogICAgICAgICB9CiAKQEAgLTE1MCwxMCArMTUzLDEwIEBACiAgICAgY2xhc3MgQWRhcHRlciA6IHB1YmxpYyBBQXVkaW9CaW5kZXJBZGFwdGVyIHsKICAgICBwdWJsaWM6CiAgICAgICAgIEFkYXB0ZXIoY29uc3QgYW5kcm9pZDo6c3A8SUFBdWRpb1NlcnZpY2U+JiBkZWxlZ2F0ZSwKLSAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxBQXVkaW9DbGllbnQ+JiBhYXVkaW9DbGllbnQpCisgICAgICAgICAgICAgICAgYW5kcm9pZDo6c3A8QUF1ZGlvQ2xpZW50PiBhYXVkaW9DbGllbnQpCiAgICAgICAgICAgICAgICAgOiBBQXVkaW9CaW5kZXJBZGFwdGVyKGRlbGVnYXRlLmdldCgpKSwKICAgICAgICAgICAgICAgICAgIG1EZWxlZ2F0ZShkZWxlZ2F0ZSksCi0gICAgICAgICAgICAgICAgICBtQUF1ZGlvQ2xpZW50KGFhdWRpb0NsaWVudCkge30KKyAgICAgICAgICAgICAgICAgIG1BQXVkaW9DbGllbnQoc3RkOjptb3ZlKGFhdWRpb0NsaWVudCkpIHt9CiAKICAgICAgICAgdmlydHVhbCB+QWRhcHRlcigpIHsKICAgICAgICAgICAgIGlmIChtRGVsZWdhdGUgIT0gbnVsbHB0cikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlLmgKaW5kZXggNWQxMTUxMi4uZTkwMTc2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU2VydmljZUludGVyZmFjZS5oCkBAIC0zNyw3ICszNyw3IEBACiBjbGFzcyBBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlIHsKIHB1YmxpYzoKIAotICAgIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UoKSB7fTsKKyAgICBBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlKCkgPSBkZWZhdWx0OwogICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CiAKICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJDbGllbnQoY29uc3QgYW5kcm9pZDo6c3A8SUFBdWRpb0NsaWVudD4mIGNsaWVudCkgPSAwOwpAQCAtOTUsNiArOTUsMTYgQEAKIAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0b3BDbGllbnQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBFeGl0IHRoZSBzdGFuZGJ5IG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtSGFuZGxlIHRoZSBzdHJlYW0gaGFuZGxlCisgICAgICogQHBhcmFtIHBhcmNlbGFibGUgY29udGFpbnMgbmV3IGRhdGEgcXVldWUgaW5mb3JtYXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGV4ZWN1dGlvbgorICAgICAqLworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGV4aXRTdGFuZGJ5KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpID0gMDsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCmluZGV4IDJkNTAxZWYuLmI2MGJhYzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKQEAgLTIzLDI2ICsyMywzNiBAQAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KKwogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5oIgogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCi11c2luZyBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ7Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXREZXNjcmlwdGlvbjsKIAogQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbjo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbihjb25zdCBTdHJlYW1QYXJhbWV0ZXJzJiBwYXJjZWxhYmxlKSB7Ci0gICAgc2V0U2FtcGxlc1BlckZyYW1lKHBhcmNlbGFibGUuc2FtcGxlc1BlckZyYW1lKTsKKyAgICBzZXRDaGFubmVsTWFzayhwYXJjZWxhYmxlLmNoYW5uZWxNYXNrKTsKICAgICBzZXRTYW1wbGVSYXRlKHBhcmNlbGFibGUuc2FtcGxlUmF0ZSk7CiAgICAgc2V0RGV2aWNlSWQocGFyY2VsYWJsZS5kZXZpY2VJZCk7CiAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX3NoYXJpbmdfbW9kZV90KSA9PSBzaXplb2YocGFyY2VsYWJsZS5zaGFyaW5nTW9kZSkpOwogICAgIHNldFNoYXJpbmdNb2RlKHBhcmNlbGFibGUuc2hhcmluZ01vZGUpOwotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGF1ZGlvX2Zvcm1hdF90KSA9PSBzaXplb2YocGFyY2VsYWJsZS5hdWRpb0Zvcm1hdCkpOwotICAgIHNldEZvcm1hdChzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4ocGFyY2VsYWJsZS5hdWRpb0Zvcm1hdCkpOworICAgIGF1dG8gY29udkZvcm1hdCA9IGFuZHJvaWQ6OmFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QoCisgICAgICAgICAgICBwYXJjZWxhYmxlLmF1ZGlvRm9ybWF0KTsKKyAgICBzZXRGb3JtYXQoY29udkZvcm1hdC5vaygpID8gY29udkZvcm1hdC52YWx1ZSgpIDogQVVESU9fRk9STUFUX0lOVkFMSUQpOwogICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19kaXJlY3Rpb25fdCkgPT0gc2l6ZW9mKHBhcmNlbGFibGUuZGlyZWN0aW9uKSk7CiAgICAgc2V0RGlyZWN0aW9uKHBhcmNlbGFibGUuZGlyZWN0aW9uKTsKICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihhdWRpb191c2FnZV90KSA9PSBzaXplb2YocGFyY2VsYWJsZS51c2FnZSkpOwogICAgIHNldFVzYWdlKHBhcmNlbGFibGUudXNhZ2UpOwogICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19jb250ZW50X3R5cGVfdCkgPT0gc2l6ZW9mKHBhcmNlbGFibGUuY29udGVudFR5cGUpKTsKICAgICBzZXRDb250ZW50VHlwZShwYXJjZWxhYmxlLmNvbnRlbnRUeXBlKTsKKworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19zcGF0aWFsaXphdGlvbl9iZWhhdmlvcl90KSA9PQorICAgICAgICAgICAgc2l6ZW9mKHBhcmNlbGFibGUuc3BhdGlhbGl6YXRpb25CZWhhdmlvcikpOworICAgIHNldFNwYXRpYWxpemF0aW9uQmVoYXZpb3IocGFyY2VsYWJsZS5zcGF0aWFsaXphdGlvbkJlaGF2aW9yKTsKKyAgICBzZXRJc0NvbnRlbnRTcGF0aWFsaXplZChwYXJjZWxhYmxlLmlzQ29udGVudFNwYXRpYWxpemVkKTsKKworCiAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX2lucHV0X3ByZXNldF90KSA9PSBzaXplb2YocGFyY2VsYWJsZS5pbnB1dFByZXNldCkpOwogICAgIHNldElucHV0UHJlc2V0KHBhcmNlbGFibGUuaW5wdXRQcmVzZXQpOwogICAgIHNldEJ1ZmZlckNhcGFjaXR5KHBhcmNlbGFibGUuYnVmZmVyQ2FwYWNpdHkpOwpAQCAtNjMsMTMgKzczLDE5IEBACiAKIFN0cmVhbVBhcmFtZXRlcnMgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbjo6cGFyY2VsYWJsZSgpIGNvbnN0IHsKICAgICBTdHJlYW1QYXJhbWV0ZXJzIHJlc3VsdDsKLSAgICByZXN1bHQuc2FtcGxlc1BlckZyYW1lID0gZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgcmVzdWx0LmNoYW5uZWxNYXNrID0gZ2V0Q2hhbm5lbE1hc2soKTsKICAgICByZXN1bHQuc2FtcGxlUmF0ZSA9IGdldFNhbXBsZVJhdGUoKTsKICAgICByZXN1bHQuZGV2aWNlSWQgPSBnZXREZXZpY2VJZCgpOwogICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19zaGFyaW5nX21vZGVfdCkgPT0gc2l6ZW9mKHJlc3VsdC5zaGFyaW5nTW9kZSkpOwogICAgIHJlc3VsdC5zaGFyaW5nTW9kZSA9IGdldFNoYXJpbmdNb2RlKCk7Ci0gICAgc3RhdGljX2Fzc2VydChzaXplb2YoYXVkaW9fZm9ybWF0X3QpID09IHNpemVvZihyZXN1bHQuYXVkaW9Gb3JtYXQpKTsKLSAgICByZXN1bHQuYXVkaW9Gb3JtYXQgPSBzdGF0aWNfY2FzdDxBdWRpb0Zvcm1hdD4oZ2V0Rm9ybWF0KCkpOworICAgIGF1dG8gY29udkF1ZGlvRm9ybWF0ID0gYW5kcm9pZDo6bGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihnZXRGb3JtYXQoKSk7CisgICAgaWYgKGNvbnZBdWRpb0Zvcm1hdC5vaygpKSB7CisgICAgICAgIHJlc3VsdC5hdWRpb0Zvcm1hdCA9IGNvbnZBdWRpb0Zvcm1hdC52YWx1ZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hdWRpb0Zvcm1hdCA9IEF1ZGlvRm9ybWF0RGVzY3JpcHRpb257fTsKKyAgICAgICAgcmVzdWx0LmF1ZGlvRm9ybWF0LnR5cGUgPQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdFR5cGU6OlNZU19SRVNFUlZFRF9JTlZBTElEOworICAgIH0KICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihhYXVkaW9fZGlyZWN0aW9uX3QpID09IHNpemVvZihyZXN1bHQuZGlyZWN0aW9uKSk7CiAgICAgcmVzdWx0LmRpcmVjdGlvbiA9IGdldERpcmVjdGlvbigpOwogICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGF1ZGlvX3VzYWdlX3QpID09IHNpemVvZihyZXN1bHQudXNhZ2UpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcAppbmRleCA4ZDkwMDM0Li5hNGNjMmJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwCkBAIC0zMCw3ICszMCw3IEBACiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCiBBQXVkaW9TdHJlYW1SZXF1ZXN0OjpBQXVkaW9TdHJlYW1SZXF1ZXN0KGNvbnN0IFN0cmVhbVJlcXVlc3QmIHBhcmNlbGFibGUpIDoKLSAgICAgICAgbUNvbmZpZ3VyYXRpb24oc3RkOjptb3ZlKHBhcmNlbGFibGUucGFyYW1zKSksCisgICAgICAgIG1Db25maWd1cmF0aW9uKHBhcmNlbGFibGUucGFyYW1zKSwKICAgICAgICAgbUF0dHJpYnV0aW9uU291cmNlKHBhcmNlbGFibGUuYXR0cmlidXRpb25Tb3VyY2UpLAogICAgICAgICBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKHBhcmNlbGFibGUuc2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKSwKICAgICAgICAgbUluU2VydmljZShwYXJjZWxhYmxlLmluU2VydmljZSkgewpAQCAtMzgsNyArMzgsNyBAQAogCiBTdHJlYW1SZXF1ZXN0IEFBdWRpb1N0cmVhbVJlcXVlc3Q6OnBhcmNlbGFibGUoKSBjb25zdCB7CiAgICAgU3RyZWFtUmVxdWVzdCByZXN1bHQ7Ci0gICAgcmVzdWx0LnBhcmFtcyA9IHN0ZDo6bW92ZShtQ29uZmlndXJhdGlvbikucGFyY2VsYWJsZSgpOworICAgIHJlc3VsdC5wYXJhbXMgPSBtQ29uZmlndXJhdGlvbi5wYXJjZWxhYmxlKCk7CiAgICAgcmVzdWx0LmF0dHJpYnV0aW9uU291cmNlID0gbUF0dHJpYnV0aW9uU291cmNlOwogICAgIHJlc3VsdC5zaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQgPSBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkOwogICAgIHJlc3VsdC5pblNlcnZpY2UgPSBtSW5TZXJ2aWNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5jcHAKaW5kZXggYWE0YWMyNy4uYjEyNjJkZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuY3BwCkBAIC0yOSwxNyArMjksMTUgQEAKICNpbmNsdWRlICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKLXVzaW5nIGFuZHJvaWQ6Om1lZGlhOjpTaGFyZWRGaWxlUmVnaW9uOwotdXNpbmcgYW5kcm9pZDo6Tk9fRVJST1I7CiB1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAogQXVkaW9FbmRwb2ludFBhcmNlbGFibGU6OkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKEVuZHBvaW50JiYgcGFyY2VsYWJsZSkKLSAgICAgICAgOiBtVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLnVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSkpLAotICAgICAgICAgIG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZShzdGQ6Om1vdmUocGFyY2VsYWJsZS5kb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSkpLAotICAgICAgICAgIG1VcERhdGFRdWV1ZVBhcmNlbGFibGUoc3RkOjptb3ZlKHBhcmNlbGFibGUudXBEYXRhUXVldWVQYXJjZWxhYmxlKSksCi0gICAgICAgICAgbURvd25EYXRhUXVldWVQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLmRvd25EYXRhUXVldWVQYXJjZWxhYmxlKSksCisgICAgICAgIDogbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZShwYXJjZWxhYmxlLnVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSksCisgICAgICAgICAgbURvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlKHBhcmNlbGFibGUuZG93bk1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUpLAorICAgICAgICAgIG1VcERhdGFRdWV1ZVBhcmNlbGFibGUocGFyY2VsYWJsZS51cERhdGFRdWV1ZVBhcmNlbGFibGUpLAorICAgICAgICAgIG1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZShwYXJjZWxhYmxlLmRvd25EYXRhUXVldWVQYXJjZWxhYmxlKSwKICAgICAgICAgICBtTnVtU2hhcmVkTWVtb3JpZXMocGFyY2VsYWJsZS5zaGFyZWRNZW1vcmllcy5zaXplKCkpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmNlbGFibGUuc2hhcmVkTWVtb3JpZXMuc2l6ZSgpICYmIGkgPCBNQVhfU0hBUkVEX01FTU9SSUVTOyArK2kpIHsKICAgICAgICAgLy8gUmUtY29uc3RydWN0LgpAQCAtNTYsMTAgKzU0LDEwIEBACiAKIEVuZHBvaW50IEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlOjpwYXJjZWxhYmxlKCkmJiB7CiAgICAgRW5kcG9pbnQgcmVzdWx0OwotICAgIHJlc3VsdC51cE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUgPSBzdGQ6Om1vdmUobVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOwotICAgIHJlc3VsdC5kb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSA9IHN0ZDo6bW92ZShtRG93bk1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUpLnBhcmNlbGFibGUoKTsKLSAgICByZXN1bHQudXBEYXRhUXVldWVQYXJjZWxhYmxlID0gc3RkOjptb3ZlKG1VcERhdGFRdWV1ZVBhcmNlbGFibGUpLnBhcmNlbGFibGUoKTsKLSAgICByZXN1bHQuZG93bkRhdGFRdWV1ZVBhcmNlbGFibGUgPSBzdGQ6Om1vdmUobURvd25EYXRhUXVldWVQYXJjZWxhYmxlKS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LnVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSA9IG1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUucGFyY2VsYWJsZSgpOworICAgIHJlc3VsdC5kb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSA9IG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LnVwRGF0YVF1ZXVlUGFyY2VsYWJsZSA9IG1VcERhdGFRdWV1ZVBhcmNlbGFibGUucGFyY2VsYWJsZSgpOworICAgIHJlc3VsdC5kb3duRGF0YVF1ZXVlUGFyY2VsYWJsZSA9IG1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5wYXJjZWxhYmxlKCk7CiAgICAgcmVzdWx0LnNoYXJlZE1lbW9yaWVzLnJlc2VydmUoc3RkOjptaW4obU51bVNoYXJlZE1lbW9yaWVzLCBNQVhfU0hBUkVEX01FTU9SSUVTKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtU2hhcmVkTWVtb3JpZXMgJiYgaSA8IE1BWF9TSEFSRURfTUVNT1JJRVM7ICsraSkgewogICAgICAgICByZXN1bHQuc2hhcmVkTWVtb3JpZXMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShtU2hhcmVkTWVtb3JpZXNbaV0pLnBhcmNlbGFibGUoKSk7CkBAIC04MSw2ICs3OSwyMiBAQAogICAgIHJldHVybiBpbmRleDsKIH0KIAordm9pZCBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6Y2xvc2VEYXRhRmlsZURlc2NyaXB0b3IoKSB7CisgICAgY29uc3QgaW50MzJfdCBjdXJEYXRhTWVtb3J5SW5kZXggPSBtRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuZ2V0U2hhcmVkTWVtb3J5SW5kZXgoKTsKKyAgICBtU2hhcmVkTWVtb3JpZXNbY3VyRGF0YU1lbW9yeUluZGV4XS5jbG9zZUFuZFJlbGVhc2VGZCgpOworfQorCit2b2lkIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlOjp1cGRhdGVEYXRhRmlsZURlc2NyaXB0b3IoCisgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBlbmRwb2ludFBhcmNlbGFibGUpIHsKKyAgICBjb25zdCBpbnQzMl90IGN1ckRhdGFNZW1vcnlJbmRleCA9IG1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5nZXRTaGFyZWRNZW1vcnlJbmRleCgpOworICAgIGNvbnN0IGludDMyX3QgbmV3RGF0YU1lbW9yeUluZGV4ID0KKyAgICAgICAgICAgIGVuZHBvaW50UGFyY2VsYWJsZS0+bURvd25EYXRhUXVldWVQYXJjZWxhYmxlLmdldFNoYXJlZE1lbW9yeUluZGV4KCk7CisgICAgbVNoYXJlZE1lbW9yaWVzW2N1ckRhdGFNZW1vcnlJbmRleF0uY2xvc2UoKTsKKyAgICBtU2hhcmVkTWVtb3JpZXNbY3VyRGF0YU1lbW9yeUluZGV4XS5zZXR1cCgKKyAgICAgICAgICAgIGVuZHBvaW50UGFyY2VsYWJsZS0+bVNoYXJlZE1lbW9yaWVzW25ld0RhdGFNZW1vcnlJbmRleF0pOworICAgIG1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS51cGRhdGVNZW1vcnkoZW5kcG9pbnRQYXJjZWxhYmxlLT5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUpOworfQorCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9FbmRwb2ludFBhcmNlbGFibGU6OnJlc29sdmUoRW5kcG9pbnREZXNjcmlwdG9yICpkZXNjcmlwdG9yKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUucmVzb2x2ZShtU2hhcmVkTWVtb3JpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yLT51cE1lc3NhZ2VRdWV1ZURlc2NyaXB0b3IpOwpAQCAtOTQsNiArMTA4LDEwIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlOjpyZXNvbHZlRGF0YVF1ZXVlKFJpbmdCdWZmZXJEZXNjcmlwdG9yICpkZXNjcmlwdG9yKSB7CisgICAgcmV0dXJuIG1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5yZXNvbHZlKG1TaGFyZWRNZW1vcmllcywgZGVzY3JpcHRvcik7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6Y2xvc2UoKSB7CiAgICAgaW50IGVyciA9IDA7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtU2hhcmVkTWVtb3JpZXM7IGkrKykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaAppbmRleCA1MjM3YTFhLi41ZDJjMzhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaApAQCAtNDMsNyArNDMsNyBAQAogICAgIC8vIEN0b3IvYXNzaWdubWVudCBmcm9tIGEgcGFyY2VsYWJsZSByZXByZXNlbnRhdGlvbi4KICAgICAvLyBTaW5jZSB0aGUgcGFyY2VsYWJsZSBvYmplY3Qgb3ducyB1bmlxdWUgRkRzIChmb3Igc2hhcmVkIG1lbW9yeSBibG9ja3MpLCBtb3ZlIHNlbWFudGljcyBhcmUKICAgICAvLyBwcm92aWRlZCB0byBhdm9pZCB0aGUgbmVlZCB0byBkdXBlLgotICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKEVuZHBvaW50JiYgcGFyY2VsYWJsZSk7CisgICAgZXhwbGljaXQgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUoRW5kcG9pbnQmJiBwYXJjZWxhYmxlKTsKICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSYgb3BlcmF0b3I9KEVuZHBvaW50JiYgcGFyY2VsYWJsZSk7CiAKICAgICAvKioKQEAgLTUyLDcgKzUyLDIwIEBACiAgICAgICovCiAgICAgaW50MzJfdCBhZGRGaWxlRGVzY3JpcHRvcihjb25zdCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmIGZkLCBpbnQzMl90IHNpemVJbkJ5dGVzKTsKIAorICAgIC8qKgorICAgICAqIENsb3NlIGN1cnJlbnQgZGF0YSBmaWxlIGRlc2NyaXB0b3IuIFRoZSBkdXBsaWNhdGVkIGZpbGUgZGVzY3JpcHRvciB3aWxsIGJlIGNsb3NlLgorICAgICAqLworICAgIHZvaWQgY2xvc2VEYXRhRmlsZURlc2NyaXB0b3IoKTsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZSBjdXJyZW50IGRhdGEgZmlsZSBkZXNjcmlwdG9yIHdpdGggZ2l2ZW4gZW5kcG9pbnQgcGFyY2VsYWJsZS4KKyAgICAgKiBAcGFyYW0gZW5kcG9pbnRQYXJjZWxhYmxlIGFuIGVuZHBvaW50IHBhcmNlbGFibGUgdGhhdCBjb250YWlucyBuZXcgZGF0YSBmaWxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIGluZm9ybWF0aW9uCisgICAgICovCisgICAgdm9pZCB1cGRhdGVEYXRhRmlsZURlc2NyaXB0b3IoQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIGVuZHBvaW50UGFyY2VsYWJsZSk7CisKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzb2x2ZShFbmRwb2ludERlc2NyaXB0b3IgKmRlc2NyaXB0b3IpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXNvbHZlRGF0YVF1ZXVlKFJpbmdCdWZmZXJEZXNjcmlwdG9yICpkZXNjcmlwdG9yKTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcAppbmRleCBhNGIzY2VjLi4zYmM1MWQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAKQEAgLTMwLDkgKzMwLDEwIEBACiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCiBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6UmluZ0J1ZmZlclBhcmNlbGFibGUoY29uc3QgUmluZ0J1ZmZlciYgcGFyY2VsYWJsZSkKLSAgICAgICAgOiBtUmVhZENvdW50ZXJQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLnJlYWRDb3VudGVyUGFyY2VsYWJsZSkpLAotICAgICAgICAgIG1Xcml0ZUNvdW50ZXJQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLndyaXRlQ291bnRlclBhcmNlbGFibGUpKSwKLSAgICAgICAgICBtRGF0YVBhcmNlbGFibGUoc3RkOjptb3ZlKHBhcmNlbGFibGUuZGF0YVBhcmNlbGFibGUpKSwKKyAgICAgICAgOiBtUmVhZENvdW50ZXJQYXJjZWxhYmxlKHBhcmNlbGFibGUucmVhZENvdW50ZXJQYXJjZWxhYmxlKSwKKyAgICAgICAgICBtV3JpdGVDb3VudGVyUGFyY2VsYWJsZShwYXJjZWxhYmxlLndyaXRlQ291bnRlclBhcmNlbGFibGUpLAorICAgICAgICAgIG1EYXRhUGFyY2VsYWJsZShwYXJjZWxhYmxlLmRhdGFQYXJjZWxhYmxlKSwKKyAgICAgICAgICBtU2hhcmVkTWVtb3J5SW5kZXgocGFyY2VsYWJsZS5zaGFyZWRNZW1vcnlJbmRleCksCiAgICAgICAgICAgbUJ5dGVzUGVyRnJhbWUocGFyY2VsYWJsZS5ieXRlc1BlckZyYW1lKSwKICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3QocGFyY2VsYWJsZS5mcmFtZXNQZXJCdXJzdCksCiAgICAgICAgICAgbUNhcGFjaXR5SW5GcmFtZXMocGFyY2VsYWJsZS5jYXBhY2l0eUluRnJhbWVzKSwKQEAgLTQyLDkgKzQzLDEwIEBACiAKIFJpbmdCdWZmZXIgUmluZ0J1ZmZlclBhcmNlbGFibGU6OnBhcmNlbGFibGUoKSBjb25zdCB7CiAgICAgUmluZ0J1ZmZlciByZXN1bHQ7Ci0gICAgcmVzdWx0LnJlYWRDb3VudGVyUGFyY2VsYWJsZSA9IHN0ZDo6bW92ZShtUmVhZENvdW50ZXJQYXJjZWxhYmxlKS5wYXJjZWxhYmxlKCk7Ci0gICAgcmVzdWx0LndyaXRlQ291bnRlclBhcmNlbGFibGUgPSBzdGQ6Om1vdmUobVdyaXRlQ291bnRlclBhcmNlbGFibGUpLnBhcmNlbGFibGUoKTsKLSAgICByZXN1bHQuZGF0YVBhcmNlbGFibGUgPSBzdGQ6Om1vdmUobURhdGFQYXJjZWxhYmxlKS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LnJlYWRDb3VudGVyUGFyY2VsYWJsZSA9IG1SZWFkQ291bnRlclBhcmNlbGFibGUucGFyY2VsYWJsZSgpOworICAgIHJlc3VsdC53cml0ZUNvdW50ZXJQYXJjZWxhYmxlID0gbVdyaXRlQ291bnRlclBhcmNlbGFibGUucGFyY2VsYWJsZSgpOworICAgIHJlc3VsdC5kYXRhUGFyY2VsYWJsZSA9IG1EYXRhUGFyY2VsYWJsZS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LnNoYXJlZE1lbW9yeUluZGV4ID0gbVNoYXJlZE1lbW9yeUluZGV4OwogICAgIHJlc3VsdC5ieXRlc1BlckZyYW1lID0gbUJ5dGVzUGVyRnJhbWU7CiAgICAgcmVzdWx0LmZyYW1lc1BlckJ1cnN0ID0gbUZyYW1lc1BlckJ1cnN0OwogICAgIHJlc3VsdC5jYXBhY2l0eUluRnJhbWVzID0gbUNhcGFjaXR5SW5GcmFtZXM7CkBAIC02MCw2ICs2Miw3IEBACiAgICAgICAgICAgICAgICAgIGludDMyX3QgcmVhZENvdW50ZXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGludDMyX3Qgd3JpdGVDb3VudGVyT2Zmc2V0LAogICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50ZXJTaXplQnl0ZXMpIHsKKyAgICBtU2hhcmVkTWVtb3J5SW5kZXggPSBzaGFyZWRNZW1vcnlJbmRleDsKICAgICBtUmVhZENvdW50ZXJQYXJjZWxhYmxlLnNldHVwKHNoYXJlZE1lbW9yeUluZGV4LCByZWFkQ291bnRlck9mZnNldCwgY291bnRlclNpemVCeXRlcyk7CiAgICAgbVdyaXRlQ291bnRlclBhcmNlbGFibGUuc2V0dXAoc2hhcmVkTWVtb3J5SW5kZXgsIHdyaXRlQ291bnRlck9mZnNldCwgY291bnRlclNpemVCeXRlcyk7CiAgICAgbURhdGFQYXJjZWxhYmxlLnNldHVwKHNoYXJlZE1lbW9yeUluZGV4LCBkYXRhTWVtb3J5T2Zmc2V0LCBkYXRhU2l6ZUluQnl0ZXMpOwpAQCAtNjgsMTIgKzcxLDEzIEBACiB2b2lkIFJpbmdCdWZmZXJQYXJjZWxhYmxlOjpzZXR1cE1lbW9yeShpbnQzMl90IHNoYXJlZE1lbW9yeUluZGV4LAogICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFNZW1vcnlPZmZzZXQsCiAgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YVNpemVJbkJ5dGVzKSB7CisgICAgbVNoYXJlZE1lbW9yeUluZGV4ID0gc2hhcmVkTWVtb3J5SW5kZXg7CiAgICAgbVJlYWRDb3VudGVyUGFyY2VsYWJsZS5zZXR1cChzaGFyZWRNZW1vcnlJbmRleCwgMCwgMCk7CiAgICAgbVdyaXRlQ291bnRlclBhcmNlbGFibGUuc2V0dXAoc2hhcmVkTWVtb3J5SW5kZXgsIDAsIDApOwogICAgIG1EYXRhUGFyY2VsYWJsZS5zZXR1cChzaGFyZWRNZW1vcnlJbmRleCwgZGF0YU1lbW9yeU9mZnNldCwgZGF0YVNpemVJbkJ5dGVzKTsKIH0KIAotaW50MzJfdCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6Z2V0Qnl0ZXNQZXJGcmFtZSgpIHsKK2ludDMyX3QgUmluZ0J1ZmZlclBhcmNlbGFibGU6OmdldEJ5dGVzUGVyRnJhbWUoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1CeXRlc1BlckZyYW1lOwogfQogCkBAIC04MSw3ICs4NSw3IEBACiAgICAgbUJ5dGVzUGVyRnJhbWUgPSBieXRlc1BlckZyYW1lOwogfQogCi1pbnQzMl90IFJpbmdCdWZmZXJQYXJjZWxhYmxlOjpnZXRGcmFtZXNQZXJCdXJzdCgpIHsKK2ludDMyX3QgUmluZ0J1ZmZlclBhcmNlbGFibGU6OmdldEZyYW1lc1BlckJ1cnN0KCkgY29uc3QgewogICAgIHJldHVybiBtRnJhbWVzUGVyQnVyc3Q7CiB9CiAKQEAgLTg5LDcgKzkzLDcgQEAKICAgICBtRnJhbWVzUGVyQnVyc3QgPSBmcmFtZXNQZXJCdXJzdDsKIH0KIAotaW50MzJfdCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6Z2V0Q2FwYWNpdHlJbkZyYW1lcygpIHsKK2ludDMyX3QgUmluZ0J1ZmZlclBhcmNlbGFibGU6OmdldENhcGFjaXR5SW5GcmFtZXMoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1DYXBhY2l0eUluRnJhbWVzOwogfQogCkBAIC0xMjQsNiArMTI4LDE0IEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAordm9pZCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6dXBkYXRlTWVtb3J5KGNvbnN0IFJpbmdCdWZmZXJQYXJjZWxhYmxlJiBwYXJjZWxhYmxlKSB7CisgICAgc2V0dXBNZW1vcnkobVNoYXJlZE1lbW9yeUluZGV4LCAwLAorICAgICAgICAgICAgICAgIHBhcmNlbGFibGUuZ2V0Q2FwYWNpdHlJbkZyYW1lcygpICogcGFyY2VsYWJsZS5nZXRCeXRlc1BlckZyYW1lKCkpOworICAgIHNldEJ5dGVzUGVyRnJhbWUocGFyY2VsYWJsZS5nZXRCeXRlc1BlckZyYW1lKCkpOworICAgIHNldEZyYW1lc1BlckJ1cnN0KHBhcmNlbGFibGUuZ2V0RnJhbWVzUGVyQnVyc3QoKSk7CisgICAgc2V0Q2FwYWNpdHlJbkZyYW1lcyhwYXJjZWxhYmxlLmdldENhcGFjaXR5SW5GcmFtZXMoKSk7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6dmFsaWRhdGUoKSBjb25zdCB7CiAgICAgaWYgKG1DYXBhY2l0eUluRnJhbWVzIDwgMCB8fCBtQ2FwYWNpdHlJbkZyYW1lcyA+PSAzMiAqIDEwMjQpIHsKICAgICAgICAgQUxPR0UoImludmFsaWQgbUNhcGFjaXR5SW5GcmFtZXMgPSAlZCIsIG1DYXBhY2l0eUluRnJhbWVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmgKaW5kZXggMjUwOGNlYS4uMjlkMGQ4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmgKQEAgLTQ2LDE1ICs0NiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhTWVtb3J5T2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhU2l6ZUluQnl0ZXMpOwogCi0gICAgaW50MzJfdCBnZXRCeXRlc1BlckZyYW1lKCk7CisgICAgaW50MzJfdCBnZXRCeXRlc1BlckZyYW1lKCkgY29uc3Q7CiAKICAgICB2b2lkIHNldEJ5dGVzUGVyRnJhbWUoaW50MzJfdCBieXRlc1BlckZyYW1lKTsKIAotICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQnVyc3QoKTsKKyAgICBpbnQzMl90IGdldEZyYW1lc1BlckJ1cnN0KCkgY29uc3Q7CiAKICAgICB2b2lkIHNldEZyYW1lc1BlckJ1cnN0KGludDMyX3QgZnJhbWVzUGVyQnVyc3QpOwogCi0gICAgaW50MzJfdCBnZXRDYXBhY2l0eUluRnJhbWVzKCk7CisgICAgaW50MzJfdCBnZXRDYXBhY2l0eUluRnJhbWVzKCkgY29uc3Q7CiAKICAgICB2b2lkIHNldENhcGFjaXR5SW5GcmFtZXMoaW50MzJfdCBjYXBhY2l0eUluRnJhbWVzKTsKIApAQCAtNjIsNiArNjIsMTIgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXNvbHZlKFNoYXJlZE1lbW9yeVBhcmNlbGFibGUgKm1lbW9yeVBhcmNlbHMsIFJpbmdCdWZmZXJEZXNjcmlwdG9yICpkZXNjcmlwdG9yKTsKIAorICAgIHZvaWQgdXBkYXRlTWVtb3J5KGNvbnN0IFJpbmdCdWZmZXJQYXJjZWxhYmxlJiBwYXJjZWxhYmxlKTsKKworICAgIGludDMyX3QgZ2V0U2hhcmVkTWVtb3J5SW5kZXgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2hhcmVkTWVtb3J5SW5kZXg7CisgICAgfQorCiAgICAgdm9pZCBkdW1wKCk7CiAKICAgICAvLyBFeHRyYWN0IGEgcGFyY2VsYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KQEAgLTcxLDYgKzc3LDcgQEAKICAgICBTaGFyZWRSZWdpb25QYXJjZWxhYmxlICBtUmVhZENvdW50ZXJQYXJjZWxhYmxlOwogICAgIFNoYXJlZFJlZ2lvblBhcmNlbGFibGUgIG1Xcml0ZUNvdW50ZXJQYXJjZWxhYmxlOwogICAgIFNoYXJlZFJlZ2lvblBhcmNlbGFibGUgIG1EYXRhUGFyY2VsYWJsZTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtU2hhcmVkTWVtb3J5SW5kZXggPSAtMTsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtQnl0ZXNQZXJGcmFtZSA9IDA7ICAgICAvLyBpbmRleCBpcyBpbiBmcmFtZXMKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3QgPSAwOyAgICAvLyBmb3IgSVNPQ0hST05PVVMgcXVldWVzCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUNhcGFjaXR5SW5GcmFtZXMgPSAwOyAgLy8gemVybyBpZiB1bnVzZWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcAppbmRleCBlZWYyMzhmLi43NDFhZWZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSAiYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKLXVzaW5nIGFuZHJvaWQ6Ok5PX0VSUk9SOwogdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7CiB1c2luZyBhbmRyb2lkOjptZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbjsKIApAQCAtNjUsNiArNjQsMTAgQEAKICAgICBtU2l6ZUluQnl0ZXMgPSBzaXplSW5CeXRlczsKIH0KIAordm9pZCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpzZXR1cChjb25zdCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlICZzaGFyZWRNZW1vcnlQYXJjZWxhYmxlKSB7CisgICAgc2V0dXAoc2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5tRmQsIHNoYXJlZE1lbW9yeVBhcmNlbGFibGUubVNpemVJbkJ5dGVzKTsKK30KKwogYWF1ZGlvX3Jlc3VsdF90IFNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OmNsb3NlKCkgewogICAgIGlmIChtUmVzb2x2ZWRBZGRyZXNzICE9IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTKSB7CiAgICAgICAgIGludCBlcnIgPSBtdW5tYXAobVJlc29sdmVkQWRkcmVzcywgbVNpemVJbkJ5dGVzKTsKQEAgLTc3LDggKzgwLDE2IEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IFNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OmNsb3NlQW5kUmVsZWFzZUZkKCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBjbG9zZSgpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIG1GZC5yZXNldCgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCiBhYXVkaW9fcmVzdWx0X3QgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6cmVzb2x2ZVNoYXJlZE1lbW9yeShjb25zdCB1bmlxdWVfZmQmIGZkKSB7Ci0gICAgbVJlc29sdmVkQWRkcmVzcyA9ICh1aW50OF90ICopIG1tYXAoMCwgbVNpemVJbkJ5dGVzLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgIG1SZXNvbHZlZEFkZHJlc3MgPSAodWludDhfdCAqKSBtbWFwKG51bGxwdHIsIG1TaXplSW5CeXRlcywgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBmZC5nZXQoKSwgMCk7CiAgICAgaWYgKG1SZXNvbHZlZEFkZHJlc3MgPT0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1MpIHsKICAgICAgICAgQUxPR0UoIm1tYXAoKSBmYWlsZWQgZm9yIGZkID0gJWQsIG5CeXRlcyA9ICUiIFBSSWQ2NCAiLCBlcnJubyA9ICVzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCmluZGV4IDFmMmMzMzUuLjc3NjJmZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaApAQCAtNTIsMTIgKzUyLDE2IEBACiAgICAgICovCiAgICAgdm9pZCBzZXR1cChjb25zdCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmIGZkLCBpbnQzMl90IHNpemVJbkJ5dGVzKTsKIAorICAgIHZvaWQgc2V0dXAoY29uc3QgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSYgc2hhcmVkTWVtb3J5UGFyY2VsYWJsZSk7CisKICAgICAvLyBtbWFwKCkgc2hhcmVkIG1lbW9yeQogICAgIGFhdWRpb19yZXN1bHRfdCByZXNvbHZlKGludDMyX3Qgb2Zmc2V0SW5CeXRlcywgaW50MzJfdCBzaXplSW5CeXRlcywgdm9pZCAqKnJlZ2lvbkFkZHJlc3NQdHIpOwogCiAgICAgLy8gbXVubWFwKCkgYW55IG1hcHBlZCBtZW1vcnkKICAgICBhYXVkaW9fcmVzdWx0X3QgY2xvc2UoKTsKIAorICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZUFuZFJlbGVhc2VGZCgpOworCiAgICAgaW50MzJfdCBnZXRTaXplSW5CeXRlcygpOwogCiAgICAgdm9pZCBkdW1wKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAKaW5kZXggNTZiOTljMC4uNmZhMTA5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmNwcApAQCAtMjksMTAgKzI5LDcgQEAKICNpbmNsdWRlICJiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaCIKICNpbmNsdWRlICJiaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuaCIKIAotdXNpbmcgYW5kcm9pZDo6Tk9fRVJST1I7CiB1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbGFibGU7CiAKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9JQUF1ZGlvU2VydmljZS5haWRsIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL0lBQXVkaW9TZXJ2aWNlLmFpZGwKaW5kZXggNDRkMjIxMS4uNDg1YzJlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL0lBQXVkaW9TZXJ2aWNlLmFpZGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL0lBQXVkaW9TZXJ2aWNlLmFpZGwKQEAgLTc4LDQgKzc4LDYgQEAKIAogICAgIGludCB1bnJlZ2lzdGVyQXVkaW9UaHJlYWQoaW50IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRUaHJlYWRJZCk7CisKKyAgICBpbnQgZXhpdFN0YW5kYnkoaW50IHN0cmVhbUhhbmRsZSwgb3V0IEVuZHBvaW50IGVuZHBvaW50KTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9SaW5nQnVmZmVyLmFpZGwgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vUmluZ0J1ZmZlci5haWRsCmluZGV4IGE1OGIzM2EuLmRkNjQ0OTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9SaW5nQnVmZmVyLmFpZGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1JpbmdCdWZmZXIuYWlkbApAQCAtMjYsNCArMjYsNSBAQAogICAgIGludCAgICAgICAgICAgICAgICAgZnJhbWVzUGVyQnVyc3Q7ICAgIC8vIGZvciBJU09DSFJPTk9VUyBxdWV1ZXMKICAgICBpbnQgICAgICAgICAgICAgICAgIGNhcGFjaXR5SW5GcmFtZXM7ICAvLyB6ZXJvIGlmIHVudXNlZAogICAgIGludCAvKiBSaW5nYnVmZmVyRmxhZ3MgKi8gZmxhZ3M7ICAvLyA9IFJpbmdidWZmZXJGbGFnczo6Tk9ORTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHNoYXJlZE1lbW9yeUluZGV4OwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9TdHJlYW1QYXJhbWV0ZXJzLmFpZGwgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vU3RyZWFtUGFyYW1ldGVycy5haWRsCmluZGV4IGI3YzRmNzAuLjk4M2UxOTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9TdHJlYW1QYXJhbWV0ZXJzLmFpZGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1N0cmVhbVBhcmFtZXRlcnMuYWlkbApAQCAtMTYsMTcgKzE2LDE5IEBACiAKIHBhY2thZ2UgYWF1ZGlvOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXREZXNjcmlwdGlvbjsKIAogcGFyY2VsYWJsZSBTdHJlYW1QYXJhbWV0ZXJzIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWU7ICAvLyAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrOyAgLy8gICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZTsgIC8vICAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZDsgIC8vICAgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludCAvKiBhYXVkaW9fc2hhcmluZ19tb2RlX3QgKi8gICAgICAgICAgIHNoYXJpbmdNb2RlOyAgLy8gICAgICAgICAgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKLSAgICBBdWRpb0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdDsgIC8vICAgICAgICAgID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CisgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQ7ICAvLyAgICAgICAgICA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwogICAgIGludCAvKiBhYXVkaW9fZGlyZWN0aW9uX3QgKi8gICAgICAgICAgICAgIGRpcmVjdGlvbjsgIC8vICAgICAgICAgICAgPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKICAgICBpbnQgLyogYWF1ZGlvX3VzYWdlX3QgKi8gICAgICAgICAgICAgICAgICB1c2FnZTsgIC8vICAgICAgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludCAvKiBhYXVkaW9fY29udGVudF90eXBlX3QgKi8gICAgICAgICAgIGNvbnRlbnRUeXBlOyAgLy8gICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgaW50IC8qIGFhdWRpb19zcGF0aWFsaXphdGlvbl9iZWhhdmlvcl90ICovc3BhdGlhbGl6YXRpb25CZWhhdmlvcjsgLy89IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbnRlbnRTcGF0aWFsaXplZDsgIC8vID0gZmFsc2U7CiAgICAgaW50IC8qIGFhdWRpb19pbnB1dF9wcmVzZXRfdCAqLyAgICAgICAgICAgaW5wdXRQcmVzZXQ7ICAvLyAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJDYXBhY2l0eTsgIC8vICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludCAvKiBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90ICovIGFsbG93ZWRDYXB0dXJlUG9saWN5OyAgLy8gPSBBQVVESU9fVU5TUEVDSUZJRUQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcAppbmRleCA2MWI1MGYzLi4yZWQzZTNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAKQEAgLTIxLDcgKzIxLDEwIEBACiAjaW5jbHVkZSAiQUF1ZGlvRmxvd0dyYXBoLmgiCiAKICNpbmNsdWRlIDxmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvTWFueVRvTXVsdGlDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvTW9ub0JsZW5kLmg+CiAjaW5jbHVkZSA8Zmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL011bHRpVG9NYW55Q29udmVydGVyLmg+CiAjaW5jbHVkZSA8Zmxvd2dyYXBoL1JhbXBMaW5lYXIuaD4KICNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0Zsb2F0Lmg+CiAjaW5jbHVkZSA8Zmxvd2dyYXBoL1NpbmtJMTYuaD4KQEAgLTMyLDE3ICszNSwyMiBAQAogI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VJMjQuaD4KICNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlSTMyLmg+CiAKLXVzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7Cit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvRmxvd0dyYXBoOjpjb25maWd1cmUoYXVkaW9fZm9ybWF0X3Qgc291cmNlRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNvdXJjZUNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3Qgc2lua0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaW5rQ2hhbm5lbENvdW50KSB7Ci0gICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgKmxhc3RPdXRwdXQgPSBudWxscHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpbmtDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlTW9ub0JsZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhdWRpb0JhbGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFeGNsdXNpdmUpIHsKKyAgICBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQgKmxhc3RPdXRwdXQgPSBudWxscHRyOwogCiAgICAgLy8gVE9ETyBjaGFuZ2UgYmFjayB0byBBTE9HRAotICAgIEFMT0dJKCIlcygpIHNvdXJjZSBmb3JtYXQgPSAweCUwOHgsIGNoYW5uZWxzID0gJWQsIHNpbmsgZm9ybWF0ID0gMHglMDh4LCBjaGFubmVscyA9ICVkIiwKLSAgICAgICAgICBfX2Z1bmNfXywgc291cmNlRm9ybWF0LCBzb3VyY2VDaGFubmVsQ291bnQsIHNpbmtGb3JtYXQsIHNpbmtDaGFubmVsQ291bnQpOworICAgIEFMT0dJKCIlcygpIHNvdXJjZSBmb3JtYXQgPSAweCUwOHgsIGNoYW5uZWxzID0gJWQsIHNpbmsgZm9ybWF0ID0gMHglMDh4LCBjaGFubmVscyA9ICVkLCAiCisgICAgICAgICAgInVzZU1vbm9CbGVuZCA9ICVkLCBhdWRpb0JhbGFuY2UgPSAlZiwgaXNFeGNsdXNpdmUgJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBzb3VyY2VGb3JtYXQsIHNvdXJjZUNoYW5uZWxDb3VudCwgc2lua0Zvcm1hdCwgc2lua0NoYW5uZWxDb3VudCwKKyAgICAgICAgICB1c2VNb25vQmxlbmQsIGF1ZGlvQmFsYW5jZSwgaXNFeGNsdXNpdmUpOwogCiAgICAgc3dpdGNoIChzb3VyY2VGb3JtYXQpIHsKICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgpAQCAtNjMsMTAgKzcxLDExIEBACiAgICAgfQogICAgIGxhc3RPdXRwdXQgPSAmbVNvdXJjZS0+b3V0cHV0OwogCi0gICAgLy8gQXBwbHkgdm9sdW1lIGFzIGEgcmFtcCB0byBhdm9pZCBwb3BzLgotICAgIG1Wb2x1bWVSYW1wID0gc3RkOjptYWtlX3VuaXF1ZTxSYW1wTGluZWFyPihzb3VyY2VDaGFubmVsQ291bnQpOwotICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1Wb2x1bWVSYW1wLT5pbnB1dCk7Ci0gICAgbGFzdE91dHB1dCA9ICZtVm9sdW1lUmFtcC0+b3V0cHV0OworICAgIGlmICh1c2VNb25vQmxlbmQpIHsKKyAgICAgICAgbU1vbm9CbGVuZCA9IHN0ZDo6bWFrZV91bmlxdWU8TW9ub0JsZW5kPihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICBsYXN0T3V0cHV0LT5jb25uZWN0KCZtTW9ub0JsZW5kLT5pbnB1dCk7CisgICAgICAgIGxhc3RPdXRwdXQgPSAmbU1vbm9CbGVuZC0+b3V0cHV0OworICAgIH0KIAogICAgIC8vIEZvciBhIHB1cmUgZmxvYXQgZ3JhcGgsIHRoZXJlIGlzIGNoYW5jZSB0aGF0IHRoZSBkYXRhIHJhbmdlIG1heSBiZSB2ZXJ5IGxhcmdlLgogICAgIC8vIFNvIHdlIHNob3VsZCBjbGlwIHRvIGEgcmVhc29uYWJsZSB2YWx1ZSB0aGF0IGFsbG93cyBhIGxpdHRsZSBoZWFkcm9vbS4KQEAgLTg2LDYgKzk1LDI2IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKICAgICB9CiAKKyAgICAvLyBBcHBseSB2b2x1bWUgcmFtcHMgZm9yIG9ubHkgZXhjbHVzaXZlIHN0cmVhbXMuCisgICAgaWYgKGlzRXhjbHVzaXZlKSB7CisgICAgICAgIC8vIEFwcGx5IHZvbHVtZSByYW1wcyB0byBzZXQgdGhlIGxlZnQvcmlnaHQgYXVkaW8gYmFsYW5jZSBhbmQgdGFyZ2V0IHZvbHVtZXMuCisgICAgICAgIC8vIFRoZSBzaWduYWxzIHdpbGwgYmUgZGVjb3VwbGVkLCB2b2x1bWUgcmFtcHMgd2lsbCBiZSBhcHBsaWVkLCBiZWZvcmUgdGhlIHNpZ25hbHMgYXJlCisgICAgICAgIC8vIGNvbWJpbmVkIGFnYWluLgorICAgICAgICBtTXVsdGlUb01hbnlDb252ZXJ0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPE11bHRpVG9NYW55Q29udmVydGVyPihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgbU1hbnlUb011bHRpQ29udmVydGVyID0gc3RkOjptYWtlX3VuaXF1ZTxNYW55VG9NdWx0aUNvbnZlcnRlcj4oc2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1NdWx0aVRvTWFueUNvbnZlcnRlci0+aW5wdXQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpbmtDaGFubmVsQ291bnQ7IGkrKykgeworICAgICAgICAgICAgbVZvbHVtZVJhbXBzLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPFJhbXBMaW5lYXI+KDEpKTsKKyAgICAgICAgICAgIG1QYW5uaW5nVm9sdW1lcy5lbXBsYWNlX2JhY2soMS4wZik7CisgICAgICAgICAgICBsYXN0T3V0cHV0ID0gbU11bHRpVG9NYW55Q29udmVydGVyLT5vdXRwdXRzW2ldLmdldCgpOworICAgICAgICAgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmKG1Wb2x1bWVSYW1wc1tpXS5nZXQoKS0+aW5wdXQpKTsKKyAgICAgICAgICAgIGxhc3RPdXRwdXQgPSAmKG1Wb2x1bWVSYW1wc1tpXS5nZXQoKS0+b3V0cHV0KTsKKyAgICAgICAgICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QobU1hbnlUb011bHRpQ29udmVydGVyLT5pbnB1dHNbaV0uZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIGxhc3RPdXRwdXQgPSAmbU1hbnlUb011bHRpQ29udmVydGVyLT5vdXRwdXQ7CisgICAgICAgIHNldEF1ZGlvQmFsYW5jZShhdWRpb0JhbGFuY2UpOworICAgIH0KKwogICAgIHN3aXRjaCAoc2lua0Zvcm1hdCkgewogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CiAgICAgICAgICAgICBtU2luayA9IHN0ZDo6bWFrZV91bmlxdWU8U2lua0Zsb2F0PihzaW5rQ2hhbm5lbENvdW50KTsKQEAgLTExNyw5ICsxNDYsMzIgQEAKICAqIEBwYXJhbSB2b2x1bWUgYmV0d2VlbiAwLjAgYW5kIDEuMAogICovCiB2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6c2V0VGFyZ2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIG1Wb2x1bWVSYW1wLT5zZXRUYXJnZXQodm9sdW1lKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVSYW1wcy5zaXplKCk7IGkrKykgeworICAgICAgICBtVm9sdW1lUmFtcHNbaV0tPnNldFRhcmdldCh2b2x1bWUgKiBtUGFubmluZ1ZvbHVtZXNbaV0pOworICAgIH0KKyAgICBtVGFyZ2V0Vm9sdW1lID0gdm9sdW1lOwogfQogCisvKioKKyAqIEBwYXJhbSBhdWRpb0JhbGFuY2UgYmV0d2VlbiAtMS4wIGFuZCAxLjAKKyAqLwordm9pZCBBQXVkaW9GbG93R3JhcGg6OnNldEF1ZGlvQmFsYW5jZShmbG9hdCBhdWRpb0JhbGFuY2UpIHsKKyAgICBpZiAobVBhbm5pbmdWb2x1bWVzLnNpemUoKSA+PSAyKSB7CisgICAgICAgIGZsb2F0IGxlZnRNdWx0aXBsaWVyID0gMDsKKyAgICAgICAgZmxvYXQgcmlnaHRNdWx0aXBsaWVyID0gMDsKKyAgICAgICAgbUJhbGFuY2UuY29tcHV0ZVN0ZXJlb0JhbGFuY2UoYXVkaW9CYWxhbmNlLCAmbGVmdE11bHRpcGxpZXIsICZyaWdodE11bHRpcGxpZXIpOworICAgICAgICBtUGFubmluZ1ZvbHVtZXNbMF0gPSBsZWZ0TXVsdGlwbGllcjsKKyAgICAgICAgbVBhbm5pbmdWb2x1bWVzWzFdID0gcmlnaHRNdWx0aXBsaWVyOworICAgICAgICBtVm9sdW1lUmFtcHNbMF0tPnNldFRhcmdldChtVGFyZ2V0Vm9sdW1lICogbGVmdE11bHRpcGxpZXIpOworICAgICAgICBtVm9sdW1lUmFtcHNbMV0tPnNldFRhcmdldChtVGFyZ2V0Vm9sdW1lICogcmlnaHRNdWx0aXBsaWVyKTsKKyAgICB9Cit9CisKKy8qKgorICogQHBhcmFtIG51bUZyYW1lcyB0byBzbG93bHkgYWRqdXN0IGZvciB2b2x1bWUgY2hhbmdlcworICovCiB2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6c2V0UmFtcExlbmd0aEluRnJhbWVzKGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgbVZvbHVtZVJhbXAtPnNldExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7CisgICAgZm9yIChhdXRvJiByYW1wIDogbVZvbHVtZVJhbXBzKSB7CisgICAgICAgIHJhbXAtPnNldExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaAppbmRleCBhNDlmNjRlLi42MDJjMTdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaApAQCAtMjMsOCArMjMsMTIgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CYWxhbmNlLmg+CiAjaW5jbHVkZSA8Zmxvd2dyYXBoL0NsaXBUb1JhbmdlLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL01hbnlUb011bHRpQ29udmVydGVyLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL01vbm9CbGVuZC5oPgogI2luY2x1ZGUgPGZsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9NdWx0aVRvTWFueUNvbnZlcnRlci5oPgogI2luY2x1ZGUgPGZsb3dncmFwaC9SYW1wTGluZWFyLmg+CiAKIGNsYXNzIEFBdWRpb0Zsb3dHcmFwaCB7CkBAIC0zNiwxMiArNDAsMTkgQEAKICAgICAgKiBAcGFyYW0gc291cmNlQ2hhbm5lbENvdW50CiAgICAgICogQHBhcmFtIHNpbmtGb3JtYXQKICAgICAgKiBAcGFyYW0gc2lua0NoYW5uZWxDb3VudAorICAgICAqIEBwYXJhbSB1c2VNb25vQmxlbmQKKyAgICAgKiBAcGFyYW0gYXVkaW9CYWxhbmNlCisgICAgICogQHBhcmFtIGNoYW5uZWxNYXNrCisgICAgICogQHBhcmFtIGlzRXhjbHVzaXZlCiAgICAgICogQHJldHVybgogICAgICAqLwogICAgIGFhdWRpb19yZXN1bHRfdCBjb25maWd1cmUoYXVkaW9fZm9ybWF0X3Qgc291cmNlRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzb3VyY2VDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBzaW5rRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2lua0NoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlTW9ub0JsZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYXVkaW9CYWxhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4Y2x1c2l2ZSk7CiAKICAgICB2b2lkIHByb2Nlc3MoY29uc3Qgdm9pZCAqc291cmNlLCB2b2lkICpkZXN0aW5hdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOwogCkBAIC01MCwxNCArNjEsMzAgQEAKICAgICAgKi8KICAgICB2b2lkIHNldFRhcmdldFZvbHVtZShmbG9hdCB2b2x1bWUpOwogCisgICAgLyoqCisgICAgICogQHBhcmFtIGF1ZGlvQmFsYW5jZSBiZXR3ZWVuIC0xLjAgYW5kIDEuMAorICAgICAqLworICAgIHZvaWQgc2V0QXVkaW9CYWxhbmNlKGZsb2F0IGF1ZGlvQmFsYW5jZSk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbnVtRnJhbWVzIHRvIHNsb3dseSBhZGp1c3QgZm9yIHZvbHVtZSBjaGFuZ2VzCisgICAgICovCiAgICAgdm9pZCBzZXRSYW1wTGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBudW1GcmFtZXMpOwogCiBwcml2YXRlOgotICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkF1ZGlvU291cmNlPiAgICAgICAgICBtU291cmNlOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OlJhbXBMaW5lYXI+ICAgICAgICAgICBtVm9sdW1lUmFtcDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpDbGlwVG9SYW5nZT4gICAgICAgICAgbUNsaXBwZXI7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6TW9ub1RvTXVsdGlDb252ZXJ0ZXI+IG1DaGFubmVsQ29udmVydGVyOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkF1ZGlvU2luaz4gICAgICAgICAgICBtU2luazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOjpGbG93R3JhcGhTb3VyY2VCdWZmZXJlZD4gbVNvdXJjZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOjpNb25vQmxlbmQ+IG1Nb25vQmxlbmQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDo6Q2xpcFRvUmFuZ2U+IG1DbGlwcGVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg6Ok1vbm9Ub011bHRpQ29udmVydGVyPiBtQ2hhbm5lbENvbnZlcnRlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOjpNYW55VG9NdWx0aUNvbnZlcnRlcj4KKyAgICAgICAgICAgIG1NYW55VG9NdWx0aUNvbnZlcnRlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOjpNdWx0aVRvTWFueUNvbnZlcnRlcj4KKyAgICAgICAgICAgIG1NdWx0aVRvTWFueUNvbnZlcnRlcjsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOjpSYW1wTGluZWFyPj4gbVZvbHVtZVJhbXBzOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtUGFubmluZ1ZvbHVtZXM7CisgICAgZmxvYXQgbVRhcmdldFZvbHVtZSA9IDEuMGY7CisgICAgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJhbGFuY2UgbUJhbGFuY2U7CisgICAgc3RkOjp1bmlxdWVfcHRyPEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDo6Rmxvd0dyYXBoU2luaz4gbVNpbms7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAKaW5kZXggZWJjOWYyYi4uZTc4MGY0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAKQEAgLTMxLDEzICszMSw2IEBACiAjZGVmaW5lIFJJRElDVUxPVVNMWV9MQVJHRV9CVUZGRVJfQ0FQQUNJVFkgICAoMjU2ICogMTAyNCkKICNkZWZpbmUgUklESUNVTE9VU0xZX0xBUkdFX0ZSQU1FX1NJWkUgICAgICAgIDQwOTYKIAotQXVkaW9FbmRwb2ludDo6QXVkaW9FbmRwb2ludCgpCi0gICAgOiBtRnJlZVJ1bm5pbmcoZmFsc2UpCi0gICAgLCBtRGF0YVJlYWRDb3VudGVyKDApCi0gICAgLCBtRGF0YVdyaXRlQ291bnRlcigwKQotewotfQotCiAvLyBUT0RPIENvbnNpZGVyIG1vdmluZyB0byBhIG1ldGhvZCBpbiBSaW5nQnVmZmVyRGVzY3JpcHRvcgogc3RhdGljIGFhdWRpb19yZXN1bHRfdCBBdWRpb0VuZHBvaW50X3ZhbGlkYXRlUXVldWVEZXNjcmlwdG9yKGNvbnN0IGNoYXIgKnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJpbmdCdWZmZXJEZXNjcmlwdG9yICpkZXNjcmlwdG9yKSB7CkBAIC0xNDYsMzggKzEzOSw0OSBAQAogICAgICk7CiAKICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IGRhdGEgcXVldWUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBkZXNjcmlwdG9yID0gJnBFbmRwb2ludERlc2NyaXB0b3ItPmRhdGFRdWV1ZURlc2NyaXB0b3I7Ci0gICAgQUxPR1YoImNvbmZpZ3VyZSgpIGRhdGEgZnJhbWVzUGVyQnVyc3QgPSAlZCIsIGRlc2NyaXB0b3ItPmZyYW1lc1BlckJ1cnN0KTsKKyAgICByZXN1bHQgPSBjb25maWd1cmVEYXRhUXVldWUocEVuZHBvaW50RGVzY3JpcHRvci0+ZGF0YVF1ZXVlRGVzY3JpcHRvciwgZGlyZWN0aW9uKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBdWRpb0VuZHBvaW50Ojpjb25maWd1cmVEYXRhUXVldWUoY29uc3QgUmluZ0J1ZmZlckRlc2NyaXB0b3ImIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQXVkaW9FbmRwb2ludF92YWxpZGF0ZVF1ZXVlRGVzY3JpcHRvcigiZGF0YSIsICZkZXNjcmlwdG9yKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEFMT0dWKCJjb25maWd1cmUoKSBkYXRhIGZyYW1lc1BlckJ1cnN0ID0gJWQiLCBkZXNjcmlwdG9yLmZyYW1lc1BlckJ1cnN0KTsKICAgICBBTE9HVigiY29uZmlndXJlKCkgZGF0YSByZWFkQ291bnRlckFkZHJlc3MgPSAlcCIsCi0gICAgICAgICAgZGVzY3JpcHRvci0+cmVhZENvdW50ZXJBZGRyZXNzKTsKKyAgICAgICAgICBkZXNjcmlwdG9yLnJlYWRDb3VudGVyQWRkcmVzcyk7CiAKICAgICAvLyBBbiBleGFtcGxlIG9mIGZyZWUgcnVubmluZyBpcyB3aGVuIHRoZSBvdGhlciBzaWRlIGlzIHJlYWQgb3Igd3JpdHRlbiBieSBoYXJkd2FyZSBETUEKICAgICAvLyBvciBhIERTUC4gSXQgZG9lcyBub3QgdXBkYXRlIGl0cyBjb3VudGVyIHNvIHdlIGhhdmUgdG8gdXBkYXRlIGl0LgogICAgIGludDY0X3QgKnJlbW90ZUNvdW50ZXIgPSAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlc2NyaXB0b3ItPnJlYWRDb3VudGVyQWRkcmVzcyAvLyByZWFkIGJ5IG90aGVyIHNpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXNjcmlwdG9yLT53cml0ZUNvdW50ZXJBZGRyZXNzOyAvLyB3cml0dGVuIGJ5IG90aGVyIHNpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkZXNjcmlwdG9yLnJlYWRDb3VudGVyQWRkcmVzcyAvLyByZWFkIGJ5IG90aGVyIHNpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXNjcmlwdG9yLndyaXRlQ291bnRlckFkZHJlc3M7IC8vIHdyaXR0ZW4gYnkgb3RoZXIgc2lkZQogICAgIG1GcmVlUnVubmluZyA9IChyZW1vdGVDb3VudGVyID09IG51bGxwdHIpOwogICAgIEFMT0dWKCJjb25maWd1cmUoKSBtRnJlZVJ1bm5pbmcgPSAlZCIsIG1GcmVlUnVubmluZyA/IDEgOiAwKTsKIAotICAgIGludDY0X3QgKnJlYWRDb3VudGVyQWRkcmVzcyA9IChkZXNjcmlwdG9yLT5yZWFkQ291bnRlckFkZHJlc3MgPT0gbnVsbHB0cikKKyAgICBpbnQ2NF90ICpyZWFkQ291bnRlckFkZHJlc3MgPSAoZGVzY3JpcHRvci5yZWFkQ291bnRlckFkZHJlc3MgPT0gbnVsbHB0cikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZtRGF0YVJlYWRDb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXNjcmlwdG9yLT5yZWFkQ291bnRlckFkZHJlc3M7Ci0gICAgaW50NjRfdCAqd3JpdGVDb3VudGVyQWRkcmVzcyA9IChkZXNjcmlwdG9yLT53cml0ZUNvdW50ZXJBZGRyZXNzID09IG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXNjcmlwdG9yLnJlYWRDb3VudGVyQWRkcmVzczsKKyAgICBpbnQ2NF90ICp3cml0ZUNvdW50ZXJBZGRyZXNzID0gKGRlc2NyaXB0b3Iud3JpdGVDb3VudGVyQWRkcmVzcyA9PSBudWxscHRyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJm1EYXRhV3JpdGVDb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXNjcmlwdG9yLT53cml0ZUNvdW50ZXJBZGRyZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVzY3JpcHRvci53cml0ZUNvdW50ZXJBZGRyZXNzOwogCiAgICAgLy8gQ2xlYXIgYnVmZmVyIHRvIGF2b2lkIGFuIGluaXRpYWwgZ2xpdGNoIG9uIHNvbWUgZGV2aWNlcy4KLSAgICBzaXplX3QgYnVmZmVyU2l6ZUJ5dGVzID0gZGVzY3JpcHRvci0+Y2FwYWNpdHlJbkZyYW1lcyAqIGRlc2NyaXB0b3ItPmJ5dGVzUGVyRnJhbWU7Ci0gICAgbWVtc2V0KGRlc2NyaXB0b3ItPmRhdGFBZGRyZXNzLCAwLCBidWZmZXJTaXplQnl0ZXMpOworICAgIHNpemVfdCBidWZmZXJTaXplQnl0ZXMgPSBkZXNjcmlwdG9yLmNhcGFjaXR5SW5GcmFtZXMgKiBkZXNjcmlwdG9yLmJ5dGVzUGVyRnJhbWU7CisgICAgbWVtc2V0KGRlc2NyaXB0b3IuZGF0YUFkZHJlc3MsIDAsIGJ1ZmZlclNpemVCeXRlcyk7CiAKICAgICBtRGF0YVF1ZXVlID0gc3RkOjptYWtlX3VuaXF1ZTxGaWZvQnVmZmVySW5kaXJlY3Q+KAotICAgICAgICAgICAgZGVzY3JpcHRvci0+Ynl0ZXNQZXJGcmFtZSwKLSAgICAgICAgICAgIGRlc2NyaXB0b3ItPmNhcGFjaXR5SW5GcmFtZXMsCisgICAgICAgICAgICBkZXNjcmlwdG9yLmJ5dGVzUGVyRnJhbWUsCisgICAgICAgICAgICBkZXNjcmlwdG9yLmNhcGFjaXR5SW5GcmFtZXMsCiAgICAgICAgICAgICByZWFkQ291bnRlckFkZHJlc3MsCiAgICAgICAgICAgICB3cml0ZUNvdW50ZXJBZGRyZXNzLAotICAgICAgICAgICAgZGVzY3JpcHRvci0+ZGF0YUFkZHJlc3MKKyAgICAgICAgICAgIGRlc2NyaXB0b3IuZGF0YUFkZHJlc3MKICAgICApOwotICAgIHVpbnQzMl90IHRocmVzaG9sZCA9IGRlc2NyaXB0b3ItPmNhcGFjaXR5SW5GcmFtZXMgLyAyOworICAgIHVpbnQzMl90IHRocmVzaG9sZCA9IGRlc2NyaXB0b3IuY2FwYWNpdHlJbkZyYW1lcyAvIDI7CiAgICAgbURhdGFRdWV1ZS0+c2V0VGhyZXNob2xkKHRocmVzaG9sZCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTE4OCw0NyArMTkyLDY2IEBACiB9CiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKSB7Ci0gICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEVtcHR5Um9vbUF2YWlsYWJsZSh3cmFwcGluZ0J1ZmZlcik7CisgICAgcmV0dXJuIG1EYXRhUXVldWUgPT0gbnVsbHB0ciA/IDAgOiBtRGF0YVF1ZXVlLT5nZXRFbXB0eVJvb21BdmFpbGFibGUod3JhcHBpbmdCdWZmZXIpOwogfQogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkgewotICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgIHJldHVybiBtRGF0YVF1ZXVlID09IG51bGxwdHIgPyAwIDogbURhdGFRdWV1ZS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKIH0KIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRGdWxsRnJhbWVzQXZhaWxhYmxlKFdyYXBwaW5nQnVmZmVyICp3cmFwcGluZ0J1ZmZlcikgewotICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRGdWxsRGF0YUF2YWlsYWJsZSh3cmFwcGluZ0J1ZmZlcik7CisgICAgcmV0dXJuIG1EYXRhUXVldWUgPT0gbnVsbHB0ciA/IDAgOiBtRGF0YVF1ZXVlLT5nZXRGdWxsRGF0YUF2YWlsYWJsZSh3cmFwcGluZ0J1ZmZlcik7CiB9CiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpIHsKLSAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgIHJldHVybiBtRGF0YVF1ZXVlID09IG51bGxwdHIgPyAwIDogbURhdGFRdWV1ZS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworfQorCithbmRyb2lkOjpmaWZvX2ZyYW1lc190IEF1ZGlvRW5kcG9pbnQ6OnJlYWQodm9pZCAqYnVmZmVyLCBhbmRyb2lkOjpmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgeworICAgIHJldHVybiBtRGF0YVF1ZXVlID09IG51bGxwdHIgPyAwIDogbURhdGFRdWV1ZS0+cmVhZChidWZmZXIsIG51bUZyYW1lcyk7Cit9CisKK2FuZHJvaWQ6OmZpZm9fZnJhbWVzX3QgQXVkaW9FbmRwb2ludDo6d3JpdGUodm9pZCAqYnVmZmVyLCBhbmRyb2lkOjpmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgeworICAgIHJldHVybiBtRGF0YVF1ZXVlID09IG51bGxwdHIgPyAwIDogbURhdGFRdWV1ZS0+d3JpdGUoYnVmZmVyLCBudW1GcmFtZXMpOwogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OmFkdmFuY2VXcml0ZUluZGV4KGludDMyX3QgZGVsdGFGcmFtZXMpIHsKLSAgICBtRGF0YVF1ZXVlLT5hZHZhbmNlV3JpdGVJbmRleChkZWx0YUZyYW1lcyk7CisgICAgaWYgKG1EYXRhUXVldWUgIT0gbnVsbHB0cikgeworICAgICAgICBtRGF0YVF1ZXVlLT5hZHZhbmNlV3JpdGVJbmRleChkZWx0YUZyYW1lcyk7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OmFkdmFuY2VSZWFkSW5kZXgoaW50MzJfdCBkZWx0YUZyYW1lcykgewotICAgIG1EYXRhUXVldWUtPmFkdmFuY2VSZWFkSW5kZXgoZGVsdGFGcmFtZXMpOworICAgIGlmIChtRGF0YVF1ZXVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbURhdGFRdWV1ZS0+YWR2YW5jZVJlYWRJbmRleChkZWx0YUZyYW1lcyk7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OnNldERhdGFSZWFkQ291bnRlcihmaWZvX2NvdW50ZXJfdCBmcmFtZXNSZWFkKSB7Ci0gICAgbURhdGFRdWV1ZS0+c2V0UmVhZENvdW50ZXIoZnJhbWVzUmVhZCk7CisgICAgaWYgKG1EYXRhUXVldWUgIT0gbnVsbHB0cikgeworICAgICAgICBtRGF0YVF1ZXVlLT5zZXRSZWFkQ291bnRlcihmcmFtZXNSZWFkKTsKKyAgICB9CiB9CiAKIGZpZm9fY291bnRlcl90IEF1ZGlvRW5kcG9pbnQ6OmdldERhdGFSZWFkQ291bnRlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0UmVhZENvdW50ZXIoKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZSA9PSBudWxscHRyID8gMCA6IG1EYXRhUXVldWUtPmdldFJlYWRDb3VudGVyKCk7CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6c2V0RGF0YVdyaXRlQ291bnRlcihmaWZvX2NvdW50ZXJfdCBmcmFtZXNSZWFkKSB7Ci0gICAgbURhdGFRdWV1ZS0+c2V0V3JpdGVDb3VudGVyKGZyYW1lc1JlYWQpOworICAgIGlmIChtRGF0YVF1ZXVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbURhdGFRdWV1ZS0+c2V0V3JpdGVDb3VudGVyKGZyYW1lc1JlYWQpOworICAgIH0KIH0KIAogZmlmb19jb3VudGVyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RGF0YVdyaXRlQ291bnRlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0V3JpdGVDb3VudGVyKCk7CisgICAgcmV0dXJuIG1EYXRhUXVldWUgPT0gbnVsbHB0ciA/IDAgOiBtRGF0YVF1ZXVlLT5nZXRXcml0ZUNvdW50ZXIoKTsKIH0KIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpzZXRCdWZmZXJTaXplSW5GcmFtZXMoaW50MzJfdCByZXF1ZXN0ZWRGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmFjdHVhbEZyYW1lcykgeworICAgIGlmIChtRGF0YVF1ZXVlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KICAgICBpZiAocmVxdWVzdGVkRnJhbWVzIDwgRU5EUE9JTlRfREFUQV9RVUVVRV9TSVpFX01JTikgewogICAgICAgICByZXF1ZXN0ZWRGcmFtZXMgPSBFTkRQT0lOVF9EQVRBX1FVRVVFX1NJWkVfTUlOOwogICAgIH0KQEAgLTIzOCwxMSArMjYxLDExIEBACiB9CiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkgY29uc3QgewotICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRUaHJlc2hvbGQoKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZSA9PSBudWxscHRyID8gMCA6IG1EYXRhUXVldWUtPmdldFRocmVzaG9sZCgpOwogfQogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OmdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChpbnQzMl90KW1EYXRhUXVldWUtPmdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZSA9PSBudWxscHRyID8gMCA6IChpbnQzMl90KW1EYXRhUXVldWUtPmdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKTsKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50OjpkdW1wKCkgY29uc3QgewpAQCAtMjUxLDUgKzI3NCw3IEBACiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6ZXJhc2VEYXRhTWVtb3J5KCkgewotICAgIG1EYXRhUXVldWUtPmVyYXNlTWVtb3J5KCk7CisgICAgaWYgKG1EYXRhUXVldWUgIT0gbnVsbHB0cikgeworICAgICAgICBtRGF0YVF1ZXVlLT5lcmFzZU1lbW9yeSgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuaAppbmRleCA0YzhkNjBmLi4wMWRkMDVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfQUFVRElPX0FVRElPX0VORFBPSU5UX0gKICNkZWZpbmUgQU5EUk9JRF9BQVVESU9fQVVESU9fRU5EUE9JTlRfSAogCisjaW5jbHVkZSA8bXV0ZXg+CisKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCkBAIC0zNCw3ICszNiw3IEBACiBjbGFzcyBBdWRpb0VuZHBvaW50IHsKIAogcHVibGljOgotICAgIEF1ZGlvRW5kcG9pbnQoKTsKKyAgICBBdWRpb0VuZHBvaW50KCkgPSBkZWZhdWx0OwogCiAgICAgLyoqCiAgICAgICogQ29uZmlndXJlIGJhc2VkIG9uIHRoZSBFbmRQb2ludERlc2NyaXB0b3JfdC4KQEAgLTQyLDYgKzQ0LDkgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgY29uZmlndXJlKGNvbnN0IEVuZHBvaW50RGVzY3JpcHRvciAqcEVuZHBvaW50RGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOwogCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNvbmZpZ3VyZURhdGFRdWV1ZShjb25zdCBSaW5nQnVmZmVyRGVzY3JpcHRvciAmZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKwogICAgIC8qKgogICAgICAqIFJlYWQgZnJvbSBhIGNvbW1hbmQgcGFzc2VkIHVwIGZyb20gdGhlIFNlcnZlci4KICAgICAgKiBAcmV0dXJuIDEgaWYgY29tbWFuZCByZWNlaXZlZCwgMCBmb3Igbm8gY29tbWFuZCwgb3IgbmVnYXRpdmUgZXJyb3IuCkBAIC01Niw2ICs2MSwxMCBAQAogCiAgICAgaW50MzJfdCBnZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAKKyAgICBhbmRyb2lkOjpmaWZvX2ZyYW1lc190IHJlYWQodm9pZCogYnVmZmVyLCBhbmRyb2lkOjpmaWZvX2ZyYW1lc190IG51bUZyYW1lcyk7CisKKyAgICBhbmRyb2lkOjpmaWZvX2ZyYW1lc190IHdyaXRlKHZvaWQqIGJ1ZmZlciwgYW5kcm9pZDo6Zmlmb19mcmFtZXNfdCBudW1GcmFtZXMpOworCiAgICAgdm9pZCBhZHZhbmNlUmVhZEluZGV4KGludDMyX3QgZGVsdGFGcmFtZXMpOwogCiAgICAgdm9pZCBhZHZhbmNlV3JpdGVJbmRleChpbnQzMl90IGRlbHRhRnJhbWVzKTsKQEAgLTg1LDE5ICs5NCwzMSBAQAogCiAgICAgaW50MzJfdCBnZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKCkgY29uc3Q7CiAKKyAgICB2b2lkIHNldFRocmVzaG9sZChpbnQzMl90IGZyYW1lcykgeworICAgICAgICBtRGF0YVF1ZXVlLT5zZXRUaHJlc2hvbGQoZnJhbWVzKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGdldFRocmVzaG9sZCgpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldFRocmVzaG9sZCgpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFdyaXRlIHplcm9zIHRvIHRoZSBkYXRhIHF1ZXVlIG1lbW9yeS4KICAgICAgKi8KICAgICB2b2lkIGVyYXNlRGF0YU1lbW9yeSgpOwogCisgICAgdm9pZCBmcmVlRGF0YVF1ZXVlKCk7CisKICAgICB2b2lkIGR1bXAoKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6Rmlmb0J1ZmZlckluZGlyZWN0PiBtVXBDb21tYW5kUXVldWU7CiAgICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OkZpZm9CdWZmZXJJbmRpcmVjdD4gbURhdGFRdWV1ZTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICBtRnJlZVJ1bm5pbmc7Ci0gICAgYW5kcm9pZDo6Zmlmb19jb3VudGVyX3QgbURhdGFSZWFkQ291bnRlcjsgLy8gb25seSB1c2VkIGlmIGZyZWUtcnVubmluZwotICAgIGFuZHJvaWQ6OmZpZm9fY291bnRlcl90IG1EYXRhV3JpdGVDb3VudGVyOyAvLyBvbmx5IHVzZWQgaWYgZnJlZS1ydW5uaW5nCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUZyZWVSdW5uaW5ne2ZhbHNlfTsKKyAgICBhbmRyb2lkOjpmaWZvX2NvdW50ZXJfdCBtRGF0YVJlYWRDb3VudGVyezB9OyAvLyBvbmx5IHVzZWQgaWYgZnJlZS1ydW5uaW5nCisgICAgYW5kcm9pZDo6Zmlmb19jb3VudGVyX3QgbURhdGFXcml0ZUNvdW50ZXJ7MH07IC8vIG9ubHkgdXNlZCBpZiBmcmVlLXJ1bm5pbmcKKworICAgIHN0ZDo6bXV0ZXggbURhdGFRdWV1ZUxvY2s7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhYXVkaW8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKaW5kZXggNmQyZDQ2NC4uOWYwNTY0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldHJpY3NJdGVtLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIApAQCAtNDksOCArNTEsNiBAQAogLy8gVGhpcyBpcyBuZWVkZWQgdG8gbWFrZSBzZW5zZSBvZiB0aGUgbG9ncyBtb3JlIGVhc2lseS4KICNkZWZpbmUgTE9HX1RBRyAobUluU2VydmljZSA/ICJBdWRpb1N0cmVhbUludGVybmFsX1NlcnZpY2UiIDogIkF1ZGlvU3RyZWFtSW50ZXJuYWxfQ2xpZW50IikKIAotdXNpbmcgYW5kcm9pZDo6TXV0ZXg7Ci11c2luZyBhbmRyb2lkOjpXcmFwcGluZ0J1ZmZlcjsKIHVzaW5nIGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CiAKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CkBAIC04MSw4ICs4MSw2IEBACiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3Blbihjb25zdCBBdWRpb1N0cmVhbUJ1aWxkZXIgJmJ1aWxkZXIpIHsKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7Ci0gICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdDsKLSAgICBpbnQzMl90IGZyYW1lc1BlckhhcmR3YXJlQnVyc3Q7CiAgICAgQUF1ZGlvU3RyZWFtUmVxdWVzdCByZXF1ZXN0OwogICAgIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbk91dHB1dDsKIApAQCAtOTcsOSArOTUsNiBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAotICAgIGNvbnN0IGludDMyX3QgYnVyc3RNaW5NaWNyb3MgPSBBQXVkaW9Qcm9wZXJ0eV9nZXRIYXJkd2FyZUJ1cnN0TWluTWljcm9zKCk7Ci0gICAgaW50MzJfdCBidXJzdE1pY3JvcyA9IDA7Ci0KICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCByZXF1ZXN0ZWRGb3JtYXQgPSBnZXRGb3JtYXQoKTsKICAgICAvLyBXZSBoYXZlIHRvIGRvIHZvbHVtZSBzY2FsaW5nLiBTbyB3ZSBwcmVmZXIgRkxPQVQgZm9ybWF0LgogICAgIGlmIChyZXF1ZXN0ZWRGb3JtYXQgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKQEAgLTEyMywxMiArMTE4LDE0IEBACiAKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXREZXZpY2VJZChnZXREZXZpY2VJZCgpKTsKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTYW1wbGVSYXRlKGdldFNhbXBsZVJhdGUoKSk7Ci0gICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2FtcGxlc1BlckZyYW1lKGdldFNhbXBsZXNQZXJGcmFtZSgpKTsKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXREaXJlY3Rpb24oZ2V0RGlyZWN0aW9uKCkpOwogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNoYXJpbmdNb2RlKGdldFNoYXJpbmdNb2RlKCkpOworICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldENoYW5uZWxNYXNrKGdldENoYW5uZWxNYXNrKCkpOwogCiAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0VXNhZ2UoZ2V0VXNhZ2UoKSk7CiAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0Q29udGVudFR5cGUoZ2V0Q29udGVudFR5cGUoKSk7CisgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U3BhdGlhbGl6YXRpb25CZWhhdmlvcihnZXRTcGF0aWFsaXphdGlvbkJlaGF2aW9yKCkpOworICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldElzQ29udGVudFNwYXRpYWxpemVkKGlzQ29udGVudFNwYXRpYWxpemVkKCkpOwogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldElucHV0UHJlc2V0KGdldElucHV0UHJlc2V0KCkpOwogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFByaXZhY3lTZW5zaXRpdmUoaXNQcml2YWN5U2Vuc2l0aXZlKCkpOwogCkBAIC0xMzgsNyArMTM1LDggQEAKIAogICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gbVNlcnZpY2VJbnRlcmZhY2Uub3BlblN0cmVhbShyZXF1ZXN0LCBjb25maWd1cmF0aW9uT3V0cHV0KTsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPCAwCi0gICAgICAgICAgICAmJiByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSAxIC8vIG1vbm8/CisgICAgICAgICAgICAmJiAocmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gMQorICAgICAgICAgICAgICAgICAgICB8fCByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRDaGFubmVsTWFzaygpID09IEFBVURJT19DSEFOTkVMX01PTk8pCiAgICAgICAgICAgICAmJiBnZXREaXJlY3Rpb24oKSA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVAogICAgICAgICAgICAgJiYgIWlzSW5TZXJ2aWNlKCkpIHsKICAgICAgICAgLy8gaWYgdGhhdCBmYWlsZWQgdGhlbiB0cnkgc3dpdGNoaW5nIGZyb20gbW9ubyB0byBzdGVyZW8gaWYgT1VUUFVULgpAQCAtMTQ2LDcgKzE0NCw3IEBACiAgICAgICAgIC8vIHRoYXQgd3JpdGVzIHRvIGEgc3RlcmVvIE1NQVAgc3RyZWFtLgogICAgICAgICBBTE9HRCgiJXMoKSAtIG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCwgdHJ5IHN3aXRjaGluZyBmcm9tIE1PTk8gdG8gU1RFUkVPIiwKICAgICAgICAgICAgICAgX19mdW5jX18sIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKLSAgICAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2FtcGxlc1BlckZyYW1lKDIpOyAvLyBzdGVyZW8KKyAgICAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0Q2hhbm5lbE1hc2soQUFVRElPX0NIQU5ORUxfU1RFUkVPKTsKICAgICAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSBtU2VydmljZUludGVyZmFjZS5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOwogICAgIH0KICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPCAwKSB7CkBAIC0xNzQsOSArMTcyLDEwIEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogICAgIC8vIFNhdmUgcmVzdWx0cyBvZiB0aGUgb3Blbi4KLSAgICBpZiAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIHNldFNhbXBsZXNQZXJGcmFtZShjb25maWd1cmF0aW9uT3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKKyAgICBpZiAoZ2V0Q2hhbm5lbE1hc2soKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgc2V0Q2hhbm5lbE1hc2soY29uZmlndXJhdGlvbk91dHB1dC5nZXRDaGFubmVsTWFzaygpKTsKICAgICB9CisKICAgICBtRGV2aWNlQ2hhbm5lbENvdW50ID0gY29uZmlndXJhdGlvbk91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKIAogICAgIHNldFNhbXBsZVJhdGUoY29uZmlndXJhdGlvbk91dHB1dC5nZXRTYW1wbGVSYXRlKCkpOwpAQCAtMTg2LDYgKzE4NSw4IEBACiAKICAgICBzZXRVc2FnZShjb25maWd1cmF0aW9uT3V0cHV0LmdldFVzYWdlKCkpOwogICAgIHNldENvbnRlbnRUeXBlKGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0Q29udGVudFR5cGUoKSk7CisgICAgc2V0U3BhdGlhbGl6YXRpb25CZWhhdmlvcihjb25maWd1cmF0aW9uT3V0cHV0LmdldFNwYXRpYWxpemF0aW9uQmVoYXZpb3IoKSk7CisgICAgc2V0SXNDb250ZW50U3BhdGlhbGl6ZWQoY29uZmlndXJhdGlvbk91dHB1dC5pc0NvbnRlbnRTcGF0aWFsaXplZCgpKTsKICAgICBzZXRJbnB1dFByZXNldChjb25maWd1cmF0aW9uT3V0cHV0LmdldElucHV0UHJlc2V0KCkpOwogCiAgICAgLy8gU2F2ZSBkZXZpY2UgZm9ybWF0IHNvIHdlIGNhbiBkbyBmb3JtYXQgY29udmVyc2lvbiBhbmQgdm9sdW1lIHNjYWxpbmcgdG9nZXRoZXIuCkBAIC0yMDksMTIgKzIxMCwyOCBAQAogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIGZyYW1lc1BlckhhcmR3YXJlQnVyc3QgPSBtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IuZnJhbWVzUGVyQnVyc3Q7CisgICAgaWYgKChyZXN1bHQgPSBjb25maWd1cmVEYXRhSW5mb3JtYXRpb24oYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKSkpICE9IEFBVURJT19PSykgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTik7CisKKyAgICByZXR1cm4gcmVzdWx0OworCitlcnJvcjoKKyAgICBzYWZlUmVsZWFzZUNsb3NlKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmNvbmZpZ3VyZURhdGFJbmZvcm1hdGlvbihpbnQzMl90IGNhbGxiYWNrRnJhbWVzKSB7CisgICAgaW50MzJfdCBmcmFtZXNQZXJIYXJkd2FyZUJ1cnN0ID0gbUVuZHBvaW50RGVzY3JpcHRvci5kYXRhUXVldWVEZXNjcmlwdG9yLmZyYW1lc1BlckJ1cnN0OwogCiAgICAgLy8gU2NhbGUgdXAgdGhlIGJ1cnN0IHNpemUgdG8gbWVldCB0aGUgbWluaW11bSBlcXVpdmFsZW50IGluIG1pY3Jvc2Vjb25kcy4KICAgICAvLyBUaGlzIGlzIHRvIGF2b2lkIHdha2luZyB0aGUgQ1BVIHRvbyBvZnRlbiB3aGVuIHRoZSBIVyBidXJzdCBpcyB2ZXJ5IHNtYWxsCiAgICAgLy8gb3IgYXQgaGlnaCBzYW1wbGUgcmF0ZXMuCi0gICAgZnJhbWVzUGVyQnVyc3QgPSBmcmFtZXNQZXJIYXJkd2FyZUJ1cnN0OworICAgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QgPSBmcmFtZXNQZXJIYXJkd2FyZUJ1cnN0OworICAgIGludDMyX3QgYnVyc3RNaWNyb3MgPSAwOworICAgIGNvbnN0IGludDMyX3QgYnVyc3RNaW5NaWNyb3MgPSBhbmRyb2lkOjpBdWRpb1N5c3RlbTo6Z2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoKTsKICAgICBkbyB7CiAgICAgICAgIGlmIChidXJzdE1pY3JvcyA+IDApIHsgIC8vIHNraXAgZmlyc3QgbG9vcAogICAgICAgICAgICAgZnJhbWVzUGVyQnVyc3QgKj0gMjsKQEAgLTIyNyw4ICsyNDQsNyBAQAogICAgIC8vIFZhbGlkYXRlIGZpbmFsIGJ1cnN0IHNpemUuCiAgICAgaWYgKGZyYW1lc1BlckJ1cnN0IDwgTUlOX0ZSQU1FU19QRVJfQlVSU1QgfHwgZnJhbWVzUGVyQnVyc3QgPiBNQVhfRlJBTUVTX1BFUl9CVVJTVCkgewogICAgICAgICBBTE9HRSgiJXMgLSBmcmFtZXNQZXJCdXJzdCBvdXQgb2YgcmFuZ2UgPSAlZCIsIF9fZnVuY19fLCBmcmFtZXNQZXJCdXJzdCk7Ci0gICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KICAgICBzZXRGcmFtZXNQZXJCdXJzdChmcmFtZXNQZXJCdXJzdCk7IC8vIG9ubHkgc2F2ZSBnb29kIHZhbHVlCiAKQEAgLTIzNiwyNiArMjUyLDIxIEBACiAgICAgaWYgKG1CdWZmZXJDYXBhY2l0eUluRnJhbWVzIDwgZ2V0RnJhbWVzUGVyQnVyc3QoKQogICAgICAgICAgICAgfHwgbUJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMgPiBNQVhfQlVGRkVSX0NBUEFDSVRZX0lOX0ZSQU1FUykgewogICAgICAgICBBTE9HRSgiJXMgLSBidWZmZXJDYXBhY2l0eSBvdXQgb2YgcmFuZ2UgPSAlZCIsIF9fZnVuY19fLCBtQnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyk7Ci0gICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KIAogICAgIG1DbG9ja01vZGVsLnNldFNhbXBsZVJhdGUoZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICBtQ2xvY2tNb2RlbC5zZXRGcmFtZXNQZXJCdXJzdChmcmFtZXNQZXJIYXJkd2FyZUJ1cnN0KTsKIAogICAgIGlmIChpc0RhdGFDYWxsYmFja1NldCgpKSB7Ci0gICAgICAgIG1DYWxsYmFja0ZyYW1lcyA9IGJ1aWxkZXIuZ2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCk7CisgICAgICAgIG1DYWxsYmFja0ZyYW1lcyA9IGNhbGxiYWNrRnJhbWVzOwogICAgICAgICBpZiAobUNhbGxiYWNrRnJhbWVzID4gZ2V0QnVmZmVyQ2FwYWNpdHkoKSAvIDIpIHsKICAgICAgICAgICAgIEFMT0dXKCIlcyAtIGZyYW1lc1BlckNhbGxiYWNrIHRvbyBiaWcgPSAlZCwgY2FwYWNpdHkgPSAlZCIsCiAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUNhbGxiYWNrRnJhbWVzLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotCisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICAgICAgfSBlbHNlIGlmIChtQ2FsbGJhY2tGcmFtZXMgPCAwKSB7CiAgICAgICAgICAgICBBTE9HVygiJXMgLSBmcmFtZXNQZXJDYWxsYmFjayBuZWdhdGl2ZSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotCisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICAgICAgfQogICAgICAgICBpZiAobUNhbGxiYWNrRnJhbWVzID09IEFBVURJT19VTlNQRUNJRklFRCkgewogICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gZ2V0RnJhbWVzUGVyQnVyc3QoKTsKQEAgLTI2NSw2ICsyNzYsMTggQEAKICAgICAgICAgbUNhbGxiYWNrQnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KGNhbGxiYWNrQnVmZmVyU2l6ZSk7CiAgICAgfQogCisgICAgLy8gRXhjbHVzaXZlIG91dHB1dCBzdHJlYW1zIHNob3VsZCBjb21iaW5lIGNoYW5uZWxzIHdoZW4gbW9ubyBhdWRpbyBhZGp1c3RtZW50CisgICAgLy8gaXMgZW5hYmxlZC4gVGhleSBzaG91bGQgYWxzbyBhZGp1c3QgZm9yIGF1ZGlvIGJhbGFuY2UuCisgICAgaWYgKChnZXREaXJlY3Rpb24oKSA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgJiYKKyAgICAgICAgKGdldFNoYXJpbmdNb2RlKCkgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpKSB7CisgICAgICAgIGJvb2wgaXNNYXN0ZXJNb25vID0gZmFsc2U7CisgICAgICAgIGFuZHJvaWQ6OkF1ZGlvU3lzdGVtOjpnZXRNYXN0ZXJNb25vKCZpc01hc3Rlck1vbm8pOworICAgICAgICBzZXRSZXF1aXJlTW9ub0JsZW5kKGlzTWFzdGVyTW9ubyk7CisgICAgICAgIGZsb2F0IGF1ZGlvQmFsYW5jZSA9IDA7CisgICAgICAgIGFuZHJvaWQ6OkF1ZGlvU3lzdGVtOjpnZXRNYXN0ZXJCYWxhbmNlKCZhdWRpb0JhbGFuY2UpOworICAgICAgICBzZXRBdWRpb0JhbGFuY2UoYXVkaW9CYWxhbmNlKTsKKyAgICB9CisKICAgICAvLyBGb3IgZGVidWdnaW5nIGFuZCBhbmFseXppbmcgdGhlIGRpc3RyaWJ1dGlvbiBvZiBNTUFQIHRpbWVzdGFtcHMuCiAgICAgLy8gRm9yIE9VVFBVVCwgdXNlIGEgTkVHQVRJVkUgb2Zmc2V0IHRvIG1vdmUgdGhlIENQVSB3cml0ZXMgZnVydGhlciBCRUZPUkUgdGhlIEhXIHJlYWRzLgogICAgIC8vIEZvciBJTlBVVCwgdXNlIGEgUE9TSVRJVkUgb2Zmc2V0IHRvIG1vdmUgdGhlIENQVSByZWFkcyBmdXJ0aGVyIEFGVEVSIHRoZSBIVyB3cml0ZXMuCkBAIC0yODQsMTQgKzMwNyw3IEBACiAgICAgfQogCiAgICAgc2V0QnVmZmVyU2l6ZShtQnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyAvIDIpOyAvLyBEZWZhdWx0IGJ1ZmZlciBzaXplIHRvIG1hdGNoIFEKLQotICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTik7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotCi1lcnJvcjoKLSAgICBzYWZlUmVsZWFzZUNsb3NlKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gQUFVRElPX09LOwogfQogCiAvLyBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIG1TdHJlYW1Mb2NrLgpAQCAtMzMyLDEzICszNDgsNjcgQEAKIHsKICAgICBBdWRpb1N0cmVhbUludGVybmFsICpzdHJlYW0gPSAoQXVkaW9TdHJlYW1JbnRlcm5hbCAqKWNvbnRleHQ7CiAgICAgLy9MT0dEKCJvYm9lX2NhbGxiYWNrX3RocmVhZCwgc3RyZWFtID0gJXAiLCBzdHJlYW0pOwotICAgIGlmIChzdHJlYW0gIT0gTlVMTCkgeworICAgIGlmIChzdHJlYW0gIT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gc3RyZWFtLT5jYWxsYmFja0xvb3AoKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQogfQogCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6ZXhpdFN0YW5kYnlfbCgpIHsKKyAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSBlbmRwb2ludFBhcmNlbGFibGU7CisgICAgLy8gVGhlIHN0cmVhbSBpcyBpbiBzdGFuZGJ5IG1vZGUsIGNvcHkgYWxsIGF2YWlsYWJsZSBkYXRhIGFuZCB0aGVuIGNsb3NlIHRoZSBkdXBsaWNhdGVkCisgICAgLy8gc2hhcmVkIGZpbGUgZGVzY3JpcHRvciBzbyB0aGF0IGl0IHdvbid0IGNhdXNlIGlzc3VlIHdoZW4gdGhlIEhBTCB0cnkgdG8gcmVhbGxvY2F0ZSBuZXcKKyAgICAvLyBzaGFyZWQgZmlsZSBkZXNjcmlwdG9yIHdoZW4gZXhpdGluZyBmcm9tIHN0YW5kYnkuCisgICAgLy8gQ2FjaGUgY3VycmVudCByZWFkIGNvdW50ZXIsIHdoaWNoIHdpbGwgYmUgcmVzZXQgdG8gbmV3IHJlYWQgYW5kIHdyaXRlIGNvdW50ZXIKKyAgICAvLyB3aGVuIHRoZSBuZXcgZGF0YSBxdWV1ZSBhbmQgZW5kcG9pbnQgYXJlIHJlY29uZmlndXJlZC4KKyAgICBjb25zdCBhbmRyb2lkOjpmaWZvX2NvdW50ZXJfdCByZWFkQ291bnRlciA9IG1BdWRpb0VuZHBvaW50LT5nZXREYXRhUmVhZENvdW50ZXIoKTsKKyAgICAvLyBDYWNoZSB0aGUgYnVmZmVyIHNpemUgd2hpY2ggbWF5IGJlIGZyb20gY2xpZW50LgorICAgIGNvbnN0IGludDMyX3QgcHJldmlvdXNCdWZmZXJTaXplID0gbUJ1ZmZlclNpemVJbkZyYW1lczsKKyAgICAvLyBDb3B5IGFsbCBhdmFpbGFibGUgZGF0YSBmcm9tIGN1cnJlbnQgZGF0YSBxdWV1ZS4KKyAgICB1aW50OF90IGJ1ZmZlcltnZXRCdWZmZXJDYXBhY2l0eSgpICogZ2V0Qnl0ZXNQZXJGcmFtZSgpXTsKKyAgICBhbmRyb2lkOjpmaWZvX2ZyYW1lc190IGZ1bGxGcmFtZXNBdmFpbGFibGUgPQorICAgICAgICAgICAgbUF1ZGlvRW5kcG9pbnQtPnJlYWQoYnVmZmVyLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKKyAgICBtRW5kUG9pbnRQYXJjZWxhYmxlLmNsb3NlRGF0YUZpbGVEZXNjcmlwdG9yKCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1TZXJ2aWNlSW50ZXJmYWNlLmV4aXRTdGFuZGJ5KAorICAgICAgICAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUsIGVuZHBvaW50UGFyY2VsYWJsZSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBleGl0IHN0YW5kYnksIGVycm9yPSVkIiwgcmVzdWx0KTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICAvLyBSZWNvbnN0cnVjdCBkYXRhIHF1ZXVlIGRlc2NyaXB0b3IgdXNpbmcgbmV3IHNoYXJlZCBmaWxlIGRlc2NyaXB0b3IuCisgICAgbUVuZFBvaW50UGFyY2VsYWJsZS51cGRhdGVEYXRhRmlsZURlc2NyaXB0b3IoJmVuZHBvaW50UGFyY2VsYWJsZSk7CisgICAgcmVzdWx0ID0gbUVuZFBvaW50UGFyY2VsYWJsZS5yZXNvbHZlRGF0YVF1ZXVlKCZtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVzb2x2ZSBkYXRhIHF1ZXVlIGFmdGVyIGV4aXRpbmcgc3RhbmRieSwgZXJyb3I9JWQiLCByZXN1bHQpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIC8vIFJlY29uZmlndXJlIGF1ZGlvIGVuZHBvaW50IHdpdGggbmV3IGRhdGEgcXVldWUgZGVzY3JpcHRvci4KKyAgICBtQXVkaW9FbmRwb2ludC0+Y29uZmlndXJlRGF0YVF1ZXVlKAorICAgICAgICAgICAgbUVuZHBvaW50RGVzY3JpcHRvci5kYXRhUXVldWVEZXNjcmlwdG9yLCBnZXREaXJlY3Rpb24oKSk7CisgICAgLy8gU2V0IHJlYWQgYW5kIHdyaXRlIGNvdW50ZXJzIHdpdGggcHJldmlvdXMgcmVhZCBjb3VudGVyLCB0aGUgbGF0ZXIgd3JpdGUgYWN0aW9uCisgICAgLy8gd2lsbCBtYWtlIHRoZSBjb3VudGVyIGF0IHRoZSBjb3JyZWN0IHBsYWNlLgorICAgIG1BdWRpb0VuZHBvaW50LT5zZXREYXRhUmVhZENvdW50ZXIocmVhZENvdW50ZXIpOworICAgIG1BdWRpb0VuZHBvaW50LT5zZXREYXRhV3JpdGVDb3VudGVyKHJlYWRDb3VudGVyKTsKKyAgICByZXN1bHQgPSBjb25maWd1cmVEYXRhSW5mb3JtYXRpb24obUNhbGxiYWNrRnJhbWVzKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSBkYXRhIGluZm9ybWF0aW9uIGFmdGVyIGV4aXRpbmcgc3RhbmRieSwgZXJyb3I9JWQiLCByZXN1bHQpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIC8vIFdyaXRlIGRhdGEgZnJvbSBwcmV2aW91cyBkYXRhIGJ1ZmZlciB0byBuZXcgZW5kcG9pbnQuCisgICAgaWYgKGFuZHJvaWQ6OmZpZm9fZnJhbWVzX3QgZnJhbWVzV3JpdHRlbiA9CisgICAgICAgICAgICAgICAgbUF1ZGlvRW5kcG9pbnQtPndyaXRlKGJ1ZmZlciwgZnVsbEZyYW1lc0F2YWlsYWJsZSk7CisgICAgICAgICAgICBmcmFtZXNXcml0dGVuICE9IGZ1bGxGcmFtZXNBdmFpbGFibGUpIHsKKyAgICAgICAgQUxPR1coIlNvbWUgZGF0YSBsb3N0IGFmdGVyIGV4aXRpbmcgc3RhbmRieSwgZnJhbWVzIHdyaXR0ZW46ICVkLCAiCisgICAgICAgICAgICAgICJmcmFtZXMgdG8gd3JpdGU6ICVkIiwgZnJhbWVzV3JpdHRlbiwgZnVsbEZyYW1lc0F2YWlsYWJsZSk7CisgICAgfQorICAgIC8vIFJlc2V0IHByZXZpb3VzIGJ1ZmZlciBzaXplIGFzIGl0IG1heSBiZSByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4KKyAgICBzZXRCdWZmZXJTaXplKHByZXZpb3VzQnVmZmVyU2l6ZSk7CisKK2V4aXQ6CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogLyoKICAqIEl0IG5vcm1hbGx5IHRha2VzIGFib3V0IDIwLTMwIG1zZWMgdG8gc3RhcnQgYSBzdHJlYW0gb24gdGhlIHNlcnZlci4KICAqIEJ1dCB0aGUgZmlyc3QgdGltZSBjYW4gdGFrZSBhcyBtdWNoIGFzIDIwMC0zMDAgbXNlYy4gVGhlIEhXCkBAIC0zNzUsOCArNDQ1LDE1IEBACiAgICAgcHJlcGFyZUJ1ZmZlcnNGb3JTdGFydCgpOyAvLyB0ZWxsIHN1YmNsYXNzZXMgdG8gZ2V0IHJlYWR5CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbVNlcnZpY2VJbnRlcmZhY2Uuc3RhcnRTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwotICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFKSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIElOVkFMSURfSEFORExFLCBzdHJlYW0gd2FzIHByb2JhYmx5IHN0b2xlbiIsIF9fZnVuY19fKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9TVEFOREJZKSB7CisgICAgICAgIC8vIFRoZSBzdHJlYW0gaXMgYXQgc3RhbmRieSBtb2RlLiBOZWVkIHRvIGV4aXQgc3RhbmRieSBiZWZvcmUgc3RhcnRpbmcgdGhlIHN0cmVhbS4KKyAgICAgICAgcmVzdWx0ID0gZXhpdFN0YW5kYnlfbCgpOworICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAgICAgcmVzdWx0ID0gbVNlcnZpY2VJbnRlcmZhY2Uuc3RhcnRTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIEFMT0dEKCIlcygpIGVycm9yID0gJWQsIHN0cmVhbSB3YXMgcHJvYmFibHkgc3RvbGVuIiwgX19mdW5jX18sIHJlc3VsdCk7CiAgICAgICAgIC8vIFN0ZWFsaW5nIHdhcyBhZGRlZCBpbiBSLiBDb2VyY2UgcmVzdWx0IHRvIGltcHJvdmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRDsKICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpOwpAQCAtMzk2LDYgKzQ3Myw3IEBACiAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRocmVhZF9sKHBlcmlvZE5hbm9zLCBhYXVkaW9fY2FsbGJhY2tfdGhyZWFkX3Byb2MsIHRoaXMpOwogICAgIH0KICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAvLyBUT0RPKGIvMjE0NjA3NjM4KTogRG8gd2Ugd2FudCB0byByb2xsIGJhY2sgdG8gb3JpZ2luYWwgc3RhdGUgb3Iga2VlcCBhcyBkaXNjb25uZWN0ZWQ/CiAgICAgICAgIHNldFN0YXRlKG9yaWdpbmFsU3RhdGUpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNDI0LDcgKzUwMiw3IEBACiAgICAgaWYgKGlzRGF0YUNhbGxiYWNrU2V0KCkKICAgICAgICAgICAgICYmIChpc0FjdGl2ZSgpIHx8IGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpKSB7CiAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gam9pblRocmVhZF9sKE5VTEwpOyAvLyBtYXkgdGVtcG9yYXJpbHkgdW5sb2NrIG1TdHJlYW1Mb2NrCisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBqb2luVGhyZWFkX2wobnVsbHB0cik7IC8vIG1heSB0ZW1wb3JhcmlseSB1bmxvY2sgbVN0cmVhbUxvY2sKICAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEUpIHsKICAgICAgICAgICAgIEFMT0dEKCIlcygpIElOVkFMSURfSEFORExFLCBzdHJlYW0gd2FzIHByb2JhYmx5IHN0b2xlbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19PSzsKQEAgLTUxMSw3ICs1ODksNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpnZXRUaW1lc3RhbXAoY2xvY2tpZF90IGNsb2NrSWQsCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6Z2V0VGltZXN0YW1wKGNsb2NraWRfdCAvKmNsb2NrSWQqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmZyYW1lUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpIHsKICAgICAvLyBHZW5lcmF0ZWQgaW4gc2VydmVyIGFuZCBwYXNzZWQgdG8gY2xpZW50LiBSZXR1cm4gbGF0ZXN0LgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCmluZGV4IGZiZTRjMTMuLjIzNjc1NzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKQEAgLTExNiw3ICsxMTYsNyBAQAogCiAgICAgdmlydHVhbCB2b2lkIHByZXBhcmVCdWZmZXJzRm9yU3RhcnQoKSB7fQogCi0gICAgdmlydHVhbCB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oaW50MzJfdCBzZXJ2ZXJNYXJnaW4gPSAwKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oaW50MzJfdCBzZXJ2ZXJNYXJnaW4pID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBvbkZsdXNoRnJvbVNlcnZlcigpIHt9CiAKQEAgLTE4NCw5ICsxODQsMTQgQEAKICAgICBhYXVkaW9fcmVzdWx0X3Qgd3JpdGVOb3dXaXRoQ29udmVyc2lvbihjb25zdCB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMpOwogCisgICAgLy8gRXhpdCB0aGUgc3RyZWFtIGZyb20gc3RhbmRieSwgd2lsbCByZWNvbnN0cnVjdCBkYXRhIHBhdGguCisgICAgYWF1ZGlvX3Jlc3VsdF90IGV4aXRTdGFuZGJ5X2woKSBSRVFVSVJFUyhtU3RyZWFtTG9jayk7CisKICAgICAvLyBBZGp1c3QgdGltaW5nIG1vZGVsIGJhc2VkIG9uIHRpbWVzdGFtcCBmcm9tIHNlcnZpY2UuCiAgICAgdm9pZCBwcm9jZXNzVGltZXN0YW1wKHVpbnQ2NF90IHBvc2l0aW9uLCBpbnQ2NF90IHRpbWUpOwogCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNvbmZpZ3VyZURhdGFJbmZvcm1hdGlvbihpbnQzMl90IGNhbGxiYWNrRnJhbWVzKTsKKwogICAgIC8vIFRocmVhZCBvbiBvdGhlciBzaWRlIG9mIEZJRk8gd2lsbCBoYXZlIHdha2V1cCBqaXR0ZXIuCiAgICAgLy8gQnkgZGVsYXlpbmcgc2xpZ2h0bHkgd2UgY2FuIGF2b2lkIHdha2luZyB1cCBiZWZvcmUgb3RoZXIgc2lkZSBpcyByZWFkeS4KICAgICBjb25zdCBpbnQzMl90ICAgICAgICAgICAgbVdha2V1cERlbGF5TmFub3M7IC8vIGRlbGF5IHBhc3QgdHlwaWNhbCB3YWtldXAgaml0dGVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKaW5kZXggMmRhNTQwNi4uMWVmY2NiMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcApAQCAtNDYsOCArNDYsNiBAQAogCiB9CiAKLUF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjp+QXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUoKSB7fQotCiB2b2lkIEF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjphZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKGludDMyX3Qgc2VydmVyTWFyZ2luKSB7CiAgICAgaW50NjRfdCByZWFkQ291bnRlciA9IG1BdWRpb0VuZHBvaW50LT5nZXREYXRhUmVhZENvdW50ZXIoKTsKICAgICBpbnQ2NF90IHdyaXRlQ291bnRlciA9IG1BdWRpb0VuZHBvaW50LT5nZXREYXRhV3JpdGVDb3VudGVyKCkgKyBzZXJ2ZXJNYXJnaW47CkBAIC0xMDksNyArMTA3LDcgQEAKICAgICBpZiAobU5lZWRDYXRjaFVwLmlzUmVxdWVzdGVkKCkpIHsKICAgICAgICAgLy8gQ2F0Y2ggYW4gTU1BUCBwb2ludGVyIHRoYXQgaXMgYWxyZWFkeSBhZHZhbmNpbmcuCiAgICAgICAgIC8vIFRoaXMgd2lsbCBhdm9pZCBpbml0aWFsIHVuZGVycnVucyBjYXVzZWQgYnkgYSBzbG93IGNvbGQgc3RhcnQuCi0gICAgICAgIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKTsKKyAgICAgICAgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigwIC8qc2VydmVyTWFyZ2luKi8pOwogICAgICAgICBtTmVlZENhdGNoVXAuYWNrbm93bGVkZ2UoKTsKICAgICB9CiAKQEAgLTIyOCw3ICsyMjYsNyBAQAogdm9pZCAqQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OmNhbGxiYWNrTG9vcCgpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IGNhbGxiYWNrUmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKLSAgICBpZiAoIWlzRGF0YUNhbGxiYWNrU2V0KCkpIHJldHVybiBOVUxMOworICAgIGlmICghaXNEYXRhQ2FsbGJhY2tTZXQoKSkgcmV0dXJuIG51bGxwdHI7CiAKICAgICAvLyByZXN1bHQgbWlnaHQgYmUgYSBmcmFtZSBjb3VudAogICAgIHdoaWxlIChtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSAmJiBpc0FjdGl2ZSgpICYmIChyZXN1bHQgPj0gMCkpIHsKQEAgLTI2MCw1ICsyNTgsNSBAQAogCiAgICAgQUxPR0QoImNhbGxiYWNrTG9vcCgpIGV4aXRpbmcsIHJlc3VsdCA9ICVkLCBpc0FjdGl2ZSgpID0gJWQiLAogICAgICAgICAgIHJlc3VsdCwgKGludCkgaXNBY3RpdmUoKSk7Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaAppbmRleCAyNTFhN2YyLi44NzAxN2RlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmgKQEAgLTI4LDggKzI4LDkgQEAKIAogY2xhc3MgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUgOiBwdWJsaWMgQXVkaW9TdHJlYW1JbnRlcm5hbCB7CiBwdWJsaWM6Ci0gICAgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUoQUF1ZGlvU2VydmljZUludGVyZmFjZSAgJnNlcnZpY2VJbnRlcmZhY2UsIGJvb2wgaW5TZXJ2aWNlID0gZmFsc2UpOwotICAgIHZpcnR1YWwgfkF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlKCk7CisgICAgZXhwbGljaXQgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUoQUF1ZGlvU2VydmljZUludGVyZmFjZSAgJnNlcnZpY2VJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpblNlcnZpY2UgPSBmYWxzZSk7CisgICAgdmlydHVhbCB+QXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUoKSA9IGRlZmF1bHQ7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVhZCh2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCkBAIC00NSw3ICs0Niw3IEBACiAgICAgfQogcHJvdGVjdGVkOgogCi0gICAgdm9pZCBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKGludDMyX3Qgc2VydmVyT2Zmc2V0ID0gMCkgb3ZlcnJpZGU7CisgICAgdm9pZCBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKGludDMyX3Qgc2VydmVyT2Zmc2V0KSBvdmVycmlkZTsKIAogLyoqCiAgKiBMb3cgbGV2ZWwgZGF0YSBwcm9jZXNzaW5nIHRoYXQgd2lsbCBub3QgYmxvY2suIEl0IHdpbGwganVzdCByZWFkIG9yIHdyaXRlIGFzIG11Y2ggYXMgaXQgY2FuLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCmluZGV4IDcxYmRlOTAuLjdjN2E5NjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKQEAgLTQ0LDggKzQ0LDYgQEAKIAogfQogCi1BdWRpb1N0cmVhbUludGVybmFsUGxheTo6fkF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5KCkge30KLQogY29uc3RleHByIGludCBrUmFtcE1TZWMgPSAxMDsgLy8gdGltZSB0byBhcHBseSBhIGNoYW5nZSBpbiB2b2x1bWUKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpvcGVuKGNvbnN0IEF1ZGlvU3RyZWFtQnVpbGRlciAmYnVpbGRlcikgewpAQCAtNTQsNyArNTIsMTAgQEAKICAgICAgICAgcmVzdWx0ID0gbUZsb3dHcmFwaC5jb25maWd1cmUoZ2V0Rm9ybWF0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZXNQZXJGcmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JtYXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlQ2hhbm5lbENvdW50KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VDaGFubmVsQ291bnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVxdWlyZU1vbm9CbGVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBdWRpb0JhbGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldFNoYXJpbmdNb2RlKCkgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpKTsKIAogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgc2FmZVJlbGVhc2VDbG9zZSgpOwpAQCAtMTE1LDcgKzExNiw3IEBACiB9CiAKIHZvaWQgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6Om9uRmx1c2hGcm9tU2VydmVyKCkgewotICAgIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKTsKKyAgICBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKDAgLypzZXJ2ZXJNYXJnaW4qLyk7CiB9CiAKIC8vIFdyaXRlIHRoZSBkYXRhLCBibG9jayBpZiBuZWVkZWQgYW5kIHRpbWVvdXRNaWxsaXMgPiAwCkBAIC0yMDEsMTAgKzIwMiwxOCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQ6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gU2xlZXAgdW50aWwgdGhlIHJlYWRDb3VudGVyIGNhdGNoZXMgdXAgYW5kIHdlIG9ubHkgaGF2ZQotICAgICAgICAgICAgICAgIC8vIHRoZSBnZXRCdWZmZXJTaXplKCkgZnJhbWVzIG9mIGRhdGEgc2l0dGluZyBpbiB0aGUgYnVmZmVyLgotICAgICAgICAgICAgICAgIGludDY0X3QgbmV4dFJlYWRQb3NpdGlvbiA9IG1BdWRpb0VuZHBvaW50LT5nZXREYXRhV3JpdGVDb3VudGVyKCkgLSBnZXRCdWZmZXJTaXplKCk7Ci0gICAgICAgICAgICAgICAgd2FrZVRpbWUgPSBtQ2xvY2tNb2RlbC5jb252ZXJ0UG9zaXRpb25Ub1RpbWUobmV4dFJlYWRQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHdoZW4gdGhlcmUgd2lsbCBiZSByb29tIGF2YWlsYWJsZSB0byB3cml0ZSB0byB0aGUgYnVmZmVyLgorICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhcHBCdWZmZXJTaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgZW5kcG9pbnRCdWZmZXJTaXplIHRoZW4KKyAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIGhhdmUgcm9vbSB0byB3cml0ZSBkYXRhIGJleW9uZCB0aGUgYXBwQnVmZmVyU2l6ZS4KKyAgICAgICAgICAgICAgICAvLyBUaGF0IGlzIGEgdGVjaG5pcXVlIHVzZWQgdG8gcmVkdWNlIGdsaXRjaGVzIHdpdGhvdXQgYWRkaW5nIGxhdGVuY3kuCisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBhcHBCdWZmZXJTaXplID0gZ2V0QnVmZmVyU2l6ZSgpOworICAgICAgICAgICAgICAgIC8vIFRoZSBlbmRwb2ludCBidWZmZXIgc2l6ZSBpcyBzZXQgdG8gdGhlIG1heGltdW0gdGhhdCBjYW4gYmUgd3JpdHRlbi4KKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSB1c2UgaXQgdGhlbiB3ZSBtdXN0IGNhcnZlIG91dCBzb21lIHJvb20gdG8gd3JpdGUgZGF0YSB3aGVuIHdlIHdha2UgdXAuCisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBlbmRCdWZmZXJTaXplID0gbUF1ZGlvRW5kcG9pbnQtPmdldEJ1ZmZlclNpemVJbkZyYW1lcygpCisgICAgICAgICAgICAgICAgICAgICAgICAtIGdldEZyYW1lc1BlckJ1cnN0KCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBiZXN0QnVmZmVyU2l6ZSA9IHN0ZDo6bWluKGFwcEJ1ZmZlclNpemUsIGVuZEJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIGludDY0X3QgdGFyZ2V0UmVhZFBvc2l0aW9uID0gbUF1ZGlvRW5kcG9pbnQtPmdldERhdGFXcml0ZUNvdW50ZXIoKSAtIGJlc3RCdWZmZXJTaXplOworICAgICAgICAgICAgICAgIHdha2VUaW1lID0gbUNsb2NrTW9kZWwuY29udmVydFBvc2l0aW9uVG9UaW1lKHRhcmdldFJlYWRQb3NpdGlvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMjgxLDcgKzI5MCw3IEBACiAgICAgQUxPR0QoIiVzKCkgZW50ZXJpbmcgPj4+Pj4+Pj4+Pj4+Pj4+IiwgX19mdW5jX18pOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgY2FsbGJhY2tSZXN1bHQgPSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFOwotICAgIGlmICghaXNEYXRhQ2FsbGJhY2tTZXQoKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFpc0RhdGFDYWxsYmFja1NldCgpKSByZXR1cm4gbnVsbHB0cjsKICAgICBpbnQ2NF90IHRpbWVvdXROYW5vcyA9IGNhbGN1bGF0ZVJlYXNvbmFibGVUaW1lb3V0KG1DYWxsYmFja0ZyYW1lcyk7CiAKICAgICAvLyByZXN1bHQgbWlnaHQgYmUgYSBmcmFtZSBjb3VudApAQCAtMzA5LDcgKzMxOCw3IEBACiAKICAgICBBTE9HRCgiJXMoKSBleGl0aW5nLCByZXN1bHQgPSAlZCwgaXNBY3RpdmUoKSA9ICVkIDw8PDw8PDw8PDw8PDw8IiwKICAgICAgICAgICBfX2Z1bmNfXywgcmVzdWx0LCAoaW50KSBpc0FjdGl2ZSgpKTsKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCmluZGV4IDAzYzk1N2QuLmU3NjE4MDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaApAQCAtMzAsOCArMzAsOSBAQAogCiBjbGFzcyBBdWRpb1N0cmVhbUludGVybmFsUGxheSA6IHB1YmxpYyBBdWRpb1N0cmVhbUludGVybmFsIHsKIHB1YmxpYzoKLSAgICBBdWRpb1N0cmVhbUludGVybmFsUGxheShBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICAmc2VydmljZUludGVyZmFjZSwgYm9vbCBpblNlcnZpY2UgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCB+QXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkoKTsKKyAgICBleHBsaWNpdCBBdWRpb1N0cmVhbUludGVybmFsUGxheShBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICAmc2VydmljZUludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluU2VydmljZSA9IGZhbHNlKTsKKyAgICB2aXJ0dWFsIH5BdWRpb1N0cmVhbUludGVybmFsUGxheSgpID0gZGVmYXVsdDsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IEF1ZGlvU3RyZWFtQnVpbGRlciAmYnVpbGRlcikgb3ZlcnJpZGU7CiAKQEAgLTY2LDcgKzY3LDcgQEAKIAogICAgIHZvaWQgcHJlcGFyZUJ1ZmZlcnNGb3JTdGFydCgpIG92ZXJyaWRlOwogCi0gICAgdm9pZCBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKGludDMyX3Qgc2VydmVyTWFyZ2luID0gMCkgb3ZlcnJpZGU7CisgICAgdm9pZCBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKGludDMyX3Qgc2VydmVyTWFyZ2luKSBvdmVycmlkZTsKIAogICAgIHZvaWQgb25GbHVzaEZyb21TZXJ2ZXIoKSBvdmVycmlkZTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKaW5kZXggZjBkY2Q0NC4uNjkyMTI3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCkBAIC00MywxNCArNDMsNyBAQAogLy8gYW5kIGR1bXBlZCB0byB0aGUgbG9nIHdoZW4gdGhlIHN0cmVhbSBpcyBzdG9wcGVkLgogCiBJc29jaHJvbm91c0Nsb2NrTW9kZWw6Oklzb2Nocm9ub3VzQ2xvY2tNb2RlbCgpCi0gICAgICAgIDogbU1hcmtlckZyYW1lUG9zaXRpb24oMCkKLSAgICAgICAgLCBtTWFya2VyTmFub1RpbWUoMCkKLSAgICAgICAgLCBtU2FtcGxlUmF0ZSg0ODAwMCkKLSAgICAgICAgLCBtRnJhbWVzUGVyQnVyc3QoNDgpCi0gICAgICAgICwgbUJ1cnN0UGVyaW9kTmFub3MoMCkgLy8gdGhpcyB3aWxsIGJlIHVwZGF0ZWQgYmVmb3JlIHVzZQotICAgICAgICAsIG1NYXhNZWFzdXJlZExhdGVuZXNzTmFub3MoMCkKLSAgICAgICAgLCBtTGF0ZW5lc3NGb3JEcmlmdE5hbm9zKGtJbml0aWFsTGF0ZW5lc3NGb3JEcmlmdE5hbm9zKQotICAgICAgICAsIG1TdGF0ZShTVEFURV9TVE9QUEVEKQorICAgICAgICA6IG1MYXRlbmVzc0ZvckRyaWZ0TmFub3Moa0luaXRpYWxMYXRlbmVzc0ZvckRyaWZ0TmFub3MpCiB7CiAgICAgaWYgKChBQXVkaW9Qcm9wZXJ0eV9nZXRMb2dNYXNrKCkgJiBBQVVESU9fTE9HX0NMT0NLX01PREVMX0hJU1RPR1JBTSkgIT0gMCkgewogICAgICAgICBtSGlzdG9ncmFtTWljcm9zID0gc3RkOjptYWtlX3VuaXF1ZTxIaXN0b2dyYW0+KGtIaXN0b2dyYW1CaW5Db3VudCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmgKaW5kZXggNjI4MDAxMy4uMzAwNzIzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmgKQEAgLTE0OSwxNiArMTQ5LDE2IEBACiAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90ICAga0hpc3RvZ3JhbUJpbldpZHRoTWljcm9zID0gNTA7CiAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90ICAga0hpc3RvZ3JhbUJpbkNvdW50ID0gMTI4OwogCi0gICAgaW50NjRfdCAgICAgICAgICAgICBtTWFya2VyRnJhbWVQb3NpdGlvbjsgLy8gRXN0aW1hdGVkIEhXIHBvc2l0aW9uLgotICAgIGludDY0X3QgICAgICAgICAgICAgbU1hcmtlck5hbm9UaW1lOyAgICAgIC8vIEVzdGltYXRlZCBIVyB0aW1lLgotICAgIGludDMyX3QgICAgICAgICAgICAgbVNhbXBsZVJhdGU7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3Q7ICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyB0cmFuc2ZlcnJlZCBhdCBvbmUgdGltZS4KLSAgICBpbnQzMl90ICAgICAgICAgICAgIG1CdXJzdFBlcmlvZE5hbm9zOyAgICAvLyBUaW1lIGJldHdlZW4gSFcgYnVyc3RzLgorICAgIGludDY0X3QgICAgICAgICAgICAgbU1hcmtlckZyYW1lUG9zaXRpb257MH07IC8vIEVzdGltYXRlZCBIVyBwb3NpdGlvbi4KKyAgICBpbnQ2NF90ICAgICAgICAgICAgIG1NYXJrZXJOYW5vVGltZXswfTsgICAgICAvLyBFc3RpbWF0ZWQgSFcgdGltZS4KKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1TYW1wbGVSYXRlezQ4MDAwfTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdHs0OH07ICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHRyYW5zZmVycmVkIGF0IG9uZSB0aW1lLgorICAgIGludDMyX3QgICAgICAgICAgICAgbUJ1cnN0UGVyaW9kTmFub3N7MH07ICAgIC8vIFRpbWUgYmV0d2VlbiBIVyBidXJzdHMuCiAgICAgLy8gSW5jbHVkZXMgbUJ1cnN0UGVyaW9kTmFub3MgYmVjYXVzZSB3ZSBzYW1wbGUgcmFuZG9tbHkgb3ZlciB0aW1lLgotICAgIGludDMyX3QgICAgICAgICAgICAgbU1heE1lYXN1cmVkTGF0ZW5lc3NOYW5vczsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1NYXhNZWFzdXJlZExhdGVuZXNzTmFub3N7MH07CiAgICAgLy8gVGhyZXNob2xkIGZvciBsYXRlbmVzcyB0aGF0IHRyaWdnZXJzIGEgZHJpZnQgbGF0ZXIgaW4gdGltZS4KICAgICBpbnQzMl90ICAgICAgICAgICAgIG1MYXRlbmVzc0ZvckRyaWZ0TmFub3M7Ci0gICAgY2xvY2tfbW9kZWxfc3RhdGVfdCBtU3RhdGU7ICAgICAgICAgICAgICAgLy8gU3RhdGUgbWFjaGluZSBoYW5kbGVzIHN0YXJ0dXAgc2VxdWVuY2UuCisgICAgY2xvY2tfbW9kZWxfc3RhdGVfdCBtU3RhdGV7U1RBVEVfU1RPUFBFRH07ICAgLy8gU3RhdGUgbWFjaGluZSBoYW5kbGVzIHN0YXJ0dXAgc2VxdWVuY2UuCiAKICAgICBpbnQzMl90ICAgICAgICAgICAgIG1UaW1lc3RhbXBDb3VudCA9IDA7ICAvLyBGb3IgbG9nZ2luZy4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKaW5kZXggZDEwM2FjYS4uOTBmZjRhNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCkBAIC0xMjgsNyArMTI4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKIHsKICAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKLSAgICBzdHJlYW1CdWlsZGVyLT5zZXRTYW1wbGVzUGVyRnJhbWUoc2FtcGxlc1BlckZyYW1lKTsKKyAgICBjb25zdCBhYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBBQXVkaW9Db252ZXJ0X2NoYW5uZWxDb3VudFRvTWFzayhzYW1wbGVzUGVyRnJhbWUpOworICAgIHN0cmVhbUJ1aWxkZXItPnNldENoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKTsKIH0KIAogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCkBAIC0xNjYsNiArMTY3LDE4IEBACiAgICAgc3RyZWFtQnVpbGRlci0+c2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpOwogfQogCitBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTcGF0aWFsaXphdGlvbkJlaGF2aW9yKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCisgICAgICAgIGFhdWRpb19zcGF0aWFsaXphdGlvbl9iZWhhdmlvcl90IHNwYXRpYWxpemF0aW9uQmVoYXZpb3IpIHsKKyAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKKyAgICBzdHJlYW1CdWlsZGVyLT5zZXRTcGF0aWFsaXphdGlvbkJlaGF2aW9yKHNwYXRpYWxpemF0aW9uQmVoYXZpb3IpOworfQorCitBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRJc0NvbnRlbnRTcGF0aWFsaXplZChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NwYXRpYWxpemVkKSB7CisgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gY29udmVydEFBdWRpb0J1aWxkZXJUb1N0cmVhbUJ1aWxkZXIoYnVpbGRlcik7CisgICAgc3RyZWFtQnVpbGRlci0+c2V0SXNDb250ZW50U3BhdGlhbGl6ZWQoaXNTcGF0aWFsaXplZCk7Cit9CisKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldElucHV0UHJlc2V0KEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgaW5wdXRQcmVzZXQpIHsKICAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKQEAgLTIyMyw2ICsyMzYsMTMgQEAKICAgICBzdHJlYW1CdWlsZGVyLT5zZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soZnJhbWVzKTsKIH0KIAorQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbE1hc2soQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykKK3sKKyAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKKyAgICBzdHJlYW1CdWlsZGVyLT5zZXRDaGFubmVsTWFzayhjaGFubmVsTWFzayk7Cit9CisKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtKiogc3RyZWFtUHRyKQogewpAQCAtMzMyLDcgKzM1Miw4IEBACiB7CiAKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIHJldHVybiBhdWRpb1N0cmVhbS0+d2FpdEZvclN0YXRlQ2hhbmdlKGlucHV0U3RhdGUsIG5leHRTdGF0ZSwgdGltZW91dE5hbm9zZWNvbmRzKTsKKyAgICBhbmRyb2lkOjpzcDxBdWRpb1N0cmVhbT4gc3BBdWRpb1N0cmVhbShhdWRpb1N0cmVhbSk7CisgICAgcmV0dXJuIHNwQXVkaW9TdHJlYW0tPndhaXRGb3JTdGF0ZUNoYW5nZShpbnB1dFN0YXRlLCBuZXh0U3RhdGUsIHRpbWVvdXROYW5vc2Vjb25kcyk7CiB9CiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNDk1LDYgKzUxNiwxOSBAQAogICAgIHJldHVybiBhdWRpb1N0cmVhbS0+Z2V0Q29udGVudFR5cGUoKTsKIH0KIAorQUFVRElPX0FQSSBhYXVkaW9fc3BhdGlhbGl6YXRpb25fYmVoYXZpb3JfdCBBQXVkaW9TdHJlYW1fZ2V0U3BhdGlhbGl6YXRpb25CZWhhdmlvcigKKyAgICAgICAgQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCit7CisgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKKyAgICByZXR1cm4gYXVkaW9TdHJlYW0tPmdldFNwYXRpYWxpemF0aW9uQmVoYXZpb3IoKTsKK30KKworQUFVRElPX0FQSSBib29sIEFBdWRpb1N0cmVhbV9pc0NvbnRlbnRTcGF0aWFsaXplZChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKK3sKKyAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOworICAgIHJldHVybiBhdWRpb1N0cmVhbS0+aXNDb250ZW50U3BhdGlhbGl6ZWQoKTsKK30KKwogQUFVRElPX0FQSSBhYXVkaW9faW5wdXRfcHJlc2V0X3QgQUF1ZGlvU3RyZWFtX2dldElucHV0UHJlc2V0KEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7CkBAIC01NjIsMyArNTk2LDExIEBACiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKICAgICByZXR1cm4gYXVkaW9TdHJlYW0tPmlzUHJpdmFjeVNlbnNpdGl2ZSgpOwogfQorCitBQVVESU9fQVBJIGFhdWRpb19jaGFubmVsX21hc2tfdCBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbE1hc2soQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCit7CisgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKKyAgICBjb25zdCBhYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBhdWRpb1N0cmVhbS0+Z2V0Q2hhbm5lbE1hc2soKTsKKyAgICAvLyBEbyBub3QgcmV0dXJuIGNoYW5uZWwgaW5kZXggbWFza3MgYXMgdGhleSBhcmUgbm90IHB1YmxpYy4KKyAgICByZXR1cm4gQUF1ZGlvX2lzQ2hhbm5lbEluZGV4TWFzayhjaGFubmVsTWFzaykgPyBBQVVESU9fVU5TUEVDSUZJRUQgOiBjaGFubmVsTWFzazsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcAppbmRleCBhY2ZhYzI0Li44YjdiNzVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCkBAIC0zMCw5ICszMCw2IEBACiAvLyBIRE1JIHN1cHBvcnRzIHVwIHRvIDMyIGNoYW5uZWxzIGF0IDE1MzYwMDAgSHouCiAjZGVmaW5lIFNBTVBMRV9SQVRFX0haX01BWCAgICAgICAgICAgMTYwMDAwMAogCi1BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOjpBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzKCkge30KLUFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6On5BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzKCkge30KLQogdm9pZCBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOjpjb3B5RnJvbShjb25zdCBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzICZvdGhlcikgewogICAgIG1TYW1wbGVzUGVyRnJhbWUgICAgICA9IG90aGVyLm1TYW1wbGVzUGVyRnJhbWU7CiAgICAgbVNhbXBsZVJhdGUgICAgICAgICAgID0gb3RoZXIubVNhbXBsZVJhdGU7CkBAIC00NCwxMSArNDEsMTQgQEAKICAgICBtQnVmZmVyQ2FwYWNpdHkgICAgICAgPSBvdGhlci5tQnVmZmVyQ2FwYWNpdHk7CiAgICAgbVVzYWdlICAgICAgICAgICAgICAgID0gb3RoZXIubVVzYWdlOwogICAgIG1Db250ZW50VHlwZSAgICAgICAgICA9IG90aGVyLm1Db250ZW50VHlwZTsKKyAgICBtU3BhdGlhbGl6YXRpb25CZWhhdmlvciA9IG90aGVyLm1TcGF0aWFsaXphdGlvbkJlaGF2aW9yOworICAgIG1Jc0NvbnRlbnRTcGF0aWFsaXplZCA9IG90aGVyLm1Jc0NvbnRlbnRTcGF0aWFsaXplZDsKICAgICBtSW5wdXRQcmVzZXQgICAgICAgICAgPSBvdGhlci5tSW5wdXRQcmVzZXQ7CiAgICAgbUFsbG93ZWRDYXB0dXJlUG9saWN5ID0gb3RoZXIubUFsbG93ZWRDYXB0dXJlUG9saWN5OwogICAgIG1Jc1ByaXZhY3lTZW5zaXRpdmUgICA9IG90aGVyLm1Jc1ByaXZhY3lTZW5zaXRpdmU7CiAgICAgbU9wUGFja2FnZU5hbWUgICAgICAgID0gb3RoZXIubU9wUGFja2FnZU5hbWU7CiAgICAgbUF0dHJpYnV0aW9uVGFnICAgICAgID0gb3RoZXIubUF0dHJpYnV0aW9uVGFnOworICAgIG1DaGFubmVsTWFzayAgICAgICAgICA9IG90aGVyLm1DaGFubmVsTWFzazsKIH0KIAogc3RhdGljIGFhdWRpb19yZXN1bHRfdCBpc0Zvcm1hdFZhbGlkKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewpAQCAtMTYwLDYgKzE2MCwxOSBAQAogICAgICAgICAgICAgLy8gYnJlYWs7CiAgICAgfQogCisgICAgc3dpdGNoIChtU3BhdGlhbGl6YXRpb25CZWhhdmlvcikgeworICAgICAgICBjYXNlIEFBVURJT19VTlNQRUNJRklFRDoKKyAgICAgICAgY2FzZSBBQVVESU9fU1BBVElBTElaQVRJT05fQkVIQVZJT1JfQVVUTzoKKyAgICAgICAgY2FzZSBBQVVESU9fU1BBVElBTElaQVRJT05fQkVIQVZJT1JfTkVWRVI6CisgICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dEKCJzcGF0aWFsaXphdGlvbiBiZWhhdmlvciBub3QgdmFsaWQgPSAlZCIsIG1TcGF0aWFsaXphdGlvbkJlaGF2aW9yKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgICAgIC8vIGJyZWFrOworICAgIH0KKworICAgIC8vIG5vIHZhbGlkYXRpb24gcmVxdWlyZWQgZm9yIG1Jc0NvbnRlbnRTcGF0aWFsaXplZAorCiAgICAgc3dpdGNoIChtSW5wdXRQcmVzZXQpIHsKICAgICAgICAgY2FzZSBBQVVESU9fVU5TUEVDSUZJRUQ6CiAgICAgICAgIGNhc2UgQUFVRElPX0lOUFVUX1BSRVNFVF9HRU5FUklDOgpAQCAtMTg3LDcgKzIwMCw5NCBAQAogICAgICAgICAgICAgLy8gYnJlYWs7CiAgICAgfQogCi0gICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICByZXR1cm4gdmFsaWRhdGVDaGFubmVsTWFzaygpOworfQorCitib29sIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OnZhbGlkYXRlQ2hhbm5lbE1hc2soKSBjb25zdCB7CisgICAgaWYgKG1DaGFubmVsTWFzayA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICB9CisKKyAgICBpZiAobUNoYW5uZWxNYXNrICYgQUFVRElPX0NIQU5ORUxfQklUX0lOREVYKSB7CisgICAgICAgIHN3aXRjaCAobUNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMToKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yOgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzM6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNDoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS181OgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzY6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNzoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS184OgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzk6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTA6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTE6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTI6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTM6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTQ6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTU6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTY6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTc6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTg6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTk6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjA6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjE6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjI6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjM6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0QoIkludmFsaWQgY2hhbm5lbCBpbmRleCBtYXNrICUjeCIsIG1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpIHsKKyAgICAgICAgc3dpdGNoIChtQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfTU9OTzoKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfU1RFUkVPOgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9GUk9OVF9CQUNLOgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF8yUE9JTlQwUE9JTlQyOgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF8yUE9JTlQxUE9JTlQyOgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF8zUE9JTlQwUE9JTlQyOgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF8zUE9JTlQxUE9JTlQyOgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF81UE9JTlQxOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dEKCJJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3gsIElOIiwgbUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKG1DaGFubmVsTWFzaykgeworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9NT05POgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9TVEVSRU86CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzJQT0lOVDE6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX1RSSToKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfVFJJX0JBQ0s6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzNQT0lOVDE6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzJQT0lOVDBQT0lOVDI6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzJQT0lOVDFQT0lOVDI6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzNQT0lOVDBQT0lOVDI6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzNQT0lOVDFQT0lOVDI6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX1FVQUQ6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX1FVQURfU0lERToKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfU1VSUk9VTkQ6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX1BFTlRBOgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF81UE9JTlQxOgorICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF81UE9JTlQxX1NJREU6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzVQT0lOVDFQT0lOVDI6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzVQT0lOVDFQT0lOVDQ6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzZQT0lOVDE6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzdQT0lOVDE6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzdQT0lOVDFQT0lOVDI6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzdQT0lOVDFQT0lOVDQ6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzlQT0lOVDFQT0lOVDQ6CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzlQT0lOVDFQT0lOVDY6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0QoIkludmFsaWQgY2hhbm5lbCBtYXNrICUjeC4gT1VUIiwgbUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHZvaWQgQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczo6ZHVtcCgpIGNvbnN0IHsKQEAgLTE5NSwxMiArMjk1LDE1IEBACiAgICAgQUxPR0QoIm1TZXNzaW9uSWQgICAgICAgICAgICA9ICU2ZCIsIG1TZXNzaW9uSWQpOwogICAgIEFMT0dEKCJtU2FtcGxlUmF0ZSAgICAgICAgICAgPSAlNmQiLCBtU2FtcGxlUmF0ZSk7CiAgICAgQUxPR0QoIm1TYW1wbGVzUGVyRnJhbWUgICAgICA9ICU2ZCIsIG1TYW1wbGVzUGVyRnJhbWUpOworICAgIEFMT0dEKCJtQ2hhbm5lbE1hc2sgICAgICAgICAgPSAlI3giLCBtQ2hhbm5lbE1hc2spOwogICAgIEFMT0dEKCJtU2hhcmluZ01vZGUgICAgICAgICAgPSAlNmQiLCAoaW50KW1TaGFyaW5nTW9kZSk7CiAgICAgQUxPR0QoIm1BdWRpb0Zvcm1hdCAgICAgICAgICA9ICU2ZCIsIChpbnQpbUF1ZGlvRm9ybWF0KTsKICAgICBBTE9HRCgibURpcmVjdGlvbiAgICAgICAgICAgID0gJTZkIiwgbURpcmVjdGlvbik7CiAgICAgQUxPR0QoIm1CdWZmZXJDYXBhY2l0eSAgICAgICA9ICU2ZCIsIG1CdWZmZXJDYXBhY2l0eSk7CiAgICAgQUxPR0QoIm1Vc2FnZSAgICAgICAgICAgICAgICA9ICU2ZCIsIG1Vc2FnZSk7CiAgICAgQUxPR0QoIm1Db250ZW50VHlwZSAgICAgICAgICA9ICU2ZCIsIG1Db250ZW50VHlwZSk7CisgICAgQUxPR0QoIm1TcGF0aWFsaXphdGlvbkJlaGF2aW9yID0gJTZkIiwgbVNwYXRpYWxpemF0aW9uQmVoYXZpb3IpOworICAgIEFMT0dEKCJtSXNDb250ZW50U3BhdGlhbGl6ZWQgPSAlcyIsIG1Jc0NvbnRlbnRTcGF0aWFsaXplZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgIEFMT0dEKCJtSW5wdXRQcmVzZXQgICAgICAgICAgPSAlNmQiLCBtSW5wdXRQcmVzZXQpOwogICAgIEFMT0dEKCJtQWxsb3dlZENhcHR1cmVQb2xpY3kgPSAlNmQiLCBtQWxsb3dlZENhcHR1cmVQb2xpY3kpOwogICAgIEFMT0dEKCJtSXNQcml2YWN5U2Vuc2l0aXZlICAgPSAlcyIsIG1Jc1ByaXZhY3lTZW5zaXRpdmUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCmluZGV4IDU3MzcwNTIuLmNiOTk4YmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaApAQCAtMjYsOCArMjYsOCBAQAogCiBjbGFzcyBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzIHsKIHB1YmxpYzoKLSAgICBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzKCk7Ci0gICAgdmlydHVhbCB+QUF1ZGlvU3RyZWFtUGFyYW1ldGVycygpOworICAgIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB+QUF1ZGlvU3RyZWFtUGFyYW1ldGVycygpID0gZGVmYXVsdDsKIAogICAgIGludDMyX3QgZ2V0RGV2aWNlSWQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRGV2aWNlSWQ7CkBAIC00OSwxMyArNDksNiBAQAogICAgICAgICByZXR1cm4gbVNhbXBsZXNQZXJGcmFtZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGFsc28ga25vd24gYXMgY2hhbm5lbENvdW50LgotICAgICAqLwotICAgIHZvaWQgc2V0U2FtcGxlc1BlckZyYW1lKGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKSB7Ci0gICAgICAgIG1TYW1wbGVzUGVyRnJhbWUgPSBzYW1wbGVzUGVyRnJhbWU7Ci0gICAgfQotCiAgICAgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUF1ZGlvRm9ybWF0OwogICAgIH0KQEAgLTEwNCw2ICs5NywyMiBAQAogICAgICAgICBtQ29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKICAgICB9CiAKKyAgICBhYXVkaW9fc3BhdGlhbGl6YXRpb25fYmVoYXZpb3JfdCBnZXRTcGF0aWFsaXphdGlvbkJlaGF2aW9yKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNwYXRpYWxpemF0aW9uQmVoYXZpb3I7CisgICAgfQorCisgICAgdm9pZCBzZXRTcGF0aWFsaXphdGlvbkJlaGF2aW9yKGFhdWRpb19zcGF0aWFsaXphdGlvbl9iZWhhdmlvcl90IHNwYXRpYWxpemF0aW9uQmVoYXZpb3IpIHsKKyAgICAgICAgbVNwYXRpYWxpemF0aW9uQmVoYXZpb3IgPSBzcGF0aWFsaXphdGlvbkJlaGF2aW9yOworICAgIH0KKworICAgIGJvb2wgaXNDb250ZW50U3BhdGlhbGl6ZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSXNDb250ZW50U3BhdGlhbGl6ZWQ7CisgICAgfQorCisgICAgdm9pZCBzZXRJc0NvbnRlbnRTcGF0aWFsaXplZChib29sIGlzU3BhdGlhbGl6ZWQpIHsKKyAgICAgICAgbUlzQ29udGVudFNwYXRpYWxpemVkID0gaXNTcGF0aWFsaXplZDsKKyAgICB9CisKICAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgZ2V0SW5wdXRQcmVzZXQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtSW5wdXRQcmVzZXQ7CiAgICAgfQpAQCAtMTQxLDcgKzE1MCw3IEBACiAgICAgfQogCiAgICAgLy8gVE9ETyBiLzE4MjM5Mjc2OTogcmVleGFtaW5lIGlmIElkZW50aXR5IGNhbiBiZSB1c2VkCi0gICAgdm9pZCBzZXRPcFBhY2thZ2VOYW1lKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IG9wUGFja2FnZU5hbWUpIHsKKyAgICB2b2lkIHNldE9wUGFja2FnZU5hbWUoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIG9wUGFja2FnZU5hbWUpIHsKICAgICAgICAgbU9wUGFja2FnZU5hbWUgPSBvcFBhY2thZ2VOYW1lOwogICAgIH0KIApAQCAtMTQ5LDEwICsxNTgsMTkgQEAKICAgICAgICAgcmV0dXJuIG1BdHRyaWJ1dGlvblRhZzsKICAgICB9CiAKLSAgICB2b2lkIHNldEF0dHJpYnV0aW9uVGFnKGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IGF0dHJpYnV0aW9uVGFnKSB7CisgICAgdm9pZCBzZXRBdHRyaWJ1dGlvblRhZyhjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgYXR0cmlidXRpb25UYWcpIHsKICAgICAgICAgbUF0dHJpYnV0aW9uVGFnID0gYXR0cmlidXRpb25UYWc7CiAgICAgfQogCisgICAgYWF1ZGlvX2NoYW5uZWxfbWFza190IGdldENoYW5uZWxNYXNrKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNoYW5uZWxNYXNrOworICAgIH0KKworICAgIHZvaWQgc2V0Q2hhbm5lbE1hc2soYWF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSB7CisgICAgICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICBtU2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvQ29udmVydF9jaGFubmVsTWFza1RvQ291bnQoY2hhbm5lbE1hc2spOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEByZXR1cm4gYnl0ZXMgcGVyIGZyYW1lIG9mIGdldEZvcm1hdCgpCiAgICAgICovCkBAIC0xNzEsNiArMTg5LDggQEAKICAgICB2b2lkIGR1bXAoKSBjb25zdDsKIAogcHJpdmF0ZToKKyAgICBib29sIHZhbGlkYXRlQ2hhbm5lbE1hc2soKSBjb25zdDsKKwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZUlkICAgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwpAQCAtMTc5LDYgKzE5OSw5IEBACiAgICAgYWF1ZGlvX2RpcmVjdGlvbl90ICAgICAgICAgICAgICBtRGlyZWN0aW9uICAgICAgICAgICAgPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKICAgICBhYXVkaW9fdXNhZ2VfdCAgICAgICAgICAgICAgICAgIG1Vc2FnZSAgICAgICAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fY29udGVudF90eXBlX3QgICAgICAgICAgIG1Db250ZW50VHlwZSAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBhYXVkaW9fc3BhdGlhbGl6YXRpb25fYmVoYXZpb3JfdCBtU3BhdGlhbGl6YXRpb25CZWhhdmlvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzQ29udGVudFNwYXRpYWxpemVkID0gZmFsc2U7CiAgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90ICAgICAgICAgICBtSW5wdXRQcmVzZXQgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyQ2FwYWNpdHkgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBtQWxsb3dlZENhcHR1cmVQb2xpY3kgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CkBAIC0xODYsNiArMjA5LDcgQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1ByaXZhY3lTZW5zaXRpdmUgICA9IGZhbHNlOwogICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+ICAgICAgbU9wUGFja2FnZU5hbWUgICAgICAgID0ge307CiAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gICAgICBtQXR0cmlidXRpb25UYWcgICAgICAgPSB7fTsKKyAgICBhYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgICAgICAgIG1DaGFubmVsTWFzayAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvR2xvYmFsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9HbG9iYWwuaAppbmRleCAxZTg4ZDE1Li42YzIyNzQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9HbG9iYWwuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9HbG9iYWwuaApAQCAtMzEsNyArMzEsOCBAQAogY29uc3QgY2hhciogQXVkaW9HbG9iYWxfY29udmVydFJlc3VsdFRvVGV4dChhYXVkaW9fcmVzdWx0X3QgcmV0dXJuQ29kZSk7CiBjb25zdCBjaGFyKiBBdWRpb0dsb2JhbF9jb252ZXJ0U2hhcmluZ01vZGVUb1RleHQoYWF1ZGlvX3NoYXJpbmdfbW9kZV90IG1vZGUpOwogY29uc3QgY2hhciogQXVkaW9HbG9iYWxfY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSk7Ci19CisKK30gLy8gbmFtZXNwYWNlIGFhdWRpbwogCiAjZW5kaWYgIC8vIEFBVURJT19BVURJT0dMT0JBTF9ICiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCmluZGV4IDA5ZDk1MzUuLjA2ZjA1YjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcApAQCAtNzYsNiArNzYsNyBAQAogICAgIC8vIENvcHkgcGFyYW1ldGVycyBmcm9tIHRoZSBCdWlsZGVyIGJlY2F1c2UgdGhlIEJ1aWxkZXIgbWF5IGJlIGRlbGV0ZWQgYWZ0ZXIgdGhpcyBjYWxsLgogICAgIC8vIFRPRE8gQXVkaW9TdHJlYW0gc2hvdWxkIGJlIGEgc3ViY2xhc3Mgb2YgQXVkaW9TdHJlYW1QYXJhbWV0ZXJzCiAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IGJ1aWxkZXIuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgbUNoYW5uZWxNYXNrID0gYnVpbGRlci5nZXRDaGFubmVsTWFzaygpOwogICAgIG1TYW1wbGVSYXRlID0gYnVpbGRlci5nZXRTYW1wbGVSYXRlKCk7CiAgICAgbURldmljZUlkID0gYnVpbGRlci5nZXREZXZpY2VJZCgpOwogICAgIG1Gb3JtYXQgPSBidWlsZGVyLmdldEZvcm1hdCgpOwpAQCAtOTEsNiArOTIsMTIgQEAKICAgICBpZiAobUNvbnRlbnRUeXBlID09IEFBVURJT19VTlNQRUNJRklFRCkgewogICAgICAgICBtQ29udGVudFR5cGUgPSBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDOwogICAgIH0KKyAgICBtU3BhdGlhbGl6YXRpb25CZWhhdmlvciA9IGJ1aWxkZXIuZ2V0U3BhdGlhbGl6YXRpb25CZWhhdmlvcigpOworICAgIC8vIGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHByb3BlcnRpZXMsIG5vdGUgVU5TUEVDSUZJRUQgaXMgdGhlIHNhbWUgYXMgQVVUTworICAgIGlmIChtU3BhdGlhbGl6YXRpb25CZWhhdmlvciA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgbVNwYXRpYWxpemF0aW9uQmVoYXZpb3IgPSBBQVVESU9fU1BBVElBTElaQVRJT05fQkVIQVZJT1JfQVVUTzsKKyAgICB9CisgICAgbUlzQ29udGVudFNwYXRpYWxpemVkID0gYnVpbGRlci5pc0NvbnRlbnRTcGF0aWFsaXplZCgpOwogICAgIG1JbnB1dFByZXNldCA9IGJ1aWxkZXIuZ2V0SW5wdXRQcmVzZXQoKTsKICAgICBpZiAobUlucHV0UHJlc2V0ID09IEFBVURJT19VTlNQRUNJRklFRCkgewogICAgICAgICBtSW5wdXRQcmVzZXQgPSBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OOwpAQCAtNTk1LDYgKzYwMiw3IEBACiAKIHZvaWQgQXVkaW9TdHJlYW06OnNldER1Y2tBbmRNdXRlVm9sdW1lKGZsb2F0IGR1Y2tBbmRNdXRlVm9sdW1lKSB7CiAgICAgQUxPR0QoIiVzKCkgdG8gJWYiLCBfX2Z1bmNfXywgZHVja0FuZE11dGVWb2x1bWUpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKICAgICBtRHVja0FuZE11dGVWb2x1bWUgPSBkdWNrQW5kTXV0ZVZvbHVtZTsKICAgICBkb1NldFZvbHVtZSgpOyAvLyBhcHBseSB0aGlzIGNoYW5nZQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaAppbmRleCA5ODM1YzhjLi41ZmI0NTI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaApAQCAtMjUzLDYgKzI1MywxNCBAQAogICAgICAgICByZXR1cm4gbUNvbnRlbnRUeXBlOwogICAgIH0KIAorICAgIGFhdWRpb19zcGF0aWFsaXphdGlvbl9iZWhhdmlvcl90IGdldFNwYXRpYWxpemF0aW9uQmVoYXZpb3IoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU3BhdGlhbGl6YXRpb25CZWhhdmlvcjsKKyAgICB9CisKKyAgICBib29sIGlzQ29udGVudFNwYXRpYWxpemVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlzQ29udGVudFNwYXRpYWxpemVkOworICAgIH0KKwogICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBnZXRJbnB1dFByZXNldCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1JbnB1dFByZXNldDsKICAgICB9CkBAIC0yNjksOCArMjc3LDE3IEBACiAgICAgICAgIHJldHVybiBtSXNQcml2YWN5U2Vuc2l0aXZlOwogICAgIH0KIAorICAgIGJvb2wgZ2V0UmVxdWlyZU1vbm9CbGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SZXF1aXJlTW9ub0JsZW5kOworICAgIH0KKworICAgIGZsb2F0IGdldEF1ZGlvQmFsYW5jZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb0JhbGFuY2U7CisgICAgfQorCiAgICAgLyoqCi0gICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldFNhbXBsZXNQZXJGcmFtZSgpIGFuZCBzZXRGb3JtYXQoKSBoYXZlIGJlZW4gY2FsbGVkLgorICAgICAqIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlciBzZXRDaGFubmVsTWFzaygpIGFuZCBzZXRGb3JtYXQoKQorICAgICAqIGhhdmUgYmVlbiBjYWxsZWQuCiAgICAgICovCiAgICAgaW50MzJfdCBnZXRCeXRlc1BlckZyYW1lKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVNhbXBsZXNQZXJGcmFtZSAqIGdldEJ5dGVzUGVyU2FtcGxlKCk7CkBAIC0yODQsNyArMzAxLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgc2V0U2FtcGxlc1BlckZyYW1lKCkgYW5kIHNldERldmljZUZvcm1hdCgpIGhhdmUgYmVlbiBjYWxsZWQuCisgICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldENoYW5uZWxNYXNrKCkgYW5kIHNldERldmljZUZvcm1hdCgpIGhhdmUgYmVlbiBjYWxsZWQuCiAgICAgICovCiAgICAgaW50MzJfdCBnZXRCeXRlc1BlckRldmljZUZyYW1lKCkgY29uc3QgewogICAgICAgICByZXR1cm4gZ2V0U2FtcGxlc1BlckZyYW1lKCkgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGdldERldmljZUZvcm1hdCgpKTsKQEAgLTMxOCw2ICszMzUsMTUgQEAKICAgICAgICAgcmV0dXJuIG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2s7CiAgICAgfQogCisgICAgYWF1ZGlvX2NoYW5uZWxfbWFza190IGdldENoYW5uZWxNYXNrKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNoYW5uZWxNYXNrOworICAgIH0KKworICAgIHZvaWQgc2V0Q2hhbm5lbE1hc2soYWF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSB7CisgICAgICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICBtU2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvQ29udmVydF9jaGFubmVsTWFza1RvQ291bnQoY2hhbm5lbE1hc2spOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBkYXRhIGNhbGxiYWNrIGhhcyBiZWVuIHNwZWNpZmllZAogICAgICAqLwpAQCAtNDI5LDcgKzQ1NSw3IEBACiAgICAgLy8gUGxheWVyQmFzZSBhbGxvd3MgdGhlIHN5c3RlbSB0byBjb250cm9sIHRoZSBzdHJlYW0gdm9sdW1lLgogICAgIGNsYXNzIE15UGxheWVyQmFzZSA6IHB1YmxpYyBhbmRyb2lkOjpQbGF5ZXJCYXNlIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIE15UGxheWVyQmFzZSgpIHt9OworICAgICAgICBNeVBsYXllckJhc2UoKSA9IGRlZmF1bHQ7CiAKICAgICAgICAgdmlydHVhbCB+TXlQbGF5ZXJCYXNlKCkgPSBkZWZhdWx0OwogCkBAIC00OTUsMTEgKzUyMSw2IEBACiAgICAgfQogCiAgICAgLy8gVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCi0gICAgdm9pZCBzZXRTYW1wbGVzUGVyRnJhbWUoaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpIHsKLSAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IHNhbXBsZXNQZXJGcmFtZTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KICAgICB2b2lkIHNldEZyYW1lc1BlckJ1cnN0KGludDMyX3QgZnJhbWVzUGVyQnVyc3QpIHsKICAgICAgICAgbUZyYW1lc1BlckJ1cnN0ID0gZnJhbWVzUGVyQnVyc3Q7CiAgICAgfQpAQCAtNTYzLDcgKzU4NCw3IEBACiAgICAgICogQHBhcmFtIG51bUZyYW1lcwogICAgICAqIEByZXR1cm4gb3JpZ2luYWwgcG9pbnRlciBvciB0aGUgY29udmVyc2lvbiBidWZmZXIKICAgICAgKi8KLSAgICB2aXJ0dWFsIGNvbnN0IHZvaWQgKiBtYXliZUNvbnZlcnREZXZpY2VEYXRhKGNvbnN0IHZvaWQgKmF1ZGlvRGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICB2aXJ0dWFsIGNvbnN0IHZvaWQgKiBtYXliZUNvbnZlcnREZXZpY2VEYXRhKGNvbnN0IHZvaWQgKmF1ZGlvRGF0YSwgaW50MzJfdCAvKm51bUZyYW1lcyovKSB7CiAgICAgICAgIHJldHVybiBhdWRpb0RhdGE7CiAgICAgfQogCkBAIC01ODksNiArNjEwLDE0IEBACiAgICAgICAgIG1Db250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOwogICAgIH0KIAorICAgIHZvaWQgc2V0U3BhdGlhbGl6YXRpb25CZWhhdmlvcihhYXVkaW9fc3BhdGlhbGl6YXRpb25fYmVoYXZpb3JfdCBzcGF0aWFsaXphdGlvbkJlaGF2aW9yKSB7CisgICAgICAgIG1TcGF0aWFsaXphdGlvbkJlaGF2aW9yID0gc3BhdGlhbGl6YXRpb25CZWhhdmlvcjsKKyAgICB9CisKKyAgICB2b2lkIHNldElzQ29udGVudFNwYXRpYWxpemVkKGJvb2wgaXNDb250ZW50U3BhdGlhbGl6ZWQpIHsKKyAgICAgICAgbUlzQ29udGVudFNwYXRpYWxpemVkID0gaXNDb250ZW50U3BhdGlhbGl6ZWQ7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCiAgICAgICovCkBAIC02MTAsNiArNjM5LDIwIEBACiAgICAgICAgIG1Jc1ByaXZhY3lTZW5zaXRpdmUgPSBwcml2YWN5U2Vuc2l0aXZlOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgorICAgICAqLworICAgIHZvaWQgc2V0UmVxdWlyZU1vbm9CbGVuZChib29sIHJlcXVpcmVNb25vQmxlbmQpIHsKKyAgICAgICAgbVJlcXVpcmVNb25vQmxlbmQgPSByZXF1aXJlTW9ub0JsZW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgorICAgICAqLworICAgIHZvaWQgc2V0QXVkaW9CYWxhbmNlKGZsb2F0IGF1ZGlvQmFsYW5jZSkgeworICAgICAgICBtQXVkaW9CYWxhbmNlID0gYXVkaW9CYWxhbmNlOworICAgIH0KKwogICAgIHN0ZDo6c3RyaW5nIG1NZXRyaWNzSWQ7IC8vIHNldCBvbmNlIGR1cmluZyBvcGVuKCkKIAogICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgICAgIG1TdHJlYW1Mb2NrOwpAQCAtNjMzLDYgKzY3Niw3IEBACiAKICAgICAvLyBUaGVzZSBkbyBub3QgY2hhbmdlIGFmdGVyIG9wZW4oKS4KICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBhYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgICAgbUNoYW5uZWxNYXNrID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbURldmljZUlkID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgICBtU2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKQEAgLTY0NSw5ICs2ODksMTMgQEAKIAogICAgIGFhdWRpb191c2FnZV90ICAgICAgICAgICAgICBtVXNhZ2UgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCAgICAgICBtQ29udGVudFR5cGUgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19zcGF0aWFsaXphdGlvbl9iZWhhdmlvcl90IG1TcGF0aWFsaXphdGlvbkJlaGF2aW9yID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSXNDb250ZW50U3BhdGlhbGl6ZWQgPSBmYWxzZTsKICAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgICAgICAgbUlucHV0UHJlc2V0ICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IG1BbGxvd2VkQ2FwdHVyZVBvbGljeSA9IEFBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUlzUHJpdmFjeVNlbnNpdGl2ZSA9IGZhbHNlOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtUmVxdWlyZU1vbm9CbGVuZCA9IGZhbHNlOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9CYWxhbmNlID0gMDsKIAogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCmluZGV4IGUwMTU1OTIuLmExMDBhYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCkBAIC0yMCw5ICsyMCwxNCBAQAogCiAjaW5jbHVkZSA8bmV3PgogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvVGVzdGluZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeUluZm8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3lUeXBlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmgiCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmgiCkBAIC0zNSw2ICs0MCwxMCBAQAogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCit1c2luZyBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5OwordXNpbmcgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm87Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZTsKKwogI2RlZmluZSBBQVVESU9fTU1BUF9QT0xJQ1lfREVGQVVMVCAgICAgICAgICAgICBBQVVESU9fUE9MSUNZX05FVkVSCiAjZGVmaW5lIEFBVURJT19NTUFQX0VYQ0xVU0lWRV9QT0xJQ1lfREVGQVVMVCAgIEFBVURJT19QT0xJQ1lfTkVWRVIKIApAQCAtNTMsMTYgKzYyLDEwIEBACiAvKgogICogQXVkaW9TdHJlYW1CdWlsZGVyCiAgKi8KLUF1ZGlvU3RyZWFtQnVpbGRlcjo6QXVkaW9TdHJlYW1CdWlsZGVyKCkgewotfQotCi1BdWRpb1N0cmVhbUJ1aWxkZXI6On5BdWRpb1N0cmVhbUJ1aWxkZXIoKSB7Ci19Ci0KIHN0YXRpYyBhYXVkaW9fcmVzdWx0X3QgYnVpbGRlcl9jcmVhdGVTdHJlYW0oYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRyeU1NYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnNwPEF1ZGlvU3RyZWFtPiAmc3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAvKnNoYXJpbmdNb2RlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdHJ5TU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6c3A8QXVkaW9TdHJlYW0+ICZzdHJlYW0pIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogCiAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHsKQEAgLTkyLDYgKzk1LDM3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorbmFtZXNwYWNlIHsKKworYWF1ZGlvX3BvbGljeV90IGFpZGwybGVnYWN5X2FhdWRpb19wb2xpY3koQXVkaW9NTWFwUG9saWN5IGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBBdWRpb01NYXBQb2xpY3k6Ok5FVkVSOgorICAgICAgICAgICAgcmV0dXJuIEFBVURJT19QT0xJQ1lfTkVWRVI7CisgICAgICAgIGNhc2UgQXVkaW9NTWFwUG9saWN5OjpBVVRPOgorICAgICAgICAgICAgcmV0dXJuIEFBVURJT19QT0xJQ1lfQVVUTzsKKyAgICAgICAgY2FzZSBBdWRpb01NYXBQb2xpY3k6OkFMV0FZUzoKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fUE9MSUNZX0FMV0FZUzsKKyAgICAgICAgY2FzZSBBdWRpb01NYXBQb2xpY3k6OlVOU1BFQ0lGSUVEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEFBVURJT19VTlNQRUNJRklFRDsKKyAgICB9Cit9CisKKy8vIFRoZSBhYXVkaW8gcG9saWN5IHdpbGwgYmUgQUxXQVlTLCBORVZFUiwgVU5TUEVDSUZJRUQgb25seSB3aGVuIGFsbCBwb2xpY3kgaW5mbyBhcmUKKy8vIEFMV0FZUywgTkVWRVIgb3IgVU5TUEVDSUZJRUQuIE90aGVyd2lzZSwgdGhlIGFhdWRpbyBwb2xpY3kgd2lsbCBiZSBBVVRPLgorYWF1ZGlvX3BvbGljeV90IGdldEFBdWRpb1BvbGljeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9NTWFwUG9saWN5SW5mbz4mIHBvbGljeUluZm9zKSB7CisgICAgaWYgKHBvbGljeUluZm9zLmVtcHR5KCkpIHJldHVybiBBQVVESU9fUE9MSUNZX0FVVE87CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBwb2xpY3lJbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAocG9saWN5SW5mb3MuYXQoaSkubW1hcFBvbGljeSAhPSBwb2xpY3lJbmZvcy5hdCgwKS5tbWFwUG9saWN5KSB7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX1BPTElDWV9BVVRPOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhaWRsMmxlZ2FjeV9hYXVkaW9fcG9saWN5KHBvbGljeUluZm9zLmF0KDApLm1tYXBQb2xpY3kpOworfQorCit9IC8vIG5hbWVzcGFjZQorCiAvLyBUcnkgdG8gb3BlbiB1c2luZyBNTUFQIHBhdGggaWYgdGhhdCBpcyBhbGxvd2VkLgogLy8gRmFsbCBiYWNrIHRvIExlZ2FjeSBwYXRoIGlmIE1NQVAgbm90IGF2YWlsYWJsZS4KIC8vIEV4YWN0IGJlaGF2aW9yIGlzIGNvbnRyb2xsZWQgYnkgTU1hcFBvbGljeS4KQEAgLTExMCwyNSArMTQ0LDMyIEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgc3RkOjp2ZWN0b3I8QXVkaW9NTWFwUG9saWN5SW5mbz4gcG9saWN5SW5mb3M7CiAgICAgLy8gVGhlIEFQSSBzZXR0aW5nIGlzIHRoZSBoaWdoZXN0IHByaW9yaXR5LgogICAgIGFhdWRpb19wb2xpY3lfdCBtbWFwUG9saWN5ID0gQXVkaW9HbG9iYWxfZ2V0TU1hcFBvbGljeSgpOwogICAgIC8vIElmIG5vdCBzcGVjaWZpZWQgdGhlbiBnZXQgZnJvbSBhIHN5c3RlbSBwcm9wZXJ0eS4KLSAgICBpZiAobW1hcFBvbGljeSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgbW1hcFBvbGljeSA9IEFBdWRpb1Byb3BlcnR5X2dldE1NYXBQb2xpY3koKTsKKyAgICBpZiAobW1hcFBvbGljeSA9PSBBQVVESU9fVU5TUEVDSUZJRUQgJiYgYW5kcm9pZDo6QXVkaW9TeXN0ZW06OmdldE1tYXBQb2xpY3lJbmZvKAorICAgICAgICAgICAgICAgIEF1ZGlvTU1hcFBvbGljeVR5cGU6OkRFRkFVTFQsICZwb2xpY3lJbmZvcykgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbW1hcFBvbGljeSA9IGdldEFBdWRpb1BvbGljeShwb2xpY3lJbmZvcyk7CiAgICAgfQogICAgIC8vIElmIHN0aWxsIG5vdCBzcGVjaWZpZWQgdGhlbiB1c2UgdGhlIGRlZmF1bHQuCiAgICAgaWYgKG1tYXBQb2xpY3kgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgIG1tYXBQb2xpY3kgPSBBQVVESU9fTU1BUF9QT0xJQ1lfREVGQVVMVDsKICAgICB9CiAKLSAgICBpbnQzMl90IG1hcEV4Y2x1c2l2ZVBvbGljeSA9IEFBdWRpb1Byb3BlcnR5X2dldE1NYXBFeGNsdXNpdmVQb2xpY3koKTsKLSAgICBpZiAobWFwRXhjbHVzaXZlUG9saWN5ID09IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBtYXBFeGNsdXNpdmVQb2xpY3kgPSBBQVVESU9fTU1BUF9FWENMVVNJVkVfUE9MSUNZX0RFRkFVTFQ7CisgICAgcG9saWN5SW5mb3MuY2xlYXIoKTsKKyAgICBhYXVkaW9fcG9saWN5X3QgbW1hcEV4Y2x1c2l2ZVBvbGljeSA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBpZiAoYW5kcm9pZDo6QXVkaW9TeXN0ZW06OmdldE1tYXBQb2xpY3lJbmZvKAorICAgICAgICAgICAgQXVkaW9NTWFwUG9saWN5VHlwZTo6RVhDTFVTSVZFLCAmcG9saWN5SW5mb3MpID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1tYXBFeGNsdXNpdmVQb2xpY3kgPSBnZXRBQXVkaW9Qb2xpY3kocG9saWN5SW5mb3MpOworICAgIH0KKyAgICBpZiAobW1hcEV4Y2x1c2l2ZVBvbGljeSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgbW1hcEV4Y2x1c2l2ZVBvbGljeSA9IEFBVURJT19NTUFQX0VYQ0xVU0lWRV9QT0xJQ1lfREVGQVVMVDsKICAgICB9CiAKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUgPSBnZXRTaGFyaW5nTW9kZSgpOwogICAgIGlmICgoc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpCi0gICAgICAgICYmIChtYXBFeGNsdXNpdmVQb2xpY3kgPT0gQUFVRElPX1BPTElDWV9ORVZFUikpIHsKKyAgICAgICAgJiYgKG1tYXBFeGNsdXNpdmVQb2xpY3kgPT0gQUFVRElPX1BPTElDWV9ORVZFUikpIHsKICAgICAgICAgQUxPR0QoIiVzKCkgRVhDTFVTSVZFIHNoYXJpbmcgbW9kZSBub3Qgc3VwcG9ydGVkLiBVc2UgU0hBUkVELiIsIF9fZnVuY19fKTsKICAgICAgICAgc2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKICAgICAgICAgc2V0U2hhcmluZ01vZGUoc2hhcmluZ01vZGUpOwpAQCAtMjY4LDggKzMwOSw4IEBACiAKIHZvaWQgQXVkaW9TdHJlYW1CdWlsZGVyOjpsb2dQYXJhbWV0ZXJzKCkgY29uc3QgewogICAgIC8vIFRoaXMgaXMgdmVyeSBoZWxwZnVsIGZvciBkZWJ1Z2dpbmcgaW4gdGhlIGZ1dHVyZS4gUGxlYXNlIGxlYXZlIGl0IGluLgotICAgIEFMT0dJKCJyYXRlICAgPSAlNmQsIGNoYW5uZWxzICA9ICVkLCBmb3JtYXQgICA9ICVkLCBzaGFyaW5nID0gJXMsIGRpciA9ICVzIiwKLSAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBnZXRGb3JtYXQoKSwKKyAgICBBTE9HSSgicmF0ZSAgID0gJTZkLCBjaGFubmVscyAgPSAlZCwgY2hhbm5lbE1hc2sgPSAlI3gsIGZvcm1hdCAgID0gJWQsIHNoYXJpbmcgPSAlcywgZGlyID0gJXMiLAorICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGdldENoYW5uZWxNYXNrKCksIGdldEZvcm1hdCgpLAogICAgICAgICAgIEFBdWRpb19jb252ZXJ0U2hhcmluZ01vZGVUb1Nob3J0VGV4dChnZXRTaGFyaW5nTW9kZSgpKSwKICAgICAgICAgICBBQXVkaW9fY29udmVydERpcmVjdGlvblRvVGV4dChnZXREaXJlY3Rpb24oKSkpOwogICAgIEFMT0dJKCJkZXZpY2UgPSAlNmQsIHNlc3Npb25JZCA9ICVkLCBwZXJmTW9kZSA9ICVkLCBjYWxsYmFjazogJXMgd2l0aCBmcmFtZXMgPSAlZCIsCkBAIC0yODAsOSArMzIxLDggQEAKICAgICAgICAgICBtRnJhbWVzUGVyRGF0YUNhbGxiYWNrKTsKICAgICBBTE9HSSgidXNhZ2UgID0gJTZkLCBjb250ZW50VHlwZSA9ICVkLCBpbnB1dFByZXNldCA9ICVkLCBhbGxvd2VkQ2FwdHVyZVBvbGljeSA9ICVkIiwKICAgICAgICAgICBnZXRVc2FnZSgpLCBnZXRDb250ZW50VHlwZSgpLCBnZXRJbnB1dFByZXNldCgpLCBnZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpKTsKLSAgICBBTE9HSSgicHJpdmFjeSBzZW5zaXRpdmUgPSAlcyIsIGlzUHJpdmFjeVNlbnNpdGl2ZSgpID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgQUxPR0koIm9wUGFja2FnZU5hbWUgPSAlcyIsICFnZXRPcFBhY2thZ2VOYW1lKCkuaGFzX3ZhbHVlKCkgPwotICAgICAgICAiKG51bGwpIiA6IGdldE9wUGFja2FnZU5hbWUoKS52YWx1ZSgpLmNfc3RyKCkpOwotICAgIEFMT0dJKCJhdHRyaWJ1dGlvblRhZyA9ICVzIiwgIWdldEF0dHJpYnV0aW9uVGFnKCkuaGFzX3ZhbHVlKCkgPwotICAgICAgICAiKG51bGwpIiA6IGdldEF0dHJpYnV0aW9uVGFnKCkudmFsdWUoKS5jX3N0cigpKTsKKyAgICBBTE9HSSgicHJpdmFjeSBzZW5zaXRpdmUgPSAlcywgb3BQYWNrYWdlTmFtZSA9ICVzLCBhdHRyaWJ1dGlvblRhZyA9ICVzIiwKKyAgICAgICAgICBpc1ByaXZhY3lTZW5zaXRpdmUoKSA/ICJ0cnVlIiA6ICJmYWxzZSIsCisgICAgICAgICAgIWdldE9wUGFja2FnZU5hbWUoKS5oYXNfdmFsdWUoKSA/ICIobnVsbCkiIDogZ2V0T3BQYWNrYWdlTmFtZSgpLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAhZ2V0QXR0cmlidXRpb25UYWcoKS5oYXNfdmFsdWUoKSA/ICIobnVsbCkiIDogZ2V0QXR0cmlidXRpb25UYWcoKS52YWx1ZSgpLmNfc3RyKCkpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oCmluZGV4IDlmOTMzNDEuLmY5MWMyNWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgKQEAgLTMxLDkgKzMxLDkgQEAKICAqLwogY2xhc3MgQXVkaW9TdHJlYW1CdWlsZGVyIDogcHVibGljIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgewogcHVibGljOgotICAgIEF1ZGlvU3RyZWFtQnVpbGRlcigpOworICAgIEF1ZGlvU3RyZWFtQnVpbGRlcigpID0gZGVmYXVsdDsKIAotICAgIH5BdWRpb1N0cmVhbUJ1aWxkZXIoKTsKKyAgICB+QXVkaW9TdHJlYW1CdWlsZGVyKCkgPSBkZWZhdWx0OwogCiAgICAgYm9vbCBpc1NoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaAppbmRleCAzNzU0OGYwLi43YjBhY2ExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKQEAgLTM4LDcgKzM4LDcgQEAKIAogY2xhc3MgRmlmb0J1ZmZlciB7CiBwdWJsaWM6Ci0gICAgRmlmb0J1ZmZlcihpbnQzMl90IGJ5dGVzUGVyRnJhbWUpOworICAgIGV4cGxpY2l0IEZpZm9CdWZmZXIoaW50MzJfdCBieXRlc1BlckZyYW1lKTsKIAogICAgIHZpcnR1YWwgfkZpZm9CdWZmZXIoKSA9IGRlZmF1bHQ7CiAKQEAgLTE2Miw2ICsxNjIsNiBAQAogICAgIHVpbnQ4X3QgKm1FeHRlcm5hbFN0b3JhZ2UgPSBudWxscHRyOwogfTsKIAotfSAgLy8gYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vRklGT19GSUZPX0JVRkZFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oCmluZGV4IDA1N2E5NGUuLmUxNWQ0NDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oCkBAIC0zNiw3ICszNiw3IEBACiAgICAgLCBtV3JpdGVDb3VudGVyKDApCiAgICAge30KIAotICAgIHZpcnR1YWwgfkZpZm9Db250cm9sbGVyKCkge30KKyAgICB2aXJ0dWFsIH5GaWZvQ29udHJvbGxlcigpID0gZGVmYXVsdDsKIAogICAgIC8vIFRPRE8gcmV2aWV3IHVzZSBvZiBtZW1vcnkgYmFycmllcnMsIHByb2JhYmx5IGluY29ycmVjdAogICAgIHZpcnR1YWwgZmlmb19jb3VudGVyX3QgZ2V0UmVhZENvdW50ZXIoKSBvdmVycmlkZSB7CkBAIC01Nyw2ICs1Nyw2IEBACiAgICAgc3RkOjphdG9taWM8Zmlmb19jb3VudGVyX3Q+IG1Xcml0ZUNvdW50ZXI7CiB9OwogCi19ICAvLyBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy9GSUZPX0ZJRk9fQ09OVFJPTExFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwCmluZGV4IDFkZWNlMGUuLmFkNmQwNDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwCkBAIC0yOSw5ICsyOSw2IEBACiB7CiB9CiAKLUZpZm9Db250cm9sbGVyQmFzZTo6fkZpZm9Db250cm9sbGVyQmFzZSgpIHsKLX0KLQogZmlmb19mcmFtZXNfdCBGaWZvQ29udHJvbGxlckJhc2U6OmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSB7CiAgICAgZmlmb19mcmFtZXNfdCB0ZW1wID0gMDsKICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KGdldFdyaXRlQ291bnRlcigpLCBnZXRSZWFkQ291bnRlcigpLCAmdGVtcCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmgKaW5kZXggMWVkYjhhMy4uMmE2MTczYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaApAQCAtNDMsNyArNDMsNyBAQAogICAgICAqLwogICAgIEZpZm9Db250cm9sbGVyQmFzZShmaWZvX2ZyYW1lc190IGNhcGFjaXR5LCBmaWZvX2ZyYW1lc190IHRocmVzaG9sZCk7CiAKLSAgICB2aXJ0dWFsIH5GaWZvQ29udHJvbGxlckJhc2UoKTsKKyAgICB2aXJ0dWFsIH5GaWZvQ29udHJvbGxlckJhc2UoKSA9IGRlZmF1bHQ7CiAKICAgICAvLyBBYnN0cmFjdCBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXMuCiAgICAgLyoqCkBAIC0xMjMsNiArMTIzLDYgQEAKICAgICBmaWZvX2ZyYW1lc190IG1UaHJlc2hvbGQ7CiB9OwogCi19ICAvLyBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gRklGT19GSUZPX0NPTlRST0xMRVJfQkFTRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJJbmRpcmVjdC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVySW5kaXJlY3QuaAppbmRleCBlYzQ4ZTU3Li5hNTkyMjVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJJbmRpcmVjdC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckluZGlyZWN0LmgKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICAgICAgc2V0UmVhZENvdW50ZXIoMCk7CiAgICAgICAgIHNldFdyaXRlQ291bnRlcigwKTsKICAgICB9Ci0gICAgdmlydHVhbCB+Rmlmb0NvbnRyb2xsZXJJbmRpcmVjdCgpIHt9OworICAgIHZpcnR1YWwgfkZpZm9Db250cm9sbGVySW5kaXJlY3QoKSA9IGRlZmF1bHQ7CiAKICAgICAvLyBUT0RPIHJldmlldyB1c2Ugb2YgbWVtb3J5IGJhcnJpZXJzLCBwcm9iYWJseSBpbmNvcnJlY3QKICAgICB2aXJ0dWFsIGZpZm9fY291bnRlcl90IGdldFJlYWRDb3VudGVyKCkgb3ZlcnJpZGUgewpAQCAtNjgsNiArNjgsNiBAQAogICAgIHN0ZDo6YXRvbWljPGZpZm9fY291bnRlcl90PiAqIG1Xcml0ZUNvdW50ZXJBZGRyZXNzOwogfTsKIAotfSAgLy8gYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vRklGT19GSUZPX0NPTlRST0xMRVJfSU5ESVJFQ1RfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NjdmZGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQzMl90IEF1ZGlvUHJvY2Vzc29yQmFzZTo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgewotICAgIGlmIChmcmFtZVBvc2l0aW9uID4gbUxhc3RGcmFtZVBvc2l0aW9uKSB7Ci0gICAgICAgIG1MYXN0RnJhbWVQb3NpdGlvbiA9IGZyYW1lUG9zaXRpb247Ci0gICAgICAgIG1GcmFtZXNWYWxpZCA9IG9uUHJvY2VzcyhmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOwotICAgIH0KLSAgICByZXR1cm4gbUZyYW1lc1ZhbGlkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQXVkaW9GbG9hdEJsb2NrUG9ydDo6QXVkaW9GbG9hdEJsb2NrUG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1BlckJsb2NrKQotICAgICAgICA6IEF1ZGlvUG9ydChwYXJlbnQsIHNhbXBsZXNQZXJGcmFtZSkKLSAgICAgICAgLCBtRnJhbWVzUGVyQmxvY2soZnJhbWVzUGVyQmxvY2spCi0gICAgICAgICwgbVNhbXBsZUJsb2NrKE5VTEwpIHsKLSAgICBpbnQzMl90IG51bUZsb2F0cyA9IGZyYW1lc1BlckJsb2NrICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7Ci0gICAgbVNhbXBsZUJsb2NrID0gbmV3IGZsb2F0W251bUZsb2F0c117MC4wZn07Ci19Ci0KLUF1ZGlvRmxvYXRCbG9ja1BvcnQ6On5BdWRpb0Zsb2F0QmxvY2tQb3J0KCkgewotICAgIGRlbGV0ZVtdIG1TYW1wbGVCbG9jazsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludDMyX3QgQXVkaW9GbG9hdE91dHB1dFBvcnQ6OnB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKLSAgICBudW1GcmFtZXMgPSBzdGQ6Om1pbihnZXRGcmFtZXNQZXJCbG9jaygpLCBudW1GcmFtZXMpOwotICAgIHJldHVybiBtUGFyZW50LnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Ci19Ci0KLS8vIFRoZXNlIG5lZWQgdG8gYmUgaW4gdGhlIC5jcHAgZmlsZSBiZWNhdXNlIG9mIGZvcndhcmQgY3Jvc3MgcmVmZXJlbmNlcy4KLXZvaWQgQXVkaW9GbG9hdE91dHB1dFBvcnQ6OmNvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCkgewotICAgIHBvcnQtPmNvbm5lY3QodGhpcyk7Ci19Ci0KLXZvaWQgQXVkaW9GbG9hdE91dHB1dFBvcnQ6OmRpc2Nvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCkgewotICAgIHBvcnQtPmRpc2Nvbm5lY3QodGhpcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQzMl90IEF1ZGlvRmxvYXRJbnB1dFBvcnQ6OnB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKLSAgICByZXR1cm4gKG1Db25uZWN0ZWQgPT0gTlVMTCkKLSAgICAgICAgICAgID8gc3RkOjptaW4oZ2V0RnJhbWVzUGVyQmxvY2soKSwgbnVtRnJhbWVzKQotICAgICAgICAgICAgOiBtQ29ubmVjdGVkLT5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOwotfQotCi1mbG9hdCAqQXVkaW9GbG9hdElucHV0UG9ydDo6Z2V0QmxvY2soKSB7Ci0gICAgaWYgKG1Db25uZWN0ZWQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQXVkaW9GbG9hdEJsb2NrUG9ydDo6Z2V0QmxvY2soKTsgLy8gbG9hZGVkIHVzaW5nIHNldFZhbHVlKCkKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbUNvbm5lY3RlZC0+Z2V0QmxvY2soKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQzMl90IEF1ZGlvU2luazo6cHVsbChpbnQzMl90IG51bUZyYW1lcykgewotICAgIGludDMyX3QgYWN0dWFsRnJhbWVzID0gaW5wdXQucHVsbERhdGEobUZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Ci0gICAgbUZyYW1lUG9zaXRpb24gKz0gYWN0dWFsRnJhbWVzOwotICAgIHJldHVybiBhY3R1YWxGcmFtZXM7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyOTMyZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogQXVkaW9Qcm9jZXNzb3JCYXNlLmgKLSAqCi0gKiBBdWRpbyBwcm9jZXNzaW5nIG5vZGUgYW5kIHBvcnRzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBzaW1wbGUgZGF0YSBmbG93IGdyYXBoLgotICovCi0KLSNpZm5kZWYgRkxPV0dSQVBIX0FVRElPX1BST0NFU1NPUl9CQVNFX0gKLSNkZWZpbmUgRkxPV0dSQVBIX0FVRElPX1BST0NFU1NPUl9CQVNFX0gKLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vLyBUT0RPIGNvbnNpZGVyIHB1Ymxpc2hpbmcgYWxsIGhlYWRlciBmaWxlcyB1bmRlciAiaW5jbHVkZS9saWJhYXVkaW8vRmxvd0dyYXBoLmgiCi0KLW5hbWVzcGFjZSBmbG93Z3JhcGggewotCi0vLyBEZWZhdWx0IGJsb2NrIHNpemUgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aGVuIHRoZSBBdWRpb0Zsb2F0QmxvY2tQb3J0IGlzIGNyZWF0ZWQuCi0vLyBJZiBpdCBpcyB0b28gc21hbGwgdGhlbiB3ZSB3aWxsIGhhdmUgdG9vIG11Y2ggb3ZlcmhlYWQgZnJvbSBzd2l0Y2hpbmcgYmV0d2VlbiBub2Rlcy4KLS8vIElmIGl0IGlzIHRvbyBoaWdoIHRoZW4gd2Ugd2lsbCB0aHJhc2ggdGhlIGNhY2hlcy4KLWNvbnN0ZXhwciBpbnQga0RlZmF1bHRCbG9ja1NpemUgPSA4OyAvLyBhcmJpdHJhcnkKLQotY2xhc3MgQXVkaW9GbG9hdElucHV0UG9ydDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNsYXNzIEF1ZGlvUHJvY2Vzc29yQmFzZSB7Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+QXVkaW9Qcm9jZXNzb3JCYXNlKCkgPSBkZWZhdWx0OwotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSBjdXN0b20gZnVuY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbiBpbmRleCBvZiBmaXJzdCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKLSAgICAgKiBAcGFyYW0gbnVtRnJhbWVzIG1heGltdW0gbnVtYmVyIG9mIGZyYW1lcyByZXF1ZXN0ZWQgZm9yIHByb2Nlc3NpbmcKLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgcHJvY2Vzc2VkCi0gICAgICovCi0gICAgdmlydHVhbCBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgZnJhbWVQb3NpdGlvbiBpcyBhdCBvciBhZnRlciB0aGUgbGFzdCBmcmFtZSBwb3NpdGlvbiB0aGVuIGNhbGwgb25Qcm9jZXNzKCkuCi0gICAgICogVGhpcyBwcmV2ZW50cyBpbmZpbml0ZSByZWN1cnNpb24gaW4gY2FzZSBvZiBjeWNsaWMgZ3JhcGhzLgotICAgICAqIEl0IGFsc28gcHJldmVudHMgbm9kZXMgdXBzdHJlYW0gZnJvbSBhIGJyYW5jaCBmcm9tIGJlaW5nIGV4ZWN1dGVkIHR3aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZyYW1lUG9zaXRpb24KLSAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIGludDMyX3QgcHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7Ci0KLXByb3RlY3RlZDoKLSAgICBpbnQ2NF90ICBtTGFzdEZyYW1lUG9zaXRpb24gPSAtMTsgLy8gU3RhcnQgYXQgLTEgc28gdGhhdCB0aGUgZmlyc3QgcHVsbCB3b3Jrcy4KLQotcHJpdmF0ZToKLSAgICBpbnQzMl90ICBtRnJhbWVzVmFsaWQgPSAwOyAvLyBudW0gdmFsaWQgZnJhbWVzIGluIHRoZSBibG9jawotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICAqIFRoaXMgaXMgYSBjb25uZWN0b3IgdGhhdCBhbGxvd3MgZGF0YSB0byBmbG93IGJldHdlZW4gbW9kdWxlcy4KLSAgKi8KLWNsYXNzIEF1ZGlvUG9ydCB7Ci1wdWJsaWM6Ci0gICAgQXVkaW9Qb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LCBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKLSAgICAgICAgICAgIDogbVBhcmVudChwYXJlbnQpCi0gICAgICAgICAgICAsIG1TYW1wbGVzUGVyRnJhbWUoc2FtcGxlc1BlckZyYW1lKSB7Ci0gICAgfQotCi0gICAgLy8gUG9ydHMgYXJlIG9mdGVuIGRlY2xhcmVkIHB1YmxpYy4gU28gbGV0J3MgbWFrZSB0aGVtIG5vbi1jb3B5YWJsZS4KLSAgICBBdWRpb1BvcnQoY29uc3QgQXVkaW9Qb3J0JikgPSBkZWxldGU7Ci0gICAgQXVkaW9Qb3J0JiBvcGVyYXRvcj0oY29uc3QgQXVkaW9Qb3J0JikgPSBkZWxldGU7Ci0KLSAgICBpbnQzMl90IGdldFNhbXBsZXNQZXJGcmFtZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TYW1wbGVzUGVyRnJhbWU7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgQXVkaW9Qcm9jZXNzb3JCYXNlICZtUGFyZW50OwotCi1wcml2YXRlOgotICAgIGNvbnN0IGludDMyX3QgICAgbVNhbXBsZXNQZXJGcmFtZSA9IDE7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiBUaGlzIHBvcnQgY29udGFpbnMgYSBmbG9hdCB0eXBlIGJ1ZmZlci4KLSAqIFRoZSBzaXplIGlzIGZyYW1lc1BlckJsb2NrICogc2FtcGxlc1BlckZyYW1lKS4KLSAqLwotY2xhc3MgQXVkaW9GbG9hdEJsb2NrUG9ydCAgOiBwdWJsaWMgQXVkaW9Qb3J0IHsKLXB1YmxpYzoKLSAgICBBdWRpb0Zsb2F0QmxvY2tQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmbVBhcmVudCwKLSAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1BlckJsb2NrID0ga0RlZmF1bHRCbG9ja1NpemUKLSAgICAgICAgICAgICAgICApOwotCi0gICAgdmlydHVhbCB+QXVkaW9GbG9hdEJsb2NrUG9ydCgpOwotCi0gICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCbG9jaygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1GcmFtZXNQZXJCbG9jazsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYnVmZmVyIGludGVybmFsIHRvIHRoZSBwb3J0IG9yIGZyb20gYSBjb25uZWN0ZWQgcG9ydAotICAgICAqLwotICAgIHZpcnR1YWwgZmxvYXQgKmdldEJsb2NrKCkgewotICAgICAgICByZXR1cm4gbVNhbXBsZUJsb2NrOwotICAgIH0KLQotCi1wcml2YXRlOgotICAgIGNvbnN0IGludDMyX3QgICAgbUZyYW1lc1BlckJsb2NrID0gMTsKLSAgICBmbG9hdCAgICAgICAgICAgKm1TYW1wbGVCbG9jayA9IG51bGxwdHI7IC8vIGFsbG9jYXRlZCBpbiBjb25zdHJ1Y3RvcgotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICAqIFRoZSByZXN1bHRzIG9mIGEgbW9kdWxlIGFyZSBzdG9yZWQgaW4gdGhlIGJ1ZmZlciBvZiB0aGUgb3V0cHV0IHBvcnRzLgotICAqLwotY2xhc3MgQXVkaW9GbG9hdE91dHB1dFBvcnQgOiBwdWJsaWMgQXVkaW9GbG9hdEJsb2NrUG9ydCB7Ci1wdWJsaWM6Ci0gICAgQXVkaW9GbG9hdE91dHB1dFBvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQotICAgICAgICAgICAgOiBBdWRpb0Zsb2F0QmxvY2tQb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB+QXVkaW9GbG9hdE91dHB1dFBvcnQoKSA9IGRlZmF1bHQ7Ci0KLSAgICB1c2luZyBBdWRpb0Zsb2F0QmxvY2tQb3J0OjpnZXRCbG9jazsKLQotICAgIC8qKgotICAgICAqIENhbGwgdGhlIHBhcmVudCBtb2R1bGUncyBvblByb2Nlc3MoKSBtZXRob2QuCi0gICAgICogVGhhdCBtYXkgcHVsbCBkYXRhIGZyb20gaXRzIGlucHV0cyBhbmQgcmVjdXJzaXZlbHkKLSAgICAgKiBwcm9jZXNzIHRoZSBlbnRpcmUgZ3JhcGguCi0gICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHB1bGxlZAotICAgICAqLwotICAgIGludDMyX3QgcHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25uZWN0IHRvIHRoZSBpbnB1dCBvZiBhbm90aGVyIG1vZHVsZS4KLSAgICAgKiBBbiBpbnB1dCBwb3J0IGNhbiBvbmx5IGhhdmUgb25lIGNvbm5lY3Rpb24uCi0gICAgICogQW4gb3V0cHV0IHBvcnQgY2FuIGhhdmUgbXVsdGlwbGUgY29ubmVjdGlvbnMuCi0gICAgICogSWYgeW91IGNvbm5lY3QgYSBzZWNvbmQgb3V0cHV0IHBvcnQgdG8gYW4gaW5wdXQgcG9ydAotICAgICAqIHRoZW4gaXQgb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgY29ubmVjdGlvbi4KLSAgICAgKgotICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLiBEbyBub3QgbW9kaWZ5IHRoZSBncmFwaCB0b3BvbG9neSBmb3JtIGFub3RoZXIgdGhyZWFkIHdoaWxlIHJ1bm5pbmcuCi0gICAgICovCi0gICAgdm9pZCBjb25uZWN0KEF1ZGlvRmxvYXRJbnB1dFBvcnQgKnBvcnQpOwotCi0gICAgLyoqCi0gICAgICogRGlzY29ubmVjdCBmcm9tIHRoZSBpbnB1dCBvZiBhbm90aGVyIG1vZHVsZS4KLSAgICAgKiBUaGlzIG5vdCB0aHJlYWQgc2FmZS4KLSAgICAgKi8KLSAgICB2b2lkIGRpc2Nvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCk7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2xhc3MgQXVkaW9GbG9hdElucHV0UG9ydCA6IHB1YmxpYyBBdWRpb0Zsb2F0QmxvY2tQb3J0IHsKLXB1YmxpYzoKLSAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LCBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKLSAgICAgICAgICAgIDogQXVkaW9GbG9hdEJsb2NrUG9ydChwYXJlbnQsIHNhbXBsZXNQZXJGcmFtZSkgewotICAgIH0KLQotICAgIHZpcnR1YWwgfkF1ZGlvRmxvYXRJbnB1dFBvcnQoKSA9IGRlZmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBJZiBjb25uZWN0ZWQgdG8gYW4gb3V0cHV0IHBvcnQgdGhlbiB0aGlzIHdpbGwgcmV0dXJuCi0gICAgICogdGhhdCBvdXRwdXQgcG9ydHMgYnVmZmVycy4KLSAgICAgKiBJZiBub3QgY29ubmVjdGVkIHRoZW4gaXQgcmV0dXJucyB0aGUgaW5wdXQgcG9ydHMgb3duIGJ1ZmZlcgotICAgICAqIHdoaWNoIGNhbiBiZSBsb2FkZWQgdXNpbmcgc2V0VmFsdWUoKS4KLSAgICAgKi8KLSAgICBmbG9hdCAqZ2V0QmxvY2soKSBvdmVycmlkZTsKLQotICAgIC8qKgotICAgICAqIFB1bGwgZGF0YSBmcm9tIGFueSBvdXRwdXQgcG9ydCB0aGF0IGlzIGNvbm5lY3RlZC4KLSAgICAgKi8KLSAgICBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOwotCi0gICAgLyoqCi0gICAgICogV3JpdGUgZXZlcnkgdmFsdWUgb2YgdGhlIGZsb2F0IGJ1ZmZlci4KLSAgICAgKiBUaGlzIHZhbHVlIHdpbGwgYmUgaWdub3JlZCBpZiBhbiBvdXRwdXQgcG9ydCBpcyBjb25uZWN0ZWQKLSAgICAgKiB0byB0aGlzIHBvcnQuCi0gICAgICovCi0gICAgdm9pZCBzZXRWYWx1ZShmbG9hdCB2YWx1ZSkgewotICAgICAgICBpbnQgbnVtRmxvYXRzID0ga0RlZmF1bHRCbG9ja1NpemUgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKLSAgICAgICAgZmxvYXQgKmJ1ZmZlciA9IGdldEJsb2NrKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRmxvYXRzOyBpKyspIHsKLSAgICAgICAgICAgICpidWZmZXIrKyA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29ubmVjdCB0byB0aGUgb3V0cHV0IG9mIGFub3RoZXIgbW9kdWxlLgotICAgICAqIEFuIGlucHV0IHBvcnQgY2FuIG9ubHkgaGF2ZSBvbmUgY29ubmVjdGlvbi4KLSAgICAgKiBBbiBvdXRwdXQgcG9ydCBjYW4gaGF2ZSBtdWx0aXBsZSBjb25uZWN0aW9ucy4KLSAgICAgKiBUaGlzIG5vdCB0aHJlYWQgc2FmZS4KLSAgICAgKi8KLSAgICB2b2lkIGNvbm5lY3QoQXVkaW9GbG9hdE91dHB1dFBvcnQgKnBvcnQpIHsKLSAgICAgICAgYXNzZXJ0KGdldFNhbXBsZXNQZXJGcmFtZSgpID09IHBvcnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKLSAgICAgICAgbUNvbm5lY3RlZCA9IHBvcnQ7Ci0gICAgfQotCi0gICAgdm9pZCBkaXNjb25uZWN0KEF1ZGlvRmxvYXRPdXRwdXRQb3J0ICpwb3J0KSB7Ci0gICAgICAgIGFzc2VydChtQ29ubmVjdGVkID09IHBvcnQpOwotICAgICAgICAodm9pZCkgcG9ydDsKLSAgICAgICAgbUNvbm5lY3RlZCA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgdm9pZCBkaXNjb25uZWN0KCkgewotICAgICAgICBtQ29ubmVjdGVkID0gbnVsbHB0cjsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgKm1Db25uZWN0ZWQgPSBudWxscHRyOwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNsYXNzIEF1ZGlvU291cmNlIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQXVkaW9Tb3VyY2UoaW50MzJfdCBjaGFubmVsQ291bnQpCi0gICAgICAgICAgICA6IG91dHB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB+QXVkaW9Tb3VyY2UoKSA9IGRlZmF1bHQ7Ci0KLSAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7Ci0KLSAgICB2b2lkIHNldERhdGEoY29uc3Qgdm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKLSAgICAgICAgbURhdGEgPSBkYXRhOwotICAgICAgICBtU2l6ZUluRnJhbWVzID0gbnVtRnJhbWVzOwotICAgICAgICBtRnJhbWVJbmRleCA9IDA7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgY29uc3Qgdm9pZCAqbURhdGEgPSBudWxscHRyOwotICAgIGludDMyX3QgICAgIG1TaXplSW5GcmFtZXMgPSAwOyAvLyBudW1iZXIgb2YgZnJhbWVzIGluIG1EYXRhCi0gICAgaW50MzJfdCAgICAgbUZyYW1lSW5kZXggPSAwOyAvLyBpbmRleCBvZiBuZXh0IGZyYW1lIHRvIGJlIHByb2Nlc3NlZAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNsYXNzIEF1ZGlvU2luayA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgewotcHVibGljOgotICAgIGV4cGxpY2l0IEF1ZGlvU2luayhpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgICAgIDogaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgewotICAgIH0KLQotICAgIHZpcnR1YWwgfkF1ZGlvU2luaygpID0gZGVmYXVsdDsKLQotICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7Ci0KLSAgICAvKioKLSAgICAgKiBEbyBub3RoaW5nLiBUaGUgd29yayBoYXBwZW5zIGluIHRoZSByZWFkKCkgbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIGZyYW1lUG9zaXRpb24gaW5kZXggb2YgZmlyc3QgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICogQHBhcmFtIG51bUZyYW1lcwotICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwcm9jZXNzZWQKLSAgICAgKi8KLSAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZSB7Ci0gICAgICAgICh2b2lkKSBmcmFtZVBvc2l0aW9uOwotICAgICAgICAodm9pZCkgbnVtRnJhbWVzOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9OwotCi0gICAgdmlydHVhbCBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpID0gMDsKLQotcHJvdGVjdGVkOgotICAgIGludDMyX3QgcHVsbChpbnQzMl90IG51bUZyYW1lcyk7Ci0KLXByaXZhdGU6Ci0gICAgaW50NjRfdCBtRnJhbWVQb3NpdGlvbiA9IDA7Ci19OwotCi19IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KLQotI2VuZGlmIC8qIEZMT1dHUkFQSF9BVURJT19QUk9DRVNTT1JfQkFTRV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DaGFubmVsQ291bnRDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2hhbm5lbENvdW50Q29udmVydGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzgwNDI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2hhbm5lbENvdW50Q29udmVydGVyLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgorI2luY2x1ZGUgIkNoYW5uZWxDb3VudENvbnZlcnRlci5oIgorCit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOworCitDaGFubmVsQ291bnRDb252ZXJ0ZXI6OkNoYW5uZWxDb3VudENvbnZlcnRlcigKKyAgICAgICAgaW50MzJfdCBpbnB1dENoYW5uZWxDb3VudCwKKyAgICAgICAgaW50MzJfdCBvdXRwdXRDaGFubmVsQ291bnQpCisgICAgICAgIDogaW5wdXQoKnRoaXMsIGlucHV0Q2hhbm5lbENvdW50KQorICAgICAgICAsIG91dHB1dCgqdGhpcywgb3V0cHV0Q2hhbm5lbENvdW50KSB7Cit9CisKK0NoYW5uZWxDb3VudENvbnZlcnRlcjo6fkNoYW5uZWxDb3VudENvbnZlcnRlcigpID0gZGVmYXVsdDsKKworaW50MzJfdCBDaGFubmVsQ291bnRDb252ZXJ0ZXI6Om9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJ1ZmZlcigpOworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QnVmZmVyKCk7CisgICAgaW50MzJfdCBpbnB1dENoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIGludDMyX3Qgb3V0cHV0Q2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKKyAgICAgICAgaW50IGlucHV0Q2hhbm5lbCA9IDA7CisgICAgICAgIGZvciAoaW50IG91dHB1dENoYW5uZWwgPSAwOyBvdXRwdXRDaGFubmVsIDwgb3V0cHV0Q2hhbm5lbENvdW50OyBvdXRwdXRDaGFubmVsKyspIHsKKyAgICAgICAgICAgIC8vIENvcHkgaW5wdXQgY2hhbm5lbHMgdG8gb3V0cHV0IGNoYW5uZWxzLgorICAgICAgICAgICAgLy8gV3JhcCBpZiB3ZSBydW4gb3V0IG9mIGlucHV0cy4KKyAgICAgICAgICAgIC8vIERpc2NhcmQgaWYgd2UgcnVuIG91dCBvZiBvdXRwdXRzLgorICAgICAgICAgICAgb3V0cHV0QnVmZmVyW291dHB1dENoYW5uZWxdID0gaW5wdXRCdWZmZXJbaW5wdXRDaGFubmVsXTsKKyAgICAgICAgICAgIGlucHV0Q2hhbm5lbCA9IChpbnB1dENoYW5uZWwgPT0gaW5wdXRDaGFubmVsQ291bnQpCisgICAgICAgICAgICAgICAgICAgID8gMCA6IGlucHV0Q2hhbm5lbCArIDE7CisgICAgICAgIH0KKyAgICAgICAgaW5wdXRCdWZmZXIgKz0gaW5wdXRDaGFubmVsQ291bnQ7CisgICAgICAgIG91dHB1dEJ1ZmZlciArPSBvdXRwdXRDaGFubmVsQ291bnQ7CisgICAgfQorICAgIHJldHVybiBudW1GcmFtZXM7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NoYW5uZWxDb3VudENvbnZlcnRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2hhbm5lbENvdW50Q29udmVydGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4ZjRkNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NoYW5uZWxDb3VudENvbnZlcnRlci5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX0NIQU5ORUxfQ09VTlRfQ09OVkVSVEVSX0gKKyNkZWZpbmUgRkxPV0dSQVBIX0NIQU5ORUxfQ09VTlRfQ09OVkVSVEVSX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgorCituYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoIHsKKworLyoqCisgKiBDaGFuZ2UgdGhlIG51bWJlciBvZiBudW1iZXIgb2YgY2hhbm5lbHMgd2l0aG91dCBtaXhpbmcuCisgKiBXaGVuIGluY3JlYXNpbmcgdGhlIGNoYW5uZWwgY291bnQsIGR1cGxpY2F0ZSBpbnB1dCBjaGFubmVscy4KKyAqIFdoZW4gZGVjcmVhc2luZyB0aGUgY2hhbm5lbCBjb3VudCwgZHJvcCBpbnB1dCBjaGFubmVscy4KKyAqLworICAgIGNsYXNzIENoYW5uZWxDb3VudENvbnZlcnRlciA6IHB1YmxpYyBGbG93R3JhcGhOb2RlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IENoYW5uZWxDb3VudENvbnZlcnRlcigKKyAgICAgICAgICAgICAgICBpbnQzMl90IGlucHV0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgIGludDMyX3Qgb3V0cHV0Q2hhbm5lbENvdW50KTsKKworICAgICAgICB2aXJ0dWFsIH5DaGFubmVsQ291bnRDb252ZXJ0ZXIoKTsKKworICAgICAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICAgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiAiQ2hhbm5lbENvdW50Q29udmVydGVyIjsKKyAgICAgICAgfQorCisgICAgICAgIEZsb3dHcmFwaFBvcnRGbG9hdElucHV0IGlucHV0OworICAgICAgICBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQgb3V0cHV0OworICAgIH07CisKK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfQ0hBTk5FTF9DT1VOVF9DT05WRVJURVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuY3BwCmluZGV4IGJkOWMyMmEuLmM2YWQwYjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAKQEAgLTE2LDI1ICsxNiwyMyBAQAogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKICNpbmNsdWRlICJDbGlwVG9SYW5nZS5oIgogCi11c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKIAogQ2xpcFRvUmFuZ2U6OkNsaXBUb1JhbmdlKGludDMyX3QgY2hhbm5lbENvdW50KQotICAgICAgICA6IGlucHV0KCp0aGlzLCBjaGFubmVsQ291bnQpCi0gICAgICAgICwgb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgOiBGbG93R3JhcGhGaWx0ZXIoY2hhbm5lbENvdW50KSB7CiB9CiAKLWludDMyX3QgQ2xpcFRvUmFuZ2U6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBpbnB1dC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOwotICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJsb2NrKCk7Ci0gICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworaW50MzJfdCBDbGlwVG9SYW5nZTo6b25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QnVmZmVyKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCdWZmZXIoKTsKIAotICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBudW1GcmFtZXMgKiBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CiAgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9IHN0ZDo6bWluKG1NYXhpbXVtLCBzdGQ6Om1heChtTWluaW11bSwgKmlucHV0QnVmZmVyKyspKTsKICAgICB9CiAKLSAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworICAgIHJldHVybiBudW1GcmFtZXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaAppbmRleCA5ZWVmMjU0Li4yZmRkZWVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmgKQEAgLTIxLDIyICsyMSwyMiBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogCi1uYW1lc3BhY2UgZmxvd2dyYXBoIHsKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggewogCiAvLyBUaGlzIGlzIDMgZEIsICgxMF4oMy8yMCkpLCB0byBtYXRjaCB0aGUgbWF4aW11bSBoZWFkcm9vbSBpbiBBdWRpb1RyYWNrIGZvciBmbG9hdCBkYXRhLgogLy8gSXQgaXMgZGVzaWduZWQgdG8gYWxsb3cgb2NjYXNpb25hbCB0cmFuc2llbnQgcGVha3MuCiBjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRNYXhIZWFkcm9vbSA9IDEuNDEyNTM3NTRmOwogY29uc3RleHByIGZsb2F0IGtEZWZhdWx0TWluSGVhZHJvb20gPSAta0RlZmF1bHRNYXhIZWFkcm9vbTsKIAotY2xhc3MgQ2xpcFRvUmFuZ2UgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK2NsYXNzIENsaXBUb1JhbmdlIDogcHVibGljIEZsb3dHcmFwaEZpbHRlciB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgQ2xpcFRvUmFuZ2UoaW50MzJfdCBjaGFubmVsQ291bnQpOwogCiAgICAgdmlydHVhbCB+Q2xpcFRvUmFuZ2UoKSA9IGRlZmF1bHQ7CiAKLSAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CiAKICAgICB2b2lkIHNldE1pbmltdW0oZmxvYXQgbWluKSB7CiAgICAgICAgIG1NaW5pbXVtID0gbWluOwpAQCAtNTQsMTQgKzU0LDE1IEBACiAgICAgICAgIHJldHVybiBtTWF4aW11bTsKICAgICB9CiAKLSAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OwotICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IG91dHB1dDsKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIkNsaXBUb1JhbmdlIjsKKyAgICB9CiAKIHByaXZhdGU6CiAgICAgZmxvYXQgbU1pbmltdW0gPSBrRGVmYXVsdE1pbkhlYWRyb29tOwogICAgIGZsb2F0IG1NYXhpbXVtID0ga0RlZmF1bHRNYXhIZWFkcm9vbTsKIH07CiAKLX0gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCiAKICNlbmRpZiAvL0ZMT1dHUkFQSF9DTElQX1RPX1JBTkdFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0Zsb3dHcmFwaE5vZGUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvRmxvd0dyYXBoTm9kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyYWJlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0Zsb3dHcmFwaE5vZGUuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgorCit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCBGbG93R3JhcGhOb2RlOjpwdWxsRGF0YShpbnQzMl90IG51bUZyYW1lcywgaW50NjRfdCBjYWxsQ291bnQpIHsKKyAgICBpbnQzMl90IGZyYW1lQ291bnQgPSBudW1GcmFtZXM7CisgICAgLy8gUHJldmVudCByZWN1cnNpb24gYW5kIG11bHRpcGxlIGV4ZWN1dGlvbiBvZiBub2Rlcy4KKyAgICBpZiAoY2FsbENvdW50ID4gbUxhc3RDYWxsQ291bnQpIHsKKyAgICAgICAgbUxhc3RDYWxsQ291bnQgPSBjYWxsQ291bnQ7CisgICAgICAgIGlmIChtRGF0YVB1bGxlZEF1dG9tYXRpY2FsbHkpIHsKKyAgICAgICAgICAgIC8vIFB1bGwgZnJvbSBhbGwgdGhlIHVwc3RyZWFtIG5vZGVzLgorICAgICAgICAgICAgZm9yIChhdXRvICZwb3J0IDogbUlucHV0UG9ydHMpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIGZpeCBidWcgb2YgbGVhdmluZyB1bnVzZWQgZGF0YSBpbiBzb21lIHBvcnRzIGlmIHVzaW5nIG11bHRpcGxlIEF1ZGlvU291cmNlCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCA9IHBvcnQuZ2V0KCkucHVsbERhdGEoY2FsbENvdW50LCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZnJhbWVDb3VudCA+IDApIHsKKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSBvblByb2Nlc3MoZnJhbWVDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICB9IGVsc2UgeworICAgICAgICBmcmFtZUNvdW50ID0gbUxhc3RGcmFtZUNvdW50OworICAgIH0KKyAgICByZXR1cm4gZnJhbWVDb3VudDsKK30KKwordm9pZCBGbG93R3JhcGhOb2RlOjpwdWxsUmVzZXQoKSB7CisgICAgaWYgKCFtQmxvY2tSZWN1cnNpb24pIHsKKyAgICAgICAgbUJsb2NrUmVjdXJzaW9uID0gdHJ1ZTsgLy8gZm9yIGN5Y2xpYyBncmFwaHMKKyAgICAgICAgLy8gUHVsbCByZXNldCBmcm9tIGFsbCB0aGUgdXBzdHJlYW0gbm9kZXMuCisgICAgICAgIGZvciAoYXV0byAmcG9ydCA6IG1JbnB1dFBvcnRzKSB7CisgICAgICAgICAgICBwb3J0LmdldCgpLnB1bGxSZXNldCgpOworICAgICAgICB9CisgICAgICAgIG1CbG9ja1JlY3Vyc2lvbiA9IGZhbHNlOworICAgICAgICByZXNldCgpOworICAgIH0KK30KKwordm9pZCBGbG93R3JhcGhOb2RlOjpyZXNldCgpIHsKKyAgICBtTGFzdEZyYW1lQ291bnQgPSAwOworICAgIG1MYXN0Q2FsbENvdW50ID0ga0luaXRpYWxDYWxsQ291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitGbG93R3JhcGhQb3J0RmxvYXQ6OkZsb3dHcmFwaFBvcnRGbG9hdChGbG93R3JhcGhOb2RlICZwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCdWZmZXIpCisgICAgICAgIDogRmxvd0dyYXBoUG9ydChwYXJlbnQsIHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgLCBtRnJhbWVzUGVyQnVmZmVyKGZyYW1lc1BlckJ1ZmZlcikKKyAgICAgICAgLCBtQnVmZmVyKG51bGxwdHIpIHsKKyAgICBzaXplX3QgbnVtRmxvYXRzID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihmcmFtZXNQZXJCdWZmZXIpICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgbUJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8ZmxvYXRbXT4obnVtRmxvYXRzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgRmxvd0dyYXBoUG9ydEZsb2F0T3V0cHV0OjpwdWxsRGF0YShpbnQ2NF90IGNhbGxDb3VudCwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBudW1GcmFtZXMgPSBzdGQ6Om1pbihnZXRGcmFtZXNQZXJCdWZmZXIoKSwgbnVtRnJhbWVzKTsKKyAgICByZXR1cm4gbUNvbnRhaW5pbmdOb2RlLnB1bGxEYXRhKG51bUZyYW1lcywgY2FsbENvdW50KTsKK30KKwordm9pZCBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQ6OnB1bGxSZXNldCgpIHsKKyAgICBtQ29udGFpbmluZ05vZGUucHVsbFJlc2V0KCk7Cit9CisKKy8vIFRoZXNlIG5lZWQgdG8gYmUgaW4gdGhlIC5jcHAgZmlsZSBiZWNhdXNlIG9mIGZvcndhcmQgY3Jvc3MgcmVmZXJlbmNlcy4KK3ZvaWQgRmxvd0dyYXBoUG9ydEZsb2F0T3V0cHV0Ojpjb25uZWN0KEZsb3dHcmFwaFBvcnRGbG9hdElucHV0ICpwb3J0KSB7CisgICAgcG9ydC0+Y29ubmVjdCh0aGlzKTsKK30KKwordm9pZCBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQ6OmRpc2Nvbm5lY3QoRmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQgKnBvcnQpIHsKKyAgICBwb3J0LT5kaXNjb25uZWN0KHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCBGbG93R3JhcGhQb3J0RmxvYXRJbnB1dDo6cHVsbERhdGEoaW50NjRfdCBjYWxsQ291bnQsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgcmV0dXJuIChtQ29ubmVjdGVkID09IG51bGxwdHIpCisgICAgICAgICAgICA/IHN0ZDo6bWluKGdldEZyYW1lc1BlckJ1ZmZlcigpLCBudW1GcmFtZXMpCisgICAgICAgICAgICA6IG1Db25uZWN0ZWQtPnB1bGxEYXRhKGNhbGxDb3VudCwgbnVtRnJhbWVzKTsKK30KK3ZvaWQgRmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQ6OnB1bGxSZXNldCgpIHsKKyAgICBpZiAobUNvbm5lY3RlZCAhPSBudWxscHRyKSBtQ29ubmVjdGVkLT5wdWxsUmVzZXQoKTsKK30KKworZmxvYXQgKkZsb3dHcmFwaFBvcnRGbG9hdElucHV0OjpnZXRCdWZmZXIoKSB7CisgICAgaWYgKG1Db25uZWN0ZWQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gRmxvd0dyYXBoUG9ydEZsb2F0OjpnZXRCdWZmZXIoKTsgLy8gbG9hZGVkIHVzaW5nIHNldFZhbHVlKCkKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbUNvbm5lY3RlZC0+Z2V0QnVmZmVyKCk7CisgICAgfQorfQorCitpbnQzMl90IEZsb3dHcmFwaFNpbms6OnB1bGxEYXRhKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgcmV0dXJuIEZsb3dHcmFwaE5vZGU6OnB1bGxEYXRhKG51bUZyYW1lcywgZ2V0TGFzdENhbGxDb3VudCgpICsgMSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9GbG93R3JhcGhOb2RlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9GbG93R3JhcGhOb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4NGMwOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0Zsb3dHcmFwaE5vZGUuaApAQCAtMCwwICsxLDQ1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEZsb3dHcmFwaC5oCisgKgorICogUHJvY2Vzc2luZyBub2RlIGFuZCBwb3J0cyB0aGF0IGNhbiBiZSB1c2VkIGluIGEgc2ltcGxlIGRhdGEgZmxvdyBncmFwaC4KKyAqIFRoaXMgd2FzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBhdWRpbyBidXQgY291bGQgYmUgdXNlZCBmb3Igb3RoZXIKKyAqIHR5cGVzIG9mIGRhdGEuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfRkxPV19HUkFQSF9OT0RFX0gKKyNkZWZpbmUgRkxPV0dSQVBIX0ZMT1dfR1JBUEhfTk9ERV9ICisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBUT0RPIE1vdmUgdGhlc2UgY2xhc3NlcyBpbnRvIHNlcGFyYXRlIGZpbGVzLgorLy8gVE9ETyBSZXZpZXcgdXNlIG9mIHJhdyBwb2ludGVycyBmb3IgY29ubmVjdCgpLiBNYXliZSB1c2Ugc21hcnQgcG9pbnRlcnMgYnV0IG5lZWQgdG8gYXZvaWQKKy8vICAgICAgcnVuLXRpbWUgZGVhbGxvY2F0aW9uIGluIGF1ZGlvIHRocmVhZC4KKworLy8gU2V0IGZsYWdzIEZMT1dHUkFQSF9BTkRST0lEX0lOVEVSTkFMIGFuZCBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFIGJhc2VkIG9uIHdoZXRoZXIgY29tcGlsZXIKKy8vIGZsYWcgX19BTkRST0lEX05ES19fIGlzIGRlZmluZWQuIF9fQU5EUk9JRF9OREtfXyBzaG91bGQgYmUgZGVmaW5lZCBpbiBvYm9lIGFuZCBub3QgYWF1ZGlvLgorCisjaWZuZGVmIEZMT1dHUkFQSF9BTkRST0lEX0lOVEVSTkFMCisjaWZkZWYgX19BTkRST0lEX05ES19fCisjZGVmaW5lIEZMT1dHUkFQSF9BTkRST0lEX0lOVEVSTkFMIDAKKyNlbHNlCisjZGVmaW5lIEZMT1dHUkFQSF9BTkRST0lEX0lOVEVSTkFMIDEKKyNlbmRpZiAvLyBfX0FORFJPSURfTkRLX18KKyNlbmRpZiAvLyBGTE9XR1JBUEhfQU5EUk9JRF9JTlRFUk5BTAorCisjaWZuZGVmIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0UKKyNpZmRlZiBfX0FORFJPSURfTkRLX18KKyNkZWZpbmUgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRSBvYm9lCisjZWxzZQorI2RlZmluZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFIGFhdWRpbworI2VuZGlmIC8vIF9fQU5EUk9JRF9OREtfXworI2VuZGlmIC8vIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0UKKworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CisKKy8vIERlZmF1bHQgYmxvY2sgc2l6ZSB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIHdoZW4gdGhlIEZsb3dHcmFwaFBvcnRGbG9hdCBpcyBjcmVhdGVkLgorLy8gSWYgaXQgaXMgdG9vIHNtYWxsIHRoZW4gd2Ugd2lsbCBoYXZlIHRvbyBtdWNoIG92ZXJoZWFkIGZyb20gc3dpdGNoaW5nIGJldHdlZW4gbm9kZXMuCisvLyBJZiBpdCBpcyB0b28gaGlnaCB0aGVuIHdlIHdpbGwgdGhyYXNoIHRoZSBjYWNoZXMuCitjb25zdGV4cHIgaW50IGtEZWZhdWx0QnVmZmVyU2l6ZSA9IDg7IC8vIGFyYml0cmFyeQorCitjbGFzcyBGbG93R3JhcGhQb3J0OworY2xhc3MgRmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFsbCBub2RlcyBpbiB0aGUgZmxvd2dyYXBoLgorICovCitjbGFzcyBGbG93R3JhcGhOb2RlIHsKK3B1YmxpYzoKKyAgICBGbG93R3JhcGhOb2RlKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgfkZsb3dHcmFwaE5vZGUoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGZyb20gdGhlIGlucHV0IHBvcnRzLAorICAgICAqIGdlbmVyYXRlIG11bHRpcGxlIGZyYW1lcyBvZiBkYXRhIHRoZW4gd3JpdGUgdGhlIHJlc3VsdHMgdG8gdGhlIG91dHB1dCBwb3J0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBudW1GcmFtZXMgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHJlcXVlc3RlZCBmb3IgcHJvY2Vzc2luZworICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwcm9jZXNzZWQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgY2FsbENvdW50IGlzIGF0IG9yIGFmdGVyIHRoZSBwcmV2aW91cyBjYWxsQ291bnQgdGhlbiBjYWxsCisgICAgICogcHVsbERhdGEgb24gYWxsIG9mIHRoZSB1cHN0cmVhbU5vZGVzLgorICAgICAqIFRoZW4gY2FsbCBvblByb2Nlc3MoKS4KKyAgICAgKiBUaGlzIHByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiBpbiBjYXNlIG9mIGN5Y2xpYyBncmFwaHMuCisgICAgICogSXQgYWxzbyBwcmV2ZW50cyBub2RlcyB1cHN0cmVhbSBmcm9tIGEgYnJhbmNoIGZyb20gYmVpbmcgZXhlY3V0ZWQgdHdpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbENvdW50CisgICAgICogQHBhcmFtIG51bUZyYW1lcworICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyB2YWxpZAorICAgICAqLworICAgIGludDMyX3QgcHVsbERhdGEoaW50MzJfdCBudW1GcmFtZXMsIGludDY0X3QgY2FsbENvdW50KTsKKworICAgIC8qKgorICAgICAqIFJlY3Vyc2l2ZWx5IHJlc2V0IGFsbCB0aGUgbm9kZXMgaW4gdGhlIGdyYXBoLCBzdGFydGluZyBmcm9tIGEgU2luay4KKyAgICAgKgorICAgICAqIFRoaXMgbXVzdCBub3QgYmUgY2FsbGVkIGF0IHRoZSBzYW1lIHRpbWUgYXMgcHVsbERhdGEhCisgICAgICovCisgICAgdm9pZCBwdWxsUmVzZXQoKTsKKworICAgIC8qKgorICAgICAqIFJlc2V0IGZyYW1lUG9zaXRpb24gY291bnRlcnMuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisKKyAgICB2b2lkIGFkZElucHV0UG9ydChGbG93R3JhcGhQb3J0ICZwb3J0KSB7CisgICAgICAgIG1JbnB1dFBvcnRzLmVtcGxhY2VfYmFjayhwb3J0KTsKKyAgICB9CisKKyAgICBib29sIGlzRGF0YVB1bGxlZEF1dG9tYXRpY2FsbHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGF0YVB1bGxlZEF1dG9tYXRpY2FsbHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRydWUgaWYgeW91IHdhbnQgdGhlIGRhdGEgcHVsbGVkIHRocm91Z2ggdGhlIGdyYXBoIGF1dG9tYXRpY2FsbHkuCisgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIFNldCBmYWxzZSBpZiB5b3Ugd2FudCB0byBwdWxsIHRoZSBkYXRhIGZyb20gdGhlIGlucHV0IHBvcnRzIGluIHRoZSBvblByb2Nlc3MoKSBtZXRob2QuCisgICAgICogWW91IG1pZ2h0IGRvIHRoaXMsIGZvciBleGFtcGxlLCBpbiBhIHNhbXBsZSByYXRlIGNvbnZlcnRpbmcgbm9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdXRvbWF0aWMKKyAgICAgKi8KKyAgICB2b2lkIHNldERhdGFQdWxsZWRBdXRvbWF0aWNhbGx5KGJvb2wgYXV0b21hdGljKSB7CisgICAgICAgIG1EYXRhUHVsbGVkQXV0b21hdGljYWxseSA9IGF1dG9tYXRpYzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAiRmxvd0dyYXBoIjsKKyAgICB9CisKKyAgICBpbnQ2NF90IGdldExhc3RDYWxsQ291bnQoKSB7CisgICAgICAgIHJldHVybiBtTGFzdENhbGxDb3VudDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50NjRfdCAga0luaXRpYWxDYWxsQ291bnQgPSAtMTsKKyAgICBpbnQ2NF90ICBtTGFzdENhbGxDb3VudCA9IGtJbml0aWFsQ2FsbENvdW50OworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxGbG93R3JhcGhQb3J0Pj4gbUlucHV0UG9ydHM7CisKK3ByaXZhdGU6CisgICAgYm9vbCAgICAgbURhdGFQdWxsZWRBdXRvbWF0aWNhbGx5ID0gdHJ1ZTsKKyAgICBib29sICAgICBtQmxvY2tSZWN1cnNpb24gPSBmYWxzZTsKKyAgICBpbnQzMl90ICBtTGFzdEZyYW1lQ291bnQgPSAwOworCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgICogVGhpcyBpcyBhIGNvbm5lY3RvciB0aGF0IGFsbG93cyBkYXRhIHRvIGZsb3cgYmV0d2VlbiBtb2R1bGVzLgorICAqCisgICogVGhlIHBvcnRzIGFyZSB0aGUgcHJpbWFyeSBtZWFucyBvZiBpbnRlcmFjdGluZyB3aXRoIGEgbW9kdWxlLgorICAqIFNvIHRoZXkgYXJlIGdlbmVyYWxseSBkZWNsYXJlZCBhcyBwdWJsaWMuCisgICoKKyAgKi8KK2NsYXNzIEZsb3dHcmFwaFBvcnQgeworcHVibGljOgorICAgIEZsb3dHcmFwaFBvcnQoRmxvd0dyYXBoTm9kZSAmcGFyZW50LCBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgICAgIDogbUNvbnRhaW5pbmdOb2RlKHBhcmVudCkKKyAgICAgICAgICAgICwgbVNhbXBsZXNQZXJGcmFtZShzYW1wbGVzUGVyRnJhbWUpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5GbG93R3JhcGhQb3J0KCkgPSBkZWZhdWx0OworCisgICAgLy8gUG9ydHMgYXJlIG9mdGVuIGRlY2xhcmVkIHB1YmxpYy4gU28gbGV0J3MgbWFrZSB0aGVtIG5vbi1jb3B5YWJsZS4KKyAgICBGbG93R3JhcGhQb3J0KGNvbnN0IEZsb3dHcmFwaFBvcnQmKSA9IGRlbGV0ZTsKKyAgICBGbG93R3JhcGhQb3J0JiBvcGVyYXRvcj0oY29uc3QgRmxvd0dyYXBoUG9ydCYpID0gZGVsZXRlOworCisgICAgaW50MzJfdCBnZXRTYW1wbGVzUGVyRnJhbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2FtcGxlc1BlckZyYW1lOworICAgIH0KKworICAgIHZpcnR1YWwgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgcHVsbFJlc2V0KCkge30KKworcHJvdGVjdGVkOgorICAgIEZsb3dHcmFwaE5vZGUgJm1Db250YWluaW5nTm9kZTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBpbnQzMl90ICAgIG1TYW1wbGVzUGVyRnJhbWUgPSAxOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogVGhpcyBwb3J0IGNvbnRhaW5zIGEgMzItYml0IGZsb2F0IGJ1ZmZlciB0aGF0IGNhbiBjb250YWluIHNldmVyYWwgZnJhbWVzIG9mIGRhdGEuCisgKiBQcm9jZXNzaW5nIHRoZSBkYXRhIGluIGEgYmxvY2sgaW1wcm92ZXMgcGVyZm9ybWFuY2UuCisgKgorICogVGhlIHNpemUgaXMgZnJhbWVzUGVyQnVmZmVyICogc2FtcGxlc1BlckZyYW1lKS4KKyAqLworY2xhc3MgRmxvd0dyYXBoUG9ydEZsb2F0ICA6IHB1YmxpYyBGbG93R3JhcGhQb3J0IHsKK3B1YmxpYzoKKyAgICBGbG93R3JhcGhQb3J0RmxvYXQoRmxvd0dyYXBoTm9kZSAmcGFyZW50LAorICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQnVmZmVyID0ga0RlZmF1bHRCdWZmZXJTaXplCisgICAgICAgICAgICAgICAgKTsKKworICAgIHZpcnR1YWwgfkZsb3dHcmFwaFBvcnRGbG9hdCgpID0gZGVmYXVsdDsKKworICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQnVmZmVyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUZyYW1lc1BlckJ1ZmZlcjsKKyAgICB9CisKK3Byb3RlY3RlZDoKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYnVmZmVyIGludGVybmFsIHRvIHRoZSBwb3J0IG9yIGZyb20gYSBjb25uZWN0ZWQgcG9ydAorICAgICAqLworICAgIHZpcnR1YWwgZmxvYXQgKmdldEJ1ZmZlcigpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXIuZ2V0KCk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IGludDMyX3QgICAgbUZyYW1lc1BlckJ1ZmZlciA9IDE7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb2F0W10+IG1CdWZmZXI7IC8vIGFsbG9jYXRlZCBpbiBjb25zdHJ1Y3RvcgorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICAqIFRoZSByZXN1bHRzIG9mIGEgbm9kZSdzIHByb2Nlc3NpbmcgYXJlIHN0b3JlZCBpbiB0aGUgYnVmZmVycyBvZiB0aGUgb3V0cHV0IHBvcnRzLgorICAqLworY2xhc3MgRmxvd0dyYXBoUG9ydEZsb2F0T3V0cHV0IDogcHVibGljIEZsb3dHcmFwaFBvcnRGbG9hdCB7CitwdWJsaWM6CisgICAgRmxvd0dyYXBoUG9ydEZsb2F0T3V0cHV0KEZsb3dHcmFwaE5vZGUgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICAgICA6IEZsb3dHcmFwaFBvcnRGbG9hdChwYXJlbnQsIHNhbXBsZXNQZXJGcmFtZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dCgpID0gZGVmYXVsdDsKKworICAgIHVzaW5nIEZsb3dHcmFwaFBvcnRGbG9hdDo6Z2V0QnVmZmVyOworCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byB0aGUgaW5wdXQgb2YgYW5vdGhlciBtb2R1bGUuCisgICAgICogQW4gaW5wdXQgcG9ydCBjYW4gb25seSBoYXZlIG9uZSBjb25uZWN0aW9uLgorICAgICAqIEFuIG91dHB1dCBwb3J0IGNhbiBoYXZlIG11bHRpcGxlIGNvbm5lY3Rpb25zLgorICAgICAqIElmIHlvdSBjb25uZWN0IGEgc2Vjb25kIG91dHB1dCBwb3J0IHRvIGFuIGlucHV0IHBvcnQKKyAgICAgKiB0aGVuIGl0IG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBUaGlzIG5vdCB0aHJlYWQgc2FmZS4gRG8gbm90IG1vZGlmeSB0aGUgZ3JhcGggdG9wb2xvZ3kgZnJvbSBhbm90aGVyIHRocmVhZCB3aGlsZSBydW5uaW5nLgorICAgICAqIEFsc28gZG8gbm90IGRlbGV0ZSBhIG1vZHVsZSB3aGlsZSBpdCBpcyBjb25uZWN0ZWQgdG8gYW5vdGhlciBwb3J0IGlmIHRoZSBncmFwaCBpcyBydW5uaW5nLgorICAgICAqLworICAgIHZvaWQgY29ubmVjdChGbG93R3JhcGhQb3J0RmxvYXRJbnB1dCAqcG9ydCk7CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0IGZyb20gdGhlIGlucHV0IG9mIGFub3RoZXIgbW9kdWxlLgorICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLgorICAgICAqLworICAgIHZvaWQgZGlzY29ubmVjdChGbG93R3JhcGhQb3J0RmxvYXRJbnB1dCAqcG9ydCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRoZSBwYXJlbnQgbW9kdWxlJ3Mgb25Qcm9jZXNzKCkgbWV0aG9kLgorICAgICAqIFRoYXQgbWF5IHB1bGwgZGF0YSBmcm9tIGl0cyBpbnB1dHMgYW5kIHJlY3Vyc2l2ZWx5CisgICAgICogcHJvY2VzcyB0aGUgZW50aXJlIGdyYXBoLgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwdWxsZWQKKyAgICAgKi8KKyAgICBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisKKyAgICB2b2lkIHB1bGxSZXNldCgpIG92ZXJyaWRlOworCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEFuIGlucHV0IHBvcnQgZm9yIHN0cmVhbWluZyBhdWRpbyBkYXRhLgorICogWW91IGNhbiBzZXQgYSB2YWx1ZSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgcHJvY2Vzc2luZy4KKyAqIElmIHlvdSBjb25uZWN0IGFuIG91dHB1dCBwb3J0IHRvIHRoaXMgcG9ydCB0aGVuIGl0cyB2YWx1ZSB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KKyAqLworY2xhc3MgRmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQgOiBwdWJsaWMgRmxvd0dyYXBoUG9ydEZsb2F0IHsKK3B1YmxpYzoKKyAgICBGbG93R3JhcGhQb3J0RmxvYXRJbnB1dChGbG93R3JhcGhOb2RlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAgICAgOiBGbG93R3JhcGhQb3J0RmxvYXQocGFyZW50LCBzYW1wbGVzUGVyRnJhbWUpIHsKKyAgICAgICAgLy8gQWRkIHRvIHBhcmVudCBzbyBpdCBjYW4gcHVsbCBkYXRhIGZyb20gZWFjaCBpbnB1dC4KKyAgICAgICAgcGFyZW50LmFkZElucHV0UG9ydCgqdGhpcyk7CisgICAgfQorCisgICAgdmlydHVhbCB+Rmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBJZiBjb25uZWN0ZWQgdG8gYW4gb3V0cHV0IHBvcnQgdGhlbiB0aGlzIHdpbGwgcmV0dXJuCisgICAgICogdGhhdCBvdXRwdXQgcG9ydHMgYnVmZmVycy4KKyAgICAgKiBJZiBub3QgY29ubmVjdGVkIHRoZW4gaXQgcmV0dXJucyB0aGUgaW5wdXQgcG9ydHMgb3duIGJ1ZmZlcgorICAgICAqIHdoaWNoIGNhbiBiZSBsb2FkZWQgdXNpbmcgc2V0VmFsdWUoKS4KKyAgICAgKi8KKyAgICBmbG9hdCAqZ2V0QnVmZmVyKCkgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBldmVyeSB2YWx1ZSBvZiB0aGUgZmxvYXQgYnVmZmVyLgorICAgICAqIFRoaXMgdmFsdWUgd2lsbCBiZSBpZ25vcmVkIGlmIGFuIG91dHB1dCBwb3J0IGlzIGNvbm5lY3RlZAorICAgICAqIHRvIHRoaXMgcG9ydC4KKyAgICAgKi8KKyAgICB2b2lkIHNldFZhbHVlKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIGludCBudW1GbG9hdHMgPSBrRGVmYXVsdEJ1ZmZlclNpemUgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICAgICAgZmxvYXQgKmJ1ZmZlciA9IGdldEJ1ZmZlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZsb2F0czsgaSsrKSB7CisgICAgICAgICAgICAqYnVmZmVyKysgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdG8gdGhlIG91dHB1dCBvZiBhbm90aGVyIG1vZHVsZS4KKyAgICAgKiBBbiBpbnB1dCBwb3J0IGNhbiBvbmx5IGhhdmUgb25lIGNvbm5lY3Rpb24uCisgICAgICogQW4gb3V0cHV0IHBvcnQgY2FuIGhhdmUgbXVsdGlwbGUgY29ubmVjdGlvbnMuCisgICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuCisgICAgICovCisgICAgdm9pZCBjb25uZWN0KEZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dCAqcG9ydCkgeworICAgICAgICBhc3NlcnQoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gcG9ydC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgICAgICBtQ29ubmVjdGVkID0gcG9ydDsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoRmxvd0dyYXBoUG9ydEZsb2F0T3V0cHV0ICpwb3J0KSB7CisgICAgICAgIGFzc2VydChtQ29ubmVjdGVkID09IHBvcnQpOworICAgICAgICAodm9pZCkgcG9ydDsKKyAgICAgICAgbUNvbm5lY3RlZCA9IG51bGxwdHI7CisgICAgfQorCisgICAgdm9pZCBkaXNjb25uZWN0KCkgeworICAgICAgICBtQ29ubmVjdGVkID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdWxsIGRhdGEgZnJvbSBhbnkgb3V0cHV0IHBvcnQgdGhhdCBpcyBjb25uZWN0ZWQuCisgICAgICovCisgICAgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIHZvaWQgcHVsbFJlc2V0KCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgRmxvd0dyYXBoUG9ydEZsb2F0T3V0cHV0ICptQ29ubmVjdGVkID0gbnVsbHB0cjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYW4gZWRnZSBub2RlIGluIGEgZ3JhcGggdGhhdCBoYXMgbm8gdXBzdHJlYW0gbm9kZXMuCisgKiBJdCBvdXRwdXRzIGRhdGEgYnV0IGRvZXMgbm90IGNvbnN1bWUgZGF0YS4KKyAqIEJ5IGRlZmF1bHQsIGl0IHdpbGwgcmVhZCBpdHMgZGF0YSBmcm9tIGFuIGV4dGVybmFsIGJ1ZmZlci4KKyAqLworY2xhc3MgRmxvd0dyYXBoU291cmNlIDogcHVibGljIEZsb3dHcmFwaE5vZGUgeworcHVibGljOgorICAgIGV4cGxpY2l0IEZsb3dHcmFwaFNvdXJjZShpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgIDogb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5GbG93R3JhcGhTb3VyY2UoKSA9IGRlZmF1bHQ7CisKKyAgICBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQgb3V0cHV0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhbiBlZGdlIG5vZGUgaW4gYSBncmFwaCB0aGF0IGhhcyBubyB1cHN0cmVhbSBub2Rlcy4KKyAqIEl0IG91dHB1dHMgZGF0YSBidXQgZG9lcyBub3QgY29uc3VtZSBkYXRhLgorICogQnkgZGVmYXVsdCwgaXQgd2lsbCByZWFkIGl0cyBkYXRhIGZyb20gYW4gZXh0ZXJuYWwgYnVmZmVyLgorICovCitjbGFzcyBGbG93R3JhcGhTb3VyY2VCdWZmZXJlZCA6IHB1YmxpYyBGbG93R3JhcGhTb3VyY2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IEZsb3dHcmFwaFNvdXJjZUJ1ZmZlcmVkKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgOiBGbG93R3JhcGhTb3VyY2UoY2hhbm5lbENvdW50KSB7fQorCisgICAgdmlydHVhbCB+Rmxvd0dyYXBoU291cmNlQnVmZmVyZWQoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IGJ1ZmZlciB0aGF0IHRoZSBub2RlIHdpbGwgcmVhZCBmcm9tLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgVE9ETyBDb25zaWRlciB1c2luZyBzdGQ6OnNoYXJlZF9wdHIuCisgICAgICogQHBhcmFtIG51bUZyYW1lcworICAgICAqLworICAgIHZvaWQgc2V0RGF0YShjb25zdCB2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgICAgICBtRGF0YSA9IGRhdGE7CisgICAgICAgIG1TaXplSW5GcmFtZXMgPSBudW1GcmFtZXM7CisgICAgICAgIG1GcmFtZUluZGV4ID0gMDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCB2b2lkICptRGF0YSA9IG51bGxwdHI7CisgICAgaW50MzJfdCAgICAgbVNpemVJbkZyYW1lcyA9IDA7IC8vIG51bWJlciBvZiBmcmFtZXMgaW4gbURhdGEKKyAgICBpbnQzMl90ICAgICBtRnJhbWVJbmRleCA9IDA7IC8vIGluZGV4IG9mIG5leHQgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhbiBlZGdlIG5vZGUgaW4gYSBncmFwaCB0aGF0IGhhcyBubyBkb3duc3RyZWFtIG5vZGVzLgorICogSXQgY29uc3VtZXMgZGF0YSBidXQgZG9lcyBub3Qgb3V0cHV0IGRhdGEuCisgKiBUaGlzIGdyYXBoIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBkYXRhIGlzIHJlYWQoKSBmcm9tIHRoaXMgbm9kZQorICogYnkgcHVsbGluZyBkYXRhIGZyb20gdXBzdHJlYW0gbm9kZXMuCisgKi8KK2NsYXNzIEZsb3dHcmFwaFNpbmsgOiBwdWJsaWMgRmxvd0dyYXBoTm9kZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRmxvd0dyYXBoU2luayhpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgIDogaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkZsb3dHcmFwaFNpbmsoKSA9IGRlZmF1bHQ7CisKKyAgICBGbG93R3JhcGhQb3J0RmxvYXRJbnB1dCBpbnB1dDsKKworICAgIC8qKgorICAgICAqIERvIG5vdGhpbmcuIFRoZSB3b3JrIGhhcHBlbnMgaW4gdGhlIHJlYWQoKSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHByb2Nlc3NlZAorICAgICAqLworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBudW1GcmFtZXM7CisgICAgfQorCisgICAgdmlydHVhbCBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpID0gMDsKKworcHJvdGVjdGVkOgorICAgIC8qKgorICAgICAqIFB1bGwgZGF0YSB0aHJvdWdoIHRoZSBncmFwaCB1c2luZyB0aGlzIG5vZGVzIGxhc3QgY2FsbENvdW50LgorICAgICAqIEBwYXJhbSBudW1GcmFtZXMKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgaW50MzJfdCBwdWxsRGF0YShpbnQzMl90IG51bUZyYW1lcyk7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhIG5vZGUgdGhhdCBoYXMgYW4gaW5wdXQgYW5kIGFuIG91dHB1dCB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBjaGFubmVscy4KKyAqIFRoaXMgbWF5IGluY2x1ZGUgdHJhZGl0aW9uYWwgZmlsdGVycywgZWcuIEZJUiwgYnV0IGFsc28gaW5jbHVkZQorICogYW55IHByb2Nlc3Npbmcgbm9kZSB0aGF0IGNvbnZlcnRzIGlucHV0IHRvIG91dHB1dC4KKyAqLworY2xhc3MgRmxvd0dyYXBoRmlsdGVyIDogcHVibGljIEZsb3dHcmFwaE5vZGUgeworcHVibGljOgorICAgIGV4cGxpY2l0IEZsb3dHcmFwaEZpbHRlcihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgIDogaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICwgb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5GbG93R3JhcGhGaWx0ZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBGbG93R3JhcGhQb3J0RmxvYXRJbnB1dCBpbnB1dDsKKyAgICBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQgb3V0cHV0OworfTsKKworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCisKKyNlbmRpZiAvKiBGTE9XR1JBUEhfRkxPV19HUkFQSF9OT0RFX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0Zsb3dncmFwaFV0aWxpdGllcy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvRmxvd2dyYXBoVXRpbGl0aWVzLmgKaW5kZXggYjc1MDQxMC4uNWU5MDU4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvRmxvd2dyYXBoVXRpbGl0aWVzLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvRmxvd2dyYXBoVXRpbGl0aWVzLmgKQEAgLTE5LDcgKzE5LDcgQEAKIAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi11c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKIAogY2xhc3MgRmxvd2dyYXBoVXRpbGl0aWVzIHsKIHB1YmxpYzoKQEAgLTM5LDkgKzM5LDkgQEAKICAgICBzdGF0aWMgY29uc3QgZmxvYXQgbGltbmVnID0gLTEuOwogCiAgICAgaWYgKGYgPD0gbGltbmVnKSB7Ci0gICAgICAgIHJldHVybiAtMHg4MDAwMDAwMDsgLyogb3IgMHg4MDAwMDAwMCAqLworICAgICAgICByZXR1cm4gSU5UMzJfTUlOOwogICAgIH0gZWxzZSBpZiAoZiA+PSBsaW1wb3MpIHsKLSAgICAgICAgcmV0dXJuIDB4N2ZmZmZmZmY7CisgICAgICAgIHJldHVybiBJTlQzMl9NQVg7CiAgICAgfQogICAgIGYgKj0gc2NhbGU7CiAgICAgLyogaW50ZWdlciBjb252ZXJzaW9uIGlzIHRocm91Z2ggdHJ1bmNhdGlvbiAodGhvdWdoIGludCB0byBmbG9hdCBpcyBub3QpLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTWFueVRvTXVsdGlDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTWFueVRvTXVsdGlDb252ZXJ0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOTczYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NYW55VG9NdWx0aUNvbnZlcnRlci5jcHAKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiTWFueVRvTXVsdGlDb252ZXJ0ZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKKworTWFueVRvTXVsdGlDb252ZXJ0ZXI6Ok1hbnlUb011bHRpQ29udmVydGVyKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IGlucHV0cyhjaGFubmVsQ291bnQpCisgICAgICAgICwgb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYW5uZWxDb3VudDsgaSsrKSB7CisgICAgICAgIGlucHV0c1tpXSA9IHN0ZDo6bWFrZV91bmlxdWU8Rmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQ+KCp0aGlzLCAxKTsKKyAgICB9Cit9CisKK2ludDMyX3QgTWFueVRvTXVsdGlDb252ZXJ0ZXI6Om9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IGNoYW5uZWxDb3VudDsgY2grKykgeworICAgICAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dHNbY2hdLT5nZXRCdWZmZXIoKTsKKyAgICAgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCdWZmZXIoKSArIGNoOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKKyAgICAgICAgICAgIC8vIHJlYWQgb25lLCB3cml0ZSBpbnRvIHRoZSBwcm9wZXIgaW50ZXJsZWF2ZWQgb3V0cHV0IGNoYW5uZWwKKyAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9ICppbnB1dEJ1ZmZlcisrOworICAgICAgICAgICAgKm91dHB1dEJ1ZmZlciA9IHNhbXBsZTsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlciArPSBjaGFubmVsQ291bnQ7IC8vIGFkdmFuY2UgdG8gbmV4dCBtdWx0aWNoYW5uZWwgZnJhbWUKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVtRnJhbWVzOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NYW55VG9NdWx0aUNvbnZlcnRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTWFueVRvTXVsdGlDb252ZXJ0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDY0NGNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTWFueVRvTXVsdGlDb252ZXJ0ZXIuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9NQU5ZX1RPX01VTFRJX0NPTlZFUlRFUl9ICisjZGVmaW5lIEZMT1dHUkFQSF9NQU5ZX1RPX01VTFRJX0NPTlZFUlRFUl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggeworCisvKioKKyAqIENvbWJpbmUgbXVsdGlwbGUgbW9ubyBpbnB1dHMgaW50byBvbmUgaW50ZXJsZWF2ZWQgbXVsdGktY2hhbm5lbCBvdXRwdXQuCisgKi8KK2NsYXNzIE1hbnlUb011bHRpQ29udmVydGVyIDogcHVibGljIGZsb3dncmFwaDo6Rmxvd0dyYXBoTm9kZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTWFueVRvTXVsdGlDb252ZXJ0ZXIoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgdmlydHVhbCB+TWFueVRvTXVsdGlDb252ZXJ0ZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0RW5hYmxlZChib29sIC8qZW5hYmxlZCovKSB7fQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6Rmxvd0dyYXBoUG9ydEZsb2F0SW5wdXQ+PiBpbnB1dHM7CisgICAgZmxvd2dyYXBoOjpGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQgb3V0cHV0OworCisgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJNYW55VG9NdWx0aUNvbnZlcnRlciI7CisgICAgfQorCitwcml2YXRlOgorfTsKKworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9NQU5ZX1RPX01VTFRJX0NPTlZFUlRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vQmxlbmQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub0JsZW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmQ3NWUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub0JsZW5kLmNwcApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJNb25vQmxlbmQuaCIKKwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKKworTW9ub0JsZW5kOjpNb25vQmxlbmQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogRmxvd0dyYXBoRmlsdGVyKGNoYW5uZWxDb3VudCkKKyAgICAgICAgLCBtSW52Q2hhbm5lbENvdW50KDEuIC8gY2hhbm5lbENvdW50KQoreworfQorCitpbnQzMl90IE1vbm9CbGVuZDo6b25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QnVmZmVyKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCdWZmZXIoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyArK2kpIHsKKyAgICAgICAgZmxvYXQgYWNjdW0gPSAwOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGNoYW5uZWxDb3VudDsgKytqKSB7CisgICAgICAgICAgICBhY2N1bSArPSAqaW5wdXRCdWZmZXIrKzsKKyAgICAgICAgfQorICAgICAgICBhY2N1bSAqPSBtSW52Q2hhbm5lbENvdW50OworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGNoYW5uZWxDb3VudDsgKytqKSB7CisgICAgICAgICAgICAqb3V0cHV0QnVmZmVyKysgPSBhY2N1bTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudW1GcmFtZXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vQmxlbmQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9CbGVuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZDQ0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vQmxlbmQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9NT05PX0JMRU5EX0gKKyNkZWZpbmUgRkxPV0dSQVBIX01PTk9fQkxFTkRfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggeworCisvKioKKyAqIENvbWJpbmUgZGF0YSBiZXR3ZWVuIG11bHRpcGxlIGNoYW5uZWxzIHNvIGVhY2ggY2hhbm5lbCBpcyBhbiBhdmVyYWdlCisgKiBvZiBhbGwgY2hhbm5lbHMuCisgKi8KK2NsYXNzIE1vbm9CbGVuZCA6IHB1YmxpYyBGbG93R3JhcGhGaWx0ZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IE1vbm9CbGVuZChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICB2aXJ0dWFsIH5Nb25vQmxlbmQoKSA9IGRlZmF1bHQ7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIk1vbm9CbGVuZCI7CisgICAgfQorcHJpdmF0ZToKKyAgICBjb25zdCBmbG9hdCBtSW52Q2hhbm5lbENvdW50OworfTsKKworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9NT05PX0JMRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5jcHAKaW5kZXggNzhhYWQ1Mi4uMzNlZWQ1MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcApAQCAtMTQsMzQgKzE0LDI4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0KICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAjaW5jbHVkZSAiTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CiAKLU1vbm9Ub011bHRpQ29udmVydGVyOjpNb25vVG9NdWx0aUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCkKK01vbm9Ub011bHRpQ29udmVydGVyOjpNb25vVG9NdWx0aUNvbnZlcnRlcihpbnQzMl90IG91dHB1dENoYW5uZWxDb3VudCkKICAgICAgICAgOiBpbnB1dCgqdGhpcywgMSkKLSAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgICAgICAsIG91dHB1dCgqdGhpcywgb3V0cHV0Q2hhbm5lbENvdW50KSB7CiB9CiAKLU1vbm9Ub011bHRpQ29udmVydGVyOjp+TW9ub1RvTXVsdGlDb252ZXJ0ZXIoKSB7IH0KLQotaW50MzJfdCBNb25vVG9NdWx0aUNvbnZlcnRlcjo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKLSAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IGlucHV0LnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Ci0KLSAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCbG9jaygpOwotICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QmxvY2soKTsKK2ludDMyX3QgTW9ub1RvTXVsdGlDb252ZXJ0ZXI6Om9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJ1ZmZlcigpOworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QnVmZmVyKCk7CiAgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7Ci0gICAgLy8gVE9ETyBtYXliZSBtb3ZlIHRvIGF1ZGlvX3V0aWwgYXMgYXVkaW9fbW9ub190b19tdWx0aSgpCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXNUb1Byb2Nlc3M7IGkrKykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKICAgICAgICAgLy8gcmVhZCBvbmUsIHdyaXRlIG1hbnkKICAgICAgICAgZmxvYXQgc2FtcGxlID0gKmlucHV0QnVmZmVyKys7CiAgICAgICAgIGZvciAoaW50IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY2hhbm5lbENvdW50OyBjaGFubmVsKyspIHsKICAgICAgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9IHNhbXBsZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworICAgIHJldHVybiBudW1GcmFtZXM7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oCmluZGV4IDM0ZDUzYzcuLjc2MmVkYjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaApAQCAtMTQsMjkgKzE0LDM2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0KICNpZm5kZWYgRkxPV0dSQVBIX01PTk9fVE9fTVVMVElfQ09OVkVSVEVSX0gKICNkZWZpbmUgRkxPV0dSQVBIX01PTk9fVE9fTVVMVElfQ09OVkVSVEVSX0gKIAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogCi1uYW1lc3BhY2UgZmxvd2dyYXBoIHsKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggewogCi1jbGFzcyBNb25vVG9NdWx0aUNvbnZlcnRlciA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworLyoqCisgKiBDb252ZXJ0IGEgbW9ub3Bob25pYyBzdHJlYW0gdG8gYSBtdWx0aS1jaGFubmVsIGludGVybGVhdmVkIHN0cmVhbQorICogd2l0aCB0aGUgc2FtZSBzaWduYWwgb24gZWFjaCBjaGFubmVsLgorICovCitjbGFzcyBNb25vVG9NdWx0aUNvbnZlcnRlciA6IHB1YmxpYyBGbG93R3JhcGhOb2RlIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBNb25vVG9NdWx0aUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisgICAgZXhwbGljaXQgTW9ub1RvTXVsdGlDb252ZXJ0ZXIoaW50MzJfdCBvdXRwdXRDaGFubmVsQ291bnQpOwogCi0gICAgdmlydHVhbCB+TW9ub1RvTXVsdGlDb252ZXJ0ZXIoKTsKKyAgICB2aXJ0dWFsIH5Nb25vVG9NdWx0aUNvbnZlcnRlcigpID0gZGVmYXVsdDsKIAotICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKIAotICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7Ci0gICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiTW9ub1RvTXVsdGlDb252ZXJ0ZXIiOworICAgIH0KKworICAgIEZsb3dHcmFwaFBvcnRGbG9hdElucHV0IGlucHV0OworICAgIEZsb3dHcmFwaFBvcnRGbG9hdE91dHB1dCBvdXRwdXQ7CiB9OwogCi19IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLwogCiAjZW5kaWYgLy9GTE9XR1JBUEhfTU9OT19UT19NVUxUSV9DT05WRVJURVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTXVsdGlUb01hbnlDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTXVsdGlUb01hbnlDb252ZXJ0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZGY1OTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NdWx0aVRvTWFueUNvbnZlcnRlci5jcHAKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKKyNpbmNsdWRlICJNdWx0aVRvTWFueUNvbnZlcnRlci5oIgorCit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOworCitNdWx0aVRvTWFueUNvbnZlcnRlcjo6TXVsdGlUb01hbnlDb252ZXJ0ZXIoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogb3V0cHV0cyhjaGFubmVsQ291bnQpCisgICAgICAgICwgaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbENvdW50OyBpKyspIHsKKyAgICAgICAgb3V0cHV0c1tpXSA9IHN0ZDo6bWFrZV91bmlxdWU8Rmxvd0dyYXBoUG9ydEZsb2F0T3V0cHV0PigqdGhpcywgMSk7CisgICAgfQorfQorCitNdWx0aVRvTWFueUNvbnZlcnRlcjo6fk11bHRpVG9NYW55Q29udmVydGVyKCkgPSBkZWZhdWx0OworCitpbnQzMl90IE11bHRpVG9NYW55Q29udmVydGVyOjpvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IGNoYW5uZWxDb3VudDsgY2grKykgeworICAgICAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCdWZmZXIoKSArIGNoOworICAgICAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0c1tjaF0tPmdldEJ1ZmZlcigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKKyAgICAgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9ICppbnB1dEJ1ZmZlcjsKKyAgICAgICAgICAgIGlucHV0QnVmZmVyICs9IGNoYW5uZWxDb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudW1GcmFtZXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NdWx0aVRvTWFueUNvbnZlcnRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTXVsdGlUb01hbnlDb252ZXJ0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWU0MGEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTXVsdGlUb01hbnlDb252ZXJ0ZXIuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9NVUxUSV9UT19NQU5ZX0NPTlZFUlRFUl9ICisjZGVmaW5lIEZMT1dHUkFQSF9NVUxUSV9UT19NQU5ZX0NPTlZFUlRFUl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKKworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CisKKy8qKgorICogQ29udmVydCBhIG11bHRpLWNoYW5uZWwgaW50ZXJsZWF2ZWQgc3RyZWFtIHRvIG11bHRpcGxlIG1vbm8tY2hhbm5lbAorICogb3V0cHV0cworICovCisgICAgY2xhc3MgTXVsdGlUb01hbnlDb252ZXJ0ZXIgOiBwdWJsaWMgRmxvd0dyYXBoTm9kZSB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBNdWx0aVRvTWFueUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICAgICAgdmlydHVhbCB+TXVsdGlUb01hbnlDb252ZXJ0ZXIoKTsKKworICAgICAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICAgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiAiTXVsdGlUb01hbnlDb252ZXJ0ZXIiOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6Rmxvd0dyYXBoUG9ydEZsb2F0T3V0cHV0Pj4gb3V0cHV0czsKKyAgICAgICAgZmxvd2dyYXBoOjpGbG93R3JhcGhQb3J0RmxvYXRJbnB1dCBpbnB1dDsKKyAgICB9OworCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX01VTFRJX1RPX01BTllfQ09OVkVSVEVSX0gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NdWx0aVRvTW9ub0NvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9NdWx0aVRvTW9ub0NvbnZlcnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3Zjk1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL011bHRpVG9Nb25vQ29udmVydGVyLmNwcApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgorI2luY2x1ZGUgIk11bHRpVG9Nb25vQ29udmVydGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CisKK011bHRpVG9Nb25vQ29udmVydGVyOjpNdWx0aVRvTW9ub0NvbnZlcnRlcihpbnQzMl90IGlucHV0Q2hhbm5lbENvdW50KQorICAgICAgICA6IGlucHV0KCp0aGlzLCBpbnB1dENoYW5uZWxDb3VudCkKKyAgICAgICAgLCBvdXRwdXQoKnRoaXMsIDEpIHsKK30KKworTXVsdGlUb01vbm9Db252ZXJ0ZXI6On5NdWx0aVRvTW9ub0NvbnZlcnRlcigpID0gZGVmYXVsdDsKKworaW50MzJfdCBNdWx0aVRvTW9ub0NvbnZlcnRlcjo6b25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QnVmZmVyKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCdWZmZXIoKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKKyAgICAgICAgLy8gcmVhZCBmaXJzdCBjaGFubmVsIG9mIG11bHRpIHN0cmVhbSwgd3JpdGUgbWFueQorICAgICAgICAqb3V0cHV0QnVmZmVyKysgPSAqaW5wdXRCdWZmZXI7CisgICAgICAgIGlucHV0QnVmZmVyICs9IGNoYW5uZWxDb3VudDsKKyAgICB9CisgICAgcmV0dXJuIG51bUZyYW1lczsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTXVsdGlUb01vbm9Db252ZXJ0ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL011bHRpVG9Nb25vQ29udmVydGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1YjdiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL011bHRpVG9Nb25vQ29udmVydGVyLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfTVVMVElfVE9fTU9OT19DT05WRVJURVJfSAorI2RlZmluZSBGTE9XR1JBUEhfTVVMVElfVE9fTU9OT19DT05WRVJURVJfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggeworCisvKioKKyAqIENvbnZlcnQgYSBtdWx0aS1jaGFubmVsIGludGVybGVhdmVkIHN0cmVhbSB0byBhIG1vbm9waG9uaWMgc3RyZWFtCisgKiBieSBleHRyYWN0aW5nIGNoYW5uZWxbMF0uCisgKi8KKyAgICBjbGFzcyBNdWx0aVRvTW9ub0NvbnZlcnRlciA6IHB1YmxpYyBGbG93R3JhcGhOb2RlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IE11bHRpVG9Nb25vQ29udmVydGVyKGludDMyX3QgaW5wdXRDaGFubmVsQ291bnQpOworCisgICAgICAgIHZpcnR1YWwgfk11bHRpVG9Nb25vQ29udmVydGVyKCk7CisKKyAgICAgICAgaW50MzJfdCBvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgICAgICByZXR1cm4gIk11bHRpVG9Nb25vQ29udmVydGVyIjsKKyAgICAgICAgfQorCisgICAgICAgIEZsb3dHcmFwaFBvcnRGbG9hdElucHV0IGlucHV0OworICAgICAgICBGbG93R3JhcGhQb3J0RmxvYXRPdXRwdXQgb3V0cHV0OworICAgIH07CisKK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfTVVMVElfVE9fTU9OT19DT05WRVJURVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmNwcAppbmRleCBhMjYwODI4Li44MGFjNzJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmNwcApAQCAtMTQsMjAgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIlJhbXBMaW5lYXIiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogI2luY2x1ZGUgIlJhbXBMaW5lYXIuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CiAKIFJhbXBMaW5lYXI6OlJhbXBMaW5lYXIoaW50MzJfdCBjaGFubmVsQ291bnQpCi0gICAgICAgIDogaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkKLSAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgICAgICA6IEZsb3dHcmFwaEZpbHRlcihjaGFubmVsQ291bnQpIHsKICAgICBtVGFyZ2V0LnN0b3JlKDEuMGYpOwogfQogCkBAIC0zNywxNiArMzIsMTkgQEAKIAogdm9pZCBSYW1wTGluZWFyOjpzZXRUYXJnZXQoZmxvYXQgdGFyZ2V0KSB7CiAgICAgbVRhcmdldC5zdG9yZSh0YXJnZXQpOworICAgIC8vIElmIHRoZSByYW1wIGhhcyBub3QgYmVlbiB1c2VkIHRoZW4gc3RhcnQgaW1tZWRpYXRlbHkgYXQgdGhpcyBsZXZlbC4KKyAgICBpZiAobUxhc3RDYWxsQ291bnQgPT0ga0luaXRpYWxDYWxsQ291bnQpIHsKKyAgICAgICAgZm9yY2VDdXJyZW50KHRhcmdldCk7CisgICAgfQogfQogCiBmbG9hdCBSYW1wTGluZWFyOjppbnRlcnBvbGF0ZUN1cnJlbnQoKSB7CiAgICAgcmV0dXJuIG1MZXZlbFRvIC0gKG1SZW1haW5pbmcgKiBtU2NhbGVyKTsKIH0KIAotaW50MzJfdCBSYW1wTGluZWFyOjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgewotICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gaW5wdXQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKLSAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCbG9jaygpOwotICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QmxvY2soKTsKK2ludDMyX3QgUmFtcExpbmVhcjo6b25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QnVmZmVyKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCdWZmZXIoKTsKICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKIAogICAgIGZsb2F0IHRhcmdldCA9IGdldFRhcmdldCgpOwpAQCAtNTUsMTIgKzUzLDEwIEBACiAgICAgICAgIG1MZXZlbEZyb20gPSBpbnRlcnBvbGF0ZUN1cnJlbnQoKTsKICAgICAgICAgbUxldmVsVG8gPSB0YXJnZXQ7CiAgICAgICAgIG1SZW1haW5pbmcgPSBtTGVuZ3RoSW5GcmFtZXM7Ci0gICAgICAgIEFMT0dWKCIlcygpIG1MZXZlbEZyb20gPSAlZiwgbUxldmVsVG8gPSAlZiwgbVJlbWFpbmluZyA9ICVkLCBtU2NhbGVyID0gJWYiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgbUxldmVsRnJvbSwgbUxldmVsVG8sIG1SZW1haW5pbmcsIG1TY2FsZXIpOwogICAgICAgICBtU2NhbGVyID0gKG1MZXZlbFRvIC0gbUxldmVsRnJvbSkgLyBtTGVuZ3RoSW5GcmFtZXM7IC8vIGZvciBpbnRlcnBvbGF0aW9uCiAgICAgfQogCi0gICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gZnJhbWVzVG9Qcm9jZXNzOworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKIAogICAgIGlmIChtUmVtYWluaW5nID4gMCkgeyAvLyBSYW1waW5nPyBUaGlzIGRvZXNuJ3QgaGFwcGVuIHZlcnkgb2Z0ZW4uCiAgICAgICAgIGludDMyX3QgZnJhbWVzVG9SYW1wID0gc3RkOjptaW4oZnJhbWVzTGVmdCwgbVJlbWFpbmluZyk7CkBAIC04MSw1ICs3Nyw1IEBACiAgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9ICppbnB1dEJ1ZmZlcisrICogbUxldmVsVG87CiAgICAgfQogCi0gICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKKyAgICByZXR1cm4gbnVtRnJhbWVzOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5oCmluZGV4IGJkYzhmNDEuLjM4MzlkNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmgKQEAgLTIxLDE3ICsyMSwyNSBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogCi1uYW1lc3BhY2UgZmxvd2dyYXBoIHsKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggewogCi1jbGFzcyBSYW1wTGluZWFyIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CisvKioKKyAqIFdoZW4gdGhlIHRhcmdldCBpcyBtb2RpZmllZCB0aGVuIHRoZSBvdXRwdXQgd2lsbCByYW1wIHNtb290aGx5CisgKiBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBhbmQgdGhlIG5ldyB0YXJnZXQgdmFsdWUuCisgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHNtb290aCBvdXQgY29udHJvbCB2YWx1ZXMgYW5kIHJlZHVjZSBwb3BzLgorICoKKyAqIFRoZSB0YXJnZXQgbWF5IGJlIHVwZGF0ZWQgd2hpbGUgYSByYW1wIGlzIGluIHByb2dyZXNzLCB3aGljaCB3aWxsIHRyaWdnZXIKKyAqIGEgbmV3IHJhbXAgZnJvbSB0aGUgY3VycmVudCB2YWx1ZS4KKyAqLworY2xhc3MgUmFtcExpbmVhciA6IHB1YmxpYyBGbG93R3JhcGhGaWx0ZXIgewogcHVibGljOgogICAgIGV4cGxpY2l0IFJhbXBMaW5lYXIoaW50MzJfdCBjaGFubmVsQ291bnQpOwogCiAgICAgdmlydHVhbCB+UmFtcExpbmVhcigpID0gZGVmYXVsdDsKIAotICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKIAogICAgIC8qKgogICAgICAqIFRoaXMgaXMgdXNlZCBmb3IgdGhlIG5leHQgcmFtcC4KQEAgLTY2LDggKzc0LDkgQEAKICAgICAgICAgbUxldmVsVG8gPSBsZXZlbDsKICAgICB9CiAKLSAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OwotICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IG91dHB1dDsKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIlJhbXBMaW5lYXIiOworICAgIH0KIAogcHJpdmF0ZToKIApAQCAtODIsNiArOTEsNiBAQAogICAgIGZsb2F0ICAgICAgICAgICAgICAgbUxldmVsVG8gICAgICAgICA9IDAuMGY7CiB9OwogCi19IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLwogCiAjZW5kaWYgLy9GTE9XR1JBUEhfUkFNUF9MSU5FQVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2FtcGxlUmF0ZUNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TYW1wbGVSYXRlQ29udmVydGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTVmY2I4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2FtcGxlUmF0ZUNvbnZlcnRlci5jcHAKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlNhbXBsZVJhdGVDb252ZXJ0ZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKK3VzaW5nIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXI7CisKK1NhbXBsZVJhdGVDb252ZXJ0ZXI6OlNhbXBsZVJhdGVDb252ZXJ0ZXIoaW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpQ2hhbm5lbFJlc2FtcGxlciAmcmVzYW1wbGVyKQorICAgICAgICA6IEZsb3dHcmFwaEZpbHRlcihjaGFubmVsQ291bnQpCisgICAgICAgICwgbVJlc2FtcGxlcihyZXNhbXBsZXIpIHsKKyAgICBzZXREYXRhUHVsbGVkQXV0b21hdGljYWxseShmYWxzZSk7Cit9CisKK3ZvaWQgU2FtcGxlUmF0ZUNvbnZlcnRlcjo6cmVzZXQoKSB7CisgICAgRmxvd0dyYXBoTm9kZTo6cmVzZXQoKTsKKyAgICBtSW5wdXRDdXJzb3IgPSBrSW5pdGlhbENhbGxDb3VudDsKK30KKworLy8gUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSBzYW1wbGUgYXZhaWxhYmxlLgorYm9vbCBTYW1wbGVSYXRlQ29udmVydGVyOjppc0lucHV0QXZhaWxhYmxlKCkgeworICAgIC8vIElmIHdlIGhhdmUgY29uc3VtZWQgYWxsIG9mIHRoZSBpbnB1dCBkYXRhIHRoZW4gZ28gb3V0IGFuZCBnZXQgc29tZSBtb3JlLgorICAgIGlmIChtSW5wdXRDdXJzb3IgPj0gbU51bVZhbGlkSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgbUlucHV0Q2FsbENvdW50Kys7CisgICAgICAgIG1OdW1WYWxpZElucHV0RnJhbWVzID0gaW5wdXQucHVsbERhdGEobUlucHV0Q2FsbENvdW50LCBpbnB1dC5nZXRGcmFtZXNQZXJCdWZmZXIoKSk7CisgICAgICAgIG1JbnB1dEN1cnNvciA9IDA7CisgICAgfQorICAgIHJldHVybiAobUlucHV0Q3Vyc29yIDwgbU51bVZhbGlkSW5wdXRGcmFtZXMpOworfQorCitjb25zdCBmbG9hdCAqU2FtcGxlUmF0ZUNvbnZlcnRlcjo6Z2V0TmV4dElucHV0RnJhbWUoKSB7CisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QnVmZmVyKCk7CisgICAgcmV0dXJuICZpbnB1dEJ1ZmZlclttSW5wdXRDdXJzb3IrKyAqIGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpXTsKK30KKworaW50MzJfdCBTYW1wbGVSYXRlQ29udmVydGVyOjpvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJ1ZmZlcigpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIGludCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOworICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICAvLyBHYXRoZXIgaW5wdXQgc2FtcGxlcyBhcyBuZWVkZWQuCisgICAgICAgIGlmKG1SZXNhbXBsZXIuaXNXcml0ZU5lZWRlZCgpKSB7CisgICAgICAgICAgICBpZiAoaXNJbnB1dEF2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmZyYW1lID0gZ2V0TmV4dElucHV0RnJhbWUoKTsKKyAgICAgICAgICAgICAgICBtUmVzYW1wbGVyLndyaXRlTmV4dEZyYW1lKGZyYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBPdXRwdXQgZnJhbWUgaXMgaW50ZXJwb2xhdGVkIGZyb20gaW5wdXQgc2FtcGxlcy4KKyAgICAgICAgICAgIG1SZXNhbXBsZXIucmVhZE5leHRGcmFtZShvdXRwdXRCdWZmZXIpOworICAgICAgICAgICAgb3V0cHV0QnVmZmVyICs9IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGZyYW1lc0xlZnQtLTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVtRnJhbWVzIC0gZnJhbWVzTGVmdDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NhbXBsZVJhdGVDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NhbXBsZVJhdGVDb252ZXJ0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODgzZTZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2FtcGxlUmF0ZUNvbnZlcnRlci5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NBTVBMRV9SQVRFX0NPTlZFUlRFUl9ICisjZGVmaW5lIEZMT1dHUkFQSF9TQU1QTEVfUkFURV9DT05WRVJURVJfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCisjaW5jbHVkZSAicmVzYW1wbGVyL011bHRpQ2hhbm5lbFJlc2FtcGxlci5oIgorCituYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoIHsKKworY2xhc3MgU2FtcGxlUmF0ZUNvbnZlcnRlciA6IHB1YmxpYyBGbG93R3JhcGhGaWx0ZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNhbXBsZVJhdGVDb252ZXJ0ZXIoaW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNhbXBsZXI6Ok11bHRpQ2hhbm5lbFJlc2FtcGxlciAmbVJlc2FtcGxlcik7CisKKyAgICB2aXJ0dWFsIH5TYW1wbGVSYXRlQ29udmVydGVyKCkgPSBkZWZhdWx0OworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJTYW1wbGVSYXRlQ29udmVydGVyIjsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIHNhbXBsZSBhdmFpbGFibGUuCisgICAgYm9vbCBpc0lucHV0QXZhaWxhYmxlKCk7CisKKyAgICAvLyBUaGlzIGFzc3VtZXMgZGF0YSBpcyBhdmFpbGFibGUuIE9ubHkgY2FsbCBhZnRlciBjYWxsaW5nIGlzSW5wdXRBdmFpbGFibGUoKS4KKyAgICBjb25zdCBmbG9hdCAqZ2V0TmV4dElucHV0RnJhbWUoKTsKKworICAgIHJlc2FtcGxlcjo6TXVsdGlDaGFubmVsUmVzYW1wbGVyICZtUmVzYW1wbGVyOworCisgICAgaW50MzJfdCBtSW5wdXRDdXJzb3IgPSAwOyAgICAgICAgIC8vIG9mZnNldCBpbnRvIHRoZSBpbnB1dCBwb3J0IGJ1ZmZlcgorICAgIGludDMyX3QgbU51bVZhbGlkSW5wdXRGcmFtZXMgPSAwOyAvLyBudW1iZXIgb2YgdmFsaWQgZnJhbWVzIGN1cnJlbnRseSBpbiB0aGUgaW5wdXQgcG9ydCBidWZmZXIKKyAgICAvLyBXZSBuZWVkIG91ciBvd24gY2FsbENvdW50IGZvciB1cHN0cmVhbSBjYWxscyBiZWNhdXNlIGNhbGxzIG9jY3VyIGF0IGEgZGlmZmVyZW50IHJhdGUuCisgICAgLy8gVGhpcyBtZWFucyB3ZSBjYW5ub3QgaGF2ZSBjeWNsaWMgZ3JhcGhzIG9yIG1lcmdlcyB0aGF0IGNvbnRhaW4gYW4gU1JDLgorICAgIGludDY0X3QgbUlucHV0Q2FsbENvdW50ID0gMDsKKworfTsKKworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TQU1QTEVfUkFURV9DT05WRVJURVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAKaW5kZXggZmIzZGNiYy4uOTQwYTY2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuY3BwCkBAIC0xNiwzMSArMTYsMzEgQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAjaW5jbHVkZSAiU2lua0Zsb2F0LmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7Cit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwogCiBTaW5rRmxvYXQ6OlNpbmtGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgOiBBdWRpb1NpbmsoY2hhbm5lbENvdW50KSB7CisgICAgICAgIDogRmxvd0dyYXBoU2luayhjaGFubmVsQ291bnQpIHsKIH0KIAogaW50MzJfdCBTaW5rRmxvYXQ6OnJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKICAgICBmbG9hdCAqZmxvYXREYXRhID0gKGZsb2F0ICopIGRhdGE7Ci0gICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBpbnB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICBjb25zdCBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOwogCiAgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOwogICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgewogICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KLSAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKLSAgICAgICAgaWYgKGZyYW1lc1JlYWQgPD0gMCkgeworICAgICAgICBpbnQzMl90IGZyYW1lc1B1bGxlZCA9IHB1bGxEYXRhKGZyYW1lc0xlZnQpOworICAgICAgICBpZiAoZnJhbWVzUHVsbGVkIDw9IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGZsb2F0ICpzaWduYWwgPSBpbnB1dC5nZXRCbG9jaygpOwotICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNSZWFkICogY2hhbm5lbENvdW50OworICAgICAgICBjb25zdCBmbG9hdCAqc2lnbmFsID0gaW5wdXQuZ2V0QnVmZmVyKCk7CisgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1B1bGxlZCAqIGNoYW5uZWxDb3VudDsKICAgICAgICAgbWVtY3B5KGZsb2F0RGF0YSwgc2lnbmFsLCBudW1TYW1wbGVzICogc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgIGZsb2F0RGF0YSArPSBudW1TYW1wbGVzOwotICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1JlYWQ7CisgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzUHVsbGVkOwogICAgIH0KICAgICByZXR1cm4gbnVtRnJhbWVzIC0gZnJhbWVzTGVmdDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmgKaW5kZXggNzc3NWMwOC4uM2JlM2Y1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmgKQEAgLTIxLDE4ICsyMSwyNSBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogCi1uYW1lc3BhY2UgZmxvd2dyYXBoIHsKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggewogCi1jbGFzcyBTaW5rRmxvYXQgOiBwdWJsaWMgQXVkaW9TaW5rIHsKKy8qKgorICogQXVkaW9TaW5rIHRoYXQgbGV0cyB5b3UgcmVhZCBkYXRhIGFzIDMyLWJpdCBmbG9hdHMuCisgKi8KK2NsYXNzIFNpbmtGbG9hdCA6IHB1YmxpYyBGbG93R3JhcGhTaW5rIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBTaW5rRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpOworICAgIH5TaW5rRmxvYXQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKICAgICBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOwogCisgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJTaW5rRmxvYXQiOworICAgIH0KIH07CiAKLX0gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCiAKICNlbmRpZiAvL0ZMT1dHUkFQSF9TSU5LX0ZMT0FUX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAKaW5kZXggZmZlYzhmNS4uNjkwNDMxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAKQEAgLTE3LDE3ICsxNywxNiBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSAiU2lua0kxNi5oIgorCisjaWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgotI2luY2x1ZGUgIlNpbmtJMTYuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CiAKIFNpbmtJMTY6OlNpbmtJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpCi0gICAgICAgIDogQXVkaW9TaW5rKGNoYW5uZWxDb3VudCkge30KKyAgICAgICAgOiBGbG93R3JhcGhTaW5rKGNoYW5uZWxDb3VudCkge30KIAogaW50MzJfdCBTaW5rSTE2OjpyZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CiAgICAgaW50MTZfdCAqc2hvcnREYXRhID0gKGludDE2X3QgKikgZGF0YTsKQEAgLTM2LDEzICszNSwxMyBAQAogICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKICAgICB3aGlsZSAoZnJhbWVzTGVmdCA+IDApIHsKICAgICAgICAgLy8gUnVuIHRoZSBncmFwaCBhbmQgcHVsbCBkYXRhIHRocm91Z2ggdGhlIGlucHV0IHBvcnQuCi0gICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IHB1bGwoZnJhbWVzTGVmdCk7CisgICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IHB1bGxEYXRhKGZyYW1lc0xlZnQpOwogICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAwKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjb25zdCBmbG9hdCAqc2lnbmFsID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICAgICAgY29uc3QgZmxvYXQgKnNpZ25hbCA9IGlucHV0LmdldEJ1ZmZlcigpOwogICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNSZWFkICogY2hhbm5lbENvdW50OwotI2lmZGVmIF9fQU5EUk9JRF9fCisjaWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KHNob3J0RGF0YSwgc2lnbmFsLCBudW1TYW1wbGVzKTsKICAgICAgICAgc2hvcnREYXRhICs9IG51bVNhbXBsZXM7CiAgICAgICAgIHNpZ25hbCArPSBudW1TYW1wbGVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5oCmluZGV4IDZkODYyNjYuLmJmMTI0ZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmgKQEAgLTIwLDE3ICsyMCwyNCBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogCi1uYW1lc3BhY2UgZmxvd2dyYXBoIHsKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggewogCi1jbGFzcyBTaW5rSTE2IDogcHVibGljIEF1ZGlvU2luayB7CisvKioKKyAqIEF1ZGlvU2luayB0aGF0IGxldHMgeW91IHJlYWQgZGF0YSBhcyAxNi1iaXQgc2lnbmVkIGludGVnZXJzLgorICovCitjbGFzcyBTaW5rSTE2IDogcHVibGljIEZsb3dHcmFwaFNpbmsgewogcHVibGljOgogICAgIGV4cGxpY2l0IFNpbmtJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpOwogCiAgICAgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiU2lua0kxNiI7CisgICAgfQogfTsKIAotfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KIAogI2VuZGlmIC8vRkxPV0dSQVBIX1NJTktfSTE2X0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAKaW5kZXggMGNiMDc3ZC4uZDRmNjhiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAKQEAgLTE1LDE5ICsxNSwyMCBAQAogICovCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpZmRlZiBfX0FORFJPSURfXworCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgorI2luY2x1ZGUgIlNpbmtJMjQuaCIKKworI2lmIEZMT1dHUkFQSF9BTkRST0lEX0lOVEVSTkFMCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2VuZGlmCiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKLSNpbmNsdWRlICJTaW5rSTI0LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7Cit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwogCiBTaW5rSTI0OjpTaW5rSTI0KGludDMyX3QgY2hhbm5lbENvdW50KQotICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHt9CisgICAgICAgIDogRmxvd0dyYXBoU2luayhjaGFubmVsQ291bnQpIHt9CiAKIGludDMyX3QgU2lua0kyNDo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgewogICAgIHVpbnQ4X3QgKmJ5dGVEYXRhID0gKHVpbnQ4X3QgKikgZGF0YTsKQEAgLTM2LDEzICszNywxMyBAQAogICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKICAgICB3aGlsZSAoZnJhbWVzTGVmdCA+IDApIHsKICAgICAgICAgLy8gUnVuIHRoZSBncmFwaCBhbmQgcHVsbCBkYXRhIHRocm91Z2ggdGhlIGlucHV0IHBvcnQuCi0gICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IHB1bGwoZnJhbWVzTGVmdCk7CisgICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IHB1bGxEYXRhKGZyYW1lc0xlZnQpOwogICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAwKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjb25zdCBmbG9hdCAqZmxvYXREYXRhID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICAgICAgY29uc3QgZmxvYXQgKmZsb2F0RGF0YSA9IGlucHV0LmdldEJ1ZmZlcigpOwogICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNSZWFkICogY2hhbm5lbENvdW50OwotI2lmZGVmIF9fQU5EUk9JRF9fCisjaWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKICAgICAgICAgbWVtY3B5X3RvX3AyNF9mcm9tX2Zsb2F0KGJ5dGVEYXRhLCBmbG9hdERhdGEsIG51bVNhbXBsZXMpOwogICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCeXRlc1BlckkyNFBhY2tlZCA9IDM7CiAgICAgICAgIGJ5dGVEYXRhICs9IG51bVNhbXBsZXMgKiBrQnl0ZXNQZXJJMjRQYWNrZWQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmgKaW5kZXggNWI5YjUwNS4uNmI0MTM1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuaApAQCAtMjAsMTcgKzIwLDI1IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAKLW5hbWVzcGFjZSBmbG93Z3JhcGggeworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CiAKLWNsYXNzIFNpbmtJMjQgOiBwdWJsaWMgQXVkaW9TaW5rIHsKKy8qKgorICogQXVkaW9TaW5rIHRoYXQgbGV0cyB5b3UgcmVhZCBkYXRhIGFzIHBhY2tlZCAyNC1iaXQgc2lnbmVkIGludGVnZXJzLgorICogVGhlIHNhbXBsZSBzaXplIGlzIDMgYnl0ZXMuCisgKi8KK2NsYXNzIFNpbmtJMjQgOiBwdWJsaWMgRmxvd0dyYXBoU2luayB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgU2lua0kyNChpbnQzMl90IGNoYW5uZWxDb3VudCk7CiAKICAgICBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJTaW5rSTI0IjsKKyAgICB9CiB9OwogCi19IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLwogCiAjZW5kaWYgLy9GTE9XR1JBUEhfU0lOS19JMjRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kzMi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTMyLmNwcAppbmRleCBlYWI4NjNkLi5iMTRiM2QyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTMyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTMyLmNwcApAQCAtMTQsMTggKzE0LDE4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZkZWYgX19BTkRST0lEX18KLSNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKICNpbmNsdWRlICJGbG93Z3JhcGhVdGlsaXRpZXMuaCIKICNpbmNsdWRlICJTaW5rSTMyLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisjaWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKIAogU2lua0kzMjo6U2lua0kzMihpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgOiBBdWRpb1NpbmsoY2hhbm5lbENvdW50KSB7fQorICAgICAgICA6IEZsb3dHcmFwaFNpbmsoY2hhbm5lbENvdW50KSB7fQogCiBpbnQzMl90IFNpbmtJMzI6OnJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKICAgICBpbnQzMl90ICppbnREYXRhID0gKGludDMyX3QgKikgZGF0YTsKQEAgLTM0LDEzICszNCwxMyBAQAogICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKICAgICB3aGlsZSAoZnJhbWVzTGVmdCA+IDApIHsKICAgICAgICAgLy8gUnVuIHRoZSBncmFwaCBhbmQgcHVsbCBkYXRhIHRocm91Z2ggdGhlIGlucHV0IHBvcnQuCi0gICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IHB1bGwoZnJhbWVzTGVmdCk7CisgICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IHB1bGxEYXRhKGZyYW1lc0xlZnQpOwogICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAwKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjb25zdCBmbG9hdCAqc2lnbmFsID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICAgICAgY29uc3QgZmxvYXQgKnNpZ25hbCA9IGlucHV0LmdldEJ1ZmZlcigpOwogICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNSZWFkICogY2hhbm5lbENvdW50OwotI2lmZGVmIF9fQU5EUk9JRF9fCisjaWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKICAgICAgICAgbWVtY3B5X3RvX2kzMl9mcm9tX2Zsb2F0KGludERhdGEsIHNpZ25hbCwgbnVtU2FtcGxlcyk7CiAgICAgICAgIGludERhdGEgKz0gbnVtU2FtcGxlczsKICAgICAgICAgc2lnbmFsICs9IG51bVNhbXBsZXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTMyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTMyLmgKaW5kZXggMDlkMjNiNy4uMzU1MDdlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kzMi5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuaApAQCAtMTksMTggKzE5LDIyIEBACiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKIAotbmFtZXNwYWNlIGZsb3dncmFwaCB7CituYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoIHsKIAotY2xhc3MgU2lua0kzMiA6IHB1YmxpYyBBdWRpb1NpbmsgeworY2xhc3MgU2lua0kzMiA6IHB1YmxpYyBGbG93R3JhcGhTaW5rIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBTaW5rSTMyKGludDMyX3QgY2hhbm5lbENvdW50KTsKICAgICB+U2lua0kzMigpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAogICAgIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIlNpbmtJMzIiOworICAgIH0KIH07CiAKLX0gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworfSAvKiBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoICovCiAKICNlbmRpZiAvL0ZMT1dHUkFQSF9TSU5LX0kzMl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAKaW5kZXggNGJiNjc0Zi4uYTBjODgyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmNwcApAQCAtMTYsMjMgKzE2LDIyIEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogI2luY2x1ZGUgIlNvdXJjZUZsb2F0LmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7Cit1c2luZyBuYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoOwogCiBTb3VyY2VGbG9hdDo6U291cmNlRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpCi0gICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7CisgICAgICAgIDogRmxvd0dyYXBoU291cmNlQnVmZmVyZWQoY2hhbm5lbENvdW50KSB7CiB9CiAKLWludDMyX3QgU291cmNlRmxvYXQ6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CitpbnQzMl90IFNvdXJjZUZsb2F0OjpvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJ1ZmZlcigpOworICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOwogCi0gICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOwotICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOwotCi0gICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OwotICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKLSAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CisgICAgY29uc3QgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OworICAgIGNvbnN0IGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKKyAgICBjb25zdCBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CiAKICAgICBjb25zdCBmbG9hdCAqZmxvYXRCYXNlID0gKGZsb2F0ICopIG1EYXRhOwogICAgIGNvbnN0IGZsb2F0ICpmbG9hdERhdGEgPSAmZmxvYXRCYXNlW21GcmFtZUluZGV4ICogY2hhbm5lbENvdW50XTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5oCmluZGV4IGU2ZWVkOWYuLjc4MDUzZTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaApAQCAtMjAsMTcgKzIwLDI1IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJGbG93R3JhcGhOb2RlLmgiCiAKLW5hbWVzcGFjZSBmbG93Z3JhcGggeworbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCB7CiAKLWNsYXNzIFNvdXJjZUZsb2F0IDogcHVibGljIEF1ZGlvU291cmNlIHsKKy8qKgorICogQXVkaW9Tb3VyY2UgdGhhdCByZWFkcyBhIGJsb2NrIG9mIHByZS1kZWZpbmVkIGZsb2F0IGRhdGEuCisgKi8KK2NsYXNzIFNvdXJjZUZsb2F0IDogcHVibGljIEZsb3dHcmFwaFNvdXJjZUJ1ZmZlcmVkIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBTb3VyY2VGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisgICAgflNvdXJjZUZsb2F0KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCi0gICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJTb3VyY2VGbG9hdCI7CisgICAgfQogfTsKIAotfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KIAogI2VuZGlmIC8vRkxPV0dSQVBIX1NPVVJDRV9GTE9BVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmNwcAppbmRleCBjM2ZjZWMyLi4xNmNkMmIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAKQEAgLTE3LDIxICsxNywyMSBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgorI2luY2x1ZGUgIlNvdXJjZUkxNi5oIgorCisjaWYgRkxPV0dSQVBIX0FORFJPSURfSU5URVJOQUwKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgotI2luY2x1ZGUgIlNvdXJjZUkxNi5oIgotCi11c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOwordXNpbmcgbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaDsKIAogU291cmNlSTE2OjpTb3VyY2VJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpCi0gICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7CisgICAgICAgIDogRmxvd0dyYXBoU291cmNlQnVmZmVyZWQoY2hhbm5lbENvdW50KSB7CiB9CiAKLWludDMyX3QgU291cmNlSTE2OjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgewotICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QmxvY2soKTsKK2ludDMyX3QgU291cmNlSTE2OjpvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBmbG9hdCAqZmxvYXREYXRhID0gb3V0cHV0LmdldEJ1ZmZlcigpOwogICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOwogCiAgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OwpAQCAtNDEsNyArNDEsNyBAQAogICAgIGNvbnN0IGludDE2X3QgKnNob3J0QmFzZSA9IHN0YXRpY19jYXN0PGNvbnN0IGludDE2X3QgKj4obURhdGEpOwogICAgIGNvbnN0IGludDE2X3QgKnNob3J0RGF0YSA9ICZzaG9ydEJhc2VbbUZyYW1lSW5kZXggKiBjaGFubmVsQ291bnRdOwogCi0jaWZkZWYgX19BTkRST0lEX18KKyNpZiBGTE9XR1JBUEhfQU5EUk9JRF9JTlRFUk5BTAogICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihmbG9hdERhdGEsIHNob3J0RGF0YSwgbnVtU2FtcGxlcyk7CiAjZWxzZQogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5oCmluZGV4IDJiMTE2Y2YuLjkyMzg5MGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5oCkBAIC0yMCwxNyArMjAsMjMgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKIAotbmFtZXNwYWNlIGZsb3dncmFwaCB7Ci0KLWNsYXNzIFNvdXJjZUkxNiA6IHB1YmxpYyBBdWRpb1NvdXJjZSB7CituYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoIHsKKy8qKgorICogQXVkaW9Tb3VyY2UgdGhhdCByZWFkcyBhIGJsb2NrIG9mIHByZS1kZWZpbmVkIDE2LWJpdCBpbnRlZ2VyIGRhdGEuCisgKi8KK2NsYXNzIFNvdXJjZUkxNiA6IHB1YmxpYyBGbG93R3JhcGhTb3VyY2VCdWZmZXJlZCB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgU291cmNlSTE2KGludDMyX3QgY2hhbm5lbENvdW50KTsKIAotICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiU291cmNlSTE2IjsKKyAgICB9CiB9OwogCi19IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KK30gLyogbmFtZXNwYWNlIEZMT1dHUkFQSF9PVVRFUl9OQU1FU1BBQ0U6OmZsb3dncmFwaCAqLwogCiAjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0kxNl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmNwcAppbmRleCAwOTc5NTRlLi5kNTRiOTU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAKQEAgLTE1LDI1ICsxNSwyNSBAQAogICovCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKKyNpbmNsdWRlICJTb3VyY2VJMjQuaCIKKworI2lmIEZMT1dHUkFQSF9BTkRST0lEX0lOVEVSTkFMCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2VuZGlmCiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKLSNpbmNsdWRlICJTb3VyY2VJMjQuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CiAKIGNvbnN0ZXhwciBpbnQga0J5dGVzUGVySTI0UGFja2VkID0gMzsKIAogU291cmNlSTI0OjpTb3VyY2VJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpCi0gICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7CisgICAgICAgIDogRmxvd0dyYXBoU291cmNlQnVmZmVyZWQoY2hhbm5lbENvdW50KSB7CiB9CiAKLWludDMyX3QgU291cmNlSTI0OjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgewotICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QmxvY2soKTsKK2ludDMyX3QgU291cmNlSTI0OjpvblByb2Nlc3MoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBmbG9hdCAqZmxvYXREYXRhID0gb3V0cHV0LmdldEJ1ZmZlcigpOwogICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOwogCiAgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OwpAQCAtNDMsNyArNDMsNyBAQAogICAgIGNvbnN0IHVpbnQ4X3QgKmJ5dGVCYXNlID0gKHVpbnQ4X3QgKikgbURhdGE7CiAgICAgY29uc3QgdWludDhfdCAqYnl0ZURhdGEgPSAmYnl0ZUJhc2VbbUZyYW1lSW5kZXggKiBjaGFubmVsQ291bnQgKiBrQnl0ZXNQZXJJMjRQYWNrZWRdOwogCi0jaWZkZWYgX19BTkRST0lEX18KKyNpZiBGTE9XR1JBUEhfQU5EUk9JRF9JTlRFUk5BTAogICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3AyNChmbG9hdERhdGEsIGJ5dGVEYXRhLCBudW1TYW1wbGVzKTsKICNlbHNlCiAgICAgc3RhdGljIGNvbnN0IGZsb2F0IHNjYWxlID0gMS4gLyAoZmxvYXQpKDFVTCA8PCAzMSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oCmluZGV4IDJlZDZmMTguLmZiNjZkNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oCkBAIC0xNywxOSArMTcsMjcgQEAKICNpZm5kZWYgRkxPV0dSQVBIX1NPVVJDRV9JMjRfSAogI2RlZmluZSBGTE9XR1JBUEhfU09VUkNFX0kyNF9ICiAKLSNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKIAotbmFtZXNwYWNlIGZsb3dncmFwaCB7CituYW1lc3BhY2UgRkxPV0dSQVBIX09VVEVSX05BTUVTUEFDRTo6Zmxvd2dyYXBoIHsKIAotY2xhc3MgU291cmNlSTI0IDogcHVibGljIEF1ZGlvU291cmNlIHsKKy8qKgorICogQXVkaW9Tb3VyY2UgdGhhdCByZWFkcyBhIGJsb2NrIG9mIHByZS1kZWZpbmVkIDI0LWJpdCBwYWNrZWQgaW50ZWdlciBkYXRhLgorICovCitjbGFzcyBTb3VyY2VJMjQgOiBwdWJsaWMgRmxvd0dyYXBoU291cmNlQnVmZmVyZWQgewogcHVibGljOgogICAgIGV4cGxpY2l0IFNvdXJjZUkyNChpbnQzMl90IGNoYW5uZWxDb3VudCk7CiAKLSAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIlNvdXJjZUkyNCI7CisgICAgfQogfTsKIAotfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KIAogI2VuZGlmIC8vRkxPV0dSQVBIX1NPVVJDRV9JMjRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTMyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkzMi5jcHAKaW5kZXggZTgxNzdhZC4uYjFjOGY3NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTMyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMzIuY3BwCkBAIC0xNywzMSArMTcsMzEgQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgIkZsb3dHcmFwaE5vZGUuaCIKKyNpbmNsdWRlICJTb3VyY2VJMzIuaCIKKworI2lmIEZMT1dHUkFQSF9BTkRST0lEX0lOVEVSTkFMCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2VuZGlmCiAKLSNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKLSNpbmNsdWRlICJTb3VyY2VJMzIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CiAKIFNvdXJjZUkzMjo6U291cmNlSTMyKGludDMyX3QgY2hhbm5lbENvdW50KQotICAgICAgICA6IEF1ZGlvU291cmNlKGNoYW5uZWxDb3VudCkgeworICAgICAgICA6IEZsb3dHcmFwaFNvdXJjZUJ1ZmZlcmVkKGNoYW5uZWxDb3VudCkgewogfQogCi1pbnQzMl90IFNvdXJjZUkzMjo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKLSAgICBmbG9hdCAqZmxvYXREYXRhID0gb3V0cHV0LmdldEJsb2NrKCk7Ci0gICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CitpbnQzMl90IFNvdXJjZUkzMjo6b25Qcm9jZXNzKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgZmxvYXQgKmZsb2F0RGF0YSA9IG91dHB1dC5nZXRCdWZmZXIoKTsKKyAgICBjb25zdCBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKIAotICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG1TaXplSW5GcmFtZXMgLSBtRnJhbWVJbmRleDsKLSAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IHN0ZDo6bWluKG51bUZyYW1lcywgZnJhbWVzTGVmdCk7Ci0gICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogY2hhbm5lbENvdW50OworICAgIGNvbnN0IGludDMyX3QgZnJhbWVzTGVmdCA9IG1TaXplSW5GcmFtZXMgLSBtRnJhbWVJbmRleDsKKyAgICBjb25zdCBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IHN0ZDo6bWluKG51bUZyYW1lcywgZnJhbWVzTGVmdCk7CisgICAgY29uc3QgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogY2hhbm5lbENvdW50OwogCiAgICAgY29uc3QgaW50MzJfdCAqaW50QmFzZSA9IHN0YXRpY19jYXN0PGNvbnN0IGludDMyX3QgKj4obURhdGEpOwogICAgIGNvbnN0IGludDMyX3QgKmludERhdGEgPSAmaW50QmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudF07CiAKLSNpZmRlZiBfX0FORFJPSURfXworI2lmIEZMT1dHUkFQSF9BTkRST0lEX0lOVEVSTkFMCiAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTMyKGZsb2F0RGF0YSwgaW50RGF0YSwgbnVtU2FtcGxlcyk7CiAjZWxzZQogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMzIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkzMi5oCmluZGV4IGU1MGY5YmUuLjcxMDk0NjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkzMi5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkzMi5oCkBAIC0xOSwyMSArMTksMjQgQEAKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogCi0jaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiRmxvd0dyYXBoTm9kZS5oIgogCi1uYW1lc3BhY2UgZmxvd2dyYXBoIHsKK25hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggewogCi1jbGFzcyBTb3VyY2VJMzIgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworY2xhc3MgU291cmNlSTMyIDogcHVibGljIEZsb3dHcmFwaFNvdXJjZUJ1ZmZlcmVkIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBTb3VyY2VJMzIoaW50MzJfdCBjaGFubmVsQ291bnQpOwogICAgIH5Tb3VyY2VJMzIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKLSAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CiAKKyAgICBjb25zdCBjaGFyICpnZXROYW1lKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gIlNvdXJjZUkzMiI7CisgICAgfQogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtTY2FsZSA9IDEuMCAvICgxVUwgPDwgMzEpOwogfTsKIAotfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCit9IC8qIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGggKi8KIAogI2VuZGlmIC8vRkxPV0dSQVBIX1NPVVJDRV9JMzJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0h5cGVyYm9saWNDb3NpbmVXaW5kb3cuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9IeXBlcmJvbGljQ29zaW5lV2luZG93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZlYzBlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9IeXBlcmJvbGljQ29zaW5lV2luZG93LmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRVNBTVBMRVJfSFlQRVJCT0xJQ19DT1NJTkVfV0lORE9XX0gKKyNkZWZpbmUgUkVTQU1QTEVSX0hZUEVSQk9MSUNfQ09TSU5FX1dJTkRPV19ICisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJSZXNhbXBsZXJEZWZpbml0aW9ucy5oIgorCituYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyIHsKKworLyoqCisgKiBDYWxjdWxhdGUgYSBIeXBlcmJvbGljQ29zaW5lV2luZG93IHdpbmRvdyBjZW50ZXJlZCBhdCAwLgorICogVGhpcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhIEthaXNlciB3aW5kb3cuCisgKgorICogVGhlIGNvZGUgaXMgYmFzZWQgb24gYW4gYW5vbnltb3VzIGNvbnRyaWJ1dGlvbiBieSAiYSBjb25jZXJuZWQgY2l0aXplbiI6CisgKiBodHRwczovL2RzcC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMzc3MTQva2Fpc2VyLXdpbmRvdy1hcHByb3hpbWF0aW9uCisgKi8KK2NsYXNzIEh5cGVyYm9saWNDb3NpbmVXaW5kb3cgeworcHVibGljOgorICAgIEh5cGVyYm9saWNDb3NpbmVXaW5kb3coKSB7CisgICAgICAgIHNldFN0b3BCYW5kQXR0ZW51YXRpb24oNjApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhdHRlbnVhdGlvbiB0eXBpY2FsIHZhbHVlcyByYW5nZSBmcm9tIDMwIHRvIDkwIGRCCisgICAgICogQHJldHVybiBiZXRhCisgICAgICovCisgICAgZG91YmxlIHNldFN0b3BCYW5kQXR0ZW51YXRpb24oZG91YmxlIGF0dGVudWF0aW9uKSB7CisgICAgICAgIGRvdWJsZSBhbHBoYSA9ICgoLTMyNS4xZS02ICogYXR0ZW51YXRpb24gKyAwLjE2NzcpICogYXR0ZW51YXRpb24pIC0gMy4xNDk7CisgICAgICAgIHNldEFscGhhKGFscGhhKTsKKyAgICAgICAgcmV0dXJuIGFscGhhOworICAgIH0KKworICAgIHZvaWQgc2V0QWxwaGEoZG91YmxlIGFscGhhKSB7CisgICAgICAgIG1BbHBoYSA9IGFscGhhOworICAgICAgICBtSW52ZXJzZUNvc2hBbHBoYSA9IDEuMCAvIGNvc2goYWxwaGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB4IHJhbmdlcyBmcm9tIC0xLjAgdG8gKzEuMAorICAgICAqLworICAgIGRvdWJsZSBvcGVyYXRvcigpKGRvdWJsZSB4KSB7CisgICAgICAgIGRvdWJsZSB4MiA9IHggKiB4OworICAgICAgICBpZiAoeDIgPj0gMS4wKSByZXR1cm4gMC4wOworICAgICAgICBkb3VibGUgdyA9IG1BbHBoYSAqIHNxcnQoMS4wIC0geDIpOworICAgICAgICByZXR1cm4gY29zaCh3KSAqIG1JbnZlcnNlQ29zaEFscGhhOworICAgIH0KKworcHJpdmF0ZToKKyAgICBkb3VibGUgbUFscGhhID0gMC4wOworICAgIGRvdWJsZSBtSW52ZXJzZUNvc2hBbHBoYSA9IDEuMDsKK307CisKK30gLyogbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciAqLworCisjZW5kaWYgLy9SRVNBTVBMRVJfSFlQRVJCT0xJQ19DT1NJTkVfV0lORE9XX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9JbnRlZ2VyUmF0aW8uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0ludGVnZXJSYXRpby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllOWIyNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9JbnRlZ2VyUmF0aW8uY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJJbnRlZ2VyUmF0aW8uaCIKKwordXNpbmcgbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlcjsKKworLy8gRW5vdWdoIHByaW1lcyB0byBjb3ZlciB0aGUgY29tbW9uIHNhbXBsZSByYXRlcy4KK3N0YXRpYyBjb25zdCBpbnQga1ByaW1lc1tdID0geworICAgICAgICAyLCAzLCA1LCA3LCAxMSwgMTMsIDE3LCAxOSwgMjMsIDI5LCAzMSwgMzcsIDQxLAorICAgICAgICA0MywgNDcsIDUzLCA1OSwgNjEsIDY3LCA3MSwgNzMsIDc5LCA4MywgODksIDk3LAorICAgICAgICAxMDEsIDEwMywgMTA3LCAxMDksIDExMywgMTI3LCAxMzEsIDEzNywgMTM5LCAxNDksCisgICAgICAgIDE1MSwgMTU3LCAxNjMsIDE2NywgMTczLCAxNzksIDE4MSwgMTkxLCAxOTMsIDE5NywgMTk5fTsKKwordm9pZCBJbnRlZ2VyUmF0aW86OnJlZHVjZSgpIHsKKyAgICBmb3IgKGludCBwcmltZSA6IGtQcmltZXMpIHsKKyAgICAgICAgaWYgKG1OdW1lcmF0b3IgPCBwcmltZSB8fCBtRGVub21pbmF0b3IgPCBwcmltZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5kIGJpZ2dlc3QgcHJpbWUgZmFjdG9yIGZvciBudW1lcmF0b3IuCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgdG9wID0gbU51bWVyYXRvciAvIHByaW1lOworICAgICAgICAgICAgaW50IGJvdHRvbSA9IG1EZW5vbWluYXRvciAvIHByaW1lOworICAgICAgICAgICAgaWYgKCh0b3AgPj0gMSkKKyAgICAgICAgICAgICAgICAmJiAoYm90dG9tID49IDEpCisgICAgICAgICAgICAgICAgJiYgKHRvcCAqIHByaW1lID09IG1OdW1lcmF0b3IpIC8vIGRpdmlkZWQgZXZlbmx5PworICAgICAgICAgICAgICAgICYmIChib3R0b20gKiBwcmltZSA9PSBtRGVub21pbmF0b3IpKSB7CisgICAgICAgICAgICAgICAgbU51bWVyYXRvciA9IHRvcDsKKyAgICAgICAgICAgICAgICBtRGVub21pbmF0b3IgPSBib3R0b207CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvSW50ZWdlclJhdGlvLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvSW50ZWdlclJhdGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiNTI0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9JbnRlZ2VyUmF0aW8uaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFU0FNUExFUl9JTlRFR0VSX1JBVElPX0gKKyNkZWZpbmUgUkVTQU1QTEVSX0lOVEVHRVJfUkFUSU9fSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJSZXNhbXBsZXJEZWZpbml0aW9ucy5oIgorCituYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyIHsKKworLyoqCisgKiBSZXByZXNlbnQgdGhlIHJhdGlvIG9mIHR3byBpbnRlZ2Vycy4KKyAqLworY2xhc3MgSW50ZWdlclJhdGlvIHsKK3B1YmxpYzoKKyAgICBJbnRlZ2VyUmF0aW8oaW50MzJfdCBudW1lcmF0b3IsIGludDMyX3QgZGVub21pbmF0b3IpCisgICAgICAgICAgICA6IG1OdW1lcmF0b3IobnVtZXJhdG9yKSwgbURlbm9taW5hdG9yKGRlbm9taW5hdG9yKSB7fQorCisgICAgLyoqCisgICAgICogUmVkdWNlIGJ5IHJlbW92aW5nIGNvbW1vbiBwcmltZSBmYWN0b3JzLgorICAgICAqLworICAgIHZvaWQgcmVkdWNlKCk7CisKKyAgICBpbnQzMl90IGdldE51bWVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG1OdW1lcmF0b3I7CisgICAgfQorCisgICAgaW50MzJfdCBnZXREZW5vbWluYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG1EZW5vbWluYXRvcjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgaW50MzJfdCBtTnVtZXJhdG9yOworICAgIGludDMyX3QgbURlbm9taW5hdG9yOworfTsKKworfSAvKiBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyICovCisKKyNlbmRpZiAvL1JFU0FNUExFUl9JTlRFR0VSX1JBVElPX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9LYWlzZXJXaW5kb3cuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9LYWlzZXJXaW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTlmOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0thaXNlcldpbmRvdy5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUkVTQU1QTEVSX0tBSVNFUl9XSU5ET1dfSAorI2RlZmluZSBSRVNBTVBMRVJfS0FJU0VSX1dJTkRPV19ICisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJSZXNhbXBsZXJEZWZpbml0aW9ucy5oIgorCituYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyIHsKKworLyoqCisgKiBDYWxjdWxhdGUgYSBLYWlzZXIgd2luZG93IGNlbnRlcmVkIGF0IDAuCisgKi8KK2NsYXNzIEthaXNlcldpbmRvdyB7CitwdWJsaWM6CisgICAgS2Fpc2VyV2luZG93KCkgeworICAgICAgICBzZXRTdG9wQmFuZEF0dGVudWF0aW9uKDYwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXR0ZW51YXRpb24gdHlwaWNhbCB2YWx1ZXMgcmFuZ2UgZnJvbSAzMCB0byA5MCBkQgorICAgICAqIEByZXR1cm4gYmV0YQorICAgICAqLworICAgIGRvdWJsZSBzZXRTdG9wQmFuZEF0dGVudWF0aW9uKGRvdWJsZSBhdHRlbnVhdGlvbikgeworICAgICAgICBkb3VibGUgYmV0YSA9IDAuMDsKKyAgICAgICAgaWYgKGF0dGVudWF0aW9uID4gNTApIHsKKyAgICAgICAgICAgIGJldGEgPSAwLjExMDIgKiAoYXR0ZW51YXRpb24gLSA4LjcpOworICAgICAgICB9IGVsc2UgaWYgKGF0dGVudWF0aW9uID49IDIxKSB7CisgICAgICAgICAgICBkb3VibGUgYTIxID0gYXR0ZW51YXRpb24gLSAyMTsKKyAgICAgICAgICAgIGJldGEgPSAwLjU4NDIgKiBwb3coYTIxLCAwLjQpICsgKDAuMDc4ODYgKiBhMjEpOworICAgICAgICB9CisgICAgICAgIHNldEJldGEoYmV0YSk7CisgICAgICAgIHJldHVybiBiZXRhOworICAgIH0KKworICAgIHZvaWQgc2V0QmV0YShkb3VibGUgYmV0YSkgeworICAgICAgICBtQmV0YSA9IGJldGE7CisgICAgICAgIG1JbnZlcnNlQmVzc2VsQmV0YSA9IDEuMCAvIGJlc3NlbChiZXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0geCByYW5nZXMgZnJvbSAtMS4wIHRvICsxLjAKKyAgICAgKi8KKyAgICBkb3VibGUgb3BlcmF0b3IoKShkb3VibGUgeCkgeworICAgICAgICBkb3VibGUgeDIgPSB4ICogeDsKKyAgICAgICAgaWYgKHgyID49IDEuMCkgcmV0dXJuIDAuMDsKKyAgICAgICAgZG91YmxlIHcgPSBtQmV0YSAqIHNxcnQoMS4wIC0geDIpOworICAgICAgICByZXR1cm4gYmVzc2VsKHcpICogbUludmVyc2VCZXNzZWxCZXRhOworICAgIH0KKworICAgIC8vIEFwcHJveGltYXRpb24gb2YgYQorICAgIC8vIG1vZGlmaWVkIHplcm8gb3JkZXIgQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kLgorICAgIC8vIEJhc2VkIG9uIGEgZGlzY3Vzc2lvbiBhdDoKKyAgICAvLyBodHRwczovL2RzcC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMzc3MTQva2Fpc2VyLXdpbmRvdy1hcHByb3hpbWF0aW9uCisgICAgc3RhdGljIGRvdWJsZSBiZXNzZWwoZG91YmxlIHgpIHsKKyAgICAgICAgZG91YmxlIHkgPSBjb3NoKDAuOTcwOTQxODE3NDI2MDUyICogeCk7CisgICAgICAgIHkgKz0gY29zaCgwLjg4NTQ1NjAyNTY1MzIwOTkgKiB4KTsKKyAgICAgICAgeSArPSBjb3NoKDAuNzQ4NTEwNzQ4MTcxMTAxMSAqIHgpOworICAgICAgICB5ICs9IGNvc2goMC41NjgwNjQ3NDY3MzExNTU4ICogeCk7CisgICAgICAgIHkgKz0gY29zaCgwLjM1NDYwNDg4NzA0MjUzNTYgKiB4KTsKKyAgICAgICAgeSArPSBjb3NoKDAuMTIwNTM2NjgwMjU1MzIzICogeCk7CisgICAgICAgIHkgKj0gMjsKKyAgICAgICAgeSArPSBjb3NoKHgpOworICAgICAgICB5IC89IDEzOworICAgICAgICByZXR1cm4geTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgZG91YmxlIG1CZXRhID0gMC4wOworICAgIGRvdWJsZSBtSW52ZXJzZUJlc3NlbEJldGEgPSAxLjA7Cit9OworCit9IC8qIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgKi8KKworI2VuZGlmIC8vUkVTQU1QTEVSX0tBSVNFUl9XSU5ET1dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0xpbmVhclJlc2FtcGxlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTGluZWFyUmVzYW1wbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQ5MzJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0xpbmVhclJlc2FtcGxlci5jcHAKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxpbmVhclJlc2FtcGxlci5oIgorCit1c2luZyBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyOworCitMaW5lYXJSZXNhbXBsZXI6OkxpbmVhclJlc2FtcGxlcihjb25zdCBNdWx0aUNoYW5uZWxSZXNhbXBsZXI6OkJ1aWxkZXIgJmJ1aWxkZXIpCisgICAgICAgIDogTXVsdGlDaGFubmVsUmVzYW1wbGVyKGJ1aWxkZXIpIHsKKyAgICBtUHJldmlvdXNGcmFtZSA9IHN0ZDo6bWFrZV91bmlxdWU8ZmxvYXRbXT4oZ2V0Q2hhbm5lbENvdW50KCkpOworICAgIG1DdXJyZW50RnJhbWUgPSBzdGQ6Om1ha2VfdW5pcXVlPGZsb2F0W10+KGdldENoYW5uZWxDb3VudCgpKTsKK30KKwordm9pZCBMaW5lYXJSZXNhbXBsZXI6OndyaXRlRnJhbWUoY29uc3QgZmxvYXQgKmZyYW1lKSB7CisgICAgbWVtY3B5KG1QcmV2aW91c0ZyYW1lLmdldCgpLCBtQ3VycmVudEZyYW1lLmdldCgpLCBzaXplb2YoZmxvYXQpICogZ2V0Q2hhbm5lbENvdW50KCkpOworICAgIG1lbWNweShtQ3VycmVudEZyYW1lLmdldCgpLCBmcmFtZSwgc2l6ZW9mKGZsb2F0KSAqIGdldENoYW5uZWxDb3VudCgpKTsKK30KKwordm9pZCBMaW5lYXJSZXNhbXBsZXI6OnJlYWRGcmFtZShmbG9hdCAqZnJhbWUpIHsKKyAgICBmbG9hdCAqcHJldmlvdXMgPSBtUHJldmlvdXNGcmFtZS5nZXQoKTsKKyAgICBmbG9hdCAqY3VycmVudCA9IG1DdXJyZW50RnJhbWUuZ2V0KCk7CisgICAgZmxvYXQgcGhhc2UgPSAoZmxvYXQpIGdldEludGVnZXJQaGFzZSgpIC8gbURlbm9taW5hdG9yOworICAgIC8vIGl0ZXJhdGUgYWNyb3NzIHNhbXBsZXMgaW4gdGhlIGZyYW1lCisgICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBnZXRDaGFubmVsQ291bnQoKTsgY2hhbm5lbCsrKSB7CisgICAgICAgIGZsb2F0IGYwID0gKnByZXZpb3VzKys7CisgICAgICAgIGZsb2F0IGYxID0gKmN1cnJlbnQrKzsKKyAgICAgICAgKmZyYW1lKysgPSBmMCArIChwaGFzZSAqIChmMSAtIGYwKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0xpbmVhclJlc2FtcGxlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL0xpbmVhclJlc2FtcGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MzQzNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTGluZWFyUmVzYW1wbGVyLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRVNBTVBMRVJfTElORUFSX1JFU0FNUExFUl9ICisjZGVmaW5lIFJFU0FNUExFUl9MSU5FQVJfUkVTQU1QTEVSX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIk11bHRpQ2hhbm5lbFJlc2FtcGxlci5oIgorI2luY2x1ZGUgIlJlc2FtcGxlckRlZmluaXRpb25zLmgiCisKK25hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgeworCisvKioKKyAqIFNpbXBsZSByZXNhbXBsZXIgdGhhdCB1c2VzIGJpLWxpbmVhciBpbnRlcnBvbGF0aW9uLgorICovCitjbGFzcyBMaW5lYXJSZXNhbXBsZXIgOiBwdWJsaWMgTXVsdGlDaGFubmVsUmVzYW1wbGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBMaW5lYXJSZXNhbXBsZXIoY29uc3QgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpCdWlsZGVyICZidWlsZGVyKTsKKworICAgIHZvaWQgd3JpdGVGcmFtZShjb25zdCBmbG9hdCAqZnJhbWUpIG92ZXJyaWRlOworCisgICAgdm9pZCByZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxvYXRbXT4gbVByZXZpb3VzRnJhbWU7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb2F0W10+IG1DdXJyZW50RnJhbWU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgKi8KKworI2VuZGlmIC8vUkVTQU1QTEVSX0xJTkVBUl9SRVNBTVBMRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL011bHRpQ2hhbm5lbFJlc2FtcGxlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTXVsdGlDaGFubmVsUmVzYW1wbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTkzZmYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL011bHRpQ2hhbm5lbFJlc2FtcGxlci5jcHAKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJJbnRlZ2VyUmF0aW8uaCIKKyNpbmNsdWRlICJMaW5lYXJSZXNhbXBsZXIuaCIKKyNpbmNsdWRlICJNdWx0aUNoYW5uZWxSZXNhbXBsZXIuaCIKKyNpbmNsdWRlICJQb2x5cGhhc2VSZXNhbXBsZXIuaCIKKyNpbmNsdWRlICJQb2x5cGhhc2VSZXNhbXBsZXJNb25vLmgiCisjaW5jbHVkZSAiUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvLmgiCisjaW5jbHVkZSAiU2luY1Jlc2FtcGxlci5oIgorI2luY2x1ZGUgIlNpbmNSZXNhbXBsZXJTdGVyZW8uaCIKKwordXNpbmcgbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlcjsKKworTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpNdWx0aUNoYW5uZWxSZXNhbXBsZXIoY29uc3QgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjpCdWlsZGVyICZidWlsZGVyKQorICAgICAgICA6IG1OdW1UYXBzKGJ1aWxkZXIuZ2V0TnVtVGFwcygpKQorICAgICAgICAsIG1YKHN0YXRpY19jYXN0PHNpemVfdD4oYnVpbGRlci5nZXRDaGFubmVsQ291bnQoKSkKKyAgICAgICAgICAgICAgICAqIHN0YXRpY19jYXN0PHNpemVfdD4oYnVpbGRlci5nZXROdW1UYXBzKCkpICogMikKKyAgICAgICAgLCBtU2luZ2xlRnJhbWUoYnVpbGRlci5nZXRDaGFubmVsQ291bnQoKSkKKyAgICAgICAgLCBtQ2hhbm5lbENvdW50KGJ1aWxkZXIuZ2V0Q2hhbm5lbENvdW50KCkpCisgICAgICAgIHsKKyAgICAvLyBSZWR1Y2Ugc2FtcGxlIHJhdGVzIHRvIHRoZSBzbWFsbGVzdCByYXRpby4KKyAgICAvLyBGb3IgZXhhbXBsZSA0NDEwMC80ODAwMCB3b3VsZCBiZWNvbWUgMTQ3LzE2MC4KKyAgICBJbnRlZ2VyUmF0aW8gcmF0aW8oYnVpbGRlci5nZXRJbnB1dFJhdGUoKSwgYnVpbGRlci5nZXRPdXRwdXRSYXRlKCkpOworICAgIHJhdGlvLnJlZHVjZSgpOworICAgIG1OdW1lcmF0b3IgPSByYXRpby5nZXROdW1lcmF0b3IoKTsKKyAgICBtRGVub21pbmF0b3IgPSByYXRpby5nZXREZW5vbWluYXRvcigpOworICAgIG1JbnRlZ2VyUGhhc2UgPSBtRGVub21pbmF0b3I7Cit9CisKKy8vIHN0YXRpYyBmYWN0b3J5IG1ldGhvZAorTXVsdGlDaGFubmVsUmVzYW1wbGVyICpNdWx0aUNoYW5uZWxSZXNhbXBsZXI6Om1ha2UoaW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlucHV0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3V0cHV0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxpdHkgcXVhbGl0eSkgeworICAgIEJ1aWxkZXIgYnVpbGRlcjsKKyAgICBidWlsZGVyLnNldElucHV0UmF0ZShpbnB1dFJhdGUpOworICAgIGJ1aWxkZXIuc2V0T3V0cHV0UmF0ZShvdXRwdXRSYXRlKTsKKyAgICBidWlsZGVyLnNldENoYW5uZWxDb3VudChjaGFubmVsQ291bnQpOworCisgICAgc3dpdGNoIChxdWFsaXR5KSB7CisgICAgICAgIGNhc2UgUXVhbGl0eTo6RmFzdGVzdDoKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0TnVtVGFwcygyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFF1YWxpdHk6OkxvdzoKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0TnVtVGFwcyg0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFF1YWxpdHk6Ok1lZGl1bToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0TnVtVGFwcyg4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFF1YWxpdHk6OkhpZ2g6CisgICAgICAgICAgICBidWlsZGVyLnNldE51bVRhcHMoMTYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXVhbGl0eTo6QmVzdDoKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0TnVtVGFwcygzMik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIGN1dG9mZiBmcmVxdWVuY3kgc28gdGhhdCB3ZSBkbyBub3QgZ2V0IGFsaWFzaW5nIHdoZW4gZG93bi1zYW1wbGluZy4KKyAgICBpZiAoaW5wdXRSYXRlID4gb3V0cHV0UmF0ZSkgeworICAgICAgICBidWlsZGVyLnNldE5vcm1hbGl6ZWRDdXRvZmYoa0RlZmF1bHROb3JtYWxpemVkQ3V0b2ZmKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKK30KKworTXVsdGlDaGFubmVsUmVzYW1wbGVyICpNdWx0aUNoYW5uZWxSZXNhbXBsZXI6OkJ1aWxkZXI6OmJ1aWxkKCkgeworICAgIGlmIChnZXROdW1UYXBzKCkgPT0gMikgeworICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBkbyBsb3cgcGFzcyBmaWx0ZXJpbmdoLgorICAgICAgICByZXR1cm4gbmV3IExpbmVhclJlc2FtcGxlcigqdGhpcyk7CisgICAgfQorICAgIEludGVnZXJSYXRpbyByYXRpbyhnZXRJbnB1dFJhdGUoKSwgZ2V0T3V0cHV0UmF0ZSgpKTsKKyAgICByYXRpby5yZWR1Y2UoKTsKKyAgICBib29sIHVzZVBvbHlwaGFzZSA9IChnZXROdW1UYXBzKCkgKiByYXRpby5nZXREZW5vbWluYXRvcigpKSA8PSBrTWF4Q29lZmZpY2llbnRzOworICAgIGlmICh1c2VQb2x5cGhhc2UpIHsKKyAgICAgICAgaWYgKGdldENoYW5uZWxDb3VudCgpID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUG9seXBoYXNlUmVzYW1wbGVyTW9ubygqdGhpcyk7CisgICAgICAgIH0gZWxzZSBpZiAoZ2V0Q2hhbm5lbENvdW50KCkgPT0gMikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2x5cGhhc2VSZXNhbXBsZXJTdGVyZW8oKnRoaXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2x5cGhhc2VSZXNhbXBsZXIoKnRoaXMpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVXNlIGxlc3Mgb3B0aW1pemVkIHJlc2FtcGxlciB0aGF0IHVzZXMgYSBmbG9hdCBwaGFzZUluY3JlbWVudC4KKyAgICAgICAgLy8gVE9ETyBtb25vIHJlc2FtcGxlcgorICAgICAgICBpZiAoZ2V0Q2hhbm5lbENvdW50KCkgPT0gMikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW5jUmVzYW1wbGVyU3RlcmVvKCp0aGlzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2luY1Jlc2FtcGxlcigqdGhpcyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTXVsdGlDaGFubmVsUmVzYW1wbGVyOjp3cml0ZUZyYW1lKGNvbnN0IGZsb2F0ICpmcmFtZSkgeworICAgIC8vIE1vdmUgY3Vyc29yIGJlZm9yZSB3cml0ZSBzbyB0aGF0IGN1cnNvciBwb2ludHMgdG8gbGFzdCB3cml0dGVuIGZyYW1lIGluIHJlYWQuCisgICAgaWYgKC0tbUN1cnNvciA8IDApIHsKKyAgICAgICAgbUN1cnNvciA9IGdldE51bVRhcHMoKSAtIDE7CisgICAgfQorICAgIGZsb2F0ICpkZXN0ID0gJm1YW3N0YXRpY19jYXN0PHNpemVfdD4obUN1cnNvcikgKiBzdGF0aWNfY2FzdDxzaXplX3Q+KGdldENoYW5uZWxDb3VudCgpKV07CisgICAgaW50IG9mZnNldCA9IGdldE51bVRhcHMoKSAqIGdldENoYW5uZWxDb3VudCgpOworICAgIGZvciAoaW50IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgZ2V0Q2hhbm5lbENvdW50KCk7IGNoYW5uZWwrKykgeworICAgICAgICAvLyBXcml0ZSB0d2ljZSBzbyB3ZSBhdm9pZCBoYXZpbmcgdG8gd3JhcCB3aGVuIHJlYWRpbmcuCisgICAgICAgIGRlc3RbY2hhbm5lbF0gPSBkZXN0W2NoYW5uZWwgKyBvZmZzZXRdID0gZnJhbWVbY2hhbm5lbF07CisgICAgfQorfQorCitmbG9hdCBNdWx0aUNoYW5uZWxSZXNhbXBsZXI6OnNpbmMoZmxvYXQgcmFkaWFucykgeworICAgIGlmIChhYnMocmFkaWFucykgPCAxLjBlLTkpIHJldHVybiAxLjBmOyAgIC8vIGF2b2lkIGRpdmlkZSBieSB6ZXJvCisgICAgcmV0dXJuIHNpbmYocmFkaWFucykgLyByYWRpYW5zOyAgIC8vIFNpbmMgZnVuY3Rpb24KK30KKworLy8gR2VuZXJhdGUgY29lZmZpY2llbnRzIGluIHRoZSBvcmRlciB0aGV5IHdpbGwgYmUgdXNlZCBieSByZWFkRnJhbWUoKS4KKy8vIFRoaXMgaXMgbW9yZSBjb21wbGljYXRlZCBidXQgcmVhZEZyYW1lKCkgaXMgY2FsbGVkIHJlcGVhdGVkbHkgYW5kIHNob3VsZCBiZSBvcHRpbWl6ZWQuCit2b2lkIE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6Z2VuZXJhdGVDb2VmZmljaWVudHMoaW50MzJfdCBpbnB1dFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvdXRwdXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtUm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGhhc2VJbmNyZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbm9ybWFsaXplZEN1dG9mZikgeworICAgIG1Db2VmZmljaWVudHMucmVzaXplKHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0TnVtVGFwcygpKSAqIHN0YXRpY19jYXN0PHNpemVfdD4obnVtUm93cykpOworICAgIGludCBjb2VmZmljaWVudEluZGV4ID0gMDsKKyAgICBkb3VibGUgcGhhc2UgPSAwLjA7IC8vIHJhbmdlcyBmcm9tIDAuMCB0byAxLjAsIGZyYWN0aW9uIGJldHdlZW4gc2FtcGxlcworICAgIC8vIFN0cmV0Y2ggdGhlIHNpbmMgZnVuY3Rpb24gZm9yIGxvdyBwYXNzIGZpbHRlcmluZy4KKyAgICBjb25zdCBmbG9hdCBjdXRvZmZTY2FsZXIgPSBub3JtYWxpemVkQ3V0b2ZmICoKKyAgICAgICAgICAgICgob3V0cHV0UmF0ZSA8IGlucHV0UmF0ZSkKKyAgICAgICAgICAgICA/ICgoZmxvYXQpb3V0cHV0UmF0ZSAvIGlucHV0UmF0ZSkKKyAgICAgICAgICAgICA6ICgoZmxvYXQpaW5wdXRSYXRlIC8gb3V0cHV0UmF0ZSkpOworICAgIGNvbnN0IGludCBudW1UYXBzSGFsZiA9IGdldE51bVRhcHMoKSAvIDI7IC8vIG51bVRhcHMgbXVzdCBiZSBldmVuLgorICAgIGNvbnN0IGZsb2F0IG51bVRhcHNIYWxmSW52ZXJzZSA9IDEuMGYgLyBudW1UYXBzSGFsZjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJvd3M7IGkrKykgeworICAgICAgICBmbG9hdCB0YXBQaGFzZSA9IHBoYXNlIC0gbnVtVGFwc0hhbGY7CisgICAgICAgIGZsb2F0IGdhaW4gPSAwLjA7IC8vIHN1bSBvZiByYXcgY29lZmZpY2llbnRzCisgICAgICAgIGludCBnYWluQ3Vyc29yID0gY29lZmZpY2llbnRJbmRleDsKKyAgICAgICAgZm9yIChpbnQgdGFwID0gMDsgdGFwIDwgZ2V0TnVtVGFwcygpOyB0YXArKykgeworICAgICAgICAgICAgZmxvYXQgcmFkaWFucyA9IHRhcFBoYXNlICogTV9QSTsKKworI2lmIE1DUl9VU0VfS0FJU0VSCisgICAgICAgICAgICBmbG9hdCB3aW5kb3cgPSBtS2Fpc2VyV2luZG93KHRhcFBoYXNlICogbnVtVGFwc0hhbGZJbnZlcnNlKTsKKyNlbHNlCisgICAgICAgICAgICBmbG9hdCB3aW5kb3cgPSBtQ29zaFdpbmRvdyhzdGF0aWNfY2FzdDxkb3VibGU+KHRhcFBoYXNlKSAqIG51bVRhcHNIYWxmSW52ZXJzZSk7CisjZW5kaWYKKyAgICAgICAgICAgIGZsb2F0IGNvZWZmaWNpZW50ID0gc2luYyhyYWRpYW5zICogY3V0b2ZmU2NhbGVyKSAqIHdpbmRvdzsKKyAgICAgICAgICAgIG1Db2VmZmljaWVudHMuYXQoY29lZmZpY2llbnRJbmRleCsrKSA9IGNvZWZmaWNpZW50OworICAgICAgICAgICAgZ2FpbiArPSBjb2VmZmljaWVudDsKKyAgICAgICAgICAgIHRhcFBoYXNlICs9IDEuMDsKKyAgICAgICAgfQorICAgICAgICBwaGFzZSArPSBwaGFzZUluY3JlbWVudDsKKyAgICAgICAgd2hpbGUgKHBoYXNlID49IDEuMCkgeworICAgICAgICAgICAgcGhhc2UgLT0gMS4wOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29ycmVjdCBmb3IgZ2FpbiB2YXJpYXRpb25zLgorICAgICAgICBmbG9hdCBnYWluQ29ycmVjdGlvbiA9IDEuMCAvIGdhaW47IC8vIG5vcm1hbGl6ZSB0aGUgZ2FpbgorICAgICAgICBmb3IgKGludCB0YXAgPSAwOyB0YXAgPCBnZXROdW1UYXBzKCk7IHRhcCsrKSB7CisgICAgICAgICAgICBtQ29lZmZpY2llbnRzLmF0KGdhaW5DdXJzb3IgKyB0YXApICo9IGdhaW5Db3JyZWN0aW9uOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL011bHRpQ2hhbm5lbFJlc2FtcGxlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL011bHRpQ2hhbm5lbFJlc2FtcGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxN2YzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvTXVsdGlDaGFubmVsUmVzYW1wbGVyLmgKQEAgLTAsMCArMSwyNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUkVTQU1QTEVSX01VTFRJQ0hBTk5FTF9SRVNBTVBMRVJfSAorI2RlZmluZSBSRVNBTVBMRVJfTVVMVElDSEFOTkVMX1JFU0FNUExFUl9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZuZGVmIE1DUl9VU0VfS0FJU0VSCisvLyBJdCBhcHBlYXJzIGZyb20gdGhlIHNwZWN0cm9ncmFtIHRoYXQgdGhlIEh5cGVyYm9saWNDb3NpbmUgd2luZG93IGxlYWRzIHRvIGZld2VyIGFydGlmYWN0cy4KKy8vIEFuZCBpdCBpcyBmYXN0ZXIgdG8gY2FsY3VsYXRlLgorI2RlZmluZSBNQ1JfVVNFX0tBSVNFUiAwCisjZW5kaWYKKworI2lmIE1DUl9VU0VfS0FJU0VSCisjaW5jbHVkZSAiS2Fpc2VyV2luZG93LmgiCisjZWxzZQorI2luY2x1ZGUgIkh5cGVyYm9saWNDb3NpbmVXaW5kb3cuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiUmVzYW1wbGVyRGVmaW5pdGlvbnMuaCIKKworbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciB7CisKK2NsYXNzIE11bHRpQ2hhbm5lbFJlc2FtcGxlciB7CisKK3B1YmxpYzoKKworICAgIGVudW0gY2xhc3MgUXVhbGl0eSA6IGludDMyX3QgeworICAgICAgICBGYXN0ZXN0LAorICAgICAgICBMb3csCisgICAgICAgIE1lZGl1bSwKKyAgICAgICAgSGlnaCwKKyAgICAgICAgQmVzdCwKKyAgICB9OworCisgICAgY2xhc3MgQnVpbGRlciB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0IGFuIG9wdGltYWwgcmVzYW1wbGVyIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgICAgICAgICogQHJldHVybiBhZGRyZXNzIG9mIGEgcmVzYW1wbGVyCisgICAgICAgICAqLworICAgICAgICBNdWx0aUNoYW5uZWxSZXNhbXBsZXIgKmJ1aWxkKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBudW1iZXIgb2YgdGFwcyBpbiB0aGUgcmVzYW1wbGluZyBmaWx0ZXIuCisgICAgICAgICAqIE1vcmUgdGFwcyBnaXZlcyBiZXR0ZXIgcXVhbGl0eSBidXQgdXNlcyBtb3JlIENQVSB0aW1lLgorICAgICAgICAgKiBUaGlzIHR5cGljYWxseSByYW5nZXMgZnJvbSA0IHRvIDY0LiBEZWZhdWx0IGlzIDE2LgorICAgICAgICAgKgorICAgICAgICAgKiBGb3IgcG9seXBoYXNlIGZpbHRlcnMsIG51bVRhcHMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGZvdXIgZm9yIGxvb3AgdW5yb2xsaW5nLgorICAgICAgICAgKiBAcGFyYW0gbnVtVGFwcyBudW1iZXIgb2YgdGFwcyBmb3IgdGhlIGZpbHRlcgorICAgICAgICAgKiBAcmV0dXJuIGFkZHJlc3Mgb2YgdGhpcyBidWlsZGVyIGZvciBjaGFpbmluZyBjYWxscworICAgICAgICAgKi8KKyAgICAgICAgQnVpbGRlciAqc2V0TnVtVGFwcyhpbnQzMl90IG51bVRhcHMpIHsKKyAgICAgICAgICAgIG1OdW1UYXBzID0gbnVtVGFwczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSAxIGZvciBtb25vLCAyIGZvciBzdGVyZW8sIGV0Yy4gRGVmYXVsdCBpcyAxLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2hhbm5lbENvdW50IG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgKiBAcmV0dXJuIGFkZHJlc3Mgb2YgdGhpcyBidWlsZGVyIGZvciBjaGFpbmluZyBjYWxscworICAgICAgICAgKi8KKyAgICAgICAgQnVpbGRlciAqc2V0Q2hhbm5lbENvdW50KGludDMyX3QgY2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICBtQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGVmYXVsdCBpcyA0ODAwMC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGlucHV0UmF0ZSBzYW1wbGUgcmF0ZSBvZiB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgICAqIEByZXR1cm4gYWRkcmVzcyBvZiB0aGlzIGJ1aWxkZXIgZm9yIGNoYWluaW5nIGNhbGxzCisgICAgICAgICAqLworICAgICAgICBCdWlsZGVyICpzZXRJbnB1dFJhdGUoaW50MzJfdCBpbnB1dFJhdGUpIHsKKyAgICAgICAgICAgIG1JbnB1dFJhdGUgPSBpbnB1dFJhdGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWZhdWx0IGlzIDQ4MDAwLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb3V0cHV0UmF0ZSBzYW1wbGUgcmF0ZSBvZiB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICAgKiBAcmV0dXJuIGFkZHJlc3Mgb2YgdGhpcyBidWlsZGVyIGZvciBjaGFpbmluZyBjYWxscworICAgICAgICAgKi8KKyAgICAgICAgQnVpbGRlciAqc2V0T3V0cHV0UmF0ZShpbnQzMl90IG91dHB1dFJhdGUpIHsKKyAgICAgICAgICAgIG1PdXRwdXRSYXRlID0gb3V0cHV0UmF0ZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBjdXRvZmYgZnJlcXVlbmN5IHJlbGF0aXZlIHRvIHRoZSBOeXF1aXN0IHJhdGUgb2YgdGhlIG91dHB1dCBzYW1wbGUgcmF0ZS4KKyAgICAgICAgICogU2V0IHRvIDEuMCB0byBtYXRjaCB0aGUgTnlxdWlzdCBmcmVxdWVuY3kuCisgICAgICAgICAqIFNldCBsb3dlciB0byByZWR1Y2UgYWxpYXNpbmcuCisgICAgICAgICAqIERlZmF1bHQgaXMgMC43MC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5vcm1hbGl6ZWRDdXRvZmYgYW50aS1hbGlhc2luZyBmaWx0ZXIgY3V0b2ZmCisgICAgICAgICAqIEByZXR1cm4gYWRkcmVzcyBvZiB0aGlzIGJ1aWxkZXIgZm9yIGNoYWluaW5nIGNhbGxzCisgICAgICAgICAqLworICAgICAgICBCdWlsZGVyICpzZXROb3JtYWxpemVkQ3V0b2ZmKGZsb2F0IG5vcm1hbGl6ZWRDdXRvZmYpIHsKKyAgICAgICAgICAgIG1Ob3JtYWxpemVkQ3V0b2ZmID0gbm9ybWFsaXplZEN1dG9mZjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBnZXROdW1UYXBzKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1OdW1UYXBzOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUNoYW5uZWxDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgZ2V0SW5wdXRSYXRlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1JbnB1dFJhdGU7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGdldE91dHB1dFJhdGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbU91dHB1dFJhdGU7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBnZXROb3JtYWxpemVkQ3V0b2ZmKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1Ob3JtYWxpemVkQ3V0b2ZmOworICAgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGludDMyX3QgbUNoYW5uZWxDb3VudCA9IDE7CisgICAgICAgIGludDMyX3QgbU51bVRhcHMgPSAxNjsKKyAgICAgICAgaW50MzJfdCBtSW5wdXRSYXRlID0gNDgwMDA7CisgICAgICAgIGludDMyX3QgbU91dHB1dFJhdGUgPSA0ODAwMDsKKyAgICAgICAgZmxvYXQgICBtTm9ybWFsaXplZEN1dG9mZiA9IGtEZWZhdWx0Tm9ybWFsaXplZEN1dG9mZjsKKyAgICB9OworCisgICAgdmlydHVhbCB+TXVsdGlDaGFubmVsUmVzYW1wbGVyKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogRmFjdG9yeSBtZXRob2QgZm9yIG1ha2luZyBhIHJlc2FtcGxlciB0aGF0IGlzIG9wdGltYWwgZm9yIHRoZSBnaXZlbiBpbnB1dHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hhbm5lbENvdW50IG51bWJlciBvZiBjaGFubmVscywgMiBmb3Igc3RlcmVvCisgICAgICogQHBhcmFtIGlucHV0UmF0ZSBzYW1wbGUgcmF0ZSBvZiB0aGUgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIG91dHB1dFJhdGUgIHNhbXBsZSByYXRlIG9mIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICogQHBhcmFtIHF1YWxpdHkgaGlnaGVyIHF1YWxpdHkgc291bmRzIGJldHRlciBidXQgdXNlcyBtb3JlIENQVQorICAgICAqIEByZXR1cm4gYW4gb3B0aW1hbCByZXNhbXBsZXIKKyAgICAgKi8KKyAgICBzdGF0aWMgTXVsdGlDaGFubmVsUmVzYW1wbGVyICptYWtlKGludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbnB1dFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG91dHB1dFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsaXR5IHF1YWxpdHkpOworCisgICAgYm9vbCBpc1dyaXRlTmVlZGVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUludGVnZXJQaGFzZSA+PSBtRGVub21pbmF0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBmcmFtZSBjb250YWluaW5nIE4gc2FtcGxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBzYW1wbGUgaW4gYSBmcmFtZQorICAgICAqLworICAgIHZvaWQgd3JpdGVOZXh0RnJhbWUoY29uc3QgZmxvYXQgKmZyYW1lKSB7CisgICAgICAgIHdyaXRlRnJhbWUoZnJhbWUpOworICAgICAgICBhZHZhbmNlV3JpdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgZnJhbWUgY29udGFpbmluZyBOIHNhbXBsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhbWUgcG9pbnRlciB0byB0aGUgZmlyc3Qgc2FtcGxlIGluIGEgZnJhbWUKKyAgICAgKi8KKyAgICB2b2lkIHJlYWROZXh0RnJhbWUoZmxvYXQgKmZyYW1lKSB7CisgICAgICAgIHJlYWRGcmFtZShmcmFtZSk7CisgICAgICAgIGFkdmFuY2VSZWFkKCk7CisgICAgfQorCisgICAgaW50IGdldE51bVRhcHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTnVtVGFwczsKKyAgICB9CisKKyAgICBpbnQgZ2V0Q2hhbm5lbENvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNoYW5uZWxDb3VudDsKKyAgICB9CisKKyAgICBzdGF0aWMgZmxvYXQgaGFtbWluZ1dpbmRvdyhmbG9hdCByYWRpYW5zLCBmbG9hdCBzcHJlYWQpOworCisgICAgc3RhdGljIGZsb2F0IHNpbmMoZmxvYXQgcmFkaWFucyk7CisKK3Byb3RlY3RlZDoKKworICAgIGV4cGxpY2l0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcihjb25zdCBNdWx0aUNoYW5uZWxSZXNhbXBsZXI6OkJ1aWxkZXIgJmJ1aWxkZXIpOworCisgICAgLyoqCisgICAgICogV3JpdGUgYSBmcmFtZSBjb250YWluaW5nIE4gc2FtcGxlcy4KKyAgICAgKiBDYWxsIGFkdmFuY2VXcml0ZSgpIGFmdGVyIGNhbGxpbmcgdGhpcy4KKyAgICAgKiBAcGFyYW0gZnJhbWUgcG9pbnRlciB0byB0aGUgZmlyc3Qgc2FtcGxlIGluIGEgZnJhbWUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVGcmFtZShjb25zdCBmbG9hdCAqZnJhbWUpOworCisgICAgLyoqCisgICAgICogUmVhZCBhIGZyYW1lIGNvbnRhaW5pbmcgTiBzYW1wbGVzIHVzaW5nIGludGVycG9sYXRpb24uCisgICAgICogQ2FsbCBhZHZhbmNlUmVhZCgpIGFmdGVyIGNhbGxpbmcgdGhpcy4KKyAgICAgKiBAcGFyYW0gZnJhbWUgcG9pbnRlciB0byB0aGUgZmlyc3Qgc2FtcGxlIGluIGEgZnJhbWUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgcmVhZEZyYW1lKGZsb2F0ICpmcmFtZSkgPSAwOworCisgICAgdm9pZCBhZHZhbmNlV3JpdGUoKSB7CisgICAgICAgIG1JbnRlZ2VyUGhhc2UgLT0gbURlbm9taW5hdG9yOworICAgIH0KKworICAgIHZvaWQgYWR2YW5jZVJlYWQoKSB7CisgICAgICAgIG1JbnRlZ2VyUGhhc2UgKz0gbU51bWVyYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBpbiBvcHRpbWFsIG9yZGVyLgorICAgICAqIEBwYXJhbSBpbnB1dFJhdGUgc2FtcGxlIHJhdGUgb2YgdGhlIGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSBvdXRwdXRSYXRlICBzYW1wbGUgcmF0ZSBvZiB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSBudW1Sb3dzIG51bWJlciBvZiByb3dzIGluIHRoZSBhcnJheSB0aGF0IGNvbnRhaW4gYSBzZXQgb2YgdGFwIGNvZWZmaWNpZW50cworICAgICAqIEBwYXJhbSBwaGFzZUluY3JlbWVudCBob3cgbXVjaCB0byBpbmNyZW1lbnQgdGhlIHBoYXNlIGJldHdlZW4gcm93cworICAgICAqIEBwYXJhbSBub3JtYWxpemVkQ3V0b2ZmIGZpbHRlciBjdXRvZmYgZnJlcXVlbmN5IG5vcm1hbGl6ZWQgdG8gTnlxdWlzdCByYXRlIG9mIG91dHB1dAorICAgICAqLworICAgIHZvaWQgZ2VuZXJhdGVDb2VmZmljaWVudHMoaW50MzJfdCBpbnB1dFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG91dHB1dFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVJvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGhhc2VJbmNyZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBub3JtYWxpemVkQ3V0b2ZmKTsKKworCisgICAgaW50MzJfdCBnZXRJbnRlZ2VyUGhhc2UoKSB7CisgICAgICAgIHJldHVybiBtSW50ZWdlclBoYXNlOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhDb2VmZmljaWVudHMgPSA4ICogMTAyNDsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gICBtQ29lZmZpY2llbnRzOworCisgICAgY29uc3QgaW50ICAgICAgICAgICAgbU51bVRhcHM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgbUN1cnNvciA9IDA7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICAgbVg7ICAgICAgICAgICAvLyBkZWxheWVkIGlucHV0IHZhbHVlcyBmb3IgdGhlIEZJUgorICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAgIG1TaW5nbGVGcmFtZTsgLy8gb25lIGZyYW1lIGZvciB0ZW1wb3JhcnkgdXNlCisgICAgaW50MzJfdCAgICAgICAgICAgICAgbUludGVnZXJQaGFzZSA9IDA7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgbU51bWVyYXRvciA9IDA7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgbURlbm9taW5hdG9yID0gMDsKKworCitwcml2YXRlOgorCisjaWYgTUNSX1VTRV9LQUlTRVIKKyAgICBLYWlzZXJXaW5kb3cgICAgICAgICAgIG1LYWlzZXJXaW5kb3c7CisjZWxzZQorICAgIEh5cGVyYm9saWNDb3NpbmVXaW5kb3cgbUNvc2hXaW5kb3c7CisjZW5kaWYKKworICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0RlZmF1bHROb3JtYWxpemVkQ3V0b2ZmID0gMC43MGY7CisKKyAgICBjb25zdCBpbnQgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7Cit9OworCit9IC8qIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgKi8KKworI2VuZGlmIC8vUkVTQU1QTEVSX01VTFRJQ0hBTk5FTF9SRVNBTVBMRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDdlZThlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlci5jcHAKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIkludGVnZXJSYXRpby5oIgorI2luY2x1ZGUgIlBvbHlwaGFzZVJlc2FtcGxlci5oIgorCit1c2luZyBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyOworCitQb2x5cGhhc2VSZXNhbXBsZXI6OlBvbHlwaGFzZVJlc2FtcGxlcihjb25zdCBNdWx0aUNoYW5uZWxSZXNhbXBsZXI6OkJ1aWxkZXIgJmJ1aWxkZXIpCisgICAgICAgIDogTXVsdGlDaGFubmVsUmVzYW1wbGVyKGJ1aWxkZXIpCisgICAgICAgIHsKKyAgICBhc3NlcnQoKGdldE51bVRhcHMoKSAlIDQpID09IDApOyAvLyBSZXF1aXJlZCBmb3IgbG9vcCB1bnJvbGxpbmcuCisKKyAgICBpbnQzMl90IGlucHV0UmF0ZSA9IGJ1aWxkZXIuZ2V0SW5wdXRSYXRlKCk7CisgICAgaW50MzJfdCBvdXRwdXRSYXRlID0gYnVpbGRlci5nZXRPdXRwdXRSYXRlKCk7CisKKyAgICBpbnQzMl90IG51bVJvd3MgPSBtRGVub21pbmF0b3I7CisgICAgZG91YmxlIHBoYXNlSW5jcmVtZW50ID0gKGRvdWJsZSkgaW5wdXRSYXRlIC8gKGRvdWJsZSkgb3V0cHV0UmF0ZTsKKyAgICBnZW5lcmF0ZUNvZWZmaWNpZW50cyhpbnB1dFJhdGUsIG91dHB1dFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtUm93cywgcGhhc2VJbmNyZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5nZXROb3JtYWxpemVkQ3V0b2ZmKCkpOworfQorCit2b2lkIFBvbHlwaGFzZVJlc2FtcGxlcjo6cmVhZEZyYW1lKGZsb2F0ICpmcmFtZSkgeworICAgIC8vIENsZWFyIGFjY3VtdWxhdG9yIGZvciBtaXhpbmcuCisgICAgc3RkOjpmaWxsKG1TaW5nbGVGcmFtZS5iZWdpbigpLCBtU2luZ2xlRnJhbWUuZW5kKCksIDAuMCk7CisKKyAgICAvLyBNdWx0aXBseSBpbnB1dCB0aW1lcyB3aW5kb3dlZCBzaW5jIGZ1bmN0aW9uLgorICAgIGZsb2F0ICpjb2VmZmljaWVudHMgPSAmbUNvZWZmaWNpZW50c1ttQ29lZmZpY2llbnRDdXJzb3JdOworICAgIGZsb2F0ICp4RnJhbWUgPSAmbVhbc3RhdGljX2Nhc3Q8c2l6ZV90PihtQ3Vyc29yKSAqIHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0Q2hhbm5lbENvdW50KCkpXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1UYXBzOyBpKyspIHsKKyAgICAgICAgZmxvYXQgY29lZmZpY2llbnQgPSAqY29lZmZpY2llbnRzKys7CisgICAgICAgIGZvciAoaW50IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgZ2V0Q2hhbm5lbENvdW50KCk7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgbVNpbmdsZUZyYW1lW2NoYW5uZWxdICs9ICp4RnJhbWUrKyAqIGNvZWZmaWNpZW50OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQWR2YW5jZSBhbmQgd3JhcCB0aHJvdWdoIGNvZWZmaWNpZW50cy4KKyAgICBtQ29lZmZpY2llbnRDdXJzb3IgPSAobUNvZWZmaWNpZW50Q3Vyc29yICsgbU51bVRhcHMpICUgbUNvZWZmaWNpZW50cy5zaXplKCk7CisKKyAgICAvLyBDb3B5IGFjY3VtdWxhdG9yIHRvIG91dHB1dC4KKyAgICBmb3IgKGludCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGdldENoYW5uZWxDb3VudCgpOyBjaGFubmVsKyspIHsKKyAgICAgICAgZnJhbWVbY2hhbm5lbF0gPSBtU2luZ2xlRnJhbWVbY2hhbm5lbF07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDJmY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRVNBTVBMRVJfUE9MWVBIQVNFX1JFU0FNUExFUl9ICisjZGVmaW5lIFJFU0FNUExFUl9QT0xZUEhBU0VfUkVTQU1QTEVSX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJNdWx0aUNoYW5uZWxSZXNhbXBsZXIuaCIKKyNpbmNsdWRlICJSZXNhbXBsZXJEZWZpbml0aW9ucy5oIgorCituYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyIHsKKy8qKgorICogUmVzYW1wbGVyIHRoYXQgaXMgb3B0aW1pemVkIGZvciBhIHJlZHVjZWQgcmF0aW8gb2Ygc2FtcGxlIHJhdGVzLgorICogQWxsIG9mIHRoZSBjb2VmZmljaWVudHMgZm9yIGVhY2ggcG9zc2libGUgcGhhc2UgdmFsdWUgYXJlIHByZS1jYWxjdWxhdGVkLgorICovCitjbGFzcyBQb2x5cGhhc2VSZXNhbXBsZXIgOiBwdWJsaWMgTXVsdGlDaGFubmVsUmVzYW1wbGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBidWlsZGVyIGNvbnRhaW5pbmcgbG90cyBvZiBwYXJhbWV0ZXJzCisgICAgICovCisgICAgZXhwbGljaXQgUG9seXBoYXNlUmVzYW1wbGVyKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcik7CisKKyAgICB2aXJ0dWFsIH5Qb2x5cGhhc2VSZXNhbXBsZXIoKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIHJlYWRGcmFtZShmbG9hdCAqZnJhbWUpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgIG1Db2VmZmljaWVudEN1cnNvciA9IDA7CisKK307CisKK30gLyogbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciAqLworCisjZW5kaWYgLy9SRVNBTVBMRVJfUE9MWVBIQVNFX1JFU0FNUExFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyTW9uby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyTW9uby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhZjEzZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXJNb25vLmNwcApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlICJQb2x5cGhhc2VSZXNhbXBsZXJNb25vLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXI7CisKKyNkZWZpbmUgTU9OTyAgMQorCitQb2x5cGhhc2VSZXNhbXBsZXJNb25vOjpQb2x5cGhhc2VSZXNhbXBsZXJNb25vKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcikKKyAgICAgICAgOiBQb2x5cGhhc2VSZXNhbXBsZXIoYnVpbGRlcikgeworICAgIGFzc2VydChidWlsZGVyLmdldENoYW5uZWxDb3VudCgpID09IE1PTk8pOworfQorCit2b2lkIFBvbHlwaGFzZVJlc2FtcGxlck1vbm86OndyaXRlRnJhbWUoY29uc3QgZmxvYXQgKmZyYW1lKSB7CisgICAgLy8gTW92ZSBjdXJzb3IgYmVmb3JlIHdyaXRlIHNvIHRoYXQgY3Vyc29yIHBvaW50cyB0byBsYXN0IHdyaXR0ZW4gZnJhbWUgaW4gcmVhZC4KKyAgICBpZiAoLS1tQ3Vyc29yIDwgMCkgeworICAgICAgICBtQ3Vyc29yID0gZ2V0TnVtVGFwcygpIC0gMTsKKyAgICB9CisgICAgZmxvYXQgKmRlc3QgPSAmbVhbbUN1cnNvciAqIE1PTk9dOworICAgIGNvbnN0IGludCBvZmZzZXQgPSBtTnVtVGFwcyAqIE1PTk87CisgICAgLy8gV3JpdGUgZWFjaCBjaGFubmVsIHR3aWNlIHNvIHdlIGF2b2lkIGhhdmluZyB0byB3cmFwIHdoZW4gcnVubmluZyB0aGUgRklSLgorICAgIGNvbnN0IGZsb2F0IHNhbXBsZSA9ICBmcmFtZVswXTsKKyAgICAvLyBQdXQgb3JkZXJlZCB3cml0ZXMgdG9nZXRoZXIuCisgICAgZGVzdFswXSA9IHNhbXBsZTsKKyAgICBkZXN0W29mZnNldF0gPSBzYW1wbGU7Cit9CisKK3ZvaWQgUG9seXBoYXNlUmVzYW1wbGVyTW9ubzo6cmVhZEZyYW1lKGZsb2F0ICpmcmFtZSkgeworICAgIC8vIENsZWFyIGFjY3VtdWxhdG9yLgorICAgIGZsb2F0IHN1bSA9IDAuMDsKKworICAgIC8vIE11bHRpcGx5IGlucHV0IHRpbWVzIHByZWNvbXB1dGVkIHdpbmRvd2VkIHNpbmMgZnVuY3Rpb24uCisgICAgY29uc3QgZmxvYXQgKmNvZWZmaWNpZW50cyA9ICZtQ29lZmZpY2llbnRzW21Db2VmZmljaWVudEN1cnNvcl07CisgICAgZmxvYXQgKnhGcmFtZSA9ICZtWFttQ3Vyc29yICogTU9OT107CisgICAgY29uc3QgaW50IG51bUxvb3BzID0gbU51bVRhcHMgPj4gMjsgLy8gbi80CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Mb29wczsgaSsrKSB7CisgICAgICAgIC8vIE1hbnVhbCBsb29wIHVucm9sbGluZywgbWlnaHQgZ2V0IGNvbnZlcnRlZCB0byBTSU1ELgorICAgICAgICBzdW0gKz0gKnhGcmFtZSsrICogKmNvZWZmaWNpZW50cysrOworICAgICAgICBzdW0gKz0gKnhGcmFtZSsrICogKmNvZWZmaWNpZW50cysrOworICAgICAgICBzdW0gKz0gKnhGcmFtZSsrICogKmNvZWZmaWNpZW50cysrOworICAgICAgICBzdW0gKz0gKnhGcmFtZSsrICogKmNvZWZmaWNpZW50cysrOworICAgIH0KKworICAgIG1Db2VmZmljaWVudEN1cnNvciA9IChtQ29lZmZpY2llbnRDdXJzb3IgKyBtTnVtVGFwcykgJSBtQ29lZmZpY2llbnRzLnNpemUoKTsKKworICAgIC8vIENvcHkgYWNjdW11bGF0b3IgdG8gb3V0cHV0LgorICAgIGZyYW1lWzBdID0gc3VtOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlck1vbm8uaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXJNb25vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwMjBiNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXJNb25vLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRVNBTVBMRVJfUE9MWVBIQVNFX1JFU0FNUExFUl9NT05PX0gKKyNkZWZpbmUgUkVTQU1QTEVSX1BPTFlQSEFTRV9SRVNBTVBMRVJfTU9OT19ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIlBvbHlwaGFzZVJlc2FtcGxlci5oIgorI2luY2x1ZGUgIlJlc2FtcGxlckRlZmluaXRpb25zLmgiCisKK25hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgeworCitjbGFzcyBQb2x5cGhhc2VSZXNhbXBsZXJNb25vIDogcHVibGljIFBvbHlwaGFzZVJlc2FtcGxlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgUG9seXBoYXNlUmVzYW1wbGVyTW9ubyhjb25zdCBNdWx0aUNoYW5uZWxSZXNhbXBsZXI6OkJ1aWxkZXIgJmJ1aWxkZXIpOworCisgICAgdmlydHVhbCB+UG9seXBoYXNlUmVzYW1wbGVyTW9ubygpID0gZGVmYXVsdDsKKworICAgIHZvaWQgd3JpdGVGcmFtZShjb25zdCBmbG9hdCAqZnJhbWUpIG92ZXJyaWRlOworCisgICAgdm9pZCByZWFkRnJhbWUoZmxvYXQgKmZyYW1lKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciAqLworCisjZW5kaWYgLy9SRVNBTVBMRVJfUE9MWVBIQVNFX1JFU0FNUExFUl9NT05PX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXJTdGVyZW8uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlclN0ZXJlby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4MTg1MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9Qb2x5cGhhc2VSZXNhbXBsZXJTdGVyZW8uY3BwCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgIlBvbHlwaGFzZVJlc2FtcGxlclN0ZXJlby5oIgorCit1c2luZyBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyOworCisjZGVmaW5lIFNURVJFTyAgMgorCitQb2x5cGhhc2VSZXNhbXBsZXJTdGVyZW86OlBvbHlwaGFzZVJlc2FtcGxlclN0ZXJlbyhjb25zdCBNdWx0aUNoYW5uZWxSZXNhbXBsZXI6OkJ1aWxkZXIgJmJ1aWxkZXIpCisgICAgICAgIDogUG9seXBoYXNlUmVzYW1wbGVyKGJ1aWxkZXIpIHsKKyAgICBhc3NlcnQoYnVpbGRlci5nZXRDaGFubmVsQ291bnQoKSA9PSBTVEVSRU8pOworfQorCit2b2lkIFBvbHlwaGFzZVJlc2FtcGxlclN0ZXJlbzo6d3JpdGVGcmFtZShjb25zdCBmbG9hdCAqZnJhbWUpIHsKKyAgICAvLyBNb3ZlIGN1cnNvciBiZWZvcmUgd3JpdGUgc28gdGhhdCBjdXJzb3IgcG9pbnRzIHRvIGxhc3Qgd3JpdHRlbiBmcmFtZSBpbiByZWFkLgorICAgIGlmICgtLW1DdXJzb3IgPCAwKSB7CisgICAgICAgIG1DdXJzb3IgPSBnZXROdW1UYXBzKCkgLSAxOworICAgIH0KKyAgICBmbG9hdCAqZGVzdCA9ICZtWFttQ3Vyc29yICogU1RFUkVPXTsKKyAgICBjb25zdCBpbnQgb2Zmc2V0ID0gbU51bVRhcHMgKiBTVEVSRU87CisgICAgLy8gV3JpdGUgZWFjaCBjaGFubmVsIHR3aWNlIHNvIHdlIGF2b2lkIGhhdmluZyB0byB3cmFwIHdoZW4gcnVubmluZyB0aGUgRklSLgorICAgIGNvbnN0IGZsb2F0IGxlZnQgPSAgZnJhbWVbMF07CisgICAgY29uc3QgZmxvYXQgcmlnaHQgPSBmcmFtZVsxXTsKKyAgICAvLyBQdXQgb3JkZXJlZCB3cml0ZXMgdG9nZXRoZXIuCisgICAgZGVzdFswXSA9IGxlZnQ7CisgICAgZGVzdFsxXSA9IHJpZ2h0OworICAgIGRlc3Rbb2Zmc2V0XSA9IGxlZnQ7CisgICAgZGVzdFsxICsgb2Zmc2V0XSA9IHJpZ2h0OworfQorCit2b2lkIFBvbHlwaGFzZVJlc2FtcGxlclN0ZXJlbzo6cmVhZEZyYW1lKGZsb2F0ICpmcmFtZSkgeworICAgIC8vIENsZWFyIGFjY3VtdWxhdG9ycy4KKyAgICBmbG9hdCBsZWZ0ID0gMC4wOworICAgIGZsb2F0IHJpZ2h0ID0gMC4wOworCisgICAgLy8gTXVsdGlwbHkgaW5wdXQgdGltZXMgcHJlY29tcHV0ZWQgd2luZG93ZWQgc2luYyBmdW5jdGlvbi4KKyAgICBjb25zdCBmbG9hdCAqY29lZmZpY2llbnRzID0gJm1Db2VmZmljaWVudHNbbUNvZWZmaWNpZW50Q3Vyc29yXTsKKyAgICBmbG9hdCAqeEZyYW1lID0gJm1YW21DdXJzb3IgKiBTVEVSRU9dOworICAgIGNvbnN0IGludCBudW1Mb29wcyA9IG1OdW1UYXBzID4+IDI7IC8vIG4vNAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTG9vcHM7IGkrKykgeworICAgICAgICAvLyBNYW51YWwgbG9vcCB1bnJvbGxpbmcsIG1pZ2h0IGdldCBjb252ZXJ0ZWQgdG8gU0lNRC4KKyAgICAgICAgZmxvYXQgY29lZmZpY2llbnQgPSAqY29lZmZpY2llbnRzKys7CisgICAgICAgIGxlZnQgKz0gKnhGcmFtZSsrICogY29lZmZpY2llbnQ7CisgICAgICAgIHJpZ2h0ICs9ICp4RnJhbWUrKyAqIGNvZWZmaWNpZW50OworCisgICAgICAgIGNvZWZmaWNpZW50ID0gKmNvZWZmaWNpZW50cysrOyAvLyBuZXh0IHRhcAorICAgICAgICBsZWZ0ICs9ICp4RnJhbWUrKyAqIGNvZWZmaWNpZW50OworICAgICAgICByaWdodCArPSAqeEZyYW1lKysgKiBjb2VmZmljaWVudDsKKworICAgICAgICBjb2VmZmljaWVudCA9ICpjb2VmZmljaWVudHMrKzsgIC8vIG5leHQgdGFwCisgICAgICAgIGxlZnQgKz0gKnhGcmFtZSsrICogY29lZmZpY2llbnQ7CisgICAgICAgIHJpZ2h0ICs9ICp4RnJhbWUrKyAqIGNvZWZmaWNpZW50OworCisgICAgICAgIGNvZWZmaWNpZW50ID0gKmNvZWZmaWNpZW50cysrOyAgLy8gbmV4dCB0YXAKKyAgICAgICAgbGVmdCArPSAqeEZyYW1lKysgKiBjb2VmZmljaWVudDsKKyAgICAgICAgcmlnaHQgKz0gKnhGcmFtZSsrICogY29lZmZpY2llbnQ7CisgICAgfQorCisgICAgbUNvZWZmaWNpZW50Q3Vyc29yID0gKG1Db2VmZmljaWVudEN1cnNvciArIG1OdW1UYXBzKSAlIG1Db2VmZmljaWVudHMuc2l6ZSgpOworCisgICAgLy8gQ29weSBhY2N1bXVsYXRvcnMgdG8gb3V0cHV0LgorICAgIGZyYW1lWzBdID0gbGVmdDsKKyAgICBmcmFtZVsxXSA9IHJpZ2h0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlclN0ZXJlby5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1BvbHlwaGFzZVJlc2FtcGxlclN0ZXJlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNGNhYmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRVNBTVBMRVJfUE9MWVBIQVNFX1JFU0FNUExFUl9TVEVSRU9fSAorI2RlZmluZSBSRVNBTVBMRVJfUE9MWVBIQVNFX1JFU0FNUExFUl9TVEVSRU9fSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJQb2x5cGhhc2VSZXNhbXBsZXIuaCIKKyNpbmNsdWRlICJSZXNhbXBsZXJEZWZpbml0aW9ucy5oIgorCituYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyIHsKKworY2xhc3MgUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvIDogcHVibGljIFBvbHlwaGFzZVJlc2FtcGxlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgUG9seXBoYXNlUmVzYW1wbGVyU3RlcmVvKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcik7CisKKyAgICB2aXJ0dWFsIH5Qb2x5cGhhc2VSZXNhbXBsZXJTdGVyZW8oKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIHdyaXRlRnJhbWUoY29uc3QgZmxvYXQgKmZyYW1lKSBvdmVycmlkZTsKKworICAgIHZvaWQgcmVhZEZyYW1lKGZsb2F0ICpmcmFtZSkgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgKi8KKworI2VuZGlmIC8vUkVTQU1QTEVSX1BPTFlQSEFTRV9SRVNBTVBMRVJfU1RFUkVPX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9SRUFETUUubWQgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMzE5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTAxIEBACisjIFNhbXBsZSBSYXRlIENvbnZlcnRlcgorCitUaGlzIGZvbGRlciBjb250YWlucyBhIHNhbXBsZSByYXRlIGNvbnZlcnRlciwgb3IgInJlc2FtcGxlciIuCisKK1RoZSBjb252ZXJ0ZXIgaXMgYmFzZWQgb24gYSBzaW5jIGZ1bmN0aW9uIHRoYXQgaGFzIGJlZW4gd2luZG93ZWQgYnkgYSBoeXBlcmJvbGljIGNvc2luZS4KK1dlIGZvdW5kIHRoaXMgaGFkIGZld2VyIGFydGlmYWN0cyB0aGFuIHRoZSBtb3JlIHRyYWRpdGlvbmFsIEthaXNlciB3aW5kb3cuCisKKyMjIEJ1aWxkaW5nIHRoZSBSZXNhbXBsZXIKKworSXQgaXMgcGFydCBvZiBbT2JvZV0oaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vYm9lKSBidXQgaGFzIG5vIGRlcGVuZGVuY2llcyBvbiBPYm9lLgorU28gdGhlIGNvbnRlbnRzIG9mIHRoaXMgZm9sZGVyIGNhbiBiZSB1c2VkIG91dHNpZGUgb2YgT2JvZS4KKworVG8gYnVpbGQgaXQgZm9yIHVzZSBvdXRzaWRlIG9mIE9ib2U6CisKKzEuIENvcHkgdGhlICJyZXNhbXBsZXIiIGZvbGRlciB0byBhIGZvbGRlciBpbiB5b3VyIHByb2plY3QgdGhhdCBpcyBpbiB0aGUgaW5jbHVkZSBwYXRoLgorMi4gQWRkIGFsbCBvZiB0aGUgXCouY3BwIGZpbGVzIGluIHRoZSByZXNhbXBsZXIgZm9sZGVyIHRvIHlvdXIgcHJvamVjdCBJREUgb3IgTWFrZWZpbGUuCiszLiBJbiBSZXNhbXBsZXJEZWZpbml0aW9ucy5oLCBkZWZpbmUgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRSB3aXRoIHlvdXIgb3duIHByb2plY3QgbmFtZS4gQWx0ZXJuYXRpdmVseSwgdXNlIC1EUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRT1teW5hbWVzcGFjZSB3aGVuIGNvbXBpbGluZyB0byBhdm9pZCBtb2RpZnlpbmcgdGhlIHJlc2FtcGxlciBjb2RlLgorCisjIyBDcmVhdGluZyBhIFJlc2FtcGxlcgorCitJbmNsdWRlIHRoZSBbbWFpbiBoZWFkZXJdKE11bHRpQ2hhbm5lbFJlc2FtcGxlci5oKSBmb3IgdGhlIHJlc2FtcGxlci4KKworICAgICNpbmNsdWRlICJyZXNhbXBsZXIvTXVsdGlDaGFubmVsUmVzYW1wbGVyLmgiCisKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiBjcmVhdGluZyBhIHN0ZXJlbyByZXNhbXBsZXIgdGhhdCB3aWxsIGNvbnZlcnQgZnJvbSA0NDEwMCB0byA0ODAwMCBIei4KK09ubHkgZG8gdGhpcyBvbmNlLCB3aGVuIHlvdSBvcGVuIHlvdXIgc3RyZWFtLiBUaGVuIHVzZSB0aGUgc2FtcGxlIHJlc2FtcGxlciB0byBwcm9jZXNzIG11bHRpcGxlIGJ1ZmZlcnMuCisKKyAgICBNdWx0aUNoYW5uZWxSZXNhbXBsZXIgKnJlc2FtcGxlciA9IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6bWFrZSgKKyAgICAgICAgICAgIDIsIC8vIGNoYW5uZWwgY291bnQKKyAgICAgICAgICAgIDQ0MTAwLCAvLyBpbnB1dCBzYW1wbGVSYXRlCisgICAgICAgICAgICA0ODAwMCwgLy8gb3V0cHV0IHNhbXBsZVJhdGUKKyAgICAgICAgICAgIE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6UXVhbGl0eTo6TWVkaXVtKTsgLy8gY29udmVyc2lvbiBxdWFsaXR5CisKK1Bvc3NpYmxlIHZhbHVlcyBmb3IgcXVhbGl0eSBpbmNsdWRlIHsgRmFzdGVzdCwgTG93LCBNZWRpdW0sIEhpZ2gsIEJlc3QgfS4KK0hpZ2hlciBxdWFsaXR5IGxldmVscyB3aWxsIHNvdW5kIGJldHRlciBidXQgY29uc3VtZSBtb3JlIENQVSBiZWNhdXNlIHRoZXkgaGF2ZSBtb3JlIHRhcHMgaW4gdGhlIGZpbHRlci4KKworIyMgRnJhY3Rpb25hbCBGcmFtZSBDb3VudHMKKworTm90ZSB0aGF0IHRoZSBudW1iZXIgb2Ygb3V0cHV0IGZyYW1lcyBnZW5lcmF0ZWQgZm9yIGEgZ2l2ZW4gbnVtYmVyIG9mIGlucHV0IGZyYW1lcyBjYW4gdmFyeS4KKworRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGFyZSBjb252ZXJ0aW5nIGZyb20gNDQxMDAgSHogdG8gNDgwMDAgSHogYW5kIHVzaW5nIGFuIGlucHV0IGJ1ZmZlciB3aXRoIDk2MCBmcmFtZXMuIElmIHlvdSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBvdXRwdXQgZnJhbWVzIHlvdSBnZXQ6CisKKyAgICA5NjAgKiA0ODAwMCAqIDQ0MTAwID0gMTA0NC44OTc5NTkuLi4KKworWW91IGNhbm5vdCBnZW5lcmF0ZSBhIGZyYWN0aW9uYWwgbnVtYmVyIG9mIGZyYW1lcy4gU28gdGhlIHJlc2FtcGxlciB3aWxsIHNvbWV0aW1lcyBnZW5lcmF0ZSAxMDQ0IGZyYW1lcyBhbmQgc29tZXRpbWVzIDEwNDUgZnJhbWVzLiBPbiBhdmVyYWdlIGl0IHdpbGwgZ2VuZXJhdGUgMTA0NC44OTc5NTkgZnJhbWVzLiBUaGUgcmVzYW1wbGVyIHN0b3JlcyB0aGUgZnJhY3Rpb24gaW50ZXJuYWxseSBhbmQga2VlcHMgdHJhY2sgb2Ygd2hlbiB0byBjb25zdW1lIG9yIGdlbmVyYXRlIGEgZnJhbWUuCisKK1lvdSBjYW4gZWl0aGVyIHVzZSBhIGZpeGVkIG51bWJlciBvZiBpbnB1dCBmcmFtZXMgb3IgYSBmaXhlZCBudW1iZXIgb2Ygb3V0cHV0IGZyYW1lcy4gVGhlIG90aGVyIGZyYW1lIGNvdW50IHdpbGwgdmFyeS4KKworIyMgQ2FsbGluZyB0aGUgUmVzYW1wbGVyIHdpdGggYSBmaXhlZCBudW1iZXIgb2YgT1VUUFVUIGZyYW1lcworCitJbiB0aGlzIGV4YW1wbGUsIHN1cHBvc2Ugd2UgaGF2ZSBhIGZpeGVkIG51bWJlciBvZiBvdXRwdXQgZnJhbWVzIGFuZCBhIHZhcmlhYmxlIG51bWJlciBvZiBpbnB1dCBmcmFtZXMuCisKK0Fzc3VtZSB5b3Ugc3RhcnQgd2l0aCB0aGVzZSB2YXJpYWJsZXMgYW5kIGEgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgbmV4dCBpbnB1dCBmcmFtZToKKworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXI7ICAgICAvLyBtdWx0aS1jaGFubmVsIGJ1ZmZlciB0byBiZSBmaWxsZWQKKyAgICBpbnQgICAgbnVtT3V0cHV0RnJhbWVzOyAgLy8gbnVtYmVyIG9mIGZyYW1lcyBvZiBvdXRwdXQKKworVGhlIHJlc2FtcGxlciBoYXMgYSBtZXRob2QgaXNXcml0ZU5lZWRlZCgpIHRoYXQgdGVsbHMgeW91IHdoZXRoZXIgdG8gd3JpdGUgdG8gb3IgcmVhZCBmcm9tIHRoZSByZXNhbXBsZXIuCisKKyAgICBpbnQgb3V0cHV0RnJhbWVzTGVmdCA9IG51bU91dHB1dEZyYW1lczsKKyAgICB3aGlsZSAob3V0cHV0RnJhbWVzTGVmdCA+IDApIHsKKyAgICAgICAgaWYocmVzYW1wbGVyLT5pc1dyaXRlTmVlZGVkKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpmcmFtZSA9IGdldE5leHRJbnB1dEZyYW1lKCk7IC8vIHlvdSBwcm92aWRlIHRoaXMKKyAgICAgICAgICAgIHJlc2FtcGxlci0+d3JpdGVOZXh0RnJhbWUoZnJhbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzYW1wbGVyLT5yZWFkTmV4dEZyYW1lKG91dHB1dEJ1ZmZlcik7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXIgKz0gY2hhbm5lbENvdW50OworICAgICAgICAgICAgb3V0cHV0RnJhbWVzTGVmdC0tOworICAgICAgICB9CisgICAgfQorCisjIyBDYWxsaW5nIHRoZSBSZXNhbXBsZXIgd2l0aCBhIGZpeGVkIG51bWJlciBvZiBJTlBVVCBmcmFtZXMKKworSW4gdGhpcyBleGFtcGxlLCBzdXBwb3NlIHdlIGhhdmUgYSBmaXhlZCBudW1iZXIgb2YgaW5wdXQgZnJhbWVzIGFuZCBhIHZhcmlhYmxlIG51bWJlciBvZiBvdXRwdXQgZnJhbWVzLgorCitBc3N1bWUgeW91IHN0YXJ0IHdpdGggdGhlc2UgdmFyaWFibGVzOgorCisgICAgZmxvYXQgKmlucHV0QnVmZmVyOyAgICAgLy8gbXVsdGktY2hhbm5lbCBidWZmZXIgdG8gYmUgY29uc3VtZWQKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyOyAgICAvLyBtdWx0aS1jaGFubmVsIGJ1ZmZlciB0byBiZSBmaWxsZWQKKyAgICBpbnQgICAgbnVtSW5wdXRGcmFtZXM7ICAvLyBudW1iZXIgb2YgZnJhbWVzIG9mIGlucHV0CisgICAgaW50ICAgIG51bU91dHB1dEZyYW1lcyA9IDA7CisgICAgaW50ICAgIGNoYW5uZWxDb3VudDsgICAgLy8gMSBmb3IgbW9ubywgMiBmb3Igc3RlcmVvCisKKyAgICBpbnQgaW5wdXRGcmFtZXNMZWZ0ID0gbnVtSW5wdXRGcmFtZXM7CisgICAgd2hpbGUgKGlucHV0RnJhbWVzTGVmdCA+IDApIHsKKyAgICAgICAgaWYocmVzYW1wbGVyLT5pc1dyaXRlTmVlZGVkKCkpIHsKKyAgICAgICAgICAgIHJlc2FtcGxlci0+d3JpdGVOZXh0RnJhbWUoaW5wdXRCdWZmZXIpOworICAgICAgICAgICAgaW5wdXRCdWZmZXIgKz0gY2hhbm5lbENvdW50OworICAgICAgICAgICAgaW5wdXRGcmFtZXNMZWZ0LS07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNhbXBsZXItPnJlYWROZXh0RnJhbWUob3V0cHV0QnVmZmVyKTsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlciArPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICBudW1PdXRwdXRGcmFtZXMrKzsKKyAgICAgICAgfQorICAgIH0KKworIyMgRGVsZXRpbmcgdGhlIFJlc2FtcGxlcgorCitXaGVuIHlvdSBhcmUgZG9uZSwgeW91IHNob3VsZCBkZWxldGUgdGhlIFJlc2FtcGxlciB0byBhdm9pZCBhIG1lbW9yeSBsZWFrLgorCisgICAgZGVsZXRlIHJlc2FtcGxlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9SZXNhbXBsZXJEZWZpbml0aW9ucy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1Jlc2FtcGxlckRlZmluaXRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3OTFlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9SZXNhbXBsZXJEZWZpbml0aW9ucy5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFNldCBmbGFnIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0UgYmFzZWQgb24gd2hldGhlciBjb21waWxlciBmbGFnCisvLyBfX0FORFJPSURfTkRLX18gaXMgZGVmaW5lZC4gX19BTkRST0lEX05ES19fIHNob3VsZCBiZSBkZWZpbmVkIGluIG9ib2UKKy8vIGJ1dCBub3QgaW4gYW5kcm9pZC4KKworI2lmbmRlZiBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFCisjaWZkZWYgX19BTkRST0lEX05ES19fCisjZGVmaW5lIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0Ugb2JvZQorI2Vsc2UKKyNkZWZpbmUgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRSBhYXVkaW8KKyNlbmRpZiAvLyBfX0FORFJPSURfTkRLX18KKyNlbmRpZiAvLyBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvU2luY1Jlc2FtcGxlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvU2luY1Jlc2FtcGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkMGNhMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9TaW5jUmVzYW1wbGVyLmNwcApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAiU2luY1Jlc2FtcGxlci5oIgorCit1c2luZyBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyOworCitTaW5jUmVzYW1wbGVyOjpTaW5jUmVzYW1wbGVyKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcikKKyAgICAgICAgOiBNdWx0aUNoYW5uZWxSZXNhbXBsZXIoYnVpbGRlcikKKyAgICAgICAgLCBtU2luZ2xlRnJhbWUyKGJ1aWxkZXIuZ2V0Q2hhbm5lbENvdW50KCkpIHsKKyAgICBhc3NlcnQoKGdldE51bVRhcHMoKSAlIDQpID09IDApOyAvLyBSZXF1aXJlZCBmb3IgbG9vcCB1bnJvbGxpbmcuCisgICAgbU51bVJvd3MgPSBrTWF4Q29lZmZpY2llbnRzIC8gZ2V0TnVtVGFwcygpOyAvLyBubyBndWFyZCByb3cgbmVlZGVkCisgICAgbVBoYXNlU2NhbGVyID0gKGRvdWJsZSkgbU51bVJvd3MgLyBtRGVub21pbmF0b3I7CisgICAgZG91YmxlIHBoYXNlSW5jcmVtZW50ID0gMS4wIC8gbU51bVJvd3M7CisgICAgZ2VuZXJhdGVDb2VmZmljaWVudHMoYnVpbGRlci5nZXRJbnB1dFJhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmdldE91dHB1dFJhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtUm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZUluY3JlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmdldE5vcm1hbGl6ZWRDdXRvZmYoKSk7Cit9CisKK3ZvaWQgU2luY1Jlc2FtcGxlcjo6cmVhZEZyYW1lKGZsb2F0ICpmcmFtZSkgeworICAgIC8vIENsZWFyIGFjY3VtdWxhdG9yIGZvciBtaXhpbmcuCisgICAgc3RkOjpmaWxsKG1TaW5nbGVGcmFtZS5iZWdpbigpLCBtU2luZ2xlRnJhbWUuZW5kKCksIDAuMCk7CisgICAgc3RkOjpmaWxsKG1TaW5nbGVGcmFtZTIuYmVnaW4oKSwgbVNpbmdsZUZyYW1lMi5lbmQoKSwgMC4wKTsKKworICAgIC8vIERldGVybWluZSBpbmRpY2VzIGludG8gY29lZmZpY2llbnRzIHRhYmxlLgorICAgIGRvdWJsZSB0YWJsZVBoYXNlID0gZ2V0SW50ZWdlclBoYXNlKCkgKiBtUGhhc2VTY2FsZXI7CisgICAgaW50IGluZGV4MSA9IHN0YXRpY19jYXN0PGludD4oZmxvb3IodGFibGVQaGFzZSkpOworICAgIGlmIChpbmRleDEgPj0gbU51bVJvd3MpIHsgLy8gbm8gZ3VhcmQgcm93IG5lZWRlZCBiZWNhdXNlIHdlIHdyYXAgdGhlIGluZGljZXMKKyAgICAgICAgdGFibGVQaGFzZSAtPSBtTnVtUm93czsKKyAgICAgICAgaW5kZXgxIC09IG1OdW1Sb3dzOworICAgIH0KKworICAgIGludCBpbmRleDIgPSBpbmRleDEgKyAxOworICAgIGlmIChpbmRleDIgPj0gbU51bVJvd3MpIHsgLy8gbm8gZ3VhcmQgcm93IG5lZWRlZCBiZWNhdXNlIHdlIHdyYXAgdGhlIGluZGljZXMKKyAgICAgICAgaW5kZXgyIC09IG1OdW1Sb3dzOworICAgIH0KKworICAgIGZsb2F0ICpjb2VmZmljaWVudHMxID0gJm1Db2VmZmljaWVudHNbc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmRleDEpCisgICAgICAgICAgICAqIHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0TnVtVGFwcygpKV07CisgICAgZmxvYXQgKmNvZWZmaWNpZW50czIgPSAmbUNvZWZmaWNpZW50c1tzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGV4MikKKyAgICAgICAgICAgICogc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXROdW1UYXBzKCkpXTsKKworICAgIGZsb2F0ICp4RnJhbWUgPSAmbVhbc3RhdGljX2Nhc3Q8c2l6ZV90PihtQ3Vyc29yKSAqIHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0Q2hhbm5lbENvdW50KCkpXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1UYXBzOyBpKyspIHsKKyAgICAgICAgZmxvYXQgY29lZmZpY2llbnQxID0gKmNvZWZmaWNpZW50czErKzsKKyAgICAgICAgZmxvYXQgY29lZmZpY2llbnQyID0gKmNvZWZmaWNpZW50czIrKzsKKyAgICAgICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBnZXRDaGFubmVsQ291bnQoKTsgY2hhbm5lbCsrKSB7CisgICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSAqeEZyYW1lKys7CisgICAgICAgICAgICBtU2luZ2xlRnJhbWVbY2hhbm5lbF0gKz0gIHNhbXBsZSAqIGNvZWZmaWNpZW50MTsKKyAgICAgICAgICAgIG1TaW5nbGVGcmFtZTJbY2hhbm5lbF0gKz0gc2FtcGxlICogY29lZmZpY2llbnQyOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSW50ZXJwb2xhdGUgYW5kIGNvcHkgdG8gb3V0cHV0LgorICAgIGZsb2F0IGZyYWN0aW9uID0gdGFibGVQaGFzZSAtIGluZGV4MTsKKyAgICBmb3IgKGludCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGdldENoYW5uZWxDb3VudCgpOyBjaGFubmVsKyspIHsKKyAgICAgICAgZmxvYXQgbG93ID0gbVNpbmdsZUZyYW1lW2NoYW5uZWxdOworICAgICAgICBmbG9hdCBoaWdoID0gbVNpbmdsZUZyYW1lMltjaGFubmVsXTsKKyAgICAgICAgZnJhbWVbY2hhbm5lbF0gPSBsb3cgKyAoZnJhY3Rpb24gKiAoaGlnaCAtIGxvdykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9TaW5jUmVzYW1wbGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvU2luY1Jlc2FtcGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZmYwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvU2luY1Jlc2FtcGxlci5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUkVTQU1QTEVSX1NJTkNfUkVTQU1QTEVSX0gKKyNkZWZpbmUgUkVTQU1QTEVSX1NJTkNfUkVTQU1QTEVSX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIk11bHRpQ2hhbm5lbFJlc2FtcGxlci5oIgorI2luY2x1ZGUgIlJlc2FtcGxlckRlZmluaXRpb25zLmgiCisKK25hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgeworCisvKioKKyAqIFJlc2FtcGxlciB0aGF0IGNhbiBpbnRlcnBvbGF0ZSBiZXR3ZWVuIGNvZWZmaWNpZW50cy4KKyAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3VwcG9ydCBhcmJpdHJhcnkgcmF0aW9zLgorICovCitjbGFzcyBTaW5jUmVzYW1wbGVyIDogcHVibGljIE11bHRpQ2hhbm5lbFJlc2FtcGxlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2luY1Jlc2FtcGxlcihjb25zdCBNdWx0aUNoYW5uZWxSZXNhbXBsZXI6OkJ1aWxkZXIgJmJ1aWxkZXIpOworCisgICAgdmlydHVhbCB+U2luY1Jlc2FtcGxlcigpID0gZGVmYXVsdDsKKworICAgIHZvaWQgcmVhZEZyYW1lKGZsb2F0ICpmcmFtZSkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtU2luZ2xlRnJhbWUyOyAvLyBmb3IgaW50ZXJwb2xhdGlvbgorICAgIGludDMyX3QgICAgICAgICAgICBtTnVtUm93cyA9IDA7CisgICAgZG91YmxlICAgICAgICAgICAgIG1QaGFzZVNjYWxlciA9IDEuMDsKK307CisKK30gLyogbmFtZXNwYWNlIFJFU0FNUExFUl9PVVRFUl9OQU1FU1BBQ0U6OnJlc2FtcGxlciAqLworCisjZW5kaWYgLy9SRVNBTVBMRVJfU0lOQ19SRVNBTVBMRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1NpbmNSZXNhbXBsZXJTdGVyZW8uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1NpbmNSZXNhbXBsZXJTdGVyZW8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjEzN2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9yZXNhbXBsZXIvU2luY1Jlc2FtcGxlclN0ZXJlby5jcHAKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiU2luY1Jlc2FtcGxlclN0ZXJlby5oIgorCit1c2luZyBuYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyOworCisjZGVmaW5lIFNURVJFTyAgMgorCitTaW5jUmVzYW1wbGVyU3RlcmVvOjpTaW5jUmVzYW1wbGVyU3RlcmVvKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcikKKyAgICAgICAgOiBTaW5jUmVzYW1wbGVyKGJ1aWxkZXIpIHsKKyAgICBhc3NlcnQoYnVpbGRlci5nZXRDaGFubmVsQ291bnQoKSA9PSBTVEVSRU8pOworfQorCit2b2lkIFNpbmNSZXNhbXBsZXJTdGVyZW86OndyaXRlRnJhbWUoY29uc3QgZmxvYXQgKmZyYW1lKSB7CisgICAgLy8gTW92ZSBjdXJzb3IgYmVmb3JlIHdyaXRlIHNvIHRoYXQgY3Vyc29yIHBvaW50cyB0byBsYXN0IHdyaXR0ZW4gZnJhbWUgaW4gcmVhZC4KKyAgICBpZiAoLS1tQ3Vyc29yIDwgMCkgeworICAgICAgICBtQ3Vyc29yID0gZ2V0TnVtVGFwcygpIC0gMTsKKyAgICB9CisgICAgZmxvYXQgKmRlc3QgPSAmbVhbbUN1cnNvciAqIFNURVJFT107CisgICAgY29uc3QgaW50IG9mZnNldCA9IG1OdW1UYXBzICogU1RFUkVPOworICAgIC8vIFdyaXRlIGVhY2ggY2hhbm5lbCB0d2ljZSBzbyB3ZSBhdm9pZCBoYXZpbmcgdG8gd3JhcCB3aGVuIHJ1bm5pbmcgdGhlIEZJUi4KKyAgICBjb25zdCBmbG9hdCBsZWZ0ID0gIGZyYW1lWzBdOworICAgIGNvbnN0IGZsb2F0IHJpZ2h0ID0gZnJhbWVbMV07CisgICAgLy8gUHV0IG9yZGVyZWQgd3JpdGVzIHRvZ2V0aGVyLgorICAgIGRlc3RbMF0gPSBsZWZ0OworICAgIGRlc3RbMV0gPSByaWdodDsKKyAgICBkZXN0W29mZnNldF0gPSBsZWZ0OworICAgIGRlc3RbMSArIG9mZnNldF0gPSByaWdodDsKK30KKworLy8gTXVsdGlwbHkgaW5wdXQgdGltZXMgd2luZG93ZWQgc2luYyBmdW5jdGlvbi4KK3ZvaWQgU2luY1Jlc2FtcGxlclN0ZXJlbzo6cmVhZEZyYW1lKGZsb2F0ICpmcmFtZSkgeworICAgIC8vIENsZWFyIGFjY3VtdWxhdG9yIGZvciBtaXhpbmcuCisgICAgc3RkOjpmaWxsKG1TaW5nbGVGcmFtZS5iZWdpbigpLCBtU2luZ2xlRnJhbWUuZW5kKCksIDAuMCk7CisgICAgc3RkOjpmaWxsKG1TaW5nbGVGcmFtZTIuYmVnaW4oKSwgbVNpbmdsZUZyYW1lMi5lbmQoKSwgMC4wKTsKKworICAgIC8vIERldGVybWluZSBpbmRpY2VzIGludG8gY29lZmZpY2llbnRzIHRhYmxlLgorICAgIGRvdWJsZSB0YWJsZVBoYXNlID0gZ2V0SW50ZWdlclBoYXNlKCkgKiBtUGhhc2VTY2FsZXI7CisgICAgaW50IGluZGV4MSA9IHN0YXRpY19jYXN0PGludD4oZmxvb3IodGFibGVQaGFzZSkpOworICAgIGZsb2F0ICpjb2VmZmljaWVudHMxID0gJm1Db2VmZmljaWVudHNbc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmRleDEpCisgICAgICAgICAgICAqIHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0TnVtVGFwcygpKV07CisgICAgaW50IGluZGV4MiA9IChpbmRleDEgKyAxKTsKKyAgICBpZiAoaW5kZXgyID49IG1OdW1Sb3dzKSB7IC8vIG5vIGd1YXJkIHJvdyBuZWVkZWQgYmVjYXVzZSB3ZSB3cmFwIHRoZSBpbmRpY2VzCisgICAgICAgIGluZGV4MiA9IDA7CisgICAgfQorICAgIGZsb2F0ICpjb2VmZmljaWVudHMyID0gJm1Db2VmZmljaWVudHNbc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmRleDIpCisgICAgICAgICAgICAqIHN0YXRpY19jYXN0PHNpemVfdD4oZ2V0TnVtVGFwcygpKV07CisgICAgZmxvYXQgKnhGcmFtZSA9ICZtWFtzdGF0aWNfY2FzdDxzaXplX3Q+KG1DdXJzb3IpICogc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRDaGFubmVsQ291bnQoKSldOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVRhcHM7IGkrKykgeworICAgICAgICBmbG9hdCBjb2VmZmljaWVudDEgPSAqY29lZmZpY2llbnRzMSsrOworICAgICAgICBmbG9hdCBjb2VmZmljaWVudDIgPSAqY29lZmZpY2llbnRzMisrOworICAgICAgICBmb3IgKGludCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGdldENoYW5uZWxDb3VudCgpOyBjaGFubmVsKyspIHsKKyAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9ICp4RnJhbWUrKzsKKyAgICAgICAgICAgIG1TaW5nbGVGcmFtZVtjaGFubmVsXSArPSAgc2FtcGxlICogY29lZmZpY2llbnQxOworICAgICAgICAgICAgbVNpbmdsZUZyYW1lMltjaGFubmVsXSArPSBzYW1wbGUgKiBjb2VmZmljaWVudDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbnRlcnBvbGF0ZSBhbmQgY29weSB0byBvdXRwdXQuCisgICAgZmxvYXQgZnJhY3Rpb24gPSB0YWJsZVBoYXNlIC0gaW5kZXgxOworICAgIGZvciAoaW50IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgZ2V0Q2hhbm5lbENvdW50KCk7IGNoYW5uZWwrKykgeworICAgICAgICBmbG9hdCBsb3cgPSBtU2luZ2xlRnJhbWVbY2hhbm5lbF07CisgICAgICAgIGZsb2F0IGhpZ2ggPSBtU2luZ2xlRnJhbWUyW2NoYW5uZWxdOworICAgICAgICBmcmFtZVtjaGFubmVsXSA9IGxvdyArIChmcmFjdGlvbiAqIChoaWdoIC0gbG93KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvcmVzYW1wbGVyL1NpbmNSZXNhbXBsZXJTdGVyZW8uaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9TaW5jUmVzYW1wbGVyU3RlcmVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1NzZkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL3Jlc2FtcGxlci9TaW5jUmVzYW1wbGVyU3RlcmVvLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRVNBTVBMRVJfU0lOQ19SRVNBTVBMRVJfU1RFUkVPX0gKKyNkZWZpbmUgUkVTQU1QTEVSX1NJTkNfUkVTQU1QTEVSX1NURVJFT19ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIlNpbmNSZXNhbXBsZXIuaCIKKyNpbmNsdWRlICJSZXNhbXBsZXJEZWZpbml0aW9ucy5oIgorCituYW1lc3BhY2UgUkVTQU1QTEVSX09VVEVSX05BTUVTUEFDRTo6cmVzYW1wbGVyIHsKKworY2xhc3MgU2luY1Jlc2FtcGxlclN0ZXJlbyA6IHB1YmxpYyBTaW5jUmVzYW1wbGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTaW5jUmVzYW1wbGVyU3RlcmVvKGNvbnN0IE11bHRpQ2hhbm5lbFJlc2FtcGxlcjo6QnVpbGRlciAmYnVpbGRlcik7CisKKyAgICB2aXJ0dWFsIH5TaW5jUmVzYW1wbGVyU3RlcmVvKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCB3cml0ZUZyYW1lKGNvbnN0IGZsb2F0ICpmcmFtZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHJlYWRGcmFtZShmbG9hdCAqZnJhbWUpIG92ZXJyaWRlOworCit9OworCit9IC8qIG5hbWVzcGFjZSBSRVNBTVBMRVJfT1VURVJfTkFNRVNQQUNFOjpyZXNhbXBsZXIgKi8KKworI2VuZGlmIC8vUkVTQU1QTEVSX1NJTkNfUkVTQU1QTEVSX1NURVJFT19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKaW5kZXggZTk2ZTEzNC4uZGQxMTE2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcApAQCAtMzcsMTggKzM3LDYgQEAKICAgICAgICAgOiBBdWRpb1N0cmVhbSgpIHsKIH0KIAotQXVkaW9TdHJlYW1MZWdhY3k6On5BdWRpb1N0cmVhbUxlZ2FjeSgpIHsKLX0KLQotLy8gQ2FsbGVkIGZyb20gQXVkaW9UcmFjay5jcHAgb3IgQXVkaW9SZWNvcmQuY3BwCi1zdGF0aWMgdm9pZCBBdWRpb1N0cmVhbUxlZ2FjeV9jYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQqIHVzZXJEYXRhLCB2b2lkICppbmZvKSB7Ci0gICAgQXVkaW9TdHJlYW1MZWdhY3kgKnN0cmVhbUxlZ2FjeSA9IChBdWRpb1N0cmVhbUxlZ2FjeSAqKSB1c2VyRGF0YTsKLSAgICBzdHJlYW1MZWdhY3ktPnByb2Nlc3NDYWxsYmFjayhldmVudCwgaW5mbyk7Ci19Ci0KLWFhdWRpb19sZWdhY3lfY2FsbGJhY2tfdCBBdWRpb1N0cmVhbUxlZ2FjeTo6Z2V0TGVnYWN5Q2FsbGJhY2soKSB7Ci0gICAgcmV0dXJuIEF1ZGlvU3RyZWFtTGVnYWN5X2NhbGxiYWNrOwotfQogCiBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBBdWRpb1N0cmVhbUxlZ2FjeTo6Y2FsbERhdGFDYWxsYmFja0ZyYW1lcyh1aW50OF90ICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcykgewpAQCAtNzYsODIgKzY0LDE0MCBAQAogICAgIHJldHVybiAoaW50MzJfdCkgY2FsbERhdGFDYWxsYmFja0ZyYW1lcyhidWZmZXIsIG51bUZyYW1lcyk7CiB9CiAKLXZvaWQgQXVkaW9TdHJlYW1MZWdhY3k6OnByb2Nlc3NDYWxsYmFja0NvbW1vbihhYXVkaW9fY2FsbGJhY2tfb3BlcmF0aW9uX3Qgb3Bjb2RlLCB2b2lkICppbmZvKSB7CisKK3ZvaWQgQXVkaW9TdHJlYW1MZWdhY3k6Om9uTmV3SUF1ZGlvVHJhY2soKSB7CisgICAgQUxPR0QoIiVzIHN0cmVhbSBkaXNjb25uZWN0ZWQiLCBfX2Z1bmNfXyk7CisgICAgZm9yY2VEaXNjb25uZWN0KCk7CisgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7Cit9CisKK3NpemVfdCBBdWRpb1N0cmVhbUxlZ2FjeTo6b25Nb3JlRGF0YShjb25zdCBhbmRyb2lkOjpBdWRpb1RyYWNrOjpCdWZmZXImIGJ1ZmZlcikgeworICAgIC8vIFRoaXMgaWxsZWdhbCBzaXplIGNhbiBiZSB1c2VkIHRvIHRlbGwgQXVkaW9SZWNvcmQgb3IgQXVkaW9UcmFjayB0byBzdG9wIGNhbGxpbmcgdXMuCisgICAgLy8gVGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlbSBraWxsaW5nIHRoZSBzdHJlYW0gd2hlbiB0aGV5IHNlZSBhIHNpemUgb3V0IG9mIHJhbmdlLgorICAgIC8vIFRoYXQgaXMgYW4gdW5kb2N1bWVudGVkIGJlaGF2aW9yLgorICAgIC8vIFRPRE8gYWRkIHRvIEFQSSBpbiBBdWRpb1JlY29yZCBhbmQgQXVkaW9UcmFjaworICAgIC8vIFRPRE8oYi8yMTYxNzU4MzApIGNsZWFudXAgc2l6ZSByZS1jb21wdXRhdGlvbgorICAgIGNvbnN0IHNpemVfdCBTSVpFX1NUT1BfQ0FMTEJBQ0tTID0gU0laRV9NQVg7CiAgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgY2FsbGJhY2tSZXN1bHQ7CisgICAgKHZvaWQpIGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QodHJ1ZSk7CisKKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBjb2RlIGFzc3VtZXMgYW4gQXVkaW9UcmFjazo6QnVmZmVyIGlzIHRoZSBzYW1lIGFzCisgICAgLy8gQXVkaW9SZWNvcmQ6OkJ1ZmZlcgorICAgIC8vIFRPRE8gZGVmaW5lIG91ciBvd24gQXVkaW9CdWZmZXIgYW5kIHBhc3MgaXQgZnJvbSB0aGUgc3ViY2xhc3Nlcy4KKyAgICBzaXplX3Qgd3JpdHRlbiA9IGJ1ZmZlci5zaXplKCk7CisgICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgQUxPR1coIiVzKCkgZGF0YSwgc3RyZWFtIGRpc2Nvbm5lY3RlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgLy8gVGhpcyB3aWxsIGtpbGwgdGhlIHN0cmVhbSBhbmQgcHJldmVudCBpdCBmcm9tIGJlaW5nIHJlc3RhcnRlZC4KKyAgICAgICAgLy8gVGhhdCBpcyBPSyBiZWNhdXNlIHRoZSBzdHJlYW0gaXMgZGlzY29ubmVjdGVkLgorICAgICAgICB3cml0dGVuID0gU0laRV9TVE9QX0NBTExCQUNLUzsKKyAgICB9IGVsc2UgaWYgKCFtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSkgeworICAgICAgICBBTE9HVygiJXMoKSBubyBkYXRhIGJlY2F1c2UgY2FsbGJhY2sgZGlzYWJsZWQsIHNldCBzaXplPTAiLCBfX2Z1bmNfXyk7CisgICAgICAgIC8vIERvIE5PVCB1c2UgU0laRV9TVE9QX0NBTExCQUNLUyBoZXJlIGJlY2F1c2UgdGhhdCB3aWxsIGtpbGwgdGhlIHN0cmVhbSBhbmQKKyAgICAgICAgLy8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHJlc3RhcnRlZC4gVGhpcyBjYW4gb2NjdXIgYmVjYXVzZSBvZiBhIHJhY2UgY29uZGl0aW9uCisgICAgICAgIC8vIGNhdXNlZCBieSBMZWdhY3kgY2FsbGJhY2tzIHJ1bm5pbmcgYWZ0ZXIgdGhlIHRyYWNrIGlzICJzdG9wcGVkIi4KKyAgICAgICAgd3JpdHRlbiA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXRGcmFtZUNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coIiVzKCkgZGF0YSwgZnJhbWVDb3VudCBpcyB6ZXJvIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIHdyaXR0ZW47CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgY2FsbGVyIHNwZWNpZmllZCBhbiBleGFjdCBzaXplIHRoZW4gdXNlIGEgYmxvY2sgc2l6ZSBhZGFwdGVyLgorICAgICAgICBpZiAobUJsb2NrQWRhcHRlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpbnQzMl90IGJ5dGVDb3VudCA9IGJ1ZmZlci5nZXRGcmFtZUNvdW50KCkgKiBnZXRCeXRlc1BlckRldmljZUZyYW1lKCk7CisgICAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IG1CbG9ja0FkYXB0ZXItPnByb2Nlc3NWYXJpYWJsZUJsb2NrKAorICAgICAgICAgICAgICAgICAgICBidWZmZXIuZGF0YSgpLCBieXRlQ291bnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ2FsbCB1c2luZyB0aGUgQUF1ZGlvIGNhbGxiYWNrIGludGVyZmFjZS4KKyAgICAgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gY2FsbERhdGFDYWxsYmFja0ZyYW1lcyhidWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXRGcmFtZUNvdW50KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFKSB7CisgICAgICAgICAgICB3cml0dGVuID0gYnVmZmVyLmdldEZyYW1lQ291bnQoKSAqIGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXMoKSBjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGNhbGxiYWNrIHJldHVybmVkIGludmFsaWQgcmVzdWx0ID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjYWxsYmFja1Jlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0dGVuID0gMDsKKyAgICAgICAgICAgIHN5c3RlbVN0b3BJbnRlcm5hbCgpOworICAgICAgICAgICAgLy8gRGlzYWJsZSB0aGUgY2FsbGJhY2sganVzdCBpbiBjYXNlIHRoZSBzeXN0ZW0ga2VlcHMgdHJ5aW5nIHRvIGNhbGwgdXMuCisgICAgICAgICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1cGRhdGVTdGF0ZU1hY2hpbmUoKSAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGZvcmNlRGlzY29ubmVjdCgpOworICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHdyaXR0ZW47Cit9CisKKy8vIFRPRE8gKGIvMjE2MTc1ODMwKSB0aGlzIG1ldGhvZCBpcyBkdXBsaWNhdGVkIGluIG9yZGVyIHRvIGVhc2UgcmVmYWN0b3Jpbmcgd2hpY2ggd2lsbAorLy8gcmVjb25zb2xpZGF0ZS4KK3NpemVfdCBBdWRpb1N0cmVhbUxlZ2FjeTo6b25Nb3JlRGF0YShjb25zdCBhbmRyb2lkOjpBdWRpb1JlY29yZDo6QnVmZmVyJiBidWZmZXIpIHsKICAgICAvLyBUaGlzIGlsbGVnYWwgc2l6ZSBjYW4gYmUgdXNlZCB0byB0ZWxsIEF1ZGlvUmVjb3JkIG9yIEF1ZGlvVHJhY2sgdG8gc3RvcCBjYWxsaW5nIHVzLgogICAgIC8vIFRoaXMgdGFrZXMgYWR2YW50YWdlIG9mIHRoZW0ga2lsbGluZyB0aGUgc3RyZWFtIHdoZW4gdGhleSBzZWUgYSBzaXplIG91dCBvZiByYW5nZS4KICAgICAvLyBUaGF0IGlzIGFuIHVuZG9jdW1lbnRlZCBiZWhhdmlvci4KICAgICAvLyBUT0RPIGFkZCB0byBBUEkgaW4gQXVkaW9SZWNvcmQgYW5kIEF1ZGlvVHJhY2sKICAgICBjb25zdCBzaXplX3QgU0laRV9TVE9QX0NBTExCQUNLUyA9IFNJWkVfTUFYOworICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IGNhbGxiYWNrUmVzdWx0OworICAgICh2b2lkKSBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KHRydWUpOwogCi0gICAgc3dpdGNoIChvcGNvZGUpIHsKLSAgICAgICAgY2FzZSBBQVVESU9fQ0FMTEJBQ0tfT1BFUkFUSU9OX1BST0NFU1NfREFUQTogewotICAgICAgICAgICAgKHZvaWQpIGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyBhbiBBdWRpb1RyYWNrOjpCdWZmZXIgaXMgdGhlIHNhbWUgYXMKLSAgICAgICAgICAgIC8vIEF1ZGlvUmVjb3JkOjpCdWZmZXIKLSAgICAgICAgICAgIC8vIFRPRE8gZGVmaW5lIG91ciBvd24gQXVkaW9CdWZmZXIgYW5kIHBhc3MgaXQgZnJvbSB0aGUgc3ViY2xhc3Nlcy4KLSAgICAgICAgICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYXVkaW9CdWZmZXIgPSBzdGF0aWNfY2FzdDxBdWRpb1RyYWNrOjpCdWZmZXIgKj4oaW5mbyk7Ci0gICAgICAgICAgICBpZiAoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJwcm9jZXNzQ2FsbGJhY2tDb21tb24oKSBkYXRhLCBzdHJlYW0gZGlzY29ubmVjdGVkIik7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGtpbGwgdGhlIHN0cmVhbSBhbmQgcHJldmVudCBpdCBmcm9tIGJlaW5nIHJlc3RhcnRlZC4KLSAgICAgICAgICAgICAgICAvLyBUaGF0IGlzIE9LIGJlY2F1c2UgdGhlIHN0cmVhbSBpcyBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBTSVpFX1NUT1BfQ0FMTEJBQ0tTOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbUNhbGxiYWNrRW5hYmxlZC5sb2FkKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygicHJvY2Vzc0NhbGxiYWNrQ29tbW9uKCkgbm8gZGF0YSBiZWNhdXNlIGNhbGxiYWNrIGRpc2FibGVkLCBzZXQgc2l6ZT0wIik7Ci0gICAgICAgICAgICAgICAgLy8gRG8gTk9UIHVzZSBTSVpFX1NUT1BfQ0FMTEJBQ0tTIGhlcmUgYmVjYXVzZSB0aGF0IHdpbGwga2lsbCB0aGUgc3RyZWFtIGFuZAotICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgaXQgZnJvbSBiZWluZyByZXN0YXJ0ZWQuIFRoaXMgY2FuIG9jY3VyIGJlY2F1c2Ugb2YgYSByYWNlIGNvbmRpdGlvbgotICAgICAgICAgICAgICAgIC8vIGNhdXNlZCBieSBMZWdhY3kgY2FsbGJhY2tzIHJ1bm5pbmcgYWZ0ZXIgdGhlIHRyYWNrIGlzICJzdG9wcGVkIi4KLSAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJwcm9jZXNzQ2FsbGJhY2tDb21tb24oKSBkYXRhLCBmcmFtZUNvdW50IGlzIHplcm8iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjYWxsZXIgc3BlY2lmaWVkIGFuIGV4YWN0IHNpemUgdGhlbiB1c2UgYSBibG9jayBzaXplIGFkYXB0ZXIuCi0gICAgICAgICAgICAgICAgaWYgKG1CbG9ja0FkYXB0ZXIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJ5dGVDb3VudCA9IGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ICogZ2V0Qnl0ZXNQZXJEZXZpY2VGcmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IG1CbG9ja0FkYXB0ZXItPnByb2Nlc3NWYXJpYWJsZUJsb2NrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopIGF1ZGlvQnVmZmVyLT5yYXcsIGJ5dGVDb3VudCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbCB1c2luZyB0aGUgQUF1ZGlvIGNhbGxiYWNrIGludGVyZmFjZS4KLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKCh1aW50OF90ICopYXVkaW9CdWZmZXItPnJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCAqIGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiJXMoKSBjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBjYWxsYmFjayByZXR1cm5lZCBpbnZhbGlkIHJlc3VsdCA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjYWxsYmFja1Jlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICBzeXN0ZW1TdG9wSW50ZXJuYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSB0aGUgY2FsbGJhY2sganVzdCBpbiBjYXNlIHRoZSBzeXN0ZW0ga2VlcHMgdHJ5aW5nIHRvIGNhbGwgdXMuCi0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh1cGRhdGVTdGF0ZU1hY2hpbmUoKSAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yY2VEaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBjb2RlIGFzc3VtZXMgYW4gQXVkaW9UcmFjazo6QnVmZmVyIGlzIHRoZSBzYW1lIGFzCisgICAgLy8gQXVkaW9SZWNvcmQ6OkJ1ZmZlcgorICAgIC8vIFRPRE8gZGVmaW5lIG91ciBvd24gQXVkaW9CdWZmZXIgYW5kIHBhc3MgaXQgZnJvbSB0aGUgc3ViY2xhc3Nlcy4KKyAgICBzaXplX3Qgd3JpdHRlbiA9IGJ1ZmZlci5zaXplKCk7CisgICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgQUxPR1coIiVzKCkgZGF0YSwgc3RyZWFtIGRpc2Nvbm5lY3RlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgLy8gVGhpcyB3aWxsIGtpbGwgdGhlIHN0cmVhbSBhbmQgcHJldmVudCBpdCBmcm9tIGJlaW5nIHJlc3RhcnRlZC4KKyAgICAgICAgLy8gVGhhdCBpcyBPSyBiZWNhdXNlIHRoZSBzdHJlYW0gaXMgZGlzY29ubmVjdGVkLgorICAgICAgICB3cml0dGVuID0gU0laRV9TVE9QX0NBTExCQUNLUzsKKyAgICB9IGVsc2UgaWYgKCFtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSkgeworICAgICAgICBBTE9HVygiJXMoKSBubyBkYXRhIGJlY2F1c2UgY2FsbGJhY2sgZGlzYWJsZWQsIHNldCBzaXplPTAiLCBfX2Z1bmNfXyk7CisgICAgICAgIC8vIERvIE5PVCB1c2UgU0laRV9TVE9QX0NBTExCQUNLUyBoZXJlIGJlY2F1c2UgdGhhdCB3aWxsIGtpbGwgdGhlIHN0cmVhbSBhbmQKKyAgICAgICAgLy8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHJlc3RhcnRlZC4gVGhpcyBjYW4gb2NjdXIgYmVjYXVzZSBvZiBhIHJhY2UgY29uZGl0aW9uCisgICAgICAgIC8vIGNhdXNlZCBieSBMZWdhY3kgY2FsbGJhY2tzIHJ1bm5pbmcgYWZ0ZXIgdGhlIHRyYWNrIGlzICJzdG9wcGVkIi4KKyAgICAgICAgd3JpdHRlbiA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXRGcmFtZUNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coIiVzKCkgZGF0YSwgZnJhbWVDb3VudCBpcyB6ZXJvIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIHdyaXR0ZW47CiAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIC8vIFN0cmVhbSBnb3QgcmVyb3V0ZWQgc28gd2UgZGlzY29ubmVjdC4KLSAgICAgICAgY2FzZSBBQVVESU9fQ0FMTEJBQ0tfT1BFUkFUSU9OX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgIEFMT0dEKCJwcm9jZXNzQ2FsbGJhY2tDb21tb24oKSBzdHJlYW0gZGlzY29ubmVjdGVkIik7CisgICAgICAgIC8vIElmIHRoZSBjYWxsZXIgc3BlY2lmaWVkIGFuIGV4YWN0IHNpemUgdGhlbiB1c2UgYSBibG9jayBzaXplIGFkYXB0ZXIuCisgICAgICAgIGlmIChtQmxvY2tBZGFwdGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGludDMyX3QgYnl0ZUNvdW50ID0gYnVmZmVyLmdldEZyYW1lQ291bnQoKSAqIGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKTsKKyAgICAgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gbUJsb2NrQWRhcHRlci0+cHJvY2Vzc1ZhcmlhYmxlQmxvY2soCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5kYXRhKCksIGJ5dGVDb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBDYWxsIHVzaW5nIHRoZSBBQXVkaW8gY2FsbGJhY2sgaW50ZXJmYWNlLgorICAgICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKGJ1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmdldEZyYW1lQ291bnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUUpIHsKKyAgICAgICAgICAgIHdyaXR0ZW4gPSBidWZmZXIuZ2V0RnJhbWVDb3VudCgpICogZ2V0Qnl0ZXNQZXJEZXZpY2VGcmFtZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCIlcygpIGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgY2FsbGJhY2sgcmV0dXJuZWQgaW52YWxpZCByZXN1bHQgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxiYWNrUmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXR0ZW4gPSAwOworICAgICAgICAgICAgc3lzdGVtU3RvcEludGVybmFsKCk7CisgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjYWxsYmFjayBqdXN0IGluIGNhc2UgdGhlIHN5c3RlbSBrZWVwcyB0cnlpbmcgdG8gY2FsbCB1cy4KKyAgICAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVwZGF0ZVN0YXRlTWFjaGluZSgpICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgZm9yY2VEaXNjb25uZWN0KCk7CiAgICAgICAgICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gd3JpdHRlbjsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtTGVnYWN5OjpjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KGJvb2wgZXJyb3JDYWxsYmFja0VuYWJsZWQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCmluZGV4IDg4ZWYyNzAuLjUzZjZlMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaApAQCAtMTcsOCArMTcsMTAgQEAKICNpZm5kZWYgTEVHQUNZX0FVRElPX1NUUkVBTV9MRUdBQ1lfSAogI2RlZmluZSBMRUdBQ1lfQVVESU9fU1RSRUFNX0xFR0FDWV9ICiAKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVjb3JkLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KIApAQCAtMzAsOCArMzIsNiBAQAogbmFtZXNwYWNlIGFhdWRpbyB7CiAKIAotdHlwZWRlZiB2b2lkICgqYWF1ZGlvX2xlZ2FjeV9jYWxsYmFja190KShpbnQgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQgKmluZm8pOwotCiBlbnVtIHsKICAgICAvKioKICAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZCBmaWxsIHRoZSBkYXRhIGJ1ZmZlciBvZiBhbiBvdXRwdXQgc3RyZWFtLApAQCAtNTYsMjEgKzU2LDE4IEBACiB0eXBlZGVmIGludDMyX3QgYWF1ZGlvX2NhbGxiYWNrX29wZXJhdGlvbl90OwogCiAKLWNsYXNzIEF1ZGlvU3RyZWFtTGVnYWN5IDogcHVibGljIEF1ZGlvU3RyZWFtLCBwdWJsaWMgRml4ZWRCbG9ja1Byb2Nlc3NvciB7CitjbGFzcyBBdWRpb1N0cmVhbUxlZ2FjeSA6IHB1YmxpYyBBdWRpb1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEZpeGVkQmxvY2tQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBhbmRyb2lkOjpBdWRpb1RyYWNrOjpJQXVkaW9UcmFja0NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYW5kcm9pZDo6QXVkaW9SZWNvcmQ6OklBdWRpb1JlY29yZENhbGxiYWNrIHsKIHB1YmxpYzoKICAgICBBdWRpb1N0cmVhbUxlZ2FjeSgpOwogCi0gICAgdmlydHVhbCB+QXVkaW9TdHJlYW1MZWdhY3koKTsKKyAgICB2aXJ0dWFsIH5BdWRpb1N0cmVhbUxlZ2FjeSgpID0gZGVmYXVsdDsKIAotICAgIGFhdWRpb19sZWdhY3lfY2FsbGJhY2tfdCBnZXRMZWdhY3lDYWxsYmFjaygpOwogCiAgICAgaW50MzJfdCBjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKHVpbnQ4X3QgKmJ1ZmZlciwgaW50MzJfdCBudW1GcmFtZXMpOwogCi0gICAgLy8gVGhpcyBpcyBwdWJsaWMgc28gaXQgY2FuIGJlIGNhbGxlZCBmcm9tIHRoZSBDIGNhbGxiYWNrIGZ1bmN0aW9uLgotICAgIC8vIFRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIEF1ZGlvVHJhY2svQXVkaW9SZWNvcmQgY2xpZW50LgotICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICppbmZvKSA9IDA7Ci0KLSAgICB2b2lkIHByb2Nlc3NDYWxsYmFja0NvbW1vbihhYXVkaW9fY2FsbGJhY2tfb3BlcmF0aW9uX3Qgb3Bjb2RlLCB2b2lkICppbmZvKTsKIAogICAgIC8vIEltcGxlbWVudCBGaXhlZEJsb2NrUHJvY2Vzc29yCiAgICAgaW50MzJfdCBvblByb2Nlc3NGaXhlZEJsb2NrKHVpbnQ4X3QgKmJ1ZmZlciwgaW50MzJfdCBudW1CeXRlcykgb3ZlcnJpZGU7CkBAIC04Niw3ICs4MywxMiBAQAogICAgIH0KIAogcHJvdGVjdGVkOgotCisgICAgc2l6ZV90IG9uTW9yZURhdGEoY29uc3QgYW5kcm9pZDo6QXVkaW9UcmFjazo6QnVmZmVyJiBidWZmZXIpIG92ZXJyaWRlOworICAgIC8vIFRPRE8gKGIvMjE2MTc1ODMwKSB0aGlzIG1ldGhvZCBpcyBkdXBsaWNhdGVkIGluIG9yZGVyIHRvIGVhc2UgcmVmYWN0b3Jpbmcgd2hpY2ggd2lsbAorICAgIC8vIHJlY29uc29saWRhdGUuCisgICAgc2l6ZV90IG9uTW9yZURhdGEoY29uc3QgYW5kcm9pZDo6QXVkaW9SZWNvcmQ6OkJ1ZmZlciYgYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uTmV3SUF1ZGlvVHJhY2soKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uTmV3SUF1ZGlvUmVjb3JkKCkgb3ZlcnJpZGUgeyBvbk5ld0lBdWRpb1RyYWNrKCk7IH0KICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0QmVzdFRpbWVzdGFtcChjbG9ja2lkX3QgY2xvY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpmcmFtZVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcAppbmRleCBkYzY2NzQyLi4xZTM5ZTBmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCkBAIC02NSwxMSArNjUsOCBAQAogICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOwogCiAgICAgLy8gVE9ETyBTdXBwb3J0IFVOU1BFQ0lGSUVEIGluIEF1ZGlvUmVjb3JkLiBGb3Igbm93LCB1c2Ugc3RlcmVvIGlmIHVuc3BlY2lmaWVkLgotICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gKGdldFNhbXBsZXNQZXJGcmFtZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMiA6IGdldFNhbXBsZXNQZXJGcmFtZSgpOwotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gc2FtcGxlc1BlckZyYW1lIDw9IDIgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KHNhbXBsZXNQZXJGcmFtZSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19mb3JfaW5kZXhfYXNzaWdubWVudF9mcm9tX2NvdW50KHNhbXBsZXNQZXJGcmFtZSk7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgQUF1ZGlvX2dldENoYW5uZWxNYXNrRm9yT3BlbihnZXRDaGFubmVsTWFzaygpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgdHJ1ZSAvKmlzSW5wdXQqLyk7CiAKICAgICBzaXplX3QgZnJhbWVDb3VudCA9IChidWlsZGVyLmdldEJ1ZmZlckNhcGFjaXR5KCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSA/IDAKICAgICAgICAgICAgICAgICAgICAgICAgIDogYnVpbGRlci5nZXRCdWZmZXJDYXBhY2l0eSgpOwpAQCAtOTksNDEgKzk2LDE4IEBACiAgICAgICAgIHNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKICAgICB9CiAKLSAgICAvLyBNYXliZSBjaGFuZ2UgZGV2aWNlIGZvcm1hdCB0byBnZXQgYSBGQVNUIHBhdGguCi0gICAgLy8gQXVkaW9SZWNvcmQgZG9lcyBub3Qgc3VwcG9ydCBGQVNUIG1vZGUgZm9yIEZMT0FUIGRhdGEuCi0gICAgLy8gVE9ETyBBdWRpb1JlY29yZCBzaG91bGQgYWxsb3cgRkxPQVQgZGF0YSBwYXRocyBmb3IgRkFTVCB0cmFja3MuCi0gICAgLy8gU28gSUYgdGhlIHVzZXIgYXNrcyBmb3IgbG93IGxhdGVuY3kgRkxPQVQKLSAgICAvLyBBTkQgdGhlIHNhbXBsZVJhdGUgaXMgbGlrZWx5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBGQVNUCi0gICAgLy8gVEhFTiByZXF1ZXN0IEkxNiBhbmQgY29udmVydCB0byBGTE9BVCB3aGVuIHBhc3NpbmcgdG8gdXNlci4KLSAgICAvLyBOb3RlIHRoYXQgaGFyZCBjb2RpbmcgNDgwMDAgSHogaXMgbm90IGlkZWFsIGJlY2F1c2UgdGhlIHNhbXBsZVJhdGUKLSAgICAvLyBmb3IgYSBGQVNUIHBhdGggbWlnaHQgbm90IGJlIDQ4MDAwIEh6LgotICAgIC8vIEl0IG5vcm1hbGx5IGlzIGJ1dCB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IGl0IGlzIG5vdC4KLSAgICAvLyBBbmQgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGtub3cgdGhhdCBpbiBhZHZhbmNlLgotICAgIC8vIEx1Y2tpbHkgdGhlIGNvbnNlcXVlbmNlcyBvZiBhIHdyb25nIGd1ZXNzIGFyZSBtaW5vci4KLSAgICAvLyBXZSBqdXN0IG1heSBub3QgZ2V0IGEgRkFTVCB0cmFjay4KLSAgICAvLyBCdXQgd2Ugd291bGRuJ3QgaGF2ZSBhbnl3YXkgd2l0aG91dCB0aGlzIGhhY2suCi0gICAgY29uc3RleHByIGludDMyX3Qga01vc3RMaWtlbHlTYW1wbGVSYXRlRm9yRmFzdCA9IDQ4MDAwOwotICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUCi0gICAgICAgICAgICAmJiBwZXJmTW9kZSA9PSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWQotICAgICAgICAgICAgJiYgKHNhbXBsZXNQZXJGcmFtZSA8PSAyKSAvLyBGQVNUIG9ubHkgZm9yIG1vbm8gYW5kIHN0ZXJlbwotICAgICAgICAgICAgJiYgKGdldFNhbXBsZVJhdGUoKSA9PSBrTW9zdExpa2VseVNhbXBsZVJhdGVGb3JGYXN0Ci0gICAgICAgICAgICAgICAgfHwgZ2V0U2FtcGxlUmF0ZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkpIHsKLSAgICAgICAgc2V0RGV2aWNlRm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXREZXZpY2VGb3JtYXQoZ2V0Rm9ybWF0KCkpOwotICAgIH0KKworICAgIHNldERldmljZUZvcm1hdChnZXRGb3JtYXQoKSk7CiAKICAgICAvLyBUbyBhdm9pZCBnbGl0Y2hpbmcsIGxldCBBdWRpb0ZsaW5nZXIgcGljayB0aGUgb3B0aW1hbCBidXJzdCBzaXplLgogICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDA7CiAKICAgICAvLyBTZXR1cCB0aGUgY2FsbGJhY2sgaWYgdGhlcmUgaXMgb25lLgotICAgIEF1ZGlvUmVjb3JkOjpjYWxsYmFja190IGNhbGxiYWNrID0gbnVsbHB0cjsKLSAgICB2b2lkICpjYWxsYmFja0RhdGEgPSBudWxscHRyOworICAgIHNwPEF1ZGlvUmVjb3JkOjpJQXVkaW9SZWNvcmRDYWxsYmFjaz4gY2FsbGJhY2s7CiAgICAgQXVkaW9SZWNvcmQ6OnRyYW5zZmVyX3R5cGUgc3RyZWFtVHJhbnNmZXJUeXBlID0gQXVkaW9SZWNvcmQ6OnRyYW5zZmVyX3R5cGU6OlRSQU5TRkVSX1NZTkM7CiAgICAgaWYgKGJ1aWxkZXIuZ2V0RGF0YUNhbGxiYWNrUHJvYygpICE9IG51bGxwdHIpIHsKICAgICAgICAgc3RyZWFtVHJhbnNmZXJUeXBlID0gQXVkaW9SZWNvcmQ6OnRyYW5zZmVyX3R5cGU6OlRSQU5TRkVSX0NBTExCQUNLOwotICAgICAgICBjYWxsYmFjayA9IGdldExlZ2FjeUNhbGxiYWNrKCk7Ci0gICAgICAgIGNhbGxiYWNrRGF0YSA9IHRoaXM7CisgICAgICAgIGNhbGxiYWNrID0gc3A8QXVkaW9SZWNvcmQ6OklBdWRpb1JlY29yZENhbGxiYWNrPjo6ZnJvbUV4aXN0aW5nKHRoaXMpOwogICAgIH0KICAgICBtQ2FsbGJhY2tCdWZmZXJTaXplID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKIApAQCAtMTgwLDcgKzE1NCw2IEBACiAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICBjYWxsYmFja0RhdGEsCiAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywKICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCkBAIC0yMjgsNyArMjAxLDkgQEAKICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VOQ09ESU5HQ0xJRU5ULCB0b1N0cmluZyhyZXF1ZXN0ZWRGb3JtYXQpLmNfc3RyKCkpLnJlY29yZCgpOwogCiAgICAgLy8gR2V0IHRoZSBhY3R1YWwgdmFsdWVzIGZyb20gdGhlIEF1ZGlvUmVjb3JkLgotICAgIHNldFNhbXBsZXNQZXJGcmFtZShtQXVkaW9SZWNvcmQtPmNoYW5uZWxDb3VudCgpKTsKKyAgICBzZXRDaGFubmVsTWFzayhBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0NoYW5uZWxNYXNrKAorICAgICAgICAgICAgbUF1ZGlvUmVjb3JkLT5jaGFubmVsTWFzaygpLCB0cnVlIC8qaXNJbnB1dCovLAorICAgICAgICAgICAgQUF1ZGlvX2lzQ2hhbm5lbEluZGV4TWFzayhnZXRDaGFubmVsTWFzaygpKSkpOwogICAgIHNldFNhbXBsZVJhdGUobUF1ZGlvUmVjb3JkLT5nZXRTYW1wbGVSYXRlKCkpOwogICAgIHNldEJ1ZmZlckNhcGFjaXR5KGdldEJ1ZmZlckNhcGFjaXR5RnJvbURldmljZSgpKTsKICAgICBzZXRGcmFtZXNQZXJCdXJzdChnZXRGcmFtZXNQZXJCdXJzdEZyb21EZXZpY2UoKSk7CkBAIC0zNTEsMjMgKzMyNiw2IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvU3RyZWFtUmVjb3JkOjpwcm9jZXNzQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICppbmZvKSB7Ci0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIEF1ZGlvUmVjb3JkOjpFVkVOVF9NT1JFX0RBVEE6Ci0gICAgICAgICAgICBwcm9jZXNzQ2FsbGJhY2tDb21tb24oQUFVRElPX0NBTExCQUNLX09QRVJBVElPTl9QUk9DRVNTX0RBVEEsIGluZm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIFN0cmVhbSBnb3QgcmVyb3V0ZWQgc28gd2UgZGlzY29ubmVjdC4KLSAgICAgICAgY2FzZSBBdWRpb1JlY29yZDo6RVZFTlRfTkVXX0lBVURJT1JFQ09SRDoKLSAgICAgICAgICAgIHByb2Nlc3NDYWxsYmFja0NvbW1vbihBQVVESU9fQ0FMTEJBQ0tfT1BFUkFUSU9OX0RJU0NPTk5FQ1RFRCwgaW5mbyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtUmVjb3JkOjpyZXF1ZXN0U3RhcnRfbCgpCiB7CiAgICAgaWYgKG1BdWRpb1JlY29yZC5nZXQoKSA9PSBudWxscHRyKSB7CkBAIC01MDUsNyArNDYzLDcgQEAKICAgICByZXR1cm4gKGFhdWRpb19yZXN1bHRfdCkgZnJhbWVzUmVhZDsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtUmVjb3JkOjpzZXRCdWZmZXJTaXplKGludDMyX3QgcmVxdWVzdGVkRnJhbWVzKQorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtUmVjb3JkOjpzZXRCdWZmZXJTaXplKGludDMyX3QgLypyZXF1ZXN0ZWRGcmFtZXMqLykKIHsKICAgICByZXR1cm4gZ2V0QnVmZmVyU2l6ZSgpOwogfQpAQCAtNTUzLDcgKzUxMSw3IEBACiAgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEOgogICAgICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvUmVjb3JkLT5nZXRQb3NpdGlvbigmcG9zaXRpb24pOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuLnVwZGF0ZTMyKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbi51cGRhdGUzMigoaW50MzJfdClwb3NpdGlvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmgKaW5kZXggNjkyNjUxZC4uNWNlNzNmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oCkBAIC02NSw3ICs2NSw5IEBACiAgICAgfQogCiAgICAgLy8gVGhpcyBpcyBwdWJsaWMgc28gaXQgY2FuIGJlIGNhbGxlZCBmcm9tIHRoZSBDIGNhbGxiYWNrIGZ1bmN0aW9uLgotICAgIHZvaWQgcHJvY2Vzc0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbykgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICppbmZvKTsKKworICAgIHZvaWQgcHJvY2Vzc0NhbGxiYWNrUmVjb3JkKGFhdWRpb19jYWxsYmFja19vcGVyYXRpb25fdCBvcGNvZGUsIHZvaWQgKmluZm8pOwogCiAgICAgaW50NjRfdCBpbmNyZW1lbnRDbGllbnRGcmFtZUNvdW50ZXIoaW50MzJfdCBmcmFtZXMpIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIGluY3JlbWVudEZyYW1lc1JlYWQoZnJhbWVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKaW5kZXggMWQ0MTJjMC4uNmYxZGM5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKQEAgLTY2LDEzICs2Niw4IEBACiAgICAgY29uc3QgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBidWlsZGVyLmdldFNlc3Npb25JZCgpOwogICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOwogCi0gICAgLy8gVHJ5IHRvIGNyZWF0ZSBhbiBBdWRpb1RyYWNrCi0gICAgLy8gVXNlIHN0ZXJlbyBpZiB1bnNwZWNpZmllZC4KLSAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDIgOiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IHNhbXBsZXNQZXJGcmFtZSA8PSAyID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoc2FtcGxlc1BlckZyYW1lKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2Zvcl9pbmRleF9hc3NpZ25tZW50X2Zyb21fY291bnQoc2FtcGxlc1BlckZyYW1lKTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9CisgICAgICAgICAgICBBQXVkaW9fZ2V0Q2hhbm5lbE1hc2tGb3JPcGVuKGdldENoYW5uZWxNYXNrKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBmYWxzZSAvKmlzSW5wdXQqLyk7CiAKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlID0gZ2V0UGVyZm9ybWFuY2VNb2RlKCk7CkBAIC0xMDgsMTQgKzEwMywxMiBAQAogICAgICAgICAgICAgOiBnZXRGb3JtYXQoKTsKIAogICAgIC8vIFNldHVwIHRoZSBjYWxsYmFjayBpZiB0aGVyZSBpcyBvbmUuCi0gICAgQXVkaW9UcmFjazo6Y2FsbGJhY2tfdCBjYWxsYmFjayA9IG51bGxwdHI7Ci0gICAgdm9pZCAqY2FsbGJhY2tEYXRhID0gbnVsbHB0cjsKKyAgICB3cDxBdWRpb1RyYWNrOjpJQXVkaW9UcmFja0NhbGxiYWNrPiBjYWxsYmFjazsKICAgICAvLyBOb3RlIHRoYXQgVFJBTlNGRVJfU1lOQyBkb2VzIG5vdCBhbGxvdyBGQVNUIHRyYWNrCiAgICAgQXVkaW9UcmFjazo6dHJhbnNmZXJfdHlwZSBzdHJlYW1UcmFuc2ZlclR5cGUgPSBBdWRpb1RyYWNrOjp0cmFuc2Zlcl90eXBlOjpUUkFOU0ZFUl9TWU5DOwogICAgIGlmIChidWlsZGVyLmdldERhdGFDYWxsYmFja1Byb2MoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIHN0cmVhbVRyYW5zZmVyVHlwZSA9IEF1ZGlvVHJhY2s6OnRyYW5zZmVyX3R5cGU6OlRSQU5TRkVSX0NBTExCQUNLOwotICAgICAgICBjYWxsYmFjayA9IGdldExlZ2FjeUNhbGxiYWNrKCk7Ci0gICAgICAgIGNhbGxiYWNrRGF0YSA9IHRoaXM7CisgICAgICAgIGNhbGxiYWNrID0gd3A8QXVkaW9UcmFjazo6SUF1ZGlvVHJhY2tDYWxsYmFjaz46OmZyb21FeGlzdGluZyh0aGlzKTsKIAogICAgICAgICAvLyBJZiB0aGUgdG90YWwgYnVmZmVyIHNpemUgaXMgdW5zcGVjaWZpZWQgdGhlbiBiYXNlIHRoZSBzaXplIG9uIHRoZSBidXJzdCBzaXplLgogICAgICAgICBpZiAoZnJhbWVDb3VudCA9PSAwCkBAIC0xNDAsNyArMTMzLDkgQEAKICAgICBjb25zdCBhdWRpb191c2FnZV90IHVzYWdlID0KICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfdXNhZ2VUb0ludGVybmFsKGJ1aWxkZXIuZ2V0VXNhZ2UoKSk7CiAgICAgY29uc3QgYXVkaW9fZmxhZ3NfbWFza190IGF0dHJpYnV0ZXNGbGFncyA9Ci0gICAgICAgIEFBdWRpb0NvbnZlcnRfYWxsb3dDYXB0dXJlUG9saWN5VG9BdWRpb0ZsYWdzTWFzayhidWlsZGVyLmdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCkpOworICAgICAgICBBQXVkaW9Db252ZXJ0X2FsbG93Q2FwdHVyZVBvbGljeVRvQXVkaW9GbGFnc01hc2soYnVpbGRlci5nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5nZXRTcGF0aWFsaXphdGlvbkJlaGF2aW9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmlzQ29udGVudFNwYXRpYWxpemVkKCkpOwogCiAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7CiAgICAgICAgICAgICAuY29udGVudF90eXBlID0gY29udGVudFR5cGUsCkBAIC0xNjAsMTMgKzE1NSwxMiBAQAogICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgY2FsbGJhY2ssCi0gICAgICAgICAgICBjYWxsYmFja0RhdGEsCiAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAwLCAgICAgICAvLyBERUZBVUxUIHNoYXJlZEJ1ZmZlciovLAorICAgICAgICAgICAgbnVsbHB0ciwgICAgICAgLy8gREVGQVVMVCBzaGFyZWRCdWZmZXIqLywKICAgICAgICAgICAgIGZhbHNlLCAgIC8vIERFRkFVTFQgdGhyZWFkQ2FuQ2FsbEphdmEKICAgICAgICAgICAgIHNlc3Npb25JZCwKICAgICAgICAgICAgIHN0cmVhbVRyYW5zZmVyVHlwZSwKLSAgICAgICAgICAgIE5VTEwsICAgIC8vIERFRkFVTFQgYXVkaW9fb2ZmbG9hZF9pbmZvX3QKKyAgICAgICAgICAgIG51bGxwdHIsICAgIC8vIERFRkFVTFQgYXVkaW9fb2ZmbG9hZF9pbmZvX3QKICAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUoKSwgLy8gREVGQVVMVCB1aWQgYW5kIHBpZAogICAgICAgICAgICAgJmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAvLyBXQVJOSU5HIC0gSWYgZG9Ob3RSZWNvbm5lY3Qgc2V0IHRydWUgdGhlbiBhdWRpbyBzdG9wcyBhZnRlciBwbHVnZ2luZyBhbmQgdW5wbHVnZ2luZwpAQCAtMTk5LDcgKzE5Myw5IEBACiAgICAgZG9TZXRWb2x1bWUoKTsKIAogICAgIC8vIEdldCB0aGUgYWN0dWFsIHZhbHVlcyBmcm9tIHRoZSBBdWRpb1RyYWNrLgotICAgIHNldFNhbXBsZXNQZXJGcmFtZShtQXVkaW9UcmFjay0+Y2hhbm5lbENvdW50KCkpOworICAgIHNldENoYW5uZWxNYXNrKEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvQ2hhbm5lbE1hc2soCisgICAgICAgIG1BdWRpb1RyYWNrLT5jaGFubmVsTWFzaygpLCBmYWxzZSAvKmlzSW5wdXQqLywKKyAgICAgICAgQUF1ZGlvX2lzQ2hhbm5lbEluZGV4TWFzayhnZXRDaGFubmVsTWFzaygpKSkpOwogICAgIHNldEZvcm1hdChtQXVkaW9UcmFjay0+Zm9ybWF0KCkpOwogICAgIHNldERldmljZUZvcm1hdChtQXVkaW9UcmFjay0+Zm9ybWF0KCkpOwogICAgIHNldFNhbXBsZVJhdGUobUF1ZGlvVHJhY2stPmdldFNhbXBsZVJhdGUoKSk7CkBAIC0yMTgsNyArMjE0LDYgQEAKICAgICAgICAgbUJsb2NrQWRhcHRlciA9IG51bGxwdHI7CiAgICAgfQogCi0gICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOKTsKICAgICBzZXREZXZpY2VJZChtQXVkaW9UcmFjay0+Z2V0Um91dGVkRGV2aWNlSWQoKSk7CiAKICAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IGFjdHVhbFNlc3Npb25JZCA9CkBAIC0yNTEsNiArMjQ2LDE5IEBACiAgICAgICAgICAgICAgIm9wZW4oKSBwZXJmTW9kZSBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLAogICAgICAgICAgICAgIHBlcmZNb2RlLCBhY3R1YWxQZXJmb3JtYW5jZU1vZGUpOwogCisgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIEFMT0dFKCIlcyAtIE9wZW4gY2FuY2VsZWQgc2luY2Ugc3RhdGUgPSAlZCIsIF9fZnVuY19fLCBnZXRTdGF0ZSgpKTsKKyAgICAgICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyAtIE9wZW5pbmcgd2hpbGUgc3RhdGUgaXMgZGlzY29ubmVjdGVkIiwgX19mdW5jX18pOworICAgICAgICAgICAgc2FmZVJlbGVhc2VDbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQ7CisgICAgICAgIH0KKyAgICAgICAgc2FmZVJlbGVhc2VDbG9zZSgpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorCisgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOKTsKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCkBAIC0yODIsMzEgKzI5MCwxOSBAQAogICAgIEF1ZGlvU3RyZWFtOjpjbG9zZV9sKCk7CiB9CiAKLXZvaWQgQXVkaW9TdHJlYW1UcmFjazo6cHJvY2Vzc0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbykgewogCi0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX01PUkVfREFUQToKLSAgICAgICAgICAgIHByb2Nlc3NDYWxsYmFja0NvbW1vbihBQVVESU9fQ0FMTEJBQ0tfT1BFUkFUSU9OX1BST0NFU1NfREFUQSwgaW5mbyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLy8gU3RyZWFtIGdvdCByZXJvdXRlZCBzbyB3ZSBkaXNjb25uZWN0LgotICAgICAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX05FV19JQVVESU9UUkFDSzoKLSAgICAgICAgICAgIC8vIHJlcXVlc3Qgc3RyZWFtIGRpc2Nvbm5lY3QgaWYgdGhlIHJlc3RvcmVkIEF1ZGlvVHJhY2sgaGFzIHByb3BlcnRpZXMgbm90IG1hdGNoaW5nCi0gICAgICAgICAgICAvLyB3aGF0IHdhcyByZXF1ZXN0ZWQgaW5pdGlhbGx5Ci0gICAgICAgICAgICBpZiAobUF1ZGlvVHJhY2stPmNoYW5uZWxDb3VudCgpICE9IGdldFNhbXBsZXNQZXJGcmFtZSgpCi0gICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1RyYWNrLT5mb3JtYXQoKSAhPSBnZXRGb3JtYXQoKQotICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9UcmFjay0+Z2V0U2FtcGxlUmF0ZSgpICE9IGdldFNhbXBsZVJhdGUoKQotICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9UcmFjay0+Z2V0Um91dGVkRGV2aWNlSWQoKSAhPSBnZXREZXZpY2VJZCgpCi0gICAgICAgICAgICAgICAgICAgIHx8IGdldEJ1ZmZlckNhcGFjaXR5RnJvbURldmljZSgpICE9IGdldEJ1ZmZlckNhcGFjaXR5KCkKLSAgICAgICAgICAgICAgICAgICAgfHwgZ2V0RnJhbWVzUGVyQnVyc3RGcm9tRGV2aWNlKCkgIT0gZ2V0RnJhbWVzUGVyQnVyc3QoKSkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NDYWxsYmFja0NvbW1vbihBQVVESU9fQ0FMTEJBQ0tfT1BFUkFUSU9OX0RJU0NPTk5FQ1RFRCwgaW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Cit2b2lkIEF1ZGlvU3RyZWFtVHJhY2s6Om9uTmV3SUF1ZGlvVHJhY2soKSB7CisgICAgLy8gU3RyZWFtIGdvdCByZXJvdXRlZCBzbyB3ZSBkaXNjb25uZWN0LgorICAgIC8vIHJlcXVlc3Qgc3RyZWFtIGRpc2Nvbm5lY3QgaWYgdGhlIHJlc3RvcmVkIEF1ZGlvVHJhY2sgaGFzIHByb3BlcnRpZXMgbm90IG1hdGNoaW5nCisgICAgLy8gd2hhdCB3YXMgcmVxdWVzdGVkIGluaXRpYWxseQorICAgIGlmIChtQXVkaW9UcmFjay0+Y2hhbm5lbENvdW50KCkgIT0gZ2V0U2FtcGxlc1BlckZyYW1lKCkKKyAgICAgICAgICB8fCBtQXVkaW9UcmFjay0+Zm9ybWF0KCkgIT0gZ2V0Rm9ybWF0KCkKKyAgICAgICAgICB8fCBtQXVkaW9UcmFjay0+Z2V0U2FtcGxlUmF0ZSgpICE9IGdldFNhbXBsZVJhdGUoKQorICAgICAgICAgIHx8IG1BdWRpb1RyYWNrLT5nZXRSb3V0ZWREZXZpY2VJZCgpICE9IGdldERldmljZUlkKCkKKyAgICAgICAgICB8fCBnZXRCdWZmZXJDYXBhY2l0eUZyb21EZXZpY2UoKSAhPSBnZXRCdWZmZXJDYXBhY2l0eSgpCisgICAgICAgICAgfHwgZ2V0RnJhbWVzUGVyQnVyc3RGcm9tRGV2aWNlKCkgIT0gZ2V0RnJhbWVzUGVyQnVyc3QoKSkgeworICAgICAgICBBdWRpb1N0cmVhbUxlZ2FjeTo6b25OZXdJQXVkaW9UcmFjaygpOwogICAgIH0KLSAgICByZXR1cm47CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0U3RhcnRfbCgpIHsKQEAgLTUxMiw3ICs1MDgsNyBAQAogICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQ6CiAgICAgICAgIHJlc3VsdCA9IG1BdWRpb1RyYWNrLT5nZXRQb3NpdGlvbigmcG9zaXRpb24pOwogICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICAgICBtRnJhbWVzUmVhZC51cGRhdGUzMihwb3NpdGlvbik7CisgICAgICAgICAgICBtRnJhbWVzUmVhZC51cGRhdGUzMigoaW50MzJfdClwb3NpdGlvbik7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suaAppbmRleCBmNjA0ODcxLi4wZjRkNzJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oCkBAIC04MSw5ICs4MSw2IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3QgdXBkYXRlU3RhdGVNYWNoaW5lKCkgb3ZlcnJpZGU7CiAKLSAgICAvLyBUaGlzIGlzIHB1YmxpYyBzbyBpdCBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIEMgY2FsbGJhY2sgZnVuY3Rpb24uCi0gICAgdm9pZCBwcm9jZXNzQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICppbmZvKSBvdmVycmlkZTsKLQogICAgIGludDY0X3QgaW5jcmVtZW50Q2xpZW50RnJhbWVDb3VudGVyKGludDMyX3QgZnJhbWVzKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBpbmNyZW1lbnRGcmFtZXNXcml0dGVuKGZyYW1lcyk7CiAgICAgfQpAQCAtMTAwLDYgKzk3LDcgQEAKIAogICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQnVyc3RGcm9tRGV2aWNlKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgaW50MzJfdCBnZXRCdWZmZXJDYXBhY2l0eUZyb21EZXZpY2UoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIG9uTmV3SUF1ZGlvVHJhY2soKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9saWJhYXVkaW8ubWFwLnR4dCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGliYWF1ZGlvLm1hcC50eHQKaW5kZXggMWRkNDRkMS4uZjQ1YjgxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9saWJhYXVkaW8ubWFwLnR4dAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xpYmFhdWRpby5tYXAudHh0CkBAIC0yNSw2ICsyNSw5IEBACiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQcml2YWN5U2Vuc2l0aXZlOyAgICMgaW50cm9kdWNlZD0zMAogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGFja2FnZU5hbWU7ICAgIyBpbnRyb2R1Y2VkPTMxCiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRBdHRyaWJ1dGlvblRhZzsgICAjIGludHJvZHVjZWQ9MzEKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxNYXNrOyAgICAjIGludHJvZHVjZWQ9MzIKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNwYXRpYWxpemF0aW9uQmVoYXZpb3I7ICMgaW50cm9kdWNlZD0zMgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0SXNDb250ZW50U3BhdGlhbGl6ZWQ7ICAgIyBpbnRyb2R1Y2VkPTMyCiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtOwogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlOwogICAgIEFBdWRpb1N0cmVhbV9jbG9zZTsKQEAgLTYxLDYgKzY0LDkgQEAKICAgICBBQXVkaW9TdHJlYW1faXNNTWFwVXNlZDsKICAgICBBQXVkaW9TdHJlYW1faXNQcml2YWN5U2Vuc2l0aXZlOyAgICMgaW50cm9kdWNlZD0zMAogICAgIEFBdWRpb1N0cmVhbV9yZWxlYXNlOyAgICAgICAgIyBpbnRyb2R1Y2VkPTMwCisgICAgQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxNYXNrOyAgIyBpbnRyb2R1Y2VkPTMyCisgICAgQUF1ZGlvU3RyZWFtX2dldFNwYXRpYWxpemF0aW9uQmVoYXZpb3I7ICAjIGludHJvZHVjZWQ9MzIKKyAgICBBQXVkaW9TdHJlYW1faXNDb250ZW50U3BhdGlhbGl6ZWQ7ICAgICAgICMgaW50cm9kdWNlZD0zMgogICBsb2NhbDoKICAgICAqOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKaW5kZXggZDc5NTcyNS4uODcyZmFjYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKQEAgLTIzNSwyMCArMjM1LDQ2IEBACiB9CiAKIGF1ZGlvX2ZsYWdzX21hc2tfdCBBQXVkaW9Db252ZXJ0X2FsbG93Q2FwdHVyZVBvbGljeVRvQXVkaW9GbGFnc01hc2soCi0gICAgICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgcG9saWN5KSB7CisgICAgICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgcG9saWN5LAorICAgICAgICBhYXVkaW9fc3BhdGlhbGl6YXRpb25fYmVoYXZpb3JfdCBzcGF0aWFsaXphdGlvbkJlaGF2aW9yLAorICAgICAgICBib29sIGlzQ29udGVudFNwYXRpYWxpemVkKSB7CisgICAgYXVkaW9fZmxhZ3NfbWFza190IGZsYWdzTWFzayA9IEFVRElPX0ZMQUdfTk9ORTsKICAgICBzd2l0Y2ggKHBvbGljeSkgewogICAgICAgICBjYXNlIEFBVURJT19VTlNQRUNJRklFRDoKICAgICAgICAgY2FzZSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEw6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19OT05FOworICAgICAgICAgICAgLy8gZmxhZ3NNYXNrIGlzIG5vdCBtb2RpZmllZAorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfU1lTVEVNOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTjsKKyAgICAgICAgICAgIGZsYWdzTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oZmxhZ3NNYXNrIHwgQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFBVURJT19BTExPV19DQVBUVVJFX0JZX05PTkU6Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PigKKyAgICAgICAgICAgIGZsYWdzTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oZmxhZ3NNYXNrIHwKICAgICAgICAgICAgICAgICAgICAgQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OIHwgQVVESU9fRkxBR19OT19TWVNURU1fQ0FQVFVSRSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCIlcygpIDB4JTA4WCB1bnJlY29nbml6ZWQiLCBfX2Z1bmNfXywgcG9saWN5KTsKLSAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX05PTkU7IC8vCisgICAgICAgICAgICBBTE9HRSgiJXMoKSAweCUwOFggdW5yZWNvZ25pemVkIGNhcHR1cmUgcG9saWN5IiwgX19mdW5jX18sIHBvbGljeSk7CisgICAgICAgICAgICAvLyBmbGFnc01hc2sgaXMgbm90IG1vZGlmaWVkCiAgICAgfQorCisgICAgc3dpdGNoIChzcGF0aWFsaXphdGlvbkJlaGF2aW9yKSB7CisgICAgICAgIGNhc2UgQUFVRElPX1VOU1BFQ0lGSUVEOgorICAgICAgICBjYXNlIEFBVURJT19TUEFUSUFMSVpBVElPTl9CRUhBVklPUl9BVVRPOgorICAgICAgICAgICAgLy8gZmxhZ3NNYXNrIGlzIG5vdCBtb2RpZmllZAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX1NQQVRJQUxJWkFUSU9OX0JFSEFWSU9SX05FVkVSOgorICAgICAgICAgICAgZmxhZ3NNYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PihmbGFnc01hc2sgfCBBVURJT19GTEFHX05FVkVSX1NQQVRJQUxJWkUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXMoKSAweCUwOFggdW5yZWNvZ25pemVkIHNwYXRpYWxpemF0aW9uIGJlaGF2aW9yIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzcGF0aWFsaXphdGlvbkJlaGF2aW9yKTsKKyAgICAgICAgICAgIC8vIGZsYWdzTWFzayBpcyBub3QgbW9kaWZpZWQKKyAgICB9CisKKyAgICBpZiAoaXNDb250ZW50U3BhdGlhbGl6ZWQpIHsKKyAgICAgICAgZmxhZ3NNYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PihmbGFnc01hc2sgfCBBVURJT19GTEFHX0NPTlRFTlRfU1BBVElBTElaRUQpOworICAgIH0KKworICAgIHJldHVybiBmbGFnc01hc2s7CiB9CiAKIGF1ZGlvX2ZsYWdzX21hc2tfdCBBQXVkaW9Db252ZXJ0X3ByaXZhY3lTZW5zaXRpdmVUb0F1ZGlvRmxhZ3NNYXNrKApAQCAtMjU2LDYgKzI4MiwyNDggQEAKICAgICByZXR1cm4gcHJpdmFjeVNlbnNpdGl2ZSA/IEFVRElPX0ZMQUdfQ0FQVFVSRV9QUklWQVRFIDogQVVESU9fRkxBR19OT05FOwogfQogCithdWRpb19jaGFubmVsX21hc2tfdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZENoYW5uZWxMYXlvdXRNYXNrKAorICAgICAgICBhYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGJvb2wgaXNJbnB1dCkgeworICAgIGlmIChpc0lucHV0KSB7CisgICAgICAgIHN3aXRjaCAoY2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfTU9OTzoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9JTl9NT05POworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9TVEVSRU86CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9GUk9OVF9CQUNLOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0s7CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzJQT0lOVDBQT0lOVDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMFBPSU5UMjsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfMlBPSU5UMVBPSU5UMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9JTl8yUE9JTlQxUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF8zUE9JTlQwUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX0lOXzNQT0lOVDBQT0lOVDI7CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMXzNQT0lOVDFQT0lOVDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMVBPSU5UMjsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfNVBPSU5UMToKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9JTl81UE9JTlQxOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSAlI3ggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9JTlZBTElEOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChjaGFubmVsTWFzaykgeworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9NT05POgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF9NT05POworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF9TVEVSRU86CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfMlBPSU5UMToKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMTsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfVFJJOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF9UUkk7CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX1RSSV9CQUNLOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF9UUklfQkFDSzsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfM1BPSU5UMToKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMTsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfMlBPSU5UMFBPSU5UMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMjsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfMlBPSU5UMVBPSU5UMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMjsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfM1BPSU5UMFBPSU5UMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMjsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfM1BPSU5UMVBPSU5UMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMVBPSU5UMjsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfUVVBRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRDsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfUVVBRF9TSURFOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREU7CisgICAgICAgICAgICBjYXNlIEFBVURJT19DSEFOTkVMX1NVUlJPVU5EOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORDsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfUEVOVEE6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfT1VUX1BFTlRBOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF81UE9JTlQxOgorICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxOworICAgICAgICAgICAgY2FzZSBBQVVESU9fQ0hBTk5FTF81UE9JTlQxX1NJREU6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERTsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfNVBPSU5UMVBPSU5UMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UMjsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfNVBPSU5UMVBPSU5UNDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UNDsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfNlBPSU5UMToKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfNlBPSU5UMTsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfN1BPSU5UMToKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfN1BPSU5UMVBPSU5UMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UMjsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0NIQU5ORUxfN1BPSU5UMVBPSU5UNDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UNDsKKyAgICAgICAgICAgIC8vIFRPRE86IGFkZCA5cG9pbnQxcG9pbnQ0IGFuZCA5cG9pbnQxcG9pbnQ2IHdoZW4gdGhleSBhcmUgYWRkZWQgaW4gYXVkaW8taGFsLWVudW1zLmgKKyAgICAgICAgICAgIC8vIGNhc2UgQUFVRElPX0NIQU5ORUxfOVBPSU5UMVBPSU5UNDoKKyAgICAgICAgICAgIC8vICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfOVBPSU5UMVBPSU5UNDsKKyAgICAgICAgICAgIC8vIGNhc2UgQUFVRElPX0NIQU5ORUxfOVBPSU5UMVBPSU5UNjoKKyAgICAgICAgICAgIC8vICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfOVBPSU5UMVBPSU5UNjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgJSN4IHVucmVjb2duaXplZCIsIF9fZnVuY19fLCBjaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfSU5WQUxJRDsKKyAgICAgICAgfQorICAgIH0KK30KKworYWF1ZGlvX2NoYW5uZWxfbWFza190IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvQ2hhbm5lbExheW91dE1hc2soCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBib29sIGlzSW5wdXQpIHsKKyAgICBpZiAoaXNJbnB1dCkgeworICAgICAgICBzd2l0Y2ggKGNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfSU5fTU9OTzoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfTU9OTzsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU86CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMX1NURVJFTzsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF9GUk9OVF9CQUNLOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX0lOXzJQT0lOVDBQT0lOVDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzJQT0lOVDBQT0lOVDI7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMVBPSU5UMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfMlBPSU5UMVBPSU5UMjsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQwUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF8zUE9JTlQwUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX0lOXzNQT0lOVDFQT0lOVDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzNQT0lOVDFQT0lOVDI7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMToKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfNVBPSU5UMTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgJSN4IHVucmVjb2duaXplZCIsIF9fZnVuY19fLCBjaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMX0lOVkFMSUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKGNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX01PTk86CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMX01PTk87CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfU1RFUkVPOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF8yUE9JTlQxOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF9UUkk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMX1RSSTsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfVFJJX0JBQ0s6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMX1RSSV9CQUNLOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF8zUE9JTlQxOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF8yUE9JTlQwUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF8yUE9JTlQxUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF8zUE9JTlQwUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF8zUE9JTlQxUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF9RVUFEOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF9RVUFEOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREU6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMX1FVQURfU0lERTsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfU1VSUk9VTkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMX1NVUlJPVU5EOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF9QRU5UQToKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfUEVOVEE7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DSEFOTkVMXzVQT0lOVDE7CisgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERToKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfNVBPSU5UMV9TSURFOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF81UE9JTlQxUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQ0OgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF81UE9JTlQxUE9JTlQ0OworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF82UE9JTlQxOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF83UE9JTlQxOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxUE9JTlQyOgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF83UE9JTlQxUE9JTlQyOworICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxUE9JTlQ0OgorICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF83UE9JTlQxUE9JTlQ0OworICAgICAgICAgICAgLy8gVE9ETzogYWRkIDlwb2ludDFwb2ludDQgYW5kIDlwb2ludDFwb2ludDYgd2hlbiB0aGV5IGFyZSBhZGRlZCBpbiBhdWRpby1oYWwtZW51bXMuaAorICAgICAgICAgICAgLy8gY2FzZSBBVURJT19DSEFOTkVMX09VVF85UE9JTlQxUE9JTlQ0OgorICAgICAgICAgICAgLy8gICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF85UE9JTlQxUE9JTlQ0OworICAgICAgICAgICAgLy8gY2FzZSBBVURJT19DSEFOTkVMX09VVF85UE9JTlQxUE9JTlQ2OgorICAgICAgICAgICAgLy8gICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF85UE9JTlQxUE9JTlQ2OworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSAlI3ggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NIQU5ORUxfSU5WQUxJRDsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50MzJfdCBBQXVkaW9Db252ZXJ0X2NoYW5uZWxNYXNrVG9Db3VudChhYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIHsKKyAgICByZXR1cm4gX19idWlsdGluX3BvcGNvdW50KGNoYW5uZWxNYXNrICYgfkFBVURJT19DSEFOTkVMX0JJVF9JTkRFWCk7Cit9CisKK2FhdWRpb19jaGFubmVsX21hc2tfdCBBQXVkaW9Db252ZXJ0X2NoYW5uZWxDb3VudFRvTWFzayhpbnQzMl90IGNoYW5uZWxDb3VudCkgeworICAgIGlmIChjaGFubmVsQ291bnQgPCAwIHx8IGNoYW5uZWxDb3VudCA+IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYKSB7CisgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF9JTlZBTElEOworICAgIH0KKworICAgIGlmIChjaGFubmVsQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm4gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIH0KKworICAgIC8vIFJldHVybiBpbmRleCBtYXNrIGlmIHRoZSBjaGFubmVsIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiAyLgorICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoKDEgPDwgY2hhbm5lbENvdW50KSAtIDEpOworfQorCithYXVkaW9fY2hhbm5lbF9tYXNrX3QgQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9DaGFubmVsSW5kZXhNYXNrKAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgeworICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKGNoYW5uZWxNYXNrKSAhPSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYKSB7CisgICAgICAgIEFMT0dFKCIlcygpICUjeCBub3QgYW4gaW5kZXggbWFzayIsIF9fZnVuY19fLCBjaGFubmVsTWFzayk7CisgICAgICAgIHJldHVybiBBQVVESU9fQ0hBTk5FTF9JTlZBTElEOworICAgIH0KKyAgICByZXR1cm4gKGNoYW5uZWxNYXNrICYgfkFVRElPX0NIQU5ORUxfSU5ERVhfSERSKSB8IEFBVURJT19DSEFOTkVMX0JJVF9JTkRFWDsKK30KKworYXVkaW9fY2hhbm5lbF9tYXNrX3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRDaGFubmVsSW5kZXhNYXNrKAorICAgICAgICBhYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIHsKKyAgICBpZiAoIUFBdWRpb19pc0NoYW5uZWxJbmRleE1hc2soY2hhbm5lbE1hc2spKSB7CisgICAgICAgIEFMT0dFKCIlcygpICUjeCBub3QgYW4gaW5kZXggbWFzayIsIF9fZnVuY19fLCBjaGFubmVsTWFzayk7CisgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX0lOVkFMSUQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb19jaGFubmVsX21hc2tfZm9yX2luZGV4X2Fzc2lnbm1lbnRfZnJvbV9jb3VudCgKKyAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfY2hhbm5lbE1hc2tUb0NvdW50KGNoYW5uZWxNYXNrKSk7Cit9CisKK2FhdWRpb19jaGFubmVsX21hc2tfdCBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0NoYW5uZWxNYXNrKAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYm9vbCBpc0lucHV0LCBib29sIGluZGV4TWFza1JlcXVpcmVkKSB7CisgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oY2hhbm5lbE1hc2spID09IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVgpIHsKKyAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvQ2hhbm5lbEluZGV4TWFzayhjaGFubmVsTWFzayk7CisgICAgfQorICAgIGlmIChpbmRleE1hc2tSZXF1aXJlZCkgeworICAgICAgICAvLyBSZXF1aXJlIGluZGV4IG1hc2ssIGBjaGFubmVsTWFza2AgaGVyZSBpcyBhIHBvc2l0aW9uIG1hc2suCisgICAgICAgIGNvbnN0IGludCBjaGFubmVsQ291bnQgPSBpc0lucHV0ID8gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfY2hhbm5lbENvdW50VG9NYXNrKGNoYW5uZWxDb3VudCk7CisgICAgfQorICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0NoYW5uZWxMYXlvdXRNYXNrKGNoYW5uZWxNYXNrLCBpc0lucHV0KTsKK30KKworYXVkaW9fY2hhbm5lbF9tYXNrX3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRDaGFubmVsTWFzaygKKyAgICAgICAgYWF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBib29sIGlzSW5wdXQpIHsKKyAgICByZXR1cm4gQUF1ZGlvX2lzQ2hhbm5lbEluZGV4TWFzayhjaGFubmVsTWFzaykKKyAgICAgICAgICAgID8gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRDaGFubmVsSW5kZXhNYXNrKGNoYW5uZWxNYXNrKQorICAgICAgICAgICAgOiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZENoYW5uZWxMYXlvdXRNYXNrKGNoYW5uZWxNYXNrLCBpc0lucHV0KTsKK30KKworYm9vbCBBQXVkaW9faXNDaGFubmVsSW5kZXhNYXNrKGFhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgeworICAgIHJldHVybiAoY2hhbm5lbE1hc2sgJiBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVgpID09IEFBVURJT19DSEFOTkVMX0JJVF9JTkRFWDsKK30KKworYXVkaW9fY2hhbm5lbF9tYXNrX3QgQUF1ZGlvX2dldENoYW5uZWxNYXNrRm9yT3BlbigKKyAgICAgICAgYWF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwgYm9vbCBpc0lucHV0KSB7CisgICAgaWYgKGNoYW5uZWxNYXNrICE9IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBpZiAoQUF1ZGlvX2lzQ2hhbm5lbEluZGV4TWFzayhjaGFubmVsTWFzaykgJiYgc2FtcGxlc1BlckZyYW1lIDw9IDIpIHsKKyAgICAgICAgICAgIC8vIFdoZW4gaXQgaXMgaW5kZXggbWFzayBhbmQgdGhlIGNvdW50IGlzIGxlc3MgdGhhbiAzLCB1c2UgcG9zaXRpb24gbWFzaworICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBpbmRleCBtYXNrIGZvciBvcGVuaW5nIGEgc3RyZWFtLiBUaGlzIG1heSBuZWVkIHRvIGJlIHJldmlzaXRlZAorICAgICAgICAgICAgLy8gd2hlbiBtYWtpbmcgY2hhbm5lbCBpbmRleCBtYXNrIHB1YmxpYy4KKyAgICAgICAgICAgIHJldHVybiBpc0lucHV0ID8gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoc2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRDaGFubmVsTWFzayhjaGFubmVsTWFzaywgaXNJbnB1dCk7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHN0ZXJlbyB3aGVuIHVuc3BlY2lmaWVkLgorICAgIHJldHVybiBpc0lucHV0ID8gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8gOiBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Cit9CisKIGludDMyX3QgQUF1ZGlvQ29udmVydF9mcmFtZXNUb0J5dGVzKGludDMyX3QgbnVtRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlc1BlckZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqc2l6ZUluQnl0ZXMpIHsKQEAgLTI3Niw0NSArNTQ0LDYgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCi1zdGF0aWMgaW50MzJfdCBBQXVkaW9Qcm9wZXJ0eV9nZXRNTWFwUHJvcGVydHkoY29uc3QgY2hhciAqcHJvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWZhdWx0VmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNhbGxlcikgewotICAgIGludDMyX3QgcHJvcCA9IHByb3BlcnR5X2dldF9pbnQzMihwcm9wTmFtZSwgZGVmYXVsdFZhbHVlKTsKLSAgICBzd2l0Y2ggKHByb3ApIHsKLSAgICAgICAgY2FzZSBBQVVESU9fVU5TUEVDSUZJRUQ6Ci0gICAgICAgIGNhc2UgQUFVRElPX1BPTElDWV9ORVZFUjoKLSAgICAgICAgY2FzZSBBQVVESU9fUE9MSUNZX0FMV0FZUzoKLSAgICAgICAgY2FzZSBBQVVESU9fUE9MSUNZX0FVVE86Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCA9ICVkIiwgY2FsbGVyLCBwcm9wKTsKLSAgICAgICAgICAgIHByb3AgPSBkZWZhdWx0VmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3A7Ci19Ci0KLWludDMyX3QgQUF1ZGlvUHJvcGVydHlfZ2V0TU1hcFBvbGljeSgpIHsKLSAgICByZXR1cm4gQUF1ZGlvUHJvcGVydHlfZ2V0TU1hcFByb3BlcnR5KEFBVURJT19QUk9QX01NQVBfUE9MSUNZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1VOU1BFQ0lGSUVELCBfX2Z1bmNfXyk7Ci19Ci0KLWludDMyX3QgQUF1ZGlvUHJvcGVydHlfZ2V0TU1hcEV4Y2x1c2l2ZVBvbGljeSgpIHsKLSAgICByZXR1cm4gQUF1ZGlvUHJvcGVydHlfZ2V0TU1hcFByb3BlcnR5KEFBVURJT19QUk9QX01NQVBfRVhDTFVTSVZFX1BPTElDWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19VTlNQRUNJRklFRCwgX19mdW5jX18pOwotfQotCi1pbnQzMl90IEFBdWRpb1Byb3BlcnR5X2dldE1peGVyQnVyc3RzKCkgewotICAgIGNvbnN0IGludDMyX3QgZGVmYXVsdEJ1cnN0cyA9IDI7IC8vIGFyYml0cmFyeSwgdXNlIDIgZm9yIGRvdWJsZSBidWZmZXJlZAotICAgIGNvbnN0IGludDMyX3QgbWF4QnVyc3RzID0gMTAyNDsgLy8gYXJiaXRyYXJ5Ci0gICAgaW50MzJfdCBwcm9wID0gcHJvcGVydHlfZ2V0X2ludDMyKEFBVURJT19QUk9QX01JWEVSX0JVUlNUUywgZGVmYXVsdEJ1cnN0cyk7Ci0gICAgaWYgKHByb3AgPCAxIHx8IHByb3AgPiBtYXhCdXJzdHMpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1Byb3BlcnR5X2dldE1peGVyQnVyc3RzOiBpbnZhbGlkID0gJWQiLCBwcm9wKTsKLSAgICAgICAgcHJvcCA9IGRlZmF1bHRCdXJzdHM7Ci0gICAgfQotICAgIHJldHVybiBwcm9wOwotfQotCiBpbnQzMl90IEFBdWRpb1Byb3BlcnR5X2dldFdha2V1cERlbGF5TWljcm9zKCkgewogICAgIGNvbnN0IGludDMyX3QgbWluTWljcm9zID0gMDsgLy8gYXJiaXRyYXJ5CiAgICAgY29uc3QgaW50MzJfdCBkZWZhdWx0TWljcm9zID0gMjAwOyAvLyBhcmJpdHJhcnksIGJhc2VkIG9uIHNvbWUgb2JzZXJ2ZWQgaml0dGVyCkBAIC0zMzEsOSArNTYwLDEyIEBACiB9CiAKIGludDMyX3QgQUF1ZGlvUHJvcGVydHlfZ2V0TWluaW11bVNsZWVwTWljcm9zKCkgewotICAgIGNvbnN0IGludDMyX3QgbWluTWljcm9zID0gMjA7IC8vIGFyYml0cmFyeQotICAgIGNvbnN0IGludDMyX3QgZGVmYXVsdE1pY3JvcyA9IDIwMDsgLy8gYXJiaXRyYXJ5Ci0gICAgY29uc3QgaW50MzJfdCBtYXhNaWNyb3MgPSAyMDAwOyAvLyBhcmJpdHJhcnkKKyAgICBjb25zdCBpbnQzMl90IG1pbk1pY3JvcyA9IDE7IC8vIGFyYml0cmFyeQorICAgIC8vIEhpZ2hlciB2YWx1ZXMgY2FuIGluY3JlYXNlIGxhdGVuY3kgZm9yIG1vZGVyYXRlIHdvcmtsb2Fkcy4KKyAgICAvLyBTaG9ydCB2YWx1ZXMgY2FuIGNhdXNlIHRoZSBDUFUgdG8gc2hvcnQgY3ljbGUgaWYgdGhlcmUgaXMgYSBidWcgaW4KKyAgICAvLyBjYWxjdWxhdGluZyB0aGUgd2FrZXVwIHRpbWVzLgorICAgIGNvbnN0IGludDMyX3QgZGVmYXVsdE1pY3JvcyA9IDEwMDsgLy8gYXJiaXRyYXJ5CisgICAgY29uc3QgaW50MzJfdCBtYXhNaWNyb3MgPSAyMDA7IC8vIGFyYml0cmFyeQogICAgIGludDMyX3QgcHJvcCA9IHByb3BlcnR5X2dldF9pbnQzMihBQVVESU9fUFJPUF9NSU5JTVVNX1NMRUVQX1VTRUMsIGRlZmF1bHRNaWNyb3MpOwogICAgIGlmIChwcm9wIDwgbWluTWljcm9zKSB7CiAgICAgICAgIEFMT0dXKCJBQXVkaW9Qcm9wZXJ0eV9nZXRNaW5pbXVtU2xlZXBNaWNyb3M6IGNsaXBwZWQgJWQgdG8gJWQiLCBwcm9wLCBtaW5NaWNyb3MpOwpAQCAtMzQ1LDE4ICs1NzcsNiBAQAogICAgIHJldHVybiBwcm9wOwogfQogCi1pbnQzMl90IEFBdWRpb1Byb3BlcnR5X2dldEhhcmR3YXJlQnVyc3RNaW5NaWNyb3MoKSB7Ci0gICAgY29uc3QgaW50MzJfdCBkZWZhdWx0TWljcm9zID0gMTAwMDsgLy8gYXJiaXRyYXJ5Ci0gICAgY29uc3QgaW50MzJfdCBtYXhNaWNyb3MgPSAxMDAwICogMTAwMDsgLy8gYXJiaXRyYXJ5Ci0gICAgaW50MzJfdCBwcm9wID0gcHJvcGVydHlfZ2V0X2ludDMyKEFBVURJT19QUk9QX0hXX0JVUlNUX01JTl9VU0VDLCBkZWZhdWx0TWljcm9zKTsKLSAgICBpZiAocHJvcCA8IDEgfHwgcHJvcCA+IG1heE1pY3JvcykgewotICAgICAgICBBTE9HRSgiQUF1ZGlvUHJvcGVydHlfZ2V0SGFyZHdhcmVCdXJzdE1pbk1pY3JvczogaW52YWxpZCA9ICVkLCB1c2UgJWQiLAotICAgICAgICAgICAgICBwcm9wLCBkZWZhdWx0TWljcm9zKTsKLSAgICAgICAgcHJvcCA9IGRlZmF1bHRNaWNyb3M7Ci0gICAgfQotICAgIHJldHVybiBwcm9wOwotfQotCiBzdGF0aWMgaW50MzJfdCBBQXVkaW9Qcm9wZXJ0eV9nZXRNTWFwT2Zmc2V0TWljcm9zKGNvbnN0IGNoYXIgKmZ1bmN0aW9uTmFtZSwKICAgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lKSB7CiAgICAgY29uc3QgaW50MzJfdCBtaW5NaWNyb3MgPSAtMjAwMDA7IC8vIGFyYml0cmFyeQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCmluZGV4IDgyZWI3N2QuLmI1OWNlMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKQEAgLTkxLDM1ICs5MSw0MyBAQAogICogQHJldHVybiBpbnRlcm5hbCBhdWRpbyBmbGFncyBtYXNrCiAgKi8KIGF1ZGlvX2ZsYWdzX21hc2tfdCBBQXVkaW9Db252ZXJ0X2FsbG93Q2FwdHVyZVBvbGljeVRvQXVkaW9GbGFnc01hc2soCi0gICAgICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgcG9saWN5KTsKKyAgICAgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBwb2xpY3ksCisgICAgICAgIGFhdWRpb19zcGF0aWFsaXphdGlvbl9iZWhhdmlvcl90IHNwYXRpYWxpemF0aW9uQmVoYXZpb3IsCisgICAgICAgIGJvb2wgaXNDb250ZW50U3BhdGlhbGl6ZWQpOwogCiBhdWRpb19mbGFnc19tYXNrX3QgQUF1ZGlvQ29udmVydF9wcml2YWN5U2Vuc2l0aXZlVG9BdWRpb0ZsYWdzTWFzaygKICAgICAgICAgYm9vbCBwcml2YWN5U2Vuc2l0aXZlKTsKIAorYXVkaW9fY2hhbm5lbF9tYXNrX3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRDaGFubmVsTGF5b3V0TWFzaygKKyAgICAgICAgYWF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBib29sIGlzSW5wdXQpOworCithYXVkaW9fY2hhbm5lbF9tYXNrX3QgQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9DaGFubmVsTGF5b3V0TWFzaygKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGJvb2wgaXNJbnB1dCk7CisKK2FhdWRpb19jaGFubmVsX21hc2tfdCBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0NoYW5uZWxJbmRleE1hc2soCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKTsKKworYXVkaW9fY2hhbm5lbF9tYXNrX3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRDaGFubmVsSW5kZXhNYXNrKAorICAgICAgICBhYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spOworCithYXVkaW9fY2hhbm5lbF9tYXNrX3QgQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9DaGFubmVsTWFzaygKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGJvb2wgaXNJbnB1dCwgYm9vbCBpbmRleE1hc2tSZXF1aXJlZCk7CisKK2F1ZGlvX2NoYW5uZWxfbWFza190IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkQ2hhbm5lbE1hc2soCisgICAgICAgIGFhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYm9vbCBpc0lucHV0KTsKKworYm9vbCBBQXVkaW9faXNDaGFubmVsSW5kZXhNYXNrKGFhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayk7CisKK2ludDMyX3QgQUF1ZGlvQ29udmVydF9jaGFubmVsTWFza1RvQ291bnQoYWF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKTsKKworYWF1ZGlvX2NoYW5uZWxfbWFza190IEFBdWRpb0NvbnZlcnRfY2hhbm5lbENvdW50VG9NYXNrKGludDMyX3QgY2hhbm5lbENvdW50KTsKKworYXVkaW9fY2hhbm5lbF9tYXNrX3QgQUF1ZGlvX2dldENoYW5uZWxNYXNrRm9yT3BlbigKKyAgICAgICAgYWF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwgYm9vbCBpc0lucHV0KTsKKwogLy8gTm90ZSB0aGF0IHRoaXMgY29kZSBtYXkgYmUgcmVwbGFjZWQgYnkgU2V0dGluZ3Mgb3IgYnkgc29tZSBvdGhlciBzeXN0ZW0gY29uZmlndXJhdGlvbiB0b29sLgogCiAvKioKLSAqIFJlYWQgc3lzdGVtIHByb3BlcnR5LgotICogQHJldHVybiBBQVVESU9fVU5TUEVDSUZJRUQsIEFBVURJT19QT0xJQ1lfTkVWRVIgb3IgQUFVRElPX1BPTElDWV9BVVRPIG9yIEFBVURJT19QT0xJQ1lfQUxXQVlTCi0gKi8KLWludDMyX3QgQUF1ZGlvUHJvcGVydHlfZ2V0TU1hcFBvbGljeSgpOwotI2RlZmluZSBBQVVESU9fUFJPUF9NTUFQX1BPTElDWSAgICAgICAgICAgImFhdWRpby5tbWFwX3BvbGljeSIKLQotLyoqCi0gKiBSZWFkIHN5c3RlbSBwcm9wZXJ0eS4KLSAqIEByZXR1cm4gQUFVRElPX1VOU1BFQ0lGSUVELCBBQVVESU9fUE9MSUNZX05FVkVSIG9yIEFBVURJT19QT0xJQ1lfQVVUTyBvciBBQVVESU9fUE9MSUNZX0FMV0FZUwotICovCi1pbnQzMl90IEFBdWRpb1Byb3BlcnR5X2dldE1NYXBFeGNsdXNpdmVQb2xpY3koKTsKLSNkZWZpbmUgQUFVRElPX1BST1BfTU1BUF9FWENMVVNJVkVfUE9MSUNZICJhYXVkaW8ubW1hcF9leGNsdXNpdmVfcG9saWN5IgotCi0vKioKLSAqIFJlYWQgc3lzdGVtIHByb3BlcnR5LgotICogQHJldHVybiBudW1iZXIgb2YgYnVyc3RzIHBlciBBQXVkaW8gc2VydmljZSBtaXhlciBjeWNsZQotICovCi1pbnQzMl90IEFBdWRpb1Byb3BlcnR5X2dldE1peGVyQnVyc3RzKCk7Ci0jZGVmaW5lIEFBVURJT19QUk9QX01JWEVSX0JVUlNUUyAgICAgICAgICAgImFhdWRpby5taXhlcl9idXJzdHMiCi0KLS8qKgogICogUmVhZCBhIHN5c3RlbSBwcm9wZXJ0eSB0aGF0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGV4dHJhIG1pY3Jvc2Vjb25kcyB0aGF0IGEgdGhyZWFkCiAgKiBzaG91bGQgc2xlZXAgd2hlbiB3YWl0aW5nIGZvciBhbm90aGVyIHRocmVhZCB0byBzZXJ2aWNlIGEgRklGTy4gVGhpcyBpcyB1c2VkCiAgKiB0byBhdm9pZCB0aGUgd2FraW5nIHRocmVhZCBmcm9tIGJlaW5nIG92ZXJseSBvcHRpbWlzdGljIGFib3V0IHRoZSBvdGhlciB0aHJlYWRzCkBAIC0xNDAsMTkgKzE0OCw2IEBACiAjZGVmaW5lIEFBVURJT19QUk9QX01JTklNVU1fU0xFRVBfVVNFQyAgICAgICJhYXVkaW8ubWluaW11bV9zbGVlcF91c2VjIgogCiAvKioKLSAqIFJlYWQgc3lzdGVtIHByb3BlcnR5LgotICogVGhpcyBpcyBoYW5keSBpbiBjYXNlIHRoZSBETUEgaXMgYnVyc3RpbmcgdG9vIHF1aWNrbHkgZm9yIHRoZSBDUFUgdG8ga2VlcCB1cC4KLSAqIEZvciBleGFtcGxlLCB0aGVyZSBtYXkgYmUgYSBETUEgYnVyc3QgZXZlcnkgMTAwIHVzZWMgYnV0IHlvdSBvbmx5Ci0gKiB3YW50IHRvIGZlZWQgdGhlIE1NQVAgYnVmZmVyIGV2ZXJ5IDIwMDAgdXNlYy4KLSAqCi0gKiBUaGlzIHdpbGwgYWZmZWN0IHRoZSBmcmFtZXNQZXJCdXJzdCBmb3IgYW4gTU1BUCBzdHJlYW0uCi0gKgotICogQHJldHVybiBtaW5pbXVtIG51bWJlciBvZiBtaWNyb3NlY29uZHMgZm9yIGEgTU1BUCBIVyBidXJzdAotICovCi1pbnQzMl90IEFBdWRpb1Byb3BlcnR5X2dldEhhcmR3YXJlQnVyc3RNaW5NaWNyb3MoKTsKLSNkZWZpbmUgQUFVRElPX1BST1BfSFdfQlVSU1RfTUlOX1VTRUMgICAgICAiYWF1ZGlvLmh3X2J1cnN0X21pbl91c2VjIgotCi0vKioKICAqIFJlYWQgYSBzeXN0ZW0gcHJvcGVydHkgdGhhdCBzcGVjaWZpZXMgYW4gb2Zmc2V0IHRoYXQgd2lsbCBiZSBhZGRlZCB0byBNTUFQIHRpbWVzdGFtcHMuCiAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNvcnJlY3QgYmlhcyBpbiB0aGUgdGltZXN0YW1wLgogICogSXQgY2FuIGFsc28gYmUgdXNlZCB0byBhbmFseXplIHRoZSB0aW1lIGRpc3RyaWJ1dGlvbiBvZiB0aGUgdGltZXN0YW1wCkBAIC0xOTgsNyArMTkzLDcgQEAKICAqIEByZXR1cm4gdHJ1ZSBpZiBmKCkgZXZlbnR1YWxseSByZXR1cm5zIHRydWUuCiAgKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCBBQXVkaW9fdHJ5VW50aWxUcnVlKAotICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woKT4gZiwgaW50IHRpbWVzLCBpbnQgc2xlZXBNcykgeworICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woKT4mIGYsIGludCB0aW1lcywgaW50IHNsZWVwTXMpIHsKICAgICBzdGF0aWMgY29uc3QgdXNlY29uZHNfdCBVU19QRVJfTVMgPSAxMDAwOwogCiAgICAgc2xlZXBNcyA9IHN0ZDo6bWF4KHNsZWVwTXMsIDApOwpAQCAtMjcwLDkgKzI2NSw3IEBACiAKIGNsYXNzIFRpbWVzdGFtcCB7CiBwdWJsaWM6Ci0gICAgVGltZXN0YW1wKCkKLSAgICAgICAgICAgIDogbVBvc2l0aW9uKDApCi0gICAgICAgICAgICAsIG1OYW5vc2Vjb25kcygwKSB7fQorICAgIFRpbWVzdGFtcCgpID0gZGVmYXVsdDsKICAgICBUaW1lc3RhbXAoaW50NjRfdCBwb3NpdGlvbiwgaW50NjRfdCBuYW5vc2Vjb25kcykKICAgICAgICAgICAgIDogbVBvc2l0aW9uKHBvc2l0aW9uKQogICAgICAgICAgICAgLCBtTmFub3NlY29uZHMobmFub3NlY29uZHMpIHt9CkBAIC0yODMsOCArMjc2LDggQEAKIAogcHJpdmF0ZToKICAgICAvLyBUaGVzZSBjYW5ub3QgYmUgY29uc3QgYmVjYXVzZSB3ZSBuZWVkIHRvIGltcGxlbWVudCB0aGUgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yLgotICAgIGludDY0X3QgbVBvc2l0aW9uOwotICAgIGludDY0X3QgbU5hbm9zZWNvbmRzOworICAgIGludDY0X3QgbVBvc2l0aW9uezB9OworICAgIGludDY0X3QgbU5hbm9zZWNvbmRzezB9OwogfTsKIAogCkBAIC0zMTgsNCArMzExLDM2IEBACiAgICAgc3RkOjphdG9taWM8aW50PiBtUmVxdWVzdGVkezB9OwogICAgIHN0ZDo6YXRvbWljPGludD4gbUFja25vd2xlZGdlZHswfTsKIH07CisKK2VudW0geworICAgIC8qKgorICAgICAqIEF1ZGlvIGNoYW5uZWwgaW5kZXggbWFzaywgb25seSB1c2VkIGludGVybmFsbHkuCisgICAgICovCisgICAgQUFVRElPX0NIQU5ORUxfQklUX0lOREVYID0gMHg4MDAwMDAwMCwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCAxKSAtIDEsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMikgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMyA9IEFBVURJT19DSEFOTkVMX0JJVF9JTkRFWCB8ICgxIDw8IDMpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzQgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCA0KSAtIDEsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS181ID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgNSkgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNiA9IEFBVURJT19DSEFOTkVMX0JJVF9JTkRFWCB8ICgxIDw8IDYpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzcgPSBBQVVESU9fQ0hBTk5FTF9CSVRfSU5ERVggfCAoMSA8PCA3KSAtIDEsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS184ID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgOCkgLSAxLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOSA9IEFBVURJT19DSEFOTkVMX0JJVF9JTkRFWCB8ICgxIDw8IDkpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEwID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMTApIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzExID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMTEpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEyID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMTIpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEzID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMTMpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE0ID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMTQpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE1ID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMTUpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE2ID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMTYpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE3ID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMTcpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE4ID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMTgpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE5ID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMTkpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIwID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMjApIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIxID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMjEpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIyID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMjIpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIzID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMjMpIC0gMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzI0ID0gQUFVRElPX0NIQU5ORUxfQklUX0lOREVYIHwgKDEgPDwgMjQpIC0gMSwKK307CisKICNlbmRpZiAvL1VUSUxJVFlfQUFVRElPX1VUSUxJVElFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvRml4ZWRCbG9ja0FkYXB0ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9GaXhlZEJsb2NrQWRhcHRlci5oCmluZGV4IDRkYzdlNjguLjI5MGU0NzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9GaXhlZEJsb2NrQWRhcHRlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9GaXhlZEJsb2NrQWRhcHRlci5oCkBAIC0zNSw3ICszNSw3IEBACiBjbGFzcyBGaXhlZEJsb2NrQWRhcHRlcgogewogcHVibGljOgotICAgIEZpeGVkQmxvY2tBZGFwdGVyKEZpeGVkQmxvY2tQcm9jZXNzb3IgJmZpeGVkQmxvY2tQcm9jZXNzb3IpCisgICAgZXhwbGljaXQgRml4ZWRCbG9ja0FkYXB0ZXIoRml4ZWRCbG9ja1Byb2Nlc3NvciAmZml4ZWRCbG9ja1Byb2Nlc3NvcikKICAgICA6IG1GaXhlZEJsb2NrUHJvY2Vzc29yKGZpeGVkQmxvY2tQcm9jZXNzb3IpIHt9CiAKICAgICB2aXJ0dWFsIH5GaXhlZEJsb2NrQWRhcHRlcigpID0gZGVmYXVsdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9GaXhlZEJsb2NrUmVhZGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvRml4ZWRCbG9ja1JlYWRlci5oCmluZGV4IDEyOGRkNTIuLmRjODI0MTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9GaXhlZEJsb2NrUmVhZGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0ZpeGVkQmxvY2tSZWFkZXIuaApAQCAtMzAsNyArMzAsNyBAQAogY2xhc3MgRml4ZWRCbG9ja1JlYWRlciA6IHB1YmxpYyBGaXhlZEJsb2NrQWRhcHRlcgogewogcHVibGljOgotICAgIEZpeGVkQmxvY2tSZWFkZXIoRml4ZWRCbG9ja1Byb2Nlc3NvciAmZml4ZWRCbG9ja1Byb2Nlc3Nvcik7CisgICAgZXhwbGljaXQgRml4ZWRCbG9ja1JlYWRlcihGaXhlZEJsb2NrUHJvY2Vzc29yICZmaXhlZEJsb2NrUHJvY2Vzc29yKTsKIAogICAgIHZpcnR1YWwgfkZpeGVkQmxvY2tSZWFkZXIoKSA9IGRlZmF1bHQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9GaXhlZEJsb2NrV3JpdGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvRml4ZWRCbG9ja1dyaXRlci5oCmluZGV4IGYxZDkxN2MuLjNlODliNWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9GaXhlZEJsb2NrV3JpdGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0ZpeGVkQmxvY2tXcml0ZXIuaApAQCAtMjgsNyArMjgsNyBAQAogY2xhc3MgRml4ZWRCbG9ja1dyaXRlciA6IHB1YmxpYyBGaXhlZEJsb2NrQWRhcHRlcgogewogcHVibGljOgotICAgIEZpeGVkQmxvY2tXcml0ZXIoRml4ZWRCbG9ja1Byb2Nlc3NvciAmZml4ZWRCbG9ja1Byb2Nlc3Nvcik7CisgICAgZXhwbGljaXQgRml4ZWRCbG9ja1dyaXRlcihGaXhlZEJsb2NrUHJvY2Vzc29yICZmaXhlZEJsb2NrUHJvY2Vzc29yKTsKIAogICAgIHZpcnR1YWwgfkZpeGVkQmxvY2tXcml0ZXIoKSA9IGRlZmF1bHQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oCmluZGV4IDYzYWRkNGUuLjUxZWI2OWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaApAQCAtMzAsOCArMzAsOCBAQAogY2xhc3MgTW9ub3RvbmljQ291bnRlciB7CiAKIHB1YmxpYzoKLSAgICBNb25vdG9uaWNDb3VudGVyKCkge307Ci0gICAgdmlydHVhbCB+TW9ub3RvbmljQ291bnRlcigpIHt9OworICAgIE1vbm90b25pY0NvdW50ZXIoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB+TW9ub3RvbmljQ291bnRlcigpID0gZGVmYXVsdDsKIAogICAgIC8qKgogICAgICAqIEByZXR1cm4gY3VycmVudCB2YWx1ZSBvZiB0aGUgY291bnRlcgpAQCAtNDEsNyArNDEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBhZHZhbmNlIHRoZSBjdXJyZW50IHZhbHVlIHRvIG1hdGNoIHRoZSBjb3VudGVyCisgICAgICogQWR2YW5jZSB0aGUgY3VycmVudCB2YWx1ZSB0byBtYXRjaCB0aGUgY291bnRlci4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCBpdCB3aWxsIHRha2Ugc2V2ZXJhbCBtaWxsaW9uIHllYXJzIGZvciB0aGUgNjQtYml0CisgICAgICogY291bnRlcnMgdG8gd3JhcCBhcm91bmQuCisgICAgICogU28gd2UgZG8gbm90IHVzZSBfX2J1aWx0aW5fc3ViX292ZXJmbG93LgorICAgICAqIFdlIHdhbnQgdG8ga25vdyBpZiBvdmVyZmxvdyBoYXBwZW5zIGJlY2F1c2Ugb2YgYSBidWcuCiAgICAgICovCiAgICAgdm9pZCBjYXRjaFVwVG8oaW50NjRfdCBjb3VudGVyKSB7CiAgICAgICAgIGlmICgoY291bnRlciAtIG1Db3VudGVyNjQpID4gMCkgewpAQCAtNzQsNyArNzksOCBAQAogICAgICAqIEByZXR1cm4gY3VycmVudCB2YWx1ZSBvZiB0aGUgNjQtYml0IGNvdW50ZXIKICAgICAgKi8KICAgICBpbnQ2NF90IHVwZGF0ZTMyKGludDMyX3QgY291bnRlcjMyKSB7Ci0gICAgICAgIGludDMyX3QgZGVsdGEgPSBjb3VudGVyMzIgLSBtQ291bnRlcjMyOworICAgICAgICBpbnQzMl90IGRlbHRhOworICAgICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KGNvdW50ZXIzMiwgbUNvdW50ZXIzMiwgJmRlbHRhKTsKICAgICAgICAgLy8gcHJvdGVjdCBhZ2FpbnN0IHRoZSBtQ291bnRlcjY0IGdvaW5nIGJhY2t3YXJkcwogICAgICAgICBpZiAoZGVsdGEgPiAwKSB7CiAgICAgICAgICAgICBtQ291bnRlcjY0ICs9IGRlbHRhOwpAQCAtMTA4LDUgKzExNCw0IEBACiAgICAgaW50MzJfdCBtQ291bnRlcjMyID0gMDsKIH07CiAKLQogI2VuZGlmIC8vVVRJTElUWV9NT05PVE9OSUNfQ09VTlRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDk4ZTk3MjcuLjRiNDU5MDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xMyw2ICsxMywxMSBAQAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbImJvdW5kcyJdLAorICAgIH0sCiB9CiAKIGNjX3Rlc3QgewpAQCAtNDgsNyArNTMsNyBAQAogICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpb19pbnRlcm5hbCJdLAogfQogCi1jY190ZXN0IHsKK2NjX2JpbmFyeSB7CiAgICAgbmFtZTogInRlc3RfdGltZXN0YW1wcyIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X3RpbWVzdGFtcHMuY3BwIl0sCkBAIC02MCwxMjEgKzY1LDcxIEBACiAgICAgbmFtZTogInRlc3Rfb3Blbl9wYXJhbXMiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9vcGVuX3BhcmFtcy5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYWF1ZGlvIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CiAKLWNjX3Rlc3QgeworY2NfYmluYXJ5IHsKICAgICBuYW1lOiAidGVzdF9ub19jbG9zZSIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X25vX2Nsb3NlLmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhYXVkaW8iLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KIAotY2NfdGVzdCB7CitjY19iaW5hcnkgewogICAgIG5hbWU6ICJ0ZXN0X2FhdWRpb19yZWNvdmVyeSIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X3JlY292ZXJ5LmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhYXVkaW8iLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KIAotY2NfdGVzdCB7CitjY19iaW5hcnkgewogICAgIG5hbWU6ICJ0ZXN0X25fc3RyZWFtcyIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X25fc3RyZWFtcy5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYWF1ZGlvIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CiAKLWNjX3Rlc3QgeworY2NfYmluYXJ5IHsKICAgICBuYW1lOiAidGVzdF9iYWRfZGlzY29ubmVjdCIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X2JhZF9kaXNjb25uZWN0LmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhYXVkaW8iLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KIAogY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3RfdmFyaW91cyIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X3ZhcmlvdXMuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogfQogCiBjY190ZXN0IHsKICAgICBuYW1lOiAidGVzdF9zZXNzaW9uX2lkIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3Rfc2Vzc2lvbl9pZC5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYWF1ZGlvIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CiAKLWNjX3Rlc3QgeworY2NfYmluYXJ5IHsKICAgICBuYW1lOiAidGVzdF9hYXVkaW9fbW9ua2V5IiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfYWF1ZGlvX21vbmtleS5jcHAiXSwKICAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhYXVkaW8iLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KIAogY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3RfYXR0cmlidXRlcyIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X2F0dHJpYnV0ZXMuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogfQogCiBjY190ZXN0IHsKICAgICBuYW1lOiAidGVzdF9pbnRlcmZlcmVuY2UiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9pbnRlcmZlcmVuY2UuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFhdWRpbyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogfQogCiBjY190ZXN0IHsKQEAgLTE5NywyNyArMTUyLDI5IEBACiB9CiAKIGNjX3Rlc3QgewotICAgIG5hbWU6ICJ0ZXN0X3JldHVybl9zdG9wIiwKKyAgICBuYW1lOiAidGVzdF9tb25vdG9uaWNfY291bnRlciIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCi0gICAgc3JjczogWyJ0ZXN0X3JldHVybl9zdG9wLmNwcCJdLAorICAgIHNyY3M6IFsidGVzdF9tb25vdG9uaWNfY291bnRlci5jcHAiXSwKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmFhdWRpb19pbnRlcm5hbCIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogfQogCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJ0ZXN0X3JldHVybl9zdG9wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfcmV0dXJuX3N0b3AuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJ0ZXN0X2NhbGxiYWNrX3JhY2UiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9jYWxsYmFja19yYWNlLmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhYXVkaW8iLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KIAogY2NfdGVzdCB7CkBAIC0yMzgsNyArMTk1LDcgQEAKICAgICBdLAogfQogCi1jY190ZXN0IHsKK2NjX2JpbmFyeSB7CiAgICAgbmFtZTogInRlc3Rfc3RlYWxfZXhjbHVzaXZlIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3Rfc3RlYWxfZXhjbHVzaXZlLmNwcCJdLApAQCAtMjUxLDE1ICsyMDgsOSBAQAogICAgIF0sCiB9CiAKLQotY2NfdGVzdCB7CitjY19iaW5hcnkgewogICAgIG5hbWU6ICJ0ZXN0X2Rpc2Nvbm5lY3RfcmFjZSIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X2Rpc2Nvbm5lY3RfcmFjZS5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYWF1ZGlvIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdHRyaWJ1dGVzLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0dHJpYnV0ZXMuY3BwCmluZGV4IGQ1NDA4NjYuLmI4OGQ1NjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0dHJpYnV0ZXMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0dHJpYnV0ZXMuY3BwCkBAIC0xNiw2ICsxNiwxMCBAQAogCiAvLyBUZXN0IEFBdWRpbyBhdHRyaWJ1dGVzIHN1Y2ggYXMgVXNhZ2UsIENvbnRlbnRUeXBlIGFuZCBJbnB1dFByZXNldC4KIAorLy8gVE9ETyBNYW55IG9mIHRoZXNlIHRlc3RzIGFyZSBkdXBsaWNhdGVzIG9mIENUUyB0ZXN0cyBpbgorLy8gInRlc3RfYWF1ZGlvX2F0dHJpYnV0ZXMuY3BwIi4gVGhhdCBvdGhlciBmaWxlIGlzIG1vcmUgY3VycmVudC4KKy8vIFNvIHRoZXNlIHRlc3RzIGNvdWxkIGJlIGRlbGV0ZWQuCisKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCkBAIC05MSw3ICs5NSw3IEBACiAgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBleHBlY3RlZENhcHR1cmVQb2xpY3kgPQogICAgICAgICAgICAgKGNhcHR1cmVQb2xpY3kgPT0gRE9OVF9TRVQgfHwgY2FwdHVyZVBvbGljeSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCiAgICAgICAgICAgICA/IEFBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTCAvLyBkZWZhdWx0Ci0gICAgICAgICAgICA6IHByZXNldDsKKyAgICAgICAgICAgIDogY2FwdHVyZVBvbGljeTsKICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRDYXB0dXJlUG9saWN5LCBBQXVkaW9TdHJlYW1fZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3koYWF1ZGlvU3RyZWFtKSk7CiAKICAgICBib29sIGV4cGVjdGVkUHJpdmFjeU1vZGUgPQpAQCAtMTMyLDEwICsxMzYsNyBAQAogICAgIEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTiwKICAgICBBQVVESU9fVVNBR0VfR0FNRSwKICAgICBBQVVESU9fVVNBR0VfQVNTSVNUQU5ULAotICAgIEFBVURJT19TWVNURU1fVVNBR0VfRU1FUkdFTkNZLAotICAgIEFBVURJT19TWVNURU1fVVNBR0VfU0FGRVRZLAotICAgIEFBVURJT19TWVNURU1fVVNBR0VfVkVISUNMRV9TVEFUVVMsCi0gICAgQUFVRElPX1NZU1RFTV9VU0FHRV9BTk5PVU5DRU1FTlQKKyAgICAvLyBOb3RlIHRoYXQgdGhlIEFBVURJT19TWVNURU1fVVNBR0VfKiB2YWx1ZXMgcmVxdWlyZXMgc3BlY2lhbCBwZXJtaXNzaW9uLgogfTsKIAogc3RhdGljIGNvbnN0IGFhdWRpb19jb250ZW50X3R5cGVfdCBzQ29udGVudHlwZXNbXSA9IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9mbG93Z3JhcGguY3BwCmluZGV4IGQ1NjNhN2UuLjY2Yjc3ZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZmxvd2dyYXBoLmNwcApAQCAtMTYsNiArMTYsOSBAQAogCiAvKgogICogVGVzdCBGbG93R3JhcGgKKyAqCisgKiBUaGlzIGZpbGUgYWxzbyB0ZXN0cyBhIGZldyBkaWZmZXJlbnQgY29udmVyc2lvbiB0ZWNobmlxdWVzIGJlY2F1c2UKKyAqIHNvbWV0aW1lcyB0aGF0IGhhdmUgY2F1c2VkIGNvbXBpbGVyIGJ1Z3MuCiAgKi8KIAogI2luY2x1ZGUgPGlvc3RyZWFtPgpAQCAtMjMsMzUgKzI2LDE2MSBAQAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKICNpbmNsdWRlICJmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvTW9ub0JsZW5kLmgiCiAjaW5jbHVkZSAiZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmgiCiAjaW5jbHVkZSAiZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmgiCiAjaW5jbHVkZSAiZmxvd2dyYXBoL1JhbXBMaW5lYXIuaCIKICNpbmNsdWRlICJmbG93Z3JhcGgvU2lua0Zsb2F0LmgiCiAjaW5jbHVkZSAiZmxvd2dyYXBoL1NpbmtJMTYuaCIKICNpbmNsdWRlICJmbG93Z3JhcGgvU2lua0kyNC5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rSTMyLmgiCiAjaW5jbHVkZSAiZmxvd2dyYXBoL1NvdXJjZUkxNi5oIgogI2luY2x1ZGUgImZsb3dncmFwaC9Tb3VyY2VJMjQuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKK3VzaW5nIG5hbWVzcGFjZSBGTE9XR1JBUEhfT1VURVJfTkFNRVNQQUNFOjpmbG93Z3JhcGg7CiAKIGNvbnN0ZXhwciBpbnQga0J5dGVzUGVySTI0UGFja2VkID0gMzsKIAorY29uc3RleHByIGludCBrTnVtU2FtcGxlcyA9IDg7Citjb25zdGV4cHIgc3RkOjphcnJheTxmbG9hdCwga051bVNhbXBsZXM+IGtJbnB1dEZsb2F0ID0geworICAgIDEuMGYsIDAuNWYsIC0wLjI1ZiwgLTEuMGYsCisgICAgMC4wZiwgNTMuOWYsIC04Ny4yZiwgLTEuMDJmfTsKKworLy8gQ29ycmVzcG9uZGluZyBQQ00gdmFsdWVzICBhcyBpbnRlZ2Vycy4KK2NvbnN0ZXhwciBzdGQ6OmFycmF5PGludDE2X3QsIGtOdW1TYW1wbGVzPiAga0V4cGVjdGVkSTE2ID0geworICAgIElOVDE2X01BWCwgMSA8PCAxNCwgSU5UMTZfTUlOIC8gNCwgSU5UMTZfTUlOLAorICAgIDAsIElOVDE2X01BWCwgSU5UMTZfTUlOLCBJTlQxNl9NSU59OworCitjb25zdGV4cHIgc3RkOjphcnJheTxpbnQzMl90LCBrTnVtU2FtcGxlcz4gIGtFeHBlY3RlZEkzMiA9IHsKKyAgICBJTlQzMl9NQVgsIDEgPDwgMzAsIElOVDMyX01JTiAvIDQsIElOVDMyX01JTiwKKyAgICAwLCBJTlQzMl9NQVgsIElOVDMyX01JTiwgSU5UMzJfTUlOfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRkxPQVQgdG8gSTE2ID09PT09PT09PT09PT09CisKKy8vIFNpbXBsZSB0ZXN0IHRoYXQgdHJpZXMgdG8gcmVwcm9kdWNlIGEgQ2xhbmcgY29tcGlsZXIgYnVnLgorX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQordm9pZCBsb2NhbF9jb252ZXJ0X2Zsb2F0X3RvX2ludDE2KGNvbnN0IGZsb2F0ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGludDMyX3QgbiA9IChpbnQzMl90KSAoKmlucHV0KysgKiAzMjc2OC4wZik7CisgICAgICAgICpvdXRwdXQrKyA9IHN0ZDo6bWluKElOVDE2X01BWCwgc3RkOjptYXgoSU5UMTZfTUlOLCBuKSk7IC8vIGNsaXAKKyAgICB9Cit9CisKK1RFU1QodGVzdF9mbG93Z3JhcGgsIGxvY2FsX2NvbnZlcnRfZmxvYXRfaW50MTYpIHsKKyAgICBzdGQ6OmFycmF5PGludDE2X3QsIGtOdW1TYW1wbGVzPiBvdXRwdXQ7CisKKyAgICAvLyBEbyBpdCBpbmxpbmUsIHdoaWNoIHdpbGwgcHJvYmFibHkgd29yayBldmVuIHdpdGggdGhlIGJ1Z2d5IGNvbXBpbGVyLgorICAgIC8vIFRoaXMgdmFsaWRhdGVzIHRoZSBleHBlY3RlZCBkYXRhLgorICAgIGNvbnN0IGZsb2F0ICppbiA9IGtJbnB1dEZsb2F0LmRhdGEoKTsKKyAgICBpbnQxNl90ICpvdXQgPSBvdXRwdXQuZGF0YSgpOworICAgIG91dHB1dC5maWxsKDc3Nyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIGludDMyX3QgbiA9IChpbnQzMl90KSAoKmluKysgKiAzMjc2OC4wZik7CisgICAgICAgICpvdXQrKyA9IHN0ZDo6bWluKElOVDE2X01BWCwgc3RkOjptYXgoSU5UMTZfTUlOLCBuKSk7IC8vIGNsaXAKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRJMTYuYXQoaSksIG91dHB1dC5hdChpKSkgPDwgIiwgaSA9ICIgPDwgaTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IGF1ZGlvIHNpZ25hbCB1c2luZyB0aGUgZnVuY3Rpb24uCisgICAgb3V0cHV0LmZpbGwoNzc3KTsKKyAgICBsb2NhbF9jb252ZXJ0X2Zsb2F0X3RvX2ludDE2KGtJbnB1dEZsb2F0LmRhdGEoKSwgb3V0cHV0LmRhdGEoKSwga051bVNhbXBsZXMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXM7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkSTE2LmF0KGkpLCBvdXRwdXQuYXQoaSkpIDw8ICIsIGkgPSAiIDw8IGk7CisgICAgfQorfQorCiBURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfc2lua2kxNikgewotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBpbnB1dFtdID0gezEuMGYsIDAuNWYsIC0wLjI1ZiwgLTEuMGYsIDAuMGYsIDUzLjlmLCAtODcuMmZ9OwotICAgIHN0YXRpYyBjb25zdCBpbnQxNl90IGV4cGVjdGVkW10gPSB7MzI3NjcsIDE2Mzg0LCAtODE5MiwgLTMyNzY4LCAwLCAzMjc2NywgLTMyNzY4fTsKLSAgICBpbnQxNl90IG91dHB1dFsyMF07CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga051bVNhbXBsZXMgPSA4OworICAgIHN0ZDo6YXJyYXk8aW50MTZfdCwga051bVNhbXBsZXMgKyAxMD4gb3V0cHV0OyAvLyBsYXJnZXIgdGhhbiBpbnB1dAorCiAgICAgU291cmNlRmxvYXQgc291cmNlRmxvYXR7MX07CiAgICAgU2lua0kxNiBzaW5rSTE2ezF9OwogCi0gICAgaW50IG51bUlucHV0RnJhbWVzID0gc2l6ZW9mKGlucHV0KSAvIHNpemVvZihpbnB1dFswXSk7Ci0gICAgc291cmNlRmxvYXQuc2V0RGF0YShpbnB1dCwgbnVtSW5wdXRGcmFtZXMpOworICAgIHNvdXJjZUZsb2F0LnNldERhdGEoa0lucHV0RmxvYXQuZGF0YSgpLCBrTnVtU2FtcGxlcyk7CiAgICAgc291cmNlRmxvYXQub3V0cHV0LmNvbm5lY3QoJnNpbmtJMTYuaW5wdXQpOwogCi0gICAgaW50IG51bU91dHB1dEZyYW1lcyA9IHNpemVvZihvdXRwdXQpIC8gc2l6ZW9mKGludDE2X3QpOwotICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtJMTYucmVhZChvdXRwdXQsIG51bU91dHB1dEZyYW1lcyk7Ci0gICAgQVNTRVJUX0VRKG51bUlucHV0RnJhbWVzLCBudW1SZWFkKTsKKyAgICBvdXRwdXQuZmlsbCg3NzcpOworICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtJMTYucmVhZChvdXRwdXQuZGF0YSgpLCBvdXRwdXQuc2l6ZSgpKTsKKyAgICBBU1NFUlRfRVEoa051bVNhbXBsZXMsIG51bVJlYWQpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVhZDsgaSsrKSB7Ci0gICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgb3V0cHV0W2ldKTsKKyAgICAgICAgRVhQRUNUX0VRKGtFeHBlY3RlZEkxNi5hdChpKSwgb3V0cHV0LmF0KGkpKSA8PCAiLCBpID0gIiA8PCBpOworICAgIH0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRkxPQVQgdG8gSTMyID09PT09PT09PT09PT09CisvLyBTaW1wbGUgdGVzdCB0aGF0IHRyaWVzIHRvIHJlcHJvZHVjZSBhIENsYW5nIGNvbXBpbGVyIGJ1Zy4KK19fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3N0YXRpYyBpbnQzMl90IGNsYW1wMzJGcm9tRmxvYXQoZmxvYXQgZikKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgc2NhbGUgPSAoZmxvYXQpKDFVTCA8PCAzMSk7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGxpbXBvcyA9IDEuOworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBsaW1uZWcgPSAtMS47CisKKyAgICBpZiAoZiA8PSBsaW1uZWcpIHsKKyAgICAgICAgcmV0dXJuIElOVDMyX01JTjsKKyAgICB9IGVsc2UgaWYgKGYgPj0gbGltcG9zKSB7CisgICAgICAgIHJldHVybiBJTlQzMl9NQVg7CisgICAgfQorICAgIGYgKj0gc2NhbGU7CisgICAgLyogaW50ZWdlciBjb252ZXJzaW9uIGlzIHRocm91Z2ggdHJ1bmNhdGlvbiAodGhvdWdoIGludCB0byBmbG9hdCBpcyBub3QpLgorICAgICAqIGVuc3VyZSB0aGF0IHdlIHJvdW5kIHRvIG5lYXJlc3QsIHRpZXMgYXdheSBmcm9tIDAuCisgICAgICovCisgICAgcmV0dXJuIGYgPiAwID8gZiArIDAuNSA6IGYgLSAwLjU7Cit9CisKK3ZvaWQgbG9jYWxfY29udmVydF9mbG9hdF90b19pbnQzMihjb25zdCBmbG9hdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAqb3V0cHV0KysgPSBjbGFtcDMyRnJvbUZsb2F0KCppbnB1dCsrKTsKKyAgICB9Cit9CisKK1RFU1QodGVzdF9mbG93Z3JhcGgsIHNpbXBsZV9jb252ZXJ0X2Zsb2F0X2ludDMyKSB7CisgICAgc3RkOjphcnJheTxpbnQzMl90LCBrTnVtU2FtcGxlcz4gb3V0cHV0OworCisgICAgLy8gRG8gaXQgaW5saW5lLCB3aGljaCB3aWxsIHByb2JhYmx5IHdvcmsgZXZlbiB3aXRoIGEgYnVnZ3kgY29tcGlsZXIuCisgICAgLy8gVGhpcyB2YWxpZGF0ZXMgdGhlIGV4cGVjdGVkIGRhdGEuCisgICAgY29uc3QgZmxvYXQgKmluID0ga0lucHV0RmxvYXQuZGF0YSgpOworICAgIG91dHB1dC5maWxsKDc3Nyk7CisgICAgaW50MzJfdCAqb3V0ID0gb3V0cHV0LmRhdGEoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgaW50NjRfdCBuID0gKGludDY0X3QpICgqaW4rKyAqIDIxNDc0ODM2NDguMGYpOworICAgICAgICAqb3V0KysgPSAoaW50MzJfdClzdGQ6Om1pbigoaW50NjRfdClJTlQzMl9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KChpbnQ2NF90KUlOVDMyX01JTiwgbikpOyAvLyBjbGlwCisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXM7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkSTMyLmF0KGkpLCBvdXRwdXQuYXQoaSkpIDw8ICIsIGkgPSAiIDw8IGk7CisgICAgfQorfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBsb2NhbF9jb252ZXJ0X2Zsb2F0X2ludDMyKSB7CisgICAgc3RkOjphcnJheTxpbnQzMl90LCBrTnVtU2FtcGxlcz4gb3V0cHV0OworICAgIC8vIENvbnZlcnQgYXVkaW8gc2lnbmFsIHVzaW5nIHRoZSBmdW5jdGlvbi4KKyAgICBvdXRwdXQuZmlsbCg3NzcpOworICAgIGxvY2FsX2NvbnZlcnRfZmxvYXRfdG9faW50MzIoa0lucHV0RmxvYXQuZGF0YSgpLCBvdXRwdXQuZGF0YSgpLCBrTnVtU2FtcGxlcyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRJMzIuYXQoaSksIG91dHB1dC5hdChpKSkgPDwgIiwgaSA9ICIgPDwgaTsKKyAgICB9Cit9CisKK1RFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9zaW5raTMyKSB7CisgICAgc3RkOjphcnJheTxpbnQzMl90LCBrTnVtU2FtcGxlcyArIDEwPiBvdXRwdXQ7IC8vIGxhcmdlciB0aGFuIGlucHV0CisKKyAgICBTb3VyY2VGbG9hdCBzb3VyY2VGbG9hdHsxfTsKKyAgICBTaW5rSTMyIHNpbmtJMzJ7MX07CisKKyAgICBzb3VyY2VGbG9hdC5zZXREYXRhKGtJbnB1dEZsb2F0LmRhdGEoKSwga051bVNhbXBsZXMpOworICAgIHNvdXJjZUZsb2F0Lm91dHB1dC5jb25uZWN0KCZzaW5rSTMyLmlucHV0KTsKKworICAgIG91dHB1dC5maWxsKDc3Nyk7CisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0kzMi5yZWFkKG91dHB1dC5kYXRhKCksIG91dHB1dC5zaXplKCkpOworICAgIEFTU0VSVF9FUShrTnVtU2FtcGxlcywgbnVtUmVhZCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGtFeHBlY3RlZEkzMi5hdChpKSwgb3V0cHV0LmF0KGkpKSA8PCAiLCBpID0gIiA8PCBpOwogICAgIH0KIH0KIApAQCAtNzYsMzEgKzIwNSw0MCBAQAogfQogCiBURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfcmFtcF9saW5lYXIpIHsKKyAgICBjb25zdGV4cHIgaW50IHNpbmdsZU51bU91dHB1dCA9IDE7CiAgICAgY29uc3RleHByIGludCByYW1wU2l6ZSA9IDU7CiAgICAgY29uc3RleHByIGludCBudW1PdXRwdXQgPSAxMDA7CiAgICAgY29uc3RleHByIGZsb2F0IHZhbHVlID0gMS4wZjsKLSAgICBjb25zdGV4cHIgZmxvYXQgdGFyZ2V0ID0gMTAwLjBmOworICAgIGNvbnN0ZXhwciBmbG9hdCBpbml0aWFsVGFyZ2V0ID0gMTAuMGY7CisgICAgY29uc3RleHByIGZsb2F0IGZpbmFsVGFyZ2V0ID0gMTAwLjBmOworICAgIGNvbnN0ZXhwciBmbG9hdCB0b2xlcmFuY2UgPSAwLjAwMDFmOyAvLyBhcmJpdHJhcnkKICAgICBmbG9hdCBvdXRwdXRbbnVtT3V0cHV0XSA9IHt9OwogICAgIFJhbXBMaW5lYXIgcmFtcExpbmVhcnsxfTsKICAgICBTaW5rRmxvYXQgc2lua0Zsb2F0ezF9OwogCiAgICAgcmFtcExpbmVhci5pbnB1dC5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgcmFtcExpbmVhci5zZXRMZW5ndGhJbkZyYW1lcyhyYW1wU2l6ZSk7Ci0gICAgcmFtcExpbmVhci5zZXRUYXJnZXQodGFyZ2V0KTsKLSAgICByYW1wTGluZWFyLmZvcmNlQ3VycmVudCgwLjBmKTsKLQogICAgIHJhbXBMaW5lYXIub3V0cHV0LmNvbm5lY3QoJnNpbmtGbG9hdC5pbnB1dCk7CiAKKyAgICAvLyBDaGVjayB0aGF0IHRoZSB2YWx1ZXMgZ28gdG8gdGhlIGluaXRpYWwgdGFyZ2V0IGluc3RhbnRseS4KKyAgICByYW1wTGluZWFyLnNldFRhcmdldChpbml0aWFsVGFyZ2V0KTsKKyAgICBpbnQzMl90IHNpbmdsZU51bVJlYWQgPSBzaW5rRmxvYXQucmVhZChvdXRwdXQsIHNpbmdsZU51bU91dHB1dCk7CisgICAgQVNTRVJUX0VRKHNpbmdsZU51bVJlYWQsIHNpbmdsZU51bU91dHB1dCk7CisgICAgRVhQRUNUX05FQVIodmFsdWUgKiBpbml0aWFsVGFyZ2V0LCBvdXRwdXRbMF0sIHRvbGVyYW5jZSk7CisKKyAgICAvLyBOb3cgc2V0IHRhcmdldCBhbmQgY2hlY2sgdGhhdCB0aGUgbGluZWFyIHJhbXAgd29ya3MgYXMgZXhwZWN0ZWQuCisgICAgcmFtcExpbmVhci5zZXRUYXJnZXQoZmluYWxUYXJnZXQpOwogICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtGbG9hdC5yZWFkKG91dHB1dCwgbnVtT3V0cHV0KTsKKyAgICBjb25zdCBmbG9hdCBpbmNyZW1lbnRTaXplID0gKGZpbmFsVGFyZ2V0IC0gaW5pdGlhbFRhcmdldCkgLyByYW1wU2l6ZTsKICAgICBBU1NFUlRfRVEobnVtT3V0cHV0LCBudW1SZWFkKTsKLSAgICBjb25zdGV4cHIgZmxvYXQgdG9sZXJhbmNlID0gMC4wMDAxZjsgLy8gYXJiaXRyYXJ5CisKICAgICBpbnQgaSA9IDA7CiAgICAgZm9yICg7IGkgPCByYW1wU2l6ZTsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IGV4cGVjdGVkID0gaSAqIHZhbHVlICogdGFyZ2V0IC8gcmFtcFNpemU7CisgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gdmFsdWUgKiAoaW5pdGlhbFRhcmdldCArIGkgKiBpbmNyZW1lbnRTaXplKTsKICAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWQsIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKICAgICB9CiAgICAgZm9yICg7IGkgPCBudW1PdXRwdXQ7IGkrKykgewotICAgICAgICBmbG9hdCBleHBlY3RlZCA9IHZhbHVlICogdGFyZ2V0OworICAgICAgICBmbG9hdCBleHBlY3RlZCA9IHZhbHVlICogZmluYWxUYXJnZXQ7CiAgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkLCBvdXRwdXRbaV0sIHRvbGVyYW5jZSk7CiAgICAgfQogfQpAQCAtMTU1LDMgKzI5MywyOSBAQAogICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZFtpXSwgb3V0cHV0W2ldLCB0b2xlcmFuY2UpOwogICAgIH0KIH0KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX21vbm9fYmxlbmQpIHsKKyAgICAvLyBUd28gY2hhbm5lbCB0byB0d28gY2hhbm5lbCB3aXRoIDMgaW5wdXRzIGFuZCBvdXRwdXRzLgorICAgIGNvbnN0ZXhwciBpbnQgbnVtQ2hhbm5lbHMgPSAyOworICAgIGNvbnN0ZXhwciBpbnQgbnVtRnJhbWVzID0gMzsKKworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBpbnB1dFtdID0gey0wLjcsIDAuNSwgLTAuMjUsIDEuMjUsIDEwMDAsIDIwMDB9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBleHBlY3RlZFtdID0gey0wLjEsIC0wLjEsIDAuNSwgMC41LCAxNTAwLCAxNTAwfTsKKyAgICBmbG9hdCBvdXRwdXRbMTAwXTsKKyAgICBTb3VyY2VGbG9hdCBzb3VyY2VGbG9hdHtudW1DaGFubmVsc307CisgICAgTW9ub0JsZW5kIG1vbm9CbGVuZHtudW1DaGFubmVsc307CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHtudW1DaGFubmVsc307CisKKyAgICBzb3VyY2VGbG9hdC5zZXREYXRhKGlucHV0LCBudW1GcmFtZXMpOworCisgICAgc291cmNlRmxvYXQub3V0cHV0LmNvbm5lY3QoJm1vbm9CbGVuZC5pbnB1dCk7CisgICAgbW9ub0JsZW5kLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCBudW1GcmFtZXMpOworICAgIEFTU0VSVF9FUShudW1SZWFkLCBudW1GcmFtZXMpOworICAgIGNvbnN0ZXhwciBmbG9hdCB0b2xlcmFuY2UgPSAwLjAwMDAwMWY7IC8vIGFyYml0cmFyeQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVhZDsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkW2ldLCBvdXRwdXRbaV0sIHRvbGVyYW5jZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9tb25vdG9uaWNfY291bnRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9tb25vdG9uaWNfY291bnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNiYmFmNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X21vbm90b25pY19jb3VudGVyLmNwcApAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGVzdCBNb25vdG9uaWNDb3VudGVyCisgKi8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgInV0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oIgorCitURVNUKHRlc3RfbW9ub3RvbmljX2NvdW50ZXIsIGJ1aWx0aW5fd3JhcCkgeworICAgIGludDMyX3QgeCA9IDB4N0ZGRkZGRjA7CisgICAgaW50MzJfdCB5ID0gMHg4MDAwMDAxMDsKKyAgICBpbnQzMl90IGRlbHRhOworICAgIC8vIGRlbHRhID0geSAtIHg7IC8vIFRoaXMgd291bGQgY2F1c2UgYSBudW1lcmljIG92ZXJmbG93IQorICAgIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coeSwgeCwgJmRlbHRhKTsKKyAgICBBU1NFUlRfRVEoMHgyMCwgZGVsdGEpOworfQorCisvLyB0ZXN0IHVwZGF0aW5nIHBhc3Qgc29tZSBvdmVyZmxvdyBwb2ludHMKK1RFU1QodGVzdF9tb25vdG9uaWNfY291bnRlciwgbW9ub19jb3VudGVyX3VwZGF0ZTMyX3dyYXApIHsKKyAgICBNb25vdG9uaWNDb3VudGVyIGNvdW50ZXI7CisgICAgQVNTRVJUX0VRKDAsIGNvdW50ZXIuZ2V0KCkpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCB4ID0gKHVpbnQzMl90KSAweDdGRkZGRkYwOworICAgIGNvdW50ZXIudXBkYXRlMzIoeCk7CisgICAgQVNTRVJUX0VRKChpbnQ2NF90KTB4N0ZGRkZGRjAsIGNvdW50ZXIuZ2V0KCkpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCB5ID0gKHVpbnQzMl90KSAweDgwMDAwMDEwOworICAgIGNvdW50ZXIudXBkYXRlMzIoeSk7CisgICAgQVNTRVJUX0VRKChpbnQ2NF90KTB4ODAwMDAwMTAsIGNvdW50ZXIuZ2V0KCkpOworCisgICAgY291bnRlci51cGRhdGUzMigwKTsKKyAgICBBU1NFUlRfRVEoKGludDY0X3QpMHgxMDAwMDAwMDAsIGNvdW50ZXIuZ2V0KCkpOworfQorCitURVNUKHRlc3RfbW9ub3RvbmljX2NvdW50ZXIsIG1vbm9fY291bnRlcl9yb3VuZHVwKSB7CisgICAgTW9ub3RvbmljQ291bnRlciBjb3VudGVyOworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgeCA9IDIzNDU7CisgICAgY291bnRlci51cGRhdGUzMih4KTsKKyAgICBBU1NFUlRfRVEoKGludDY0X3QpeCwgY291bnRlci5nZXQoKSk7CisKKyAgICBjb3VudGVyLnJvdW5kVXA2NCgxMDApOworICAgIEFTU0VSVF9FUSgoaW50NjRfdCkyNDAwLCBjb3VudGVyLmdldCgpKTsKK30KKworVEVTVCh0ZXN0X21vbm90b25pY19jb3VudGVyLCBtb25vX2NvdW50ZXJfY2F0Y2h1cCkgeworICAgIE1vbm90b25pY0NvdW50ZXIgY291bnRlcjsKKyAgICBjb3VudGVyLnVwZGF0ZTMyKDc2NTQpOworICAgIGNvdW50ZXIuY2F0Y2hVcFRvKDUwMDApOyAvLyBhbHJlYWR5IHBhc3QgNTAwMCBzbyBubyBjaGFuZ2UKKyAgICBBU1NFUlRfRVEoKGludDY0X3QpNzY1NCwgY291bnRlci5nZXQoKSk7CisgICAgY291bnRlci5jYXRjaFVwVG8oOTg3Nik7IC8vIGp1bXBzCisgICAgQVNTRVJUX0VRKChpbnQ2NF90KTk4NzYsIGNvdW50ZXIuZ2V0KCkpOworfQorCitURVNUKHRlc3RfbW9ub3RvbmljX2NvdW50ZXIsIG1vbm9fY291bnRlcl9pbmNyZW1lbnQpIHsKKyAgICBNb25vdG9uaWNDb3VudGVyIGNvdW50ZXI7CisgICAgY291bnRlci51cGRhdGUzMigxMDAwKTsKKyAgICBjb3VudGVyLmluY3JlbWVudCgtMjM0KTsgLy8gd2lsbCBub3QgZ28gYmFja3dhcmRzCisgICAgQVNTRVJUX0VRKChpbnQ2NF90KTEwMDAsIGNvdW50ZXIuZ2V0KCkpOworICAgIGNvdW50ZXIuaW5jcmVtZW50KDk2KTsgLy8gYWR2YW5jZXMKKyAgICBBU1NFUlRfRVEoKGludDY0X3QpMTA5NiwgY291bnRlci5nZXQoKSk7Cit9CisKK1RFU1QodGVzdF9tb25vdG9uaWNfY291bnRlciwgbW9ub19jb3VudGVyX3Jlc2V0KSB7CisgICAgTW9ub3RvbmljQ291bnRlciBjb3VudGVyOworICAgIGNvdW50ZXIudXBkYXRlMzIoMTAwMCk7CisgICAgLy8gQ291bnRlciBpcyBtb25vdG9uaWMgYW5kIHNob3VsZCBub3QgZ28gYmFja3dhcmRzLgorICAgIGNvdW50ZXIudXBkYXRlMzIoNTAwKTsgLy8gTm8gY2hhbmdlIGJlY2F1c2UgMzItYml0IGNvdW50ZXIgaXMgYWxyZWFkeSBwYXN0IDEwMDAuCisgICAgQVNTRVJUX0VRKChpbnQ2NF90KTEwMDAsIGNvdW50ZXIuZ2V0KCkpOworCisgICAgY291bnRlci5yZXNldDMyKCk7CisgICAgY291bnRlci51cGRhdGUzMig1MDApOworICAgIEFTU0VSVF9FUSgoaW50NjRfdCkxNTAwLCBjb3VudGVyLmdldCgpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3N0ZWFsX2V4Y2x1c2l2ZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9zdGVhbF9leGNsdXNpdmUuY3BwCmluZGV4IDA1YzU2MGQuLmNhNGYzZDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3N0ZWFsX2V4Y2x1c2l2ZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfc3RlYWxfZXhjbHVzaXZlLmNwcApAQCAtMTEwLDcgKzExMCwxMSBAQAogICAgICAgICBtT3BlbkRlbGF5TWlsbGlzID0gb3BlbkRlbGF5TWlsbGlzOwogICAgIH0KIAotICAgIHZvaWQgcmVzdGFydFN0cmVhbSgpIHsKKyAgICB2b2lkIHNldENsb3NlRW5hYmxlZChib29sIGVuYWJsZWQpIHsKKyAgICAgICAgbUNsb3NlRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgfQorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3RhcnRTdHJlYW0oKSB7CiAgICAgICAgIGludCByZXRyaWVzTGVmdCA9IG1NYXhSZXRyaWVzOwogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OwogICAgICAgICBkbyB7CkBAIC0xMjYsNiArMTMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgbU5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIH0gd2hpbGUgKHJldHJpZXNMZWZ0LS0gPiAwICYmIHJlc3VsdCAhPSBBQVVESU9fT0spOworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IG9uQXVkaW9SZWFkeSgKQEAgLTE4OSwxMCArMTk0LDEyIEBACiAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICAgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX2Nsb3NlKG1TdHJlYW0pOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9jbG9zZSByZXR1cm5lZCAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgICAgICBpZiAobUNsb3NlRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9jbG9zZShtU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9jbG9zZSgpIHJldHVybmVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX2Nsb3NlKCkgRElTQUJMRUQhXG4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1TdHJlYW0gPSBudWxscHRyOwogICAgICAgICB9CkBAIC0yMzIsNiArMjM5LDEyIEBACiAgICAgICAgIHJldHVybiBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KG1TdHJlYW0pOwogICAgIH0KIAorICAgIGFhdWRpb19yZXN1bHRfdCBwYXVzZSgpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBpZiAobVN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UobVN0cmVhbSk7CisgICAgfQorCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3AoKSB7CiAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKICAgICAgICAgaWYgKG1TdHJlYW0gPT0gbnVsbHB0cikgcmV0dXJuIDA7CkBAIC0yODcsNiArMzAwLDcgQEAKICAgICBzdGQ6OnN0cmluZyAgICAgICAgIG1OYW1lOwogICAgIGludCAgICAgICAgICAgICAgICAgbU1heFJldHJpZXMgPSAxOwogICAgIGludCAgICAgICAgICAgICAgICAgbU9wZW5EZWxheU1pbGxpcyA9IDA7CisgICAgYm9vbCAgICAgICAgICAgICAgICBtQ2xvc2VFbmFibGVkID0gdHJ1ZTsKIH07CiAKIC8vIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZmlsbHMgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIuCkBAIC0zMTksMTEgKzMzMywxMyBAQAogfQogCiBzdGF0aWMgdm9pZCBzX3VzYWdlKCkgewotICAgIHByaW50ZigidGVzdF9zdGVhbF9leGNsdXNpdmUgWy1pXSBbLXJ7bWF4UmV0cmllc31dIFstZHtkZWxheX1dIC1zXG4iKTsKKyAgICBwcmludGYoInRlc3Rfc3RlYWxfZXhjbHVzaXZlIFstaV0gWy1ye21heFJldHJpZXN9XSBbLWR7ZGVsYXl9XSBbLXB7cGF1c2VkVGltZX1dLXMgLWN7ZmxhZ31cbiIpOwogICAgIHByaW50ZigiICAgICAtaSBkaXJlY3Rpb24gSU5QVVQsIG90aGVyd2lzZSBPVVRQVVRcbiIpOwotICAgIHByaW50ZigiICAgICAtZCBkZWxheSBvcGVuIGJ5IG1pbGxpc2Vjb25kcywgZGVmYXVsdCA9IDBcbiIpOwotICAgIHByaW50ZigiICAgICAtciBtYXggcmV0cmllcyBpbiB0aGUgZXJyb3IgY2FsbGJhY2ssIGRlZmF1bHQgPSAxXG4iKTsKKyAgICBwcmludGYoIiAgICAgLWQgRGVsYXkgb3BlbiBieSBtaWxsaXNlY29uZHMsIGRlZmF1bHQgPSAwXG4iKTsKKyAgICBwcmludGYoIiAgICAgLXAgUGF1c2UgZmlyc3Qgc3RyZWFtIHRoZW4gc2xlZXAgZm9yIG1zZWMgYmVmb3JlIG9wZW5pbmcgc2Vjb25kIHN0cmVhbXMsIGRlZmF1bHQgPSAwXG4iKTsKKyAgICBwcmludGYoIiAgICAgLXIgbWF4IFJldHJpZXMgaW4gdGhlIGVycm9yIGNhbGxiYWNrLCBkZWZhdWx0ID0gMVxuIik7CiAgICAgcHJpbnRmKCIgICAgIC1zIHRyeSB0byBvcGVuIGluIFNIQVJFRCBtb2RlXG4iKTsKKyAgICBwcmludGYoIiAgICAgLWMgZW5hYmxlIG9yIGRpc2FibGluZyBDbG9zaW5nIG9mIHRoZSBzdHJlYW0gd2l0aCAwLzEsIGRlZmF1bHQgPSAxXG4iKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikgewpAQCAtMzM0LDcgKzM1MCw5IEBACiAgICAgaW50IGVycm9yQ291bnQgPSAwOwogICAgIGludCBtYXhSZXRyaWVzID0gMTsKICAgICBpbnQgb3BlbkRlbGF5TWlsbGlzID0gMDsKKyAgICBib29sIGNsb3NlRW5hYmxlZCA9IHRydWU7CiAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHJlcXVlc3RlZFNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgaW50IHBhdXNlZE1pbGxpcyA9IDA7CiAKICAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KQEAgLTM0OCwxMiArMzY2LDE4IEBACiAgICAgICAgIGlmIChhcmdbMF0gPT0gJy0nKSB7CiAgICAgICAgICAgICBjaGFyIG9wdGlvbiA9IGFyZ1sxXTsKICAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICAgICAgICAgIGNsb3NlRW5hYmxlZCA9IGF0b2koJmFyZ1syXSkgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgICAgICAgIG9wZW5EZWxheU1pbGxpcyA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgJ2knOgogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBBQVVESU9fRElSRUNUSU9OX0lOUFVUOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgICAgICAgICAgcGF1c2VkTWlsbGlzID0gYXRvaSgmYXJnWzJdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAncic6CiAgICAgICAgICAgICAgICAgICAgIG1heFJldHJpZXMgPSBhdG9pKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTM3Niw2ICs0MDAsOCBAQAogICAgIHRoaWVmLnNldE9wZW5EZWxheU1pbGxpcyhvcGVuRGVsYXlNaWxsaXMpOwogICAgIHZpY3RpbS5zZXRNYXhSZXRyaWVzKG1heFJldHJpZXMpOwogICAgIHRoaWVmLnNldE1heFJldHJpZXMobWF4UmV0cmllcyk7CisgICAgdmljdGltLnNldENsb3NlRW5hYmxlZChjbG9zZUVuYWJsZWQpOworICAgIHRoaWVmLnNldENsb3NlRW5hYmxlZChjbG9zZUVuYWJsZWQpOwogCiAgICAgcmVzdWx0ID0gdmljdGltLm9wZW5BdWRpb1N0cmVhbShkaXJlY3Rpb24sIHJlcXVlc3RlZFNoYXJpbmdNb2RlKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewpAQCAtNDE0LDYgKzQ0MCwxMiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKHBhdXNlZE1pbGxpcyA+IDApIHsKKyAgICAgICAgcHJpbnRmKCJQYXVzaW5nIHRoZSBWSUNUSU0gZm9yICVkIG1pbGxpcyBiZWZvcmUgc3RhcnRpbmcgVEhJRUYgLS0tLS1cbiIsIHBhdXNlZE1pbGxpcyk7CisgICAgICAgIHZpY3RpbS5wYXVzZSgpOworICAgICAgICB1c2xlZXAocGF1c2VkTWlsbGlzICogMTAwMCk7CisgICAgfQorCiAgICAgcHJpbnRmKCJUcnlpbmcgdG8gc3RhcnQgdGhlIFRISUVGIHN0cmVhbSwgd2hpY2ggbWF5IHN0ZWFsIHRoZSBWSUNUSU0gTU1BUCByZXNvdXJjZSAtLS0tLVxuIik7CiAgICAgcmVzdWx0ID0gdGhpZWYub3BlbkF1ZGlvU3RyZWFtKGRpcmVjdGlvbiwgcmVxdWVzdGVkU2hhcmluZ01vZGUpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CkBAIC00MjksNiArNDYxLDI1IEBACiAgICAgICAgIGVycm9yQ291bnQrKzsKICAgICB9CiAKKyAgICBpZiAocGF1c2VkTWlsbGlzID4gMCkgeworICAgICAgICByZXN1bHQgPSB2aWN0aW0uc3RhcnQoKTsKKyAgICAgICAgcHJpbnRmKCJSZXN0YXJ0aW5nIFZJQ1RJTSwgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChWSUNUSU0pIHJldHVybmVkICVkICIKKyAgICAgICAgICAgICAgICI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+XG4iLCByZXN1bHQpOworICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzdHJlYW0gaXMgZGlzY29ubmVjdGVkIGR1ZSB0byB0aGllZiBzdGVhbCB0aGUgcmVzb3VyY2UKKyAgICAgICAgICAgIHByaW50ZigiVklDVElNIHdhcyBkaXNjb25uZWN0ZWQgd2hpbGUgaGFuZ2luZyBhcyB0aGUgVEhJRUYgIgorICAgICAgICAgICAgICAgICAgICJzdG9sZSB0aGUgcmVzb3VyY2UgPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuIik7CisgICAgICAgICAgICByZXN1bHQgPSB2aWN0aW0ucmVzdGFydFN0cmVhbSgpOworICAgICAgICAgICAgcHJpbnRmKCJSZXN0YXJ0aW5nIFZJQ1RJTSwgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChWSUNUSU0pIHJldHVybmVkICVkICIKKyAgICAgICAgICAgICAgICAgICAiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuIiwgcmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyb3JDb3VudCsrOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gR2l2ZSBzdHJlYW0gdGltZSB0byBhZHZhbmNlLgogICAgIHVzbGVlcChTTEVFUF9EVVJBVElPTl9NU0VDICogMTAwMCk7CiAKQEAgLTQ0Miw3ICs0OTMsNyBAQAogICAgIH0KIAogICAgIExPR0koIkJvdGggc3RyZWFtcyBydW5uaW5nLiBBc2sgdXNlciB0byBwbHVnIGluIGhlYWRzZXQuID09PT0iKTsKLSAgICBwcmludGYoIlxuPT09PVxuUGxlYXNlIFBMVUcgSU4gQSBIRUFEU0VUIG5vdyFcbj09PT1cblxuIik7CisgICAgcHJpbnRmKCJcbj09PT1cblBsZWFzZSBQTFVHIElOIEEgSEVBRFNFVCBub3chIC0gT1BUSU9OQUxcbj09PT1cblxuIik7CiAKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewogICAgICAgICBjb25zdCBpbnQgd2F0Y2hMb29wcyA9IERVRVRfRFVSQVRJT05fTVNFQyAvIFNMRUVQX0RVUkFUSU9OX01TRUM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF92YXJpb3VzLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3ZhcmlvdXMuY3BwCmluZGV4IGNiZjg2M2YuLmI2OGZjN2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3ZhcmlvdXMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3ZhcmlvdXMuY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRocmVhZD4KIAogLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdGhpbmcuCiBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBOb29wRGF0YUNhbGxiYWNrUHJvYygKQEAgLTUxLDYgKzUyLDcgQEAKIH0KIAogY29uc3RleHByIGludDY0X3QgTkFOT1NfUEVSX01JTExJU0VDT05EID0gMTAwMCAqIDEwMDA7Citjb25zdGV4cHIgaW50NjRfdCBNSUNST1NfUEVSX01JTExJU0VDT05EID0gMTAwMDsKIAogdm9pZCBjaGVja1JlbGVhc2VUaGVuQ2xvc2UoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSwKICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlLApAQCAtNzYyLDYgKzc2NCw1OCBAQAogICAgIGNoZWNrQ2FsbGJhY2tPbmNlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZKTsKIH0KIAordm9pZCB3YWl0Rm9yU3RhdGVDaGFuZ2VUb0Nsb3NpbmdvckNsb3NlZChBQXVkaW9TdHJlYW0gKipzdHJlYW0sIHN0ZDo6YXRvbWljPGJvb2w+KiBpc1JlYWR5KQoreworICAgICppc1JlYWR5ID0gdHJ1ZTsKKyAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOS05PV047CisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZSgqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOLCAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMCAqIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCkpOworICAgIGlmICgoc3RhdGUgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HKSAmJiAoc3RhdGUgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpKXsKKyAgICAgICAgRkFJTCgpIDw8ICJFUlJPUiAtIFN0YXRlIG5vdCBjbG9zaW5nIG9yIGNsb3NlZC4gQ3VycmVudCBzdGF0ZTogIiA8PAorICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoc3RhdGUpOworICAgIH0KK30KKwordm9pZCB0ZXN0V2FpdEZvclN0YXRlQ2hhbmdlQ2xvc2UoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkgeworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIgPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKKworICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZhYXVkaW9CdWlsZGVyKSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoYWF1ZGlvQnVpbGRlciwgcGVyZk1vZGUpOworICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLCAmYWF1ZGlvU3RyZWFtKSk7CisKKyAgICAvLyBWZXJpZnkgT3BlbiBTdGF0ZQorICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5LTk9XTjsKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKGFhdWRpb1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfVU5LTk9XTiwgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCAqIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCkpOworICAgIEVYUEVDVF9FUShBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4sIHN0YXRlKTsKKworICAgIHN0ZDo6YXRvbWljPGJvb2w+IGlzV2FpdFRocmVhZFJlYWR5e2ZhbHNlfTsKKworICAgIC8vIFNwYXduIGEgbmV3IHRocmVhZCB0byB3YWl0IGZvciB0aGUgc3RhdGUgY2hhbmdlCisgICAgc3RkOjp0aHJlYWQgd2FpdFRocmVhZCAod2FpdEZvclN0YXRlQ2hhbmdlVG9DbG9zaW5nb3JDbG9zZWQsICZhYXVkaW9TdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzV2FpdFRocmVhZFJlYWR5KTsKKworICAgIC8vIFdhaXQgZm9yIHdvcmtlciB0aHJlYWQgdG8gYmUgcmVhZHkKKyAgICB3aGlsZSAoIWlzV2FpdFRocmVhZFJlYWR5KSB7CisgICAgICAgIHVzbGVlcChNSUNST1NfUEVSX01JTExJU0VDT05EKTsKKyAgICB9CisgICAgLy8gU2xlZXAgYW4gYWRkaXRpb25hbCBtaWxsaXNlY29uZCB0byBtYWtlIHN1cmUgd2FpdEZvckF1ZGlvVGhyZWFkIGlzIGNhbGxlZAorICAgIHVzbGVlcChNSUNST1NfUEVSX01JTExJU0VDT05EKTsKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKSk7CisgICAgd2FpdFRocmVhZC5qb2luKCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCB3YWl0X2Zvcl9zdGF0ZV9jaGFuZ2VfY2xvc2Vfbm9uZSkgeworICAgIHRlc3RXYWl0Rm9yU3RhdGVDaGFuZ2VDbG9zZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIHdhaXRfZm9yX3N0YXRlX2NoYW5nZV9jbG9zZV9sb3dsYXQpIHsKKyAgICB0ZXN0V2FpdEZvclN0YXRlQ2hhbmdlQ2xvc2UoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOworfQorCiAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIHN0cnVjdCBXYWtlVXBDYWxsYmFja0RhdGEgewogICAgIHZvaWQgd2FrZU90aGVyKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQWlkbENvbnZlcnNpb24uY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQWlkbENvbnZlcnNpb24uY3BwCmluZGV4IDMyMWU3ZjkuLjExNzI0ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FpZGxDb252ZXJzaW9uLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BaWRsQ29udmVyc2lvbi5jcHAKQEAgLTE0LDYgKzE0LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNkZWZpbmUgTE9HX1RBRyAiQWlkbENvbnZlcnNpb24iCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0yMSw2ICsyNiw3IEBACiAjaW5jbHVkZSAibWVkaWEvQWlkbENvbnZlcnNpb24uaCIKIAogI2luY2x1ZGUgPG1lZGlhL1NobWVtQ29tcGF0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gVXRpbGl0aWVzCkBAIC0yOCw2ICszNCw0MCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB1c2luZyBiYXNlOjp1bmV4cGVjdGVkOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ2hhbm5lbExheW91dDsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZzsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZ0Jhc2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db250ZW50VHlwZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZUFkZHJlc3M7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VEZXNjcmlwdGlvbjsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZVR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9FbmNhcHN1bGF0aW9uVHlwZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0VHlwZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW47Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluQ29uZmlnOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2Fpbk1vZGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9JbnB1dEZsYWdzOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvSW9GbGFnczsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01vZGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9PZmZsb2FkSW5mbzsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb091dHB1dEZsYWdzOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydERldmljZUV4dDsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRFeHQ7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0TWl4RXh0OwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydE1peEV4dFVzZUNhc2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU291cmNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU3RhbmRhcmQ7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdHJlYW1UeXBlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvVXNhZ2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9VdWlkOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkV4dHJhQXVkaW9EZXNjcmlwdG9yOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkludDsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpQY21UeXBlOwogCiBuYW1lc3BhY2UgewogCkBAIC0yMTksNzUgKzI1OSw3IEBACiAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKGxlZ2FjeS5jX3N0cigpKTsKIH0KIAotLy8gVGhlIGxlZ2FjeSBlbnVtIGlzIHVubmFtZWQuIFRodXMsIHdlIHVzZSBpbnQzMl90LgotQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdUeXBlX2ludDMyX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlIGFpZGwpIHsKLSAgICBzd2l0Y2ggKGFpZGwpIHsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6U0FNUExFX1JBVEU6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEU7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkNIQU5ORUxfTUFTSzoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0s7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkZPUk1BVDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQ7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkdBSU46Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9DT05GSUdfR0FJTjsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6RkxBR1M6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7Ci0gICAgfQotICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Ci19Ci0KLS8vIFRoZSBsZWdhY3kgZW51bSBpcyB1bm5hbWVkLiBUaHVzLCB3ZSB1c2UgaW50MzJfdC4KLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU+IGxlZ2FjeTJhaWRsX2ludDMyX3RfQXVkaW9Qb3J0Q29uZmlnVHlwZSgKLSAgICAgICAgaW50MzJfdCBsZWdhY3kpIHsKLSAgICBzd2l0Y2ggKGxlZ2FjeSkgewotICAgICAgICBjYXNlIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpTQU1QTEVfUkFURTsKLSAgICAgICAgY2FzZSBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0s6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkNIQU5ORUxfTUFTSzsKLSAgICAgICAgY2FzZSBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkZPUk1BVDsKLSAgICAgICAgY2FzZSBBVURJT19QT1JUX0NPTkZJR19HQUlOOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpHQUlOOwotICAgICAgICBjYXNlIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpGTEFHUzsKLSAgICB9Ci0gICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKLX0KLQotQ29udmVyc2lvblJlc3VsdDx1bnNpZ25lZCBpbnQ+IGFpZGwybGVnYWN5X2ludDMyX3RfY29uZmlnX21hc2soaW50MzJfdCBhaWRsKSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPHVuc2lnbmVkIGludCwgaW50MzJfdCwgaW50LCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZT4oCi0gICAgICAgICAgICBhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdUeXBlX2ludDMyX3QsCi0gICAgICAgICAgICAvLyBBdWRpb1BvcnRDb25maWdUeXBlIGVudW0gaXMgaW5kZXgtYmFzZWQuCi0gICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZT4sCi0gICAgICAgICAgICAvLyBBVURJT19QT1JUX0NPTkZJR18qIGZsYWdzIGFyZSBtYXNrLWJhc2VkLgotICAgICAgICAgICAgZW51bVRvTWFza19iaXRtYXNrPHVuc2lnbmVkIGludCwgaW50Pik7Ci19Ci0KLUNvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfY29uZmlnX21hc2tfaW50MzJfdCh1bnNpZ25lZCBpbnQgbGVnYWN5KSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGludDMyX3QsIHVuc2lnbmVkIGludCwgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGUsIGludD4oCi0gICAgICAgICAgICBsZWdhY3ksIGxlZ2FjeTJhaWRsX2ludDMyX3RfQXVkaW9Qb3J0Q29uZmlnVHlwZSwKLSAgICAgICAgICAgIC8vIEFVRElPX1BPUlRfQ09ORklHXyogZmxhZ3MgYXJlIG1hc2stYmFzZWQuCi0gICAgICAgICAgICBpbmRleFRvRW51bV9iaXRtYXNrPHVuc2lnbmVkPiwKLSAgICAgICAgICAgIC8vIEF1ZGlvUG9ydENvbmZpZ1R5cGUgZW51bSBpcyBpbmRleC1iYXNlZC4KLSAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU+KTsKLX0KLQotQ29udmVyc2lvblJlc3VsdDxhdWRpb19jaGFubmVsX21hc2tfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdChpbnQzMl90IGFpZGwpIHsKLSAgICAvLyBUT0RPKHl0YWkpOiBzaG91bGQgd2UgY29udmVydCBiaXQtYnktYml0PwotICAgIC8vIE9uZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCB0aGUgcmVwcmVzZW50YXRpb24gaXMgYm90aCBvcGFxdWUgYW5kIGlzIGRpZmZlcmVudCBiYXNlZCBvbiB0aGUKLSAgICAvLyBjb250ZXh0IChpbnB1dCB2cy4gb3V0cHV0KS4gQ2FuIGRldGVybWluZSBiYXNlZCBvbiB0eXBlIGFuZCByb2xlLCBhcyBwZXIgdXNlSW5DaGFubmVsTWFzaygpLgotICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KGFpZGwpOwotfQotCi1Db252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QoYXVkaW9fY2hhbm5lbF9tYXNrX3QgbGVnYWN5KSB7Ci0gICAgLy8gVE9ETyh5dGFpKTogc2hvdWxkIHdlIGNvbnZlcnQgYml0LWJ5LWJpdD8KLSAgICAvLyBPbmUgcHJvYmxlbSBoZXJlIGlzIHRoYXQgdGhlIHJlcHJlc2VudGF0aW9uIGlzIGJvdGggb3BhcXVlIGFuZCBpcyBkaWZmZXJlbnQgYmFzZWQgb24gdGhlCi0gICAgLy8gY29udGV4dCAoaW5wdXQgdnMuIG91dHB1dCkuIENhbiBkZXRlcm1pbmUgYmFzZWQgb24gdHlwZSBhbmQgcm9sZSwgYXMgcGVyIHVzZUluQ2hhbm5lbE1hc2soKS4KLSAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7Ci19Ci0KLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW9fY29uZmlnX2V2ZW50PiBhaWRsMmxlZ2FjeV9BdWRpb0lvQ29uZmlnRXZlbnRfYXVkaW9faW9fY29uZmlnX2V2ZW50KAorQ29udmVyc2lvblJlc3VsdDxhdWRpb19pb19jb25maWdfZXZlbnRfdD4gYWlkbDJsZWdhY3lfQXVkaW9Jb0NvbmZpZ0V2ZW50X2F1ZGlvX2lvX2NvbmZpZ19ldmVudF90KAogICAgICAgICBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50IGFpZGwpIHsKICAgICBzd2l0Y2ggKGFpZGwpIHsKICAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50OjpPVVRQVVRfUkVHSVNURVJFRDoKQEAgLTMxMiw4ICsyODQsOCBAQAogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudD4gbGVnYWN5MmFpZGxfYXVkaW9faW9fY29uZmlnX2V2ZW50X0F1ZGlvSW9Db25maWdFdmVudCgKLSAgICAgICAgYXVkaW9faW9fY29uZmlnX2V2ZW50IGxlZ2FjeSkgeworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50PiBsZWdhY3kyYWlkbF9hdWRpb19pb19jb25maWdfZXZlbnRfdF9BdWRpb0lvQ29uZmlnRXZlbnQoCisgICAgICAgIGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGxlZ2FjeSkgewogICAgIHN3aXRjaCAobGVnYWN5KSB7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQ6CiAgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudDo6T1VUUFVUX1JFR0lTVEVSRUQ7CkBAIC0zOTMsODEgKzM2NSwxMDI5IEBACiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19mb3JtYXRfdD4gYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoCi0gICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBhaWRsKSB7Ci0gICAgLy8gVGhpcyByZWxpZXMgb24gQXVkaW9Gb3JtYXQgYmVpbmcga2VwdCBpbiBzeW5jIHdpdGggYXVkaW9fZm9ybWF0X3QuCi0gICAgc3RhdGljX2Fzc2VydChzaXplb2YobWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0KSA9PSBzaXplb2YoYXVkaW9fZm9ybWF0X3QpKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGFpZGwpOworbmFtZXNwYWNlIHsKKworbmFtZXNwYWNlIGRldGFpbCB7Cit1c2luZyBBdWRpb0NoYW5uZWxCaXRQYWlyID0gc3RkOjpwYWlyPGF1ZGlvX2NoYW5uZWxfbWFza190LCBpbnQ+OwordXNpbmcgQXVkaW9DaGFubmVsQml0UGFpcnMgPSBzdGQ6OnZlY3RvcjxBdWRpb0NoYW5uZWxCaXRQYWlyPjsKK3VzaW5nIEF1ZGlvQ2hhbm5lbFBhaXIgPSBzdGQ6OnBhaXI8YXVkaW9fY2hhbm5lbF9tYXNrX3QsIEF1ZGlvQ2hhbm5lbExheW91dD47Cit1c2luZyBBdWRpb0NoYW5uZWxQYWlycyA9IHN0ZDo6dmVjdG9yPEF1ZGlvQ2hhbm5lbFBhaXI+OwordXNpbmcgQXVkaW9EZXZpY2VQYWlyID0gc3RkOjpwYWlyPGF1ZGlvX2RldmljZXNfdCwgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbj47Cit1c2luZyBBdWRpb0RldmljZVBhaXJzID0gc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2VQYWlyPjsKK3VzaW5nIEF1ZGlvRm9ybWF0UGFpciA9IHN0ZDo6cGFpcjxhdWRpb19mb3JtYXRfdCwgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbj47Cit1c2luZyBBdWRpb0Zvcm1hdFBhaXJzID0gc3RkOjp2ZWN0b3I8QXVkaW9Gb3JtYXRQYWlyPjsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+IGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KAorY29uc3QgZGV0YWlsOjpBdWRpb0NoYW5uZWxCaXRQYWlycyYgZ2V0SW5BdWRpb0NoYW5uZWxCaXRzKCkgeworICAgIHN0YXRpYyBjb25zdCBkZXRhaWw6OkF1ZGlvQ2hhbm5lbEJpdFBhaXJzIHBhaXJzID0geworICAgICAgICB7IEFVRElPX0NIQU5ORUxfSU5fTEVGVCwgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX0ZST05UX0xFRlQgfSwKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX0lOX1JJR0hULCBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfRlJPTlRfUklHSFQgfSwKKyAgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9JTl9GUk9OVCBpcyBhdCB0aGUgZW5kCisgICAgICAgIHsgQVVESU9fQ0hBTk5FTF9JTl9CQUNLLCBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfQkFDS19DRU5URVIgfSwKKyAgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9JTl8qX1BST0NFU1NFRCBub3Qgc3VwcG9ydGVkCisgICAgICAgIC8vIEFVRElPX0NIQU5ORUxfSU5fUFJFU1NVUkUgbm90IHN1cHBvcnRlZAorICAgICAgICAvLyBBVURJT19DSEFOTkVMX0lOXypfQVhJUyBub3Qgc3VwcG9ydGVkCisgICAgICAgIC8vIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfKiBub3Qgc3VwcG9ydGVkCisgICAgICAgIHsgQVVESU9fQ0hBTk5FTF9JTl9CQUNLX0xFRlQsIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9CQUNLX0xFRlQgfSwKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX0lOX0JBQ0tfUklHSFQsIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9CQUNLX1JJR0hUIH0sCisgICAgICAgIHsgQVVESU9fQ0hBTk5FTF9JTl9DRU5URVIsIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9GUk9OVF9DRU5URVIgfSwKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX0lOX0xPV19GUkVRVUVOQ1ksIEF1ZGlvQ2hhbm5lbExheW91dDo6Q0hBTk5FTF9MT1dfRlJFUVVFTkNZIH0sCisgICAgICAgIHsgQVVESU9fQ0hBTk5FTF9JTl9UT1BfTEVGVCwgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX1RPUF9TSURFX0xFRlQgfSwKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX0lOX1RPUF9SSUdIVCwgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX1RPUF9TSURFX1JJR0hUIH0sCisgICAgICAgIC8vIFdoZW4gZ29pbmcgZnJvbSBhaWRsIHRvIGxlZ2FjeSwgSU5fQ0VOVEVSIGlzIHVzZWQKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX0lOX0ZST05ULCBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfRlJPTlRfQ0VOVEVSIH0KKyAgICB9OworICAgIHJldHVybiBwYWlyczsKK30KKworY29uc3QgZGV0YWlsOjpBdWRpb0NoYW5uZWxQYWlycyYgZ2V0SW5BdWRpb0NoYW5uZWxQYWlycygpIHsKKyAgICBzdGF0aWMgY29uc3QgZGV0YWlsOjpBdWRpb0NoYW5uZWxQYWlycyBwYWlycyA9IHsKKyNkZWZpbmUgREVGSU5FX0lOUFVUX0xBWU9VVChuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fIyNuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQ6Om1ha2U8QXVkaW9DaGFubmVsTGF5b3V0OjpUYWc6OmxheW91dE1hc2s+KCBcCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQ6OkxBWU9VVF8jI24pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfQorCisgICAgICAgIERFRklORV9JTlBVVF9MQVlPVVQoTU9OTyksCisgICAgICAgIERFRklORV9JTlBVVF9MQVlPVVQoU1RFUkVPKSwKKyAgICAgICAgREVGSU5FX0lOUFVUX0xBWU9VVChGUk9OVF9CQUNLKSwKKyAgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9JTl82IG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgREVGSU5FX0lOUFVUX0xBWU9VVCgyUE9JTlQwUE9JTlQyKSwKKyAgICAgICAgREVGSU5FX0lOUFVUX0xBWU9VVCgyUE9JTlQxUE9JTlQyKSwKKyAgICAgICAgREVGSU5FX0lOUFVUX0xBWU9VVCgzUE9JTlQwUE9JTlQyKSwKKyAgICAgICAgREVGSU5FX0lOUFVUX0xBWU9VVCgzUE9JTlQxUE9JTlQyKSwKKyAgICAgICAgREVGSU5FX0lOUFVUX0xBWU9VVCg1UE9JTlQxKQorI3VuZGVmIERFRklORV9JTlBVVF9MQVlPVVQKKyAgICB9OworICAgIHJldHVybiBwYWlyczsKK30KKworY29uc3QgZGV0YWlsOjpBdWRpb0NoYW5uZWxCaXRQYWlycyYgZ2V0T3V0QXVkaW9DaGFubmVsQml0cygpIHsKKyAgICBzdGF0aWMgY29uc3QgZGV0YWlsOjpBdWRpb0NoYW5uZWxCaXRQYWlycyBwYWlycyA9IHsKKyNkZWZpbmUgREVGSU5FX09VVFBVVF9CSVRTKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7IEFVRElPX0NIQU5ORUxfT1VUXyMjbiwgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMXyMjbiB9CisKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKEZST05UX0xFRlQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoRlJPTlRfUklHSFQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoRlJPTlRfQ0VOVEVSKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKExPV19GUkVRVUVOQ1kpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoQkFDS19MRUZUKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKEJBQ0tfUklHSFQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoRlJPTlRfTEVGVF9PRl9DRU5URVIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoRlJPTlRfUklHSFRfT0ZfQ0VOVEVSKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKEJBQ0tfQ0VOVEVSKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKFNJREVfTEVGVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhTSURFX1JJR0hUKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKFRPUF9DRU5URVIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoVE9QX0ZST05UX0xFRlQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoVE9QX0ZST05UX0NFTlRFUiksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhUT1BfRlJPTlRfUklHSFQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoVE9QX0JBQ0tfTEVGVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhUT1BfQkFDS19DRU5URVIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoVE9QX0JBQ0tfUklHSFQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoVE9QX1NJREVfTEVGVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhUT1BfU0lERV9SSUdIVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhCT1RUT01fRlJPTlRfTEVGVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhCT1RUT01fRlJPTlRfQ0VOVEVSKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKEJPVFRPTV9GUk9OVF9SSUdIVCksCisgICAgICAgIERFRklORV9PVVRQVVRfQklUUyhMT1dfRlJFUVVFTkNZXzIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0JJVFMoRlJPTlRfV0lERV9MRUZUKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9CSVRTKEZST05UX1dJREVfUklHSFQpLAorI3VuZGVmIERFRklORV9PVVRQVVRfQklUUworICAgICAgICB7IEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19BLCBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfSEFQVElDX0EgfSwKKyAgICAgICAgeyBBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQiwgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX0hBUFRJQ19CIH0KKyAgICB9OworICAgIHJldHVybiBwYWlyczsKK30KKworY29uc3QgZGV0YWlsOjpBdWRpb0NoYW5uZWxQYWlycyYgZ2V0T3V0QXVkaW9DaGFubmVsUGFpcnMoKSB7CisgICAgc3RhdGljIGNvbnN0IGRldGFpbDo6QXVkaW9DaGFubmVsUGFpcnMgcGFpcnMgPSB7CisjZGVmaW5lIERFRklORV9PVVRQVVRfTEFZT1VUKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF8jI24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPEF1ZGlvQ2hhbm5lbExheW91dDo6VGFnOjpsYXlvdXRNYXNrPiggXAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0OjpMQVlPVVRfIyNuKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0KKworICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChNT05PKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoU1RFUkVPKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoMlBPSU5UMSksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKFRSSSksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKFRSSV9CQUNLKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoM1BPSU5UMSksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKDJQT0lOVDBQT0lOVDIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCgyUE9JTlQxUE9JTlQyKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoM1BPSU5UMFBPSU5UMiksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKDNQT0lOVDFQT0lOVDIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChRVUFEKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoUVVBRF9TSURFKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoU1VSUk9VTkQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChQRU5UQSksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKDVQT0lOVDEpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCg1UE9JTlQxX1NJREUpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCg1UE9JTlQxUE9JTlQyKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoNVBPSU5UMVBPSU5UNCksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKDZQT0lOVDEpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCg3UE9JTlQxKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoN1BPSU5UMVBPSU5UMiksCisgICAgICAgIERFRklORV9PVVRQVVRfTEFZT1VUKDdQT0lOVDFQT0lOVDQpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVCgxM1BPSU5UXzM2MFJBKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoMjJQT0lOVDIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChNT05PX0hBUFRJQ19BKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoU1RFUkVPX0hBUFRJQ19BKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoSEFQVElDX0FCKSwKKyAgICAgICAgREVGSU5FX09VVFBVVF9MQVlPVVQoTU9OT19IQVBUSUNfQUIpLAorICAgICAgICBERUZJTkVfT1VUUFVUX0xBWU9VVChTVEVSRU9fSEFQVElDX0FCKQorI3VuZGVmIERFRklORV9PVVRQVVRfTEFZT1VUCisgICAgfTsKKyAgICByZXR1cm4gcGFpcnM7Cit9CisKK2NvbnN0IGRldGFpbDo6QXVkaW9DaGFubmVsUGFpcnMmIGdldFZvaWNlQXVkaW9DaGFubmVsUGFpcnMoKSB7CisgICAgc3RhdGljIGNvbnN0IGRldGFpbDo6QXVkaW9DaGFubmVsUGFpcnMgcGFpcnMgPSB7CisjZGVmaW5lIERFRklORV9WT0lDRV9MQVlPVVQobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX1ZPSUNFXyMjbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPEF1ZGlvQ2hhbm5lbExheW91dDo6VGFnOjp2b2ljZU1hc2s+KCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0OjpWT0lDRV8jI24pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0KKyAgICAgICAgREVGSU5FX1ZPSUNFX0xBWU9VVChVUExJTktfTU9OTyksCisgICAgICAgIERFRklORV9WT0lDRV9MQVlPVVQoRE5MSU5LX01PTk8pLAorICAgICAgICBERUZJTkVfVk9JQ0VfTEFZT1VUKENBTExfTU9OTykKKyN1bmRlZiBERUZJTkVfVk9JQ0VfTEFZT1VUCisgICAgfTsKKyAgICByZXR1cm4gcGFpcnM7Cit9CisKK0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24gbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKEF1ZGlvRGV2aWNlVHlwZSB0eXBlLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29ubmVjdGlvbiA9ICIiKSB7CisgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiByZXN1bHQ7CisgICAgcmVzdWx0LnR5cGUgPSB0eXBlOworICAgIHJlc3VsdC5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKGRldGFpbDo6QXVkaW9EZXZpY2VQYWlycyYgcGFpcnMsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbnB1dFR5cGUsIGF1ZGlvX2RldmljZXNfdCBvdXRwdXRUeXBlLAorICAgICAgICBBdWRpb0RldmljZVR5cGUgaW5UeXBlLCBBdWRpb0RldmljZVR5cGUgb3V0VHlwZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbm5lY3Rpb24gPSAiIikgeworICAgIHBhaXJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihpbnB1dFR5cGUsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihpblR5cGUsIGNvbm5lY3Rpb24pKSk7CisgICAgcGFpcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKG91dHB1dFR5cGUsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihvdXRUeXBlLCBjb25uZWN0aW9uKSkpOworfQorCitjb25zdCBkZXRhaWw6OkF1ZGlvRGV2aWNlUGFpcnMmIGdldEF1ZGlvRGV2aWNlUGFpcnMoKSB7CisgICAgc3RhdGljIGNvbnN0IGRldGFpbDo6QXVkaW9EZXZpY2VQYWlycyBwYWlycyA9IFtdKCkgeworICAgICAgICBkZXRhaWw6OkF1ZGlvRGV2aWNlUGFpcnMgcGFpcnMgPSB7eworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9OT05FLCBBdWRpb0RldmljZURlc2NyaXB0aW9ue30KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpPVVRfU1BFQUtFUl9FQVJQSUVDRSkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9TUEVBS0VSKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpPVVRfSEVBRFBIT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9BTkFMT0coKSkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9ERVZJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0JUX1NDTygpKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lULCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9DQVJLSVQsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0JUX1NDTygpKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0hFQURQSE9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQlRfQTJEUCgpKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX1NQRUFLRVIsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0JUX0EyRFAoKSkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX1RFTEVQSE9OWV9UWCkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9BVVhfTElORSwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpPVVRfTElORV9BVVgpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9TUEVBS0VSX1NBRkUpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0hFQVJJTkdfQUlELAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9XSVJFTEVTUygpKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0VDSE9fQ0FOQ0VMTEVSLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9FQ0hPX0NBTkNFTExFUikKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUiwgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpPVVRfU1BFQUtFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQlRfTEUoKSkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTEVfQlJPQURDQVNULCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6Ok9VVF9CUk9BRENBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0JUX0xFKCkpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgLy8gQVVESU9fREVWSUNFX0lOX0FNQklFTlQgYW5kIElOX0NPTU1VTklDQVRJT04gYXJlIHJlbW92ZWQgc2luY2UgdGhleSB3ZXJlIGRlcHJlY2F0ZWQuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDLCBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX01JQ1JPUEhPTkUpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQywgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9NSUNST1BIT05FX0JBQ0spCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fVEVMRVBIT05ZX1JYKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVFZfVFVORVIsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fVFZfVFVORVIpCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9MT09QQkFDSywgbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9MT09QQkFDSykKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9CTEUsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fREVWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9CVF9MRSgpKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fRUNIT19SRUZFUkVOQ0UsIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fRUNIT19SRUZFUkVOQ0UpCisgICAgICAgICAgICB9CisgICAgICAgIH19OworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fREVGQVVMVCwgQVVESU9fREVWSUNFX09VVF9ERUZBVUxULAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fREVGQVVMVCwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfREVGQVVMVCk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9IRUFEU0VULCBBdWRpb0RldmljZVR5cGU6Ok9VVF9IRUFEU0VULAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQU5BTE9HKCkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0hFQURTRVQsIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9CVF9TQ08oKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9IRE1JLCBBVURJT19ERVZJQ0VfT1VUX0hETUksCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9ERVZJQ0UsIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0RFVklDRSwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0hETUkoKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLCBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9TVUJNSVgsIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX1NVQk1JWCk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9BTkxHX0RPQ0tfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0RPQ0ssIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0RPQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9BTkFMT0coKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9ER1RMX0RPQ0tfSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0RPQ0ssIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0RPQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9VU0IoKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfQUNDRVNTT1JZLCBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlksCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9BQ0NFU1NPUlksIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0FDQ0VTU09SWSwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX1VTQigpKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRSwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0RFVklDRSwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfREVWSUNFLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fVVNCKCkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIsIEFVRElPX0RFVklDRV9PVVRfRk0sCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9GTV9UVU5FUiwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfRk0pOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fTElORSwgQVVESU9fREVWSUNFX09VVF9MSU5FLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fREVWSUNFLCBBdWRpb0RldmljZVR5cGU6Ok9VVF9ERVZJQ0UsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9BTkFMT0coKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9TUERJRiwgQVVESU9fREVWSUNFX09VVF9TUERJRiwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0RFVklDRSwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfREVWSUNFLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fU1BESUYoKSk7CisgICAgICAgIGFwcGVuZF9BdWRpb0RldmljZURlc2NyaXB0aW9uKHBhaXJzLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0RFVklDRSwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfREVWSUNFLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQlRfQTJEUCgpKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0lQLCBBVURJT19ERVZJQ0VfT1VUX0lQLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fREVWSUNFLCBBdWRpb0RldmljZVR5cGU6Ok9VVF9ERVZJQ0UsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9JUF9WNCgpKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVUywgQVVESU9fREVWSUNFX09VVF9CVVMsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9ERVZJQ0UsIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0RFVklDRSwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0JVUygpKTsKKyAgICAgICAgYXBwZW5kX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24ocGFpcnMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1BST1hZLCBBVURJT19ERVZJQ0VfT1VUX1BST1hZLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZTo6SU5fQUZFX1BST1hZLCBBdWRpb0RldmljZVR5cGU6Ok9VVF9BRkVfUFJPWFkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9IRUFEU0VULCBBdWRpb0RldmljZVR5cGU6Ok9VVF9IRUFEU0VULAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fVVNCKCkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fSERNSV9BUkMsIEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9ERVZJQ0UsIEF1ZGlvRGV2aWNlVHlwZTo6T1VUX0RFVklDRSwKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uOjpDT05ORUNUSU9OX0hETUlfQVJDKCkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fSERNSV9FQVJDLCBBVURJT19ERVZJQ0VfT1VUX0hETUlfRUFSQywKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGU6OklOX0RFVklDRSwgQXVkaW9EZXZpY2VUeXBlOjpPVVRfREVWSUNFLAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fSERNSV9FQVJDKCkpOworICAgICAgICBhcHBlbmRfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihwYWlycywKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlOjpJTl9IRUFEU0VULCBBdWRpb0RldmljZVR5cGU6Ok9VVF9IRUFEU0VULAorICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQlRfTEUoKSk7CisgICAgICAgIHJldHVybiBwYWlyczsKKyAgICB9KCk7CisgICAgcmV0dXJuIHBhaXJzOworfQorCitBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihBdWRpb0Zvcm1hdFR5cGUgdHlwZSkgeworICAgIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gcmVzdWx0OworICAgIHJlc3VsdC50eXBlID0gdHlwZTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlIHBjbSkgeworICAgIGF1dG8gcmVzdWx0ID0gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKEF1ZGlvRm9ybWF0VHlwZTo6UENNKTsKKyAgICByZXN1bHQucGNtID0gcGNtOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmNvZGluZykgeworICAgIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gcmVzdWx0OworICAgIHJlc3VsdC5lbmNvZGluZyA9IGVuY29kaW5nOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKFBjbVR5cGUgdHJhbnNwb3J0LAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZW5jb2RpbmcpIHsKKyAgICBhdXRvIHJlc3VsdCA9IG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihlbmNvZGluZyk7CisgICAgcmVzdWx0LnBjbSA9IHRyYW5zcG9ydDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitjb25zdCBkZXRhaWw6OkF1ZGlvRm9ybWF0UGFpcnMmIGdldEF1ZGlvRm9ybWF0UGFpcnMoKSB7CisgICAgc3RhdGljIGNvbnN0IGRldGFpbDo6QXVkaW9Gb3JtYXRQYWlycyBwYWlycyA9IHt7CisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElELAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKEF1ZGlvRm9ybWF0VHlwZTo6U1lTX1JFU0VSVkVEX0lOVkFMSUQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxULCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9ue30KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlOjpJTlRfMTZfQklUKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzhfQklULCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oUGNtVHlwZTo6VUlOVF84X0JJVCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlOjpJTlRfMzJfQklUKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzhfMjRfQklULCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oUGNtVHlwZTo6RklYRURfUV84XzI0KQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNX0ZMT0FULCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oUGNtVHlwZTo6RkxPQVRfMzJfQklUKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlOjpJTlRfMjRfQklUKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfTVAzLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FNUl9OQiwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FNUl9XQiwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19NUDQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTUFJTiwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19NQUlOKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xDLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xDKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX1NTUiwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19TU1IpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTFRQLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xUUCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMSwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19IRV9WMSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19TQ0FMQUJMRSwKKyAgICAgICAgICAgIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfU0NBTEFCTEUpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfRVJMQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19FUkxDKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xELCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xEKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YyLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0hFX1YyKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0VMRCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19FTEQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfWEhFLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX1hIRSkKKyAgICAgICAgfSwKKyAgICAgICAgLy8gQVVESU9fRk9STUFUX0hFX0FBQ19WMSBhbmQgSEVfQUFDX1YyIGFyZSByZW1vdmVkIHNpbmNlIHRoZXkgd2VyZSBkZXByZWNhdGVkIGxvbmcgdGltZQorICAgICAgICAvLyBhZ28uCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9WT1JCSVMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9PUFVTLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FDMykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0VfQUMzLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0VfQUMzX0pPQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRFRTLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRFRTKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRFRTX0hELCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRFRTX0hEKQorICAgICAgICB9LAorICAgICAgICAvLyBJbiB0aGUgZnV0dXJlLCB3ZSB3b3VsZCBsaWtlIHRvIHJlcHJlc2VudCBlbmNhcHN1bGF0ZWQgYml0c3RyZWFtcyBhcworICAgICAgICAvLyBuZXN0ZWQgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbnMuIFRoZSBsZWdhY3kgJ0FVRElPX0ZPUk1BVF9JRUM2MTkzNycgdHlwZSBkb2Vzbid0CisgICAgICAgIC8vIHNwZWNpZnkgdGhlIGZvcm1hdCBvZiB0aGUgZW5jYXBzdWxhdGVkIGJpdHN0cmVhbS4KKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0lFQzYxOTM3LAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKFBjbVR5cGU6OklOVF8xNl9CSVQsIE1FRElBX01JTUVUWVBFX0FVRElPX0lFQzYxOTM3KQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRE9MQllfVFJVRUhELAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0RPTEJZX1RSVUVIRCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0VWUkMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19FVlJDKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRVZSQ0IsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19FVlJDQikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0VWUkNXQiwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0VWUkNXQikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0VWUkNOVywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0VWUkNOVykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19BRElGLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FESUYpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9XTUEsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19XTUEpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9XTUFfUFJPLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImF1ZGlvL3gtbXMtd21hLnBybyIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BTVJfV0JfUExVUywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQl9QTFVTKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfTVAyLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX1FDRUxQLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFApCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9EU0QsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbigiYXVkaW8vdm5kLnNvbnkuZHNkIikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0ZMQUMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUxBQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BUEUsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbigiYXVkaW8veC1hcGUiKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0FEVFMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19BRFRTX01BSU4sCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfTUFJTikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19BRFRTX0xDLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfTEMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfQURUU19TU1IsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfU1NSKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0FEVFNfTFRQLAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0xUUCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19BRFRTX0hFX1YxLAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0hFX1YxKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0FEVFNfU0NBTEFCTEUsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfU0NBTEFCTEUpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfQURUU19FUkxDLAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0VSTEMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfQURUU19MRCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0xEKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0FEVFNfSEVfVjIsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfSEVfVjIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfQURUU19FTEQsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfRUxEKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0FEVFNfWEhFLAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX1hIRSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LiAidm5kLm9jdGVsLnNiYyIgaXMgbm90IEJUIFNCQy4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9TQkMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbigiYXVkaW8veC1zYmMiKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQVBUWCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FQVFgpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BUFRYX0hELCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImF1ZGlvL3ZuZC5xY29tLmFwdHguaGQiKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUM0LCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCisgICAgICAgICAgICBBVURJT19GT1JNQVRfTERBQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKCJhdWRpby92bmQuc29ueS5sZGFjIikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX01BVCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0RPTEJZX01BVCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorICAgICAgICAgICAgQVVESU9fRk9STUFUX01BVF8xXzAsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfTUFUICsgc3RkOjpzdHJpbmcoIi4xLjAiKSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorICAgICAgICAgICAgQVVESU9fRk9STUFUX01BVF8yXzAsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfTUFUICsgc3RkOjpzdHJpbmcoIi4yLjAiKSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorICAgICAgICAgICAgQVVESU9fRk9STUFUX01BVF8yXzEsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfTUFUICsgc3RkOjpzdHJpbmcoIi4yLjEiKSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19MQVRNLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xBVE1fTEMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTEFUTV9MQykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19MQVRNX0hFX1YxLAorICAgICAgICAgICAgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19MQVRNX0hFX1YxKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xBVE1fSEVfVjIsCisgICAgICAgICAgICBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xBVE1fSEVfVjIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9DRUxULCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImF1ZGlvL3gtY2VsdCIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BUFRYX0FEQVBUSVZFLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImF1ZGlvL3ZuZC5xY29tLmFwdHguYWRhcHRpdmUiKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCisgICAgICAgICAgICBBVURJT19GT1JNQVRfTEhEQywgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKCJhdWRpby92bmQuc2F2aXRlY2gubGhkYyIpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9MSERDX0xMLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImF1ZGlvL3ZuZC5zYXZpdGVjaC5saGRjLmxsIikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorICAgICAgICAgICAgQVVESU9fRk9STUFUX0FQVFhfVFdTUCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKCJhdWRpby92bmQucWNvbS5hcHR4LnR3c3AiKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCisgICAgICAgICAgICBBVURJT19GT1JNQVRfTEMzLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oImF1ZGlvL3gtbGMzIikKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX01QRUdILCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTUhNMSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX01QRUdIX0JMX0wzLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfQkxfTDMpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9NUEVHSF9CTF9MNCwgbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX0JMX0w0KQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfTVBFR0hfTENfTDMsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9MQ19MMykKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX01QRUdIX0xDX0w0LCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTENfTDQpCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JRUM2MDk1OCwKKyAgICAgICAgICAgIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlOjpJTlRfMjRfQklULCBNRURJQV9NSU1FVFlQRV9BVURJT19JRUM2MDk1OCkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgQVVESU9fRk9STUFUX0RUU19VSEQsIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihNRURJQV9NSU1FVFlQRV9BVURJT19EVFNfVUhEKQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICBBVURJT19GT1JNQVRfRFJBLCBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oTUVESUFfTUlNRVRZUEVfQVVESU9fRFJBKQorICAgICAgICB9LAorICAgIH19OworICAgIHJldHVybiBwYWlyczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgVD4KK3N0ZDo6dW5vcmRlcmVkX21hcDxTLCBUPiBtYWtlX0RpcmVjdE1hcChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8UywgVD4+JiB2KSB7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPFMsIFQ+IHJlc3VsdCh2LmJlZ2luKCksIHYuZW5kKCkpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0LnNpemUoKSAhPSB2LnNpemUoKSwgIkR1cGxpY2F0ZSBrZXkgZWxlbWVudHMgZGV0ZWN0ZWQiKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZSBUPgorc3RkOjp1bm9yZGVyZWRfbWFwPFMsIFQ+IG1ha2VfRGlyZWN0TWFwKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8UywgVD4+JiB2MSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFMsIFQ+PiYgdjIpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8UywgVD4gcmVzdWx0KHYxLmJlZ2luKCksIHYxLmVuZCgpKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdC5zaXplKCkgIT0gdjEuc2l6ZSgpLCAiRHVwbGljYXRlIGtleSBlbGVtZW50cyBkZXRlY3RlZCBpbiB2MSIpOworICAgIHJlc3VsdC5pbnNlcnQodjIuYmVnaW4oKSwgdjIuZW5kKCkpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0LnNpemUoKSAhPSB2MS5zaXplKCkgKyB2Mi5zaXplKCksCisgICAgICAgICAgICAiRHVwbGljYXRlIGtleSBlbGVtZW50cyBkZXRlY3RlZCBpbiB2MSt2MiIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lIFQ+CitzdGQ6OnVub3JkZXJlZF9tYXA8VCwgUz4gbWFrZV9SZXZlcnNlTWFwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxTLCBUPj4mIHYpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8VCwgUz4gcmVzdWx0OworICAgIHN0ZDo6dHJhbnNmb3JtKHYuYmVnaW4oKSwgdi5lbmQoKSwgc3RkOjppbnNlcnRlcihyZXN1bHQsIHJlc3VsdC5iZWdpbigpKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6cGFpcjxTLCBUPiYgcCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihwLnNlY29uZCwgcC5maXJzdCk7CisgICAgICAgICAgICB9KTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdC5zaXplKCkgIT0gdi5zaXplKCksICJEdXBsaWNhdGUga2V5IGVsZW1lbnRzIGRldGVjdGVkIik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2F1ZGlvX2NoYW5uZWxfbWFza190IGFpZGwybGVnYWN5X0F1ZGlvQ2hhbm5lbExheW91dF9sYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3RfYml0cygKKyAgICAgICAgaW50IGFpZGxMYXlvdXQsIGJvb2wgaXNJbnB1dCkgeworICAgIGF1dG8mIGJpdE1hcHBpbmcgPSBpc0lucHV0ID8gZ2V0SW5BdWRpb0NoYW5uZWxCaXRzKCkgOiBnZXRPdXRBdWRpb0NoYW5uZWxCaXRzKCk7CisgICAgY29uc3QgaW50IGFpZGxMYXlvdXRJbml0aWFsID0gYWlkbExheW91dDsgLy8gZm9yIGVycm9yIG1lc3NhZ2UKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBsZWdhY3kgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgZm9yIChjb25zdCBhdXRvJiBiaXRQYWlyIDogYml0TWFwcGluZykgeworICAgICAgICBpZiAoKGFpZGxMYXlvdXQgJiBiaXRQYWlyLnNlY29uZCkgPT0gYml0UGFpci5zZWNvbmQpIHsKKyAgICAgICAgICAgIGxlZ2FjeSA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihsZWdhY3kgfCBiaXRQYWlyLmZpcnN0KTsKKyAgICAgICAgICAgIGFpZGxMYXlvdXQgJj0gfmJpdFBhaXIuc2Vjb25kOworICAgICAgICAgICAgaWYgKGFpZGxMYXlvdXQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoIiVzOiBhaWRsIGxheW91dCAweCV4IGNvbnRhaW5zIGJpdHMgMHgleCB0aGF0IGhhdmUgbm8gbWF0Y2ggdG8gbGVnYWN5ICVzIGJpdHMiLAorICAgICAgICAgICAgX19mdW5jX18sIGFpZGxMYXlvdXRJbml0aWFsLCBhaWRsTGF5b3V0LCBpc0lucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiKTsKKyAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NoYW5uZWxfbWFza190PiBhaWRsMmxlZ2FjeV9BdWRpb0NoYW5uZWxMYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3QoCisgICAgICAgIGNvbnN0IEF1ZGlvQ2hhbm5lbExheW91dCYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CisgICAgdXNpbmcgUmV2ZXJzZU1hcCA9IHN0ZDo6dW5vcmRlcmVkX21hcDxBdWRpb0NoYW5uZWxMYXlvdXQsIGF1ZGlvX2NoYW5uZWxfbWFza190PjsKKyAgICB1c2luZyBUYWcgPSBBdWRpb0NoYW5uZWxMYXlvdXQ6OlRhZzsKKyAgICBzdGF0aWMgY29uc3QgUmV2ZXJzZU1hcCBtSW4gPSBtYWtlX1JldmVyc2VNYXAoZ2V0SW5BdWRpb0NoYW5uZWxQYWlycygpKTsKKyAgICBzdGF0aWMgY29uc3QgUmV2ZXJzZU1hcCBtT3V0ID0gbWFrZV9SZXZlcnNlTWFwKGdldE91dEF1ZGlvQ2hhbm5lbFBhaXJzKCkpOworICAgIHN0YXRpYyBjb25zdCBSZXZlcnNlTWFwIG1Wb2ljZSA9IG1ha2VfUmV2ZXJzZU1hcChnZXRWb2ljZUF1ZGlvQ2hhbm5lbFBhaXJzKCkpOworCisgICAgYXV0byBjb252ZXJ0ID0gW10oY29uc3QgQXVkaW9DaGFubmVsTGF5b3V0JiBhaWRsLCBjb25zdCBSZXZlcnNlTWFwJiBtLAorICAgICAgICAgICAgY29uc3QgY2hhciogZnVuYywgY29uc3QgY2hhciogdHlwZSkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb19jaGFubmVsX21hc2tfdD4geworICAgICAgICBpZiAoYXV0byBpdCA9IG0uZmluZChhaWRsKTsgaXQgIT0gbS5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IG5vIGxlZ2FjeSAlcyBhdWRpb19jaGFubmVsX21hc2tfdCBmb3VuZCBmb3IgJXMiLCBmdW5jLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICBhaWRsLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgICAgICB9CisgICAgfTsKKworICAgIHN3aXRjaCAoYWlkbC5nZXRUYWcoKSkgeworICAgICAgICBjYXNlIFRhZzo6bm9uZToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7CisgICAgICAgIGNhc2UgVGFnOjppbnZhbGlkOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfSU5WQUxJRDsKKyAgICAgICAgY2FzZSBUYWc6OmluZGV4TWFzazoKKyAgICAgICAgICAgIC8vIEluZGV4IG1hc2tzIGRvIG5vdCBoYXZlIHByZS1kZWZpbmVkIHZhbHVlcy4KKyAgICAgICAgICAgIGlmIChjb25zdCBpbnQgYml0cyA9IGFpZGwuZ2V0PFRhZzo6aW5kZXhNYXNrPigpOworICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fcG9wY291bnQoYml0cykgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fcG9wY291bnQoYml0cykgPD0gQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXVkaW9fY2hhbm5lbF9tYXNrX2Zyb21fcmVwcmVzZW50YXRpb25fYW5kX2JpdHMoCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYLCBiaXRzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGluZGV4TWFzayB2YWx1ZSAweCV4IGluICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBiaXRzLCBhaWRsLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBUYWc6OmxheW91dE1hc2s6CisgICAgICAgICAgICAvLyBUaGUgZmFzdCBwYXRoIGlzIHRvIGZpbmQgYSBkaXJlY3QgbWF0Y2ggZm9yIHNvbWUga25vd24gbGF5b3V0IG1hc2suCisgICAgICAgICAgICBpZiAoY29uc3QgYXV0byBsYXlvdXRNYXRjaCA9IGNvbnZlcnQoYWlkbCwgaXNJbnB1dCA/IG1JbiA6IG1PdXQsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICBpc0lucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0TWF0Y2gub2soKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsYXlvdXRNYXRjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIGEgbWF0Y2ggZm9yIGEgcHJlZGVmaW5lZCBsYXlvdXQgd2Fzbid0IGZvdW5kLCBtYWtlIGEgY3VzdG9tIG9uZSBmcm9tIGJpdHMuCisgICAgICAgICAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX3QgYml0TWFzayA9CisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ2hhbm5lbExheW91dF9sYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3RfYml0cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsLmdldDxUYWc6OmxheW91dE1hc2s+KCksIGlzSW5wdXQpOworICAgICAgICAgICAgICAgICAgICBiaXRNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICAgICAgICAgIHJldHVybiBiaXRNYXNrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICAgICAgY2FzZSBUYWc6OnZvaWNlTWFzazoKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KGFpZGwsIG1Wb2ljZSwgX19mdW5jX18sICJ2b2ljZSIpOworICAgIH0KKyAgICBBTE9HRSgiJXM6IHVuZXhwZWN0ZWQgdGFnIHZhbHVlICVkIiwgX19mdW5jX18sIGFpZGwuZ2V0VGFnKCkpOworICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK2ludCBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9iaXRzX0F1ZGlvQ2hhbm5lbExheW91dF9sYXlvdXQoCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGxlZ2FjeSwgYm9vbCBpc0lucHV0KSB7CisgICAgYXV0byYgYml0TWFwcGluZyA9IGlzSW5wdXQgPyBnZXRJbkF1ZGlvQ2hhbm5lbEJpdHMoKSA6IGdldE91dEF1ZGlvQ2hhbm5lbEJpdHMoKTsKKyAgICBjb25zdCBpbnQgbGVnYWN5SW5pdGlhbCA9IGxlZ2FjeTsgLy8gZm9yIGVycm9yIG1lc3NhZ2UKKyAgICBpbnQgYWlkbExheW91dCA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvJiBiaXRQYWlyIDogYml0TWFwcGluZykgeworICAgICAgICBpZiAoKGxlZ2FjeSAmIGJpdFBhaXIuZmlyc3QpID09IGJpdFBhaXIuZmlyc3QpIHsKKyAgICAgICAgICAgIGFpZGxMYXlvdXQgfD0gYml0UGFpci5zZWNvbmQ7CisgICAgICAgICAgICBsZWdhY3kgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obGVnYWN5ICYgfmJpdFBhaXIuZmlyc3QpOworICAgICAgICAgICAgaWYgKGxlZ2FjeSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFpZGxMYXlvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoIiVzOiBsZWdhY3kgJXMgYXVkaW9fY2hhbm5lbF9tYXNrX3QgMHgleCBjb250YWlucyB1bnJlY29nbml6ZWQgYml0cyAweCV4IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBpc0lucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiLCBsZWdhY3lJbml0aWFsLCBsZWdhY3kpOworICAgIHJldHVybiAwOworfQorCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvQ2hhbm5lbExheW91dD4gbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfQXVkaW9DaGFubmVsTGF5b3V0KAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIHVzaW5nIERpcmVjdE1hcCA9IHN0ZDo6dW5vcmRlcmVkX21hcDxhdWRpb19jaGFubmVsX21hc2tfdCwgQXVkaW9DaGFubmVsTGF5b3V0PjsKKyAgICB1c2luZyBUYWcgPSBBdWRpb0NoYW5uZWxMYXlvdXQ6OlRhZzsKKyAgICBzdGF0aWMgY29uc3QgRGlyZWN0TWFwIG1JbkFuZFZvaWNlID0gbWFrZV9EaXJlY3RNYXAoCisgICAgICAgICAgICBnZXRJbkF1ZGlvQ2hhbm5lbFBhaXJzKCksIGdldFZvaWNlQXVkaW9DaGFubmVsUGFpcnMoKSk7CisgICAgc3RhdGljIGNvbnN0IERpcmVjdE1hcCBtT3V0ID0gbWFrZV9EaXJlY3RNYXAoZ2V0T3V0QXVkaW9DaGFubmVsUGFpcnMoKSk7CisKKyAgICBhdXRvIGNvbnZlcnQgPSBbXShjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBsZWdhY3ksIGNvbnN0IERpcmVjdE1hcCYgbSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmMsIGNvbnN0IGNoYXIqIHR5cGUpIC0+IENvbnZlcnNpb25SZXN1bHQ8QXVkaW9DaGFubmVsTGF5b3V0PiB7CisgICAgICAgIGlmIChhdXRvIGl0ID0gbS5maW5kKGxlZ2FjeSk7IGl0ICE9IG0uZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBubyBBdWRpb0NoYW5uZWxMYXlvdXQgZm91bmQgZm9yIGxlZ2FjeSAlcyBhdWRpb19jaGFubmVsX21hc2tfdCB2YWx1ZSAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgZnVuYywgdHlwZSwgbGVnYWN5KTsKKyAgICAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgaWYgKGxlZ2FjeSA9PSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEF1ZGlvQ2hhbm5lbExheW91dHt9OworICAgIH0gZWxzZSBpZiAobGVnYWN5ID09IEFVRElPX0NIQU5ORUxfSU5WQUxJRCkgeworICAgICAgICByZXR1cm4gQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPFRhZzo6aW52YWxpZD4oMCk7CisgICAgfQorCisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9yZXByZXNlbnRhdGlvbl90IHJlcHIgPSBhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKGxlZ2FjeSk7CisgICAgaWYgKHJlcHIgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWCkgeworICAgICAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2lzX3ZhbGlkKGxlZ2FjeSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBpbmRleE1hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhsZWdhY3kpKSk7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPFRhZzo6aW5kZXhNYXNrPihpbmRleE1hc2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBsZWdhY3kgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdmFsdWUgMHgleCBpcyBpbnZhbGlkIiwgX19mdW5jX18sIGxlZ2FjeSk7CisgICAgICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXByID09IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT04pIHsKKyAgICAgICAgLy8gVGhlIGZhc3QgcGF0aCBpcyB0byBmaW5kIGEgZGlyZWN0IG1hdGNoIGZvciBzb21lIGtub3duIGxheW91dCBtYXNrLgorICAgICAgICBpZiAoY29uc3QgYXV0byBsYXlvdXRNYXRjaCA9IGNvbnZlcnQobGVnYWN5LCBpc0lucHV0ID8gbUluQW5kVm9pY2UgOiBtT3V0LCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBpc0lucHV0ID8gImlucHV0IC8gdm9pY2UiIDogIm91dHB1dCIpOworICAgICAgICAgICAgICAgIGxheW91dE1hdGNoLm9rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBsYXlvdXRNYXRjaDsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBhIG1hdGNoIGZvciBhIHByZWRlZmluZWQgbGF5b3V0IHdhc24ndCBmb3VuZCwgbWFrZSBhIGN1c3RvbSBvbmUgZnJvbSBiaXRzLAorICAgICAgICAvLyByZWplY3RpbmcgdGhvc2Ugd2l0aCB2b2ljZSBjaGFubmVsIGJpdHMuCisgICAgICAgIGlmICghaXNJbnB1dCB8fAorICAgICAgICAgICAgICAgIChsZWdhY3kgJiAoQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTksgfCBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSykpID09IDApIHsKKyAgICAgICAgICAgIGlmIChpbnQgYml0TWFza0xheW91dCA9CisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2JpdHNfQXVkaW9DaGFubmVsTGF5b3V0X2xheW91dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3ksIGlzSW5wdXQpOworICAgICAgICAgICAgICAgICAgICBiaXRNYXNrTGF5b3V0ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPFRhZzo6bGF5b3V0TWFzaz4oYml0TWFza0xheW91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGxlZ2FjeSBhdWRpb19jaGFubmVsX21hc2tfdCB2YWx1ZSAweCV4IGNvbnRhaW5zIHZvaWNlIGJpdHMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbGVnYWN5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKworICAgIEFMT0dFKCIlczogdW5rbm93biByZXByZXNlbnRhdGlvbiAlZCBpbiBhdWRpb19jaGFubmVsX21hc2tfdCB2YWx1ZSAweCV4IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCByZXByLCBsZWdhY3kpOworICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZGV2aWNlc190PiBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdCgKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiYgYWlkbCkgeworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8QXVkaW9EZXZpY2VEZXNjcmlwdGlvbiwgYXVkaW9fZGV2aWNlc190PiBtID0KKyAgICAgICAgICAgIG1ha2VfUmV2ZXJzZU1hcChnZXRBdWRpb0RldmljZVBhaXJzKCkpOworICAgIGlmIChhdXRvIGl0ID0gbS5maW5kKGFpZGwpOyBpdCAhPSBtLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogbm8gbGVnYWN5IGF1ZGlvX2RldmljZXNfdCBmb3VuZCBmb3IgJXMiLCBfX2Z1bmNfXywgYWlkbC50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KK30KKworQ29udmVyc2lvblJlc3VsdDxBdWRpb0RldmljZURlc2NyaXB0aW9uPiBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbigKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGxlZ2FjeSkgeworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8YXVkaW9fZGV2aWNlc190LCBBdWRpb0RldmljZURlc2NyaXB0aW9uPiBtID0KKyAgICAgICAgICAgIG1ha2VfRGlyZWN0TWFwKGdldEF1ZGlvRGV2aWNlUGFpcnMoKSk7CisgICAgaWYgKGF1dG8gaXQgPSBtLmZpbmQobGVnYWN5KTsgaXQgIT0gbS5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IG5vIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24gZm91bmQgZm9yIGxlZ2FjeSBhdWRpb19kZXZpY2VzX3QgdmFsdWUgMHgleCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGxlZ2FjeSk7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorfQorCitzdGF0dXNfdCBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZV9hdWRpb19kZXZpY2UoCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlJiBhaWRsLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QqIGxlZ2FjeVR5cGUsIGNoYXIqIGxlZ2FjeUFkZHJlc3MpIHsKKyAgICAqbGVnYWN5VHlwZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdChhaWRsLnR5cGUpKTsKKyAgICByZXR1cm4gYWlkbDJsZWdhY3lfc3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBhaWRsLmFkZHJlc3MuZ2V0PEF1ZGlvRGV2aWNlQWRkcmVzczo6aWQ+KCksCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeUFkZHJlc3MsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pOworfQorCitzdGF0dXNfdCBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZV9hdWRpb19kZXZpY2UoCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlJiBhaWRsLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QqIGxlZ2FjeVR5cGUsIFN0cmluZzgqIGxlZ2FjeUFkZHJlc3MpIHsKKyAgICAqbGVnYWN5VHlwZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdChhaWRsLnR5cGUpKTsKKyAgICAqbGVnYWN5QWRkcmVzcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfc3RyaW5nX3ZpZXdfU3RyaW5nOCgKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5hZGRyZXNzLmdldDxBdWRpb0RldmljZUFkZHJlc3M6OmlkPigpKSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZV9hdWRpb19kZXZpY2UoCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlJiBhaWRsLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QqIGxlZ2FjeVR5cGUsIHN0ZDo6c3RyaW5nKiBsZWdhY3lBZGRyZXNzKSB7CisgICAgKmxlZ2FjeVR5cGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbl9hdWRpb19kZXZpY2VzX3QoYWlkbC50eXBlKSk7CisgICAgKmxlZ2FjeUFkZHJlc3MgPSBhaWRsLmFkZHJlc3MuZ2V0PEF1ZGlvRGV2aWNlQWRkcmVzczo6aWQ+KCk7CisgICAgcmV0dXJuIE9LOworfQorCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvRGV2aWNlPiBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VfQXVkaW9EZXZpY2UoCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBsZWdhY3lUeXBlLCBjb25zdCBjaGFyKiBsZWdhY3lBZGRyZXNzKSB7CisgICAgQXVkaW9EZXZpY2UgYWlkbDsKKyAgICBhaWRsLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihsZWdhY3lUeXBlKSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgYWlkbF9pZCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX3N0cmluZyhsZWdhY3lBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSk7CisgICAgYWlkbC5hZGRyZXNzID0gQXVkaW9EZXZpY2VBZGRyZXNzOjptYWtlPEF1ZGlvRGV2aWNlQWRkcmVzczo6aWQ+KGFpZGxfaWQpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvRGV2aWNlPgorbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlX0F1ZGlvRGV2aWNlKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgbGVnYWN5VHlwZSwgY29uc3QgU3RyaW5nOCYgbGVnYWN5QWRkcmVzcykgeworICAgIEF1ZGlvRGV2aWNlIGFpZGw7CisgICAgYWlkbC50eXBlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24obGVnYWN5VHlwZSkpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGFpZGxfaWQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9TdHJpbmc4X3N0cmluZyhsZWdhY3lBZGRyZXNzKSk7CisgICAgYWlkbC5hZGRyZXNzID0gQXVkaW9EZXZpY2VBZGRyZXNzOjptYWtlPEF1ZGlvRGV2aWNlQWRkcmVzczo6aWQ+KGFpZGxfaWQpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2Zvcm1hdF90PiBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KAorICAgICAgICBjb25zdCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uJiBhaWRsKSB7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uLCBhdWRpb19mb3JtYXRfdD4gbSA9CisgICAgICAgICAgICBtYWtlX1JldmVyc2VNYXAoZ2V0QXVkaW9Gb3JtYXRQYWlycygpKTsKKyAgICBpZiAoYXV0byBpdCA9IG0uZmluZChhaWRsKTsgaXQgIT0gbS5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IG5vIGxlZ2FjeSBhdWRpb19mb3JtYXRfdCBmb3VuZCBmb3IgJXMiLCBfX2Z1bmNfXywgYWlkbC50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KK30KKworQ29udmVyc2lvblJlc3VsdDxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPiBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKAogICAgICAgICBhdWRpb19mb3JtYXRfdCBsZWdhY3kpIHsKLSAgICAvLyBUaGlzIHJlbGllcyBvbiBBdWRpb0Zvcm1hdCBiZWluZyBrZXB0IGluIHN5bmMgd2l0aCBhdWRpb19mb3JtYXRfdC4KLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQpID09IHNpemVvZihhdWRpb19mb3JtYXRfdCkpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+KGxlZ2FjeSk7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxhdWRpb19mb3JtYXRfdCwgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4gbSA9CisgICAgICAgICAgICBtYWtlX0RpcmVjdE1hcChnZXRBdWRpb0Zvcm1hdFBhaXJzKCkpOworICAgIGlmIChhdXRvIGl0ID0gbS5maW5kKGxlZ2FjeSk7IGl0ICE9IG0uZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIGZvdW5kIGZvciBsZWdhY3kgYXVkaW9fZm9ybWF0X3QgdmFsdWUgMHgleCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGxlZ2FjeSk7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQogfQogCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX2dhaW5fbW9kZV90PiBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5Nb2RlX2F1ZGlvX2dhaW5fbW9kZV90KG1lZGlhOjpBdWRpb0dhaW5Nb2RlIGFpZGwpIHsKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbl9tb2RlX3Q+IGFpZGwybGVnYWN5X0F1ZGlvR2Fpbk1vZGVfYXVkaW9fZ2Fpbl9tb2RlX3QoCisgICAgICAgIEF1ZGlvR2Fpbk1vZGUgYWlkbCkgewogICAgIHN3aXRjaCAoYWlkbCkgewotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0dhaW5Nb2RlOjpKT0lOVDoKKyAgICAgICAgY2FzZSBBdWRpb0dhaW5Nb2RlOjpKT0lOVDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19HQUlOX01PREVfSk9JTlQ7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvR2Fpbk1vZGU6OkNIQU5ORUxTOgorICAgICAgICBjYXNlIEF1ZGlvR2Fpbk1vZGU6OkNIQU5ORUxTOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9HYWluTW9kZTo6UkFNUDoKKyAgICAgICAgY2FzZSBBdWRpb0dhaW5Nb2RlOjpSQU1QOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0dBSU5fTU9ERV9SQU1QOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW5Nb2RlPiBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9BdWRpb0dhaW5Nb2RlKGF1ZGlvX2dhaW5fbW9kZV90IGxlZ2FjeSkgeworQ29udmVyc2lvblJlc3VsdDxBdWRpb0dhaW5Nb2RlPiBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9BdWRpb0dhaW5Nb2RlKAorICAgICAgICBhdWRpb19nYWluX21vZGVfdCBsZWdhY3kpIHsKICAgICBzd2l0Y2ggKGxlZ2FjeSkgewogICAgICAgICBjYXNlIEFVRElPX0dBSU5fTU9ERV9KT0lOVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9HYWluTW9kZTo6Sk9JTlQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9HYWluTW9kZTo6Sk9JTlQ7CiAgICAgICAgIGNhc2UgQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0dhaW5Nb2RlOjpDSEFOTkVMUzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0dhaW5Nb2RlOjpDSEFOTkVMUzsKICAgICAgICAgY2FzZSBBVURJT19HQUlOX01PREVfUkFNUDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9HYWluTW9kZTo6UkFNUDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0dhaW5Nb2RlOjpSQU1QOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2dhaW5fbW9kZV90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2dhaW5fbW9kZV90X21hc2soaW50MzJfdCBhaWRsKSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGF1ZGlvX2dhaW5fbW9kZV90LCBpbnQzMl90LCBhdWRpb19nYWluX21vZGVfdCwgbWVkaWE6OkF1ZGlvR2Fpbk1vZGU+KAorICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxhdWRpb19nYWluX21vZGVfdCwgaW50MzJfdCwgYXVkaW9fZ2Fpbl9tb2RlX3QsIEF1ZGlvR2Fpbk1vZGU+KAogICAgICAgICAgICAgYWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9HYWluTW9kZV9hdWRpb19nYWluX21vZGVfdCwKICAgICAgICAgICAgIC8vIEF1ZGlvR2Fpbk1vZGUgaXMgaW5kZXgtYmFzZWQuCi0gICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxtZWRpYTo6QXVkaW9HYWluTW9kZT4sCisgICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxBdWRpb0dhaW5Nb2RlPiwKICAgICAgICAgICAgIC8vIEFVRElPX0dBSU5fTU9ERV8qIGNvbnN0YW50cyBhcmUgbWFzay1iYXNlZC4KICAgICAgICAgICAgIGVudW1Ub01hc2tfYml0bWFzazxhdWRpb19nYWluX21vZGVfdCwgYXVkaW9fZ2Fpbl9tb2RlX3Q+KTsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9pbnQzMl90X21hc2soYXVkaW9fZ2Fpbl9tb2RlX3QgbGVnYWN5KSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGludDMyX3QsIGF1ZGlvX2dhaW5fbW9kZV90LCBtZWRpYTo6QXVkaW9HYWluTW9kZSwgYXVkaW9fZ2Fpbl9tb2RlX3Q+KAorICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LCBhdWRpb19nYWluX21vZGVfdCwgQXVkaW9HYWluTW9kZSwgYXVkaW9fZ2Fpbl9tb2RlX3Q+KAogICAgICAgICAgICAgbGVnYWN5LCBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9BdWRpb0dhaW5Nb2RlLAogICAgICAgICAgICAgLy8gQVVESU9fR0FJTl9NT0RFXyogY29uc3RhbnRzIGFyZSBtYXNrLWJhc2VkLgogICAgICAgICAgICAgaW5kZXhUb0VudW1fYml0bWFzazxhdWRpb19nYWluX21vZGVfdD4sCiAgICAgICAgICAgICAvLyBBdWRpb0dhaW5Nb2RlIGlzIGluZGV4LWJhc2VkLgotICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBtZWRpYTo6QXVkaW9HYWluTW9kZT4pOwotfQotCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX2RldmljZXNfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoaW50MzJfdCBhaWRsKSB7Ci0gICAgLy8gVE9ETyh5dGFpKTogYml0ZmllbGQ/Ci0gICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxhdWRpb19kZXZpY2VzX3Q+KGFpZGwpOwotfQotCi1Db252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGF1ZGlvX2RldmljZXNfdCBsZWdhY3kpIHsKLSAgICAvLyBUT0RPKHl0YWkpOiBiaXRmaWVsZD8KLSAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7CisgICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PGludDMyX3QsIEF1ZGlvR2Fpbk1vZGU+KTsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19nYWluX2NvbmZpZz4gYWlkbDJsZWdhY3lfQXVkaW9HYWluQ29uZmlnX2F1ZGlvX2dhaW5fY29uZmlnKAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9HYWluQ29uZmlnJiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlLCBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlKSB7CisgICAgICAgIGNvbnN0IEF1ZGlvR2FpbkNvbmZpZyYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CiAgICAgYXVkaW9fZ2Fpbl9jb25maWcgbGVnYWN5OwogICAgIGxlZ2FjeS5pbmRleCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50PihhaWRsLmluZGV4KSk7CiAgICAgbGVnYWN5Lm1vZGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19nYWluX21vZGVfdF9tYXNrKGFpZGwubW9kZSkpOwotICAgIGxlZ2FjeS5jaGFubmVsX21hc2sgPQotICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoYWlkbC5jaGFubmVsTWFzaykpOwotICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IFZBTFVFX09SX1JFVFVSTihkaXJlY3Rpb24ocm9sZSwgdHlwZSkpID09IERpcmVjdGlvbjo6SU5QVVQ7Ci0gICAgY29uc3QgYm9vbCBpc0pvaW50ID0gYml0bWFza0lzU2V0KGFpZGwubW9kZSwgbWVkaWE6OkF1ZGlvR2Fpbk1vZGU6OkpPSU5UKTsKKyAgICBsZWdhY3kuY2hhbm5lbF9tYXNrID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2ssIGlzSW5wdXQpKTsKKyAgICBjb25zdCBib29sIGlzSm9pbnQgPSBiaXRtYXNrSXNTZXQoYWlkbC5tb2RlLCBBdWRpb0dhaW5Nb2RlOjpKT0lOVCk7CiAgICAgc2l6ZV90IG51bVZhbHVlcyA9IGlzSm9pbnQgPyAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpc0lucHV0ID8gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobGVnYWN5LmNoYW5uZWxfbWFzaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobGVnYWN5LmNoYW5uZWxfbWFzayk7CkBAIC00ODEsMTQgKzE0MDEsMTMgQEAKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW5Db25maWc+IGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fY29uZmlnX0F1ZGlvR2FpbkNvbmZpZygKLSAgICAgICAgY29uc3QgYXVkaW9fZ2Fpbl9jb25maWcmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSkgewotICAgIG1lZGlhOjpBdWRpb0dhaW5Db25maWcgYWlkbDsKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9HYWluQ29uZmlnPiBsZWdhY3kyYWlkbF9hdWRpb19nYWluX2NvbmZpZ19BdWRpb0dhaW5Db25maWcoCisgICAgICAgIGNvbnN0IGF1ZGlvX2dhaW5fY29uZmlnJiBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIEF1ZGlvR2FpbkNvbmZpZyBhaWRsOwogICAgIGFpZGwuaW5kZXggPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5pbmRleCkpOwogICAgIGFpZGwubW9kZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9pbnQzMl90X21hc2sobGVnYWN5Lm1vZGUpKTsKLSAgICBhaWRsLmNoYW5uZWxNYXNrID0KLSAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGxlZ2FjeS5jaGFubmVsX21hc2spKTsKLSAgICBjb25zdCBib29sIGlzSW5wdXQgPSBWQUxVRV9PUl9SRVRVUk4oZGlyZWN0aW9uKHJvbGUsIHR5cGUpKSA9PSBEaXJlY3Rpb246OklOUFVUOworICAgIGFpZGwuY2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9BdWRpb0NoYW5uZWxMYXlvdXQobGVnYWN5LmNoYW5uZWxfbWFzaywgaXNJbnB1dCkpOwogICAgIGNvbnN0IGJvb2wgaXNKb2ludCA9IChsZWdhY3kubW9kZSAmIEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgIT0gMDsKICAgICBzaXplX3QgbnVtVmFsdWVzID0gaXNKb2ludCA/IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlzSW5wdXQgPyBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhsZWdhY3kuY2hhbm5lbF9tYXNrKQpAQCAtNTAyLDEyOSArMTQyMSwxNDEgQEAKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19pbnB1dF9mbGFnc190PiBhaWRsMmxlZ2FjeV9BdWRpb0lucHV0RmxhZ3NfYXVkaW9faW5wdXRfZmxhZ3NfdCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvSW5wdXRGbGFncyBhaWRsKSB7CisgICAgICAgIEF1ZGlvSW5wdXRGbGFncyBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6RkFTVDoKKyAgICAgICAgY2FzZSBBdWRpb0lucHV0RmxhZ3M6OkZBU1Q6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19GQVNUOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OkhXX0hPVFdPUkQ6CisgICAgICAgIGNhc2UgQXVkaW9JbnB1dEZsYWdzOjpIV19IT1RXT1JEOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpSQVc6CisgICAgICAgIGNhc2UgQXVkaW9JbnB1dEZsYWdzOjpSQVc6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19SQVc7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6U1lOQzoKKyAgICAgICAgY2FzZSBBdWRpb0lucHV0RmxhZ3M6OlNZTkM6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19TWU5DOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6Ok1NQVBfTk9JUlE6CisgICAgICAgIGNhc2UgQXVkaW9JbnB1dEZsYWdzOjpNTUFQX05PSVJROgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpWT0lQX1RYOgorICAgICAgICBjYXNlIEF1ZGlvSW5wdXRGbGFnczo6Vk9JUF9UWDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19JTlBVVF9GTEFHX1ZPSVBfVFg7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6SFdfQVZfU1lOQzoKKyAgICAgICAgY2FzZSBBdWRpb0lucHV0RmxhZ3M6OkhXX0FWX1NZTkM6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OkRJUkVDVDoKKyAgICAgICAgY2FzZSBBdWRpb0lucHV0RmxhZ3M6OkRJUkVDVDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19JTlBVVF9GTEFHX0RJUkVDVDsKKyAgICAgICAgY2FzZSBBdWRpb0lucHV0RmxhZ3M6OlVMVFJBU09VTkQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19VTFRSQVNPVU5EOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfQXVkaW9JbnB1dEZsYWdzKAorQ29udmVyc2lvblJlc3VsdDxBdWRpb0lucHV0RmxhZ3M+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfQXVkaW9JbnB1dEZsYWdzKAogICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGxlZ2FjeSkgewogICAgIHN3aXRjaCAobGVnYWN5KSB7CiAgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19OT05FOgogICAgICAgICAgICAgYnJlYWs7IC8vIHNob3VsZG4ndCBnZXQgaGVyZS4gbXVzdCBiZSBsaXN0ZWQgIC1XZXJyb3IsLVdzd2l0Y2gKICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX0ZBU1Q6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6RkFTVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0lucHV0RmxhZ3M6OkZBU1Q7CiAgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19IV19IT1RXT1JEOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OkhXX0hPVFdPUkQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9JbnB1dEZsYWdzOjpIV19IT1RXT1JEOwogICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0ZMQUdfUkFXOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OlJBVzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0lucHV0RmxhZ3M6OlJBVzsKICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX1NZTkM6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6U1lOQzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0lucHV0RmxhZ3M6OlNZTkM7CiAgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJROgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6Ok1NQVBfTk9JUlE7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9JbnB1dEZsYWdzOjpNTUFQX05PSVJROwogICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0ZMQUdfVk9JUF9UWDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpWT0lQX1RYOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvSW5wdXRGbGFnczo6Vk9JUF9UWDsKICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkM6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6SFdfQVZfU1lOQzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0lucHV0RmxhZ3M6OkhXX0FWX1NZTkM7CiAgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1Q6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6RElSRUNUOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvSW5wdXRGbGFnczo6RElSRUNUOworICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0ZMQUdfVUxUUkFTT1VORDoKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0lucHV0RmxhZ3M6OlVMVFJBU09VTkQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+IGFpZGwybGVnYWN5X0F1ZGlvT3V0cHV0RmxhZ3NfYXVkaW9fb3V0cHV0X2ZsYWdzX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzIGFpZGwpIHsKKyAgICAgICAgQXVkaW9PdXRwdXRGbGFncyBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkRJUkVDVDoKKyAgICAgICAgY2FzZSBBdWRpb091dHB1dEZsYWdzOjpESVJFQ1Q6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpQUklNQVJZOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OlBSSU1BUlk6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6RkFTVDoKKyAgICAgICAgY2FzZSBBdWRpb091dHB1dEZsYWdzOjpGQVNUOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0ZBU1Q7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkRFRVBfQlVGRkVSOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OkRFRVBfQlVGRkVSOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpDT01QUkVTU19PRkZMT0FEOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OkNPTVBSRVNTX09GRkxPQUQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6Tk9OX0JMT0NLSU5HOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6Ok5PTl9CTE9DS0lORzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19OT05fQkxPQ0tJTkc7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkhXX0FWX1NZTkM6CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6SFdfQVZfU1lOQzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpUVFM6CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6VFRTOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX1RUUzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6UkFXOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OlJBVzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19SQVc7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OlNZTkM6CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6U1lOQzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19TWU5DOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpJRUM5NThfTk9OQVVESU86CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6SUVDOTU4X05PTkFVRElPOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0lFQzk1OF9OT05BVURJTzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6RElSRUNUX1BDTToKKyAgICAgICAgY2FzZSBBdWRpb091dHB1dEZsYWdzOjpESVJFQ1RfUENNOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVF9QQ007Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6Ok1NQVBfTk9JUlE6CisgICAgICAgIGNhc2UgQXVkaW9PdXRwdXRGbGFnczo6TU1BUF9OT0lSUToKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJROwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpWT0lQX1JYOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OlZPSVBfUlg6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6SU5DQUxMX01VU0lDOgorICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OklOQ0FMTF9NVVNJQzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUM7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkdBUExFU1NfT0ZGTE9BRDoKKyAgICAgICAgY2FzZSBBdWRpb091dHB1dEZsYWdzOjpHQVBMRVNTX09GRkxPQUQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfR0FQTEVTU19PRkZMT0FEOworICAgICAgICBjYXNlIEF1ZGlvT3V0cHV0RmxhZ3M6OlVMVFJBU09VTkQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfVUxUUkFTT1VORDsKKyAgICAgICAgY2FzZSBBdWRpb091dHB1dEZsYWdzOjpTUEFUSUFMSVpFUjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19TUEFUSUFMSVpFUjsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9PdXRwdXRGbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfQXVkaW9PdXRwdXRGbGFncygKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9PdXRwdXRGbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfQXVkaW9PdXRwdXRGbGFncygKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19OT05FOgogICAgICAgICAgICAgYnJlYWs7IC8vIHNob3VsZG4ndCBnZXQgaGVyZS4gbXVzdCBiZSBsaXN0ZWQgIC1XZXJyb3IsLVdzd2l0Y2gKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1Q6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkRJUkVDVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpESVJFQ1Q7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6UFJJTUFSWTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpQUklNQVJZOwogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX0ZBU1Q6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkZBU1Q7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6RkFTVDsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6REVFUF9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6REVFUF9CVUZGRVI7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6Q09NUFJFU1NfT0ZGTE9BRDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpDT01QUkVTU19PRkZMT0FEOwogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6Tk9OX0JMT0NLSU5HOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6Ok5PTl9CTE9DS0lORzsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpIV19BVl9TWU5DOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OkhXX0FWX1NZTkM7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfVFRTOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpUVFM7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6VFRTOwogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX1JBVzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6UkFXOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OlJBVzsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19TWU5DOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpTWU5DOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OlNZTkM7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfSUVDOTU4X05PTkFVRElPOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpJRUM5NThfTk9OQVVESU87CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6SUVDOTU4X05PTkFVRElPOwogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVF9QQ006Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkRJUkVDVF9QQ007CisgICAgICAgICAgICByZXR1cm4gQXVkaW9PdXRwdXRGbGFnczo6RElSRUNUX1BDTTsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJROgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpNTUFQX05PSVJROworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6Ok1NQVBfTk9JUlE7CiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6Vk9JUF9SWDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpWT0lQX1JYOwogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6SU5DQUxMX01VU0lDOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OklOQ0FMTF9NVVNJQzsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19HQVBMRVNTX09GRkxPQUQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkdBUExFU1NfT0ZGTE9BRDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpHQVBMRVNTX09GRkxPQUQ7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfVUxUUkFTT1VORDoKKyAgICAgICAgICAgIHJldHVybiBBdWRpb091dHB1dEZsYWdzOjpVTFRSQVNPVU5EOworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX1NQQVRJQUxJWkVSOgorICAgICAgICAgICAgcmV0dXJuIEF1ZGlvT3V0cHV0RmxhZ3M6OlNQQVRJQUxJWkVSOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQpAQCAtNjM0LDkgKzE1NjUsOSBAQAogICAgIHVzaW5nIExlZ2FjeU1hc2sgPSBzdGQ6OnVuZGVybHlpbmdfdHlwZV90PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+OwogCiAgICAgTGVnYWN5TWFzayBjb252ZXJ0ZWQgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAoY29udmVydEJpdG1hc2s8TGVnYWN5TWFzaywgaW50MzJfdCwgYXVkaW9faW5wdXRfZmxhZ3NfdCwgbWVkaWE6OkF1ZGlvSW5wdXRGbGFncz4oCisgICAgICAgICAgICAoY29udmVydEJpdG1hc2s8TGVnYWN5TWFzaywgaW50MzJfdCwgYXVkaW9faW5wdXRfZmxhZ3NfdCwgQXVkaW9JbnB1dEZsYWdzPigKICAgICAgICAgICAgICAgICAgICAgYWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9JbnB1dEZsYWdzX2F1ZGlvX2lucHV0X2ZsYWdzX3QsCi0gICAgICAgICAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M+LAorICAgICAgICAgICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxBdWRpb0lucHV0RmxhZ3M+LAogICAgICAgICAgICAgICAgICAgICBlbnVtVG9NYXNrX2JpdG1hc2s8TGVnYWN5TWFzaywgYXVkaW9faW5wdXRfZmxhZ3NfdD4pKSk7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KGNvbnZlcnRlZCk7CiB9CkBAIC02NDYsMTAgKzE1NzcsMTAgQEAKICAgICB1c2luZyBMZWdhY3lNYXNrID0gc3RkOjp1bmRlcmx5aW5nX3R5cGVfdDxhdWRpb19pbnB1dF9mbGFnc190PjsKIAogICAgIExlZ2FjeU1hc2sgbGVnYWN5TWFzayA9IHN0YXRpY19jYXN0PExlZ2FjeU1hc2s+KGxlZ2FjeSk7Ci0gICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGludDMyX3QsIExlZ2FjeU1hc2ssIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3MsIGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KAorICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LCBMZWdhY3lNYXNrLCBBdWRpb0lucHV0RmxhZ3MsIGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KAogICAgICAgICAgICAgbGVnYWN5TWFzaywgbGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9BdWRpb0lucHV0RmxhZ3MsCiAgICAgICAgICAgICBpbmRleFRvRW51bV9iaXRtYXNrPGF1ZGlvX2lucHV0X2ZsYWdzX3Q+LAotICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzPik7CisgICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PGludDMyX3QsIEF1ZGlvSW5wdXRGbGFncz4pOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX291dHB1dF9mbGFnc190PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX291dHB1dF9mbGFnc190X21hc2soCkBAIC02NTcsOSArMTU4OCw5IEBACiAgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGF1ZGlvX291dHB1dF9mbGFnc190LAogICAgICAgICAgICAgaW50MzJfdCwKICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190LAotICAgICAgICAgICAgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M+KAorICAgICAgICAgICAgQXVkaW9PdXRwdXRGbGFncz4oCiAgICAgICAgICAgICBhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb091dHB1dEZsYWdzX2F1ZGlvX291dHB1dF9mbGFnc190LAotICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8bWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M+LAorICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8QXVkaW9PdXRwdXRGbGFncz4sCiAgICAgICAgICAgICBlbnVtVG9NYXNrX2JpdG1hc2s8YXVkaW9fb3V0cHV0X2ZsYWdzX3QsIGF1ZGlvX291dHB1dF9mbGFnc190Pik7CiB9CiAKQEAgLTY2OCwyMjUgKzE1OTksMjE1IEBACiAgICAgdXNpbmcgTGVnYWN5TWFzayA9IHN0ZDo6dW5kZXJseWluZ190eXBlX3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+OwogCiAgICAgTGVnYWN5TWFzayBsZWdhY3lNYXNrID0gc3RhdGljX2Nhc3Q8TGVnYWN5TWFzaz4obGVnYWN5KTsKLSAgICByZXR1cm4gY29udmVydEJpdG1hc2s8aW50MzJfdCwgTGVnYWN5TWFzaywgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3MsIGF1ZGlvX291dHB1dF9mbGFnc190PigKKyAgICByZXR1cm4gY29udmVydEJpdG1hc2s8aW50MzJfdCwgTGVnYWN5TWFzaywgQXVkaW9PdXRwdXRGbGFncywgYXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KAogICAgICAgICAgICAgbGVnYWN5TWFzaywgbGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfQXVkaW9PdXRwdXRGbGFncywKICAgICAgICAgICAgIGluZGV4VG9FbnVtX2JpdG1hc2s8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+LAotICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBtZWRpYTo6QXVkaW9PdXRwdXRGbGFncz4pOworICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBBdWRpb091dHB1dEZsYWdzPik7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW9fZmxhZ3M+IGFpZGwybGVnYWN5X0F1ZGlvSW9GbGFnc19hdWRpb19pb19mbGFncygKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvSW9GbGFncyYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSkgeworICAgICAgICBjb25zdCBBdWRpb0lvRmxhZ3MmIGFpZGwsIGJvb2wgaXNJbnB1dCkgewogICAgIGF1ZGlvX2lvX2ZsYWdzIGxlZ2FjeTsKLSAgICBEaXJlY3Rpb24gZGlyID0gVkFMVUVfT1JfUkVUVVJOKGRpcmVjdGlvbihyb2xlLCB0eXBlKSk7Ci0gICAgc3dpdGNoIChkaXIpIHsKLSAgICAgICAgY2FzZSBEaXJlY3Rpb246OklOUFVUOiB7Ci0gICAgICAgICAgICBsZWdhY3kuaW5wdXQgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW5wdXRfZmxhZ3NfdF9tYXNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgaW5wdXQpKSkpOwotICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIERpcmVjdGlvbjo6T1VUUFVUOiB7Ci0gICAgICAgICAgICBsZWdhY3kub3V0cHV0ID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX291dHB1dF9mbGFnc190X21hc2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBvdXRwdXQpKSkpOwotICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaXNJbnB1dCkgeworICAgICAgICBsZWdhY3kuaW5wdXQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pbnB1dF9mbGFnc190X21hc2soCisgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIGlucHV0KSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBsZWdhY3kub3V0cHV0ID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfbWFzaygKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgb3V0cHV0KSkpKTsKICAgICB9Ci0KICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lvRmxhZ3M+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2ZsYWdzX0F1ZGlvSW9GbGFncygKLSAgICAgICAgY29uc3QgYXVkaW9faW9fZmxhZ3MmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSkgewotICAgIG1lZGlhOjpBdWRpb0lvRmxhZ3MgYWlkbDsKLQotICAgIERpcmVjdGlvbiBkaXIgPSBWQUxVRV9PUl9SRVRVUk4oZGlyZWN0aW9uKHJvbGUsIHR5cGUpKTsKLSAgICBzd2l0Y2ggKGRpcikgewotICAgICAgICBjYXNlIERpcmVjdGlvbjo6SU5QVVQ6Ci0gICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfaW50MzJfdF9tYXNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5LmlucHV0KSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGlyZWN0aW9uOjpPVVRQVVQ6Ci0gICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kub3V0cHV0KSkpOwotICAgICAgICAgICAgYnJlYWs7CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvSW9GbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9faW9fZmxhZ3NfQXVkaW9Jb0ZsYWdzKAorICAgICAgICBjb25zdCBhdWRpb19pb19mbGFncyYgbGVnYWN5LCBib29sIGlzSW5wdXQpIHsKKyAgICBBdWRpb0lvRmxhZ3MgYWlkbDsKKyAgICBpZiAoaXNJbnB1dCkgeworICAgICAgICBVTklPTl9TRVQoYWlkbCwgaW5wdXQsCisgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfaW50MzJfdF9tYXNrKGxlZ2FjeS5pbnB1dCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBVTklPTl9TRVQoYWlkbCwgb3V0cHV0LAorICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9pbnQzMl90X21hc2sobGVnYWN5Lm91dHB1dCkpKTsKICAgICB9CiAgICAgcmV0dXJuIGFpZGw7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dD4KLWFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0KAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0JiBhaWRsKSB7CithaWRsMmxlZ2FjeV9BdWRpb1BvcnREZXZpY2VFeHRfYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dCgKKyAgICAgICAgY29uc3QgQXVkaW9Qb3J0RGV2aWNlRXh0JiBhaWRsLCBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0U3lzJiBhaWRsRGV2aWNlRXh0KSB7CiAgICAgYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dCBsZWdhY3k7Ci0gICAgbGVnYWN5Lmh3X21vZHVsZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChhaWRsLmh3TW9kdWxlKSk7Ci0gICAgbGVnYWN5LnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoYWlkbC50eXBlKSk7Ci0gICAgUkVUVVJOX0lGX0VSUk9SKGFpZGwybGVnYWN5X3N0cmluZyhhaWRsLmFkZHJlc3MsIGxlZ2FjeS5hZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSk7CisgICAgbGVnYWN5Lmh3X21vZHVsZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KGFpZGxEZXZpY2VFeHQuaHdNb2R1bGUpKTsKKyAgICBSRVRVUk5fSUZfRVJST1IoYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VfYXVkaW9fZGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBhaWRsLmRldmljZSwgJmxlZ2FjeS50eXBlLCBsZWdhY3kuYWRkcmVzcykpOwogICAgIHJldHVybiBsZWdhY3k7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZ0RldmljZUV4dD4KLWxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHRfQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0KAotICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0JiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0IGFpZGw7Ci0gICAgYWlkbC5od01vZHVsZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaHdfbW9kdWxlKSk7Ci0gICAgYWlkbC50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGxlZ2FjeS50eXBlKSk7Ci0gICAgYWlkbC5hZGRyZXNzID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfc3RyaW5nKGxlZ2FjeS5hZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSk7Ci0gICAgcmV0dXJuIGFpZGw7CitzdGF0dXNfdCBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0X0F1ZGlvUG9ydERldmljZUV4dCgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dCYgbGVnYWN5LAorICAgICAgICBBdWRpb1BvcnREZXZpY2VFeHQqIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHRTeXMqIGFpZGxEZXZpY2VFeHQpIHsKKyAgICBhaWRsRGV2aWNlRXh0LT5od01vZHVsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaHdfbW9kdWxlKSk7CisgICAgYWlkbC0+ZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZV9BdWRpb0RldmljZShsZWdhY3kudHlwZSwgbGVnYWN5LmFkZHJlc3MpKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4gYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgYWlkbCkgeworICAgICAgICBBdWRpb1N0cmVhbVR5cGUgYWlkbCkgewogICAgIHN3aXRjaCAoYWlkbCkgewotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkRFRkFVTFQ6CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpJTlZBTElEOgorICAgICAgICAgICAgYnJlYWs7ICAvLyByZXR1cm4gZXJyb3IKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OlNZU19SRVNFUlZFRF9ERUZBVUxUOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9ERUZBVUxUOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlZPSUNFX0NBTEw6CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpWT0lDRV9DQUxMOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlNZU1RFTToKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OlNZU1RFTToKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fU1lTVEVNOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlJJTkc6CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpSSU5HOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6Ok1VU0lDOgorICAgICAgICBjYXNlIEF1ZGlvU3RyZWFtVHlwZTo6TVVTSUM6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkFMQVJNOgorICAgICAgICBjYXNlIEF1ZGlvU3RyZWFtVHlwZTo6QUxBUk06CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6Ok5PVElGSUNBVElPTjoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6Ok5PVElGSUNBVElPTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkJMVUVUT09USF9TQ086CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpCTFVFVE9PVEhfU0NPOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkVORk9SQ0VEX0FVRElCTEU6CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpFTkZPUkNFRF9BVURJQkxFOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkRUTUY6CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpEVE1GOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlRUUzoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OlRUUzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVFRTOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkFDQ0VTU0lCSUxJVFk6CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpBQ0NFU1NJQklMSVRZOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkFTU0lTVEFOVDoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OkFTU0lTVEFOVDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQVNTSVNUQU5UOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlJFUk9VVElORzoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OlNZU19SRVNFUlZFRF9SRVJPVVRJTkc6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JFUk9VVElORzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpQQVRDSDoKKyAgICAgICAgY2FzZSBBdWRpb1N0cmVhbVR5cGU6OlNZU19SRVNFUlZFRF9QQVRDSDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUEFUQ0g7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6Q0FMTF9BU1NJU1RBTlQ6CisgICAgICAgIGNhc2UgQXVkaW9TdHJlYW1UeXBlOjpDQUxMX0FTU0lTVEFOVDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQ0FMTF9BU1NJU1RBTlQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvU3RyZWFtVHlwZT4gbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvU3RyZWFtVHlwZT4gbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoCiAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fREVGQVVMVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpERUZBVUxUOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtVHlwZTo6U1lTX1JFU0VSVkVEX0RFRkFVTFQ7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6Vk9JQ0VfQ0FMTDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OlZPSUNFX0NBTEw7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpTWVNURU07CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1UeXBlOjpTWVNURU07CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6UklORzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OlJJTkc7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6Ok1VU0lDOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtVHlwZTo6TVVTSUM7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkFMQVJNOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtVHlwZTo6QUxBUk07CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpOT1RJRklDQVRJT047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1UeXBlOjpOT1RJRklDQVRJT047CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ086Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6QkxVRVRPT1RIX1NDTzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OkJMVUVUT09USF9TQ087CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6RU5GT1JDRURfQVVESUJMRTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OkVORk9SQ0VEX0FVRElCTEU7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6RFRNRjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OkRUTUY7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1RUUzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpUVFM7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1UeXBlOjpUVFM7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6QUNDRVNTSUJJTElUWTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OkFDQ0VTU0lCSUxJVFk7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FTU0lTVEFOVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpBU1NJU1RBTlQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1UeXBlOjpBU1NJU1RBTlQ7CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1JFUk9VVElORzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpSRVJPVVRJTkc7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1UeXBlOjpTWVNfUkVTRVJWRURfUkVST1VUSU5HOwogICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9QQVRDSDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpQQVRDSDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0cmVhbVR5cGU6OlNZU19SRVNFUlZFRF9QQVRDSDsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQ0FMTF9BU1NJU1RBTlQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6Q0FMTF9BU1NJU1RBTlQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW1UeXBlOjpDQUxMX0FTU0lTVEFOVDsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19zb3VyY2VfdD4gYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KAotICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGFpZGwpIHsKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fc291cmNlX3Q+IGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KAorICAgICAgICBBdWRpb1NvdXJjZSBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6SU5WQUxJRDoKLSAgICAgICAgICAgIC8vIFRoaXMgdmFsdWUgZG9lcyBub3QgaGF2ZSBhbiBlbnVtCisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6OlNZU19SRVNFUlZFRF9JTlZBTElEOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9JTlZBTElEOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkRFRkFVTFQ6CisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6OkRFRkFVTFQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX0RFRkFVTFQ7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6TUlDOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpNSUM6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX01JQzsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9VUExJTks6CisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6OlZPSUNFX1VQTElOSzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX0RPV05MSU5LOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpWT0lDRV9ET1dOTElOSzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfQ0FMTDoKKyAgICAgICAgY2FzZSBBdWRpb1NvdXJjZTo6Vk9JQ0VfQ0FMTDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpDQU1DT1JERVI6CisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6OkNBTUNPUkRFUjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX1JFQ09HTklUSU9OOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpWT0lDRV9SRUNPR05JVElPTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgY2FzZSBBdWRpb1NvdXJjZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpSRU1PVEVfU1VCTUlYOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpSRU1PVEVfU1VCTUlYOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlVOUFJPQ0VTU0VEOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpVTlBST0NFU1NFRDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQ7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfUEVSRk9STUFOQ0U6CisgICAgICAgIGNhc2UgQXVkaW9Tb3VyY2U6OlZPSUNFX1BFUkZPUk1BTkNFOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpFQ0hPX1JFRkVSRU5DRToKKyAgICAgICAgY2FzZSBBdWRpb1NvdXJjZTo6VUxUUkFTT1VORDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVUxUUkFTT1VORDsKKyAgICAgICAgY2FzZSBBdWRpb1NvdXJjZTo6RUNIT19SRUZFUkVOQ0U6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkZNX1RVTkVSOgorICAgICAgICBjYXNlIEF1ZGlvU291cmNlOjpGTV9UVU5FUjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfRk1fVFVORVI7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6SE9UV09SRDoKKyAgICAgICAgY2FzZSBBdWRpb1NvdXJjZTo6SE9UV09SRDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfSE9UV09SRDsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlPiBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvU291cmNlPiBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZSgKICAgICAgICAgYXVkaW9fc291cmNlX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfSU5WQUxJRDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpJTlZBTElEOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU291cmNlOjpTWVNfUkVTRVJWRURfSU5WQUxJRDsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfREVGQVVMVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpERUZBVUxUOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU291cmNlOjpERUZBVUxUOwogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9NSUM6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6TUlDOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU291cmNlOjpNSUM7CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9VUExJTks7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OlZPSUNFX1VQTElOSzsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfRE9XTkxJTks7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OlZPSUNFX0RPV05MSU5LOwogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX0NBTEw7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OlZPSUNFX0NBTEw7CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpDQU1DT1JERVI7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OkNBTUNPUkRFUjsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT046Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfUkVDT0dOSVRJT047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OlZPSUNFX1JFQ09HTklUSU9OOwogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX0NPTU1VTklDQVRJT047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OlZPSUNFX0NPTU1VTklDQVRJT047CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6UkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1NvdXJjZTo6UkVNT1RFX1NVQk1JWDsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6VU5QUk9DRVNTRUQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OlVOUFJPQ0VTU0VEOwogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9QRVJGT1JNQU5DRTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1NvdXJjZTo6Vk9JQ0VfUEVSRk9STUFOQ0U7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1VMVFJBU09VTkQ6CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OlVMVFJBU09VTkQ7CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkVDSE9fUkVGRVJFTkNFOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU291cmNlOjpFQ0hPX1JFRkVSRU5DRTsKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Rk1fVFVORVI7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OkZNX1RVTkVSOwogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkhPVFdPUkQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Tb3VyY2U6OkhPVFdPUkQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CkBAIC05MDIsOCArMTgyMyw4IEBACiAvLyBUaGlzIHR5cGUgaXMgdW5uYW1lZCBpbiB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiwgdGh1cyB3ZSBuYW1lIGl0IGhlcmUuCiB1c2luZyBhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0X3VzZWNhc2UgPSBkZWNsdHlwZShhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0Ojp1c2VjYXNlKTsKIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0X3VzZWNhc2U+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlJiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlKSB7CitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHRfdXNlY2FzZT4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0TWl4RXh0VXNlQ2FzZSgKKyAgICAgICAgY29uc3QgQXVkaW9Qb3J0TWl4RXh0VXNlQ2FzZSYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSkgewogICAgIGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHRfdXNlY2FzZSBsZWdhY3k7CiAKICAgICBzd2l0Y2ggKHJvbGUpIHsKQEAgLTkyMCwxNiArMTg0MSwxNiBAQAogCiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFJvbGU6OlNJTks6CiAgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGJ1Zy4gQSBTSU5LIHJvbGUgY29ycmVzcG9uZHMgdG8gdGhlIHNvdXJjZSBmaWVsZC4KLSAgICAgICAgICAgIGxlZ2FjeS5zb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KAorICAgICAgICAgICAgbGVnYWN5LnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdCgKICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBzb3VyY2UpKSkpOwogICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTsKICAgICB9CiAgICAgTE9HX0FMV0FZU19GQVRBTCgiU2hvdWxkbid0IGdldCBoZXJlIik7IC8vIHdpdGggLVdlcnJvciwtV3N3aXRjaCBtYXkgY29tcGlsZS10aW1lIGZhaWwKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZT4gbGVnYWN5MmFpZGxfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZSgKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9Qb3J0TWl4RXh0VXNlQ2FzZT4gbGVnYWN5MmFpZGxfQXVkaW9Qb3J0TWl4RXh0VXNlQ2FzZSgKICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dF91c2VjYXNlJiBsZWdhY3ksIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpIHsKLSAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZSBhaWRsOworICAgIEF1ZGlvUG9ydE1peEV4dFVzZUNhc2UgYWlkbDsKIAogICAgIHN3aXRjaCAocm9sZSkgewogICAgICAgICBjYXNlIEFVRElPX1BPUlRfUk9MRV9OT05FOgpAQCAtOTQzLDUyICsxODY0LDUzIEBACiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9ST0xFX1NJTks6CiAgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGJ1Zy4gQSBTSU5LIHJvbGUgY29ycmVzcG9uZHMgdG8gdGhlIHNvdXJjZSBmaWVsZC4KICAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShsZWdhY3kuc291cmNlKSkpOworICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZShsZWdhY3kuc291cmNlKSkpOwogICAgICAgICAgICAgcmV0dXJuIGFpZGw7CiAgICAgfQogICAgIExPR19BTFdBWVNfRkFUQUwoIlNob3VsZG4ndCBnZXQgaGVyZSIpOyAvLyB3aXRoIC1XZXJyb3IsLVdzd2l0Y2ggbWF5IGNvbXBpbGUtdGltZSBmYWlsCiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0KAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnTWl4RXh0JiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlKSB7CitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydE1peEV4dCgKKyAgICAgICAgY29uc3QgQXVkaW9Qb3J0TWl4RXh0JiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlLAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0U3lzJiBhaWRsTWl4RXh0KSB7CiAgICAgYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dCBsZWdhY3k7Ci0gICAgbGVnYWN5Lmh3X21vZHVsZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChhaWRsLmh3TW9kdWxlKSk7CisgICAgbGVnYWN5Lmh3X21vZHVsZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KGFpZGxNaXhFeHQuaHdNb2R1bGUpKTsKICAgICBsZWdhY3kuaGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoYWlkbC5oYW5kbGUpKTsKLSAgICBsZWdhY3kudXNlY2FzZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlKGFpZGwudXNlY2FzZSwgcm9sZSkpOworICAgIGxlZ2FjeS51c2VjYXNlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydE1peEV4dFVzZUNhc2UoYWlkbC51c2VjYXNlLCByb2xlKSk7CiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnTWl4RXh0PiBsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdNaXhFeHQoCi0gICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSkgewotICAgIG1lZGlhOjpBdWRpb1BvcnRDb25maWdNaXhFeHQgYWlkbDsKLSAgICBhaWRsLmh3TW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5od19tb2R1bGUpKTsKLSAgICBhaWRsLmhhbmRsZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5oYW5kbGUpKTsKLSAgICBhaWRsLnVzZWNhc2UgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZShsZWdhY3kudXNlY2FzZSwgcm9sZSkpOwotICAgIHJldHVybiBhaWRsOworc3RhdHVzX3QgbGVnYWN5MmFpZGxfQXVkaW9Qb3J0TWl4RXh0KAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0JiBsZWdhY3ksIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgIEF1ZGlvUG9ydE1peEV4dCogYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dFN5cyogYWlkbE1peEV4dCkgeworICAgIGFpZGxNaXhFeHQtPmh3TW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5od19tb2R1bGUpKTsKKyAgICBhaWRsLT5oYW5kbGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QobGVnYWN5LmhhbmRsZSkpOworICAgIGFpZGwtPnVzZWNhc2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9Qb3J0TWl4RXh0VXNlQ2FzZShsZWdhY3kudXNlY2FzZSwgcm9sZSkpOworICAgIHJldHVybiBPSzsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dD4KLWFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHRfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0JiBhaWRsKSB7CithaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0KGludDMyX3QgYWlkbCkgewogICAgIGF1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0IGxlZ2FjeTsKLSAgICBsZWdhY3kuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhaWRsLnNlc3Npb24pKTsKKyAgICBsZWdhY3kuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhaWRsKSk7CiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dD4KLWxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0X0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQoCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CitsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dF9pbnQzMl90KAogICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dCYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQgYWlkbDsKLSAgICBhaWRsLnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3QobGVnYWN5LnNlc3Npb24pKTsKLSAgICByZXR1cm4gYWlkbDsKKyAgICByZXR1cm4gbGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3QobGVnYWN5LnNlc3Npb24pOwogfQogCiAvLyBUaGlzIHR5cGUgaXMgdW5uYW1lZCBpbiB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiwgdGh1cyB3ZSBuYW1lIGl0IGhlcmUuCiB1c2luZyBhdWRpb19wb3J0X2NvbmZpZ19leHQgPSBkZWNsdHlwZShhdWRpb19wb3J0X2NvbmZpZzo6ZXh0KTsKIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ0V4dCgKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ0V4dCYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSwKLSAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSkgeworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydEV4dF9hdWRpb19wb3J0X2NvbmZpZ19leHQoCisgICAgICAgIGNvbnN0IEF1ZGlvUG9ydEV4dCYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSwKKyAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSwgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydEV4dFN5cyYgYWlkbFN5cykgewogICAgIGF1ZGlvX3BvcnRfY29uZmlnX2V4dCBsZWdhY3k7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok5PTkU6CkBAIC05OTcsMTYgKzE5MTksMTkgQEAKICAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6OkRFVklDRToKICAgICAgICAgICAgIGxlZ2FjeS5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgZGV2aWNlKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RGV2aWNlRXh0X2F1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBkZXZpY2UpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGxTeXMsIGRldmljZSkpKSk7CiAgICAgICAgICAgICByZXR1cm4gbGVnYWN5OwogICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpNSVg6CiAgICAgICAgICAgICBsZWdhY3kubWl4ID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdNaXhFeHQoVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBtaXgpKSwgcm9sZSkpOworICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRNaXhFeHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBtaXgpKSwgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGxTeXMsIG1peCkpKSk7CiAgICAgICAgICAgICByZXR1cm4gbGVnYWN5OwogICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpTRVNTSU9OOgogICAgICAgICAgICAgbGVnYWN5LnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHRfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQoCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBzZXNzaW9uKSkpKTsKICAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CiAKQEAgLTEwMTQsOTAgKzE5MzksMTEzIEBACiAgICAgTE9HX0FMV0FZU19GQVRBTCgiU2hvdWxkbid0IGdldCBoZXJlIik7IC8vIHdpdGggLVdlcnJvciwtV3N3aXRjaCBtYXkgY29tcGlsZS10aW1lIGZhaWwKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRXh0PiBsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdFeHQoCi0gICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX2V4dCYgbGVnYWN5LCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKSB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ0V4dCBhaWRsOwotCitzdGF0dXNfdCBsZWdhY3kyYWlkbF9BdWRpb1BvcnRFeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX2V4dCYgbGVnYWN5LCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICBBdWRpb1BvcnRFeHQqIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRFeHRTeXMqIGFpZGxTeXMpIHsKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTk9ORToKLSAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCB1bnNwZWNpZmllZCwgZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIGFpZGw7Ci0gICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRToKLSAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dF9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5kZXZpY2UpKSk7Ci0gICAgICAgICAgICByZXR1cm4gYWlkbDsKLSAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTUlYOgotICAgICAgICAgICAgVU5JT05fU0VUKGFpZGwsIG1peCwKLSAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0KGxlZ2FjeS5taXgsIHJvbGUpKSk7Ci0gICAgICAgICAgICByZXR1cm4gYWlkbDsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbCwgdW5zcGVjaWZpZWQsIGZhbHNlKTsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbFN5cywgdW5zcGVjaWZpZWQsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfREVWSUNFOiB7CisgICAgICAgICAgICBBdWRpb1BvcnREZXZpY2VFeHQgZGV2aWNlOworICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dFN5cyBkZXZpY2VTeXM7CisgICAgICAgICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0X0F1ZGlvUG9ydERldmljZUV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kuZGV2aWNlLCAmZGV2aWNlLCAmZGV2aWNlU3lzKSk7CisgICAgICAgICAgICBVTklPTl9TRVQoKmFpZGwsIGRldmljZSwgZGV2aWNlKTsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbFN5cywgZGV2aWNlLCBkZXZpY2VTeXMpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDogeworICAgICAgICAgICAgQXVkaW9Qb3J0TWl4RXh0IG1peDsKKyAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvcnRNaXhFeHRTeXMgbWl4U3lzOworICAgICAgICAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihsZWdhY3kyYWlkbF9BdWRpb1BvcnRNaXhFeHQobGVnYWN5Lm1peCwgcm9sZSwgJm1peCwgJm1peFN5cykpOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsLCBtaXgsIG1peCk7CisgICAgICAgICAgICBVTklPTl9TRVQoKmFpZGxTeXMsIG1peCwgbWl4U3lzKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9TRVNTSU9OOgotICAgICAgICAgICAgVU5JT05fU0VUKGFpZGwsIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHRfQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5LnNlc3Npb24pKSk7Ci0gICAgICAgICAgICByZXR1cm4gYWlkbDsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbCwgc2Vzc2lvbiwgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dF9pbnQzMl90KGxlZ2FjeS5zZXNzaW9uKSkpOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsU3lzLCB1bnNwZWNpZmllZCwgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsgLy8gd2l0aCAtV2Vycm9yLC1Xc3dpdGNoIG1heSBjb21waWxlLXRpbWUgZmFpbAogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnPiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdfYXVkaW9fcG9ydF9jb25maWcoCiAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWcmIGFpZGwpIHsKLSAgICBhdWRpb19wb3J0X2NvbmZpZyBsZWdhY3k7Ci0gICAgbGVnYWN5LmlkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChhaWRsLmlkKSk7Ci0gICAgbGVnYWN5LnJvbGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Um9sZV9hdWRpb19wb3J0X3JvbGVfdChhaWRsLnJvbGUpKTsKLSAgICBsZWdhY3kudHlwZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRUeXBlX2F1ZGlvX3BvcnRfdHlwZV90KGFpZGwudHlwZSkpOwotICAgIGxlZ2FjeS5jb25maWdfbWFzayA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2NvbmZpZ19tYXNrKGFpZGwuY29uZmlnTWFzaykpOwotICAgIGlmIChiaXRtYXNrSXNTZXQoYWlkbC5jb25maWdNYXNrLCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6U0FNUExFX1JBVEUpKSB7Ci0gICAgICAgIGxlZ2FjeS5zYW1wbGVfcmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihhaWRsLnNhbXBsZVJhdGUpKTsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBsZWdhY3l7fTsKKyAgICBsZWdhY3kuaWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGFpZGwuaGFsLmlkKSk7CisgICAgbGVnYWN5LnJvbGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Um9sZV9hdWRpb19wb3J0X3JvbGVfdChhaWRsLnN5cy5yb2xlKSk7CisgICAgbGVnYWN5LnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0VHlwZV9hdWRpb19wb3J0X3R5cGVfdChhaWRsLnN5cy50eXBlKSk7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0KKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihkaXJlY3Rpb24oYWlkbC5zeXMucm9sZSwgYWlkbC5zeXMudHlwZSkpID09IERpcmVjdGlvbjo6SU5QVVQ7CisgICAgaWYgKGFpZGwuaGFsLnNhbXBsZVJhdGUuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgbGVnYWN5LnNhbXBsZV9yYXRlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KGFpZGwuaGFsLnNhbXBsZVJhdGUudmFsdWUoKS52YWx1ZSkpOworICAgICAgICBsZWdhY3kuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEU7CiAgICAgfQotICAgIGlmIChiaXRtYXNrSXNTZXQoYWlkbC5jb25maWdNYXNrLCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6Q0hBTk5FTF9NQVNLKSkgeworICAgIGlmIChhaWRsLmhhbC5jaGFubmVsTWFzay5oYXNfdmFsdWUoKSkgewogICAgICAgICBsZWdhY3kuY2hhbm5lbF9tYXNrID0KLSAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdChhaWRsLmNoYW5uZWxNYXNrKSk7CisgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2F1ZGlvX2NoYW5uZWxfbWFza190KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsLmhhbC5jaGFubmVsTWFzay52YWx1ZSgpLCBpc0lucHV0KSk7CisgICAgICAgIGxlZ2FjeS5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0s7CiAgICAgfQotICAgIGlmIChiaXRtYXNrSXNTZXQoYWlkbC5jb25maWdNYXNrLCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6Rk9STUFUKSkgewotICAgICAgICBsZWdhY3kuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGFpZGwuZm9ybWF0KSk7CisgICAgaWYgKGFpZGwuaGFsLmZvcm1hdC5oYXNfdmFsdWUoKSkgeworICAgICAgICBsZWdhY3kuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QoYWlkbC5oYWwuZm9ybWF0LnZhbHVlKCkpKTsKKyAgICAgICAgbGVnYWN5LmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVDsKICAgICB9Ci0gICAgaWYgKGJpdG1hc2tJc1NldChhaWRsLmNvbmZpZ01hc2ssIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpHQUlOKSkgewotICAgICAgICBsZWdhY3kuZ2FpbiA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5Db25maWdfYXVkaW9fZ2Fpbl9jb25maWcoYWlkbC5nYWluLCBhaWRsLnJvbGUsIGFpZGwudHlwZSkpOworICAgIGlmIChhaWRsLmhhbC5nYWluLmhhc192YWx1ZSgpKSB7CisgICAgICAgIGxlZ2FjeS5nYWluID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvR2FpbkNvbmZpZ19hdWRpb19nYWluX2NvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwuaGFsLmdhaW4udmFsdWUoKSwgaXNJbnB1dCkpOworICAgICAgICBsZWdhY3kuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfR0FJTjsKICAgICB9Ci0gICAgaWYgKGJpdG1hc2tJc1NldChhaWRsLmNvbmZpZ01hc2ssIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpGTEFHUykpIHsKKyAgICBpZiAoYWlkbC5oYWwuZmxhZ3MuaGFzX3ZhbHVlKCkpIHsKICAgICAgICAgbGVnYWN5LmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvSW9GbGFnc19hdWRpb19pb19mbGFncyhhaWRsLmZsYWdzLCBhaWRsLnJvbGUsIGFpZGwudHlwZSkpOworICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvSW9GbGFnc19hdWRpb19pb19mbGFncyhhaWRsLmhhbC5mbGFncy52YWx1ZSgpLCBpc0lucHV0KSk7CisgICAgICAgIGxlZ2FjeS5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKICAgICB9Ci0gICAgbGVnYWN5LmV4dCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdFeHQoYWlkbC5leHQsIGFpZGwudHlwZSwgYWlkbC5yb2xlKSk7CisgICAgbGVnYWN5LmV4dCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydEV4dF9hdWRpb19wb3J0X2NvbmZpZ19leHQoCisgICAgICAgICAgICAgICAgICAgIGFpZGwuaGFsLmV4dCwgYWlkbC5zeXMudHlwZSwgYWlkbC5zeXMucm9sZSwgYWlkbC5zeXMuZXh0KSk7CiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnPiBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19BdWRpb1BvcnRDb25maWcoCiAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnJiBsZWdhY3kpIHsKICAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnIGFpZGw7Ci0gICAgYWlkbC5pZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QobGVnYWN5LmlkKSk7Ci0gICAgYWlkbC5yb2xlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfcm9sZV90X0F1ZGlvUG9ydFJvbGUobGVnYWN5LnJvbGUpKTsKLSAgICBhaWRsLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF90eXBlX3RfQXVkaW9Qb3J0VHlwZShsZWdhY3kudHlwZSkpOwotICAgIGFpZGwuY29uZmlnTWFzayA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9jb25maWdfbWFza19pbnQzMl90KGxlZ2FjeS5jb25maWdfbWFzaykpOworICAgIGFpZGwuaGFsLmlkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaWQpKTsKKyAgICBhaWRsLnN5cy5yb2xlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfcm9sZV90X0F1ZGlvUG9ydFJvbGUobGVnYWN5LnJvbGUpKTsKKyAgICBhaWRsLnN5cy50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUobGVnYWN5LnR5cGUpKTsKKyAgICBjb25zdCBib29sIGlzSW5wdXQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBkaXJlY3Rpb24obGVnYWN5LnJvbGUsIGxlZ2FjeS50eXBlKSkgPT0gRGlyZWN0aW9uOjpJTlBVVDsKICAgICBpZiAobGVnYWN5LmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKLSAgICAgICAgYWlkbC5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuc2FtcGxlX3JhdGUpKTsKKyAgICAgICAgSW50IGFpZGxfc2FtcGxlUmF0ZTsKKyAgICAgICAgYWlkbF9zYW1wbGVSYXRlLnZhbHVlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuc2FtcGxlX3JhdGUpKTsKKyAgICAgICAgYWlkbC5oYWwuc2FtcGxlUmF0ZSA9IGFpZGxfc2FtcGxlUmF0ZTsKICAgICB9CiAgICAgaWYgKGxlZ2FjeS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgewotICAgICAgICBhaWRsLmNoYW5uZWxNYXNrID0KLSAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7CisgICAgICAgIGFpZGwuaGFsLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X0F1ZGlvQ2hhbm5lbExheW91dChsZWdhY3kuY2hhbm5lbF9tYXNrLCBpc0lucHV0KSk7CiAgICAgfQogICAgIGlmIChsZWdhY3kuY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKLSAgICAgICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LmZvcm1hdCkpOworICAgICAgICBhaWRsLmhhbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihsZWdhY3kuZm9ybWF0KSk7CiAgICAgfQogICAgIGlmIChsZWdhY3kuY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7Ci0gICAgICAgIGFpZGwuZ2FpbiA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19nYWluX2NvbmZpZ19BdWRpb0dhaW5Db25maWcoCi0gICAgICAgICAgICAgICAgbGVnYWN5LmdhaW4sIGxlZ2FjeS5yb2xlLCBsZWdhY3kudHlwZSkpOworICAgICAgICBhaWRsLmhhbC5nYWluID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fY29uZmlnX0F1ZGlvR2FpbkNvbmZpZyhsZWdhY3kuZ2FpbiwgaXNJbnB1dCkpOwogICAgIH0KICAgICBpZiAobGVnYWN5LmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MpIHsKLSAgICAgICAgYWlkbC5mbGFncyA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19mbGFnc19BdWRpb0lvRmxhZ3MobGVnYWN5LmZsYWdzLCBsZWdhY3kucm9sZSwgbGVnYWN5LnR5cGUpKTsKKyAgICAgICAgYWlkbC5oYWwuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9faW9fZmxhZ3NfQXVkaW9Jb0ZsYWdzKGxlZ2FjeS5mbGFncywgaXNJbnB1dCkpOwogICAgIH0KLSAgICBhaWRsLmV4dCA9Ci0gICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfQXVkaW9Qb3J0Q29uZmlnRXh0KGxlZ2FjeS5leHQsIGxlZ2FjeS50eXBlLCBsZWdhY3kucm9sZSkpOworICAgIFJFVFVSTl9JRl9FUlJPUihsZWdhY3kyYWlkbF9BdWRpb1BvcnRFeHQobGVnYWN5LmV4dCwgbGVnYWN5LnR5cGUsIGxlZ2FjeS5yb2xlLAorICAgICAgICAgICAgICAgICAgICAmYWlkbC5oYWwuZXh0LCAmYWlkbC5zeXMuZXh0KSk7CiAgICAgcmV0dXJuIGFpZGw7CiB9CiAKQEAgLTExNDgsMzMgKzIwOTYsNDAgQEAKIAogQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb0lvRGVzY3JpcHRvcj4+IGFpZGwybGVnYWN5X0F1ZGlvSW9EZXNjcmlwdG9yX0F1ZGlvSW9EZXNjcmlwdG9yKAogICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Jb0Rlc2NyaXB0b3ImIGFpZGwpIHsKLSAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gbGVnYWN5KG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpKTsKLSAgICBsZWdhY3ktPm1Jb0hhbmRsZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KGFpZGwuaW9IYW5kbGUpKTsKLSAgICBsZWdhY3ktPm1QYXRjaCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BhdGNoX2F1ZGlvX3BhdGNoKGFpZGwucGF0Y2gpKTsKLSAgICBsZWdhY3ktPm1TYW1wbGluZ1JhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLnNhbXBsaW5nUmF0ZSkpOwotICAgIGxlZ2FjeS0+bUZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdChhaWRsLmZvcm1hdCkpOwotICAgIGxlZ2FjeS0+bUNoYW5uZWxNYXNrID0KLSAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2spKTsKLSAgICBsZWdhY3ktPm1GcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxzaXplX3Q+KGFpZGwuZnJhbWVDb3VudCkpOwotICAgIGxlZ2FjeS0+bUZyYW1lQ291bnRIQUwgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbC5mcmFtZUNvdW50SEFMKSk7Ci0gICAgbGVnYWN5LT5tTGF0ZW5jeSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGwubGF0ZW5jeSkpOwotICAgIGxlZ2FjeS0+bVBvcnRJZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoYWlkbC5wb3J0SWQpKTsKLSAgICByZXR1cm4gbGVnYWN5OworICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoYWlkbC5pb0hhbmRsZSkpOworICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUGF0Y2hfYXVkaW9fcGF0Y2goYWlkbC5wYXRjaCkpOworICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IGFpZGwuaXNJbnB1dDsKKyAgICBjb25zdCB1aW50MzJfdCBzYW1wbGluZ19yYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5zYW1wbGluZ1JhdGUpKTsKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KGFpZGwuZm9ybWF0KSk7CisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbF9tYXNrID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2ssIGlzSW5wdXQpKTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVfY291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbC5mcmFtZUNvdW50KSk7CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lX2NvdW50X2hhbCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8c2l6ZV90PihhaWRsLmZyYW1lQ291bnRIQUwpKTsKKyAgICBjb25zdCB1aW50MzJfdCBsYXRlbmN5ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5sYXRlbmN5KSk7CisgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0X2lkID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGFpZGwucG9ydElkKSk7CisgICAgcmV0dXJuIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPjo6bWFrZShpb19oYW5kbGUsIHBhdGNoLCBpc0lucHV0LCBzYW1wbGluZ19yYXRlLCBmb3JtYXQsCisgICAgICAgICAgICBjaGFubmVsX21hc2ssIGZyYW1lX2NvdW50LCBmcmFtZV9jb3VudF9oYWwsIGxhdGVuY3ksIHBvcnRfaWQpOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lvRGVzY3JpcHRvcj4gbGVnYWN5MmFpZGxfQXVkaW9Jb0Rlc2NyaXB0b3JfQXVkaW9Jb0Rlc2NyaXB0b3IoCiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiYgbGVnYWN5KSB7CiAgICAgbWVkaWE6OkF1ZGlvSW9EZXNjcmlwdG9yIGFpZGw7Ci0gICAgYWlkbC5pb0hhbmRsZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS0+bUlvSGFuZGxlKSk7Ci0gICAgYWlkbC5wYXRjaCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wYXRjaF9BdWRpb1BhdGNoKGxlZ2FjeS0+bVBhdGNoKSk7Ci0gICAgYWlkbC5zYW1wbGluZ1JhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS0+bVNhbXBsaW5nUmF0ZSkpOwotICAgIGFpZGwuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KGxlZ2FjeS0+bUZvcm1hdCkpOwotICAgIGFpZGwuY2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGxlZ2FjeS0+bUNoYW5uZWxNYXNrKSk7Ci0gICAgYWlkbC5mcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihsZWdhY3ktPm1GcmFtZUNvdW50KSk7Ci0gICAgYWlkbC5mcmFtZUNvdW50SEFMID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihsZWdhY3ktPm1GcmFtZUNvdW50SEFMKSk7Ci0gICAgYWlkbC5sYXRlbmN5ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3ktPm1MYXRlbmN5KSk7Ci0gICAgYWlkbC5wb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS0+bVBvcnRJZCkpOworICAgIGFpZGwuaW9IYW5kbGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChsZWdhY3ktPmdldElvSGFuZGxlKCkpKTsKKyAgICBhaWRsLnBhdGNoID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BhdGNoX0F1ZGlvUGF0Y2gobGVnYWN5LT5nZXRQYXRjaCgpKSk7CisgICAgYWlkbC5pc0lucHV0ID0gbGVnYWN5LT5nZXRJc0lucHV0KCk7CisgICAgYWlkbC5zYW1wbGluZ1JhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS0+Z2V0U2FtcGxpbmdSYXRlKCkpKTsKKyAgICBhaWRsLmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24obGVnYWN5LT5nZXRGb3JtYXQoKSkpOworICAgIGFpZGwuY2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfQXVkaW9DaGFubmVsTGF5b3V0KAorICAgICAgICAgICAgICAgICAgICBsZWdhY3ktPmdldENoYW5uZWxNYXNrKCksIGxlZ2FjeS0+Z2V0SXNJbnB1dCgpKSk7CisgICAgYWlkbC5mcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihsZWdhY3ktPmdldEZyYW1lQ291bnQoKSkpOworICAgIGFpZGwuZnJhbWVDb3VudEhBTCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4obGVnYWN5LT5nZXRGcmFtZUNvdW50SEFMKCkpKTsKKyAgICBhaWRsLmxhdGVuY3kgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS0+Z2V0TGF0ZW5jeSgpKSk7CisgICAgYWlkbC5wb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS0+Z2V0UG9ydElkKCkpKTsKICAgICByZXR1cm4gYWlkbDsKIH0KIApAQCAtMTE5NSwxMzcgKzIxNTAsMTQzIEBACiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fY29udGVudF90eXBlX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb0NvbnRlbnRUeXBlX2F1ZGlvX2NvbnRlbnRfdHlwZV90KG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlIGFpZGwpIHsKK2FpZGwybGVnYWN5X0F1ZGlvQ29udGVudFR5cGVfYXVkaW9fY29udGVudF90eXBlX3QoQXVkaW9Db250ZW50VHlwZSBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6OlVOS05PV046CisgICAgICAgIGNhc2UgQXVkaW9Db250ZW50VHlwZTo6VU5LTk9XTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTjsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Db250ZW50VHlwZTo6U1BFRUNIOgorICAgICAgICBjYXNlIEF1ZGlvQ29udGVudFR5cGU6OlNQRUVDSDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpNVVNJQzoKKyAgICAgICAgY2FzZSBBdWRpb0NvbnRlbnRUeXBlOjpNVVNJQzoKICAgICAgICAgICAgIHJldHVybiBBVURJT19DT05URU5UX1RZUEVfTVVTSUM7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6Ok1PVklFOgorICAgICAgICBjYXNlIEF1ZGlvQ29udGVudFR5cGU6Ok1PVklFOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NPTlRFTlRfVFlQRV9NT1ZJRTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Db250ZW50VHlwZTo6U09OSUZJQ0FUSU9OOgorICAgICAgICBjYXNlIEF1ZGlvQ29udGVudFR5cGU6OlNPTklGSUNBVElPTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICBjYXNlIEF1ZGlvQ29udGVudFR5cGU6OlVMVFJBU09VTkQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fQ09OVEVOVF9UWVBFX1VMVFJBU09VTkQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvQ29udGVudFR5cGU+CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvQ29udGVudFR5cGU+CiBsZWdhY3kyYWlkbF9hdWRpb19jb250ZW50X3R5cGVfdF9BdWRpb0NvbnRlbnRUeXBlKGF1ZGlvX2NvbnRlbnRfdHlwZV90IGxlZ2FjeSkgewogICAgIHN3aXRjaCAobGVnYWN5KSB7CiAgICAgICAgIGNhc2UgQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV046Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6OlVOS05PV047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Db250ZW50VHlwZTo6VU5LTk9XTjsKICAgICAgICAgY2FzZSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpTUEVFQ0g7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Db250ZW50VHlwZTo6U1BFRUNIOwogICAgICAgICBjYXNlIEFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Db250ZW50VHlwZTo6TVVTSUM7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Db250ZW50VHlwZTo6TVVTSUM7CiAgICAgICAgIGNhc2UgQVVESU9fQ09OVEVOVF9UWVBFX01PVklFOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpNT1ZJRTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0NvbnRlbnRUeXBlOjpNT1ZJRTsKICAgICAgICAgY2FzZSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpTT05JRklDQVRJT047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Db250ZW50VHlwZTo6U09OSUZJQ0FUSU9OOworICAgICAgICBjYXNlIEFVRElPX0NPTlRFTlRfVFlQRV9VTFRSQVNPVU5EOgorICAgICAgICAgICAgcmV0dXJuIEF1ZGlvQ29udGVudFR5cGU6OlVMVFJBU09VTkQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdXNhZ2VfdD4KLWFpZGwybGVnYWN5X0F1ZGlvVXNhZ2VfYXVkaW9fdXNhZ2VfdChtZWRpYTo6QXVkaW9Vc2FnZSBhaWRsKSB7CithaWRsMmxlZ2FjeV9BdWRpb1VzYWdlX2F1ZGlvX3VzYWdlX3QoQXVkaW9Vc2FnZSBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OlVOS05PV046CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6SU5WQUxJRDoKKyAgICAgICAgICAgIGJyZWFrOyAgLy8gcmV0dXJuIGVycm9yCisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6VU5LTk9XTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9VTktOT1dOOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpNRURJQToKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpNRURJQToKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9NRURJQTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpWT0lDRV9DT01NVU5JQ0FUSU9OOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT047Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OlZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpWT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpBTEFSTToKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpBTEFSTToKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9BTEFSTTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9OT1RJRklDQVRJT047Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6OlNZU19SRVNFUlZFRF9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6U1lTX1JFU0VSVkVEX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpTWVNfUkVTRVJWRURfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX0VWRU5UOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6QVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpBU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpBU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpBU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6R0FNRToKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpHQU1FOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX0dBTUU7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OlZJUlRVQUxfU09VUkNFOgorICAgICAgICBjYXNlIEF1ZGlvVXNhZ2U6OlZJUlRVQUxfU09VUkNFOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpBU1NJU1RBTlQ6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6QVNTSVNUQU5UOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX0FTU0lTVEFOVDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6Q0FMTF9BU1NJU1RBTlQ6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6Q0FMTF9BU1NJU1RBTlQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfQ0FMTF9BU1NJU1RBTlQ7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkVNRVJHRU5DWToKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpFTUVSR0VOQ1k6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfRU1FUkdFTkNZOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpTQUZFVFk6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6U0FGRVRZOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX1NBRkVUWTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6VkVISUNMRV9TVEFUVVM6CisgICAgICAgIGNhc2UgQXVkaW9Vc2FnZTo6VkVISUNMRV9TVEFUVVM6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfVkVISUNMRV9TVEFUVVM7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkFOTk9VTkNFTUVOVDoKKyAgICAgICAgY2FzZSBBdWRpb1VzYWdlOjpBTk5PVU5DRU1FTlQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfQU5OT1VOQ0VNRU5UOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1VzYWdlPgorQ29udmVyc2lvblJlc3VsdDxBdWRpb1VzYWdlPgogbGVnYWN5MmFpZGxfYXVkaW9fdXNhZ2VfdF9BdWRpb1VzYWdlKGF1ZGlvX3VzYWdlX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpVTktOT1dOOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OlVOS05PV047CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6Ok1FRElBOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6Ok1FRElBOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OlZPSUNFX0NPTU1VTklDQVRJT047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTjsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OlZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpWT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkFMQVJNOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OkFMQVJNOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTjsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpTWVNfUkVTRVJWRURfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OlNZU19SRVNFUlZFRF9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6U1lTX1JFU0VSVkVEX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fRVZFTlQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX0VWRU5UOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6QVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWTsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpBU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkdBTUU7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6R0FNRTsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6VklSVFVBTF9TT1VSQ0U7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6VklSVFVBTF9TT1VSQ0U7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5UOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpBU1NJU1RBTlQ7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6QVNTSVNUQU5UOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0NBTExfQVNTSVNUQU5UOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpDQUxMX0FTU0lTVEFOVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpDQUxMX0FTU0lTVEFOVDsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9FTUVSR0VOQ1k6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkVNRVJHRU5DWTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpFTUVSR0VOQ1k7CiAgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfU0FGRVRZOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpTQUZFVFk7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Vc2FnZTo6U0FGRVRZOwogICAgICAgICBjYXNlIEFVRElPX1VTQUdFX1ZFSElDTEVfU1RBVFVTOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpWRUhJQ0xFX1NUQVRVUzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpWRUhJQ0xFX1NUQVRVUzsKICAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BTk5PVU5DRU1FTlQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkFOTk9VTkNFTUVOVDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1VzYWdlOjpBTk5PVU5DRU1FTlQ7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CkBAIC0xMzYxLDYgKzIzMjIsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX05PX1NZU1RFTV9DQVBUVVJFOwogICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0ZsYWc6OkNBUFRVUkVfUFJJVkFURToKICAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9GbGFnOjpDT05URU5UX1NQQVRJQUxJWkVEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfQ09OVEVOVF9TUEFUSUFMSVpFRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9GbGFnOjpORVZFUl9TUEFUSUFMSVpFOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfTkVWRVJfU1BBVElBTElaRTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9GbGFnOjpDQUxMX1JFRElSRUNUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfQ0FMTF9SRURJUkVDVElPTjsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KQEAgLTEzOTgsNiArMjM2NSwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0ZsYWc6Ok5PX1NZU1RFTV9DQVBUVVJFOwogICAgICAgICBjYXNlIEFVRElPX0ZMQUdfQ0FQVFVSRV9QUklWQVRFOgogICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0ZsYWc6OkNBUFRVUkVfUFJJVkFURTsKKyAgICAgICAgY2FzZSBBVURJT19GTEFHX0NPTlRFTlRfU1BBVElBTElaRUQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6Q09OVEVOVF9TUEFUSUFMSVpFRDsKKyAgICAgICAgY2FzZSBBVURJT19GTEFHX05FVkVSX1NQQVRJQUxJWkU6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6TkVWRVJfU1BBVElBTElaRTsKKyAgICAgICAgY2FzZSBBVURJT19GTEFHX0NBTExfUkVESVJFQ1RJT046CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6Q0FMTF9SRURJUkVDVElPTjsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KQEAgLTE0MjMsNyArMjM5Niw3IEBACiAgICAgbGVnYWN5LmNvbnRlbnRfdHlwZSA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29udGVudFR5cGVfYXVkaW9fY29udGVudF90eXBlX3QoYWlkbC5jb250ZW50VHlwZSkpOwogICAgIGxlZ2FjeS51c2FnZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1VzYWdlX2F1ZGlvX3VzYWdlX3QoYWlkbC51c2FnZSkpOwotICAgIGxlZ2FjeS5zb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KGFpZGwuc291cmNlKSk7CisgICAgbGVnYWN5LnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdChhaWRsLnNvdXJjZSkpOwogICAgIGxlZ2FjeS5mbGFncyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2ZsYWdzX21hc2tfdF9tYXNrKGFpZGwuZmxhZ3MpKTsKICAgICBSRVRVUk5fSUZfRVJST1IoYWlkbDJsZWdhY3lfc3RyaW5nKGFpZGwudGFncywgbGVnYWN5LnRhZ3MsIHNpemVvZihsZWdhY3kudGFncykpKTsKICAgICByZXR1cm4gbGVnYWN5OwpAQCAtMTQzNSw1MSArMjQwOCw1MSBAQAogICAgIGFpZGwuY29udGVudFR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb250ZW50X3R5cGVfdF9BdWRpb0NvbnRlbnRUeXBlKGxlZ2FjeS5jb250ZW50X3R5cGUpKTsKICAgICBhaWRsLnVzYWdlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3VzYWdlX3RfQXVkaW9Vc2FnZShsZWdhY3kudXNhZ2UpKTsKLSAgICBhaWRsLnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUobGVnYWN5LnNvdXJjZSkpOworICAgIGFpZGwuc291cmNlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKGxlZ2FjeS5zb3VyY2UpKTsKICAgICBhaWRsLmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2ZsYWdzX21hc2tfdF9pbnQzMl90X21hc2sobGVnYWN5LmZsYWdzKSk7CiAgICAgYWlkbC50YWdzID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX3N0cmluZyhsZWdhY3kudGFncywgc2l6ZW9mKGxlZ2FjeS50YWdzKSkpOwogICAgIHJldHVybiBhaWRsOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90PgotYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZV9hdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdChtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZSBhaWRsKSB7CithaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90KEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUgYWlkbCkgewogICAgIHN3aXRjaCAoYWlkbCkgewotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlOjpOT05FOgorICAgICAgICBjYXNlIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6OklOVkFMSUQ6CisgICAgICAgICAgICBicmVhazsgIC8vIHJldHVybiBlcnJvcgorICAgICAgICBjYXNlIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6Ok5PTkU6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fRU5DQVBTVUxBVElPTl9NT0RFX05PTkU7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6OkVMRU1FTlRBUllfU1RSRUFNOgorICAgICAgICBjYXNlIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6OkVMRU1FTlRBUllfU1RSRUFNOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0VOQ0FQU1VMQVRJT05fTU9ERV9FTEVNRU5UQVJZX1NUUkVBTTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6SEFORExFOgorICAgICAgICBjYXNlIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6OkhBTkRMRToKICAgICAgICAgICAgIHJldHVybiBBVURJT19FTkNBUFNVTEFUSU9OX01PREVfSEFORExFOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlPgorQ29udmVyc2lvblJlc3VsdDxBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlPgogbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3RfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZShhdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdCBsZWdhY3kpIHsKICAgICBzd2l0Y2ggKGxlZ2FjeSkgewogICAgICAgICBjYXNlIEFVRElPX0VOQ0FQU1VMQVRJT05fTU9ERV9OT05FOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlOjpOT05FOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6Ok5PTkU7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DQVBTVUxBVElPTl9NT0RFX0VMRU1FTlRBUllfU1RSRUFNOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlOjpFTEVNRU5UQVJZX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlOjpFTEVNRU5UQVJZX1NUUkVBTTsKICAgICAgICAgY2FzZSBBVURJT19FTkNBUFNVTEFUSU9OX01PREVfSEFORExFOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlOjpIQU5ETEU7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6SEFORExFOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX29mZmxvYWRfaW5mb190PgotYWlkbDJsZWdhY3lfQXVkaW9PZmZsb2FkSW5mb19hdWRpb19vZmZsb2FkX2luZm9fdChjb25zdCBtZWRpYTo6QXVkaW9PZmZsb2FkSW5mbyYgYWlkbCkgewotICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGxlZ2FjeTsKLSAgICBsZWdhY3kudmVyc2lvbiA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDE2X3Q+KGFpZGwudmVyc2lvbikpOwotICAgIGxlZ2FjeS5zaXplID0gc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KTsKLSAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGFpZGwuY29uZmlnKSk7Ci0gICAgbGVnYWN5LnNhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgIGxlZ2FjeS5jaGFubmVsX21hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgIGxlZ2FjeS5mb3JtYXQgPSBjb25maWcuZm9ybWF0OworYWlkbDJsZWdhY3lfQXVkaW9PZmZsb2FkSW5mb19hdWRpb19vZmZsb2FkX2luZm9fdChjb25zdCBBdWRpb09mZmxvYWRJbmZvJiBhaWRsKSB7CisgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgbGVnYWN5ID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICBhdWRpb19jb25maWdfYmFzZV90IGJhc2UgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChhaWRsLmJhc2UsIGZhbHNlIC8qaXNJbnB1dCovKSk7CisgICAgbGVnYWN5LnNhbXBsZV9yYXRlID0gYmFzZS5zYW1wbGVfcmF0ZTsKKyAgICBsZWdhY3kuY2hhbm5lbF9tYXNrID0gYmFzZS5jaGFubmVsX21hc2s7CisgICAgbGVnYWN5LmZvcm1hdCA9IGJhc2UuZm9ybWF0OwogICAgIGxlZ2FjeS5zdHJlYW1fdHlwZSA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KGFpZGwuc3RyZWFtVHlwZSkpOwotICAgIGxlZ2FjeS5iaXRfcmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGwuYml0UmF0ZSkpOworICAgIGxlZ2FjeS5iaXRfcmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGwuYml0UmF0ZVBlclNlY29uZCkpOwogICAgIGxlZ2FjeS5kdXJhdGlvbl91cyA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4oYWlkbC5kdXJhdGlvblVzKSk7CiAgICAgbGVnYWN5Lmhhc192aWRlbyA9IGFpZGwuaGFzVmlkZW87CiAgICAgbGVnYWN5LmlzX3N0cmVhbWluZyA9IGFpZGwuaXNTdHJlYW1pbmc7CkBAIC0xNDkzLDIxICsyNDY2LDIwIEBACiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9PZmZsb2FkSW5mbz4KK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9PZmZsb2FkSW5mbz4KIGxlZ2FjeTJhaWRsX2F1ZGlvX29mZmxvYWRfaW5mb190X0F1ZGlvT2ZmbG9hZEluZm8oY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGxlZ2FjeSkgewotICAgIG1lZGlhOjpBdWRpb09mZmxvYWRJbmZvIGFpZGw7CisgICAgQXVkaW9PZmZsb2FkSW5mbyBhaWRsOwogICAgIC8vIFZlcnNpb24gMC4xIGZpZWxkcy4KICAgICBpZiAobGVnYWN5LnNpemUgPCBvZmZzZXRvZihhdWRpb19vZmZsb2FkX2luZm9fdCwgdXNhZ2UpICsgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190Ojp1c2FnZSkpIHsKICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgYWlkbC52ZXJzaW9uID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kudmVyc2lvbikpOwotICAgIGFpZGwuY29uZmlnLnNhbXBsZVJhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5zYW1wbGVfcmF0ZSkpOwotICAgIGFpZGwuY29uZmlnLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7Ci0gICAgYWlkbC5jb25maWcuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KGxlZ2FjeS5mb3JtYXQpKTsKKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGJhc2UgPSB7IC5zYW1wbGVfcmF0ZSA9IGxlZ2FjeS5zYW1wbGVfcmF0ZSwKKyAgICAgICAgLmNoYW5uZWxfbWFzayA9IGxlZ2FjeS5jaGFubmVsX21hc2ssIC5mb3JtYXQgPSBsZWdhY3kuZm9ybWF0IH07CisgICAgYWlkbC5iYXNlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKAorICAgICAgICAgICAgICAgICAgICBiYXNlLCBmYWxzZSAvKmlzSW5wdXQqLykpOwogICAgIGFpZGwuc3RyZWFtVHlwZSA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKGxlZ2FjeS5zdHJlYW1fdHlwZSkpOwotICAgIGFpZGwuYml0UmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LmJpdF9yYXRlKSk7CisgICAgYWlkbC5iaXRSYXRlUGVyU2Vjb25kID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuYml0X3JhdGUpKTsKICAgICBhaWRsLmR1cmF0aW9uVXMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KGxlZ2FjeS5kdXJhdGlvbl91cykpOwogICAgIGFpZGwuaGFzVmlkZW8gPSBsZWdhY3kuaGFzX3ZpZGVvOwogICAgIGFpZGwuaXNTdHJlYW1pbmcgPSBsZWdhY3kuaXNfc3RyZWFtaW5nOwpAQCAtMTUzMSwyNSArMjUwMywyNSBAQAogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NvbmZpZ190PgotYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QoY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnJiBhaWRsKSB7Ci0gICAgYXVkaW9fY29uZmlnX3QgbGVnYWN5OwotICAgIGxlZ2FjeS5zYW1wbGVfcmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGwuc2FtcGxlUmF0ZSkpOwotICAgIGxlZ2FjeS5jaGFubmVsX21hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2spKTsKLSAgICBsZWdhY3kuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGFpZGwuZm9ybWF0KSk7CithaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChjb25zdCBBdWRpb0NvbmZpZyYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CisgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBsZWdhY3lCYXNlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoYWlkbC5iYXNlLCBpc0lucHV0KSk7CisgICAgYXVkaW9fY29uZmlnX3QgbGVnYWN5ID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIGxlZ2FjeS5zYW1wbGVfcmF0ZSA9IGxlZ2FjeUJhc2Uuc2FtcGxlX3JhdGU7CisgICAgbGVnYWN5LmNoYW5uZWxfbWFzayA9IGxlZ2FjeUJhc2UuY2hhbm5lbF9tYXNrOworICAgIGxlZ2FjeS5mb3JtYXQgPSBsZWdhY3lCYXNlLmZvcm1hdDsKICAgICBsZWdhY3kub2ZmbG9hZF9pbmZvID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9PZmZsb2FkSW5mb19hdWRpb19vZmZsb2FkX2luZm9fdChhaWRsLm9mZmxvYWRJbmZvKSk7CiAgICAgbGVnYWN5LmZyYW1lX2NvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5mcmFtZUNvdW50KSk7CiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Db25maWc+Ci1sZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25zdCBhdWRpb19jb25maWdfdCYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvQ29uZmlnIGFpZGw7Ci0gICAgYWlkbC5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuc2FtcGxlX3JhdGUpKTsKLSAgICBhaWRsLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7Ci0gICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LmZvcm1hdCkpOworQ29udmVyc2lvblJlc3VsdDxBdWRpb0NvbmZpZz4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbnN0IGF1ZGlvX2NvbmZpZ190JiBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgYmFzZSA9IHsgLnNhbXBsZV9yYXRlID0gbGVnYWN5LnNhbXBsZV9yYXRlLAorICAgICAgICAuY2hhbm5lbF9tYXNrID0gbGVnYWN5LmNoYW5uZWxfbWFzaywgLmZvcm1hdCA9IGxlZ2FjeS5mb3JtYXQgfTsKKyAgICBBdWRpb0NvbmZpZyBhaWRsOworICAgIGFpZGwuYmFzZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShiYXNlLCBpc0lucHV0KSk7CiAgICAgYWlkbC5vZmZsb2FkSW5mbyA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX29mZmxvYWRfaW5mb190X0F1ZGlvT2ZmbG9hZEluZm8obGVnYWN5Lm9mZmxvYWRfaW5mbykpOwogICAgIGFpZGwuZnJhbWVDb3VudCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4obGVnYWN5LmZyYW1lX2NvdW50KSk7CkBAIC0xNTU3LDIyICsyNTI5LDIyIEBACiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fY29uZmlnX2Jhc2VfdD4KLWFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UmIGFpZGwpIHsKK2FpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGNvbnN0IEF1ZGlvQ29uZmlnQmFzZSYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CiAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBsZWdhY3k7CiAgICAgbGVnYWN5LnNhbXBsZV9yYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5zYW1wbGVSYXRlKSk7CiAgICAgbGVnYWN5LmNoYW5uZWxfbWFzayA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoYWlkbC5jaGFubmVsTWFzaykpOwotICAgIGxlZ2FjeS5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoYWlkbC5mb3JtYXQpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ2hhbm5lbExheW91dF9hdWRpb19jaGFubmVsX21hc2tfdChhaWRsLmNoYW5uZWxNYXNrLCBpc0lucHV0KSk7CisgICAgbGVnYWN5LmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KGFpZGwuZm9ybWF0KSk7CiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Db25maWdCYXNlPgotbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSBhaWRsOworQ29udmVyc2lvblJlc3VsdDxBdWRpb0NvbmZpZ0Jhc2U+CitsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIEF1ZGlvQ29uZmlnQmFzZSBhaWRsOwogICAgIGFpZGwuc2FtcGxlUmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LnNhbXBsZV9yYXRlKSk7CiAgICAgYWlkbC5jaGFubmVsTWFzayA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QobGVnYWN5LmNoYW5uZWxfbWFzaykpOwotICAgIGFpZGwuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KGxlZ2FjeS5mb3JtYXQpKTsKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X0F1ZGlvQ2hhbm5lbExheW91dChsZWdhY3kuY2hhbm5lbF9tYXNrLCBpc0lucHV0KSk7CisgICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihsZWdhY3kuZm9ybWF0KSk7CiAgICAgcmV0dXJuIGFpZGw7CiB9CiAKQEAgLTE2MzEsNyArMjYwMyw3IEBACiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdXVpZF90PgotYWlkbDJsZWdhY3lfQXVkaW9VdWlkX2F1ZGlvX3V1aWRfdChjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiBhaWRsKSB7CithaWRsMmxlZ2FjeV9BdWRpb1V1aWRfYXVkaW9fdXVpZF90KGNvbnN0IEF1ZGlvVXVpZCYgYWlkbCkgewogICAgIGF1ZGlvX3V1aWRfdCBsZWdhY3k7CiAgICAgbGVnYWN5LnRpbWVMb3cgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydFJlaW50ZXJwcmV0PHVpbnQzMl90PihhaWRsLnRpbWVMb3cpKTsKICAgICBsZWdhY3kudGltZU1pZCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDE2X3Q+KGFpZGwudGltZU1pZCkpOwpAQCAtMTY0NCw5ICsyNjE2LDkgQEAKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1V1aWQ+CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvVXVpZD4KIGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQoY29uc3QgYXVkaW9fdXVpZF90JiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6QXVkaW9VdWlkIGFpZGw7CisgICAgQXVkaW9VdWlkIGFpZGw7CiAgICAgYWlkbC50aW1lTG93ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kudGltZUxvdykpOwogICAgIGFpZGwudGltZU1pZCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LnRpbWVNaWQpKTsKICAgICBhaWRsLnRpbWVIaUFuZFZlcnNpb24gPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS50aW1lSGlBbmRWZXJzaW9uKSk7CkBAIC0xNjg3LDI4ICsyNjU5LDI4IEBACiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3Q+CiBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUgYWlkbCkgeworICAgICAgICBBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUgYWlkbCkgewogICAgIHN3aXRjaCAoYWlkbCkgewotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6Ok5PTkU6CisgICAgICAgIGNhc2UgQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOjpOT05FOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0VOQ0FQU1VMQVRJT05fTUVUQURBVEFfVFlQRV9OT05FOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6OkZSQU1FV09SS19UVU5FUjoKKyAgICAgICAgY2FzZSBBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6OkZSQU1FV09SS19UVU5FUjoKICAgICAgICAgICAgIHJldHVybiBBVURJT19FTkNBUFNVTEFUSU9OX01FVEFEQVRBX1RZUEVfRlJBTUVXT1JLX1RVTkVSOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6OkRWQl9BRF9ERVNDUklQVE9SOgorICAgICAgICBjYXNlIEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZTo6RFZCX0FEX0RFU0NSSVBUT1I6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fRU5DQVBTVUxBVElPTl9NRVRBREFUQV9UWVBFX0RWQl9BRF9ERVNDUklQVE9SOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU+CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZT4KIGxlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSgKICAgICAgICAgYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19FTkNBUFNVTEFUSU9OX01FVEFEQVRBX1RZUEVfTk9ORToKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOjpOT05FOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZTo6Tk9ORTsKICAgICAgICAgY2FzZSBBVURJT19FTkNBUFNVTEFUSU9OX01FVEFEQVRBX1RZUEVfRlJBTUVXT1JLX1RVTkVSOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6OkZSQU1FV09SS19UVU5FUjsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU6OkZSQU1FV09SS19UVU5FUjsKICAgICAgICAgY2FzZSBBVURJT19FTkNBUFNVTEFUSU9OX01FVEFEQVRBX1RZUEVfRFZCX0FEX0RFU0NSSVBUT1I6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZTo6RFZCX0FEX0RFU0NSSVBUT1I7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOjpEVkJfQURfREVTQ1JJUFRPUjsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KQEAgLTE3MTgsOSArMjY5MCw5IEBACiAgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPHVpbnQzMl90LAogICAgICAgICAgICAgaW50MzJfdCwKICAgICAgICAgICAgIGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90LAotICAgICAgICAgICAgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU+KAorICAgICAgICAgICAgQXVkaW9FbmNhcHN1bGF0aW9uTW9kZT4oCiAgICAgICAgICAgICBhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90LAotICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8bWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU+LAorICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8QXVkaW9FbmNhcHN1bGF0aW9uTW9kZT4sCiAgICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PHVpbnQzMl90LCBhdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdD4pOwogfQogCkBAIC0xNzI4LDExICsyNzAwLDExIEBACiBsZWdhY3kyYWlkbF9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX21hc2sodWludDMyX3QgbGVnYWN5KSB7CiAgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGludDMyX3QsCiAgICAgICAgICAgICB1aW50MzJfdCwKLSAgICAgICAgICAgIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLAorICAgICAgICAgICAgQXVkaW9FbmNhcHN1bGF0aW9uTW9kZSwKICAgICAgICAgICAgIGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90PigKICAgICAgICAgICAgIGxlZ2FjeSwgbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3RfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZSwKICAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90PiwKLSAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU+KTsKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgQXVkaW9FbmNhcHN1bGF0aW9uTW9kZT4pOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PHVpbnQzMl90PgpAQCAtMTc0MCw5ICsyNzEyLDkgQEAKICAgICByZXR1cm4gY29udmVydEJpdG1hc2s8dWludDMyX3QsCiAgICAgICAgICAgICBpbnQzMl90LAogICAgICAgICAgICAgYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3QsCi0gICAgICAgICAgICBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPigKKyAgICAgICAgICAgIEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZT4oCiAgICAgICAgICAgICBhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3QsCi0gICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPiwKKyAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZT4sCiAgICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PHVpbnQzMl90LCBhdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdD4pOwogfQogCkBAIC0xNzUwLDEwNCArMjcyMiw3OSBAQAogbGVnYWN5MmFpZGxfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX21hc2sodWludDMyX3QgbGVnYWN5KSB7CiAgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGludDMyX3QsCiAgICAgICAgICAgICB1aW50MzJfdCwKLSAgICAgICAgICAgIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUsCisgICAgICAgICAgICBBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUsCiAgICAgICAgICAgICBhdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdD4oCiAgICAgICAgICAgICBsZWdhY3ksIGxlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSwKICAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PGF1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90PiwKLSAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZT4pOwotfQotCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb01peExhdGVuY3lDbGFzc19hdWRpb19taXhfbGF0ZW5jeV9jbGFzc190KAotICAgICAgICBtZWRpYTo6QXVkaW9NaXhMYXRlbmN5Q2xhc3MgYWlkbCkgewotICAgIHN3aXRjaCAoYWlkbCkgewotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzczo6TE9XOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX0xBVEVOQ1lfTE9XOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzczo6Tk9STUFMOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX0xBVEVOQ1lfTk9STUFMOwotICAgIH0KLSAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwotfQotCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzcz4KLWxlZ2FjeTJhaWRsX2F1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3RfQXVkaW9NaXhMYXRlbmN5Q2xhc3MoCi0gICAgICAgIGF1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3QgbGVnYWN5KSB7Ci0gICAgc3dpdGNoIChsZWdhY3kpIHsKLSAgICAgICAgY2FzZSBBVURJT19MQVRFTkNZX0xPVzoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9NaXhMYXRlbmN5Q2xhc3M6OkxPVzsKLSAgICAgICAgY2FzZSBBVURJT19MQVRFTkNZX05PUk1BTDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9NaXhMYXRlbmN5Q2xhc3M6Ok5PUk1BTDsKLSAgICB9Ci0gICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPik7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9kZXZpY2VfZXh0PgotYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RGV2aWNlRXh0X2F1ZGlvX3BvcnRfZGV2aWNlX2V4dChjb25zdCBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0JiBhaWRsKSB7CithaWRsMmxlZ2FjeV9BdWRpb1BvcnREZXZpY2VFeHRfYXVkaW9fcG9ydF9kZXZpY2VfZXh0KAorICAgICAgICBjb25zdCBBdWRpb1BvcnREZXZpY2VFeHQmIGFpZGwsIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHRTeXMmIGFpZGxTeXMpIHsKICAgICBhdWRpb19wb3J0X2RldmljZV9leHQgbGVnYWN5OwotICAgIGxlZ2FjeS5od19tb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QoYWlkbC5od01vZHVsZSkpOwotICAgIGxlZ2FjeS50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGFpZGwuZGV2aWNlLnR5cGUpKTsKLSAgICBSRVRVUk5fSUZfRVJST1IoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9zdHJpbmcoYWlkbC5kZXZpY2UuYWRkcmVzcywgbGVnYWN5LmFkZHJlc3MsIHNpemVvZihsZWdhY3kuYWRkcmVzcykpKTsKKyAgICBsZWdhY3kuaHdfbW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QoYWlkbFN5cy5od01vZHVsZSkpOworICAgIFJFVFVSTl9JRl9FUlJPUihhaWRsMmxlZ2FjeV9BdWRpb0RldmljZV9hdWRpb19kZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIGFpZGwuZGV2aWNlLCAmbGVnYWN5LnR5cGUsIGxlZ2FjeS5hZGRyZXNzKSk7CiAgICAgbGVnYWN5LmVuY2Fwc3VsYXRpb25fbW9kZXMgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX21hc2soYWlkbC5lbmNhcHN1bGF0aW9uTW9kZXMpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayhhaWRsU3lzLmVuY2Fwc3VsYXRpb25Nb2RlcykpOwogICAgIGxlZ2FjeS5lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVzID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX21hc2soYWlkbC5lbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcykpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX21hc2soCisgICAgICAgICAgICAgICAgICAgIGFpZGxTeXMuZW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMpKTsKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHQ+Ci1sZWdhY3kyYWlkbF9hdWRpb19wb3J0X2RldmljZV9leHRfQXVkaW9Qb3J0RGV2aWNlRXh0KGNvbnN0IGF1ZGlvX3BvcnRfZGV2aWNlX2V4dCYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dCBhaWRsOwotICAgIGFpZGwuaHdNb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobGVnYWN5Lmh3X21vZHVsZSkpOwotICAgIGFpZGwuZGV2aWNlLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QobGVnYWN5LnR5cGUpKTsKLSAgICBhaWRsLmRldmljZS5hZGRyZXNzID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfc3RyaW5nKGxlZ2FjeS5hZGRyZXNzLCBzaXplb2YobGVnYWN5LmFkZHJlc3MpKSk7Ci0gICAgYWlkbC5lbmNhcHN1bGF0aW9uTW9kZXMgPSBWQUxVRV9PUl9SRVRVUk4oCitzdGF0dXNfdCBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2RldmljZV9leHRfQXVkaW9Qb3J0RGV2aWNlRXh0KAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2RldmljZV9leHQmIGxlZ2FjeSwKKyAgICAgICAgQXVkaW9Qb3J0RGV2aWNlRXh0KiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0U3lzKiBhaWRsRGV2aWNlRXh0KSB7CisgICAgYWlkbERldmljZUV4dC0+aHdNb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobGVnYWN5Lmh3X21vZHVsZSkpOworICAgIGFpZGwtPmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VfQXVkaW9EZXZpY2UobGVnYWN5LnR5cGUsIGxlZ2FjeS5hZGRyZXNzKSk7CisgICAgYWlkbERldmljZUV4dC0+ZW5jYXBzdWxhdGlvbk1vZGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayhsZWdhY3kuZW5jYXBzdWxhdGlvbl9tb2RlcykpOwotICAgIGFpZGwuZW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgYWlkbERldmljZUV4dC0+ZW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX21hc2sobGVnYWN5LmVuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZXMpKTsKLSAgICByZXR1cm4gYWlkbDsKKyAgICByZXR1cm4gT0s7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9taXhfZXh0PgotYWlkbDJsZWdhY3lfQXVkaW9Qb3J0TWl4RXh0X2F1ZGlvX3BvcnRfbWl4X2V4dChjb25zdCBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0JiBhaWRsKSB7Ci0gICAgYXVkaW9fcG9ydF9taXhfZXh0IGxlZ2FjeTsKLSAgICBsZWdhY3kuaHdfbW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KGFpZGwuaHdNb2R1bGUpKTsKK2FpZGwybGVnYWN5X0F1ZGlvUG9ydE1peEV4dF9hdWRpb19wb3J0X21peF9leHQoCisgICAgICAgIGNvbnN0IEF1ZGlvUG9ydE1peEV4dCYgYWlkbCwgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dFN5cyYgYWlkbFN5cykgeworICAgIGF1ZGlvX3BvcnRfbWl4X2V4dCBsZWdhY3l7fTsKKyAgICBsZWdhY3kuaHdfbW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KGFpZGxTeXMuaHdNb2R1bGUpKTsKICAgICBsZWdhY3kuaGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoYWlkbC5oYW5kbGUpKTsKLSAgICBsZWdhY3kubGF0ZW5jeV9jbGFzcyA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvTWl4TGF0ZW5jeUNsYXNzX2F1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3QoYWlkbC5sYXRlbmN5Q2xhc3MpKTsKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRNaXhFeHQ+Ci1sZWdhY3kyYWlkbF9hdWRpb19wb3J0X21peF9leHRfQXVkaW9Qb3J0TWl4RXh0KGNvbnN0IGF1ZGlvX3BvcnRfbWl4X2V4dCYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dCBhaWRsOwotICAgIGFpZGwuaHdNb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobGVnYWN5Lmh3X21vZHVsZSkpOwotICAgIGFpZGwuaGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QobGVnYWN5LmhhbmRsZSkpOwotICAgIGFpZGwubGF0ZW5jeUNsYXNzID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdF9BdWRpb01peExhdGVuY3lDbGFzcyhsZWdhY3kubGF0ZW5jeV9jbGFzcykpOwotICAgIHJldHVybiBhaWRsOworc3RhdHVzX3QKK2xlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfbWl4X2V4dF9BdWRpb1BvcnRNaXhFeHQoY29uc3QgYXVkaW9fcG9ydF9taXhfZXh0JiBsZWdhY3ksCisgICAgICAgIEF1ZGlvUG9ydE1peEV4dCogYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dFN5cyogYWlkbE1peEV4dCkgeworICAgIGFpZGxNaXhFeHQtPmh3TW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5od19tb2R1bGUpKTsKKyAgICBhaWRsLT5oYW5kbGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QobGVnYWN5LmhhbmRsZSkpOworICAgIHJldHVybiBPSzsKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X3Nlc3Npb25fZXh0PgotYWlkbDJsZWdhY3lfQXVkaW9Qb3J0U2Vzc2lvbkV4dF9hdWRpb19wb3J0X3Nlc3Npb25fZXh0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRTZXNzaW9uRXh0JiBhaWRsKSB7CithaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHQoaW50MzJfdCBhaWRsKSB7CiAgICAgYXVkaW9fcG9ydF9zZXNzaW9uX2V4dCBsZWdhY3k7Ci0gICAgbGVnYWN5LnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3QoYWlkbC5zZXNzaW9uKSk7CisgICAgbGVnYWN5LnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3QoYWlkbCkpOwogICAgIHJldHVybiBsZWdhY3k7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydFNlc3Npb25FeHQ+Ci1sZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Nlc3Npb25fZXh0X0F1ZGlvUG9ydFNlc3Npb25FeHQoY29uc3QgYXVkaW9fcG9ydF9zZXNzaW9uX2V4dCYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydFNlc3Npb25FeHQgYWlkbDsKLSAgICBhaWRsLnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3QobGVnYWN5LnNlc3Npb24pKTsKLSAgICByZXR1cm4gYWlkbDsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHRfaW50MzJfdChjb25zdCBhdWRpb19wb3J0X3Nlc3Npb25fZXh0JiBsZWdhY3kpIHsKKyAgICByZXR1cm4gbGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3QobGVnYWN5LnNlc3Npb24pOwogfQogCiAvLyBUaGlzIHR5cGUgaXMgdW5uYW1lZCBpbiB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiwgdGh1cyB3ZSBuYW1lIGl0IGhlcmUuCiB1c2luZyBhdWRpb19wb3J0X3Y3X2V4dCA9IGRlY2x0eXBlKGF1ZGlvX3BvcnRfdjc6OmV4dCk7CiAKLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF92N19leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydEV4dCgKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydEV4dCYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSkgeworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X3Y3X2V4dD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RXh0X2F1ZGlvX3BvcnRfdjdfZXh0KAorICAgICAgICBjb25zdCBBdWRpb1BvcnRFeHQmIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRUeXBlIHR5cGUsCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRFeHRTeXMmIGFpZGxTeXMpIHsKICAgICBhdWRpb19wb3J0X3Y3X2V4dCBsZWdhY3k7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok5PTkU6CkBAIC0xODU3LDY2ICsyODA0LDgzIEBACiAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6OkRFVklDRToKICAgICAgICAgICAgIGxlZ2FjeS5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydERldmljZUV4dF9hdWRpb19wb3J0X2RldmljZV9leHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBkZXZpY2UpKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgZGV2aWNlKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsU3lzLCBkZXZpY2UpKSkpOwogICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTsKICAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6TUlYOgogICAgICAgICAgICAgbGVnYWN5Lm1peCA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0TWl4RXh0X2F1ZGlvX3BvcnRfbWl4X2V4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIG1peCkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBtaXgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGxTeXMsIG1peCkpKSk7CiAgICAgICAgICAgICByZXR1cm4gbGVnYWN5OwogICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpTRVNTSU9OOgotICAgICAgICAgICAgbGVnYWN5LnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0U2Vzc2lvbkV4dF9hdWRpb19wb3J0X3Nlc3Npb25fZXh0KAotICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIHNlc3Npb24pKSkpOworICAgICAgICAgICAgbGVnYWN5LnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9zZXNzaW9uX2V4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIHNlc3Npb24pKSkpOwogICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTsKIAogICAgIH0KICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsgLy8gd2l0aCAtV2Vycm9yLC1Xc3dpdGNoIG1heSBjb21waWxlLXRpbWUgZmFpbAogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRFeHQ+IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydEV4dCgKLSAgICAgICAgY29uc3QgYXVkaW9fcG9ydF92N19leHQmIGxlZ2FjeSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSkgewotICAgIG1lZGlhOjpBdWRpb1BvcnRFeHQgYWlkbDsKK3N0YXR1c190IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydEV4dCgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF92N19leHQmIGxlZ2FjeSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgQXVkaW9Qb3J0RXh0KiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0RXh0U3lzKiBhaWRsU3lzKSB7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX05PTkU6Ci0gICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgdW5zcGVjaWZpZWQsIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBhaWRsOwotICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U6Ci0gICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfZGV2aWNlX2V4dF9BdWRpb1BvcnREZXZpY2VFeHQobGVnYWN5LmRldmljZSkpKTsKLSAgICAgICAgICAgIHJldHVybiBhaWRsOwotICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9NSVg6Ci0gICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgbWl4LAotICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X21peF9leHRfQXVkaW9Qb3J0TWl4RXh0KGxlZ2FjeS5taXgpKSk7Ci0gICAgICAgICAgICByZXR1cm4gYWlkbDsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbCwgdW5zcGVjaWZpZWQsIGZhbHNlKTsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbFN5cywgdW5zcGVjaWZpZWQsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfREVWSUNFOiB7CisgICAgICAgICAgICBBdWRpb1BvcnREZXZpY2VFeHQgZGV2aWNlOworICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dFN5cyBkZXZpY2VTeXM7CisgICAgICAgICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2RldmljZV9leHRfQXVkaW9Qb3J0RGV2aWNlRXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5kZXZpY2UsICZkZXZpY2UsICZkZXZpY2VTeXMpKTsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbCwgZGV2aWNlLCBkZXZpY2UpOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsU3lzLCBkZXZpY2UsIGRldmljZVN5cyk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTUlYOiB7CisgICAgICAgICAgICBBdWRpb1BvcnRNaXhFeHQgbWl4OworICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dFN5cyBtaXhTeXM7CisgICAgICAgICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X21peF9leHRfQXVkaW9Qb3J0TWl4RXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5taXgsICZtaXgsICZtaXhTeXMpKTsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbCwgbWl4LCBtaXgpOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsU3lzLCBtaXgsIG1peFN5cyk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfU0VTU0lPTjoKLSAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Nlc3Npb25fZXh0X0F1ZGlvUG9ydFNlc3Npb25FeHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kuc2Vzc2lvbikpKTsKLSAgICAgICAgICAgIHJldHVybiBhaWRsOworICAgICAgICAgICAgVU5JT05fU0VUKCphaWRsLCBzZXNzaW9uLCBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHRfaW50MzJfdChsZWdhY3kuc2Vzc2lvbikpKTsKKyAgICAgICAgICAgIFVOSU9OX1NFVCgqYWlkbFN5cywgdW5zcGVjaWZpZWQsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAgICAgTE9HX0FMV0FZU19GQVRBTCgiU2hvdWxkbid0IGdldCBoZXJlIik7IC8vIHdpdGggLVdlcnJvciwtV3N3aXRjaCBtYXkgY29tcGlsZS10aW1lIGZhaWwKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wcm9maWxlPgotYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlX2F1ZGlvX3Byb2ZpbGUoY29uc3QgbWVkaWE6OkF1ZGlvUHJvZmlsZSYgYWlkbCkgeworYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlX2F1ZGlvX3Byb2ZpbGUoY29uc3QgQXVkaW9Qcm9maWxlJiBhaWRsLCBib29sIGlzSW5wdXQpIHsKICAgICBhdWRpb19wcm9maWxlIGxlZ2FjeTsKLSAgICBsZWdhY3kuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGFpZGwuZm9ybWF0KSk7CisgICAgbGVnYWN5LmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KGFpZGwuZm9ybWF0KSk7CiAKLSAgICBpZiAoYWlkbC5zYW1wbGluZ1JhdGVzLnNpemUoKSA+IHN0ZDo6c2l6ZShsZWdhY3kuc2FtcGxlX3JhdGVzKSkgeworICAgIGlmIChhaWRsLnNhbXBsZVJhdGVzLnNpemUoKSA+IHN0ZDo6c2l6ZShsZWdhY3kuc2FtcGxlX3JhdGVzKSkgewogICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogICAgIH0KICAgICBSRVRVUk5fSUZfRVJST1IoCi0gICAgICAgICAgICBjb252ZXJ0UmFuZ2UoYWlkbC5zYW1wbGluZ1JhdGVzLmJlZ2luKCksIGFpZGwuc2FtcGxpbmdSYXRlcy5lbmQoKSwgbGVnYWN5LnNhbXBsZV9yYXRlcywKKyAgICAgICAgICAgIGNvbnZlcnRSYW5nZShhaWRsLnNhbXBsZVJhdGVzLmJlZ2luKCksIGFpZGwuc2FtcGxlUmF0ZXMuZW5kKCksIGxlZ2FjeS5zYW1wbGVfcmF0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydEludGVncmFsPGludDMyX3QsIHVuc2lnbmVkIGludD4pKTsKLSAgICBsZWdhY3kubnVtX3NhbXBsZV9yYXRlcyA9IGFpZGwuc2FtcGxpbmdSYXRlcy5zaXplKCk7CisgICAgbGVnYWN5Lm51bV9zYW1wbGVfcmF0ZXMgPSBhaWRsLnNhbXBsZVJhdGVzLnNpemUoKTsKIAogICAgIGlmIChhaWRsLmNoYW5uZWxNYXNrcy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmNoYW5uZWxfbWFza3MpKSB7CiAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIFJFVFVSTl9JRl9FUlJPUigKICAgICAgICAgICAgIGNvbnZlcnRSYW5nZShhaWRsLmNoYW5uZWxNYXNrcy5iZWdpbigpLCBhaWRsLmNoYW5uZWxNYXNrcy5lbmQoKSwgbGVnYWN5LmNoYW5uZWxfbWFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdCkpOworICAgICAgICAgICAgICAgICAgICBbaXNJbnB1dF0oY29uc3QgQXVkaW9DaGFubmVsTGF5b3V0JiBsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2F1ZGlvX2NoYW5uZWxfbWFza190KGwsIGlzSW5wdXQpOworICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgbGVnYWN5Lm51bV9jaGFubmVsX21hc2tzID0gYWlkbC5jaGFubmVsTWFza3Muc2l6ZSgpOwogCiAgICAgbGVnYWN5LmVuY2Fwc3VsYXRpb25fdHlwZSA9IFZBTFVFX09SX1JFVFVSTigKQEAgLTE5MjQsMTcgKzI4ODgsMTcgQEAKICAgICByZXR1cm4gbGVnYWN5OwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1Byb2ZpbGU+Ci1sZWdhY3kyYWlkbF9hdWRpb19wcm9maWxlX0F1ZGlvUHJvZmlsZShjb25zdCBhdWRpb19wcm9maWxlJiBsZWdhY3kpIHsKLSAgICBtZWRpYTo6QXVkaW9Qcm9maWxlIGFpZGw7Ci0gICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LmZvcm1hdCkpOworQ29udmVyc2lvblJlc3VsdDxBdWRpb1Byb2ZpbGU+CitsZWdhY3kyYWlkbF9hdWRpb19wcm9maWxlX0F1ZGlvUHJvZmlsZShjb25zdCBhdWRpb19wcm9maWxlJiBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIEF1ZGlvUHJvZmlsZSBhaWRsOworICAgIGFpZGwuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24obGVnYWN5LmZvcm1hdCkpOwogCiAgICAgaWYgKGxlZ2FjeS5udW1fc2FtcGxlX3JhdGVzID4gc3RkOjpzaXplKGxlZ2FjeS5zYW1wbGVfcmF0ZXMpKSB7CiAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIFJFVFVSTl9JRl9FUlJPUigKICAgICAgICAgICAgIGNvbnZlcnRSYW5nZShsZWdhY3kuc2FtcGxlX3JhdGVzLCBsZWdhY3kuc2FtcGxlX3JhdGVzICsgbGVnYWN5Lm51bV9zYW1wbGVfcmF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGFpZGwuc2FtcGxpbmdSYXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGFpZGwuc2FtcGxlUmF0ZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQsIGludDMyX3Q+KSk7CiAKICAgICBpZiAobGVnYWN5Lm51bV9jaGFubmVsX21hc2tzID4gc3RkOjpzaXplKGxlZ2FjeS5jaGFubmVsX21hc2tzKSkgewpAQCAtMTk0Myw3ICsyOTA3LDkgQEAKICAgICBSRVRVUk5fSUZfRVJST1IoCiAgICAgICAgICAgICBjb252ZXJ0UmFuZ2UobGVnYWN5LmNoYW5uZWxfbWFza3MsIGxlZ2FjeS5jaGFubmVsX21hc2tzICsgbGVnYWN5Lm51bV9jaGFubmVsX21hc2tzLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihhaWRsLmNoYW5uZWxNYXNrcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdCkpOworICAgICAgICAgICAgICAgICAgICBbaXNJbnB1dF0oYXVkaW9fY2hhbm5lbF9tYXNrX3QgbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X0F1ZGlvQ2hhbm5lbExheW91dChtLCBpc0lucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgfSkpOwogCiAgICAgYWlkbC5lbmNhcHN1bGF0aW9uVHlwZSA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90X0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUoCkBAIC0xOTUyLDExICsyOTE4LDExIEBACiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbj4KLWFpZGwybGVnYWN5X0F1ZGlvR2Fpbl9hdWRpb19nYWluKGNvbnN0IG1lZGlhOjpBdWRpb0dhaW4mIGFpZGwpIHsKK2FpZGwybGVnYWN5X0F1ZGlvR2Fpbl9hdWRpb19nYWluKGNvbnN0IEF1ZGlvR2FpbiYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CiAgICAgYXVkaW9fZ2FpbiBsZWdhY3k7CiAgICAgbGVnYWN5Lm1vZGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19nYWluX21vZGVfdF9tYXNrKGFpZGwubW9kZSkpOwotICAgIGxlZ2FjeS5jaGFubmVsX21hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2spKTsKKyAgICBsZWdhY3kuY2hhbm5lbF9tYXNrID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvQ2hhbm5lbExheW91dF9hdWRpb19jaGFubmVsX21hc2tfdCgKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5jaGFubmVsTWFzaywgaXNJbnB1dCkpOwogICAgIGxlZ2FjeS5taW5fdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludD4oYWlkbC5taW5WYWx1ZSkpOwogICAgIGxlZ2FjeS5tYXhfdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludD4oYWlkbC5tYXhWYWx1ZSkpOwogICAgIGxlZ2FjeS5kZWZhdWx0X3ZhbHVlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KGFpZGwuZGVmYXVsdFZhbHVlKSk7CkBAIC0xOTY2LDEyICsyOTMyLDEyIEBACiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9HYWluPgotbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9BdWRpb0dhaW4oY29uc3QgYXVkaW9fZ2FpbiYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvR2FpbiBhaWRsOworQ29udmVyc2lvblJlc3VsdDxBdWRpb0dhaW4+CitsZWdhY3kyYWlkbF9hdWRpb19nYWluX0F1ZGlvR2Fpbihjb25zdCBhdWRpb19nYWluJiBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIEF1ZGlvR2FpbiBhaWRsOwogICAgIGFpZGwubW9kZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9pbnQzMl90X21hc2sobGVnYWN5Lm1vZGUpKTsKICAgICBhaWRsLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7CisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9BdWRpb0NoYW5uZWxMYXlvdXQobGVnYWN5LmNoYW5uZWxfbWFzaywgaXNJbnB1dCkpOwogICAgIGFpZGwubWluVmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5taW5fdmFsdWUpKTsKICAgICBhaWRsLm1heFZhbHVlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kubWF4X3ZhbHVlKSk7CiAgICAgYWlkbC5kZWZhdWx0VmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5kZWZhdWx0X3ZhbHVlKSk7CkBAIC0xOTg0LDYzICsyOTUwLDc2IEBACiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfdjc+CiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRfYXVkaW9fcG9ydF92Nyhjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBhaWRsKSB7CiAgICAgYXVkaW9fcG9ydF92NyBsZWdhY3k7Ci0gICAgbGVnYWN5LmlkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChhaWRsLmlkKSk7Ci0gICAgbGVnYWN5LnJvbGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Um9sZV9hdWRpb19wb3J0X3JvbGVfdChhaWRsLnJvbGUpKTsKLSAgICBsZWdhY3kudHlwZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRUeXBlX2F1ZGlvX3BvcnRfdHlwZV90KGFpZGwudHlwZSkpOwotICAgIFJFVFVSTl9JRl9FUlJPUihhaWRsMmxlZ2FjeV9zdHJpbmcoYWlkbC5uYW1lLCBsZWdhY3kubmFtZSwgc2l6ZW9mKGxlZ2FjeS5uYW1lKSkpOworICAgIGxlZ2FjeS5pZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoYWlkbC5oYWwuaWQpKTsKKyAgICBsZWdhY3kucm9sZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRSb2xlX2F1ZGlvX3BvcnRfcm9sZV90KGFpZGwuc3lzLnJvbGUpKTsKKyAgICBsZWdhY3kudHlwZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRUeXBlX2F1ZGlvX3BvcnRfdHlwZV90KGFpZGwuc3lzLnR5cGUpKTsKKyAgICBSRVRVUk5fSUZfRVJST1IoYWlkbDJsZWdhY3lfc3RyaW5nKGFpZGwuaGFsLm5hbWUsIGxlZ2FjeS5uYW1lLCBzaXplb2YobGVnYWN5Lm5hbWUpKSk7CiAKLSAgICBpZiAoYWlkbC5wcm9maWxlcy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmF1ZGlvX3Byb2ZpbGVzKSkgeworICAgIGlmIChhaWRsLmhhbC5wcm9maWxlcy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmF1ZGlvX3Byb2ZpbGVzKSkgewogICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogICAgIH0KLSAgICBSRVRVUk5fSUZfRVJST1IoY29udmVydFJhbmdlKGFpZGwucHJvZmlsZXMuYmVnaW4oKSwgYWlkbC5wcm9maWxlcy5lbmQoKSwgbGVnYWN5LmF1ZGlvX3Byb2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlX2F1ZGlvX3Byb2ZpbGUpKTsKLSAgICBsZWdhY3kubnVtX2F1ZGlvX3Byb2ZpbGVzID0gYWlkbC5wcm9maWxlcy5zaXplKCk7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0KKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihkaXJlY3Rpb24oYWlkbC5zeXMucm9sZSwgYWlkbC5zeXMudHlwZSkpID09IERpcmVjdGlvbjo6SU5QVVQ7CisgICAgUkVUVVJOX0lGX0VSUk9SKGNvbnZlcnRSYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5oYWwucHJvZmlsZXMuYmVnaW4oKSwgYWlkbC5oYWwucHJvZmlsZXMuZW5kKCksIGxlZ2FjeS5hdWRpb19wcm9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgW2lzSW5wdXRdKGNvbnN0IEF1ZGlvUHJvZmlsZSYgcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZV9hdWRpb19wcm9maWxlKHAsIGlzSW5wdXQpOworICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgbGVnYWN5Lm51bV9hdWRpb19wcm9maWxlcyA9IGFpZGwuaGFsLnByb2ZpbGVzLnNpemUoKTsKIAotICAgIGlmIChhaWRsLmV4dHJhQXVkaW9EZXNjcmlwdG9ycy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmV4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzKSkgeworICAgIGlmIChhaWRsLmhhbC5leHRyYUF1ZGlvRGVzY3JpcHRvcnMuc2l6ZSgpID4gc3RkOjpzaXplKGxlZ2FjeS5leHRyYV9hdWRpb19kZXNjcmlwdG9ycykpIHsKICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgUkVUVVJOX0lGX0VSUk9SKAotICAgICAgICAgICAgY29udmVydFJhbmdlKGFpZGwuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzLmJlZ2luKCksIGFpZGwuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5leHRyYV9hdWRpb19kZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9FeHRyYUF1ZGlvRGVzY3JpcHRvcl9hdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yKSk7Ci0gICAgbGVnYWN5Lm51bV9leHRyYV9hdWRpb19kZXNjcmlwdG9ycyA9IGFpZGwuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzLnNpemUoKTsKKyAgICAgICAgICAgIGNvbnZlcnRSYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5oYWwuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzLmJlZ2luKCksIGFpZGwuaGFsLmV4dHJhQXVkaW9EZXNjcmlwdG9ycy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5LmV4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9FeHRyYUF1ZGlvRGVzY3JpcHRvcl9hdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yKSk7CisgICAgbGVnYWN5Lm51bV9leHRyYV9hdWRpb19kZXNjcmlwdG9ycyA9IGFpZGwuaGFsLmV4dHJhQXVkaW9EZXNjcmlwdG9ycy5zaXplKCk7CiAKLSAgICBpZiAoYWlkbC5nYWlucy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmdhaW5zKSkgeworICAgIGlmIChhaWRsLmhhbC5nYWlucy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmdhaW5zKSkgewogICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogICAgIH0KLSAgICBSRVRVUk5fSUZfRVJST1IoY29udmVydFJhbmdlKGFpZGwuZ2FpbnMuYmVnaW4oKSwgYWlkbC5nYWlucy5lbmQoKSwgbGVnYWN5LmdhaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9HYWluX2F1ZGlvX2dhaW4pKTsKLSAgICBsZWdhY3kubnVtX2dhaW5zID0gYWlkbC5nYWlucy5zaXplKCk7CisgICAgUkVUVVJOX0lGX0VSUk9SKGNvbnZlcnRSYW5nZShhaWRsLmhhbC5nYWlucy5iZWdpbigpLCBhaWRsLmhhbC5nYWlucy5lbmQoKSwgbGVnYWN5LmdhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzSW5wdXRdKGNvbnN0IEF1ZGlvR2FpbiYgZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5fYXVkaW9fZ2FpbihnLCBpc0lucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICBsZWdhY3kubnVtX2dhaW5zID0gYWlkbC5oYWwuZ2FpbnMuc2l6ZSgpOwogCiAgICAgbGVnYWN5LmFjdGl2ZV9jb25maWcgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdfYXVkaW9fcG9ydF9jb25maWcoYWlkbC5hY3RpdmVDb25maWcpKTsKLSAgICBsZWdhY3kuZXh0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydEV4dChhaWRsLmV4dCwgYWlkbC50eXBlKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdfYXVkaW9fcG9ydF9jb25maWcoYWlkbC5zeXMuYWN0aXZlQ29uZmlnKSk7CisgICAgbGVnYWN5LmV4dCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydEV4dF9hdWRpb19wb3J0X3Y3X2V4dChhaWRsLmhhbC5leHQsIGFpZGwuc3lzLnR5cGUsIGFpZGwuc3lzLmV4dCkpOwogICAgIHJldHVybiBsZWdhY3k7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydD4KIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdjdfQXVkaW9Qb3J0KGNvbnN0IGF1ZGlvX3BvcnRfdjcmIGxlZ2FjeSkgewogICAgIG1lZGlhOjpBdWRpb1BvcnQgYWlkbDsKLSAgICBhaWRsLmlkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaWQpKTsKLSAgICBhaWRsLnJvbGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9yb2xlX3RfQXVkaW9Qb3J0Um9sZShsZWdhY3kucm9sZSkpOwotICAgIGFpZGwudHlwZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3R5cGVfdF9BdWRpb1BvcnRUeXBlKGxlZ2FjeS50eXBlKSk7Ci0gICAgYWlkbC5uYW1lID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX3N0cmluZyhsZWdhY3kubmFtZSwgc2l6ZW9mKGxlZ2FjeS5uYW1lKSkpOworICAgIGFpZGwuaGFsLmlkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaWQpKTsKKyAgICBhaWRsLnN5cy5yb2xlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfcm9sZV90X0F1ZGlvUG9ydFJvbGUobGVnYWN5LnJvbGUpKTsKKyAgICBhaWRsLnN5cy50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUobGVnYWN5LnR5cGUpKTsKKyAgICBhaWRsLmhhbC5uYW1lID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX3N0cmluZyhsZWdhY3kubmFtZSwgc2l6ZW9mKGxlZ2FjeS5uYW1lKSkpOwogCiAgICAgaWYgKGxlZ2FjeS5udW1fYXVkaW9fcHJvZmlsZXMgPiBzdGQ6OnNpemUobGVnYWN5LmF1ZGlvX3Byb2ZpbGVzKSkgewogICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogICAgIH0KKyAgICBjb25zdCBib29sIGlzSW5wdXQgPSBWQUxVRV9PUl9SRVRVUk4oZGlyZWN0aW9uKGxlZ2FjeS5yb2xlLCBsZWdhY3kudHlwZSkpID09IERpcmVjdGlvbjo6SU5QVVQ7CiAgICAgUkVUVVJOX0lGX0VSUk9SKAogICAgICAgICAgICAgY29udmVydFJhbmdlKGxlZ2FjeS5hdWRpb19wcm9maWxlcywgbGVnYWN5LmF1ZGlvX3Byb2ZpbGVzICsgbGVnYWN5Lm51bV9hdWRpb19wcm9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYWlkbC5wcm9maWxlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcHJvZmlsZV9BdWRpb1Byb2ZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYWlkbC5oYWwucHJvZmlsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtpc0lucHV0XShjb25zdCBhdWRpb19wcm9maWxlJiBwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWdhY3kyYWlkbF9hdWRpb19wcm9maWxlX0F1ZGlvUHJvZmlsZShwLCBpc0lucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAKICAgICBpZiAobGVnYWN5Lm51bV9leHRyYV9hdWRpb19kZXNjcmlwdG9ycyA+IHN0ZDo6c2l6ZShsZWdhY3kuZXh0cmFfYXVkaW9fZGVzY3JpcHRvcnMpKSB7CiAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiAgICAgfQorICAgIGFpZGwuc3lzLnByb2ZpbGVzLnJlc2l6ZShsZWdhY3kubnVtX2F1ZGlvX3Byb2ZpbGVzKTsKICAgICBSRVRVUk5fSUZfRVJST1IoCiAgICAgICAgICAgICBjb252ZXJ0UmFuZ2UobGVnYWN5LmV4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzLAogICAgICAgICAgICAgICAgICAgICBsZWdhY3kuZXh0cmFfYXVkaW9fZGVzY3JpcHRvcnMgKyBsZWdhY3kubnVtX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYWlkbC5leHRyYUF1ZGlvRGVzY3JpcHRvcnMpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYWlkbC5oYWwuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzKSwKICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZXh0cmFfYXVkaW9fZGVzY3JpcHRvcl9FeHRyYUF1ZGlvRGVzY3JpcHRvcikpOwogCiAgICAgaWYgKGxlZ2FjeS5udW1fZ2FpbnMgPiBzdGQ6OnNpemUobGVnYWN5LmdhaW5zKSkgewpAQCAtMjA0OCw1MyArMzAyNyw2NiBAQAogICAgIH0KICAgICBSRVRVUk5fSUZfRVJST1IoCiAgICAgICAgICAgICBjb252ZXJ0UmFuZ2UobGVnYWN5LmdhaW5zLCBsZWdhY3kuZ2FpbnMgKyBsZWdhY3kubnVtX2dhaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihhaWRsLmdhaW5zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19nYWluX0F1ZGlvR2FpbikpOworICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihhaWRsLmhhbC5nYWlucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgW2lzSW5wdXRdKGNvbnN0IGF1ZGlvX2dhaW4mIGcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fQXVkaW9HYWluKGcsIGlzSW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICBhaWRsLnN5cy5nYWlucy5yZXNpemUobGVnYWN5Lm51bV9nYWlucyk7CiAKLSAgICBhaWRsLmFjdGl2ZUNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICBhaWRsLnN5cy5hY3RpdmVDb25maWcgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19BdWRpb1BvcnRDb25maWcobGVnYWN5LmFjdGl2ZV9jb25maWcpKTsKLSAgICBhaWRsLmV4dCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9BdWRpb1BvcnRFeHQobGVnYWN5LmV4dCwgbGVnYWN5LnR5cGUpKTsKKyAgICBhaWRsLnN5cy5hY3RpdmVDb25maWcuaGFsLnBvcnRJZCA9IGFpZGwuaGFsLmlkOworICAgIFJFVFVSTl9JRl9FUlJPUigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydEV4dChsZWdhY3kuZXh0LCBsZWdhY3kudHlwZSwgJmFpZGwuaGFsLmV4dCwgJmFpZGwuc3lzLmV4dCkpOwogICAgIHJldHVybiBhaWRsOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX21vZGVfdD4KLWFpZGwybGVnYWN5X0F1ZGlvTW9kZV9hdWRpb19tb2RlX3QobWVkaWE6OkF1ZGlvTW9kZSBhaWRsKSB7CithaWRsMmxlZ2FjeV9BdWRpb01vZGVfYXVkaW9fbW9kZV90KEF1ZGlvTW9kZSBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTW9kZTo6SU5WQUxJRDoKKyAgICAgICAgY2FzZSBBdWRpb01vZGU6OlNZU19SRVNFUlZFRF9JTlZBTElEOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfSU5WQUxJRDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpDVVJSRU5UOgorICAgICAgICBjYXNlIEF1ZGlvTW9kZTo6U1lTX1JFU0VSVkVEX0NVUlJFTlQ6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9DVVJSRU5UOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01vZGU6Ok5PUk1BTDoKKyAgICAgICAgY2FzZSBBdWRpb01vZGU6Ok5PUk1BTDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19NT0RFX05PUk1BTDsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpSSU5HVE9ORToKKyAgICAgICAgY2FzZSBBdWRpb01vZGU6OlJJTkdUT05FOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfUklOR1RPTkU7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTW9kZTo6SU5fQ0FMTDoKKyAgICAgICAgY2FzZSBBdWRpb01vZGU6OklOX0NBTEw6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9JTl9DQUxMOwotICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01vZGU6OklOX0NPTU1VTklDQVRJT046CisgICAgICAgIGNhc2UgQXVkaW9Nb2RlOjpJTl9DT01NVU5JQ0FUSU9OOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTjsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpDQUxMX1NDUkVFTjoKKyAgICAgICAgY2FzZSBBdWRpb01vZGU6OkNBTExfU0NSRUVOOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfQ0FMTF9TQ1JFRU47CisgICAgICAgIGNhc2UgQXVkaW9Nb2RlOjpTWVNfUkVTRVJWRURfQ0FMTF9SRURJUkVDVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NT0RFX0NBTExfUkVESVJFQ1Q7CisgICAgICAgIGNhc2UgQXVkaW9Nb2RlOjpTWVNfUkVTRVJWRURfQ09NTVVOSUNBVElPTl9SRURJUkVDVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NT0RFX0NPTU1VTklDQVRJT05fUkVESVJFQ1Q7CiAgICAgfQogICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvTW9kZT4KK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9Nb2RlPgogbGVnYWN5MmFpZGxfYXVkaW9fbW9kZV90X0F1ZGlvTW9kZShhdWRpb19tb2RlX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19NT0RFX0lOVkFMSUQ6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvTW9kZTo6SU5WQUxJRDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb01vZGU6OlNZU19SRVNFUlZFRF9JTlZBTElEOwogICAgICAgICBjYXNlIEFVRElPX01PREVfQ1VSUkVOVDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Nb2RlOjpDVVJSRU5UOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvTW9kZTo6U1lTX1JFU0VSVkVEX0NVUlJFTlQ7CiAgICAgICAgIGNhc2UgQVVESU9fTU9ERV9OT1JNQUw6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvTW9kZTo6Tk9STUFMOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvTW9kZTo6Tk9STUFMOwogICAgICAgICBjYXNlIEFVRElPX01PREVfUklOR1RPTkU6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvTW9kZTo6UklOR1RPTkU7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Nb2RlOjpSSU5HVE9ORTsKICAgICAgICAgY2FzZSBBVURJT19NT0RFX0lOX0NBTEw6Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvTW9kZTo6SU5fQ0FMTDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb01vZGU6OklOX0NBTEw7CiAgICAgICAgIGNhc2UgQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb01vZGU6OklOX0NPTU1VTklDQVRJT047CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Nb2RlOjpJTl9DT01NVU5JQ0FUSU9OOwogICAgICAgICBjYXNlIEFVRElPX01PREVfQ0FMTF9TQ1JFRU46Ci0gICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvTW9kZTo6Q0FMTF9TQ1JFRU47CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Nb2RlOjpDQUxMX1NDUkVFTjsKKyAgICAgICAgY2FzZSBBVURJT19NT0RFX0NBTExfUkVESVJFQ1Q6CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Nb2RlOjpTWVNfUkVTRVJWRURfQ0FMTF9SRURJUkVDVDsKKyAgICAgICAgY2FzZSBBVURJT19NT0RFX0NPTU1VTklDQVRJT05fUkVESVJFQ1Q6CisgICAgICAgICAgICByZXR1cm4gQXVkaW9Nb2RlOjpTWVNfUkVTRVJWRURfQ09NTVVOSUNBVElPTl9SRURJUkVDVDsKICAgICAgICAgY2FzZSBBVURJT19NT0RFX0NOVDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTIyNDQsMzAgKzMyMzYsMzAgQEAKIH0KIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19zdGFuZGFyZF90PgotYWlkbDJsZWdhY3lfQXVkaW9TdGFuZGFyZF9hdWRpb19zdGFuZGFyZF90KG1lZGlhOjpBdWRpb1N0YW5kYXJkIGFpZGwpIHsKK2FpZGwybGVnYWN5X0F1ZGlvU3RhbmRhcmRfYXVkaW9fc3RhbmRhcmRfdChBdWRpb1N0YW5kYXJkIGFpZGwpIHsKICAgICBzd2l0Y2ggKGFpZGwpIHsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdGFuZGFyZDo6Tk9ORToKKyAgICAgICAgY2FzZSBBdWRpb1N0YW5kYXJkOjpOT05FOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUQU5EQVJEX05PTkU7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RhbmRhcmQ6OkVESUQ6CisgICAgICAgIGNhc2UgQXVkaW9TdGFuZGFyZDo6RURJRDoKICAgICAgICAgICAgIHJldHVybiBBVURJT19TVEFOREFSRF9FRElEOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1N0YW5kYXJkPgorQ29udmVyc2lvblJlc3VsdDxBdWRpb1N0YW5kYXJkPgogbGVnYWN5MmFpZGxfYXVkaW9fc3RhbmRhcmRfdF9BdWRpb1N0YW5kYXJkKGF1ZGlvX3N0YW5kYXJkX3QgbGVnYWN5KSB7CiAgICAgc3dpdGNoIChsZWdhY3kpIHsKICAgICAgICAgY2FzZSBBVURJT19TVEFOREFSRF9OT05FOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0YW5kYXJkOjpOT05FOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3RhbmRhcmQ6Ok5PTkU7CiAgICAgICAgIGNhc2UgQVVESU9fU1RBTkRBUkRfRURJRDoKLSAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdGFuZGFyZDo6RURJRDsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb1N0YW5kYXJkOjpFRElEOwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3I+CiBhaWRsMmxlZ2FjeV9FeHRyYUF1ZGlvRGVzY3JpcHRvcl9hdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yKAotICAgICAgICBjb25zdCBtZWRpYTo6RXh0cmFBdWRpb0Rlc2NyaXB0b3ImIGFpZGwpIHsKKyAgICAgICAgY29uc3QgRXh0cmFBdWRpb0Rlc2NyaXB0b3ImIGFpZGwpIHsKICAgICBhdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yIGxlZ2FjeTsKICAgICBsZWdhY3kuc3RhbmRhcmQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9TdGFuZGFyZF9hdWRpb19zdGFuZGFyZF90KGFpZGwuc3RhbmRhcmQpKTsKICAgICBpZiAoYWlkbC5hdWRpb0Rlc2NyaXB0b3Iuc2l6ZSgpID4gRVhUUkFfQVVESU9fREVTQ1JJUFRPUl9TSVpFKSB7CkBAIC0yMjgyLDEwICszMjc0LDEwIEBACiAgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6RXh0cmFBdWRpb0Rlc2NyaXB0b3I+CitDb252ZXJzaW9uUmVzdWx0PEV4dHJhQXVkaW9EZXNjcmlwdG9yPgogbGVnYWN5MmFpZGxfYXVkaW9fZXh0cmFfYXVkaW9fZGVzY3JpcHRvcl9FeHRyYUF1ZGlvRGVzY3JpcHRvcigKICAgICAgICAgY29uc3QgYXVkaW9fZXh0cmFfYXVkaW9fZGVzY3JpcHRvciYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkV4dHJhQXVkaW9EZXNjcmlwdG9yIGFpZGw7CisgICAgRXh0cmFBdWRpb0Rlc2NyaXB0b3IgYWlkbDsKICAgICBhaWRsLnN0YW5kYXJkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3N0YW5kYXJkX3RfQXVkaW9TdGFuZGFyZChsZWdhY3kuc3RhbmRhcmQpKTsKICAgICBpZiAobGVnYWN5LmRlc2NyaXB0b3JfbGVuZ3RoID4gRVhUUkFfQVVESU9fREVTQ1JJUFRPUl9TSVpFKSB7CiAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CkBAIC0yMzAxLDI0ICszMjkzLDI0IEBACiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3Q+CiBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90KAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uVHlwZSYgYWlkbCkgeworICAgICAgICBjb25zdCBBdWRpb0VuY2Fwc3VsYXRpb25UeXBlJiBhaWRsKSB7CiAgICAgc3dpdGNoIChhaWRsKSB7Ci0gICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvblR5cGU6Ok5PTkU6CisgICAgICAgIGNhc2UgQXVkaW9FbmNhcHN1bGF0aW9uVHlwZTo6Tk9ORToKICAgICAgICAgICAgIHJldHVybiBBVURJT19FTkNBUFNVTEFUSU9OX1RZUEVfTk9ORTsKLSAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uVHlwZTo6SUVDNjE5Mzc6CisgICAgICAgIGNhc2UgQXVkaW9FbmNhcHN1bGF0aW9uVHlwZTo6SUVDNjE5Mzc6CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fRU5DQVBTVUxBVElPTl9UWVBFX0lFQzYxOTM3OwogICAgIH0KICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlPgorQ29udmVyc2lvblJlc3VsdDxBdWRpb0VuY2Fwc3VsYXRpb25UeXBlPgogbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3RfQXVkaW9FbmNhcHN1bGF0aW9uVHlwZSgKICAgICAgICAgY29uc3QgYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3QgJiBsZWdhY3kpIHsKICAgICBzd2l0Y2ggKGxlZ2FjeSkgewogICAgICAgICBjYXNlIEFVRElPX0VOQ0FQU1VMQVRJT05fVFlQRV9OT05FOgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlOjpOT05FOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvRW5jYXBzdWxhdGlvblR5cGU6Ok5PTkU7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DQVBTVUxBVElPTl9UWVBFX0lFQzYxOTM3OgotICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlOjpJRUM2MTkzNzsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0VuY2Fwc3VsYXRpb25UeXBlOjpJRUM2MTkzNzsKICAgICB9CiAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKIH0KQEAgLTIzNDcsNCArMzMzOSw1MyBAQAogICAgIHJldHVybiB0cmFja1NlY29uZGFyeU91dHB1dEluZm87CiB9CiAKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZGlyZWN0X21vZGVfdD4KK2FpZGwybGVnYWN5X0F1ZGlvRGlyZWN0TW9kZV9hdWRpb19kaXJlY3RfbW9kZV90KG1lZGlhOjpBdWRpb0RpcmVjdE1vZGUgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0RpcmVjdE1vZGU6Ok5PTkU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRGlyZWN0TW9kZTo6T0ZGTE9BRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19ESVJFQ1RfT0ZGTE9BRF9TVVBQT1JURUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRGlyZWN0TW9kZTo6T0ZGTE9BRF9HQVBMRVNTOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RJUkVDVF9PRkZMT0FEX0dBUExFU1NfU1VQUE9SVEVEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0RpcmVjdE1vZGU6OkJJVFNUUkVBTToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19ESVJFQ1RfQklUU1RSRUFNX1NVUFBPUlRFRDsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRGlyZWN0TW9kZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2RpcmVjdF9tb2RlX3RfQXVkaW9EaXJlY3RNb2RlKGF1ZGlvX2RpcmVjdF9tb2RlX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlOjpOT05FOworICAgICAgICBjYXNlIEFVRElPX0RJUkVDVF9PRkZMT0FEX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlOjpPRkZMT0FEOworICAgICAgICBjYXNlIEFVRElPX0RJUkVDVF9PRkZMT0FEX0dBUExFU1NfU1VQUE9SVEVEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0RpcmVjdE1vZGU6Ok9GRkxPQURfR0FQTEVTUzsKKyAgICAgICAgY2FzZSBBVURJT19ESVJFQ1RfQklUU1RSRUFNX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlOjpCSVRTVFJFQU07CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZGlyZWN0X21vZGVfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kaXJlY3RfbW9kZV90X21hc2soaW50MzJfdCBhaWRsKSB7CisgICAgdXNpbmcgTGVnYWN5TWFzayA9IHN0ZDo6dW5kZXJseWluZ190eXBlX3Q8YXVkaW9fZGlyZWN0X21vZGVfdD47CisKKyAgICBMZWdhY3lNYXNrIGNvbnZlcnRlZCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIChjb252ZXJ0Qml0bWFzazxMZWdhY3lNYXNrLCBpbnQzMl90LCBhdWRpb19kaXJlY3RfbW9kZV90LCBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlPigKKyAgICAgICAgICAgICAgICAgICAgYWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9EaXJlY3RNb2RlX2F1ZGlvX2RpcmVjdF9tb2RlX3QsCisgICAgICAgICAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PG1lZGlhOjpBdWRpb0RpcmVjdE1vZGU+LAorICAgICAgICAgICAgICAgICAgICBlbnVtVG9NYXNrX2JpdG1hc2s8TGVnYWN5TWFzaywgYXVkaW9fZGlyZWN0X21vZGVfdD4pKSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGF1ZGlvX2RpcmVjdF9tb2RlX3Q+KGNvbnZlcnRlZCk7Cit9CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2RpcmVjdF9tb2RlX3RfaW50MzJfdF9tYXNrKGF1ZGlvX2RpcmVjdF9tb2RlX3QgbGVnYWN5KSB7CisgICAgdXNpbmcgTGVnYWN5TWFzayA9IHN0ZDo6dW5kZXJseWluZ190eXBlX3Q8YXVkaW9fZGlyZWN0X21vZGVfdD47CisKKyAgICBMZWdhY3lNYXNrIGxlZ2FjeU1hc2sgPSBzdGF0aWNfY2FzdDxMZWdhY3lNYXNrPihsZWdhY3kpOworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LCBMZWdhY3lNYXNrLCBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlLCBhdWRpb19kaXJlY3RfbW9kZV90PigKKyAgICAgICAgICAgIGxlZ2FjeU1hc2ssIGxlZ2FjeTJhaWRsX2F1ZGlvX2RpcmVjdF9tb2RlX3RfQXVkaW9EaXJlY3RNb2RlLAorICAgICAgICAgICAgaW5kZXhUb0VudW1fYml0bWFzazxhdWRpb19kaXJlY3RfbW9kZV90PiwKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgbWVkaWE6OkF1ZGlvRGlyZWN0TW9kZT4pOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKaW5kZXggOWMzMDdmZi4uNjlhOWM2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCkBAIC0xMSw2ICsxMSwxMCBAQAogICAgIG5hbWU6ICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgXSwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKIAogICAgIGhlYWRlcl9saWJzOiBbCkBAIC0yNSwxMSArMjksMTMgQEAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAiYXVkaW9mbGluZ2VyLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvcG9saWN5LWFpZGwtY3BwIiwKKyAgICAgICAgInNwYXRpYWxpemVyLWFpZGwtY3BwIiwKICAgICAgICAgImF2LXR5cGVzLWFpZGwtY3BwIiwKICAgICBdLAogICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImF1ZGlvZmxpbmdlci1haWRsLWNwcCIsCiAgICAgICAgICJhdWRpb3BvbGljeS1haWRsLWNwcCIsCisgICAgICAgICJzcGF0aWFsaXplci1haWRsLWNwcCIsCiAgICAgICAgICJhdi10eXBlcy1haWRsLWNwcCIsCiAgICAgXSwKICAgICB0YXJnZXQ6IHsKQEAgLTM5LDcgKzQ1LDcgQEAKICAgICB9LAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliYXVkaW9wb2xpY3kiLAogICAgIHNyY3M6IFsKICAgICAgICAgIkF1ZGlvQXR0cmlidXRlcy5jcHAiLApAQCAtNDksNiArNTUsNyBAQAogICAgICAgICAiUG9saWN5QWlkbENvbnZlcnNpb24uY3BwIgogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLAogICAgICAgICAiYXVkaW9wb2xpY3ktYWlkbC1jcHAiLApAQCAtNjksNiArNzYsNyBAQAogICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSJdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLAogICAgICAgICAiYXVkaW9wb2xpY3ktYWlkbC1jcHAiLApAQCAtMTA5LDkgKzExNywxMSBAQAogICAgICAgICAiVHJhY2tQbGF5ZXJCYXNlLmNwcCIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvZmxpbmdlci1haWRsLWNwcCIsCiAgICAgICAgICJhdWRpb3BvbGljeS1haWRsLWNwcCIsCisgICAgICAgICJzcGF0aWFsaXplci1haWRsLWNwcCIsCiAgICAgICAgICJhdWRpb3BvbGljeS10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJhdi10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJjYXB0dXJlX3N0YXRlX2xpc3RlbmVyLWFpZGwtY3BwIiwKQEAgLTEzMSwxNCArMTQxLDE2IEBACiAgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAogICAgICAgICAibGlic2htZW1jb21wYXQiLAogICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlidmlicmF0b3IiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgICAgICAicGFja2FnZW1hbmFnZXJfYWlkbC1jcHAiLAogICAgIF0sCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwogICAgICAgICAiYXVkaW9mbGluZ2VyLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvcG9saWN5LWFpZGwtY3BwIiwKKyAgICAgICAgInNwYXRpYWxpemVyLWFpZGwtY3BwIiwKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgIF0sCiAKICAgICBpbmNsdWRlX2RpcnM6IFsKQEAgLTE5MSwxMyArMjAzLDE1IEBACiAgICAgXSwKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmVycm9yX2hlYWRlcnMiLAogICAgIF0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWwogICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmVycm9yX2hlYWRlcnMiLAogICAgIF0sCiAgICAgYXBleF9hdmFpbGFibGU6IFsKICAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAotICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnVwZGF0YWJsZSIsCisgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgiLAogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCiAgICAgXSwKQEAgLTIyNCwxNiArMjM4LDE5IEBACiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb25fdXRpbCIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzaG1lbWNvbXBhdCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgInNoYXJlZC1maWxlLXJlZ2lvbi1haWRsLWNwcCIsCiAgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgXSwKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAogICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJzaGFyZWQtZmlsZS1yZWdpb24tYWlkbC1jcHAiLApAQCAtMzAzLDU3ICszMjAsMzIgQEAKICAgICBzcmNzOiBbCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9DbGllbnQuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db25maWcuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db25maWdCYXNlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29udGVudFR5cGUuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2UuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9EaXJlY3RNb2RlLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRHVhbE1vbm9Nb2RlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9GbGFnLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbi5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5Db25maWcuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluTW9kZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lucHV0RmxhZ3MuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluU3lzLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9Db25maWdFdmVudC5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRmxhZ3MuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhMYXRlbmN5Q2xhc3MuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Nb2RlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT2ZmbG9hZEluZm8uYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PdXRwdXRGbGFncy5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BhdGNoLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUGxheWJhY2tSYXRlLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRTeXMuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1R5cGUuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0LmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ0V4dC5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdNaXhFeHQuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0LmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydERldmljZUV4dC5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRFeHQuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0TWl4RXh0LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1N5cy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnREZXZpY2VFeHRTeXMuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RXh0U3lzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydE1peEV4dFN5cy5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRSb2xlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFNlc3Npb25FeHQuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0VHlwZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1Byb2ZpbGUuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Tb3VyY2VUeXBlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU3RhbmRhcmQuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9TdHJlYW1UeXBlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUHJvZmlsZVN5cy5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcEludGVybmFsLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVW5pcXVlSWRVc2UuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Vc2FnZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1V1aWQuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9WaWJyYXRvckluZm8uYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvRWZmZWN0RGVzY3JpcHRvci5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9FeHRyYUF1ZGlvRGVzY3JpcHRvci5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9UcmFja1NlY29uZGFyeU91dHB1dEluZm8uYWlkbCIsCiAgICAgXSwKICAgICBpbXBvcnRzOiBbCi0gICAgICAgICJhdWRpb19jb21tb24tYWlkbCIsCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMSIsCiAgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsIiwKICAgICBdLAogICAgIGJhY2tlbmQ6IHsKQEAgLTM2NCw2ICszNTYsOSBAQAogICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCiAgICAgICAgICAgICBdLAogICAgICAgICB9LAorICAgICAgICBqYXZhOiB7CisgICAgICAgICAgICBzZGtfdmVyc2lvbjogIm1vZHVsZV9jdXJyZW50IiwKKyAgICAgICAgfSwKICAgICB9LAogfQogYWlkbF9pbnRlcmZhY2UgewpAQCAtMzg5LDkgKzM4NCwxMiBAQAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvRGV2aWNlUm9sZS5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9Tb3VuZFRyaWdnZXJTZXNzaW9uLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1NwYXRpYWxpemF0aW9uTGV2ZWwuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvU3BhdGlhbGl6YXRpb25Nb2RlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1NwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZS5haWRsIiwKICAgICBdLAogICAgIGltcG9ydHM6IFsKLSAgICAgICAgImF1ZGlvX2NvbW1vbi1haWRsIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwiLAogICAgIF0sCiAgICAgYmFja2VuZDogewpAQCAtNDAyLDYgKzQwMCw5IEBACiAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCisgICAgICAgIGphdmE6IHsKKyAgICAgICAgICAgIHNka192ZXJzaW9uOiAibW9kdWxlX2N1cnJlbnQiLAorICAgICAgICB9LAogICAgIH0sCiB9CiAKQEAgLTQzMSw3ICs0MzIsNyBAQAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1RyYWNrQ2FsbGJhY2suYWlkbCIsCiAgICAgXSwKICAgICBpbXBvcnRzOiBbCi0gICAgICAgICJhdWRpb19jb21tb24tYWlkbCIsCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMSIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsIiwKICAgICAgICAgImF2LXR5cGVzLWFpZGwiLAogICAgICAgICAiZWZmZWN0LWFpZGwiLApAQCAtNDQ3LDYgKzQ0OCw5IEBACiAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCisgICAgICAgIGphdmE6IHsKKyAgICAgICAgICAgIHNka192ZXJzaW9uOiAibW9kdWxlX2N1cnJlbnQiLAorICAgICAgICB9LAogICAgIH0sCiB9CiAKQEAgLTQ1OSwxNyArNDYzLDE4IEBACiAgICAgc3JjczogWwogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0dldElucHV0Rm9yQXR0clJlc3BvbnNlLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0dldE91dHB1dEZvckF0dHJSZXNwb25zZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JbnQuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvR2V0U3BhdGlhbGl6ZXJSZXNwb25zZS5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9SZWNvcmRDbGllbnRJbmZvLmFpZGwiLAogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5haWRsIiwKICAgICBdLAogICAgIGltcG9ydHM6IFsKLSAgICAgICAgImF1ZGlvX2NvbW1vbi1haWRsIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwiLAogICAgICAgICAiYXVkaW9wb2xpY3ktdHlwZXMtYWlkbCIsCiAgICAgICAgICJjYXB0dXJlX3N0YXRlX2xpc3RlbmVyLWFpZGwiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbCIsCisgICAgICAgICJzcGF0aWFsaXplci1haWRsIiwKICAgICBdLAogCiAgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLApAQCAtNDgxLDUgKzQ4NiwzOCBAQAogICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCiAgICAgICAgICAgICBdLAogICAgICAgICB9LAorICAgICAgICBqYXZhOiB7CisgICAgICAgICAgICBzZGtfdmVyc2lvbjogIm1vZHVsZV9jdXJyZW50IiwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCithaWRsX2ludGVyZmFjZSB7CisgICAgbmFtZTogInNwYXRpYWxpemVyLWFpZGwiLAorICAgIHVuc3RhYmxlOiB0cnVlLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyOiAiYWlkbCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2suYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSVNwYXRpYWxpemVyLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lTcGF0aWFsaXplckhlYWRUcmFja2luZ0NhbGxiYWNrLmFpZGwiLAorICAgIF0sCisgICAgaW1wb3J0czogWworICAgICAgICAiYXVkaW9wb2xpY3ktdHlwZXMtYWlkbCIsCisgICAgXSwKKworICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKKyAgICBiYWNrZW5kOiB7CisgICAgICAgIGNwcDogeworICAgICAgICAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgICAgICAgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICAgIGphdmE6IHsKKyAgICAgICAgICAgIHNka192ZXJzaW9uOiAibW9kdWxlX2N1cnJlbnQiLAorICAgICAgICB9LAogICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcAppbmRleCA4M2JmNWE3Li4yNjBjMDZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvQXR0cmlidXRlcy5jcHAKQEAgLTI0LDkgKzI0LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9Qb2xpY3lBaWRsQ29udmVyc2lvbi5oPgogCi0jZGVmaW5lIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoeCkgXAotICAgIHsgYXV0byBfdG1wID0gKHgpOyBpZiAoX3RtcCAhPSBPSykgcmV0dXJuIF90bXA7IH0KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0dXNfdCBBdWRpb0F0dHJpYnV0ZXM6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKaW5kZXggNmFkNTQ4My4uN2IyNzNlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcApAQCAtMzIsMTYgKzMyLDEyIEBACiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb0VmZmVjdFNoYXJlZC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jZGVmaW5lIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoeCkgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYXV0byBfdG1wID0gKHgpOyAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChfdG1wICE9IE9LKSByZXR1cm4gX3RtcDsgXAotICAgIH0KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogdXNpbmcgYWlkbF91dGlsczo6c3RhdHVzVEZyb21CaW5kZXJTdGF0dXM7CiB1c2luZyBiaW5kZXI6OlN0YXR1czsKIHVzaW5nIG1lZGlhOjpJQXVkaW9Qb2xpY3lTZXJ2aWNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU291cmNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvVXVpZDsKIAogbmFtZXNwYWNlIHsKIApAQCAtNjUsMTggKzYxLDE4IEBACiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCiAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiwKLSAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICAgICAgICAgIGNvbnN0IHdwPElBdWRpb0VmZmVjdENhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgYm9vbCBwcm9iZSkKKyAgICAgICAgICAgICAgICBib29sIHByb2JlLAorICAgICAgICAgICAgICAgIGJvb2wgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKQogewogICAgIHNwPG1lZGlhOjpJRWZmZWN0PiBpRWZmZWN0OwogICAgIHNwPElNZW1vcnk+IGNibGs7CiAgICAgaW50IGVuYWJsZWQ7CiAKLSAgICBBTE9HVigic2V0ICVwIG1Vc2VyRGF0YTogJXAgdXVpZDogJXAgdGltZUxvdyAlMDh4IiwgdGhpcywgdXNlciwgdHlwZSwgdHlwZSA/IHR5cGUtPnRpbWVMb3cgOiAwKTsKKyAgICBBTE9HVigic2V0ICVwIHV1aWQ6ICVwIHRpbWVMb3cgJTA4eCIsIHRoaXMsIHR5cGUsIHR5cGUgPyB0eXBlLT50aW1lTG93IDogMCk7CiAKICAgICBpZiAobUlFZmZlY3QgIT0gMCkgewogICAgICAgICBBTE9HVygiRWZmZWN0IGFscmVhZHkgaW4gdXNlIik7CkBAIC05OSw5ICs5NSw4IEBACiAgICAgfQogICAgIG1Qcm9iZSA9IHByb2JlOwogICAgIG1Qcmlvcml0eSA9IHByaW9yaXR5OwotICAgIG1DYmYgPSBjYmY7Ci0gICAgbVVzZXJEYXRhID0gdXNlcjsKICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwogCiAgICAgbWVtc2V0KCZtRGVzY3JpcHRvciwgMCwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKICAgICBtRGVzY3JpcHRvci50eXBlID0gKih0eXBlICE9IE5VTEwgPyB0eXBlIDogRUZGRUNUX1VVSURfTlVMTCk7CkBAIC0xMjQsMTIgKzExOSwxNiBAQAogICAgIHJlcXVlc3QuZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGRldmljZSkpOwogICAgIHJlcXVlc3QuYXR0cmlidXRpb25Tb3VyY2UgPSBtQ2xpZW50QXR0cmlidXRpb25Tb3VyY2U7CiAgICAgcmVxdWVzdC5wcm9iZSA9IHByb2JlOworICAgIHJlcXVlc3Qubm90aWZ5RnJhbWVzUHJvY2Vzc2VkID0gbm90aWZ5RnJhbWVzUHJvY2Vzc2VkOwogCiAgICAgbWVkaWE6OkNyZWF0ZUVmZmVjdFJlc3BvbnNlIHJlc3BvbnNlOwogCiAgICAgbVN0YXR1cyA9IGF1ZGlvRmxpbmdlci0+Y3JlYXRlRWZmZWN0KHJlcXVlc3QsICZyZXNwb25zZSk7CiAKICAgICBpZiAobVN0YXR1cyA9PSBPSykgeworICAgICAgICBpZiAocmVzcG9uc2UuYWxyZWFkeUV4aXN0cykgeworICAgICAgICAgICAgbVN0YXR1cyA9IEFMUkVBRFlfRVhJU1RTOworICAgICAgICB9CiAgICAgICAgIG1JZCA9IHJlc3BvbnNlLmlkOwogICAgICAgICBlbmFibGVkID0gcmVzcG9uc2UuZW5hYmxlZDsKICAgICAgICAgaUVmZmVjdCA9IHJlc3BvbnNlLmVmZmVjdDsKQEAgLTE4NiwxNSArMTg1LDY1IEBACiAgICAgcmV0dXJuIG1TdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvRWZmZWN0OjpzZXQoY29uc3QgY2hhciAqdHlwZVN0ciwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyLAorbmFtZXNwYWNlIHsKK2NsYXNzIExlZ2FjeUNhbGxiYWNrV3JhcHBlciA6IHB1YmxpYyBBdWRpb0VmZmVjdDo6SUF1ZGlvRWZmZWN0Q2FsbGJhY2sgeworIHB1YmxpYzoKKyAgICBMZWdhY3lDYWxsYmFja1dyYXBwZXIoQXVkaW9FZmZlY3Q6OmxlZ2FjeV9jYWxsYmFja190IGNhbGxiYWNrLCB2b2lkKiB1c2VyKToKKyAgICAgICAgICAgIG1DYWxsYmFjayhjYWxsYmFjayksIG1Vc2VyKHVzZXIpIHt9CisgcHJpdmF0ZToKKyAgICB2b2lkIG9uQ29udHJvbFN0YXR1c0NoYW5nZWQoYm9vbCBpc0dyYW50ZWQpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxiYWNrKEF1ZGlvRWZmZWN0OjpFVkVOVF9DT05UUk9MX1NUQVRVU19DSEFOR0VELCBtVXNlciwgJmlzR3JhbnRlZCk7CisgICAgfQorCisgICAgdm9pZCBvbkVuYWJsZVN0YXR1c0NoYW5nZWQoYm9vbCBpc0VuYWJsZWQpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxiYWNrKEF1ZGlvRWZmZWN0OjpFVkVOVF9FTkFCTEVfU1RBVFVTX0NIQU5HRUQsIG1Vc2VyLCAmaXNFbmFibGVkKTsKKyAgICB9CisKKyAgICB2b2lkIG9uUGFyYW1ldGVyQ2hhbmdlZChzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXJhbSkgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGJhY2soQXVkaW9FZmZlY3Q6OkVWRU5UX1BBUkFNRVRFUl9DSEFOR0VELCBtVXNlciwgcGFyYW0uZGF0YSgpKTsKKyAgICB9CisKKyAgICB2b2lkIG9uRXJyb3Ioc3RhdHVzX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsYmFjayhBdWRpb0VmZmVjdDo6RVZFTlRfRVJST1IsIG1Vc2VyLCAmZXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICB2b2lkIG9uRnJhbWVzUHJvY2Vzc2VkKGludDMyX3QgZnJhbWVzUHJvY2Vzc2VkKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsYmFjayhBdWRpb0VmZmVjdDo6RVZFTlRfRlJBTUVTX1BST0NFU1NFRCwgbVVzZXIsICZmcmFtZXNQcm9jZXNzZWQpOworICAgIH0KKworICAgIGNvbnN0IEF1ZGlvRWZmZWN0OjpsZWdhY3lfY2FsbGJhY2tfdCBtQ2FsbGJhY2s7CisgICAgdm9pZCogY29uc3QgbVVzZXI7Cit9OworfSAvLyBuYW1lc3BhY2UKKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnNldChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCiAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCisgICAgICAgICAgICAgICAgbGVnYWN5X2NhbGxiYWNrX3QgY2JmLAogICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCiAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgYm9vbCBwcm9iZSkKKyAgICAgICAgICAgICAgICBib29sIHByb2JlLAorICAgICAgICAgICAgICAgIGJvb2wgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKQoreworICAgIGlmIChjYmYgIT0gbnVsbHB0cikgeworICAgICAgICBtTGVnYWN5V3JhcHBlciA9IHNwPExlZ2FjeUNhbGxiYWNrV3JhcHBlcj46Om1ha2UoY2JmLCB1c2VyKTsKKyAgICB9IGVsc2UgaWYgKHVzZXIgIT0gbnVsbHB0cikgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogVXNlciBwcm92aWRlZCB3aXRob3V0IGNhbGxiYWNrIiwgX19mdW5jX18pOworICAgIH0KKyAgICByZXR1cm4gc2V0KHR5cGUsIHV1aWQsIHByaW9yaXR5LCBtTGVnYWN5V3JhcHBlciwgc2Vzc2lvbklkLCBpbywgZGV2aWNlLCBwcm9iZSwKKyAgICAgICAgICAgICAgIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCk7Cit9CitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgIGNvbnN0IHdwPElBdWRpb0VmZmVjdENhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UsCisgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSwKKyAgICAgICAgICAgICAgICBib29sIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCkKIHsKICAgICBlZmZlY3RfdXVpZF90IHR5cGU7CiAgICAgZWZmZWN0X3V1aWRfdCAqcFR5cGUgPSBudWxscHRyOwpAQCAtMjExLDEwICsyNjAsMjkgQEAKICAgICAgICAgcFV1aWQgPSAmdXVpZDsKICAgICB9CiAKLSAgICByZXR1cm4gc2V0KHBUeXBlLCBwVXVpZCwgcHJpb3JpdHksIGNiZiwgdXNlciwgc2Vzc2lvbklkLCBpbywgZGV2aWNlLCBwcm9iZSk7CisgICAgcmV0dXJuIHNldChwVHlwZSwgcFV1aWQsIHByaW9yaXR5LCBjYWxsYmFjaywgc2Vzc2lvbklkLCBpbywKKyAgICAgICAgICAgICAgIGRldmljZSwgcHJvYmUsIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCk7CiB9CiAKLQorc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnNldChjb25zdCBjaGFyICp0eXBlU3RyLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIsCisgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYmYsCisgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKKyAgICAgICAgICAgICAgICBib29sIHByb2JlLAorICAgICAgICAgICAgICAgIGJvb2wgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKQoreworICAgIGlmIChjYmYgIT0gbnVsbHB0cikgeworICAgICAgICBtTGVnYWN5V3JhcHBlciA9IHNwPExlZ2FjeUNhbGxiYWNrV3JhcHBlcj46Om1ha2UoY2JmLCB1c2VyKTsKKyAgICB9IGVsc2UgaWYgKHVzZXIgIT0gbnVsbHB0cikgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogVXNlciBwcm92aWRlZCB3aXRob3V0IGNhbGxiYWNrIiwgX19mdW5jX18pOworICAgIH0KKyAgICByZXR1cm4gc2V0KHR5cGVTdHIsIHV1aWRTdHIsIHByaW9yaXR5LCBtTGVnYWN5V3JhcHBlciwgc2Vzc2lvbklkLCBpbywgZGV2aWNlLCBwcm9iZSwKKyAgICAgICAgICAgICAgIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCk7Cit9CiBBdWRpb0VmZmVjdDo6fkF1ZGlvRWZmZWN0KCkKIHsKICAgICBBTE9HVigiRGVzdHJ1Y3RvciAlcCIsIHRoaXMpOwpAQCAtNDY4LDkgKzUzNiw5IEBACiB7CiAgICAgQUxPR1coIklFZmZlY3QgZGllZCIpOwogICAgIG1TdGF0dXMgPSBERUFEX09CSkVDVDsKLSAgICBpZiAobUNiZiAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IERFQURfT0JKRUNUOwotICAgICAgICBtQ2JmKEVWRU5UX0VSUk9SLCBtVXNlckRhdGEsICZzdGF0dXMpOworICAgIGF1dG8gY2IgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYiAhPSBudWxscHRyKSB7CisgICAgICAgIGNiLT5vbkVycm9yKG1TdGF0dXMpOwogICAgIH0KICAgICBtSUVmZmVjdC5jbGVhcigpOwogfQpAQCAtNDc5LDggKzU0Nyw4IEBACiAKIHZvaWQgQXVkaW9FZmZlY3Q6OmNvbnRyb2xTdGF0dXNDaGFuZ2VkKGJvb2wgY29udHJvbEdyYW50ZWQpCiB7Ci0gICAgQUxPR1YoImNvbnRyb2xTdGF0dXNDaGFuZ2VkICVwIGNvbnRyb2wgJWQgY2FsbGJhY2sgJXAgbVVzZXJEYXRhICVwIiwgdGhpcywgY29udHJvbEdyYW50ZWQsIG1DYmYsCi0gICAgICAgICAgICBtVXNlckRhdGEpOworICAgIGF1dG8gY2IgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIEFMT0dWKCJjb250cm9sU3RhdHVzQ2hhbmdlZCAlcCBjb250cm9sICVkIGNhbGxiYWNrICVwIiwgdGhpcywgY29udHJvbEdyYW50ZWQsIGNiLmdldCgpKTsKICAgICBpZiAoY29udHJvbEdyYW50ZWQpIHsKICAgICAgICAgaWYgKG1TdGF0dXMgPT0gQUxSRUFEWV9FWElTVFMpIHsKICAgICAgICAgICAgIG1TdGF0dXMgPSBOT19FUlJPUjsKQEAgLTQ5MCwxOCArNTU4LDE5IEBACiAgICAgICAgICAgICBtU3RhdHVzID0gQUxSRUFEWV9FWElTVFM7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKG1DYmYgIT0gTlVMTCkgewotICAgICAgICBtQ2JmKEVWRU5UX0NPTlRST0xfU1RBVFVTX0NIQU5HRUQsIG1Vc2VyRGF0YSwgJmNvbnRyb2xHcmFudGVkKTsKKyAgICBpZiAoY2IgIT0gbnVsbHB0cikgeworICAgICAgICBjYi0+b25Db250cm9sU3RhdHVzQ2hhbmdlZChjb250cm9sR3JhbnRlZCk7CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvRWZmZWN0OjplbmFibGVTdGF0dXNDaGFuZ2VkKGJvb2wgZW5hYmxlZCkKIHsKLSAgICBBTE9HVigiZW5hYmxlU3RhdHVzQ2hhbmdlZCAlcCBlbmFibGVkICVkIG1DYmYgJXAiLCB0aGlzLCBlbmFibGVkLCBtQ2JmKTsKKyAgICBhdXRvIGNiID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBBTE9HVigiZW5hYmxlU3RhdHVzQ2hhbmdlZCAlcCBlbmFibGVkICVkIG1DYWxsYmFjayAlcCIsIHRoaXMsIGVuYWJsZWQsIGNiLmdldCgpKTsKICAgICBpZiAobVN0YXR1cyA9PSBBTFJFQURZX0VYSVNUUykgewogICAgICAgICBtRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgIGlmIChtQ2JmICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1DYmYoRVZFTlRfRU5BQkxFX1NUQVRVU19DSEFOR0VELCBtVXNlckRhdGEsICZlbmFibGVkKTsKKyAgICAgICAgaWYgKGNiICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNiLT5vbkVuYWJsZVN0YXR1c0NoYW5nZWQoZW5hYmxlZCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC01MTMsMTIgKzU4MiwyMCBAQAogICAgIGlmIChjbWREYXRhLmVtcHR5KCkgfHwgcmVwbHlEYXRhLmVtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLQotICAgIGlmIChtQ2JmICE9IE5VTEwgJiYgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9QQVJBTSkgeworICAgIGF1dG8gY2IgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYiAhPSBudWxscHRyICYmIGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfUEFSQU0pIHsKICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY21kRGF0YUNvcHkoY21kRGF0YSk7CiAgICAgICAgIGVmZmVjdF9wYXJhbV90KiBjbWQgPSByZWludGVycHJldF9jYXN0PGVmZmVjdF9wYXJhbV90ICo+KGNtZERhdGFDb3B5LmRhdGEoKSk7CiAgICAgICAgIGNtZC0+c3RhdHVzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MzJfdCAqPihyZXBseURhdGEuZGF0YSgpKTsKLSAgICAgICAgbUNiZihFVkVOVF9QQVJBTUVURVJfQ0hBTkdFRCwgbVVzZXJEYXRhLCBjbWQpOworICAgICAgICBjYi0+b25QYXJhbWV0ZXJDaGFuZ2VkKHN0ZDo6bW92ZShjbWREYXRhQ29weSkpOworICAgIH0KK30KKwordm9pZCBBdWRpb0VmZmVjdDo6ZnJhbWVzUHJvY2Vzc2VkKGludDMyX3QgZnJhbWVzKQoreworICAgIGF1dG8gY2IgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYiAhPSBudWxscHRyKSB7CisgICAgICAgIGNiLT5vbkZyYW1lc1Byb2Nlc3NlZChmcmFtZXMpOwogICAgIH0KIH0KIApAQCAtNTYwLDcgKzYzNyw3IEBACiAKICAgICBpbnQzMl90IGF1ZGlvU2Vzc2lvbkFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3QoYXVkaW9TZXNzaW9uKSk7Ci0gICAgbWVkaWE6OkludCBjb3VudEFpZGw7CisgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkludCBjb3VudEFpZGw7CiAgICAgY291bnRBaWRsLnZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oKmNvdW50KSk7CiAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkVmZmVjdERlc2NyaXB0b3I+IHJldEFpZGw7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKQEAgLTYwOCwxMiArNjg1LDEyIEBACiAgICAgICAgIHV1aWQgPSAqRUZGRUNUX1VVSURfTlVMTDsKICAgICB9CiAKLSAgICBtZWRpYTo6QXVkaW9VdWlkIHR5cGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKHR5cGUpKTsKLSAgICBtZWRpYTo6QXVkaW9VdWlkIHV1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKHV1aWQpKTsKKyAgICBBdWRpb1V1aWQgdHlwZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQodHlwZSkpOworICAgIEF1ZGlvVXVpZCB1dWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fdXVpZF90X0F1ZGlvVXVpZCh1dWlkKSk7CiAgICAgc3RkOjpzdHJpbmcgb3BQYWNrYWdlTmFtZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfU3RyaW5nMTZfc3RyaW5nKG9wUGFja2FnZU5hbWUpKTsKLSAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIHNvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKHNvdXJjZSkpOworICAgIEF1ZGlvU291cmNlIHNvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2Uoc291cmNlKSk7CiAgICAgaW50MzJfdCByZXRBaWRsOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPmFkZFNvdXJjZURlZmF1bHRFZmZlY3QodHlwZUFpZGwsIG9wUGFja2FnZU5hbWVBaWRsLCB1dWlkQWlkbCwgcHJpb3JpdHksIHNvdXJjZUFpZGwsCkBAIC02NTEsMTEgKzcyOCwxMSBAQAogICAgICAgICB1dWlkID0gKkVGRkVDVF9VVUlEX05VTEw7CiAgICAgfQogCi0gICAgbWVkaWE6OkF1ZGlvVXVpZCB0eXBlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fdXVpZF90X0F1ZGlvVXVpZCh0eXBlKSk7Ci0gICAgbWVkaWE6OkF1ZGlvVXVpZCB1dWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fdXVpZF90X0F1ZGlvVXVpZCh1dWlkKSk7CisgICAgQXVkaW9VdWlkIHR5cGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKHR5cGUpKTsKKyAgICBBdWRpb1V1aWQgdXVpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQodXVpZCkpOwogICAgIHN0ZDo6c3RyaW5nIG9wUGFja2FnZU5hbWVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX1N0cmluZzE2X3N0cmluZyhvcFBhY2thZ2VOYW1lKSk7Ci0gICAgbWVkaWE6OkF1ZGlvVXNhZ2UgdXNhZ2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Vc2FnZSB1c2FnZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fdXNhZ2VfdF9BdWRpb1VzYWdlKHVzYWdlKSk7CiAgICAgaW50MzJfdCByZXRBaWRsOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1Byb2R1Y3RTdHJhdGVneS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1Byb2R1Y3RTdHJhdGVneS5jcHAKaW5kZXggZjk4MDI3YS4uZWNkNDIzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcApAQCAtMjEsOSArMjEsNiBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQXR0cmlidXRlcy5oPgogI2luY2x1ZGUgPG1lZGlhL1BvbGljeUFpZGxDb252ZXJzaW9uLmg+CiAKLSNkZWZpbmUgUkVUVVJOX1NUQVRVU19JRl9FUlJPUih4KSBcCi0gICAgeyBhdXRvIF90bXAgPSAoeCk7IGlmIChfdG1wICE9IE9LKSByZXR1cm4gX3RtcDsgfQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXR1c190IEF1ZGlvUHJvZHVjdFN0cmF0ZWd5OjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCmluZGV4IGExZDNiZGIuLjE1MjAzZDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKQEAgLTIwLDggKzIwLDEwIEBACiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KICNpbmNsdWRlIDxhdWRpb21hbmFnZXIvQXVkaW9NYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YXVkaW9tYW5hZ2VyL0lBdWRpb01hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+CkBAIC0zOSw2ICs0MSw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CiB1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogdXNpbmcgYWlkbF91dGlsczo6c3RhdHVzVEZyb21CaW5kZXJTdGF0dXM7CiAKQEAgLTY2LDggKzY5LDkgQEAKIAogICAgIC8vIFdlIGRvdWJsZSB0aGUgc2l6ZSBvZiBpbnB1dCBidWZmZXIgZm9yIHBpbmcgcG9uZyB1c2Ugb2YgcmVjb3JkIGJ1ZmZlci4KICAgICAvLyBBc3N1bWVzIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KQotICAgIGlmICgoKmZyYW1lQ291bnQgPSAoc2l6ZSAqIDIpIC8gKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKSAqCi0gICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpKSA9PSAwKSB7CisgICAgY29uc3QgYXV0byBzYW1wbGVTaXplID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOworICAgIGlmIChzYW1wbGVTaXplID09IDAgfHwgKCgqZnJhbWVDb3VudCA9IChzaXplICogMikgLyBzYW1wbGVTaXplKSA9PSAwKSkgewogICAgICAgICBBTE9HRSgiJXMoKTogVW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbjogc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4IiwKICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0xNDIsNyArMTQ2LDcgQEAKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGNsaWVudCwKICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCi0gICAgICAgIGNhbGxiYWNrX3QgY2JmLAorICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYWxsYmFjaywKICAgICAgICAgdm9pZCogdXNlciwKICAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLApAQCAtMTYyLDcgKzE2NiwzOSBAQAogewogICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QobUNsaWVudEF0dHJpYnV0aW9uU291cmNlLnVpZCkpOwogICAgIHBpZF90IHBpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QobUNsaWVudEF0dHJpYnV0aW9uU291cmNlLnBpZCkpOwotICAgICh2b2lkKXNldChpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgY2JmLCB1c2VyLAorICAgICh2b2lkKXNldChpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgY2FsbGJhY2ssIHVzZXIsCisgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzLAorICAgICAgICAgICAgdWlkLCBwaWQsIHBBdHRyaWJ1dGVzLCBzZWxlY3RlZERldmljZUlkLCBzZWxlY3RlZE1pY0RpcmVjdGlvbiwKKyAgICAgICAgICAgIG1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbik7Cit9CisKK0F1ZGlvUmVjb3JkOjpBdWRpb1JlY29yZCgKKyAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGNsaWVudCwKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGNvbnN0IHdwPElBdWRpb1JlY29yZENhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBzZWxlY3RlZE1pY0RpcmVjdGlvbiwKKyAgICAgICAgZmxvYXQgbWljcm9waG9uZUZpZWxkRGltZW5zaW9uKQorICAgIDogbUFjdGl2ZShmYWxzZSksCisgICAgICBtU3RhdHVzKE5PX0lOSVQpLAorICAgICAgbUNsaWVudEF0dHJpYnV0aW9uU291cmNlKGNsaWVudCksCisgICAgICBtU2Vzc2lvbklkKEFVRElPX1NFU1NJT05fQUxMT0NBVEUpLAorICAgICAgbVByZXZpb3VzUHJpb3JpdHkoQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpLAorICAgICAgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwKFNQX0RFRkFVTFQpLAorICAgICAgbVByb3h5KG51bGxwdHIpCit7CisgICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChtQ2xpZW50QXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CisgICAgcGlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChtQ2xpZW50QXR0cmlidXRpb25Tb3VyY2UucGlkKSk7CisgICAgKHZvaWQpc2V0KGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBjYWxsYmFjaywKICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgZmxhZ3MsCiAgICAgICAgICAgICB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMsIHNlbGVjdGVkRGV2aWNlSWQsIHNlbGVjdGVkTWljRGlyZWN0aW9uLAogICAgICAgICAgICAgbWljcm9waG9uZUZpZWxkRGltZW5zaW9uKTsKQEAgLTIwNSwyNiArMjQxLDU4IEBACiAgICAgLy8gT3RoZXJ3aXNlIHRoZSBjYWxsYmFjayB0aHJlYWQgd2lsbCBuZXZlciBleGl0LgogICAgIHN0b3AoKTsKICAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKLSAgICAgICAgbVByb3h5LT5pbnRlcnJ1cHQoKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5yZXF1ZXN0RXhpdCgpOyAgLy8gc2VlIGNvbW1lbnQgaW4gQXVkaW9SZWNvcmQuaAorICAgICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQuY2xlYXIoKTsKICAgICB9Ci0gICAgLy8gTm8gbG9jayBoZXJlOiB3b3JzdCBjYXNlIHdlIHJlbW92ZSBhIE5VTEwgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBhIG5vcAorCisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtSW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgLy8gVGhpcyBtYXkgbm90IHN0b3AgYWxsIG9mIHRoZXNlIGRldmljZSBjYWxsYmFja3MhCiAgICAgICAgIC8vIFRPRE86IEFkZCBzb21lIHNvcnQgb2YgcHJvdGVjdGlvbi4KICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0LCBtUG9ydElkKTsKKyAgICAgICAgbURldmljZUNhbGxiYWNrLmNsZWFyKCk7CiAgICAgfQogfQorbmFtZXNwYWNlIHsKK2NsYXNzIExlZ2FjeUNhbGxiYWNrV3JhcHBlciA6IHB1YmxpYyBBdWRpb1JlY29yZDo6SUF1ZGlvUmVjb3JkQ2FsbGJhY2sgeworICAgIGNvbnN0IEF1ZGlvUmVjb3JkOjpsZWdhY3lfY2FsbGJhY2tfdCBtQ2FsbGJhY2s7CisgICAgdm9pZCogY29uc3QgbURhdGE7CisKKyAgcHVibGljOgorICAgIExlZ2FjeUNhbGxiYWNrV3JhcHBlcihBdWRpb1JlY29yZDo6bGVnYWN5X2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQqIHVzZXIpCisgICAgICAgIDogbUNhbGxiYWNrKGNhbGxiYWNrKSwgbURhdGEodXNlcikge30KKworICAgIHNpemVfdCBvbk1vcmVEYXRhKGNvbnN0IEF1ZGlvUmVjb3JkOjpCdWZmZXImIGJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICBBdWRpb1JlY29yZDo6QnVmZmVyIGNvcHkgPSBidWZmZXI7CisgICAgICAgIG1DYWxsYmFjayhBdWRpb1JlY29yZDo6RVZFTlRfTU9SRV9EQVRBLCBtRGF0YSwgJmNvcHkpOworICAgICAgICByZXR1cm4gY29weS5zaXplKCk7CisgICAgfQorCisgICAgdm9pZCBvbk92ZXJydW4oKSBvdmVycmlkZSB7IG1DYWxsYmFjayhBdWRpb1JlY29yZDo6RVZFTlRfT1ZFUlJVTiwgbURhdGEsIG51bGxwdHIpOyB9CisKKyAgICB2b2lkIG9uTWFya2VyKHVpbnQzMl90IG1hcmtlclBvc2l0aW9uKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsYmFjayhBdWRpb1JlY29yZDo6RVZFTlRfTUFSS0VSLCBtRGF0YSwgJm1hcmtlclBvc2l0aW9uKTsKKyAgICB9CisKKyAgICB2b2lkIG9uTmV3UG9zKHVpbnQzMl90IG5ld1Bvcykgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGJhY2soQXVkaW9SZWNvcmQ6OkVWRU5UX05FV19QT1MsIG1EYXRhLCAmbmV3UG9zKTsKKyAgICB9CisKKyAgICB2b2lkIG9uTmV3SUF1ZGlvUmVjb3JkKCkgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGJhY2soQXVkaW9SZWNvcmQ6OkVWRU5UX05FV19JQVVESU9SRUNPUkQsIG1EYXRhLCBudWxscHRyKTsKKyAgICB9Cit9OworfSAgLy8gbmFtZXNwYWNlCisKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzZXQoCiAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgY2FsbGJhY2tfdCBjYmYsCi0gICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgIGNvbnN0IHdwPElBdWRpb1JlY29yZENhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSwKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKQEAgLTIzOSw4ICszMDcsOCBAQAogICAgICAgICBpbnQzMl90IG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudDsKLQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUluaXRpYWxpemVkLCAiJXM6IHNob3VsZCBub3QgYmUgY2FsbGVkIHR3aWNlIiwgX19mdW5jX18pOworICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CiAgICAgLy8gTm90ZSBtUG9ydElkIGlzIG5vdCB2YWxpZCB1bnRpbCB0aGUgdHJhY2sgaXMgY3JlYXRlZCwgc28gb21pdCBtUG9ydElkIGluIEFMT0cgZm9yIHNldC4KICAgICBBTE9HVigiJXMoKTogaW5wdXRTb3VyY2UgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKICAgICAgICAgICAibm90aWZpY2F0aW9uRnJhbWVzICV1LCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgZmxhZ3MgJSN4LCBhdHRyaWJ1dGlvblNvdXJjZSAlcyIKQEAgLTI3MSwzOSArMzM5LDkgQEAKICAgICBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbiA9IG1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbjsKICAgICBtTWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMgPSBtYXhTaGFyZWRBdWRpb0hpc3RvcnlNczsKIAotICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgY2FzZSBUUkFOU0ZFUl9ERUZBVUxUOgotICAgICAgICBpZiAoY2JmID09IE5VTEwgfHwgdGhyZWFkQ2FuQ2FsbEphdmEpIHsKLSAgICAgICAgICAgIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX1NZTkM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9DQUxMQkFDSzsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFRSQU5TRkVSX0NBTExCQUNLOgotICAgICAgICBpZiAoY2JmID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX0NBTExCQUNLIGJ1dCBjYmYgPT0gTlVMTCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFRSQU5TRkVSX09CVEFJTjoKLSAgICBjYXNlIFRSQU5TRkVSX1NZTkM6Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIHRyYW5zZmVyIHR5cGUgJWQiLCBfX2Z1bmNfXywgdHJhbnNmZXJUeXBlKTsKLSAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgfQotICAgIG1UcmFuc2ZlciA9IHRyYW5zZmVyVHlwZTsKLQotICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1JlY29yZCAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQotICAgIGlmIChtQXVkaW9SZWNvcmQgIT0gMCkgewotICAgICAgICBBTE9HRSgiJXMoKTogVHJhY2sgYWxyZWFkeSBpbiB1c2UiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKHBBdHRyaWJ1dGVzID09IE5VTEwpIHsKKyAgICBzdGQ6OnN0cmluZyBlcnJvck1lc3NhZ2U7CisgICAgLy8gQ29weSB0aGUgc3RhdGUgdmFyaWFibGVzIGVhcmx5IHNvIHRoZXkgYXJlIGF2YWlsYWJsZSBmb3IgZXJyb3IgcmVwb3J0aW5nLgorICAgIGlmIChwQXR0cmlidXRlcyA9PSBudWxscHRyKSB7CiAgICAgICAgIG1BdHRyaWJ1dGVzID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKICAgICAgICAgbUF0dHJpYnV0ZXMuc291cmNlID0gaW5wdXRTb3VyY2U7CiAgICAgICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTgpAQCAtMzE0LDM3ICszNTIsNzQgQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBzdHJlYW0gdHlwZSBzaG91bGRuJ3QgYmUgbG9va2VkIGF0LCB0aGlzIHRyYWNrIGhhcyBhdWRpbyBhdHRyaWJ1dGVzCiAgICAgICAgIG1lbWNweSgmbUF0dHJpYnV0ZXMsIHBBdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIEFMT0dWKCIlcygpOiBCdWlsZGluZyBBdWRpb1JlY29yZCB3aXRoIGF0dHJpYnV0ZXM6IHNvdXJjZT0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCisgICAgICAgIEFMT0dWKCIlczogQnVpbGRpbmcgQXVkaW9SZWNvcmQgd2l0aCBhdHRyaWJ1dGVzOiBzb3VyY2U9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQXR0cmlidXRlcy5zb3VyY2UsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKICAgICB9Ci0KICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7Ci0KLSAgICAvLyB0aGVzZSBiZWxvdyBzaG91bGQgcHJvYmFibHkgY29tZSBmcm9tIHRoZSBhdWRpb0ZsaW5nZXIgdG9vLi4uCiAgICAgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgewogICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICB9Ci0KLSAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCi0gICAgLy8gQXVkaW9GbGluZ2VyIGNhcHR1cmUgb25seSBzdXBwb3J0cyBsaW5lYXIgUENNCi0gICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSB8fCAhYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpOiBGb3JtYXQgJSN4IGlzIG5vdCBsaW5lYXIgcGNtIiwgX19mdW5jX18sIGZvcm1hdCk7Ci0gICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgZ290byBleGl0OworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgLy8gQ29tcHJlc3NlZCBjYXB0dXJlIHJlcXVpcmVzIGRpcmVjdAorICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChmbGFncyB8IEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKTsKKyAgICAgICBBTE9HSSgiJXMoKTogRm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbS4gU2V0dGluZyBESVJFQ1QsIHVzaW5nIGZsYWdzICUjeCIsIF9fZnVuY19fLAorICAgICAgICAgICAgIGZvcm1hdCwgZmxhZ3MpOwogICAgIH0KICAgICBtRm9ybWF0ID0gZm9ybWF0OwotCi0gICAgaWYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgewotICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgfQogICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwotICAgIGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKTsKLSAgICBtQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OworICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgQUxPR1YoIiVzOiBtU2Vzc2lvbklkICVkIiwgX19mdW5jX18sIG1TZXNzaW9uSWQpOworICAgIG1PcmlnRmxhZ3MgPSBtRmxhZ3MgPSBmbGFnczsKIAotICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKLSAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKKyAgICBtVHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7CisgICAgc3dpdGNoIChtVHJhbnNmZXIpIHsKKyAgICBjYXNlIFRSQU5TRkVSX0RFRkFVTFQ6CisgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxscHRyIHx8IHRocmVhZENhbkNhbGxKYXZhKSB7CisgICAgICAgICAgICBtVHJhbnNmZXIgPSBUUkFOU0ZFUl9TWU5DOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRyYW5zZmVyID0gVFJBTlNGRVJfQ0FMTEJBQ0s7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFOU0ZFUl9DQUxMQkFDSzoKKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX0NBTExCQUNLIGJ1dCBjYWxsYmFjayA9PSBudWxscHRyIiwgX19mdW5jX18pOworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQU5TRkVSX09CVEFJTjoKKyAgICBjYXNlIFRSQU5TRkVSX1NZTkM6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigiJXM6IEludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIF9fZnVuY19fLCBtVHJhbnNmZXIpOworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvUmVjb3JkICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CisgICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwKSB7CisgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigiJXM6IFRyYWNrIGFscmVhZHkgaW4gdXNlIiwgX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChtRm9ybWF0KSkgeworICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoIiVzOiBGb3JtYXQgJSN4IGlzIG5vdCB2YWxpZCIsIF9fZnVuY19fLCBtRm9ybWF0KTsKKyAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmICghYXVkaW9faXNfaW5wdXRfY2hhbm5lbChtQ2hhbm5lbE1hc2spKSB7CisgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigiJXM6IEludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIF9fZnVuY19fLCBtQ2hhbm5lbE1hc2spOworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFzayk7CisKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICBtRnJhbWVTaXplID0gbUNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OF90KTsKICAgICB9CkBAIC0zNTUsMTMgKzQzMCw4IEBACiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSA9IG5vdGlmaWNhdGlvbkZyYW1lczsKICAgICAvLyBtTm90aWZpY2F0aW9uRnJhbWVzQWN0IGlzIGluaXRpYWxpemVkIGluIGNyZWF0ZVJlY29yZF9sCiAKLSAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwotICAgIEFMT0dWKCIlcygpOiBtU2Vzc2lvbklkICVkIiwgX19mdW5jX18sIG1TZXNzaW9uSWQpOwotCi0gICAgbU9yaWdGbGFncyA9IG1GbGFncyA9IGZsYWdzOwotICAgIG1DYmYgPSBjYmY7Ci0KLSAgICBpZiAoY2JmICE9IE5VTEwpIHsKKyAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICBpZiAobUNhbGxiYWNrICE9IG51bGxwdHIpIHsKICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkID0gbmV3IEF1ZGlvUmVjb3JkVGhyZWFkKCp0aGlzKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5ydW4oIkF1ZGlvUmVjb3JkIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CiAgICAgICAgIC8vIHRocmVhZCBiZWdpbnMgaW4gcGF1c2VkIHN0YXRlLCBhbmQgd2lsbCBub3QgcmVmZXJlbmNlIHVzIHVudGlsIHN0YXJ0KCkKQEAgLTM4MSwxMCArNDUxLDEwIEBACiAgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwogICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLmNsZWFyKCk7CiAgICAgICAgIH0KKyAgICAgICAgLy8gYnlwYXNzIGVycm9yIG1lc3NhZ2UgdG8gYXZvaWQgbG9nZ2luZyB0d2ljZSAoY3JlYXRlUmVjb3JkX2wgbG9ncyB0aGUgZXJyb3IpLgogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogCi0gICAgbVVzZXJEYXRhID0gdXNlcjsKICAgICAvLyBUT0RPOiBhZGQgYXVkaW8gaGFyZHdhcmUgaW5wdXQgbGF0ZW5jeSBoZXJlCiAgICAgbUxhdGVuY3kgPSAoMTAwMExMICogbUZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGU7CiAgICAgbU1hcmtlclBvc2l0aW9uID0gMDsKQEAgLTM5OCwxNCArNDY4LDQ4IEBACiAgICAgbUZyYW1lc1JlYWQgPSAwOwogICAgIG1GcmFtZXNSZWFkU2VydmVyT2Zmc2V0ID0gMDsKIAotZXhpdDoKLSAgICBtU3RhdHVzID0gc3RhdHVzOworZXJyb3I6CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBtTWVkaWFNZXRyaWNzLm1hcmtFcnJvcihzdGF0dXMsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dFX0lGKCFlcnJvck1lc3NhZ2UuZW1wdHkoKSwgIiVzIiwgZXJyb3JNZXNzYWdlLmNfc3RyKCkpOworICAgICAgICByZXBvcnRFcnJvcihzdGF0dXMsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9DUkVBVEUsIGVycm9yTWVzc2FnZS5jX3N0cigpKTsKICAgICB9CitleGl0OgorICAgIG1TdGF0dXMgPSBzdGF0dXM7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldCgKKyAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYWxsYmFjaywKKyAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhLAorICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBzZWxlY3RlZE1pY0RpcmVjdGlvbiwKKyAgICAgICAgZmxvYXQgbWljcm9waG9uZUZpZWxkRGltZW5zaW9uLAorICAgICAgICBpbnQzMl90IG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKQoreworICAgIGlmIChjYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1MZWdhY3lDYWxsYmFja1dyYXBwZXIgPSBzcDxMZWdhY3lDYWxsYmFja1dyYXBwZXI+OjptYWtlKGNhbGxiYWNrLCB1c2VyKTsKKyAgICB9IGVsc2UgaWYgKHVzZXIpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiQ2FsbGJhY2sgZGF0YSBwcm92aWRlZCB3aXRob3V0IGNhbGxiYWNrIHBvaW50ZXIhIik7CisgICAgfQorICAgIHJldHVybiBzZXQoaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIG1MZWdhY3lDYWxsYmFja1dyYXBwZXIsCisgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgdGhyZWFkQ2FuQ2FsbEphdmEsIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncywgdWlkLCBwaWQsCisgICAgICAgIHBBdHRyaWJ1dGVzLCBzZWxlY3RlZERldmljZUlkLCBzZWxlY3RlZE1pY0RpcmVjdGlvbiwgbWljcm9waG9uZUZpZWxkRGltZW5zaW9uLAorICAgICAgICBtYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyk7Cit9CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LCBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pCkBAIC01MzUsMTIgKzYzOSwxMiBAQAogCiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6c2V0TWFya2VyUG9zaXRpb24odWludDMyX3QgbWFya2VyKQogeworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICAvLyBUaGUgb25seSBwdXJwb3NlIG9mIHNldHRpbmcgbWFya2VyIHBvc2l0aW9uIGlzIHRvIGdldCBhIGNhbGxiYWNrCi0gICAgaWYgKG1DYmYgPT0gTlVMTCkgeworICAgIGlmIChtQ2FsbGJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIG1NYXJrZXJQb3NpdGlvbiA9IG1hcmtlcjsKICAgICBtTWFya2VyUmVhY2hlZCA9IGZhbHNlOwogCkBAIC01NjUsMTIgKzY2OSwxMiBAQAogCiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6c2V0UG9zaXRpb25VcGRhdGVQZXJpb2QodWludDMyX3QgdXBkYXRlUGVyaW9kKQogeworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICAvLyBUaGUgb25seSBwdXJwb3NlIG9mIHNldHRpbmcgcG9zaXRpb24gdXBkYXRlIHBlcmlvZCBpcyB0byBnZXQgYSBjYWxsYmFjawotICAgIGlmIChtQ2JmID09IE5VTEwpIHsKKyAgICBpZiAobUNhbGxiYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBtTmV3UG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyB1cGRhdGVQZXJpb2Q7CiAgICAgbVVwZGF0ZVBlcmlvZCA9IHVwZGF0ZVBlcmlvZDsKIApAQCAtNjIxLDYgKzcyNSwxMSBAQAogICAgIGlmIChzdGF0dXMgPT0gT0spIHsKICAgICAgICAgdGltZXN0YW1wLT5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0NMSUVOVF0gPSBtRnJhbWVzUmVhZDsKICAgICAgICAgdGltZXN0YW1wLT5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdID0gMDsKKyAgICAgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgICAgICAvLyBEb24ndCBkbyByZXRyb2dyYWRlIGNvcnJlY3Rpb25zIG9yIHNlcnZlciBvZmZzZXQgaWYgdHJhY2sgaXMKKyAgICAgICAgICAgIC8vIGNvbXByZXNzZWQKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQogICAgICAgICAvLyBzZXJ2ZXIgc2lkZSBmcmFtZSBvZmZzZXQgaW4gY2FzZSBBdWRpb1JlY29yZCBoYXMgYmVlbiByZXN0b3JlZC4KICAgICAgICAgZm9yIChpbnQgaSA9IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVI7CiAgICAgICAgICAgICAgICAgaSA8IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9NQVg7ICsraSkgewpAQCAtNjY4LDYgKzc3Nyw4IEBACiAvLyAtLS0tIEV4cGxpY2l0IFJvdXRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6c2V0SW5wdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBkZXZpY2VJZD0lZCBtU2VsZWN0ZWREZXZpY2VJZD0lZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgZGV2aWNlSWQsIG1TZWxlY3RlZERldmljZUlkKTsKICAgICBpZiAobVNlbGVjdGVkRGV2aWNlSWQgIT0gZGV2aWNlSWQpIHsKICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKICAgICAgICAgaWYgKG1TdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTc1NCwxNSArODY1LDE2IEBACiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVJlY29yZElucHV0IGlucHV0OwogICAgIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVJlY29yZE91dHB1dCBvdXRwdXQ7Ci0gICAgYXVkaW9fc2Vzc2lvbl90IG9yaWdpbmFsU2Vzc2lvbklkOworICAgIFtbbWF5YmVfdW51c2VkXV0gYXVkaW9fc2Vzc2lvbl90IG9yaWdpbmFsU2Vzc2lvbklkOwogICAgIHZvaWQgKmlNZW1Qb2ludGVyOwogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsazsKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga01heENyZWF0ZUF0dGVtcHRzID0gMzsKICAgICBpbnQzMl90IHJlbWFpbmluZ0F0dGVtcHRzID0ga01heENyZWF0ZUF0dGVtcHRzOworICAgIHN0ZDo6c3RyaW5nIGVycm9yTWVzc2FnZTsKIAogICAgIGlmIChhdWRpb0ZsaW5nZXIgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgYXVkaW9mbGluZ2VyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtODI4LDggKzk0MCw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZiAoc3RhdHVzICE9IEZBSUxFRF9UUkFOU0FDVElPTiB8fCAtLXJlbWFpbmluZ0F0dGVtcHRzIDw9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IEF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHJlY29yZCB0cmFjaywgc3RhdHVzOiAlZCIsCi0gICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKKyAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgIiVzKCVkKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIHRyYWNrLCBzdGF0dXM6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgLy8gRkFJTEVEX1RSQU5TQUNUSU9OIGhhcHBlbnMgdW5kZXIgdmVyeSBzcGVjaWZpYyBjb25kaXRpb25zIGNhdXNpbmcgYSBzdGF0ZSBtaXNtYXRjaApAQCAtODU2LDkgKzk2OSwxMyBAQAogICAgIG1Sb3V0ZWREZXZpY2VJZCA9IG91dHB1dC5zZWxlY3RlZERldmljZUlkOwogICAgIG1TZXNzaW9uSWQgPSBvdXRwdXQuc2Vzc2lvbklkOwogICAgIG1TYW1wbGVSYXRlID0gb3V0cHV0LnNhbXBsZVJhdGU7CisgICAgbVNlcnZlckNvbmZpZyA9IG91dHB1dC5zZXJ2ZXJDb25maWc7CisgICAgbVNlcnZlckZyYW1lU2l6ZSA9IGF1ZGlvX2J5dGVzX3Blcl9mcmFtZSgKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1TZXJ2ZXJDb25maWcuY2hhbm5lbF9tYXNrKSwgbVNlcnZlckNvbmZpZy5mb3JtYXQpOworICAgIG1TZXJ2ZXJTYW1wbGVTaXplID0gYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtU2VydmVyQ29uZmlnLmZvcm1hdCk7CiAKICAgICBpZiAob3V0cHV0LmNibGsgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siLCBfX2Z1bmNfXywgbVBvcnRJZCk7CisgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC04NjgsNyArOTg1LDggQEAKICAgICAvLyAgICAgICBpc3N1ZSAoZS5nLiBieSBjb3B5aW5nKS4KICAgICBpTWVtUG9pbnRlciA9IG91dHB1dC5jYmxrIC0+dW5zZWN1cmVQb2ludGVyKCk7CiAgICAgaWYgKGlNZW1Qb2ludGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CisgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTg4Nyw3ICsxMDA1LDggQEAKICAgICAgICAgLy8gICAgICAgaXNzdWUgKGUuZy4gYnkgY29weWluZykuCiAgICAgICAgIGJ1ZmZlcnMgPSBvdXRwdXQuYnVmZmVycy0+dW5zZWN1cmVQb2ludGVyKCk7CiAgICAgICAgIGlmIChidWZmZXJzID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CisgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICIlcyglZCk6IENvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC05MTksNiArMTAzOCwxMCBAQAogICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEsIG91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50LCBvdXRwdXQuZnJhbWVDb3VudCk7CiAgICAgfQogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAodWludDMyX3Qpb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CisgICAgaWYgKG1TZXJ2ZXJDb25maWcuZm9ybWF0ICE9IG1Gb3JtYXQgJiYgbUNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUZvcm1hdENvbnZlcnNpb25CdWZSYXcgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4obU5vdGlmaWNhdGlvbkZyYW1lc0FjdCAqIG1GcmFtZVNpemUpOworICAgICAgICBtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlci5yYXcgPSBtRm9ybWF0Q29udmVyc2lvbkJ1ZlJhdy5nZXQoKTsKKyAgICB9CiAKICAgICAvL21JbnB1dCAhPSBpbnB1dCBpbmNsdWRlcyB0aGUgY2FzZSB3aGVyZSBtSW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgZm9yIGZpcnN0IGNyZWF0aW9uCiAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7CkBAIC05NDUsNyArMTA2OCw3IEBACiAgICAgfQogCiAgICAgLy8gdXBkYXRlIHByb3h5Ci0gICAgbVByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgbUZyYW1lQ291bnQsIG1GcmFtZVNpemUpOworICAgIG1Qcm94eSA9IG5ldyBBdWRpb1JlY29yZENsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIG1GcmFtZUNvdW50LCBtU2VydmVyRnJhbWVTaXplKTsKICAgICBtUHJveHktPnNldEVwb2NoKGVwb2NoKTsKICAgICBtUHJveHktPnNldE1pbmltdW0obU5vdGlmaWNhdGlvbkZyYW1lc0FjdCk7CiAKQEAgLTk3MiwxNiArMTA5NSw0NCBAQAogICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TQU1QTEVSQVRFLCAoaW50MzJfdCltU2FtcGxlUmF0ZSkKICAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBhcmUgTk9UIGltbXV0YWJsZQogICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFURSwgc3RhdGVUb1N0cmluZyhtQWN0aXZlKSkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTLCAoaW50MzJfdClzdGF0dXMpCiAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NFTEVDVEVETUlDRElSRUNUSU9OLCAoaW50MzJfdCltU2VsZWN0ZWRNaWNEaXJlY3Rpb24pCiAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NFTEVDVEVETUlDRklFTERESVJFQ1RJT04sIChkb3VibGUpbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24pCiAgICAgICAgIC5yZWNvcmQoKTsKIAogZXhpdDoKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFX0lGKCFlcnJvck1lc3NhZ2UuZW1wdHkoKSwgIiVzIiwgZXJyb3JNZXNzYWdlLmNfc3RyKCkpOworICAgICAgICByZXBvcnRFcnJvcihzdGF0dXMsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9DUkVBVEUsIGVycm9yTWVzc2FnZS5jX3N0cigpKTsKKyAgICB9CisKICAgICBtU3RhdHVzID0gc3RhdHVzOwogICAgIC8vIHNwPElBdWRpb1RyYWNrPiB0cmFjayBkZXN0cnVjdG9yIHdpbGwgY2F1c2UgcmVsZWFzZU91dHB1dCgpIHRvIGJlIGNhbGxlZCBieSBBdWRpb0ZsaW5nZXIKICAgICByZXR1cm4gc3RhdHVzOwogfQogCisvLyBSZXBvcnQgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCBhbmQgc29tZSBjb25maWd1cmF0aW9uIGRldGFpbHMuCit2b2lkIEF1ZGlvUmVjb3JkOjpyZXBvcnRFcnJvcihzdGF0dXNfdCBzdGF0dXMsIGNvbnN0IGNoYXIgKmV2ZW50LCBjb25zdCBjaGFyICptZXNzYWdlKSBjb25zdAoreworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHJldHVybjsKKyAgICAvLyBXZSByZXBvcnQgZXJyb3Igb24gdGhlIG5hdGl2ZSBzaWRlIGJlY2F1c2Ugc29tZSBjYWxsZXJzIGRvIG5vdCBjb21lCisgICAgLy8gZnJvbSBKYXZhLgorICAgIC8vIEVuc3VyZSB0aGVzZSB2YXJpYWJsZXMgYXJlIGluaXRpYWxpemVkIGluIHNldCgpLgorICAgIG1lZGlhbWV0cmljczo6TG9nSXRlbShBTUVESUFNRVRSSUNTX0tFWV9BVURJT19SRUNPUkRfRVJST1IpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBldmVudCkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTLCAoaW50MzJfdClzdGF0dXMpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU01FU1NBR0UsIG1lc3NhZ2UpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX09SSUdJTkFMRkxBR1MsIHRvU3RyaW5nKG1PcmlnRmxhZ3MpLmNfc3RyKCkpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NFU1NJT05JRCwgKGludDMyX3QpbVNlc3Npb25JZCkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU09VUkNFLCB0b1N0cmluZyhtQXR0cmlidXRlcy5zb3VyY2UpLmNfc3RyKCkpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NFTEVDVEVEREVWSUNFSUQsIChpbnQzMl90KW1TZWxlY3RlZERldmljZUlkKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FTkNPRElORywgdG9TdHJpbmcobUZvcm1hdCkuY19zdHIoKSkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfQ0hBTk5FTE1BU0ssIChpbnQzMl90KW1DaGFubmVsTWFzaykKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRlJBTUVDT1VOVCwgKGludDMyX3QpbUZyYW1lQ291bnQpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NBTVBMRVJBVEUsIChpbnQzMl90KW1TYW1wbGVSYXRlKQorICAgICAgICAucmVjb3JkKCk7Cit9CisKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpvYnRhaW5CdWZmZXIoQnVmZmVyKiBhdWRpb0J1ZmZlciwgaW50MzJfdCB3YWl0Q291bnQsIHNpemVfdCAqbm9uQ29udGlnKQogewogICAgIGlmIChhdWRpb0J1ZmZlciA9PSBOVUxMKSB7CkBAIC05OTIsNyArMTE0Myw3IEBACiAgICAgfQogICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfT0JUQUlOKSB7CiAgICAgICAgIGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLSAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSAwOworICAgICAgICBhdWRpb0J1ZmZlci0+bVNpemUgPSAwOwogICAgICAgICBhdWRpb0J1ZmZlci0+cmF3ID0gTlVMTDsKICAgICAgICAgaWYgKG5vbkNvbnRpZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAqbm9uQ29udGlnID0gMDsKQEAgLTEwNDUsNyArMTE5NiwxMyBAQAogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgICAgIC8vIHJlLWNyZWF0ZSB0cmFjaywgdW5sZXNzIHNvbWVvbmUgZWxzZSBoYXMgYWxyZWFkeSBkb25lIHNvCiAgICAgICAgICAgICAgICAgaWYgKG5ld1NlcXVlbmNlID09IG9sZFNlcXVlbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlc3RvcmVSZWNvcmRfbCgib2J0YWluQnVmZmVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgY29tcHJlc3NlZCBjYXB0dXJlLCBkb24ndCBhdHRlbXB0IHRvIHJlc3RvcmUgdGhlIHRyYWNrLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGEgREVBRF9PQkpFQ1QgZXJyb3IgYW5kIGxldCB0aGUgY2FsbGVyIHJlY3JlYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Q291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSByZXN0b3JlUmVjb3JkX2woIm9idGFpbkJ1ZmZlciIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tRnJhbWVDb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIubVJhdyA9IE5VTEw7CkBAIC0xMDc1LDcgKzEyMzIsNyBAQAogICAgIH0gd2hpbGUgKChzdGF0dXMgPT0gREVBRF9PQkpFQ1QpICYmICh0cnlDb3VudGVyLS0gPiAwKSk7CiAKICAgICBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1ZmZlci5tRnJhbWVDb3VudDsKLSAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IGJ1ZmZlci5tRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CisgICAgYXVkaW9CdWZmZXItPm1TaXplID0gYnVmZmVyLm1GcmFtZUNvdW50ICogbVNlcnZlckZyYW1lU2l6ZTsKICAgICBhdWRpb0J1ZmZlci0+cmF3ID0gYnVmZmVyLm1SYXc7CiAgICAgYXVkaW9CdWZmZXItPnNlcXVlbmNlID0gb2xkU2VxdWVuY2U7CiAgICAgaWYgKG5vbkNvbnRpZyAhPSBOVUxMKSB7CkBAIC0xMDg4LDcgKzEyNDUsNyBAQAogewogICAgIC8vIEZJWE1FIGFkZCBlcnJvciBjaGVja2luZyBvbiBtb2RlLCBieSBhZGRpbmcgYW4gaW50ZXJuYWwgdmVyc2lvbgogCi0gICAgc2l6ZV90IHN0ZXBDb3VudCA9IGF1ZGlvQnVmZmVyLT5zaXplIC8gbUZyYW1lU2l6ZTsKKyAgICBzaXplX3Qgc3RlcENvdW50ID0gYXVkaW9CdWZmZXItPmZyYW1lQ291bnQ7CiAgICAgaWYgKHN0ZXBDb3VudCA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMTUwLDggKzEzMDcsOSBAQAogICAgICAgICAgICAgcmV0dXJuIHNzaXplX3QoZXJyKTsKICAgICAgICAgfQogCi0gICAgICAgIHNpemVfdCBieXRlc1JlYWQgPSBhdWRpb0J1ZmZlci5zaXplOwotICAgICAgICBtZW1jcHkoYnVmZmVyLCBhdWRpb0J1ZmZlci5pOCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgc2l6ZV90IGJ5dGVzUmVhZCA9IGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplOworICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgbUZvcm1hdCwgYXVkaW9CdWZmZXIucmF3LCBtU2VydmVyQ29uZmlnLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci5tU2l6ZSAvIG1TZXJ2ZXJTYW1wbGVTaXplKTsKICAgICAgICAgYnVmZmVyID0gKChjaGFyICopIGJ1ZmZlcikgKyBieXRlc1JlYWQ7CiAgICAgICAgIHVzZXJTaXplIC09IGJ5dGVzUmVhZDsKICAgICAgICAgcmVhZCArPSBieXRlc1JlYWQ7CkBAIC0xMTcwLDYgKzEzMjgsMTIgQEAKIG5zZWNzX3QgQXVkaW9SZWNvcmQ6OnByb2Nlc3NBdWRpb0J1ZmZlcigpCiB7CiAgICAgbUxvY2subG9jaygpOworICAgIGNvbnN0IHNwPElBdWRpb1JlY29yZENhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKCFjYWxsYmFjaykgeworICAgICAgICBtQ2FsbGJhY2sgPSBudWxscHRyOworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgcmV0dXJuIE5TX05FVkVSOworICAgIH0KICAgICBpZiAobUF3YWl0Qm9vc3QpIHsKICAgICAgICAgbUF3YWl0Qm9vc3QgPSBmYWxzZTsKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CkBAIC0xMjQ1LDI2ICsxNDA5LDI2IEBACiAgICAgdWludDMyX3Qgc2VxdWVuY2UgPSBtU2VxdWVuY2U7CiAKICAgICAvLyBUaGVzZSBmaWVsZHMgZG9uJ3QgbmVlZCB0byBiZSBjYWNoZWQsIGJlY2F1c2UgdGhleSBhcmUgYXNzaWduZWQgb25seSBieSBzZXQoKToKLSAgICAvLyAgICAgIG1UcmFuc2ZlciwgbUNiZiwgbVVzZXJEYXRhLCBtU2FtcGxlUmF0ZSwgbUZyYW1lU2l6ZQorICAgIC8vICAgICAgbVRyYW5zZmVyLCBtQ2FsbGJhY2ssIG1Vc2VyRGF0YSwgbVNhbXBsZVJhdGUsIG1GcmFtZVNpemUKIAogICAgIG1Mb2NrLnVubG9jaygpOwogCiAgICAgLy8gcGVyZm9ybSBjYWxsYmFja3Mgd2hpbGUgdW5sb2NrZWQKICAgICBpZiAobmV3T3ZlcnJ1bikgewotICAgICAgICBtQ2JmKEVWRU5UX09WRVJSVU4sIG1Vc2VyRGF0YSwgTlVMTCk7CisgICAgICAgIGNhbGxiYWNrLT5vbk92ZXJydW4oKTsKKwogICAgIH0KICAgICBpZiAobWFya2VyUmVhY2hlZCkgewotICAgICAgICBtQ2JmKEVWRU5UX01BUktFUiwgbVVzZXJEYXRhLCAmbWFya2VyUG9zaXRpb24pOworICAgICAgICBjYWxsYmFjay0+b25NYXJrZXIobWFya2VyUG9zaXRpb24udmFsdWUoKSk7CiAgICAgfQogICAgIHdoaWxlIChuZXdQb3NDb3VudCA+IDApIHsKLSAgICAgICAgc2l6ZV90IHRlbXAgPSBuZXdQb3NpdGlvbi52YWx1ZSgpOyAvLyBGSVhNRSBzaXplX3QgIT0gdWludDMyX3QKLSAgICAgICAgbUNiZihFVkVOVF9ORVdfUE9TLCBtVXNlckRhdGEsICZ0ZW1wKTsKKyAgICAgICAgY2FsbGJhY2stPm9uTmV3UG9zKG5ld1Bvc2l0aW9uLnZhbHVlKCkpOwogICAgICAgICBuZXdQb3NpdGlvbiArPSB1cGRhdGVQZXJpb2Q7CiAgICAgICAgIG5ld1Bvc0NvdW50LS07CiAgICAgfQogICAgIGlmIChtT2JzZXJ2ZWRTZXF1ZW5jZSAhPSBzZXF1ZW5jZSkgewogICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZSA9IHNlcXVlbmNlOwotICAgICAgICBtQ2JmKEVWRU5UX05FV19JQVVESU9SRUNPUkQsIG1Vc2VyRGF0YSwgTlVMTCk7CisgICAgICAgIGNhbGxiYWNrLT5vbk5ld0lBdWRpb1JlY29yZCgpOwogICAgIH0KIAogICAgIC8vIGlmIGluYWN0aXZlLCB0aGVuIGRvbid0IHJ1biBtZSBhZ2FpbiB1bnRpbCByZS1zdGFydGVkCkBAIC0xMzQ4LDkgKzE1MTIsMTkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHNpemVfdCByZXFTaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKLSAgICAgICAgbUNiZihFVkVOVF9NT1JFX0RBVEEsIG1Vc2VyRGF0YSwgJmF1ZGlvQnVmZmVyKTsKLSAgICAgICAgc2l6ZV90IHJlYWRTaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKKyAgICAgICAgQnVmZmVyKiBidWZmZXIgPSAmYXVkaW9CdWZmZXI7CisgICAgICAgIGlmIChtU2VydmVyQ29uZmlnLmZvcm1hdCAhPSBtRm9ybWF0KSB7CisgICAgICAgICAgICBidWZmZXIgPSAmbUZvcm1hdENvbnZlcnNpb25CdWZmZXI7CisgICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBhdWRpb0J1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgYnVmZmVyLT5tU2l6ZSA9IGJ1ZmZlci0+ZnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CisgICAgICAgICAgICBidWZmZXItPnNlcXVlbmNlID0gYXVkaW9CdWZmZXIuc2VxdWVuY2U7CisgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlci0+cmF3LCBtRm9ybWF0LCBhdWRpb0J1ZmZlci5yYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2ZXJDb25maWcuZm9ybWF0LCBhdWRpb0J1ZmZlci5zaXplKCkgLyBtU2VydmVyU2FtcGxlU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzaXplX3QgcmVxU2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworICAgICAgICBjb25zdCBzaXplX3QgcmVhZFNpemUgPSBjYWxsYmFjay0+b25Nb3JlRGF0YSgqYnVmZmVyKTsKKyAgICAgICAgYnVmZmVyLT5tU2l6ZSA9IHJlYWRTaXplOwogCiAgICAgICAgIC8vIFZhbGlkYXRlIG9uIHJldHVybmVkIHNpemUKICAgICAgICAgaWYgKHNzaXplX3QocmVhZFNpemUpIDwgMCB8fCByZWFkU2l6ZSA+IHJlcVNpemUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCBmMWVlYWEzLi5kZThjMjk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC00MCwxOSArNDAsMjUgQEAKICAgICAgICBpZiAoIV90bXAub2soKSkgcmV0dXJuIGFpZGxfdXRpbHM6OmJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKF90bXAuZXJyb3IoKSk7IFwKICAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgfSkKIAotI2RlZmluZSBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHgpICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGF1dG8gX3RtcCA9ICh4KTsgICAgICAgICAgICAgXAotICAgICAgICBpZiAoX3RtcCAhPSBPSykgcmV0dXJuIF90bXA7IFwKLSAgICB9Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogdXNpbmcgYWlkbF91dGlsczo6c3RhdHVzVEZyb21CaW5kZXJTdGF0dXM7CiB1c2luZyBiaW5kZXI6OlN0YXR1czsKK3VzaW5nIGNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CiB1c2luZyBtZWRpYTo6SUF1ZGlvUG9saWN5U2VydmljZTsKLXVzaW5nIGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db25maWc7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db25maWdCYXNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlRGVzY3JpcHRpb247Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXREZXNjcmlwdGlvbjsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lJbmZvOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeVR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9PZmZsb2FkSW5mbzsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1NvdXJjZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0cmVhbVR5cGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Vc2FnZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpJbnQ7CiAKIC8vIGNsaWVudCBzaW5nbGV0b24gZm9yIEF1ZGlvRmxpbmdlciBiaW5kZXIgaW50ZXJmYWNlCiBNdXRleCBBdWRpb1N5c3RlbTo6Z0xvY2s7CkBAIC02NCw2ICs3MCw3IEBACiBkeW5hbWljX3BvbGljeV9jYWxsYmFjayBBdWRpb1N5c3RlbTo6Z0R5blBvbGljeUNhbGxiYWNrID0gTlVMTDsKIHJlY29yZF9jb25maWdfY2FsbGJhY2sgQXVkaW9TeXN0ZW06OmdSZWNvcmRDb25maWdDYWxsYmFjayA9IE5VTEw7CiByb3V0aW5nX2NhbGxiYWNrIEF1ZGlvU3lzdGVtOjpnUm91dGluZ0NhbGxiYWNrID0gTlVMTDsKK3ZvbF9yYW5nZV9pbml0X3JlcV9jYWxsYmFjayBBdWRpb1N5c3RlbTo6Z1ZvbFJhbmdlSW5pdFJlcUNhbGxiYWNrID0gTlVMTDsKIAogLy8gUmVxdWlyZWQgdG8gYmUgaGVsZCB3aGlsZSBjYWxsaW5nIGludG8gZ1NvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyLgogY2xhc3MgQ2FwdHVyZVN0YXRlTGlzdGVuZXJJbXBsOwpAQCAtMzM2LDcgKzM0Myw3IEBACiAgICAgaWYgKGRlc2MgPT0gMCkgewogICAgICAgICAqc2FtcGxpbmdSYXRlID0gYWYtPnNhbXBsZVJhdGUoaW9IYW5kbGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgICpzYW1wbGluZ1JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAqc2FtcGxpbmdSYXRlID0gZGVzYy0+Z2V0U2FtcGxpbmdSYXRlKCk7CiAgICAgfQogICAgIGlmICgqc2FtcGxpbmdSYXRlID09IDApIHsKICAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRTYW1wbGluZ1JhdGUgZmFpbGVkIGZvciBpb0hhbmRsZSAlZCIsIGlvSGFuZGxlKTsKQEAgLTM3MSw3ICszNzgsNyBAQAogICAgIGlmIChkZXNjID09IDApIHsKICAgICAgICAgKmZyYW1lQ291bnQgPSBhZi0+ZnJhbWVDb3VudChpb0hhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgKmZyYW1lQ291bnQgPSBkZXNjLT5tRnJhbWVDb3VudDsKKyAgICAgICAgKmZyYW1lQ291bnQgPSBkZXNjLT5nZXRGcmFtZUNvdW50KCk7CiAgICAgfQogICAgIGlmICgqZnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudCBmYWlsZWQgZm9yIGlvSGFuZGxlICVkIiwgaW9IYW5kbGUpOwpAQCAtNDA2LDcgKzQxMyw3IEBACiAgICAgaWYgKG91dHB1dERlc2MgPT0gMCkgewogICAgICAgICAqbGF0ZW5jeSA9IGFmLT5sYXRlbmN5KG91dHB1dCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgKmxhdGVuY3kgPSBvdXRwdXREZXNjLT5tTGF0ZW5jeTsKKyAgICAgICAgKmxhdGVuY3kgPSBvdXRwdXREZXNjLT5nZXRMYXRlbmN5KCk7CiAgICAgfQogCiAgICAgQUxPR1YoImdldExhdGVuY3koKSBvdXRwdXQgJWQsIGxhdGVuY3kgJWQiLCBvdXRwdXQsICpsYXRlbmN5KTsKQEAgLTQ4MCw2ICs0ODcsMTIgQEAKICAgICByZXR1cm4gYWYtPnN5c3RlbVJlYWR5KCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjphdWRpb1BvbGljeVJlYWR5KCkgeworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gYWYtPmF1ZGlvUG9saWN5UmVhZHkoKTsKK30KKwogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldEZyYW1lQ291bnRIQUwoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGZyYW1lQ291bnQpIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKQEAgLTQ4OCw3ICs1MDEsNyBAQAogICAgIGlmIChkZXNjID09IDApIHsKICAgICAgICAgKmZyYW1lQ291bnQgPSBhZi0+ZnJhbWVDb3VudEhBTChpb0hhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgKmZyYW1lQ291bnQgPSBkZXNjLT5tRnJhbWVDb3VudEhBTDsKKyAgICAgICAgKmZyYW1lQ291bnQgPSBkZXNjLT5nZXRGcmFtZUNvdW50SEFMKCk7CiAgICAgfQogICAgIGlmICgqZnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudEhBTCBmYWlsZWQgZm9yIGlvSGFuZGxlICVkIiwgaW9IYW5kbGUpOwpAQCAtNTI5LDE1ICs1NDIsMTUgQEAKIFN0YXR1cyBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50Ojppb0NvbmZpZ0NoYW5nZWQoCiAgICAgICAgIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQgX2V2ZW50LAogICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Jb0Rlc2NyaXB0b3ImIF9pb0Rlc2MpIHsKLSAgICBhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvSW9Db25maWdFdmVudF9hdWRpb19pb19jb25maWdfZXZlbnQoX2V2ZW50KSk7CisgICAgYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgZXZlbnQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvSW9Db25maWdFdmVudF9hdWRpb19pb19jb25maWdfZXZlbnRfdChfZXZlbnQpKTsKICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjKAogICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvSW9EZXNjcmlwdG9yX0F1ZGlvSW9EZXNjcmlwdG9yKF9pb0Rlc2MpKSk7CiAKICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgZXZlbnQgJWQiLCBldmVudCk7CiAKLSAgICBpZiAoaW9EZXNjLT5tSW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgaWYgKGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgcmV0dXJuIFN0YXR1czo6b2soKTsKIAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIHN0ZDo6dmVjdG9yPHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+PiBjYWxsYmFja3NUb0NhbGw7CkBAIC01NTAsOTMgKzU2Myw4OCBAQAogICAgICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfUkVHSVNURVJFRDoKICAgICAgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfT1BFTkVEOgogICAgICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9SRUdJU1RFUkVEOiB7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPmdldElvSGFuZGxlKCkpOwogICAgICAgICAgICAgICAgIGlmIChvbGREZXNjID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUlvRGVzY3JpcHRvcnMuYWRkKGlvRGVzYy0+bUlvSGFuZGxlLCBpb0Rlc2MpOworICAgICAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5hZGQoaW9EZXNjLT5nZXRJb0hhbmRsZSgpLCBpb0Rlc2MpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkID0gb2xkRGVzYy0+Z2V0RGV2aWNlSWQoKTsKLSAgICAgICAgICAgICAgICAgICAgbUlvRGVzY3JpcHRvcnMucmVwbGFjZVZhbHVlRm9yKGlvRGVzYy0+bUlvSGFuZGxlLCBpb0Rlc2MpOworICAgICAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZXBsYWNlVmFsdWVGb3IoaW9EZXNjLT5nZXRJb0hhbmRsZSgpLCBpb0Rlc2MpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChpb0Rlc2MtPmdldERldmljZUlkKCkgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IEFVRElPX09VVFBVVF9PUEVORUQgfHwgZXZlbnQgPT0gQVVESU9fSU5QVVRfT1BFTkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmZpbmQoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5maW5kKGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgIT0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVuZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gaXQtPnNlY29uZDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3ICVzICVzICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCBjaGFubmVsIG1hc2sgJSN4ICIKLSAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAlenUgZGV2aWNlSWQgJWQiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgJXMgJXMgJXMiLAogICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9PUEVORUQgfHwgZXZlbnQgPT0gQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQgPwogICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQiIDogImlucHV0IiwKICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfT1BFTkVEIHx8IGV2ZW50ID09IEFVRElPX0lOUFVUX09QRU5FRCA/CiAgICAgICAgICAgICAgICAgICAgICAgIm9wZW5lZCIgOiAicmVnaXN0ZXJlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYy0+bVNhbXBsaW5nUmF0ZSwgaW9EZXNjLT5tRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUZyYW1lQ291bnQsIGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT50b0RlYnVnU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9DTE9TRUQ6CiAgICAgICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0NMT1NFRDogewotICAgICAgICAgICAgICAgIGlmIChnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPmdldElvSGFuZGxlKCkpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIGNsb3NpbmcgdW5rbm93biAlcyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9DTE9TRUQgPyAib3V0cHV0IiA6ICJpbnB1dCIsIGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NMT1NFRCA/ICJvdXRwdXQiIDogImlucHV0IiwgaW9EZXNjLT5nZXRJb0hhbmRsZSgpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSAlcyAlZCBjbG9zZWQiLAotICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9DTE9TRUQgPyAib3V0cHV0IiA6ICJpbnB1dCIsIGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfQ0xPU0VEID8gIm91dHB1dCIgOiAiaW5wdXQiLCBpb0Rlc2MtPmdldElvSGFuZGxlKCkpOwogCi0gICAgICAgICAgICAgICAgbUlvRGVzY3JpcHRvcnMucmVtb3ZlSXRlbShpb0Rlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVyYXNlKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZW1vdmVJdGVtKGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVyYXNlKGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEOgogICAgICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRDogewotICAgICAgICAgICAgICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBvbGREZXNjID0gZ2V0SW9EZXNjcmlwdG9yX2woaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBvbGREZXNjID0gZ2V0SW9EZXNjcmlwdG9yX2woaW9EZXNjLT5nZXRJb0hhbmRsZSgpKTsKICAgICAgICAgICAgICAgICBpZiAob2xkRGVzYyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJpb0NvbmZpZ0NoYW5nZWQoKSBtb2RpZnlpbmcgdW5rbm93biAlcyEgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQgPyAib3V0cHV0IiA6ICJpbnB1dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5nZXRJb0hhbmRsZSgpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBvbGREZXNjLT5nZXREZXZpY2VJZCgpOwotICAgICAgICAgICAgICAgIG1Jb0Rlc2NyaXB0b3JzLnJlcGxhY2VWYWx1ZUZvcihpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjKTsKKyAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZXBsYWNlVmFsdWVGb3IoaW9EZXNjLT5nZXRJb0hhbmRsZSgpLCBpb0Rlc2MpOwogCiAgICAgICAgICAgICAgICAgaWYgKGRldmljZUlkICE9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSkgewogICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKTsKLSAgICAgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5maW5kKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5maW5kKGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpdCAhPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZW5kKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IGl0LT5zZWNvbmQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyBjb25maWcgZm9yICVzICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCAiCi0gICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAlI3ggZnJhbWVDb3VudCAlenUgZnJhbWVDb3VudEhBTCAlenUgZGV2aWNlSWQgJWQiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgY29uZmlnIGZvciAlcyAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEID8gIm91dHB1dCIgOiAiaW5wdXQiLAotICAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlLCBpb0Rlc2MtPm1TYW1wbGluZ1JhdGUsIGlvRGVzYy0+bUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPm1DaGFubmVsTWFzaywgaW9EZXNjLT5tRnJhbWVDb3VudCwgaW9EZXNjLT5tRnJhbWVDb3VudEhBTCwKLSAgICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPmdldERldmljZUlkKCkpOworICAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+dG9EZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEFVRElPX0NMSUVOVF9TVEFSVEVEOiB7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPmdldElvSGFuZGxlKCkpOwogICAgICAgICAgICAgICAgIGlmIChvbGREZXNjID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIHN0YXJ0IGNsaWVudCBvbiB1bmtub3duIGlvISAlZCIsIGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIHN0YXJ0IGNsaWVudCBvbiB1bmtub3duIGlvISAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5nZXRJb0hhbmRsZSgpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBBVURJT19DTElFTlRfU1RBUlRFRCAgaW8gJWQgcG9ydCAlZCBudW0gY2FsbGJhY2tzICV6dSIsCi0gICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYy0+bVBvcnRJZCwgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgb2xkRGVzYy0+bVBhdGNoID0gaW9EZXNjLT5tUGF0Y2g7Ci0gICAgICAgICAgICAgICAgYXV0byBpdCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5maW5kKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPmdldElvSGFuZGxlKCksIGlvRGVzYy0+Z2V0UG9ydElkKCksIG1BdWRpb0RldmljZUNhbGxiYWNrcy5zaXplKCkpOworICAgICAgICAgICAgICAgIG9sZERlc2MtPnNldFBhdGNoKGlvRGVzYy0+Z2V0UGF0Y2goKSk7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5maW5kKGlvRGVzYy0+Z2V0SW9IYW5kbGUoKSk7CiAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5lbmQoKSkgewogICAgICAgICAgICAgICAgICAgICBhdXRvIGNia3MgPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgICAgICAgICBhdXRvIGl0MiA9IGNia3MuZmluZChpb0Rlc2MtPm1Qb3J0SWQpOworICAgICAgICAgICAgICAgICAgICBhdXRvIGl0MiA9IGNia3MuZmluZChpb0Rlc2MtPmdldFBvcnRJZCgpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGl0MiAhPSBjYmtzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZW1wbGFjZShpb0Rlc2MtPm1Qb3J0SWQsIGl0Mi0+c2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5lbXBsYWNlKGlvRGVzYy0+Z2V0UG9ydElkKCksIGl0Mi0+c2Vjb25kKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkID0gb2xkRGVzYy0+Z2V0RGV2aWNlSWQoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTY1NSw4ICs2NjMsOCBAQAogICAgIC8vIENhbGxiYWNrcyBtdXN0IGJlIGNhbGxlZCB3aXRob3V0IG1Mb2NrIGhlbGQuIE1heSBsZWFkIHRvIGRlYWQgbG9jayBpZiBjYWxsaW5nIGZvcgogICAgIC8vIGV4YW1wbGUgZ2V0Um91dGVkRGV2aWNlIHRoYXQgdXBkYXRlcyB0aGUgZGV2aWNlIGFuZCB0cmllcyB0byBhY3F1aXJlIG1Mb2NrLgogICAgIGZvciAoYXV0byBjYiAgOiBjYWxsYmFja3NUb0NhbGwpIHsKLSAgICAgICAgLy8gSWYgY2FsbGJhY2tzVG9DYWxsIGlzIG5vdCBlbXB0eSwgaXQgaW1wbGllcyBpb0Rlc2MtPm1Jb0hhbmRsZSBhbmQgZGV2aWNlSWQgYXJlIHZhbGlkCi0gICAgICAgIGNiLT5vbkF1ZGlvRGV2aWNlVXBkYXRlKGlvRGVzYy0+bUlvSGFuZGxlLCBkZXZpY2VJZCk7CisgICAgICAgIC8vIElmIGNhbGxiYWNrc1RvQ2FsbCBpcyBub3QgZW1wdHksIGl0IGltcGxpZXMgaW9EZXNjLT5nZXRJb0hhbmRsZSgpIGFuZCBkZXZpY2VJZCBhcmUgdmFsaWQKKyAgICAgICAgY2ItPm9uQXVkaW9EZXZpY2VVcGRhdGUoaW9EZXNjLT5nZXRJb0hhbmRsZSgpLCBkZXZpY2VJZCk7CiAgICAgfQogCiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKQEAgLTc3NCw2ICs3ODIsMTEgQEAKICAgICBnUm91dGluZ0NhbGxiYWNrID0gY2I7CiB9CiAKKy8qc3RhdGljKi8gdm9pZCBBdWRpb1N5c3RlbTo6c2V0Vm9sSW5pdFJlcUNhbGxiYWNrKHZvbF9yYW5nZV9pbml0X3JlcV9jYWxsYmFjayBjYikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgZ1ZvbFJhbmdlSW5pdFJlcUNhbGxiYWNrID0gY2I7Cit9CisKIC8vIGNsaWVudCBzaW5nbGV0b24gZm9yIEF1ZGlvUG9saWN5U2VydmljZSBiaW5kZXIgaW50ZXJmYWNlCiAvLyBwcm90ZWN0ZWQgYnkgZ0xvY2tBUFMKIHNwPElBdWRpb1BvbGljeVNlcnZpY2U+IEF1ZGlvU3lzdGVtOjpnQXVkaW9Qb2xpY3lTZXJ2aWNlOwpAQCAtODE5LDYgKzgzMiwxMSBAQAogICAgIHJldHVybiBhcDsKIH0KIAordm9pZCBBdWRpb1N5c3RlbTo6Y2xlYXJBdWRpb1BvbGljeVNlcnZpY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQVBTKTsKKyAgICBnQXVkaW9Qb2xpY3lTZXJ2aWNlLmNsZWFyKCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpIHsKQEAgLTgyNywzNSArODQ1LDIwIEBACiAgICAgYXBzLT5vbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZV9uYW1lLAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnQmIHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwotICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MgPSAiIjsKLSAgICBjb25zdCBjaGFyKiBuYW1lID0gIiI7CiAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIGlmIChkZXZpY2VfYWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgIGFkZHJlc3MgPSBkZXZpY2VfYWRkcmVzczsKLSAgICB9Ci0gICAgaWYgKGRldmljZV9uYW1lICE9IE5VTEwpIHsKLSAgICAgICAgbmFtZSA9IGRldmljZV9uYW1lOwotICAgIH0KLQotICAgIG1lZGlhOjpBdWRpb0RldmljZSBkZXZpY2VBaWRsOwotICAgIGRldmljZUFpZGwudHlwZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoZGV2aWNlKSk7Ci0gICAgZGV2aWNlQWlkbC5hZGRyZXNzID0gYWRkcmVzczsKLQogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICAgICAgICAgICAgICBkZXZpY2VBaWRsLAogICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdF9BdWRpb1BvbGljeURldmljZVN0YXRlKHN0YXRlKSksCi0gICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQoZW5jb2RlZEZvcm1hdCkpKSk7CisgICAgICAgICAgICAgICAgICAgIHBvcnQsCisgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihlbmNvZGVkRm9ybWF0KSkpKTsKIH0KIAogYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKQEAgLTg2NCw5ICs4NjcsOCBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CiAKICAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90PiB7Ci0gICAgICAgIG1lZGlhOjpBdWRpb0RldmljZSBkZXZpY2VBaWRsOwotICAgICAgICBkZXZpY2VBaWRsLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoZGV2aWNlKSk7Ci0gICAgICAgIGRldmljZUFpZGwuYWRkcmVzcyA9IGRldmljZV9hZGRyZXNzOworICAgICAgICBBdWRpb0RldmljZSBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZV9BdWRpb0RldmljZShkZXZpY2UsIGRldmljZV9hZGRyZXNzKSk7CiAKICAgICAgICAgbWVkaWE6OkF1ZGlvUG9saWN5RGV2aWNlU3RhdGUgcmVzdWx0OwogICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCkBAIC04OTQsMTMgKzg5NiwxMiBAQAogICAgICAgICBuYW1lID0gZGV2aWNlX25hbWU7CiAgICAgfQogCi0gICAgbWVkaWE6OkF1ZGlvRGV2aWNlIGRldmljZUFpZGw7Ci0gICAgZGV2aWNlQWlkbC50eXBlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChkZXZpY2UpKTsKLSAgICBkZXZpY2VBaWRsLmFkZHJlc3MgPSBhZGRyZXNzOworICAgIEF1ZGlvRGV2aWNlIGRldmljZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlX0F1ZGlvRGV2aWNlKGRldmljZSwgYWRkcmVzcykpOwogCiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5oYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoZGV2aWNlQWlkbCwgbmFtZSwgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQoZW5jb2RlZEZvcm1hdCkpKSk7CisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oZW5jb2RlZEZvcm1hdCkpKSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSwgdWlkX3QgdWlkKSB7CkBAIC05NDksNyArOTUwLDcgQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKIAogICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb19pb19oYW5kbGVfdD4gewotICAgICAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOwogICAgICAgICBpbnQzMl90IG91dHB1dEFpZGw7CiAgICAgICAgIFJFVFVSTl9JRl9FUlJPUigKQEAgLTk2OSw3ICs5NzAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90KiBzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCogcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+KiBzZWNvbmRhcnlPdXRwdXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4qIHNlY29uZGFyeU91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1NwYXRpYWxpemVkKSB7CiAgICAgaWYgKGF0dHIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXMgTlVMTCBhdWRpbyBhdHRyaWJ1dGVzIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtOTk3LDggKzk5OSw4IEBACiAgICAgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHJBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCgqYXR0cikpOwogICAgIGludDMyX3Qgc2Vzc2lvbkFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3Nlc3Npb25fdF9pbnQzMl90KHNlc3Npb24pKTsKLSAgICBtZWRpYTo6QXVkaW9Db25maWcgY29uZmlnQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZygqY29uZmlnKSk7CisgICAgQXVkaW9Db25maWcgY29uZmlnQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZygqY29uZmlnLCBmYWxzZSAvKmlzSW5wdXQqLykpOwogICAgIGludDMyX3QgZmxhZ3NBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX291dHB1dF9mbGFnc190X2ludDMyX3RfbWFzayhmbGFncykpOwogICAgIGludDMyX3Qgc2VsZWN0ZWREZXZpY2VJZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKApAQCAtMTAyMiw2ICsxMDI0LDcgQEAKICAgICAqcG9ydElkID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QocmVzcG9uc2VBaWRsLnBvcnRJZCkpOwogICAgICpzZWNvbmRhcnlPdXRwdXRzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90Pj4oCiAgICAgICAgICAgICByZXNwb25zZUFpZGwuc2Vjb25kYXJ5T3V0cHV0cywgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdCkpOworICAgICppc1NwYXRpYWxpemVkID0gcmVzcG9uc2VBaWRsLmlzU3BhdGlhbGl6ZWQ7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMDkxLDggKzEwOTQsOCBAQAogICAgIGludDMyX3QgaW5wdXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KCppbnB1dCkpOwogICAgIGludDMyX3QgcmlpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3VuaXF1ZV9pZF90X2ludDMyX3QocmlpZCkpOwogICAgIGludDMyX3Qgc2Vzc2lvbkFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3Nlc3Npb25fdF9pbnQzMl90KHNlc3Npb24pKTsKLSAgICBtZWRpYTo6QXVkaW9Db25maWdCYXNlIGNvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoKmNvbmZpZykpOworICAgIEF1ZGlvQ29uZmlnQmFzZSBjb25maWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKCpjb25maWcsIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICBpbnQzMl90IGZsYWdzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soZmxhZ3MpKTsKICAgICBpbnQzMl90IHNlbGVjdGVkRGV2aWNlSWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdCgqc2VsZWN0ZWREZXZpY2VJZCkpOwpAQCAtMTE0OCwxMiArMTE1MSwxOSBAQAogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKLSAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOwogICAgIGludDMyX3QgaW5kZXhNaW5BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oaW5kZXhNaW4pKTsKICAgICBpbnQzMl90IGluZGV4TWF4QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KGluZGV4TWF4KSk7Ci0gICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5pbml0U3RyZWFtVm9sdW1lKHN0cmVhbUFpZGwsIGluZGV4TWluQWlkbCwgaW5kZXhNYXhBaWRsKSk7CisgICAgaWYgKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgeworICAgICAgICAvLyBUaGlzIGlzIGEgY3JpdGljYWwgb3BlcmF0aW9uIHNpbmNlIHcvbyBwcm9wZXIgc3RyZWFtIHZvbHVtZXMgbm8gYXVkaW8KKyAgICAgICAgLy8gd2lsbCBiZSBoZWFyZC4gTWFrZSBzdXJlIHdlIHJlY292ZXIgZnJvbSBhIGZhaWx1cmUgaW4gYW55IGNhc2UuCisgICAgICAgIEFMT0dFKCJSZWNlaXZlZCBERUFEX09CSkVDVCBmcm9tIEFQUywgY2xlYXJpbmcgdGhlIGNsaWVudCIpOworICAgICAgICBjbGVhckF1ZGlvUG9saWN5U2VydmljZSgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC0xMTYyLDEwICsxMTcyLDExIEBACiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CiAgICAgaW50MzJfdCBpbmRleEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihpbmRleCkpOwotICAgIGludDMyX3QgZGV2aWNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoZGV2aWNlKSk7CisgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9BdWRpb0RldmljZURlc2NyaXB0aW9uKGRldmljZSkpOwogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+c2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtQWlkbCwgZGV2aWNlQWlkbCwgaW5kZXhBaWRsKSk7CiB9CkBAIC0xMTc2LDkgKzExODcsMTAgQEAKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICBBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKLSAgICBpbnQzMl90IGRldmljZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGRldmljZSkpOworICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24gZGV2aWNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihkZXZpY2UpKTsKICAgICBpbnQzMl90IGluZGV4QWlkbDsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5nZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW1BaWRsLCBkZXZpY2VBaWRsLCAmaW5kZXhBaWRsKSkpOwpAQCAtMTE5Nyw3ICsxMjA5LDggQEAKICAgICBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0ckFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKGF0dHIpKTsKICAgICBpbnQzMl90IGluZGV4QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KGluZGV4KSk7Ci0gICAgaW50MzJfdCBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChkZXZpY2UpKTsKKyAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uIGRldmljZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oZGV2aWNlKSk7CiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5zZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0ckFpZGwsIGRldmljZUFpZGwsIGluZGV4QWlkbCkpOwogfQpAQCAtMTIxMCw3ICsxMjIzLDggQEAKIAogICAgIG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19hdHRyaWJ1dGVzX3RfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwoYXR0cikpOwotICAgIGludDMyX3QgZGV2aWNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoZGV2aWNlKSk7CisgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9BdWRpb0RldmljZURlc2NyaXB0aW9uKGRldmljZSkpOwogICAgIGludDMyX3QgaW5kZXhBaWRsOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyQWlkbCwgZGV2aWNlQWlkbCwgJmluZGV4QWlkbCkpKTsKQEAgLTEyNDksNyArMTI2Myw3IEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOwogCiAgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PHByb2R1Y3Rfc3RyYXRlZ3lfdD4gewotICAgICAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOwogICAgICAgICBpbnQzMl90IHJlc3VsdEFpZGw7CiAgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKQEAgLTEyNTksMjMgKzEyNzMsOSBAQAogICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoUFJPRFVDVF9TVFJBVEVHWV9OT05FKTsKIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7Ci0gICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKLSAgICBpZiAoYXBzID09IDApIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKLQotICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb19kZXZpY2VzX3Q+IHsKLSAgICAgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOwotICAgICAgICBpbnQzMl90IHJlc3VsdEFpZGw7Ci0gICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKLSAgICAgICAgICAgICAgICBhcHMtPmdldERldmljZXNGb3JTdHJlYW0oc3RyZWFtQWlkbCwgJnJlc3VsdEFpZGwpKSk7Ci0gICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChyZXN1bHRBaWRsKTsKLSAgICB9KCk7Ci0gICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcihBVURJT19ERVZJQ0VfTk9ORSk7Ci19Ci0KIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMmIGFhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IqIGRldmljZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yKiBkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yVm9sdW1lKSB7CiAgICAgaWYgKGRldmljZXMgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KQEAgLTEyODQsOSArMTI4NCw5IEBACiAKICAgICBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzRXggYWFBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvQXR0cmlidXRlc19BdWRpb0F0dHJpYnV0ZXNFeChhYSkpOwotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4gcmV0QWlkbDsKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4gcmV0QWlkbDsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKAotICAgICAgICAgICAgc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5nZXREZXZpY2VzRm9yQXR0cmlidXRlcyhhYUFpZGwsICZyZXRBaWRsKSkpOworICAgICAgICAgICAgc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5nZXREZXZpY2VzRm9yQXR0cmlidXRlcyhhYUFpZGwsIGZvclZvbHVtZSwgJnJldEFpZGwpKSk7CiAgICAgKmRldmljZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yPigKICAgICAgICAgICAgICAgICAgICAgcmV0QWlkbCwKQEAgLTEzNjIsNyArMTM2Miw3IEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgaWYgKHN0YXRlID09IE5VTEwpIHJldHVybiBCQURfVkFMVUU7CiAKLSAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOwogICAgIGludDMyX3QgaW5QYXN0TXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oaW5QYXN0TXMpKTsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKApAQCAtMTM3Niw3ICsxMzc2LDcgQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICBpZiAoc3RhdGUgPT0gTlVMTCkgcmV0dXJuIEJBRF9WQUxVRTsKIAotICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CiAgICAgaW50MzJfdCBpblBhc3RNc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihpblBhc3RNcykpOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCkBAIC0xMzg5LDggKzEzODksOCBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIGlmIChzdGF0ZSA9PSBOVUxMKSByZXR1cm4gQkFEX1ZBTFVFOwogCi0gICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShzdHJlYW0pKTsKKyAgICBBdWRpb1NvdXJjZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKHN0cmVhbSkpOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPmlzU291cmNlQWN0aXZlKHN0cmVhbUFpZGwsIHN0YXRlKSkpOwogICAgIHJldHVybiBPSzsKQEAgLTE0MjQsMTkgKzE0MjQsMTYgQEAKICAgICAgICAgfQogICAgICAgICBnQXVkaW9GbGluZ2VyLmNsZWFyKCk7CiAgICAgfQotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQVBTKTsKLSAgICAgICAgZ0F1ZGlvUG9saWN5U2VydmljZS5jbGVhcigpOwotICAgIH0KKyAgICBjbGVhckF1ZGlvUG9saWN5U2VydmljZSgpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0U3VwcG9ydGVkU3lzdGVtVXNhZ2VzKGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX3VzYWdlX3Q+JiBzeXN0ZW1Vc2FnZXMpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gbnVsbHB0cikgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvVXNhZ2U+IHN5c3RlbVVzYWdlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Vc2FnZT4+KHN5c3RlbVVzYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb191c2FnZV90X0F1ZGlvVXNhZ2UpKTsKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb1VzYWdlPiBzeXN0ZW1Vc2FnZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8QXVkaW9Vc2FnZT4+KHN5c3RlbVVzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3VzYWdlX3RfQXVkaW9Vc2FnZSkpOwogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnNldFN1cHBvcnRlZFN5c3RlbVVzYWdlcyhzeXN0ZW1Vc2FnZXNBaWRsKSk7CiB9CiAKQEAgLTE0NTYsNyArMTQ1Myw3IEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEOwogCiAgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX29mZmxvYWRfbW9kZV90PiB7Ci0gICAgICAgIG1lZGlhOjpBdWRpb09mZmxvYWRJbmZvIGluZm9BaWRsID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICBBdWRpb09mZmxvYWRJbmZvIGluZm9BaWRsID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX29mZmxvYWRfaW5mb190X0F1ZGlvT2ZmbG9hZEluZm8oaW5mbykpOwogICAgICAgICBtZWRpYTo6QXVkaW9PZmZsb2FkTW9kZSByZXRBaWRsOwogICAgICAgICBSRVRVUk5fSUZfRVJST1IoCkBAIC0xNDg0LDcgKzE0ODEsNyBAQAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9yb2xlX3RfQXVkaW9Qb3J0Um9sZShyb2xlKSk7CiAgICAgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF90eXBlX3RfQXVkaW9Qb3J0VHlwZSh0eXBlKSk7Ci0gICAgbWVkaWE6OkludCBudW1Qb3J0c0FpZGw7CisgICAgSW50IG51bVBvcnRzQWlkbDsKICAgICBudW1Qb3J0c0FpZGwudmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PigqbnVtX3BvcnRzKSk7CiAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUG9ydD4gcG9ydHNBaWRsOwogICAgIGludDMyX3QgZ2VuZXJhdGlvbkFpZGw7CkBAIC0xNTAyLDEzICsxNDk5LDEyIEBACiAgICAgaWYgKHBvcnQgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLQogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKLSAgICBtZWRpYTo6QXVkaW9Qb3J0IHBvcnRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Y3X0F1ZGlvUG9ydCgqcG9ydCkpOworICAgIG1lZGlhOjpBdWRpb1BvcnQgcG9ydEFpZGw7CiAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUigKLSAgICAgICAgICAgIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+Z2V0QXVkaW9Qb3J0KHBvcnRBaWRsLCAmcG9ydEFpZGwpKSk7CisgICAgICAgICAgICBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPmdldEF1ZGlvUG9ydChwb3J0LT5pZCwgJnBvcnRBaWRsKSkpOwogICAgICpwb3J0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb1BvcnRfYXVkaW9fcG9ydF92Nyhwb3J0QWlkbCkpOwogICAgIHJldHVybiBPSzsKIH0KQEAgLTE1NTEsNyArMTU0Nyw3IEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKIAotICAgIG1lZGlhOjpJbnQgbnVtUGF0Y2hlc0FpZGw7CisgICAgSW50IG51bVBhdGNoZXNBaWRsOwogICAgIG51bVBhdGNoZXNBaWRsLnZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oKm51bV9wYXRjaGVzKSk7CiAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUGF0Y2g+IHBhdGNoZXNBaWRsOwogICAgIGludDMyX3QgZ2VuZXJhdGlvbkFpZGw7CkBAIC0xNjkwLDcgKzE2ODYsOCBAQAogICAgICAgICAgICAgc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5hY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbigmcmV0QWlkbCkpKTsKICAgICAqc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3QocmV0QWlkbC5zZXNzaW9uKSk7CiAgICAgKmlvSGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KHJldEFpZGwuaW9IYW5kbGUpKTsKLSAgICAqZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChyZXRBaWRsLmRldmljZSkpOworICAgICpkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbl9hdWRpb19kZXZpY2VzX3QocmV0QWlkbC5kZXZpY2UpKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE3MDcsNyArMTcwNCw3IEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gQVVESU9fTU9ERV9JTlZBTElEOwogCiAgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX21vZGVfdD4gewotICAgICAgICBtZWRpYTo6QXVkaW9Nb2RlIHJldEFpZGw7CisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01vZGUgcmV0QWlkbDsKICAgICAgICAgUkVUVVJOX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+Z2V0UGhvbmVTdGF0ZSgmcmV0QWlkbCkpKTsKICAgICAgICAgcmV0dXJuIGFpZGwybGVnYWN5X0F1ZGlvTW9kZV9hdWRpb19tb2RlX3QocmV0QWlkbCk7CiAgICAgfSgpOwpAQCAtMTczMiw4ICsxNzI5LDggQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAogICAgIGludDMyX3QgdWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdCh1aWQpKTsKLSAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4gZGV2aWNlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4+KGRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5zZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZEFpZGwsIGRldmljZXNBaWRsKSk7CiB9CkBAIC0xNzUyLDkgKzE3NDksOSBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCiAgICAgaW50MzJfdCB1c2VySWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0UmVpbnRlcnByZXQ8aW50MzJfdD4odXNlcklkKSk7Ci0gICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4+KGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4gZGV2aWNlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4+KGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOwogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+c2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyh1c2VySWRBaWRsLCBkZXZpY2VzQWlkbCkpOwogfQpAQCAtMTgyNywxMCArMTgyNCwxMSBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIE5BTjsKIAogICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxmbG9hdD4gewotICAgICAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOwogICAgICAgICBpbnQzMl90IGluZGV4QWlkbCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oaW5kZXgpKTsKLSAgICAgICAgaW50MzJfdCBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGRldmljZSkpOworICAgICAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uIGRldmljZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oZGV2aWNlKSk7CiAgICAgICAgIGZsb2F0IHJldEFpZGw7CiAgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgICAgICBhcHMtPmdldFN0cmVhbVZvbHVtZURCKHN0cmVhbUFpZGwsIGluZGV4QWlkbCwgZGV2aWNlQWlkbCwgJnJldEFpZGwpKSk7CkBAIC0xODYyLDEwICsxODYwLDEwIEBACiAKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIG1lZGlhOjpJbnQgbnVtU3Vycm91bmRGb3JtYXRzQWlkbDsKKyAgICBJbnQgbnVtU3Vycm91bmRGb3JtYXRzQWlkbDsKICAgICBudW1TdXJyb3VuZEZvcm1hdHNBaWRsLnZhbHVlID0KICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KCpudW1TdXJyb3VuZEZvcm1hdHMpKTsKLSAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+IHN1cnJvdW5kRm9ybWF0c0FpZGw7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4gc3Vycm91bmRGb3JtYXRzQWlkbDsKICAgICBzdGQ6OnZlY3Rvcjxib29sPiBzdXJyb3VuZEZvcm1hdHNFbmFibGVkQWlkbDsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgYXBzLT5nZXRTdXJyb3VuZEZvcm1hdHMoJm51bVN1cnJvdW5kRm9ybWF0c0FpZGwsICZzdXJyb3VuZEZvcm1hdHNBaWRsLApAQCAtMTg3NSw3ICsxODczLDcgQEAKICAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KG51bVN1cnJvdW5kRm9ybWF0c0FpZGwudmFsdWUpKTsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKAogICAgICAgICAgICAgY29udmVydFJhbmdlKHN1cnJvdW5kRm9ybWF0c0FpZGwuYmVnaW4oKSwgc3Vycm91bmRGb3JtYXRzQWlkbC5lbmQoKSwgc3Vycm91bmRGb3JtYXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdCkpOwogICAgIHN0ZDo6Y29weShzdXJyb3VuZEZvcm1hdHNFbmFibGVkQWlkbC5iZWdpbigpLCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkQWlkbC5lbmQoKSwKICAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQpOwogICAgIHJldHVybiBPSzsKQEAgLTE4ODksMTAgKzE4ODcsMTAgQEAKIAogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgbWVkaWE6OkludCBudW1TdXJyb3VuZEZvcm1hdHNBaWRsOworICAgIEludCBudW1TdXJyb3VuZEZvcm1hdHNBaWRsOwogICAgIG51bVN1cnJvdW5kRm9ybWF0c0FpZGwudmFsdWUgPQogICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oKm51bVN1cnJvdW5kRm9ybWF0cykpOwotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4gc3Vycm91bmRGb3JtYXRzQWlkbDsKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPiBzdXJyb3VuZEZvcm1hdHNBaWRsOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPmdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzKCZudW1TdXJyb3VuZEZvcm1hdHNBaWRsLCAmc3Vycm91bmRGb3JtYXRzQWlkbCkpKTsKIApAQCAtMTkwMCw3ICsxODk4LDcgQEAKICAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KG51bVN1cnJvdW5kRm9ybWF0c0FpZGwudmFsdWUpKTsKICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKAogICAgICAgICAgICAgY29udmVydFJhbmdlKHN1cnJvdW5kRm9ybWF0c0FpZGwuYmVnaW4oKSwgc3Vycm91bmRGb3JtYXRzQWlkbC5lbmQoKSwgc3Vycm91bmRGb3JtYXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdCkpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTkwOCwyNiArMTkwNiwyOCBAQAogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKLSAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgYXVkaW9Gb3JtYXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KGF1ZGlvRm9ybWF0KSk7CisgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBhdWRpb0Zvcm1hdEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihhdWRpb0Zvcm1hdCkpOwogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvRm9ybWF0QWlkbCwgZW5hYmxlZCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkgeworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEFzc2lzdGFudFNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgaW50MzJfdCB1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KHVpZCkpOwotICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnNldEFzc2lzdGFudFVpZCh1aWRBaWRsKSk7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gdWlkc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8aW50MzJfdD4+KHVpZHMsIGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QpKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5zZXRBc3Npc3RhbnRTZXJ2aWNlc1VpZHModWlkc0FpZGwpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkKHVpZF90IHVpZCkgeworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEFjdGl2ZUFzc2lzdGFudFNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIGFjdGl2ZVVpZHMpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgaW50MzJfdCB1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KHVpZCkpOwotICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnNldEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkKHVpZEFpZGwpKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBhY3RpdmVVaWRzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4oYWN0aXZlVWlkcywgbGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdCkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnNldEFjdGl2ZUFzc2lzdGFudFNlcnZpY2VzVWlkcyhhY3RpdmVVaWRzQWlkbCkpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpIHsKQEAgLTE5NjAsOCArMTk2MCwyMSBAQAogICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoZmFsc2UpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+KiBmb3JtYXRzKSB7Citib29sIEF1ZGlvU3lzdGVtOjppc1VsdHJhc291bmRTdXBwb3J0ZWQoKSB7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBmYWxzZTsKKworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxib29sPiB7CisgICAgICAgIGJvb2wgcmV0VmFsOworICAgICAgICBSRVRVUk5fSUZfRVJST1IoCisgICAgICAgICAgICAgICAgc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5pc1VsdHJhc291bmRTdXBwb3J0ZWQoJnJldFZhbCkpKTsKKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9KCk7CisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcihmYWxzZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiogZm9ybWF0cykgewogICAgIGlmIChmb3JtYXRzID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CkBAIC0xOTcwLDEyICsxOTgzLDE1IEBACiAgICAgICAgICAgICAmIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4gZm9ybWF0c0FpZGw7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4gZm9ybWF0c0FpZGw7CisgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9BdWRpb0RldmljZURlc2NyaXB0aW9uKGRldmljZSkpOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCi0gICAgICAgICAgICBhcHMtPmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoJmZvcm1hdHNBaWRsKSkpOworICAgICAgICAgICAgYXBzLT5nZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoZGV2aWNlQWlkbCwgJmZvcm1hdHNBaWRsKSkpOwogICAgICpmb3JtYXRzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+Pihmb3JtYXRzQWlkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdCkpOworICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4+KAorICAgICAgICAgICAgICAgICAgICBmb3JtYXRzQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdCkpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjExNCw5ICsyMTMwLDkgQEAKIAogICAgIGludDMyX3Qgc3RyYXRlZ3lBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9wcm9kdWN0X3N0cmF0ZWd5X3RfaW50MzJfdChzdHJhdGVneSkpOwogICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9kZXZpY2Vfcm9sZV90X0RldmljZVJvbGUocm9sZSkpOwotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4gZGV2aWNlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+PihkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+PihkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPnNldERldmljZXNSb2xlRm9yU3RyYXRlZ3koc3RyYXRlZ3lBaWRsLCByb2xlQWlkbCwgZGV2aWNlc0FpZGwpKTsKIH0KQEAgLTIxNDIsNyArMjE1OCw3IEBACiAgICAgfQogICAgIGludDMyX3Qgc3RyYXRlZ3lBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9wcm9kdWN0X3N0cmF0ZWd5X3RfaW50MzJfdChzdHJhdGVneSkpOwogICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9kZXZpY2Vfcm9sZV90X0RldmljZVJvbGUocm9sZSkpOwotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4gZGV2aWNlc0FpZGw7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPmdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3koc3RyYXRlZ3lBaWRsLCByb2xlQWlkbCwgJmRldmljZXNBaWRsKSkpOwogICAgIGRldmljZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKApAQCAtMjE1OSwxMiArMjE3NSwxMiBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKGF1ZGlvU291cmNlKSk7CisgICAgQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKGF1ZGlvU291cmNlKSk7CiAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2RldmljZV9yb2xlX3RfRGV2aWNlUm9sZShyb2xlKSk7Ci0gICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4+KGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4gZGV2aWNlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4+KGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOwogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlQWlkbCwgcm9sZUFpZGwsIGRldmljZXNBaWRsKSk7CiB9CkBAIC0yMTc2LDEyICsyMTkyLDEyIEBACiAgICAgaWYgKGFwcyA9PSAwKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9Ci0gICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKGF1ZGlvU291cmNlKSk7CisgICAgQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKGF1ZGlvU291cmNlKSk7CiAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2RldmljZV9yb2xlX3RfRGV2aWNlUm9sZShyb2xlKSk7Ci0gICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4+KGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4gZGV2aWNlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4+KGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOwogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+YWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlQWlkbCwgcm9sZUFpZGwsIGRldmljZXNBaWRsKSk7CiB9CkBAIC0yMTkyLDEyICsyMjA4LDEyIEBACiAgICAgaWYgKGFwcyA9PSAwKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9Ci0gICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKGF1ZGlvU291cmNlKSk7CisgICAgQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKGF1ZGlvU291cmNlKSk7CiAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2RldmljZV9yb2xlX3RfRGV2aWNlUm9sZShyb2xlKSk7Ci0gICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4+KGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4gZGV2aWNlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4+KGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOwogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+cmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlQWlkbCwgcm9sZUFpZGwsIGRldmljZXNBaWRsKSk7CiB9CkBAIC0yMjA4LDggKzIyMjQsOCBAQAogICAgIGlmIChhcHMgPT0gMCkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQotICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShhdWRpb1NvdXJjZSkpOworICAgIEF1ZGlvU291cmNlIGF1ZGlvU291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZShhdWRpb1NvdXJjZSkpOwogICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9kZXZpY2Vfcm9sZV90X0RldmljZVJvbGUocm9sZSkpOwogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgIGFwcy0+Y2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2VBaWRsLCByb2xlQWlkbCkpOwpAQCAtMjIyMiwxMCArMjIzOCwxMCBAQAogICAgIGlmIChhcHMgPT0gMCkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQotICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShhdWRpb1NvdXJjZSkpOworICAgIEF1ZGlvU291cmNlIGF1ZGlvU291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZShhdWRpb1NvdXJjZSkpOwogICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9kZXZpY2Vfcm9sZV90X0RldmljZVJvbGUocm9sZSkpOwotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4gZGV2aWNlc0FpZGw7CisgICAgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsOwogICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBhcHMtPmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZUFpZGwsIHJvbGVBaWRsLCAmZGV2aWNlc0FpZGwpKSk7CiAgICAgZGV2aWNlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCkBAIC0yMjM0LDYgKzIyNTAsOTQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRTcGF0aWFsaXplcihjb25zdCBzcDxtZWRpYTo6SU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPG1lZGlhOjpJU3BhdGlhbGl6ZXI+KiBzcGF0aWFsaXplcikgeworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKHNwYXRpYWxpemVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKGFwcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgbWVkaWE6OkdldFNwYXRpYWxpemVyUmVzcG9uc2UgcmVzcG9uc2U7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+Z2V0U3BhdGlhbGl6ZXIoY2FsbGJhY2ssICZyZXNwb25zZSkpKTsKKworICAgICpzcGF0aWFsaXplciA9IHJlc3BvbnNlLnNwYXRpYWxpemVyOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmNhbkJlU3BhdGlhbGl6ZWQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpjYW5CZVNwYXRpYWxpemVkKSB7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IGF0dHIgIT0gbnVsbHB0ciA/ICphdHRyIDogQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKyAgICBhdWRpb19jb25maWdfdCBjb25maWd1cmF0aW9uID0gY29uZmlnICE9IG51bGxwdHIgPyAqY29uZmlnIDogQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworCisgICAgc3RkOjpvcHRpb25hbDxtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWw+IGF0dHJBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbChhdHRyaWJ1dGVzKSk7CisgICAgc3RkOjpvcHRpb25hbDxBdWRpb0NvbmZpZz4gY29uZmlnQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25maWd1cmF0aW9uLCBmYWxzZSAvKmlzSW5wdXQqLykpOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+Y2FuQmVTcGF0aWFsaXplZChhdHRyQWlkbCwgY29uZmlnQWlkbCwgZGV2aWNlc0FpZGwsIGNhbkJlU3BhdGlhbGl6ZWQpKSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGlyZWN0X21vZGVfdCogZGlyZWN0TW9kZSkgeworICAgIGlmIChhdHRyID09IG51bGxwdHIgfHwgY29uZmlnID09IG51bGxwdHIgfHwgZGlyZWN0TW9kZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19hdHRyaWJ1dGVzX3RfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwoKmF0dHIpKTsKKyAgICBBdWRpb0NvbmZpZyBjb25maWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKCpjb25maWcsIGZhbHNlIC8qaXNJbnB1dCovKSk7CisKKyAgICBtZWRpYTo6QXVkaW9EaXJlY3RNb2RlIHJldEFpZGw7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KGF0dHJBaWRsLCBjb25maWdBaWRsLCAmcmV0QWlkbCkpKTsKKyAgICAqZGlyZWN0TW9kZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kaXJlY3RfbW9kZV90X21hc2soCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihyZXRBaWRsKSkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19wcm9maWxlPiogYXVkaW9Qcm9maWxlcykgeworICAgIGlmIChhdHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHJBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCgqYXR0cikpOworCisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZT4gYXVkaW9Qcm9maWxlc0FpZGw7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+Z2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKGF0dHJBaWRsLCAmYXVkaW9Qcm9maWxlc0FpZGwpKSk7CisgICAgKmF1ZGlvUHJvZmlsZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8YXVkaW9fcHJvZmlsZT4+KAorICAgICAgICAgICAgICAgICAgICBhdWRpb1Byb2ZpbGVzQWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlX2F1ZGlvX3Byb2ZpbGUsIGZhbHNlIC8qaXNJbnB1dCovKSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIGNsYXNzIENhcHR1cmVTdGF0ZUxpc3RlbmVySW1wbCA6IHB1YmxpYyBtZWRpYTo6Qm5DYXB0dXJlU3RhdGVMaXN0ZW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiBwdWJsaWM6CkBAIC0yMjk4LDYgKzI0MDIsMzEgQEAKICAgICByZXR1cm4gYWYtPnNldFZpYnJhdG9ySW5mb3ModmlicmF0b3JJbmZvcyk7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRNbWFwUG9saWN5SW5mbygKKyAgICAgICAgQXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLCBzdGQ6OnZlY3RvcjxBdWRpb01NYXBQb2xpY3lJbmZvPiAqcG9saWN5SW5mb3MpIHsKKyAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhZi0+Z2V0TW1hcFBvbGljeUluZm9zKHBvbGljeVR5cGUsIHBvbGljeUluZm9zKTsKK30KKworaW50MzJfdCBBdWRpb1N5c3RlbTo6Z2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCkgeworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGFmLT5nZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKTsKK30KKworaW50MzJfdCBBdWRpb1N5c3RlbTo6Z2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoKSB7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYWYtPmdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBpbnQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YWRkQXVkaW9Qb3J0Q2FsbGJhY2soCkBAIC0yNDA5LDEyICsyNTM4LDEyIEBACiBTdGF0dXMgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAogICAgICAgICBpbnQzMl90IGV2ZW50LAogICAgICAgICBjb25zdCBtZWRpYTo6UmVjb3JkQ2xpZW50SW5mbyYgY2xpZW50SW5mbywKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSYgY2xpZW50Q29uZmlnLAorICAgICAgICBjb25zdCBBdWRpb0NvbmZpZ0Jhc2UmIGNsaWVudENvbmZpZywKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkVmZmVjdERlc2NyaXB0b3I+JiBjbGllbnRFZmZlY3RzLAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Db25maWdCYXNlJiBkZXZpY2VDb25maWcsCisgICAgICAgIGNvbnN0IEF1ZGlvQ29uZmlnQmFzZSYgZGV2aWNlQ29uZmlnLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4mIGVmZmVjdHMsCiAgICAgICAgIGludDMyX3QgcGF0Y2hIYW5kbGUsCi0gICAgICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgc291cmNlKSB7CisgICAgICAgIEF1ZGlvU291cmNlIHNvdXJjZSkgewogICAgIHJlY29yZF9jb25maWdfY2FsbGJhY2sgY2IgPSBOVUxMOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKEF1ZGlvU3lzdGVtOjpnTG9jayk7CkBAIC0yNDI2LDEzICsyNTU1LDEzIEBACiAgICAgICAgIHJlY29yZF9jbGllbnRfaW5mb190IGNsaWVudEluZm9MZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9SZWNvcmRDbGllbnRJbmZvX3JlY29yZF9jbGllbnRfaW5mb190KGNsaWVudEluZm8pKTsKICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjbGllbnRDb25maWdMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChjbGllbnRDb25maWcpKTsKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChjbGllbnRDb25maWcsIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0c0xlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4+KAogICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RWZmZWN0cywKICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0VmZmVjdERlc2NyaXB0b3JfZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwogICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGRldmljZUNvbmZpZ0xlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGRldmljZUNvbmZpZykpOworICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGRldmljZUNvbmZpZywgdHJ1ZSAvKmlzSW5wdXQqLykpOwogICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90Pj4oCiAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RzLApAQCAtMjQ0MCw3ICsyNTY5LDcgQEAKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGVMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BhdGNoX2hhbmRsZV90KHBhdGNoSGFuZGxlKSk7CiAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChzb3VyY2UpKTsKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdChzb3VyY2UpKTsKICAgICAgICAgY2IoZXZlbnRMZWdhY3ksICZjbGllbnRJbmZvTGVnYWN5LCAmY2xpZW50Q29uZmlnTGVnYWN5LCBjbGllbnRFZmZlY3RzTGVnYWN5LAogICAgICAgICAgICAmZGV2aWNlQ29uZmlnTGVnYWN5LCBlZmZlY3RzTGVnYWN5LCBwYXRjaEhhbmRsZUxlZ2FjeSwgc291cmNlTGVnYWN5KTsKICAgICB9CkBAIC0yNDYwLDYgKzI1ODksMTkgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCitTdGF0dXMgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCkgeworICAgIHZvbF9yYW5nZV9pbml0X3JlcV9jYWxsYmFjayBjYiA9IE5VTEw7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKKyAgICAgICAgY2IgPSBnVm9sUmFuZ2VJbml0UmVxQ2FsbGJhY2s7CisgICAgfQorCisgICAgaWYgKGNiICE9IE5VTEwpIHsKKyAgICAgICAgY2IoKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKwogdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0yNDcwLDEwICsyNjEyLDcgQEAKICAgICAgICAgICAgIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tbaV0tPm9uU2VydmljZURpZWQoKTsKICAgICAgICAgfQogICAgIH0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0FQUyk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpnQXVkaW9Qb2xpY3lTZXJ2aWNlLmNsZWFyKCk7Ci0gICAgfQorICAgIEF1ZGlvU3lzdGVtOjpjbGVhckF1ZGlvUG9saWN5U2VydmljZSgpOwogCiAgICAgQUxPR1coIkF1ZGlvUG9saWN5U2VydmljZSBzZXJ2ZXIgZGllZCEiKTsKIH0KQEAgLTI0ODQsNyArMjYyMyw3IEBACiAgICAgbGVnYWN5LnJpaWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb191bmlxdWVfaWRfdChhaWRsLnJpaWQpKTsKICAgICBsZWdhY3kudWlkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoYWlkbC51aWQpKTsKICAgICBsZWdhY3kuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhaWRsLnNlc3Npb24pKTsKLSAgICBsZWdhY3kuc291cmNlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChhaWRsLnNvdXJjZSkpOworICAgIGxlZ2FjeS5zb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VfYXVkaW9fc291cmNlX3QoYWlkbC5zb3VyY2UpKTsKICAgICBsZWdhY3kucG9ydF9pZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoYWlkbC5wb3J0SWQpKTsKICAgICBsZWdhY3kuc2lsZW5jZWQgPSBhaWRsLnNpbGVuY2VkOwogICAgIHJldHVybiBsZWdhY3k7CkBAIC0yNDk2LDcgKzI2MzUsNyBAQAogICAgIGFpZGwucmlpZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb191bmlxdWVfaWRfdF9pbnQzMl90KGxlZ2FjeS5yaWlkKSk7CiAgICAgYWlkbC51aWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChsZWdhY3kudWlkKSk7CiAgICAgYWlkbC5zZXNzaW9uID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3Nlc3Npb25fdF9pbnQzMl90KGxlZ2FjeS5zZXNzaW9uKSk7Ci0gICAgYWlkbC5zb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKGxlZ2FjeS5zb3VyY2UpKTsKKyAgICBhaWRsLnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZShsZWdhY3kuc291cmNlKSk7CiAgICAgYWlkbC5wb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5wb3J0X2lkKSk7CiAgICAgYWlkbC5zaWxlbmNlZCA9IGxlZ2FjeS5zaWxlbmNlZDsKICAgICByZXR1cm4gYWlkbDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKaW5kZXggNWY4MDJkZS4uNmFiODMzOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKQEAgLTIxLDkgKzIxLDExIEBACiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8dGhyZWFkPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KQEAgLTQzLDYgKzQ1LDcgQEAKIHN0YXRpYyBjb25zdCBpbnQga01heExvb3BDb3VudE5vdGlmaWNhdGlvbnMgPSAzMjsKIAogdXNpbmcgOjphbmRyb2lkOjphaWRsX3V0aWxzOjpzdGF0dXNURnJvbUJpbmRlclN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE3MCw4ICsxNzMsOCBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIGZhbHNlOwogCiAgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGJvb2w+IHsKLSAgICAgICAgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSBjb25maWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKGNvbmZpZykpOworICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db25maWdCYXNlIGNvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoY29uZmlnLCBmYWxzZSAvKmlzSW5wdXQqLykpOwogICAgICAgICBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0cmlidXRlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKGF0dHJpYnV0ZXMpKTsKICAgICAgICAgYm9vbCByZXRBaWRsOwpAQCAtMTk2LDYgKzE5OSw3IEBACiAKICNkZWZpbmUgTU1fUFJFRklYICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suIiAvLyBhdm9pZCBjdXQtbi1wYXN0ZSBlcnJvcnMuCiAKKyAgICAvLyBEbyBub3QgY2hhbmdlIHRoaXMgd2l0aG91dCBjaGFuZ2luZyB0aGUgTWVkaWFNZXRyaWNzU2VydmljZSBzaWRlLgogICAgIC8vIEphdmEgQVBJIDI4IGVudHJpZXMsIGRvIG5vdCBjaGFuZ2UuCiAgICAgbU1ldHJpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAic3RyZWFtdHlwZSIsIHRvU3RyaW5nKHRyYWNrLT5zdHJlYW1UeXBlKCkpLmNfc3RyKCkpOwogICAgIG1NZXRyaWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggInR5cGUiLApAQCAtMjExLDYgKzIxNSw3IEBACiAgICAgbU1ldHJpY3NJdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggImZyYW1lQ291bnQiLCAoaW50MzJfdCl0cmFjay0+bUZyYW1lQ291bnQpOwogICAgIG1NZXRyaWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggImF0dHJpYnV0ZXMiLCB0b1N0cmluZyh0cmFjay0+bUF0dHJpYnV0ZXMpLmNfc3RyKCkpOwogICAgIG1NZXRyaWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggImxvZ1Nlc3Npb25JZCIsIHRyYWNrLT5tTG9nU2Vzc2lvbklkLmNfc3RyKCkpOworICAgIG1NZXRyaWNzSXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJ1bmRlcnJ1bkZyYW1lcyIsIChpbnQzMl90KXRyYWNrLT5nZXRVbmRlcnJ1bkZyYW1lcygpKTsKIH0KIAogLy8gaGFuZCB0aGUgdXNlciBhIHNuYXBzaG90IG9mIHRoZSBtZXRyaWNzLgpAQCAtMjUzLDggKzI1OCw3IEBACiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNhbGxiYWNrX3QgY2JmLAotICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICBjb25zdCB3cDxJQXVkaW9UcmFja0NhbGxiYWNrPiAmIGNhbGxiYWNrLAogICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCkBAIC0yNzMsMTAgKzI3Nyw5MSBAQAogewogICAgIG1BdHRyaWJ1dGVzID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKIAotICAgICh2b2lkKXNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLAotICAgICAgICAgICAgMCAvKnNoYXJlZEJ1ZmZlciovLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBvZmZsb2FkSW5mbywKLSAgICAgICAgICAgIGF0dHJpYnV0aW9uU291cmNlLCBwQXR0cmlidXRlcywgZG9Ob3RSZWNvbm5lY3QsIG1heFJlcXVpcmVkU3BlZWQsIHNlbGVjdGVkRGV2aWNlSWQpOworICAgIC8vIG1ha2VfdW5pcXVlIGRvZXMgbm90IGFnZ3JlZ2F0ZSBpbml0IHVudGlsIGMrKzIwCisgICAgbVNldFBhcmFtcyA9IHN0ZDo6dW5pcXVlX3B0cjxTZXRQYXJhbXM+eworICAgICAgICAgICAgbmV3IFNldFBhcmFtc3tzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBmbGFncywgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgMCAvKnNoYXJlZEJ1ZmZlciovLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBvZmZsb2FkSW5mbywgYXR0cmlidXRpb25Tb3VyY2UsIHBBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwgbWF4UmVxdWlyZWRTcGVlZCwgc2VsZWN0ZWREZXZpY2VJZH19OworfQorCituYW1lc3BhY2UgeworICAgIGNsYXNzIExlZ2FjeUNhbGxiYWNrV3JhcHBlciA6IHB1YmxpYyBBdWRpb1RyYWNrOjpJQXVkaW9UcmFja0NhbGxiYWNrIHsKKyAgICAgIGNvbnN0IEF1ZGlvVHJhY2s6OmxlZ2FjeV9jYWxsYmFja190IG1DYWxsYmFjazsKKyAgICAgIHZvaWQgKiBjb25zdCBtRGF0YTsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgTGVnYWN5Q2FsbGJhY2tXcmFwcGVyKEF1ZGlvVHJhY2s6OmxlZ2FjeV9jYWxsYmFja190IGNhbGxiYWNrLCB2b2lkKiB1c2VyKQorICAgICAgICAgICAgOiBtQ2FsbGJhY2soY2FsbGJhY2spLCBtRGF0YSh1c2VyKSB7fQorICAgICAgICBzaXplX3Qgb25Nb3JlRGF0YShjb25zdCBBdWRpb1RyYWNrOjpCdWZmZXIgJiBidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgICBBdWRpb1RyYWNrOjpCdWZmZXIgY29weSA9IGJ1ZmZlcjsKKyAgICAgICAgICBtQ2FsbGJhY2soQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBLCBtRGF0YSwgc3RhdGljX2Nhc3Q8dm9pZCo+KCZjb3B5KSk7CisgICAgICAgICAgcmV0dXJuIGNvcHkuc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHZvaWQgb25VbmRlcnJ1bigpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIG1DYWxsYmFjayhBdWRpb1RyYWNrOjpFVkVOVF9VTkRFUlJVTiwgbURhdGEsIG51bGxwdHIpOworICAgICAgICB9CisgICAgICAgIHZvaWQgb25Mb29wRW5kKGludDMyX3QgbG9vcHNSZW1haW5pbmcpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIG1DYWxsYmFjayhBdWRpb1RyYWNrOjpFVkVOVF9MT09QX0VORCwgbURhdGEsICZsb29wc1JlbWFpbmluZyk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBvbk1hcmtlcih1aW50MzJfdCBtYXJrZXJQb3NpdGlvbikgb3ZlcnJpZGUgeworICAgICAgICAgICAgbUNhbGxiYWNrKEF1ZGlvVHJhY2s6OkVWRU5UX01BUktFUiwgbURhdGEsICZtYXJrZXJQb3NpdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBvbk5ld1Bvcyh1aW50MzJfdCBuZXdQb3MpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIG1DYWxsYmFjayhBdWRpb1RyYWNrOjpFVkVOVF9ORVdfUE9TLCBtRGF0YSwgJm5ld1Bvcyk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBvbkJ1ZmZlckVuZCgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIG1DYWxsYmFjayhBdWRpb1RyYWNrOjpFVkVOVF9CVUZGRVJfRU5ELCBtRGF0YSwgbnVsbHB0cik7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBvbk5ld0lBdWRpb1RyYWNrKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgbUNhbGxiYWNrKEF1ZGlvVHJhY2s6OkVWRU5UX05FV19JQVVESU9UUkFDSywgbURhdGEsIG51bGxwdHIpOworICAgICAgICB9CisgICAgICAgIHZvaWQgb25TdHJlYW1FbmQoKSBvdmVycmlkZSB7CisgICAgICAgICAgICBtQ2FsbGJhY2soQXVkaW9UcmFjazo6RVZFTlRfU1RSRUFNX0VORCwgbURhdGEsIG51bGxwdHIpOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBvbkNhbldyaXRlTW9yZURhdGEoY29uc3QgQXVkaW9UcmFjazo6QnVmZmVyICYgYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgICAgQXVkaW9UcmFjazo6QnVmZmVyIGNvcHkgPSBidWZmZXI7CisgICAgICAgICAgbUNhbGxiYWNrKEF1ZGlvVHJhY2s6OkVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEsIG1EYXRhLCBzdGF0aWNfY2FzdDx2b2lkKj4oJmNvcHkpKTsKKyAgICAgICAgICByZXR1cm4gY29weS5zaXplKCk7CisgICAgICAgIH0KKyAgICB9OworfQorCitBdWRpb1RyYWNrOjpBdWRpb1RyYWNrKAorICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgbGVnYWN5X2NhbGxiYWNrX3QgY2FsbGJhY2ssCisgICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKKyAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvLAorICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKKyAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCwKKyAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCwKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkKQorICAgIDogbVN0YXR1cyhOT19JTklUKSwKKyAgICAgIG1TdGF0ZShTVEFURV9TVE9QUEVEKSwKKyAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKKyAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKKyAgICAgIG1QYXVzZWRQb3NpdGlvbigwKSwKKyAgICAgIG1BdWRpb1RyYWNrQ2FsbGJhY2sobmV3IEF1ZGlvVHJhY2tDYWxsYmFjaygpKQoreworICAgIG1BdHRyaWJ1dGVzID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKyAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtTGVnYWN5Q2FsbGJhY2tXcmFwcGVyID0gc3A8TGVnYWN5Q2FsbGJhY2tXcmFwcGVyPjo6bWFrZShjYWxsYmFjaywgdXNlcik7CisgICAgfSBlbHNlIGlmICh1c2VyKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkNhbGxiYWNrIGRhdGEgcHJvdmlkZWQgd2l0aG91dCBjYWxsYmFjayBwb2ludGVyISIpOworICAgIH0KKyAgICBtU2V0UGFyYW1zID0gc3RkOjp1bmlxdWVfcHRyPFNldFBhcmFtcz57bmV3IFNldFBhcmFtc3sKKyAgICAgICAgICAgIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGZsYWdzLCBtTGVnYWN5Q2FsbGJhY2tXcmFwcGVyLAorICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCAwIC8qc2hhcmVkQnVmZmVyKi8sIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLAorICAgICAgICAgICAgdHJhbnNmZXJUeXBlLCBvZmZsb2FkSW5mbywgYXR0cmlidXRpb25Tb3VyY2UsIHBBdHRyaWJ1dGVzLCBkb05vdFJlY29ubmVjdCwKKyAgICAgICAgICAgIG1heFJlcXVpcmVkU3BlZWQsIHNlbGVjdGVkRGV2aWNlSWR9fTsKIH0KIAogQXVkaW9UcmFjazo6QXVkaW9UcmFjaygKQEAgLTI4Niw4ICszNzEsNyBAQAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNhbGxiYWNrX3QgY2JmLAotICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICBjb25zdCB3cDxJQXVkaW9UcmFja0NhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKQEAgLTMwNiwxMCArMzkwLDU2IEBACiB7CiAgICAgbUF0dHJpYnV0ZXMgPSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOwogCi0gICAgKHZvaWQpc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAwIC8qZnJhbWVDb3VudCovLCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICBzaGFyZWRCdWZmZXIsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLAotICAgICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UsIHBBdHRyaWJ1dGVzLCBkb05vdFJlY29ubmVjdCwgbWF4UmVxdWlyZWRTcGVlZCk7CisgICAgbVNldFBhcmFtcyA9IHN0ZDo6dW5pcXVlX3B0cjxTZXRQYXJhbXM+eworICAgICAgICAgICAgbmV3IFNldFBhcmFtc3tzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCAwIC8qZnJhbWVDb3VudCovLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssIG5vdGlmaWNhdGlvbkZyYW1lcywgc2hhcmVkQnVmZmVyLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBvZmZsb2FkSW5mbywgYXR0cmlidXRpb25Tb3VyY2UsIHBBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwgbWF4UmVxdWlyZWRTcGVlZCwgQVVESU9fUE9SVF9IQU5ETEVfTk9ORX19OworfQorCitBdWRpb1RyYWNrOjpBdWRpb1RyYWNrKAorICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYWxsYmFjaywKKyAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAorICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCisgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAorICAgICAgICBib29sIGRvTm90UmVjb25uZWN0LAorICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkKQorICAgIDogbVN0YXR1cyhOT19JTklUKSwKKyAgICAgIG1TdGF0ZShTVEFURV9TVE9QUEVEKSwKKyAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKKyAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKKyAgICAgIG1QYXVzZWRQb3NpdGlvbigwKSwKKyAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAorICAgICAgbUF1ZGlvVHJhY2tDYWxsYmFjayhuZXcgQXVkaW9UcmFja0NhbGxiYWNrKCkpCit7CisgICAgbUF0dHJpYnV0ZXMgPSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICBtTGVnYWN5Q2FsbGJhY2tXcmFwcGVyID0gc3A8TGVnYWN5Q2FsbGJhY2tXcmFwcGVyPjo6bWFrZShjYWxsYmFjaywgdXNlcik7CisgICAgfSBlbHNlIGlmICh1c2VyKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkNhbGxiYWNrIGRhdGEgcHJvdmlkZWQgd2l0aG91dCBjYWxsYmFjayBwb2ludGVyISIpOworICAgIH0KKyAgICBtU2V0UGFyYW1zID0gc3RkOjp1bmlxdWVfcHRyPFNldFBhcmFtcz57bmV3IFNldFBhcmFtc3sKKyAgICAgICAgICAgIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIDAgLypmcmFtZUNvdW50Ki8sIGZsYWdzLAorICAgICAgICAgICAgbUxlZ2FjeUNhbGxiYWNrV3JhcHBlciwgbm90aWZpY2F0aW9uRnJhbWVzLCBzaGFyZWRCdWZmZXIsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywKKyAgICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBvZmZsb2FkSW5mbywgYXR0cmlidXRpb25Tb3VyY2UsIHBBdHRyaWJ1dGVzLCBkb05vdFJlY29ubmVjdCwKKyAgICAgICAgICAgIG1heFJlcXVpcmVkU3BlZWQsIEFVRElPX1BPUlRfSEFORExFX05PTkV9fTsKK30KKwordm9pZCBBdWRpb1RyYWNrOjpvbkZpcnN0UmVmKCkgeworICAgIGlmIChtU2V0UGFyYW1zKSB7CisgICAgICAgIHNldCgqbVNldFBhcmFtcyk7CisgICAgICAgIG1TZXRQYXJhbXMucmVzZXQoKTsKKyAgICB9CiB9CiAKIEF1ZGlvVHJhY2s6On5BdWRpb1RyYWNrKCkKQEAgLTM1MiwxMiArNDgyLDEzIEBACiAgICAgLy8gT3RoZXJ3aXNlIHRoZSBjYWxsYmFjayB0aHJlYWQgd2lsbCBuZXZlciBleGl0LgogICAgIHN0b3AoKTsKICAgICBpZiAobUF1ZGlvVHJhY2tUaHJlYWQgIT0gMCkgeyAvLyBub3QgdGhyZWFkIHNhZmUKLSAgICAgICAgbVByb3h5LT5pbnRlcnJ1cHQoKTsKICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQtPnJlcXVlc3RFeGl0KCk7ICAgLy8gc2VlIGNvbW1lbnQgaW4gQXVkaW9UcmFjay5oCisgICAgICAgIG1Qcm94eS0+aW50ZXJydXB0KCk7CiAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQuY2xlYXIoKTsKICAgICB9Ci0gICAgLy8gTm8gbG9jayBoZXJlOiB3b3JzdCBjYXNlIHdlIHJlbW92ZSBhIE5VTEwgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBhIG5vcAorCisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIC8vIFRoaXMgbWF5IG5vdCBzdG9wIGFsbCBvZiB0aGVzZSBkZXZpY2UgY2FsbGJhY2tzIQogICAgICAgICAvLyBUT0RPOiBBZGQgc29tZSBzb3J0IG9mIHByb3RlY3Rpb24uCkBAIC0zNzMsOCArNTA0LDggQEAKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY2FsbGJhY2tfdCBjYmYsCi0gICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgIGxlZ2FjeV9jYWxsYmFja190IGNhbGxiYWNrLAorICAgICAgICB2b2lkICogdXNlciwKICAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEsCkBAIC0zODcsMTMgKzUxOCw0NSBAQAogICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkLAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQpCiB7CisgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgIG1MZWdhY3lDYWxsYmFja1dyYXBwZXIgPSBzcDxMZWdhY3lDYWxsYmFja1dyYXBwZXI+OjptYWtlKGNhbGxiYWNrLCB1c2VyKTsKKyAgICB9IGVsc2UgaWYgKHVzZXIpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiQ2FsbGJhY2sgZGF0YSBwcm92aWRlZCB3aXRob3V0IGNhbGxiYWNrIHBvaW50ZXIhIik7CisgICAgfQorICAgIHJldHVybiBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSxmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBmbGFncywKKyAgICAgICAgICAgICAgIG1MZWdhY3lDYWxsYmFja1dyYXBwZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywgc2hhcmVkQnVmZmVyLCB0aHJlYWRDYW5DYWxsSmF2YSwKKyAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBvZmZsb2FkSW5mbywgYXR0cmlidXRpb25Tb3VyY2UsIHBBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsIG1heFJlcXVpcmVkU3BlZWQsIHNlbGVjdGVkRGV2aWNlSWQpOworfQorc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0KAorICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3Qgd3A8SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSwKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCisgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCisgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKK3sKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Jbml0aWFsaXplZCwgIiVzOiBzaG91bGQgbm90IGJlIGNhbGxlZCB0d2ljZSIsIF9fZnVuY19fKTsKKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgIHN0YXR1c190IHN0YXR1czsKICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQ7CiAgICAgcGlkX3QgY2FsbGluZ1BpZDsKICAgICBwaWRfdCBteVBpZDsKICAgICB1aWRfdCB1aWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KGF0dHJpYnV0aW9uU291cmNlLnVpZCkpOwogICAgIHBpZF90IHBpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QoYXR0cmlidXRpb25Tb3VyY2UucGlkKSk7Ci0KKyAgICBzdGQ6OnN0cmluZyBlcnJvck1lc3NhZ2U7CiAgICAgLy8gTm90ZSBtUG9ydElkIGlzIG5vdCB2YWxpZCB1bnRpbCB0aGUgdHJhY2sgaXMgY3JlYXRlZCwgc28gb21pdCBtUG9ydElkIGluIEFMT0cgZm9yIHNldC4KICAgICBBTE9HVigiJXMoKTogc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgogICAgICAgICAgICJmbGFncyAjJXgsIG5vdGlmaWNhdGlvbkZyYW1lcyAlZCwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQsIHVpZCAlZCwgcGlkICVkIiwKQEAgLTQwMiw4NiArNTY1LDI0IEBACiAgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGF0dHJpYnV0aW9uU291cmNlLnVpZCwgYXR0cmlidXRpb25Tb3VyY2UucGlkKTsKIAogICAgIG1UaHJlYWRDYW5DYWxsSmF2YSA9IHRocmVhZENhbkNhbGxKYXZhOworCisgICAgLy8gVGhlc2UgdmFyaWFibGVzIGFyZSBwdWxsZWQgaW4gYW4gZXJyb3IgcmVwb3J0LCBzbyB3ZSBpbml0aWFsaXplIHRoZW0gZWFybHkuCiAgICAgbVNlbGVjdGVkRGV2aWNlSWQgPSBzZWxlY3RlZERldmljZUlkOwogICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CisgICAgbVJlcUZyYW1lQ291bnQgPSBtRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIG1PcmlnaW5hbFNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIG1BdHRyaWJ1dGVzID0gcEF0dHJpYnV0ZXMgIT0gbnVsbHB0ciA/ICpwQXR0cmlidXRlcyA6IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisgICAgbVBsYXliYWNrUmF0ZSA9IEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVDsKIAotICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgY2FzZSBUUkFOU0ZFUl9ERUZBVUxUOgotICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKLSAgICAgICAgICAgIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX1NIQVJFRDsKLSAgICAgICAgfSBlbHNlIGlmIChjYmYgPT0gTlVMTCB8fCB0aHJlYWRDYW5DYWxsSmF2YSkgewotICAgICAgICAgICAgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfU1lOQzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0NBTExCQUNLOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVFJBTlNGRVJfQ0FMTEJBQ0s6Ci0gICAgY2FzZSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLOgotICAgICAgICBpZiAoY2JmID09IE5VTEwgfHwgc2hhcmVkQnVmZmVyICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlICVzIGJ1dCBjYmYgPT0gTlVMTCB8fCBzaGFyZWRCdWZmZXIgIT0gMCIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dCh0cmFuc2ZlclR5cGUpLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUUkFOU0ZFUl9PQlRBSU46Ci0gICAgY2FzZSBUUkFOU0ZFUl9TWU5DOgotICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX09CVEFJTiBidXQgc2hhcmVkQnVmZmVyICE9IDAiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUUkFOU0ZFUl9TSEFSRUQ6Ci0gICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfU0hBUkVEIGJ1dCBzaGFyZWRCdWZmZXIgPT0gMCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdHJhbnNmZXJUeXBlKTsKLSAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgfQotICAgIG1TaGFyZWRCdWZmZXIgPSBzaGFyZWRCdWZmZXI7Ci0gICAgbVRyYW5zZmVyID0gdHJhbnNmZXJUeXBlOwotICAgIG1Eb05vdFJlY29ubmVjdCA9IGRvTm90UmVjb25uZWN0OwotCi0gICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICIlcygpOiBzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlenUiLAotICAgICAgICAgICAgX19mdW5jX18sIHNoYXJlZEJ1ZmZlci0+dW5zZWN1cmVQb2ludGVyKCksIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIEFMT0dWKCIlcygpOiBzdHJlYW1UeXBlICVkIGZyYW1lQ291bnQgJXp1IGZsYWdzICUwNHgiLAotICAgICAgICAgICAgX19mdW5jX18sIHN0cmVhbVR5cGUsIGZyYW1lQ291bnQsIGZsYWdzKTsKLQotICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1RyYWNrICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5Ci0gICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKLSAgICAgICAgQUxPR0UoIiVzKCk6IFRyYWNrIGFscmVhZHkgaW4gdXNlIiwgX19mdW5jX18pOwotICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgZ290byBleGl0OwotICAgIH0KLQotICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlcyBmaXJzdC4KLSAgICBpZiAoc3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgewotICAgICAgICBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIH0KLSAgICBpZiAocEF0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICBpZiAodWludDMyX3Qoc3RyZWFtVHlwZSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIHN0cmVhbSB0eXBlICVkIiwgX19mdW5jX18sIHN0cmVhbVR5cGUpOwotICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICB9Ci0gICAgICAgIG1PcmlnaW5hbFN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotCi0gICAgfSBlbHNlIHsKKyAgICAvLyB1cGRhdGUgZm9ybWF0IGFuZCBmbGFncyBiZWZvcmUgc3RvcmluZyB0aGVtIGluIG1Gb3JtYXQsIG1PcmlnRmxhZ3MgYW5kIG1GbGFncworICAgIGlmIChwQXR0cmlidXRlcyAhPSBOVUxMKSB7CiAgICAgICAgIC8vIHN0cmVhbSB0eXBlIHNob3VsZG4ndCBiZSBsb29rZWQgYXQsIHRoaXMgdHJhY2sgaGFzIGF1ZGlvIGF0dHJpYnV0ZXMKLSAgICAgICAgbWVtY3B5KCZtQXR0cmlidXRlcywgcEF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICAgICAgQUxPR1YoIiVzKCk6IEJ1aWxkaW5nIEF1ZGlvVHJhY2sgd2l0aCBhdHRyaWJ1dGVzOiIKICAgICAgICAgICAgICAgICAiIHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcy51c2FnZSwgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7Ci0gICAgICAgIG1PcmlnaW5hbFN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKICAgICAgICAgYXVkaW9fZmxhZ3NfdG9fYXVkaW9fb3V0cHV0X2ZsYWdzKG1BdHRyaWJ1dGVzLmZsYWdzLCAmZmxhZ3MpOwogICAgIH0KIApAQCAtNDkyLDIzICs1OTMsNiBAQAogICAgICAgICBmbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX291dHB1dF9mbGFnc190PihmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0lFQzk1OF9OT05BVURJTyk7CiAgICAgfQogCi0gICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycwotICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgZm9ybWF0ICUjeCIsIF9fZnVuY19fLCBmb3JtYXQpOwotICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9Ci0gICAgbUZvcm1hdCA9IGZvcm1hdDsKLQotICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCAgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgfQotICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwotICAgIGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7Ci0gICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKLQogICAgIC8vIGZvcmNlIGRpcmVjdCBmbGFnIGlmIGZvcm1hdCBpcyBub3QgbGluZWFyIFBDTQogICAgIC8vIG9yIG9mZmxvYWQgd2FzIHJlcXVlc3RlZAogICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKQpAQCAtNTI3LDcgKzYxMSw5NiBAQAogICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwogICAgIH0KIAotICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgbU9yaWdGbGFncyA9IG1GbGFncyA9IGZsYWdzOworCisgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKKyAgICBjYXNlIFRSQU5TRkVSX0RFRkFVTFQ6CisgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgeworICAgICAgICAgICAgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfU0hBUkVEOworICAgICAgICB9IGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGxwdHJ8fCB0aHJlYWRDYW5DYWxsSmF2YSkgeworICAgICAgICAgICAgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfU1lOQzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0NBTExCQUNLOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFJBTlNGRVJfQ0FMTEJBQ0s6CisgICAgY2FzZSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLOgorICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0ciB8fCBzaGFyZWRCdWZmZXIgIT0gMCkgeworICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAiJXM6IFRyYW5zZmVyIHR5cGUgJXMgYnV0IGNhbGxiYWNrID09IG51bGxwdHIgfHwgc2hhcmVkQnVmZmVyICE9IDAiLAorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VHJhbnNmZXJUb1RleHQodHJhbnNmZXJUeXBlKSwgX19mdW5jX18pOworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQU5TRkVSX09CVEFJTjoKKyAgICBjYXNlIFRSQU5TRkVSX1NZTkM6CisgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgeworICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAiJXM6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfT0JUQUlOIGJ1dCBzaGFyZWRCdWZmZXIgIT0gMCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFOU0ZFUl9TSEFSRUQ6CisgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgeworICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAiJXM6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfU0hBUkVEIGJ1dCBzaGFyZWRCdWZmZXIgPT0gMCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKCIlczogSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgX19mdW5jX18sIHRyYW5zZmVyVHlwZSk7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgbVNoYXJlZEJ1ZmZlciA9IHNoYXJlZEJ1ZmZlcjsKKyAgICBtVHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7CisgICAgbURvTm90UmVjb25uZWN0ID0gZG9Ob3RSZWNvbm5lY3Q7CisKKyAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgIiVzKCk6IHNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgc2hhcmVkQnVmZmVyLT51bnNlY3VyZVBvaW50ZXIoKSwgc2hhcmVkQnVmZmVyLT5zaXplKCkpOworCisgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvVHJhY2sgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKKyAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgeworICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoIiVzOiBUcmFjayBhbHJlYWR5IGluIHVzZSIsIF9fZnVuY19fKTsKKyAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLy8gaGFuZGxlIGRlZmF1bHQgdmFsdWVzIGZpcnN0LgorICAgIGlmIChzdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7CisgICAgICAgIHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgfQorICAgIGlmIChwQXR0cmlidXRlcyA9PSBOVUxMKSB7CisgICAgICAgIGlmICh1aW50MzJfdChzdHJlYW1UeXBlKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgeworICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKCIlczogSW52YWxpZCBzdHJlYW0gdHlwZSAlZCIsIF9fZnVuY19fLCBzdHJlYW1UeXBlKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgbU9yaWdpbmFsU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU9yaWdpbmFsU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgIH0KKworICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKKyAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7CisgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigiJXM6IEludmFsaWQgZm9ybWF0ICUjeCIsIF9fZnVuY19fLCBmb3JtYXQpOworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKKyAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKCIlczogSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgIF9fZnVuY19fLCBjaGFubmVsTWFzayk7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICBtQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OworCisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgewogICAgICAgICBpZiAoYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMoZm9ybWF0KSkgewogICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTU0MSwxMyArNzE0LDEyIEBACiAgICAgfQogCiAgICAgLy8gc2FtcGxpbmcgcmF0ZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgZGlyZWN0IG91dHB1dHMKLSAgICBpZiAoc2FtcGxlUmF0ZSA9PSAwICYmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgeworICAgIGlmIChzYW1wbGVSYXRlID09IDAgJiYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgeworICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgIiVzOiBzYW1wbGUgcmF0ZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgZGlyZWN0IG91dHB1dHMiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgZ290byBleGl0OworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KLSAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgbU9yaWdpbmFsU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgbVBsYXliYWNrUmF0ZSA9IEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVDsKICAgICAvLyAxLjAgPD0gbU1heFJlcXVpcmVkU3BlZWQgPD0gQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYCiAgICAgbU1heFJlcXVpcmVkU3BlZWQgPSBtaW4obWF4KG1heFJlcXVpcmVkU3BlZWQsIDEuMGYpLCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgpOwogCkBAIC01NTYsMzMgKzcyOCwzNSBAQAogICAgIC8vICAoYikgd2UgY2FuIHN1cHBvcnQgcmUtY3JlYXRpb24gb2Ygb2ZmbG9hZGVkIHRyYWNrcwogICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7CiAgICAgICAgIG1PZmZsb2FkSW5mb0NvcHkgPSAqb2ZmbG9hZEluZm87Ci0gICAgICAgIG1PZmZsb2FkSW5mbyA9ICZtT2ZmbG9hZEluZm9Db3B5OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1PZmZsb2FkSW5mbyA9IE5VTEw7CiAgICAgICAgIG1lbXNldCgmbU9mZmxvYWRJbmZvQ29weSwgMCwgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KSk7CiAgICAgICAgIG1PZmZsb2FkSW5mb0NvcHkgPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICAgICBtT2ZmbG9hZEluZm9Db3B5LmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgbU9mZmxvYWRJbmZvQ29weS5zYW1wbGVfcmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgICAgIG1PZmZsb2FkSW5mb0NvcHkuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgICAgIG1PZmZsb2FkSW5mb0NvcHkuc3RyZWFtX3R5cGUgPSBzdHJlYW1UeXBlOwogICAgIH0KIAogICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9MRUZUXSA9IDEuMGY7CiAgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSA9IDEuMGY7CiAgICAgbVNlbmRMZXZlbCA9IDAuMGY7CiAgICAgLy8gbUZyYW1lQ291bnQgaXMgaW5pdGlhbGl6ZWQgaW4gY3JlYXRlVHJhY2tfbAotICAgIG1SZXFGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKICAgICBpZiAobm90aWZpY2F0aW9uRnJhbWVzID49IDApIHsKICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSA9IG5vdGlmaWNhdGlvbkZyYW1lczsKICAgICAgICAgbU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEgPSAwOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcygpOiBub3RpZmljYXRpb25GcmFtZXM9JWQgbm90IHBlcm1pdHRlZCBmb3Igbm9uLWZhc3QgdHJhY2siLAorICAgICAgICBpZiAoIShtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSkgeworICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAiJXM6IG5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIGZvciBub24tZmFzdCB0cmFjayIsCiAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBub3RpZmljYXRpb25GcmFtZXMpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgICAgICBpZiAoZnJhbWVDb3VudCA+IDApIHsKICAgICAgICAgICAgIEFMT0dFKCIlcygpOiBub3RpZmljYXRpb25GcmFtZXM9JWQgbm90IHBlcm1pdHRlZCB3aXRoIG5vbi16ZXJvIGZyYW1lQ291bnQ9JXp1IiwKICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG5vdGlmaWNhdGlvbkZyYW1lcywgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPSAwOwogICAgICAgICBjb25zdCB1aW50MzJfdCBtaW5Ob3RpZmljYXRpb25zUGVyQnVmZmVyID0gMTsKQEAgLTYwNywxMSArNzgxLDEwIEBACiAgICAgICAgIG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZS5waWQgPSBWQUxVRV9PUl9GQVRBTChsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KGNhbGxpbmdQaWQpKTsKICAgICB9CiAgICAgbUF1eEVmZmVjdElkID0gMDsKLSAgICBtT3JpZ0ZsYWdzID0gbUZsYWdzID0gZmxhZ3M7Ci0gICAgbUNiZiA9IGNiZjsKKyAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKIAotICAgIGlmIChjYmYgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9UcmFja1RocmVhZCA9IG5ldyBBdWRpb1RyYWNrVGhyZWFkKCp0aGlzKTsKKyAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtQXVkaW9UcmFja1RocmVhZCA9IHNwPEF1ZGlvVHJhY2tUaHJlYWQ+OjptYWtlKCp0aGlzKTsKICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQtPnJ1bigiQXVkaW9UcmFjayIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8sIDAgLypzdGFjayovKTsKICAgICAgICAgLy8gdGhyZWFkIGJlZ2lucyBpbiBwYXVzZWQgc3RhdGUsIGFuZCB3aWxsIG5vdCByZWZlcmVuY2UgdXMgdW50aWwgc3RhcnQoKQogICAgIH0KQEAgLTYyNywxMCArODAwLDEwIEBACiAgICAgICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgICAgICBtQXVkaW9UcmFja1RocmVhZC5jbGVhcigpOwogICAgICAgICB9CisgICAgICAgIC8vIFdlIGRvIG5vdCBnb3RvIGVycm9yIHRvIHByZXZlbnQgZG91YmxlLWxvZ2dpbmcgZXJyb3JzLgogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogCi0gICAgbVVzZXJEYXRhID0gdXNlcjsKICAgICBtTG9vcENvdW50ID0gMDsKICAgICBtTG9vcFN0YXJ0ID0gMDsKICAgICBtTG9vcEVuZCA9IDA7CkBAIC02NjEsNiArODM0LDEyIEBACiAgICAgbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUgPSAtMTsgLy8gLTEgaXMgYSB1bmlxdWUgaW5pdGlhbGl6ZXIuCiAgICAgbVZvbHVtZUhhbmRsZXIgPSBuZXcgbWVkaWE6OlZvbHVtZUhhbmRsZXIoKTsKIAorZXJyb3I6CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRV9JRighZXJyb3JNZXNzYWdlLmVtcHR5KCksICIlcyIsIGVycm9yTWVzc2FnZS5jX3N0cigpKTsKKyAgICAgICAgcmVwb3J0RXJyb3Ioc3RhdHVzLCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfQ1JFQVRFLCBlcnJvck1lc3NhZ2UuY19zdHIoKSk7CisgICAgfQorICAgIC8vIGZhbGwgdGhyb3VnaAogZXhpdDoKICAgICBtU3RhdHVzID0gc3RhdHVzOwogICAgIHJldHVybiBzdGF0dXM7CkBAIC02NzQsNyArODUzLDcgQEAKICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY2FsbGJhY2tfdCBjYmYsCisgICAgICAgIGxlZ2FjeV9jYWxsYmFja190IGNhbGxiYWNrLAogICAgICAgICB2b2lkKiB1c2VyLAogICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTY5MywxMSArODcyLDE1IEBACiAgICAgYXR0cmlidXRpb25Tb3VyY2UudWlkID0gVkFMVUVfT1JfRkFUQUwobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdCh1aWQpKTsKICAgICBhdHRyaWJ1dGlvblNvdXJjZS5waWQgPSBWQUxVRV9PUl9GQVRBTChsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KHBpZCkpOwogICAgIGF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gc3A8QkJpbmRlcj46Om1ha2UoKTsKLSAgICByZXR1cm4gc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihjaGFubmVsTWFzayksCi0gICAgICAgICAgICBmcmFtZUNvdW50LCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMsIHNoYXJlZEJ1ZmZlciwKLSAgICAgICAgICAgIHRocmVhZENhbkNhbGxKYXZhLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgb2ZmbG9hZEluZm8sIGF0dHJpYnV0aW9uU291cmNlLAotICAgICAgICAgICAgcEF0dHJpYnV0ZXMsIGRvTm90UmVjb25uZWN0LCBtYXhSZXF1aXJlZFNwZWVkLCBzZWxlY3RlZERldmljZUlkKTsKKyAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgbUxlZ2FjeUNhbGxiYWNrV3JhcHBlciA9IHNwPExlZ2FjeUNhbGxiYWNrV3JhcHBlcj46Om1ha2UoY2FsbGJhY2ssIHVzZXIpOworICAgIH0gZWxzZSBpZiAodXNlcikgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJDYWxsYmFjayBkYXRhIHByb3ZpZGVkIHdpdGhvdXQgY2FsbGJhY2sgcG9pbnRlciEiKTsKKyAgICB9CisgICAgcmV0dXJuIHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihjaGFubmVsTWFzayksCisgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBmbGFncywgbUxlZ2FjeUNhbGxiYWNrV3JhcHBlciwgbm90aWZpY2F0aW9uRnJhbWVzLCBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICAgICB0aHJlYWRDYW5DYWxsSmF2YSwgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLCBhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgICAgICAgIHBBdHRyaWJ1dGVzLCBkb05vdFJlY29ubmVjdCwgbWF4UmVxdWlyZWRTcGVlZCwgc2VsZWN0ZWREZXZpY2VJZCk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTk0Nyw2ICsxMTMwLDYxIEBACiAgICAgbUF1ZGlvVHJhY2stPmZsdXNoKCk7CiB9CiAKK2Jvb2wgQXVkaW9UcmFjazo6cGF1c2VBbmRXYWl0KGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMmIHRpbWVvdXQpCit7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworCisgICAgLy8gV2UgdXNlIGF0b21pYyBhY2Nlc3MgaGVyZSBmb3Igc3RhdGUgdmFyaWFibGVzIC0gdGhlc2UgYXJlIHVzZWQgYXMgaGludHMKKyAgICAvLyB0byBlbnN1cmUgd2UgaGF2ZSByYW1wZWQgZG93biBhdWRpby4KKyAgICBjb25zdCBpbnQgcHJpb3JTdGF0ZSA9IG1Qcm94eS0+Z2V0U3RhdGUoKTsKKyAgICBjb25zdCB1aW50MzJfdCBwcmlvclBvc2l0aW9uID0gbVByb3h5LT5nZXRQb3NpdGlvbigpLnVuc2lnbmVkVmFsdWUoKTsKKworICAgIHBhdXNlKCk7CisKKyAgICAvLyBPbmx5IGlmIHdlIHdlcmUgcHJldmlvdXNseSBhY3RpdmUsIGRvIHdlIHdhaXQgdG8gcmFtcCBkb3duIHRoZSBhdWRpby4KKyAgICBpZiAocHJpb3JTdGF0ZSAhPSBDQkxLX1NUQVRFX0FDVElWRSkgcmV0dXJuIHRydWU7CisKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgLy8gb2ZmbG9hZCBhbmQgZGlyZWN0IHRyYWNrcyBkbyBub3Qgd2FpdCBiZWNhdXNlIHBhdXNlIHZvbHVtZSByYW1wIGlzIGhhbmRsZWQgYnkgaGFyZHdhcmUuCisgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpKSByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFdhaXQgZm9yIHRoZSB0cmFjayBzdGF0ZSB0byBiZSBhbnl0aGluZyBiZXNpZGVzIHBhdXNpbmcuCisgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHZvbHVtZSBoYXMgcmFtcGVkIGRvd24uCisgICAgY29uc3RleHByIGF1dG8gU0xFRVBfSU5URVJWQUxfTVMgPSAxMG1zOworICAgIGNvbnN0ZXhwciBhdXRvIFBPU0lUSU9OX1RJTUVPVVRfTVMgPSA0MG1zOyAvLyBkb24ndCB3YWl0IGxvbmdlciB0aGFuIHRoaXMgZm9yIHBvc2l0aW9uIGNoYW5nZS4KKyAgICBhdXRvIGJlZ2luID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgLy8gV2FpdCBmb3Igc3RhdGUgYW5kIHBvc2l0aW9uIHRvIGNoYW5nZS4KKyAgICAgICAgLy8gQWZ0ZXIgcGF1c2UoKSB0aGUgc2VydmVyIHN0YXRlIHNob3VsZCBiZSBQQVVTSU5HLCBidXQgdGhhdCBtYXkgaW1tZWRpYXRlbHkKKyAgICAgICAgLy8gY29udmVydCB0byBQQVVTRUQgYnkgcHJlcGFyZVRyYWNrcyBiZWZvcmUgZGF0YSBpcyByZWFkIGludG8gdGhlIG1peGVyLgorICAgICAgICAvLyBIZW5jZSB3ZSBjaGVjayB0aGF0IHRoZSBzdGF0ZSBpcyBub3QgUEFVU0lORyBhbmQgdGhhdCB0aGUgc2VydmVyIHBvc2l0aW9uCisgICAgICAgIC8vIGhhcyBhZHZhbmNlZCB0byBiZSBhIG1vcmUgcmVsaWFibGUgZXN0aW1hdGUgdGhhdCB0aGUgdm9sdW1lIHJhbXAgaGFzIGNvbXBsZXRlZC4KKyAgICAgICAgY29uc3QgaW50IHN0YXRlID0gbVByb3h5LT5nZXRTdGF0ZSgpOworICAgICAgICBjb25zdCB1aW50MzJfdCBwb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKS51bnNpZ25lZFZhbHVlKCk7CisKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7IC8vIG9ubHkgbG9jYWwgdmFyaWFibGVzIGFjY2Vzc2VkIHVudGlsIGxvY2suCisgICAgICAgIGF1dG8gZWxhcHNlZCA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KAorICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpIC0gYmVnaW4pOworICAgICAgICBpZiAoc3RhdGUgIT0gQ0JMS19TVEFURV9QQVVTSU5HICYmCisgICAgICAgICAgICAgICAgKGVsYXBzZWQgPj0gUE9TSVRJT05fVElNRU9VVF9NUyB8fCBwb3NpdGlvbiAhPSBwcmlvclBvc2l0aW9uKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBzdWNjZXNzIHN0YXRlOiVkLCBwb3NpdGlvbjoldSBhZnRlciAlbGxkIG1zIgorICAgICAgICAgICAgICAgICAgICAiIChwcmlvciBzdGF0ZTolZCAgcHJpb3IgcG9zaXRpb246JXUpIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXRlLCBwb3NpdGlvbiwgZWxhcHNlZC5jb3VudCgpLCBwcmlvclN0YXRlLCBwcmlvclBvc2l0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgcmVtYWluaW5nID0gdGltZW91dCAtIGVsYXBzZWQ7CisgICAgICAgIGlmIChyZW1haW5pbmcuY291bnQoKSA8PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IHRpbWVvdXQgZXhwaXJlZCBzdGF0ZTolZCBzdGlsbCBwYXVzaW5nOiVkIGFmdGVyICVsbGQgbXMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdGUsIENCTEtfU1RBVEVfUEFVU0lORywgZWxhcHNlZC5jb3VudCgpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBJdCBpcyBjb25jZWl2YWJsZSB0aGF0IHRoZSB0cmFjayBpcyByZXN0b3JlZCB3aGlsZSBzbGVlcGluZzsKKyAgICAgICAgLy8gYXMgdGhpcyBsb2dpYyBpcyBhZHZpc29yeSwgd2UgYWxsb3cgdGhhdC4KKyAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6bWluKHJlbWFpbmluZywgU0xFRVBfSU5URVJWQUxfTVMpKTsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgIH0KK30KKwogdm9pZCBBdWRpb1RyYWNrOjpwYXVzZSgpCiB7CiAgICAgY29uc3QgaW50NjRfdCBiZWdpbk5zID0gc3lzdGVtVGltZSgpOwpAQCAtMTI3NSwxMCArMTUxMyw2IEBACiAgICAgaWYgKG1PdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgfHwgbVByb3h5LmdldCgpID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIC8vIFJlamVjdCBpZiB0aW1lZCB0cmFjayBvciBjb21wcmVzc2VkIGF1ZGlvLgotICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQogCiAgICAgc3NpemVfdCBvcmlnaW5hbEJ1ZmZlclNpemUgPSBtUHJveHktPmdldEJ1ZmZlclNpemVJbkZyYW1lcygpOwogICAgIHNzaXplX3QgZmluYWxCdWZmZXJTaXplICA9IG1Qcm94eS0+c2V0QnVmZmVyU2l6ZUluRnJhbWVzKCh1aW50MzJfdCkgYnVmZmVyU2l6ZUluRnJhbWVzKTsKQEAgLTEzNzEsMTIgKzE2MDUsMTIgQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0TWFya2VyUG9zaXRpb24odWludDMyX3QgbWFya2VyKQogeworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICAvLyBUaGUgb25seSBwdXJwb3NlIG9mIHNldHRpbmcgbWFya2VyIHBvc2l0aW9uIGlzIHRvIGdldCBhIGNhbGxiYWNrCi0gICAgaWYgKG1DYmYgPT0gTlVMTCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKKyAgICBpZiAoIW1DYWxsYmFjay5wcm9tb3RlKCkgfHwgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBtTWFya2VyUG9zaXRpb24gPSBtYXJrZXI7CiAgICAgbU1hcmtlclJlYWNoZWQgPSBmYWxzZTsKIApAQCAtMTQwNCwxMiArMTYzOCwxMiBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRQb3NpdGlvblVwZGF0ZVBlcmlvZCh1aW50MzJfdCB1cGRhdGVQZXJpb2QpCiB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2Ygc2V0dGluZyBwb3NpdGlvbiB1cGRhdGUgcGVyaW9kIGlzIHRvIGdldCBhIGNhbGxiYWNrCi0gICAgaWYgKG1DYmYgPT0gTlVMTCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKKyAgICBpZiAoIW1DYWxsYmFjay5wcm9tb3RlKCkgfHwgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBtTmV3UG9zaXRpb24gPSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCkgKyB1cGRhdGVQZXJpb2Q7CiAgICAgbVVwZGF0ZVBlcmlvZCA9IHVwZGF0ZVBlcmlvZDsKIApAQCAtMTU1NSw2ICsxNzg5LDggQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogZGV2aWNlSWQ9JWQgbVNlbGVjdGVkRGV2aWNlSWQ9JWQiLAorICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGRldmljZUlkLCBtU2VsZWN0ZWREZXZpY2VJZCk7CiAgICAgaWYgKG1TZWxlY3RlZERldmljZUlkICE9IGRldmljZUlkKSB7CiAgICAgICAgIG1TZWxlY3RlZERldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgICAgIGlmIChtU3RhdHVzID09IE5PX0VSUk9SKSB7CkBAIC0xNjQ4LDEyICsxODg0LDEzIEBACiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGJvb2wgY2FsbGJhY2tBZGRlZCA9IGZhbHNlOworICAgIHN0ZDo6c3RyaW5nIGVycm9yTWVzc2FnZTsKIAogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYXVkaW9GbGluZ2VyID09IDApIHsKLSAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiLAorICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoIiVzKCVkKTogQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkKTsKLSAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgc3RhdHVzID0gREVBRF9PQkpFQ1Q7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKQEAgLTE3MzAsMTAgKzE5NjcsMTEgQEAKICAgICB9CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IG91dHB1dC5vdXRwdXRJZCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSB0cmFjaywgc3RhdHVzOiAlZCBvdXRwdXQgJWQiLAorICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgIiVzKCVkKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgdHJhY2ssIHN0YXR1czogJWQgb3V0cHV0ICVkIiwKICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzLCBvdXRwdXQub3V0cHV0SWQpOwogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBOT19JTklUOworICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047IC8vIGRldmljZSBub3QgcmVhZHkKICAgICAgICAgfQogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMTc2NCw4ICsyMDAyLDggQEAKICAgICBvdXRwdXQuYXVkaW9UcmFjay0+Z2V0Q2Jsaygmc2ZyKTsKICAgICBzcDxJTWVtb3J5PiBpTWVtID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfTnVsbGFibGVTaGFyZWRGaWxlUmVnaW9uX0lNZW1vcnkoc2ZyKSk7CiAgICAgaWYgKGlNZW0gPT0gMCkgewotICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siLCBfX2Z1bmNfXywgbVBvcnRJZCk7Ci0gICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siLCBfX2Z1bmNfXywgbVBvcnRJZCk7CisgICAgICAgIHN0YXR1cyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICAvLyBUT0RPOiBVc2luZyB1bnNlY3VyZVBvaW50ZXIoKSBoYXMgc29tZSBhc3NvY2lhdGVkIHNlY3VyaXR5IHBpdGZhbGxzCkBAIC0xNzc0LDggKzIwMTIsOSBAQAogICAgIC8vICAgICAgIGlzc3VlIChlLmcuIGJ5IGNvcHlpbmcpLgogICAgIHZvaWQgKmlNZW1Qb2ludGVyID0gaU1lbS0+dW5zZWN1cmVQb2ludGVyKCk7CiAgICAgaWYgKGlNZW1Qb2ludGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7Ci0gICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKKyAgICAgICAgc3RhdHVzID0gRkFJTEVEX1RSQU5TQUNUSU9OOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1RyYWNrICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CkBAIC0xNzk5LDcgKzIwMzgsNyBAQAogICAgICAgICAgICAgICAgIG1Bd2FpdEJvb3N0ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dEKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IHNlcnZlcjsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IHNlcnZlcjsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtUmVxRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTgzMyw4ICsyMDcyLDEwIEBACiAgICAgICAgIC8vICAgICAgIGlzc3VlIChlLmcuIGJ5IGNvcHlpbmcpLgogICAgICAgICBidWZmZXJzID0gbVNoYXJlZEJ1ZmZlci0+dW5zZWN1cmVQb2ludGVyKCk7CiAgICAgICAgIGlmIChidWZmZXJzID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBOT19JTklUOworICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIiwgX19mdW5jX18sIG1Qb3J0SWQpOworICAgICAgICAgICAgQUxPR0UoIiVzIiwgZXJyb3JNZXNzYWdlLmNfc3RyKCkpOworICAgICAgICAgICAgc3RhdHVzID0gRkFJTEVEX1RSQU5TQUNUSU9OOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgfQpAQCAtMTkxMiw2ICsyMTUzLDcgQEAKICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfVk9MVU1FX0xFRlQsIChkb3VibGUpbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX0xFRlRdKQogICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9WT0xVTUVfUklHSFQsIChkb3VibGUpbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSkKICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU1RBVEUsIHN0YXRlVG9TdHJpbmcobVN0YXRlKSkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTLCAoaW50MzJfdClOT19FUlJPUikKICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfQVVYRUZGRUNUSUQsIChpbnQzMl90KW1BdXhFZmZlY3RJZCkKICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU0FNUExFUkFURSwgKGludDMyX3QpbVNhbXBsZVJhdGUpCiAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1BMQVlCQUNLX1NQRUVELCAoZG91YmxlKW1QbGF5YmFja1JhdGUubVNwZWVkKQpAQCAtMTkzMiwxNyArMjE3NCw0NyBAQAogICAgIH0KIAogZXhpdDoKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIGNhbGxiYWNrQWRkZWQpIHsKLSAgICAgICAgLy8gbm90ZTogbU91dHB1dCBpcyBhbHdheXMgdmFsaWQgaXMgY2FsbGJhY2tBZGRlZCBpcyB0cnVlCi0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQsIG1Qb3J0SWQpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrQWRkZWQpIHsKKyAgICAgICAgICAgIC8vIG5vdGU6IG1PdXRwdXQgaXMgYWx3YXlzIHZhbGlkIGlzIGNhbGxiYWNrQWRkZWQgaXMgdHJ1ZQorICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCwgbVBvcnRJZCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0VfSUYoIWVycm9yTWVzc2FnZS5lbXB0eSgpLCAiJXMiLCBlcnJvck1lc3NhZ2UuY19zdHIoKSk7CisgICAgICAgIHJlcG9ydEVycm9yKHN0YXR1cywgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0NSRUFURSwgZXJyb3JNZXNzYWdlLmNfc3RyKCkpOwogICAgIH0KLQogICAgIG1TdGF0dXMgPSBzdGF0dXM7CiAKICAgICAvLyBzcDxJQXVkaW9UcmFjaz4gdHJhY2sgZGVzdHJ1Y3RvciB3aWxsIGNhdXNlIHJlbGVhc2VPdXRwdXQoKSB0byBiZSBjYWxsZWQgYnkgQXVkaW9GbGluZ2VyCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAordm9pZCBBdWRpb1RyYWNrOjpyZXBvcnRFcnJvcihzdGF0dXNfdCBzdGF0dXMsIGNvbnN0IGNoYXIgKmV2ZW50LCBjb25zdCBjaGFyICptZXNzYWdlKSBjb25zdAoreworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHJldHVybjsKKyAgICAvLyBXZSByZXBvcnQgZXJyb3Igb24gdGhlIG5hdGl2ZSBzaWRlIGJlY2F1c2Ugc29tZSBjYWxsZXJzIGRvIG5vdCBjb21lCisgICAgLy8gZnJvbSBKYXZhLgorICAgIC8vIEVuc3VyZSB0aGVzZSB2YXJpYWJsZXMgYXJlIGluaXRpYWxpemVkIGluIHNldCgpLgorICAgIG1lZGlhbWV0cmljczo6TG9nSXRlbShBTUVESUFNRVRSSUNTX0tFWV9BVURJT19UUkFDS19FUlJPUikKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIGV2ZW50KQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVMsIChpbnQzMl90KXN0YXR1cykKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTTUVTU0FHRSwgbWVzc2FnZSkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfT1JJR0lOQUxGTEFHUywgdG9TdHJpbmcobU9yaWdGbGFncykuY19zdHIoKSkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU0VTU0lPTklELCAoaW50MzJfdCltU2Vzc2lvbklkKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9DT05URU5UVFlQRSwgdG9TdHJpbmcobUF0dHJpYnV0ZXMuY29udGVudF90eXBlKS5jX3N0cigpKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9VU0FHRSwgdG9TdHJpbmcobUF0dHJpYnV0ZXMudXNhZ2UpLmNfc3RyKCkpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NFTEVDVEVEREVWSUNFSUQsIChpbnQzMl90KW1TZWxlY3RlZERldmljZUlkKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FTkNPRElORywgdG9TdHJpbmcobUZvcm1hdCkuY19zdHIoKSkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfQ0hBTk5FTE1BU0ssIChpbnQzMl90KW1DaGFubmVsTWFzaykKKyAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBhcmUgTk9UIGltbXV0YWJsZQorICAgICAgICAvLyBmcmFtZSBjb3VudCBpcyBpbml0aWFsbHkgdGhlIHJlcXVlc3RlZCBmcmFtZSBjb3VudCwgYnV0IG1heSBiZSBhZGp1c3RlZAorICAgICAgICAvLyBieSBBdWRpb0ZsaW5nZXIgYWZ0ZXIgY3JlYXRpb24uCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0ZSQU1FQ09VTlQsIChpbnQzMl90KW1GcmFtZUNvdW50KQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TQU1QTEVSQVRFLCAoaW50MzJfdCltU2FtcGxlUmF0ZSkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfUExBWUJBQ0tfU1BFRUQsIChkb3VibGUpbVBsYXliYWNrUmF0ZS5tU3BlZWQpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1BMQVlCQUNLX1BJVENILCAoZG91YmxlKW1QbGF5YmFja1JhdGUubVBpdGNoKQorICAgICAgICAucmVjb3JkKCk7Cit9CisKIHN0YXR1c190IEF1ZGlvVHJhY2s6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyLCBpbnQzMl90IHdhaXRDb3VudCwgc2l6ZV90ICpub25Db250aWcpCiB7CiAgICAgaWYgKGF1ZGlvQnVmZmVyID09IE5VTEwpIHsKQEAgLTE5NTMsNyArMjIyNSw3IEBACiAgICAgfQogICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfT0JUQUlOKSB7CiAgICAgICAgIGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLSAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSAwOworICAgICAgICBhdWRpb0J1ZmZlci0+bVNpemUgPSAwOwogICAgICAgICBhdWRpb0J1ZmZlci0+cmF3ID0gTlVMTDsKICAgICAgICAgaWYgKG5vbkNvbnRpZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAqbm9uQ29udGlnID0gMDsKQEAgLTIwNDUsNyArMjMxNyw3IEBACiAgICAgfSB3aGlsZSAoKChzdGF0dXMgPT0gREVBRF9PQkpFQ1QpIHx8IChzdGF0dXMgPT0gTk9UX0VOT1VHSF9EQVRBKSkgJiYgKHRyeUNvdW50ZXItLSA+IDApKTsKIAogICAgIGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID0gYnVmZmVyLm1GcmFtZUNvdW50OwotICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gYnVmZmVyLm1GcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKKyAgICBhdWRpb0J1ZmZlci0+bVNpemUgPSBidWZmZXIubUZyYW1lQ291bnQgKiBtRnJhbWVTaXplOwogICAgIGF1ZGlvQnVmZmVyLT5yYXcgPSBidWZmZXIubVJhdzsKICAgICBhdWRpb0J1ZmZlci0+c2VxdWVuY2UgPSBvbGRTZXF1ZW5jZTsKICAgICBpZiAobm9uQ29udGlnICE9IE5VTEwpIHsKQEAgLTIwNjEsNyArMjMzMyw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzaXplX3Qgc3RlcENvdW50ID0gYXVkaW9CdWZmZXItPnNpemUgLyBtRnJhbWVTaXplOworICAgIHNpemVfdCBzdGVwQ291bnQgPSBhdWRpb0J1ZmZlci0+bVNpemUgLyBtRnJhbWVTaXplOwogICAgIGlmIChzdGVwQ291bnQgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjE0MSw4ICsyNDEzLDggQEAKICAgICAgICAgICAgIHJldHVybiBzc2l6ZV90KGVycik7CiAgICAgICAgIH0KIAotICAgICAgICBzaXplX3QgdG9Xcml0ZSA9IGF1ZGlvQnVmZmVyLnNpemU7Ci0gICAgICAgIG1lbWNweShhdWRpb0J1ZmZlci5pOCwgYnVmZmVyLCB0b1dyaXRlKTsKKyAgICAgICAgc2l6ZV90IHRvV3JpdGUgPSBhdWRpb0J1ZmZlci5zaXplKCk7CisgICAgICAgIG1lbWNweShhdWRpb0J1ZmZlci5yYXcsIGJ1ZmZlciwgdG9Xcml0ZSk7CiAgICAgICAgIGJ1ZmZlciA9ICgoY29uc3QgY2hhciAqKSBidWZmZXIpICsgdG9Xcml0ZTsKICAgICAgICAgdXNlclNpemUgLT0gdG9Xcml0ZTsKICAgICAgICAgd3JpdHRlbiArPSB0b1dyaXRlOwpAQCAtMjE3MiwxMCArMjQ0NCwxNSBAQAogewogICAgIC8vIEN1cnJlbnRseSB0aGUgQXVkaW9UcmFjayB0aHJlYWQgaXMgbm90IGNyZWF0ZWQgaWYgdGhlcmUgYXJlIG5vIGNhbGxiYWNrcy4KICAgICAvLyBXb3VsZCBpdCBldmVyIG1ha2Ugc2Vuc2UgdG8gcnVuIHRoZSB0aHJlYWQsIGV2ZW4gd2l0aG91dCBjYWxsYmFja3M/Ci0gICAgLy8gSWYgc28sIHRoZW4gcmVwbGFjZSB0aGlzIGJ5IGNoZWNrcyBhdCBlYWNoIHVzZSBmb3IgbUNiZiAhPSBOVUxMLgorICAgIC8vIElmIHNvLCB0aGVuIHJlcGxhY2UgdGhpcyBieSBjaGVja3MgYXQgZWFjaCB1c2UgZm9yIG1DYWxsYmFjayAhPSBOVUxMLgogICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNibGsgPT0gTlVMTCk7Ci0KICAgICBtTG9jay5sb2NrKCk7CisgICAgc3A8SUF1ZGlvVHJhY2tDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmICghY2FsbGJhY2spIHsKKyAgICAgICAgbUNhbGxiYWNrID0gbnVsbHB0cjsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIHJldHVybiBOU19ORVZFUjsKKyAgICB9CiAgICAgaWYgKG1Bd2FpdEJvb3N0KSB7CiAgICAgICAgIG1Bd2FpdEJvb3N0ID0gZmFsc2U7CiAgICAgICAgIG1Mb2NrLnVubG9jaygpOwpAQCAtMjI3Myw3ICsyNTUwLDcgQEAKICAgICBzcDxBdWRpb1RyYWNrQ2xpZW50UHJveHk+IHByb3h5ID0gbVByb3h5OwogCiAgICAgLy8gRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgbmV3IGxvb3AgY2FsbGJhY2socykgdGhhdCB3aWxsIGJlIG5lZWRlZCwgd2hpbGUgbG9ja2VkLgotICAgIGludCBsb29wQ291bnROb3RpZmljYXRpb25zID0gMDsKKyAgICB1aW50MzJfdCBsb29wQ291bnROb3RpZmljYXRpb25zID0gMDsKICAgICB1aW50MzJfdCBsb29wUGVyaW9kID0gMDsgLy8gdGltZSBpbiBmcmFtZXMgZm9yIG5leHQgRVZFTlRfTE9PUF9FTkQgb3IgRVZFTlRfQlVGRkVSX0VORAogCiAgICAgaWYgKG1Mb29wQ291bnQgPiAwKSB7CkBAIC0yMjk1LDcgKzI1NzIsNyBAQAogICAgIH0KIAogICAgIC8vIFRoZXNlIGZpZWxkcyBkb24ndCBuZWVkIHRvIGJlIGNhY2hlZCwgYmVjYXVzZSB0aGV5IGFyZSBhc3NpZ25lZCBvbmx5IGJ5IHNldCgpOgotICAgIC8vICAgICBtVHJhbnNmZXIsIG1DYmYsIG1Vc2VyRGF0YSwgbUZvcm1hdCwgbUZyYW1lU2l6ZSwgbUZsYWdzCisgICAgLy8gbVRyYW5zZmVyLCBtQ2FsbGJhY2ssIG1Vc2VyRGF0YSwgbUZvcm1hdCwgbUZyYW1lU2l6ZSwgbUZsYWdzCiAgICAgLy8gbUZsYWdzIGlzIGFsc28gYXNzaWduZWQgYnkgY3JlYXRlVHJhY2tfbCgpLCBidXQgbm90IHRoZSBiaXQgd2UgY2FyZSBhYm91dC4KIAogICAgIG1Mb2NrLnVubG9jaygpOwpAQCAtMjMyMCw3ICsyNTk3LDcgQEAKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gREVBRF9PQkpFQ1QpIHsKICAgICAgICAgICAgICAgICAvLyBmb3IgREVBRF9PQkpFQ1QsIHdlIGRvIG5vdCBzZW5kIGEgRVZFTlRfU1RSRUFNX0VORCBhZnRlciBzdG9wKCk7CiAgICAgICAgICAgICAgICAgLy8gaW5zdGVhZCwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBoYW5kbGUgdGhlIEVWRU5UX05FV19JQVVESU9UUkFDSy4KLSAgICAgICAgICAgICAgICBtQ2JmKEVWRU5UX1NUUkVBTV9FTkQsIG1Vc2VyRGF0YSwgTlVMTCk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uU3RyZWFtRW5kKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwpAQCAtMjM0MywyOCArMjYyMCwyNyBAQAogCiAgICAgLy8gcGVyZm9ybSBjYWxsYmFja3Mgd2hpbGUgdW5sb2NrZWQKICAgICBpZiAobmV3VW5kZXJydW4pIHsKLSAgICAgICAgbUNiZihFVkVOVF9VTkRFUlJVTiwgbVVzZXJEYXRhLCBOVUxMKTsKKyAgICAgICAgY2FsbGJhY2stPm9uVW5kZXJydW4oKTsKICAgICB9CiAgICAgd2hpbGUgKGxvb3BDb3VudE5vdGlmaWNhdGlvbnMgPiAwKSB7Ci0gICAgICAgIG1DYmYoRVZFTlRfTE9PUF9FTkQsIG1Vc2VyRGF0YSwgTlVMTCk7CiAgICAgICAgIC0tbG9vcENvdW50Tm90aWZpY2F0aW9uczsKKyAgICAgICAgY2FsbGJhY2stPm9uTG9vcEVuZChtTG9vcENvdW50ID4gMCA/IGxvb3BDb3VudE5vdGlmaWNhdGlvbnMgKyBtTG9vcENvdW50Tm90aWZpZWQgOiAtMSk7CiAgICAgfQogICAgIGlmIChmbGFncyAmIENCTEtfQlVGRkVSX0VORCkgewotICAgICAgICBtQ2JmKEVWRU5UX0JVRkZFUl9FTkQsIG1Vc2VyRGF0YSwgTlVMTCk7CisgICAgICAgIGNhbGxiYWNrLT5vbkJ1ZmZlckVuZCgpOwogICAgIH0KICAgICBpZiAobWFya2VyUmVhY2hlZCkgewotICAgICAgICBtQ2JmKEVWRU5UX01BUktFUiwgbVVzZXJEYXRhLCAmbWFya2VyUG9zaXRpb24pOworICAgICAgICBjYWxsYmFjay0+b25NYXJrZXIobWFya2VyUG9zaXRpb24udmFsdWUoKSk7CiAgICAgfQogICAgIHdoaWxlIChuZXdQb3NDb3VudCA+IDApIHsKLSAgICAgICAgc2l6ZV90IHRlbXAgPSBuZXdQb3NpdGlvbi52YWx1ZSgpOyAvLyBGSVhNRSBzaXplX3QgIT0gdWludDMyX3QKLSAgICAgICAgbUNiZihFVkVOVF9ORVdfUE9TLCBtVXNlckRhdGEsICZ0ZW1wKTsKKyAgICAgICAgY2FsbGJhY2stPm9uTmV3UG9zKG5ld1Bvc2l0aW9uLnZhbHVlKCkpOwogICAgICAgICBuZXdQb3NpdGlvbiArPSB1cGRhdGVQZXJpb2Q7CiAgICAgICAgIG5ld1Bvc0NvdW50LS07CiAgICAgfQogCiAgICAgaWYgKG1PYnNlcnZlZFNlcXVlbmNlICE9IHNlcXVlbmNlKSB7CiAgICAgICAgIG1PYnNlcnZlZFNlcXVlbmNlID0gc2VxdWVuY2U7Ci0gICAgICAgIG1DYmYoRVZFTlRfTkVXX0lBVURJT1RSQUNLLCBtVXNlckRhdGEsIE5VTEwpOworICAgICAgICBjYWxsYmFjay0+b25OZXdJQXVkaW9UcmFjaygpOwogICAgICAgICAvLyBmb3Igb2ZmbG9hZGVkIHRyYWNrcywganVzdCB3YWl0IGZvciB0aGUgdXBwZXIgbGF5ZXJzIHRvIHJlY3JlYXRlIHRoZSB0cmFjawogICAgICAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlNfSU5BQ1RJVkU7CkBAIC0yNDk2LDE2ICsyNzcyLDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBzaXplX3QgcmVxU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemU7CisgICAgICAgIHNpemVfdCByZXFTaXplID0gYXVkaW9CdWZmZXIuc2l6ZSgpOwogICAgICAgICBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKICAgICAgICAgICAgIC8vIHdoZW4gbm90aWZ5aW5nIGNsaWVudCBpdCBjYW4gd3JpdGUgbW9yZSBkYXRhLCBwYXNzIHRoZSB0b3RhbCBzaXplIHRoYXQgY2FuIGJlCiAgICAgICAgICAgICAvLyB3cml0dGVuIGluIHRoZSBuZXh0IHdyaXRlKCkgY2FsbCwgc2luY2UgaXQncyBub3QgcGFzc2VkIHRocm91Z2ggdGhlIGNhbGxiYWNrCi0gICAgICAgICAgICBhdWRpb0J1ZmZlci5zaXplICs9IG5vbkNvbnRpZzsKKyAgICAgICAgICAgIGF1ZGlvQnVmZmVyLm1TaXplICs9IG5vbkNvbnRpZzsKICAgICAgICAgfQotICAgICAgICBtQ2JmKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9DQUxMQkFDSyA/IEVWRU5UX01PUkVfREFUQSA6IEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEsCi0gICAgICAgICAgICAgICAgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOwotICAgICAgICBzaXplX3Qgd3JpdHRlblNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwotCisgICAgICAgIGNvbnN0IHNpemVfdCB3cml0dGVuU2l6ZSA9IChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfQ0FMTEJBQ0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2FsbGJhY2stPm9uTW9yZURhdGEoYXVkaW9CdWZmZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2FsbGJhY2stPm9uQ2FuV3JpdGVNb3JlRGF0YShhdWRpb0J1ZmZlcik7CiAgICAgICAgIC8vIFZhbGlkYXRlIG9uIHJldHVybmVkIHNpemUKICAgICAgICAgaWYgKHNzaXplX3Qod3JpdHRlblNpemUpIDwgMCB8fCB3cml0dGVuU2l6ZSA+IHJlcVNpemUpIHsKICAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IEVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLApAQCAtMjU2NSw2ICsyODQwLDkgQEAKICAgICAgICAgICAgIHJldHVybiBuczsKICAgICAgICAgfQogCisgICAgICAgIC8vIHJlbGVhc2VCdWZmZXIgcmVhZHMgZnJvbSBhdWRpb0J1ZmZlci5zaXplCisgICAgICAgIGF1ZGlvQnVmZmVyLm1TaXplID0gd3JpdHRlblNpemU7CisKICAgICAgICAgc2l6ZV90IHJlbGVhc2VkRnJhbWVzID0gd3JpdHRlblNpemUgLyBtRnJhbWVTaXplOwogICAgICAgICBhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gcmVsZWFzZWRGcmFtZXM7CiAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMgLT0gcmVsZWFzZWRGcmFtZXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwCmluZGV4IDM1NzE5YmUuLmUzYjc5YjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwCkBAIC00MDksNyArNDA5LDcgQEAKICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAgICAgLy8gaXQgc2VlbXMgdGhhdCBhIEZVVEVYX1dBS0VfUFJJVkFURSB3aWxsIG5vdCB3YWtlIGEgRlVURVhfV0FJVCwgZXZlbiB3aXRoaW4gc2FtZSBwcm9jZXNzCiAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsCi0gICAgICAgICAgICAgICAgMSk7CisgICAgICAgICAgICAgICAgSU5UX01BWCk7CiAgICAgfQogfQogCkBAIC00MTksNyArNDE5LDcgQEAKICAgICBpZiAoIShhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVEVSUlVQVCwgJmNibGstPm1GbGFncykgJiBDQkxLX0lOVEVSUlVQVCkpIHsKICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwKLSAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICAgICAgICBJTlRfTUFYKTsKICAgICB9CiB9CiAKQEAgLTQ5MCw2ICs0OTAsOCBAQAogc3RhdHVzX3QgQXVkaW9UcmFja0NsaWVudFByb3h5Ojp3YWl0U3RyZWFtRW5kRG9uZShjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnJlcXVlc3RlZCkKIHsKICAgICBzdHJ1Y3QgdGltZXNwZWMgdG90YWw7ICAgICAgICAgIC8vIHRvdGFsIGVsYXBzZWQgdGltZSBzcGVudCB3YWl0aW5nCisgICAgc3RydWN0IHRpbWVzcGVjIGJlZm9yZTsKKyAgICBib29sIGJlZm9yZUlzVmFsaWQgPSBmYWxzZTsKICAgICB0b3RhbC50dl9zZWMgPSAwOwogICAgIHRvdGFsLnR2X25zZWMgPSAwOwogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwpAQCAtNTcwLDE3ICs1NzIsMzggQEAKICAgICAgICAgfQogICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAgICAgaWYgKCEob2xkICYgQ0JMS19GVVRFWF9XQUtFKSkgeworICAgICAgICAgICAgaWYgKCFiZWZvcmVJc1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZiZWZvcmUpOworICAgICAgICAgICAgICAgIGJlZm9yZUlzVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZXJybm8gPSAwOwogICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwKICAgICAgICAgICAgICAgICAgICAgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FJVF9QUklWQVRFIDogRlVURVhfV0FJVCwgb2xkICYgfkNCTEtfRlVURVhfV0FLRSwgdHMpOwotICAgICAgICAgICAgc3dpdGNoIChlcnJubykgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyb3IgPSBlcnJubzsgLy8gY2xvY2tfZ2V0dGltZSBjYW4gYWZmZWN0IGVycm5vCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIGFmdGVyOworICAgICAgICAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmYWZ0ZXIpOworICAgICAgICAgICAgICAgIHRvdGFsLnR2X3NlYyArPSBhZnRlci50dl9zZWMgLSBiZWZvcmUudHZfc2VjOworICAgICAgICAgICAgICAgIC8vIFVzZSBhdXRvIGluc3RlYWQgb2YgbG9uZyB0byBhdm9pZCB0aGUgZ29vZ2xlLXJ1bnRpbWUtaW50IHdhcm5pbmcuCisgICAgICAgICAgICAgICAgYXV0byBkZWx0YU5zID0gYWZ0ZXIudHZfbnNlYyAtIGJlZm9yZS50dl9uc2VjOworICAgICAgICAgICAgICAgIGlmIChkZWx0YU5zIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBkZWx0YU5zICs9IDEwMDAwMDAwMDA7CisgICAgICAgICAgICAgICAgICAgIHRvdGFsLnR2X3NlYy0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKHRvdGFsLnR2X25zZWMgKz0gZGVsdGFOcykgPj0gMTAwMDAwMDAwMCkgeworICAgICAgICAgICAgICAgICAgICB0b3RhbC50dl9uc2VjIC09IDEwMDAwMDAwMDA7CisgICAgICAgICAgICAgICAgICAgIHRvdGFsLnR2X3NlYysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiZWZvcmUgPSBhZnRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAvLyBub3JtYWwgd2FrZXVwIGJ5IHNlcnZlciwgb3IgYnkgYmluZGVyRGllZCgpCiAgICAgICAgICAgICBjYXNlIEVXT1VMREJMT0NLOiAgLy8gYmVuaWduIHJhY2UgY29uZGl0aW9uIHdpdGggc2VydmVyCiAgICAgICAgICAgICBjYXNlIEVJTlRSOiAgICAgICAgLy8gd2FpdCB3YXMgaW50ZXJydXB0ZWQgYnkgc2lnbmFsIG9yIG90aGVyIHNwdXJpb3VzIHdha2V1cAogICAgICAgICAgICAgY2FzZSBFVElNRURPVVQ6ICAgIC8vIHRpbWUtb3V0IGV4cGlyZWQKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gZXJybm87CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZXJyb3I7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIHVuZXhwZWN0ZWQgZXJyb3IgJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3Ioc3RhdHVzKSk7CiAgICAgICAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgICAgICB9CkBAIC03NDcsNyArNzcwLDcgQEAKICAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAgICAgICAgIGlmICghKG9sZCAmIENCTEtfRlVURVhfV0FLRSkpIHsKICAgICAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLCBJTlRfTUFYKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtRmx1c2hlZCArPSAobmV3RnJvbnQgLSBmcm9udCkgJiBtYXNrOwpAQCAtOTE3LDcgKzk0MCw3IEBACiAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAgICAgaWYgKCEob2xkICYgQ0JMS19GVVRFWF9XQUtFKSkgewogICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwKLSAgICAgICAgICAgICAgICAgICAgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwgMSk7CisgICAgICAgICAgICAgICAgICAgIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsIElOVF9NQVgpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1ZvbHVtZUdyb3VwLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVm9sdW1lR3JvdXAuY3BwCmluZGV4IDM2MWY3YjguLmFiOTUyNDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVm9sdW1lR3JvdXAuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVm9sdW1lR3JvdXAuY3BwCkBAIC0yNiwxMSArMjYsMTAgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9Qb2xpY3lBaWRsQ29udmVyc2lvbi5oPgogCi0jZGVmaW5lIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoeCkgXAotICAgIHsgYXV0byBfdG1wID0gKHgpOyBpZiAoX3RtcCAhPSBPSykgcmV0dXJuIF90bXA7IH0KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdHJlYW1UeXBlOworCiBzdGF0dXNfdCBBdWRpb1ZvbHVtZUdyb3VwOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkKIHsKICAgICBtZWRpYTo6QXVkaW9Wb2x1bWVHcm91cCBhaWRsOwpAQCAtNTUsNyArNTQsNyBAQAogICAgICAgICAgICAgICAgICAgICBsZWdhY3kuZ2V0QXVkaW9BdHRyaWJ1dGVzKCksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCkpOwogICAgIGFpZGwuc3RyZWFtcyA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvU3RyZWFtVHlwZT4+KGxlZ2FjeS5nZXRTdHJlYW1UeXBlcygpLAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb1N0cmVhbVR5cGU+PihsZWdhY3kuZ2V0U3RyZWFtVHlwZXMoKSwKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKSk7CiAgICAgcmV0dXJuIGFpZGw7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IGNhZTgxZjAuLjI5MmQ5MmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiSUF1ZGlvRmxpbmdlciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CkBAIC0zMCw2ICszMSwxMyBAQAogCiB1c2luZyBhaWRsX3V0aWxzOjpzdGF0dXNURnJvbUJpbmRlclN0YXR1czsKIHVzaW5nIGJpbmRlcjo6U3RhdHVzOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ2hhbm5lbExheW91dDsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm87Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01vZGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdHJlYW1UeXBlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvVXVpZDsKIAogI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNAogCkBAIC00MCwxMiArNDgsNiBAQAogICAgICAgIHN0ZDo6bW92ZShfdG1wLnZhbHVlKCkpOyBcCiAgICAgIH0pCiAKLSNkZWZpbmUgUkVUVVJOX1NUQVRVU19JRl9FUlJPUih4KSAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGF1dG8gX3RtcCA9ICh4KTsgICAgICAgICAgICAgIFwKLSAgICAgICBpZiAoX3RtcCAhPSBPSykgcmV0dXJuIF90bXA7ICBcCi0gICAgfQotCiAjZGVmaW5lIFJFVFVSTl9CSU5ERVJfSUZfRVJST1IoeCkgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBhdXRvIF90bXAgPSAoeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC01NSw3ICs1Nyw5IEBACiBDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpDcmVhdGVUcmFja1JlcXVlc3Q+IElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVRyYWNrSW5wdXQ6OnRvQWlkbCgpIGNvbnN0IHsKICAgICBtZWRpYTo6Q3JlYXRlVHJhY2tSZXF1ZXN0IGFpZGw7CiAgICAgYWlkbC5hdHRyID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbChhdHRyKSk7Ci0gICAgYWlkbC5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoY29uZmlnKSk7CisgICAgLy8gRG8gbm90IGJlIG1pc2xlYWQgYnkgJ0lucHV0Jy0tdGhpcyBpcyBhbiBpbnB1dCB0byAnY3JlYXRlVHJhY2snLCB3aGljaCBjcmVhdGVzIG91dHB1dCB0cmFja3MuCisgICAgYWlkbC5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZywgZmFsc2UgLyppc0lucHV0Ki8pKTsKICAgICBhaWRsLmNsaWVudEluZm8gPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfQXVkaW9DbGllbnRfQXVkaW9DbGllbnQoY2xpZW50SW5mbykpOwogICAgIGFpZGwuc2hhcmVkQnVmZmVyID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX051bGxhYmxlSU1lbW9yeV9TaGFyZWRGaWxlUmVnaW9uKHNoYXJlZEJ1ZmZlcikpOwogICAgIGFpZGwubm90aWZpY2F0aW9uc1BlckJ1ZmZlciA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obm90aWZpY2F0aW9uc1BlckJ1ZmZlcikpOwpAQCAtNzQsNyArNzgsOSBAQAogSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tJbnB1dDo6ZnJvbUFpZGwoY29uc3QgbWVkaWE6OkNyZWF0ZVRyYWNrUmVxdWVzdCYgYWlkbCkgewogICAgIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVRyYWNrSW5wdXQgbGVnYWN5OwogICAgIGxlZ2FjeS5hdHRyID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsX2F1ZGlvX2F0dHJpYnV0ZXNfdChhaWRsLmF0dHIpKTsKLSAgICBsZWdhY3kuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KGFpZGwuY29uZmlnKSk7CisgICAgLy8gRG8gbm90IGJlIG1pc2xlYWQgYnkgJ0lucHV0Jy0tdGhpcyBpcyBhbiBpbnB1dCB0byAnY3JlYXRlVHJhY2snLCB3aGljaCBjcmVhdGVzIG91dHB1dCB0cmFja3MuCisgICAgbGVnYWN5LmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KGFpZGwuY29uZmlnLCBmYWxzZSAvKmlzSW5wdXQqLykpOwogICAgIGxlZ2FjeS5jbGllbnRJbmZvID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvQ2xpZW50X0F1ZGlvQ2xpZW50KGFpZGwuY2xpZW50SW5mbykpOwogICAgIGxlZ2FjeS5zaGFyZWRCdWZmZXIgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfTnVsbGFibGVTaGFyZWRGaWxlUmVnaW9uX0lNZW1vcnkoYWlkbC5zaGFyZWRCdWZmZXIpKTsKICAgICBsZWdhY3kubm90aWZpY2F0aW9uc1BlckJ1ZmZlciA9IFZBTFVFX09SX1JFVFVSTigKQEAgLTEzOSw3ICsxNDUsOCBAQAogSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkSW5wdXQ6OnRvQWlkbCgpIGNvbnN0IHsKICAgICBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVxdWVzdCBhaWRsOwogICAgIGFpZGwuYXR0ciA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19hdHRyaWJ1dGVzX3RfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwoYXR0cikpOwotICAgIGFpZGwuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKGNvbmZpZykpOworICAgIGFpZGwuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoY29uZmlnLCB0cnVlIC8qaXNJbnB1dCovKSk7CiAgICAgYWlkbC5jbGllbnRJbmZvID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX0F1ZGlvQ2xpZW50X0F1ZGlvQ2xpZW50KGNsaWVudEluZm8pKTsKICAgICBhaWRsLnJpaWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fdW5pcXVlX2lkX3RfaW50MzJfdChyaWlkKSk7CiAgICAgYWlkbC5tYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyA9IFZBTFVFX09SX1JFVFVSTigKQEAgLTE1OSw3ICsxNjYsOCBAQAogICAgIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVJlY29yZElucHV0IGxlZ2FjeTsKICAgICBsZWdhY3kuYXR0ciA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsX2F1ZGlvX2F0dHJpYnV0ZXNfdChhaWRsLmF0dHIpKTsKLSAgICBsZWdhY3kuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGFpZGwuY29uZmlnKSk7CisgICAgbGVnYWN5LmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGFpZGwuY29uZmlnLCB0cnVlIC8qaXNJbnB1dCovKSk7CiAgICAgbGVnYWN5LmNsaWVudEluZm8gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9DbGllbnRfQXVkaW9DbGllbnQoYWlkbC5jbGllbnRJbmZvKSk7CiAgICAgbGVnYWN5LnJpaWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb191bmlxdWVfaWRfdChhaWRsLnJpaWQpKTsKICAgICBsZWdhY3kubWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMgPSBWQUxVRV9PUl9SRVRVUk4oCkBAIC0xODksNiArMTk3LDggQEAKICAgICBhaWRsLmJ1ZmZlcnMgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfTnVsbGFibGVJTWVtb3J5X1NoYXJlZEZpbGVSZWdpb24oYnVmZmVycykpOwogICAgIGFpZGwucG9ydElkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChwb3J0SWQpKTsKICAgICBhaWRsLmF1ZGlvUmVjb3JkID0gYXVkaW9SZWNvcmQ7CisgICAgYWlkbC5zZXJ2ZXJDb25maWcgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShzZXJ2ZXJDb25maWcsIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICByZXR1cm4gYWlkbDsKIH0KIApAQCAtMjA5LDYgKzIxOSw4IEBACiAgICAgbGVnYWN5LmJ1ZmZlcnMgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfTnVsbGFibGVTaGFyZWRGaWxlUmVnaW9uX0lNZW1vcnkoYWlkbC5idWZmZXJzKSk7CiAgICAgbGVnYWN5LnBvcnRJZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoYWlkbC5wb3J0SWQpKTsKICAgICBsZWdhY3kuYXVkaW9SZWNvcmQgPSBhaWRsLmF1ZGlvUmVjb3JkOworICAgIGxlZ2FjeS5zZXJ2ZXJDb25maWcgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChhaWRsLnNlcnZlckNvbmZpZywgdHJ1ZSAvKmlzSW5wdXQqLykpOwogICAgIHJldHVybiBsZWdhY3k7CiB9CiAKQEAgLTI0Miw5ICsyNTQsOSBAQAogYXVkaW9fZm9ybWF0X3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6Zm9ybWF0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QgewogICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb19mb3JtYXRfdD4gewogICAgICAgICBpbnQzMl90IG91dHB1dEFpZGwgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChvdXRwdXQpKTsKLSAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGFpZGxSZXQ7CisgICAgICAgIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gYWlkbFJldDsKICAgICAgICAgUkVUVVJOX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+Zm9ybWF0KG91dHB1dEFpZGwsICZhaWRsUmV0KSkpOwotICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoYWlkbFJldCk7CisgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KGFpZGxSZXQpOwogICAgIH0oKTsKICAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKIH0KQEAgLTMwOSwxNCArMzIxLDE0IEBACiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSB7Ci0gICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICBBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKICAgICBpbnQzMl90IG91dHB1dEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3Qob3V0cHV0KSk7CiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbUFpZGwsIHZhbHVlLCBvdXRwdXRBaWRsKSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgbXV0ZWQpIHsKLSAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOwogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPnNldFN0cmVhbU11dGUoc3RyZWFtQWlkbCwgbXV0ZWQpKTsKIH0KQEAgLTMyNCw3ICszMzYsNyBAQAogZmxvYXQgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QgewogICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxmbG9hdD4gewotICAgICAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICBBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CiAgICAgICAgIGludDMyX3Qgb3V0cHV0QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChvdXRwdXQpKTsKICAgICAgICAgZmxvYXQgYWlkbFJldDsKQEAgLTMzOCw3ICszNTAsNyBAQAogCiBib29sIEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0IHsKICAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8Ym9vbD4gewotICAgICAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICBBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CiAgICAgICAgIGJvb2wgYWlkbFJldDsKICAgICAgICAgUkVUVVJOX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKApAQCAtMzUwLDcgKzM2Miw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKLSAgICBtZWRpYTo6QXVkaW9Nb2RlIG1vZGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19tb2RlX3RfQXVkaW9Nb2RlKG1vZGUpKTsKKyAgICBBdWRpb01vZGUgbW9kZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZGVfdF9BdWRpb01vZGUobW9kZSkpOwogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPnNldE1vZGUobW9kZUFpZGwpKTsKIH0KIApAQCAtNDEwLDEwICs0MjIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0IHsKICAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8c2l6ZV90PiB7CiAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KHNhbXBsZVJhdGUpKTsKLSAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGZvcm1hdEFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQoZm9ybWF0KSk7Ci0gICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2tBaWRsID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QoY2hhbm5lbE1hc2spKTsKKyAgICAgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBmb3JtYXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oZm9ybWF0KSk7CisgICAgICAgIEF1ZGlvQ2hhbm5lbExheW91dCBjaGFubmVsTWFza0FpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfQXVkaW9DaGFubmVsTGF5b3V0KGNoYW5uZWxNYXNrLCB0cnVlIC8qaXNJbnB1dCovKSk7CiAgICAgICAgIGludDY0X3QgYWlkbFJldDsKICAgICAgICAgUkVUVVJOX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgICAgIG1EZWxlZ2F0ZS0+Z2V0SW5wdXRCdWZmZXJTaXplKHNhbXBsZVJhdGVBaWRsLCBmb3JtYXRBaWRsLCBjaGFubmVsTWFza0FpZGwsCkBAIC00NjksNyArNDgxLDcgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6aW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgewotICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CiAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW1BaWRsKSk7CiB9CkBAIC01NjgsOSArNTgwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCogcFR5cGVVVUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCogcERlc2NyaXB0b3IpIGNvbnN0IHsKLSAgICBtZWRpYTo6QXVkaW9VdWlkIGVmZmVjdFV1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICBBdWRpb1V1aWQgZWZmZWN0VXVpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fdXVpZF90X0F1ZGlvVXVpZCgqcEVmZmVjdFVVSUQpKTsKLSAgICBtZWRpYTo6QXVkaW9VdWlkIHR5cGVVdWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgQXVkaW9VdWlkIHR5cGVVdWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKCpwVHlwZVVVSUQpKTsKICAgICBpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBjb252ZXJ0UmVpbnRlcnByZXQ8aW50MzJfdD4ocHJlZmVycmVkVHlwZUZsYWcpKTsKQEAgLTcxNSw2ICs3MjcsMTAgQEAKICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5zeXN0ZW1SZWFkeSgpKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6YXVkaW9Qb2xpY3lSZWFkeSgpIHsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5hdWRpb1BvbGljeVJlYWR5KCkpOworfQorCiBzaXplX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6ZnJhbWVDb3VudEhBTChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QgewogICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxzaXplX3Q+IHsKICAgICAgICAgaW50MzJfdCBpb0hhbmRsZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpb0hhbmRsZSkpOwpAQCAtNzYxLDYgKzc3NywzOCBAQAogICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPnVwZGF0ZVNlY29uZGFyeU91dHB1dHModHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvcykpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpnZXRNbWFwUG9saWN5SW5mb3MoCisgICAgICAgIEF1ZGlvTU1hcFBvbGljeVR5cGUgcG9saWN5VHlwZSwgc3RkOjp2ZWN0b3I8QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zKSB7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+Z2V0TW1hcFBvbGljeUluZm9zKHBvbGljeVR5cGUsIHBvbGljeUluZm9zKSk7Cit9CisKK2ludDMyX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6Z2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCkgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiB7CisgICAgICAgIGludDMyX3QgYWlkbFJldDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+Z2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCZhaWRsUmV0KSkpOworICAgICAgICByZXR1cm4gY29udmVydEludGVncmFsPGludDMyX3Q+KGFpZGxSZXQpOworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcigwKTsKK30KKworaW50MzJfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpIHsKKyAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4geworICAgICAgICBpbnQzMl90IGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgICAgICBtRGVsZWdhdGUtPmdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCZhaWRsUmV0KSkpOworICAgICAgICByZXR1cm4gY29udmVydEludGVncmFsPGludDMyX3Q+KGFpZGxSZXQpOworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcigwKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c2V0RGV2aWNlQ29ubmVjdGVkU3RhdGUoCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0LCBib29sIGNvbm5lY3RlZCkgeworICAgIG1lZGlhOjpBdWRpb1BvcnQgYWlkbFBvcnQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF92N19BdWRpb1BvcnQoKnBvcnQpKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5zZXREZXZpY2VDb25uZWN0ZWRTdGF0ZShhaWRsUG9ydCwgY29ubmVjdGVkKSk7Cit9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXIKQEAgLTgwNiwxMSArODU0LDExIEBACiB9CiAKIFN0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpmb3JtYXQoaW50MzJfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCogX2FpZGxfcmV0dXJuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24qIF9haWRsX3JldHVybikgewogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KG91dHB1dCkpOwogICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobURlbGVnYXRlLT5mb3JtYXQob3V0cHV0TGVnYWN5KSkpOworICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihtRGVsZWdhdGUtPmZvcm1hdChvdXRwdXRMZWdhY3kpKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIApAQCAtODU2LDcgKzkwNCw3IEBACiAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5nZXRNYXN0ZXJCYWxhbmNlKF9haWRsX3JldHVybikpOwogfQogCi1TdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0U3RyZWFtVm9sdW1lKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBmbG9hdCB2YWx1ZSwKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRTdHJlYW1Wb2x1bWUoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgZmxvYXQgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3V0cHV0KSB7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1MZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtKSk7CkBAIC04NjUsMTMgKzkxMywxMyBAQAogICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbUxlZ2FjeSwgdmFsdWUsIG91dHB1dExlZ2FjeSkpOwogfQogCi1TdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0U3RyZWFtTXV0ZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgYm9vbCBtdXRlZCkgeworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnNldFN0cmVhbU11dGUoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgYm9vbCBtdXRlZCkgewogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KHN0cmVhbSkpOwogICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+c2V0U3RyZWFtTXV0ZShzdHJlYW1MZWdhY3ksIG11dGVkKSk7CiB9CiAKLVN0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzdHJlYW1Wb2x1bWUobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3Qgb3V0cHV0LAorU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnN0cmVhbVZvbHVtZShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQzMl90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIF9haWRsX3JldHVybikgewogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KHN0cmVhbSkpOwpAQCAtODgxLDE0ICs5MjksMTQgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c3RyZWFtTXV0ZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgYm9vbCogX2FpZGxfcmV0dXJuKSB7CitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c3RyZWFtTXV0ZShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW0pKTsKICAgICAqX2FpZGxfcmV0dXJuID0gbURlbGVnYXRlLT5zdHJlYW1NdXRlKHN0cmVhbUxlZ2FjeSk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnNldE1vZGUobWVkaWE6OkF1ZGlvTW9kZSBtb2RlKSB7CitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0TW9kZShBdWRpb01vZGUgbW9kZSkgewogICAgIGF1ZGlvX21vZGVfdCBtb2RlTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihhaWRsMmxlZ2FjeV9BdWRpb01vZGVfYXVkaW9fbW9kZV90KG1vZGUpKTsKICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPnNldE1vZGUobW9kZUxlZ2FjeSkpOwogfQpAQCAtOTM0LDEzICs5ODIsMTQgQEAKIH0KIAogU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmdldElucHV0QnVmZmVyU2l6ZShpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2ssIGludDY0X3QqIF9haWRsX3JldHVybikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uJiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvQ2hhbm5lbExheW91dCYgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIF9haWRsX3JldHVybikgewogICAgIHVpbnQzMl90IHNhbXBsZVJhdGVMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oc2FtcGxlUmF0ZSkpOwogICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdChmb3JtYXQpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QoZm9ybWF0KSk7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2tMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdChjaGFubmVsTWFzaykpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2F1ZGlvX2NoYW5uZWxfbWFza190KGNoYW5uZWxNYXNrLCB0cnVlIC8qaXNJbnB1dCovKSk7CiAgICAgc2l6ZV90IHNpemUgPSBtRGVsZWdhdGUtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlTGVnYWN5LCBmb3JtYXRMZWdhY3ksIGNoYW5uZWxNYXNrTGVnYWN5KTsKICAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4oc2l6ZSkpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CkBAIC05OTEsNyArMTA0MCw3IEBACiAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5jbG9zZUlucHV0KGlucHV0TGVnYWN5KSk7CiB9CiAKLVN0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjppbnZhbGlkYXRlU3RyZWFtKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtKSB7CitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6aW52YWxpZGF0ZVN0cmVhbShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtKSB7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1MZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbUxlZ2FjeSkpOwpAQCAtMTA2Niw4ICsxMTE1LDggQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiBlZmZlY3RVVUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdHlwZVVVSUQsCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBBdWRpb1V1aWQmIGVmZmVjdFVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1V1aWQmIHR5cGVVVUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yKiBfYWlkbF9yZXR1cm4pIHsKICAgICBlZmZlY3RfdXVpZF90IGVmZmVjdFV1aWRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKApAQCAtMTE4OSw2ICsxMjM4LDExIEBACiAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zeXN0ZW1SZWFkeSgpKTsKIH0KIAorU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmF1ZGlvUG9saWN5UmVhZHkoKSB7CisgICAgbURlbGVnYXRlLT5hdWRpb1BvbGljeVJlYWR5KCk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKwogU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmZyYW1lQ291bnRIQUwoaW50MzJfdCBpb0hhbmRsZSwgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGVMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChpb0hhbmRsZSkpOwpAQCAtMTIyNyw0ICsxMjgxLDI3IEBACiAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT51cGRhdGVTZWNvbmRhcnlPdXRwdXRzKHRyYWNrU2Vjb25kYXJ5T3V0cHV0cykpOwogfQogCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0TW1hcFBvbGljeUluZm9zKAorICAgICAgICBBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUsIHN0ZDo6dmVjdG9yPEF1ZGlvTU1hcFBvbGljeUluZm8+ICpfYWlkbF9yZXR1cm4pIHsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPmdldE1tYXBQb2xpY3lJbmZvcyhwb2xpY3lUeXBlLCBfYWlkbF9yZXR1cm4pKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmdldEFBdWRpb01peGVyQnVyc3RDb3VudChpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtRGVsZWdhdGUtPmdldEFBdWRpb01peGVyQnVyc3RDb3VudCgpKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgY29udmVydEludGVncmFsPGludDMyX3Q+KG1EZWxlZ2F0ZS0+Z2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoKSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZSgKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgcG9ydCwgYm9vbCBjb25uZWN0ZWQpIHsKKyAgICBhdWRpb19wb3J0X3Y3IHBvcnRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGFpZGwybGVnYWN5X0F1ZGlvUG9ydF9hdWRpb19wb3J0X3Y3KHBvcnQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPnNldERldmljZUNvbm5lY3RlZFN0YXRlKCZwb3J0TGVnYWN5LCBjb25uZWN0ZWQpKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvUG9saWN5QWlkbENvbnZlcnNpb24uY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvUG9saWN5QWlkbENvbnZlcnNpb24uY3BwCmluZGV4IDI1ZmRiNDkuLjUyMGYwOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1BvbGljeUFpZGxDb252ZXJzaW9uLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9Qb2xpY3lBaWRsQ29udmVyc2lvbi5jcHAKQEAgLTI1LDE2ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIGJhc2U6OnVuZXhwZWN0ZWQ7Ci0KLUNvbnZlcnNpb25SZXN1bHQ8dm9sdW1lX2dyb3VwX3Q+Ci1haWRsMmxlZ2FjeV9pbnQzMl90X3ZvbHVtZV9ncm91cF90KGludDMyX3QgYWlkbCkgewotICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8dm9sdW1lX2dyb3VwX3Q+KGFpZGwpOwotfQotCi1Db252ZXJzaW9uUmVzdWx0PGludDMyX3Q+Ci1sZWdhY3kyYWlkbF92b2x1bWVfZ3JvdXBfdF9pbnQzMl90KHZvbHVtZV9ncm91cF90IGxlZ2FjeSkgewotICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8aW50MzJfdD4obGVnYWN5KTsKLX0KK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZUFkZHJlc3M7CiAKIENvbnZlcnNpb25SZXN1bHQ8dWludDMyX3Q+CiBhaWRsMmxlZ2FjeV9BdWRpb01peFR5cGVfdWludDMyX3QobWVkaWE6OkF1ZGlvTWl4VHlwZSBhaWRsKSB7CkBAIC0xNTIsNyArMTQzLDcgQEAKIAogICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01peE1hdGNoQ3JpdGVyaW9uVmFsdWU6OnNvdXJjZToKICAgICAgICAgICAgIGxlZ2FjeS5tU291cmNlID0gVkFMVUVfT1JfUkVUVVJOKAotICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoVU5JT05fR0VUKGFpZGwsIHNvdXJjZSkudmFsdWUoKSkpOworICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdChVTklPTl9HRVQoYWlkbCwgc291cmNlKS52YWx1ZSgpKSk7CiAgICAgICAgICAgICAqcnVsZSB8PSBSVUxFX01BVENIX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVDsKICAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CiAKQEAgLTE4NCw3ICsxNzUsNyBAQAogCiAgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVQ6CiAgICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUobGVnYWN5Lm1Tb3VyY2UpKSk7CisgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKGxlZ2FjeS5tU291cmNlKSkpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBSVUxFX01BVENIX1VJRDoKQEAgLTIzMiwxMSArMjIzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIobGVnYWN5Lm1Dcml0ZXJpYSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb01peE1hdGNoQ3JpdGVyaW9uKSk7CiAgICAgbGVnYWN5Lm1NaXhUeXBlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvTWl4VHlwZV91aW50MzJfdChhaWRsLm1peFR5cGUpKTsKLSAgICBsZWdhY3kubUZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChhaWRsLmZvcm1hdCkpOworICAgIC8vIFNlZSAnY29udmVydEF1ZGlvTWl4VG9OYXRpdmUnIGluICdhbmRyb2lkX21lZGlhX0F1ZGlvU3lzdGVtLmNwcCcgLS0gb25seQorICAgIC8vIGFuIG91dHB1dCBtYXNrIGlzIGV4cGVjdGVkIGhlcmUuCisgICAgbGVnYWN5Lm1Gb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QoCisgICAgICAgICAgICAgICAgICAgIGFpZGwuZm9ybWF0LCBmYWxzZSAvKmlzSW5wdXQqLykpOwogICAgIGxlZ2FjeS5tUm91dGVGbGFncyA9IFZBTFVFX09SX1JFVFVSTigKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvTWl4Um91dGVGbGFnX3VpbnQzMl90X21hc2soYWlkbC5yb3V0ZUZsYWdzKSk7Ci0gICAgbGVnYWN5Lm1EZXZpY2VUeXBlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGFpZGwuZGV2aWNlLnR5cGUpKTsKLSAgICBsZWdhY3kubURldmljZUFkZHJlc3MgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfc3RyaW5nX3ZpZXdfU3RyaW5nOChhaWRsLmRldmljZS5hZGRyZXNzKSk7CisgICAgUkVUVVJOX0lGX0VSUk9SKGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlX2F1ZGlvX2RldmljZSgKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5kZXZpY2UsICZsZWdhY3kubURldmljZVR5cGUsICZsZWdhY3kubURldmljZUFkZHJlc3MpKTsKICAgICBsZWdhY3kubUNiRmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9NaXhDYWxsYmFja0ZsYWdfdWludDMyX3RfbWFzayhhaWRsLmNiRmxhZ3MpKTsKICAgICBsZWdhY3kubUFsbG93UHJpdmlsZWdlZE1lZGlhUGxheWJhY2tDYXB0dXJlID0gYWlkbC5hbGxvd1ByaXZpbGVnZWRNZWRpYVBsYXliYWNrQ2FwdHVyZTsKICAgICBsZWdhY3kubVZvaWNlQ29tbXVuaWNhdGlvbkNhcHR1cmVBbGxvd2VkID0gYWlkbC52b2ljZUNvbW11bmljYXRpb25DYXB0dXJlQWxsb3dlZDsKQEAgLTI1MSwxMSArMjQ1LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5tQ3JpdGVyaWEsCiAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb24pKTsKICAgICBhaWRsLm1peFR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfdWludDMyX3RfQXVkaW9NaXhUeXBlKGxlZ2FjeS5tTWl4VHlwZSkpOwotICAgIGFpZGwuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGxlZ2FjeS5tRm9ybWF0KSk7CisgICAgLy8gU2VlICdjb252ZXJ0QXVkaW9NaXhUb05hdGl2ZScgaW4gJ2FuZHJvaWRfbWVkaWFfQXVkaW9TeXN0ZW0uY3BwJyAtLSBvbmx5CisgICAgLy8gYW4gb3V0cHV0IG1hc2sgaXMgZXhwZWN0ZWQgaGVyZS4KKyAgICBhaWRsLmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5Lm1Gb3JtYXQsIGZhbHNlIC8qaXNJbnB1dCovKSk7CiAgICAgYWlkbC5yb3V0ZUZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfdWludDMyX3RfQXVkaW9NaXhSb3V0ZUZsYWdfbWFzayhsZWdhY3kubVJvdXRlRmxhZ3MpKTsKLSAgICBhaWRsLmRldmljZS50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGxlZ2FjeS5tRGV2aWNlVHlwZSkpOwotICAgIGFpZGwuZGV2aWNlLmFkZHJlc3MgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfU3RyaW5nOF9zdHJpbmcobGVnYWN5Lm1EZXZpY2VBZGRyZXNzKSk7CisgICAgYWlkbC5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VfQXVkaW9EZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5tRGV2aWNlVHlwZSwgbGVnYWN5Lm1EZXZpY2VBZGRyZXNzKSk7CiAgICAgYWlkbC5jYkZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX3VpbnQzMl90X0F1ZGlvTWl4Q2FsbGJhY2tGbGFnX21hc2sobGVnYWN5Lm1DYkZsYWdzKSk7CiAgICAgYWlkbC5hbGxvd1ByaXZpbGVnZWRNZWRpYVBsYXliYWNrQ2FwdHVyZSA9IGxlZ2FjeS5tQWxsb3dQcml2aWxlZ2VkTWVkaWFQbGF5YmFja0NhcHR1cmU7CiAgICAgYWlkbC52b2ljZUNvbW11bmljYXRpb25DYXB0dXJlQWxsb3dlZCA9IGxlZ2FjeS5tVm9pY2VDb21tdW5pY2F0aW9uQ2FwdHVyZUFsbG93ZWQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1MWY4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDE1IEBACit7CisgICJwcmVzdWJtaXQiOiBbCisgICAgeworICAgICAgIm5hbWUiOiAiYXVkaW9fYWlkbF9jb252ZXJzaW9uX3Rlc3RzIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTmF0aXZlTWVkaWFBQXVkaW9UZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiIDogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubmF0aXZlbWVkaWEuYWF1ZGlvLkFBdWRpb1Rlc3RzI0FBdWRpb0Jhc2ljLioiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAKaW5kZXggZTVlODQ5Ni4uZjk2OGE0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiVG9uZUdlbmVyYXRvciIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2luY2x1ZGUgPG1hdGguaD4KQEAgLTg2Niw2ICs4NjcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCiAgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAogICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1RXX1JJTkdUT05FCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyA0MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAzMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gMywKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX05aX0NBTExfV0FJVElORwogfTsKIAogLy8gVXNlZCBieSBUb25lR2VuZXJhdG9yOjpnZXRUb25lRm9yUmVnaW9uKCkgdG8gY29udmVydCB1c2VyIHNwZWNpZmllZCBzdXBlcnZpc29yeSB0b25lIHR5cGUKQEAgLTk2MCw2ICs5NjYsMTYgQEAKICAgICAgICAgICAgIFRPTkVfU1VQX0VSUk9SLCAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRVJST1IKICAgICAgICAgICAgIFRPTkVfU1VQX0NBTExfV0FJVElORywgICAgICAgLy8gVE9ORV9TVVBfQ0FMTF9XQUlUSU5HCiAgICAgICAgICAgICBUT05FX1RXX1JJTkdUT05FICAgICAgICAgICAgIC8vIFRPTkVfU1VQX1JJTkdUT05FCisgICAgICAgIH0sCisgICAgICAgIHsgICAvLyBORVcgWkVBTEFORAorICAgICAgICAgICAgVE9ORV9KQVBBTl9ESUFMLCAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRElBTAorICAgICAgICAgICAgVE9ORV9KQVBBTl9CVVNZLCAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQlVTWQorICAgICAgICAgICAgVE9ORV9TVVBfQ09OR0VTVElPTiwgICAgICAgICAgLy8gVE9ORV9TVVBfQ09OR0VTVElPTgorICAgICAgICAgICAgVE9ORV9TVVBfUkFESU9fQUNLLCAgICAgICAgICAgLy8gVE9ORV9TVVBfUkFESU9fQUNLCisgICAgICAgICAgICBUT05FX1NVUF9SQURJT19OT1RBVkFJTCwgICAgICAvLyBUT05FX1NVUF9SQURJT19OT1RBVkFJTAorICAgICAgICAgICAgVE9ORV9TVVBfRVJST1IsICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRVJST1IKKyAgICAgICAgICAgIFRPTkVfTlpfQ0FMTF9XQUlUSU5HLCAgICAgICAgIC8vIFRPTkVfU1VQX0NBTExfV0FJVElORworICAgICAgICAgICAgVE9ORV9HQl9SSU5HVE9ORSAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfUklOR1RPTkUKICAgICAgICAgfQogfTsKIApAQCAtOTc3LDcgKzk5Myw3IEBACiAvLyAgICBNZXRob2Q6ICAgICAgICBUb25lR2VuZXJhdG9yOjpUb25lR2VuZXJhdG9yKCkKIC8vCiAvLyAgICBEZXNjcmlwdGlvbjogICAgQ29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSB0b25lIHNlcXVlbmNlciwgaW50YW50aWF0ZXMgcmVxdWlyZWQgc2luZSB3YXZlCi0vLyAgICAgICAgZ2VuZXJhdG9ycywgaW5zdGFudGlhdGVzIG91dHB1dCBhdWRpbyB0cmFjay4KKy8vICAgICAgICBnZW5lcmF0b3JzLCBkb2VzIG5vdCBpbml0aWFsaXplIG91dHB1dCBhdWRpbyB0cmFjay4KIC8vCiAvLyAgICBJbnB1dDoKIC8vICAgICAgICBzdHJlYW1UeXBlOiAgICAgICAgVHlwZSBvZiBzdHJlYW0gdXNlZCBmb3IgdG9uZSBwbGF5YmFjawpAQCAtMTAzNywxMCArMTA1MywyOSBAQAogICAgICAgICBtUmVnaW9uID0gSU5ESUE7CiAgICAgfSBlbHNlIGlmIChzdHJzdHIodmFsdWUsICJ0dyIpICE9IE5VTEwpIHsKICAgICAgICAgbVJlZ2lvbiA9IFRBSVdBTjsKKyAgICB9IGVsc2UgaWYgKHN0cnN0cih2YWx1ZSwgIm56IikgIT0gTlVMTCkgeworICAgICAgICBtUmVnaW9uID0gTlo7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVJlZ2lvbiA9IENFUFQ7CiAgICAgfQogCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gICAgTWV0aG9kOiAgICAgICAgVG9uZUdlbmVyYXRvcjo6b25GaXJzdFJlZigpCisvLworLy8gICAgRGVzY3JpcHRpb246ICBDYWxsZWQgdXBvbiBmaXJzdCBSZWZCYXNlIHJlZmVyZW5jZS4gSW5pdGlhbGl6ZXMgYXVkaW8gdHJhY2sKKy8vICAgICAgICAgICAgICAgICAgd2l0aCB3ZWFrIHBvaW50ZXIgdG8gc2VsZiBhcyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjay4KKy8vICAgIElucHV0OgorLy8gICAgICAgIG5vbmUKKy8vCisvLyAgICBPdXRwdXQ6CisvLyAgICAgICAgbm9uZQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgVG9uZUdlbmVyYXRvcjo6b25GaXJzdFJlZigpIHsKICAgICBpZiAoaW5pdEF1ZGlvVHJhY2soKSkgewogICAgICAgICBBTE9HVigiVG9uZUdlbmVyYXRvciBJTklUIE9LLCB0aW1lOiAlZCIsICh1bnNpZ25lZCBpbnQpKHN5c3RlbVRpbWUoKS8xMDAwMDAwKSk7CiAgICAgfSBlbHNlIHsKQEAgLTEwNDgsOSArMTA4Myw2IEBACiAgICAgfQogfQogCi0KLQotCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8KIC8vICAgIE1ldGhvZDogICAgICAgIFRvbmVHZW5lcmF0b3I6On5Ub25lR2VuZXJhdG9yKCkKQEAgLTEyMTUsNyArMTI0Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgIHNlYyA9IHNlYyAqIDEwMDAgKyBuc2VjIC8gMTAwMDAwMDsgLy8gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCiAgICAgICAgICAgICAgICAgICAgIG1NYXhTbXAgPSAodW5zaWduZWQgaW50KSgoKGludDY0X3Qpc2VjICogbVNhbXBsaW5nUmF0ZSkgLyAxMDAwKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoInN0b3BUb25lKCkgZm9yY2luZyBtTWF4U21wIHRvICVkLCB0b3RhbCBmb3IgZmFyICVkIiwgbU1heFNtcCwgIG1Ub3RhbFNtcCk7CisgICAgICAgICAgICAgICAgQUxPR1YoInN0b3BUb25lKCkgZm9yY2luZyBtTWF4U21wIHRvICVkLCB0b3RhbCBmb3IgZmFyICUiIFBSSXU2NCwgbU1heFNtcCwKKyAgICAgICAgICAgICAgICAgICAgICBtVG90YWxTbXApOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBUT05FX1NUT1BQSU5HOwogICAgICAgICAgICAgfQpAQCAtMTI4Miw4ICsxMzE1LDcgQEAKICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX01PTk8sCiAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCwKLSAgICAgICAgICAgIGF1ZGlvQ2FsbGJhY2ssCi0gICAgICAgICAgICB0aGlzLCAvLyB1c2VyCisgICAgICAgICAgICB3cDxBdWRpb1RyYWNrOjpJQXVkaW9UcmFja0NhbGxiYWNrPjo6ZnJvbUV4aXN0aW5nKHRoaXMpLAogICAgICAgICAgICAgMCwgICAgLy8gbm90aWZpY2F0aW9uRnJhbWVzCiAgICAgICAgICAgICAwLCAgICAvLyBzaGFyZWRCdWZmZXIKICAgICAgICAgICAgIG1UaHJlYWRDYW5DYWxsSmF2YSwKQEAgLTEzMDgsNTAgKzEzNDAsNDcgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vCi0vLyAgICBNZXRob2Q6ICAgICAgICBUb25lR2VuZXJhdG9yOjphdWRpb0NhbGxiYWNrKCkKKy8vICAgIE1ldGhvZDogICAgICAgIFRvbmVHZW5lcmF0b3I6Om9uTW9yZURhdGEoKQogLy8KIC8vICAgIERlc2NyaXB0aW9uOiAgICBBdWRpb1RyYWNrIGNhbGxiYWNrIGltcGxlbWVudGF0aW9uLiBHZW5lcmF0ZXMgYSBibG9jayBvZgogLy8gICAgICAgIFBDTSBzYW1wbGVzCiAvLyAgICAgICAgYW5kIG1hbmFnZXMgdG9uZSBnZW5lcmF0b3Igc2VxdWVuY2VyOiB0b25lcyBwdWxzZXMsIHRvbmUgZHVyYXRpb24uLi4KIC8vCiAvLyAgICBJbnB1dDoKLS8vICAgICAgICB1c2VyICAgIHJlZmVyZW5jZSAocG9pbnRlciB0byBvdXIgVG9uZUdlbmVyYXRvcikKLS8vICAgICAgICBpbmZvICAgIGF1ZGlvIGJ1ZmZlciBkZXNjcmlwdG9yCisvLyAgICAgICAgYnVmZmVyICBBbiBidWZmZXIgb2JqZWN0IGNvbnRhaW5pbmcgYSBwb2ludGVyIHdoaWNoIHdlIHdpbGwgZmlsbCB3aXRoCisvLyAgICAgICAgICAgICAgICBidWZmZXIuc2l6ZSgpIGJ5dGVzLgogLy8KIC8vICAgIE91dHB1dDoKLS8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogYWx3YXlzIHRydWUuCisvLyAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyB3ZSBzdWNjZXNzZnVsbHkgd3JvdGUuCiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgVG9uZUdlbmVyYXRvcjo6YXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQgKmluZm8pIHsKK3NpemVfdCBUb25lR2VuZXJhdG9yOjpvbk1vcmVEYXRhKGNvbnN0IEF1ZGlvVHJhY2s6OkJ1ZmZlciYgYnVmZmVyKSB7CiAKLSAgICBpZiAoZXZlbnQgIT0gQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBKSByZXR1cm47Ci0KLSAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmJ1ZmZlciA9IHN0YXRpY19jYXN0PEF1ZGlvVHJhY2s6OkJ1ZmZlciAqPihpbmZvKTsKLSAgICBUb25lR2VuZXJhdG9yICpscFRvbmVHZW4gPSBzdGF0aWNfY2FzdDxUb25lR2VuZXJhdG9yICo+KHVzZXIpOwotICAgIGludDE2X3QgKmxwT3V0ID0gYnVmZmVyLT5pMTY7Ci0gICAgdW5zaWduZWQgaW50IGxOdW1TbXAgPSBidWZmZXItPnNpemUvc2l6ZW9mKGludDE2X3QpOwotICAgIGNvbnN0IFRvbmVEZXNjcmlwdG9yICpscFRvbmVEZXNjID0gbHBUb25lR2VuLT5tcFRvbmVEZXNjOwotCi0gICAgaWYgKGJ1ZmZlci0+c2l6ZSA9PSAwKSByZXR1cm47Ci0KKyAgICBpbnQxNl90ICpscE91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KGJ1ZmZlci5kYXRhKCkpOworICAgIHVpbnQzMl90IGxOdW1TbXAgPSAoYnVmZmVyLnNpemUoKSAvIHNpemVvZihpbnQxNl90KSA8IFVJTlQzMl9NQVgpID8KKyAgICAgICAgICAgIGJ1ZmZlci5zaXplKCkgLyBzaXplb2YoaW50MTZfdCkgOiBVSU5UMzJfTUFYOworICAgIGlmIChidWZmZXIuc2l6ZSgpID09IDApIHJldHVybiAwOworICAgIC8vIFdlIHdpbGwgd3JpdGUgdG8gdGhlIGVudGlyZSBidWZmZXIgdW5sZXNzIHdlIGFyZSBzdG9wcGVkLCB0aGVuIHdlIHJldHVybgorICAgIC8vIDAgYXQgbG9vcCBlbmQKKyAgICBzaXplX3QgYnl0ZXNXcml0dGVuID0gbE51bVNtcCAqIHNpemVvZihpbnQxNl90KTsKIAogICAgIC8vIENsZWFyIG91dHB1dCBidWZmZXI6IFdhdmVHZW5lcmF0b3IgYWNjdW11bGF0ZXMgaW50byBscE91dCBidWZmZXIKLSAgICBtZW1zZXQobHBPdXQsIDAsIGJ1ZmZlci0+c2l6ZSk7CisgICAgbWVtc2V0KGxwT3V0LCAwLCBidWZmZXIuc2l6ZSgpKTsKIAogICAgIHdoaWxlIChsTnVtU21wKSB7Ci0gICAgICAgIHVuc2lnbmVkIGludCBsUmVxU21wID0gbE51bVNtcCA8IGxwVG9uZUdlbi0+bVByb2Nlc3NTaXplKjIgPyBsTnVtU21wIDogbHBUb25lR2VuLT5tUHJvY2Vzc1NpemU7CisgICAgICAgIHVuc2lnbmVkIGludCBsUmVxU21wID0gbE51bVNtcCA8IG1Qcm9jZXNzU2l6ZSoyID8gbE51bVNtcCA6IG1Qcm9jZXNzU2l6ZTsKICAgICAgICAgdW5zaWduZWQgaW50IGxHZW5TbXA7CiAgICAgICAgIHVuc2lnbmVkIGludCBsV2F2ZUNtZCA9IFdhdmVHZW5lcmF0b3I6OldBVkVHRU5fQ09OVDsKICAgICAgICAgYm9vbCBsU2lnbmFsID0gZmFsc2U7CiAKLSAgICAgICAgbHBUb25lR2VuLT5tTG9jay5sb2NrKCk7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKIAogCiAgICAgICAgIC8vIFVwZGF0ZSBwY20gZnJhbWUgY291bnQgYW5kIGVuZCB0aW1lIChjdXJyZW50IHRpbWUgYXQgdGhlIGVuZCBvZiB0aGlzIHByb2Nlc3MpCi0gICAgICAgIGxwVG9uZUdlbi0+bVRvdGFsU21wICs9IGxSZXFTbXA7CisgICAgICAgIG1Ub3RhbFNtcCArPSBsUmVxU21wOwogCiAgICAgICAgIC8vIFVwZGF0ZSB0b25lIGdlbiBzdGF0ZSBtYWNoaW5lIGFuZCBzZWxlY3Qgd2F2ZSBnZW4gY29tbWFuZAotICAgICAgICBzd2l0Y2ggKGxwVG9uZUdlbi0+bVN0YXRlKSB7CisgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgVE9ORV9QTEFZSU5HOgogICAgICAgICAgICAgbFdhdmVDbWQgPSBXYXZlR2VuZXJhdG9yOjpXQVZFR0VOX0NPTlQ7CiAgICAgICAgICAgICBicmVhazsKQEAgLTEzNjUsNyArMTM5NCw3IEBACiAgICAgICAgICAgICBBTE9HVigiU3RvcC9yZXN0YXJ0IENiayIpOwogCiAgICAgICAgICAgICBsV2F2ZUNtZCA9IFdhdmVHZW5lcmF0b3I6OldBVkVHRU5fU1RPUDsKLSAgICAgICAgICAgIGxwVG9uZUdlbi0+bU5leHRTZWdTbXAgPSBUT05FR0VOX0lORjsgLy8gZm9yY2VkIHRvIHNraXAgc3RhdGUgbWFjaGluZSBtYW5hZ2VtZW50IGJlbG93CisgICAgICAgICAgICBtTmV4dFNlZ1NtcCA9IFRPTkVHRU5fSU5GOyAvLyBmb3JjZWQgdG8gc2tpcCBzdGF0ZSBtYWNoaW5lIG1hbmFnZW1lbnQgYmVsb3cKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRPTkVfU1RPUFBFRDoKICAgICAgICAgICAgIEFMT0dWKCJTdG9wcGVkIENiayIpOwpAQCAtMTM3NiwyMCArMTQwNSwyMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gRXhpdCBpZiB0b25lIHNlcXVlbmNlIGlzIG92ZXIKLSAgICAgICAgaWYgKGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLmR1cmF0aW9uID09IDAgfHwKLSAgICAgICAgICAgIGxwVG9uZUdlbi0+bVRvdGFsU21wID4gbHBUb25lR2VuLT5tTWF4U21wKSB7Ci0gICAgICAgICAgICBpZiAobHBUb25lR2VuLT5tU3RhdGUgPT0gVE9ORV9QTEFZSU5HKSB7Ci0gICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tU3RhdGUgPSBUT05FX1NUT1BQSU5HOworICAgICAgICBpZiAobXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLmR1cmF0aW9uID09IDAgfHwKKyAgICAgICAgICAgIG1Ub3RhbFNtcCA+IG1NYXhTbXApIHsKKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gVE9ORV9QTEFZSU5HKSB7CisgICAgICAgICAgICAgICAgbVN0YXRlID0gVE9ORV9TVE9QUElORzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS5kdXJhdGlvbiA9PSAwKSB7CisgICAgICAgICAgICBpZiAobXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLmR1cmF0aW9uID09IDApIHsKICAgICAgICAgICAgICAgICBnb3RvIGF1ZGlvQ2FsbGJhY2tfRW5kTG9vcDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGZhZGUgb3V0IGJlZm9yZSBzdG9wcGluZyBpZiBtYXhpbXVtIGR1cmF0aW9uIHJlYWNoZWQKICAgICAgICAgICAgIGxXYXZlQ21kID0gV2F2ZUdlbmVyYXRvcjo6V0FWRUdFTl9TVE9QOwotICAgICAgICAgICAgbHBUb25lR2VuLT5tTmV4dFNlZ1NtcCA9IFRPTkVHRU5fSU5GOyAvLyBmb3JjZWQgdG8gc2tpcCBzdGF0ZSBtYWNoaW5lIG1hbmFnZW1lbnQgYmVsb3cKKyAgICAgICAgICAgIG1OZXh0U2VnU21wID0gVE9ORUdFTl9JTkY7IC8vIGZvcmNlZCB0byBza2lwIHN0YXRlIG1hY2hpbmUgbWFuYWdlbWVudCBiZWxvdwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGxwVG9uZUdlbi0+bVRvdGFsU21wID4gbHBUb25lR2VuLT5tTmV4dFNlZ1NtcCkgeworICAgICAgICBpZiAobVRvdGFsU21wID4gbU5leHRTZWdTbXAgJiYgbU5leHRTZWdTbXAgIT0gVE9ORUdFTl9JTkYpIHsKICAgICAgICAgICAgIC8vIFRpbWUgdG8gZ28gdG8gbmV4dCBzZXF1ZW5jZSBzZWdtZW50CiAKICAgICAgICAgICAgIEFMT0dWKCJFbmQgU2VnbWVudCwgdGltZTogJWQiLCAodW5zaWduZWQgaW50KShzeXN0ZW1UaW1lKCkvMTAwMDAwMCkpOwpAQCAtMTM5Nyw2MSArMTQyNiw2MSBAQAogICAgICAgICAgICAgbEdlblNtcCA9IGxSZXFTbXA7CiAKICAgICAgICAgICAgIC8vIElmIHNlZ21lbnQsICBPTiAtPiBPRkYgdHJhbnNpdGlvbiA6IHJhbXAgdm9sdW1lIGRvd24KLSAgICAgICAgICAgIGlmIChscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS53YXZlRnJlcVswXSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLndhdmVGcmVxWzBdICE9IDApIHsKICAgICAgICAgICAgICAgICBsV2F2ZUNtZCA9IFdhdmVHZW5lcmF0b3I6OldBVkVHRU5fU1RPUDsKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbEZyZXFJZHggPSAwOwotICAgICAgICAgICAgICAgIHVpbnQxNl90IGxGcmVxdWVuY3kgPSBscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS53YXZlRnJlcVtsRnJlcUlkeF07CisgICAgICAgICAgICAgICAgdWludDE2X3QgbEZyZXF1ZW5jeSA9IG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS53YXZlRnJlcVtsRnJlcUlkeF07CiAKICAgICAgICAgICAgICAgICB3aGlsZSAobEZyZXF1ZW5jeSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFdhdmVHZW5lcmF0b3IgKmxwV2F2ZUdlbiA9IGxwVG9uZUdlbi0+bVdhdmVHZW5zLnZhbHVlRm9yKGxGcmVxdWVuY3kpOworICAgICAgICAgICAgICAgICAgICBXYXZlR2VuZXJhdG9yICpscFdhdmVHZW4gPSBtV2F2ZUdlbnMudmFsdWVGb3IobEZyZXF1ZW5jeSk7CiAgICAgICAgICAgICAgICAgICAgIGxwV2F2ZUdlbi0+Z2V0U2FtcGxlcyhscE91dCwgbEdlblNtcCwgbFdhdmVDbWQpOwotICAgICAgICAgICAgICAgICAgICBsRnJlcXVlbmN5ID0gbHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ud2F2ZUZyZXFbKytsRnJlcUlkeF07CisgICAgICAgICAgICAgICAgICAgIGxGcmVxdWVuY3kgPSBtcFRvbmVEZXNjLT5zZWdtZW50c1ttQ3VyU2VnbWVudF0ud2F2ZUZyZXFbKytsRnJlcUlkeF07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJPTi0+T0ZGLCBsR2VuU21wOiAlZCwgbFJlcVNtcDogJWQiLCBsR2VuU21wLCBsUmVxU21wKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBsb29wIGFuZCBsb29wIGZvciB0aGUgcmVxZCB0aW1lcwotICAgICAgICAgICAgaWYgKGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLmxvb3BDbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAobHBUb25lR2VuLT5tTG9vcENvdW50ZXIgPCBscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS5sb29wQ250KSB7CisgICAgICAgICAgICBpZiAobXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLmxvb3BDbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAobUxvb3BDb3VudGVyIDwgbXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLmxvb3BDbnQpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YgKCJpbiBpZiBsb29wIGxvb3BDbnQoJWQpIGxvb3BjdHIoJWQpLCBDdXJTZWcoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ubG9vcENudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tTG9vcENvdW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bUN1clNlZ21lbnQpOwotICAgICAgICAgICAgICAgICAgICBscFRvbmVHZW4tPm1DdXJTZWdtZW50ID0gbHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ubG9vcEluZHg7Ci0gICAgICAgICAgICAgICAgICAgICsrbHBUb25lR2VuLT5tTG9vcENvdW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS5sb29wQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9vcENvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJTZWdtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgbUN1clNlZ21lbnQgPSBtcFRvbmVEZXNjLT5zZWdtZW50c1ttQ3VyU2VnbWVudF0ubG9vcEluZHg7CisgICAgICAgICAgICAgICAgICAgICsrbUxvb3BDb3VudGVyOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZCBsb29wLiBnbyB0byBuZXh0IHNlZ21lbnQKLSAgICAgICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tTG9vcENvdW50ZXIgPSAwOwotICAgICAgICAgICAgICAgICAgICBscFRvbmVHZW4tPm1DdXJTZWdtZW50Kys7CisgICAgICAgICAgICAgICAgICAgIG1Mb29wQ291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1DdXJTZWdtZW50Kys7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWICgiaW4gZWxzZSBsb29wIGxvb3BDbnQoJWQpIGxvb3BjdHIoJWQpLCBDdXJTZWcoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbHBUb25lRGVzYy0+c2VnbWVudHNbbHBUb25lR2VuLT5tQ3VyU2VnbWVudF0ubG9vcENudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tTG9vcENvdW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bUN1clNlZ21lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICBtcFRvbmVEZXNjLT5zZWdtZW50c1ttQ3VyU2VnbWVudF0ubG9vcENudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3BDb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VyU2VnbWVudCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBscFRvbmVHZW4tPm1DdXJTZWdtZW50Kys7CisgICAgICAgICAgICAgICAgbUN1clNlZ21lbnQrKzsKICAgICAgICAgICAgICAgICBBTE9HViAoIkdvdG8gbmV4dCBzZWcgbG9vcENudCglZCkgbG9vcGN0ciglZCksIEN1clNlZyglZCkiLAotICAgICAgICAgICAgICAgICAgICAgIGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLmxvb3BDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tTG9vcENvdW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgbHBUb25lR2VuLT5tQ3VyU2VnbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgbXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLmxvb3BDbnQsCisgICAgICAgICAgICAgICAgICAgICAgbUxvb3BDb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgIG1DdXJTZWdtZW50KTsKIAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBIYW5kbGUgbG9vcCBpZiBsYXN0IHNlZ21lbnQgcmVhY2hlZAotICAgICAgICAgICAgaWYgKGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLmR1cmF0aW9uID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiTGFzdCBTZWc6ICVkIiwgbHBUb25lR2VuLT5tQ3VyU2VnbWVudCk7CisgICAgICAgICAgICBpZiAobXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLmR1cmF0aW9uID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiTGFzdCBTZWc6ICVkIiwgbUN1clNlZ21lbnQpOwogCiAgICAgICAgICAgICAgICAgLy8gUHJlIGluY3JlbWVudCBsb29wIGNvdW50IGFuZCByZXN0YXJ0IGlmIHRvdGFsIGNvdW50IG5vdCByZWFjaGVkLiBTdG9wIHNlcXVlbmNlIG90aGVyd2lzZQotICAgICAgICAgICAgICAgIGlmICgrK2xwVG9uZUdlbi0+bUN1ckNvdW50IDw9IGxwVG9uZURlc2MtPnJlcGVhdENudCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiUmVwZWF0aW5nIENvdW50OiAlZCIsIGxwVG9uZUdlbi0+bUN1ckNvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoKyttQ3VyQ291bnQgPD0gbXBUb25lRGVzYy0+cmVwZWF0Q250KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJSZXBlYXRpbmcgQ291bnQ6ICVkIiwgbUN1ckNvdW50KTsKIAotICAgICAgICAgICAgICAgICAgICBscFRvbmVHZW4tPm1DdXJTZWdtZW50ID0gbHBUb25lRGVzYy0+cmVwZWF0U2VnbWVudDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZURlc2MtPnJlcGVhdFNlZ21lbnRdLndhdmVGcmVxWzBdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUN1clNlZ21lbnQgPSBtcFRvbmVEZXNjLT5yZXBlYXRTZWdtZW50OworICAgICAgICAgICAgICAgICAgICBpZiAobXBUb25lRGVzYy0+c2VnbWVudHNbbXBUb25lRGVzYy0+cmVwZWF0U2VnbWVudF0ud2F2ZUZyZXFbMF0gIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbFdhdmVDbWQgPSBXYXZlR2VuZXJhdG9yOjpXQVZFR0VOX1NUQVJUOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIk5ldyBzZWdtZW50ICVkLCBOZXh0IFRpbWU6ICVsbGQiLCBscFRvbmVHZW4tPm1DdXJTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobG9uZyBsb25nKShscFRvbmVHZW4tPm1OZXh0U2VnU21wKSoxMDAwKS9scFRvbmVHZW4tPm1TYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiTmV3IHNlZ21lbnQgJWQsIE5leHQgVGltZTogJWxsZCIsIG1DdXJTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobG9uZyBsb25nKShtTmV4dFNlZ1NtcCkqMTAwMCkvbVNhbXBsaW5nUmF0ZSk7CiAKIAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNDU5LDEwICsxNDg4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJFbmQgcmVwZWF0LCB0aW1lOiAlZCIsICh1bnNpZ25lZCBpbnQpKHN5c3RlbVRpbWUoKS8xMDAwMDAwKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiTmV3IHNlZ21lbnQgJWQsIE5leHQgVGltZTogJWxsZCIsIGxwVG9uZUdlbi0+bUN1clNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoKGxvbmcgbG9uZykobHBUb25lR2VuLT5tTmV4dFNlZ1NtcCkqMTAwMCkvbHBUb25lR2VuLT5tU2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiTmV3IHNlZ21lbnQgJWQsIE5leHQgVGltZTogJWxsZCIsIG1DdXJTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgKChsb25nIGxvbmcpKG1OZXh0U2VnU21wKSoxMDAwKS9tU2FtcGxpbmdSYXRlKTsKIAotICAgICAgICAgICAgICAgIGlmIChscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS53YXZlRnJlcVswXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1wVG9uZURlc2MtPnNlZ21lbnRzW21DdXJTZWdtZW50XS53YXZlRnJlcVswXSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5leHQgc2VnbWVudCBpcyBub3Qgc2lsZW50LCAgT0ZGIC0+IE9OIHRyYW5zaXRpb24gOiByZXNldCB3YXZlIGdlbmVyYXRvcgogICAgICAgICAgICAgICAgICAgICBsV2F2ZUNtZCA9IFdhdmVHZW5lcmF0b3I6OldBVkVHRU5fU1RBUlQ7CiAKQEAgLTE0NzIsMTMgKzE1MDEsMTYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBuZXh0IHNlZ21lbnQgdHJhbnNpdGlvbiBwb3NpdGlvbi4gTm8gaGFybSB0byBkbyBpdCBhbHNvIGZvciBsYXN0IHNlZ21lbnQgYXMgbHBUb25lR2VuLT5tTmV4dFNlZ1NtcCB3b24ndCBiZSB1c2VkIGFueSBtb3JlCi0gICAgICAgICAgICBscFRvbmVHZW4tPm1OZXh0U2VnU21wCi0gICAgICAgICAgICAgICAgICAgICs9IChscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS5kdXJhdGlvbiAqIGxwVG9uZUdlbi0+bVNhbXBsaW5nUmF0ZSkgLyAxMDAwOworICAgICAgICAgICAgLy8gVXBkYXRlIG5leHQgc2VnbWVudCB0cmFuc2l0aW9uIHBvc2l0aW9uLiBObyBoYXJtIHRvIGRvIGl0IGFsc28gZm9yIGxhc3Qgc2VnbWVudCBhcworICAgICAgICAgICAgLy8gbU5leHRTZWdTbXAgd29uJ3QgYmUgdXNlZCBhbnkgbW9yZS4KKyAgICAgICAgICAgIC8vIEhhbmRsZSAzMiBiaXQgd3JhcGFyb3VuZCBncmFjZWZ1bGx5LgorICAgICAgICAgICAgY29uc3QgdWludDY0X3QgcmVzID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG1OZXh0U2VnU21wKSArCisgICAgICAgICAgICAgICAgICAgIChtcFRvbmVEZXNjLT5zZWdtZW50c1ttQ3VyU2VnbWVudF0uZHVyYXRpb24gKiBtU2FtcGxpbmdSYXRlKSAvIDEwMDA7CisgICAgICAgICAgICBtTmV4dFNlZ1NtcCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6Om1pbjx1aW50NjRfdD4oVE9ORUdFTl9JTkYsIHJlcykpOwogCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBJbnNpZGUgYSBzZWdtZW50IGtlZXAgdG9uZSBPTiBvciBPRkYKLSAgICAgICAgICAgIGlmIChscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS53YXZlRnJlcVswXSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLndhdmVGcmVxWzBdID09IDApIHsKICAgICAgICAgICAgICAgICBsR2VuU21wID0gMDsgIC8vIElmIG9kZCBzZWdtZW50LCB0b25lIGlzIGN1cnJlbnRseSBPRkYKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbEdlblNtcCA9IGxSZXFTbXA7ICAvLyBJZiBldmVudCBzZWdtZW50LCB0b25lIGlzIGN1cnJlbnRseSBPTgpAQCAtMTQ4OCwxMiArMTUyMCwxMiBAQAogICAgICAgICBpZiAobEdlblNtcCkgewogICAgICAgICAgICAgLy8gSWYgc2FtcGxlcyBtdXN0IGJlIGdlbmVyYXRlZCwgY2FsbCBhbGwgYWN0aXZlIHdhdmUgZ2VuZXJhdG9ycyBhbmQgYWN1bXVsYXRlIHdhdmVzIGluIGxwT3V0CiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbEZyZXFJZHggPSAwOwotICAgICAgICAgICAgdWludDE2X3QgbEZyZXF1ZW5jeSA9IGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLndhdmVGcmVxW2xGcmVxSWR4XTsKKyAgICAgICAgICAgIHVpbnQxNl90IGxGcmVxdWVuY3kgPSBtcFRvbmVEZXNjLT5zZWdtZW50c1ttQ3VyU2VnbWVudF0ud2F2ZUZyZXFbbEZyZXFJZHhdOwogCiAgICAgICAgICAgICB3aGlsZSAobEZyZXF1ZW5jeSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgV2F2ZUdlbmVyYXRvciAqbHBXYXZlR2VuID0gbHBUb25lR2VuLT5tV2F2ZUdlbnMudmFsdWVGb3IobEZyZXF1ZW5jeSk7CisgICAgICAgICAgICAgICAgV2F2ZUdlbmVyYXRvciAqbHBXYXZlR2VuID0gbVdhdmVHZW5zLnZhbHVlRm9yKGxGcmVxdWVuY3kpOwogICAgICAgICAgICAgICAgIGxwV2F2ZUdlbi0+Z2V0U2FtcGxlcyhscE91dCwgbEdlblNtcCwgbFdhdmVDbWQpOwotICAgICAgICAgICAgICAgIGxGcmVxdWVuY3kgPSBscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS53YXZlRnJlcVsrK2xGcmVxSWR4XTsKKyAgICAgICAgICAgICAgICBsRnJlcXVlbmN5ID0gbXBUb25lRGVzYy0+c2VnbWVudHNbbUN1clNlZ21lbnRdLndhdmVGcmVxWysrbEZyZXFJZHhdOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE1MDEsMjEgKzE1MzMsMTkgQEAKICAgICAgICAgbHBPdXQgKz0gbFJlcVNtcDsKIAogYXVkaW9DYWxsYmFja19FbmRMb29wOgotCi0gICAgICAgIHN3aXRjaCAobHBUb25lR2VuLT5tU3RhdGUpIHsKKyAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgY2FzZSBUT05FX1JFU1RBUlRJTkc6CiAgICAgICAgICAgICBBTE9HVigiQ2JrIHJlc3RhcnRpbmcgdHJhY2siKTsKLSAgICAgICAgICAgIGlmIChscFRvbmVHZW4tPnByZXBhcmVXYXZlKCkpIHsKLSAgICAgICAgICAgICAgICBscFRvbmVHZW4tPm1TdGF0ZSA9IFRPTkVfU1RBUlRJTkc7Ci0gICAgICAgICAgICAgICAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmbHBUb25lR2VuLT5tU3RhcnRUaW1lKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bVN0YXJ0VGltZS50dl9zZWMgPSAwOworICAgICAgICAgICAgaWYgKHByZXBhcmVXYXZlKCkpIHsKKyAgICAgICAgICAgICAgICBtU3RhdGUgPSBUT05FX1NUQVJUSU5HOworICAgICAgICAgICAgICAgIGlmIChjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJm1TdGFydFRpbWUpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZS50dl9zZWMgPSAwOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBtdXN0IHJlbG9hZCBscFRvbmVEZXNjIGFzIHByZXBhcmVXYXZlKCkgbWF5IGNoYW5nZSBtcFRvbmVEZXNjCi0gICAgICAgICAgICAgICAgbHBUb25lRGVzYyA9IGxwVG9uZUdlbi0+bXBUb25lRGVzYzsKKyAgICAgICAgICAgICAgICAvLyBtdXN0IHJlbG9hZCBtcFRvbmVEZXNjIGFzIHByZXBhcmVXYXZlKCkgbWF5IGNoYW5nZSBtcFRvbmVEZXNjCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEFMT0dXKCJDYmsgcmVzdGFydGluZyBwcmVwYXJlV2F2ZSgpIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bVN0YXRlID0gVE9ORV9JRExFOwotICAgICAgICAgICAgICAgIGxwVG9uZUdlbi0+bXBBdWRpb1RyYWNrLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlID0gVE9ORV9JRExFOworICAgICAgICAgICAgICAgIG1wQXVkaW9UcmFjay0+c3RvcCgpOwogICAgICAgICAgICAgICAgIC8vIEZvcmNlIGxvb3AgZXhpdAogICAgICAgICAgICAgICAgIGxOdW1TbXAgPSAwOwogICAgICAgICAgICAgfQpAQCAtMTUyMywyMiArMTU1MywyMiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVE9ORV9TVE9QUElORzoKICAgICAgICAgICAgIEFMT0dWKCJDYmsgU3RvcHBpbmciKTsKLSAgICAgICAgICAgIGxwVG9uZUdlbi0+bVN0YXRlID0gVE9ORV9TVE9QUEVEOworICAgICAgICAgICAgbVN0YXRlID0gVE9ORV9TVE9QUEVEOwogICAgICAgICAgICAgLy8gRm9yY2UgbG9vcCBleGl0CiAgICAgICAgICAgICBsTnVtU21wID0gMDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRPTkVfU1RPUFBFRDoKLSAgICAgICAgICAgIGxwVG9uZUdlbi0+bVN0YXRlID0gVE9ORV9JTklUOworICAgICAgICAgICAgbVN0YXRlID0gVE9ORV9JTklUOwogICAgICAgICAgICAgQUxPR1YoIkNiayBTdG9wcGVkIHRyYWNrIik7Ci0gICAgICAgICAgICBscFRvbmVHZW4tPm1wQXVkaW9UcmFjay0+c3RvcCgpOworICAgICAgICAgICAgbXBBdWRpb1RyYWNrLT5zdG9wKCk7CiAgICAgICAgICAgICAvLyBGb3JjZSBsb29wIGV4aXQKICAgICAgICAgICAgIGxOdW1TbXAgPSAwOwotICAgICAgICAgICAgYnVmZmVyLT5zaXplID0gMDsKKyAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IDA7CiAgICAgICAgICAgICBsU2lnbmFsID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRPTkVfU1RBUlRJTkc6CiAgICAgICAgICAgICBBTE9HVigiQ2JrIHN0YXJ0aW5nIHRyYWNrIik7Ci0gICAgICAgICAgICBscFRvbmVHZW4tPm1TdGF0ZSA9IFRPTkVfUExBWUlORzsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFRPTkVfUExBWUlORzsKICAgICAgICAgICAgIGxTaWduYWwgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVE9ORV9QTEFZSU5HOgpAQCAtMTU0NiwxNCArMTU3NiwxNSBAQAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgLy8gRm9yY2UgbG9vcCBleGl0CiAgICAgICAgICAgICBsTnVtU21wID0gMDsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSA9IDA7CisgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSAwOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobFNpZ25hbCkKLSAgICAgICAgICAgIGxwVG9uZUdlbi0+bVdhaXRDYmtDb25kLmJyb2FkY2FzdCgpOwotICAgICAgICBscFRvbmVHZW4tPm1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgbVdhaXRDYmtDb25kLmJyb2FkY2FzdCgpOworICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICB9CisgICAgcmV0dXJuIGJ5dGVzV3JpdHRlbjsKIH0KIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9UcmFja1BsYXllckJhc2UuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVHJhY2tQbGF5ZXJCYXNlLmNwcAppbmRleCAxODhmMzIxLi40ZmMxYzQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9UcmFja1BsYXllckJhc2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RyYWNrUGxheWVyQmFzZS5jcHAKQEAgLTMzLDExICszMywxNCBAQAogICAgIGRvRGVzdHJveSgpOwogfQogCi12b2lkIFRyYWNrUGxheWVyQmFzZTo6aW5pdChBdWRpb1RyYWNrKiBwYXQsIHBsYXllcl90eXBlX3QgcGxheWVyVHlwZSwgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKLSAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgewordm9pZCBUcmFja1BsYXllckJhc2U6OmluaXQoY29uc3Qgc3A8QXVkaW9UcmFjaz4mIHBhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvVHJhY2s6OklBdWRpb1RyYWNrQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcl90eXBlX3QgcGxheWVyVHlwZSwgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIHsKICAgICBQbGF5ZXJCYXNlOjppbml0KHBsYXllclR5cGUsIHVzYWdlLCBzZXNzaW9uSWQpOwogICAgIG1BdWRpb1RyYWNrID0gcGF0OwogICAgIGlmIChtQXVkaW9UcmFjayAhPSAwKSB7CisgICAgICAgIG1DYWxsYmFja0hhbmRsZSA9IGNhbGxiYWNrOwogICAgICAgICBtU2VsZkF1ZGlvRGV2aWNlQ2FsbGJhY2sgPSBuZXcgU2VsZkF1ZGlvRGV2aWNlQ2FsbGJhY2soKnRoaXMpOwogICAgICAgICBtQXVkaW9UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtU2VsZkF1ZGlvRGV2aWNlQ2FsbGJhY2spOwogICAgICAgICBtQXVkaW9UcmFjay0+c2V0UGxheWVySUlkKG1QSUlkKTsgLy8gc2V0IGluIFBsYXllckJhc2U6OmluaXQoKS4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNFeC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlc0V4LmFpZGwKaW5kZXggMDRhMDJjNy4uMzM1ODY2ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlc0V4LmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlc0V4LmFpZGwKQEAgLTE3LDcgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1N0cmVhbVR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9TdHJlYW1UeXBlOwogCiAvKioKICAqIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIGFuZHJvaWQ6OkF1ZGlvQXR0cmlidXRlcyBDKysgdHlwZS4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlc0ludGVybmFsLmFpZGwKaW5kZXggNjk5ZGYwYS4uMmU3NDIwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlc0ludGVybmFsLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlc0ludGVybmFsLmFpZGwKQEAgLTE2LDkgKzE2LDkgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbnRlbnRUeXBlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Tb3VyY2VUeXBlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Vc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NvbnRlbnRUeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvU291cmNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvVXNhZ2U7CiAKIC8qKgogICogVGhlICJJbnRlcm5hbCIgc3VmZml4IG9mIHRoaXMgdHlwZSBuYW1lIGlzIHRvIGRpc2FtYmlndWF0ZSBpdCBmcm9tIHRoZQpAQCAtMjgsNyArMjgsNyBAQAogcGFyY2VsYWJsZSBBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCB7CiAgICAgQXVkaW9Db250ZW50VHlwZSBjb250ZW50VHlwZTsKICAgICBBdWRpb1VzYWdlIHVzYWdlOwotICAgIEF1ZGlvU291cmNlVHlwZSBzb3VyY2U7CisgICAgQXVkaW9Tb3VyY2Ugc291cmNlOwogICAgIC8vIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9GbGFnLgogICAgIGludCBmbGFnczsKICAgICBAdXRmOEluQ3BwIFN0cmluZyB0YWdzOyAvKiBVVEY4ICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db25maWcuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbmZpZy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGM5N2QzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbmZpZy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9PZmZsb2FkSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9Db25maWcgewotICAgIGludCBzYW1wbGVSYXRlOwotICAgIC8qKgotICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX2NoYW5uZWxfbWFza190LgotICAgICAqIFRPRE8oeXRhaSk6IENyZWF0ZSBhIGRlc2lnbmF0ZWQgdHlwZS4KLSAgICAgKi8KLSAgICBpbnQgY2hhbm5lbE1hc2s7Ci0gICAgQXVkaW9Gb3JtYXQgZm9ybWF0OwotICAgIEF1ZGlvT2ZmbG9hZEluZm8gb2ZmbG9hZEluZm87Ci0gICAgbG9uZyBmcmFtZUNvdW50OwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnQmFzZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnQmFzZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzUzYzBkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbmZpZ0Jhc2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9Db25maWdCYXNlIHsKLSAgICBpbnQgc2FtcGxlUmF0ZTsKLSAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fY2hhbm5lbF9tYXNrX3QuICovCi0gICAgaW50IGNoYW5uZWxNYXNrOwotICAgIEF1ZGlvRm9ybWF0IGZvcm1hdDsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbnRlbnRUeXBlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db250ZW50VHlwZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzM0ZmJhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbnRlbnRUeXBlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9Db250ZW50VHlwZSB7Ci0gICAgVU5LTk9XTiA9IDAsCi0gICAgU1BFRUNIID0gMSwKLSAgICBNVVNJQyA9IDIsCi0gICAgTU9WSUUgPSAzLAotICAgIFNPTklGSUNBVElPTiA9IDQsCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0RldmljZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjAwNjk3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0RldmljZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9EZXZpY2UgewotICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19kZXZpY2VzX3QuICovCi0gICAgaW50IHR5cGU7Ci0gICAgQHV0ZjhJbkNwcCBTdHJpbmcgYWRkcmVzczsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0YW5kYXJkLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9EaXJlY3RNb2RlLmFpZGwKc2ltaWxhcml0eSBpbmRleCA4MyUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU3RhbmRhcmQuYWlkbApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRGlyZWN0TW9kZS5haWRsCmluZGV4IGUxMzFkMGQuLjBkYTQ3MjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0YW5kYXJkLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRGlyZWN0TW9kZS5haWRsCkBAIC0xNSwxMyArMTUsMTAgQEAKICAqLwogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi0vKioKLSAqIFRoZSBhdWRpbyBzdGFuZGFyZCB0aGF0IGRlc2NyaWJlIGF1ZGlvIHBsYXliYWNrL2NhcHR1cmUgY2FwYWJpbGl0ZXMuCi0gKgotICoge0BoaWRlfQotICovCiBAQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb1N0YW5kYXJkIHsKK2VudW0gQXVkaW9EaXJlY3RNb2RlIHsKICAgICBOT05FID0gMCwKLSAgICBFRElEID0gMSwKKyAgICBPRkZMT0FEID0gMSwKKyAgICBPRkZMT0FEX0dBUExFU1MgPSAyLAorICAgIEJJVFNUUkVBTSA9IDQsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwM2FkZmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUgewotICAgIE5PTkUgPSAwLAotICAgIEZSQU1FV09SS19UVU5FUiA9IDEsCi0gICAgRFZCX0FEX0RFU0NSSVBUT1IgPSAyLAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRmxhZy5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRmxhZy5haWRsCmluZGV4IDU4YjQ5M2IuLmFjZjRlNmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0ZsYWcuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9GbGFnLmFpZGwKQEAgLTM0LDQgKzM0LDcgQEAKICAgICBNVVRFX0hBUFRJQyA9IDExLAogICAgIE5PX1NZU1RFTV9DQVBUVVJFID0gMTIsCiAgICAgQ0FQVFVSRV9QUklWQVRFID0gMTMsCisgICAgQ09OVEVOVF9TUEFUSUFMSVpFRCA9IDE0LAorICAgIE5FVkVSX1NQQVRJQUxJWkUgPSAxNSwKKyAgICBDQUxMX1JFRElSRUNUSU9OID0gMTYsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OGIyOTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9HYWluIHsKLSAgICBpbnQgaW5kZXg7Ci0gICAgYm9vbGVhbiB1c2VJbkNoYW5uZWxNYXNrOwotICAgIGJvb2xlYW4gdXNlRm9yVm9sdW1lOwotICAgIC8qKiBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvR2Fpbk1vZGUuICovCi0gICAgaW50IG1vZGU7Ci0gICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2NoYW5uZWxfbWFza190LiAqLwotICAgIGludCBjaGFubmVsTWFzazsKLSAgICBpbnQgbWluVmFsdWU7Ci0gICAgaW50IG1heFZhbHVlOwotICAgIGludCBkZWZhdWx0VmFsdWU7Ci0gICAgaW50IHN0ZXBWYWx1ZTsKLSAgICBpbnQgbWluUmFtcE1zOwotICAgIGludCBtYXhSYW1wTXM7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluQ29uZmlnLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluQ29uZmlnLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5M2MyZGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2FpbkNvbmZpZy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9HYWluQ29uZmlnIHsKLSAgICAvKiogSW5kZXggb2YgdGhlIGNvcnJlc3BvbmRpbmcgYXVkaW9fZ2FpbiBpbiB0aGUgYXVkaW9fcG9ydCBnYWluc1tdIHRhYmxlLiAqLwotICAgIGludCBpbmRleDsKLQotICAgIC8qKiBNb2RlIHJlcXVlc3RlZCBmb3IgdGhpcyBjb21tYW5kLiBCaXRmaWVsZCBpbmRleGVkIGJ5IEF1ZGlvR2Fpbk1vZGUuICovCi0gICAgaW50IG1vZGU7Ci0KLSAgICAvKioKLSAgICAgKiBDaGFubmVscyB3aGljaCBnYWluIHZhbHVlIGZvbGxvd3MuIE4vQSBpbiBqb2ludCBtb2RlLgotICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX2NoYW5uZWxfbWFza190LgotICAgICAqLwotICAgIGludCBjaGFubmVsTWFzazsKLQotICAgIC8qKgotICAgICAqIEdhaW4gdmFsdWVzIGluIG1pbGxpYmVscy4KLSAgICAgKiBGb3IgZWFjaCBjaGFubmVsIG9yZGVyZWQgZnJvbSBMU2IgdG8gTVNiIGluIGNoYW5uZWwgbWFzay4gVGhlIG51bWJlciBvZiB2YWx1ZXMgaXMgMSBpbiBqb2ludAotICAgICAqIG1vZGUsIG90aGVyd2lzZSBlcXVhbHMgdGhlIG51bWJlciBvZiBiaXRzIGltcGxpZWQgYnkgY2hhbm5lbE1hc2suCi0gICAgICovCi0gICAgaW50W10gIHZhbHVlczsKLQotICAgIC8qKiBSYW1wIGR1cmF0aW9uIGluIG1zLiAqLwotICAgIGludCByYW1wRHVyYXRpb25NczsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5Nb2RlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluTW9kZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWI5ZjBiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5Nb2RlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvR2Fpbk1vZGUgewotICAgIEpPSU5UICAgID0gMCwKLSAgICBDSEFOTkVMUyA9IDEsCi0gICAgUkFNUCAgICAgPSAyLAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5TeXMuYWlkbApzaW1pbGFyaXR5IGluZGV4IDgxJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluU3lzLmFpZGwKaW5kZXggOWUwNGU4Mi4uNDI2ZjRlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluU3lzLmFpZGwKQEAgLTEzLDE0ICsxMywxNSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKwogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCiAvKioKKyAqIFByb3ZpZGVzIGFkZGl0aW9uYWwgcnVudGltZSBpbmZvcm1hdGlvbiBmb3IgQXVkaW9HYWluLCB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsuCisgKgogICoge0BoaWRlfQogICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlIHsKLSAgICAgTk9ORSA9IDAsCi0gICAgIEVMRU1FTlRBUllfU1RSRUFNID0gMSwKLSAgICAgSEFORExFID0gMiwKK3BhcmNlbGFibGUgQXVkaW9HYWluU3lzIHsKKyAgICBpbnQgaW5kZXg7CisgICAgYm9vbGVhbiBpc0lucHV0OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW5wdXRGbGFncy5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW5wdXRGbGFncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmMwZWIwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lucHV0RmxhZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9JbnB1dEZsYWdzIHsKLSAgICBGQVNUICAgICAgID0gMCwKLSAgICBIV19IT1RXT1JEID0gMSwKLSAgICBSQVcgICAgICAgID0gMiwKLSAgICBTWU5DICAgICAgID0gMywKLSAgICBNTUFQX05PSVJRID0gNCwKLSAgICBWT0lQX1RYICAgID0gNSwKLSAgICBIV19BVl9TWU5DID0gNiwKLSAgICBESVJFQ1QgICAgID0gNywKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmFpZGwKaW5kZXggODc2ZWY5Yi4uYjAxZjkwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmFpZGwKQEAgLTE3LDcgKzE3LDggQEAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9QYXRjaDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NoYW5uZWxMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXREZXNjcmlwdGlvbjsKIAogLyoqCiAgKiB7QGhpZGV9CkBAIC0yNiwxMCArMjcsMTAgQEAKICAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9faW9faGFuZGxlX3QuICovCiAgICAgaW50IGlvSGFuZGxlOwogICAgIEF1ZGlvUGF0Y2ggcGF0Y2g7CisgICAgYm9vbGVhbiBpc0lucHV0OwogICAgIGludCBzYW1wbGluZ1JhdGU7Ci0gICAgQXVkaW9Gb3JtYXQgZm9ybWF0OwotICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19jaGFubmVsX21hc2tfdC4gKi8KLSAgICBpbnQgY2hhbm5lbE1hc2s7CisgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBmb3JtYXQ7CisgICAgQXVkaW9DaGFubmVsTGF5b3V0IGNoYW5uZWxNYXNrOwogICAgIGxvbmcgZnJhbWVDb3VudDsKICAgICBsb25nIGZyYW1lQ291bnRIQUw7CiAgICAgLyoqIE9ubHkgdmFsaWQgZm9yIG91dHB1dC4gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRmxhZ3MuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRmxhZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliMjViZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Jb0ZsYWdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotdW5pb24gQXVkaW9Jb0ZsYWdzIHsKLSAgICAvKiogQml0bWFzayBpbmRleGVkIGJ5IEF1ZGlvSW5wdXRGbGFncy4gKi8KLSAgICBpbnQgaW5wdXQ7Ci0gICAgLyoqIEJpdG1hc2sgaW5kZXhlZCBieSBBdWRpb091dHB1dEZsYWdzLiAqLwotICAgIGludCBvdXRwdXQ7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXguYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peC5haWRsCmluZGV4IDc0NzMzNzIuLjg4YjA0NTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peC5haWRsCkBAIC0xNiwxMiArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbmZpZzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NaXhDYWxsYmFja0ZsYWc7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01peE1hdGNoQ3JpdGVyaW9uOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NaXhSb3V0ZUZsYWc7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01peFR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Db25maWc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9EZXZpY2U7CiAKIC8qKgogICoge0BoaWRlfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4TGF0ZW5jeUNsYXNzLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhMYXRlbmN5Q2xhc3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcwYjM2NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhMYXRlbmN5Q2xhc3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9NaXhMYXRlbmN5Q2xhc3MgewotICAgIExPVyA9IDAsCi0gICAgTk9STUFMID0gMSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peE1hdGNoQ3JpdGVyaW9uVmFsdWUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peE1hdGNoQ3JpdGVyaW9uVmFsdWUuYWlkbAppbmRleCBlMjZhOWUxLi45MjFhOTNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhNYXRjaENyaXRlcmlvblZhbHVlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb25WYWx1ZS5haWRsCkBAIC0xNiwxNSArMTYsMTUgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1NvdXJjZVR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1VzYWdlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvU291cmNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvVXNhZ2U7CiAKIC8qKgogICoge0BoaWRlfQogICovCiB1bmlvbiBBdWRpb01peE1hdGNoQ3JpdGVyaW9uVmFsdWUgewogICAgIEF1ZGlvVXNhZ2UgdXNhZ2UgPSBBdWRpb1VzYWdlLlVOS05PV047Ci0gICAgQXVkaW9Tb3VyY2VUeXBlIHNvdXJjZTsKKyAgICBBdWRpb1NvdXJjZSBzb3VyY2U7CiAgICAgLyoqIEludGVycHJldGVkIGFzIHVpZF90LiAqLwogICAgIGludCB1aWQ7CiAgICAgaW50IHVzZXJJZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01vZGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01vZGUuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2N2RkMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Nb2RlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvTW9kZSB7Ci0gICAgSU5WQUxJRCA9IC0yLAotICAgIENVUlJFTlQgPSAtMSwKLSAgICBOT1JNQUwgPSAwLAotICAgIFJJTkdUT05FID0gMSwKLSAgICBJTl9DQUxMID0gMiwKLSAgICBJTl9DT01NVU5JQ0FUSU9OID0gMywKLSAgICBDQUxMX1NDUkVFTiA9IDQsCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PZmZsb2FkSW5mby5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT2ZmbG9hZEluZm8uYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2YjNmMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PZmZsb2FkSW5mby5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWdCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9FbmNhcHN1bGF0aW9uTW9kZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU3RyZWFtVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVXNhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEF1ZGlvT2ZmbG9hZEluZm8gewotICAgIC8qKiBWZXJzaW9uIG9mIHRoZSBpbmZvIHN0cnVjdHVyZS4gSW50ZXJwcmV0ZWQgYXMgYSB1aW50MTZfdCB2ZXJzaW9uIGNvbnN0YW50LiAqLwotICAgIGludCB2ZXJzaW9uOwotICAgIC8qKiBBdWRpbyBjb25maWd1cmF0aW9uLiAqLwotICAgIEF1ZGlvQ29uZmlnQmFzZSBjb25maWc7Ci0gICAgLyoqIFN0cmVhbSB0eXBlLiAqLwotICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1UeXBlOwotICAgIC8qKiBCaXQgcmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuICovCi0gICAgaW50IGJpdFJhdGU7Ci0gICAgLyoqIER1cmF0aW9uIGluIG1pY3Jvc2Vjb25kcywgLTEgaWYgdW5rbm93bi4gKi8KLSAgICBsb25nIGR1cmF0aW9uVXM7Ci0gICAgLyoqIHRydWUgaWYgc3RyZWFtIGlzIHRpZWQgdG8gYSB2aWRlbyBzdHJlYW0uICovCi0gICAgYm9vbGVhbiBoYXNWaWRlbzsKLSAgICAvKiogdHJ1ZSBpZiBzdHJlYW1pbmcsIGZhbHNlIGlmIGxvY2FsIHBsYXliYWNrLiAqLwotICAgIGJvb2xlYW4gaXNTdHJlYW1pbmc7Ci0gICAgaW50IGJpdFdpZHRoOwotICAgIC8qKiBPZmZsb2FkIGZyYWdtZW50IHNpemUuICovCi0gICAgaW50IG9mZmxvYWRCdWZmZXJTaXplOwotICAgIEF1ZGlvVXNhZ2UgdXNhZ2U7Ci0gICAgQXVkaW9FbmNhcHN1bGF0aW9uTW9kZSBlbmNhcHN1bGF0aW9uTW9kZTsKLSAgICAvKiogQ29udGVudCBpZCBmcm9tIHR1bmVyIEhBTCAoMCBpZiBub25lKS4gKi8KLSAgICBpbnQgY29udGVudElkOwotICAgIC8qKiBTeW5jIGlkIGZyb20gdHVuZXIgSEFMICgwIGlmIG5vbmUpLiAqLwotICAgIGludCBzeW5jSWQ7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PdXRwdXRGbGFncy5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT3V0cHV0RmxhZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViZDhmMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PdXRwdXRGbGFncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb091dHB1dEZsYWdzIHsKLSAgICBESVJFQ1QgICAgICAgICAgID0gMCwKLSAgICBQUklNQVJZICAgICAgICAgID0gMSwKLSAgICBGQVNUICAgICAgICAgICAgID0gMiwKLSAgICBERUVQX0JVRkZFUiAgICAgID0gMywKLSAgICBDT01QUkVTU19PRkZMT0FEID0gNCwKLSAgICBOT05fQkxPQ0tJTkcgICAgID0gNSwKLSAgICBIV19BVl9TWU5DICAgICAgID0gNiwKLSAgICBUVFMgICAgICAgICAgICAgID0gNywKLSAgICBSQVcgICAgICAgICAgICAgID0gOCwKLSAgICBTWU5DICAgICAgICAgICAgID0gOSwKLSAgICBJRUM5NThfTk9OQVVESU8gID0gMTAsCi0gICAgRElSRUNUX1BDTSAgICAgICA9IDExLAotICAgIE1NQVBfTk9JUlEgICAgICAgPSAxMiwKLSAgICBWT0lQX1JYICAgICAgICAgID0gMTMsCi0gICAgSU5DQUxMX01VU0lDICAgICA9IDE0LAotICAgIEdBUExFU1NfT0ZGTE9BRCAgPSAxNSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnQuYWlkbAppbmRleCBiZjBlNWI3Li5mZjE3N2MwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0LmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydC5haWRsCkBAIC0xNiwzNSArMTYsMTMgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0dhaW47Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRFeHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRSb2xlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0VHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUHJvZmlsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkV4dHJhQXVkaW9EZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0U3lzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvUG9ydDsKIAogLyoqCiAgKiB7QGhpZGV9CiAgKi8KIHBhcmNlbGFibGUgQXVkaW9Qb3J0IHsKLSAgICAvKiogUG9ydCB1bmlxdWUgSUQuIEludGVycHJldGVkIGFzIGF1ZGlvX3BvcnRfaGFuZGxlX3QuICovCi0gICAgaW50IGlkOwotICAgIC8qKiBTaW5rIG9yIHNvdXJjZS4gKi8KLSAgICBBdWRpb1BvcnRSb2xlIHJvbGU7Ci0gICAgLyoqIERldmljZSwgbWl4IC4uLiAqLwotICAgIEF1ZGlvUG9ydFR5cGUgdHlwZTsKLSAgICBAdXRmOEluQ3BwIFN0cmluZyBuYW1lOwotICAgIC8qKiBBdWRpb1Byb2ZpbGVzIHN1cHBvcnRlZCBieSB0aGlzIHBvcnQgKGZvcm1hdCwgUmF0ZXMsIENoYW5uZWxzKS4gKi8KLSAgICBBdWRpb1Byb2ZpbGVbXSBwcm9maWxlczsKLSAgICAvKioKLSAgICAgKiBFeHRyYUF1ZGlvRGVzY3JpcHRvcnMgc3VwcG9ydGVkIGJ5IHRoaXMgcG9ydC4gVGhlIGZvcm1hdCBpcyBub3QgdW5yZWNvZ25pemVkIHRvIHRoZQotICAgICAqIHBsYXRmb3JtLiBUaGUgYXVkaW8gY2FwYWJpbGl0eSBpcyBkZXNjcmliZWQgYnkgYSBoYXJkd2FyZSBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIEV4dHJhQXVkaW9EZXNjcmlwdG9yW10gZXh0cmFBdWRpb0Rlc2NyaXB0b3JzOwotICAgIC8qKiBHYWluIGNvbnRyb2xsZXJzLiAqLwotICAgIEF1ZGlvR2FpbltdIGdhaW5zOwotICAgIC8qKiBDdXJyZW50IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4gKi8KLSAgICBBdWRpb1BvcnRDb25maWcgYWN0aXZlQ29uZmlnOwotICAgIEF1ZGlvUG9ydEV4dCBleHQ7CisgICAgQXVkaW9Qb3J0IGhhbDsKKyAgICBBdWRpb1BvcnRTeXMgc3lzOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZy5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZy5haWRsCmluZGV4IDJkZDMwYTQuLjNhNGNhMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWcuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnLmFpZGwKQEAgLTE2LDQ0ICsxNiwxMyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvR2FpbkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvSW9GbGFnczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZ0V4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZ1R5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRSb2xlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0VHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZ1N5czsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1BvcnRDb25maWc7CiAKIC8qKgogICoge0BoaWRlfQogICovCiBwYXJjZWxhYmxlIEF1ZGlvUG9ydENvbmZpZyB7Ci0gICAgLyoqCi0gICAgICogUG9ydCB1bmlxdWUgSUQuCi0gICAgICogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fcG9ydF9oYW5kbGVfdC4KLSAgICAgKi8KLSAgICBpbnQgaWQ7Ci0gICAgLyoqIFNpbmsgb3Igc291cmNlLiAqLwotICAgIEF1ZGlvUG9ydFJvbGUgcm9sZTsKLSAgICAvKiogRGV2aWNlLCBtaXggLi4uICovCi0gICAgQXVkaW9Qb3J0VHlwZSB0eXBlOwotICAgIC8qKiBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvUG9ydENvbmZpZ1R5cGUuICovCi0gICAgaW50IGNvbmZpZ01hc2s7Ci0gICAgLyoqIFNhbXBsaW5nIHJhdGUgaW4gSHouICovCi0gICAgaW50IHNhbXBsZVJhdGU7Ci0gICAgLyoqCi0gICAgICogQ2hhbm5lbCBtYXNrLCBpZiBhcHBsaWNhYmxlLgotICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX2NoYW5uZWxfbWFza190LgotICAgICAqIFRPRE86IGJpdG1hc2s/Ci0gICAgICovCi0gICAgaW50IGNoYW5uZWxNYXNrOwotICAgIC8qKgotICAgICAqIEZvcm1hdCwgaWYgYXBwbGljYWJsZS4KLSAgICAgKi8KLSAgICBBdWRpb0Zvcm1hdCBmb3JtYXQ7Ci0gICAgLyoqIEdhaW4gdG8gYXBwbHksIGlmIGFwcGxpY2FibGUuICovCi0gICAgQXVkaW9HYWluQ29uZmlnIGdhaW47Ci0gICAgLyoqIEZyYW1ld29yayBvbmx5OiBIV19BVl9TWU5DLCBESVJFQ1QsIC4uLiAqLwotICAgIEF1ZGlvSW9GbGFncyBmbGFnczsKLSAgICBBdWRpb1BvcnRDb25maWdFeHQgZXh0OworICAgIEF1ZGlvUG9ydENvbmZpZyBoYWw7CisgICAgQXVkaW9Qb3J0Q29uZmlnU3lzIHN5czsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5YWE5Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBBdWRpb1BvcnRDb25maWdEZXZpY2VFeHQgewotICAgIC8qKgotICAgICAqIE1vZHVsZSB0aGUgZGV2aWNlIGlzIGF0dGFjaGVkIHRvLgotICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX21vZHVsZV9oYW5kbGVfdC4KLSAgICAgKi8KLSAgICBpbnQgaHdNb2R1bGU7Ci0gICAgLyoqCi0gICAgICogRGV2aWNlIHR5cGUgKGUuZyBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpLgotICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX2RldmljZXNfdC4KLSAgICAgKiBUT0RPOiBDb252ZXJ0IHRvIGEgc3RhbmRhbG9uZSBBSURMIHJlcHJlc2VudGF0aW9uLgotICAgICAqLwotICAgIGludCB0eXBlOwotICAgIC8qKiBEZXZpY2UgYWRkcmVzcy4gIiIgaWYgTi9BLiAqLwotICAgIEB1dGY4SW5DcHAgU3RyaW5nIGFkZHJlc3M7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRXh0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRXh0LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNjM1YjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ0V4dC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnTWl4RXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dDsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIEF1ZGlvUG9ydENvbmZpZ0V4dCB7Ci0gICAgLyoqCi0gICAgICogVGhpcyByZXByZXNlbnRzIGFuIGVtcHR5IHVuaW9uLiBWYWx1ZSBpcyBpZ25vcmVkLgotICAgICAqIFRPRE8oeXRhaSk6IHJlcGxhY2Ugd2l0aCB0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIGZvciBhbiBlbXB0eSB1bmlvbiwgYXMgc29vbiBhcyBpdCBpcwotICAgICAqICAgICAgICAgICAgIGVzdGFibGlzaGVkLgotICAgICAqLwotICAgIGJvb2xlYW4gdW5zcGVjaWZpZWQ7Ci0gICAgLyoqIERldmljZSBzcGVjaWZpYyBpbmZvLiAqLwotICAgIEF1ZGlvUG9ydENvbmZpZ0RldmljZUV4dCBkZXZpY2U7Ci0gICAgLyoqIE1peCBzcGVjaWZpYyBpbmZvLiAqLwotICAgIEF1ZGlvUG9ydENvbmZpZ01peEV4dCBtaXg7Ci0gICAgLyoqIFNlc3Npb24gc3BlY2lmaWMgaW5mby4gKi8KLSAgICBBdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0IHNlc3Npb247Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnTWl4RXh0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnTWl4RXh0LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMjI2ZjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ01peEV4dC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9Qb3J0Q29uZmlnTWl4RXh0IHsKLSAgICAvKioKLSAgICAgKiBNb2R1bGUgdGhlIHN0cmVhbSBpcyBhdHRhY2hlZCB0by4KLSAgICAgKiBJbnRlcnByZXRlZCBhcyBhdWRpb19tb2R1bGVfaGFuZGxlX3QuCi0gICAgICovCi0gICAgaW50IGh3TW9kdWxlOwotICAgIC8qKgotICAgICAqIEkvTyBoYW5kbGUgb2YgdGhlIGlucHV0L291dHB1dCBzdHJlYW0uCi0gICAgICogSW50ZXJwcmV0ZWQgYXMgYXVkaW9faW9faGFuZGxlX3QuCi0gICAgICovCi0gICAgaW50IGhhbmRsZTsKLSAgICBBdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlIHVzZWNhc2U7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxZjA0NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Tb3VyY2VUeXBlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotdW5pb24gQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZSB7Ci0gICAgLyoqCi0gICAgICogVGhpcyB0byBiZSBzZXQgaWYgdGhlIGNvbnRhaW5pbmcgY29uZmlnIGhhcyB0aGUgQXVkaW9Qb3J0Um9sZTo6Tk9ORSByb2xlLgotICAgICAqIFRoaXMgcmVwcmVzZW50cyBhbiBlbXB0eSB2YWx1ZSAodmFsdWUgaXMgaWdub3JlZCkuCi0gICAgICogVE9ETyh5dGFpKTogcmVwbGFjZSB3aXRoIHRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gZm9yIGFuIGVtcHR5IHVuaW9uLCBhcyBzb29uIGFzIGl0IGlzCi0gICAgICogICAgICAgICAgICAgZXN0YWJsaXNoZWQuCi0gICAgICovCi0gICAgYm9vbGVhbiB1bnNwZWNpZmllZDsKLSAgICAvKiogVGhpcyB0byBiZSBzZXQgaWYgdGhlIGNvbnRhaW5pbmcgY29uZmlnIGhhcyB0aGUgQXVkaW9Qb3J0Um9sZTo6U09VUkNFIHJvbGUuICovCi0gICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbTsKLSAgICAvKiogVGhpcyB0byBiZSBzZXQgaWYgdGhlIGNvbnRhaW5pbmcgY29uZmlnIGhhcyB0aGUgQXVkaW9Qb3J0Um9sZTo6U0lOSyByb2xlLiAqLwotICAgIEF1ZGlvU291cmNlVHlwZSBzb3VyY2U7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSW50LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnU3lzLmFpZGwKc2ltaWxhcml0eSBpbmRleCA3MSUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0ludC5haWRsCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnU3lzLmFpZGwKaW5kZXggMjRmNGQ2Mi4uODY5Mjg0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0ludC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdTeXMuYWlkbApAQCAtMTYsMTIgKzE2LDE3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAoraW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0RXh0U3lzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Um9sZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFR5cGU7CisKIC8qKgotICogVGhpcyBpcyBhIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCBhbiAnaW50JywgcHV0dGluZyBpdCBpbiBhIHBhcmNlbGFibGUsIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGFuCi0gKiBpbm91dCBwYXJhbWV0ZXIsIGJlIG1hZGUgQG51bGxhYmxlLCBldGMuCi0gKgogICoge0BoaWRlfQogICovCi1wYXJjZWxhYmxlIEludCB7Ci0gICAgaW50IHZhbHVlOworcGFyY2VsYWJsZSBBdWRpb1BvcnRDb25maWdTeXMgeworICAgIC8qKiBTaW5rIG9yIHNvdXJjZS4gKi8KKyAgICBBdWRpb1BvcnRSb2xlIHJvbGU7CisgICAgLyoqIERldmljZSwgbWl4IC4uLiAqLworICAgIEF1ZGlvUG9ydFR5cGUgdHlwZTsKKyAgICBBdWRpb1BvcnRFeHRTeXMgZXh0OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1R5cGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdUeXBlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMjJiOGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1R5cGUuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9Qb3J0Q29uZmlnVHlwZSB7Ci0gICAgU0FNUExFX1JBVEUgID0gMCwKLSAgICBDSEFOTkVMX01BU0sgPSAxLAotICAgIEZPUk1BVCAgICAgICA9IDIsCi0gICAgR0FJTiAgICAgICAgID0gMywKLSAgICBGTEFHUyAgICAgICAgPSA0LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydERldmljZUV4dC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydERldmljZUV4dFN5cy5haWRsCnNpbWlsYXJpdHkgaW5kZXggODUlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnREZXZpY2VFeHQuYWlkbApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydERldmljZUV4dFN5cy5haWRsCmluZGV4IGI3NThmMjMuLjBmNWE5YjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnREZXZpY2VFeHQuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RGV2aWNlRXh0U3lzLmFpZGwKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiwxNSArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0RldmljZTsKLQogLyoqCiAgKiB7QGhpZGV9CiAgKi8KLXBhcmNlbGFibGUgQXVkaW9Qb3J0RGV2aWNlRXh0IHsKK3BhcmNlbGFibGUgQXVkaW9Qb3J0RGV2aWNlRXh0U3lzIHsKICAgICAvKiogTW9kdWxlIHRoZSBkZXZpY2UgaXMgYXR0YWNoZWQgdG8uIEludGVycHJldGVkIGFzIGF1ZGlvX21vZHVsZV9oYW5kbGVfdC4gKi8KICAgICBpbnQgaHdNb2R1bGU7Ci0gICAgQXVkaW9EZXZpY2UgZGV2aWNlOwogICAgIC8qKiBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuICovCiAgICAgaW50IGVuY2Fwc3VsYXRpb25Nb2RlczsKICAgICAvKiogQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUuICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RXh0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RXh0LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1Mzc4NGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0RGV2aWNlRXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0TWl4RXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0U2Vzc2lvbkV4dDsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIEF1ZGlvUG9ydEV4dCB7Ci0gICAgLyoqCi0gICAgICogVGhpcyByZXByZXNlbnRzIGFuIGVtcHR5IHVuaW9uLiBWYWx1ZSBpcyBpZ25vcmVkLgotICAgICAqIFRPRE8oeXRhaSk6IHJlcGxhY2Ugd2l0aCB0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIGZvciBhbiBlbXB0eSB1bmlvbiwgYXMgc29vbiBhcyBpdCBpcwotICAgICAqICAgICAgICAgICAgIGVzdGFibGlzaGVkLgotICAgICAqLwotICAgIGJvb2xlYW4gdW5zcGVjaWZpZWQ7Ci0gICAgLyoqIERldmljZSBzcGVjaWZpYyBpbmZvLiAqLwotICAgIEF1ZGlvUG9ydERldmljZUV4dCBkZXZpY2U7Ci0gICAgLyoqIE1peCBzcGVjaWZpYyBpbmZvLiAqLwotICAgIEF1ZGlvUG9ydE1peEV4dCBtaXg7Ci0gICAgLyoqIFNlc3Npb24gc3BlY2lmaWMgaW5mby4gKi8KLSAgICBBdWRpb1BvcnRTZXNzaW9uRXh0IHNlc3Npb247Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dFN5cy5haWRsCnNpbWlsYXJpdHkgaW5kZXggNjIlCmNvcHkgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsCmNvcHkgdG8gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dFN5cy5haWRsCmluZGV4IGIwOGE2MDQuLjJjZGY0ZjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dFN5cy5haWRsCkBAIC0xNiwxNCArMTYsMTkgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnREZXZpY2VFeHRTeXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRNaXhFeHRTeXM7CisKIC8qKgotICogQXVkaW8gZW5jYXBzdWxhdGlvbiB0eXBlIGlzIHVzZWQgdG8gZGVzY3JpYmUgaWYgdGhlIGF1ZGlvIGRhdGEgc2hvdWxkIGJlIHNlbnQgd2l0aCBhIHBhcnRpY3VsYXIKLSAqIGVuY2Fwc3VsYXRpb24gdHlwZSBvciBub3QuCi0gKgogICoge0BoaWRlfQogICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb0VuY2Fwc3VsYXRpb25UeXBlIHsKLSAgICBOT05FICAgICA9IDAsCi0gICAgSUVDNjE5MzcgPSAxLAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK3VuaW9uIEF1ZGlvUG9ydEV4dFN5cyB7CisgICAgLyoqCisgICAgICogVGhpcyByZXByZXNlbnRzIGFuIGVtcHR5IHVuaW9uLiBWYWx1ZSBpcyBpZ25vcmVkLgorICAgICAqLworICAgIGJvb2xlYW4gdW5zcGVjaWZpZWQ7CisgICAgLyoqIFN5c3RlbS1vbmx5IHBhcmFtZXRlcnMgd2hlbiB0aGUgcG9ydCBpcyBhbiBhdWRpbyBkZXZpY2UuICovCisgICAgQXVkaW9Qb3J0RGV2aWNlRXh0U3lzIGRldmljZTsKKyAgICAvKiogU3lzdGVtLW9ubHkgcGFyYW1ldGVycyB3aGVuIHRoZSBwb3J0IGlzIGFuIGF1ZGlvIG1peC4gKi8KKyAgICBBdWRpb1BvcnRNaXhFeHRTeXMgbWl4OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydE1peEV4dC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydE1peEV4dC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmNkYjhlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRNaXhFeHQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWl4TGF0ZW5jeUNsYXNzOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBBdWRpb1BvcnRNaXhFeHQgewotICAgIC8qKiBNb2R1bGUgdGhlIHN0cmVhbSBpcyBhdHRhY2hlZCB0by4gSW50ZXJwcmV0ZWQgYXMgYXVkaW9fbW9kdWxlX2hhbmRsZV90LiAqLwotICAgIGludCBod01vZHVsZTsKLSAgICAvKiogSS9PIGhhbmRsZSBvZiB0aGUgaW5wdXQvb3V0cHV0IHN0cmVhbS4gSW50ZXJwcmV0ZWQgYXMgYXVkaW9faW9faGFuZGxlX3QuICovCi0gICAgaW50IGhhbmRsZTsKLSAgICAvKiogTGF0ZW5jeSBjbGFzcyAqLwotICAgIEF1ZGlvTWl4TGF0ZW5jeUNsYXNzIGxhdGVuY3lDbGFzczsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0YW5kYXJkLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0TWl4RXh0U3lzLmFpZGwKc2ltaWxhcml0eSBpbmRleCA4MSUKY29weSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0YW5kYXJkLmFpZGwKY29weSB0byBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0TWl4RXh0U3lzLmFpZGwKaW5kZXggZTEzMWQwZC4uNTk5OTg4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU3RhbmRhcmQuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0TWl4RXh0U3lzLmFpZGwKQEAgLTEzLDE1ICsxMywxMyBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKwogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCiAvKioKLSAqIFRoZSBhdWRpbyBzdGFuZGFyZCB0aGF0IGRlc2NyaWJlIGF1ZGlvIHBsYXliYWNrL2NhcHR1cmUgY2FwYWJpbGl0ZXMuCi0gKgogICoge0BoaWRlfQogICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb1N0YW5kYXJkIHsKLSAgICBOT05FID0gMCwKLSAgICBFRElEID0gMSwKK3BhcmNlbGFibGUgQXVkaW9Qb3J0TWl4RXh0U3lzIHsKKyAgICAvKiogTW9kdWxlIHRoZSBzdHJlYW0gaXMgYXR0YWNoZWQgdG8uIEludGVycHJldGVkIGFzIGF1ZGlvX21vZHVsZV9oYW5kbGVfdC4gKi8KKyAgICBpbnQgaHdNb2R1bGU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0U2Vzc2lvbkV4dC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFNlc3Npb25FeHQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjYTE2OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0U2Vzc2lvbkV4dC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9Qb3J0U2Vzc2lvbkV4dCB7Ci0gICAgLyoqIEF1ZGlvIHNlc3Npb24uIEludGVycHJldGVkIGFzIGF1ZGlvX3Nlc3Npb25fdC4gKi8KLSAgICBpbnQgc2Vzc2lvbjsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRTeXMuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRTeXMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2I1YzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFN5cy5haWRsCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvR2FpblN5czsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydEV4dFN5czsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFJvbGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRUeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qcm9maWxlU3lzOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb1BvcnRTeXMgeworICAgIC8qKiBTaW5rIG9yIHNvdXJjZS4gKi8KKyAgICBBdWRpb1BvcnRSb2xlIHJvbGU7CisgICAgLyoqIERldmljZSwgbWl4IC4uLiAqLworICAgIEF1ZGlvUG9ydFR5cGUgdHlwZTsKKyAgICAvKiogU3lzdGVtLW9ubHkgcGFyYW1ldGVycyBmb3IgZWFjaCBBdWRpb1Byb2ZpbGUgZnJvbSAncG9ydC5wcm9maWxlcycuICovCisgICAgQXVkaW9Qcm9maWxlU3lzW10gcHJvZmlsZXM7CisgICAgLyoqIFN5c3RlbS1vbmx5IHBhcmFtZXRlcnMgZm9yIGVhY2ggQXVkaW9HYWluIGZyb20gJ3BvcnQuZ2FpbnMnLiAqLworICAgIEF1ZGlvR2FpblN5c1tdIGdhaW5zOworICAgIC8qKiBDdXJyZW50IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4gKi8KKyAgICBBdWRpb1BvcnRDb25maWcgYWN0aXZlQ29uZmlnOworICAgIC8qKiBTeXN0ZW0tb25seSBleHRyYSBwYXJhbWV0ZXJzIGZvciAncG9ydC5leHQnLiAqLworICAgIEF1ZGlvUG9ydEV4dFN5cyBleHQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjI4OGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUHJvZmlsZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9FbmNhcHN1bGF0aW9uVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9Qcm9maWxlIHsKLSAgICBAdXRmOEluQ3BwIFN0cmluZyBuYW1lOwotICAgIC8qKiBUaGUgZm9ybWF0IGZvciBhbiBhdWRpbyBwcm9maWxlIHNob3VsZCBvbmx5IGJlIHNldCB3aGVuIGluaXRpYWxpemVkLiAqLwotICAgIEF1ZGlvRm9ybWF0IGZvcm1hdDsKLSAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fY2hhbm5lbF9tYXNrX3QuICovCi0gICAgaW50W10gY2hhbm5lbE1hc2tzOwotICAgIGludFtdIHNhbXBsaW5nUmF0ZXM7Ci0gICAgYm9vbGVhbiBpc0R5bmFtaWNGb3JtYXQ7Ci0gICAgYm9vbGVhbiBpc0R5bmFtaWNDaGFubmVsczsKLSAgICBib29sZWFuIGlzRHluYW1pY1JhdGU7Ci0gICAgQXVkaW9FbmNhcHN1bGF0aW9uVHlwZSBlbmNhcHN1bGF0aW9uVHlwZTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlU3lzLmFpZGwKc2ltaWxhcml0eSBpbmRleCA2OCUKY29weSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwKY29weSB0byBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlU3lzLmFpZGwKaW5kZXggOWUwNGU4Mi4uMzI5YzlkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlU3lzLmFpZGwKQEAgLTEzLDE0ICsxMywxOCBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKwogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCiAvKioKKyAqIFByb3ZpZGVzIGluZGljYXRpb24gd2hldGhlciB0aGUgcGFyYW1ldGVycyBvZiB0aGUgQXVkaW9Qcm9maWxlcyBpbiB0aGUKKyAqIEF1ZGlvUG9ydCBhcmUgZHluYW1pYy4gRWFjaCBpbnN0YW5jZSBvZiBBdWRpb1Byb2ZpbGVTeXMgY29ycmVzcG9uZHMKKyAqIHRvIGFuIGluc3RhbmNlIG9mIEF1ZGlvUHJvZmlsZS4KKyAqCiAgKiB7QGhpZGV9CiAgKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUgewotICAgICBOT05FID0gMCwKLSAgICAgRUxFTUVOVEFSWV9TVFJFQU0gPSAxLAotICAgICBIQU5ETEUgPSAyLAorcGFyY2VsYWJsZSBBdWRpb1Byb2ZpbGVTeXMgeworICAgIGJvb2xlYW4gaXNEeW5hbWljRm9ybWF0OworICAgIGJvb2xlYW4gaXNEeW5hbWljQ2hhbm5lbHM7CisgICAgYm9vbGVhbiBpc0R5bmFtaWNSYXRlOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU291cmNlVHlwZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU291cmNlVHlwZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjczYjkyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1NvdXJjZVR5cGUuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9Tb3VyY2VUeXBlIHsKLSAgICBJTlZBTElEID0gLTEsCi0gICAgREVGQVVMVCA9IDAsCi0gICAgTUlDID0gMSwKLSAgICBWT0lDRV9VUExJTksgPSAyLAotICAgIFZPSUNFX0RPV05MSU5LID0gMywKLSAgICBWT0lDRV9DQUxMID0gNCwKLSAgICBDQU1DT1JERVIgPSA1LAotICAgIFZPSUNFX1JFQ09HTklUSU9OID0gNiwKLSAgICBWT0lDRV9DT01NVU5JQ0FUSU9OID0gNywKLSAgICBSRU1PVEVfU1VCTUlYID0gOCwKLSAgICBVTlBST0NFU1NFRCA9IDksCi0gICAgVk9JQ0VfUEVSRk9STUFOQ0UgPSAxMCwKLSAgICBFQ0hPX1JFRkVSRU5DRSA9IDE5OTcsCi0gICAgRk1fVFVORVIgPSAxOTk4LAotICAgIC8qKgotICAgICAqIEEgbG93LXByaW9yaXR5LCBwcmVlbXB0aWJsZSBhdWRpbyBzb3VyY2UgZm9yIGZvciBiYWNrZ3JvdW5kIHNvZnR3YXJlCi0gICAgICogaG90d29yZCBkZXRlY3Rpb24uIFNhbWUgdHVuaW5nIGFzIFZPSUNFX1JFQ09HTklUSU9OLgotICAgICAqIFVzZWQgb25seSBpbnRlcm5hbGx5IGJ5IHRoZSBmcmFtZXdvcmsuCi0gICAgICovCi0gICAgSE9UV09SRCA9IDE5OTksCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9TdHJlYW1UeXBlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9TdHJlYW1UeXBlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Nzc4ODIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU3RyZWFtVHlwZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICoge0BoaWRlfQotICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb1N0cmVhbVR5cGUgewotICAgIERFRkFVTFQgPSAtMSwKLSAgICBWT0lDRV9DQUxMID0gMCwKLSAgICBTWVNURU0gPSAxLAotICAgIFJJTkcgPSAyLAotICAgIE1VU0lDID0gMywKLSAgICBBTEFSTSA9IDQsCi0gICAgTk9USUZJQ0FUSU9OID0gNSwKLSAgICBCTFVFVE9PVEhfU0NPID0gNiwKLSAgICBFTkZPUkNFRF9BVURJQkxFID0gNywKLSAgICBEVE1GID0gOCwKLSAgICBUVFMgPSA5LAotICAgIEFDQ0VTU0lCSUxJVFkgPSAxMCwKLSAgICBBU1NJU1RBTlQgPSAxMSwKLSAgICAvKiogRm9yIGR5bmFtaWMgcG9saWN5IG91dHB1dCBtaXhlcy4gT25seSB1c2VkIGJ5IHRoZSBhdWRpbyBwb2xpY3kgKi8KLSAgICBSRVJPVVRJTkcgPSAxMiwKLSAgICAvKiogRm9yIGF1ZGlvIGZsaW5nZXIgdHJhY2tzIHZvbHVtZS4gT25seSB1c2VkIGJ5IHRoZSBhdWRpb2ZsaW5nZXIgKi8KLSAgICBQQVRDSCA9IDEzLAotICAgIC8qKiBzdHJlYW0gZm9yIGNvcnJlc3BvbmRpbmcgdG8gQVVESU9fVVNBR0VfQ0FMTF9BU1NJU1RBTlQgKi8KLSAgICBDQUxMX0FTU0lTVEFOVCA9IDE0LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVXNhZ2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1VzYWdlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YzVjMzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVXNhZ2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9Vc2FnZSB7Ci0gICAgVU5LTk9XTiA9IDAsCi0gICAgTUVESUEgPSAxLAotICAgIFZPSUNFX0NPTU1VTklDQVRJT04gPSAyLAotICAgIFZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORyA9IDMsCi0gICAgQUxBUk0gPSA0LAotICAgIE5PVElGSUNBVElPTiA9IDUsCi0gICAgTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSA9IDYsCi0gICAgTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCA9IDcsCi0gICAgTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCA9IDgsCi0gICAgTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCA9IDksCi0gICAgTk9USUZJQ0FUSU9OX0VWRU5UID0gMTAsCi0gICAgQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZID0gMTEsCi0gICAgQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFID0gMTIsCi0gICAgQVNTSVNUQU5DRV9TT05JRklDQVRJT04gPSAxMywKLSAgICBHQU1FID0gMTQsCi0gICAgVklSVFVBTF9TT1VSQ0UgPSAxNSwKLSAgICBBU1NJU1RBTlQgPSAxNiwKLSAgICBDQUxMX0FTU0lTVEFOVCA9IDE3LAotICAgIEVNRVJHRU5DWSA9IDEwMDAsCi0gICAgU0FGRVRZID0gMTAwMSwKLSAgICBWRUhJQ0xFX1NUQVRVUyA9IDEwMDIsCi0gICAgQU5OT1VOQ0VNRU5UID0gMTAwMywKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1V1aWQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1V1aWQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJhOTAzOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9VdWlkLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgQXVkaW9VdWlkIHsKLSAgICBpbnQgdGltZUxvdzsKLSAgICBpbnQgdGltZU1pZDsKLSAgICBpbnQgdGltZUhpQW5kVmVyc2lvbjsKLSAgICBpbnQgY2xvY2tTZXE7Ci0gICAgYnl0ZVtdIG5vZGU7ICAvLyBMZW5ndGggPSA2Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9WaWJyYXRvckluZm8uYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1ZpYnJhdG9ySW5mby5haWRsCmluZGV4IGY4OGZjM2MuLjg1MzhkOGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1ZpYnJhdG9ySW5mby5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1ZpYnJhdG9ySW5mby5haWRsCkBAIC0yNCw0ICsyNCw1IEBACiAgICAgaW50IGlkOwogICAgIGZsb2F0IHJlc29uYW50RnJlcXVlbmN5OwogICAgIGZsb2F0IHFGYWN0b3I7CisgICAgZmxvYXQgbWF4QW1wbGl0dWRlOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmFpZGwKaW5kZXggM2EyOWEwOC4uYjk1YTFkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5haWRsCkBAIC0xNyw3ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlc0ludGVybmFsOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvU3RyZWFtVHlwZTsKIAogLyoqCiAgKiB7QGhpZGV9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlRWZmZWN0UmVxdWVzdC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlcXVlc3QuYWlkbAppbmRleCAyZDI3NGY0Li5iY2NhMDRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlRWZmZWN0UmVxdWVzdC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXF1ZXN0LmFpZGwKQEAgLTE2LDEwICsxNiwxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuRWZmZWN0RGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLklFZmZlY3RDbGllbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9EZXZpY2U7CiAKIC8qKgogICogSW5wdXQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVFZmZlY3QoKSBtZXRob2QuCkBAIC0zNyw0ICszNyw2IEBACiAgICAgQXVkaW9EZXZpY2UgZGV2aWNlOwogICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2U7CiAgICAgYm9vbGVhbiBwcm9iZTsKKyAgICAvKiogdHJ1ZSBpZiBhIGNhbGxiYWNrIG11c3QgYmUgc2VudCBlYWNoIHRpbWUgYXVkaW8gZnJhbWVzIGFyZSBwcm9jZXNzZWQgKi8KKyAgICBib29sZWFuIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXNwb25zZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlc3BvbnNlLmFpZGwKaW5kZXggMGFhNjQwYS4uZTI3NTVkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlc3BvbnNlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlc3BvbnNlLmFpZGwKQEAgLTI5LDQgKzI5LDUgQEAKICAgICBib29sZWFuIGVuYWJsZWQ7CiAgICAgQG51bGxhYmxlIElFZmZlY3QgZWZmZWN0OwogICAgIEVmZmVjdERlc2NyaXB0b3IgZGVzYzsKKyAgICBib29sZWFuIGFscmVhZHlFeGlzdHM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlUmVjb3JkUmVxdWVzdC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVJlY29yZFJlcXVlc3QuYWlkbAppbmRleCA3ZTNjMjQwLi5iOTM4YTNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlUmVjb3JkUmVxdWVzdC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXF1ZXN0LmFpZGwKQEAgLTE4LDcgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWw7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NsaWVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnQmFzZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NvbmZpZ0Jhc2U7CiAKIC8qKgogICogQ3JlYXRlUmVjb3JkUmVxdWVzdCBjb250YWlucyBhbGwgaW5wdXQgYXJndW1lbnRzIHNlbnQgYnkgQXVkaW9SZWNvcmQgdG8gQXVkaW9GbGluZ2VyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlUmVjb3JkUmVzcG9uc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXNwb25zZS5haWRsCmluZGV4IGQ3OGIzZmMuLjdkMTU5ZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXNwb25zZS5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXNwb25zZS5haWRsCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLklBdWRpb1JlY29yZDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLlNoYXJlZEZpbGVSZWdpb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Db25maWdCYXNlOwogCiAvKioKICAqIENyZWF0ZVJlY29yZFJlc3BvbnNlIGNvbnRhaW5zIGFsbCBvdXRwdXQgYXJndW1lbnRzIHJldHVybmVkIGJ5IEF1ZGlvRmxpbmdlciB0byBBdWRpb1JlY29yZApAQCAtNDMsNCArNDQsNSBAQAogICAgIGludCBwb3J0SWQ7CiAgICAgLyoqIFRoZSBuZXdseSBjcmVhdGVkIHJlY29yZC4gKi8KICAgICBAbnVsbGFibGUgSUF1ZGlvUmVjb3JkIGF1ZGlvUmVjb3JkOworICAgIEF1ZGlvQ29uZmlnQmFzZSBzZXJ2ZXJDb25maWc7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlVHJhY2tSZXF1ZXN0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlVHJhY2tSZXF1ZXN0LmFpZGwKaW5kZXggMDE0YjNjYS4uMjEyMjIxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVRyYWNrUmVxdWVzdC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1JlcXVlc3QuYWlkbApAQCAtMTgsOSArMTgsOSBAQAogCiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ2xpZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWc7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JQXVkaW9UcmFja0NhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuU2hhcmVkRmlsZVJlZ2lvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NvbmZpZzsKIAogLyoqCiAgKiBDcmVhdGVUcmFja0lucHV0IGNvbnRhaW5zIGFsbCBpbnB1dCBhcmd1bWVudHMgc2VudCBieSBBdWRpb1RyYWNrIHRvIEF1ZGlvRmxpbmdlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVRyYWNrUmVzcG9uc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1Jlc3BvbnNlLmFpZGwKaW5kZXggNDA0NzNmYS4uZGE2ZjQ1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVRyYWNrUmVzcG9uc2UuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlVHJhY2tSZXNwb25zZS5haWRsCkBAIC0xNiw3ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvU3RyZWFtVHlwZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLklBdWRpb1RyYWNrOwogCiAvKioKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9FZmZlY3REZXNjcmlwdG9yLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRWZmZWN0RGVzY3JpcHRvci5haWRsCmluZGV4IDM1YTNkNzQuLmU1YjUxNTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9FZmZlY3REZXNjcmlwdG9yLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0VmZmVjdERlc2NyaXB0b3IuYWlkbApAQCAtMTYsNyArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVXVpZDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1V1aWQ7CiAKIC8qKgogICoge0BoaWRlfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0V4dHJhQXVkaW9EZXNjcmlwdG9yLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRXh0cmFBdWRpb0Rlc2NyaXB0b3IuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1YjY3YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRXh0cmFBdWRpb0Rlc2NyaXB0b3IuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRW5jYXBzdWxhdGlvblR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1N0YW5kYXJkOwotCi0vKioKLSAqIFRoZSBhdWRpbyBkZXNjcmlwdG9yIHRoYXQgZGVzY2liZXMgcGxheWJhY2svY2FwdHVyZSBjYXBhYmlsaXRpZXMgYWNjb3JkaW5nIHRvCi0gKiBhIHBhcnRpY3VsYXIgc3RhbmRhcmQuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEV4dHJhQXVkaW9EZXNjcmlwdG9yIHsKLSAgICBBdWRpb1N0YW5kYXJkIHN0YW5kYXJkOwotICAgIGJ5dGVbXSBhdWRpb0Rlc2NyaXB0b3I7Ci0gICAgQXVkaW9FbmNhcHN1bGF0aW9uVHlwZSBlbmNhcHN1bGF0aW9uVHlwZTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9HZXRPdXRwdXRGb3JBdHRyUmVzcG9uc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9HZXRPdXRwdXRGb3JBdHRyUmVzcG9uc2UuYWlkbAppbmRleCAxNjRmYjlkLi5mMTg0OGI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvR2V0T3V0cHV0Rm9yQXR0clJlc3BvbnNlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0dldE91dHB1dEZvckF0dHJSZXNwb25zZS5haWRsCkBAIC0xNiw3ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvU3RyZWFtVHlwZTsKIAogLyoqCiAgKiB7QGhpZGV9CkBAIC0zMSw0ICszMSw2IEBACiAgICAgaW50IHBvcnRJZDsKICAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9faW9faGFuZGxlX3RbXS4gKi8KICAgICBpbnRbXSBzZWNvbmRhcnlPdXRwdXRzOworICAgIC8qKiBUcnVlIGlmIHRoZSB0cmFjayBpcyBjb25uZWN0ZWQgdG8gYSBzcGF0aWFsaXplciBtaXhlciBhbmQgYWN0dWFsbHkgc3BhdGlhbGl6ZWQgKi8KKyAgICBib29sZWFuIGlzU3BhdGlhbGl6ZWQ7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0dldFNwYXRpYWxpemVyUmVzcG9uc2UuYWlkbApzaW1pbGFyaXR5IGluZGV4IDcyJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5haWRsCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvR2V0U3BhdGlhbGl6ZXJSZXNwb25zZS5haWRsCmluZGV4IGIwOGE2MDQuLjI1MTE1YWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0dldFNwYXRpYWxpemVyUmVzcG9uc2UuYWlkbApAQCAtMTYsMTQgKzE2LDEzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAoraW1wb3J0IGFuZHJvaWQubWVkaWEuSVNwYXRpYWxpemVyOworCiAvKioKLSAqIEF1ZGlvIGVuY2Fwc3VsYXRpb24gdHlwZSBpcyB1c2VkIHRvIGRlc2NyaWJlIGlmIHRoZSBhdWRpbyBkYXRhIHNob3VsZCBiZSBzZW50IHdpdGggYSBwYXJ0aWN1bGFyCi0gKiBlbmNhcHN1bGF0aW9uIHR5cGUgb3Igbm90LgotICoKKyAqIFVzZWQgYXMgYSByZXR1cm4gdmFsdWUgZm9yIElBdWRpb1BvbGljeVNlcnZpY2UuZ2V0U3BhdGlhbGl6ZXIoKSBtZXRob2QKICAqIHtAaGlkZX0KICAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9FbmNhcHN1bGF0aW9uVHlwZSB7Ci0gICAgTk9ORSAgICAgPSAwLAotICAgIElFQzYxOTM3ID0gMSwKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgcGFyY2VsYWJsZSBHZXRTcGF0aWFsaXplclJlc3BvbnNlIHsKKyAgICAvKiBUaGUgSVNwYXRpYWxpemVyIGludGVyZmFjZSBpZiBzdWNjZXNzZnVsLCBudWxsIGlmIG5vdCAqLworICAgIEBudWxsYWJsZSBJU3BhdGlhbGl6ZXIgc3BhdGlhbGl6ZXI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvRmxpbmdlclNlcnZpY2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9GbGluZ2VyU2VydmljZS5haWRsCmluZGV4IGQyY2FlNmQuLjEwZGEwMjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9GbGluZ2VyU2VydmljZS5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9GbGluZ2VyU2VydmljZS5haWRsCkBAIC0xNiwxMyArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01vZGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BhdGNoOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0OwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9VbmlxdWVJZFVzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVXVpZDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVmlicmF0b3JJbmZvOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQ3JlYXRlRWZmZWN0UmVxdWVzdDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkNyZWF0ZUVmZmVjdFJlc3BvbnNlOwpAQCAtNDEsNyArMzgsMTMgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLk1pY3JvcGhvbmVJbmZvRGF0YTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLlJlbmRlclBvc2l0aW9uOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRm9ybWF0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvQ2hhbm5lbExheW91dDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdERlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvTU1hcFBvbGljeUluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9NTWFwUG9saWN5VHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb01vZGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9TdHJlYW1UeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvVXVpZDsKIAogLyoqCiAgKiB7QGhpZGV9CkBAIC02Miw3ICs2NSw3IEBACiAgICAgICovCiAgICAgaW50IHNhbXBsZVJhdGUoaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIGlvSGFuZGxlKTsKIAotICAgIEF1ZGlvRm9ybWF0IGZvcm1hdChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gb3V0cHV0KTsKKyAgICBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIGZvcm1hdChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gb3V0cHV0KTsKIAogICAgIGxvbmcgZnJhbWVDb3VudChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gaW9IYW5kbGUpOwogCkBAIC0xMTUsOCArMTE4LDggQEAKICAgICAvLyBSZXRyaWV2ZSB0aGUgYXVkaW8gcmVjb3JkaW5nIGJ1ZmZlciBzaXplIGluIGJ5dGVzLgogICAgIC8vIEZJWE1FIFRoaXMgQVBJIGFzc3VtZXMgYSByb3V0ZSwgYW5kIHNvIHNob3VsZCBiZSBkZXByZWNhdGVkLgogICAgIGxvbmcgZ2V0SW5wdXRCdWZmZXJTaXplKGludCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYXVkaW9fY2hhbm5lbF9tYXNrX3QgKi8gY2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvQ2hhbm5lbExheW91dCBjaGFubmVsTWFzayk7CiAKICAgICBPcGVuT3V0cHV0UmVzcG9uc2Ugb3Blbk91dHB1dChpbiBPcGVuT3V0cHV0UmVxdWVzdCByZXF1ZXN0KTsKICAgICBpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gb3BlbkR1cGxpY2F0ZU91dHB1dChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gb3V0cHV0MSwKQEAgLTE5Nyw2ICsyMDAsOSBAQAogICAgIC8qIEluZGljYXRlIEpBVkEgc2VydmljZXMgYXJlIHJlYWR5IChzY2hlZHVsaW5nLCBwb3dlciBtYW5hZ2VtZW50IC4uLikgKi8KICAgICBvbmV3YXkgdm9pZCBzeXN0ZW1SZWFkeSgpOwogCisgICAgLyogSW5kaWNhdGUgYXVkaW8gcG9saWN5IHNlcnZpY2UgaXMgcmVhZHkgKi8KKyAgICBvbmV3YXkgdm9pZCBhdWRpb1BvbGljeVJlYWR5KCk7CisKICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBhdWRpbyBIQUwgYnVmZmVyLgogICAgIGxvbmcgZnJhbWVDb3VudEhBTChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gaW9IYW5kbGUpOwogCkBAIC0yMTMsNCArMjE5LDE3IEBACiAgICAgLy8gVGhpcyB1c3VhbGx5IGhhcHBlbnMgd2hlbiB0aGVyZSBpcyBhIGR5bmFtaWMgcG9saWN5IHJlZ2lzdGVyZWQuCiAgICAgdm9pZCB1cGRhdGVTZWNvbmRhcnlPdXRwdXRzKAogICAgICAgICAgICAgaW4gVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvW10gdHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvcyk7CisKKyAgICBBdWRpb01NYXBQb2xpY3lJbmZvW10gZ2V0TW1hcFBvbGljeUluZm9zKEF1ZGlvTU1hcFBvbGljeVR5cGUgcG9saWN5VHlwZSk7CisKKyAgICBpbnQgZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCk7CisKKyAgICBpbnQgZ2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoKTsKKworICAgIHZvaWQgc2V0RGV2aWNlQ29ubmVjdGVkU3RhdGUoaW4gQXVkaW9Qb3J0IGRldmljZVBvcnQsIGJvb2xlYW4gY29ubmVjdGVkKTsKKworICAgIC8vIFdoZW4gYWRkaW5nIGEgbmV3IG1ldGhvZCwgcGxlYXNlIHJldmlldyBhbmQgdXBkYXRlCisgICAgLy8gSUF1ZGlvRmxpbmdlci5oIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OkRlbGVnYXRlOjpUcmFuc2FjdGlvbkNvZGUKKyAgICAvLyBBdWRpb0ZsaW5nZXIuY3BwIEF1ZGlvRmxpbmdlcjo6b25UcmFuc2FjdFdyYXBwZXIoKQorICAgIC8vIEF1ZGlvRmxpbmdlci5jcHAgSUFVRElPRkxJTkdFUl9CSU5ERVJfTUVUSE9EX01BQ1JPX0xJU1QKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5haWRsCmluZGV4IDRjMzk1NWEuLjhhYzg5YTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuYWlkbApAQCAtMTgsMTYgKzE4LDEwIEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRm9ybWF0OwotCiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXNFeDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlc0ludGVybmFsOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbmZpZ0Jhc2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0RldmljZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRGlyZWN0TW9kZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWl4OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Nb2RlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9PZmZsb2FkSW5mbzsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvT2ZmbG9hZE1vZGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BhdGNoOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZTsKQEAgLTM4LDE5ICszMiwzMCBAQAogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Um9sZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFR5cGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1Byb2R1Y3RTdHJhdGVneTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU291cmNlVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU3RyZWFtVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVXNhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1V1aWQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1ZvbHVtZUdyb3VwOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuRGV2aWNlUm9sZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkVmZmVjdERlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5HZXRJbnB1dEZvckF0dHJSZXNwb25zZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkdldE91dHB1dEZvckF0dHJSZXNwb25zZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkdldFNwYXRpYWxpemVyUmVzcG9uc2U7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OwogaW1wb3J0IGFuZHJvaWQubWVkaWEuSUNhcHR1cmVTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuSW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuSU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5Tb3VuZFRyaWdnZXJTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvQ29uZmlnOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvQ29uZmlnQmFzZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0RldmljZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0RldmljZURlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRm9ybWF0RGVzY3JpcHRpb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Nb2RlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvUHJvZmlsZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb09mZmxvYWRJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvUG9ydDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1NvdXJjZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1N0cmVhbVR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Vc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1V1aWQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uSW50OwogCiAvKioKICAqIElBdWRpb1BvbGljeVNlcnZpY2UgaW50ZXJmYWNlIChzZWUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgZm9yIG1ldGhvZCBkZXNjcmlwdGlvbnMpLgpAQCAtNjAsMTYgKzY1LDE1IEBACiBpbnRlcmZhY2UgSUF1ZGlvUG9saWN5U2VydmljZSB7CiAgICAgb25ld2F5IHZvaWQgb25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKTsKIAotICAgIHZvaWQgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGluIEF1ZGlvRGV2aWNlIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb1BvbGljeURldmljZVN0YXRlIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB1dGY4SW5DcHAgU3RyaW5nIGRldmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9Gb3JtYXQgZW5jb2RlZEZvcm1hdCk7CisgICAgdm9pZCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoaW4gQXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1BvcnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIGVuY29kZWRGb3JtYXQpOwogCiAgICAgQXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoaW4gQXVkaW9EZXZpY2UgZGV2aWNlKTsKIAogICAgIHZvaWQgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGluIEF1ZGlvRGV2aWNlIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdXRmOEluQ3BwIFN0cmluZyBkZXZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRm9ybWF0IGVuY29kZWRGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gZW5jb2RlZEZvcm1hdCk7CiAKICAgICB2b2lkIHNldFBob25lU3RhdGUoQXVkaW9Nb2RlIHN0YXRlLCBpbnQgLyogdWlkX3QgKi8gdWlkKTsKIApAQCAtMTE0LDE4ICsxMTgsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKIAogICAgIHZvaWQgc2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhdWRpb19kZXZpY2VzX3QgKi8gZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOwogCiAgICAgaW50IGdldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhdWRpb19kZXZpY2VzX3QgKi8gZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBkZXZpY2UpOwogCiAgICAgdm9pZCBzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoaW4gQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYXVkaW9fZGV2aWNlc190ICovIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0RldmljZURlc2NyaXB0aW9uIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOwogCiAgICAgaW50IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhpbiBBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGF1ZGlvX2RldmljZXNfdCAqLyBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBkZXZpY2UpOwogCiAgICAgaW50IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhpbiBBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyKTsKIApAQCAtMTMzLDkgKzEzNyw3IEBACiAKICAgICBpbnQgLyogcHJvZHVjdF9zdHJhdGVneV90ICovIGdldFN0cmF0ZWd5Rm9yU3RyZWFtKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0pOwogCi0gICAgaW50IC8qIGJpdG1hc2sgb2YgYXVkaW9fZGV2aWNlc190ICovIGdldERldmljZXNGb3JTdHJlYW0oQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSk7Ci0KLSAgICBBdWRpb0RldmljZVtdIGdldERldmljZXNGb3JBdHRyaWJ1dGVzKGluIEF1ZGlvQXR0cmlidXRlc0V4IGF0dHIpOworICAgIEF1ZGlvRGV2aWNlW10gZ2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoaW4gQXVkaW9BdHRyaWJ1dGVzRXggYXR0ciwgYm9vbGVhbiBmb3JWb2x1bWUpOwogCiAgICAgaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIGdldE91dHB1dEZvckVmZmVjdChpbiBFZmZlY3REZXNjcmlwdG9yIGRlc2MpOwogCkBAIC0xNTUsNyArMTU3LDcgQEAKIAogICAgIGJvb2xlYW4gaXNTdHJlYW1BY3RpdmVSZW1vdGVseShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQgaW5QYXN0TXMpOwogCi0gICAgYm9vbGVhbiBpc1NvdXJjZUFjdGl2ZShBdWRpb1NvdXJjZVR5cGUgc291cmNlKTsKKyAgICBib29sZWFuIGlzU291cmNlQWN0aXZlKEF1ZGlvU291cmNlIHNvdXJjZSk7CiAKICAgICAvKioKICAgICAgKiBPbiBpbnB1dCwgY291bnQgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHJldHVybmVkIGFycmF5LgpAQCAtMTcwLDcgKzE3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHV0ZjhJbkNwcCBTdHJpbmcgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb1V1aWQgdXVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Tb3VyY2VUeXBlIHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Tb3VyY2Ugc291cmNlKTsKIAogICAgIGludCAvKiBhdWRpb191bmlxdWVfaWRfdCAqLyBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGluIEF1ZGlvVXVpZCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB1dGY4SW5DcHAgU3RyaW5nIG9wUGFja2FnZU5hbWUsCkBAIC0yMTIsOCArMjE0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgaW5vdXQgSW50IGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICBvdXQgQXVkaW9Qb3J0W10gcG9ydHMpOwogCi0gICAgLyoqIEdldCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuICovCi0gICAgQXVkaW9Qb3J0IGdldEF1ZGlvUG9ydChpbiBBdWRpb1BvcnQgcG9ydCk7CisgICAgLyoqIEdldCBhdHRyaWJ1dGVzIGZvciB0aGUgYXVkaW8gcG9ydCB3aXRoIHRoZSBnaXZlbiBpZCAoQXVkaW9Qb3J0LmhhbC5pZCBmaWVsZCkuICovCisgICAgQXVkaW9Qb3J0IGdldEF1ZGlvUG9ydChpbnQgLyogYXVkaW9fcG9ydF9oYW5kbGVfdCAqLyBwb3J0SWQpOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCkBAIC0yNjgsNyArMjcwLDcgQEAKIAogICAgIGJvb2xlYW4gZ2V0TWFzdGVyTW9ubygpOwogCi0gICAgZmxvYXQgZ2V0U3RyZWFtVm9sdW1lREIoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50IGluZGV4LCBpbnQgLyogYXVkaW9fZGV2aWNlc190ICovIGRldmljZSk7CisgICAgZmxvYXQgZ2V0U3RyZWFtVm9sdW1lREIoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50IGluZGV4LCBpbiBBdWRpb0RldmljZURlc2NyaXB0aW9uIGRldmljZSk7CiAKICAgICAvKioKICAgICAgKiBQb3B1bGF0ZXMgc3VwcG9ydGVkIHN1cnJvdW5kIGZvcm1hdHMgYW5kIHRoZWlyIGVuYWJsZWQgc3RhdGUgaW4gZm9ybWF0cyBhbmQgZm9ybWF0c0VuYWJsZWQuCkBAIC0yNzksNyArMjgxLDcgQEAKICAgICAgKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aG91dCBhY3R1YWxseSByZXRyaWV2aW5nIHRoZW0uCiAgICAgICovCiAgICAgdm9pZCBnZXRTdXJyb3VuZEZvcm1hdHMoaW5vdXQgSW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBBdWRpb0Zvcm1hdFtdIGZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IEF1ZGlvRm9ybWF0RGVzY3JpcHRpb25bXSBmb3JtYXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBib29sZWFuW10gZm9ybWF0c0VuYWJsZWQpOwogCiAgICAgLyoqCkBAIC0yOTEsMTUgKzI5MywxNiBAQAogICAgICAqIG51bWJlciBvZiBlbGVtZW50cyB3aXRob3V0IGFjdHVhbGx5IHJldHJpZXZpbmcgdGhlbS4KICAgICAgKi8KICAgICB2b2lkIGdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzKGlub3V0IEludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBBdWRpb0Zvcm1hdFtdIGZvcm1hdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IEF1ZGlvRm9ybWF0RGVzY3JpcHRpb25bXSBmb3JtYXRzKTsKIAotICAgIEF1ZGlvRm9ybWF0W10gZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgpOworICAgIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb25bXSBnZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0RldmljZURlc2NyaXB0aW9uIGRldmljZSk7CiAKLSAgICB2b2lkIHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChBdWRpb0Zvcm1hdCBhdWRpb0Zvcm1hdCwgYm9vbGVhbiBlbmFibGVkKTsKKyAgICB2b2lkIHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChpbiBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIGF1ZGlvRm9ybWF0LCBib29sZWFuIGVuYWJsZWQpOwogCi0gICAgdm9pZCBzZXRBc3Npc3RhbnRVaWQoaW50IC8qIHVpZF90ICovIHVpZCk7CisgICAgdm9pZCBzZXRBc3Npc3RhbnRTZXJ2aWNlc1VpZHMoaW4gaW50W10gLyogdWlkX3RbXSAqLyB1aWRzKTsKIAotICAgIHZvaWQgc2V0SG90d29yZERldGVjdGlvblNlcnZpY2VVaWQoaW50IC8qIHVpZF90ICovIHVpZCk7CisgICAgdm9pZCBzZXRBY3RpdmVBc3Npc3RhbnRTZXJ2aWNlc1VpZHMoaW4gaW50W10gLyogdWlkX3RbXSAqLyBhY3RpdmVVaWRzKTsKIAogICAgIHZvaWQgc2V0QTExeVNlcnZpY2VzVWlkcyhpbiBpbnRbXSAvKiB1aWRfdFtdICovIHVpZHMpOwogCkBAIC0zMDcsNiArMzEwLDggQEAKIAogICAgIGJvb2xlYW4gaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOwogCisgICAgYm9vbGVhbiBpc1VsdHJhc291bmRTdXBwb3J0ZWQoKTsKKwogICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5W10gbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoKTsKICAgICBpbnQgLyogcHJvZHVjdF9zdHJhdGVneV90ICovIGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoaW4gQXVkaW9BdHRyaWJ1dGVzRXggYWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmFsbGJhY2tPbkRlZmF1bHQpOwpAQCAtMzI5LDIzICszMzQsNjQgQEAKICAgICBBdWRpb0RldmljZVtdIGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3koaW50IC8qIHByb2R1Y3Rfc3RyYXRlZ3lfdCAqLyBzdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUm9sZSByb2xlKTsKIAotICAgIHZvaWQgc2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KEF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZSwKKyAgICB2b2lkIHNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VSb2xlIHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9EZXZpY2VbXSBkZXZpY2VzKTsKIAotICAgIHZvaWQgYWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KEF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZSwKKyAgICB2b2lkIGFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VSb2xlIHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9EZXZpY2VbXSBkZXZpY2VzKTsKIAotICAgIHZvaWQgcmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KEF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZSwKKyAgICB2b2lkIHJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VSb2xlIHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9EZXZpY2VbXSBkZXZpY2VzKTsKIAotICAgIHZvaWQgY2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoQXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlLAorICAgIHZvaWQgY2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VSb2xlIHJvbGUpOwogCi0gICAgQXVkaW9EZXZpY2VbXSBnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoQXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlLAorICAgIEF1ZGlvRGV2aWNlW10gZ2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KEF1ZGlvU291cmNlIGF1ZGlvU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVJvbGUgcm9sZSk7CiAKICAgICBib29sZWFuIHJlZ2lzdGVyU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXIoSUNhcHR1cmVTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgIC8qKiBJZiBhIHNwYXRpYWxpemVyIHN0YWdlIGVmZmVjdCBpcyBwcmVzZW50IG9uIHRoZSBwbGF0Zm9ybSwgdGhpcyB3aWxsIHJldHVybiBhbgorICAgICAqIElTcGF0aWFsaXplciBpbnRlcmZhY2UgKHNlZSBHZXRTcGF0aWFsaXplclJlc3BvbnNlLGFpZGwpIHRvIGNvbnRyb2wgdGhpcworICAgICAqIGZlYXR1cmUuCisgICAgICogSWYgbm8gc3BhdGlhbGl6ZXIgc3RhZ2UgaXMgcHJlc2VudCwgYSBudWxsIGludGVyZmFjZSBpcyByZXR1cm5lZC4KKyAgICAgKiBUaGUgSU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2sgcGFzc2VkIG11c3Qgbm90IGJlIG51bGwuCisgICAgICogT25seSBvbmUgSVNwYXRpYWxpemVyIGludGVyZmFjZSBjYW4gZXhpc3QgYXQgYSBnaXZlbiB0aW1lLiBUaGUgbmF0aXZlIGF1ZGlvIHBvbGljeQorICAgICAqIHNlcnZpY2Ugd2lsbCByZWplY3QgdGhlIHJlcXVlc3QgaWYgYW4gaW50ZXJmYWNlIHdhcyBhbHJlYWR5IGFjcXVpcmVkIGFuZCBwcmV2aW91cyBvd25lcgorICAgICAqIGRpZCBub3QgZGllIG9yIGNhbGwgSVNwYXRpYWxpemVyLnJlbGVhc2UoKS4KKyAgICAgKi8KKyAgICBHZXRTcGF0aWFsaXplclJlc3BvbnNlIGdldFNwYXRpYWxpemVyKElOYXRpdmVTcGF0aWFsaXplckNhbGxiYWNrIGNhbGxiYWNrKTsKKworICAgIC8qKiBRdWVyaWVzIGlmIHNvbWUga2luZCBvZiBzcGF0aWFsaXphdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBpZiB0aGUgYXVkaW8gcGxheWJhY2sgY29udGV4dAorICAgICAqIGRlc2NyaWJlZCBieSB0aGUgcHJvdmlkZWQgYXJndW1lbnRzIGlzIHByZXNlbnQuCisgICAgICogVGhlIGNvbnRleHQgaXMgbWFkZSBvZjoKKyAgICAgKiAtIFRoZSBhdWRpbyBhdHRyaWJ1dGVzIGRlc2NyaWJpbmcgdGhlIHBsYXliYWNrIHVzZSBjYXNlLgorICAgICAqIC0gVGhlIGF1ZGlvIGNvbmZpZ3VyYXRpb24gZGVzY3JpYmluZyB0aGUgYXVkaW8gZm9ybWF0LCBjaGFubmVscywgc2FtcGxpbmcgcmF0ZS4uLgorICAgICAqIC0gVGhlIGRldmljZXMgZGVzY3JpYmluZyB0aGUgc2luayBhdWRpbyBkZXZpY2Ugc2VsZWN0ZWQgZm9yIHBsYXliYWNrLgorICAgICAqIEFsbCBhcmd1bWVudHMgYXJlIG9wdGlvbmFsIGFuZCBvbmx5IHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIGFyZSB1c2VkIHRvIG1hdGNoIGFnYWluc3QKKyAgICAgKiBzdXBwb3J0ZWQgY3JpdGVyaWEuIEZvciBpbnN0YW5jZSwgc3VwcGx5aW5nIG5vIGFyZ3VtZW50IHdpbGwgdGVsbCBpZiBzcGF0aWFsaXphdGlvbiBpcworICAgICAqIHN1cHBvcnRlZCBvciBub3QgaW4gZ2VuZXJhbC4KKyAgICAgKi8KKyAgICBib29sZWFuIGNhbkJlU3BhdGlhbGl6ZWQoaW4gQG51bGxhYmxlIEF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEBudWxsYWJsZSBBdWRpb0NvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRGV2aWNlW10gZGV2aWNlcyk7CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSBob3cgdGhlIGRpcmVjdCBwbGF5YmFjayBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UuCisgICAgICovCisgICAgQXVkaW9EaXJlY3RNb2RlIGdldERpcmVjdFBsYXliYWNrU3VwcG9ydChpbiBBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvQ29uZmlnIGNvbmZpZyk7CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSBhdWRpbyBwcm9maWxlcyBhdmFpbGFibGUgZm9yIGRpcmVjdCBwbGF5YmFjayBvbiB0aGUgY3VycmVudCBvdXRwdXQgZGV2aWNlKHMpCisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgYXVkaW8gYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBBdWRpb1Byb2ZpbGVbXSBnZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoaW4gQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0cik7CisKKyAgICAvLyBXaGVuIGFkZGluZyBhIG5ldyBtZXRob2QsIHBsZWFzZSByZXZpZXcgYW5kIHVwZGF0ZQorICAgIC8vIEF1ZGlvUG9saWN5U2VydmljZS5jcHAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblRyYW5zYWN0KCkKKyAgICAvLyBBdWRpb1BvbGljeVNlcnZpY2UuY3BwIElBVURJT1BPTElDWVNFUlZJQ0VfQklOREVSX01FVEhPRF9NQUNST19MSVNUCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuYWlkbAppbmRleCBhNzc4MmI4Li5jMGNkZDk2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmFpZGwKQEAgLTE2LDEwICsxNiwxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU291cmNlVHlwZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkVmZmVjdERlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5SZWNvcmRDbGllbnRJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvQ29uZmlnQmFzZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1NvdXJjZTsKIAogLyoqCiAgKiB7QGhpZGV9CkBAIC00Myw3ICs0MywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvQ29uZmlnQmFzZSBkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gRWZmZWN0RGVzY3JpcHRvcltdIGVmZmVjdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICovIHBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU291cmNlVHlwZSBzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU291cmNlIHNvdXJjZSk7CiAgICAgIC8qKiBOb3RpZmllcyBhIGNoYW5nZSBvZiBhdWRpbyByb3V0aW5nICovCiAgICAgIHZvaWQgb25Sb3V0aW5nVXBkYXRlZCgpOworICAgICAvKiogTm90aWZpZXMgYSByZXF1ZXN0IGZvciB2b2x1bWUgaW5kZXggcmFuZ2VzIHRvIGJlIHJlc2V0IGFmdGVyIHRoZXkgd2VyZSBvYnNlcnZlZCBhcyBpbnZhbGlkCisgICAgICAqLworICAgICB2b2lkIG9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lFZmZlY3QuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JRWZmZWN0LmFpZGwKaW5kZXggODEzY2Q1Yy4uNmVjMDQwNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lFZmZlY3QuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUVmZmVjdC5haWRsCkBAIC02Miw0ICs2Miw4IEBACiAgICAgICogVE9ETyh5dGFpKTogRXhwbGFpbiBob3cgdGhpcyBzaG91bGQgYmUgdXNlZCBleGFjdGx5LgogICAgICAqLwogICAgIFNoYXJlZEZpbGVSZWdpb24gZ2V0Q2JsaygpOworCisgICAgLy8gV2hlbiBhZGRpbmcgYSBuZXcgbWV0aG9kLCBwbGVhc2UgcmV2aWV3IGFuZCB1cGRhdGUKKyAgICAvLyBFZmZlY3RzLmNwcCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6b25UcmFuc2FjdCgpCisgICAgLy8gRWZmZWN0cy5jcHAgSUVGRkVDVF9CSU5ERVJfTUVUSE9EX01BQ1JPX0xJU1QKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JRWZmZWN0Q2xpZW50LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUVmZmVjdENsaWVudC5haWRsCmluZGV4IDNiNmJjZjEuLjM3YjQ0MmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JRWZmZWN0Q2xpZW50LmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lFZmZlY3RDbGllbnQuYWlkbApAQCAtNDMsNCArNDMsMTAgQEAKICAgICAgKiBUT0RPKHl0YWkpOiByZXBsYWNlIG9wYXF1ZSBieXRlIGFycmF5cyB3aXRoIHN0cm9uZ2x5IHR5cGVkIHBhcmFtZXRlcnMuCiAgICAgICovCiAgICAgb25ld2F5IHZvaWQgY29tbWFuZEV4ZWN1dGVkKGludCBjbWRDb2RlLCBpbiBieXRlW10gY21kRGF0YSwgaW4gYnl0ZVtdIHJlcGx5RGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbmV2ZXIgYXVkaW8gZnJhbWVzIGhhdmUgYmVlbiBwcm9jZXNzZWQgYnkgdGhlIGVmZmVjdCBlbmdpbmUuCisgICAgICogQHBhcmFtIGZyYW1lcyBudW1iZXIgb2YgZnJhbWVzIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBmcmFtZXNQcm9jZXNzZWQoaW50IGZyYW1lcyk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2suYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjay5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YjgxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2suYWlkbApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNwYXRpYWxpemF0aW9uTGV2ZWw7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGU7CisKKy8qKgorICogVGhlIElOYXRpdmVTcGF0aWFsaXplckNhbGxiYWNrIGludGVyZmFjZSBpcyBhIGNhbGxiYWNrIGFzc29jaWF0ZWQgdG8gdGhlCisgKiBJU3BhdGlhbGl6ZXIgaW50ZXJmYWNlLiBUaGUgY2FsbGJhY2sgaXMgdXNlZCBieSB0aGUgc3BhdGlhbGl6ZXIKKyAqIGltcGxlbWVudGF0aW9uIGluIG5hdGl2ZSBhdWRpbyBzZXJ2ZXIgdG8gY29tbXVuaWNhdGUgc3RhdGUgY2hhbmdlcyB0byB0aGUKKyAqIGNsaWVudCBjb250cm9sbGluZyB0aGUgc3BhdGlhbGl6ZXIgd2l0aCB0aGUgSVNwYXRpYWxpemVyIGludGVyZmFjZS4KKyAqIHtAaGlkZX0KKyAqLworb25ld2F5IGludGVyZmFjZSBJTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjayB7CisgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBzcGF0aWFsaXphdGlvbiBsZXZlbCBhcHBsaWVkIGJ5IHRoZSBzcGF0aWFsaXplciBjaGFuZ2VzCisgICAgICogKGUuZy4gd2hlbiB0aGUgc3BhdGlhbGl6ZXIgaXMgZW5hYmxlZCBvciBkaXNhYmxlZCkKKyAgICAgKi8KKyAgICB2b2lkIG9uTGV2ZWxDaGFuZ2VkKFNwYXRpYWxpemF0aW9uTGV2ZWwgbGV2ZWwpOworCisgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBvdXRwdXQgc3RyZWFtIHRoZSBTcGF0aWFsaXplciBpcyBhdHRhY2hlZCB0byBjaGFuZ2VzLgorICAgICAqIEluZGljYXRlcyB0aGUgSU8gSGFuZGxlIG9mIHRoZSBuZXcgb3V0cHV0LgorICAgICAqLworICAgIHZvaWQgb25PdXRwdXRDaGFuZ2VkKGludCBvdXRwdXQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lTcGF0aWFsaXplci5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lTcGF0aWFsaXplci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MWFkNTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSVNwYXRpYWxpemVyLmFpZGwKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuSVNwYXRpYWxpemVySGVhZFRyYWNraW5nQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TcGF0aWFsaXphdGlvbkxldmVsOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU3BhdGlhbGl6YXRpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlOworCisKKy8qKgorICogVGhlIElTcGF0aWFsaXplciBpbnRlcmZhY2UgaXMgdXNlZCB0byBjb250cm9sIHRoZSBuYXRpdmUgYXVkaW8gc2VydmljZSBpbXBsZW1lbnRhdGlvbgorICogb2YgdGhlIHNwYXRpYWxpemVyIHN0YWdlIHdpdGggaGVhZHRyYWNraW5nIHdoZW4gcHJlc2VudCBvbiBhIHBsYXRmb3JtLgorICogSXQgaXMgaW50ZW5kZWQgZm9yIGV4Y2x1c2l2ZSB1c2UgYnkgdGhlIGphdmEgQXVkaW9TZXJ2aWNlIHJ1bm5pbmcgaW4gc3lzdGVtX3NlcnZlci4KKyAqIEl0IHByb3ZpZGVzIEFQSXMgdG8gZGlzY292ZXIgdGhlIGZlYXR1cmUgYXZhaWxhYmlsaXR5IGFuZCBvcHRpb25zIGFzIHdlbGwgYXMgY29udHJvbCBhbmQgcmVwb3J0CisgKiB0aGUgYWN0aXZlIHN0YXRlIGFuZCBtb2RlcyBvZiB0aGUgc3BhdGlhbGl6ZXIgYW5kIGhlYWQgdHJhY2tpbmcgZWZmZWN0LgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSVNwYXRpYWxpemVyIHsKKyAgICAvKiogUmVsZWFzZXMgYSBJU3BhdGlhbGl6ZXIgaW50ZXJmYWNlIHByZXZpb3VzbHkgYWNxdWlyZWQuICovCisgICAgdm9pZCByZWxlYXNlKCk7CisKKyAgICAvKiogUmVwb3J0cyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgc3BhdGlhbGl6YXRpb24gbGV2ZWxzIChzZWUgU3BhdGlhbGl6YXRpb25MZXZlbC5haWRsKS4KKyAgICAgKiBUaGUgbGlzdCBzaG91bGQgbmV2ZXIgYmUgZW1wdHkgaWYgYW4gSVNwYXRpYWxpemVyIGludGVyZmFjZSB3YXMgc3VjY2Vzc2Z1bGx5CisgICAgICogcmV0cmlldmVkIHdpdGggSUF1ZGlvUG9saWN5U2VydmljZS5nZXRTcGF0aWFsaXplcigpLgorICAgICAqLworICAgIFNwYXRpYWxpemF0aW9uTGV2ZWxbXSBnZXRTdXBwb3J0ZWRMZXZlbHMoKTsKKworICAgIC8qKiBTZWxlY3RzIHRoZSBkZXNpcmVkIHNwYXRpYWxpemF0aW9uIGxldmVsIChzZWUgU3BhdGlhbGl6YXRpb25MZXZlbC5haWRsKS4gU2VsZWN0aW5nIGEgbGV2ZWwKKyAgICAgKiBkaWZmZXJlbnQgZnJvbSBTcGF0aWFsaXphdGlvbkxldmVsLk5PTkUgd2l0aCBjcmVhdGUgdGhlIHNwZWNpYWxpemVkIG11bHRpY2hhbm5lbCBvdXRwdXQKKyAgICAgKiBtaXhlciwgY3JlYXRlIGFuZCBlbmFibGUgdGhlIHNwYXRpYWxpemVyIGVmZmVjdCBhbmQgbGV0IHRoZSBhdWRpbyBwb2xpY3kgYXR0YWNoIGVsaWdpYmxlCisgICAgICogQXVkaW9UcmFjayB0byB0aGlzIG91dHB1dCBzdHJlYW0uCisgICAgICovCisgICAgdm9pZCBzZXRMZXZlbChTcGF0aWFsaXphdGlvbkxldmVsIGxldmVsKTsKKworICAgIC8qKiBHZXRzIHRoZSBzZWxlY3RlZCBzcGF0aWFsaXphdGlvbiBsZXZlbCAoc2VlIFNwYXRpYWxpemF0aW9uTGV2ZWwuYWlkbCkgKi8KKyAgICBTcGF0aWFsaXphdGlvbkxldmVsIGdldExldmVsKCk7CisKKyAgICAvKiogUmVwb3J0cyBpZiB0aGUgc3BhdGlhbGl6ZXIgZW5naW5lIHN1cHBvcnRzIGhlYWQgdHJhY2tpbmcgb3Igbm90LgorICAgICAqIFRoaXMgaXMgYSBwcmUgY29uZGl0aW9uIGluZGVwZW5kZW50IG9mIHRoZSBmYWN0IHRoYXQgYSBoZWFkIHRyYWNraW5nIHNlbnNvciBpcworICAgICAqIHJlZ2lzdGVyZWQgb3Igbm90LgorICAgICAqLworICAgIGJvb2xlYW4gaXNIZWFkVHJhY2tpbmdTdXBwb3J0ZWQoKTsKKworICAgIC8qKiBSZXBvcnRzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBoZWFkIHRyYWNraW5nIG1vZGVzIChzZWUgU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlLmFpZGwpLgorICAgICAqIFRoZSBsaXN0IGFsd2F5cyBjb250YWlucyBTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGUuRElTQUJMRUQgYW5kIGNhbiBpbmNsdWRlIG90aGVyIG1vZGVzCisgICAgICogaWYgdGhlIHNwYXRpYWxpemVyIGVmZmVjdCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBoZWFkIHRyYWNraW5nLgorICAgICAqIFRoZSByZXN1bHQgZG9lcyBub3QgZGVwZW5kIG9uIGN1cnJlbnRseSBjb25uZWN0ZWQgc2Vuc29ycyBidXQgcmVmbGVjdHMgdGhlIGNhcGFiaWxpdGllcworICAgICAqIHdoZW4gc2Vuc29ycyBhcmUgYXZhaWxhYmxlLgorICAgICAqLworICAgIFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZVtdIGdldFN1cHBvcnRlZEhlYWRUcmFja2luZ01vZGVzKCk7CisKKyAgICAvKiogU2VsZWN0cyB0aGUgZGVzaXJlZCBoZWFkIHRyYWNraW5nIG1vZGUgKHNlZSBTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGUuYWlkbCkgKi8KKyAgICB2b2lkIHNldERlc2lyZWRIZWFkVHJhY2tpbmdNb2RlKFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZSBtb2RlKTsKKworICAgIC8qKiBHZXRzIHRoZSBhY3R1YWwgaGVhZCB0cmFja2luZyBtb2RlLiBDYW4gYmUgZGlmZmVyZW50IGZyb20gdGhlIGRlc2lyZWQgbW9kZSBpZiBjb25kaXRpb25zIHRvCisgICAgICogZW5hYmxlIHRoZSBkZXNpcmVkIG1vZGUgYXJlIG5vdCBtZXQgKGUuZyBpZiB0aGUgaGVhZCB0cmFja2luZyBkZXZpY2Ugd2FzIHJlbW92ZWQpCisgICAgICovCisgICAgU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlIGdldEFjdHVhbEhlYWRUcmFja2luZ01vZGUoKTsKKworICAgIC8qKiBSZXNldCB0aGUgaGVhZCB0cmFja2luZyBhbGdvcml0aG0gdG8gY29uc2lkZXIgY3VycmVudCBoZWFkIHBvc2UgYXMgbmV1dHJhbCAqLworICAgIHZvaWQgcmVjZW50ZXJIZWFkVHJhY2tlcigpOworCisgICAgLyoqIFNldCB0aGUgc2NyZWVuIHRvIHN0YWdlIHRyYW5zZm9ybSB0byB1c2UgYnkgdGhlIGhlYWQgdHJhY2tpbmcgYWxnb3JpdGhtCisgICAgICogVGhlIHNjcmVlbiB0byBzdGFnZSB0cmFuc2Zvcm0gaXMgY29udmV5ZWQgYXMgYSB2ZWN0b3Igb2YgNiBlbGVtZW50cywKKyAgICAgKiB3aGVyZSB0aGUgZmlyc3QgdGhyZWUgYXJlIGEgdHJhbnNsYXRpb24gdmVjdG9yIGFuZAorICAgICAqIHRoZSBsYXN0IHRocmVlIGFyZSBhIHJvdGF0aW9uIHZlY3Rvci4KKyAgICAgKi8KKyAgICB2b2lkIHNldEdsb2JhbFRyYW5zZm9ybShpbiBmbG9hdFtdIHNjcmVlblRvU3RhZ2UpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZW5zb3IgdGhhdCBpcyB0byBiZSB1c2VkIGZvciBoZWFkLXRyYWNraW5nLgorICAgICAqIC0xIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgaGVhZC10cmFja2luZy4KKyAgICAgKi8KKyAgICB2b2lkIHNldEhlYWRTZW5zb3IoaW50IHNlbnNvckhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlbnNvciB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHNjcmVlbi10cmFja2luZy4KKyAgICAgKiAtMSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIHNjcmVlbi10cmFja2luZy4KKyAgICAgKi8KKyAgICB2b2lkIHNldFNjcmVlblNlbnNvcihpbnQgc2Vuc29ySGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRpc3BsYXkgb3JpZW50YXRpb24uCisgICAgICogT3JpZW50YXRpb24gaXMgZXhwcmVzc2VkIGluIHRoZSBhbmdsZSBvZiByb3RhdGlvbiBmcm9tIHRoZSBwaHlzaWNhbCAidXAiIHNpZGUgb2YgdGhlIHNjcmVlbgorICAgICAqIHRvIHRoZSBsb2dpY2FsICJ1cCIgc2lkZSBvZiB0aGUgY29udGVudCBkaXNwbGF5ZWQgdGhlIHNjcmVlbi4gQ291bnRlcmNsb2Nrd2lzZSBhbmdsZXMsIGFzCisgICAgICogdmlld2VkIHdoaWxlIGZhY2luZyB0aGUgc2NyZWVuIGFyZSBwb3NpdGl2ZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldERpc3BsYXlPcmllbnRhdGlvbihmbG9hdCBwaHlzaWNhbFRvTG9naWNhbEFuZ2xlKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGhpbmdlIGFuZ2xlIGZvciBmb2xkYWJsZSBkZXZpY2VzLgorICAgICAqLworICAgIHZvaWQgc2V0SGluZ2VBbmdsZShmbG9hdCBoaW5nZUFuZ2xlKTsKKworICAgIC8qKiBSZXBvcnRzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBzcGF0aWFsaXphdGlvbiBtb2Rlc3MgKHNlZSBTcGF0aWFsaXphdGlvbk1vZGUuYWlkbCkuCisgICAgICogVGhlIGxpc3Qgc2hvdWxkIG5ldmVyIGJlIGVtcHR5IGlmIGFuIElTcGF0aWFsaXplciBpbnRlcmZhY2Ugd2FzIHN1Y2Nlc3NmdWxseQorICAgICAqIHJldHJpZXZlZCB3aXRoIElBdWRpb1BvbGljeVNlcnZpY2UuZ2V0U3BhdGlhbGl6ZXIoKS4KKyAgICAgKi8KKyAgICBTcGF0aWFsaXphdGlvbk1vZGVbXSBnZXRTdXBwb3J0ZWRNb2RlcygpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gbW9uaXRvciBoZWFkIHRyYWNraW5nIGZ1bmN0aW9ucy4KKyAgICAgKiBPbmx5IG9uZSBjYWxsYmFjayBjYW4gYmUgcmVnaXN0ZXJlZCBvbiBhIFNwYXRpYWxpemVyLgorICAgICAqIFRoZSBsYXN0IGNhbGxiYWNrIHJlZ2lzdGVyZWQgd2lucyBhbmQgcGFzc2luZyBhIG51bGxwdHIgdW5yZWdpc3RlcnMKKyAgICAgKiBsYXN0IHJlZ2lzdGVyZWQgY2FsbGJhY2suCisgICAgICovCisgICAgdm9pZCByZWdpc3RlckhlYWRUcmFja2luZ0NhbGxiYWNrKEBudWxsYWJsZSBJU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdDYWxsYmFjayBjYWxsYmFjayk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgcGFyYW1ldGVyIHRvIHRoZSBzcGF0aWFsaXplciBlbmdpbmUuIFVzZWQgYnkgZWZmZWN0IGltcGxlbWVudG9yIGZvciB2ZW5kb3IKKyAgICAgKiBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgICB2b2lkIHNldFBhcmFtZXRlcihpbnQga2V5LCBpbiBieXRlW10gdmFsdWUpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIHBhcmFtZXRlciBmcm9tIHRoZSBzcGF0aWFsaXplciBlbmdpbmUuIFVzZWQgYnkgZWZmZWN0IGltcGxlbWVudG9yIGZvciB2ZW5kb3IKKyAgICAgKiBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgICB2b2lkIGdldFBhcmFtZXRlcihpbnQga2V5LCBpbm91dCBieXRlW10gdmFsdWUpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgaW8gaGFuZGxlIG9mIHRoZSBvdXRwdXQgc3RyZWFtIHRoZSBzcGF0aWFsaXplciBpcyBjb25uZWN0ZWQgdG8uCisgICAgICovCisgICAgIGludCBnZXRPdXRwdXQoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdDYWxsYmFjay5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lTcGF0aWFsaXplckhlYWRUcmFja2luZ0NhbGxiYWNrLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkNWUxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdDYWxsYmFjay5haWRsCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuU3BhdGlhbGl6YXRpb25MZXZlbDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZTsKKworLyoqCisgKiBUaGUgSVNwYXRpYWxpemVySGVhZFRyYWNraW5nQ2FsbGJhY2sgaW50ZXJmYWNlIGlzIGEgY2FsbGJhY2sgYXNzb2NpYXRlZCB0byB0aGUKKyAqIFNwYXRpYWxpemVyIGhlYWQgdHJhY2tpbmcgZnVuY3Rpb24uIEl0IGNhbiBiZSByZWdpc3RlcmVkIHZpYSB0aGUgSVNwYXRpYWxpemVyCisgKiBpbnRlcmZhY2UgdG8gbW9uaXRvciBoZWFkIHRyYWNraW5nIHJlbGF0ZWQgc3RhdGVzLgorICoge0BoaWRlfQorICovCitvbmV3YXkgaW50ZXJmYWNlIElTcGF0aWFsaXplckhlYWRUcmFja2luZ0NhbGxiYWNrIHsKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGhlYWQgdHJhY2tpbmcgbW9kZSBoYXMgY2hhbmdlZAorICAgICAqLworICAgIHZvaWQgb25IZWFkVHJhY2tpbmdNb2RlQ2hhbmdlZChTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGUgbW9kZSk7CisKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGhlYWQgdG8gc3RhZ2UgcG9zZSBoYXNlIGJlZW4gdXBkYXRlZAorICAgICAqIFRoZSBoZWFkIHRvIHN0YWdlIHBvc2UgaXMgY29udmV5ZWQgYXMgYSB2ZWN0b3Igb2YgNiBlbGVtZW50cywKKyAgICAgKiB3aGVyZSB0aGUgZmlyc3QgdGhyZWUgYXJlIGEgdHJhbnNsYXRpb24gdmVjdG9yIGFuZAorICAgICAqIHRoZSBsYXN0IHRocmVlIGFyZSBhIHJvdGF0aW9uIHZlY3Rvci4KKyAgICAgKi8KKyAgICB2b2lkIG9uSGVhZFRvU291bmRTdGFnZVBvc2VVcGRhdGVkKGluIGZsb2F0W10gaGVhZFRvU3RhZ2UpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5JbnB1dFJlcXVlc3QuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuSW5wdXRSZXF1ZXN0LmFpZGwKaW5kZXggMmU1NTUyNi4uNzVmZjhlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5JbnB1dFJlcXVlc3QuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVxdWVzdC5haWRsCkBAIC0xNiw5ICsxNiw5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0RldmljZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU291cmNlVHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0NvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0RldmljZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1NvdXJjZTsKIAogLyoqCiAgKiB7QGhpZGV9CkBAIC0zMCw3ICszMCw3IEBACiAgICAgaW50IGlucHV0OwogICAgIEF1ZGlvQ29uZmlnIGNvbmZpZzsKICAgICBBdWRpb0RldmljZSBkZXZpY2U7Ci0gICAgQXVkaW9Tb3VyY2VUeXBlIHNvdXJjZTsKKyAgICBBdWRpb1NvdXJjZSBzb3VyY2U7CiAgICAgLyoqIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9JbnB1dEZsYWcuICovCiAgICAgaW50IGZsYWdzOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5JbnB1dFJlc3BvbnNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVzcG9uc2UuYWlkbAppbmRleCBiNjEzYmE1Li40MWJjMzhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVzcG9uc2UuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVzcG9uc2UuYWlkbApAQCAtMTYsOCArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9EZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Db25maWc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9EZXZpY2U7CiAKIC8qKgogICoge0BoaWRlfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXF1ZXN0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3Blbk91dHB1dFJlcXVlc3QuYWlkbAppbmRleCAwNmIxMmU5Li45MGU3ZWE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3Blbk91dHB1dFJlcXVlc3QuYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3Blbk91dHB1dFJlcXVlc3QuYWlkbApAQCAtMTYsOCArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvQ29uZmlnOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvQ29uZmlnQmFzZTsKIAogLyoqCiAgKiB7QGhpZGV9CkBAIC0yNSw3ICsyNiw4IEBACiBwYXJjZWxhYmxlIE9wZW5PdXRwdXRSZXF1ZXN0IHsKICAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fbW9kdWxlX2hhbmRsZV90LiAqLwogICAgIGludCBtb2R1bGU7Ci0gICAgQXVkaW9Db25maWcgY29uZmlnOworICAgIEF1ZGlvQ29uZmlnIGhhbENvbmZpZzsKKyAgICBBdWRpb0NvbmZpZ0Jhc2UgbWl4ZXJDb25maWc7CiAgICAgLyoqIFR5cGUgbXVzdCBiZSBERVZJQ0UuICovCiAgICAgQXVkaW9Qb3J0IGRldmljZTsKICAgICAvKiogQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb091dHB1dEZsYWcuICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3Blbk91dHB1dFJlc3BvbnNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3Blbk91dHB1dFJlc3BvbnNlLmFpZGwKaW5kZXggYTA1MTk2OS4uNDUxYTBiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXNwb25zZS5haWRsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuT3V0cHV0UmVzcG9uc2UuYWlkbApAQCAtMTYsNyArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvQ29uZmlnOwogCiAvKioKICAqIHtAaGlkZX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9SZWNvcmRDbGllbnRJbmZvLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvUmVjb3JkQ2xpZW50SW5mby5haWRsCmluZGV4IDMyODA0NjAuLjdkYWQ1OGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9SZWNvcmRDbGllbnRJbmZvLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1JlY29yZENsaWVudEluZm8uYWlkbApAQCAtMTYsNyArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU291cmNlVHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb1NvdXJjZTsKIAogLyoqCiAgKiB7QGhpZGV9CkBAIC0yOCw3ICsyOCw3IEBACiAgICAgaW50IHVpZDsKICAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fc2Vzc2lvbl90LiAqLwogICAgIGludCBzZXNzaW9uOwotICAgIEF1ZGlvU291cmNlVHlwZSBzb3VyY2U7CisgICAgQXVkaW9Tb3VyY2Ugc291cmNlOwogICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19wb3J0X2hhbmRsZV90LiAqLwogICAgIGludCBwb3J0SWQ7CiAgICAgYm9vbGVhbiBzaWxlbmNlZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Tb3VuZFRyaWdnZXJTZXNzaW9uLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvU291bmRUcmlnZ2VyU2Vzc2lvbi5haWRsCmluZGV4IGE4MjllNTkuLjRiNTQwYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Tb3VuZFRyaWdnZXJTZXNzaW9uLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1NvdW5kVHJpZ2dlclNlc3Npb24uYWlkbApAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0RldmljZURlc2NyaXB0aW9uOworCiAvKioKICAqIHtAaGlkZX0KICAqLwpAQCAtMjQsNiArMjYsNiBAQAogICAgIGludCBzZXNzaW9uOwogICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19pb19oYW5kbGVfdC4gKi8KICAgICBpbnQgaW9IYW5kbGU7Ci0gICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2RldmljZXNfdC4gKi8KLSAgICBpbnQgZGV2aWNlOworICAgIC8qKiBEZXZpY2UgdHlwZS4gKi8KKyAgICBBdWRpb0RldmljZURlc2NyaXB0aW9uIGRldmljZTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9TcGF0aWFsaXphdGlvbkxldmVsLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvU3BhdGlhbGl6YXRpb25MZXZlbC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MWM1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvU3BhdGlhbGl6YXRpb25MZXZlbC5haWRsCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiBUaGUgc3BhdGlhbGl6YXRpb24gbGV2ZWwgc3VwcG9ydGVkIGJ5IHRoZSBzcGF0aWFsaXplciBzdGFnZSBlZmZlY3QgaW1wbGVtZW50YXRpb24uCisgKiBVc2VkIGJ5IG1ldGhvZHMgb2YgdGhlIElTcGF0aWFsaXplciBpbnRlcmZhY2UuCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImJ5dGUiKQorZW51bSBTcGF0aWFsaXphdGlvbkxldmVsIHsKKyAgICAvKiogU3BhdGlhbGl6YXRpb24gaXMgZGlzYWJsZWQuICovCisgICAgTk9ORSA9IDAsCisgICAgLyoqIFRoZSBzcGF0aWFsaXplciBhY2NlcHRzIGF1ZGlvIHdpdGggcG9zaXRpb25hbCBtdWx0aWNoYW5uZWwgbWFza3MgKGUuZyA1LjEpLiAqLworICAgIFNQQVRJQUxJWkVSX01VTFRJQ0hBTk5FTCA9IDEsCisgICAgLyoqIFRoZSBzcGF0aWFsaXplciBhY2NlcHRzIGF1ZGlvIG1hZGUgb2YgYSBjaGFubmVsIGJlZCBvZiBwb3NpdGlvbmFsIG11bHRpY2hhbm5lbHMgKGUuZyA1LjEpCisgICAgICogYW5kIGF1ZGlvIG9iamVjdHMgcG9zaXRpb25lZCBpbmRlcGVuZGVudGx5IHZpYSBtZXRhIGRhdGEuCisgICAgICovCisgICAgU1BBVElBTElaRVJfTUNIQU5fQkVEX1BMVVNfT0JKRUNUUyA9IDIsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvU3BhdGlhbGl6YXRpb25Nb2RlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvU3BhdGlhbGl6YXRpb25Nb2RlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhZmYzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9TcGF0aWFsaXphdGlvbk1vZGUuYWlkbApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICogVGhlIHNwYXRpYWxpemF0aW9uIG1vZGUgc3VwcG9ydGVkIGJ5IHRoZSBzcGF0aWFsaXplciBzdGFnZSBlZmZlY3QgaW1wbGVtZW50YXRpb24uCisgKiBVc2VkIGJ5IG1ldGhvZHMgb2YgdGhlIElTcGF0aWFsaXplciBpbnRlcmZhY2UuCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImJ5dGUiKQorZW51bSBTcGF0aWFsaXphdGlvbk1vZGUgeworICAgIC8qKiBUaGUgc3BhdGlhbGl6ZXIgc3VwcG9ydHMgYmluYXVyYWwgbW9kZSAob3ZlciBoZWFkcGhvbmVzIHR5cGUgZGV2aWNlcykuICovCisgICAgU1BBVElBTElaRVJfQklOQVVSQUwgPSAwLAorICAgIC8qKiBUaGUgc3BhdGlhbGl6ZXIgc3VwcG9ydHMgdHJhbnNhdXJhbCBtb2RlIChvdmVyIHNwZWFrZXIgdHlwZSBkZXZpY2VzKS4gKi8KKyAgICBTUEFUSUFMSVpFUl9UUkFOU0FVUkFMID0gMSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9TcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9TcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGUwZjYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1NwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZS5haWRsCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworCisvKioKKyAqIFRoZSBoZWFkIHRyYWNraW5nIG1vZGUgc3VwcG9ydGVkIGJ5IHRoZSBzcGF0aWFsaXplciBlZmZlY3QgaW1wbGVtZW50YXRpb24uCisgKiBVc2VkIGJ5IG1ldGhvZHMgb2YgdGhlIElTcGF0aWFsaXplciBpbnRlcmZhY2UuCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImJ5dGUiKQorZW51bSBTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGUgeworICAgIC8qKiBIZWFkIHRyYWNraW5nIGlzIGFjdGl2ZSBpbiBhIG1vZGUgbm90IGxpc3RlZCBiZWxvdyAoZm9yd2FyZCBjb21wYXRpYmlsaXR5KSAqLworICAgIE9USEVSID0gMCwKKyAgICAvKiogSGVhZCB0cmFja2luZyBpcyBkaXNhYmxlZCAqLworICAgIERJU0FCTEVEID0gMSwKKyAgICAvKiogSGVhZCB0cmFja2luZyBpcyBwZXJmb3JtZWQgcmVsYXRpdmUgdG8gdGhlIHJlYWwgd29yayBlbnZpcm9ubWVudCAqLworICAgIFJFTEFUSVZFX1dPUkxEID0gMiwKKyAgICAvKiogSGVhZCB0cmFja2luZyBpcyBwZXJmb3JtZWQgcmVsYXRpdmUgdG8gdGhlIGRldmljZSdzIHNjcmVlbiAqLworICAgIFJFTEFUSVZFX1NDUkVFTiA9IDMsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2Z1enplci9BbmRyb2lkLmJwCmluZGV4IGIyOTBhYTguLjk2OWUzZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2Z1enplci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2Z1enplci9BbmRyb2lkLmJwCkBAIC00Niw2ICs0Niw3IEBACiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24tdXRpbCIsCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAogICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAiYXVkaW9mbGluZ2VyLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvcG9saWN5LWFpZGwtY3BwIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2Z1enplci9hdWRpb2ZsaW5nZXJfZnV6emVyLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2Z1enplci9hdWRpb2ZsaW5nZXJfZnV6emVyLmNwcAppbmRleCBkMDNjNmZhLi4wMzZlNzJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9mdXp6ZXIvYXVkaW9mbGluZ2VyX2Z1enplci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvZnV6emVyL2F1ZGlvZmxpbmdlcl9mdXp6ZXIuY3BwCkBAIC01OCw3ICs1OCw4IEBACiAKIGNvbnN0ZXhwciBhdWRpb19tb2RlX3Qga01vZGVzW10gPSB7CiAgICAgQVVESU9fTU9ERV9JTlZBTElELCBBVURJT19NT0RFX0NVUlJFTlQsICAgICAgICAgIEFVRElPX01PREVfTk9STUFMLCAgICAgQVVESU9fTU9ERV9SSU5HVE9ORSwKLSAgICBBVURJT19NT0RFX0lOX0NBTEwsIEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTiwgQVVESU9fTU9ERV9DQUxMX1NDUkVFTn07CisgICAgQVVESU9fTU9ERV9JTl9DQUxMLCBBVURJT19NT0RFX0lOX0NPTU1VTklDQVRJT04sIEFVRElPX01PREVfQ0FMTF9TQ1JFRU4sCisgICAgQVVESU9fTU9ERV9DQUxMX1JFRElSRUNULCBBVURJT19NT0RFX0NPTU1VTklDQVRJT05fUkVESVJFQ1R9OwogCiBjb25zdGV4cHIgYXVkaW9fc2Vzc2lvbl90IGtTZXNzaW9uSWRbXSA9IHtBVURJT19TRVNTSU9OX05PTkUsIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9ERVZJQ0V9OwpAQCAtMjMxLDcgKzIzMiw3IEBACiAgICAgYXR0cmlidXRpb25Tb3VyY2UucGlkID0gVkFMVUVfT1JfRkFUQUwobGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdChnZXRwaWQoKSkpOwogICAgIGF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gc3A8QkJpbmRlcj46Om1ha2UoKTsKICAgICB0cmFjay0+c2V0KEFVRElPX1NUUkVBTV9ERUZBVUxULCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBmbGFncywgbnVsbHB0ciwKLSAgICAgICAgICAgICAgIG51bGxwdHIsIG5vdGlmaWNhdGlvbkZyYW1lcywgc2hhcmVkQnVmZmVyLCBmYWxzZSwgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBzaGFyZWRCdWZmZXIsIGZhbHNlLCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAoKGZhc3QgJiYgc2hhcmVkQnVmZmVyID09IDApIHx8IG9mZmxvYWQpID8gQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgb2ZmbG9hZCA/ICZvZmZsb2FkSW5mbyA6IG51bGxwdHIsIGF0dHJpYnV0aW9uU291cmNlLCAmYXR0cmlidXRlcywgZmFsc2UsIDEuMGYsCkBAIC0zMTQsNyArMzE1LDcgQEAKICAgICBhdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZSA9IHN0ZDo6c3RyaW5nKG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpOwogICAgIGF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gc3A8QkJpbmRlcj46Om1ha2UoKTsKICAgICBzcDxBdWRpb1JlY29yZD4gcmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICByZWNvcmQtPnNldChBVURJT19TT1VSQ0VfREVGQVVMVCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICByZWNvcmQtPnNldChBVURJT19TT1VSQ0VfREVGQVVMVCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgbnVsbHB0ciwKICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIGZhbHNlLCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgZmFzdCA/IEF1ZGlvUmVjb3JkOjpUUkFOU0ZFUl9DQUxMQkFDSyA6IEF1ZGlvUmVjb3JkOjpUUkFOU0ZFUl9ERUZBVUxULCBmbGFncywKICAgICAgICAgICAgICAgICBnZXR1aWQoKSwgZ2V0cGlkKCksICZhdHRyaWJ1dGVzLCBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKQEAgLTM1NCw3ICszNTUsNyBAQAogICAgIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpKTsKICAgICByZWNvcmQtPm9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsIHdhaXRDb3VudCwgJm5vbkNvbnRpZyk7CiAgICAgYm9vbCBibG9ja2luZyA9IGZhbHNlOwotICAgIHJlY29yZC0+cmVhZChhdWRpb0J1ZmZlci5yYXcsIGF1ZGlvQnVmZmVyLnNpemUsIGJsb2NraW5nKTsKKyAgICByZWNvcmQtPnJlYWQoYXVkaW9CdWZmZXIuZGF0YSgpLCBhdWRpb0J1ZmZlci5zaXplKCksIGJsb2NraW5nKTsKICAgICByZWNvcmQtPmdldElucHV0RnJhbWVzTG9zdCgpOwogICAgIHJlY29yZC0+Z2V0RmxhZ3MoKTsKIApAQCAtMzgzLDYgKzM4NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZyZXBseURhdGEgX191bnVzZWQpIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIH0KKyAgICBiaW5kZXI6OlN0YXR1cyBmcmFtZXNQcm9jZXNzZWQoaW50MzJfdCBmcmFtZXMgX191bnVzZWQpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH0KIH07CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlckZ1enplcjo6aW52b2tlQXVkaW9FZmZlY3QoKSB7CkBAIC00MjQsNiArNDI4LDcgQEAKICAgICByZXF1ZXN0LmF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lID0gb3BQYWNrYWdlTmFtZTsKICAgICByZXF1ZXN0LmF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdChnZXRwaWQoKSkpOwogICAgIHJlcXVlc3QucHJvYmUgPSBmYWxzZTsKKyAgICByZXF1ZXN0Lm5vdGlmeUZyYW1lc1Byb2Nlc3NlZCA9IGZhbHNlOwogCiAgICAgbWVkaWE6OkNyZWF0ZUVmZmVjdFJlc3BvbnNlIHJlc3BvbnNle307CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWYtPmNyZWF0ZUVmZmVjdChyZXF1ZXN0LCAmcmVzcG9uc2UpOwpAQCAtNTk3LDkgKzYwMiwxMCBAQAogICAgIG1lZGlhOjpPcGVuSW5wdXRSZXF1ZXN0IHJlcXVlc3R7fTsKICAgICByZXF1ZXN0Lm1vZHVsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobW9kdWxlKSk7CiAgICAgcmVxdWVzdC5pbnB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpbnB1dCkpOwotICAgIHJlcXVlc3QuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25maWcpKTsKKyAgICByZXF1ZXN0LmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25maWcsIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICByZXF1ZXN0LmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhkZXZpY2VUeXBlQWRkcikpOwotICAgIHJlcXVlc3Quc291cmNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoc291cmNlKSk7CisgICAgcmVxdWVzdC5zb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlKHNvdXJjZSkpOwogICAgIHJlcXVlc3QuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfaW50MzJfdF9tYXNrKGZsYWdzKSk7CiAKICAgICBtZWRpYTo6T3BlbklucHV0UmVzcG9uc2UgcmVzcG9uc2V7fTsKQEAgLTY0OCwxMSArNjU0LDE2IEBACiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+IGRldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yQmFzZShnZXRWYWx1ZSgmbUZkcCwga0RldmljZXMpKTsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IGdldFZhbHVlKCZtRmRwLCBrT3V0cHV0RmxhZ3MpOwogCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBtaXhlckNvbmZpZyA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworCiAgICAgbWVkaWE6Ok9wZW5PdXRwdXRSZXF1ZXN0IHJlcXVlc3R7fTsKICAgICBtZWRpYTo6T3Blbk91dHB1dFJlc3BvbnNlIHJlc3BvbnNle307CiAKICAgICByZXF1ZXN0Lm1vZHVsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobW9kdWxlKSk7Ci0gICAgcmVxdWVzdC5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbmZpZykpOworICAgIHJlcXVlc3QuaGFsQ29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbmZpZywgZmFsc2UgLyppc0lucHV0Ki8pKTsKKyAgICByZXF1ZXN0Lm1peGVyQ29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKG1peGVyQ29uZmlnLCBmYWxzZSAvKmlzSW5wdXQqLykpOwogICAgIHJlcXVlc3QuZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9EZXZpY2VEZXNjcmlwdG9yQmFzZShkZXZpY2UpKTsKICAgICByZXF1ZXN0LmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soZmxhZ3MpKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BaWRsQ29udmVyc2lvbi5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BaWRsQ29udmVyc2lvbi5oCmluZGV4IDRlYzY5YzcuLmU3NjkzMDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQWlkbENvbnZlcnNpb24uaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0FpZGxDb252ZXJzaW9uLmgKQEAgLTIzLDM0ICsyMyw0MyBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbC5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9DbGllbnQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0NvbmZpZ0Jhc2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvRGlyZWN0TW9kZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9EdWFsTW9ub01vZGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9GbGFnLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0dhaW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbk1vZGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvSW5wdXRGbGFncy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Jb0NvbmZpZ0V2ZW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9NaXhMYXRlbmN5Q2xhc3MuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvTW9kZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9PdXRwdXRGbGFncy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9QbGF5YmFja1JhdGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydC5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnVHlwZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RGV2aWNlRXh0Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRFeHQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydE1peEV4dC5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0U2Vzc2lvbkV4dC5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydERldmljZUV4dFN5cy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9UaW1lc3RhbXBJbnRlcm5hbC5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9VbmlxdWVJZFVzZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvRWZmZWN0RGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvRXh0cmFBdWRpb0Rlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL1RyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mby5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvQ2hhbm5lbExheW91dC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvQ29uZmlnLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Db25maWdCYXNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Db250ZW50VHlwZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0dhaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0dhaW5Db25maWcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb0dhaW5Nb2RlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9JbnB1dEZsYWdzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Nb2RlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9PZmZsb2FkSW5mby5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvT3V0cHV0RmxhZ3MuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb1BvcnRFeHQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb1BvcnRNaXhFeHQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb1Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb1NvdXJjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvU3RhbmRhcmQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb1VzYWdlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9VdWlkLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vRXh0cmFBdWRpb0Rlc2NyaXB0b3IuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvU2hhcmVkRmlsZVJlZ2lvbi5oPgogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CkBAIC04NiwxOSArOTUsOSBAQAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19od19zeW5jX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faHdfc3luY190KGludDMyX3QgYWlkbCk7CiBDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2h3X3N5bmNfdF9pbnQzMl90KGF1ZGlvX2h3X3N5bmNfdCBsZWdhY3kpOwogCi0vLyBUaGUgbGVnYWN5IGVudW0gaXMgdW5uYW1lZC4gVGh1cywgd2UgdXNlIGludDMyX3QuCi1Db252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ1R5cGVfaW50MzJfdCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGUgYWlkbCk7Ci0vLyBUaGUgbGVnYWN5IGVudW0gaXMgdW5uYW1lZC4gVGh1cywgd2UgdXNlIGludDMyX3QuCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlPiBsZWdhY3kyYWlkbF9pbnQzMl90X0F1ZGlvUG9ydENvbmZpZ1R5cGUoCi0gICAgICAgIGludDMyX3QgbGVnYWN5KTsKLQogQ29udmVyc2lvblJlc3VsdDx1bnNpZ25lZCBpbnQ+IGFpZGwybGVnYWN5X2ludDMyX3RfY29uZmlnX21hc2soaW50MzJfdCBhaWRsKTsKIENvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfY29uZmlnX21hc2tfaW50MzJfdCh1bnNpZ25lZCBpbnQgbGVnYWN5KTsKIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19jaGFubmVsX21hc2tfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdChpbnQzMl90IGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGF1ZGlvX2NoYW5uZWxfbWFza190IGxlZ2FjeSk7Ci0KIENvbnZlcnNpb25SZXN1bHQ8cGlkX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QoaW50MzJfdCBhaWRsKTsKIENvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdChwaWRfdCBsZWdhY3kpOwogCkBAIC0xMTYsMTAgKzExNSwxMCBAQAogQ29udmVyc2lvblJlc3VsdDxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nX3ZpZXc+PgogbGVnYWN5MmFpZGxfb3B0aW9uYWxfU3RyaW5nMTZfb3B0aW9uYWxfc3RyaW5nKHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+IGxlZ2FjeSk7CiAKLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW9fY29uZmlnX2V2ZW50PiBhaWRsMmxlZ2FjeV9BdWRpb0lvQ29uZmlnRXZlbnRfYXVkaW9faW9fY29uZmlnX2V2ZW50KAorQ29udmVyc2lvblJlc3VsdDxhdWRpb19pb19jb25maWdfZXZlbnRfdD4gYWlkbDJsZWdhY3lfQXVkaW9Jb0NvbmZpZ0V2ZW50X2F1ZGlvX2lvX2NvbmZpZ19ldmVudF90KAogICAgICAgICBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50IGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50PiBsZWdhY3kyYWlkbF9hdWRpb19pb19jb25maWdfZXZlbnRfQXVkaW9Jb0NvbmZpZ0V2ZW50KAotICAgICAgICBhdWRpb19pb19jb25maWdfZXZlbnQgbGVnYWN5KTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudD4gbGVnYWN5MmFpZGxfYXVkaW9faW9fY29uZmlnX2V2ZW50X3RfQXVkaW9Jb0NvbmZpZ0V2ZW50KAorICAgICAgICBhdWRpb19pb19jb25maWdfZXZlbnRfdCBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfcm9sZV90PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRSb2xlX2F1ZGlvX3BvcnRfcm9sZV90KAogICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0Um9sZSBhaWRsKTsKQEAgLTEzMSwzNiArMTMwLDU5IEBACiBDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRUeXBlPiBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3R5cGVfdF9BdWRpb1BvcnRUeXBlKAogICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCBsZWdhY3kpOwogCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX2Zvcm1hdF90PiBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdCgKLSAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+IGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KAotICAgICAgICBhdWRpb19mb3JtYXRfdCBsZWdhY3kpOworQ29udmVyc2lvblJlc3VsdDxhdWRpb19jaGFubmVsX21hc2tfdD4gYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2F1ZGlvX2NoYW5uZWxfbWFza190KAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9DaGFubmVsTGF5b3V0JiBhaWRsLCBib29sIGlzSW5wdXQpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9DaGFubmVsTGF5b3V0PgorbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfQXVkaW9DaGFubmVsTGF5b3V0KGF1ZGlvX2NoYW5uZWxfbWFza190IGxlZ2FjeSwgYm9vbCBpc0lucHV0KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19kZXZpY2VzX3Q+IGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb25fYXVkaW9fZGV2aWNlc190KAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2VEZXNjcmlwdGlvbiYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZURlc2NyaXB0aW9uPgorbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oYXVkaW9fZGV2aWNlc190IGxlZ2FjeSk7CisKK3N0YXR1c190IGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlX2F1ZGlvX2RldmljZSgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlJiBhaWRsLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QqIGxlZ2FjeVR5cGUsIGNoYXIqIGxlZ2FjeUFkZHJlc3MpOworc3RhdHVzX3QgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VfYXVkaW9fZGV2aWNlKAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2UmIGFpZGwsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCogbGVnYWN5VHlwZSwgU3RyaW5nOCogbGVnYWN5QWRkcmVzcyk7CitzdGF0dXNfdCBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZV9hdWRpb19kZXZpY2UoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZSYgYWlkbCwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190KiBsZWdhY3lUeXBlLCBzdGQ6OnN0cmluZyogbGVnYWN5QWRkcmVzcyk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZV9BdWRpb0RldmljZSgKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGxlZ2FjeVR5cGUsIGNvbnN0IGNoYXIqIGxlZ2FjeUFkZHJlc3MpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9EZXZpY2U+CitsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VfQXVkaW9EZXZpY2UoCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBsZWdhY3lUeXBlLCBjb25zdCBTdHJpbmc4JiBsZWdhY3lBZGRyZXNzKTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19mb3JtYXRfdD4gYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdCgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0RGVzY3JpcHRpb24mIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oYXVkaW9fZm9ybWF0X3QgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19nYWluX21vZGVfdD4KLWFpZGwybGVnYWN5X0F1ZGlvR2Fpbk1vZGVfYXVkaW9fZ2Fpbl9tb2RlX3QobWVkaWE6OkF1ZGlvR2Fpbk1vZGUgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW5Nb2RlPgorYWlkbDJsZWdhY3lfQXVkaW9HYWluTW9kZV9hdWRpb19nYWluX21vZGVfdChtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluTW9kZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2Fpbk1vZGU+CiBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9BdWRpb0dhaW5Nb2RlKGF1ZGlvX2dhaW5fbW9kZV90IGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbl9tb2RlX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZ2Fpbl9tb2RlX3RfbWFzayhpbnQzMl90IGFpZGwpOwogQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9pbnQzMl90X21hc2soYXVkaW9fZ2Fpbl9tb2RlX3QgbGVnYWN5KTsKIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19kZXZpY2VzX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGludDMyX3QgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGF1ZGlvX2RldmljZXNfdCBsZWdhY3kpOwotCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2dhaW5fY29uZmlnPiBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5Db25maWdfYXVkaW9fZ2Fpbl9jb25maWcoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0dhaW5Db25maWcmIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGUsIG1lZGlhOjpBdWRpb1BvcnRUeXBlIHR5cGUpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9HYWluQ29uZmlnPiBsZWdhY3kyYWlkbF9hdWRpb19nYWluX2NvbmZpZ19BdWRpb0dhaW5Db25maWcoCi0gICAgICAgIGNvbnN0IGF1ZGlvX2dhaW5fY29uZmlnJiBsZWdhY3ksIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUpOworICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluQ29uZmlnJiBhaWRsLCBib29sIGlzSW5wdXQpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluQ29uZmlnPgorbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9jb25maWdfQXVkaW9HYWluQ29uZmlnKGNvbnN0IGF1ZGlvX2dhaW5fY29uZmlnJiBsZWdhY3ksIGJvb2wgaXNJbnB1dCk7CiAKLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW5wdXRfZmxhZ3NfdD4gYWlkbDJsZWdhY3lfQXVkaW9JbnB1dEZsYWdzX2F1ZGlvX2lucHV0X2ZsYWdzX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3MgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfQXVkaW9JbnB1dEZsYWdzKAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGxlZ2FjeSk7CitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0lucHV0RmxhZ3NfYXVkaW9faW5wdXRfZmxhZ3NfdChtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9JbnB1dEZsYWdzIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9JbnB1dEZsYWdzPgorbGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9BdWRpb0lucHV0RmxhZ3MoYXVkaW9faW5wdXRfZmxhZ3NfdCBsZWdhY3kpOwogCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX291dHB1dF9mbGFnc190PiBhaWRsMmxlZ2FjeV9BdWRpb091dHB1dEZsYWdzX2F1ZGlvX291dHB1dF9mbGFnc190KAotICAgICAgICBtZWRpYTo6QXVkaW9PdXRwdXRGbGFncyBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M+IGxlZ2FjeTJhaWRsX2F1ZGlvX291dHB1dF9mbGFnc190X0F1ZGlvT3V0cHV0RmxhZ3MoCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGxlZ2FjeSk7CitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX291dHB1dF9mbGFnc190PgorYWlkbDJsZWdhY3lfQXVkaW9PdXRwdXRGbGFnc19hdWRpb19vdXRwdXRfZmxhZ3NfdChtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9PdXRwdXRGbGFncyBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvT3V0cHV0RmxhZ3M+CitsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9BdWRpb091dHB1dEZsYWdzKGF1ZGlvX291dHB1dF9mbGFnc190IGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW5wdXRfZmxhZ3NfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pbnB1dF9mbGFnc190X21hc2soCiAgICAgICAgIGludDMyX3QgYWlkbCk7CkBAIC0xNzMsNDAgKzE5NSw0MyBAQAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lvX2ZsYWdzPiBhaWRsMmxlZ2FjeV9BdWRpb0lvRmxhZ3NfYXVkaW9faW9fZmxhZ3MoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0lvRmxhZ3MmIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGUsIG1lZGlhOjpBdWRpb1BvcnRUeXBlIHR5cGUpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Jb0ZsYWdzPiBsZWdhY3kyYWlkbF9hdWRpb19pb19mbGFnc19BdWRpb0lvRmxhZ3MoCi0gICAgICAgIGNvbnN0IGF1ZGlvX2lvX2ZsYWdzJiBsZWdhY3ksIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUpOworICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Jb0ZsYWdzJiBhaWRsLCBib29sIGlzSW5wdXQpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Jb0ZsYWdzPiBsZWdhY3kyYWlkbF9hdWRpb19pb19mbGFnc19BdWRpb0lvRmxhZ3MoCisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2ZsYWdzJiBsZWdhY3ksIGJvb2wgaXNJbnB1dCk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dD4KLWFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0KAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0JiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZ0RldmljZUV4dD4KLWxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHRfQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0KAotICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0JiBsZWdhY3kpOworYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RGV2aWNlRXh0X2F1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHQoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnREZXZpY2VFeHQmIGFpZGwsCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHRTeXMmIGFpZGxEZXZpY2VFeHQpOworc3RhdHVzX3QgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dF9BdWRpb1BvcnREZXZpY2VFeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHQmIGxlZ2FjeSwKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydERldmljZUV4dCogYWlkbCwKKyAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dFN5cyogYWlkbERldmljZUV4dCk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4gYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3QoCi0gICAgICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU+IGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKAotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IGxlZ2FjeSk7CisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0cmVhbVR5cGUgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1N0cmVhbVR5cGU+CitsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IGxlZ2FjeSk7CiAKLUNvbnZlcnNpb25SZXN1bHQ8YXVkaW9fc291cmNlX3Q+IGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvU291cmNlVHlwZT4gbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKAorQ29udmVyc2lvblJlc3VsdDxhdWRpb19zb3VyY2VfdD4gYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VfYXVkaW9fc291cmNlX3QoCisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1NvdXJjZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU291cmNlPgorICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZSgKICAgICAgICAgYXVkaW9fc291cmNlX3QgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19zZXNzaW9uX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KGludDMyX3QgYWlkbCk7CiBDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX3Nlc3Npb25fdF9pbnQzMl90KGF1ZGlvX3Nlc3Npb25fdCBsZWdhY3kpOwogCi1Db252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ01peEV4dCgKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ01peEV4dCYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRDb25maWdNaXhFeHQ+IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydENvbmZpZ01peEV4dCgKLSAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dCYgbGVnYWN5LCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKTsKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0TWl4RXh0KAorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0TWl4RXh0JiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlLAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0U3lzJiBhaWRsTWl4RXh0KTsKK3N0YXR1c190IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydE1peEV4dCgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dCYgbGVnYWN5LCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0TWl4RXh0KiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0U3lzKiBhaWRsTWl4RXh0KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dD4KLWFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHRfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0JiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQ+Ci1sZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dF9BdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0KAorYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dChpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dF9BdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0KAogICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dCYgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZz4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnX2F1ZGlvX3BvcnRfY29uZmlnKApAQCAtMjIxLDcgKzI0Niw2IEBACiAKIENvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9Jb0Rlc2NyaXB0b3I+PiBhaWRsMmxlZ2FjeV9BdWRpb0lvRGVzY3JpcHRvcl9BdWRpb0lvRGVzY3JpcHRvcigKICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvSW9EZXNjcmlwdG9yJiBhaWRsKTsKLQogQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Jb0Rlc2NyaXB0b3I+IGxlZ2FjeTJhaWRsX0F1ZGlvSW9EZXNjcmlwdG9yX0F1ZGlvSW9EZXNjcmlwdG9yKAogICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4mIGxlZ2FjeSk7CiAKQEAgLTIzMSwxMyArMjU1LDE0IEBACiAgICAgICAgIGNvbnN0IEF1ZGlvQ2xpZW50JiBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NvbnRlbnRfdHlwZV90PgotYWlkbDJsZWdhY3lfQXVkaW9Db250ZW50VHlwZV9hdWRpb19jb250ZW50X3R5cGVfdChtZWRpYTo6QXVkaW9Db250ZW50VHlwZSBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvQ29udGVudFR5cGU+CithaWRsMmxlZ2FjeV9BdWRpb0NvbnRlbnRUeXBlX2F1ZGlvX2NvbnRlbnRfdHlwZV90KAorICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db250ZW50VHlwZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ29udGVudFR5cGU+CiBsZWdhY3kyYWlkbF9hdWRpb19jb250ZW50X3R5cGVfdF9BdWRpb0NvbnRlbnRUeXBlKGF1ZGlvX2NvbnRlbnRfdHlwZV90IGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdXNhZ2VfdD4KLWFpZGwybGVnYWN5X0F1ZGlvVXNhZ2VfYXVkaW9fdXNhZ2VfdChtZWRpYTo6QXVkaW9Vc2FnZSBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvVXNhZ2U+CithaWRsMmxlZ2FjeV9BdWRpb1VzYWdlX2F1ZGlvX3VzYWdlX3QobWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvVXNhZ2UgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1VzYWdlPgogbGVnYWN5MmFpZGxfYXVkaW9fdXNhZ2VfdF9BdWRpb1VzYWdlKGF1ZGlvX3VzYWdlX3QgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19mbGFnc19tYXNrX3Q+CkBAIC0yNTYsMjQgKzI4MSwyNyBAQAogbGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdD4KLWFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3QobWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlPgorYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZV9hdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdCgKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlPgogbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3RfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZShhdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdCBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX29mZmxvYWRfaW5mb190PgotYWlkbDJsZWdhY3lfQXVkaW9PZmZsb2FkSW5mb19hdWRpb19vZmZsb2FkX2luZm9fdChjb25zdCBtZWRpYTo6QXVkaW9PZmZsb2FkSW5mbyYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb09mZmxvYWRJbmZvPgorYWlkbDJsZWdhY3lfQXVkaW9PZmZsb2FkSW5mb19hdWRpb19vZmZsb2FkX2luZm9fdCgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvT2ZmbG9hZEluZm8mIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9PZmZsb2FkSW5mbz4KIGxlZ2FjeTJhaWRsX2F1ZGlvX29mZmxvYWRfaW5mb190X0F1ZGlvT2ZmbG9hZEluZm8oY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fY29uZmlnX3Q+Ci1haWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChjb25zdCBtZWRpYTo6QXVkaW9Db25maWcmIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Db25maWc+Ci1sZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25zdCBhdWRpb19jb25maWdfdCYgbGVnYWN5KTsKK2FpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZyYgYWlkbCwgYm9vbCBpc0lucHV0KTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ29uZmlnPgorbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoY29uc3QgYXVkaW9fY29uZmlnX3QmIGxlZ2FjeSwgYm9vbCBpc0lucHV0KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19jb25maWdfYmFzZV90PgotYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2U+Ci1sZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBsZWdhY3kpOworYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoCisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZ0Jhc2UmIGFpZGwsIGJvb2wgaXNJbnB1dCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZ0Jhc2U+CitsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBsZWdhY3ksIGJvb2wgaXNJbnB1dCk7CiAKIENvbnZlcnNpb25SZXN1bHQ8c3A8SU1lbW9yeT4+CiBhaWRsMmxlZ2FjeV9TaGFyZWRGaWxlUmVnaW9uX0lNZW1vcnkoY29uc3QgbWVkaWE6OlNoYXJlZEZpbGVSZWdpb24mIGFpZGwpOwpAQCAtMjkxLDggKzMxOSw4IEBACiBsZWdhY3kyYWlkbF9BdWRpb1RpbWVzdGFtcF9BdWRpb1RpbWVzdGFtcEludGVybmFsKGNvbnN0IEF1ZGlvVGltZXN0YW1wJiBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3V1aWRfdD4KLWFpZGwybGVnYWN5X0F1ZGlvVXVpZF9hdWRpb191dWlkX3QoY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1V1aWQ+CithaWRsMmxlZ2FjeV9BdWRpb1V1aWRfYXVkaW9fdXVpZF90KGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1V1aWQmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9VdWlkPgogbGVnYWN5MmFpZGxfYXVkaW9fdXVpZF90X0F1ZGlvVXVpZChjb25zdCBhdWRpb191dWlkX3QmIGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4KQEAgLTMwMiw4ICszMzAsOCBAQAogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90PgogYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90KAotICAgICAgICBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPgorICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPgogbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3RfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlKAogICAgICAgICBhdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdCBsZWdhY3kpOwogCkBAIC0zMTcsMzcgKzM0NSwzOSBAQAogQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PgogbGVnYWN5MmFpZGxfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX21hc2sodWludDMyX3QgbGVnYWN5KTsKIAotQ29udmVyc2lvblJlc3VsdDxhdWRpb19taXhfbGF0ZW5jeV9jbGFzc190PgotYWlkbDJsZWdhY3lfQXVkaW9NaXhMYXRlbmN5Q2xhc3NfYXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvTWl4TGF0ZW5jeUNsYXNzIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9NaXhMYXRlbmN5Q2xhc3M+Ci1sZWdhY3kyYWlkbF9hdWRpb19taXhfbGF0ZW5jeV9jbGFzc190X0F1ZGlvTWl4TGF0ZW5jeUNsYXNzKAotICAgICAgICBhdWRpb19taXhfbGF0ZW5jeV9jbGFzc190IGxlZ2FjeSk7Ci0KIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9kZXZpY2VfZXh0PgotYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RGV2aWNlRXh0X2F1ZGlvX3BvcnRfZGV2aWNlX2V4dChjb25zdCBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0JiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dD4KLWxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfZGV2aWNlX2V4dF9BdWRpb1BvcnREZXZpY2VFeHQoY29uc3QgYXVkaW9fcG9ydF9kZXZpY2VfZXh0JiBsZWdhY3kpOworYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RGV2aWNlRXh0X2F1ZGlvX3BvcnRfZGV2aWNlX2V4dCgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydERldmljZUV4dCYgYWlkbCwKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dFN5cyYgYWlkbERldmljZUV4dCk7CitzdGF0dXNfdCBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2RldmljZV9leHRfQXVkaW9Qb3J0RGV2aWNlRXh0KAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2RldmljZV9leHQmIGxlZ2FjeSwKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydERldmljZUV4dCogYWlkbCwKKyAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dFN5cyogYWlkbERldmljZUV4dCk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9taXhfZXh0PgotYWlkbDJsZWdhY3lfQXVkaW9Qb3J0TWl4RXh0X2F1ZGlvX3BvcnRfbWl4X2V4dChjb25zdCBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0JiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydE1peEV4dD4KLWxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfbWl4X2V4dF9BdWRpb1BvcnRNaXhFeHQoY29uc3QgYXVkaW9fcG9ydF9taXhfZXh0JiBsZWdhY3kpOworYWlkbDJsZWdhY3lfQXVkaW9Qb3J0TWl4RXh0X2F1ZGlvX3BvcnRfbWl4X2V4dCgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydE1peEV4dCYgYWlkbCwKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dFN5cyYgYWlkbE1peEV4dCk7CitzdGF0dXNfdCBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X21peF9leHRfQXVkaW9Qb3J0TWl4RXh0KAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X21peF9leHQmIGxlZ2FjeSwKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydE1peEV4dCogYWlkbCwKKyAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dFN5cyogYWlkbE1peEV4dCk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9zZXNzaW9uX2V4dD4KLWFpZGwybGVnYWN5X0F1ZGlvUG9ydFNlc3Npb25FeHRfYXVkaW9fcG9ydF9zZXNzaW9uX2V4dChjb25zdCBtZWRpYTo6QXVkaW9Qb3J0U2Vzc2lvbkV4dCYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRTZXNzaW9uRXh0PgotbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9zZXNzaW9uX2V4dF9BdWRpb1BvcnRTZXNzaW9uRXh0KGNvbnN0IGF1ZGlvX3BvcnRfc2Vzc2lvbl9leHQmIGxlZ2FjeSk7CithaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHQoaW50MzJfdCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHRfaW50MzJfdChjb25zdCBhdWRpb19wb3J0X3Nlc3Npb25fZXh0JiBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3Byb2ZpbGU+Ci1haWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVfYXVkaW9fcHJvZmlsZShjb25zdCBtZWRpYTo6QXVkaW9Qcm9maWxlJiBhaWRsKTsKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUHJvZmlsZT4KLWxlZ2FjeTJhaWRsX2F1ZGlvX3Byb2ZpbGVfQXVkaW9Qcm9maWxlKGNvbnN0IGF1ZGlvX3Byb2ZpbGUmIGxlZ2FjeSk7CithaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVfYXVkaW9fcHJvZmlsZSgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZSYgYWlkbCwgYm9vbCBpc0lucHV0KTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3Byb2ZpbGVfQXVkaW9Qcm9maWxlKGNvbnN0IGF1ZGlvX3Byb2ZpbGUmIGxlZ2FjeSwgYm9vbCBpc0lucHV0KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19nYWluPgotYWlkbDJsZWdhY3lfQXVkaW9HYWluX2F1ZGlvX2dhaW4oY29uc3QgbWVkaWE6OkF1ZGlvR2FpbiYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW4+Ci1sZWdhY3kyYWlkbF9hdWRpb19nYWluX0F1ZGlvR2Fpbihjb25zdCBhdWRpb19nYWluJiBsZWdhY3kpOworYWlkbDJsZWdhY3lfQXVkaW9HYWluX2F1ZGlvX2dhaW4oY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2FpbiYgYWlkbCwgYm9vbCBpc0lucHV0KTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2Fpbj4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fQXVkaW9HYWluKGNvbnN0IGF1ZGlvX2dhaW4mIGxlZ2FjeSwgYm9vbCBpc0lucHV0KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X3Y3PgogYWlkbDJsZWdhY3lfQXVkaW9Qb3J0X2F1ZGlvX3BvcnRfdjcoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgYWlkbCk7CkBAIC0zNTUsOCArMzg1LDggQEAKIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdjdfQXVkaW9Qb3J0KGNvbnN0IGF1ZGlvX3BvcnRfdjcmIGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fbW9kZV90PgotYWlkbDJsZWdhY3lfQXVkaW9Nb2RlX2F1ZGlvX21vZGVfdChtZWRpYTo6QXVkaW9Nb2RlIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Nb2RlPgorYWlkbDJsZWdhY3lfQXVkaW9Nb2RlX2F1ZGlvX21vZGVfdChtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Nb2RlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Nb2RlPgogbGVnYWN5MmFpZGxfYXVkaW9fbW9kZV90X0F1ZGlvTW9kZShhdWRpb19tb2RlX3QgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb191bmlxdWVfaWRfdXNlX3Q+CkBAIC0zOTAsMjEgKzQyMCwyMSBAQAogbGVnYWN5MmFpZGxfYXVkaW9fcGxheWJhY2tfcmF0ZV90X0F1ZGlvUGxheWJhY2tSYXRlKGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgbGVnYWN5KTsKIAogQ29udmVyc2lvblJlc3VsdDxhdWRpb19zdGFuZGFyZF90PgotYWlkbDJsZWdhY3lfQXVkaW9TdGFuZGFyZF9hdWRpb19zdGFuZGFyZF90KG1lZGlhOjpBdWRpb1N0YW5kYXJkIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9TdGFuZGFyZD4KK2FpZGwybGVnYWN5X0F1ZGlvU3RhbmRhcmRfYXVkaW9fc3RhbmRhcmRfdChtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdGFuZGFyZCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU3RhbmRhcmQ+CiBsZWdhY3kyYWlkbF9hdWRpb19zdGFuZGFyZF90X0F1ZGlvU3RhbmRhcmQoYXVkaW9fc3RhbmRhcmRfdCBsZWdhY3kpOwogCiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3I+CiBhaWRsMmxlZ2FjeV9FeHRyYUF1ZGlvRGVzY3JpcHRvcl9hdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yKAotICAgICAgICBjb25zdCBtZWRpYTo6RXh0cmFBdWRpb0Rlc2NyaXB0b3ImIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6RXh0cmFBdWRpb0Rlc2NyaXB0b3I+CisgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpFeHRyYUF1ZGlvRGVzY3JpcHRvciYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpFeHRyYUF1ZGlvRGVzY3JpcHRvcj4KIGxlZ2FjeTJhaWRsX2F1ZGlvX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JfRXh0cmFBdWRpb0Rlc2NyaXB0b3IoCiAgICAgICAgIGNvbnN0IGF1ZGlvX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3ImIGxlZ2FjeSk7CiAKIENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3Q+CiBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90KAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uVHlwZSYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlPgorICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9FbmNhcHN1bGF0aW9uVHlwZSYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlPgogbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3RfQXVkaW9FbmNhcHN1bGF0aW9uVHlwZSgKICAgICAgICAgY29uc3QgYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3QgJiBsZWdhY3kpOwogCkBAIC00MTYsNSArNDQ2LDEzIEBACiBsZWdhY3kyYWlkbF9UcmFja1NlY29uZGFyeU91dHB1dEluZm9QYWlyX1RyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mbygKICAgICAgICAgY29uc3QgVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvUGFpciYgbGVnYWN5KTsKIAorQ29udmVyc2lvblJlc3VsdDxhdWRpb19kaXJlY3RfbW9kZV90PgorYWlkbDJsZWdhY3lfQXVkaW9EaXJlY3RNb2RlX2F1ZGlvX2RpcmVjdF9tb2RlX3QobWVkaWE6OkF1ZGlvRGlyZWN0TW9kZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRGlyZWN0TW9kZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2RpcmVjdF9tb2RlX3RfQXVkaW9EaXJlY3RNb2RlKGF1ZGlvX2RpcmVjdF9tb2RlX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19kaXJlY3RfbW9kZV90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RpcmVjdF9tb2RlX3RfbWFzayhpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19kaXJlY3RfbW9kZV90X2ludDMyX3RfbWFzayhhdWRpb19kaXJlY3RfbW9kZV90IGxlZ2FjeSk7CisKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQWlkbENvbnZlcnNpb25VdGlsLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0FpZGxDb252ZXJzaW9uVXRpbC5oCmluZGV4IGMxYTJiZTMuLjg4MTdjMzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQWlkbENvbnZlcnNpb25VdGlsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BaWRsQ29udmVyc2lvblV0aWwuaApAQCAtMjAsNDIgKzIwLDE0IEBACiAjaW5jbHVkZSA8dHlwZV90cmFpdHM+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9leHBlY3RlZC5oPgorI2luY2x1ZGUgPGJpbmRlci9FbnVtcy5oPgogI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDxlcnJvci9SZXN1bHQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXVzaW5nIENvbnZlcnNpb25SZXN1bHQgPSBiYXNlOjpleHBlY3RlZDxULCBzdGF0dXNfdD47Ci0KLS8vIENvbnZlbmllbmNlIG1hY3JvcyBmb3Igd29ya2luZyB3aXRoIENvbnZlcnNpb25SZXN1bHQsIHVzZWZ1bCBmb3Igd3JpdGluZyBjb252ZXJ0ZWQgZm9yIGFnZ3JlZ2F0ZQotLy8gdHlwZXMuCi0KLSNkZWZpbmUgVkFMVUVfT1JfUkVUVVJOKHJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYXV0byBfdG1wID0gKHJlc3VsdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKCFfdG1wLm9rKCkpIHJldHVybiBiYXNlOjp1bmV4cGVjdGVkKF90bXAuZXJyb3IoKSk7IFwKLSAgICAgICAgc3RkOjptb3ZlKF90bXAudmFsdWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9KQotCi0jZGVmaW5lIFJFVFVSTl9JRl9FUlJPUihyZXN1bHQpIFwKLSAgICBpZiAoc3RhdHVzX3QgX3RtcCA9IChyZXN1bHQpOyBfdG1wICE9IE9LKSByZXR1cm4gYmFzZTo6dW5leHBlY3RlZChfdG1wKTsKLQotI2RlZmluZSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKHgpICAgICAgICAgICBcCi0gICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBhdXRvIF90bXAgPSAoeCk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGlmICghX3RtcC5vaygpKSByZXR1cm4gX3RtcC5lcnJvcigpOyBcCi0gICAgICAgc3RkOjptb3ZlKF90bXAudmFsdWUoKSk7ICAgICAgICAgICAgIFwKLSAgICAgfSkKLQotI2RlZmluZSBWQUxVRV9PUl9GQVRBTChyZXN1bHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgYXV0byBfdG1wID0gKHJlc3VsdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIV90bXAub2soKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdW5jdGlvbjogJXMgTGluZTogJWQgRmFpbGVkIHJlc3VsdCAoJWQpIixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBfdG1wLmVycm9yKCkpOyAgICAgXAotICAgICAgIHN0ZDo6bW92ZShfdG1wLnZhbHVlKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgfSkKK3VzaW5nIENvbnZlcnNpb25SZXN1bHQgPSBlcnJvcjo6UmVzdWx0PFQ+OwogCiAvKioKICAqIEEgZ2VuZXJpYyB0ZW1wbGF0ZSB0byBzYWZlbHkgY2FzdCBiZXR3ZWVuIGludGVncmFsIHR5cGVzLCByZXNwZWN0aW5nIGxpbWl0cyBvZiB0aGUgZGVzdGluYXRpb24KQEAgLTEwNiw2ICs3OCwyNiBAQAogfQogCiAvKioKKyAqIEEgZ2VuZXJpYyB0ZW1wbGF0ZSB0aGF0IGhlbHBzIGNvbnZlcnQgY29udGFpbmVycyBvZiBjb252ZXJ0aWJsZSB0eXBlcywgdXNpbmcgaXRlcmF0b3JzLgorICogVXNlcyBhIGxpbWl0IGFzIG1heGltdW0gY29udmVyc2lvbiBpdGVtcy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIEZ1bmM+CitzdGF0dXNfdCBjb252ZXJ0UmFuZ2VXaXRoTGltaXQoSW5wdXRJdGVyYXRvciBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRJdGVyYXRvciBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuYyYgaXRlbUNvbnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGxpbWl0KSB7CisgICAgSW5wdXRJdGVyYXRvciBsYXN0ID0gZW5kOworICAgIGlmIChlbmQgLSBzdGFydCA+IGxpbWl0KSB7CisgICAgICAgIGxhc3QgPSBzdGFydCArIGxpbWl0OworICAgIH0KKyAgICBmb3IgKElucHV0SXRlcmF0b3IgaXRlciA9IHN0YXJ0OyAoaXRlciAhPSBsYXN0KTsgKytpdGVyLCArK291dCkgeworICAgICAgICAqb3V0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhpdGVtQ29udmVyc2lvbigqaXRlcikpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qKgogICogQSBnZW5lcmljIHRlbXBsYXRlIHRoYXQgaGVscHMgY29udmVydCBjb250YWluZXJzIG9mIGNvbnZlcnRpYmxlIHR5cGVzLgogICovCiB0ZW1wbGF0ZTx0eXBlbmFtZSBPdXRwdXRDb250YWluZXIsIHR5cGVuYW1lIElucHV0Q29udGFpbmVyLCB0eXBlbmFtZSBGdW5jPgpAQCAtMTE5LDYgKzExMSw2MiBAQAogICAgIHJldHVybiBvdXRwdXQ7CiB9CiAKKy8qKgorICogQSBnZW5lcmljIHRlbXBsYXRlIHRoYXQgaGVscHMgY29udmVydCBjb250YWluZXJzIG9mIGNvbnZlcnRpYmxlIHR5cGVzCisgKiB1c2luZyBhbiBpdGVtIGNvbnZlcnNpb24gZnVuY3Rpb24gd2l0aCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgT3V0cHV0Q29udGFpbmVyLCB0eXBlbmFtZSBJbnB1dENvbnRhaW5lciwgdHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgUGFyYW1ldGVyPgorQ29udmVyc2lvblJlc3VsdDxPdXRwdXRDb250YWluZXI+Citjb252ZXJ0Q29udGFpbmVyKGNvbnN0IElucHV0Q29udGFpbmVyJiBpbnB1dCwgY29uc3QgRnVuYyYgaXRlbUNvbnZlcnNpb24sIGNvbnN0IFBhcmFtZXRlciYgcGFyYW0pIHsKKyAgICBPdXRwdXRDb250YWluZXIgb3V0cHV0OworICAgIGF1dG8gaW5zID0gc3RkOjppbnNlcnRlcihvdXRwdXQsIG91dHB1dC5iZWdpbigpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiBpbnB1dCkgeworICAgICAgICAqaW5zID0gVkFMVUVfT1JfUkVUVVJOKGl0ZW1Db252ZXJzaW9uKGl0ZW0sIHBhcmFtKSk7CisgICAgfQorICAgIHJldHVybiBvdXRwdXQ7Cit9CisKKy8qKgorICogQSBnZW5lcmljIHRlbXBsYXRlIHRoYXQgaGVscHMgdG8gInppcCIgdHdvIGlucHV0IGNvbnRhaW5lcnMgb2YgdGhlIHNhbWUgc2l6ZQorICogaW50byBhIHNpbmdsZSB2ZWN0b3Igb2YgY29udmVydGVkIHR5cGVzLiBUaGUgY29udmVyc2lvbiBmdW5jdGlvbiBtdXN0CisgKiB0aHVzIGFjY2VwdCB0d28gYXJndW1lbnRzLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdXRwdXRDb250YWluZXIsIHR5cGVuYW1lIElucHV0Q29udGFpbmVyMSwKKyAgICAgICAgdHlwZW5hbWUgSW5wdXRDb250YWluZXIyLCB0eXBlbmFtZSBGdW5jPgorQ29udmVyc2lvblJlc3VsdDxPdXRwdXRDb250YWluZXI+Citjb252ZXJ0Q29udGFpbmVycyhjb25zdCBJbnB1dENvbnRhaW5lcjEmIGlucHV0MSwgY29uc3QgSW5wdXRDb250YWluZXIyJiBpbnB1dDIsCisgICAgICAgIGNvbnN0IEZ1bmMmIGl0ZW1Db252ZXJzaW9uKSB7CisgICAgYXV0byBpdGVyMiA9IGlucHV0Mi5iZWdpbigpOworICAgIE91dHB1dENvbnRhaW5lciBvdXRwdXQ7CisgICAgYXV0byBpbnMgPSBzdGQ6Omluc2VydGVyKG91dHB1dCwgb3V0cHV0LmJlZ2luKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgaXRlbTEgOiBpbnB1dDEpIHsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKGl0ZXIyICE9IGlucHV0Mi5lbmQoKSA/IE9LIDogQkFEX1ZBTFVFKTsKKyAgICAgICAgKmlucyA9IFZBTFVFX09SX1JFVFVSTihpdGVtQ29udmVyc2lvbihpdGVtMSwgKml0ZXIyKyspKTsKKyAgICB9CisgICAgcmV0dXJuIG91dHB1dDsKK30KKworLyoqCisgKiBBIGdlbmVyaWMgdGVtcGxhdGUgdGhhdCBoZWxwcyB0byAidW56aXAiIGEgcGVyLWVsZW1lbnQgY29udmVyc2lvbiBpbnRvCisgKiBhIHBhaXIgb2YgZWxlbWVudHMgaW50byBhIHBhaXIgb2YgY29udGFpbmVycy4gVGhlIGNvbnZlcnNpb24gZnVuY3Rpb24KKyAqIG11c3QgZW1pdCBhIHBhaXIgb2YgZWxlbWVudHMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE91dHB1dENvbnRhaW5lcjEsIHR5cGVuYW1lIE91dHB1dENvbnRhaW5lcjIsCisgICAgICAgIHR5cGVuYW1lIElucHV0Q29udGFpbmVyLCB0eXBlbmFtZSBGdW5jPgorQ29udmVyc2lvblJlc3VsdDxzdGQ6OnBhaXI8T3V0cHV0Q29udGFpbmVyMSwgT3V0cHV0Q29udGFpbmVyMj4+Citjb252ZXJ0Q29udGFpbmVyU3BsaXQoY29uc3QgSW5wdXRDb250YWluZXImIGlucHV0LCBjb25zdCBGdW5jJiBpdGVtQ29udmVyc2lvbikgeworICAgIE91dHB1dENvbnRhaW5lcjEgb3V0cHV0MTsKKyAgICBPdXRwdXRDb250YWluZXIyIG91dHB1dDI7CisgICAgYXV0byBpbnMxID0gc3RkOjppbnNlcnRlcihvdXRwdXQxLCBvdXRwdXQxLmJlZ2luKCkpOworICAgIGF1dG8gaW5zMiA9IHN0ZDo6aW5zZXJ0ZXIob3V0cHV0Miwgb3V0cHV0Mi5iZWdpbigpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiBpbnB1dCkgeworICAgICAgICBhdXRvIG91dF9wYWlyID0gVkFMVUVfT1JfUkVUVVJOKGl0ZW1Db252ZXJzaW9uKGl0ZW0pKTsKKyAgICAgICAgKmluczEgPSBvdXRfcGFpci5maXJzdDsKKyAgICAgICAgKmluczIgPSBvdXRfcGFpci5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihvdXRwdXQxLCBvdXRwdXQyKTsKK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gVGhlIGNvZGUgYmVsb3cgZXN0YWJsaXNoZXM6CiAvLyBJbnRlZ3JhbFR5cGVPZjxUPiwgd2hpY2ggd29ya3MgZm9yIGVpdGhlciBpbnRlZ3JhbCB0eXBlcyAoaW4gd2hpY2ggY2FzZSBpdCBldmFsdWF0ZXMgdG8gVCksIG9yCkBAIC0yMjMsNiArMjcxLDI5IEBACiBuYW1lc3BhY2UgYWlkbF91dGlscyB7CiAKIC8qKgorICogUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIHZhbGlkIGZvciB0aGUgQUlETCBlbnVtZXJhdGlvbi4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIGlzVmFsaWRFbnVtKFQgdmFsdWUpIHsKKyAgICBjb25zdGV4cHIgYW5kcm9pZDo6ZW51bV9yYW5nZTxUPiBlcnt9OworICAgIHJldHVybiBzdGQ6OmZpbmQoZXIuYmVnaW4oKSwgZXIuZW5kKCksIHZhbHVlKSAhPSBlci5lbmQoKTsKK30KKworLy8gVCBpcyBhICJjb250YWluZXIiIG9mIGVudW0gYmluZGVyIHR5cGVzIHdpdGggYSB0b1N0cmluZygpLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyBlbnVtc1RvU3RyaW5nKGNvbnN0IFQmIHQpIHsKKyAgICBzdGQ6OnN0cmluZyBzOworICAgIGZvciAoY29uc3QgYXV0byBpdGVtIDogdCkgeworICAgICAgICBpZiAocy5lbXB0eSgpKSB7CisgICAgICAgICAgICBzID0gdG9TdHJpbmcoaXRlbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLmFwcGVuZCgifCIpLmFwcGVuZCh0b1N0cmluZyhpdGVtKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKKy8qKgogICogUmV0dXJuIHRoZSBlcXVpdmFsZW50IEFuZHJvaWQgc3RhdHVzX3QgZnJvbSBhIGJpbmRlciBleGNlcHRpb24gY29kZS4KICAqCiAgKiBHZW5lcmFsbHkgb25lIHNob3VsZCB1c2Ugc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoKSBpbnN0ZWFkLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaAppbmRleCA1ZGZlNWZjLi44NjJhMGY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaApAQCAtMTcsOSArMTcsNzUgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9DaGFubmVsTGF5b3V0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9EZXZpY2VEZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorCituYW1lc3BhY2UgeworLy8gc2VlIGJvb3N0OjpoYXNoX2NvbWJpbmUKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQorI2VuZGlmCitzdGF0aWMgc2l6ZV90IGhhc2hfY29tYmluZShzaXplX3Qgc2VlZCwgc2l6ZV90IHYpIHsKKyAgICByZXR1cm4gc3RkOjpoYXNoPHNpemVfdD57fSh2KSArIDB4OWUzNzc5YjkgKyAoc2VlZCA8PCA2KSArIChzZWVkID4+IDIpOworfQorfQorCituYW1lc3BhY2Ugc3RkIHsKKworLy8gTm90ZTogd2hlbiBleHRlbmRpbmcgdGhlIHR5cGVzIGhhc2hlZCBiZWxvdyB3ZSBuZWVkIHRvIGFjY291bnQgZm9yIHRoZQorLy8gcG9zc2liaWxpdHkgb2YgcHJvY2Vzc2luZyB0eXBlcyBiZWxvbmdpbmcgdG8gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSB0eXBlLAorLy8gZS5nLiBhIEhBTCBtYXkgYmUgdXNpbmcgYSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBBSURMIGludGVyZmFjZS4KKwordGVtcGxhdGU8PiBzdHJ1Y3QgaGFzaDxhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9DaGFubmVsTGF5b3V0PgoreworICAgIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9DaGFubmVsTGF5b3V0JiBhY2wpIGNvbnN0IG5vZXhjZXB0IHsKKyAgICAgICAgdXNpbmcgVGFnID0gYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ2hhbm5lbExheW91dDo6VGFnOworICAgICAgICBjb25zdCBzaXplX3Qgc2VlZCA9IHN0ZDo6aGFzaDxUYWc+e30oYWNsLmdldFRhZygpKTsKKyAgICAgICAgc3dpdGNoIChhY2wuZ2V0VGFnKCkpIHsKKyAgICAgICAgICAgIGNhc2UgVGFnOjpub25lOgorICAgICAgICAgICAgICAgIHJldHVybiBoYXNoX2NvbWJpbmUoc2VlZCwgc3RkOjpoYXNoPGludDMyX3Q+e30oYWNsLmdldDxUYWc6Om5vbmU+KCkpKTsKKyAgICAgICAgICAgIGNhc2UgVGFnOjppbnZhbGlkOgorICAgICAgICAgICAgICAgIHJldHVybiBoYXNoX2NvbWJpbmUoc2VlZCwgc3RkOjpoYXNoPGludDMyX3Q+e30oYWNsLmdldDxUYWc6OmludmFsaWQ+KCkpKTsKKyAgICAgICAgICAgIGNhc2UgVGFnOjppbmRleE1hc2s6CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hfY29tYmluZShzZWVkLCBzdGQ6Omhhc2g8aW50MzJfdD57fShhY2wuZ2V0PFRhZzo6aW5kZXhNYXNrPigpKSk7CisgICAgICAgICAgICBjYXNlIFRhZzo6bGF5b3V0TWFzazoKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzaF9jb21iaW5lKHNlZWQsIHN0ZDo6aGFzaDxpbnQzMl90Pnt9KGFjbC5nZXQ8VGFnOjpsYXlvdXRNYXNrPigpKSk7CisgICAgICAgICAgICBjYXNlIFRhZzo6dm9pY2VNYXNrOgorICAgICAgICAgICAgICAgIHJldHVybiBoYXNoX2NvbWJpbmUoc2VlZCwgc3RkOjpoYXNoPGludDMyX3Q+e30oYWNsLmdldDxUYWc6OnZvaWNlTWFzaz4oKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzZWVkOworICAgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGhhc2g8YW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlRGVzY3JpcHRpb24+Cit7CisgICAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKSgKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZURlc2NyaXB0aW9uJiBhZGQpIGNvbnN0IG5vZXhjZXB0IHsKKyAgICAgICAgcmV0dXJuIGhhc2hfY29tYmluZSgKKyAgICAgICAgICAgICAgICBzdGQ6Omhhc2g8YW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlVHlwZT57fShhZGQudHlwZSksCisgICAgICAgICAgICAgICAgc3RkOjpoYXNoPHN0ZDo6c3RyaW5nPnt9KGFkZC5jb25uZWN0aW9uKSk7CisgICAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgaGFzaDxhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4KK3sKKyAgICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0RGVzY3JpcHRpb24mIGFmZCkgY29uc3Qgbm9leGNlcHQgeworICAgICAgICByZXR1cm4gaGFzaF9jb21iaW5lKAorICAgICAgICAgICAgICAgIHN0ZDo6aGFzaDxhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXRUeXBlPnt9KGFmZC50eXBlKSwKKyAgICAgICAgICAgICAgICBoYXNoX2NvbWJpbmUoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omhhc2g8YW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OlBjbVR5cGU+e30oYWZkLnBjbSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omhhc2g8c3RkOjpzdHJpbmc+e30oYWZkLmVuY29kaW5nKSkpOworICAgIH0KK307Cit9ICAvLyBuYW1lc3BhY2Ugc3RkCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDEsOCArMTA3LDQzIEBACiAgICAgcmV0dXJuICEobGhzPT1yaHMpOwogfQogCitjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICZsaHMsIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICZyaHMpCit7CisgICAgcmV0dXJuIGxocy52ZXJzaW9uID09IHJocy52ZXJzaW9uICYmIGxocy5zaXplID09IHJocy5zaXplICYmCisgICAgICAgICAgIGxocy5zYW1wbGVfcmF0ZSA9PSByaHMuc2FtcGxlX3JhdGUgJiYgbGhzLmNoYW5uZWxfbWFzayA9PSByaHMuY2hhbm5lbF9tYXNrICYmCisgICAgICAgICAgIGxocy5mb3JtYXQgPT0gcmhzLmZvcm1hdCAmJiBsaHMuc3RyZWFtX3R5cGUgPT0gcmhzLnN0cmVhbV90eXBlICYmCisgICAgICAgICAgIGxocy5iaXRfcmF0ZSA9PSByaHMuYml0X3JhdGUgJiYgbGhzLmR1cmF0aW9uX3VzID09IHJocy5kdXJhdGlvbl91cyAmJgorICAgICAgICAgICBsaHMuaGFzX3ZpZGVvID09IHJocy5oYXNfdmlkZW8gJiYgbGhzLmlzX3N0cmVhbWluZyA9PSByaHMuaXNfc3RyZWFtaW5nICYmCisgICAgICAgICAgIGxocy5iaXRfd2lkdGggPT0gcmhzLmJpdF93aWR0aCAmJiBsaHMub2ZmbG9hZF9idWZmZXJfc2l6ZSA9PSByaHMub2ZmbG9hZF9idWZmZXJfc2l6ZSAmJgorICAgICAgICAgICBsaHMudXNhZ2UgPT0gcmhzLnVzYWdlICYmIGxocy5lbmNhcHN1bGF0aW9uX21vZGUgPT0gcmhzLmVuY2Fwc3VsYXRpb25fbW9kZSAmJgorICAgICAgICAgICBsaHMuY29udGVudF9pZCA9PSByaHMuY29udGVudF9pZCAmJiBsaHMuc3luY19pZCA9PSByaHMuc3luY19pZDsKK30KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgJmxocywgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgJnJocykKK3sKKyAgICByZXR1cm4gIShsaHM9PXJocyk7Cit9CisKK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPT0oY29uc3QgYXVkaW9fY29uZmlnX3QgJmxocywgY29uc3QgYXVkaW9fY29uZmlnX3QgJnJocykKK3sKKyAgICByZXR1cm4gbGhzLnNhbXBsZV9yYXRlID09IHJocy5zYW1wbGVfcmF0ZSAmJiBsaHMuY2hhbm5lbF9tYXNrID09IHJocy5jaGFubmVsX21hc2sgJiYKKyAgICAgICAgICAgbGhzLmZvcm1hdCA9PSByaHMuZm9ybWF0ICYmIGxocy5vZmZsb2FkX2luZm8gPT0gcmhzLm9mZmxvYWRfaW5mbzsKK30KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgYXVkaW9fY29uZmlnX3QgJmxocywgY29uc3QgYXVkaW9fY29uZmlnX3QgJnJocykKK3sKKyAgICByZXR1cm4gIShsaHM9PXJocyk7Cit9CisKK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPT0oY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAmbGhzLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICZyaHMpCit7CisgICAgcmV0dXJuIGxocy5zYW1wbGVfcmF0ZSA9PSByaHMuc2FtcGxlX3JhdGUgJiYgbGhzLmNoYW5uZWxfbWFzayA9PSByaHMuY2hhbm5lbF9tYXNrICYmCisgICAgICAgICAgIGxocy5mb3JtYXQgPT0gcmhzLmZvcm1hdDsKK30KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAmbGhzLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICZyaHMpCit7CisgICAgcmV0dXJuICEobGhzPT1yaHMpOworfQorCiBlbnVtIHZvbHVtZV9ncm91cF90IDogdWludDMyX3Q7CiBzdGF0aWMgY29uc3Qgdm9sdW1lX2dyb3VwX3QgVk9MVU1FX0dST1VQX05PTkUgPSBzdGF0aWNfY2FzdDx2b2x1bWVfZ3JvdXBfdD4oLTEpOwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAppbmRleCAzYzE5ZWMxLi41Njg4NGEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCkBAIC00MCw3ICs0MCw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY2xhc3MgQXVkaW9FZmZlY3QgOiBwdWJsaWMgUmVmQmFzZQorY2xhc3MgQXVkaW9FZmZlY3QgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiB7CiBwdWJsaWM6CiAKQEAgLTI3NywxMyArMjc3LDU1IEBACiAgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOwogCiAgICAgLyoKLSAgICAgKiBFdmVudHMgdXNlZCBieSBjYWxsYmFjayBmdW5jdGlvbiAoZWZmZWN0X2NhbGxiYWNrX3QpLgorICAgICAqIEV2ZW50cyB1c2VkIGJ5IGNhbGxiYWNrIGZ1bmN0aW9uIChsZWdhY3lfY2FsbGJhY2tfdCkuCiAgICAgICovCiAgICAgZW51bSBldmVudF90eXBlIHsKICAgICAgICAgRVZFTlRfQ09OVFJPTF9TVEFUVVNfQ0hBTkdFRCA9IDAsCiAgICAgICAgIEVWRU5UX0VOQUJMRV9TVEFUVVNfQ0hBTkdFRCA9IDEsCiAgICAgICAgIEVWRU5UX1BBUkFNRVRFUl9DSEFOR0VEID0gMiwKLSAgICAgICAgRVZFTlRfRVJST1IgPSAzCisgICAgICAgIEVWRU5UX0VSUk9SID0gMywKKyAgICAgICAgRVZFTlRfRlJBTUVTX1BST0NFU1NFRCA9IDQsCisgICAgfTsKKworICAgIGNsYXNzIElBdWRpb0VmZmVjdENhbGxiYWNrIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CisgICAgICAgIGZyaWVuZCBBdWRpb0VmZmVjdDsKKyAgICAgcHJvdGVjdGVkOgorICAgICAgICAvKiBUaGUgZXZlbnQgaXMgcmVjZWl2ZWQgd2hlbiBhbiBhcHBsaWNhdGlvbiBsb3NlcyBvcgorICAgICAgICAgKiBnYWlucyB0aGUgY29udHJvbCBvZiB0aGUgZWZmZWN0IGVuZ2luZS4gTG9zcyBvZiBjb250cm9sIGhhcHBlbnMKKyAgICAgICAgICogaWYgYW5vdGhlciBhcHBsaWNhdGlvbiByZXF1ZXN0cyB0aGUgdXNlIG9mIHRoZSBlbmdpbmUgYnkgY3JlYXRpbmcgYW4gQXVkaW9FZmZlY3QgZm9yCisgICAgICAgICAqIHRoZSBzYW1lIGVmZmVjdCB0eXBlIGJ1dCB3aXRoIGEgaGlnaGVyIHByaW9yaXR5LiBDb250cm9sIGlzIHJldHVybmVkIHdoZW4gdGhlCisgICAgICAgICAqIGFwcGxpY2F0aW9uIGhhdmluZyB0aGUgY29udHJvbCBkZWxldGVzIGl0cyBBdWRpb0VmZmVjdCBvYmplY3QuCisgICAgICAgICAqIEBwYXJhbSBpc0dyYW50ZWQ6IFRydWUgaWYgY29udHJvbCBoYXMgYmVlbiBncmFudGVkLiBGYWxzZSBpZiBzdG9sZW4uCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25Db250cm9sU3RhdHVzQ2hhbmdlZChbW21heWJlX3VudXNlZF1dIGJvb2wgaXNHcmFudGVkKSB7fQorCisgICAgICAgIC8qIFRoZSBldmVudCBpcyByZWNlaXZlZCBieSBhbGwgYXBwbGljYXRpb25zIG5vdCBoYXZpbmcgdGhlCisgICAgICAgICAqIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBlbmdpbmUgd2hlbiB0aGUgZWZmZWN0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAqIEBwYXJhbSBpc0VuYWJsZWQ6IFRydWUgaWYgZW5hYmxlZC4gRmFsc2UgaWYgZGlzYWJsZWQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25FbmFibGVTdGF0dXNDaGFuZ2VkKFtbbWF5YmVfdW51c2VkXV0gYm9vbCBpc0VuYWJsZWQpIHt9CisKKyAgICAgICAgLyogVGhlIGV2ZW50IGlzIHJlY2VpdmVkIGJ5IGFsbCBhcHBsaWNhdGlvbnMgbm90IGhhdmluZyB0aGUKKyAgICAgICAgICogY29udHJvbCBvZiB0aGUgZWZmZWN0IGVuZ2luZSB3aGVuIGFuIGVmZmVjdCBwYXJhbWV0ZXIgaXMgY2hhbmdlZC4KKyAgICAgICAgICogQHBhcmFtIHBhcmFtOiBBIHZlY3RvciBjb250YWluaW5nIHRoZSByYXcgYnl0ZXMgb2YgYSBlZmZlY3RfcGFyYW1fdHlwZSBjb250YWluaW5nCisgICAgICAgICAqICAgcmF3IGRhdGEgcmVwcmVzZW50aW5nIGEgcGFyYW0gdHlwZSwgdmFsdWUgcGFpci4KKyAgICAgICAgICovCisgICAgICAgIC8vIFRPRE8gcGFzcyBhbiBBSURMIHBhcmNlbCBpbnN0ZWFkIG9mIGVmZmVjdF9wYXJhbV90eXBlCisgICAgICAgIHZpcnR1YWwgdm9pZCBvblBhcmFtZXRlckNoYW5nZWQoW1ttYXliZV91bnVzZWRdXSBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXJhbSkge30KKworICAgICAgICAvKiBUaGUgZXZlbnQgaXMgcmVjZWl2ZWQgd2hlbiB0aGUgYmluZGVyIGNvbm5lY3Rpb24gdG8gdGhlIG1lZGlhc2VydmVyCisgICAgICAgICAqIGlzIG5vIGxvbmdlciB2YWxpZC4gVHlwaWNhbGx5IHRoZSBzZXJ2ZXIgaGFzIGJlZW4ga2lsbGVkLgorICAgICAgICAgKiBAcGFyYW0gZXJyb3JDb2RlOiBBIGNvZGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoW1ttYXliZV91bnVzZWRdXSBzdGF0dXNfdCBlcnJvckNvZGUpIHt9CisKKworICAgICAgICAvKiBUaGUgZXZlbnQgaXMgcmVjZWl2ZWQgd2hlbiB0aGUgYXVkaW8gc2VydmVyIGhhcyBwcm9jZXNzZWQgYSBibG9jayBvZgorICAgICAgICAgKiBkYXRhLgorICAgICAgICAgKiBAcGFyYW0gZnJhbWVzUHJvY2Vzc2VkOiBUaGUgbnVtYmVyIG9mIGZyYW1lcyB0aGUgYXVkaW8gc2VydmVyIGhhcworICAgICAgICAgKiAgIHByb2Nlc3NlZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lc1Byb2Nlc3NlZChbW21heWJlX3VudXNlZF1dIGludDMyX3QgZnJhbWVzUHJvY2Vzc2VkKSB7fQogICAgIH07CiAKICAgICAvKiBDYWxsYmFjayBmdW5jdGlvbiBub3RpZnlpbmcgY2xpZW50IGFwcGxpY2F0aW9uIG9mIGEgY2hhbmdlIGluIGVmZmVjdCBlbmdpbmUgc3RhdGUgb3IKQEAgLTMxNCw3ICszNTYsNyBAQAogICAgICAqICAtIEVWRU5UX0VSUk9SOiAgc3RhdHVzX3QgaW5kaWNhdGluZyB0aGUgZXJyb3IgKERFQURfT0JKRUNUIHdoZW4gbWVkaWEgc2VydmVyIGRpZXMpLgogICAgICAqLwogCi0gICAgdHlwZWRlZiB2b2lkICgqZWZmZWN0X2NhbGxiYWNrX3QpKGludDMyX3QgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQgKmluZm8pOworICAgIHR5cGVkZWYgdm9pZCAoKmxlZ2FjeV9jYWxsYmFja190KShpbnQzMl90IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkICppbmZvKTsKIAogCiAgICAgLyogQ29uc3RydWN0b3IuCkBAIC0zNTksNyArNDAxLDcgQEAKICAgICAgKiBwcmlvcml0eTogICAgcmVxdWVzdGVkIHByaW9yaXR5IGZvciBlZmZlY3QgY29udHJvbDogdGhlIHByaW9yaXR5IGxldmVsIGNvcnJlc3BvbmRzIHRvIHRoZQogICAgICAqICAgICAgdmFsdWUgb2YgcHJpb3JpdHkgcGFyYW1ldGVyOiBuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgbG93ZXIgcHJpb3JpdGllcywgcG9zaXRpdmUgdmFsdWVzCiAgICAgICogICAgICBoaWdoZXIgcHJpb3JpdGllcywgMCBiZWluZyB0aGUgbm9ybWFsIHByaW9yaXR5LgotICAgICAqIGNiZjogICAgICAgICBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiAoc2VlIGVmZmVjdF9jYWxsYmFja190KQorICAgICAqIGNiZjogICAgICAgICBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiAoc2VlIGxlZ2FjeV9jYWxsYmFja190KQogICAgICAqIHVzZXI6ICAgICAgICBwb2ludGVyIHRvIGNvbnRleHQgZm9yIHVzZSBieSB0aGUgY2FsbGJhY2sgcmVjZWl2ZXIuCiAgICAgICogc2Vzc2lvbklkOiAgIGF1ZGlvIHNlc3Npb24gdGhpcyBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0by4KICAgICAgKiAgICAgIElmIGVxdWFsIHRvIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgdGhlIGVmZmVjdCB3aWxsIGJlIGdsb2JhbCB0bwpAQCAtMzgyLDI2ICs0MjQsNDkgQEAKICAgICAgKiAgLSBOT19JTklUOiBhdWRpbyBmbGluZ2VyIG9yIGF1ZGlvIGhhcmR3YXJlIG5vdCBpbml0aWFsaXplZAogICAgICAqLwogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxJQXVkaW9FZmZlY3RDYWxsYmFjaz4mIGNhbGxiYWNrID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gQVVESU9fSU9fSEFORExFX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlID0ge30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSA9IGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByb2JlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBub3RpZnlGcmFtZXNQcm9jZXNzZWQgPSBmYWxzZSk7CisKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gQVVESU9fSU9fSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlID0ge30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkID0gZmFsc2UpOwogICAgIC8qCiAgICAgICogU2FtZSBhcyBhYm92ZSBidXQgd2l0aCB0eXBlIGFuZCB1dWlkIHNwZWNpZmllZCBieSBjaGFyYWN0ZXIgc3RyaW5ncy4KICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChjb25zdCBjaGFyICp0eXBlU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUF1ZGlvRWZmZWN0Q2FsbGJhY2s+JiBjYWxsYmFjayA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSA9IHt9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUgPSBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkID0gZmFsc2UpOworCisKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChjb25zdCBjaGFyICp0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gQVVESU9fSU9fSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlID0ge30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkID0gZmFsc2UpOwogCiAgICAgLyogUmVzdWx0IG9mIGNvbnN0cnVjdGluZyB0aGUgQXVkaW9FZmZlY3QuIFRoaXMgbXVzdCBiZSBjaGVja2VkCiAgICAgICogYmVmb3JlIHVzaW5nIGFueSBBdWRpb0VmZmVjdCBBUEkuCkBAIC01MzIsMTggKzU5NywxOSBAQAogCiBwcm90ZWN0ZWQ6CiAgICAgIGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGUgbUNsaWVudEF0dHJpYnV0aW9uU291cmNlOyAvLyBzb3VyY2UgZm9yIGFwcCBvcCBjaGVja3MuCi0gICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7ICAgLy8gZW5hYmxlIHN0YXRlCi0gICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVg7IC8vIGF1ZGlvIHNlc3Npb24gSUQKLSAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVByaW9yaXR5ID0gMDsgICAgICAvLyBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2wKLSAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgbVN0YXR1cyA9IE5PX0lOSVQ7ICAvLyBlZmZlY3Qgc3RhdHVzCi0gICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1Qcm9iZSA9IGZhbHNlOyAgICAgLy8gZWZmZWN0IGNyZWF0ZWQgaW4gcHJvYmUgbW9kZTogYWxsIGNvbW1hbmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIG5vIG9wcyBiZWNhdXNlIG1JRWZmZWN0IGlzIE5VTEwKLSAgICAgZWZmZWN0X2NhbGxiYWNrX3QgICAgICAgbUNiZiA9IG51bGxwdHI7ICAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiBmb3Igc3RhdHVzLCBjb250cm9sIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciBjaGFuZ2VzIG5vdGlmaWNhdGlvbnMKLSAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbVVzZXJEYXRhID0gbnVsbHB0cjsvLyBjbGllbnQgY29udGV4dCBmb3IgY2FsbGJhY2sgZnVuY3Rpb24KLSAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAgICAgbURlc2NyaXB0b3IgPSB7fTsgICAvLyBlZmZlY3QgZGVzY3JpcHRvcgotICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtSWQgPSAtMTsgICAgICAgICAgIC8vIHN5c3RlbSB3aWRlIHVuaXF1ZSBlZmZlY3QgZW5naW5lIGluc3RhbmNlIElECi0gICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOyAgICAgICAgICAgICAgLy8gTXV0ZXggZm9yIG1FbmFibGVkIGFjY2VzcworICAgICBib29sICAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBmYWxzZTsgICAvLyBlbmFibGUgc3RhdGUKKyAgICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgIG1TZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVg7IC8vIGF1ZGlvIHNlc3Npb24gSUQKKyAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1Qcmlvcml0eSA9IDA7ICAgICAgLy8gcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sCisgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgICBtU3RhdHVzID0gTk9fSU5JVDsgIC8vIGVmZmVjdCBzdGF0dXMKKyAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgIG1Qcm9iZSA9IGZhbHNlOyAgICAgLy8gZWZmZWN0IGNyZWF0ZWQgaW4gcHJvYmUgbW9kZTogYWxsIGNvbW1hbmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIG5vIG9wcyBiZWNhdXNlIG1JRWZmZWN0IGlzIG51bGxwdHIKKworICAgICB3cDxJQXVkaW9FZmZlY3RDYWxsYmFjaz4gbUNhbGxiYWNrID0gbnVsbHB0cjsgLy8gY2FsbGJhY2sgaW50ZXJmYWNlIGZvciBzdGF0dXMsIGNvbnRyb2wgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgY2hhbmdlcyBub3RpZmljYXRpb25zCisgICAgIHNwPElBdWRpb0VmZmVjdENhbGxiYWNrPiBtTGVnYWN5V3JhcHBlciA9IG51bGxwdHI7CisgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgICAgICBtRGVzY3JpcHRvciA9IHt9OyAgIC8vIGVmZmVjdCBkZXNjcmlwdG9yCisgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtSWQgPSAtMTsgICAgICAgICAgIC8vIHN5c3RlbSB3aWRlIHVuaXF1ZSBlZmZlY3QgZW5naW5lIGluc3RhbmNlIElECisgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICBtTG9jazsgICAgICAgICAgICAgIC8vIE11dGV4IGZvciBtRW5hYmxlZCBhY2Nlc3MKIAogCiAgICAgIC8vIElFZmZlY3RDbGllbnQKQEAgLTU1Miw2ICs2MTgsNyBAQAogICAgICB2aXJ0dWFsIHZvaWQgY29tbWFuZEV4ZWN1dGVkKGludDMyX3QgY21kQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgY21kRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVwbHlEYXRhKTsKKyAgICAgdmlydHVhbCB2b2lkIGZyYW1lc1Byb2Nlc3NlZChpbnQzMl90IGZyYW1lcyk7CiAKIHByaXZhdGU6CiAKQEAgLTU4Nyw2ICs2NTQsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICAgICAgfQorICAgICAgICBiaW5kZXI6OlN0YXR1cyBmcmFtZXNQcm9jZXNzZWQoaW50MzJfdCBmcmFtZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChlZmZlY3QgIT0gMCkgeworICAgICAgICAgICAgICAgIGVmZmVjdC0+ZnJhbWVzUHJvY2Vzc2VkKGZyYW1lcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgICAgIH0KKwogCiAgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CiAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmgKaW5kZXggOTgxZDMzYS4uNDA1ZWM3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaApAQCAtMTcsOSArMTcsMTUgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19JT19ERVNDUklQVE9SX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19JT19ERVNDUklQVE9SX0gKIAorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWVudW0gYXVkaW9faW9fY29uZmlnX2V2ZW50IHsKK2VudW0gYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgewogICAgIEFVRElPX09VVFBVVF9SRUdJU1RFUkVELAogICAgIEFVRElPX09VVFBVVF9PUEVORUQsCiAgICAgQVVESU9fT1VUUFVUX0NMT1NFRCwKQEAgLTMzLDQxICszOSw3MCBAQAogCiAvLyBhdWRpbyBpbnB1dC9vdXRwdXQgZGVzY3JpcHRvciB1c2VkIHRvIGNhY2hlIG91dHB1dCBjb25maWd1cmF0aW9ucyBpbiBjbGllbnQgcHJvY2VzcyB0byBhdm9pZAogLy8gZnJlcXVlbnQgY2FsbHMgdGhyb3VnaCBJQXVkaW9GbGluZ2VyCi1jbGFzcyBBdWRpb0lvRGVzY3JpcHRvciA6IHB1YmxpYyBSZWZCYXNlIHsKK2NsYXNzIEF1ZGlvSW9EZXNjcmlwdG9yIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CiBwdWJsaWM6Ci0gICAgQXVkaW9Jb0Rlc2NyaXB0b3IoKSA6Ci0gICAgICAgIG1Jb0hhbmRsZShBVURJT19JT19IQU5ETEVfTk9ORSksCi0gICAgICAgIG1TYW1wbGluZ1JhdGUoMCksIG1Gb3JtYXQoQVVESU9fRk9STUFUX0RFRkFVTFQpLCBtQ2hhbm5lbE1hc2soQVVESU9fQ0hBTk5FTF9OT05FKSwKLSAgICAgICAgbUZyYW1lQ291bnQoMCksIG1GcmFtZUNvdW50SEFMKDApLCBtTGF0ZW5jeSgwKSwgbVBvcnRJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKQotICAgIHsKLSAgICAgICAgbWVtc2V0KCZtUGF0Y2gsIDAsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKLSAgICB9CisgICAgQXVkaW9Jb0Rlc2NyaXB0b3IoKSA9IGRlZmF1bHQ7CisgICAgLy8gRm9yIEFVRElPX3tJTlBVVHxPVVRQVVR9X0NMT1NFRCBldmVudHMuCisgICAgQXVkaW9Jb0Rlc2NyaXB0b3IoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIDogbUlvSGFuZGxlKGlvSGFuZGxlKSB7fQorICAgIC8vIEZvciBBVURJT19DTElFTlRfU1RBUlRFRCBldmVudHMuCisgICAgQXVkaW9Jb0Rlc2NyaXB0b3IoCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgYXVkaW9fcGF0Y2gmIHBhdGNoLCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgOgorICAgICAgICAgICAgbUlvSGFuZGxlKGlvSGFuZGxlKSwgbVBhdGNoKHBhdGNoKSwgbVBvcnRJZChwb3J0SWQpIHt9CisgICAgLy8gRm9yIGV2ZXJ5dGhpbmcgZWxzZS4KKyAgICBBdWRpb0lvRGVzY3JpcHRvcigKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBhdWRpb19wYXRjaCYgcGF0Y2gsIGJvb2wgaXNJbnB1dCwKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LCBzaXplX3QgZnJhbWVDb3VudEhhbCwgdWludDMyX3QgbGF0ZW5jeSA9IDAsCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIDoKKyAgICAgICAgICAgIG1Jb0hhbmRsZShpb0hhbmRsZSksIG1QYXRjaChwYXRjaCksIG1Jc0lucHV0KGlzSW5wdXQpLAorICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZShzYW1wbGluZ1JhdGUpLCBtRm9ybWF0KGZvcm1hdCksIG1DaGFubmVsTWFzayhjaGFubmVsTWFzayksCisgICAgICAgICAgICBtRnJhbWVDb3VudChmcmFtZUNvdW50KSwgbUZyYW1lQ291bnRIQUwoZnJhbWVDb3VudEhhbCksIG1MYXRlbmN5KGxhdGVuY3kpLAorICAgICAgICAgICAgbVBvcnRJZChwb3J0SWQpIHt9CiAKLSAgICB2aXJ0dWFsIH5BdWRpb0lvRGVzY3JpcHRvcigpIHt9Ci0KLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldERldmljZUlkKCkgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldElvSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbUlvSGFuZGxlOyB9CisgICAgY29uc3QgYXVkaW9fcGF0Y2gmIGdldFBhdGNoKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoOyB9CisgICAgYm9vbCBnZXRJc0lucHV0KCkgY29uc3QgeyByZXR1cm4gbUlzSW5wdXQ7IH0KKyAgICB1aW50MzJfdCBnZXRTYW1wbGluZ1JhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxpbmdSYXRlOyB9CisgICAgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGdldENoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrOyB9CisgICAgc2l6ZV90IGdldEZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBtRnJhbWVDb3VudDsgfQorICAgIHNpemVfdCBnZXRGcmFtZUNvdW50SEFMKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lQ291bnRIQUw7IH0KKyAgICB1aW50MzJfdCBnZXRMYXRlbmN5KCkgY29uc3QgeyByZXR1cm4gbUxhdGVuY3k7IH0KKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFBvcnRJZCgpIGNvbnN0IHsgcmV0dXJuIG1Qb3J0SWQ7IH0KKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldERldmljZUlkKCkgY29uc3QgewogICAgICAgICBpZiAobVBhdGNoLm51bV9zb3VyY2VzICE9IDAgJiYgbVBhdGNoLm51bV9zaW5rcyAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAobVBhdGNoLnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBvdXRwdXQgbWl4Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IHRoZSBBUEkgb25seSByZXR1cm5zIHRoZSBmaXJzdCBkZXZpY2UgaW4gY2FzZSBvZiBtdWx0aXBsZSBkZXZpY2Ugc2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1QYXRjaC5zaW5rc1swXS5pZDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBpbnB1dCBtaXgKLSAgICAgICAgICAgICAgICByZXR1cm4gbVBhdGNoLnNvdXJjZXNbMF0uaWQ7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGSVhNRTogdGhlIEFQSSBvbmx5IHJldHVybnMgdGhlIGZpcnN0IGRldmljZSBpbiBjYXNlIG9mIG11bHRpcGxlIGRldmljZSBzZWxlY3Rpb24KKyAgICAgICAgICAgIHJldHVybiBtSXNJbnB1dCA/IG1QYXRjaC5zb3VyY2VzWzBdLmlkIDogbVBhdGNoLnNpbmtzWzBdLmlkOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIH0KKyAgICB2b2lkIHNldFBhdGNoKGNvbnN0IGF1ZGlvX3BhdGNoJiBwYXRjaCkgeyBtUGF0Y2ggPSBwYXRjaDsgfQogCi0gICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbUlvSGFuZGxlOwotICAgIHN0cnVjdCBhdWRpb19wYXRjaCAgICAgIG1QYXRjaDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxpbmdSYXRlOwotICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgbUNoYW5uZWxNYXNrOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50SEFMOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1MYXRlbmN5OyAgIC8vIG9ubHkgdmFsaWQgZm9yIG91dHB1dAotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7ICAgIC8vIHZhbGlkIGZvciBldmVudCBBVURJT19DTElFTlRfU1RBUlRFRAorICAgIHN0ZDo6c3RyaW5nIHRvRGVidWdTdHJpbmcoKSBjb25zdCB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgc3MgPDwgbUlvSGFuZGxlIDw8ICIsIHNhbXBsaW5nUmF0ZSAiIDw8IG1TYW1wbGluZ1JhdGUgPDwgIiwgIgorICAgICAgICAgICA8PCBhdWRpb19mb3JtYXRfdG9fc3RyaW5nKG1Gb3JtYXQpIDw8ICIsICIKKyAgICAgICAgICAgPDwgKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24obUNoYW5uZWxNYXNrKSA9PQorICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVggPworICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfaW5kZXhfbWFza190b19zdHJpbmcobUNoYW5uZWxNYXNrKSA6CisgICAgICAgICAgICAgICAgICAgKG1Jc0lucHV0ID8gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX3RvX3N0cmluZyhtQ2hhbm5lbE1hc2spIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfdG9fc3RyaW5nKG1DaGFubmVsTWFzaykpKQorICAgICAgICAgICA8PCAiLCBmcmFtZUNvdW50ICIgPDwgbUZyYW1lQ291bnQgPDwgIiwgZnJhbWVDb3VudEhBTCAiIDw8IG1GcmFtZUNvdW50SEFMCisgICAgICAgICAgIDw8ICIsIGRldmljZUlkICIgPDwgZ2V0RGV2aWNlSWQoKTsKKyAgICAgICAgcmV0dXJuIHNzLnN0cigpOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90ICAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAgIG1QYXRjaCA9IHt9OworICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgIG1Jc0lucHV0ID0gZmFsc2U7CisgICAgY29uc3QgdWludDMyX3QgICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IDA7CisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgICAgICAgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IG1DaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICAgICAgICBtRnJhbWVDb3VudCA9IDA7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgICAgICAgbUZyYW1lQ291bnRIQUwgPSAwOworICAgIGNvbnN0IHVpbnQzMl90ICAgICAgICAgICAgIG1MYXRlbmN5ID0gMDsKKyAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90ICBtUG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IDMyNjkxOWEuLmNiMDVkZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTQwLDE0ICs0MCwxMyBAQAogCiBzdHJ1Y3QgYXVkaW9fdHJhY2tfY2Jsa190OwogY2xhc3MgQXVkaW9SZWNvcmRDbGllbnRQcm94eTsKLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBBdWRpb1JlY29yZCA6IHB1YmxpYyBBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjawogewogcHVibGljOgogCi0gICAgLyogRXZlbnRzIHVzZWQgYnkgQXVkaW9SZWNvcmQgY2FsbGJhY2sgZnVuY3Rpb24gKGNhbGxiYWNrX3QpLgorICAgIC8qIEV2ZW50cyB1c2VkIGJ5IEF1ZGlvUmVjb3JkIGNhbGxiYWNrIGZ1bmN0aW9uIChsZWdhY3lfY2FsbGJhY2tfdCkuCiAgICAgICogS2VlcCBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1JlY29yZC5qYXZhIE5BVElWRV9FVkVOVF8qLgogICAgICAqLwogICAgIGVudW0gZXZlbnRfdHlwZSB7CkBAIC02NSwyMCArNjQsMjYgQEAKICAgICB9OwogCiAgICAgLyogQ2xpZW50IHNob3VsZCBkZWNsYXJlIGEgQnVmZmVyIGFuZCBwYXNzIGFkZHJlc3MgdG8gb2J0YWluQnVmZmVyKCkKLSAgICAgKiBhbmQgcmVsZWFzZUJ1ZmZlcigpLiAgU2VlIGFsc28gY2FsbGJhY2tfdCBmb3IgRVZFTlRfTU9SRV9EQVRBLgorICAgICAqIGFuZCByZWxlYXNlQnVmZmVyKCkuICBTZWUgYWxzbyBsZWdhY3lfY2FsbGJhY2tfdCBmb3IgRVZFTlRfTU9SRV9EQVRBLgogICAgICAqLwogCiAgICAgY2xhc3MgQnVmZmVyCiAgICAgeworICAgICAgZnJpZW5kIEF1ZGlvUmVjb3JkOwogICAgIHB1YmxpYzoKLSAgICAgICAgLy8gRklYTUUgdXNlIG0gcHJlZml4CisgICAgICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKyAgICAgICAgc2l6ZV90IGdldEZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBmcmFtZUNvdW50OyB9CisgICAgICAgIHVpbnQ4X3QqIGRhdGEoKSBjb25zdCB7IHJldHVybiB1aTg7IH0KKyAgICAgICAgLy8gTGVhdmluZyBwdWJsaWMgZm9yIG5vdyB0byBhc3Npc3QgcmVmYWN0b3JpbmcuIFRoaXMgY2xhc3Mgd2lsbAorICAgICAgICAvLyBiZSByZXBsYWNlZC4KICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudDsgICAgIC8vIG51bWJlciBvZiBzYW1wbGUgZnJhbWVzIGNvcnJlc3BvbmRpbmcgdG8gc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlucHV0IHRvIG9idGFpbkJ1ZmZlcigpIGl0IGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIGRlc2lyZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG91dHB1dCBmcm9tIG9idGFpbkJ1ZmZlcigpIGl0IGlzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBmcmFtZXMgdG8gYmUgcmVhZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gaW5wdXQgdG8gcmVsZWFzZUJ1ZmZlcigpIGl0IGlzIGN1cnJlbnRseSBpZ25vcmVkCiAKLSAgICAgICAgc2l6ZV90ICAgICAgc2l6ZTsgICAgICAgICAgIC8vIGlucHV0L291dHB1dCBpbiBieXRlcyA9PSBmcmFtZUNvdW50ICogZnJhbWVTaXplCisgICAgcHJpdmF0ZToKKyAgICAgICAgc2l6ZV90ICAgICAgbVNpemU7ICAgICAgICAgIC8vIGlucHV0L291dHB1dCBpbiBieXRlcyA9PSBmcmFtZUNvdW50ICogZnJhbWVTaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCB0byBvYnRhaW5CdWZmZXIoKSBpdCBpcyBpZ25vcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBvdXRwdXQgZnJvbSBvYnRhaW5CdWZmZXIoKSBpdCBpcyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYnl0ZXMgdG8gYmUgcmVhZCwgd2hpY2ggaXMgZnJhbWVDb3VudCAqIGZyYW1lU2l6ZQpAQCAtOTAsNyArOTUsNyBAQAogICAgICAgICB1bmlvbiB7CiAgICAgICAgICAgICB2b2lkKiAgICAgICByYXc7CiAgICAgICAgICAgICBpbnQxNl90KiAgICBpMTY7ICAgICAgICAvLyBzaWduZWQgMTYtYml0Ci0gICAgICAgICAgICBpbnQ4X3QqICAgICBpODsgICAgICAgICAvLyB1bnNpZ25lZCA4LWJpdCwgb2Zmc2V0IGJ5IDB4ODAKKyAgICAgICAgICAgIHVpbnQ4X3QqICAgIHVpODsgICAgICAgIC8vIHVuc2lnbmVkIDgtYml0LCBvZmZzZXQgYnkgMHg4MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgdG8gb2J0YWluQnVmZmVyKCk6IHVudXNlZCwgb3V0cHV0OiBwb2ludGVyIHRvIGJ1ZmZlcgogICAgICAgICB9OwogCkBAIC0xMTcsNyArMTIyLDI4IEBACiAgICAgICogICAgICAgICAgLSBFVkVOVF9ORVdfSUFVRElPUkVDT1JEOiB1bnVzZWQuCiAgICAgICovCiAKLSAgICB0eXBlZGVmIHZvaWQgKCpjYWxsYmFja190KShpbnQgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQgKmluZm8pOworICAgIHR5cGVkZWYgdm9pZCAoKmxlZ2FjeV9jYWxsYmFja190KShpbnQgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQgKmluZm8pOworCisgICAgY2xhc3MgSUF1ZGlvUmVjb3JkQ2FsbGJhY2sgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKKyAgICAgICAgZnJpZW5kIEF1ZGlvUmVjb3JkOworICAgICBwcm90ZWN0ZWQ6CisgICAgICAgIC8vIFJlcXVlc3QgZm9yIGNsaWVudCB0byByZWFkIG5ld2x5IGF2YWlsYWJsZSBkYXRhLgorICAgICAgICAvLyBVc2VkIGZvciBUUkFOU0ZFUl9DQUxMQkFDSyBtb2RlLgorICAgICAgICAvLyBQYXJhbWV0ZXJzOgorICAgICAgICAvLyAgLSBidWZmZXIgOiBCdWZmZXIgdG8gcmVhZCBmcm9tCisgICAgICAgIC8vIFJldHVybnM6CisgICAgICAgIC8vICAtIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSBjb25zdW1lZC4KKyAgICAgICAgdmlydHVhbCBzaXplX3Qgb25Nb3JlRGF0YShbW21heWJlX3VudXNlZF1dIGNvbnN0IEF1ZGlvUmVjb3JkOjpCdWZmZXImIGJ1ZmZlcikgeyByZXR1cm4gMDsgfQorICAgICAgICAvLyBBIGJ1ZmZlciBvdmVycnVuIG9jY3VycmVkLgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25PdmVycnVuKCkge30KKyAgICAgICAgLy8gUmVjb3JkIGhlYWQgaXMgYXQgdGhlIHNwZWNpZmllZCBtYXJrZXIgKHNlZSBzZXRNYXJrZXJQb3NpdGlvbigpKS4KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uTWFya2VyKFtbbWF5YmVfdW51c2VkXV0gdWludDMyX3QgbWFya2VyUG9zaXRpb24pIHt9CisgICAgICAgIC8vIFJlY29yZCBoZWFkIGlzIGF0IGEgbmV3IHBvc2l0aW9uIChzZWUgc2V0UG9zaXRpb25VcGRhdGVQZXJpb2QoKSkuCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbk5ld1BvcyhbW21heWJlX3VudXNlZF1dIHVpbnQzMl90IG5ld1Bvcykge30KKyAgICAgICAgLy8gSUF1ZGlvUmVjb3JkIHdhcyByZWNyZWF0ZWQgZHVlIHRvIHJlLXJvdXRpbmcsIHNlcnZlciBpbnZhbGlkYXRpb24gb3IKKyAgICAgICAgLy8gc2VydmVyIGNyYXNoLgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25OZXdJQXVkaW9SZWNvcmQoKSB7fQorICAgIH07CiAKICAgICAvKiBSZXR1cm5zIHRoZSBtaW5pbXVtIGZyYW1lIGNvdW50IHJlcXVpcmVkIGZvciB0aGUgc3VjY2Vzc2Z1bCBjcmVhdGlvbiBvZgogICAgICAqIGFuIEF1ZGlvUmVjb3JkIG9iamVjdC4KQEAgLTE4MiwyMCArMjA4LDM3IEBACiAgICAgICogcEF0dHJpYnV0ZXM6ICAgICAgICBJZiBub3QgTlVMTCwgc3VwZXJzZWRlcyBpbnB1dFNvdXJjZSBmb3IgdXNlIGNhc2Ugc2VsZWN0aW9uLgogICAgICAqIHRocmVhZENhbkNhbGxKYXZhOiAgTm90IHByZXNlbnQgaW4gcGFyYW1ldGVyIGxpc3QsIGFuZCBzbyBpcyBmaXhlZCBhdCBmYWxzZS4KICAgICAgKi8KLQogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPElBdWRpb1JlY29yZENhbGxiYWNrPiAmY2FsbGJhY2sgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWljRGlyZWN0aW9uID0gTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBNSUNfRklFTERfRElNRU5TSU9OX0RFRkFVTFQpOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWljRGlyZWN0aW9uID0gTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCwKQEAgLTIyMywxMyArMjY2LDEyIEBACiAgICAgICoKICAgICAgKiB0aHJlYWRDYW5DYWxsSmF2YTogIFdoZXRoZXIgY2FsbGJhY2tzIGFyZSBtYWRlIGZyb20gYW4gYXR0YWNoZWQgdGhyZWFkIGFuZCB0aHVzIGNhbiBjYWxsIEpOSS4KICAgICAgKi8KLSAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUF1ZGlvUmVjb3JkQ2FsbGJhY2s+ICZjYWxsYmFjayA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCkBAIC0yMzcsNyArMjc5LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQgPSBBVURJT19VSURfSU5WQUxJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRNaWNEaXJlY3Rpb24gPSBNSUNfRElSRUNUSU9OX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBNSUNfRklFTERfRElNRU5TSU9OX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyA9IDApOworCisgICAgICAgICAgIHN0YXR1c190ICAgIHNldChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCA9IEFVRElPX1VJRF9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE1pY0RpcmVjdGlvbiA9IE1JQ19ESVJFQ1RJT05fVU5TUEVDSUZJRUQsCkBAIC0yNjQsNiArMzI3LDcgQEAKICAgICAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCAgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KICAgICAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lU2l6ZSgpIGNvbnN0ICAgeyByZXR1cm4gbUZyYW1lU2l6ZTsgfQogICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UoKSBjb25zdCAgeyByZXR1cm4gbUF0dHJpYnV0ZXMuc291cmNlOyB9CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFzazsgfQogCiAgICAgLyoKICAgICAgKiBSZXR1cm4gdGhlIHBlcmlvZCBvZiB0aGUgbm90aWZpY2F0aW9uIGNhbGxiYWNrIGluIGZyYW1lcy4KQEAgLTY3Miw5ICs3MzYsMTEgQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtQWN0aXZlOwogCiAgICAgLy8gZm9yIGNsaWVudCBjYWxsYmFjayBoYW5kbGVyCi0gICAgY2FsbGJhY2tfdCAgICAgICAgICAgICAgbUNiZjsgICAgICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgaGFuZGxlciBmb3IgZXZlbnRzLCBvciBOVUxMCi0gICAgdm9pZCogICAgICAgICAgICAgICAgICAgbVVzZXJEYXRhOwogCisgICAgd3A8SUF1ZGlvUmVjb3JkQ2FsbGJhY2s+IG1DYWxsYmFjazsKKyAgICBzcDxJQXVkaW9SZWNvcmRDYWxsYmFjaz4gbUxlZ2FjeUNhbGxiYWNrV3JhcHBlcjsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOyAgIC8vIFByb3RlY3QgYWdhaW5zdCBkb3VibGUgc2V0CiAgICAgLy8gZm9yIG5vdGlmaWNhdGlvbiBBUElzCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcTsgLy8gcmVxdWVzdGVkIG51bWJlciBvZiBmcmFtZXMgYmV0d2VlbiBlYWNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIGNhbGxiYWNrCkBAIC03NTksNiArODI1LDEzIEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFJldHJvZ3JhZGVQb3NpdGlvblJlcG9ydGVkID0gZmFsc2U7IC8vIHJlZHVjZSBsb2cgc3BhbQogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBSZXRyb2dyYWRlVGltZVJlcG9ydGVkID0gZmFsc2U7ICAgICAvLyByZWR1Y2UgbG9nIHNwYW0KIAorICAgIC8vIEZvcm1hdCBjb252ZXJzaW9uLiBNYXliZSBuZWVkZWQgZm9yIGFkZGluZyBmYXN0IHRyYWNrcyB3aG9zZSBmb3JtYXQgaXMgZGlmZmVyZW50IGZyb20gc2VydmVyLgorICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgICAgIG1TZXJ2ZXJDb25maWc7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbVNlcnZlckZyYW1lU2l6ZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtU2VydmVyU2FtcGxlU2l6ZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBtRm9ybWF0Q29udmVyc2lvbkJ1ZlJhdzsKKyAgICBCdWZmZXIgICAgICAgICAgICAgICAgICBtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlcjsKKwogcHJpdmF0ZToKICAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKICAgICBwdWJsaWM6CkBAIC04MjMsNiArODk2LDggQEAKICAgICBNZWRpYU1ldHJpY3MgbU1lZGlhTWV0cmljczsKICAgICBzdGQ6OnN0cmluZyBtTWV0cmljc0lkOyAgLy8gR1VBUkRFRF9CWShtTG9jayksIGNvdWxkIGNoYW5nZSBpbiBjcmVhdGVSZWNvcmRfbCgpLgogICAgIHN0ZDo6c3RyaW5nIG1DYWxsZXJOYW1lOyAvLyBmb3IgZXhhbXBsZSAiYWF1ZGlvIgorCisgICAgdm9pZCByZXBvcnRFcnJvcihzdGF0dXNfdCBzdGF0dXMsIGNvbnN0IGNoYXIgKmV2ZW50LCBjb25zdCBjaGFyICptZXNzYWdlKSBjb25zdDsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggOGJhMjNhZC4uMzYwYjgzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMTksMjQgKzE5LDMxIEBACiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9WaWJyYXRvckluZm8uaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuQXVkaW9GbGluZ2VyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9CbkF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgotI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSVNwYXRpYWxpemVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5SW5mby5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeVR5cGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvblV0aWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbnRhaW5lcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPG1lZGlhL01pY3JvcGhvbmVJbmZvLmg+Ci0jaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLSNpbmNsdWRlIDx2ZWN0b3I+CiAKIHVzaW5nIGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CiAKQEAgLTcwLDYgKzc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKIHR5cGVkZWYgdm9pZCAoKnJvdXRpbmdfY2FsbGJhY2spKCk7Cit0eXBlZGVmIHZvaWQgKCp2b2xfcmFuZ2VfaW5pdF9yZXFfY2FsbGJhY2spKCk7CiAKIGNsYXNzIElBdWRpb0ZsaW5nZXI7CiBjbGFzcyBTdHJpbmc4OwpAQCAtMTQ3LDYgKzE1NSw3IEBACiAgICAgc3RhdGljIHZvaWQgc2V0RHluUG9saWN5Q2FsbGJhY2soZHluYW1pY19wb2xpY3lfY2FsbGJhY2sgY2IpOwogICAgIHN0YXRpYyB2b2lkIHNldFJlY29yZENvbmZpZ0NhbGxiYWNrKHJlY29yZF9jb25maWdfY2FsbGJhY2spOwogICAgIHN0YXRpYyB2b2lkIHNldFJvdXRpbmdDYWxsYmFjayhyb3V0aW5nX2NhbGxiYWNrIGNiKTsKKyAgICBzdGF0aWMgdm9pZCBzZXRWb2xJbml0UmVxQ2FsbGJhY2sodm9sX3JhbmdlX2luaXRfcmVxX2NhbGxiYWNrIGNiKTsKIAogICAgIC8vIFNldHMgdGhlIGJpbmRlciB0byB1c2UgZm9yIGFjY2Vzc2luZyB0aGUgQXVkaW9GbGluZ2VyIHNlcnZpY2UuIFRoaXMgZW5hYmxlcyB0aGUgc3lzdGVtIHNlcnZlcgogICAgIC8vIHRvIGdyYW50IHNwZWNpZmljIGlzb2xhdGVkIHByb2Nlc3NlcyBhY2Nlc3MgdG8gdGhlIGF1ZGlvIHN5c3RlbS4gQ3VycmVudGx5IHVzZWQgb25seSBmb3IgdGhlCkBAIC0yMjUsNiArMjM0LDkgQEAKICAgICAvLyBJbmRpY2F0ZSBKQVZBIHNlcnZpY2VzIGFyZSByZWFkeSAoc2NoZWR1bGluZywgcG93ZXIgbWFuYWdlbWVudCAuLi4pCiAgICAgc3RhdGljIHN0YXR1c190IHN5c3RlbVJlYWR5KCk7CiAKKyAgICAvLyBJbmRpY2F0ZSBhdWRpbyBwb2xpY3kgc2VydmljZSBpcyByZWFkeQorICAgIHN0YXRpYyBzdGF0dXNfdCBhdWRpb1BvbGljeVJlYWR5KCk7CisKICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBhdWRpbyBIQUwgYnVmZmVyLgogICAgIC8vIENvcnJlc3BvbmRzIHRvIGF1ZGlvX3N0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKCkvYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUoKSBmb3IgaW5wdXQuCiAgICAgLy8gU2VlIGFsc28gZ2V0RnJhbWVDb3VudCgpLgpAQCAtMjU0LDggKzI2Niw4IEBACiAgICAgLy8gSUF1ZGlvUG9saWN5U2VydmljZSBpbnRlcmZhY2UgKHNlZSBBdWRpb1BvbGljeUludGVyZmFjZSBmb3IgbWV0aG9kIGRlc2NyaXB0aW9ucykKICAgICAvLwogICAgIHN0YXRpYyB2b2lkIG9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCk7Ci0gICAgc3RhdGljIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgc3RhdGljIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0JiBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgc3RhdGljIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CkBAIC0yNzYsNyArMjg4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1NwYXRpYWxpemVkKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICBzdGF0aWMgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKQEAgLTMxOCw5ICszMzEsOSBAQAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KTsKIAogICAgIHN0YXRpYyBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHN0YXRpYyBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAgICAgc3RhdGljIHN0YXR1c190IGdldERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgKmRldmljZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvclZvbHVtZSk7CiAKICAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpOwogICAgIHN0YXRpYyBzdGF0dXNfdCByZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLApAQCAtMzM3LDYgKzM1MCw3IEBACiAgICAgc3RhdGljIHZvaWQgY2xlYXJBdWRpb0NvbmZpZ0NhY2hlKCk7CiAKICAgICBzdGF0aWMgY29uc3Qgc3A8bWVkaWE6OklBdWRpb1BvbGljeVNlcnZpY2U+IGdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIHN0YXRpYyB2b2lkIGNsZWFyQXVkaW9Qb2xpY3lTZXJ2aWNlKCk7CiAKICAgICAvLyBoZWxwZXJzIGZvciBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlci5nZXRQcm9wZXJ0eSgpLCBzZWUgZGVzY3JpcHRpb24gdGhlcmUgZm9yIG1lYW5pbmcKICAgICBzdGF0aWMgdWludDMyX3QgZ2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSgpOwpAQCAtMzY0LDcgKzM3OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKIAotICAgIC8qIEdldCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KKyAgICAvKiBHZXQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LiBPbiBpbnB1dCwgdGhlIHBvcnQKKyAgICAgKiBvbmx5IG5lZWRzIHRoZSAnaWQnIGZpZWxkIHRvIGJlIGZpbGxlZCBpbi4gKi8KICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KTsKIAogICAgIC8qIENyZWF0ZSBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCkBAIC00MTUsOCArNDMwLDggQEAKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CisgICAgc3RhdGljIHN0YXR1c190IGdldEh3T2ZmbG9hZEZvcm1hdHNTdXBwb3J0ZWRGb3JCbHVldG9vdGhNZWRpYSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CiAKICAgICAvLyBudW1TdXJyb3VuZEZvcm1hdHMgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZvcm1hdHMgYW5kIGJvb2wgdmFsdWUgYWxsb3dlZCBpbiB0aGUgYXJyYXkuCiAgICAgLy8gV2hlbiBudW1TdXJyb3VuZEZvcm1hdHMgaXMgMCwgc3Vycm91bmRGb3JtYXRzIGFuZCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkIHdpbGwgbm90IGJlCkBAIC00MjgsMTMgKzQ0MywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqc3Vycm91bmRGb3JtYXRzKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpOwogCi0gICAgc3RhdGljIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRIb3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZCh1aWRfdCB1aWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRBc3Npc3RhbnRTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QWN0aXZlQXNzaXN0YW50U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgYWN0aXZlVWlkcyk7CisKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRDdXJyZW50SW1lVWlkKHVpZF90IHVpZCk7CiAKICAgICBzdGF0aWMgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOwogCisgICAgc3RhdGljIGJvb2wgICAgIGlzVWx0cmFzb3VuZFN1cHBvcnRlZCgpOworCiAgICAgc3RhdGljIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcygKICAgICAgICAgICAgIGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5LApAQCAtNDg1LDggKzUwMyw3NCBAQAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpOwogCisKKyAgICAvKioKKyAgICAgKiBJZiBhIHNwYXRpYWxpemVyIHN0YWdlIGVmZmVjdCBpcyBwcmVzZW50IG9uIHRoZSBwbGF0Zm9ybSwgdGhpcyB3aWxsIHJldHVybiBhbgorICAgICAqIElTcGF0aWFsaXplciBpbnRlcmZhY2UgdG8gY29udHJvbCB0aGlzIGZlYXR1cmUuCisgICAgICogSWYgbm8gc3BhdGlhbGl6ZXIgc3RhZ2UgaXMgcHJlc2VudCwgYSBudWxsIGludGVyZmFjZSBpcyByZXR1cm5lZC4KKyAgICAgKiBUaGUgSU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2sgcGFzc2VkIG11c3Qgbm90IGJlIG51bGwuCisgICAgICogT25seSBvbmUgSVNwYXRpYWxpemVyIGludGVyZmFjZSBjYW4gZXhpc3QgYXQgYSBnaXZlbiB0aW1lLiBUaGUgbmF0aXZlIGF1ZGlvIHBvbGljeQorICAgICAqIHNlcnZpY2Ugd2lsbCByZWplY3QgdGhlIHJlcXVlc3QgaWYgYW4gaW50ZXJmYWNlIHdhcyBhbHJlYWR5IGFjcXVpcmVkIGFuZCBwcmV2aW91cyBvd25lcgorICAgICAqIGRpZCBub3QgZGllIG9yIGNhbGwgSVNwYXRpYWxpemVyLnJlbGVhc2UoKS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgaW46IHRoZSBjYWxsYmFjayB0byByZWNlaXZlIHN0YXRlIHVwZGF0ZXMgaWYgdGhlIElTcGF0aWFsaXplcgorICAgICAqICAgICAgICBpbnRlcmZhY2UgaXMgYWNxdWlyZWQuCisgICAgICogQHBhcmFtIHNwYXRpYWxpemVyIG91dDogdGhlIElTcGF0aWFsaXplciBpbnRlcmZhY2UgbWFkZSBhdmFpbGFibGUgdG8gY29udHJvbCB0aGUKKyAgICAgKiAgICAgICAgcGxhdGZvcm0gc3BhdGlhbGl6ZXIKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGluIGNhc2Ugb2Ygc3VjY2VzcywgREVBRF9PQkpFQ1QsIE5PX0lOSVQsIFBFUk1JU1NJT05fREVOSUVELCBCQURfVkFMVUUKKyAgICAgKiAgICAgICAgIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IGdldFNwYXRpYWxpemVyKGNvbnN0IHNwPG1lZGlhOjpJTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPG1lZGlhOjpJU3BhdGlhbGl6ZXI+KiBzcGF0aWFsaXplcik7CisKKyAgICAvKioKKyAgICAgKiBRdWVyaWVzIGlmIHNvbWUga2luZCBvZiBzcGF0aWFsaXphdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBpZiB0aGUgYXVkaW8gcGxheWJhY2sgY29udGV4dAorICAgICAqIGRlc2NyaWJlZCBieSB0aGUgcHJvdmlkZWQgYXJndW1lbnRzIGlzIHByZXNlbnQuCisgICAgICogVGhlIGNvbnRleHQgaXMgbWFkZSBvZjoKKyAgICAgKiAtIFRoZSBhdWRpbyBhdHRyaWJ1dGVzIGRlc2NyaWJpbmcgdGhlIHBsYXliYWNrIHVzZSBjYXNlLgorICAgICAqIC0gVGhlIGF1ZGlvIGNvbmZpZ3VyYXRpb24gZGVzY3JpYmluZyB0aGUgYXVkaW8gZm9ybWF0LCBjaGFubmVscywgc2FtcGxpbmcgcmF0ZSAuLi4KKyAgICAgKiAtIFRoZSBkZXZpY2VzIGRlc2NyaWJpbmcgdGhlIHNpbmsgYXVkaW8gZGV2aWNlIHNlbGVjdGVkIGZvciBwbGF5YmFjay4KKyAgICAgKiBBbGwgYXJndW1lbnRzIGFyZSBvcHRpb25hbCBhbmQgb25seSB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBtYXRjaCBhZ2FpbnN0CisgICAgICogc3VwcG9ydGVkIGNyaXRlcmlhLiBGb3IgaW5zdGFuY2UsIHN1cHBseWluZyBubyBhcmd1bWVudCB3aWxsIHRlbGwgaWYgc3BhdGlhbGl6YXRpb24gaXMKKyAgICAgKiBzdXBwb3J0ZWQgb3Igbm90IGluIGdlbmVyYWwuCisgICAgICogQHBhcmFtIGF0dHIgYXVkaW8gYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBwbGF5YmFjayB1c2UgY2FzZQorICAgICAqIEBwYXJhbSBjb25maWcgYXVkaW8gY29uZmlndXJhdGlvbiBkZXNjcmliaW5nIHRoZSBhdWRpbyBmb3JtYXQsIGNoYW5uZWxzLCBzYW1wbGluZyByYXRlLi4uCisgICAgICogQHBhcmFtIGRldmljZXMgdGhlIHNpbmsgYXVkaW8gZGV2aWNlIHNlbGVjdGVkIGZvciBwbGF5YmFjaworICAgICAqIEBwYXJhbSBjYW5CZVNwYXRpYWxpemVkIG91dDogdHJ1ZSBpZiBzcGF0aWFsaXphdGlvbiBpcyBlbmFibGVkIGZvciB0aGlzIGNvbnRleHQsCisgICAgICogICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaW4gY2FzZSBvZiBzdWNjZXNzLCBERUFEX09CSkVDVCwgTk9fSU5JVCwgQkFEX1ZBTFVFCisgICAgICogICAgICAgICBpbiBjYXNlIG9mIGVycm9yLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBjYW5CZVNwYXRpYWxpemVkKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqY2FuQmVTcGF0aWFsaXplZCk7CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSBob3cgdGhlIGRpcmVjdCBwbGF5YmFjayBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UuCisgICAgICogQHBhcmFtIGF0dHIgYXVkaW8gYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBwbGF5YmFjayB1c2UgY2FzZQorICAgICAqIEBwYXJhbSBjb25maWcgYXVkaW8gY29uZmlndXJhdGlvbiBmb3IgdGhlIHBsYXliYWNrCisgICAgICogQHBhcmFtIGRpcmVjdE1vZGUgb3V0OiBhIHNldCBvZiBmbGFncyBkZXNjcmliaW5nIGhvdyB0aGUgZGlyZWN0IHBsYXliYWNrIGlzIGN1cnJlbnRseQorICAgICAqICAgICAgICBzdXBwb3J0ZWQgb24gdGhlIGRldmljZQorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaW4gY2FzZSBvZiBzdWNjZXNzLCBERUFEX09CSkVDVCwgTk9fSU5JVCwgQkFEX1ZBTFVFLCBQRVJNSVNTSU9OX0RFTklFRAorICAgICAqICAgICAgICAgaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kaXJlY3RfbW9kZV90ICpkaXJlY3RNb2RlKTsKKworCisgICAgLyoqCisgICAgICogUXVlcnkgd2hpY2ggZGlyZWN0IGF1ZGlvIHByb2ZpbGVzIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgYXVkaW8gYXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gYXR0ciBhdWRpbyBhdHRyaWJ1dGVzIGRlc2NyaWJpbmcgdGhlIHBsYXliYWNrIHVzZSBjYXNlCisgICAgICogQHBhcmFtIGF1ZGlvUHJvZmlsZXMgb3V0OiBhIHZlY3RvciBvZiBhdWRpbyBwcm9maWxlcworICAgICAqIEByZXR1cm4gTk9fRVJST1IgaW4gY2FzZSBvZiBzdWNjZXNzLCBERUFEX09CSkVDVCwgTk9fSU5JVCwgQkFEX1ZBTFVFLCBQRVJNSVNTSU9OX0RFTklFRAorICAgICAqICAgICAgICAgaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fcHJvZmlsZT4qIGF1ZGlvUHJvZmlsZXMpOworCiAgICAgLy8gQSBsaXN0ZW5lciBmb3IgY2FwdHVyZSBzdGF0ZSBjaGFuZ2VzLgotICAgIGNsYXNzIENhcHR1cmVTdGF0ZUxpc3RlbmVyIDogcHVibGljIFJlZkJhc2UgeworICAgIGNsYXNzIENhcHR1cmVTdGF0ZUxpc3RlbmVyIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CiAgICAgcHVibGljOgogICAgICAgICAvLyBDYWxsZWQgd2hlbmV2ZXIgY2FwdHVyZSBzdGF0ZSBjaGFuZ2VzLgogICAgICAgICB2aXJ0dWFsIHZvaWQgb25TdGF0ZUNoYW5nZWQoYm9vbCBhY3RpdmUpID0gMDsKQEAgLTQ5NywxMSArNTgxLDExIEBACiAgICAgICAgIHZpcnR1YWwgfkNhcHR1cmVTdGF0ZUxpc3RlbmVyKCkgPSBkZWZhdWx0OwogICAgIH07CiAKLSAgICAvLyBSZWdpc2V0ZXJzIGEgbGlzdGVuZXIgZm9yIHNvdW5kIHRyaWdnZXIgY2FwdHVyZSBzdGF0ZSBjaGFuZ2VzLgorICAgIC8vIFJlZ2lzdGVycyBhIGxpc3RlbmVyIGZvciBzb3VuZCB0cmlnZ2VyIGNhcHR1cmUgc3RhdGUgY2hhbmdlcy4KICAgICAvLyBUaGVyZSBtYXkgb25seSBiZSBvbmUgc3VjaCBsaXN0ZW5lciByZWdpc3RlcmVkIGF0IGFueSBwb2ludC4KLSAgICAvLyBUaGUgbGlzdGVuZXIgb25TdGF0ZUNoYW5nZWQoKSBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHN5Y2hyb25vdXNseSBmcm9tCisgICAgLy8gVGhlIGxpc3RlbmVyIG9uU3RhdGVDaGFuZ2VkKCkgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBzeW5jaHJvbm91c2x5IGZyb20KICAgICAvLyB0aGlzIGNhbGwgd2l0aCB0aGUgaW5pdGlhbCB2YWx1ZS4KLSAgICAvLyBUaGUgbGlzdGVuZXIgb25TZXJ2aWNlRGllZCgpIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgc3ljaHJvbm91c2x5IGZyb20KKyAgICAvLyBUaGUgbGlzdGVuZXIgb25TZXJ2aWNlRGllZCgpIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgc3luY2hyb25vdXNseSBmcm9tCiAgICAgLy8gdGhpcyBjYWxsIGlmIGluaXRpYWwgYXR0ZW1wdCB0byByZWdpc3RlciBmYWlsZWQuCiAgICAgLy8gSWYgdGhlIGF1ZGlvIHBvbGljeSBzZXJ2aWNlIGNhbm5vdCBiZSByZWFjaGVkLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybgogICAgIC8vIFBFUk1JU1NJT05fREVOSUVEIGFuZCB3aWxsIG5vdCBpbnZva2UgdGhlIGNhbGxiYWNrLCBvdGhlcndpc2UsIGl0IHdpbGwKQEAgLTUxMSw3ICs1OTUsNyBAQAogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAgY2xhc3MgQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKKyAgICBjbGFzcyBBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2sgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiAgICAgewogICAgIHB1YmxpYzoKIApAQCAtNTI2LDcgKzYxMCw3IEBACiAgICAgc3RhdGljIHN0YXR1c190IGFkZEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjayk7CiAgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjayk7CiAKLSAgICBjbGFzcyBBdWRpb1BvcnRDYWxsYmFjayA6IHB1YmxpYyBSZWZCYXNlCisgICAgY2xhc3MgQXVkaW9Qb3J0Q2FsbGJhY2sgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiAgICAgewogICAgIHB1YmxpYzoKIApAQCAtNTQyLDcgKzYyNiw3IEBACiAgICAgc3RhdGljIHN0YXR1c190IGFkZEF1ZGlvUG9ydENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvUG9ydENhbGxiYWNrPiYgY2FsbGJhY2spOwogICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVBdWRpb1BvcnRDYWxsYmFjayhjb25zdCBzcDxBdWRpb1BvcnRDYWxsYmFjaz4mIGNhbGxiYWNrKTsKIAotICAgIGNsYXNzIEF1ZGlvRGV2aWNlQ2FsbGJhY2sgOiBwdWJsaWMgUmVmQmFzZQorICAgIGNsYXNzIEF1ZGlvRGV2aWNlQ2FsbGJhY2sgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiAgICAgewogICAgIHB1YmxpYzoKIApAQCAtNTY0LDYgKzY0OCwxNCBAQAogCiAgICAgc3RhdGljIHN0YXR1c190IHNldFZpYnJhdG9ySW5mb3MoY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvPiYgdmlicmF0b3JJbmZvcyk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TW1hcFBvbGljeUluZm8oCisgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm8+ICpwb2xpY3lJbmZvcyk7CisKKyAgICBzdGF0aWMgaW50MzJfdCBnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKTsKKworICAgIHN0YXRpYyBpbnQzMl90IGdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCk7CisKIHByaXZhdGU6CiAKICAgICBjbGFzcyBBdWRpb0ZsaW5nZXJDbGllbnQ6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwgcHVibGljIG1lZGlhOjpCbkF1ZGlvRmxpbmdlckNsaWVudApAQCAtNjQwLDEzICs3MzIsMTQgQEAKICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAogICAgICAgICAgICAgICAgIGludDMyX3QgZXZlbnQsCiAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OlJlY29yZENsaWVudEluZm8mIGNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSYgY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZ0Jhc2UmIGNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4mIGNsaWVudEVmZmVjdHMsCi0gICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSYgZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0NvbmZpZ0Jhc2UmIGRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4mIGVmZmVjdHMsCiAgICAgICAgICAgICAgICAgaW50MzJfdCBwYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIHNvdXJjZSkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU291cmNlIHNvdXJjZSkgb3ZlcnJpZGU7CiAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uUm91dGluZ1VwZGF0ZWQoKTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgb25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCk7CiAKICAgICBwcml2YXRlOgogICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKQEAgLTY3NCw2ICs3NjcsNyBAQAogICAgIHN0YXRpYyBkeW5hbWljX3BvbGljeV9jYWxsYmFjayBnRHluUG9saWN5Q2FsbGJhY2s7CiAgICAgc3RhdGljIHJlY29yZF9jb25maWdfY2FsbGJhY2sgZ1JlY29yZENvbmZpZ0NhbGxiYWNrOwogICAgIHN0YXRpYyByb3V0aW5nX2NhbGxiYWNrIGdSb3V0aW5nQ2FsbGJhY2s7CisgICAgc3RhdGljIHZvbF9yYW5nZV9pbml0X3JlcV9jYWxsYmFjayBnVm9sUmFuZ2VJbml0UmVxQ2FsbGJhY2s7CiAKICAgICBzdGF0aWMgc2l6ZV90IGdJbkJ1ZmZTaXplOwogICAgIC8vIHByZXZpb3VzIHBhcmFtZXRlcnMgZm9yIHJlY29yZGluZyBidWZmZXIgc2l6ZSBxdWVyaWVzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCmluZGV4IGNiMDA5OTAuLjlmNTQwZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CiAKKyNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9CbkF1ZGlvVHJhY2tDYWxsYmFjay5oIgpAQCAtOTQsMzQgKzk1LDM2IEBACiAKICAgICBjbGFzcyBCdWZmZXIKICAgICB7CisgICAgZnJpZW5kIEF1ZGlvVHJhY2s7CiAgICAgcHVibGljOgotICAgICAgICAvLyBGSVhNRSB1c2UgbSBwcmVmaXgKKyAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1TaXplOyB9CisgICAgICAgc2l6ZV90IGdldEZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBmcmFtZUNvdW50OyB9CisgICAgICAgdWludDhfdCAqIGRhdGEoKSBjb25zdCB7IHJldHVybiB1aTg7IH0KKyAgICAgICAvLyBMZWF2aW5nIHB1YmxpYyBmb3Igbm93IHRvIGVhc2UgcmVmYWN0b3JpbmcuIFRoaXMgY2xhc3Mgd2lsbCBiZQorICAgICAgIC8vIHJlcGxhY2VkCiAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQ7ICAgLy8gbnVtYmVyIG9mIHNhbXBsZSBmcmFtZXMgY29ycmVzcG9uZGluZyB0byBzaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlucHV0IHRvIG9idGFpbkJ1ZmZlcigpIGl0IGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIGRlc2lyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gb3V0cHV0IGZyb20gb2J0YWluQnVmZmVyKCkgaXQgaXMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBbZW1wdHkgc2xvdHMgZm9yXSBmcmFtZXMgdG8gYmUgZmlsbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gaW5wdXQgdG8gcmVsZWFzZUJ1ZmZlcigpIGl0IGlzIGN1cnJlbnRseSBpZ25vcmVkCi0KLSAgICAgICAgc2l6ZV90ICAgICAgc2l6ZTsgICAgICAgICAvLyBpbnB1dC9vdXRwdXQgaW4gYnl0ZXMgPT0gZnJhbWVDb3VudCAqIGZyYW1lU2l6ZQorICAgIHByaXZhdGU6CisgICAgICAgIHNpemVfdCAgICAgIG1TaXplOyAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGluIGJ5dGVzID09IGZyYW1lQ291bnQgKiBmcmFtZVNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCB0byBvYnRhaW5CdWZmZXIoKSBpdCBpcyBpZ25vcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gb3V0cHV0IGZyb20gb2J0YWluQnVmZmVyKCkgaXQgaXMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBbZW1wdHkgc2xvdHMgZm9yXSBieXRlcyB0byBiZSBmaWxsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd2hpY2ggaXMgZnJhbWVDb3VudCAqIGZyYW1lU2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlucHV0IHRvIHJlbGVhc2VCdWZmZXIoKSBpdCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVsZWFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIFRoaXMgaXMgcmVkdW5kYW50IHdpdGggcmVzcGVjdCB0byBmcmFtZUNvdW50LiAgQ29uc2lkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZW1vdmluZyBzaXplIGFuZCBtYWtpbmcgZnJhbWVDb3VudCB0aGUgcHJpbWFyeSBmaWVsZC4KIAogICAgICAgICB1bmlvbiB7CiAgICAgICAgICAgICB2b2lkKiAgICAgICByYXc7CiAgICAgICAgICAgICBpbnQxNl90KiAgICBpMTY7ICAgICAgLy8gc2lnbmVkIDE2LWJpdAotICAgICAgICAgICAgaW50OF90KiAgICAgaTg7ICAgICAgIC8vIHVuc2lnbmVkIDgtYml0LCBvZmZzZXQgYnkgMHg4MAorICAgICAgICAgICAgdWludDhfdCogICAgdWk4OyAgICAgIC8vIHVuc2lnbmVkIDgtYml0LCBvZmZzZXQgYnkgMHg4MAogICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IHRvIG9idGFpbkJ1ZmZlcigpOiB1bnVzZWQsIG91dHB1dDogcG9pbnRlciB0byBidWZmZXIKIAogICAgICAgICB1aW50MzJfdCAgICBzZXF1ZW5jZTsgICAgICAgLy8gSUF1ZGlvVHJhY2sgaW5zdGFuY2Ugc2VxdWVuY2UgbnVtYmVyLCBhcyBvZiBvYnRhaW5CdWZmZXIoKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IGlzIHNldCBieSBvYnRhaW5CdWZmZXIoKSBhbmQgY29uZmlybWVkIGJ5IHJlbGVhc2VCdWZmZXIoKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCAidXNlci1zZXJ2aWNlYWJsZSIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIENvbnNpZGVyIHNwPElNZW1vcnk+IGluc3RlYWQsIG9yIGluIGFkZGl0aW9uIHRvIHRoaXMuCiAgICAgfTsKIAogICAgIC8qIEFzIGEgY29udmVuaWVuY2UsIGlmIGEgY2FsbGJhY2sgaXMgc3VwcGxpZWQsIGEgaGFuZGxlciB0aHJlYWQKQEAgLTE0NSw3ICsxNDgsNzkgQEAKICAgICAgKiAgICAgICAgICAtIEVWRU5UX05FV19USU1FU1RBTVA6IHBvaW50ZXIgdG8gY29uc3QgQXVkaW9UaW1lc3RhbXAuCiAgICAgICovCiAKLSAgICB0eXBlZGVmIHZvaWQgKCpjYWxsYmFja190KShpbnQgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQgKmluZm8pOworICAgIHR5cGVkZWYgdm9pZCAoKmxlZ2FjeV9jYWxsYmFja190KShpbnQgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQqIGluZm8pOworICAgIGNsYXNzIElBdWRpb1RyYWNrQ2FsbGJhY2sgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKKyAgICAgIGZyaWVuZCBBdWRpb1RyYWNrOworICAgICAgcHJvdGVjdGVkOgorICAgICAgIC8qIFJlcXVlc3QgdG8gd3JpdGUgbW9yZSBkYXRhIHRvIGJ1ZmZlci4KKyAgICAgICAgKiBUaGlzIGV2ZW50IG9ubHkgb2NjdXJzIGZvciBUUkFOU0ZFUl9DQUxMQkFDSy4KKyAgICAgICAgKiBJZiB0aGlzIGV2ZW50IGlzIGRlbGl2ZXJlZCBidXQgdGhlIGNhbGxiYWNrIGhhbmRsZXIgZG9lcyBub3Qgd2FudCB0byB3cml0ZSBtb3JlIGRhdGEsCisgICAgICAgICogdGhlIGhhbmRsZXIgbXVzdCBpZ25vcmUgdGhlIGV2ZW50IGJ5IHJldHVybmluZyB6ZXJvLgorICAgICAgICAqIFRoaXMgbWlnaHQgb2NjdXIsIGZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gaXMgd2FpdGluZyBmb3Igc291cmNlIGRhdGEgb3IgaXMgYXQKKyAgICAgICAgKiB0aGUgZW5kIG9mIHN0cmVhbS4KKyAgICAgICAgKiBGb3IgZGF0YSBmaWxsaW5nLCBpdCBpcyBwcmVmZXJyZWQgdGhhdCB0aGUgY2FsbGJhY2sgZG9lcyBub3QgYmxvY2sgYW5kIGluc3RlYWQgcmV0dXJucworICAgICAgICAqIGEgc2hvcnQgY291bnQgb2YgdGhlIGFtb3VudCBvZiBkYXRhIGFjdHVhbGx5IGRlbGl2ZXJlZC4KKyAgICAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAgICAqICAtIGJ1ZmZlcjogQnVmZmVyIHRvIGZpbGwKKyAgICAgICAgKiBSZXR1cm5zOgorICAgICAgICAqIEFtb3VudCBvZiBkYXRhIGFjdHVhbGx5IHdyaXR0ZW4gaW4gYnl0ZXMuCisgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc2l6ZV90IG9uTW9yZURhdGEoW1ttYXliZV91bnVzZWRdXSBjb25zdCBBdWRpb1RyYWNrOjpCdWZmZXImIGJ1ZmZlcikgeyByZXR1cm4gMDsgfQorCisgICAgICAgIC8vIEJ1ZmZlciB1bmRlcnJ1biBvY2N1cnJlZC4gVGhpcyB3aWxsIG5vdCBvY2N1ciBmb3Igc3RhdGljIHRyYWNrcy4KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uVW5kZXJydW4oKSB7fQorCisgICAgICAgLyogU2FtcGxlIGxvb3AgZW5kIHdhcyByZWFjaGVkOyBwbGF5YmFjayByZXN0YXJ0ZWQgZnJvbSBsb29wIHN0YXJ0IGlmIGxvb3AgY291bnQgd2FzIG5vdCAwCisgICAgICAgICogZm9yIGEgc3RhdGljIHRyYWNrLgorICAgICAgICAqIFBhcmFtZXRlcnM6CisgICAgICAgICogIC0gbG9vcHNSZW1haW5pbmc6IE51bWJlciBvZiBsb29wcyByZW1haW5pbmcgdG8gYmUgcGxheWVkLiAtMSBpZiBpbmZpbml0ZSBsb29waW5nLgorICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25Mb29wRW5kKFtbbWF5YmVfdW51c2VkXV0gaW50MzJfdCBsb29wc1JlbWFpbmluZykge30KKworICAgICAgIC8qIFBsYXliYWNrIGhlYWQgaXMgYXQgdGhlIHNwZWNpZmllZCBtYXJrZXIgKFNlZSBzZXRNYXJrZXJQb3NpdGlvbigpKS4KKyAgICAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAgICAqICAtIG9uTWFya2VyOiBNYXJrZXIgcG9zaXRpb24gaW4gZnJhbWVzCisgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbk1hcmtlcihbW21heWJlX3VudXNlZF1dIHVpbnQzMl90IG1hcmtlclBvc2l0aW9uKSB7fQorCisgICAgICAgLyogUGxheWJhY2sgaGVhZCBpcyBhdCBhIG5ldyBwb3NpdGlvbiAoU2VlIHNldFBvc2l0aW9uVXBkYXRlUGVyaW9kKCkpLgorICAgICAgICAqIFBhcmFtZXRlcnM6CisgICAgICAgICogIC0gbmV3UG9zOiBOZXcgcG9zaXRpb24gaW4gZnJhbWVzCisgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbk5ld1BvcyhbW21heWJlX3VudXNlZF1dIHVpbnQzMl90IG5ld1Bvcykge30KKworICAgICAgICAvLyBQbGF5YmFjayBoYXMgY29tcGxldGVkIGZvciBhIHN0YXRpYyB0cmFjay4KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyRW5kKCkge30KKworICAgICAgICAvLyBJQXVkaW9UcmFjayB3YXMgcmUtY3JlYXRlZCwgZWl0aGVyIGR1ZSB0byByZS1yb3V0aW5nIGFuZCB2b2x1bnRhcnkgaW52YWxpZGF0aW9uCisgICAgICAgIC8vIGJ5IG1lZGlhc2VydmVyLCBvciBtZWRpYXNlcnZlciBjcmFzaC4KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uTmV3SUF1ZGlvVHJhY2soKSB7fQorCisgICAgICAgIC8vIFNlbnQgYWZ0ZXIgYWxsIHRoZSBidWZmZXJzIHF1ZXVlZCBpbiBBRiBhbmQgSFcgYXJlIHBsYXllZCBiYWNrIChhZnRlciBzdG9wIGlzIGNhbGxlZCkKKyAgICAgICAgLy8gZm9yIGFuIG9mZmxvYWRlZCB0cmFjay4KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uU3RyZWFtRW5kKCkge30KKworICAgICAgIC8qIERlbGl2ZXJlZCBwZXJpb2RpY2FsbHkgYW5kIHdoZW4gdGhlcmUncyBhIHNpZ25pZmljYW50IGNoYW5nZQorICAgICAgICAqIGluIHRoZSBtYXBwaW5nIGZyb20gZnJhbWUgcG9zaXRpb24gdG8gcHJlc2VudGF0aW9uIHRpbWUuCisgICAgICAgICogU2VlIEF1ZGlvVGltZXN0YW1wIGZvciB0aGUgaW5mb3JtYXRpb24gaW5jbHVkZWQgd2l0aCBldmVudC4KKyAgICAgICAgKiBUT0RPIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisgICAgICAgICogUGFyYW1ldGVyczoKKyAgICAgICAgKiAgLSB0aW1lc3RhbXA6IE5ldyBmcmFtZSBwb3NpdGlvbiBhbmQgcHJlc2VudGF0aW9uIHRpbWUgbWFwcGluZy4KKyAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uTmV3VGltZXN0YW1wKFtbbWF5YmVfdW51c2VkXV0gQXVkaW9UaW1lc3RhbXAgdGltZXN0YW1wKSB7fQorCisgICAgICAgLyogTm90aWZpY2F0aW9uIHRoYXQgbW9yZSBkYXRhIGNhbiBiZSBnaXZlbiBieSB3cml0ZSgpCisgICAgICAgICogVGhpcyBldmVudCBvbmx5IG9jY3VycyBmb3IgVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSy4KKyAgICAgICAgKiBTaW1pbGFyIHRvIG9uTW9yZURhdGEoKSwgcmV0dXJuIHRoZSBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHdyaXR0ZW4KKyAgICAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAgICAqICAtIGJ1ZmZlcjogQnVmZmVyIHRvIGZpbGwKKyAgICAgICAgKiBSZXR1cm5zOgorICAgICAgICAqIEFtb3VudCBvZiBkYXRhIGFjdHVhbGx5IHdyaXR0ZW4gaW4gYnl0ZXMuCisgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc2l6ZV90IG9uQ2FuV3JpdGVNb3JlRGF0YShbW21heWJlX3VudXNlZF1dIGNvbnN0IEF1ZGlvVHJhY2s6OkJ1ZmZlciYgYnVmZmVyKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH07CiAKICAgICAvKiBSZXR1cm5zIHRoZSBtaW5pbXVtIGZyYW1lIGNvdW50IHJlcXVpcmVkIGZvciB0aGUgc3VjY2Vzc2Z1bCBjcmVhdGlvbiBvZgogICAgICAqIGFuIEF1ZGlvVHJhY2sgb2JqZWN0LgpAQCAtMjU2LDE1ICszMzEsMzQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICAgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciAgICAgICAgICAgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2soIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwpAQCAtMjgwLDIyICszNzQsMzkgQEAKICAgICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0byBwYXNzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgbm90aWZpZWQgb2YgcGxheWJhY2sgZW5kIGJ5IGFuCiAgICAgICogRVZFTlRfVU5ERVJSVU4gZXZlbnQuCiAgICAgICovCi0KICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2soIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiAgICAgID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCA9IDEuMGYpOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2soIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeV9jYWxsYmFja190IGNiZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCAgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZik7CiAKQEAgLTMzMywyMCArNDQ0LDczIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPElBdWRpb1RyYWNrQ2FsbGJhY2s+JiBjYWxsYmFjayA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCA9IDEuMGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisKKyAgICAgICAgICAgIHN0cnVjdCBTZXRQYXJhbXMgeworICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDsKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzazsKKyAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKKyAgICAgICAgICAgICAgICB3cDxJQXVkaW9UcmFja0NhbGxiYWNrPiBjYWxsYmFjazsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lczsKKyAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXI7CisgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YTsKKyAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkOworICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlOworICAgICAgICAgICAgICAgIC8vIFRPRE8gZG9uJ3QgdGFrZSBwb2ludGVycyBoZXJlCisgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvOworICAgICAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2U7CisgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0OworICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQ7CisgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkOworICAgICAgICAgICAgfTsKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIC8vIE5vdGU6IENvbnN1bWVzIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIHZvaWQgICAgICAgIHNldChTZXRQYXJhbXMmIHMpIHsKKyAgICAgICAgICAgICAgICAodm9pZClzZXQocy5zdHJlYW1UeXBlLCBzLnNhbXBsZVJhdGUsIHMuZm9ybWF0LCBzLmNoYW5uZWxNYXNrLCBzLmZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZmxhZ3MsIHN0ZDo6bW92ZShzLmNhbGxiYWNrKSwgcy5ub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShzLnNoYXJlZEJ1ZmZlciksIHMudGhyZWFkQ2FuQ2FsbEphdmEsIHMuc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLnRyYW5zZmVyVHlwZSwgcy5vZmZsb2FkSW5mbywgc3RkOjptb3ZlKHMuYXR0cmlidXRpb25Tb3VyY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLnBBdHRyaWJ1dGVzLCBzLmRvTm90UmVjb25uZWN0LCBzLm1heFJlcXVpcmVkU3BlZWQsIHMuc2VsZWN0ZWREZXZpY2VJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkICAgICAgIG9uRmlyc3RSZWYoKSBvdmVycmlkZTsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3lfY2FsbGJhY2tfdCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogdXNlciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOworCiAgICAgLy8gRklYTUUoYi8xNjk4ODk3MTQpOiBWZW5kb3IgY29kZSBkZXBlbmRzIG9uIHRoZSBvbGQgbWV0aG9kIHNpZ25hdHVyZSBhdCBsaW5rIHRpbWUKICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKQEAgLTM1NCwxNyArNTE4LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeV9jYWxsYmFja190IGNiZiA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciAgICAgICAgICA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQgPSBBVURJT19VSURfSU5WQUxJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCA9IDEuMGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CkBAIC00MDEsNiArNTY1LDcgQEAKIAogICAgICAgICAgICAgdWludDMyX3QgICAgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudDsgfQogICAgICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudCgpIGNvbnN0ICB7IHJldHVybiBtRnJhbWVDb3VudDsgfQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbE1hc2s7IH0KIAogICAgIC8qCiAgICAgICogUmV0dXJuIHRoZSBwZXJpb2Qgb2YgdGhlIG5vdGlmaWNhdGlvbiBjYWxsYmFjayBpbiBmcmFtZXMuCkBAIC00MjcsOCArNTkyLDcgQEAKICAgICAgKiBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKS4KICAgICAgKiBJdCBtYXkgYWxzbyBiZSBhZGp1c3RlZCBzbGlnaHRseSBmb3IgaW50ZXJuYWwgcmVhc29ucy4KICAgICAgKgotICAgICAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvciBhIG5lZ2F0aXZlIGVycm9yIGlmIHRoZSB0cmFjayBpcyB1bml0aWFsaXplZAotICAgICAqIG9yIGRvZXMgbm90IHN1cHBvcnQgdmFyaWFibGUgc2l6ZXMuCisgICAgICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9yIGEgbmVnYXRpdmUgdmFsdWUgKE5PX0lOSVQpIGlmIHRoZSB0cmFjayBpcyB1bmluaXRpYWxpemVkLgogICAgICAqLwogICAgICAgICAgICAgc3NpemVfdCAgICAgc2V0QnVmZmVyU2l6ZUluRnJhbWVzKHNpemVfdCBzaXplKTsKIApAQCAtNTEwLDYgKzY3NCwxNCBAQAogICAgICAqLwogICAgICAgICAgICAgdm9pZCAgICAgICAgcGF1c2UoKTsKIAorICAgIC8qIFBhdXNlIGFuZCB3YWl0ICh3aXRoIHRpbWVvdXQpIGZvciB0aGUgYXVkaW8gdHJhY2sgdG8gcmFtcCB0byBzaWxlbmNlLgorICAgICAqCisgICAgICogXHBhcmFtIHRpbWVvdXQgaXMgdGhlIHRpbWUgbGltaXQgdG8gd2FpdCBiZWZvcmUgcmV0dXJuaW5nLgorICAgICAqICAgICAgICAgICAgICAgIEEgbmVnYXRpdmUgbnVtYmVyIGlzIHRyZWF0ZWQgYXMgMC4KKyAgICAgKiBccmV0dXJuIHRydWUgaWYgdGhlIHRyYWNrIGlzIHJhbXBlZCB0byBzaWxlbmNlLCBmYWxzZSBpZiB0aGUgdGltZW91dCBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICAgICAgICAgIGJvb2wgICAgICAgIHBhdXNlQW5kV2FpdChjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzJiB0aW1lb3V0KTsKKwogICAgIC8qIFNldCB2b2x1bWUgZm9yIHRoaXMgdHJhY2ssIG1vc3RseSB1c2VkIGZvciBnYW1lcycgc291bmQgZWZmZWN0cwogICAgICAqIGxlZnQgYW5kIHJpZ2h0IHZvbHVtZXMuIExldmVscyBtdXN0IGJlID49IDAuMCBhbmQgPD0gMS4wLgogICAgICAqIFRoaXMgaXMgdGhlIG9sZGVyIEFQSS4gIE5ldyBhcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSBzZXRWb2x1bWUoZmxvYXQpIHdoZW4gcG9zc2libGUuCkBAIC0xMTcyLDcgKzEzNDQsNiBAQAogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1TaGFyZWRCdWZmZXI7CiAgICAgdHJhbnNmZXJfdHlwZSAgICAgICAgICAgbVRyYW5zZmVyOwogICAgIGF1ZGlvX29mZmxvYWRfaW5mb190ICAgIG1PZmZsb2FkSW5mb0NvcHk7Ci0gICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QqIG1PZmZsb2FkSW5mbzsKICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgICAgICBtQXR0cmlidXRlczsKIAogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7ICAgICAgICAgICAgIC8vIGZyYW1lIHNpemUgaW4gYnl0ZXMKQEAgLTEyMDYsMTEgKzEzNzcsMTMgQEAKICAgICB9CiAKICAgICAvLyBmb3IgY2xpZW50IGNhbGxiYWNrIGhhbmRsZXIKLSAgICBjYWxsYmFja190ICAgICAgICAgICAgICBtQ2JmOyAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBoYW5kbGVyIGZvciBldmVudHMsIG9yIE5VTEwKLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtVXNlckRhdGE7Ci0KKyAgICB3cDxJQXVkaW9UcmFja0NhbGxiYWNrPiBtQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGhhbmRsZXIgZm9yIGV2ZW50cywgb3IgTlVMTAorICAgIHNwPElBdWRpb1RyYWNrQ2FsbGJhY2s+IG1MZWdhY3lDYWxsYmFja1dyYXBwZXI7ICAgICAgLy8gd3JhcHBlciBmb3IgbGVnYWN5IGNhbGxiYWNrIGludGVyZmFjZQogICAgIC8vIGZvciBub3RpZmljYXRpb24gQVBJcworICAgIHN0ZDo6dW5pcXVlX3B0cjxTZXRQYXJhbXM+IG1TZXRQYXJhbXM7ICAgICAgICAgIC8vIFRlbXBvcmFyeSBjb3B5IG9mIGN0b3IgcGFyYW1zIHRvIGFsbG93IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVycmVkIHNldCBhZnRlciBmaXJzdCByZWZlcmVuY2UuCiAKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsgICAvLyBTZXQgYWZ0ZXIgdHJhY2sgaXMgaW5pdGlhbGl6ZWQKICAgICAvLyBuZXh0IDIgZmllbGRzIGFyZSBjb25zdCBhZnRlciBjb25zdHJ1Y3RvciBvciBzZXQoKQogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXE7IC8vIHJlcXVlc3RlZCBudW1iZXIgb2YgZnJhbWVzIGJldHdlZW4gZWFjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiBjYWxsYmFjaywKQEAgLTEzODAsNiArMTU1Myw5IEBACiAgICAgc3RkOjpzdHJpbmcgbU1ldHJpY3NJZDsgIC8vIEdVQVJERURfQlkobUxvY2spLCBjb3VsZCBjaGFuZ2UgaW4gY3JlYXRlVHJhY2tfbCgpLgogICAgIHN0ZDo6c3RyaW5nIG1DYWxsZXJOYW1lOyAvLyBmb3IgZXhhbXBsZSAiYWF1ZGlvIgogCisgICAgLy8gcmVwb3J0IGVycm9yIHRvIG1lZGlhbWV0cmljcy4KKyAgICB2b2lkIHJlcG9ydEVycm9yKHN0YXR1c190IHN0YXR1cywgY29uc3QgY2hhciAqZXZlbnQsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpIGNvbnN0OworCiBwcml2YXRlOgogICAgIGNsYXNzIEF1ZGlvVHJhY2tDYWxsYmFjayA6IHB1YmxpYyBtZWRpYTo6Qm5BdWRpb1RyYWNrQ2FsbGJhY2sgewogICAgIHB1YmxpYzoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKaW5kZXggMGUwNTlmNy4uM2MzNzE1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKQEAgLTM3LDEwICszNywxMiBAQAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9WaWJyYXRvckluZm8uaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuQXVkaW9GbGluZ2VyU2VydmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQnBBdWRpb0ZsaW5nZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3lJbmZvLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5VHlwZS5oPgogI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvQ3JlYXRlRWZmZWN0UmVxdWVzdC5oIgogI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvQ3JlYXRlRWZmZWN0UmVzcG9uc2UuaCIKICNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0NyZWF0ZVJlY29yZFJlcXVlc3QuaCIKQEAgLTYzLDcgKzY1LDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jbGFzcyBJQXVkaW9GbGluZ2VyIDogcHVibGljIFJlZkJhc2UgeworY2xhc3MgSUF1ZGlvRmxpbmdlciA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewogcHVibGljOgogICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBERUZBVUxUX1NFUlZJQ0VfTkFNRVtdID0gIm1lZGlhLmF1ZGlvX2ZsaW5nZXIiOwogCkBAIC0xNjYsNiArMTY4LDcgQEAKICAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyczsKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQ7CiAgICAgICAgIHNwPG1lZGlhOjpJQXVkaW9SZWNvcmQ+IGF1ZGlvUmVjb3JkOworICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IHNlcnZlckNvbmZpZzsKIAogICAgICAgICBDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpDcmVhdGVSZWNvcmRSZXNwb25zZT4gdG9BaWRsKCkgY29uc3Q7CiAgICAgICAgIHN0YXRpYyBDb252ZXJzaW9uUmVzdWx0PENyZWF0ZVJlY29yZE91dHB1dD4KQEAgLTMyOSw2ICszMzIsOSBAQAogICAgIC8qIEluZGljYXRlIEpBVkEgc2VydmljZXMgYXJlIHJlYWR5IChzY2hlZHVsaW5nLCBwb3dlciBtYW5hZ2VtZW50IC4uLikgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHN5c3RlbVJlYWR5KCkgPSAwOwogCisgICAgLy8gSW5kaWNhdGUgYXVkaW8gcG9saWN5IHNlcnZpY2UgaXMgcmVhZHkKKyAgICB2aXJ0dWFsIHN0YXR1c190IGF1ZGlvUG9saWN5UmVhZHkoKSA9IDA7CisKICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBhdWRpbyBIQUwgYnVmZmVyLgogICAgIHZpcnR1YWwgc2l6ZV90IGZyYW1lQ291bnRIQUwoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0ID0gMDsKIApAQCAtMzQ0LDYgKzM1MCwxNiBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTZWNvbmRhcnlPdXRwdXRzKAogICAgICAgICAgICAgY29uc3QgVHJhY2tTZWNvbmRhcnlPdXRwdXRzTWFwJiB0cmFja1NlY29uZGFyeU91dHB1dHMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvbGljeUluZm9zKAorICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeVR5cGUgcG9saWN5VHlwZSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lJbmZvPiAqcG9saWN5SW5mb3MpID0gMDsKKworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3RlZFN0YXRlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0LCBib29sIGNvbm5lY3RlZCkgPSAwOwogfTsKIAogLyoqCkBAIC00MzIsMTIgKzQ0OCwyMCBAQAogICAgIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcqIGNvbmZpZykgb3ZlcnJpZGU7CiAgICAgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBzeXN0ZW1SZWFkeSgpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGF1ZGlvUG9saWN5UmVhZHkoKSBvdmVycmlkZTsKKwogICAgIHNpemVfdCBmcmFtZUNvdW50SEFMKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdCBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBtaWNyb3Bob25lcykgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3Qgc2V0QXVkaW9IYWxQaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcykgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3Qgc2V0VmlicmF0b3JJbmZvcyhjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9WaWJyYXRvckluZm8+JiB2aWJyYXRvckluZm9zKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCB1cGRhdGVTZWNvbmRhcnlPdXRwdXRzKAogICAgICAgICAgICAgY29uc3QgVHJhY2tTZWNvbmRhcnlPdXRwdXRzTWFwJiB0cmFja1NlY29uZGFyeU91dHB1dHMpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zKSBvdmVycmlkZTsKKyAgICBpbnQzMl90IGdldEFBdWRpb01peGVyQnVyc3RDb3VudCgpIG92ZXJyaWRlOworICAgIGludDMyX3QgZ2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCwgYm9vbCBjb25uZWN0ZWQpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAgIGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9GbGluZ2VyU2VydmljZT4gbURlbGVnYXRlOwpAQCAtNDU4LDkgKzQ4Miw5IEBACiAgICAgICogTGVnYWN5IHNlcnZlciBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGluIG9yZGVyIHRvIGJlIHdyYXBwZWQuCiAgICAgICovCiAgICAgY2xhc3MgRGVsZWdhdGUgOiBwdWJsaWMgSUF1ZGlvRmxpbmdlciB7Ci0gICAgcHJvdGVjdGVkOgogICAgICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjsKLQorICAgIHB1YmxpYzoKKyAgICAgICAgLy8gZXhwb3NlIHRoZSBUcmFuc2FjdGlvbkNvZGUgZW51bSBmb3IgVGltZUNoZWNrIHB1cnBvc2VzLgogICAgICAgICBlbnVtIGNsYXNzIFRyYW5zYWN0aW9uQ29kZSB7CiAgICAgICAgICAgICBDUkVBVEVfVFJBQ0sgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9jcmVhdGVUcmFjaywKICAgICAgICAgICAgIENSRUFURV9SRUNPUkQgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9jcmVhdGVSZWNvcmQsCkBAIC01MTQsNiArNTM4LDcgQEAKICAgICAgICAgICAgIFNFVF9BVURJT19QT1JUX0NPTkZJRyA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3NldEF1ZGlvUG9ydENvbmZpZywKICAgICAgICAgICAgIEdFVF9BVURJT19IV19TWU5DX0ZPUl9TRVNTSU9OID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZ2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uLAogICAgICAgICAgICAgU1lTVEVNX1JFQURZID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc3lzdGVtUmVhZHksCisgICAgICAgICAgICBBVURJT19QT0xJQ1lfUkVBRFkgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9hdWRpb1BvbGljeVJlYWR5LAogICAgICAgICAgICAgRlJBTUVfQ09VTlRfSEFMID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZnJhbWVDb3VudEhBTCwKICAgICAgICAgICAgIEdFVF9NSUNST1BIT05FUyA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2dldE1pY3JvcGhvbmVzLAogICAgICAgICAgICAgU0VUX01BU1RFUl9CQUxBTkNFID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc2V0TWFzdGVyQmFsYW5jZSwKQEAgLTUyMiw4ICs1NDcsMTMgQEAKICAgICAgICAgICAgIFNFVF9BVURJT19IQUxfUElEUyA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3NldEF1ZGlvSGFsUGlkcywKICAgICAgICAgICAgIFNFVF9WSUJSQVRPUl9JTkZPUyA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3NldFZpYnJhdG9ySW5mb3MsCiAgICAgICAgICAgICBVUERBVEVfU0VDT05EQVJZX09VVFBVVFMgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl91cGRhdGVTZWNvbmRhcnlPdXRwdXRzLAorICAgICAgICAgICAgR0VUX01NQVBfUE9MSUNZX0lORk9TID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZ2V0TW1hcFBvbGljeUluZm9zLAorICAgICAgICAgICAgR0VUX0FBVURJT19NSVhFUl9CVVJTVF9DT1VOVCA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2dldEFBdWRpb01peGVyQnVyc3RDb3VudCwKKyAgICAgICAgICAgIEdFVF9BQVVESU9fSEFSRFdBUkVfQlVSU1RfTUlOX1VTRUMgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9nZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYywKKyAgICAgICAgICAgIFNFVF9ERVZJQ0VfQ09OTkVDVEVEX1NUQVRFID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc2V0RGV2aWNlQ29ubmVjdGVkU3RhdGUsCiAgICAgICAgIH07CiAKKyAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIC8qKgogICAgICAgICAgKiBBbmQgb3B0aW9uYWwgaG9vaywgY2FsbGVkIG9uIGV2ZXJ5IHRyYW5zYWN0aW9uLCBhbGxvd2luZyBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgdG8gYmUKICAgICAgICAgICogcGVyZm9ybWVkIGJlZm9yZS9hZnRlciB0aGUgdW5wYXJjZWxpbmcgIG9mdGhlIGRhdGEgYW5kIGRpc3BhdGNoaW5nIHRvIHRoZSByZXNwZWN0aXZlCkBAIC01NjMsNyArNTkzLDggQEAKICAgICBTdGF0dXMgY3JlYXRlUmVjb3JkKGNvbnN0IG1lZGlhOjpDcmVhdGVSZWNvcmRSZXF1ZXN0JiByZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZVJlY29yZFJlc3BvbnNlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIFN0YXR1cyBzYW1wbGVSYXRlKGludDMyX3QgaW9IYW5kbGUsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGZvcm1hdChpbnQzMl90IG91dHB1dCwgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBmb3JtYXQoaW50MzJfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXREZXNjcmlwdGlvbiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBTdGF0dXMgZnJhbWVDb3VudChpbnQzMl90IGlvSGFuZGxlLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIFN0YXR1cyBsYXRlbmN5KGludDMyX3Qgb3V0cHV0LCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIFN0YXR1cyBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdmFsdWUpIG92ZXJyaWRlOwpAQCAtNTcyLDEyICs2MDMsMTMgQEAKICAgICBTdGF0dXMgbWFzdGVyTXV0ZShib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIFN0YXR1cyBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpIG92ZXJyaWRlOwogICAgIFN0YXR1cyBnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzZXRTdHJlYW1Wb2x1bWUobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGZsb2F0IHZhbHVlLCBpbnQzMl90IG91dHB1dCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldFN0cmVhbU11dGUobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGJvb2wgbXV0ZWQpIG92ZXJyaWRlOwotICAgIFN0YXR1cwotICAgIHN0cmVhbVZvbHVtZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBvdXRwdXQsIGZsb2F0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzdHJlYW1NdXRlKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzZXRNb2RlKG1lZGlhOjpBdWRpb01vZGUgbW9kZSkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldFN0cmVhbVZvbHVtZShtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbHVlLCBpbnQzMl90IG91dHB1dCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldFN0cmVhbU11dGUobWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGJvb2wgbXV0ZWQpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzdHJlYW1Wb2x1bWUobWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG91dHB1dCwgZmxvYXQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHN0cmVhbU11dGUobWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldE1vZGUobWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTW9kZSBtb2RlKSBvdmVycmlkZTsKICAgICBTdGF0dXMgc2V0TWljTXV0ZShib29sIHN0YXRlKSBvdmVycmlkZTsKICAgICBTdGF0dXMgZ2V0TWljTXV0ZShib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIFN0YXR1cyBzZXRSZWNvcmRTaWxlbmNlZChpbnQzMl90IHBvcnRJZCwgYm9vbCBzaWxlbmNlZCkgb3ZlcnJpZGU7CkBAIC01ODUsOCArNjE3LDEwIEBACiAgICAgU3RhdHVzCiAgICAgZ2V0UGFyYW1ldGVycyhpbnQzMl90IGlvSGFuZGxlLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5cywgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0SW5wdXRCdWZmZXJTaXplKGludDMyX3Qgc2FtcGxlUmF0ZSwgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2ssIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldElucHV0QnVmZmVyU2l6ZShpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXREZXNjcmlwdGlvbiYgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ2hhbm5lbExheW91dCYgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIFN0YXR1cyBvcGVuT3V0cHV0KGNvbnN0IG1lZGlhOjpPcGVuT3V0cHV0UmVxdWVzdCYgcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6T3Blbk91dHB1dFJlc3BvbnNlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIFN0YXR1cyBvcGVuRHVwbGljYXRlT3V0cHV0KGludDMyX3Qgb3V0cHV0MSwgaW50MzJfdCBvdXRwdXQyLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwpAQCAtNTk2LDcgKzYzMCw3IEBACiAgICAgU3RhdHVzIG9wZW5JbnB1dChjb25zdCBtZWRpYTo6T3BlbklucHV0UmVxdWVzdCYgcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpPcGVuSW5wdXRSZXNwb25zZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBTdGF0dXMgY2xvc2VJbnB1dChpbnQzMl90IGlucHV0KSBvdmVycmlkZTsKLSAgICBTdGF0dXMgaW52YWxpZGF0ZVN0cmVhbShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGludmFsaWRhdGVTdHJlYW0obWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0pIG92ZXJyaWRlOwogICAgIFN0YXR1cyBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIG92ZXJyaWRlOwogICAgIFN0YXR1cyBnZXRSZW5kZXJQb3NpdGlvbihpbnQzMl90IG91dHB1dCwgbWVkaWE6OlJlbmRlclBvc2l0aW9uKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIFN0YXR1cyBnZXRJbnB1dEZyYW1lc0xvc3QoaW50MzJfdCBpb0hhbmRsZSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKQEAgLTYwNSw3ICs2MzksOCBAQAogICAgIFN0YXR1cyByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50MzJfdCBhdWRpb1Nlc3Npb24sIGludDMyX3QgcGlkKSBvdmVycmlkZTsKICAgICBTdGF0dXMgcXVlcnlOdW1iZXJFZmZlY3RzKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIHF1ZXJ5RWZmZWN0KGludDMyX3QgaW5kZXgsIG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIGVmZmVjdFVVSUQsIGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIHR5cGVVVUlELAorICAgIFN0YXR1cyBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1V1aWQmIGVmZmVjdFVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvVXVpZCYgdHlwZVVVSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6RWZmZWN0RGVzY3JpcHRvciogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBTdGF0dXMgY3JlYXRlRWZmZWN0KGNvbnN0IG1lZGlhOjpDcmVhdGVFZmZlY3RSZXF1ZXN0JiByZXF1ZXN0LApAQCAtNjI0LDEyICs2NTksMTkgQEAKICAgICBTdGF0dXMgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWcmIGNvbmZpZykgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBTdGF0dXMgc3lzdGVtUmVhZHkoKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgYXVkaW9Qb2xpY3lSZWFkeSgpIG92ZXJyaWRlOwogICAgIFN0YXR1cyBmcmFtZUNvdW50SEFMKGludDMyX3QgaW9IYW5kbGUsIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgU3RhdHVzIGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mb0RhdGE+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIFN0YXR1cyBzZXRBdWRpb0hhbFBpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHBpZHMpIG92ZXJyaWRlOwogICAgIFN0YXR1cyBzZXRWaWJyYXRvckluZm9zKGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbz4mIHZpYnJhdG9ySW5mb3MpIG92ZXJyaWRlOwogICAgIFN0YXR1cyB1cGRhdGVTZWNvbmRhcnlPdXRwdXRzKAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OlRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mbz4mIHRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mb3MpIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRNbWFwUG9saWN5SW5mb3MoCisgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm8+ICpfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZ2V0QUF1ZGlvSGFyZHdhcmVCdXJzdE1pblVzZWMoaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc2V0RGV2aWNlQ29ubmVjdGVkU3RhdGUoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgcG9ydCwgYm9vbCBjb25uZWN0ZWQpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OkRlbGVnYXRlPiBtRGVsZWdhdGU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1BvbGljeUFpZGxDb252ZXJzaW9uLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1BvbGljeUFpZGxDb252ZXJzaW9uLmgKaW5kZXggODczZjI3YS4uNTRlNzc4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Qb2xpY3lBaWRsQ29udmVyc2lvbi5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvUG9saWN5QWlkbENvbnZlcnNpb24uaApAQCAtMjMsMTAgKzIzLDggQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9NaXguaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvTWl4Q2FsbGJhY2tGbGFnLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb01peExhdGVuY3lDbGFzcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9NaXhSb3V0ZUZsYWcuaD4KICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvTWl4VHlwZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Nb2RlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb09mZmxvYWRNb2RlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvbGljeUZvcmNlVXNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvbGljeUZvcmNlZENvbmZpZy5oPgpAQCAtMzksMTEgKzM3LDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1Db252ZXJzaW9uUmVzdWx0PHZvbHVtZV9ncm91cF90PgotYWlkbDJsZWdhY3lfaW50MzJfdF92b2x1bWVfZ3JvdXBfdChpbnQzMl90IGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PgotbGVnYWN5MmFpZGxfdm9sdW1lX2dyb3VwX3RfaW50MzJfdCh2b2x1bWVfZ3JvdXBfdCBsZWdhY3kpOwotCiBDb252ZXJzaW9uUmVzdWx0PHByb2R1Y3Rfc3RyYXRlZ3lfdD4KIGFpZGwybGVnYWN5X2ludDMyX3RfcHJvZHVjdF9zdHJhdGVneV90KGludDMyX3QgYWlkbCk7CiBDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RvbmVHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCmluZGV4IGE1NzU2MTYuLjQ2ZTk1MDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCkBAIC0yOCw3ICsyOCw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgVG9uZUdlbmVyYXRvciB7CitjbGFzcyBUb25lR2VuZXJhdG9yIDogcHVibGljIEF1ZGlvVHJhY2s6OklBdWRpb1RyYWNrQ2FsbGJhY2sgewogcHVibGljOgogCiAgICAgLy8gTGlzdCBvZiBhbGwgYXZhaWxhYmxlIHRvbmVzCkBAIC0xNTYsNiArMTU2LDkgQEAKIAogICAgIFRvbmVHZW5lcmF0b3IoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLCBmbG9hdCB2b2x1bWUsIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEgPSBmYWxzZSwKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9wUGFja2FnZU5hbWUgPSB7fSk7CisKKyAgICB2b2lkIG9uRmlyc3RSZWYoKSBvdmVycmlkZTsKKwogICAgIH5Ub25lR2VuZXJhdG9yKCk7CiAKICAgICBib29sIHN0YXJ0VG9uZSh0b25lX3R5cGUgdG9uZVR5cGUsIGludCBkdXJhdGlvbk1zID0gLTEpOwpAQCAtMjIyLDcgKzIyNSwxMSBAQAogICAgICAgICBUT05FX0lORElBX0NPTkdFU1RJT04sICAgICAgLy8gQ29uZ2VzdGlvbiB0b25lOiA0MDAgSHosIDI1MG1zIE9OLCAyNTBtcyBPRkYuLi4KICAgICAgICAgVE9ORV9JTkRJQV9DQUxMX1dBSVRJTkcsICAgIC8vIENhbGwgd2FpdGluZyB0b25lOiA0MDAgSHosIHRvbmUgcmVwZWF0ZWQgaW4gYSAwLjJzIG9uLCAwLjFzIG9mZiwgMC4ycyBvbiwgNy41cyBvZmYgcGF0dGVybi4KICAgICAgICAgVE9ORV9JTkRJQV9SSU5HVE9ORSwgICAgICAgIC8vIFJpbmcgdG9uZTogNDAwIEh6IHRvbmUgbW9kdWxhdGVkIHdpdGggMjVIeiwgMC40IG9uIDAuMiBvZmYgMC40IG9uIDIuLjAgb2ZmCisgICAgICAgICAvLyBUQUlXQU4gc3VwZXJ2aXNvcnkgdG9uZXMKICAgICAgICAgVE9ORV9UV19SSU5HVE9ORSwgICAgICAgICAgIC8vIFJpbmcgVG9uZTogNDQwIEh6ICsgNDgwIEh6IHJlcGVhdGVkIHdpdGggcGF0dGVybiAxcyBvbiwgM3Mgb2ZmLgorICAgICAgICAgLy8gTkVXIFpFQUxBTkQgc3VwZXJ2aXNvcnkgdG9uZXMKKyAgICAgICAgVE9ORV9OWl9DQUxMX1dBSVRJTkcsICAgICAgIC8vIENhbGwgd2FpdGluZyB0b25lOiA0MDAgSHosICAwLjJzIE9OLCAzcyBPRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgMC4ycyBPTiwgM3MgT0ZGLCAwLjJzIE9OLCAzcyBPRkYsIDAuMnMgT04KICAgICAgICAgTlVNX0FMVEVSTkFURV9UT05FUwogICAgIH07CiAKQEAgLTIzNiw2ICsyNDMsNyBAQAogICAgICAgICBJUkVMQU5ELAogICAgICAgICBJTkRJQSwKICAgICAgICAgVEFJV0FOLAorICAgICAgICBOWiwKICAgICAgICAgQ0VQVCwKICAgICAgICAgTlVNX1JFR0lPTlMKICAgICB9OwpAQCAtMjg0LDExICsyOTIsMTAgQEAKICAgICBzdGF0aWMgY29uc3QgVG9uZURlc2NyaXB0b3Igc1RvbmVEZXNjcmlwdG9yc1tdOwogCiAgICAgYm9vbCBtVGhyZWFkQ2FuQ2FsbEphdmE7Ci0gICAgdW5zaWduZWQgaW50IG1Ub3RhbFNtcDsgIC8vIFRvdGFsIG51bWJlciBvZiBhdWRpbyBzYW1wbGVzIHBsYXllZCAoZ2l2ZXMgY3VycmVudCB0aW1lKQorICAgIHVpbnQ2NF90IG1Ub3RhbFNtcDsgIC8vIFRvdGFsIG51bWJlciBvZiBhdWRpbyBzYW1wbGVzIHBsYXllZCAoZ2l2ZXMgY3VycmVudCB0aW1lKQorICAgIC8vIFNpbmNlIHRoZXNlIHR5cGVzIGFyZSAzMiBiaXQsIHdlIG1heSBoYXZlIGlzc3VlcyB3aXRoIGFib3J0aW5nIG9uCisgICAgLy8gb3ZlcmZsb3cgbm93IHRoYXQgd2UgaGF2ZSBpbnRlZ2VyIG92ZXJmbG93IHNhbml0aXphdGlvbiBlbmFibGVkIGdsb2JhbGx5LgogICAgIHVuc2lnbmVkIGludCBtTmV4dFNlZ1NtcDsgIC8vIFBvc2l0aW9uIG9mIG5leHQgc2VnbWVudCB0cmFuc2l0aW9uIGV4cHJlc3NlZCBpbiBzYW1wbGVzCi0gICAgLy8gTk9URTogYmVjYXVzZSBtVG90YWxTbXAsIG1OZXh0U2VnU21wIGFyZSBzdG9yZWQgb24gMzIgYml0LCBjdXJyZW50IGRlc2lnbiB3aWxsIG9wZXJhdGUgcHJvcGVybHkKLSAgICAvLyBvbmx5IGlmIHRvbmUgZHVyYXRpb24gaXMgbGVzcyB0aGFuIGFib3V0IDI3IEhvdXJzKEA0NDEwMEh6IHNhbXBsaW5nIHJhdGUpLiBJZiB0aGlzIHRpbWUgaXMgZXhjZWVkZWQsCi0gICAgLy8gbm8gY3Jhc2ggd2lsbCBvY2N1ciBidXQgdG9uZSBzZXF1ZW5jZSB3aWxsIHNob3cgYSBnbGl0Y2guCiAgICAgdW5zaWduZWQgaW50IG1NYXhTbXA7ICAvLyBNYXhpbXVtIG51bWJlciBvZiBhdWRpbyBzYW1wbGVzIHBsYXllZCAobWF4aW11biB0b25lIGR1cmF0aW9uKQogICAgIGludCBtRHVyYXRpb25NczsgIC8vIE1heGltdW0gdG9uZSBkdXJhdGlvbiBpbiBtcwogCkBAIC0zMTEsNiArMzE4LDcgQEAKICAgICB1bnNpZ25lZCBpbnQgbVByb2Nlc3NTaXplOyAgLy8gU2l6ZSBvZiBhdWRpbyBibG9ja3MgZ2VuZXJhdGVkIGF0IGEgdGltZSBieSBhdWRpb0NhbGxiYWNrKCkgKGluIFBDTSBmcmFtZXMpLgogICAgIHN0cnVjdCB0aW1lc3BlYyBtU3RhcnRUaW1lOyAvLyB0b25lIHN0YXJ0IHRpbWU6IG5lZWRlZCB0byBndWFyYW50eSBhY3R1YWwgdG9uZSBkdXJhdGlvbgogCisgICAgc2l6ZV90IG9uTW9yZURhdGEoY29uc3QgQXVkaW9UcmFjazo6QnVmZmVyJiBidWZmZXIpIG92ZXJyaWRlOwogICAgIGJvb2wgaW5pdEF1ZGlvVHJhY2soKTsKICAgICBzdGF0aWMgdm9pZCBhdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCogdXNlciwgdm9pZCAqaW5mbyk7CiAgICAgYm9vbCBwcmVwYXJlV2F2ZSgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9UcmFja1BsYXllckJhc2UuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVHJhY2tQbGF5ZXJCYXNlLmgKaW5kZXggODAxMjRiOC4uZmU4ODExNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9UcmFja1BsYXllckJhc2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RyYWNrUGxheWVyQmFzZS5oCkBAIC0yOCw4ICsyOCw4IEBACiAgICAgZXhwbGljaXQgVHJhY2tQbGF5ZXJCYXNlKCk7CiAgICAgdmlydHVhbCB+VHJhY2tQbGF5ZXJCYXNlKCk7CiAKLSAgICAgICAgICAgIHZvaWQgaW5pdChBdWRpb1RyYWNrKiBwYXQsIHBsYXllcl90eXBlX3QgcGxheWVyVHlwZSwgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CisgICAgdm9pZCBpbml0KGNvbnN0IHNwPEF1ZGlvVHJhY2s+JiBwYXQsIGNvbnN0IHNwPEF1ZGlvVHJhY2s6OklBdWRpb1RyYWNrQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgcGxheWVyX3R5cGVfdCBwbGF5ZXJUeXBlLCBhdWRpb191c2FnZV90IHVzYWdlLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKICAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpOwogCiAgICAgLy9JUGxheWVyIGltcGxlbWVudGF0aW9uCkBAIC02Niw4ICs2Niw4IEBACiAKICAgICAvLyB2b2x1bWUgY29taW5nIGZyb20gdGhlIHBsYXllciB2b2x1bWUgQVBJCiAgICAgZmxvYXQgbVBsYXllclZvbHVtZUwsIG1QbGF5ZXJWb2x1bWVSOwotCi0gICBzcDxTZWxmQXVkaW9EZXZpY2VDYWxsYmFjaz4gbVNlbGZBdWRpb0RldmljZUNhbGxiYWNrOworICAgIHNwPEF1ZGlvVHJhY2s6OklBdWRpb1RyYWNrQ2FsbGJhY2s+IG1DYWxsYmFja0hhbmRsZTsKKyAgICBzcDxTZWxmQXVkaW9EZXZpY2VDYWxsYmFjaz4gbVNlbGZBdWRpb0RldmljZUNhbGxiYWNrOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggZGVmN2NhNi4uODkxMjkzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9BbmRyb2lkLmJwCkBAIC05LDEwICs5LDM1IEBACiAKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAibGliYXVkaW9jbGllbnRfdGVzdHNfZGVmYXVsdHMiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiYXVkaW9fYWlkbF9jb252ZXJzaW9uX3Rlc3RzIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2NsaWVudF90ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiYXVkaW9fYWlkbF9sZWdhY3lfY29udmVyc2lvbl90ZXN0cy5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKIH0KIAogY2NfdGVzdCB7CkBAIC0zMCw4ICs1NSwxMCBAQAogY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3RfY3JlYXRlX2F1ZGlvdHJhY2siLAogICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvY2xpZW50X3Rlc3RzX2RlZmF1bHRzIl0sCi0gICAgc3JjczogWyJ0ZXN0X2NyZWF0ZV9hdWRpb3RyYWNrLmNwcCIsCi0gICAgICAgICAgICJ0ZXN0X2NyZWF0ZV91dGlscy5jcHAiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0X2NyZWF0ZV9hdWRpb3RyYWNrLmNwcCIsCisgICAgICAgICJ0ZXN0X2NyZWF0ZV91dGlscy5jcHAiLAorICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLApAQCAtNDksOCArNzYsMTAgQEAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJ0ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZCIsCiAgICAgZGVmYXVsdHM6IFsibGliYXVkaW9jbGllbnRfdGVzdHNfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbInRlc3RfY3JlYXRlX2F1ZGlvcmVjb3JkLmNwcCIsCi0gICAgICAgICAgICJ0ZXN0X2NyZWF0ZV91dGlscy5jcHAiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZC5jcHAiLAorICAgICAgICAidGVzdF9jcmVhdGVfdXRpbHMuY3BwIiwKKyAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL2F1ZGlvX2FpZGxfbGVnYWN5X2NvbnZlcnNpb25fdGVzdHMuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvYXVkaW9fYWlkbF9sZWdhY3lfY29udmVyc2lvbl90ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3ZjYyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL2F1ZGlvX2FpZGxfbGVnYWN5X2NvbnZlcnNpb25fdGVzdHMuY3BwCkBAIC0wLDAgKzEsMjg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbW1vblR5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWlkbF91dGlsczsKKwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ2hhbm5lbExheW91dDsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZURlc2NyaXB0aW9uOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlVHlwZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0VHlwZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpQY21UeXBlOworCituYW1lc3BhY2UgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzaXplX3QgaGFzaChjb25zdCBUJiB0KSB7CisgICAgcmV0dXJuIHN0ZDo6aGFzaDxUPnt9KHQpOworfQorCitBdWRpb0NoYW5uZWxMYXlvdXQgbWFrZV9BQ0xfTm9uZSgpIHsKKyAgICByZXR1cm4gQXVkaW9DaGFubmVsTGF5b3V0e307Cit9CisKK0F1ZGlvQ2hhbm5lbExheW91dCBtYWtlX0FDTF9JbnZhbGlkKCkgeworICAgIHJldHVybiBBdWRpb0NoYW5uZWxMYXlvdXQ6Om1ha2U8QXVkaW9DaGFubmVsTGF5b3V0OjpUYWc6OmludmFsaWQ+KDApOworfQorCitBdWRpb0NoYW5uZWxMYXlvdXQgbWFrZV9BQ0xfU3RlcmVvKCkgeworICAgIHJldHVybiBBdWRpb0NoYW5uZWxMYXlvdXQ6Om1ha2U8QXVkaW9DaGFubmVsTGF5b3V0OjpUYWc6OmxheW91dE1hc2s+KAorICAgICAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0OjpMQVlPVVRfU1RFUkVPKTsKK30KKworQXVkaW9DaGFubmVsTGF5b3V0IG1ha2VfQUNMX0xheW91dEFyYml0cmFyeSgpIHsKKyAgICByZXR1cm4gQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPEF1ZGlvQ2hhbm5lbExheW91dDo6VGFnOjpsYXlvdXRNYXNrPigKKyAgICAgICAgICAgIC8vIFVzZSBjaGFubmVscyB0aGF0IGV4aXN0IGJvdGggZm9yIGlucHV0IGFuZCBvdXRwdXQsCisgICAgICAgICAgICAvLyBidXQgZG9lc24ndCBmb3JtIGEga25vd24gbGF5b3V0IG1hc2suCisgICAgICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQ6OkNIQU5ORUxfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX1RPUF9TSURFX0xFRlQgfAorICAgICAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0OjpDSEFOTkVMX1RPUF9TSURFX1JJR0hUKTsKK30KKworQXVkaW9DaGFubmVsTGF5b3V0IG1ha2VfQUNMX0NoYW5uZWxJbmRleDIoKSB7CisgICAgcmV0dXJuIEF1ZGlvQ2hhbm5lbExheW91dDo6bWFrZTxBdWRpb0NoYW5uZWxMYXlvdXQ6OlRhZzo6aW5kZXhNYXNrPigKKyAgICAgICAgICAgIEF1ZGlvQ2hhbm5lbExheW91dDo6SU5ERVhfTUFTS18yKTsKK30KKworQXVkaW9DaGFubmVsTGF5b3V0IG1ha2VfQUNMX0NoYW5uZWxJbmRleEFyYml0cmFyeSgpIHsKKyAgICAvLyBVc2UgY2hhbm5lbHMgMSBhbmQgMy4KKyAgICByZXR1cm4gQXVkaW9DaGFubmVsTGF5b3V0OjptYWtlPEF1ZGlvQ2hhbm5lbExheW91dDo6VGFnOjppbmRleE1hc2s+KDUpOworfQorCitBdWRpb0NoYW5uZWxMYXlvdXQgbWFrZV9BQ0xfVm9pY2VDYWxsKCkgeworICAgIHJldHVybiBBdWRpb0NoYW5uZWxMYXlvdXQ6Om1ha2U8QXVkaW9DaGFubmVsTGF5b3V0OjpUYWc6OnZvaWNlTWFzaz4oCisgICAgICAgICAgICBBdWRpb0NoYW5uZWxMYXlvdXQ6OlZPSUNFX0NBTExfTU9OTyk7Cit9CisKK0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24gbWFrZV9BdWRpb0RldmljZURlc2NyaXB0aW9uKEF1ZGlvRGV2aWNlVHlwZSB0eXBlLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29ubmVjdGlvbiA9ICIiKSB7CisgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiByZXN1bHQ7CisgICAgcmVzdWx0LnR5cGUgPSB0eXBlOworICAgIHJlc3VsdC5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitBdWRpb0RldmljZURlc2NyaXB0aW9uIG1ha2VfQUREX05vbmUoKSB7CisgICAgcmV0dXJuIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb257fTsKK30KKworQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBtYWtlX0FERF9EZWZhdWx0SW4oKSB7CisgICAgcmV0dXJuIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihBdWRpb0RldmljZVR5cGU6OklOX0RFRkFVTFQpOworfQorCitBdWRpb0RldmljZURlc2NyaXB0aW9uIG1ha2VfQUREX0RlZmF1bHRPdXQoKSB7CisgICAgcmV0dXJuIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihBdWRpb0RldmljZVR5cGU6Ok9VVF9ERUZBVUxUKTsKK30KKworQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiBtYWtlX0FERF9XaXJlZEhlYWRzZXQoKSB7CisgICAgcmV0dXJuIG1ha2VfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihBdWRpb0RldmljZVR5cGU6Ok9VVF9IRUFEU0VULAorICAgICAgICAgICAgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbjo6Q09OTkVDVElPTl9BTkFMT0coKSk7Cit9CisKK0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24gbWFrZV9BRERfQnRTY29IZWFkc2V0KCkgeworICAgIHJldHVybiBtYWtlX0F1ZGlvRGV2aWNlRGVzY3JpcHRpb24oQXVkaW9EZXZpY2VUeXBlOjpPVVRfSEVBRFNFVCwKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb246OkNPTk5FQ1RJT05fQlRfU0NPKCkpOworfQorCitBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihBdWRpb0Zvcm1hdFR5cGUgdHlwZSkgeworICAgIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gcmVzdWx0OworICAgIHJlc3VsdC50eXBlID0gdHlwZTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlIHBjbSkgeworICAgIGF1dG8gcmVzdWx0ID0gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKEF1ZGlvRm9ybWF0VHlwZTo6UENNKTsKKyAgICByZXN1bHQucGNtID0gcGNtOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmNvZGluZykgeworICAgIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24gcmVzdWx0OworICAgIHJlc3VsdC5lbmNvZGluZyA9IGVuY29kaW5nOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKFBjbVR5cGUgdHJhbnNwb3J0LAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZW5jb2RpbmcpIHsKKyAgICBhdXRvIHJlc3VsdCA9IG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihlbmNvZGluZyk7CisgICAgcmVzdWx0LnBjbSA9IHRyYW5zcG9ydDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIG1ha2VfQUZEX0RlZmF1bHQoKSB7CisgICAgcmV0dXJuIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb257fTsKK30KKworQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBtYWtlX0FGRF9JbnZhbGlkKCkgeworICAgIHJldHVybiBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oQXVkaW9Gb3JtYXRUeXBlOjpTWVNfUkVTRVJWRURfSU5WQUxJRCk7Cit9CisKK0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24gbWFrZV9BRkRfUGNtMTZCaXQoKSB7CisgICAgcmV0dXJuIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihQY21UeXBlOjpJTlRfMTZfQklUKTsKK30KKworQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBtYWtlX0FGRF9CaXRzdHJlYW0oKSB7CisgICAgcmV0dXJuIG1ha2VfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbigiZXhhbXBsZSIpOworfQorCitBdWRpb0Zvcm1hdERlc2NyaXB0aW9uIG1ha2VfQUZEX0VuY2FwKCkgeworICAgIHJldHVybiBtYWtlX0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oUGNtVHlwZTo6SU5UXzE2X0JJVCwgImV4YW1wbGUuZW5jYXAiKTsKK30KKworQXVkaW9Gb3JtYXREZXNjcmlwdGlvbiBtYWtlX0FGRF9FbmNhcF93aXRoX0VuYygpIHsKKyAgICBhdXRvIGFmZCA9IG1ha2VfQUZEX0VuY2FwKCk7CisgICAgYWZkLmVuY29kaW5nICs9ICIrZXhhbXBsZSI7CisgICAgcmV0dXJuIGFmZDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIFZlcmlmeSB0aGF0IHR3byBpbmRlcGVuZGVudGx5IGNvbnN0cnVjdGVkIEFERHMvQUZEcyBoYXZlIHRoZSBzYW1lIGhhc2guCisvLyBUaGlzIGVuc3VyZXMgdGhhdCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIEFERC9BRkQgaW5zdGFuY2Ugb3JpZ2luYXRlcworLy8gZnJvbSwgaXQgY2FuIGJlIGNvcnJlY3RseSBjb21wYXJlZCB0byBvdGhlciBBREQvQUZEIGluc3RhbmNlLiBUaHVzLAorLy8gZm9yIGV4YW1wbGUsIGEgMTYtYml0IGludGVnZXIgZm9ybWF0IGRlc2NyaXB0aW9uIHByb3ZpZGVkIGJ5IEhBTAorLy8gaXMgaWRlbnRpY2FsIHRvIHRoZSBzYW1lIGZvcm1hdCBkZXNjcmlwdGlvbiBjb25zdHJ1Y3RlZCBieSB0aGUgZnJhbWV3b3JrLgorY2xhc3MgSGFzaElkZW50aXR5VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwdWJsaWM6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB2ZXJpZnlIYXNoSWRlbnRpdHkoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjxUKCk+PiYgdmFsdWVHZW5zKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWVHZW5zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHZhbHVlR2Vucy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgICAgIGlmIChpID09IGopIHsKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKGhhc2godmFsdWVHZW5zW2ldKCkpLCBoYXNoKHZhbHVlR2Vuc1tpXSgpKSkgPDwgaTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfTkUoaGFzaCh2YWx1ZUdlbnNbaV0oKSksIGhhc2godmFsdWVHZW5zW2pdKCkpKSA8PCBpIDw8ICIsICIgPDwgajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9OworCitURVNUX0YoSGFzaElkZW50aXR5VGVzdCwgQXVkaW9DaGFubmVsTGF5b3V0SGFzaElkZW50aXR5KSB7CisgICAgdmVyaWZ5SGFzaElkZW50aXR5PEF1ZGlvQ2hhbm5lbExheW91dD4oeworICAgICAgICAgICAgbWFrZV9BQ0xfTm9uZSwgbWFrZV9BQ0xfSW52YWxpZCwgbWFrZV9BQ0xfU3RlcmVvLAorICAgICAgICAgICAgbWFrZV9BQ0xfTGF5b3V0QXJiaXRyYXJ5LCBtYWtlX0FDTF9DaGFubmVsSW5kZXgyLAorICAgICAgICAgICAgbWFrZV9BQ0xfQ2hhbm5lbEluZGV4QXJiaXRyYXJ5LCBtYWtlX0FDTF9Wb2ljZUNhbGx9KTsKK30KKworVEVTVF9GKEhhc2hJZGVudGl0eVRlc3QsIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb25IYXNoSWRlbnRpdHkpIHsKKyAgICB2ZXJpZnlIYXNoSWRlbnRpdHk8QXVkaW9EZXZpY2VEZXNjcmlwdGlvbj4oeworICAgICAgICAgICAgbWFrZV9BRERfTm9uZSwgbWFrZV9BRERfRGVmYXVsdEluLCBtYWtlX0FERF9EZWZhdWx0T3V0LCBtYWtlX0FERF9XaXJlZEhlYWRzZXQsCisgICAgICAgICAgICBtYWtlX0FERF9CdFNjb0hlYWRzZXR9KTsKK30KKworVEVTVF9GKEhhc2hJZGVudGl0eVRlc3QsIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb25IYXNoSWRlbnRpdHkpIHsKKyAgICB2ZXJpZnlIYXNoSWRlbnRpdHk8QXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4oeworICAgICAgICAgICAgbWFrZV9BRkRfRGVmYXVsdCwgbWFrZV9BRkRfSW52YWxpZCwgbWFrZV9BRkRfUGNtMTZCaXQsIG1ha2VfQUZEX0JpdHN0cmVhbSwKKyAgICAgICAgICAgIG1ha2VfQUZEX0VuY2FwLCBtYWtlX0FGRF9FbmNhcF93aXRoX0VuY30pOworfQorCit1c2luZyBDaGFubmVsTGF5b3V0UGFyYW0gPSBzdGQ6OnR1cGxlPEF1ZGlvQ2hhbm5lbExheW91dCwgYm9vbCAvKmlzSW5wdXQqLz47CitjbGFzcyBBdWRpb0NoYW5uZWxMYXlvdXRSb3VuZFRyaXBUZXN0IDoKKyAgICAgICAgcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08Q2hhbm5lbExheW91dFBhcmFtPiB7fTsKK1RFU1RfUChBdWRpb0NoYW5uZWxMYXlvdXRSb3VuZFRyaXBUZXN0LCBBaWRsMkxlZ2FjeTJBaWRsKSB7CisgICAgY29uc3QgYXV0byBpbml0aWFsID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgYXV0byBjb252ID0gYWlkbDJsZWdhY3lfQXVkaW9DaGFubmVsTGF5b3V0X2F1ZGlvX2NoYW5uZWxfbWFza190KGluaXRpYWwsIGlzSW5wdXQpOworICAgIEFTU0VSVF9UUlVFKGNvbnYub2soKSk7CisgICAgYXV0byBjb252QmFjayA9IGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X0F1ZGlvQ2hhbm5lbExheW91dChjb252LnZhbHVlKCksIGlzSW5wdXQpOworICAgIEFTU0VSVF9UUlVFKGNvbnZCYWNrLm9rKCkpOworICAgIEVYUEVDVF9FUShpbml0aWFsLCBjb252QmFjay52YWx1ZSgpKTsKK30KK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChBdWRpb0NoYW5uZWxMYXlvdXRSb3VuZFRyaXAsCisgICAgICAgIEF1ZGlvQ2hhbm5lbExheW91dFJvdW5kVHJpcFRlc3QsCisgICAgICAgIHRlc3Rpbmc6OkNvbWJpbmUoCisgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzKEF1ZGlvQ2hhbm5lbExheW91dHt9LCBtYWtlX0FDTF9JbnZhbGlkKCksIG1ha2VfQUNMX1N0ZXJlbygpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9BQ0xfTGF5b3V0QXJiaXRyYXJ5KCksIG1ha2VfQUNMX0NoYW5uZWxJbmRleDIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfQUNMX0NoYW5uZWxJbmRleEFyYml0cmFyeSgpKSwKKyAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMoZmFsc2UsIHRydWUpKSk7CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQXVkaW9DaGFubmVsVm9pY2VSb3VuZFRyaXAsCisgICAgICAgIEF1ZGlvQ2hhbm5lbExheW91dFJvdW5kVHJpcFRlc3QsCisgICAgICAgIC8vIEluIGxlZ2FjeSBjb25zdGFudHMgdGhlIHZvaWNlIGNhbGwgaXMgb25seSBkZWZpbmVkIGZvciBpbnB1dC4KKyAgICAgICAgdGVzdGluZzo6Q29tYmluZSh0ZXN0aW5nOjpWYWx1ZXMobWFrZV9BQ0xfVm9pY2VDYWxsKCkpLCB0ZXN0aW5nOjpWYWx1ZXModHJ1ZSkpKTsKKwordXNpbmcgQ2hhbm5lbExheW91dEVkZ2VDYXNlUGFyYW0gPSBzdGQ6OnR1cGxlPGludCAvKmxlZ2FjeSovLCBib29sIC8qaXNJbnB1dCovLCBib29sIC8qaXNWYWxpZCovPjsKK2NsYXNzIEF1ZGlvQ2hhbm5lbExheW91dEVkZ2VDYXNlVGVzdCA6CisgICAgICAgIHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPENoYW5uZWxMYXlvdXRFZGdlQ2FzZVBhcmFtPiB7fTsKK1RFU1RfUChBdWRpb0NoYW5uZWxMYXlvdXRFZGdlQ2FzZVRlc3QsIExlZ2FjeTJBaWRsKSB7CisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbGVnYWN5ID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpKTsKKyAgICBjb25zdCBib29sIGlzSW5wdXQgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKKyAgICBjb25zdCBib29sIGlzVmFsaWQgPSBzdGQ6OmdldDwyPihHZXRQYXJhbSgpKTsKKyAgICBhdXRvIGNvbnYgPSBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9BdWRpb0NoYW5uZWxMYXlvdXQobGVnYWN5LCBpc0lucHV0KTsKKyAgICBFWFBFQ1RfRVEoaXNWYWxpZCwgY29udi5vaygpKTsKK30KK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChBdWRpb0NoYW5uZWxMYXlvdXRFZGdlQ2FzZSwKKyAgICAgICAgQXVkaW9DaGFubmVsTGF5b3V0RWRnZUNhc2VUZXN0LAorICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gVmFsaWQgbGVnYWN5IGlucHV0IG1hc2tzLgorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOS19NT05PLCB0cnVlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTktfTU9OTywgdHJ1ZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfQ0FMTF9NT05PLCB0cnVlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAvLyBWYWxpZCBsZWdhY3kgb3V0cHV0IG1hc2tzLgorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaGFzIHRoZSBzYW1lIG51bWVyaWNhbCByZXByZXNlbnRhdGlvbiBhcyBNYXNrICdBJyBiZWxvdworICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSIHwgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSB8CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfUklHSFQsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGhhcyB0aGUgc2FtZSBudW1lcmljYWwgcmVwcmVzZW50YXRpb24gYXMgTWFzayAnQicgYmVsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiB8IEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgfAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfTEVGVCwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgICAgIC8vIEludmFsaWQgbGVnYWN5IGlucHV0IG1hc2tzLgorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShBVURJT19DSEFOTkVMX0lOXzYsIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOXzYgfCBBVURJT19DSEFOTkVMX0lOX0ZST05UX1BST0NFU1NFRCwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fUFJFU1NVUkUgfCBBVURJT19DSEFOTkVMX0lOX1hfQVhJUyB8CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX1lfQVhJUyB8IEFVRElPX0NIQU5ORUxfSU5fWl9BWElTLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKCAgLy8gTWFzayAnQScKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIHwgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTkssIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoICAvLyBNYXNrICdCJworICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8gfCBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSywgdHJ1ZSwgZmFsc2UpKSk7CisKK2NsYXNzIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb25Sb3VuZFRyaXBUZXN0IDoKKyAgICAgICAgcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08QXVkaW9EZXZpY2VEZXNjcmlwdGlvbj4ge307CitURVNUX1AoQXVkaW9EZXZpY2VEZXNjcmlwdGlvblJvdW5kVHJpcFRlc3QsIEFpZGwyTGVnYWN5MkFpZGwpIHsKKyAgICBjb25zdCBhdXRvIGluaXRpYWwgPSBHZXRQYXJhbSgpOworICAgIGF1dG8gY29udiA9IGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb25fYXVkaW9fZGV2aWNlc190KGluaXRpYWwpOworICAgIEFTU0VSVF9UUlVFKGNvbnYub2soKSk7CisgICAgYXV0byBjb252QmFjayA9IGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9BdWRpb0RldmljZURlc2NyaXB0aW9uKGNvbnYudmFsdWUoKSk7CisgICAgQVNTRVJUX1RSVUUoY29udkJhY2sub2soKSk7CisgICAgRVhQRUNUX0VRKGluaXRpYWwsIGNvbnZCYWNrLnZhbHVlKCkpOworfQorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEF1ZGlvRGV2aWNlRGVzY3JpcHRpb25Sb3VuZFRyaXAsCisgICAgICAgIEF1ZGlvRGV2aWNlRGVzY3JpcHRpb25Sb3VuZFRyaXBUZXN0LAorICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMoQXVkaW9EZXZpY2VEZXNjcmlwdGlvbnt9LCBtYWtlX0FERF9EZWZhdWx0SW4oKSwKKyAgICAgICAgICAgICAgICBtYWtlX0FERF9EZWZhdWx0T3V0KCksIG1ha2VfQUREX1dpcmVkSGVhZHNldCgpLCBtYWtlX0FERF9CdFNjb0hlYWRzZXQoKSkpOworCitjbGFzcyBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uUm91bmRUcmlwVGVzdCA6CisgICAgICAgIHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+IHt9OworVEVTVF9QKEF1ZGlvRm9ybWF0RGVzY3JpcHRpb25Sb3VuZFRyaXBUZXN0LCBBaWRsMkxlZ2FjeTJBaWRsKSB7CisgICAgY29uc3QgYXV0byBpbml0aWFsID0gR2V0UGFyYW0oKTsKKyAgICBhdXRvIGNvbnYgPSBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KGluaXRpYWwpOworICAgIEFTU0VSVF9UUlVFKGNvbnYub2soKSk7CisgICAgYXV0byBjb252QmFjayA9IGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24oY29udi52YWx1ZSgpKTsKKyAgICBBU1NFUlRfVFJVRShjb252QmFjay5vaygpKTsKKyAgICBFWFBFQ1RfRVEoaW5pdGlhbCwgY29udkJhY2sudmFsdWUoKSk7Cit9CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQXVkaW9Gb3JtYXREZXNjcmlwdGlvblJvdW5kVHJpcCwKKyAgICAgICAgQXVkaW9Gb3JtYXREZXNjcmlwdGlvblJvdW5kVHJpcFRlc3QsCisgICAgICAgIHRlc3Rpbmc6OlZhbHVlcyhtYWtlX0FGRF9JbnZhbGlkKCksIEF1ZGlvRm9ybWF0RGVzY3JpcHRpb257fSwgbWFrZV9BRkRfUGNtMTZCaXQoKSkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW9yZWNvcmQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW9yZWNvcmQuY3BwCmluZGV4IDFjYmNiNzEuLjJlMDg4M2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX2F1ZGlvcmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZC5jcHAKQEAgLTk4LDE0ICs5OCwxNCBAQAogICAgICAgICBhdHRyaWJ1dGVzLnNvdXJjZSA9IGlucHV0U291cmNlOwogCiAgICAgICAgIHNwPEF1ZGlvUmVjb3JkPiByZWNvcmQgPSBuZXcgQXVkaW9SZWNvcmQoYXR0cmlidXRpb25Tb3VyY2UpOworICAgICAgICBjb25zdCBhdXRvIGVtcHR5Q2FsbGJhY2sgPSBzcDxBdWRpb1JlY29yZDo6SUF1ZGlvUmVjb3JkQ2FsbGJhY2s+OjptYWtlKCk7CiAKICAgICAgICAgcmVjb3JkLT5zZXQoQVVESU9fU09VUkNFX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICBmYXN0ID8gY2FsbGJhY2sgOiBudWxscHRyLAotICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgZmFzdCA/IGVtcHR5Q2FsbGJhY2sgOiBudWxscHRyLAogICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV9hdWRpb3RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX2F1ZGlvdHJhY2suY3BwCmluZGV4IGNmOWI5MjUuLmU3MjMxZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX2F1ZGlvdHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX2F1ZGlvdHJhY2suY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgpAQCAtMTA4LDE3ICsxMDksMTUgQEAKICAgICAgICAgbWVtc2V0KCZhdHRyaWJ1dGVzLCAwLCBzaXplb2YoYXR0cmlidXRlcykpOwogICAgICAgICBhdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IGNvbnRlbnRUeXBlOwogICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlID0gdXNhZ2U7Ci0KICAgICAgICAgc3A8QXVkaW9UcmFjaz4gdHJhY2sgPSBuZXcgQXVkaW9UcmFjaygpOwotCisgICAgICAgIGNvbnN0IGF1dG8gZW1wdHlDYWxsYmFjayA9IHNwPEF1ZGlvVHJhY2s6OklBdWRpb1RyYWNrQ2FsbGJhY2s+OjptYWtlKCk7CiAgICAgICAgIHRyYWNrLT5zZXQoQVVESU9fU1RSRUFNX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAoZmFzdCB8fCBvZmZsb2FkKSA/IGNhbGxiYWNrIDogbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgIChmYXN0IHx8IG9mZmxvYWQpID8gZW1wdHlDYWxsYmFjayA6IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICBmYWxzZSwKQEAgLTEyNiw4ICsxMjUsNyBAQAogICAgICAgICAgICAgICAgICAgICgoZmFzdCAmJiBzaGFyZWRCdWZmZXIgPT0gMCkgfHwgb2ZmbG9hZCkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0sgOiBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgIG9mZmxvYWQgPyAmb2ZmbG9hZEluZm8gOiBudWxscHRyLAotICAgICAgICAgICAgICAgICAgIGdldHVpZCgpLAotICAgICAgICAgICAgICAgICAgIGdldHBpZCgpLAorICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUoKSwKICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywKICAgICAgICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAxLjBmLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfdXRpbHMuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfdXRpbHMuY3BwCmluZGV4IDhhYTFmMTMuLmNhZjUyMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX3V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV91dGlscy5jcHAKQEAgLTY4LDEwICs2OCw2IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgY2FsbGJhY2soaW50IGV2ZW50IF9fdW51c2VkLCB2b2lkKiB1c2VyIF9fdW51c2VkLCB2b2lkICppbmZvIF9fdW51c2VkKQotewotfQotCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHRlc3RfZnVuY190IHRlc3RGdW5jKQogewogICAgIEZJTEUgKmlucHV0RmlsZSA9IG51bGxwdHI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV91dGlscy5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfdXRpbHMuaAppbmRleCAyYWQ2NDZlLi45YTZmOWZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV91dGlscy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX3V0aWxzLmgKQEAgLTMxLDcgKzMxLDYgQEAKIAogYm9vbCBjaGVja1ZlcnNpb24oRklMRSAqaW5wdXRGaWxlLCBjb25zdCBjaGFyICp2ZXJzaW9uKTsKIAotdm9pZCBjYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQgKmluZm8pOwogCiB0eXBlZGVmIGludCAoKnRlc3RfZnVuY190KShGSUxFICppbnB1dEZpbGUsIGludCBvdXRwdXRGaWxlRmQpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BbmRyb2lkLmJwCmluZGV4IDNiZWY1NWIuLjE1OWY4OTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BbmRyb2lkLmJwCkBAIC0xMSw2ICsxMSwxMCBAQAogICAgIG5hbWU6ICJsaWJhdWRpb2ZvdW5kYXRpb25faGVhZGVycyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBoZWFkZXJfbGliczogWwpAQCAtMjQsOSArMjgsMTEgQEAKICAgICAgICAgImxpYm1lZGlhX2hlbHBlcl9oZWFkZXJzIiwKICAgICBdLAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAogICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgIF0sCiAgICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWworICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICBdLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLApAQCAtNTIsNiArNTgsNyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKQEAgLTYzLDYgKzcwLDcgQEAKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0NvbnRhaW5lcnMuY3BwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvQ29udGFpbmVycy5jcHAKaW5kZXggMzEyNTdkNS4uMGE4MTg4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvQ29udGFpbmVycy5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvQ29udGFpbmVycy5jcHAKQEAgLTYzLDQ4ICs2Myw1MyBAQAogICAgIHJldHVybiBhdWRpb0RldmljZUluQWxsVXNiU2V0OwogfQogCi1ib29sIGRldmljZVR5cGVzVG9TdHJpbmcoY29uc3QgRGV2aWNlVHlwZVNldCAmZGV2aWNlVHlwZXMsIHN0ZDo6c3RyaW5nICZzdHIpIHsKK2NvbnN0IERldmljZVR5cGVTZXQmIGdldEF1ZGlvRGV2aWNlT3V0QWxsQmxlU2V0KCkgeworICAgIHN0YXRpYyBjb25zdCBEZXZpY2VUeXBlU2V0IGF1ZGlvRGV2aWNlT3V0QWxsQmxlU2V0ID0gRGV2aWNlVHlwZVNldCgKKyAgICAgICAgICAgIHN0ZDo6YmVnaW4oQVVESU9fREVWSUNFX09VVF9BTExfQkxFX0FSUkFZKSwKKyAgICAgICAgICAgIHN0ZDo6ZW5kKEFVRElPX0RFVklDRV9PVVRfQUxMX0JMRV9BUlJBWSkpOworICAgIHJldHVybiBhdWRpb0RldmljZU91dEFsbEJsZVNldDsKK30KKworY29uc3QgRGV2aWNlVHlwZVNldCYgZ2V0QXVkaW9EZXZpY2VPdXRMZUF1ZGlvVW5pY2FzdFNldCgpIHsKKyAgICBzdGF0aWMgY29uc3QgRGV2aWNlVHlwZVNldCBhdWRpb0RldmljZU91dExlQXVkaW9VbmljYXN0U2V0ID0gRGV2aWNlVHlwZVNldCgKKyAgICAgICAgICAgIHN0ZDo6YmVnaW4oQVVESU9fREVWSUNFX09VVF9CTEVfVU5JQ0FTVF9BUlJBWSksCisgICAgICAgICAgICBzdGQ6OmVuZChBVURJT19ERVZJQ0VfT1VUX0JMRV9VTklDQVNUX0FSUkFZKSk7CisgICAgcmV0dXJuIGF1ZGlvRGV2aWNlT3V0TGVBdWRpb1VuaWNhc3RTZXQ7Cit9CisKK3N0ZDo6c3RyaW5nIGRldmljZVR5cGVzVG9TdHJpbmcoY29uc3QgRGV2aWNlVHlwZVNldCAmZGV2aWNlVHlwZXMpIHsKICAgICBpZiAoZGV2aWNlVHlwZXMuZW1wdHkoKSkgewotICAgICAgICBzdHIgPSAiRW1wdHkgZGV2aWNlIHR5cGVzIjsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiAiRW1wdHkgZGV2aWNlIHR5cGVzIjsKICAgICB9Ci0gICAgYm9vbCByZXQgPSB0cnVlOwotICAgIGZvciAoYXV0byBpdCA9IGRldmljZVR5cGVzLmJlZ2luKCk7IGl0ICE9IGRldmljZVR5cGVzLmVuZCgpOykgewotICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2VUeXBlU3RyOwotICAgICAgICByZXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKCppdCkgPwotICAgICAgICAgICAgICBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OnRvU3RyaW5nKCppdCwgZGV2aWNlVHlwZVN0cikgOgotICAgICAgICAgICAgICBJbnB1dERldmljZUNvbnZlcnRlcjo6dG9TdHJpbmcoKml0LCBkZXZpY2VUeXBlU3RyKTsKLSAgICAgICAgaWYgKCFyZXQpIHsKLSAgICAgICAgICAgIGJyZWFrOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIGZvciAoYXV0byBpdCA9IGRldmljZVR5cGVzLmJlZ2luKCk7IGl0ICE9IGRldmljZVR5cGVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChpdCAhPSBkZXZpY2VUeXBlcy5iZWdpbigpKSB7CisgICAgICAgICAgICBzcyA8PCAiLCAiOwogICAgICAgICB9Ci0gICAgICAgIHN0ci5hcHBlbmQoZGV2aWNlVHlwZVN0cik7Ci0gICAgICAgIGlmICgrK2l0ICE9IGRldmljZVR5cGVzLmVuZCgpKSB7Ci0gICAgICAgICAgICBzdHIuYXBwZW5kKCIgLCAiKTsKKyAgICAgICAgY29uc3QgY2hhciogc3RyVHlwZSA9IGF1ZGlvX2RldmljZV90b19zdHJpbmcoKml0KTsKKyAgICAgICAgaWYgKHN0cmxlbihzdHJUeXBlKSAhPSAwKSB7CisgICAgICAgICAgICBzcyA8PCBzdHJUeXBlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3MgPDwgInVua25vd24gdHlwZToweCIgPDwgc3RkOjpoZXggPDwgKml0OwogICAgICAgICB9CiAgICAgfQotICAgIGlmICghcmV0KSB7Ci0gICAgICAgIHN0ciA9ICJVbmtub3duIHZhbHVlcyI7Ci0gICAgfQotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCitib29sIGRldmljZVR5cGVzVG9TdHJpbmcoY29uc3QgRGV2aWNlVHlwZVNldCAmZGV2aWNlVHlwZXMsIHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBzdHIgPSBkZXZpY2VUeXBlc1RvU3RyaW5nKGRldmljZVR5cGVzKTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogc3RkOjpzdHJpbmcgZHVtcERldmljZVR5cGVzKGNvbnN0IERldmljZVR5cGVTZXQgJmRldmljZVR5cGVzKSB7Ci0gICAgc3RkOjpzdHJpbmcgcmV0OwotICAgIGZvciAoYXV0byBpdCA9IGRldmljZVR5cGVzLmJlZ2luKCk7IGl0ICE9IGRldmljZVR5cGVzLmVuZCgpOykgewotICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICAgICAgc3MgPDwgIjB4IiA8PCBzdGQ6OmhleCA8PCAoKml0KTsKLSAgICAgICAgcmV0LmFwcGVuZChzcy5zdHIoKSk7Ci0gICAgICAgIGlmICgrK2l0ICE9IGRldmljZVR5cGVzLmVuZCgpKSB7Ci0gICAgICAgICAgICByZXQuYXBwZW5kKCIgLCAiKTsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBmb3IgKGF1dG8gaXQgPSBkZXZpY2VUeXBlcy5iZWdpbigpOyBpdCAhPSBkZXZpY2VUeXBlcy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaXQgIT0gZGV2aWNlVHlwZXMuYmVnaW4oKSkgeworICAgICAgICAgICAgc3MgPDwgIiwgIjsKICAgICAgICAgfQorICAgICAgICBzcyA8PCAiMHgiIDw8IHN0ZDo6aGV4IDw8ICgqaXQpOwogICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcykgewotICAgIHN0ZDo6c3RyaW5nIHJldDsKLSAgICBkZXZpY2VUeXBlc1RvU3RyaW5nKGRldmljZVR5cGVzLCByZXQpOwotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIHNzLnN0cigpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9EZXZpY2VUeXBlQWRkci5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9EZXZpY2VUeXBlQWRkci5jcHAKaW5kZXggYzVkN2RhOC4uNGE3ZTk1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvRGV2aWNlVHlwZUFkZHIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0RldmljZVR5cGVBZGRyLmNwcApAQCAtMjUsNiArMjUsOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZUFkZHJlc3M7CisKIG5hbWVzcGFjZSB7CiAKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBTVVBQUkVTU0VEID0gIlNVUFBSRVNTRUQiOwpAQCAtOTcsMTAgKzEwMCwxMyBAQAogCiBzdGQ6OnN0cmluZyBBdWRpb0RldmljZVR5cGVBZGRyOjp0b1N0cmluZyhib29sIGluY2x1ZGVTZW5zaXRpdmVJbmZvKSBjb25zdCB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3N0cmVhbTsKLSAgICBzc3RyZWFtIDw8ICJ0eXBlOjB4IiA8PCBzdGQ6OmhleCA8PCBtVHlwZTsKKyAgICBzc3RyZWFtIDw8IGF1ZGlvX2RldmljZV90b19zdHJpbmcobVR5cGUpOworICAgIGlmIChzc3RyZWFtLnN0cigpLmVtcHR5KCkpIHsKKyAgICAgICAgc3N0cmVhbSA8PCAidW5rbm93biB0eXBlOjB4IiA8PCBzdGQ6OmhleCA8PCBtVHlwZTsKKyAgICB9CiAgICAgLy8gSVAgYW5kIE1BQyBhZGRyZXNzIGFyZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24uIFRoZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24gd2lsbCBiZSBzdXBwcmVzc2VkCiAgICAgLy8gaXMgYGluY2x1ZGVTZW5zaXRpdmVJbmZvYCBpcyBmYWxzZS4KLSAgICBzc3RyZWFtIDw8ICIsQDoiCisgICAgc3N0cmVhbSA8PCAiLCBAOiIKICAgICAgICAgICAgIDw8ICghaW5jbHVkZVNlbnNpdGl2ZUluZm8gJiYgbUlzQWRkcmVzc1NlbnNpdGl2ZSA/IFNVUFBSRVNTRUQgOiBtQWRkcmVzcyk7CiAgICAgcmV0dXJuIHNzdHJlYW0uc3RyKCk7CiB9CkBAIC0xNTcsMTcgKzE2MywxNiBAQAogfQogCiBDb252ZXJzaW9uUmVzdWx0PEF1ZGlvRGV2aWNlVHlwZUFkZHI+Ci1haWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGNvbnN0IG1lZGlhOjpBdWRpb0RldmljZSYgYWlkbCkgewotICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGFpZGwudHlwZSkpOwotICAgIHJldHVybiBBdWRpb0RldmljZVR5cGVBZGRyKHR5cGUsIGFpZGwuYWRkcmVzcyk7CithaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGNvbnN0IEF1ZGlvRGV2aWNlJiBhaWRsKSB7CisgICAgYXVkaW9fZGV2aWNlc190IHR5cGU7CisgICAgc3RkOjpzdHJpbmcgYWRkcmVzczsKKyAgICBSRVRVUk5fSUZfRVJST1IoYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VfYXVkaW9fZGV2aWNlKGFpZGwsICZ0eXBlLCAmYWRkcmVzcykpOworICAgIHJldHVybiBBdWRpb0RldmljZVR5cGVBZGRyKHR5cGUsIGFkZHJlc3MpOwogfQogCi1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0RldmljZT4KK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9EZXZpY2U+CiBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGxlZ2FjeSkgewotICAgIG1lZGlhOjpBdWRpb0RldmljZSBhaWRsOwotICAgIGFpZGwudHlwZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChsZWdhY3kubVR5cGUpKTsKLSAgICBhaWRsLmFkZHJlc3MgPSBsZWdhY3kuZ2V0QWRkcmVzcygpOwotICAgIHJldHVybiBhaWRsOworICAgIHJldHVybiBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VfQXVkaW9EZXZpY2UobGVnYWN5Lm1UeXBlLCBsZWdhY3kuZ2V0QWRkcmVzcygpKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvR2Fpbi5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9HYWluLmNwcAppbmRleCAxZGVlOTM4Li40N2UwZWRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9HYWluLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9HYWluLmNwcApAQCAtMjQsMjIgKzI0LDE4IEBACiAjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCisjaW5jbHVkZSA8bWF0aC5oPgorCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvR2Fpbi5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8bWF0aC5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLUF1ZGlvR2Fpbjo6QXVkaW9HYWluKGludCBpbmRleCwgYm9vbCB1c2VJbkNoYW5uZWxNYXNrKQotewotICAgIG1JbmRleCA9IGluZGV4OwotICAgIG1Vc2VJbkNoYW5uZWxNYXNrID0gdXNlSW5DaGFubmVsTWFzazsKLSAgICBtZW1zZXQoJm1HYWluLCAwLCBzaXplb2Yoc3RydWN0IGF1ZGlvX2dhaW4pKTsKLX0KK0F1ZGlvR2Fpbjo6QXVkaW9HYWluKGludCBpbmRleCwgYm9vbCBpc0lucHV0KQorICAgICAgICA6IG1JbmRleChpbmRleCksIG1Jc0lucHV0KGlzSW5wdXQpIHt9CiAKIHZvaWQgQXVkaW9HYWluOjpnZXREZWZhdWx0Q29uZmlnKHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKQogewpAQCAtNDksMTIgKzQ1LDkgQEAKICAgICBpZiAoKG1HYWluLm1vZGUgJiBBVURJT19HQUlOX01PREVfSk9JTlQpID09IEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgewogICAgICAgICBjb25maWctPnZhbHVlc1swXSA9IG1HYWluLmRlZmF1bHRfdmFsdWU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgdWludDMyX3QgbnVtVmFsdWVzOwotICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKLSAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1HYWluLmNoYW5uZWxfbWFzayk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUdhaW4uY2hhbm5lbF9tYXNrKTsKLSAgICAgICAgfQorICAgICAgICBjb25zdCB1aW50MzJfdCBudW1WYWx1ZXMgPSBtSXNJbnB1dCA/CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUdhaW4uY2hhbm5lbF9tYXNrKSA6CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1HYWluLmNoYW5uZWxfbWFzayk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKICAgICAgICAgICAgIGNvbmZpZy0+dmFsdWVzW2ldID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKICAgICAgICAgfQpAQCAtNzgsMTIgKzcxLDkgQEAKICAgICAgICAgaWYgKChjb25maWctPmNoYW5uZWxfbWFzayAmIH5tR2Fpbi5jaGFubmVsX21hc2spICE9IDApIHsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgdWludDMyX3QgbnVtVmFsdWVzOwotICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKLSAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7Ci0gICAgICAgIH0KKyAgICAgICAgY29uc3QgdWludDMyX3QgbnVtVmFsdWVzID0gbUlzSW5wdXQgPworICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKSA6CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykgewogICAgICAgICAgICAgaWYgKChjb25maWctPnZhbHVlc1tpXSA8IG1HYWluLm1pbl92YWx1ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+dmFsdWVzW2ldID4gbUdhaW4ubWF4X3ZhbHVlKSkgewpAQCAtMTE2LDcgKzEwNiw3IEBACiBib29sIEF1ZGlvR2Fpbjo6ZXF1YWxzKGNvbnN0IHNwPEF1ZGlvR2Fpbj4mIG90aGVyKSBjb25zdAogewogICAgIHJldHVybiBvdGhlciAhPSBudWxscHRyICYmCi0gICAgICAgICAgIG1Vc2VJbkNoYW5uZWxNYXNrID09IG90aGVyLT5tVXNlSW5DaGFubmVsTWFzayAmJgorICAgICAgICAgICBtSXNJbnB1dCA9PSBvdGhlci0+bUlzSW5wdXQgJiYKICAgICAgICAgICAgbVVzZUZvclZvbHVtZSA9PSBvdGhlci0+bVVzZUZvclZvbHVtZSAmJgogICAgICAgICAgICAvLyBDb21wYXJlIGF1ZGlvIGdhaW4KICAgICAgICAgICAgbUdhaW4ubW9kZSA9PSBvdGhlci0+bUdhaW4ubW9kZSAmJgpAQCAtMTI5LDUxICsxMTksMjQgQEAKICAgICAgICAgICAgbUdhaW4ubWF4X3JhbXBfbXMgPT0gb3RoZXItPm1HYWluLm1heF9yYW1wX21zOwogfQogCi1zdGF0dXNfdCBBdWRpb0dhaW46OndyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKLSAgICBtZWRpYTo6QXVkaW9HYWluIHBhcmNlbGFibGU7Ci0gICAgcmV0dXJuIHdyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlKQotICAgICAgICA/OiBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9HYWluOjpBaWRsPiBBdWRpb0dhaW46OnRvUGFyY2VsYWJsZSgpIGNvbnN0IHsKKyAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9HYWluIGFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19nYWluX0F1ZGlvR2FpbihtR2FpbiwgbUlzSW5wdXQpKTsKKyAgICBhaWRsLnVzZUZvclZvbHVtZSA9IG1Vc2VGb3JWb2x1bWU7CisgICAgbWVkaWE6OkF1ZGlvR2FpblN5cyBhaWRsU3lzOworICAgIGFpZGxTeXMuaW5kZXggPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KG1JbmRleCkpOworICAgIGFpZGxTeXMuaXNJbnB1dCA9IG1Jc0lucHV0OworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihhaWRsLCBhaWRsU3lzKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9HYWluOjp3cml0ZVRvUGFyY2VsYWJsZShtZWRpYTo6QXVkaW9HYWluKiBwYXJjZWxhYmxlKSBjb25zdCB7Ci0gICAgcGFyY2VsYWJsZS0+aW5kZXggPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtSW5kZXgpKTsKLSAgICBwYXJjZWxhYmxlLT51c2VJbkNoYW5uZWxNYXNrID0gbVVzZUluQ2hhbm5lbE1hc2s7Ci0gICAgcGFyY2VsYWJsZS0+dXNlRm9yVm9sdW1lID0gbVVzZUZvclZvbHVtZTsKLSAgICBwYXJjZWxhYmxlLT5tb2RlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X2ludDMyX3RfbWFzayhtR2Fpbi5tb2RlKSk7Ci0gICAgcGFyY2VsYWJsZS0+Y2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChtR2Fpbi5jaGFubmVsX21hc2spKTsKLSAgICBwYXJjZWxhYmxlLT5taW5WYWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KG1HYWluLm1pbl92YWx1ZSkpOwotICAgIHBhcmNlbGFibGUtPm1heFZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUdhaW4ubWF4X3ZhbHVlKSk7Ci0gICAgcGFyY2VsYWJsZS0+ZGVmYXVsdFZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtR2Fpbi5kZWZhdWx0X3ZhbHVlKSk7Ci0gICAgcGFyY2VsYWJsZS0+c3RlcFZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUdhaW4uc3RlcF92YWx1ZSkpOwotICAgIHBhcmNlbGFibGUtPm1pblJhbXBNcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KG1HYWluLm1pbl9yYW1wX21zKSk7Ci0gICAgcGFyY2VsYWJsZS0+bWF4UmFtcE1zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUdhaW4ubWF4X3JhbXBfbXMpKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEF1ZGlvR2Fpbjo6cmVhZEZyb21QYXJjZWwoY29uc3QgYW5kcm9pZDo6UGFyY2VsICpwYXJjZWwpIHsKLSAgICBtZWRpYTo6QXVkaW9HYWluIHBhcmNlbGFibGU7Ci0gICAgcmV0dXJuIHBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKQotICAgICAgICA/OiByZWFkRnJvbVBhcmNlbGFibGUocGFyY2VsYWJsZSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvR2Fpbjo6cmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb0dhaW4mIHBhcmNlbGFibGUpIHsKLSAgICBtSW5kZXggPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KHBhcmNlbGFibGUuaW5kZXgpKTsKLSAgICBtVXNlSW5DaGFubmVsTWFzayA9IHBhcmNlbGFibGUudXNlSW5DaGFubmVsTWFzazsKLSAgICBtVXNlRm9yVm9sdW1lID0gcGFyY2VsYWJsZS51c2VGb3JWb2x1bWU7Ci0gICAgbUdhaW4ubW9kZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2dhaW5fbW9kZV90X21hc2socGFyY2VsYWJsZS5tb2RlKSk7Ci0gICAgbUdhaW4uY2hhbm5lbF9tYXNrID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QocGFyY2VsYWJsZS5jaGFubmVsTWFzaykpOwotICAgIG1HYWluLm1pbl92YWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4ocGFyY2VsYWJsZS5taW5WYWx1ZSkpOwotICAgIG1HYWluLm1heF92YWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4ocGFyY2VsYWJsZS5tYXhWYWx1ZSkpOwotICAgIG1HYWluLmRlZmF1bHRfdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KHBhcmNlbGFibGUuZGVmYXVsdFZhbHVlKSk7Ci0gICAgbUdhaW4uc3RlcF92YWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4ocGFyY2VsYWJsZS5zdGVwVmFsdWUpKTsKLSAgICBtR2Fpbi5taW5fcmFtcF9tcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4ocGFyY2VsYWJsZS5taW5SYW1wTXMpKTsKLSAgICBtR2Fpbi5tYXhfcmFtcF9tcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4ocGFyY2VsYWJsZS5tYXhSYW1wTXMpKTsKLSAgICByZXR1cm4gT0s7CitDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvR2Fpbj4+IEF1ZGlvR2Fpbjo6ZnJvbVBhcmNlbGFibGUoY29uc3QgQXVkaW9HYWluOjpBaWRsJiBhaWRsKSB7CisgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2FpbiYgaGFsID0gYWlkbC5maXJzdDsKKyAgICBjb25zdCBtZWRpYTo6QXVkaW9HYWluU3lzJiBzeXMgPSBhaWRsLnNlY29uZDsKKyAgICBhdXRvIGluZGV4ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KHN5cy5pbmRleCkpOworICAgIHNwPEF1ZGlvR2Fpbj4gbGVnYWN5ID0gc3A8QXVkaW9HYWluPjo6bWFrZShpbmRleCwgc3lzLmlzSW5wdXQpOworICAgIGxlZ2FjeS0+bUdhaW4gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9HYWluX2F1ZGlvX2dhaW4oaGFsLCBzeXMuaXNJbnB1dCkpOworICAgIGxlZ2FjeS0+bVVzZUZvclZvbHVtZSA9IGhhbC51c2VGb3JWb2x1bWU7CisgICAgcmV0dXJuIGxlZ2FjeTsKIH0KIAogYm9vbCBBdWRpb0dhaW5zOjplcXVhbHMoY29uc3QgQXVkaW9HYWlucyAmb3RoZXIpIGNvbnN0CkBAIC0xODQsNTkgKzE0NywzMCBAQAogICAgICAgICAgICAgICAgICAgICAgIH0pOwogfQogCi1zdGF0dXNfdCBBdWRpb0dhaW5zOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCAqcGFyY2VsKSBjb25zdCB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVmVjdG9yU2l6ZSgqdGhpcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGZvciAoY29uc3QgYXV0byAmYXVkaW9HYWluIDogKnRoaXMpIHsKLSAgICAgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZSgqYXVkaW9HYWluKSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IEF1ZGlvR2FpbnM6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCAqcGFyY2VsKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgdGhpcy0+Y2xlYXIoKTsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVzaXplT3V0VmVjdG9yKHRoaXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRoaXMtPnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHRoaXMtPmF0KGkpID0gbmV3IEF1ZGlvR2FpbigwLCBmYWxzZSk7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSh0aGlzLT5hdChpKS5nZXQoKSkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICB0aGlzLT5jbGVhcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQogQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb0dhaW4+PgotYWlkbDJsZWdhY3lfQXVkaW9HYWluKGNvbnN0IG1lZGlhOjpBdWRpb0dhaW4mIGFpZGwpIHsKLSAgICBzcDxBdWRpb0dhaW4+IGxlZ2FjeSA9IG5ldyBBdWRpb0dhaW4oMCwgZmFsc2UpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGxlZ2FjeS0+cmVhZEZyb21QYXJjZWxhYmxlKGFpZGwpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGJhc2U6OnVuZXhwZWN0ZWQoc3RhdHVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxlZ2FjeTsKK2FpZGwybGVnYWN5X0F1ZGlvR2Fpbihjb25zdCBBdWRpb0dhaW46OkFpZGwmIGFpZGwpIHsKKyAgICByZXR1cm4gQXVkaW9HYWluOjpmcm9tUGFyY2VsYWJsZShhaWRsKTsKIH0KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9HYWluPgorQ29udmVyc2lvblJlc3VsdDxBdWRpb0dhaW46OkFpZGw+CiBsZWdhY3kyYWlkbF9BdWRpb0dhaW4oY29uc3Qgc3A8QXVkaW9HYWluPiYgbGVnYWN5KSB7Ci0gICAgbWVkaWE6OkF1ZGlvR2FpbiBhaWRsOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGxlZ2FjeS0+d3JpdGVUb1BhcmNlbGFibGUoJmFpZGwpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGJhc2U6OnVuZXhwZWN0ZWQoc3RhdHVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFpZGw7CisgICAgcmV0dXJuIGxlZ2FjeS0+dG9QYXJjZWxhYmxlKCk7CiB9CiAKIENvbnZlcnNpb25SZXN1bHQ8QXVkaW9HYWlucz4KLWFpZGwybGVnYWN5X0F1ZGlvR2FpbnMoY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvR2Fpbj4mIGFpZGwpIHsKLSAgICByZXR1cm4gY29udmVydENvbnRhaW5lcjxBdWRpb0dhaW5zPihhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb0dhaW4pOworYWlkbDJsZWdhY3lfQXVkaW9HYWlucyhjb25zdCBBdWRpb0dhaW5zOjpBaWRsJiBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRDb250YWluZXJzPEF1ZGlvR2FpbnM+KGFpZGwuZmlyc3QsIGFpZGwuc2Vjb25kLAorICAgICAgICAgICAgW10oY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2FpbiYgZywKKyAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0dhaW5TeXMmIGdzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFpZGwybGVnYWN5X0F1ZGlvR2FpbihzdGQ6Om1ha2VfcGFpcihnLCBncykpOworICAgICAgICAgICAgfSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvR2Fpbj4+CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvR2FpbnM6OkFpZGw+CiBsZWdhY3kyYWlkbF9BdWRpb0dhaW5zKGNvbnN0IEF1ZGlvR2FpbnMmIGxlZ2FjeSkgewotICAgIHJldHVybiBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0dhaW4+PihsZWdhY3ksIGxlZ2FjeTJhaWRsX0F1ZGlvR2Fpbik7CisgICAgcmV0dXJuIGNvbnZlcnRDb250YWluZXJTcGxpdDwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW4+LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvR2FpblN5cz4+KGxlZ2FjeSwgbGVnYWN5MmFpZGxfQXVkaW9HYWluKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvUG9ydC5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Qb3J0LmNwcAppbmRleCBmYWZhYmQ5Li40NTEzMzIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Qb3J0LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Qb3J0LmNwcApAQCAtMTgsMTMgKzE4LDI4IEBACiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0V4dHJhQXVkaW9EZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3ZvaWQgQXVkaW9Qb3J0OjpzZXRGbGFncyh1aW50MzJfdCBmbGFncykKK3sKKyAgICAvLyBmb3JjZSBkaXJlY3QgZmxhZyBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0OiBvZmZsb2FkaW5nIGltcGxpZXMgYSBkaXJlY3Qgb3V0cHV0IHN0cmVhbQorICAgIC8vIGFuZCBhbGwgY29tbW9uIGJlaGF2aW9ycyBhcmUgZHJpdmVuIGJ5IGNoZWNraW5nIG9ubHkgdGhlIGRpcmVjdCBmbGFnCisgICAgLy8gdGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgc2V0IGFwcHJvcHJpYXRlbHkgaW4gdGhlIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICBpZiAobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSAmJgorICAgICAgICAgICAgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgeworICAgICAgICBmbGFncyB8PSBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1Q7CisgICAgfQorICAgIGlmICh1c2VJbnB1dENoYW5uZWxNYXNrKCkpIHsKKyAgICAgICAgbUZsYWdzLmlucHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oZmxhZ3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1GbGFncy5vdXRwdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4oZmxhZ3MpOworICAgIH0KK30KKwogdm9pZCBBdWRpb1BvcnQ6OmltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LCBib29sIGZvcmNlIF9fdW51c2VkKQogewogICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZVRvSW1wb3J0IDogcG9ydC0+bVByb2ZpbGVzKSB7CkBAIC0xNDcsOSArMTYyLDE2IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9ydDo6ZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UpIGNvbnN0IHsKK3ZvaWQgQXVkaW9Qb3J0OjpkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMsIGNvbnN0IGNoYXIqIGV4dHJhSW5mbywgYm9vbCB2ZXJib3NlKSBjb25zdCB7CiAgICAgaWYgKCFtTmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuY19zdHIoKSkpOworICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIlwiJXNcIiVzIiwgbU5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhSW5mbyAhPSBudWxscHRyID8gIjsgIiA6ICIiKSk7CisgICAgfQorICAgIGlmIChleHRyYUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiVzIiwgZXh0cmFJbmZvKSk7CisgICAgfQorICAgIGlmICghbU5hbWUuZW1wdHkoKSB8fCBleHRyYUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKICAgICB9CiAgICAgaWYgKHZlcmJvc2UpIHsKICAgICAgICAgc3RkOjpzdHJpbmcgcHJvZmlsZXNTdHI7CkBAIC0xOTYsMzkgKzIxOCw1OSBAQAogICAgICAgICAgICBtVHlwZSA9PSBvdGhlci0+Z2V0VHlwZSgpICYmCiAgICAgICAgICAgIG1Sb2xlID09IG90aGVyLT5nZXRSb2xlKCkgJiYKICAgICAgICAgICAgbVByb2ZpbGVzLmVxdWFscyhvdGhlci0+Z2V0QXVkaW9Qcm9maWxlcygpKSAmJgorICAgICAgICAgICBnZXRGbGFncygpID09IG90aGVyLT5nZXRGbGFncygpICYmCiAgICAgICAgICAgIG1FeHRyYUF1ZGlvRGVzY3JpcHRvcnMgPT0gb3RoZXItPmdldEV4dHJhQXVkaW9EZXNjcmlwdG9ycygpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvcnQ6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0Ci17Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydCBwYXJjZWxhYmxlOwotICAgIHJldHVybiB3cml0ZVRvUGFyY2VsYWJsZSgmcGFyY2VsYWJsZSkKLSAgICAgICAgPzogcGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUG9ydDo6d3JpdGVUb1BhcmNlbGFibGUobWVkaWE6OkF1ZGlvUG9ydCogcGFyY2VsYWJsZSkgY29uc3QgewotICAgIHBhcmNlbGFibGUtPm5hbWUgPSBtTmFtZTsKLSAgICBwYXJjZWxhYmxlLT50eXBlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3R5cGVfdF9BdWRpb1BvcnRUeXBlKG1UeXBlKSk7Ci0gICAgcGFyY2VsYWJsZS0+cm9sZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9yb2xlX3RfQXVkaW9Qb3J0Um9sZShtUm9sZSkpOwotICAgIHBhcmNlbGFibGUtPnByb2ZpbGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGVWZWN0b3IobVByb2ZpbGVzKSk7Ci0gICAgcGFyY2VsYWJsZS0+ZXh0cmFBdWRpb0Rlc2NyaXB0b3JzID0gbUV4dHJhQXVkaW9EZXNjcmlwdG9yczsKLSAgICBwYXJjZWxhYmxlLT5nYWlucyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfQXVkaW9HYWlucyhtR2FpbnMpKTsKKyAgICBwYXJjZWxhYmxlLT5oYWwubmFtZSA9IG1OYW1lOworICAgIHBhcmNlbGFibGUtPnN5cy50eXBlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUobVR5cGUpKTsKKyAgICBwYXJjZWxhYmxlLT5zeXMucm9sZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3JvbGVfdF9BdWRpb1BvcnRSb2xlKG1Sb2xlKSk7CisgICAgYXV0byBhaWRsUHJvZmlsZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlVmVjdG9yKG1Qcm9maWxlcywgdXNlSW5wdXRDaGFubmVsTWFzaygpKSk7CisgICAgcGFyY2VsYWJsZS0+aGFsLnByb2ZpbGVzID0gYWlkbFByb2ZpbGVzLmZpcnN0OworICAgIHBhcmNlbGFibGUtPnN5cy5wcm9maWxlcyA9IGFpZGxQcm9maWxlcy5zZWNvbmQ7CisgICAgcGFyY2VsYWJsZS0+aGFsLmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2ZsYWdzX0F1ZGlvSW9GbGFncyhtRmxhZ3MsIHVzZUlucHV0Q2hhbm5lbE1hc2soKSkpOworICAgIHBhcmNlbGFibGUtPmhhbC5leHRyYUF1ZGlvRGVzY3JpcHRvcnMgPSBtRXh0cmFBdWRpb0Rlc2NyaXB0b3JzOworICAgIGF1dG8gYWlkbEdhaW5zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9BdWRpb0dhaW5zKG1HYWlucykpOworICAgIHBhcmNlbGFibGUtPmhhbC5nYWlucyA9IGFpZGxHYWlucy5maXJzdDsKKyAgICBwYXJjZWxhYmxlLT5zeXMuZ2FpbnMgPSBhaWRsR2FpbnMuc2Vjb25kOworICAgIGlmIChtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRNaXhFeHQgbWl4RXh0e307CisgICAgICAgIG1peEV4dC5tYXhPcGVuU3RyZWFtQ291bnQgPSBtYXhPcGVuQ291bnQ7CisgICAgICAgIG1peEV4dC5tYXhBY3RpdmVTdHJlYW1Db3VudCA9IG1heEFjdGl2ZUNvdW50OworICAgICAgICBtaXhFeHQucmVjb21tZW5kZWRNdXRlRHVyYXRpb25NcyA9IHJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXM7CisgICAgICAgIHBhcmNlbGFibGUtPmhhbC5leHQgPSBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0RXh0OjptYWtlPAorICAgICAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRFeHQ6Om1peD4obWl4RXh0KTsKKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvcnQ6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydCBwYXJjZWxhYmxlOwotICAgIHJldHVybiBwYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkKLSAgICAgICAgPzogcmVhZEZyb21QYXJjZWxhYmxlKHBhcmNlbGFibGUpOwotfQotCiBzdGF0dXNfdCBBdWRpb1BvcnQ6OnJlYWRGcm9tUGFyY2VsYWJsZShjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBwYXJjZWxhYmxlKSB7Ci0gICAgbU5hbWUgPSBwYXJjZWxhYmxlLm5hbWU7Ci0gICAgbVR5cGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0F1ZGlvUG9ydFR5cGVfYXVkaW9fcG9ydF90eXBlX3QocGFyY2VsYWJsZS50eXBlKSk7Ci0gICAgbVJvbGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0F1ZGlvUG9ydFJvbGVfYXVkaW9fcG9ydF9yb2xlX3QocGFyY2VsYWJsZS5yb2xlKSk7Ci0gICAgbVByb2ZpbGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVWZWN0b3IocGFyY2VsYWJsZS5wcm9maWxlcykpOwotICAgIG1FeHRyYUF1ZGlvRGVzY3JpcHRvcnMgPSBwYXJjZWxhYmxlLmV4dHJhQXVkaW9EZXNjcmlwdG9yczsKLSAgICBtR2FpbnMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0F1ZGlvR2FpbnMocGFyY2VsYWJsZS5nYWlucykpOworICAgIG1OYW1lID0gcGFyY2VsYWJsZS5oYWwubmFtZTsKKyAgICBtVHlwZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRUeXBlX2F1ZGlvX3BvcnRfdHlwZV90KHBhcmNlbGFibGUuc3lzLnR5cGUpKTsKKyAgICBtUm9sZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRSb2xlX2F1ZGlvX3BvcnRfcm9sZV90KHBhcmNlbGFibGUuc3lzLnJvbGUpKTsKKyAgICBtUHJvZmlsZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlVmVjdG9yKAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihwYXJjZWxhYmxlLmhhbC5wcm9maWxlcywgcGFyY2VsYWJsZS5zeXMucHJvZmlsZXMpLAorICAgICAgICAgICAgICAgICAgICB1c2VJbnB1dENoYW5uZWxNYXNrKCkpKTsKKyAgICBtRmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Jb0ZsYWdzX2F1ZGlvX2lvX2ZsYWdzKHBhcmNlbGFibGUuaGFsLmZsYWdzLCB1c2VJbnB1dENoYW5uZWxNYXNrKCkpKTsKKyAgICBtRXh0cmFBdWRpb0Rlc2NyaXB0b3JzID0gcGFyY2VsYWJsZS5oYWwuZXh0cmFBdWRpb0Rlc2NyaXB0b3JzOworICAgIG1HYWlucyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5zKHN0ZDo6bWFrZV9wYWlyKHBhcmNlbGFibGUuaGFsLmdhaW5zLCBwYXJjZWxhYmxlLnN5cy5nYWlucykpKTsKKyAgICBpZiAobVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBjb25zdCBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0TWl4RXh0JiBtaXhFeHQgPQorICAgICAgICAgICAgICAgIHBhcmNlbGFibGUuaGFsLmV4dC5nZXQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydEV4dDo6bWl4PigpOworICAgICAgICBtYXhPcGVuQ291bnQgPSBtaXhFeHQubWF4T3BlblN0cmVhbUNvdW50OworICAgICAgICBtYXhBY3RpdmVDb3VudCA9IG1peEV4dC5tYXhBY3RpdmVTdHJlYW1Db3VudDsKKyAgICAgICAgcmVjb21tZW5kZWRNdXRlRHVyYXRpb25NcyA9IG1peEV4dC5yZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zOworICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI1MCw2ICsyOTIsOSBAQAogICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgewogICAgICAgICBtR2FpbiA9IGNvbmZpZy0+Z2FpbjsKICAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUykgeworICAgICAgICBtRmxhZ3MgPSBjb25maWctPmZsYWdzOworICAgIH0KIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTMwMyw2ICszNDgsOSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJj0gfkFVRElPX1BPUlRfQ09ORklHX0dBSU47CiAgICAgfQorCisgICAgdXBkYXRlRmllbGQobUZsYWdzLCAmYXVkaW9fcG9ydF9jb25maWc6OmZsYWdzLAorICAgICAgICAgICAgZHN0Q29uZmlnLCBzcmNDb25maWcsIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTLCB7IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSB9KTsKIH0KIAogYm9vbCBBdWRpb1BvcnRDb25maWc6Omhhc0dhaW5Db250cm9sbGVyKGJvb2wgY2FuVXNlRm9yVm9sdW1lKSBjb25zdApAQCAtMzE1LDEyICszNjMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXVkaW9wb3J0LT5nZXRHYWlucygpLnNpemUoKSA+IDA7CiB9CiAKLWJvb2wgQXVkaW9Qb3J0Q29uZmlnOjplcXVhbHMoY29uc3Qgc3A8QXVkaW9Qb3J0Q29uZmlnPiAmb3RoZXIpIGNvbnN0Citib29sIEF1ZGlvUG9ydENvbmZpZzo6ZXF1YWxzKGNvbnN0IHNwPEF1ZGlvUG9ydENvbmZpZz4gJm90aGVyLCBib29sIGlzSW5wdXQpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG90aGVyICE9IG51bGxwdHIgJiYKICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZSA9PSBvdGhlci0+Z2V0U2FtcGxpbmdSYXRlKCkgJiYKICAgICAgICAgICAgbUZvcm1hdCA9PSBvdGhlci0+Z2V0Rm9ybWF0KCkgJiYKICAgICAgICAgICAgbUNoYW5uZWxNYXNrID09IG90aGVyLT5nZXRDaGFubmVsTWFzaygpICYmCisgICAgICAgICAgIChpc0lucHV0ID8gbUZsYWdzLmlucHV0ID09IG90aGVyLT5nZXRGbGFncygpLmlucHV0IDoKKyAgICAgICAgICAgICAgICAgICBtRmxhZ3Mub3V0cHV0ID09IG90aGVyLT5nZXRGbGFncygpLm91dHB1dCApJiYKICAgICAgICAgICAgLy8gQ29tcGFyZSBhdWRpbyBnYWluIGNvbmZpZwogICAgICAgICAgICBtR2Fpbi5pbmRleCA9PSBvdGhlci0+bUdhaW4uaW5kZXggJiYKICAgICAgICAgICAgbUdhaW4ubW9kZSA9PSBvdGhlci0+bUdhaW4ubW9kZSAmJgpAQCAtMzMwLDU0ICszODAsNDcgQEAKICAgICAgICAgICAgbUdhaW4ucmFtcF9kdXJhdGlvbl9tcyA9PSBvdGhlci0+bUdhaW4ucmFtcF9kdXJhdGlvbl9tczsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb3J0Q29uZmlnOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7Ci0gICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyBwYXJjZWxhYmxlOwotICAgIHJldHVybiB3cml0ZVRvUGFyY2VsYWJsZSgmcGFyY2VsYWJsZSkKLSAgICAgICAgPzogcGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6d3JpdGVUb1BhcmNlbGFibGUobWVkaWE6OkF1ZGlvUG9ydENvbmZpZyogcGFyY2VsYWJsZSkgY29uc3QgewotICAgIHBhcmNlbGFibGUtPnNhbXBsZVJhdGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtU2FtcGxpbmdSYXRlKSk7Ci0gICAgcGFyY2VsYWJsZS0+Zm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdChtRm9ybWF0KSk7CitzdGF0dXNfdCBBdWRpb1BvcnRDb25maWc6OndyaXRlVG9QYXJjZWxhYmxlKAorICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0Q29uZmlnKiBwYXJjZWxhYmxlLCBib29sIGlzSW5wdXQpIGNvbnN0IHsKKyAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6SW50IGFpZGxfc2FtcGxlUmF0ZTsKKyAgICBhaWRsX3NhbXBsZVJhdGUudmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtU2FtcGxpbmdSYXRlKSk7CisgICAgcGFyY2VsYWJsZS0+c2FtcGxlUmF0ZSA9IGFpZGxfc2FtcGxlUmF0ZTsKKyAgICBwYXJjZWxhYmxlLT5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbihtRm9ybWF0KSk7CiAgICAgcGFyY2VsYWJsZS0+Y2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChtQ2hhbm5lbE1hc2spKTsKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X0F1ZGlvQ2hhbm5lbExheW91dChtQ2hhbm5lbE1hc2ssIGlzSW5wdXQpKTsKICAgICBwYXJjZWxhYmxlLT5pZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KG1JZCkpOwotICAgIHBhcmNlbGFibGUtPmdhaW4uaW5kZXggPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtR2Fpbi5pbmRleCkpOwotICAgIHBhcmNlbGFibGUtPmdhaW4ubW9kZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9pbnQzMl90X21hc2sobUdhaW4ubW9kZSkpOwotICAgIHBhcmNlbGFibGUtPmdhaW4uY2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChtR2Fpbi5jaGFubmVsX21hc2spKTsKLSAgICBwYXJjZWxhYmxlLT5nYWluLnJhbXBEdXJhdGlvbk1zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtR2Fpbi5yYW1wX2R1cmF0aW9uX21zKSk7Ci0gICAgcGFyY2VsYWJsZS0+Z2Fpbi52YWx1ZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8aW50MzJfdD4+KAotICAgICAgICAgICAgbUdhaW4udmFsdWVzLCBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdCwgaW50PikpOworICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW5Db25maWcgYWlkbF9nYWluID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fY29uZmlnX0F1ZGlvR2FpbkNvbmZpZyhtR2FpbiwgaXNJbnB1dCkpOworICAgIHBhcmNlbGFibGUtPmdhaW4gPSBhaWRsX2dhaW47CisgICAgcGFyY2VsYWJsZS0+ZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9faW9fZmxhZ3NfQXVkaW9Jb0ZsYWdzKG1GbGFncywgaXNJbnB1dCkpOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb3J0Q29uZmlnOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgewotICAgIG1lZGlhOjpBdWRpb1BvcnRDb25maWcgcGFyY2VsYWJsZTsKLSAgICByZXR1cm4gcGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpCi0gICAgICAgID86IHJlYWRGcm9tUGFyY2VsYWJsZShwYXJjZWxhYmxlKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb3J0Q29uZmlnOjpyZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyYgcGFyY2VsYWJsZSkgewotICAgIG1TYW1wbGluZ1JhdGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KHBhcmNlbGFibGUuc2FtcGxlUmF0ZSkpOwotICAgIG1Gb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KHBhcmNlbGFibGUuZm9ybWF0KSk7Ci0gICAgbUNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QocGFyY2VsYWJsZS5jaGFubmVsTWFzaykpOwotICAgIG1JZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KHBhcmNlbGFibGUuaWQpKTsKLSAgICBtR2Fpbi5pbmRleCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4ocGFyY2VsYWJsZS5nYWluLmluZGV4KSk7Ci0gICAgbUdhaW4ubW9kZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2dhaW5fbW9kZV90X21hc2socGFyY2VsYWJsZS5nYWluLm1vZGUpKTsKLSAgICBtR2Fpbi5jaGFubmVsX21hc2sgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdChwYXJjZWxhYmxlLmdhaW4uY2hhbm5lbE1hc2spKTsKLSAgICBtR2Fpbi5yYW1wX2R1cmF0aW9uX21zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KHBhcmNlbGFibGUuZ2Fpbi5yYW1wRHVyYXRpb25NcykpOwotICAgIGlmIChwYXJjZWxhYmxlLmdhaW4udmFsdWVzLnNpemUoKSA+IHN0ZDo6c2l6ZShtR2Fpbi52YWx1ZXMpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CitzdGF0dXNfdCBBdWRpb1BvcnRDb25maWc6OnJlYWRGcm9tUGFyY2VsYWJsZSgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydENvbmZpZyYgcGFyY2VsYWJsZSwgYm9vbCBpc0lucHV0KSB7CisgICAgaWYgKHBhcmNlbGFibGUuc2FtcGxlUmF0ZS5oYXNfdmFsdWUoKSkgeworICAgICAgICBtU2FtcGxpbmdSYXRlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihwYXJjZWxhYmxlLnNhbXBsZVJhdGUudmFsdWUoKS52YWx1ZSkpOwogICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmNlbGFibGUuZ2Fpbi52YWx1ZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbUdhaW4udmFsdWVzW2ldID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50PihwYXJjZWxhYmxlLmdhaW4udmFsdWVzW2ldKSk7CisgICAgaWYgKHBhcmNlbGFibGUuZm9ybWF0Lmhhc192YWx1ZSgpKSB7CisgICAgICAgIG1Gb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QocGFyY2VsYWJsZS5mb3JtYXQudmFsdWUoKSkpOworICAgIH0KKyAgICBpZiAocGFyY2VsYWJsZS5jaGFubmVsTWFzay5oYXNfdmFsdWUoKSkgeworICAgICAgICBtQ2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ2hhbm5lbExheW91dF9hdWRpb19jaGFubmVsX21hc2tfdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmNlbGFibGUuY2hhbm5lbE1hc2sudmFsdWUoKSwgaXNJbnB1dCkpOworICAgIH0KKyAgICBtSWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChwYXJjZWxhYmxlLmlkKSk7CisgICAgaWYgKHBhcmNlbGFibGUuZ2Fpbi5oYXNfdmFsdWUoKSkgeworICAgICAgICBtR2FpbiA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9HYWluQ29uZmlnX2F1ZGlvX2dhaW5fY29uZmlnKHBhcmNlbGFibGUuZ2Fpbi52YWx1ZSgpLCBpc0lucHV0KSk7CisgICAgfQorICAgIGlmIChwYXJjZWxhYmxlLmZsYWdzLmhhc192YWx1ZSgpKSB7CisgICAgICAgIG1GbGFncyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Jb0ZsYWdzX2F1ZGlvX2lvX2ZsYWdzKHBhcmNlbGFibGUuZmxhZ3MudmFsdWUoKSwgaXNJbnB1dCkpOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Qcm9maWxlLmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1Byb2ZpbGUuY3BwCmluZGV4IDhhYzNmNzMuLjIxNzBjZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1Byb2ZpbGUuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1Byb2ZpbGUuY3BwCkBAIC0yNyw2ICsyNyw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvQ2hhbm5lbExheW91dDsKKwogYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQXVkaW9Qcm9maWxlICZsZWZ0LCBjb25zdCBBdWRpb1Byb2ZpbGUgJnJpZ2h0KQogewogICAgIHJldHVybiAobGVmdC5nZXRGb3JtYXQoKSA9PSByaWdodC5nZXRGb3JtYXQoKSkgJiYKQEAgLTk3LDE4ICs5OSwxNCBAQAogCiB2b2lkIEF1ZGlvUHJvZmlsZTo6ZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJXMlcyVzXG4iLCBtSXNEeW5hbWljRm9ybWF0ID8gIltkeW5hbWljIGZvcm1hdF0iIDogIiIsCisgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCJcIiVzXCI7ICIsIG1OYW1lLmNfc3RyKCkpKTsKKyAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiVzJXMlcyVzIiwgbUlzRHluYW1pY0Zvcm1hdCA/ICJbZHluYW1pYyBmb3JtYXRdIiA6ICIiLAogICAgICAgICAgICAgIG1Jc0R5bmFtaWNDaGFubmVscyA/ICJbZHluYW1pYyBjaGFubmVsc10iIDogIiIsCi0gICAgICAgICAgICAgbUlzRHluYW1pY1JhdGUgPyAiW2R5bmFtaWMgcmF0ZXNdIiA6ICIiKSk7Ci0gICAgaWYgKG1OYW1lLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5jX3N0cigpKSk7Ci0gICAgfQotICAgIHN0ZDo6c3RyaW5nIGZvcm1hdExpdGVyYWw7Ci0gICAgaWYgKEZvcm1hdENvbnZlcnRlcjo6dG9TdHJpbmcobUZvcm1hdCwgZm9ybWF0TGl0ZXJhbCkpIHsKLSAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIGZvcm1hdDogJXNcbiIsIHNwYWNlcywgIiIsIGZvcm1hdExpdGVyYWwuY19zdHIoKSkpOwotICAgIH0KKyAgICAgICAgICAgICBtSXNEeW5hbWljUmF0ZSA/ICJbZHluYW1pYyByYXRlc10iIDogIiIsIGlzRHluYW1pYygpID8gIjsgIiA6ICIiKSk7CisgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlcyAoMHgleClcbiIsIGF1ZGlvX2Zvcm1hdF90b19zdHJpbmcobUZvcm1hdCksIG1Gb3JtYXQpKTsKKwogICAgIGlmICghbVNhbXBsaW5nUmF0ZXMuZW1wdHkoKSkgewotICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqcy0gc2FtcGxpbmcgcmF0ZXM6Iiwgc3BhY2VzLCAiIikpOworICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqc3NhbXBsaW5nIHJhdGVzOiAiLCBzcGFjZXMsICIiKSk7CiAgICAgICAgIGZvciAoYXV0byBpdCA9IG1TYW1wbGluZ1JhdGVzLmJlZ2luKCk7IGl0ICE9IG1TYW1wbGluZ1JhdGVzLmVuZCgpOykgewogICAgICAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlZCIsICppdCkpOwogICAgICAgICAgICAgZHN0LT5hcHBlbmQoKytpdCA9PSBtU2FtcGxpbmdSYXRlcy5lbmQoKSA/ICIiIDogIiwgIik7CkBAIC0xMTcsNyArMTE1LDcgQEAKICAgICB9CiAKICAgICBpZiAoIW1DaGFubmVsTWFza3MuZW1wdHkoKSkgewotICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqcy0gY2hhbm5lbCBtYXNrczoiLCBzcGFjZXMsICIiKSk7CisgICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzY2hhbm5lbCBtYXNrczogIiwgc3BhY2VzLCAiIikpOwogICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2hhbm5lbE1hc2tzLmJlZ2luKCk7IGl0ICE9IG1DaGFubmVsTWFza3MuZW5kKCk7KSB7CiAgICAgICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIjB4JTA0eCIsICppdCkpOwogICAgICAgICAgICAgZHN0LT5hcHBlbmQoKytpdCA9PSBtQ2hhbm5lbE1hc2tzLmVuZCgpID8gIiIgOiAiLCAiKTsKQEAgLTEyNiwxOSArMTI0LDIwIEBACiAgICAgfQogCiAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgIiUqcy0gZW5jYXBzdWxhdGlvbiB0eXBlOiAlI3hcbiIsIHNwYWNlcywgIiIsIG1FbmNhcHN1bGF0aW9uVHlwZSkpOworICAgICAgICAgICAgICIlKnMlc1xuIiwgc3BhY2VzLCAiIiwgYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3RvX3N0cmluZyhtRW5jYXBzdWxhdGlvblR5cGUpKSk7CiB9CiAKLWJvb2wgQXVkaW9Qcm9maWxlOjplcXVhbHMoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgb3RoZXIpIGNvbnN0Citib29sIEF1ZGlvUHJvZmlsZTo6ZXF1YWxzKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIG90aGVyLCBib29sIGlnbm9yZUR5bmFtaWNGbGFncykgY29uc3QKIHsKICAgICByZXR1cm4gb3RoZXIgIT0gbnVsbHB0ciAmJgogICAgICAgICAgICBtTmFtZS5jb21wYXJlKG90aGVyLT5tTmFtZSkgPT0gMCAmJgogICAgICAgICAgICBtRm9ybWF0ID09IG90aGVyLT5nZXRGb3JtYXQoKSAmJgogICAgICAgICAgICBtQ2hhbm5lbE1hc2tzID09IG90aGVyLT5nZXRDaGFubmVscygpICYmCiAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzID09IG90aGVyLT5nZXRTYW1wbGVSYXRlcygpICYmCi0gICAgICAgICAgIG1Jc0R5bmFtaWNGb3JtYXQgPT0gb3RoZXItPmlzRHluYW1pY0Zvcm1hdCgpICYmCi0gICAgICAgICAgIG1Jc0R5bmFtaWNDaGFubmVscyA9PSBvdGhlci0+aXNEeW5hbWljQ2hhbm5lbHMoKSAmJgotICAgICAgICAgICBtSXNEeW5hbWljUmF0ZSA9PSBvdGhlci0+aXNEeW5hbWljUmF0ZSgpICYmCisgICAgICAgICAgIChpZ25vcmVEeW5hbWljRmxhZ3MgfHwKKyAgICAgICAgICAgICAgIChtSXNEeW5hbWljRm9ybWF0ID09IG90aGVyLT5pc0R5bmFtaWNGb3JtYXQoKSAmJgorICAgICAgICAgICAgICAgbUlzRHluYW1pY0NoYW5uZWxzID09IG90aGVyLT5pc0R5bmFtaWNDaGFubmVscygpICYmCisgICAgICAgICAgICAgICBtSXNEeW5hbWljUmF0ZSA9PSBvdGhlci0+aXNEeW5hbWljUmF0ZSgpKSkgJiYKICAgICAgICAgICAgbUVuY2Fwc3VsYXRpb25UeXBlID09IG90aGVyLT5nZXRFbmNhcHN1bGF0aW9uVHlwZSgpOwogfQogCkBAIC0xNTQsNjcgKzE1Myw4OCBAQAogICAgIHJldHVybiAqdGhpczsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qcm9maWxlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7Ci0gICAgbWVkaWE6OkF1ZGlvUHJvZmlsZSBwYXJjZWxhYmxlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyh0b1BhcmNlbGFibGUoKSk7Ci0gICAgcmV0dXJuIHBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotIH0KK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9Qcm9maWxlOjpBaWRsPgorQXVkaW9Qcm9maWxlOjp0b1BhcmNlbGFibGUoYm9vbCBpc0lucHV0KSBjb25zdCB7CisgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZSBwYXJjZWxhYmxlID0gVkFMVUVfT1JfUkVUVVJOKHRvQ29tbW9uUGFyY2VsYWJsZShpc0lucHV0KSk7CisgICAgbWVkaWE6OkF1ZGlvUHJvZmlsZVN5cyBwYXJjZWxhYmxlU3lzOworICAgIHBhcmNlbGFibGVTeXMuaXNEeW5hbWljRm9ybWF0ID0gbUlzRHluYW1pY0Zvcm1hdDsKKyAgICBwYXJjZWxhYmxlU3lzLmlzRHluYW1pY0NoYW5uZWxzID0gbUlzRHluYW1pY0NoYW5uZWxzOworICAgIHBhcmNlbGFibGVTeXMuaXNEeW5hbWljUmF0ZSA9IG1Jc0R5bmFtaWNSYXRlOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihwYXJjZWxhYmxlLCBwYXJjZWxhYmxlU3lzKTsKK30KIAotQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qcm9maWxlPgotQXVkaW9Qcm9maWxlOjp0b1BhcmNlbGFibGUoKSBjb25zdCB7Ci0gICAgbWVkaWE6OkF1ZGlvUHJvZmlsZSBwYXJjZWxhYmxlOworQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb1Byb2ZpbGU+PiBBdWRpb1Byb2ZpbGU6OmZyb21QYXJjZWxhYmxlKAorICAgICAgICBjb25zdCBBdWRpb1Byb2ZpbGU6OkFpZGwmIGFpZGwsIGJvb2wgaXNJbnB1dCkgeworICAgIHNwPEF1ZGlvUHJvZmlsZT4gbGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOKGZyb21Db21tb25QYXJjZWxhYmxlKGFpZGwuZmlyc3QsIGlzSW5wdXQpKTsKKyAgICBjb25zdCBhdXRvJiBwYXJjZWxhYmxlU3lzID0gYWlkbC5zZWNvbmQ7CisgICAgbGVnYWN5LT5tSXNEeW5hbWljRm9ybWF0ID0gcGFyY2VsYWJsZVN5cy5pc0R5bmFtaWNGb3JtYXQ7CisgICAgbGVnYWN5LT5tSXNEeW5hbWljQ2hhbm5lbHMgPSBwYXJjZWxhYmxlU3lzLmlzRHluYW1pY0NoYW5uZWxzOworICAgIGxlZ2FjeS0+bUlzRHluYW1pY1JhdGUgPSBwYXJjZWxhYmxlU3lzLmlzRHluYW1pY1JhdGU7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlPgorQXVkaW9Qcm9maWxlOjp0b0NvbW1vblBhcmNlbGFibGUoYm9vbCBpc0lucHV0KSBjb25zdCB7CisgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZSBwYXJjZWxhYmxlOwogICAgIHBhcmNlbGFibGUubmFtZSA9IG1OYW1lOwotICAgIHBhcmNlbGFibGUuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KG1Gb3JtYXQpKTsKKyAgICBwYXJjZWxhYmxlLmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb24obUZvcm1hdCkpOworICAgIC8vIE5vdGU6IGxlZ2FjeSAnYXVkaW9fcHJvZmlsZScgaW1wb3NlcyBhIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YKKyAgICAvLyBjaGFubmVsIG1hc2tzIGFuZCBzYW1wbGluZyByYXRlcy4gVGhhdCdzIHdoeSBpdCdzIG5vdCB1c2VkIGhlcmUKKyAgICAvLyBhbmQgY29udmVyc2lvbnMgYXJlIHBlcmZvcm1lZCBkaXJlY3RseSBvbiB0aGUgZmllbGRzIGluc3RlYWQKKyAgICAvLyBvZiB1c2luZyAnbGVnYWN5MmFpZGxfYXVkaW9fcHJvZmlsZV9BdWRpb1Byb2ZpbGUnIGZyb20gQWlkbENvbnZlcnNpb24uCiAgICAgcGFyY2VsYWJsZS5jaGFubmVsTWFza3MgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGludDMyX3Q+PihtQ2hhbm5lbE1hc2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdCkpOwotICAgIHBhcmNlbGFibGUuc2FtcGxpbmdSYXRlcyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8QXVkaW9DaGFubmVsTGF5b3V0Pj4oCisgICAgICAgICAgICBtQ2hhbm5lbE1hc2tzLAorICAgICAgICAgICAgW2lzSW5wdXRdKGF1ZGlvX2NoYW5uZWxfbWFza190IG0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfQXVkaW9DaGFubmVsTGF5b3V0KG0sIGlzSW5wdXQpOworICAgICAgICAgICAgfSkpOworICAgIHBhcmNlbGFibGUuc2FtcGxlUmF0ZXMgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGludDMyX3Q+PihtU2FtcGxpbmdSYXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90LCB1aW50MzJfdD4pKTsKLSAgICBwYXJjZWxhYmxlLmlzRHluYW1pY0Zvcm1hdCA9IG1Jc0R5bmFtaWNGb3JtYXQ7Ci0gICAgcGFyY2VsYWJsZS5pc0R5bmFtaWNDaGFubmVscyA9IG1Jc0R5bmFtaWNDaGFubmVsczsKLSAgICBwYXJjZWxhYmxlLmlzRHluYW1pY1JhdGUgPSBtSXNEeW5hbWljUmF0ZTsKICAgICBwYXJjZWxhYmxlLmVuY2Fwc3VsYXRpb25UeXBlID0gVkFMVUVfT1JfUkVUVVJOKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3RfQXVkaW9FbmNhcHN1bGF0aW9uVHlwZShtRW5jYXBzdWxhdGlvblR5cGUpKTsKICAgICByZXR1cm4gcGFyY2VsYWJsZTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qcm9maWxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgewotICAgIG1lZGlhOjpBdWRpb1Byb2ZpbGUgcGFyY2VsYWJsZTsKLSAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOyBzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgKnRoaXMgPSAqVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhmcm9tUGFyY2VsYWJsZShwYXJjZWxhYmxlKSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1Db252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvUHJvZmlsZT4+Ci1BdWRpb1Byb2ZpbGU6OmZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb1Byb2ZpbGUmIHBhcmNlbGFibGUpIHsKK0NvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9Qcm9maWxlPj4gQXVkaW9Qcm9maWxlOjpmcm9tQ29tbW9uUGFyY2VsYWJsZSgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZSYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CiAgICAgc3A8QXVkaW9Qcm9maWxlPiBsZWdhY3kgPSBuZXcgQXVkaW9Qcm9maWxlKCk7Ci0gICAgbGVnYWN5LT5tTmFtZSA9IHBhcmNlbGFibGUubmFtZTsKLSAgICBsZWdhY3ktPm1Gb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QocGFyY2VsYWJsZS5mb3JtYXQpKTsKKyAgICBsZWdhY3ktPm1OYW1lID0gYWlkbC5uYW1lOworICAgIGxlZ2FjeS0+bUZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QoYWlkbC5mb3JtYXQpKTsKICAgICBsZWdhY3ktPm1DaGFubmVsTWFza3MgPSBWQUxVRV9PUl9SRVRVUk4oCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPENoYW5uZWxNYXNrU2V0PihwYXJjZWxhYmxlLmNoYW5uZWxNYXNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QpKTsKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8Q2hhbm5lbE1hc2tTZXQ+KGFpZGwuY2hhbm5lbE1hc2tzLAorICAgICAgICAgICAgW2lzSW5wdXRdKGNvbnN0IEF1ZGlvQ2hhbm5lbExheW91dCYgbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9BdWRpb0NoYW5uZWxMYXlvdXRfYXVkaW9fY2hhbm5lbF9tYXNrX3QobCwgaXNJbnB1dCk7CisgICAgICAgICAgICB9KSk7CiAgICAgbGVnYWN5LT5tU2FtcGxpbmdSYXRlcyA9IFZBTFVFX09SX1JFVFVSTigKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8U2FtcGxlUmF0ZVNldD4ocGFyY2VsYWJsZS5zYW1wbGluZ1JhdGVzLAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxTYW1wbGVSYXRlU2V0PihhaWRsLnNhbXBsZVJhdGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8dWludDMyX3QsIGludDMyX3Q+KSk7Ci0gICAgbGVnYWN5LT5tSXNEeW5hbWljRm9ybWF0ID0gcGFyY2VsYWJsZS5pc0R5bmFtaWNGb3JtYXQ7Ci0gICAgbGVnYWN5LT5tSXNEeW5hbWljQ2hhbm5lbHMgPSBwYXJjZWxhYmxlLmlzRHluYW1pY0NoYW5uZWxzOwotICAgIGxlZ2FjeS0+bUlzRHluYW1pY1JhdGUgPSBwYXJjZWxhYmxlLmlzRHluYW1pY1JhdGU7CiAgICAgbGVnYWN5LT5tRW5jYXBzdWxhdGlvblR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90KAotICAgICAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLmVuY2Fwc3VsYXRpb25UeXBlKSk7CisgICAgICAgICAgICAgICAgICAgIGFpZGwuZW5jYXBzdWxhdGlvblR5cGUpKTsKICAgICByZXR1cm4gbGVnYWN5OwogfQogCiBDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvUHJvZmlsZT4+Ci1haWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGUoY29uc3QgbWVkaWE6OkF1ZGlvUHJvZmlsZSYgYWlkbCkgewotICAgIHJldHVybiBBdWRpb1Byb2ZpbGU6OmZyb21QYXJjZWxhYmxlKGFpZGwpOworYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlKGNvbnN0IEF1ZGlvUHJvZmlsZTo6QWlkbCYgYWlkbCwgYm9vbCBpc0lucHV0KSB7CisgICAgcmV0dXJuIEF1ZGlvUHJvZmlsZTo6ZnJvbVBhcmNlbGFibGUoYWlkbCwgaXNJbnB1dCk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUHJvZmlsZT4KLWxlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZShjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBsZWdhY3kpIHsKLSAgICByZXR1cm4gbGVnYWN5LT50b1BhcmNlbGFibGUoKTsKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9Qcm9maWxlOjpBaWRsPgorbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIGxlZ2FjeSwgYm9vbCBpc0lucHV0KSB7CisgICAgcmV0dXJuIGxlZ2FjeS0+dG9QYXJjZWxhYmxlKGlzSW5wdXQpOworfQorCitDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvUHJvZmlsZT4+CithaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVfY29tbW9uKGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGUmIGFpZGwsIGJvb2wgaXNJbnB1dCkgeworICAgIHJldHVybiBBdWRpb1Byb2ZpbGU6OmZyb21Db21tb25QYXJjZWxhYmxlKGFpZGwsIGlzSW5wdXQpOworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGU+CitsZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGVfY29tbW9uKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIGxlZ2FjeSwgYm9vbCBpc0lucHV0KSB7CisgICAgcmV0dXJuIGxlZ2FjeS0+dG9Db21tb25QYXJjZWxhYmxlKGlzSW5wdXQpOwogfQogCiBzc2l6ZV90IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6YWRkKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpCkBAIC0zMDcsMTAgKzMyNywxMCBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmNvbnRhaW5zKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIHByb2ZpbGUpIGNvbnN0Citib29sIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Y29udGFpbnMoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgcHJvZmlsZSwgYm9vbCBpZ25vcmVEeW5hbWljRmxhZ3MpIGNvbnN0CiB7CiAgICAgZm9yIChjb25zdCBhdXRvJiBhdWRpb1Byb2ZpbGUgOiAqdGhpcykgewotICAgICAgICBpZiAoYXVkaW9Qcm9maWxlLT5lcXVhbHMocHJvZmlsZSkpIHsKKyAgICAgICAgaWYgKGF1ZGlvUHJvZmlsZS0+ZXF1YWxzKHByb2ZpbGUsIGlnbm9yZUR5bmFtaWNGbGFncykpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtMzE5LDQyICszMzksMTYgQEAKIAogdm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqcy0gUHJvZmlsZXM6XG4iLCBzcGFjZXMsICIiKSk7CisgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIFByb2ZpbGVzICglenUpOlxuIiwgc3BhY2VzIC0gMiwgIiIsIHNpemUoKSkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnNQcm9maWxlICV6dToiLCBzcGFjZXMgKyA0LCAiIiwgaSkpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBiYXNlOjpTdHJpbmdQcmludGYoIiUqcyAlenUuICIsIHNwYWNlcywgIiIsIGkgKyAxKTsKKyAgICAgICAgZHN0LT5hcHBlbmQocHJlZml4KTsKICAgICAgICAgc3RkOjpzdHJpbmcgcHJvZmlsZVN0cjsKLSAgICAgICAgYXQoaSktPmR1bXAoJnByb2ZpbGVTdHIsIHNwYWNlcyArIDgpOworICAgICAgICBhdChpKS0+ZHVtcCgmcHJvZmlsZVN0ciwgcHJlZml4LnNpemUoKSk7CiAgICAgICAgIGRzdC0+YXBwZW5kKHByb2ZpbGVTdHIpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdAotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVZlY3RvclNpemUoKnRoaXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJmF1ZGlvUHJvZmlsZSA6ICp0aGlzKSB7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVBhcmNlbGFibGUoKmF1ZGlvUHJvZmlsZSkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIHRoaXMtPmNsZWFyKCk7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlc2l6ZU91dFZlY3Rvcih0aGlzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aGlzLT5zaXplKCk7ICsraSkgewotICAgICAgICB0aGlzLT5hdChpKSA9IG5ldyBBdWRpb1Byb2ZpbGUoQVVESU9fRk9STUFUX0RFRkFVTFQsIEFVRElPX0NIQU5ORUxfTk9ORSwgMCAvKnNhbXBsZVJhdGUqLyk7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSh0aGlzLT5hdChpKS5nZXQoKSkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICB0aGlzLT5jbGVhcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQogYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmVxdWFscyhjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIG90aGVyKSBjb25zdAogewogICAgIHJldHVybiBzdGQ6OmVxdWFsKGJlZ2luKCksIGVuZCgpLCBvdGhlci5iZWdpbigpLCBvdGhlci5lbmQoKSwKQEAgLTM2MywxNCArMzU3LDMxIEBACiAgICAgICAgICAgICAgICAgICAgICAgfSk7CiB9CiAKLUNvbnZlcnNpb25SZXN1bHQ8QXVkaW9Qcm9maWxlVmVjdG9yPgotYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlVmVjdG9yKGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1Byb2ZpbGU+JiBhaWRsKSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRDb250YWluZXI8QXVkaW9Qcm9maWxlVmVjdG9yPihhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGUpOwordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmFkZEFsbFZhbGlkUHJvZmlsZXMoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBhdWRpb1Byb2ZpbGVzKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBhdWRpb1Byb2ZpbGUgOiBhdWRpb1Byb2ZpbGVzKSB7CisgICAgICAgIGlmIChhdWRpb1Byb2ZpbGUtPmlzVmFsaWQoKSAmJiAhY29udGFpbnMoYXVkaW9Qcm9maWxlLCB0cnVlIC8qaWdub3JlRHluYW1pY0ZsYWdzKi8pKSB7CisgICAgICAgICAgICBhZGQoYXVkaW9Qcm9maWxlKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAotQ29udmVyc2lvblJlc3VsdDxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qcm9maWxlPj4KLWxlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZVZlY3Rvcihjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIGxlZ2FjeSkgewotICAgIHJldHVybiBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1Byb2ZpbGU+PihsZWdhY3ksIGxlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZSk7CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvUHJvZmlsZVZlY3Rvcj4KK2FpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZVZlY3Rvcihjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OkFpZGwmIGFpZGwsIGJvb2wgaXNJbnB1dCkgeworICAgIHJldHVybiBjb252ZXJ0Q29udGFpbmVyczxBdWRpb1Byb2ZpbGVWZWN0b3I+KGFpZGwuZmlyc3QsIGFpZGwuc2Vjb25kLAorICAgICAgICAgICAgW2lzSW5wdXRdKGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGUmIHAsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUHJvZmlsZVN5cyYgcHMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlKHN0ZDo6bWFrZV9wYWlyKHAsIHBzKSwgaXNJbnB1dCk7CisgICAgICAgICAgICB9KTsKK30KKworQ29udmVyc2lvblJlc3VsdDxBdWRpb1Byb2ZpbGVWZWN0b3I6OkFpZGw+CitsZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGVWZWN0b3IoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBsZWdhY3ksIGJvb2wgaXNJbnB1dCkgeworICAgIHJldHVybiBjb252ZXJ0Q29udGFpbmVyU3BsaXQ8CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlPiwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1Byb2ZpbGVTeXM+PihsZWdhY3ksCisgICAgICAgICAgICBbaXNJbnB1dF0oY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgcCkgeworICAgICAgICAgICAgICAgIHJldHVybiBsZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGUocCwgaXNJbnB1dCk7CisgICAgICAgICAgICB9KTsKIH0KIAogQXVkaW9Qcm9maWxlVmVjdG9yIGludGVyc2VjdEF1ZGlvUHJvZmlsZXMoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBwcm9maWxlczEsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vRGV2aWNlRGVzY3JpcHRvckJhc2UuY3BwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0RldmljZURlc2NyaXB0b3JCYXNlLmNwcAppbmRleCA1Y2ZlYTgxLi41ZmZiZmZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vRGV2aWNlRGVzY3JpcHRvckJhc2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9EZXZpY2VEZXNjcmlwdG9yQmFzZS5jcHAKQEAgLTMwLDE2ICszMCwyMCBAQAogewogfQogCi1EZXZpY2VEZXNjcmlwdG9yQmFzZTo6RGV2aWNlRGVzY3JpcHRvckJhc2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKSA6Ci0gICAgICAgIERldmljZURlc2NyaXB0b3JCYXNlKEF1ZGlvRGV2aWNlVHlwZUFkZHIodHlwZSwgYWRkcmVzcykpCitEZXZpY2VEZXNjcmlwdG9yQmFzZTo6RGV2aWNlRGVzY3JpcHRvckJhc2UoCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgY29uc3QgRm9ybWF0VmVjdG9yICZlbmNvZGVkRm9ybWF0cykgOgorICAgICAgICBEZXZpY2VEZXNjcmlwdG9yQmFzZShBdWRpb0RldmljZVR5cGVBZGRyKHR5cGUsIGFkZHJlc3MpLCBlbmNvZGVkRm9ybWF0cykKIHsKIH0KIAotRGV2aWNlRGVzY3JpcHRvckJhc2U6OkRldmljZURlc2NyaXB0b3JCYXNlKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZVR5cGVBZGRyKSA6CitEZXZpY2VEZXNjcmlwdG9yQmFzZTo6RGV2aWNlRGVzY3JpcHRvckJhc2UoCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZVR5cGVBZGRyLCBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzKSA6CiAgICAgICAgIEF1ZGlvUG9ydCgiIiwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwKICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlVHlwZUFkZHIubVR5cGUpID8gQVVESU9fUE9SVF9ST0xFX1NJTksgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFKSwKLSAgICAgICAgbURldmljZVR5cGVBZGRyKGRldmljZVR5cGVBZGRyKQorICAgICAgICBtRGV2aWNlVHlwZUFkZHIoZGV2aWNlVHlwZUFkZHIpLAorICAgICAgICBtRW5jb2RlZEZvcm1hdHMoZW5jb2RlZEZvcm1hdHMpCiB7CiAgICAgaWYgKG1EZXZpY2VUeXBlQWRkci5hZGRyZXNzKCkuZW1wdHkoKSAmJiBhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShtRGV2aWNlVHlwZUFkZHIubVR5cGUpKSB7CiAgICAgICAgIG1EZXZpY2VUeXBlQWRkci5zZXRBZGRyZXNzKCIwIik7CkBAIC0xMDYsMzIgKzExMCwyMyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6ZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsCit2b2lkIERldmljZURlc2NyaXB0b3JCYXNlOjpkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dHJhSW5mbywgYm9vbCB2ZXJib3NlKSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzRGV2aWNlICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXggKyAxKSk7CiAgICAgaWYgKG1JZCAhPSAwKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtSWQpKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCJQb3J0IElEOiAlZDsgIiwgbUlkKSk7CiAgICAgfQotCiAgICAgaWYgKGV4dHJhSW5mbyAhPSBudWxscHRyKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kKGV4dHJhSW5mbyk7CisgICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJXM7ICIsIGV4dHJhSW5mbykpOwogICAgIH0KLQotICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSB0eXBlOiAlLTQ4c1xuIiwKLSAgICAgICAgICAgIHNwYWNlcywgIiIsIDo6YW5kcm9pZDo6dG9TdHJpbmcobURldmljZVR5cGVBZGRyLm1UeXBlKS5jX3N0cigpKSk7CisgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCJ7JXN9XG4iLAorICAgICAgICAgICAgICAgICAgICBtRGV2aWNlVHlwZUFkZHIudG9TdHJpbmcodHJ1ZSAvKmluY2x1ZGVTZW5zaXRpdmVJbmZvKi8pLmNfc3RyKCkpKTsKIAogICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICIlKnMtIHN1cHBvcnRlZCBlbmNhcHN1bGF0aW9uIG1vZGVzOiAldVxuIiwgc3BhY2VzLCAiIiwgbUVuY2Fwc3VsYXRpb25Nb2RlcykpOwotICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICIlKnMtIHN1cHBvcnRlZCBlbmNhcHN1bGF0aW9uIG1ldGFkYXRhIHR5cGVzOiAldVxuIiwKLSAgICAgICAgICAgIHNwYWNlcywgIiIsIG1FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcykpOworICAgICAgICAgICAgICAgICAgICAiJSpzRW5jYXBzdWxhdGlvbiBtb2RlczogJXUsIG1ldGFkYXRhIHR5cGVzOiAldVxuIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgbUVuY2Fwc3VsYXRpb25Nb2RlcywgbUVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzKSk7CiAKLSAgICBpZiAobURldmljZVR5cGVBZGRyLmFkZHJlc3MoKS5zaXplKCkgIT0gMCkgewotICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgIiUqcy0gYWRkcmVzczogJS0zMnNcbiIsIHNwYWNlcywgIiIsIG1EZXZpY2VUeXBlQWRkci5nZXRBZGRyZXNzKCkpKTsKLSAgICB9Ci0gICAgQXVkaW9Qb3J0OjpkdW1wKGRzdCwgc3BhY2VzLCB2ZXJib3NlKTsKKyAgICBBdWRpb1BvcnQ6OmR1bXAoZHN0LCBzcGFjZXMsIG51bGxwdHIsIHZlcmJvc2UpOwogfQogCiBzdGQ6OnN0cmluZyBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6dG9TdHJpbmcoYm9vbCBpbmNsdWRlU2Vuc2l0aXZlSW5mbykgY29uc3QKQEAgLTE0OCw2MCArMTQzLDgzIEBACiAgICAgQXVkaW9Qb3J0Ojpsb2coIiAgIik7CiB9CiAKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIGNoZWNrRXF1YWwoY29uc3QgVCYgZjEsIGNvbnN0IFQmIGYyKQoreworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHMxKGYxLmJlZ2luKCksIGYxLmVuZCgpKTsKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBzMihmMi5iZWdpbigpLCBmMi5lbmQoKSk7CisgICAgcmV0dXJuIHMxID09IHMyOworfQorCiBib29sIERldmljZURlc2NyaXB0b3JCYXNlOjplcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+ICZvdGhlcikgY29uc3QKIHsKICAgICByZXR1cm4gb3RoZXIgIT0gbnVsbHB0ciAmJgogICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBdWRpb1BvcnQqPih0aGlzKS0+ZXF1YWxzKG90aGVyKSAmJgotICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBdWRpb1BvcnRDb25maWcqPih0aGlzKS0+ZXF1YWxzKG90aGVyKSAmJgotICAgICAgICAgICBtRGV2aWNlVHlwZUFkZHIuZXF1YWxzKG90aGVyLT5tRGV2aWNlVHlwZUFkZHIpOworICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBdWRpb1BvcnRDb25maWcqPih0aGlzKS0+ZXF1YWxzKG90aGVyLCB1c2VJbnB1dENoYW5uZWxNYXNrKCkpICYmCisgICAgICAgICAgIG1EZXZpY2VUeXBlQWRkci5lcXVhbHMob3RoZXItPm1EZXZpY2VUeXBlQWRkcikgJiYKKyAgICAgICAgICAgY2hlY2tFcXVhbChtRW5jb2RlZEZvcm1hdHMsIG90aGVyLT5tRW5jb2RlZEZvcm1hdHMpOwogfQogCi0KLXN0YXR1c190IERldmljZURlc2NyaXB0b3JCYXNlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdAorYm9vbCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6c3VwcG9ydHNGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQogewotICAgIG1lZGlhOjpBdWRpb1BvcnQgcGFyY2VsYWJsZTsKLSAgICByZXR1cm4gd3JpdGVUb1BhcmNlbGFibGUoJnBhcmNlbGFibGUpCi0gICAgICAgID86IHBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIGlmIChtRW5jb2RlZEZvcm1hdHMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldkZvcm1hdCA6IG1FbmNvZGVkRm9ybWF0cykgeworICAgICAgICBpZiAoZGV2Rm9ybWF0ID09IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0dXNfdCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6d3JpdGVUb1BhcmNlbGFibGUobWVkaWE6OkF1ZGlvUG9ydCogcGFyY2VsYWJsZSkgY29uc3QgewogICAgIEF1ZGlvUG9ydDo6d3JpdGVUb1BhcmNlbGFibGUocGFyY2VsYWJsZSk7Ci0gICAgQXVkaW9Qb3J0Q29uZmlnOjp3cml0ZVRvUGFyY2VsYWJsZSgmcGFyY2VsYWJsZS0+YWN0aXZlQ29uZmlnKTsKLSAgICBwYXJjZWxhYmxlLT5pZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KG1JZCkpOworICAgIEF1ZGlvUG9ydENvbmZpZzo6d3JpdGVUb1BhcmNlbGFibGUoJnBhcmNlbGFibGUtPnN5cy5hY3RpdmVDb25maWcuaGFsLCB1c2VJbnB1dENoYW5uZWxNYXNrKCkpOworICAgIHBhcmNlbGFibGUtPmhhbC5pZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KG1JZCkpOworICAgIHBhcmNlbGFibGUtPnN5cy5hY3RpdmVDb25maWcuaGFsLnBvcnRJZCA9IHBhcmNlbGFibGUtPmhhbC5pZDsKIAotICAgIG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHQgZXh0OwotICAgIGV4dC5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MobURldmljZVR5cGVBZGRyKSk7Ci0gICAgZXh0LmVuY2Fwc3VsYXRpb25Nb2RlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydERldmljZUV4dCBkZXZpY2VFeHQ7CisgICAgZGV2aWNlRXh0LmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKG1EZXZpY2VUeXBlQWRkcikpOworICAgIGRldmljZUV4dC5lbmNvZGVkRm9ybWF0cyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPj4oCisgICAgICAgICAgICAgICAgICAgIG1FbmNvZGVkRm9ybWF0cywgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbikpOworICAgIFVOSU9OX1NFVChwYXJjZWxhYmxlLT5oYWwuZXh0LCBkZXZpY2UsIGRldmljZUV4dCk7CisgICAgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dFN5cyBkZXZpY2VTeXM7CisgICAgZGV2aWNlU3lzLmVuY2Fwc3VsYXRpb25Nb2RlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX21hc2sobUVuY2Fwc3VsYXRpb25Nb2RlcykpOwotICAgIGV4dC5lbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgZGV2aWNlU3lzLmVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9tYXNrKG1FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcykpOwotICAgIFVOSU9OX1NFVChwYXJjZWxhYmxlLT5leHQsIGRldmljZSwgc3RkOjptb3ZlKGV4dCkpOworICAgIFVOSU9OX1NFVChwYXJjZWxhYmxlLT5zeXMuZXh0LCBkZXZpY2UsIGRldmljZVN5cyk7CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIHsKLSAgICBtZWRpYTo6QXVkaW9Qb3J0IHBhcmNlbGFibGU7Ci0gICAgcmV0dXJuIHBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKQotICAgICAgICA/OiByZWFkRnJvbVBhcmNlbGFibGUocGFyY2VsYWJsZSk7Ci19Ci0KIHN0YXR1c190IERldmljZURlc2NyaXB0b3JCYXNlOjpyZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgcGFyY2VsYWJsZSkgewotICAgIGlmIChwYXJjZWxhYmxlLnR5cGUgIT0gbWVkaWE6OkF1ZGlvUG9ydFR5cGU6OkRFVklDRSkgeworICAgIGlmIChwYXJjZWxhYmxlLnN5cy50eXBlICE9IG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpERVZJQ0UpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9Qb3J0OjpyZWFkRnJvbVBhcmNlbGFibGUocGFyY2VsYWJsZSkKLSAgICAgICAgICAgICAgICAgICAgICA/OiBBdWRpb1BvcnRDb25maWc6OnJlYWRGcm9tUGFyY2VsYWJsZShwYXJjZWxhYmxlLmFjdGl2ZUNvbmZpZyk7CisgICAgICAgICAgICA/OiBBdWRpb1BvcnRDb25maWc6OnJlYWRGcm9tUGFyY2VsYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgcGFyY2VsYWJsZS5zeXMuYWN0aXZlQ29uZmlnLmhhbCwgdXNlSW5wdXRDaGFubmVsTWFzaygpKTsKICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dCBleHQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKFVOSU9OX0dFVChwYXJjZWxhYmxlLmV4dCwgZGV2aWNlKSk7CisgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydERldmljZUV4dCBkZXZpY2VFeHQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgVU5JT05fR0VUKHBhcmNlbGFibGUuaGFsLmV4dCwgZGV2aWNlKSk7CiAgICAgbURldmljZVR5cGVBZGRyID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MoZXh0LmRldmljZSkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhkZXZpY2VFeHQuZGV2aWNlKSk7CisgICAgbUVuY29kZWRGb3JtYXRzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8Rm9ybWF0VmVjdG9yPihkZXZpY2VFeHQuZW5jb2RlZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0RGVzY3JpcHRpb25fYXVkaW9fZm9ybWF0X3QpKTsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0U3lzIGRldmljZVN5cyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBVTklPTl9HRVQocGFyY2VsYWJsZS5zeXMuZXh0LCBkZXZpY2UpKTsKICAgICBtRW5jYXBzdWxhdGlvbk1vZGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayhleHQuZW5jYXBzdWxhdGlvbk1vZGVzKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX21hc2soZGV2aWNlU3lzLmVuY2Fwc3VsYXRpb25Nb2RlcykpOwogICAgIG1FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfbWFzayhleHQuZW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9tYXNrKGRldmljZVN5cy5lbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcykpOwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL1RFU1RfTUFQUElORyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9URVNUX01BUFBJTkcKaW5kZXggZjZkMjQ5YS4uZWZlODQzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL1RFU1RfTUFQUElORworKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vVEVTVF9NQVBQSU5HCkBAIC0xLDcgKzEsMTUgQEAKIHsKICAgInByZXN1Ym1pdCI6IFsKICAgICB7Ci0gICAgICAgIm5hbWUiOiAiYXVkaW9mb3VuZGF0aW9uX3BhcmNlbGFibGVfdGVzdCIKKyAgICAgICJuYW1lIjogImF1ZGlvZm91bmRhdGlvbl9wYXJjZWxhYmxlX3Rlc3QiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNOYXRpdmVNZWRpYUFBdWRpb1Rlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyIgOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5uYXRpdmVtZWRpYS5hYXVkaW8uQUF1ZGlvVGVzdHMjQUF1ZGlvQmFzaWMuKiIKKyAgICAgICAgfQorICAgICAgXQogICAgIH0KICAgXQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Db250YWluZXJzLmggYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0NvbnRhaW5lcnMuaAppbmRleCAyMDRiMzY1Li5iNmU2Yzg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0NvbnRhaW5lcnMuaAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0NvbnRhaW5lcnMuaApAQCAtNDAsNiArNDAsOCBAQAogY29uc3QgRGV2aWNlVHlwZVNldCYgZ2V0QXVkaW9EZXZpY2VPdXRBbGxVc2JTZXQoKTsKIGNvbnN0IERldmljZVR5cGVTZXQmIGdldEF1ZGlvRGV2aWNlSW5BbGxTZXQoKTsKIGNvbnN0IERldmljZVR5cGVTZXQmIGdldEF1ZGlvRGV2aWNlSW5BbGxVc2JTZXQoKTsKK2NvbnN0IERldmljZVR5cGVTZXQmIGdldEF1ZGlvRGV2aWNlT3V0QWxsQmxlU2V0KCk7Citjb25zdCBEZXZpY2VUeXBlU2V0JiBnZXRBdWRpb0RldmljZU91dExlQXVkaW9VbmljYXN0U2V0KCk7CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBzdGF0aWMgc3RkOjp2ZWN0b3I8VD4gSW50ZXJzZWN0aW9uKGNvbnN0IHN0ZDo6c2V0PFQ+JiBhLCBjb25zdCBzdGQ6OnNldDxUPiYgYikgewpAQCAtMTEwLDI1ICsxMTIsNyBAQAogICAgIHJldHVybiB0eXBlczsKIH0KIAotLy8gRklYTUU6IFRoaXMgaXMgdGVtcG9yYXJ5IGhlbHBlciBmdW5jdGlvbi4gUmVtb3ZlIHRoaXMgd2hlbiBnZXR0aW5nIHJpZCBvZiBhbGwKLS8vICBiaXQgbWFzayB1c2FnZXMgb2YgYXVkaW8gZGV2aWNlIHR5cGVzLgotc3RhdGljIGlubGluZSBEZXZpY2VUeXBlU2V0IGRldmljZVR5cGVzRnJvbUJpdE1hc2soYXVkaW9fZGV2aWNlc190IHR5cGVzKSB7Ci0gICAgRGV2aWNlVHlwZVNldCBkZXZpY2VUeXBlczsKLSAgICBpZiAoKHR5cGVzICYgQVVESU9fREVWSUNFX0JJVF9JTikgPT0gMCkgewotICAgICAgICBmb3IgKGF1dG8gZGV2aWNlVHlwZSA6IEFVRElPX0RFVklDRV9PVVRfQUxMX0FSUkFZKSB7Ci0gICAgICAgICAgICBpZiAoKHR5cGVzICYgZGV2aWNlVHlwZSkgPT0gZGV2aWNlVHlwZSkgewotICAgICAgICAgICAgICAgIGRldmljZVR5cGVzLmluc2VydChkZXZpY2VUeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoYXV0byBkZXZpY2VUeXBlIDogQVVESU9fREVWSUNFX0lOX0FMTF9BUlJBWSkgewotICAgICAgICAgICAgaWYgKCh0eXBlcyAmIGRldmljZVR5cGUpID09IGRldmljZVR5cGUpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VUeXBlcy5pbnNlcnQoZGV2aWNlVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRldmljZVR5cGVzOwotfQorc3RkOjpzdHJpbmcgZGV2aWNlVHlwZXNUb1N0cmluZyhjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcyk7CiAKIGJvb2wgZGV2aWNlVHlwZXNUb1N0cmluZyhjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcywgc3RkOjpzdHJpbmcgJnN0cik7CiAKQEAgLTEzNyw3ICsxMjEsOSBAQAogLyoqCiAgKiBSZXR1cm4gaHVtYW4gcmVhZGFibGUgc3RyaW5nIGZvciBkZXZpY2UgdHlwZXMuCiAgKi8KLXN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKTsKK2lubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcykgeworICAgIHJldHVybiBkZXZpY2VUeXBlc1RvU3RyaW5nKGRldmljZVR5cGVzKTsKK30KIAogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmggYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmgKaW5kZXggOGVkY2M1OC4uMTFhYTIyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaApAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9EZXZpY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbnRhaW5lcnMuaD4KQEAgLTMyLDYgKzMyLDcgQEAKIGNsYXNzIEF1ZGlvRGV2aWNlVHlwZUFkZHIgOiBwdWJsaWMgUGFyY2VsYWJsZSB7CiBwdWJsaWM6CiAgICAgQXVkaW9EZXZpY2VUeXBlQWRkcigpID0gZGVmYXVsdDsKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImKSA9IGRlZmF1bHQ7CiAKICAgICBBdWRpb0RldmljZVR5cGVBZGRyKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcyk7CiAKQEAgLTg4LDggKzg5LDggQEAKIAogLy8gQ29udmVyc2lvbiByb3V0aW5lcywgYWNjb3JkaW5nIHRvIEFpZGxDb252ZXJzaW9uLmggY29udmVudGlvbnMuCiBDb252ZXJzaW9uUmVzdWx0PEF1ZGlvRGV2aWNlVHlwZUFkZHI+Ci1haWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGNvbnN0IG1lZGlhOjpBdWRpb0RldmljZSYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0RldmljZT4KK2FpZGwybGVnYWN5X0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MoY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlPgogbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBsZWdhY3kpOwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0dhaW4uaCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvR2Fpbi5oCmluZGV4IGEwNmI2ODYuLjEwMDg4ZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvR2Fpbi5oCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvR2Fpbi5oCkBAIC0xNiwyMyArMTYsMjMgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbi5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9HYWluU3lzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBdWRpb0dhaW46IHB1YmxpYyBSZWZCYXNlLCBwdWJsaWMgUGFyY2VsYWJsZQorY2xhc3MgQXVkaW9HYWluOiBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgotICAgIEF1ZGlvR2FpbihpbnQgaW5kZXgsIGJvb2wgdXNlSW5DaGFubmVsTWFzayk7Ci0gICAgdmlydHVhbCB+QXVkaW9HYWluKCkge30KKyAgICBBdWRpb0dhaW4oaW50IGluZGV4LCBib29sIGlzSW5wdXQpOworICAgIHZpcnR1YWwgfkF1ZGlvR2FpbigpID0gZGVmYXVsdDsKIAogICAgIHZvaWQgc2V0TW9kZShhdWRpb19nYWluX21vZGVfdCBtb2RlKSB7IG1HYWluLm1vZGUgPSBtb2RlOyB9CiAgICAgY29uc3QgYXVkaW9fZ2Fpbl9tb2RlX3QgJmdldE1vZGUoKSBjb25zdCB7IHJldHVybiBtR2Fpbi5tb2RlOyB9CkBAIC03MSwyNiArNzEsMjQgQEAKIAogICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPEF1ZGlvR2Fpbj4mIG90aGVyKSBjb25zdDsKIAotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLQotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWxhYmxlKG1lZGlhOjpBdWRpb0dhaW4qIHBhcmNlbGFibGUpIGNvbnN0OwotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsYWJsZShjb25zdCBtZWRpYTo6QXVkaW9HYWluJiBwYXJjZWxhYmxlKTsKKyAgICB1c2luZyBBaWRsID0gc3RkOjpwYWlyPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0dhaW4sIG1lZGlhOjpBdWRpb0dhaW5TeXM+OworICAgIENvbnZlcnNpb25SZXN1bHQ8QWlkbD4gdG9QYXJjZWxhYmxlKCkgY29uc3Q7CisgICAgc3RhdGljIENvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9HYWluPj4gZnJvbVBhcmNlbGFibGUoY29uc3QgQWlkbCYgYWlkbCk7CiAKIHByaXZhdGU6CiAgICAgaW50ICAgICAgICAgICAgICAgbUluZGV4OwotICAgIHN0cnVjdCBhdWRpb19nYWluIG1HYWluOwotICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VJbkNoYW5uZWxNYXNrOworICAgIGJvb2wgICAgICAgICAgICAgIG1Jc0lucHV0OworICAgIHN0cnVjdCBhdWRpb19nYWluIG1HYWluID0ge307CiAgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUZvclZvbHVtZSA9IGZhbHNlOwogfTsKIAogLy8gQ29udmVyc2lvbiByb3V0aW5lcywgYWNjb3JkaW5nIHRvIEFpZGxDb252ZXJzaW9uLmggY29udmVudGlvbnMuCiBDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvR2Fpbj4+Ci1haWRsMmxlZ2FjeV9BdWRpb0dhaW4oY29uc3QgbWVkaWE6OkF1ZGlvR2FpbiYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW4+CithaWRsMmxlZ2FjeV9BdWRpb0dhaW4oY29uc3QgQXVkaW9HYWluOjpBaWRsJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9HYWluOjpBaWRsPgogbGVnYWN5MmFpZGxfQXVkaW9HYWluKGNvbnN0IHNwPEF1ZGlvR2Fpbj4mIGxlZ2FjeSk7CiAKLWNsYXNzIEF1ZGlvR2FpbnMgOiBwdWJsaWMgc3RkOjp2ZWN0b3I8c3A8QXVkaW9HYWluPiA+LCBwdWJsaWMgUGFyY2VsYWJsZQorY2xhc3MgQXVkaW9HYWlucyA6IHB1YmxpYyBzdGQ6OnZlY3RvcjxzcDxBdWRpb0dhaW4+PgogewogcHVibGljOgogICAgIGJvb2wgY2FuVXNlRm9yVm9sdW1lKCkgY29uc3QKQEAgLTEwMyw3ICsxMDEsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaW50MzJfdCBhZGQoY29uc3Qgc3A8QXVkaW9HYWluPiBnYWluKQorICAgIGludDMyX3QgYWRkKGNvbnN0IHNwPEF1ZGlvR2Fpbj4mIGdhaW4pCiAgICAgewogICAgICAgICBwdXNoX2JhY2soZ2Fpbik7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTExLDE0ICsxMDksMTUgQEAKIAogICAgIGJvb2wgZXF1YWxzKGNvbnN0IEF1ZGlvR2FpbnMmIG90aGVyKSBjb25zdDsKIAotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKKyAgICB1c2luZyBBaWRsID0gc3RkOjpwYWlyPAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvR2Fpbj4sCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9HYWluU3lzPj47CiB9OwogCiAvLyBDb252ZXJzaW9uIHJvdXRpbmVzLCBhY2NvcmRpbmcgdG8gQWlkbENvbnZlcnNpb24uaCBjb252ZW50aW9ucy4KIENvbnZlcnNpb25SZXN1bHQ8QXVkaW9HYWlucz4KLWFpZGwybGVnYWN5X0F1ZGlvR2FpbnMoY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvR2Fpbj4mIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9HYWluPj4KK2FpZGwybGVnYWN5X0F1ZGlvR2FpbnMoY29uc3QgQXVkaW9HYWluczo6QWlkbCYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvR2FpbnM6OkFpZGw+CiBsZWdhY3kyYWlkbF9BdWRpb0dhaW5zKGNvbnN0IEF1ZGlvR2FpbnMmIGxlZ2FjeSk7CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9ydC5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb3J0LmgKaW5kZXggMWNlZTFjOS4uZDZhMDk4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb3J0LmgKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb3J0LmgKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWcuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0V4dHJhQXVkaW9EZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vRXh0cmFBdWRpb0Rlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0dhaW4uaD4KQEAgLTMzLDcgKzMzLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBdWRpb1BvcnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlLCBwdWJsaWMgdmlydHVhbCBQYXJjZWxhYmxlCitjbGFzcyBBdWRpb1BvcnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiB7CiBwdWJsaWM6CiAgICAgQXVkaW9Qb3J0KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLCAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSkgOgpAQCAtNDcsNiArNDcsOSBAQAogICAgIGF1ZGlvX3BvcnRfdHlwZV90IGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQogICAgIGF1ZGlvX3BvcnRfcm9sZV90IGdldFJvbGUoKSBjb25zdCB7IHJldHVybiBtUm9sZTsgfQogCisgICAgdmlydHVhbCB2b2lkIHNldEZsYWdzKHVpbnQzMl90IGZsYWdzKTsKKyAgICB1aW50MzJfdCBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIHVzZUlucHV0Q2hhbm5lbE1hc2soKSA/IG1GbGFncy5pbnB1dCA6IG1GbGFncy5vdXRwdXQ7IH0KKwogICAgIHZvaWQgc2V0R2FpbnMoY29uc3QgQXVkaW9HYWlucyAmZ2FpbnMpIHsgbUdhaW5zID0gZ2FpbnM7IH0KICAgICBjb25zdCBBdWRpb0dhaW5zICZnZXRHYWlucygpIGNvbnN0IHsgcmV0dXJuIG1HYWluczsgfQogCkBAIC02OSwxMCArNzIsMTAgQEAKICAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgJmdldEF1ZGlvUHJvZmlsZXMoKSB7IHJldHVybiBtUHJvZmlsZXM7IH0KIAogICAgIHZvaWQgc2V0RXh0cmFBdWRpb0Rlc2NyaXB0b3JzKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkV4dHJhQXVkaW9EZXNjcmlwdG9yPiBleHRyYUF1ZGlvRGVzY3JpcHRvcnMpIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpFeHRyYUF1ZGlvRGVzY3JpcHRvcj4gZXh0cmFBdWRpb0Rlc2NyaXB0b3JzKSB7CiAgICAgICAgIG1FeHRyYUF1ZGlvRGVzY3JpcHRvcnMgPSBleHRyYUF1ZGlvRGVzY3JpcHRvcnM7CiAgICAgfQotICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpFeHRyYUF1ZGlvRGVzY3JpcHRvcj4gJmdldEV4dHJhQXVkaW9EZXNjcmlwdG9ycygpIHsKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6RXh0cmFBdWRpb0Rlc2NyaXB0b3I+ICZnZXRFeHRyYUF1ZGlvRGVzY3JpcHRvcnMoKSB7CiAgICAgICAgIHJldHVybiBtRXh0cmFBdWRpb0Rlc2NyaXB0b3JzOwogICAgIH0KIApAQCAtOTMsMTkgKzk2LDQ3IEBACiAgICAgICAgICAgICAgICAgKChtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSAmJiAobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspKTsKICAgICB9CiAKLSAgICB2b2lkIGR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CisgICAgYm9vbCBpc0RpcmVjdE91dHB1dCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gKG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmIChtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSAmJgorICAgICAgICAgICAgICAgICgobUZsYWdzLm91dHB1dCAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCk7CisgICAgfQorCisgICAgYm9vbCBpc01tYXAoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIChtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKQorICAgICAgICAgICAgICAgICYmICgoKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoKG1GbGFncy5vdXRwdXQgJiBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRKSAhPSAwKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKChtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgobUZsYWdzLmlucHV0ICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSAhPSAwKSkpOworICAgIH0KKworICAgIHZvaWQgZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzLAorICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRyYUluZm8gPSBudWxscHRyLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKIAogICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIGluZGVudCkgY29uc3Q7CiAKICAgICBib29sIGVxdWFscyhjb25zdCBzcDxBdWRpb1BvcnQ+JiBvdGhlcikgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0KICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsYWJsZShtZWRpYTo6QXVkaW9Qb3J0KiBwYXJjZWxhYmxlKSBjb25zdDsKICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgcGFyY2VsYWJsZSk7CiAKICAgICBBdWRpb0dhaW5zIG1HYWluczsgLy8gZ2FpbiBjb250cm9sbGVycworICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGlucHV0IG9yIG91dHB1dCBzdHJlYW1zIHRoYXQgY2FuIGJlIHNpbXVsdGFuZW91c2x5CisgICAgLy8gb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUuIEJ5IGNvbnZlbnRpb24gMCBtZWFucyBubyBsaW1pdC4gVG8gcmVzcGVjdAorICAgIC8vIGxlZ2FjeSBiZWhhdmlvciwgaW5pdGlhbGl6ZWQgdG8gMSBmb3Igb3V0cHV0IHByb2ZpbGVzIGFuZCAwIGZvciBpbnB1dAorICAgIC8vIHByb2ZpbGVzCisgICAgLy8gRklYTUU6IElPUHJvZmlsZSBjb2RlIHVzZWQgdGhlIHNhbWUgdmFsdWUgZm9yIGJvdGggY2FzZXMuCisgICAgdWludDMyX3QgbWF4T3BlbkNvdW50ID0gMTsKKyAgICAvLyBNYXhpbXVtIG51bWJlciBvZiBpbnB1dCBvciBvdXRwdXQgc3RyZWFtcyB0aGF0IGNhbiBiZSBzaW11bHRhbmVvdXNseQorICAgIC8vIGFjdGl2ZSBmb3IgdGhpcyBwcm9maWxlLiBCeSBjb252ZW50aW9uIDAgbWVhbnMgbm8gbGltaXQuIFRvIHJlc3BlY3QKKyAgICAvLyBsZWdhY3kgYmVoYXZpb3IsIGluaXRpYWxpemVkIHRvIDAgZm9yIG91dHB1dCBwcm9maWxlcyBhbmQgMSBmb3IgaW5wdXQKKyAgICAvLyBwcm9maWxlcworICAgIC8vIEZJWE1FOiBJT1Byb2ZpbGUgY29kZSB1c2VkIHRoZSBzYW1lIHZhbHVlIGZvciBib3RoIGNhc2VzLgorICAgIHVpbnQzMl90IG1heEFjdGl2ZUNvdW50ID0gMTsKKyAgICAvLyBNdXRlIGR1cmF0aW9uIHdoaWxlIGNoYW5naW5nIGRldmljZSBvbiB0aGlzIG91dHB1dCBwcm9maWxlLgorICAgIHVpbnQzMl90IHJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXMgPSAwOworCiBwcm90ZWN0ZWQ6CiAgICAgc3RkOjpzdHJpbmcgIG1OYW1lOwogICAgIGF1ZGlvX3BvcnRfdHlwZV90IG1UeXBlOwpAQCAtMTE0LDcgKzE0NSw4IEBACiAKICAgICAvLyBBdWRpbyBjYXBhYmlsaXRpZXMgdGhhdCBhcmUgZGVmaW5lZCBieSBoYXJkd2FyZSBkZXNjcmlwdG9ycyB3aGVuIHRoZSBmb3JtYXQgaXMgdW5yZWNvZ25pemVkCiAgICAgLy8gYnkgdGhlIHBsYXRmb3JtLCBlLmcuIHNob3J0IGF1ZGlvIGRlc2NyaXB0b3IgaW4gRURJRCBmb3IgSERNSS4KLSAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6RXh0cmFBdWRpb0Rlc2NyaXB0b3I+IG1FeHRyYUF1ZGlvRGVzY3JpcHRvcnM7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkV4dHJhQXVkaW9EZXNjcmlwdG9yPiBtRXh0cmFBdWRpb0Rlc2NyaXB0b3JzOworICAgIHVuaW9uIGF1ZGlvX2lvX2ZsYWdzIG1GbGFncyA9IHsgLm91dHB1dCA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUgfTsKIHByaXZhdGU6CiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPFQsIHN0cnVjdCBhdWRpb19wb3J0Pjo6dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgc3RydWN0IGF1ZGlvX3BvcnRfdjc+Ojp2YWx1ZSwgaW50PiA9IDA+CkBAIC0xMzAsNyArMTYyLDcgQEAKIH07CiAKIAotY2xhc3MgQXVkaW9Qb3J0Q29uZmlnIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSwgcHVibGljIHZpcnR1YWwgUGFyY2VsYWJsZQorY2xhc3MgQXVkaW9Qb3J0Q29uZmlnIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQogewogcHVibGljOgogICAgIHZpcnR1YWwgfkF1ZGlvUG9ydENvbmZpZygpID0gZGVmYXVsdDsKQEAgLTE0NywxNSArMTc5LDE2IEBACiAgICAgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGdldENoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrOyB9CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorICAgIGF1ZGlvX2lvX2ZsYWdzIGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9CiAKICAgICBib29sIGhhc0dhaW5Db250cm9sbGVyKGJvb2wgY2FuVXNlRm9yVm9sdW1lID0gZmFsc2UpIGNvbnN0OwogCi0gICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8QXVkaW9Qb3J0Q29uZmlnPiYgb3RoZXIpIGNvbnN0OworICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPEF1ZGlvUG9ydENvbmZpZz4mIG90aGVyLCBib29sIGlzSW5wdXQpIGNvbnN0OwogCi0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWxhYmxlKG1lZGlhOjpBdWRpb1BvcnRDb25maWcqIHBhcmNlbGFibGUpIGNvbnN0OwotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsYWJsZShjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnJiBwYXJjZWxhYmxlKTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsYWJsZSgKKyAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRDb25maWcqIHBhcmNlbGFibGUsIGJvb2wgaXNJbnB1dCkgY29uc3Q7CisgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWxhYmxlKAorICAgICAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydENvbmZpZyYgcGFyY2VsYWJsZSwgYm9vbCBpc0lucHV0KTsKIAogcHJvdGVjdGVkOgogICAgIHVuc2lnbmVkIGludCBtU2FtcGxpbmdSYXRlID0gMHU7CkBAIC0xNjMsNiArMTk2LDcgQEAKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyBtR2FpbiA9IHsgLmluZGV4ID0gLTEgfTsKKyAgICB1bmlvbiBhdWRpb19pb19mbGFncyBtRmxhZ3MgPSB7IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSB9OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9maWxlLmggYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2ZpbGUuaAppbmRleCA2YTM2ZTc4Li43OWRmZDEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2ZpbGUuaAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2ZpbGUuaApAQCAtMTcsMTEgKzE3LDEwIEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1Byb2ZpbGVTeXMuaD4KICNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtMjksNyArMjgsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEF1ZGlvUHJvZmlsZSBmaW5hbCA6IHB1YmxpYyBSZWZCYXNlLCBwdWJsaWMgUGFyY2VsYWJsZQorY2xhc3MgQXVkaW9Qcm9maWxlIGZpbmFsIDogcHVibGljIFJlZkJhc2UKIHsKIHB1YmxpYzoKICAgICBzdGF0aWMgc3A8QXVkaW9Qcm9maWxlPiBjcmVhdGVGdWxsRHluYW1pYyhhdWRpb19mb3JtYXRfdCBkeW5hbWljRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQpOwpAQCAtNzAsNyArNjksNyBAQAogICAgIHZvaWQgc2V0RHluYW1pY0Zvcm1hdChib29sIGR5bmFtaWMpIHsgbUlzRHluYW1pY0Zvcm1hdCA9IGR5bmFtaWM7IH0KICAgICBib29sIGlzRHluYW1pY0Zvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Jc0R5bmFtaWNGb3JtYXQ7IH0KIAotICAgIGJvb2wgaXNEeW5hbWljKCkgeyByZXR1cm4gbUlzRHluYW1pY0Zvcm1hdCB8fCBtSXNEeW5hbWljQ2hhbm5lbHMgfHwgbUlzRHluYW1pY1JhdGU7IH0KKyAgICBib29sIGlzRHluYW1pYygpIGNvbnN0IHsgcmV0dXJuIG1Jc0R5bmFtaWNGb3JtYXQgfHwgbUlzRHluYW1pY0NoYW5uZWxzIHx8IG1Jc0R5bmFtaWNSYXRlOyB9CiAKICAgICBhdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdCBnZXRFbmNhcHN1bGF0aW9uVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1FbmNhcHN1bGF0aW9uVHlwZTsgfQogICAgIHZvaWQgc2V0RW5jYXBzdWxhdGlvblR5cGUoYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3QgZW5jYXBzdWxhdGlvblR5cGUpIHsKQEAgLTc5LDEzICs3OCwxNyBAQAogCiAgICAgdm9pZCBkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogCi0gICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgb3RoZXIpIGNvbnN0OworICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIG90aGVyLCBib29sIGlnbm9yZUR5bmFtaWNGbGFncyA9IGZhbHNlKSBjb25zdDsKIAotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKKyAgICB1c2luZyBBaWRsID0gc3RkOjpwYWlyPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGUsIG1lZGlhOjpBdWRpb1Byb2ZpbGVTeXM+OworICAgIENvbnZlcnNpb25SZXN1bHQ8QWlkbD4gdG9QYXJjZWxhYmxlKGJvb2wgaXNJbnB1dCkgY29uc3Q7CisgICAgc3RhdGljIENvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9Qcm9maWxlPj4gZnJvbVBhcmNlbGFibGUoCisgICAgICAgICAgICBjb25zdCBBaWRsJiBhaWRsLCBib29sIGlzSW5wdXQpOwogCi0gICAgQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qcm9maWxlPiB0b1BhcmNlbGFibGUoKSBjb25zdDsKLSAgICBzdGF0aWMgQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb1Byb2ZpbGU+PiBmcm9tUGFyY2VsYWJsZShjb25zdCBtZWRpYTo6QXVkaW9Qcm9maWxlJiBwYXJjZWxhYmxlKTsKKyAgICBDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGU+CisgICAgICAgICAgICB0b0NvbW1vblBhcmNlbGFibGUoYm9vbCBpc0lucHV0KSBjb25zdDsKKyAgICBzdGF0aWMgQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb1Byb2ZpbGU+PiBmcm9tQ29tbW9uUGFyY2VsYWJsZSgKKyAgICAgICAgY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZSYgYWlkbCwgYm9vbCBpc0lucHV0KTsKIAogcHJpdmF0ZToKIApAQCAtMTA2LDExICsxMDksMTYgQEAKIAogLy8gQ29udmVyc2lvbiByb3V0aW5lcywgYWNjb3JkaW5nIHRvIEFpZGxDb252ZXJzaW9uLmggY29udmVudGlvbnMuCiBDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvUHJvZmlsZT4+Ci1haWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGUoY29uc3QgbWVkaWE6OkF1ZGlvUHJvZmlsZSYgYWlkbCk7Ci1Db252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1Byb2ZpbGU+Ci1sZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGUoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgbGVnYWN5KTsKK2FpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZShjb25zdCBBdWRpb1Byb2ZpbGU6OkFpZGwmIGFpZGwsIGJvb2wgaXNJbnB1dCk7CitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvUHJvZmlsZTo6QWlkbD4KK2xlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZShjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBsZWdhY3ksIGJvb2wgaXNJbnB1dCk7CiAKLWNsYXNzIEF1ZGlvUHJvZmlsZVZlY3RvciA6IHB1YmxpYyBzdGQ6OnZlY3RvcjxzcDxBdWRpb1Byb2ZpbGU+PiwgcHVibGljIFBhcmNlbGFibGUKK0NvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9Qcm9maWxlPj4KK2FpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZV9jb21tb24oY29uc3QgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZSYgYWlkbCwgYm9vbCBpc0lucHV0KTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZT4KK2xlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZV9jb21tb24oY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgbGVnYWN5LCBib29sIGlzSW5wdXQpOworCitjbGFzcyBBdWRpb1Byb2ZpbGVWZWN0b3IgOiBwdWJsaWMgc3RkOjp2ZWN0b3I8c3A8QXVkaW9Qcm9maWxlPj4KIHsKIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5BdWRpb1Byb2ZpbGVWZWN0b3IoKSA9IGRlZmF1bHQ7CkBAIC0xMzEsMjMgKzEzOSwyNSBAQAogICAgIGJvb2wgaGFzRHluYW1pY1Byb2ZpbGUoKSBjb25zdDsKICAgICBib29sIGhhc0R5bmFtaWNSYXRlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CiAKLSAgICBib29sIGNvbnRhaW5zKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIHByb2ZpbGUpIGNvbnN0OworICAgIGJvb2wgY29udGFpbnMoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgcHJvZmlsZSwgYm9vbCBpZ25vcmVEeW5hbWljRmxhZ3MgPSBmYWxzZSkgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIAogICAgIGJvb2wgZXF1YWxzKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgb3RoZXIpIGNvbnN0OworICAgIHZvaWQgYWRkQWxsVmFsaWRQcm9maWxlcyhjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIGF1ZGlvUHJvZmlsZXMpOwogCi0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOworICAgIHVzaW5nIEFpZGwgPSBzdGQ6OnBhaXI8CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlPiwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1Byb2ZpbGVTeXM+PjsKIH07CiAKIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEF1ZGlvUHJvZmlsZSAmbGVmdCwgY29uc3QgQXVkaW9Qcm9maWxlICZyaWdodCk7CiAKIC8vIENvbnZlcnNpb24gcm91dGluZXMsIGFjY29yZGluZyB0byBBaWRsQ29udmVyc2lvbi5oIGNvbnZlbnRpb25zLgogQ29udmVyc2lvblJlc3VsdDxBdWRpb1Byb2ZpbGVWZWN0b3I+Ci1haWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVWZWN0b3IoY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUHJvZmlsZT4mIGFpZGwpOwotQ29udmVyc2lvblJlc3VsdDxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qcm9maWxlPj4KLWxlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZVZlY3Rvcihjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIGxlZ2FjeSk7CithaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVWZWN0b3IoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yOjpBaWRsJiBhaWRsLCBib29sIGlzSW5wdXQpOworQ29udmVyc2lvblJlc3VsdDxBdWRpb1Byb2ZpbGVWZWN0b3I6OkFpZGw+CitsZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGVWZWN0b3IoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBsZWdhY3ksIGJvb2wgaXNJbnB1dCk7CiAKIEF1ZGlvUHJvZmlsZVZlY3RvciBpbnRlcnNlY3RBdWRpb1Byb2ZpbGVzKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgcHJvZmlsZXMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBwcm9maWxlczIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmgKaW5kZXggMTQwY2UzNi4uMWYwYzc2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oCkBAIC0zNiwxNiArMzYsMjEgQEAKIHB1YmxpYzoKICAgICAgLy8gTm90ZSB0aGF0IGVtcHR5IG5hbWUgcmVmZXJzIGJ5IGNvbnZlbnRpb24gdG8gYSBnZW5lcmljIGRldmljZS4KICAgICBleHBsaWNpdCBEZXZpY2VEZXNjcmlwdG9yQmFzZShhdWRpb19kZXZpY2VzX3QgdHlwZSk7Ci0gICAgRGV2aWNlRGVzY3JpcHRvckJhc2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKTsKLSAgICBleHBsaWNpdCBEZXZpY2VEZXNjcmlwdG9yQmFzZShjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2VUeXBlQWRkcik7CisgICAgRGV2aWNlRGVzY3JpcHRvckJhc2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLAorICAgICAgICAgICAgY29uc3QgRm9ybWF0VmVjdG9yICZlbmNvZGVkRm9ybWF0cyA9IEZvcm1hdFZlY3Rvcnt9KTsKKyAgICBEZXZpY2VEZXNjcmlwdG9yQmFzZShjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2VUeXBlQWRkciwKKyAgICAgICAgICAgIGNvbnN0IEZvcm1hdFZlY3RvciAmZW5jb2RlZEZvcm1hdHMgPSBGb3JtYXRWZWN0b3J7fSk7CiAKLSAgICB2aXJ0dWFsIH5EZXZpY2VEZXNjcmlwdG9yQmFzZSgpIHt9CisgICAgdmlydHVhbCB+RGV2aWNlRGVzY3JpcHRvckJhc2UoKSA9IGRlZmF1bHQ7CiAKICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlQWRkci5tVHlwZTsgfQogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGVBZGRyLmFkZHJlc3MoKTsgfQogICAgIHZvaWQgc2V0QWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcyk7CiAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZ2V0RGV2aWNlVHlwZUFkZHIoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZUFkZHI7IH0KIAorICAgIGNvbnN0IEZvcm1hdFZlY3RvciYgZW5jb2RlZEZvcm1hdHMoKSBjb25zdCB7IHJldHVybiBtRW5jb2RlZEZvcm1hdHM7IH0KKyAgICBib29sIHN1cHBvcnRzRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisKICAgICAvLyBBdWRpb1BvcnRDb25maWcKICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgewogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXVkaW9Qb3J0Kj4oY29uc3RfY2FzdDxEZXZpY2VEZXNjcmlwdG9yQmFzZSo+KHRoaXMpKTsKQEAgLTYwLDcgKzY1LDcgQEAKICAgICBzdGF0dXNfdCBzZXRFbmNhcHN1bGF0aW9uTW9kZXModWludDMyX3QgZW5jYXBzdWxhdGlvbk1vZGVzKTsKICAgICBzdGF0dXNfdCBzZXRFbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyh1aW50MzJfdCBlbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyk7CiAKLSAgICB2b2lkIGR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4LAorICAgIHZvaWQgZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzLAogICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRyYUluZm8gPSBudWxscHRyLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKICAgICB2b2lkIGxvZygpIGNvbnN0OwogCkBAIC03NCwxNCArNzksMTIgQEAKIAogICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3JCYXNlPiYgb3RoZXIpIGNvbnN0OwogCi0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotCiAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbGFibGUobWVkaWE6OkF1ZGlvUG9ydCogcGFyY2VsYWJsZSkgY29uc3Q7CiAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIHBhcmNlbGFibGUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBtRGV2aWNlVHlwZUFkZHI7CisgICAgRm9ybWF0VmVjdG9yICAgICAgICBtRW5jb2RlZEZvcm1hdHM7CiAgICAgdWludDMyX3QgbUVuY2Fwc3VsYXRpb25Nb2RlcyA9IDA7CiAgICAgdWludDMyX3QgbUVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzID0gMDsKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGJiOWE1ZjIuLjNmMWZiZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xMSwxMiArMTEsMjAgQEAKICAgICBuYW1lOiAiYXVkaW9mb3VuZGF0aW9uX3BhcmNlbGFibGVfdGVzdCIsCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAorICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKKyAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL3Rlc3RzL2F1ZGlvZm91bmRhdGlvbl9wYXJjZWxhYmxlX3Rlc3QuY3BwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL3Rlc3RzL2F1ZGlvZm91bmRhdGlvbl9wYXJjZWxhYmxlX3Rlc3QuY3BwCmluZGV4IDA2OGI1ZDguLjUwZDhkYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi90ZXN0cy9hdWRpb2ZvdW5kYXRpb25fcGFyY2VsYWJsZV90ZXN0LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vdGVzdHMvYXVkaW9mb3VuZGF0aW9uX3BhcmNlbGFibGVfdGVzdC5jcHAKQEAgLTUzLDcgKzUzLDcgQEAKIAogQXVkaW9HYWlucyBnZXRBdWRpb0dhaW5zRm9yVGVzdCgpIHsKICAgICBBdWRpb0dhaW5zIGF1ZGlvR2FpbnM7Ci0gICAgc3A8QXVkaW9HYWluPiBhdWRpb0dhaW4gPSBuZXcgQXVkaW9HYWluKDAgLyppbmRleCovLCBmYWxzZSAvKnVzZUluQ2hhbm5lbE1hc2sqLyk7CisgICAgc3A8QXVkaW9HYWluPiBhdWRpb0dhaW4gPSBuZXcgQXVkaW9HYWluKDAgLyppbmRleCovLCBmYWxzZSAvKmlzSW5wdXQqLyk7CiAgICAgYXVkaW9HYWluLT5zZXRNb2RlKEFVRElPX0dBSU5fTU9ERV9KT0lOVCk7CiAgICAgYXVkaW9HYWluLT5zZXRDaGFubmVsTWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOwogICAgIGF1ZGlvR2Fpbi0+c2V0TWluVmFsdWVJbk1iKC0zMjAwKTsKQEAgLTc1LDU3ICs3NSw3NCBAQAogICAgIHJldHVybiBhdWRpb1Byb2ZpbGVzOwogfQogCi1URVNUKEF1ZGlvRm91bmRhdGlvblBhcmNlbGFibGVUZXN0LCBQYXJjZWxpbmdBdWRpb0dhaW4pIHsKLSAgICBQYXJjZWwgZGF0YTsKLSAgICBBdWRpb0dhaW5zIGF1ZGlvR2FpbnMgPSBnZXRBdWRpb0dhaW5zRm9yVGVzdCgpOwotCi0gICAgQVNTRVJUX0VRKGRhdGEud3JpdGVQYXJjZWxhYmxlKGF1ZGlvR2FpbnMpLCBOT19FUlJPUik7Ci0gICAgZGF0YS5zZXREYXRhUG9zaXRpb24oMCk7Ci0gICAgQXVkaW9HYWlucyBhdWRpb0dhaW5zRnJvbVBhcmNlbDsKLSAgICBBU1NFUlRfRVEoZGF0YS5yZWFkUGFyY2VsYWJsZSgmYXVkaW9HYWluc0Zyb21QYXJjZWwpLCBOT19FUlJPUik7Ci0gICAgQVNTRVJUX1RSVUUoYXVkaW9HYWluc0Zyb21QYXJjZWwuZXF1YWxzKGF1ZGlvR2FpbnMpKTsKK1RFU1QoQXVkaW9Gb3VuZGF0aW9uUGFyY2VsYWJsZVRlc3QsIFBhcmNlbGluZ0F1ZGlvUHJvZmlsZSkgeworICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGdldEF1ZGlvUHJvZmlsZVZlY3RvckZvclRlc3QoKVswXTsKKyAgICBhdXRvIGNvbnYgPSBsZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGUocHJvZmlsZSwgZmFsc2UgLyppc0lucHV0Ki8pOworICAgIEFTU0VSVF9UUlVFKGNvbnYub2soKSk7CisgICAgYXV0byBjb252QmFjayA9IGFpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZShjb252LnZhbHVlKCksIGZhbHNlIC8qaXNJbnB1dCovKTsKKyAgICBBU1NFUlRfVFJVRShjb252QmFjay5vaygpKTsKKyAgICBBU1NFUlRfVFJVRShwcm9maWxlLT5lcXVhbHMoY29udkJhY2sudmFsdWUoKSkpOwogfQogCiBURVNUKEF1ZGlvRm91bmRhdGlvblBhcmNlbGFibGVUZXN0LCBQYXJjZWxpbmdBdWRpb1Byb2ZpbGVWZWN0b3IpIHsKLSAgICBQYXJjZWwgZGF0YTsKLSAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgYXVkaW9Qcm9maWxlcyA9IGdldEF1ZGlvUHJvZmlsZVZlY3RvckZvclRlc3QoKTsKKyAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgcHJvZmlsZXMgPSBnZXRBdWRpb1Byb2ZpbGVWZWN0b3JGb3JUZXN0KCk7CisgICAgYXV0byBjb252ID0gbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlVmVjdG9yKHByb2ZpbGVzLCBmYWxzZSAvKmlzSW5wdXQqLyk7CisgICAgQVNTRVJUX1RSVUUoY29udi5vaygpKTsKKyAgICBhdXRvIGNvbnZCYWNrID0gYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlVmVjdG9yKGNvbnYudmFsdWUoKSwgZmFsc2UgLyppc0lucHV0Ki8pOworICAgIEFTU0VSVF9UUlVFKGNvbnZCYWNrLm9rKCkpOworICAgIEFTU0VSVF9UUlVFKHByb2ZpbGVzLmVxdWFscyhjb252QmFjay52YWx1ZSgpKSk7Cit9CiAKLSAgICBBU1NFUlRfRVEoZGF0YS53cml0ZVBhcmNlbGFibGUoYXVkaW9Qcm9maWxlcyksIE5PX0VSUk9SKTsKLSAgICBkYXRhLnNldERhdGFQb3NpdGlvbigwKTsKLSAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgYXVkaW9Qcm9maWxlc0Zyb21QYXJjZWw7Ci0gICAgQVNTRVJUX0VRKGRhdGEucmVhZFBhcmNlbGFibGUoJmF1ZGlvUHJvZmlsZXNGcm9tUGFyY2VsKSwgTk9fRVJST1IpOwotICAgIEFTU0VSVF9UUlVFKGF1ZGlvUHJvZmlsZXNGcm9tUGFyY2VsLmVxdWFscyhhdWRpb1Byb2ZpbGVzKSk7CitURVNUKEF1ZGlvRm91bmRhdGlvblBhcmNlbGFibGVUZXN0LCBQYXJjZWxpbmdBdWRpb0dhaW4pIHsKKyAgICBzcDxBdWRpb0dhaW4+IGF1ZGlvR2FpbiA9IGdldEF1ZGlvR2FpbnNGb3JUZXN0KClbMF07CisgICAgYXV0byBjb252ID0gbGVnYWN5MmFpZGxfQXVkaW9HYWluKGF1ZGlvR2Fpbik7CisgICAgQVNTRVJUX1RSVUUoY29udi5vaygpKTsKKyAgICBhdXRvIGNvbnZCYWNrID0gYWlkbDJsZWdhY3lfQXVkaW9HYWluKGNvbnYudmFsdWUoKSk7CisgICAgQVNTRVJUX1RSVUUoY29udkJhY2sub2soKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9HYWluLT5lcXVhbHMoY29udkJhY2sudmFsdWUoKSkpOworfQorCitURVNUKEF1ZGlvRm91bmRhdGlvblBhcmNlbGFibGVUZXN0LCBQYXJjZWxpbmdBdWRpb0dhaW5zKSB7CisgICAgQXVkaW9HYWlucyBhdWRpb0dhaW5zID0gZ2V0QXVkaW9HYWluc0ZvclRlc3QoKTsKKyAgICBhdXRvIGNvbnYgPSBsZWdhY3kyYWlkbF9BdWRpb0dhaW5zKGF1ZGlvR2FpbnMpOworICAgIEFTU0VSVF9UUlVFKGNvbnYub2soKSk7CisgICAgYXV0byBjb252QmFjayA9IGFpZGwybGVnYWN5X0F1ZGlvR2FpbnMoY29udi52YWx1ZSgpKTsKKyAgICBBU1NFUlRfVFJVRShjb252QmFjay5vaygpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb0dhaW5zLmVxdWFscyhjb252QmFjay52YWx1ZSgpKSk7CiB9CiAKIFRFU1QoQXVkaW9Gb3VuZGF0aW9uUGFyY2VsYWJsZVRlc3QsIFBhcmNlbGluZ0F1ZGlvUG9ydCkgewotICAgIFBhcmNlbCBkYXRhOwogICAgIHNwPEF1ZGlvUG9ydD4gYXVkaW9Qb3J0ID0gbmV3IEF1ZGlvUG9ydCgKICAgICAgICAgICAgICJBdWRpb1BvcnROYW1lIiwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwgQVVESU9fUE9SVF9ST0xFX1NJTkspOwogICAgIGF1ZGlvUG9ydC0+c2V0R2FpbnMoZ2V0QXVkaW9HYWluc0ZvclRlc3QoKSk7CiAgICAgYXVkaW9Qb3J0LT5zZXRBdWRpb1Byb2ZpbGVzKGdldEF1ZGlvUHJvZmlsZVZlY3RvckZvclRlc3QoKSk7CiAKLSAgICBBU1NFUlRfRVEoZGF0YS53cml0ZVBhcmNlbGFibGUoKmF1ZGlvUG9ydCksIE5PX0VSUk9SKTsKLSAgICBkYXRhLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0IHBhcmNlbGFibGU7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBhdWRpb1BvcnQtPndyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlKSk7CiAgICAgc3A8QXVkaW9Qb3J0PiBhdWRpb1BvcnRGcm9tUGFyY2VsID0gbmV3IEF1ZGlvUG9ydCgKICAgICAgICAgICAgICIiLCBBVURJT19QT1JUX1RZUEVfTk9ORSwgQVVESU9fUE9SVF9ST0xFX05PTkUpOwotICAgIEFTU0VSVF9FUShkYXRhLnJlYWRQYXJjZWxhYmxlKGF1ZGlvUG9ydEZyb21QYXJjZWwuZ2V0KCkpLCBOT19FUlJPUik7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBhdWRpb1BvcnRGcm9tUGFyY2VsLT5yZWFkRnJvbVBhcmNlbGFibGUocGFyY2VsYWJsZSkpOwogICAgIEFTU0VSVF9UUlVFKGF1ZGlvUG9ydEZyb21QYXJjZWwtPmVxdWFscyhhdWRpb1BvcnQpKTsKIH0KIAogVEVTVChBdWRpb0ZvdW5kYXRpb25QYXJjZWxhYmxlVGVzdCwgUGFyY2VsaW5nQXVkaW9Qb3J0Q29uZmlnKSB7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gZmFsc2U7CiAgICAgUGFyY2VsIGRhdGE7CiAgICAgc3A8QXVkaW9Qb3J0Q29uZmlnPiBhdWRpb1BvcnRDb25maWcgPSBuZXcgQXVkaW9Qb3J0Q29uZmlnVGVzdFN0dWIoKTsKICAgICBhdWRpb1BvcnRDb25maWctPmFwcGx5QXVkaW9Qb3J0Q29uZmlnKCZURVNUX0FVRElPX1BPUlRfQ09ORklHKTsKLQotICAgIEFTU0VSVF9FUShkYXRhLndyaXRlUGFyY2VsYWJsZSgqYXVkaW9Qb3J0Q29uZmlnKSwgTk9fRVJST1IpOworICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRDb25maWcgcGFyY2VsYWJsZXt9OworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgYXVkaW9Qb3J0Q29uZmlnLT53cml0ZVRvUGFyY2VsYWJsZSgmcGFyY2VsYWJsZSwgaXNJbnB1dCkpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgZGF0YS53cml0ZVBhcmNlbGFibGUocGFyY2VsYWJsZSkpOwogICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKDApOworICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnRDb25maWcgcGFyY2VsYWJsZUZyb21QYXJjZWx7fTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGRhdGEucmVhZFBhcmNlbGFibGUoJnBhcmNlbGFibGVGcm9tUGFyY2VsKSk7CiAgICAgc3A8QXVkaW9Qb3J0Q29uZmlnPiBhdWRpb1BvcnRDb25maWdGcm9tUGFyY2VsID0gbmV3IEF1ZGlvUG9ydENvbmZpZ1Rlc3RTdHViKCk7Ci0gICAgQVNTRVJUX0VRKGRhdGEucmVhZFBhcmNlbGFibGUoYXVkaW9Qb3J0Q29uZmlnRnJvbVBhcmNlbC5nZXQoKSksIE5PX0VSUk9SKTsKLSAgICBBU1NFUlRfVFJVRShhdWRpb1BvcnRDb25maWdGcm9tUGFyY2VsLT5lcXVhbHMoYXVkaW9Qb3J0Q29uZmlnKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBhdWRpb1BvcnRDb25maWdGcm9tUGFyY2VsLT5yZWFkRnJvbVBhcmNlbGFibGUoCisgICAgICAgICAgICAgICAgICAgIHBhcmNlbGFibGVGcm9tUGFyY2VsLCBpc0lucHV0KSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9Qb3J0Q29uZmlnRnJvbVBhcmNlbC0+ZXF1YWxzKGF1ZGlvUG9ydENvbmZpZywgaXNJbnB1dCkpOwogfQogCiBURVNUKEF1ZGlvRm91bmRhdGlvblBhcmNlbGFibGVUZXN0LCBQYXJjZWxpbmdEZXZpY2VEZXNjcmlwdG9yQmFzZSkgewotICAgIFBhcmNlbCBkYXRhOwogICAgIHNwPERldmljZURlc2NyaXB0b3JCYXNlPiBkZXNjID0gbmV3IERldmljZURlc2NyaXB0b3JCYXNlKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUik7CiAgICAgZGVzYy0+c2V0R2FpbnMoZ2V0QXVkaW9HYWluc0ZvclRlc3QoKSk7CiAgICAgZGVzYy0+c2V0QXVkaW9Qcm9maWxlcyhnZXRBdWRpb1Byb2ZpbGVWZWN0b3JGb3JUZXN0KCkpOwpAQCAtMTM1LDEwICsxNTIsMTAgQEAKICAgICBBU1NFUlRfRVEoZGVzYy0+c2V0RW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMoCiAgICAgICAgICAgICBBVURJT19FTkNBUFNVTEFUSU9OX01FVEFEQVRBX1RZUEVfQUxMX1BPU0lUSU9OX0JJVFMpLCBOT19FUlJPUik7CiAKLSAgICBBU1NFUlRfRVEoZGF0YS53cml0ZVBhcmNlbGFibGUoKmRlc2MpLCBOT19FUlJPUik7Ci0gICAgZGF0YS5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgbWVkaWE6OkF1ZGlvUG9ydCBwYXJjZWxhYmxlOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgZGVzYy0+d3JpdGVUb1BhcmNlbGFibGUoJnBhcmNlbGFibGUpKTsKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4gZGVzY0Zyb21QYXJjZWwgPSBuZXcgRGV2aWNlRGVzY3JpcHRvckJhc2UoQVVESU9fREVWSUNFX05PTkUpOwotICAgIEFTU0VSVF9FUShkYXRhLnJlYWRQYXJjZWxhYmxlKGRlc2NGcm9tUGFyY2VsLmdldCgpKSwgTk9fRVJST1IpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgZGVzY0Zyb21QYXJjZWwtPnJlYWRGcm9tUGFyY2VsYWJsZShwYXJjZWxhYmxlKSk7CiAgICAgQVNTRVJUX1RSVUUoZGVzY0Zyb21QYXJjZWwtPmVxdWFscyhkZXNjKSk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwCmluZGV4IGJkMjRjODQuLjVmNjNlOGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icApAQCAtMjcsOSArMjcsMTEgQEAKICAgICAgICAgImxpYmF1ZGlvaGFsQDUuMCIsCiAgICAgICAgICJsaWJhdWRpb2hhbEA2LjAiLAogICAgICAgICAibGliYXVkaW9oYWxANy4wIiwKKyAgICAgICAgImxpYmF1ZGlvaGFsQDcuMSIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJsb2ciLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCmluZGV4IDMyNWE1NDcuLjVhZDI2ZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxzdHJpbmc+CisKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmg+CiAKQEAgLTIxLDggKzIzLDEwIEBACiAKIC8vIHN0YXRpYwogc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6c3RyaW5nX2xpdGVyYWxzOwogICAgIHJldHVybiBjcmVhdGVQcmVmZXJyZWRJbXBsPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPigKLSAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvIiwgIklEZXZpY2VzRmFjdG9yeSIpOworICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8icywgIklEZXZpY2VzRmFjdG9yeSJzKSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKCJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdCJzLCAiSUVmZmVjdHNGYWN0b3J5InMpKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCmluZGV4IGJjM2I0YzEuLjhhMjhmNjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxzdHJpbmc+CisKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmg+CiAKQEAgLTIxLDggKzIzLDEwIEBACiAKIC8vIHN0YXRpYwogc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6c3RyaW5nX2xpdGVyYWxzOwogICAgIHJldHVybiBjcmVhdGVQcmVmZXJyZWRJbXBsPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPigKLSAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdCIsICJJRWZmZWN0c0ZhY3RvcnkiKTsKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKCJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdCJzLCAiSUVmZmVjdHNGYWN0b3J5InMpLAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8icywgIklEZXZpY2VzRmFjdG9yeSJzKSk7CiB9CiAKIC8vIHN0YXRpYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuY3BwCmluZGV4IGU0MjBkMDcuLjU5MGZlYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTE2LDYgKzE2LDEwIEBACiAKICNkZWZpbmUgTE9HX1RBRyAiRmFjdG9yeUhhbEhpZGwiCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKwogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmg+CiAKICNpbmNsdWRlIDxkbGZjbi5oPgpAQCAtMjgsMTQgKzMyLDE2IEBACiBuYW1lc3BhY2UgYW5kcm9pZDo6ZGV0YWlsIHsKIAogbmFtZXNwYWNlIHsKLS8qKiBTdXBwb3J0ZWQgSEFMIHZlcnNpb25zLCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlLgorLyoqIFN1cHBvcnRlZCBIQUwgdmVyc2lvbnMsIGZyb20gbW9zdCByZWNlbnQgdG8gbGVhc3QgcmVjZW50LgogICovCi1jb25zdCBjaGFyKiBzQXVkaW9IQUxWZXJzaW9uc1tdID0gewotICAgICI3LjAiLAotICAgICI2LjAiLAotICAgICI1LjAiLAotICAgICI0LjAiLAotICAgIG51bGxwdHIKKyNkZWZpbmUgQ09OQ19WRVJTSU9OKG1haiwgbWluKSAjbWFqICIuIiAjbWluCisjZGVmaW5lIERFQ0xBUkVfVkVSU0lPTihtYWosIG1pbikgc3RkOjptYWtlX3BhaXIoc3RkOjptYWtlX3BhaXIobWFqLCBtaW4pLCBDT05DX1ZFUlNJT04obWFqLCBtaW4pKQorc3RhdGljIGNvbnN0ZXhwciBzdGQ6OmFycmF5PHN0ZDo6cGFpcjxzdGQ6OnBhaXI8aW50LCBpbnQ+LCBjb25zdCBjaGFyKj4sIDU+IHNBdWRpb0hBTFZlcnNpb25zID0geworICAgIERFQ0xBUkVfVkVSU0lPTig3LCAxKSwKKyAgICBERUNMQVJFX1ZFUlNJT04oNywgMCksCisgICAgREVDTEFSRV9WRVJTSU9OKDYsIDApLAorICAgIERFQ0xBUkVfVkVSU0lPTig1LCAwKSwKKyAgICBERUNMQVJFX1ZFUlNJT04oNCwgMCkKIH07CiAKIGJvb2wgY3JlYXRlSGFsU2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgdmVyc2lvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGludGVyZmFjZSwKQEAgLTkzLDExICs5OSwyMiBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAotdm9pZCogY3JlYXRlUHJlZmVycmVkSW1wbChjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGludGVyZmFjZSkgewotICAgIGZvciAoYXV0byB2ZXJzaW9uID0gZGV0YWlsOjpzQXVkaW9IQUxWZXJzaW9uczsgdmVyc2lvbiAhPSBudWxscHRyOyArK3ZlcnNpb24pIHsKLSAgICAgICAgdm9pZCogcmF3SW50ZXJmYWNlID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKGhhc0hhbFNlcnZpY2UocGFja2FnZSwgKnZlcnNpb24sIGludGVyZmFjZSkKLSAgICAgICAgICAgICAgICAmJiBjcmVhdGVIYWxTZXJ2aWNlKCp2ZXJzaW9uLCBpbnRlcmZhY2UsICZyYXdJbnRlcmZhY2UpKSB7Cit2b2lkKiBjcmVhdGVQcmVmZXJyZWRJbXBsKGNvbnN0IEludGVyZmFjZU5hbWUmIGlmYWNlLCBjb25zdCBJbnRlcmZhY2VOYW1lJiBzaWJsaW5nSWZhY2UpIHsKKyAgICBhdXRvIGZpbmRNb3N0UmVjZW50VmVyc2lvbiA9IFtdKGNvbnN0IEludGVyZmFjZU5hbWUmIGlmYWNlKSB7CisgICAgICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoZGV0YWlsOjpzQXVkaW9IQUxWZXJzaW9ucy5iZWdpbigpLCBkZXRhaWw6OnNBdWRpb0hBTFZlcnNpb25zLmVuZCgpLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBhdXRvJiB2KSB7IHJldHVybiBoYXNIYWxTZXJ2aWNlKGlmYWNlLmZpcnN0LCB2LnNlY29uZCwgaWZhY2Uuc2Vjb25kKTsgfSk7CisgICAgfTsKKyAgICBhdXRvIGlmYWNlVmVyc2lvbkl0ID0gZmluZE1vc3RSZWNlbnRWZXJzaW9uKGlmYWNlKTsKKyAgICBhdXRvIHNpYmxpbmdWZXJzaW9uSXQgPSBmaW5kTW9zdFJlY2VudFZlcnNpb24oc2libGluZ0lmYWNlKTsKKyAgICBpZiAoaWZhY2VWZXJzaW9uSXQgIT0gZGV0YWlsOjpzQXVkaW9IQUxWZXJzaW9ucy5lbmQoKSAmJgorICAgICAgICAgICAgc2libGluZ1ZlcnNpb25JdCAhPSBkZXRhaWw6OnNBdWRpb0hBTFZlcnNpb25zLmVuZCgpICYmCisgICAgICAgICAgICAvLyBzYW1lIG1ham9yIHZlcnNpb24KKyAgICAgICAgICAgIGlmYWNlVmVyc2lvbkl0LT5maXJzdC5maXJzdCA9PSBzaWJsaW5nVmVyc2lvbkl0LT5maXJzdC5maXJzdCkgeworICAgICAgICBzdGQ6OnN0cmluZyBsaWJyYXJ5VmVyc2lvbiA9CisgICAgICAgICAgICAgICAgaWZhY2VWZXJzaW9uSXQtPmZpcnN0ID49IHNpYmxpbmdWZXJzaW9uSXQtPmZpcnN0ID8KKyAgICAgICAgICAgICAgICBpZmFjZVZlcnNpb25JdC0+c2Vjb25kIDogc2libGluZ1ZlcnNpb25JdC0+c2Vjb25kOworICAgICAgICB2b2lkKiByYXdJbnRlcmZhY2U7CisgICAgICAgIGlmIChjcmVhdGVIYWxTZXJ2aWNlKGxpYnJhcnlWZXJzaW9uLCBpZmFjZS5zZWNvbmQsICZyYXdJbnRlcmZhY2UpKSB7CiAgICAgICAgICAgICByZXR1cm4gcmF3SW50ZXJmYWNlOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGliYXVkaW9oYWwvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTVhOWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxMiBAQAoreworICAicHJlc3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkN0c05hdGl2ZU1lZGlhQUF1ZGlvVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIiA6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm5hdGl2ZW1lZGlhLmFhdWRpby5BQXVkaW9UZXN0cyNBQXVkaW9CYXNpYy4qIgorICAgICAgICB9CisgICAgICBdCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAKaW5kZXggYTJjNmU4YS4uZDMwODgzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQW5kcm9pZC5icApAQCAtNywyMyArNywyOCBAQAogICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKIH0KIAotY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJsaWJhdWRpb2hhbF9kZWZhdWx0IiwKLQorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiYXVkaW9fY29yZV9oYWxfY2xpZW50X3NvdXJjZXMiLAogICAgIHNyY3M6IFsKLSAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKLQotICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKKyAgICAgICAgIkNvcmVDb252ZXJzaW9uSGVscGVySGlkbC5jcHAiLAogICAgICAgICAiRGV2aWNlSGFsSGlkbC5jcHAiLAogICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCIsCi0gICAgICAgICJFZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCIsCi0gICAgICAgICJFZmZlY3RIYWxIaWRsLmNwcCIsCi0gICAgICAgICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIiwKICAgICAgICAgIlN0cmVhbUhhbEhpZGwuY3BwIiwKICAgICBdLAorfQorCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJhdWRpb19lZmZlY3RfaGFsX2NsaWVudF9zb3VyY2VzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJFZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCIsCisgICAgICAgICJFZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCisgICAgXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJhdWRpb2hhbF9kZWZhdWx0IiwKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLApAQCAtNTAsNiArNTUsNyBAQAogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLnV0aWxAYWxsLXZlcnNpb25zIiwKQEAgLTY1LDYgKzcxLDExIEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmF1ZGlvaGFsQDQuMCIsCiAgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjphdWRpb19jb3JlX2hhbF9jbGllbnRfc291cmNlcyIsCisgICAgICAgICI6YXVkaW9fZWZmZWN0X2hhbF9jbGllbnRfc291cmNlcyIsCisgICAgICAgICJFZmZlY3RzRmFjdG9yeUhhbEhpZGxFbnRyeS5jcHAiLAorICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDQuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAtdXRpbCIsCkBAIC04Myw2ICs5NCwxMSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJhdWRpb2hhbEA1LjAiLAogICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvaGFsX2RlZmF1bHQiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICI6YXVkaW9fY29yZV9oYWxfY2xpZW50X3NvdXJjZXMiLAorICAgICAgICAiOmF1ZGlvX2VmZmVjdF9oYWxfY2xpZW50X3NvdXJjZXMiLAorICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsRW50cnkuY3BwIiwKKyAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA1LjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANS4wLXV0aWwiLApAQCAtMTAxLDYgKzExNywxMSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJhdWRpb2hhbEA2LjAiLAogICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvaGFsX2RlZmF1bHQiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICI6YXVkaW9fY29yZV9oYWxfY2xpZW50X3NvdXJjZXMiLAorICAgICAgICAiOmF1ZGlvX2VmZmVjdF9oYWxfY2xpZW50X3NvdXJjZXMiLAorICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsRW50cnkuY3BwIiwKKyAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA2LjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANi4wLXV0aWwiLApAQCAtMTE2LDE2ICsxMzcsNDEgQEAKICAgICBdCiB9CiAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWwuZWZmZWN0QDcuMCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjphdWRpb19lZmZlY3RfaGFsX2NsaWVudF9zb3VyY2VzIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA3LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANy4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANy4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDcuMC11dGlsIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTciLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmF1ZGlvaGFsQDcuMCIsCiAgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAotICAgIHNoYXJlZF9saWJzOiBbCisgICAgc3JjczogWworICAgICAgICAiOmF1ZGlvX2NvcmVfaGFsX2NsaWVudF9zb3VyY2VzIiwKKyAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbEVudHJ5LmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANy4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDcuMC1lbnVtcyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA3LjAtdXRpbCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA3LjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANy4wLXV0aWwiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A3LjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A3LjAtdXRpbCIsCisgICAgICAgICJsaWJhdWRpb2hhbC5lZmZlY3RANy4wIiwKICAgICBdLAogICAgIGNmbGFnczogWwogICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTciLApAQCAtMTMzLDMgKzE3OSwzMSBAQAogICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCiAgICAgXQogfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDcuMSIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjphdWRpb19jb3JlX2hhbF9jbGllbnRfc291cmNlcyIsCisgICAgICAgICJFZmZlY3RzRmFjdG9yeUhhbEhpZGxFbnRyeS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDcuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA3LjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA3LjEtZW51bXMiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANy4xLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANy4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDcuMC11dGlsIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANy4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANy4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANy4xLXV0aWwiLAorICAgICAgICAibGliYXVkaW9oYWwuZWZmZWN0QDcuMCIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ETUFKT1JfVkVSU0lPTj03IiwKKyAgICAgICAgIi1ETUlOT1JfVkVSU0lPTj0xIiwKKyAgICAgICAgIi1EQ09NTU9OX1RZUEVTX01JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItRENPUkVfVFlQRVNfTUlOT1JfVkVSU0lPTj0wIiwKKyAgICAgICAgIi1pbmNsdWRlIGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvbk1hY3JvLmgiLAorICAgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuaAppbmRleCA1OTEyMmM3Li42ZTJjODMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oCkBAIC0xNywzMSArMTcsMjUgQEAKICNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKICNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKIAotI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi90eXBlcy5oKQorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKICNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgQ29yZVJlc3VsdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UmVzdWx0OwotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogCit0ZW1wbGF0ZTx0eXBlbmFtZSBIYWxSZXN1bHQ+CiBjbGFzcyBDb252ZXJzaW9uSGVscGVySGlkbCB7CiAgIHByb3RlY3RlZDoKLSAgICBzdGF0aWMgc3RhdHVzX3Qga2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cyk7Ci0gICAgc3RhdGljIHN0YXR1c190IHBhcmFtZXRlcnNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcyk7Ci0gICAgc3RhdGljIHZvaWQgcGFyYW1ldGVyc1RvSGFsKGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKTsKKyAgICB1c2luZyBIYWxSZXN1bHRDb252ZXJ0ZXIgPSBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KGNvbnN0IEhhbFJlc3VsdCYpPjsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtQ2xhc3NOYW1lOwogCi0gICAgQ29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKTsKKyAgICBDb252ZXJzaW9uSGVscGVySGlkbChzdGQ6OnN0cmluZ192aWV3IGNsYXNzTmFtZSwgSGFsUmVzdWx0Q29udmVydGVyIHJlc3VsdENvbnYpCisgICAgICAgICAgICA6IG1DbGFzc05hbWUoY2xhc3NOYW1lKSwgbVJlc3VsdENvbnZlcnRlcihyZXN1bHRDb252KSB7fQogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48Uj4mIHJldCwgVCAqcmV0dmFsKSB7CisgICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjxSPiYgcmV0LCBUICpyZXR2YWwpIHsKICAgICAgICAgaWYgKHJldC5pc09rKCkpIHsKICAgICAgICAgICAgIC8vIFRoaXMgd2F5IGl0IGFsc28gd29ya3MgZm9yIGVudW0gY2xhc3MgdG8gdW5zY29wZWQgZW51bSBjb252ZXJzaW9uLgogICAgICAgICAgICAgKnJldHZhbCA9IHN0YXRpY19jYXN0PFQ+KHN0YXRpY19jYXN0PFI+KHJldCkpOwpAQCAtNTEsMzggKzQ1LDQyIEBACiAgICAgfQogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCkgeworICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjxUPiYgcmV0KSB7CiAgICAgICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IE9LIDogRkFJTEVEX1RSQU5TQUNUSU9OOwogICAgIH0KIAotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxDb3JlUmVzdWx0PiYgcmV0KSB7CisgICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjxIYWxSZXN1bHQ+JiByZXQpIHsKICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IG1SZXN1bHRDb252ZXJ0ZXIocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKICAgICB9CiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQsIENvcmVSZXN1bHQgcmV0dmFsKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPFQ+JiByZXQsIEhhbFJlc3VsdCByZXR2YWwpIHsKICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IG1SZXN1bHRDb252ZXJ0ZXIocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsYXNzTmFtZTsKICAgICB9CiAKICAgcHJpdmF0ZToKLSAgICBjb25zdCBjaGFyKiBtQ2xhc3NOYW1lOworICAgIEhhbFJlc3VsdENvbnZlcnRlciBtUmVzdWx0Q29udmVydGVyOwogCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgQ29yZVJlc3VsdCYgcmVzdWx0KTsKLQotICAgIHZvaWQgZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbik7CisgICAgdm9pZCBlbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIEFMT0dFKCIlcyAlcCAlczogJXMgKGZyb20gcnBjKSIsIG1DbGFzc05hbWUuY19zdHIoKSwgdGhpcywgZnVuY05hbWUsIGRlc2NyaXB0aW9uKTsKKyAgICB9CiB9OwogCi19ICAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvcmVDb252ZXJzaW9uSGVscGVySGlkbC5jcHAKc2ltaWxhcml0eSBpbmRleCA4MSUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsLmNwcAppbmRleCAzMmVhYTMxLi4yYWM4YTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvcmVDb252ZXJzaW9uSGVscGVySGlkbC5jcHAKQEAgLTIxLDE2ICsyMSwxNiBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIkNvcmVDb252ZXJzaW9uSGVscGVySGlkbC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogCi11c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Ci11c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNPTU1PTl9UWVBFU19DUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjsKIAogLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6a2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cykgeworc3RhdHVzX3QgQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsOjprZXlzRnJvbUhhbCgKKyAgICAgICAgY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cykgewogICAgIEF1ZGlvUGFyYW1ldGVyIGhhbEtleXMoa2V5cyk7CiAgICAgaWYgKGhhbEtleXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7CiAgICAgaGlkbEtleXMtPnJlc2l6ZShoYWxLZXlzLnNpemUoKSk7CkBAIC03NSw3ICs3NSw3IEBACiB9CiAKIC8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNGcm9tSGFsKAorc3RhdHVzX3QgQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzRnJvbUhhbCgKICAgICAgICAgY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKSB7CiAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zKGt2UGFpcnMpOwogICAgIGlmIChwYXJhbXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7CkBAIC05MSw3ICs5MSw3IEBACiB9CiAKIC8vIHN0YXRpYwotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc1RvSGFsKAordm9pZCBDb3JlQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNUb0hhbCgKICAgICAgICAgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXM7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKTsgKytpKSB7CkBAIC0xMDAsMjUgKzEwMCwyOCBAQAogICAgIHZhbHVlcy0+c2V0VG8ocGFyYW1zLnRvU3RyaW5nKCkpOwogfQogCi1Db252ZXJzaW9uSGVscGVySGlkbDo6Q29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKQotICAgICAgICA6IG1DbGFzc05hbWUoY2xhc3NOYW1lKSB7CitDb3JlQ29udmVyc2lvbkhlbHBlckhpZGw6OkNvcmVDb252ZXJzaW9uSGVscGVySGlkbChzdGQ6OnN0cmluZ192aWV3IGNsYXNzTmFtZSkKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbDxDb3JlUmVzdWx0PihjbGFzc05hbWUsIGFuYWx5emVSZXN1bHQpIHt9CisKKy8vIHN0YXRpYwordm9pZCBDb3JlQ29udmVyc2lvbkhlbHBlckhpZGw6OmFyZ3NGcm9tSGFsKAorICAgICAgICBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxBcmdzKSB7CisgICAgaGlkbEFyZ3MtPnJlc2l6ZShhcmdzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgKytpKSB7CisgICAgICAgICgqaGlkbEFyZ3MpW2ldID0gU3RyaW5nOChhcmdzW2ldKS5jX3N0cigpOworICAgIH0KIH0KIAogLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgeworc3RhdHVzX3QgQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IENvcmVSZXN1bHQmIHJlc3VsdCkgewogICAgIHN3aXRjaCAocmVzdWx0KSB7CiAgICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOwogICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKICAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorICAgIHJldHVybiBOT19JTklUOwogfQogCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjplbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7Ci0gICAgQUxPR0UoIiVzICVwICVzOiAlcyAoZnJvbSBycGMpIiwgbUNsYXNzTmFtZSwgdGhpcywgZnVuY05hbWUsIGRlc2NyaXB0aW9uKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db3JlQ29udmVyc2lvbkhlbHBlckhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkNzZmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DT1JFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vQ09SRV9UWVBFU19GSUxFX1ZFUlNJT04vdHlwZXMuaCkKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT046OlBhcmFtZXRlclZhbHVlOwordXNpbmcgQ29yZVJlc3VsdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjpSZXN1bHQ7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsIDogcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsPENvcmVSZXN1bHQ+IHsKKyAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyBzdGF0dXNfdCBrZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgcGFyYW1ldGVyc0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKTsKKyAgICBzdGF0aWMgdm9pZCBwYXJhbWV0ZXJzVG9IYWwoY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpOworICAgIHN0YXRpYyB2b2lkIGFyZ3NGcm9tSGFsKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEFyZ3MpOworCisgICAgQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsKHN0ZDo6c3RyaW5nX3ZpZXcgY2xhc3NOYW1lKTsKKworICBwcml2YXRlOgorICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IENvcmVSZXN1bHQmIHJlc3VsdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9DT1JFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAKaW5kZXggMDJkNjZhZS4uMGNkZjYyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuY3BwCkBAIC0yMCw4ICsyMCwxMCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9UaW1lQ2hlY2suaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JUHJpbWFyeURldmljZS5oKQpAQCAtMzAsMjcgKzMyLDQzIEBACiAjaW5jbHVkZSA8dXRpbC9Db3JlVXRpbHMuaD4KIAogI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCiAjaW5jbHVkZSAiUGFyYW1ldGVyVXRpbHMuaCIKICNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q09NTU9OX1RZUEVTX0NQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6OkVudW1CaXRmaWVsZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkNvcmVVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6Q29yZVV0aWxzOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAotdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOwotdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDT01NT05fVFlQRVNfQ1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT047CiAKLXVzaW5nIEVmZmVjdEhhbEhpZGwgPSA6OmFuZHJvaWQ6OmVmZmVjdDo6Q1BQX1ZFUlNJT046OkVmZmVjdEhhbEhpZGw7CisjZGVmaW5lIFRJTUVfQ0hFQ0soKSBhdXRvIHRpbWVDaGVjayA9IFwKKyAgICAgICAgbWVkaWF1dGlsczo6bWFrZVRpbWVDaGVja1N0YXRzRm9yQ2xhc3NNZXRob2QoZ2V0Q2xhc3NOYW1lKCksIF9fZnVuY19fKQogCi1EZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZSIpLCBtRGV2aWNlKGRldmljZSksCi0gICAgICAgICAgbVByaW1hcnlEZXZpY2UoSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKGRldmljZSkpIHsKK0RldmljZUhhbEhpZGw6OkRldmljZUhhbEhpZGwoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlPiYgZGV2aWNlKQorICAgICAgICA6IENvcmVDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlSGFsSGlkbCIpLCBtRGV2aWNlKGRldmljZSkgeworfQorCitEZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKAorICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklQcmltYXJ5RGV2aWNlPiYgZGV2aWNlKQorICAgICAgICA6IENvcmVDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlSGFsSGlkbCIpLAorI2lmIE1BSk9SX1ZFUlNJT04gPD0gNiB8fCAoTUFKT1JfVkVSU0lPTiA9PSA3ICYmIE1JTk9SX1ZFUlNJT04gPT0gMCkKKyAgICAgICAgICBtRGV2aWNlKGRldmljZSksCisjZW5kaWYKKyAgICAgICAgICBtUHJpbWFyeURldmljZShkZXZpY2UpIHsKKyNpZiBNQUpPUl9WRVJTSU9OID09IDcgJiYgTUlOT1JfVkVSU0lPTiA9PSAxCisgICAgYXV0byBnZXREZXZpY2VSZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0RGV2aWNlKCk7CisgICAgaWYgKGdldERldmljZVJldC5pc09rKCkpIHsKKyAgICAgICAgbURldmljZSA9IGdldERldmljZVJldDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ2FsbCB0byBJUHJpbWFyeURldmljZS5nZXREZXZpY2UgaGFzIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgIGdldERldmljZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyNlbmRpZgogfQogCiBEZXZpY2VIYWxIaWRsOjp+RGV2aWNlSGFsSGlkbCgpIHsKQEAgLTcwLDIyICs4OCwyNiBAQAogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjppbml0Q2hlY2soKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJpbml0Q2hlY2siLCBtRGV2aWNlLT5pbml0Q2hlY2soKSk7CiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgbURldmljZS0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSkpOwogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBSZXN1bHQgcmV0dmFsOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNYXN0ZXJWb2x1bWUoCkBAIC05OSwxNyArMTIxLDIwIEBACiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TW9kZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNb2RlKEF1ZGlvTW9kZShtb2RlKSkpOwogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7CiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgUmVzdWx0IHJldHZhbDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljTXV0ZSgKQEAgLTEyMywxMSArMTQ4LDEzIEBACiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBSZXN1bHQgcmV0dmFsOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNYXN0ZXJNdXRlKApAQCAtMTQxLDYgKzE2OCw3IEBACiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7CkBAIC0xNTEsNiArMTc5LDcgQEAKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgdmFsdWVzLT5jbGVhcigpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKQEAgLTE3MSw2ICsyMDAsNyBAQAogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCiAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CiAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgdHJ1ZSAvKmlzSW5wdXQqLywgJmhpZGxDb25maWcpOwpAQCAtMTkzLDYgKzIyMyw3IEBACiAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKICAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gQ29yZVV0aWxzOjpkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VUeXBlLCBhZGRyZXNzLCAmaGlkbERldmljZSk7CkBAIC0yMDQsMTcgKzIzNSwzMiBAQAogICAgICAgICAgICAgc3RhdHVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQorCisjaWYgIShNQUpPUl9WRVJTSU9OID09IDcgJiYgTUlOT1JfVkVSU0lPTiA9PSAxKQorICAgIC8vVE9ETzogYi8xOTM0OTYxODAgdXNlIHNwYXRpYWxpemVyIGZsYWcgYXQgYXVkaW8gSEFMIHdoZW4gYXZhaWxhYmxlCisgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1NQQVRJQUxJWkVSKSAhPSAwKSB7CisgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19TUEFUSUFMSVpFUik7CisgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KQorICAgICAgICAgICAgICAgIChmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgfCBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUik7CisgICAgfQorI2VuZGlmCisKICAgICBDb3JlVXRpbHM6OkF1ZGlvT3V0cHV0RmxhZ3MgaGlkbEZsYWdzOwogICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBDb3JlVXRpbHM6OmF1ZGlvT3V0cHV0RmxhZ3NGcm9tSGFsKGZsYWdzLCAmaGlkbEZsYWdzKTsgc3RhdHVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyNpZiBNQUpPUl9WRVJTSU9OID09IDcgJiYgTUlOT1JfVkVSU0lPTiA9PSAxCisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5PdXRwdXRTdHJlYW1fN18xKAorI2Vsc2UKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKKyNlbmRpZgogICAgICAgICAgICAgaGFuZGxlLCBoaWRsRGV2aWNlLCBoaWRsQ29uZmlnLCBoaWRsRmxhZ3MsCiAjaWYgTUFKT1JfVkVSU0lPTiA+PSA0CiAgICAgICAgICAgICB7fSAvKiBtZXRhZGF0YSAqLywKICNlbmRpZgotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtT3V0PiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7CisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbU91dD4mIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewogICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CiAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CiAgICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOwpAQCAtMjM0LDYgKzI4MCw3IEBACiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCiAgICAgICAgIGNvbnN0IGNoYXIgKm91dHB1dERldmljZUFkZHJlc3MsCiAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwogICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBDb3JlVXRpbHM6OmRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKQEAgLTI4NCw3ICszMzEsOSBAQAogI2VuZGlmCiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5JbnB1dFN0cmVhbSgKICAgICAgICAgICAgIGhhbmRsZSwgaGlkbERldmljZSwgaGlkbENvbmZpZywgaGlkbEZsYWdzLCBzaW5rTWV0YWRhdGEsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1Jbj4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgeworICAgICAgICAgICAgWyZdKFJlc3VsdCByLAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjpJU3RyZWFtSW4+JiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwogICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewogICAgICAgICAgICAgICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxIaWRsKHJlc3VsdCk7CkBAIC0yOTUsNiArMzQ0LDcgQEAKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0F1ZGlvUGF0Y2hlcyIsIG1EZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCksIHN1cHBvcnRzUGF0Y2hlcyk7CiB9CkBAIC0zMDUsNiArMzU1LDcgQEAKICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIGlmIChwYXRjaCA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOwogCkBAIC0zNTAsNiArNDAxLDcgQEAKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbGVhc2VBdWRpb1BhdGNoIiwgbURldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gpKTsKIH0KQEAgLTM3MiwxMCArNDI0LDEyIEBACiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICByZXR1cm4gZ2V0QXVkaW9Qb3J0SW1wbChwb3J0KTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSB7CisgICAgVElNRV9DSEVDSygpOwogI2lmIE1BSk9SX1ZFUlNJT04gPj0gNwogICAgIHJldHVybiBnZXRBdWRpb1BvcnRJbXBsKHBvcnQpOwogI2Vsc2UKQEAgLTM5Niw2ICs0NTAsNyBAQAogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgQXVkaW9Qb3J0Q29uZmlnIGhpZGxDb25maWc7CiAgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKQEAgLTQxMCw2ICs0NjUsNyBAQAogfQogI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgUmVzdWx0IHJldHZhbDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljcm9waG9uZXMoCkBAIC00MzAsMTAgKzQ4NiwxMCBAQAogI2lmIE1BSk9SX1ZFUlNJT04gPj0gNgogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6YWRkRGV2aWNlRWZmZWN0KAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZSwgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZERldmljZUVmZmVjdCIsIG1EZXZpY2UtPmFkZERldmljZUVmZmVjdCgKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEF1ZGlvUG9ydEhhbmRsZT4oZGV2aWNlKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxBdWRpb1BvcnRIYW5kbGU+KGRldmljZSksIGVmZmVjdC0+ZWZmZWN0SWQoKSkpOwogfQogI2Vsc2UKIHN0YXR1c190IERldmljZUhhbEhpZGw6OmFkZERldmljZUVmZmVjdCgKQEAgLTQ0NSwxMCArNTAxLDEwIEBACiAjaWYgTUFKT1JfVkVSU0lPTiA+PSA2CiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpyZW1vdmVEZXZpY2VFZmZlY3QoCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRGV2aWNlRWZmZWN0IiwgbURldmljZS0+cmVtb3ZlRGV2aWNlRWZmZWN0KAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXVkaW9Qb3J0SGFuZGxlPihkZXZpY2UpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEF1ZGlvUG9ydEhhbmRsZT4oZGV2aWNlKSwgZWZmZWN0LT5lZmZlY3RJZCgpKSk7CiB9CiAjZWxzZQogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6cmVtb3ZlRGV2aWNlRWZmZWN0KApAQCAtNDU3LDExICs1MTMsNTQgQEAKIH0KICNlbmRpZgogCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpkdW1wKGludCBmZCkgeworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0Q29ubmVjdGVkU3RhdGUoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQsIGJvb2wgY29ubmVjdGVkKSB7CisgICAgVElNRV9DSEVDSygpOworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworI2lmIE1BSk9SX1ZFUlNJT04gPT0gNyAmJiBNSU5PUl9WRVJTSU9OID09IDEKKyAgICBpZiAoc3VwcG9ydHNTZXRDb25uZWN0ZWRTdGF0ZTdfMSkgeworICAgICAgICBBdWRpb1BvcnQgaGlkbFBvcnQ7CisgICAgICAgIGlmIChzdGF0dXNfdCByZXN1bHQgPSBIaWRsVXRpbHM6OmF1ZGlvUG9ydEZyb21IYWwoKnBvcnQsICZoaWRsUG9ydCk7IHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRGV2aWNlLT5zZXRDb25uZWN0ZWRTdGF0ZV83XzEoaGlkbFBvcnQsIGNvbm5lY3RlZCk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSB8fCByZXQgIT0gUmVzdWx0OjpOT1RfU1VQUE9SVEVEKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Q29ubmVjdGVkU3RhdGVfN18xIiwgcmV0KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN1cHBvcnRzU2V0Q29ubmVjdGVkU3RhdGU3XzEgPSBmYWxzZTsKKyAgICB9CisjZW5kaWYKKyAgICBEZXZpY2VBZGRyZXNzIGhpZGxBZGRyZXNzOworICAgIGlmIChzdGF0dXNfdCByZXN1bHQgPSBDb3JlVXRpbHM6OmRldmljZUFkZHJlc3NGcm9tSGFsKAorICAgICAgICAgICAgICAgICAgICBwb3J0LT5leHQuZGV2aWNlLnR5cGUsIHBvcnQtPmV4dC5kZXZpY2UuYWRkcmVzcywgJmhpZGxBZGRyZXNzKTsKKyAgICAgICAgICAgIHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Q29ubmVjdGVkU3RhdGUiLCBtRGV2aWNlLT5zZXRDb25uZWN0ZWRTdGF0ZShoaWRsQWRkcmVzcywgY29ubmVjdGVkKSk7Cit9CisKK2Vycm9yOjpSZXN1bHQ8YXVkaW9faHdfc3luY190PiBEZXZpY2VIYWxIaWRsOjpnZXRId0F2U3luYygpIHsKKyAgICBUSU1FX0NIRUNLKCk7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgYXVkaW9faHdfc3luY190IHZhbHVlOworICAgIFJlc3VsdCByZXN1bHQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldEh3QXZTeW5jKFsmdmFsdWUsICZyZXN1bHRdKFJlc3VsdCByLCBhdWRpb19od19zeW5jX3QgdikgeworICAgICAgICB2YWx1ZSA9IHY7CisgICAgICAgIHJlc3VsdCA9IHI7CisgICAgfSk7CisgICAgUkVUVVJOX0lGX0VSUk9SKHByb2Nlc3NSZXR1cm4oImdldEh3QXZTeW5jIiwgcmV0LCByZXN1bHQpKTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwogICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxBcmdzOworICAgIGFyZ3NGcm9tSGFsKGFyZ3MsICZoaWRsQXJncyk7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmRlYnVnKGhpZGxIYW5kbGUsIGhpZGxBcmdzKTsKICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKIAogICAgIC8vIFRPRE8oYi8xMTE5OTc4NjcsIGIvMTc3MjcxOTU4KSAgV29ya2Fyb3VuZCAtIHJlbW92ZSB3aGVuIGZpeGVkLgpAQCAtNDc4LDUgKzU3Nyw0IEBACiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOwogfQogCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaAppbmRleCAyYzg0N2NmLi5mNjUxOWI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaApAQCAtMjAsMTcgKzIwLDEzIEBACiAjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lEZXZpY2UuaCkKICNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVByaW1hcnlEZXZpY2UuaCkKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaD4KIAotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVByaW1hcnlEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisjaW5jbHVkZSAiQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CiAKLWNsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK2NsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsCiB7CiAgIHB1YmxpYzoKICAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgpAQCAtMTE5LDE1ICsxMTUsNDAgQEAKICAgICBzdGF0dXNfdCBhZGREZXZpY2VFZmZlY3QoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2UsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCByZW1vdmVEZXZpY2VFZmZlY3QoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2UsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworICAgIHN0YXR1c190IGdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zIF9fdW51c2VkKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGUgSEFMIHF1ZXJ5IHdoZW4gbW92aW5nIHRvIEFJREwgSEFMLgorICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaW50MzJfdCBnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGUgSEFMIHF1ZXJ5IHdoZW4gbW92aW5nIHRvIEFJREwgSEFMLgorICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaW50MzJfdCBnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoZSBIQUwgcXVlcnkgd2hlbiBtb3ZpbmcgdG8gQUlETCBIQUwuCisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzZXRDb25uZWN0ZWRTdGF0ZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCwgYm9vbCBjb25uZWN0ZWQpIG92ZXJyaWRlOworCisgICAgZXJyb3I6OlJlc3VsdDxhdWRpb19od19zeW5jX3Q+IGdldEh3QXZTeW5jKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CiAKICAgcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOwotICAgIHNwPElEZXZpY2U+IG1EZXZpY2U7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOyAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgorICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZT4gbURldmljZTsKKyAgICAvLyBOdWxsIGlmIGl0J3Mgbm90IGEgcHJpbWFyeSBkZXZpY2UuCisgICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJUHJpbWFyeURldmljZT4gbVByaW1hcnlEZXZpY2U7CisgICAgYm9vbCBzdXBwb3J0c1NldENvbm5lY3RlZFN0YXRlN18xID0gdHJ1ZTsKIAogICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpOworICAgIGV4cGxpY2l0IERldmljZUhhbEhpZGwoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlPiYgZGV2aWNlKTsKKyAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKAorICAgICAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJUHJpbWFyeURldmljZT4mIGRldmljZSk7CiAKICAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgogICAgIHZpcnR1YWwgfkRldmljZUhhbEhpZGwoKTsKQEAgLTEzNSw3ICsxNTYsNiBAQAogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBIYWxQb3J0PiBzdGF0dXNfdCBnZXRBdWRpb1BvcnRJbXBsKEhhbFBvcnQgKnBvcnQpOwogfTsKIAotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmN2RjMWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKLQotRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCi0gICAgICAgIDogbURldihkZXYpIHsKLX0KLQotRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKLSAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOwotICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKLSAgICBtRGV2ID0gMDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKLSAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewotICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICBoYW5kbGUsIGRldmljZVR5cGUsIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgYWRkcmVzcyk7Ci0gICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlVHlwZSwgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7Ci0gICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgewotICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7Ci0gICAgfQotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3V0OwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IC8qb3V0cHV0RGV2aWNlKi8sCi0gICAgICAgIGNvbnN0IGNoYXIgKi8qb3V0cHV0RGV2aWNlQWRkcmVzcyovLAotICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7Ci0gICAgYXVkaW9fc3RyZWFtX2luX3QgKmhhbFN0cmVhbTsKLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4ICIKLSAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIHNvdXJjZSAlZCIsCi0gICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgYWRkcmVzcywgc291cmNlKTsKLSAgICBpbnQgb3BlblJlc3VsdCA9IG1EZXYtPm9wZW5faW5wdXRfc3RyZWFtKAotICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBjb25maWcsICZoYWxTdHJlYW0sIGZsYWdzLCBhZGRyZXNzLCBzb3VyY2UpOwotICAgIGlmIChvcGVuUmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7Ci0gICAgfQotICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3VsdCwgaW5TdHJlYW0pOwotICAgIHJldHVybiBvcGVuUmVzdWx0OwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7Ci0gICAgKnN1cHBvcnRzUGF0Y2hlcyA9IHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPmNyZWF0ZV9hdWRpb19wYXRjaCgKLSAgICAgICAgICAgICAgICBtRGV2LCBudW1fc291cmNlcywgc291cmNlcywgbnVtX3NpbmtzLCBzaW5rcywgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgewotICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICByZXR1cm4gbURldi0+cmVsZWFzZV9hdWRpb19wYXRjaChtRGV2LCBwYXRjaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgewotICAgIHJldHVybiBtRGV2LT5nZXRfYXVkaW9fcG9ydChtRGV2LCBwb3J0KTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgewotI2lmIE1BSk9SX1ZFUlNJT04gPj0gNwotICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgewotICAgICAgICAvLyBnZXRfYXVkaW9fcG9ydF92NyBpcyBtYW5kYXRvcnkgaWYgbGVnYWN5IEhBTCBzdXBwb3J0IHRoaXMgQVBJIHZlcnNpb24uCi0gICAgICAgIHJldHVybiBtRGV2LT5nZXRfYXVkaW9fcG9ydF92NyhtRGV2LCBwb3J0KTsKLSAgICB9Ci0jZW5kaWYKLSAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBhdWRpb1BvcnQgPSB7fTsKLSAgICBhdWRpb19wb3B1bGF0ZV9hdWRpb19wb3J0KHBvcnQsICZhdWRpb1BvcnQpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9ydCgmYXVkaW9Qb3J0KTsKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGF1ZGlvX3BvcHVsYXRlX2F1ZGlvX3BvcnRfdjcoJmF1ZGlvUG9ydCwgcG9ydCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCi0gICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLSNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9taWNyb3Bob25lcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc2l6ZV90IGFjdHVhbF9taWNzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlQ7Ci0gICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IG1pY19hcnJheVtBVURJT19NSUNST1BIT05FX01BWF9DT1VOVF07Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbURldi0+Z2V0X21pY3JvcGhvbmVzKG1EZXYsICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7Ci0gICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOwotICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLSNlbmRpZgotCi0vLyBMb2NhbCBIQUwgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCBlZmZlY3RzCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6YWRkRGV2aWNlRWZmZWN0KAotICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZSBfX3VudXNlZCwgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QgX191bnVzZWQpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpyZW1vdmVEZXZpY2VFZmZlY3QoCi0gICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlIF9fdW51c2VkLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCBfX3VudXNlZCkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgewotICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Ci19Ci0KLXZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7Ci0gICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YjUxMGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewotCi1jbGFzcyBEZXZpY2VIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAotICAgICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOwotCi0gICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7Ci0KLSAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKLQotICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICBzdGF0dXNfdCBhZGREZXZpY2VFZmZlY3QoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2UsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCByZW1vdmVEZXZpY2VFZmZlY3QoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2UsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgdm9pZCBjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCk7Ci0gICAgdm9pZCBjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbik7Ci0KLSAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbURldi0+Y29tbW9uLnZlcnNpb247IH0KLQotICBwcml2YXRlOgotICAgIGF1ZGlvX2h3X2RldmljZV90ICptRGV2OwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldik7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgotICAgIHZpcnR1YWwgfkRldmljZUhhbExvY2FsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcAppbmRleCAxYzBlYWNiLi40MDY5YTZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCkBAIC0yNiwxOSArMjYsMTcgQEAKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKICNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCiAjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UmVzdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT046OlJlc3VsdDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CiB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTWFuYWdlcjsKIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWFuYWdlcjo6VjFfMDo6SVNlcnZpY2VOb3RpZmljYXRpb247CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CiAKIGNsYXNzIFNlcnZpY2VOb3RpZmljYXRpb25MaXN0ZW5lciA6IHB1YmxpYyBJU2VydmljZU5vdGlmaWNhdGlvbiB7CiAgIHB1YmxpYzoKQEAgLTExNSwxNCArMTEzLDM3IEBACiAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKICAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CiAgICAgZm9yIChjb25zdCBhdXRvJiBmYWN0b3J5IDogZmFjdG9yaWVzKSB7Ci0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBmYWN0b3J5LT5vcGVuRGV2aWNlKAotICAgICAgICAgICAgICAgIGhpZGxJZCwKLSAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElEZXZpY2U+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOworICAgICAgICBSZXR1cm48dm9pZD4gcmV0OworICAgICAgICBpZiAoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBJbiBWNy4xIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGNhc3QgSURldmljZSBiYWNrIHRvIElQcmltYXJ5RGV2aWNlLAorICAgICAgICAgICAgLy8gdGh1cyBvcGVuUHJpbWFyeURldmljZSBtdXN0IGJlIHVzZWQuCisjaWYgTUFKT1JfVkVSU0lPTiA9PSA3ICYmIE1JTk9SX1ZFUlNJT04gPT0gMQorICAgICAgICAgICAgcmV0ID0gZmFjdG9yeS0+b3BlblByaW1hcnlEZXZpY2VfN18xKAorI2Vsc2UKKyAgICAgICAgICAgIHJldCA9IGZhY3RvcnktPm9wZW5QcmltYXJ5RGV2aWNlKAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVByaW1hcnlEZXZpY2U+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisjaWYgTUFKT1JfVkVSU0lPTiA9PSA3ICYmIE1JTk9SX1ZFUlNJT04gPT0gMQorICAgICAgICAgICAgcmV0ID0gZmFjdG9yeS0+b3BlbkRldmljZV83XzEoCisjZWxzZQorICAgICAgICAgICAgcmV0ID0gZmFjdG9yeS0+b3BlbkRldmljZSgKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBoaWRsSWQsCisgICAgICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZT4mIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQogICAgICAgICBpZiAoIXJldC5pc09rKCkpIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CiAgICAgICAgIHN3aXRjaCAocmV0dmFsKSB7CiAgICAgICAgICAgICAvLyBEZXZpY2Ugd2FzIGZvdW5kIGFuZCB3YXMgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5LgpAQCAtMTc4LDcgKzE5OSw4IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIERldmljZXNGYWN0b3J5SGFsSGlkbDo6YWRkRGV2aWNlRmFjdG9yeShzcDxJRGV2aWNlc0ZhY3Rvcnk+IGZhY3RvcnksIGJvb2wgbmVlZFRvTm90aWZ5KSB7Cit2b2lkIERldmljZXNGYWN0b3J5SGFsSGlkbDo6YWRkRGV2aWNlRmFjdG9yeSgKKyAgICAgICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlc0ZhY3Rvcnk+IGZhY3RvcnksIGJvb2wgbmVlZFRvTm90aWZ5KSB7CiAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZSBpbnN0YW5jZSBpcyBvd25lZAogICAgIC8vIGJ5IEF1ZGlvRmxpbmdlciBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgogICAgIGZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKQEAgLTE5OCwxMCArMjIwLDE2IEBACiAgICAgfQogfQogCi1zdGQ6OnZlY3RvcjxzcDxJRGV2aWNlc0ZhY3Rvcnk+PiBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6OmNvcHlEZXZpY2VGYWN0b3JpZXMoKSB7CitzdGQ6OnZlY3RvcjxzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2VzRmFjdG9yeT4+CisgICAgICAgIERldmljZXNGYWN0b3J5SGFsSGlkbDo6Y29weURldmljZUZhY3RvcmllcygpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1EZXZpY2VGYWN0b3JpZXM7CiB9CiAKLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCisvLyBNYWluIGVudHJ5LXBvaW50IHRvIHRoZSBzaGFyZWQgbGlicmFyeS4KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgdm9pZCogY3JlYXRlSURldmljZXNGYWN0b3J5KCkgeworICAgIGF1dG8gc2VydmljZSA9IGhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpOworICAgIHJldHVybiBzZXJ2aWNlID8gbmV3IERldmljZXNGYWN0b3J5SGFsSGlkbChzZXJ2aWNlKSA6IG51bGxwdHI7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCmluZGV4IDZmODRlZmUuLmZmZDIyOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApAQCAtMzAsNyArMzAsNiBAQAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlc0ZhY3Rvcnk7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CiAKIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQogewpAQCAtNDYsNiArNDUsOCBAQAogCiAgICAgc3RhdHVzX3Qgc2V0Q2FsbGJhY2tPbmNlKHNwPERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2s+IGNhbGxiYWNrKSBvdmVycmlkZTsKIAorICAgIGZsb2F0IGdldEhhbFZlcnNpb24oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBNQUpPUl9WRVJTSU9OICsgKGZsb2F0KU1JTk9SX1ZFUlNJT04gLyAxMDsgfQorCiAgIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIFNlcnZpY2VOb3RpZmljYXRpb25MaXN0ZW5lcjsKICAgICB2b2lkIGFkZERldmljZUZhY3Rvcnkoc3A8SURldmljZXNGYWN0b3J5PiBmYWN0b3J5LCBib29sIG5lZWRUb05vdGlmeSk7CkBAIC01OSw3ICs2MCw2IEBACiAgICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgPSBkZWZhdWx0OwogfTsKIAotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZThkODUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewotCi1EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoc3A8SURldmljZXNGYWN0b3J5PiBoaWRsRmFjdG9yeSkKLSAgICAgICAgOiBtTG9jYWxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkpLAotICAgICAgICAgIG1IaWRsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKGhpZGxGYWN0b3J5KSkgewotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBpZiAobUhpZGxGYWN0b3J5ICE9IDAgJiYgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQLCBuYW1lKSAhPSAwICYmCi0gICAgICAgIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfSEVBUklOR19BSUQsIG5hbWUpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1IaWRsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOwotICAgIH0KLSAgICByZXR1cm4gbUxvY2FsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6Z2V0SGFsUGlkcyhzdGQ6OnZlY3RvcjxwaWRfdD4gKnBpZHMpIHsKLSAgICBpZiAobUhpZGxGYWN0b3J5ICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1IaWRsRmFjdG9yeS0+Z2V0SGFsUGlkcyhwaWRzKTsKLSAgICB9Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6c2V0Q2FsbGJhY2tPbmNlKHNwPERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2s+IGNhbGxiYWNrKSB7Ci0gICAgaWYgKG1IaWRsRmFjdG9yeSkgewotICAgICAgICByZXR1cm4gbUhpZGxGYWN0b3J5LT5zZXRDYWxsYmFja09uY2UoY2FsbGJhY2spOwotICAgIH0KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCi0KLWV4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgdm9pZCogY3JlYXRlSURldmljZXNGYWN0b3J5KCkgewotICAgIGF1dG8gc2VydmljZSA9IGhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpOwotICAgIHJldHVybiBzZXJ2aWNlID8gbmV3IENQUF9WRVJTSU9OOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZChzZXJ2aWNlKSA6IG51bGxwdHI7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4YTFmYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICi0KLSNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSURldmljZXNGYWN0b3J5LmgpCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZXNGYWN0b3J5OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoc3A8SURldmljZXNGYWN0b3J5PiBoaWRsRmFjdG9yeSk7Ci0KLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGdldEhhbFBpZHMoc3RkOjp2ZWN0b3I8cGlkX3Q+ICpwaWRzKSBvdmVycmlkZTsKLQotICAgICAgICAgICAgc3RhdHVzX3Qgc2V0Q2FsbGJhY2tPbmNlKHNwPERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2s+IGNhbGxiYWNrKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtTG9jYWxGYWN0b3J5OwotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtSGlkbEZhY3Rvcnk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2N2ZmNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewotCi1zdGF0aWMgc3RhdHVzX3QgbG9hZF9hdWRpb19pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSwgYXVkaW9faHdfZGV2aWNlX3QgKipkZXYpCi17Ci0gICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKLSAgICBpbnQgcmM7Ci0KLSAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCAmbW9kKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IGxvYWQgYXVkaW8gaHcgbW9kdWxlICVzLiVzICglcykiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgcmMgPSBhdWRpb19od19kZXZpY2Vfb3Blbihtb2QsIGRldik7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBvcGVuIGF1ZGlvIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIGlmICgoKmRldiktPmNvbW1vbi52ZXJzaW9uIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX01JTikgewotICAgICAgICBBTE9HRSgiJXMgd3JvbmcgYXVkaW8gaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIF9fZnVuY19fLCAoKmRldiktPmNvbW1vbi52ZXJzaW9uKTsKLSAgICAgICAgcmMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGF1ZGlvX2h3X2RldmljZV9jbG9zZSgqZGV2KTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLQotb3V0OgotICAgICpkZXYgPSBOVUxMOwotICAgIHJldHVybiByYzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2OwotICAgIHN0YXR1c190IHJjID0gbG9hZF9hdWRpb19pbnRlcmZhY2UobmFtZSwgJmRldik7Ci0gICAgaWYgKHJjID09IE9LKSB7Ci0gICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsTG9jYWwoZGV2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiZjM2Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZ2V0SGFsUGlkcyhzdGQ6OnZlY3RvcjxwaWRfdD4gKnBpZHMgX191bnVzZWQpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHNldENhbGxiYWNrT25jZShzcDxEZXZpY2VzRmFjdG9yeUhhbENhbGxiYWNrPiBjYWxsYmFjayBfX3VudXNlZCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQotfTsKLQotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcAppbmRleCA1MzY3OTcyLi45ZDVmNzJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCiAjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CkBAIC0zMSw3ICszMCw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBlZmZlY3QgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAogLy8gc3RhdGljCiB1aW50NjRfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptYWtlVW5pcXVlSWQoKSB7CkBAIC0xNDQsNSArMTQyLDQgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgZWZmZWN0Ci19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaAppbmRleCA0ODI2ODEzLi5hOWRmNjhiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApAQCAtMjgsNyArMjgsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgZWZmZWN0IHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CiAKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKIApAQCAtNzQsNyArNzMsNiBAQAogICAgIHN0YXR1c190IGluaXQoKTsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9IC8vIG5hbWVzcGFjZSBlZmZlY3QKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTRmNzljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbC5jcHAKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiSGFsSGlkbCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkVmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGw6OkVmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsKHN0ZDo6c3RyaW5nX3ZpZXcgY2xhc3NOYW1lKQorICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsPEVmZmVjdFJlc3VsdD4oY2xhc3NOYW1lLCBhbmFseXplUmVzdWx0KSB7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgRWZmZWN0UmVzdWx0JiByZXN1bHQpIHsKKyAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICBjYXNlIEVmZmVjdFJlc3VsdDo6T0s6IHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBFZmZlY3RSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIEVmZmVjdFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgY2FzZSBFZmZlY3RSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIGNhc2UgRWZmZWN0UmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGNhc2UgRWZmZWN0UmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3MWQxMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0L0ZJTEVfVkVSU0lPTi90eXBlcy5oKQorCit1c2luZyBFZmZlY3RSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6UmVzdWx0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEVmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsIDogcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsPEVmZmVjdFJlc3VsdD4geworICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgRWZmZWN0UmVzdWx0JiByZXN1bHQpOworCisgICAgRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwoc3RkOjpzdHJpbmdfdmlldyBjbGFzc05hbWUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAKaW5kZXggNTFhZDE0Ni4uZmRmZTIyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KICNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9UaW1lQ2hlY2suaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPHV0aWwvRWZmZWN0VXRpbHMuaD4KQEAgLTM2LDEzICszNywxNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgZWZmZWN0IHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CiAKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKIAorI2RlZmluZSBUSU1FX0NIRUNLKCkgYXV0byB0aW1lQ2hlY2sgPSBcCisgICAgICAgIG1lZGlhdXRpbHM6Om1ha2VUaW1lQ2hlY2tTdGF0c0ZvckNsYXNzTWV0aG9kKGdldENsYXNzTmFtZSgpLCBfX2Z1bmNfXykKKwogRWZmZWN0SGFsSGlkbDo6RWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCkKLSAgICAgICAgOiBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RJZChlZmZlY3RJZCksIG1CdWZmZXJzQ2hhbmdlZCh0cnVlKSwgbUVmR3JvdXAobnVsbHB0cikgeworICAgICAgICA6IEVmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsKCJFZmZlY3RIYWxIaWRsIiksCisgICAgICAgICAgbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSksIG1FZkdyb3VwKG51bGxwdHIpIHsKICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGhhbERlc2NyaXB0b3J7fTsKICAgICBpZiAoRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigmaGFsRGVzY3JpcHRvcikgPT0gTk9fRVJST1IpIHsKICAgICAgICAgbUlzSW5wdXQgPSAoaGFsRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MpID09IEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0M7CkBAIC02MCwyMCArNjQsOSBAQAogICAgIH0KIH0KIAotLy8gc3RhdGljCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBjYXNlIFJlc3VsdDo6UkVTVUxUX1RPT19CSUc6IHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOwotICAgIH0KLX0KLQogc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7CisgICAgVElNRV9DSEVDSygpOworCiAgICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKICAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1JbkJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbUluQnVmZmVyLmdldCgpOwpAQCAtODYsNiArNzksOCBAQAogfQogCiBzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7CisgICAgVElNRV9DSEVDSygpOworCiAgICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKICAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1PdXRCdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1PdXRCdWZmZXIuZ2V0KCk7CkBAIC05OCwxMCArOTMsMTQgQEAKIH0KIAogc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2VzcygpIHsKKyAgICBUSU1FX0NIRUNLKCk7CisKICAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1MpKTsKIH0KIAogc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc1JldmVyc2UoKSB7CisgICAgVElNRV9DSEVDSygpOworCiAgICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTX1JFVkVSU0UpKTsKIH0KIApAQCAtMTg0LDYgKzE4Myw4IEBACiAKIHN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCiAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICBUSU1FX0NIRUNLKCk7CisKICAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKIAogICAgIC8vIFNwZWNpYWwgY2FzZXMuCkBAIC0yMTUsNiArMjE2LDggQEAKIH0KIAogc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIFRJTUVfQ0hFQ0soKTsKKwogICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwogICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKQEAgLTIyOCwxMiArMjMxLDE2IEBACiB9CiAKIHN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNsb3NlKCkgeworICAgIFRJTUVfQ0hFQ0soKTsKKwogICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwogICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPmNsb3NlKCk7CiAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CiB9CiAKIHN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmR1bXAoaW50IGZkKSB7CisgICAgVElNRV9DSEVDSygpOworCiAgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CiAgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwpAQCAtMzEwLDYgKzMxNyw1IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KIH0gLy8gbmFtZXNwYWNlIGVmZmVjdAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaAppbmRleCA4ZTQ2NjM4Li5lMTM5NzY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaApAQCAtMjMsMTYgKzIzLDE3IEBACiAjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KIAorI2luY2x1ZGUgIkVmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGVmZmVjdCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogCiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CiAKLWNsYXNzIEVmZmVjdEhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0SGFsSW50ZXJmYWNlCitjbGFzcyBFZmZlY3RIYWxIaWRsIDogcHVibGljIEVmZmVjdEhhbEludGVyZmFjZSwgcHVibGljIEVmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsCiB7CiAgIHB1YmxpYzoKICAgICAvLyBTZXQgdGhlIGlucHV0IGJ1ZmZlci4KQEAgLTYzLDcgKzY0LDcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwogCi0gICAgdWludDY0X3QgZWZmZWN0SWQoKSBjb25zdCB7IHJldHVybiBtRWZmZWN0SWQ7IH0KKyAgICB2aXJ0dWFsIHVpbnQ2NF90IGVmZmVjdElkKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdElkOyB9CiAKICAgcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOwpAQCAtNzgsOCArNzksNiBAQAogICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7CiAgICAgYm9vbCBtSXNJbnB1dCA9IGZhbHNlOwogCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpOwotCiAgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgogICAgIEVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpOwogCkBAIC05Niw3ICs5NSw2IEBACiAgICAgc3RhdHVzX3Qgc2V0UHJvY2Vzc0J1ZmZlcnMoKTsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9IC8vIG5hbWVzcGFjZSBlZmZlY3QKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCmluZGV4IGYwNDJiOTIuLmQ3MjE3ZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTIxLDggKzIxLDkgQEAKIAogI2luY2x1ZGUgPFV1aWRVdGlscy5oPgogI2luY2x1ZGUgPHV0aWwvRWZmZWN0VXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0Q29udmVyc2lvbkhlbHBlckhpZGwuaCIKICNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCiAjaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgogI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIgpAQCAtMzMsMTMgKzM0LDEyIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBlZmZlY3QgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAogdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOwogdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOwogCiBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbChzcDxJRWZmZWN0c0ZhY3Rvcnk+IGVmZmVjdHNGYWN0b3J5KQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJFZmZlY3RzRmFjdG9yeSIpIHsKKyAgICAgICAgOiBFZmZlY3RDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7CiAgICAgQUxPR19BU1NFUlQoZWZmZWN0c0ZhY3RvcnkgIT0gbnVsbHB0ciwgIlByb3ZpZGVkIElFZmZlY3RzRmFjdG9yeSBzZXJ2aWNlIGlzIE5VTEwiKTsKICAgICBtRWZmZWN0c0ZhY3RvcnkgPSBlZmZlY3RzRmFjdG9yeTsKIH0KQEAgLTczLDcgKzczLDkgQEAKICAgICAgICAgdWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CiAgICAgLy8gVE9ETzogV2UgbmVlZCBzb21laG93IHRvIHRyYWNrIHRoZSBjaGFuZ2VzIG9uIHRoZSBzZXJ2ZXIgc2lkZQogICAgIC8vIG9yIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgZXZlcnlib2R5IHRvIHF1ZXJ5IGFsbCB0aGUgZGVzY3JpcHRvcnMgYXQgb25jZS4KLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgorICAgIGlmIChwRGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIGlmIChtTGFzdERlc2NyaXB0b3JzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOwogICAgICAgICBpZiAocXVlcnlSZXN1bHQgIT0gT0spIHJldHVybiBxdWVyeVJlc3VsdDsKQEAgLTg1LDcgKzg3LDkgQEAKIAogc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAogICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgorICAgIGlmIChwRGVzY3JpcHRvciA9PSBudWxscHRyIHx8IHBFZmZlY3RVdWlkID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBVdWlkIGhpZGxVdWlkOwogICAgIFV1aWRVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOwpAQCAtMTA1LDYgKzEwOSwzMyBAQAogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKIH0KIAorc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9ycyhjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gKmRlc2NyaXB0b3JzKSB7CisgICAgaWYgKHBFZmZlY3RUeXBlID09IG51bGxwdHIgfHwgZGVzY3JpcHRvcnMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOworICAgIHN0YXR1c190IHN0YXR1cyA9IHF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HVygiJXMgZXJyb3IgJWQgZnJvbSBGYWN0b3J5SGFsIHF1ZXJ5TnVtYmVyRWZmZWN0cyIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RzOyBpKyspIHsKKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjcmlwdG9yOworICAgICAgICBzdGF0dXMgPSBnZXREZXNjcmlwdG9yKGksICZkZXNjcmlwdG9yKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR1coIiVzIGVycm9yICVkIGZyb20gRmFjdG9yeUhhbCBnZXREZXNjcmlwdG9yIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWVtY21wKCZkZXNjcmlwdG9yLnR5cGUsIHBFZmZlY3RUeXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgICAgIGRlc2NyaXB0b3JzLT5wdXNoX2JhY2soZGVzY3JpcHRvcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRlc2NyaXB0b3JzLT5lbXB0eSgpID8gTkFNRV9OT1RfRk9VTkQgOiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpjcmVhdGVFZmZlY3QoCiAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAogICAgICAgICBpbnQzMl90IGRldmljZUlkIF9fdW51c2VkLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIHsKQEAgLTE3MywxMiArMjA0LDE0IEBACiAgICAgcmV0dXJuIEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1pcnJvcihleHRlcm5hbCwgc2l6ZSwgYnVmZmVyKTsKIH0KIAotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KIH0gLy8gbmFtZXNwYWNlIGVmZmVjdAogCi1leHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpIHZvaWQqIGNyZWF0ZUlFZmZlY3RzRmFjdG9yeSgpIHsKKy8vIFdoZW4gYSBzaGFyZWQgbGlicmFyeSBpcyBidWlsdCBmcm9tIGEgc3RhdGljIGxpYnJhcnksIGV2ZW4gZXhwbGljaXQKKy8vIGV4cG9ydHMgZnJvbSBhIHN0YXRpYyBsaWJyYXJ5IGFyZSBvcHRpbWl6ZWQgb3V0IHVubGVzcyBhY3R1YWxseSB1c2VkIGJ5CisvLyB0aGUgc2hhcmVkIGxpYnJhcnkuIFNlZSBFZmZlY3RzRmFjdG9yeUhhbEhpZGxFbnRyeS5jcHAuCitleHRlcm4gIkMiIHZvaWQqIGNyZWF0ZUlFZmZlY3RzRmFjdG9yeUltcGwoKSB7CiAgICAgYXV0byBzZXJ2aWNlID0gaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOjpJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICByZXR1cm4gc2VydmljZSA/IG5ldyBlZmZlY3Q6OkNQUF9WRVJTSU9OOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoc2VydmljZSkgOiBudWxscHRyOworICAgIHJldHVybiBzZXJ2aWNlID8gbmV3IGVmZmVjdDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKHNlcnZpY2UpIDogbnVsbHB0cjsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKaW5kZXggNWZhODVlNy4uZTE4ODJlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCkBAIC0yMCwxNyArMjAsMTUgQEAKICNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvRklMRV9WRVJTSU9OL0lFZmZlY3RzRmFjdG9yeS5oKQogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CiAKLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBlZmZlY3QgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OkNQUF9WRVJTSU9OOjpDb252ZXJzaW9uSGVscGVySGlkbDsKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKIAotY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK2NsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZSwgcHVibGljIEVmZmVjdENvbnZlcnNpb25IZWxwZXJIaWRsCiB7CiAgIHB1YmxpYzoKICAgICBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoc3A8SUVmZmVjdHNGYWN0b3J5PiBlZmZlY3RzRmFjdG9yeSk7CkBAIC00NSw2ICs0Myw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAogICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9ycyhjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+ICpkZXNjcmlwdG9ycyk7CisKICAgICAvLyBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgogICAgIC8vIFRvIHJlbGVhc2UgdGhlIGVmZmVjdCBlbmdpbmUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMKICAgICAvLyB0byB0aGUgcmV0dXJuZWQgZWZmZWN0IG9iamVjdC4KQEAgLTY3LDcgKzY4LDYgQEAKICAgICBzdGF0dXNfdCBxdWVyeUFsbERlc2NyaXB0b3JzKCk7CiB9OwogCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAvLyBuYW1lc3BhY2UgZWZmZWN0CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbEVudHJ5LmNwcApzaW1pbGFyaXR5IGluZGV4IDcxJQpjb3B5IGZyb20gbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbApjb3B5IHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsRW50cnkuY3BwCmluZGV4IDllMDRlODIuLjJjNmYyYzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGxFbnRyeS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMywxNCArMTMsOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotLyoqCi0gKiB7QGhpZGV9Ci0gKi8KLUBCYWNraW5nKHR5cGU9ImludCIpCi1lbnVtIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUgewotICAgICBOT05FID0gMCwKLSAgICAgRUxFTUVOVEFSWV9TVFJFQU0gPSAxLAotICAgICBIQU5ETEUgPSAyLAorZXh0ZXJuICJDIiB2b2lkKiBjcmVhdGVJRWZmZWN0c0ZhY3RvcnlJbXBsKCk7CisKK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgdm9pZCogY3JlYXRlSUVmZmVjdHNGYWN0b3J5KCkgeworICAgIHJldHVybiBjcmVhdGVJRWZmZWN0c0ZhY3RvcnlJbXBsKCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1BhcmFtZXRlclV0aWxzLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1BhcmFtZXRlclV0aWxzLmgKaW5kZXggOWNhYjcyZS4uYjVkY2I5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9QYXJhbWV0ZXJVdGlscy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvUGFyYW1ldGVyVXRpbHMuaApAQCAtMTYsMTcgKzE2LDE2IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vQ09SRV9UWVBFU19GSUxFX1ZFUlNJT04vdHlwZXMuaCkKICNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjpQYXJhbWV0ZXJWYWx1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjpSZXN1bHQ7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogbmFtZXNwYWNlIHV0aWxzIHsKIAogI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgpAQCAtNTYsNSArNTUsNCBAQAogI2VuZGlmCiAKIH0gLy8gbmFtZXNwYWNlIHV0aWxzCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAKaW5kZXggMTI5YjFjMS4uMDIxZWM1MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuY3BwCkBAIC0yMCwzNSArMjAsMzcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjAvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvbWVtb3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZUNoZWNrLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dENhbGxiYWNrLmgpCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vQ09SRV9UWVBFU19GSUxFX1ZFUlNJT04vSVN0cmVhbU91dENhbGxiYWNrLmgpCiAjaW5jbHVkZSA8SGlkbFV0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbC9Db3JlVXRpbHMuaD4KIAogI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCiAjaW5jbHVkZSAiUGFyYW1ldGVyVXRpbHMuaCIKICNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6Q29yZVV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q09NTU9OX1RZUEVTX0NQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpDb3JlVXRpbHM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKIAotdXNpbmcgRWZmZWN0SGFsSGlkbCA9IDo6YW5kcm9pZDo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6RWZmZWN0SGFsSGlkbDsKLXVzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW46OlJlYWRDb21tYW5kOwordXNpbmcgUmVhZENvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkQ29tbWFuZDsKIAotdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOwotdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDT01NT05fVFlQRVNfQ1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNPUkVfVFlQRVNfQ1BQX1ZFUlNJT047CiAKLVN0cmVhbUhhbEhpZGw6OlN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJTdHJlYW0iKSwKKyNkZWZpbmUgVElNRV9DSEVDSygpIGF1dG8gVGltZUNoZWNrID0gXAorICAgICAgIG1lZGlhdXRpbHM6Om1ha2VUaW1lQ2hlY2tTdGF0c0ZvckNsYXNzTWV0aG9kKGdldENsYXNzTmFtZSgpLCBfX2Z1bmNfXykKKworU3RyZWFtSGFsSGlkbDo6U3RyZWFtSGFsSGlkbChzdGQ6OnN0cmluZ192aWV3IGNsYXNzTmFtZSwgSVN0cmVhbSAqc3RyZWFtKQorICAgICAgICA6IENvcmVDb252ZXJzaW9uSGVscGVySGlkbChjbGFzc05hbWUpLAogICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwKICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSwKICAgICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSgwKXsKQEAgLTY5LDYgKzcxLDcgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKCJnZXRCdWZmZXJTaXplIiwgbVN0cmVhbS0+Z2V0QnVmZmVyU2l6ZSgpLCBzaXplKTsKICAgICBpZiAoc3RhdHVzID09IE9LKSB7CkBAIC03OCw2ICs4MSw3IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcyhhdWRpb19jb25maWdfYmFzZV90ICpjb25maWdCYXNlKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgICpjb25maWdCYXNlID0gQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKICNpZiBNQUpPUl9WRVJTSU9OIDw9IDYKQEAgLTEwNyw2ICsxMTEsNyBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKICAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7CkBAIC0xMTYsNiArMTIxLDcgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgdmFsdWVzLT5jbGVhcigpOwogICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOwpAQCAtMTM2LDI3ICsxNDIsMzEgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZEVmZmVjdCIsIG1TdHJlYW0tPmFkZEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KGVmZmVjdC0+ZWZmZWN0SWQoKSkpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRWZmZWN0IiwgbVN0cmVhbS0+cmVtb3ZlRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoZWZmZWN0LT5lZmZlY3RJZCgpKSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YW5kYnkiLCBtU3RyZWFtLT5zdGFuZGJ5KCkpOwogfQogCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpkdW1wKGludCBmZCkgeworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKICAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKICAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOworICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsQXJnczsKKyAgICBhcmdzRnJvbUhhbChhcmdzLCAmaGlkbEFyZ3MpOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1ZyhoaWRsSGFuZGxlLCBoaWRsQXJncyk7CiAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CiAKICAgICAvLyBUT0RPKGIvMTExOTk3ODY3LCBiLzE3NzI3MTk1OCkgIFdvcmthcm91bmQgLSByZW1vdmUgd2hlbiBmaXhlZC4KQEAgLTE3NSwxNyArMTg1LDIwIEBACiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFydCIsIG1TdHJlYW0tPnN0YXJ0KCkpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdG9wKCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdG9wIiwgbVN0cmVhbS0+c3RvcCgpKTsKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgUmVzdWx0IHJldHZhbDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKICAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCkBAIC0yMTgsNiArMjMxLDcgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBSZXN1bHQgcmV0dmFsOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oCiAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBQb3NpdGlvbiYgaGlkbFBvc2l0aW9uKSB7CkBAIC0yNDYsNyArMjYwLDcgQEAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEhhbFBpZChwaWRfdCAqcGlkKSB7CiAgICAgdXNpbmcgOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpEZWJ1Z0luZm87CiAgICAgdXNpbmcgOjphbmRyb2lkOjpoaWRsOjptYW5hZ2VyOjpWMV8wOjpJU2VydmljZU1hbmFnZXI7Ci0KKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgRGVidWdJbmZvIGRlYnVnSW5mbzsKICAgICBhdXRvIHJldCA9IG1TdHJlYW0tPmdldERlYnVnSW5mbyhbJl0gKGNvbnN0IGF1dG8gJmluZm8pIHsKICAgICAgICAgZGVidWdJbmZvID0gaW5mbzsKQEAgLTI3NCw2ICsyODgsMzQgQEAKICAgICByZXR1cm4gZXJyID09IDA7CiB9CiAKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmxlZ2FjeUNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnJiBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPGF1ZGlvX3NvdXJjZV90PiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlKSB7CisgICAgVElNRV9DSEVDSygpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYocG9ydC50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsICJwb3J0IHR5cGUgbXVzdCBiZSBkZXZpY2UiKTsKKyAgICB1bmlxdWVfbWFsbG9jZWRfcHRyPGNoYXI+IGFkZHJlc3M7CisgICAgaWYgKHN0cmNtcChwb3J0LmV4dC5kZXZpY2UuYWRkcmVzcywgIiIpICE9IDApIHsKKyAgICAgICAgLy8gRklYTUU6IHdlIG9ubHkgc3VwcG9ydCBhZGRyZXNzIG9uIGZpcnN0IHNpbmsgd2l0aCBIQUwgdmVyc2lvbiA8IDMuMAorICAgICAgICBhZGRyZXNzLnJlc2V0KAorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihwb3J0LmV4dC5kZXZpY2UudHlwZSwgcG9ydC5leHQuZGV2aWNlLmFkZHJlc3MpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhZGRyZXNzLnJlc2V0KChjaGFyKiljYWxsb2MoMSwgMSkpOworICAgIH0KKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKFN0cmluZzgoYWRkcmVzcy5nZXQoKSkpOworICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgKGludCl0eXBlKTsKKyAgICBpZiAoc291cmNlLmhhc192YWx1ZSgpKSB7CisgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlJbnB1dFNvdXJjZSksIChpbnQpc291cmNlLnZhbHVlKCkpOworICAgIH0KKyAgICByZXR1cm4gc2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6bGVnYWN5UmVsZWFzZUF1ZGlvUGF0Y2goKSB7CisgICAgVElNRV9DSEVDSygpOworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgMCk7CisgICAgcmV0dXJuIHNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Cit9CisKIG5hbWVzcGFjZSB7CiAKIC8qIE5vdGVzIG9uIGNhbGxiYWNrIG93bmVyc2hpcC4KQEAgLTMyNiw4ICszNjgsMTAgQEAKIAogfSAgLy8gbmFtZXNwYWNlCiAKLVN0cmVhbU91dEhhbEhpZGw6OlN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVdyaXRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworU3RyZWFtT3V0SGFsSGlkbDo6U3RyZWFtT3V0SGFsSGlkbCgKKyAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0PiYgc3RyZWFtKQorICAgICAgICA6IFN0cmVhbUhhbEhpZGwoIlN0cmVhbU91dEhhbEhpZGwiLCBzdHJlYW0uZ2V0KCkpCisgICAgICAgICwgbVN0cmVhbShzdHJlYW0pLCBtV3JpdGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7CiB9CiAKIFN0cmVhbU91dEhhbEhpZGw6On5TdHJlYW1PdXRIYWxIaWRsKCkgewpAQCAtMzUxLDExICszOTUsMTMgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKICAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCkBAIC0zNjksMTIgKzQxNSwxNCBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvbHVtZSIsIG1TdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCkpOwogfQogCiAjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHN0ZDo6dmVjdG9yPFBhcmFtZXRlclZhbHVlPiBwYXJhbWV0ZXJzOwogICAgIFN0cmluZzggaGFsUGFyYW1ldGVyczsKQEAgLTM4NSw2ICs0MzMsNyBAQAogfQogI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZWxlY3RQcmVzZW50YXRpb24iLAogICAgICAgICAgICAgbVN0cmVhbS0+c2VsZWN0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpKTsKQEAgLTM5Miw2ICs0NDEsNyBAQAogI2VuZGlmCiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgKndyaXR0ZW4gPSAwOwogCkBAIC01MzcsNiArNTg3LDcgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBSZXN1bHQgcmV0dmFsOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRSZW5kZXJQb3NpdGlvbigKQEAgLTU1MCw2ICs2MDEsNyBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIFJlc3VsdCByZXR2YWw7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE5leHRXcml0ZVRpbWVzdGFtcCgKQEAgLTU2Myw2ICs2MTUsNyBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigKICAgICAgICAgICAgICJzZXRDYWxsYmFjayIsIG1TdHJlYW0tPnNldENhbGxiYWNrKG5ldyBTdHJlYW1PdXRDYWxsYmFjayh0aGlzKSkpOwpAQCAtNTczLDYgKzYyNiw3IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoCiAgICAgICAgICAgICBbJl0oYm9vbCBwLCBib29sIHIpIHsKQEAgLTU4MywzMiArNjM3LDM4IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnBhdXNlKCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5wYXVzZSgpKTsKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cmVzdW1lKCkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5yZXN1bWUoKSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNEcmFpbiIsIG1TdHJlYW0tPnN1cHBvcnRzRHJhaW4oKSwgc3VwcG9ydHNEcmFpbik7CiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCiAgICAgICAgICAgICAiZHJhaW4iLCBtU3RyZWFtLT5kcmFpbihlYXJseU5vdGlmeSA/IEF1ZGlvRHJhaW46OkVBUkxZX05PVElGWSA6IEF1ZGlvRHJhaW46OkFMTCkpOwogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpmbHVzaCgpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+Zmx1c2goKSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKICAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCkBAIC02NDIsNyArNzAyLDEyIEBACiAjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKAogICAgICAgICBjb25zdCBTdHJlYW1PdXRIYWxJbnRlcmZhY2U6OlNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgewotICAgIENQUF9WRVJTSU9OOjpTb3VyY2VNZXRhZGF0YSBoaWRsTWV0YWRhdGE7CisgICAgVElNRV9DSEVDSygpOworI2lmIE1BSk9SX1ZFUlNJT04gPT0gNAorICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjpTb3VyY2VNZXRhZGF0YSBoaWRsTWV0YWRhdGE7CisjZWxzZQorICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNPTU1PTl9UWVBFU19DUFBfVkVSU0lPTjo6U291cmNlTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworI2VuZGlmCiAgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IENvcmVVdGlsczo6c291cmNlTWV0YWRhdGFGcm9tSGFsVjcoCiAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU1ldGFkYXRhLnRyYWNrcywgdHJ1ZSAvKmlnbm9yZU5vblZlbmRvclRhZ3MqLywgJmhpZGxNZXRhZGF0YSk7CiAgICAgICAgICAgICBzdGF0dXMgIT0gT0spIHsKQEAgLTY4NCw5ICs3NDksMTEgQEAKICAgICAvLyBDb2RlYyBmb3JtYXQgY2FsbGJhY2sgaXMgc3VwcG9ydGVkIHN0YXJ0aW5nIGZyb20gYXVkaW8gSEFMIFY2LjAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CisKICNlbHNlCiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90KiBtb2RlKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIFJlc3VsdCByZXR2YWw7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldER1YWxNb25vTW9kZSgKQEAgLTcwMCwxMiArNzY3LDE0IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90IG1vZGUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCiAgICAgICAgICAgICAic2V0RHVhbE1vbm9Nb2RlIiwgbVN0cmVhbS0+c2V0RHVhbE1vbm9Nb2RlKHN0YXRpY19jYXN0PER1YWxNb25vTW9kZT4obW9kZSkpKTsKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0KiBsZXZlbGRCKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIFJlc3VsdCByZXR2YWw7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbCgKQEAgLTcxOSwxMiArNzg4LDE0IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAogICAgICAgICAgICAgInNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbCIsIG1TdHJlYW0tPnNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChsZXZlbGRCKSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoYXVkaW9fcGxheWJhY2tfcmF0ZV90KiBwbGF5YmFja1JhdGUpIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgUmVzdWx0IHJldHZhbDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycygKQEAgLTc0NSw2ICs4MTYsNyBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgcGxheWJhY2tSYXRlKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAogICAgICAgICAgICAgInNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMiLCBtU3RyZWFtLT5zZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKApAQCAtNzUzLDcgKzgyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFRpbWVzdHJldGNoRmFsbGJhY2tNb2RlPihwbGF5YmFja1JhdGUubUZhbGxiYWNrTW9kZSl9KSk7CiB9CiAKLSNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dEV2ZW50Q2FsbGJhY2suaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9DT1JFX1RZUEVTX0ZJTEVfVkVSU0lPTi9JU3RyZWFtT3V0RXZlbnRDYWxsYmFjay5oKQogCiBuYW1lc3BhY2UgewogCkBAIC03NzksNiArODUxLDcgQEAKIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0RXZlbnRDYWxsYmFjaygKICAgICAgICAgY29uc3Qgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlRXZlbnRDYWxsYmFjaz4mIGNhbGxiYWNrKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IG51bGxwdHIpIHJldHVybiBOT19JTklUOwogICAgIG1FdmVudENhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigKQEAgLTc4OSw2ICs4NjIsODcgQEAKIH0KICNlbmRpZgogCisjaWYgTUFKT1JfVkVSU0lPTiA9PSA3ICYmIE1JTk9SX1ZFUlNJT04gPT0gMQordXNpbmcgaGFyZHdhcmU6OmF1ZGlvOjpWN18xOjpMYXRlbmN5TW9kZTsKKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0TGF0ZW5jeU1vZGUoYXVkaW9fbGF0ZW5jeV9tb2RlX3QgbW9kZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgICJzZXRMYXRlbmN5TW9kZSIsIG1TdHJlYW0tPnNldExhdGVuY3lNb2RlKHN0YXRpY19jYXN0PExhdGVuY3lNb2RlPihtb2RlKSkpOworfTsKKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UmVjb21tZW5kZWRMYXRlbmN5TW9kZXMoc3RkOjp2ZWN0b3I8YXVkaW9fbGF0ZW5jeV9tb2RlX3Q+ICptb2RlcykgeworICAgIFRJTUVfQ0hFQ0soKTsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFJlY29tbWVuZGVkTGF0ZW5jeU1vZGVzKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBoaWRsX3ZlYzxMYXRlbmN5TW9kZT4gaGlkbE1vZGVzKSB7CisgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGlkbE1vZGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtb2Rlcy0+cHVzaF9iYWNrKHN0YXRpY19jYXN0PGF1ZGlvX2xhdGVuY3lfbW9kZV90PihoaWRsTW9kZXNbaV0pKTsKKyAgICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZWNvbW1lbmRlZExhdGVuY3lNb2RlcyIsIHJldCwgcmV0dmFsKTsKK307CisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dExhdGVuY3lNb2RlQ2FsbGJhY2suaCkKKwordXNpbmcgaGFyZHdhcmU6OmF1ZGlvOjpWN18xOjpJU3RyZWFtT3V0TGF0ZW5jeU1vZGVDYWxsYmFjazsKKworbmFtZXNwYWNlIHsKK3N0cnVjdCBTdHJlYW1PdXRMYXRlbmN5TW9kZUNhbGxiYWNrIDogcHVibGljIElTdHJlYW1PdXRMYXRlbmN5TW9kZUNhbGxiYWNrIHsKKyAgICBTdHJlYW1PdXRMYXRlbmN5TW9kZUNhbGxiYWNrKGNvbnN0IHdwPFN0cmVhbU91dEhhbEhpZGw+JiBzdHJlYW0pIDogbVN0cmVhbShzdHJlYW0pIHt9CisKKyAgICAvLyBJU3RyZWFtT3V0TGF0ZW5jeU1vZGVDYWxsYmFjayBpbXBsZW1lbnRhdGlvbgorICAgIFJldHVybjx2b2lkPiBvblJlY29tbWVuZGVkTGF0ZW5jeU1vZGVDaGFuZ2VkKGNvbnN0IGhpZGxfdmVjPExhdGVuY3lNb2RlPiYgaGlkbE1vZGVzKSBvdmVycmlkZSB7CisgICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOworICAgICAgICBpZiAoc3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2xhdGVuY3lfbW9kZV90PiBtb2RlczsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGlkbE1vZGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbW9kZXMucHVzaF9iYWNrKHN0YXRpY19jYXN0PGF1ZGlvX2xhdGVuY3lfbW9kZV90PihoaWRsTW9kZXNbaV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbS0+b25SZWNvbW1lbmRlZExhdGVuY3lNb2RlQ2hhbmdlZChtb2Rlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB3cDxTdHJlYW1PdXRIYWxIaWRsPiBtU3RyZWFtOworfTsKK30gIC8vIG5hbWVzcGFjZQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRMYXRlbmN5TW9kZUNhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VMYXRlbmN5TW9kZUNhbGxiYWNrPiYgY2FsbGJhY2spIHsKKyAgICBUSU1FX0NIRUNLKCk7CisKKyAgICBpZiAobVN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gTk9fSU5JVDsKKyAgICBtTGF0ZW5jeU1vZGVDYWxsYmFjayA9IGNhbGxiYWNrOworICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICAic2V0TGF0ZW5jeU1vZGVDYWxsYmFjayIsCisgICAgICAgICAgICBtU3RyZWFtLT5zZXRMYXRlbmN5TW9kZUNhbGxiYWNrKAorICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5nZXQoKSA9PSBudWxscHRyID8gbnVsbHB0ciA6IG5ldyBTdHJlYW1PdXRMYXRlbmN5TW9kZUNhbGxiYWNrKHRoaXMpKSk7CisgICAgcmV0dXJuIHN0YXR1czsKK307CisKKyNlbHNlCisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldExhdGVuY3lNb2RlKGF1ZGlvX2xhdGVuY3lfbW9kZV90IG1vZGUgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9OworCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRSZWNvbW1lbmRlZExhdGVuY3lNb2RlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fbGF0ZW5jeV9tb2RlX3Q+ICptb2RlcyBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK307CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldExhdGVuY3lNb2RlQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUxhdGVuY3lNb2RlQ2FsbGJhY2s+JiBjYWxsYmFjayBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK307CisKKyNlbmRpZgorCiB2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2subG9hZCgpLnByb21vdGUoKTsKICAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwpAQCAtODE3LDkgKzk3MSwyMyBAQAogICAgIGNhbGxiYWNrLT5vbkNvZGVjRm9ybWF0Q2hhbmdlZChtZXRhZGF0YUJzKTsKIH0KIAordm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvblJlY29tbWVuZGVkTGF0ZW5jeU1vZGVDaGFuZ2VkKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19sYXRlbmN5X21vZGVfdD4mIG1vZGVzKSB7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlTGF0ZW5jeU1vZGVDYWxsYmFjaz4gY2FsbGJhY2sgPSBtTGF0ZW5jeU1vZGVDYWxsYmFjay5sb2FkKCkucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm47CisgICAgY2FsbGJhY2stPm9uUmVjb21tZW5kZWRMYXRlbmN5TW9kZUNoYW5nZWQobW9kZXMpOworfQogCi1TdHJlYW1JbkhhbEhpZGw6OlN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1SZWFkZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmV4aXQoKSB7CisgICAgLy8gRklYTUUgdGhpcyBpcyB1c2luZyBoYXJkLWNvZGVkIHN0cmluZ3MgYnV0IGluIHRoZSBmdXR1cmUsIHRoaXMgZnVuY3Rpb25hbGl0eSB3aWxsIGJlCisgICAgLy8gICAgICAgY29udmVydGVkIHRvIHVzZSBhdWRpbyBIQUwgZXh0ZW5zaW9ucyByZXF1aXJlZCB0byBzdXBwb3J0IHR1bm5lbGluZworICAgIHJldHVybiBzZXRQYXJhbWV0ZXJzKFN0cmluZzgoImV4aXRpbmc9MSIpKTsKK30KKworU3RyZWFtSW5IYWxIaWRsOjpTdHJlYW1JbkhhbEhpZGwoCisgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjpJU3RyZWFtSW4+JiBzdHJlYW0pCisgICAgICAgIDogU3RyZWFtSGFsSGlkbCgiU3RyZWFtSW5IYWxIaWRsIiwgc3RyZWFtLmdldCgpKQorICAgICAgICAsIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewogfQogCiBTdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7CkBAIC04MzIsMTYgKzEwMDAsMTkgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRHYWluIiwgbVN0cmVhbS0+c2V0R2FpbihnYWluKSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgICpyZWFkID0gMDsKIApAQCAtOTY5LDExICsxMTQwLDEzIEBACiB9CiAKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7CisgICAgVElNRV9DSEVDSygpOwogICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEZyYW1lc0xvc3QiLCBtU3RyZWFtLT5nZXRJbnB1dEZyYW1lc0xvc3QoKSwgZnJhbWVzTG9zdCk7CiB9CiAKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CiAgICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKQEAgLTEwMTMsNiArMTE4Niw3IEBACiAjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbykgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwogICAgIFJlc3VsdCByZXR2YWw7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEFjdGl2ZU1pY3JvcGhvbmVzKApAQCAtMTAzMSw3ICsxMjA1LDEyIEBACiAKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0CiAgICAgICAgIFN0cmVhbUluSGFsSW50ZXJmYWNlOjpTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgewotICAgIENQUF9WRVJTSU9OOjpTaW5rTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworICAgIFRJTUVfQ0hFQ0soKTsKKyNpZiBNQUpPUl9WRVJTSU9OID09IDQKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6U2lua01ldGFkYXRhIGhpZGxNZXRhZGF0YTsKKyNlbHNlCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q09NTU9OX1RZUEVTX0NQUF9WRVJTSU9OOjpTaW5rTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworI2VuZGlmCiAgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IENvcmVVdGlsczo6c2lua01ldGFkYXRhRnJvbUhhbFY3KAogICAgICAgICAgICAgICAgICAgICBzaW5rTWV0YWRhdGEudHJhY2tzLCB0cnVlIC8qaWdub3JlTm9uVmVuZG9yVGFncyovLCAmaGlkbE1ldGFkYXRhKTsKICAgICAgICAgICAgIHN0YXR1cyAhPSBPSykgewpAQCAtMTA1NCwxNyArMTIzMywxOCBAQAogfQogI2Vsc2UKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIFRJTUVfQ0hFQ0soKTsKICAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uIiwKICAgICAgICAgbVN0cmVhbS0+c2V0TWljcm9waG9uZURpcmVjdGlvbihzdGF0aWNfY2FzdDxNaWNyb3Bob25lRGlyZWN0aW9uPihkaXJlY3Rpb24pKSk7CiB9CiAKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBUSU1FX0NIRUNLKCk7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uIiwKICAgICAgICAgICAgICAgICBtU3RyZWFtLT5zZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSkpOwogfQogI2VuZGlmCiAKLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCmluZGV4IDk3MDkwM2IuLjU0ZmJlZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCkBAIC0xOSwzNCArMTksMzMgQEAKIAogI2luY2x1ZGUgPGF0b21pYz4KIAotI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtLmgpCi0jaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lTdHJlYW1Jbi5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0NPUkVfVFlQRVNfRklMRV9WRVJTSU9OL0lTdHJlYW0uaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9DT1JFX1RZUEVTX0ZJTEVfVkVSU0lPTi9JU3RyZWFtSW4uaCkKICNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dC5oKQogI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KICNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TeW5jaHJvbml6YXRpb24uaD4KIAotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiQ29yZUNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCiAjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6SVN0cmVhbTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIFJlYWRQYXJhbWV0ZXJzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW46OlJlYWRQYXJhbWV0ZXJzOwotdXNpbmcgUmVhZFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkU3RhdHVzOwordXNpbmcgUmVhZFBhcmFtZXRlcnMgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkUGFyYW1ldGVyczsKK3VzaW5nIFJlYWRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkU3RhdHVzOwogdXNpbmcgV3JpdGVDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0OjpXcml0ZUNvbW1hbmQ7CiB1c2luZyBXcml0ZVN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbU91dDo6V3JpdGVTdGF0dXM7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CiAKIGNsYXNzIERldmljZUhhbEhpZGw7CiAKLWNsYXNzIFN0cmVhbUhhbEhpZGwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAorY2xhc3MgU3RyZWFtSGFsSGlkbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSwgcHVibGljIENvcmVDb252ZXJzaW9uSGVscGVySGlkbAogewogICBwdWJsaWM6CiAgICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KQEAgLTcxLDcgKzcwLDcgQEAKICAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogCiAgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CkBAIC05MCw5ICs4OSwxNSBAQAogICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7CiAKKyAgICBzdGF0dXNfdCBsZWdhY3lDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyYgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDxhdWRpb19zb3VyY2VfdD4gc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBsZWdhY3lSZWxlYXNlQXVkaW9QYXRjaCgpIG92ZXJyaWRlOworCiAgIHByb3RlY3RlZDoKICAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSk7CisgICAgU3RyZWFtSGFsSGlkbChzdGQ6OnN0cmluZ192aWV3IGNsYXNzTmFtZSwgSVN0cmVhbSAqc3RyZWFtKTsKIAogICAgIH5TdHJlYW1IYWxIaWRsKCkgb3ZlcnJpZGU7CiAKQEAgLTE5MSw2ICsxOTYsMTUgQEAKICAgICAvLyBNZXRob2RzIHVzZWQgYnkgU3RyZWFtQ29kZWNGb3JtYXRDYWxsYmFjayAoSElETCkuCiAgICAgdm9pZCBvbkNvZGVjRm9ybWF0Q2hhbmdlZChjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90PiYgbWV0YWRhdGFCcyk7CiAKKyAgICBzdGF0dXNfdCBzZXRMYXRlbmN5TW9kZShhdWRpb19sYXRlbmN5X21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXRSZWNvbW1lbmRlZExhdGVuY3lNb2RlcyhzdGQ6OnZlY3RvcjxhdWRpb19sYXRlbmN5X21vZGVfdD4gKm1vZGVzKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXRMYXRlbmN5TW9kZUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3Qgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlTGF0ZW5jeU1vZGVDYWxsYmFjaz4mIGNhbGxiYWNrKSBvdmVycmlkZTsKKworICAgIHZvaWQgb25SZWNvbW1lbmRlZExhdGVuY3lNb2RlQ2hhbmdlZChjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19sYXRlbmN5X21vZGVfdD4mIG1vZGVzKTsKKworICAgIHN0YXR1c190IGV4aXQoKSBvdmVycmlkZTsKKwogICBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOwogICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlQ29tbWFuZCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKQEAgLTE5OSw3ICsyMTMsOSBAQAogCiAgICAgbWVkaWF1dGlsczo6YXRvbWljX3dwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7CiAgICAgbWVkaWF1dGlsczo6YXRvbWljX3dwPFN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2s+IG1FdmVudENhbGxiYWNrOwotICAgIGNvbnN0IHNwPElTdHJlYW1PdXQ+IG1TdHJlYW07CisgICAgbWVkaWF1dGlsczo6YXRvbWljX3dwPFN0cmVhbU91dEhhbEludGVyZmFjZUxhdGVuY3lNb2RlQ2FsbGJhY2s+IG1MYXRlbmN5TW9kZUNhbGxiYWNrOworCisgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0PiBtU3RyZWFtOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CiAgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKQEAgLTIwNyw3ICsyMjMsNyBAQAogICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7CiAKICAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKTsKKyAgICBTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbU91dD4mIHN0cmVhbSk7CiAKICAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxIaWRsKCk7CiAKQEAgLTI1NSw3ICsyNzEsNyBAQAogICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7CiAgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROwogCi0gICAgY29uc3Qgc3A8SVN0cmVhbUluPiBtU3RyZWFtOworICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDT1JFX1RZUEVTX0NQUF9WRVJTSU9OOjpJU3RyZWFtSW4+IG1TdHJlYW07CiAgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwogICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwpAQCAtMjYzLDcgKzI3OSw4IEBACiAgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKIAogICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKTsKKyAgICBTdHJlYW1JbkhhbEhpZGwoCisgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q09SRV9UWVBFU19DUFBfVkVSU0lPTjo6SVN0cmVhbUluPiYgc3RyZWFtKTsKIAogICAgIHZpcnR1YWwgflN0cmVhbUluSGFsSGlkbCgpOwogCkBAIC0yNzMsNyArMjkwLDYgQEAKICAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7CiB9OwogCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRiZDVkZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL01ldGFkYXRhLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJQYXJhbWV0ZXJVdGlscy5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7Ci0KLVN0cmVhbUhhbExvY2FsOjpTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwKLSAgICAgICAgICBtU3RyZWFtKHN0cmVhbSkgewotICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyIC8qICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSAqLykgewotICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSksCi0gICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pLAotICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSkpOwotICAgIH0KLX0KLQotU3RyZWFtSGFsTG9jYWw6On5TdHJlYW1IYWxMb2NhbCgpIHsKLSAgICBtU3RyZWFtID0gMDsKLSAgICBtRGV2aWNlLmNsZWFyKCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbVN0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEF1ZGlvUHJvcGVydGllcyhhdWRpb19jb25maWdfYmFzZV90ICpjb25maWdCYXNlKSB7Ci0gICAgY29uZmlnQmFzZS0+c2FtcGxlX3JhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7Ci0gICAgY29uZmlnQmFzZS0+Y2hhbm5lbF9tYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOwotICAgIGNvbmZpZ0Jhc2UtPmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGt2UGFpcnMuc3RyaW5nKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBjaGFyICpoYWxWYWx1ZXMgPSBtU3RyZWFtLT5nZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrZXlzLnN0cmluZygpKTsKLSAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKLSAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOwotICAgICAgICBmcmVlKGhhbFZhbHVlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmFsdWVzLT5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgewotICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgewotICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzdGFuZGJ5KCkgewotICAgIHJldHVybiBtU3RyZWFtLT5zdGFuZGJ5KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKLSAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCkgewotICAgIC8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgbG9jYWwgaGFsIGlzIGV4ZWN1dGVkIGJ5IGF1ZGlvZmxpbmdlciBkaXJlY3RseQotICAgIC8vIG9uIHRoZSBzYW1lIHRocmVhZC4KLSAgICByZXR1cm4gT0s7Ci19Ci0KLVN0cmVhbU91dEhhbExvY2FsOjpTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Ci19Ci0KLVN0cmVhbU91dEhhbExvY2FsOjp+U3RyZWFtT3V0SGFsTG9jYWwoKSB7Ci0gICAgbUNhbGxiYWNrLmNsZWFyKCk7Ci0gICAgbURldmljZS0+Y2xvc2VPdXRwdXRTdHJlYW0obVN0cmVhbSk7Ci0gICAgbVN0cmVhbSA9IDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgewotICAgICpsYXRlbmN5ID0gbVN0cmVhbS0+Z2V0X2xhdGVuY3kobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfdm9sdW1lKG1TdHJlYW0sIGxlZnQsIHJpZ2h0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKLSAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQpLCBwcmVzZW50YXRpb25JZCk7Ci0gICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByb2dyYW1JZCksIHByb2dyYW1JZCk7Ci0gICAgcmV0dXJuIHNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7Ci0gICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwotICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKLSAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICp3cml0dGVuID0gMDsKLSAgICAgICAgcmV0dXJuIHdyaXRlUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtU3RyZWFtLCBkc3BGcmFtZXMpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAobVN0cmVhbSwgdGltZXN0YW1wKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgewotICAgIGlmIChtU3RyZWFtLT5zZXRfY2FsbGJhY2sgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdHJlYW0tPnNldF9jYWxsYmFjayhtU3RyZWFtLCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjaywgdGhpcyk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gc3RhdGljCi1pbnQgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQqLCB2b2lkICpjb29raWUpIHsKLSAgICAvLyBXZSBhY3QgYXMgaWYgd2UgZ2F2ZSBhIHdwPFN0cmVhbU91dEhhbExvY2FsPiB0byBIQUwuIFRoaXMgd2F5IHdlIHNob3VsZCBoYW5kbGUKLSAgICAvLyBjb3JyZWN0bHkgdGhlIGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGlsZSBTdHJlYW1PdXRIYWxMb2NhbCdzIGRlc3RydWN0b3IgaXMKLSAgICAvLyBhbHJlYWR5IHJ1bm5pbmcsIGJlY2F1c2UgdGhlIGRlc3RydWN0b3IgaXMgaW52b2tlZCBhZnRlciB0aGUgcmVmY291bnQgaGFzIGJlZW4gYXRvbWljYWxseQotICAgIC8vIGRlY3JlbWVudGVkLgotICAgIHdwPFN0cmVhbU91dEhhbExvY2FsPiB3ZWFrU2VsZihzdGF0aWNfY2FzdDxTdHJlYW1PdXRIYWxMb2NhbCo+KGNvb2tpZSkpOwotICAgIHNwPFN0cmVhbU91dEhhbExvY2FsPiBzZWxmID0gd2Vha1NlbGYucHJvbW90ZSgpOwotICAgIGlmIChzZWxmID09IDApIHJldHVybiAwOwotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IHNlbGYtPm1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybiAwOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrKCkgZXZlbnQgJWQiLCBldmVudCk7Ci0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfV1JJVEVfUkVBRFk6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0RSQUlOX1JFQURZOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9FUlJPUjoKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJhc3luY0NhbGxiYWNrKCkgdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKLSAgICAqc3VwcG9ydHNQYXVzZSA9IG1TdHJlYW0tPnBhdXNlICE9IE5VTEw7Ci0gICAgKnN1cHBvcnRzUmVzdW1lID0gbVN0cmVhbS0+cmVzdW1lICE9IE5VTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cGF1c2UoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnBhdXNlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+cGF1c2UobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpyZXN1bWUoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnJlc3VtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnJlc3VtZShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgewotICAgICpzdXBwb3J0c0RyYWluID0gbVN0cmVhbS0+ZHJhaW4gIT0gTlVMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7Ci0gICAgaWYgKG1TdHJlYW0tPmRyYWluID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+ZHJhaW4obVN0cmVhbSwgZWFybHlOb3RpZnkgPyBBVURJT19EUkFJTl9FQVJMWV9OT1RJRlkgOiBBVURJT19EUkFJTl9BTEwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmZsdXNoID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Zmx1c2gobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWVzdGFtcCk7Ci19Ci0KLXZvaWQgU3RyZWFtT3V0SGFsTG9jYWw6OmRvVXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7Ci0gICAgc3RkOjp2ZWN0b3I8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGE+IGhhbFRyYWNrczsKLSAgICBoYWxUcmFja3MucmVzZXJ2ZShzb3VyY2VNZXRhZGF0YS50cmFja3Muc2l6ZSgpKTsKLSAgICBmb3IgKGF1dG8mIG1ldGFkYXRhIDogc291cmNlTWV0YWRhdGEudHJhY2tzKSB7Ci0gICAgICAgIHBsYXliYWNrX3RyYWNrX21ldGFkYXRhIGhhbFRyYWNrTWV0YWRhdGE7Ci0gICAgICAgIHBsYXliYWNrX3RyYWNrX21ldGFkYXRhX2Zyb21fdjcoJmhhbFRyYWNrTWV0YWRhdGEsICZtZXRhZGF0YSk7Ci0gICAgICAgIGhhbFRyYWNrcy5wdXNoX2JhY2soaGFsVHJhY2tNZXRhZGF0YSk7Ci0gICAgfQotICAgIGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90IGhhbE1ldGFkYXRhID0gewotICAgICAgICAudHJhY2tfY291bnQgPSBoYWxUcmFja3Muc2l6ZSgpLAotICAgICAgICAudHJhY2tzID0gaGFsVHJhY2tzLmRhdGEoKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEobVN0cmVhbSwgJmhhbE1ldGFkYXRhKTsKLX0KLQotI2lmIE1BSk9SX1ZFUlNJT04gPj0gNwotdm9pZCBTdHJlYW1PdXRIYWxMb2NhbDo6ZG9VcGRhdGVTb3VyY2VNZXRhZGF0YVY3KGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgewotICAgIGNvbnN0IHNvdXJjZV9tZXRhZGF0YV92N190IG1ldGFkYXRhIHsKLSAgICAgICAgLnRyYWNrX2NvdW50ID0gc291cmNlTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKLSAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCi0gICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHBsYXliYWNrX3RyYWNrX21ldGFkYXRhX3Y3Kj4oc291cmNlTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCi0gICAgfTsKLSAgICBtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhX3Y3KG1TdHJlYW0sICZtZXRhZGF0YSk7Ci19Ci0jZW5kaWYKLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgewotI2lmIE1BSk9SX1ZFUlNJT04gPCA3Ci0gICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGRvVXBkYXRlU291cmNlTWV0YWRhdGEoc291cmNlTWV0YWRhdGEpOwotI2Vsc2UKLSAgICBpZiAobURldmljZS0+dmVyc2lvbigpIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgewotICAgICAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgZG9VcGRhdGVTb3VyY2VNZXRhZGF0YShzb3VyY2VNZXRhZGF0YSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGFfdjcgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIGRvVXBkYXRlU291cmNlTWV0YWRhdGFWNyhzb3VyY2VNZXRhZGF0YSk7Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdGFydCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0b3AoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90KiBtb2RlKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9kdWFsX21vbm9fbW9kZSA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9kdWFsX21vbm9fbW9kZShtU3RyZWFtLCBtb2RlKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90IG1vZGUpIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X2R1YWxfbW9ub19tb2RlID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2R1YWxfbW9ub19tb2RlKG1TdHJlYW0sIG1vZGUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0KiBsZXZlbGRCKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9hdWRpb19kZXNjcmlwdGlvbl9taXhfbGV2ZWwgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfYXVkaW9fZGVzY3JpcHRpb25fbWl4X2xldmVsKG1TdHJlYW0sIGxldmVsZEIpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0IGxldmVsZEIpIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X2F1ZGlvX2Rlc2NyaXB0aW9uX21peF9sZXZlbCA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9hdWRpb19kZXNjcmlwdGlvbl9taXhfbGV2ZWwobVN0cmVhbSwgbGV2ZWxkQik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGF1ZGlvX3BsYXliYWNrX3JhdGVfdCogcGxheWJhY2tSYXRlKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9wbGF5YmFja19yYXRlX3BhcmFtZXRlcnMgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcGxheWJhY2tfcmF0ZV9wYXJhbWV0ZXJzKG1TdHJlYW0sIHBsYXliYWNrUmF0ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgcGxheWJhY2tSYXRlKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF9wbGF5YmFja19yYXRlX3BhcmFtZXRlcnMgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfcGxheWJhY2tfcmF0ZV9wYXJhbWV0ZXJzKG1TdHJlYW0sICZwbGF5YmFja1JhdGUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0RXZlbnRDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlRXZlbnRDYWxsYmFjaz4mIGNhbGxiYWNrKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF9ldmVudF9jYWxsYmFjayA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgc3RyZWFtX2V2ZW50X2NhbGxiYWNrX3QgYXN5bmNDYWxsYmFjayA9Ci0gICAgICAgICAgICBjYWxsYmFjayA9PSBudWxscHRyID8gbnVsbHB0ciA6IFN0cmVhbU91dEhhbExvY2FsOjphc3luY0V2ZW50Q2FsbGJhY2s7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbVN0cmVhbS0+c2V0X2V2ZW50X2NhbGxiYWNrKG1TdHJlYW0sIGFzeW5jQ2FsbGJhY2ssIHRoaXMpOwotICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgbUV2ZW50Q2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gc3RhdGljCi1pbnQgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jRXZlbnRDYWxsYmFjaygKLSAgICAgICAgc3RyZWFtX2V2ZW50X2NhbGxiYWNrX3R5cGVfdCBldmVudCwgdm9pZCAqcGFyYW0sIHZvaWQgKmNvb2tpZSkgewotICAgIC8vIFdlIGFjdCBhcyBpZiB3ZSBnYXZlIGEgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHRvIEhBTC4gVGhpcyB3YXkgd2Ugc2hvdWxkIGhhbmRsZQotICAgIC8vIGNvcnJlY3RseSB0aGUgY2FzZSB3aGVuIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdoaWxlIFN0cmVhbU91dEhhbExvY2FsJ3MgZGVzdHJ1Y3RvciBpcwotICAgIC8vIGFscmVhZHkgcnVubmluZywgYmVjYXVzZSB0aGUgZGVzdHJ1Y3RvciBpcyBpbnZva2VkIGFmdGVyIHRoZSByZWZjb3VudCBoYXMgYmVlbiBhdG9taWNhbGx5Ci0gICAgLy8gZGVjcmVtZW50ZWQuCi0gICAgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHdlYWtTZWxmKHN0YXRpY19jYXN0PFN0cmVhbU91dEhhbExvY2FsKj4oY29va2llKSk7Ci0gICAgc3A8U3RyZWFtT3V0SGFsTG9jYWw+IHNlbGYgPSB3ZWFrU2VsZi5wcm9tb3RlKCk7Ci0gICAgaWYgKHNlbGYgPT0gbnVsbHB0cikgcmV0dXJuIDA7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlRXZlbnRDYWxsYmFjaz4gY2FsbGJhY2sgPSBzZWxmLT5tRXZlbnRDYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrLmdldCgpID09IG51bGxwdHIpIHJldHVybiAwOwotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBTVFJFQU1fRVZFTlRfQ0JLX1RZUEVfQ09ERUNfRk9STUFUX0NIQU5HRUQ6Ci0gICAgICAgICAgICAvLyB2b2lkKiBwYXJhbSBpcyB0aGUgYnl0ZSBzdHJpbmcgYnVmZmVyIGZyb20gYnl0ZV9zdHJpbmdfZnJvbV9hdWRpb19tZXRhZGF0YSgpLgotICAgICAgICAgICAgLy8gQXMgdGhlIGJ5dGUgc3RyaW5nIGJ1ZmZlciBtYXkgaGF2ZSBlbWJlZGRlZCB6ZXJvZXMsIHdlIGNhbm5vdCB1c2Ugc3RybGVuKCkKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkNvZGVjRm9ybWF0Q2hhbmdlZChzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90PigKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXBhcmFtLAotICAgICAgICAgICAgICAgICAgICBhdWRpb191dGlsczo6bWV0YWRhdGE6OmRhdGFCeXRlU3RyaW5nTGVuKChjb25zdCB1aW50OF90KilwYXJhbSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coIiVzIHVua25vd24gZXZlbnQgJWQiLCBfX2Z1bmNfXywgZXZlbnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1TdHJlYW1JbkhhbExvY2FsOjpTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgewotfQotCi1TdHJlYW1JbkhhbExvY2FsOjp+U3RyZWFtSW5IYWxMb2NhbCgpIHsKLSAgICBtRGV2aWNlLT5jbG9zZUlucHV0U3RyZWFtKG1TdHJlYW0pOwotICAgIG1TdHJlYW0gPSAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBhdWRpb19zdHJlYW1faW5fZnJhbWVfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldEdhaW4oZmxvYXQgZ2FpbikgewotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfZ2FpbihtU3RyZWFtLCBnYWluKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7Ci0gICAgc3NpemVfdCByZWFkUmVzdWx0ID0gbVN0cmVhbS0+cmVhZChtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKLSAgICBpZiAocmVhZFJlc3VsdCA+IDApIHsKLSAgICAgICAgKnJlYWQgPSByZWFkUmVzdWx0OwotICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKCBidWZmZXIsICpyZWFkKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpyZWFkID0gMDsKLSAgICAgICAgcmV0dXJuIHJlYWRSZXN1bHQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKLSAgICAqZnJhbWVzTG9zdCA9IG1TdHJlYW0tPmdldF9pbnB1dF9mcmFtZXNfbG9zdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWUpOwotfQotCi12b2lkIFN0cmVhbUluSGFsTG9jYWw6OmRvVXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7Ci0gICAgc3RkOjp2ZWN0b3I8cmVjb3JkX3RyYWNrX21ldGFkYXRhPiBoYWxUcmFja3M7Ci0gICAgaGFsVHJhY2tzLnJlc2VydmUoc2lua01ldGFkYXRhLnRyYWNrcy5zaXplKCkpOwotICAgIGZvciAoYXV0byYgbWV0YWRhdGEgOiBzaW5rTWV0YWRhdGEudHJhY2tzKSB7Ci0gICAgICAgIHJlY29yZF90cmFja19tZXRhZGF0YSBoYWxUcmFja01ldGFkYXRhOwotICAgICAgICByZWNvcmRfdHJhY2tfbWV0YWRhdGFfZnJvbV92NygmaGFsVHJhY2tNZXRhZGF0YSwgJm1ldGFkYXRhKTsKLSAgICAgICAgaGFsVHJhY2tzLnB1c2hfYmFjayhoYWxUcmFja01ldGFkYXRhKTsKLSAgICB9Ci0gICAgY29uc3Qgc2lua19tZXRhZGF0YV90IGhhbE1ldGFkYXRhID0gewotICAgICAgICAudHJhY2tfY291bnQgPSBoYWxUcmFja3Muc2l6ZSgpLAotICAgICAgICAudHJhY2tzID0gaGFsVHJhY2tzLmRhdGEoKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhKG1TdHJlYW0sICZoYWxNZXRhZGF0YSk7Ci19Ci0KLSNpZiBNQUpPUl9WRVJTSU9OID49IDcKLXZvaWQgU3RyZWFtSW5IYWxMb2NhbDo6ZG9VcGRhdGVTaW5rTWV0YWRhdGFWNyhjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgewotICAgIGNvbnN0IHNpbmtfbWV0YWRhdGFfdjdfdCBoYWxNZXRhZGF0YSB7Ci0gICAgICAgIC50cmFja19jb3VudCA9IHNpbmtNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAotICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKLSAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cmVjb3JkX3RyYWNrX21ldGFkYXRhX3Y3Kj4oc2lua01ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAotICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGFfdjcobVN0cmVhbSwgJmhhbE1ldGFkYXRhKTsKLX0KLSNlbmRpZgotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKLSNpZiBNQUpPUl9WRVJTSU9OIDwgNwotICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgIC8vIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEhBTAotICAgIH0KLSAgICBkb1VwZGF0ZVNpbmtNZXRhZGF0YShzaW5rTWV0YWRhdGEpOwotI2Vsc2UKLSAgICBpZiAobURldmljZS0+dmVyc2lvbigpIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgewotICAgICAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyAgLy8gbm90IHN1cHBvcnRlZCBieSB0aGUgSEFMCi0gICAgICAgIH0KLSAgICAgICAgZG9VcGRhdGVTaW5rTWV0YWRhdGEoc2lua01ldGFkYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGFfdjcgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyAgLy8gbm90IHN1cHBvcnRlZCBieSB0aGUgSEFMCi0gICAgICAgIH0KLSAgICAgICAgZG9VcGRhdGVTaW5rTWV0YWRhdGFWNyhzaW5rTWV0YWRhdGEpOwotICAgIH0KLSNlbmRpZgotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RhcnQoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0b3AoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Ci19Ci0KLSNpZiBNQUpPUl9WRVJTSU9OID09IDIKLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLSNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X2FjdGl2ZV9taWNyb3Bob25lcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc2l6ZV90IGFjdHVhbF9taWNzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlQ7Ci0gICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IG1pY19hcnJheVtBVURJT19NSUNST1BIT05FX01BWF9DT1VOVF07Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+Z2V0X2FjdGl2ZV9taWNyb3Bob25lcyhtU3RyZWFtLCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgewotICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKLSAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0jZW5kaWYKLQotI2lmIE1BSk9SX1ZFUlNJT04gPCA1Ci1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKAotICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24gX191bnVzZWQpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tIF9fdW51c2VkKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotI2Vsc2UKLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X21pY3JvcGhvbmVfZGlyZWN0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X21pY3JvcGhvbmVfZGlyZWN0aW9uKG1TdHJlYW0sIGRpcmVjdGlvbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF9taWNyb3Bob25lX2ZpZWxkX2RpbWVuc2lvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9taWNyb3Bob25lX2ZpZWxkX2RpbWVuc2lvbihtU3RyZWFtLCB6b29tKTsKLQotfQotI2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjYwNDk1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKLQotY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLWNsYXNzIFN0cmVhbUhhbExvY2FsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHN0cmVhbToKLSAgICAvLyAgIC0gY2hhbm5lbCBtYXNrOwotICAgIC8vICAgLSBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotICAgIC8vICAgLSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZ0Jhc2UpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0KLSAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pID0gMDsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSA9IDA7Ci0KLSAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCi0gICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgflN0cmVhbUhhbExvY2FsKCk7Ci0KLSAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKLQotICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKLX07Ci0KLWNsYXNzIFN0cmVhbU91dEhhbExvY2FsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKLQotICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0KLSAgICAvLyBTZWxlY3RzIHRoZSBhdWRpbyBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKTsKLQotICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKLQotICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCi0gICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKLQotICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKLQotICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gICAgLy8gUmV0dXJucyB0aGUgRHVhbCBNb25vIG1vZGUgcHJlc2VudGF0aW9uIHNldHRpbmcuCi0gICAgc3RhdHVzX3QgZ2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QqIG1vZGUpIG92ZXJyaWRlOwotCi0gICAgLy8gU2V0cyB0aGUgRHVhbCBNb25vIG1vZGUgcHJlc2VudGF0aW9uIG9uIHRoZSBvdXRwdXQgZGV2aWNlLgotICAgIHN0YXR1c190IHNldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90IG1vZGUpIG92ZXJyaWRlOwotCi0gICAgLy8gUmV0dXJucyB0aGUgQXVkaW8gRGVzY3JpcHRpb24gTWl4IGxldmVsIGluIGRCLgotICAgIHN0YXR1c190IGdldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCogbGV2ZWxkQikgb3ZlcnJpZGU7Ci0KLSAgICAvLyBTZXRzIHRoZSBBdWRpbyBEZXNjcmlwdGlvbiBNaXggbGV2ZWwgaW4gZEIuCi0gICAgc3RhdHVzX3Qgc2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0IGxldmVsZEIpIG92ZXJyaWRlOwotCi0gICAgLy8gUmV0cmlldmVzIGN1cnJlbnQgcGxheWJhY2sgcmF0ZSBwYXJhbWV0ZXJzLgotICAgIHN0YXR1c190IGdldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoYXVkaW9fcGxheWJhY2tfcmF0ZV90KiBwbGF5YmFja1JhdGUpIG92ZXJyaWRlOwotCi0gICAgLy8gU2V0cyB0aGUgcGxheWJhY2sgcmF0ZSBwYXJhbWV0ZXJzIHRoYXQgY29udHJvbCBwbGF5YmFjayBiZWhhdmlvci4KLSAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgcGxheWJhY2tSYXRlKSBvdmVycmlkZTsKLQotICAgIHN0YXR1c190IHNldEV2ZW50Q2FsbGJhY2soY29uc3Qgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlRXZlbnRDYWxsYmFjaz4mIGNhbGxiYWNrKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqbVN0cmVhbTsKLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2s+IG1FdmVudENhbGxiYWNrOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbExvY2FsKCk7Ci0KLSAgICBzdGF0aWMgaW50IGFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOwotCi0gICAgc3RhdGljIGludCBhc3luY0V2ZW50Q2FsbGJhY2soc3RyZWFtX2V2ZW50X2NhbGxiYWNrX3R5cGVfdCBldmVudCwgdm9pZCAqcGFyYW0sIHZvaWQgKmNvb2tpZSk7Ci0KLSAgICB2b2lkIGRvVXBkYXRlU291cmNlTWV0YWRhdGFWNyhjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpOwotICAgIHZvaWQgZG9VcGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOwotCi0gICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCi0gICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBTZXRzIG1pY3JvcGhvbmUgZGlyZWN0aW9uIChmb3IgcHJvY2Vzc2luZykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOwotCi0gICAgLy8gU2V0cyBtaWNyb3Bob25lIHpvb20gKGZvciBwcm9jZXNzaW5nKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICptU3RyZWFtOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbExvY2FsKCk7Ci0KLSAgICB2b2lkIGRvVXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKTsKLSAgICB2b2lkIGRvVXBkYXRlU2lua01ldGFkYXRhVjcoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmgKaW5kZXggZjZhNTU0Yi4uYzA4ZWU0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaApAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgQ1BQX1ZFUlNJT04gewogCiBjbGFzcyBTdHJlYW1Qb3dlckxvZyB7CiBwdWJsaWM6CkBAIC05OSw3ICs5OCw2IEBACiAgICAgc2l6ZV90IG1GcmFtZVNpemU7CiB9OwogCi19IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCmluZGV4IDI5ZWYwMTEuLmQyN2FkNGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaApAQCAtMTcsNiArMTcsOSBAQAogI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSU5URVJGQUNFX0gKICNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0lOVEVSRkFDRV9ICiAKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3lJbmZvLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5VHlwZS5oPgorI2luY2x1ZGUgPGVycm9yL1Jlc3VsdC5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01pY3JvcGhvbmVJbmZvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC0xMjAsNyArMTIzLDE4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VFZmZlY3QoCiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZSwgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zKSAgPSAwOworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKSA9IDA7CisgICAgdmlydHVhbCBpbnQzMl90IGdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCkgPSAwOworCisgICAgLy8gVXBkYXRlIHRoZSBjb25uZWN0aW9uIHN0YXR1cyBvZiBhbiBleHRlcm5hbCBkZXZpY2UuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDb25uZWN0ZWRTdGF0ZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCwgYm9vbCBjb25uZWN0ZWQpID0gMDsKKworICAgIHZpcnR1YWwgZXJyb3I6OlJlc3VsdDxhdWRpb19od19zeW5jX3Q+IGdldEh3QXZTeW5jKCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgPSAwOwogCiAgIHByb3RlY3RlZDoKICAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaAppbmRleCA1MDkxNTU4Li4xNzAxMGU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oCkBAIC00Myw2ICs0Myw4IEBACiAgICAgLy8gVGhlIGNhbGxiYWNrIGNhbiBiZSBvbmx5IHNldCBvbmNlLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2tPbmNlKHNwPERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2s+IGNhbGxiYWNrKSA9IDA7CiAKKyAgICB2aXJ0dWFsIGZsb2F0IGdldEhhbFZlcnNpb24oKSBjb25zdCA9IDA7CisKICAgICBzdGF0aWMgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZSgpOwogCiAgIHByb3RlY3RlZDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oCmluZGV4IDAzMTY1YmQuLjI5NjljOTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaApAQCAtNTcsNiArNTcsOSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgPSAwOwogCisgICAgLy8gVW5pcXVlIGVmZmVjdCBJRCB0byB1c2Ugd2l0aCB0aGUgY29yZSBIQUwuCisgICAgdmlydHVhbCB1aW50NjRfdCBlZmZlY3RJZCgpIGNvbnN0ID0gMDsKKwogICBwcm90ZWN0ZWQ6CiAgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCiAgICAgRWZmZWN0SGFsSW50ZXJmYWNlKCkge30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaAppbmRleCA5ZmI1NmFlLi4zZTUwNWJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oCkBAIC0zNyw2ICszNyw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAogICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcnMoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiAqZGVzY3JpcHRvcnMpID0gMDsKKwogICAgIC8vIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCiAgICAgLy8gVG8gcmVsZWFzZSB0aGUgZWZmZWN0IGVuZ2luZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcwogICAgIC8vIHRvIHRoZSByZXR1cm5lZCBlZmZlY3Qgb2JqZWN0LgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oCmluZGV4IGQzNTNlZDAuLjg2NmRkM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmgKQEAgLTE4LDIxICsxOCw0MiBAQAogI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0ZBQ1RPUllfSEFMX0hJRExfSAogCiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CiAKICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gVGhlIHBhaXIgb2YgdGhlIGludGVyZmFjZSdzIHBhY2thZ2UgbmFtZSBhbmQgdGhlIGludGVyZmFjZSBuYW1lLAorLy8gZS5nLiA8ImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8iLCAiSURldmljZXNGYWN0b3J5Ij4uCisvLyBTcGxpdHRpbmcgaXMgdXNlZCBmb3IgZWFzaWVyIGNvbnN0cnVjdGlvbiBvZiB2ZXJzaW9uZWQgbmFtZXMgKEZRTnMpLgordXNpbmcgSW50ZXJmYWNlTmFtZSA9IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OworCiBuYW1lc3BhY2UgZGV0YWlsIHsKIAotdm9pZCogY3JlYXRlUHJlZmVycmVkSW1wbChjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGludGVyZmFjZSk7Cit2b2lkKiBjcmVhdGVQcmVmZXJyZWRJbXBsKGNvbnN0IEludGVyZmFjZU5hbWUmIGlmYWNlLCBjb25zdCBJbnRlcmZhY2VOYW1lJiBzaWJsaW5nSWZhY2UpOwogCiB9ICAvLyBuYW1lc3BhY2UgZGV0YWlsCiAKLS8qKiBAUmV0dXJuIHRoZSBwcmVmZXJyZWQgYXZhaWxhYmxlIGltcGxlbWVudGF0aW9uIG9yIG51bGxwdHIgaWYgbm9uZSBhcmUgYXZhaWxhYmxlLiAqLworLyoqCisgKiBDcmVhdGUgYSBjbGllbnQgZm9yIHRoZSAicHJlZmVycmVkIiAobW9zdCByZWNlbnQpIGltcGxlbWVudGF0aW9uIG9mIGFuIGludGVyZmFjZS4KKyAqIGJ5IGxvYWRpbmcgdGhlIGFwcHJvcHJpYXRlIHZlcnNpb24gb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGNvbnRhaW5pbmcgdGhlIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEluIHRoZSBhdWRpbyBIQUwsIHRoZXJlIGFyZSB0d28gZmFtaWxpZXMgb2YgaW50ZXJmYWNlczogY29yZSBhbmQgZWZmZWN0cy4gQm90aCBhcmUKKyAqIHBhY2tlZCBpbnRvIHRoZSBzYW1lIHNoYXJlZCBsaWJyYXJ5IGZvciBtZW1vcnkgZWZmaWNpZW5jeS4gU2luY2UgdGhlIGNvcmUgYW5kIHRoZSBlZmZlY3RzCisgKiBpbnRlcmZhY2UgY2FuIGhhdmUgZGlmZmVyZW50IG1pbm9yIHZlcnNpb25zIG9uIHRoZSBkZXZpY2UsIGluIG9yZGVyIHRvIGF2b2lkIGxvYWRpbmcgbXVsdGlwbGUKKyAqIHNoYXJlZCBsaWJyYXJpZXMgdGhlIGxvYWRlciBmdW5jdGlvbiBjb25zaWRlcnMgd2hpY2ggaW50ZXJmYWNlIGFtb25nIHR3byBoYXMgdGhlIG1vc3QKKyAqIHJlY2VudCB2ZXJzaW9uLiBUaHVzLCBhIHBhaXIgb2YgaW50ZXJmYWNlIG5hbWVzIG11c3QgYmUgcGFzc2VkIGluLgorICoKKyAqIEBwYXJhbSBpZmFjZSB0aGUgaW50ZXJmYWNlIHRoYXQgbmVlZHMgdG8gYmUgY3JlYXRlZC4KKyAqIEBwYXJhbSBzaWJsaW5nSWZhY2UgdGhlIGludGVyZmFjZSB3aGljaCBvY2N1cGllcyB0aGUgc2FtZSBzaGFyZWQgbGlicmFyeS4KKyAqIEByZXR1cm4gdGhlIHByZWZlcnJlZCBhdmFpbGFibGUgaW1wbGVtZW50YXRpb24gb3IgbnVsbHB0ciBpZiBub25lIGFyZSBhdmFpbGFibGUuCisgKi8KIHRlbXBsYXRlIDxjbGFzcyBJbnRlcmZhY2U+Ci1zdGF0aWMgc3A8SW50ZXJmYWNlPiBjcmVhdGVQcmVmZXJyZWRJbXBsKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlLCBjb25zdCBzdGQ6OnN0cmluZyYgaW50ZXJmYWNlKSB7Ci0gICAgcmV0dXJuIHNwPEludGVyZmFjZT57c3RhdGljX2Nhc3Q8SW50ZXJmYWNlKj4oZGV0YWlsOjpjcmVhdGVQcmVmZXJyZWRJbXBsKHBhY2thZ2UsIGludGVyZmFjZSkpfTsKK3N0YXRpYyBzcDxJbnRlcmZhY2U+IGNyZWF0ZVByZWZlcnJlZEltcGwoCisgICAgICAgIGNvbnN0IEludGVyZmFjZU5hbWUmIGlmYWNlLCBjb25zdCBJbnRlcmZhY2VOYW1lJiBzaWJsaW5nSWZhY2UpIHsKKyAgICByZXR1cm4gc3A8SW50ZXJmYWNlPnsKKyAgICAgICAgc3RhdGljX2Nhc3Q8SW50ZXJmYWNlKj4oZGV0YWlsOjpjcmVhdGVQcmVmZXJyZWRJbXBsKGlmYWNlLCBzaWJsaW5nSWZhY2UpKX07CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCmluZGV4IDJiZTEyZmIuLjFkNTJiN2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjksNyArNzAsNyBAQAogICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzID0ge30pID0gMDsKIAogICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKQEAgLTg4LDYgKzg5LDEyIEBACiAgICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxlZ2FjeUNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnJiBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPGF1ZGlvX3NvdXJjZV90PiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxlZ2FjeVJlbGVhc2VBdWRpb1BhdGNoKCkgPSAwOworCiAgIHByb3RlY3RlZDoKICAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KICAgICBTdHJlYW1IYWxJbnRlcmZhY2UoKSB7fQpAQCAtMTE2LDYgKzEyMywxOCBAQAogICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2soKSB7fQogfTsKIAorY2xhc3MgU3RyZWFtT3V0SGFsSW50ZXJmYWNlTGF0ZW5jeU1vZGVDYWxsYmFjayA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENhbGxlZCB3aXRoIHRoZSBuZXcgbGlzdCBvZiBzdXBwb3J0ZWQgbGF0ZW5jeSBtb2RlcyB3aGVuIGEgY2hhbmdlIG9jY3Vycy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25SZWNvbW1lbmRlZExhdGVuY3lNb2RlQ2hhbmdlZChzdGQ6OnZlY3RvcjxhdWRpb19sYXRlbmN5X21vZGVfdD4gbW9kZXMpID0gMDsKKworcHJvdGVjdGVkOgorICAgIFN0cmVhbU91dEhhbEludGVyZmFjZUxhdGVuY3lNb2RlQ2FsbGJhY2soKSB7fQorICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbEludGVyZmFjZUxhdGVuY3lNb2RlQ2FsbGJhY2soKSB7fQorfTsKKwogY2xhc3MgU3RyZWFtT3V0SGFsSW50ZXJmYWNlIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlIHsKICAgcHVibGljOgogICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KQEAgLTE5Myw2ICsyMTIsNDcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RXZlbnRDYWxsYmFjayhjb25zdCBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VFdmVudENhbGxiYWNrPiYgY2FsbGJhY2spID0gMDsKIAorICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGUgcmVxdWVzdGVkIGxhdGVuY3kgbW9kZSBmb3IgdGhpcyBvdXRwdXQgc3RyZWFtLgorICAgICAqCisgICAgICogVGhlIHJlcXVlc3RlZCBtb2RlIGNhbiBiZSBvbmUgb2YgdGhlIG1vZGVzIHJldHVybmVkIGJ5CisgICAgICogZ2V0UmVjb21tZW5kZWRMYXRlbmN5TW9kZXMoKSBBUEkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kZSB0aGUgcmVxdWVzdGVkIGxhdGVuY3kgbW9kZS4KKyAgICAgKiBAcmV0dXJuIG9wZXJhdGlvbiBjb21wbGV0aW9uIHN0YXR1cy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExhdGVuY3lNb2RlKGF1ZGlvX2xhdGVuY3lfbW9kZV90IG1vZGUpID0gMDsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGljaCBsYXRlbmN5IG1vZGVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkIG9uIHRoaXMgb3V0cHV0IHN0cmVhbS4KKyAgICAgKiBJZiB0aGUgdHJhbnNwb3J0IHByb3RvY29sIChlLmcgQmx1ZXRvb3RoIEEyRFApIHVzZWQgYnkgdGhpcyBvdXRwdXQgc3RyZWFtIHRvIHJlYWNoCisgICAgICogdGhlIG91dHB1dCBkZXZpY2Ugc3VwcG9ydHMgdmFyaWFibGUgbGF0ZW5jeSBtb2RlcywgdGhlIEhBTCBpbmRpY2F0ZXMgd2hpY2gKKyAgICAgKiBtb2RlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4KKyAgICAgKiBUaGUgZnJhbWV3b3JrIGNhbiB0aGVuIGNhbGwgc2V0TGF0ZW5jeU1vZGUoKSB3aXRoIG9uZSBvZiB0aGUgc3VwcG9ydGVkIG1vZGVzIHRvIHNlbGVjdAorICAgICAqIHRoZSBkZXNpcmVkIG9wZXJhdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIG1vZGVzIGN1cnJyZW50bHkgc3VwcG9ydGVkIGxhdGVuY3kgbW9kZXMuCisgICAgICogQHJldHVybiBvcGVyYXRpb24gY29tcGxldGlvbiBzdGF0dXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZWNvbW1lbmRlZExhdGVuY3lNb2RlcyhzdGQ6OnZlY3RvcjxhdWRpb19sYXRlbmN5X21vZGVfdD4gKm1vZGVzKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNhbGxiYWNrIGludGVyZmFjZSBmb3Igbm90aWZ5aW5nIGNoYW5nZXMgaW4gc3VwcG9ydGVkIGxhdGVuY3kgbW9kZXMuCisgICAgICoKKyAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGggYSBudWxsIHBvaW50ZXIgd2lsbCByZXN1bHQgaW4gcmVsZWFzaW5nCisgICAgICogdGhlIGNhbGxiYWNrLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIG9yIG51bGwgdG8gdW5yZWdpc3Rlci4KKyAgICAgKiBAcmV0dXJuIG9wZXJhdGlvbiBjb21wbGV0aW9uIHN0YXR1cy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExhdGVuY3lNb2RlQ2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VMYXRlbmN5TW9kZUNhbGxiYWNrPiYgY2FsbGJhY2spID0gMDsKKworICAgIC8qKgorICAgICAqIFNpZ25hbCB0aGUgZW5kIG9mIGF1ZGlvIG91dHB1dCwgaW50ZXJydXB0aW5nIGFuIG9uZ29pbmcgJ3dyaXRlJyBvcGVyYXRpb24uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBleGl0KCkgPSAwOworCiAgIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxJbnRlcmZhY2UoKSB7fQogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcAppbmRleCBkODVlMmU5Li5lNmZkYjFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCkBAIC0xMDgsMTUgKzEwOCwxMSBAQAogCiAgICAgaWYgKHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgewogICAgICAgICB0cmFjay0+bUFkanVzdEluQ2hhbm5lbENvdW50ID0gdHJhY2stPmNoYW5uZWxDb3VudCArIHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50OwotICAgICAgICB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQgKyB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50OwotICAgICAgICB0cmFjay0+bUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQgPSB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudDsKLSAgICAgICAgdHJhY2stPm1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQ7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0T3V0Q2hhbm5lbENvdW50ID0gdHJhY2stPmNoYW5uZWxDb3VudDsKICAgICAgICAgdHJhY2stPm1LZWVwQ29udHJhY3RlZENoYW5uZWxzID0gdHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgdHJhY2stPm1BZGp1c3RJbkNoYW5uZWxDb3VudCA9IDA7CiAgICAgICAgIHRyYWNrLT5tQWRqdXN0T3V0Q2hhbm5lbENvdW50ID0gMDsKLSAgICAgICAgdHJhY2stPm1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50ID0gMDsKLSAgICAgICAgdHJhY2stPm1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCA9IDA7CiAgICAgICAgIHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IGZhbHNlOwogICAgIH0KIApAQCAtMTMxLDggKzEyNyw3IEBACiAgICAgLy8gZG8gaXQgYWZ0ZXIgZG93bm1peCBzaW5jZSB0cmFjayBmb3JtYXQgbWF5IGNoYW5nZSEKICAgICB0cmFjay0+cHJlcGFyZUZvclJlZm9ybWF0KCk7CiAKLSAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOwotICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKyAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKG1GcmFtZUNvdW50KTsKIAogICAgIC8vIFJlc2FtcGxlciBjaGFubmVscyBtYXkgaGF2ZSBjaGFuZ2VkLgogICAgIHRyYWNrLT5yZWNyZWF0ZVJlc2FtcGxlcihtU2FtcGxlUmF0ZSk7CkBAIC0xOTMsNiArMTg4LDI0IEBACiAgICAgICAgIC8vIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlciByZXNldCBiZWxvdy4KICAgICB9CiAKKyAgICAvLyBTZWUgaWYgd2Ugc2hvdWxkIHVzZSBvdXIgYnVpbHQtaW4gbm9uLWVmZmVjdCBkb3dubWl4ZXIuCisgICAgaWYgKG1NaXhlckluRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKKyAgICAgICAgICAgICYmIG1NaXhlckNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTworICAgICAgICAgICAgJiYgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykKKyAgICAgICAgICAgICAgICAgICAgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTikgeworICAgICAgICBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIucmVzZXQobmV3IENoYW5uZWxNaXhCdWZmZXJQcm92aWRlcihjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBtTWl4ZXJDaGFubmVsTWFzaywgbU1peGVySW5Gb3JtYXQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8Q2hhbm5lbE1peEJ1ZmZlclByb3ZpZGVyICo+KG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5nZXQoKSkKKyAgICAgICAgICAgICAgICAtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgbURvd25taXhSZXF1aXJlc0Zvcm1hdCA9IG1NaXhlckluRm9ybWF0OworICAgICAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICAgICAgICAgIEFMT0dEKCIlczogRmFsbGJhY2sgdXNpbmcgQ2hhbm5lbE1peCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCIlczogQ2hhbm5lbE1peCBub3Qgc3VwcG9ydGVkIGZvciBjaGFubmVsIG1hc2sgJSN4IiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIEVmZmVjdCBkb3dubWl4ZXIgZG9lcyBub3QgYWNjZXB0IHRoZSBjaGFubmVsIGNvbnZlcnNpb24uICBMZXQncyB1c2Ugb3VyIHJlbWl4ZXIuCiAgICAgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLnJlc2V0KG5ldyBSZW1peEJ1ZmZlclByb3ZpZGVyKGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgbU1peGVyQ2hhbm5lbE1hc2ssIG1NaXhlckluRm9ybWF0LCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpKTsKQEAgLTI2NSw0OCArMjc4LDIwIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb01peGVyOjpUcmFjazo6cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCkKK3N0YXR1c190IEF1ZGlvTWl4ZXI6OlRyYWNrOjpwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoc2l6ZV90IGZyYW1lcykKIHsKICAgICBBTE9HVigiQXVkaW9NaXhlcjo6cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCVwKSB3aXRoIGluQ2hhbm5lbENvdW50OiAldSwgb3V0Q2hhbm5lbENvdW50OiAldSIsCiAgICAgICAgICAgICB0aGlzLCBtQWRqdXN0SW5DaGFubmVsQ291bnQsIG1BZGp1c3RPdXRDaGFubmVsQ291bnQpOwogICAgIHVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CiAgICAgaWYgKG1BZGp1c3RJbkNoYW5uZWxDb3VudCAhPSBtQWRqdXN0T3V0Q2hhbm5lbENvdW50KSB7Ci0gICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLnJlc2V0KG5ldyBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKAotICAgICAgICAgICAgICAgIG1Gb3JtYXQsIG1BZGp1c3RJbkNoYW5uZWxDb3VudCwgbUFkanVzdE91dENoYW5uZWxDb3VudCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KSk7Ci0gICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBBdWRpb01peGVyOjpUcmFjazo6dW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSgpCi17Ci0gICAgQUxPR1YoIkFVRElPTUlYRVI6OnVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUiKTsKLSAgICBpZiAobUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwotICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9NaXhlcjo6VHJhY2s6OnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKHNpemVfdCBmcmFtZXMpCi17Ci0gICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKCVwKSB3aXRoIGluQ2hhbm5lbENvdW50OiAldSwgIgotICAgICAgICAgICJvdXRDaGFubmVsQ291bnQ6ICV1LCBrZWVwQ29udHJhY3RlZENoYW5uZWxzOiAlZCIsCi0gICAgICAgICAgICB0aGlzLCBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCwgbUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgbUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpOwotICAgIHVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoKTsKLSAgICBpZiAobUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQgIT0gbUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50KSB7CiAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciA9IG1LZWVwQ29udHJhY3RlZENoYW5uZWxzCiAgICAgICAgICAgICAgICAgPyAodWludDhfdCopbWFpbkJ1ZmZlciArIGZyYW1lcyAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckNoYW5uZWxDb3VudCwgbU1peGVyRm9ybWF0KQotICAgICAgICAgICAgICAgIDogTlVMTDsKLSAgICAgICAgbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLnJlc2V0KAotICAgICAgICAgICAgICAgIG5ldyBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPyBtTWl4ZXJGb3JtYXQgOiBBVURJT19GT1JNQVRfSU5WQUxJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikpOworICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKKyAgICAgICAgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIucmVzZXQobmV3IEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgbUZvcm1hdCwgbUFkanVzdEluQ2hhbm5lbENvdW50LCBtQWRqdXN0T3V0Q2hhbm5lbENvdW50LCBmcmFtZXMsCisgICAgICAgICAgICAgICAgbUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPyBtTWl4ZXJGb3JtYXQgOiBBVURJT19GT1JNQVRfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICBidWZmZXIsIG1NaXhlckhhcHRpY0NoYW5uZWxDb3VudCkpOwogICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC0zMTQsOSArMjk5LDkgQEAKIAogdm9pZCBBdWRpb01peGVyOjpUcmFjazo6Y2xlYXJDb250cmFjdGVkQnVmZmVyKCkKIHsKLSAgICBpZiAobUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICBpZiAobUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICBzdGF0aWNfY2FzdDxBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKj4oCi0gICAgICAgICAgICAgICAgbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpKS0+Y2xlYXJDb250cmFjdGVkRnJhbWVzKCk7CisgICAgICAgICAgICAgICAgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIuZ2V0KCkpLT5jbGVhckNvbnRyYWN0ZWRGcmFtZXMoKTsKICAgICB9CiB9CiAKQEAgLTMyOCwxMCArMzEzLDYgQEAKICAgICAgICAgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKICAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5nZXQoKTsKICAgICB9Ci0gICAgaWYgKG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICBidWZmZXJQcm92aWRlciA9IG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKTsKLSAgICB9CiAgICAgaWYgKG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKICAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtUmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKTsKQEAgLTM3Nyw3ICszNTgsNyBAQAogICAgICAgICAgICAgICAgIHRyYWNrLT5tYWluQnVmZmVyID0gdmFsdWVCdWY7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgTUFJTl9CVUZGRVIsICVwKSIsIHZhbHVlQnVmKTsKICAgICAgICAgICAgICAgICBpZiAodHJhY2stPm1LZWVwQ29udHJhY3RlZENoYW5uZWxzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShtRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMobUZyYW1lQ291bnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CkBAIC00MDUsNyArMzg2LDcgQEAKICAgICAgICAgICAgICAgICB0cmFjay0+bU1peGVyRm9ybWF0ID0gZm9ybWF0OwogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1JWEVSX0ZPUk1BVCwgJSN4KSIsIGZvcm1hdCk7CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscykgewotICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKG1GcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOwpAQCAtNDI0LDggKzQwNSw3IEBACiAgICAgICAgICAgICBpZiAodHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgIT0gaGFwdGljUGxheWJhY2tFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBoYXB0aWNQbGF5YmFja0VuYWJsZWQ7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1LZWVwQ29udHJhY3RlZENoYW5uZWxzID0gaGFwdGljUGxheWJhY2tFbmFibGVkOwotICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShtRnJhbWVDb3VudCk7Ci0gICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOworICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMobUZyYW1lQ291bnQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBIQVBUSUNfSU5URU5TSVRZOiB7CkBAIC00MzQsNiArNDE0LDEyIEBACiAgICAgICAgICAgICAgICAgdHJhY2stPm1IYXB0aWNJbnRlbnNpdHkgPSBoYXB0aWNJbnRlbnNpdHk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEhBUFRJQ19NQVhfQU1QTElUVURFOiB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBoYXB0aWNNYXhBbXBsaXR1ZGUgPSAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KHZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bUhhcHRpY01heEFtcGxpdHVkZSAhPSBoYXB0aWNNYXhBbXBsaXR1ZGUpIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+bUhhcHRpY01heEFtcGxpdHVkZSA9IGhhcHRpY01heEFtcGxpdHVkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXIgdHJhY2s6IGJhZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgfQpAQCAtNTEyLDggKzQ5OCw2IEBACiAgICAgICAgIHRyYWNrLT5tRG93bm1peGVyQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CiAgICAgfSBlbHNlIGlmICh0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICB0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+bUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgdHJhY2stPm1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKICAgICB9IGVsc2UgaWYgKHRyYWNrLT5tQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIHRyYWNrLT5tQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKICAgICB9CkBAIC01NTMsMTIgKzUzNywxMSBAQAogICAgIC8vIGhhcHRpYwogICAgIHQtPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBmYWxzZTsKICAgICB0LT5tSGFwdGljSW50ZW5zaXR5ID0gb3M6OkhhcHRpY1NjYWxlOjpOT05FOworICAgIHQtPm1IYXB0aWNNYXhBbXBsaXR1ZGUgPSBOQU47CiAgICAgdC0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CiAgICAgdC0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50ID0gMDsKICAgICB0LT5tQWRqdXN0SW5DaGFubmVsQ291bnQgPSB0LT5jaGFubmVsQ291bnQgKyB0LT5tSGFwdGljQ2hhbm5lbENvdW50OwotICAgIHQtPm1BZGp1c3RPdXRDaGFubmVsQ291bnQgPSB0LT5jaGFubmVsQ291bnQgKyB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQ7Ci0gICAgdC0+bUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQgPSB0LT5tQWRqdXN0T3V0Q2hhbm5lbENvdW50OwotICAgIHQtPm1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCA9IHQtPmNoYW5uZWxDb3VudDsKKyAgICB0LT5tQWRqdXN0T3V0Q2hhbm5lbENvdW50ID0gdC0+Y2hhbm5lbENvdW50OwogICAgIHQtPm1LZWVwQ29udHJhY3RlZENoYW5uZWxzID0gZmFsc2U7CiAgICAgLy8gQ2hlY2sgdGhlIGRvd25taXhpbmcgKG9yIHVwbWl4aW5nKSByZXF1aXJlbWVudHMuCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdC0+cHJlcGFyZUZvckRvd25taXgoKTsKQEAgLTU2OSw4ICs1NTIsNyBAQAogICAgIC8vIHByZXBhcmVGb3JEb3dubWl4KCkgbWF5IGNoYW5nZSBtRG93bm1peFJlcXVpcmVzRm9ybWF0CiAgICAgQUxPR1ZWKCJtTWl4ZXJGb3JtYXQ6JSN4ICBtTWl4ZXJJbkZvcm1hdDolI3hcbiIsIHQtPm1NaXhlckZvcm1hdCwgdC0+bU1peGVySW5Gb3JtYXQpOwogICAgIHQtPnByZXBhcmVGb3JSZWZvcm1hdCgpOwotICAgIHQtPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKLSAgICB0LT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKyAgICB0LT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMobUZyYW1lQ291bnQpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNjAyLDcgKzU4NCw4IEBACiAgICAgICAgICAgICAgICAgc3dpdGNoICh0LT5tTWl4ZXJGb3JtYXQpIHsKICAgICAgICAgICAgICAgICAvLyBNaXhlciBmb3JtYXQgc2hvdWxkIGJlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQuCiAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOiB7Ci0gICAgICAgICAgICAgICAgICAgIG9zOjpzY2FsZUhhcHRpY0RhdGEoKGZsb2F0KikgYnVmZmVyLCBzYW1wbGVDb3VudCwgdC0+bUhhcHRpY0ludGVuc2l0eSk7CisgICAgICAgICAgICAgICAgICAgIG9zOjpzY2FsZUhhcHRpY0RhdGEoKGZsb2F0KikgYnVmZmVyLCBzYW1wbGVDb3VudCwgdC0+bUhhcHRpY0ludGVuc2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5tSGFwdGljTWF4QW1wbGl0dWRlKTsKICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtTWl4ZXJGb3JtYXQ6ICUjeCIsIHQtPm1NaXhlckZvcm1hdCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlck9wcy5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXJPcHMuaAppbmRleCBjZDQ3ZGM2Li5hYjZhOGI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlck9wcy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyT3BzLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19NSVhFUl9PUFNfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX01JWEVSX09QU19ICiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMjI5LDE1ICsyMzEsMjYgQEAKICAqIGNvbXBsZXhpdHkgb2Ygd29ya2luZyBvbiBpbnRlcmxlYXZlZCBzdHJlYW1zIGlzIG5vdyBnZXR0aW5nCiAgKiB0b28gaGlnaCwgYW5kIGxpa2VseSBsaW1pdHMgY29tcGlsZXIgb3B0aW1pemF0aW9uLgogICovCi10ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIGludCBOQ0hBTiwKKworLy8gY29tcGlsZS10aW1lIGZ1bmN0aW9uLgorY29uc3RleHByIGlubGluZSBib29sIHVzZXNDZW50ZXJDaGFubmVsKGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2spIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgYXVkaW9fdXRpbHM6OmNoYW5uZWxzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RkOjpzaXplKGtTaWRlRnJvbUNoYW5uZWxJZHgpOyArK2kpIHsKKyAgICAgICAgaWYgKChtYXNrICYgKDEgPDwgaSkpICE9IDAgJiYga1NpZGVGcm9tQ2hhbm5lbElkeFtpXSA9PSBBVURJT19HRU9NRVRSWV9TSURFX0NFTlRFUikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKgorICogQXBwbGllcyBzdGVyZW8gdm9sdW1lIHRvIHRoZSBhdWRpbyBkYXRhIGJhc2VkIG9uIHByb3BlciBsZWZ0IHJpZ2h0IGNoYW5uZWwgYWZmaW5pdHkKKyAqICh0ZW1wbGF0ZWQgY2hhbm5lbCBNQVNLIHBhcmFtZXRlcikuCisgKi8KK3RlbXBsYXRlIDxpbnQgTUlYVFlQRSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgTUFTSywKICAgICAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUViwKICAgICAgICAgdHlwZW5hbWUgRj4KLXZvaWQgc3RlcmVvVm9sdW1lSGVscGVyKFRPKiYgb3V0LCBjb25zdCBUSSomIGluLCBjb25zdCBUViAqdm9sLCBGIGYpIHsKLSAgICBzdGF0aWNfYXNzZXJ0KE5DSEFOID4gMCAmJiBOQ0hBTiA8PSBGQ0NfTElNSVQpOwotICAgIHN0YXRpY19hc3NlcnQoTUlYVFlQRSA9PSBNSVhUWVBFX01VTFRJX1NURVJFT1ZPTAotICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX1NURVJFT1ZPTAotICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX1NURVJFT0VYUEFORAotICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQpOwordm9pZCBzdGVyZW9Wb2x1bWVIZWxwZXJXaXRoQ2hhbm5lbE1hc2soVE8qJiBvdXQsIGNvbnN0IFRJKiYgaW4sIGNvbnN0IFRWICp2b2wsIEYgZikgewogICAgIGF1dG8gcHJvYyA9IFtdKGF1dG8mIGEsIGNvbnN0IGF1dG8mIGIpIHsKICAgICAgICAgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MCiAgICAgICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX1NURVJFT0VYUEFORApAQCAtMjUwLDU5ICsyNjMsMTEzIEBACiAgICAgYXV0byBpbnAgPSBbJmluXSgpIC0+IGNvbnN0IFRJJiB7CiAgICAgICAgIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX1NURVJFT0VYUEFORAogICAgICAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5EKSB7Ci0gICAgICAgICAgICByZXR1cm4gKmluOworICAgICAgICAgICAgcmV0dXJuICppbjsgLy8gbm90ZSBTVEVSRU9FWFBBTkQgYXNzdW1lcyByZXBsaWNhdGVkIEwvUiBjaGFubmVscyAoc2VlIGRvYyBiZWxvdykuCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gKmluKys7CiAgICAgICAgIH0KICAgICB9OwogCi0gICAgLy8gSEFMcyBzaG91bGQgb25seSBleHBvc2UgdGhlIGNhbm9uaWNhbCBjaGFubmVsIG1hc2tzLgotICAgIHByb2MoKm91dCsrLCBmKGlucCgpLCB2b2xbMF0pKTsgLy8gZnJvbnQgbGVmdAotICAgIGlmIGNvbnN0ZXhwciAoTkNIQU4gPT0gMSkgcmV0dXJuOwotICAgIHByb2MoKm91dCsrLCBmKGlucCgpLCB2b2xbMV0pKTsgLy8gZnJvbnQgcmlnaHQKLSAgICBpZiBjb25zdGV4cHIgKE5DSEFOID09IDIpICByZXR1cm47Ci0gICAgaWYgY29uc3RleHByIChOQ0hBTiA9PSA0KSB7Ci0gICAgICAgIHByb2MoKm91dCsrLCBmKGlucCgpLCB2b2xbMF0pKTsgLy8gYmFjayBsZWZ0Ci0gICAgICAgIHByb2MoKm91dCsrLCBmKGlucCgpLCB2b2xbMV0pKTsgLy8gYmFjayByaWdodAotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVE9ETzogUHJlY29tcHV0ZSBjZW50ZXIgdm9sdW1lIGlmIG5vdCByYW1waW5nLgogICAgIHN0ZDo6ZGVjYXlfdDxUVj4gY2VudGVyOwotICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc19mbG9hdGluZ19wb2ludF92PFRWPikgewotICAgICAgICBjZW50ZXIgPSAodm9sWzBdICsgdm9sWzFdKSAqIDAuNTsgICAgICAgLy8gZG8gbm90IHVzZSBkaXZpZGUKLSAgICB9IGVsc2UgewotICAgICAgICBjZW50ZXIgPSAodm9sWzBdID4+IDEpICsgKHZvbFsxXSA+PiAxKTsgLy8gcm91bmRzIHRvIDAuCi0gICAgfQotICAgIHByb2MoKm91dCsrLCBmKGlucCgpLCBjZW50ZXIpKTsgLy8gY2VudGVyIChvciAyLjEgTEZFKQotICAgIGlmIGNvbnN0ZXhwciAoTkNIQU4gPT0gMykgcmV0dXJuOwotICAgIGlmIGNvbnN0ZXhwciAoTkNIQU4gPT0gNSkgewotICAgICAgICBwcm9jKCpvdXQrKywgZihpbnAoKSwgdm9sWzBdKSk7ICAvLyBiYWNrIGxlZnQKLSAgICAgICAgcHJvYygqb3V0KyssIGYoaW5wKCksIHZvbFsxXSkpOyAgLy8gYmFjayByaWdodAotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHJvYygqb3V0KyssIGYoaW5wKCksIGNlbnRlcikpOyAvLyBsZmUKLSAgICBwcm9jKCpvdXQrKywgZihpbnAoKSwgdm9sWzBdKSk7IC8vIGJhY2sgbGVmdAotICAgIHByb2MoKm91dCsrLCBmKGlucCgpLCB2b2xbMV0pKTsgLy8gYmFjayByaWdodAotICAgIGlmIGNvbnN0ZXhwciAoTkNIQU4gPT0gNikgcmV0dXJuOwotICAgIGlmIGNvbnN0ZXhwciAoTkNIQU4gPT0gNykgewotICAgICAgICBwcm9jKCpvdXQrKywgZihpbnAoKSwgY2VudGVyKSk7IC8vIGJhY2sgY2VudGVyCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gTkNIQU4gPT0gOAotICAgIHByb2MoKm91dCsrLCBmKGlucCgpLCB2b2xbMF0pKTsgLy8gc2lkZSBsZWZ0Ci0gICAgcHJvYygqb3V0KyssIGYoaW5wKCksIHZvbFsxXSkpOyAvLyBzaWRlIHJpZ2h0Ci0gICAgaWYgY29uc3RleHByIChOQ0hBTiA+IEZDQ184KSB7Ci0gICAgICAgIC8vIE11dGVzIHRvIHplcm8gZXh0ZW5kZWQgc3Vycm91bmQgY2hhbm5lbHMuCi0gICAgICAgIC8vIDcuMS40IGhhcyB0aGUgY29ycmVjdCBiZWhhdmlvci4KLSAgICAgICAgLy8gMjIuMiBoYXMgdGhlIGJlaGF2aW9yIHRoYXQgRkxDIGFuZCBGUkMgd2lsbCBiZSBtaXhlZCBpbnN0ZWFkCi0gICAgICAgIC8vIG9mIFNMIGFuZCBTUiBhbmQgTEZFIHdpbGwgYmUgY2VudGVyLCBub3QgbGVmdC4KLSAgICAgICAgZm9yIChpbnQgaSA9IDg7IGkgPCBOQ0hBTjsgKytpKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBDb25zaWRlciB1c2luZyBhbmRyb2lkOjphdWRpb191dGlsczo6Y2hhbm5lbHM6OmtTaWRlRnJvbUNoYW5uZWxJZHgKLSAgICAgICAgICAgIHByb2MoKm91dCsrLCBmKGlucCgpLCAwLmYpKTsKKyAgICBjb25zdGV4cHIgYm9vbCBVU0VTX0NFTlRFUl9DSEFOTkVMID0gdXNlc0NlbnRlckNoYW5uZWwoTUFTSyk7CisgICAgaWYgY29uc3RleHByIChVU0VTX0NFTlRFUl9DSEFOTkVMKSB7CisgICAgICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc19mbG9hdGluZ19wb2ludF92PFRWPikgeworICAgICAgICAgICAgY2VudGVyID0gKHZvbFswXSArIHZvbFsxXSkgKiAwLjU7ICAgICAgIC8vIGRvIG5vdCB1c2UgZGl2aWRlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjZW50ZXIgPSAodm9sWzBdID4+IDEpICsgKHZvbFsxXSA+PiAxKTsgLy8gcm91bmRzIHRvIDAuCiAgICAgICAgIH0KICAgICB9CisKKyAgICB1c2luZyBuYW1lc3BhY2UgYXVkaW9fdXRpbHM6OmNoYW5uZWxzOworCisgICAgLy8gaWYgTEZFIGFuZCBMRkUyIGFyZSBib3RoIHByZXNlbnQsIHRoZXkgdGFrZSBsZWZ0IGFuZCByaWdodCB2b2x1bWUgcmVzcGVjdGl2ZWx5LgorICAgIGNvbnN0ZXhwciB1bnNpZ25lZCBMRkVfTEZFMiA9IFwKKyAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZIHwgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWV8yOworICAgIGNvbnN0ZXhwciBib29sIGhhc19MRkVfTEZFMiA9IChNQVNLICYgTEZFX0xGRTIpID09IExGRV9MRkUyOworCisjcHJhZ21hIHB1c2hfbWFjcm8oIkRPX0NIQU5ORUxfUE9TSVRJT04iKQorI3VuZGVmIERPX0NIQU5ORUxfUE9TSVRJT04KKyNkZWZpbmUgRE9fQ0hBTk5FTF9QT1NJVElPTihCSVRfSU5ERVgpIFwKKyAgICBpZiBjb25zdGV4cHIgKChNQVNLICYgKDEgPDwgQklUX0lOREVYKSkgIT0gMCkgeyBcCisgICAgICAgIGNvbnN0ZXhwciBhdXRvIHNpZGUgPSBrU2lkZUZyb21DaGFubmVsSWR4W0JJVF9JTkRFWF07IFwKKyAgICAgICAgaWYgY29uc3RleHByIChzaWRlID09IEFVRElPX0dFT01FVFJZX1NJREVfTEVGVCB8fCBcCisgICAgICAgICAgICAgICBoYXNfTEZFX0xGRTIgJiYgKDEgPDwgQklUX0lOREVYKSA9PSBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKSB7IFwKKyAgICAgICAgICAgIHByb2MoKm91dCsrLCBmKGlucCgpLCB2b2xbMF0pKTsgXAorICAgICAgICB9IGVsc2UgaWYgY29uc3RleHByIChzaWRlID09IEFVRElPX0dFT01FVFJZX1NJREVfUklHSFQgfHwgXAorICAgICAgICAgICAgICAgaGFzX0xGRV9MRkUyICYmICgxIDw8IEJJVF9JTkRFWCkgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWV8yKSB7IFwKKyAgICAgICAgICAgIHByb2MoKm91dCsrLCBmKGlucCgpLCB2b2xbMV0pKTsgXAorICAgICAgICB9IGVsc2UgLyogY29uc3RleHByICovIHsgXAorICAgICAgICAgICAgcHJvYygqb3V0KyssIGYoaW5wKCksIGNlbnRlcikpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oMCk7CisgICAgRE9fQ0hBTk5FTF9QT1NJVElPTigxKTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDIpOworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oMyk7CisgICAgRE9fQ0hBTk5FTF9QT1NJVElPTig0KTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDUpOworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oNik7CisgICAgRE9fQ0hBTk5FTF9QT1NJVElPTig3KTsKKworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oOCk7CisgICAgRE9fQ0hBTk5FTF9QT1NJVElPTig5KTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDEwKTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDExKTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDEyKTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDEzKTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDE0KTsKKyAgICBET19DSEFOTkVMX1BPU0lUSU9OKDE1KTsKKworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oMTYpOworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oMTcpOworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oMTgpOworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oMTkpOworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oMjApOworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oMjEpOworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oMjIpOworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oMjMpOworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oMjQpOworICAgIERPX0NIQU5ORUxfUE9TSVRJT04oMjUpOworICAgIHN0YXRpY19hc3NlcnQoRkNDX0xJTUlUIDw9IEZDQ18yNik7IC8vIE5vdGU6IHRoaXMgbWF5IG5lZWQgdG8gY2hhbmdlLgorI3ByYWdtYSBwb3BfbWFjcm8oIkRPX0NIQU5ORUxfUE9TSVRJT04iKQorfQorCisvLyBUaGVzZSBhcmUgdGhlIGNoYW5uZWwgcG9zaXRpb24gbWFza3Mgd2UgZXhwZWN0IGZyb20gdGhlIEhBTC4KKy8vIFNlZSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoKSBidXQgdGhpcyBpcyBjb25zdGV4cHIKK2NvbnN0ZXhwciBpbmxpbmUgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2Fub25pY2FsQ2hhbm5lbE1hc2tGcm9tQ291bnQoc2l6ZV90IGNoYW5uZWxDb3VudCkgeworICAgIGNvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBjYW5vbmljYWxbXSA9IHsKKyAgICAgICAgWzBdID0gQVVESU9fQ0hBTk5FTF9OT05FLAorICAgICAgICBbMV0gPSBBVURJT19DSEFOTkVMX09VVF9NT05PLAorICAgICAgICBbMl0gPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCisgICAgICAgIFszXSA9IEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDEsCisgICAgICAgIFs0XSA9IEFVRElPX0NIQU5ORUxfT1VUX1FVQUQsCisgICAgICAgIFs1XSA9IEFVRElPX0NIQU5ORUxfT1VUX1BFTlRBLAorICAgICAgICBbNl0gPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLAorICAgICAgICBbN10gPSBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxLAorICAgICAgICBbOF0gPSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxLAorICAgICAgICBbMTJdID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UNCwKKyAgICAgICAgWzE0XSA9IEFVRElPX0NIQU5ORUxfT1VUXzlQT0lOVDFQT0lOVDQsCisgICAgICAgIFsxNl0gPSBBVURJT19DSEFOTkVMX09VVF85UE9JTlQxUE9JTlQ2LAorICAgICAgICBbMjRdID0gQVVESU9fQ0hBTk5FTF9PVVRfMjJQT0lOVDIsCisgICAgfTsKKyAgICByZXR1cm4gY2hhbm5lbENvdW50IDwgc3RkOjpzaXplKGNhbm9uaWNhbCkgPyBjYW5vbmljYWxbY2hhbm5lbENvdW50XSA6IEFVRElPX0NIQU5ORUxfTk9ORTsKK30KKwordGVtcGxhdGUgPGludCBNSVhUWVBFLCBpbnQgTkNIQU4sCisgICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsCisgICAgICAgIHR5cGVuYW1lIEY+Cit2b2lkIHN0ZXJlb1ZvbHVtZUhlbHBlcihUTyomIG91dCwgY29uc3QgVEkqJiBpbiwgY29uc3QgVFYgKnZvbCwgRiBmKSB7CisgICAgc3RhdGljX2Fzc2VydChOQ0hBTiA+IDAgJiYgTkNIQU4gPD0gRkNDX0xJTUlUKTsKKyAgICBzdGF0aWNfYXNzZXJ0KE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wKKyAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9TVEVSRU9WT0wKKyAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9TVEVSRU9FWFBBTkQKKyAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5EKTsKKyAgICBjb25zdGV4cHIgYXVkaW9fY2hhbm5lbF9tYXNrX3QgTUFTS3tjYW5vbmljYWxDaGFubmVsTWFza0Zyb21Db3VudChOQ0hBTil9OworICAgIGlmIGNvbnN0ZXhwciAoTUFTSyA9PSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHBvc2l0aW9uIGNvdW50ICVkIiwgX19mdW5jX18sIE5DSEFOKTsKKyAgICAgICAgcmV0dXJuOyAvLyBub3QgYSB2YWxpZCBzeXN0ZW0gbWFzaywgaWdub3JlLgorICAgIH0KKyAgICBzdGVyZW9Wb2x1bWVIZWxwZXJXaXRoQ2hhbm5lbE1hc2s8TUlYVFlQRSwgTUFTSywgVE8sIFRJLCBUViwgRj4ob3V0LCBpbiwgdm9sLCBmKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAKaW5kZXggNmQzMWMxMi4uNDY1OGRiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAKQEAgLTM2NCw2ICszNjQsMjkgQEAKICAgICAgICAgICAgIHNyYywgbUlucHV0Q2hhbm5lbHMsIG1JZHhBcnksIG1TYW1wbGVTaXplLCBmcmFtZXMpOwogfQogCitDaGFubmVsTWl4QnVmZmVyUHJvdmlkZXI6OkNoYW5uZWxNaXhCdWZmZXJQcm92aWRlcihhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGlucHV0Q2hhbm5lbE1hc2spLAorICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhvdXRwdXRDaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAgYnVmZmVyRnJhbWVDb3VudCkKK3sKKyAgICBBTE9HVigiQ2hhbm5lbE1peEJ1ZmZlclByb3ZpZGVyKCVwKSglI3gsICUjeCwgJSN4KSIsCisgICAgICAgICAgICB0aGlzLCBmb3JtYXQsIGlucHV0Q2hhbm5lbE1hc2ssIG91dHB1dENoYW5uZWxNYXNrKTsKKyAgICBpZiAob3V0cHV0Q2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPICYmIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIG1Jc1ZhbGlkID0gbUNoYW5uZWxNaXguc2V0SW5wdXRDaGFubmVsTWFzayhpbnB1dENoYW5uZWxNYXNrKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2hhbm5lbE1peEJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQoreworICAgIG1DaGFubmVsTWl4LnByb2Nlc3Moc3RhdGljX2Nhc3Q8Y29uc3QgZmxvYXQgKj4oc3JjKSwgc3RhdGljX2Nhc3Q8ZmxvYXQgKj4oZHN0KSwKKyAgICAgICAgICAgIGZyYW1lcywgZmFsc2UgLyogYWNjdW11bGF0ZSAqLyk7Cit9CisKIFJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6OlJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoaW50MzJfdCBjaGFubmVsQ291bnQsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0LCBhdWRpb19mb3JtYXRfdCBvdXRwdXRGb3JtYXQsCiAgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6CkBAIC02MzAsNyArNjUzLDggQEAKIAogQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjo6QWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcigKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBzaXplX3QgaW5DaGFubmVsQ291bnQsIHNpemVfdCBvdXRDaGFubmVsQ291bnQsCi0gICAgICAgIHNpemVfdCBmcmFtZUNvdW50LCBhdWRpb19mb3JtYXRfdCBjb250cmFjdGVkRm9ybWF0LCB2b2lkKiBjb250cmFjdGVkQnVmZmVyKSA6CisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LCBhdWRpb19mb3JtYXRfdCBjb250cmFjdGVkRm9ybWF0LCB2b2lkKiBjb250cmFjdGVkQnVmZmVyLAorICAgICAgICBzaXplX3QgY29udHJhY3RlZE91dENoYW5uZWxDb3VudCkgOgogICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoCiAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKGluQ2hhbm5lbENvdW50LCBmb3JtYXQpLAogICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShzdGQ6Om1heChpbkNoYW5uZWxDb3VudCwgb3V0Q2hhbm5lbENvdW50KSwgZm9ybWF0KSwKQEAgLTY0MCwxNSArNjY0LDIyIEBACiAgICAgICAgIG1PdXRDaGFubmVsQ291bnQob3V0Q2hhbm5lbENvdW50KSwKICAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzKGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSksCiAgICAgICAgIG1GcmFtZUNvdW50KGZyYW1lQ291bnQpLAotICAgICAgICBtQ29udHJhY3RlZENoYW5uZWxDb3VudChpbkNoYW5uZWxDb3VudCAtIG91dENoYW5uZWxDb3VudCksCi0gICAgICAgIG1Db250cmFjdGVkRm9ybWF0KGNvbnRyYWN0ZWRGb3JtYXQpLAorICAgICAgICBtQ29udHJhY3RlZEZvcm1hdChpbkNoYW5uZWxDb3VudCA+IG91dENoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgID8gY29udHJhY3RlZEZvcm1hdCA6IEFVRElPX0ZPUk1BVF9JTlZBTElEKSwKKyAgICAgICAgbUNvbnRyYWN0ZWRJbkNoYW5uZWxDb3VudChpbkNoYW5uZWxDb3VudCA+IG91dENoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgID8gaW5DaGFubmVsQ291bnQgLSBvdXRDaGFubmVsQ291bnQgOiAwKSwKKyAgICAgICAgbUNvbnRyYWN0ZWRPdXRDaGFubmVsQ291bnQoY29udHJhY3RlZE91dENoYW5uZWxDb3VudCksCisgICAgICAgIG1Db250cmFjdGVkU2FtcGxlU2l6ZUluQnl0ZXMoYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShjb250cmFjdGVkRm9ybWF0KSksCisgICAgICAgIG1Db250cmFjdGVkSW5wdXRGcmFtZVNpemUobUNvbnRyYWN0ZWRJbkNoYW5uZWxDb3VudCAqIG1Db250cmFjdGVkU2FtcGxlU2l6ZUluQnl0ZXMpLAogICAgICAgICBtQ29udHJhY3RlZEJ1ZmZlcihjb250cmFjdGVkQnVmZmVyKSwKICAgICAgICAgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzKDApCiB7Ci0gICAgQUxPR1YoIkFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoJXApKCUjeCwgJXp1LCAlenUsICV6dSwgJSN4LCAlcCkiLCB0aGlzLCBmb3JtYXQsCi0gICAgICAgICAgICBpbkNoYW5uZWxDb3VudCwgb3V0Q2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBjb250cmFjdGVkRm9ybWF0LCBjb250cmFjdGVkQnVmZmVyKTsKKyAgICBBTE9HVigiQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlciglcCkoJSN4LCAlenUsICV6dSwgJXp1LCAlI3gsICVwLCAlenUpIiwKKyAgICAgICAgICB0aGlzLCBmb3JtYXQsIGluQ2hhbm5lbENvdW50LCBvdXRDaGFubmVsQ291bnQsIGZyYW1lQ291bnQsIGNvbnRyYWN0ZWRGb3JtYXQsCisgICAgICAgICAgY29udHJhY3RlZEJ1ZmZlciwgY29udHJhY3RlZE91dENoYW5uZWxDb3VudCk7CiAgICAgaWYgKG1Db250cmFjdGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEICYmIG1JbkNoYW5uZWxDb3VudCA+IG1PdXRDaGFubmVsQ291bnQpIHsKLSAgICAgICAgbUNvbnRyYWN0ZWRGcmFtZVNpemUgPSBhdWRpb19ieXRlc19wZXJfZnJhbWUobUNvbnRyYWN0ZWRDaGFubmVsQ291bnQsIG1Db250cmFjdGVkRm9ybWF0KTsKKyAgICAgICAgbUNvbnRyYWN0ZWRPdXRwdXRGcmFtZVNpemUgPQorICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQ29udHJhY3RlZE91dENoYW5uZWxDb3VudCwgbUNvbnRyYWN0ZWRGb3JtYXQpOwogICAgIH0KIH0KIApAQCAtNjY3LDI1ICs2OTgsMzkgQEAKIAogdm9pZCBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQogewotICAgIGlmIChtSW5DaGFubmVsQ291bnQgPiBtT3V0Q2hhbm5lbENvdW50KSB7Ci0gICAgICAgIC8vIEZvciBjYXNlIG11bHRpIHRvIG1vbm8sIGFkanVzdF9jaGFubmVscyBoYXMgc3BlY2lhbCBsb2dpYyB0aGF0IHdpbGwgbWl4IGZpcnN0IHR3byBpbnB1dAotICAgICAgICAvLyBjaGFubmVscyBpbnRvIGEgc2luZ2xlIG91dHB1dCBjaGFubmVsLiBJbiB0aGF0IGNhc2UsIHVzZSBhZGp1c3RfY2hhbm5lbHNfbm9uX2Rlc3RydWN0aXZlCi0gICAgICAgIC8vIHRvIGtlZXAgb25seSBvbmUgY2hhbm5lbCBkYXRhIGV2ZW4gd2hlbiBjb250cmFjdGluZyB0byBtb25vLgotICAgICAgICBhZGp1c3RfY2hhbm5lbHNfbm9uX2Rlc3RydWN0aXZlKHNyYywgbUluQ2hhbm5lbENvdW50LCBkc3QsIG1PdXRDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzLCBmcmFtZXMgKiBtSW5DaGFubmVsQ291bnQgKiBtU2FtcGxlU2l6ZUluQnl0ZXMpOwotICAgICAgICBpZiAobUNvbnRyYWN0ZWRGb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQKLSAgICAgICAgICAgICYmIG1Db250cmFjdGVkQnVmZmVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBjb250cmFjdGVkSWR4ID0gZnJhbWVzICogbU91dENoYW5uZWxDb3VudCAqIG1TYW1wbGVTaXplSW5CeXRlczsKKyAgICAvLyBGb3IgY2FzZSBtdWx0aSB0byBtb25vLCBhZGp1c3RfY2hhbm5lbHMgaGFzIHNwZWNpYWwgbG9naWMgdGhhdCB3aWxsIG1peCBmaXJzdCB0d28gaW5wdXQKKyAgICAvLyBjaGFubmVscyBpbnRvIGEgc2luZ2xlIG91dHB1dCBjaGFubmVsLiBJbiB0aGF0IGNhc2UsIHVzZSBhZGp1c3RfY2hhbm5lbHNfbm9uX2Rlc3RydWN0aXZlCisgICAgLy8gdG8ga2VlcCBvbmx5IG9uZSBjaGFubmVsIGRhdGEgZXZlbiB3aGVuIGNvbnRyYWN0aW5nIHRvIG1vbm8uCisgICAgYWRqdXN0X2NoYW5uZWxzX25vbl9kZXN0cnVjdGl2ZShzcmMsIG1JbkNoYW5uZWxDb3VudCwgZHN0LCBtT3V0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzLCBmcmFtZXMgKiBtSW5DaGFubmVsQ291bnQgKiBtU2FtcGxlU2l6ZUluQnl0ZXMpOworICAgIGlmIChtQ29udHJhY3RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRAorICAgICAgICAmJiBtQ29udHJhY3RlZEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBjb250cmFjdGVkSWR4ID0gZnJhbWVzICogbU91dENoYW5uZWxDb3VudCAqIG1TYW1wbGVTaXplSW5CeXRlczsKKyAgICAgICAgdWludDhfdCogb3JpQnVmID0gKHVpbnQ4X3QqKSBkc3QgKyBjb250cmFjdGVkSWR4OworICAgICAgICB1aW50OF90KiBidWYgPSAodWludDhfdCopIG1Db250cmFjdGVkQnVmZmVyCisgICAgICAgICAgICAgICAgKyBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMgKiBtQ29udHJhY3RlZE91dHB1dEZyYW1lU2l6ZTsKKyAgICAgICAgaWYgKG1Db250cmFjdGVkSW5DaGFubmVsQ291bnQgPiBtQ29udHJhY3RlZE91dENoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBjaGFubmVscyBmaXJzdCBhcyB0aGUgY29udHJhY3RlZCBidWZmZXIgbWF5IG5vdCBoYXZlIGVub3VnaAorICAgICAgICAgICAgLy8gc3BhY2UgZm9yIHRoZSBkYXRhLgorICAgICAgICAgICAgLy8gVXNlIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUgdG8gYXZvaWQgbWl4IGZpcnN0IHR3byBjaGFubmVscyBpbnRvIG9uZSBzaW5nbGUKKyAgICAgICAgICAgIC8vIG91dHB1dCBjaGFubmVsIHdoZW4gaXQgaXMgbXVsdGkgdG8gbW9uby4KKyAgICAgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUoCisgICAgICAgICAgICAgICAgICAgIG9yaUJ1ZiwgbUNvbnRyYWN0ZWRJbkNoYW5uZWxDb3VudCwgb3JpQnVmLCBtQ29udHJhY3RlZE91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzLCBmcmFtZXMgKiBtQ29udHJhY3RlZEluQ2hhbm5lbENvdW50ICogbVNhbXBsZVNpemVJbkJ5dGVzKTsKICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICh1aW50OF90KikgbUNvbnRyYWN0ZWRCdWZmZXIgKyBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMgKiBtQ29udHJhY3RlZEZyYW1lU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyYWN0ZWRGb3JtYXQsICh1aW50OF90KikgZHN0ICsgY29udHJhY3RlZElkeCwgbUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyYWN0ZWRDaGFubmVsQ291bnQgKiBmcmFtZXMpOwotICAgICAgICAgICAgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzICs9IGZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgYnVmLCBtQ29udHJhY3RlZEZvcm1hdCwgb3JpQnVmLCBtRm9ybWF0LCBtQ29udHJhY3RlZE91dENoYW5uZWxDb3VudCAqIGZyYW1lcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBDb3B5IHRoZSBkYXRhIGZpcnN0IGFzIHRoZSBkc3QgYnVmZmVyIG1heSBub3QgaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIGV4dHJhIGNoYW5uZWwuCisgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KAorICAgICAgICAgICAgICAgIGJ1ZiwgbUNvbnRyYWN0ZWRGb3JtYXQsIG9yaUJ1ZiwgbUZvcm1hdCwgbUNvbnRyYWN0ZWRJbkNoYW5uZWxDb3VudCAqIGZyYW1lcyk7CisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgaWYgdGhlIGNvbnRyYWN0ZWQgZGF0YSBpcyBmcm9tIE1PTk8gdG8gTVVMVElDSEFOTkVMLCB0aGUgZmlyc3QgMiBjaGFubmVscworICAgICAgICAgICAgLy8gd2lsbCBiZSBkdXBsaWNhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNpbmdsZSBpbnB1dCBjaGFubmVsIGFuZCBhbGwgdGhlIG90aGVyIGNoYW5uZWxzCisgICAgICAgICAgICAvLyB3aWxsIGJlIDAtZmlsbGVkLgorICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzKAorICAgICAgICAgICAgICAgICAgICBidWYsIG1Db250cmFjdGVkSW5DaGFubmVsQ291bnQsIGJ1ZiwgbUNvbnRyYWN0ZWRPdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIG1Db250cmFjdGVkU2FtcGxlU2l6ZUluQnl0ZXMsIG1Db250cmFjdGVkSW5wdXRGcmFtZVNpemUgKiBmcmFtZXMpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gUHJlZmVyIGV4cGFuZGluZyBkYXRhIGZyb20gdGhlIGVuZCBvZiBlYWNoIGF1ZGlvIGZyYW1lLgotICAgICAgICBhZGp1c3RfY2hhbm5lbHMoc3JjLCBtSW5DaGFubmVsQ291bnQsIGRzdCwgbU91dENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICBtU2FtcGxlU2l6ZUluQnl0ZXMsIGZyYW1lcyAqIG1JbkNoYW5uZWxDb3VudCAqIG1TYW1wbGVTaXplSW5CeXRlcyk7CisgICAgICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyArPSBmcmFtZXM7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGU1YTlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDEyIEBACit7CisgICJwcmVzdWJtaXQiOiBbCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTmF0aXZlTWVkaWFBQXVkaW9UZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiIDogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubmF0aXZlbWVkaWEuYWF1ZGlvLkFBdWRpb1Rlc3RzI0FBdWRpb0Jhc2ljLioiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaAppbmRleCA3MGVhZmUzLi4yOTkzYTYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCkBAIC01MCw2ICs1MCw3IEBACiAgICAgICAgIC8vIGZvciBoYXB0aWMKICAgICAgICAgSEFQVElDX0VOQUJMRUQgID0gMHg0MDA3LCAvLyBTZXQgaGFwdGljIGRhdGEgZnJvbSB0aGlzIHRyYWNrIHNob3VsZCBiZSBwbGF5ZWQgb3Igbm90LgogICAgICAgICBIQVBUSUNfSU5URU5TSVRZID0gMHg0MDA4LCAvLyBTZXQgdGhlIGludGVuc2l0eSB0byBwbGF5IGhhcHRpYyBkYXRhLgorICAgICAgICBIQVBUSUNfTUFYX0FNUExJVFVERSA9IDB4NDAwOSwgLy8gU2V0IHRoZSBtYXggYW1wbGl0dWRlIGFsbG93ZWQgZm9yIGhhcHRpYyBkYXRhLgogICAgICAgICAvLyBmb3IgdGFyZ2V0IFRJTUVTVFJFVENICiAgICAgICAgIFBMQVlCQUNLX1JBVEUgICA9IDB4NDMwMCwgLy8gQ29uZmlndXJlIHRpbWVzdHJldGNoIG9uIHRoaXMgdHJhY2sgbmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgJ3ZhbHVlJyBpcyBhIHBvaW50ZXIgdG8gdGhlIG5ldyBwbGF5YmFjayByYXRlLgpAQCAtNzksNyArODAsNiBAQAogICAgICAgICAgICAgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKICAgICAgICAgICAgIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKICAgICAgICAgICAgIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwotICAgICAgICAgICAgbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwogICAgICAgICAgICAgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CiAgICAgICAgIH0KIApAQCAtOTQsMTAgKzk0LDggQEAKICAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yRG93bm1peCgpOwogICAgICAgICBzdGF0dXNfdCAgICBwcmVwYXJlRm9yUmVmb3JtYXQoKTsKICAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKLSAgICAgICAgc3RhdHVzX3QgICAgcHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisgICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JBZGp1c3RDaGFubmVscyhzaXplX3QgZnJhbWVzKTsKICAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKLSAgICAgICAgc3RhdHVzX3QgICAgcHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoc2l6ZV90IGZyYW1lcyk7Ci0gICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoKTsKICAgICAgICAgdm9pZCAgICAgICAgY2xlYXJDb250cmFjdGVkQnVmZmVyKCk7CiAgICAgICAgIGJvb2wgICAgICAgIHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKTsKICAgICAgICAgdm9pZCAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKQEAgLTExMywyNCArMTExLDE4IEBACiAgICAgICAgICAqIDIpIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyOiBFeHBhbmRzIG9yIGNvbnRyYWN0cyBzYW1wbGUgZGF0YSBmcm9tIG9uZSBpbnRlcmxlYXZlZAogICAgICAgICAgKiAgICBjaGFubmVsIGZvcm1hdCB0byBhbm90aGVyLiBFeHBhbmRlZCBjaGFubmVscyBhcmUgZmlsbGVkIHdpdGggemVyb3MgYW5kIHB1dCBhdCB0aGUgZW5kCiAgICAgICAgICAqICAgIG9mIGVhY2ggYXVkaW8gZnJhbWUuIENvbnRyYWN0ZWQgY2hhbm5lbHMgYXJlIGNvcGllZCB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCi0gICAgICAgICAqIDMpIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcjogTm9uLWRlc3RydWN0aXZlbHkgY29udHJhY3Qgc2FtcGxlIGRhdGEuCi0gICAgICAgICAqICAgIFRoaXMgaXMgY3VycmVudGx5IHVzaW5nIGF0IGF1ZGlvLWhhcHRpYyBjb3VwbGVkIHBsYXliYWNrIHRvIHNlcGFyYXRlIGF1ZGlvIGFuZCBoYXB0aWMKLSAgICAgICAgICogICAgZGF0YS4gQ29udHJhY3RlZCBjaGFubmVscyBjb3VsZCBiZSB3cml0dGVuIHRvIGdpdmVuIGJ1ZmZlci4KLSAgICAgICAgICogNCkgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgYXVkaW8gcmVmb3JtYXQgdG8KKyAgICAgICAgICogMykgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgYXVkaW8gcmVmb3JtYXQgdG8KICAgICAgICAgICogICAgbWF0Y2ggZWl0aGVyIG1NaXhlckluRm9ybWF0IG9yIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQsIGlmIHRoZSBkb3dubWl4ZXIKICAgICAgICAgICogICAgcmVxdWlyZXMgcmVmb3JtYXQuIEZvciBleGFtcGxlLCBpdCBtYXkgY29udmVydCBmbG9hdGluZyBwb2ludCBpbnB1dCB0bwogICAgICAgICAgKiAgICBQQ01fMTZfYml0IGlmIHRoYXQncyByZXF1aXJlZCBieSB0aGUgZG93bm1peGVyLgotICAgICAgICAgKiA1KSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgY2hhbm5lbCByZW1peGluZyB0byBtYXRjaAorICAgICAgICAgKiA0KSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgY2hhbm5lbCByZW1peGluZyB0byBtYXRjaAogICAgICAgICAgKiAgICB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHJlcXVpcmVkIGJ5IHRoZSBtaXhlciBzaW5rLgotICAgICAgICAgKiA2KSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgcmVmb3JtYXR0aW5nIGZyb20KKyAgICAgICAgICogNSkgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHJlZm9ybWF0dGluZyBmcm9tCiAgICAgICAgICAqICAgIHRoZSBkb3dubWl4ZXIgcmVxdWlyZW1lbnRzIHRvIHRoZSBtaXhlciBlbmdpbmUgaW5wdXQgcmVxdWlyZW1lbnRzLgotICAgICAgICAgKiA3KSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjogQWRkcyB0aW1lc3RyZXRjaGluZyBmb3IgcGxheWJhY2sgcmF0ZQorICAgICAgICAgKiA2KSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjogQWRkcyB0aW1lc3RyZXRjaGluZyBmb3IgcGxheWJhY2sgcmF0ZQogICAgICAgICAgKi8KICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogbUlucHV0QnVmZmVyUHJvdmlkZXI7ICAgIC8vIGV4dGVybmFsbHkgcHJvdmlkZWQgYnVmZmVyIHByb3ZpZGVyLgotICAgICAgICAvLyBUT0RPOiBjb21iaW5lIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyIGFuZAotICAgICAgICAvLyBtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIKICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI+IG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyOwotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwpAQCAtMTQ1LDE0ICsxMzcsMTMgQEAKICAgICAgICAgLy8gSGFwdGljCiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQ7CiAgICAgICAgIG9zOjpIYXB0aWNTY2FsZSAgICAgIG1IYXB0aWNJbnRlbnNpdHk7CisgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgIG1IYXB0aWNNYXhBbXBsaXR1ZGU7CiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1IYXB0aWNDaGFubmVsTWFzazsKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUhhcHRpY0NoYW5uZWxDb3VudDsKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbU1peGVySGFwdGljQ2hhbm5lbE1hc2s7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1NaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdEluQ2hhbm5lbENvdW50OwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtQWRqdXN0T3V0Q2hhbm5lbENvdW50OwotICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudDsKLSAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50OwogICAgICAgICBib29sICAgICAgICAgICAgICAgICBtS2VlcENvbnRyYWN0ZWRDaGFubmVsczsKICAgICB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oCmluZGV4IGIwMzg4NTQuLmIzYWI4YTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9DaGFubmVsTWl4Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC0xMjksNiArMTMwLDIzIEBACiAgICAgc3RhdGljIGNvbnN0IGludDMyX3QgU0VTU0lPTl9JRF9JTlZBTElEX0FORF9JR05PUkVEID0gLTI7CiB9OwogCisvLyBDaGFubmVsTWl4QnVmZmVyUHJvdmlkZXIgZGVyaXZlcyBmcm9tIENvcHlCdWZmZXJQcm92aWRlciB0byBwZXJmb3JtIGFuCisvLyBkb3dubWl4IHRvIHRoZSBwcm9wZXIgY2hhbm5lbCBjb3VudCBhbmQgbWFzay4KK2NsYXNzIENoYW5uZWxNaXhCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBDb3B5QnVmZmVyUHJvdmlkZXIgeworcHVibGljOgorICAgIENoYW5uZWxNaXhCdWZmZXJQcm92aWRlcihhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKKworICAgIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtSXNWYWxpZDsgfQorCitwcm90ZWN0ZWQ6CisgICAgYXVkaW9fdXRpbHM6OmNoYW5uZWxzOjpDaGFubmVsTWl4IG1DaGFubmVsTWl4OworICAgIGJvb2wgbUlzVmFsaWQgPSBmYWxzZTsKK307CisKIC8vIFJlbWl4QnVmZmVyUHJvdmlkZXIgZGVyaXZlcyBmcm9tIENvcHlCdWZmZXJQcm92aWRlciB0byBwZXJmb3JtIGFuCiAvLyB1cG1peCBvciBkb3dubWl4IHRvIHRoZSBwcm9wZXIgY2hhbm5lbCBjb3VudCBhbmQgbWFzay4KIGNsYXNzIFJlbWl4QnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKQEAgLTIyMywxNyArMjQxLDIyIEBACiAvLyBFeHRyYSBleHBhbmRlZCBjaGFubmVscyBhcmUgZmlsbGVkIHdpdGggemVyb3MgYW5kIHB1dCBhdCB0aGUgZW5kIG9mIGVhY2ggYXVkaW8gZnJhbWUuCiAvLyBDb250cmFjdGVkIGNoYW5uZWxzIGFyZSBjb3BpZWQgdG8gdGhlIGVuZCBvZiB0aGUgb3V0cHV0IGJ1ZmZlcihzdG9yYWdlIHNob3VsZCBiZQogLy8gYWxsb2NhdGVkIGFwcHJvcHJpYXRlbHkpLgotLy8gQ29udHJhY3RlZCBjaGFubmVscyBjb3VsZCBiZSB3cml0dGVuIHRvIG91dHB1dCBidWZmZXIuCisvLyBDb250cmFjdGVkIGNoYW5uZWxzIGNvdWxkIGJlIHdyaXR0ZW4gdG8gb3V0cHV0IGJ1ZmZlciBhbmQgZ290IGFkanVzdGVkLiBXaGVuIHRoZSBjb250cmFjdGVkCisvLyBjaGFubmVscyBhcmUgYWRqdXN0ZWQgaW4gdGhlIGNvbnRyYWN0ZWQgYnVmZmVyLCB0aGUgaW5wdXQgY2hhbm5lbCBjb3VudCB3aWxsIGJlIGNhbGN1bGF0ZWQKKy8vIGFzIGBpbkNoYW5uZWxDb3VudCAtIG91dENoYW5uZWxDb3VudGAuIFRoZSBvdXRwdXQgY2hhbm5lbCBjb3VudCBpcyBwcm92aWRlZCBieSBjYWxsZXIsIHdoaWNoCisvLyBpcyBgY29udHJhY3RlZE91dENoYW5uZWxDb3VudGAuIEN1cnJlbnRseSwgYWRqdXN0aW5nIGNvbnRyYWN0ZWQgY2hhbm5lbHMgaXMgdXNlZCBmb3IgYXVkaW8KKy8vIGNvdXBsZWQgaGFwdGljIHBsYXliYWNrLiBJZiB0aGUgZGV2aWNlIHN1cHBvcnRzIHR3byBoYXB0aWMgY2hhbm5lbHMgd2hpbGUgYXBwcyBvbmx5IHByb3ZpZGUKKy8vIHNpbmdsZSBoYXB0aWMgY2hhbm5lbCwgdGhlIHNlY29uZCBoYXB0aWMgY2hhbm5lbCB3aWxsIGJlIGR1cGxpY2F0ZWQgd2l0aCB0aGUgZmlyc3QgaGFwdGljCisvLyBjaGFubmVsJ3MgZGF0YS4gSWYgdGhlIGRldmljZSBzdXBwb3J0cyBzaW5nbGUgaGFwdGljIGNoYW5uZWxzIHdoaWxlIGFwcHMgcHJvdmlkZSB0d28gaGFwdGljCisvLyBjaGFubmVscywgdGhlIHNlY29uZCBjaGFubmVsIHdpbGwgYmUgY29udHJhY3RlZC4KIGNsYXNzIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKIHB1YmxpYzoKLSAgICBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgc2l6ZV90IGluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgc2l6ZV90IG91dENoYW5uZWxDb3VudCwgc2l6ZV90IGZyYW1lQ291bnQpIDogQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcigKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBpbkNoYW5uZWxDb3VudCwgb3V0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBBVURJT19GT1JNQVRfSU5WQUxJRCwgbnVsbHB0cikgeyB9CiAgICAgLy8gQ29udHJhY3RlZCBkYXRhIGlzIGNvbnZlcnRlZCB0byBjb250cmFjdGVkRm9ybWF0IGFuZCBwdXQgaW50byBjb250cmFjdGVkQnVmZmVyLgogICAgIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBzaXplX3QgaW5DaGFubmVsQ291bnQsCi0gICAgICAgICAgICBzaXplX3Qgb3V0Q2hhbm5lbENvdW50LCBzaXplX3QgZnJhbWVDb3VudCwgYXVkaW9fZm9ybWF0X3QgY29udHJhY3RlZEZvcm1hdCwKLSAgICAgICAgICAgIHZvaWQqIGNvbnRyYWN0ZWRCdWZmZXIpOworICAgICAgICAgICAgc2l6ZV90IG91dENoYW5uZWxDb3VudCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBjb250cmFjdGVkRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQsCisgICAgICAgICAgICB2b2lkKiBjb250cmFjdGVkQnVmZmVyID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHNpemVfdCBjb250cmFjdGVkT3V0Q2hhbm5lbENvdW50ID0gMCk7CiAgICAgLy9PdmVycmlkZXMKICAgICBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEJ1ZmZlciogcEJ1ZmZlcikgb3ZlcnJpZGU7CiAgICAgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKSBvdmVycmlkZTsKQEAgLTI0NywxMSArMjcwLDE0IEBACiAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbU91dENoYW5uZWxDb3VudDsKICAgICBjb25zdCBzaXplX3QgICAgICAgICBtU2FtcGxlU2l6ZUluQnl0ZXM7CiAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUZyYW1lQ291bnQ7Ci0gICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUNvbnRyYWN0ZWRDaGFubmVsQ291bnQ7CiAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUNvbnRyYWN0ZWRGb3JtYXQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUNvbnRyYWN0ZWRJbkNoYW5uZWxDb3VudDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtQ29udHJhY3RlZE91dENoYW5uZWxDb3VudDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtQ29udHJhY3RlZFNhbXBsZVNpemVJbkJ5dGVzOworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1Db250cmFjdGVkSW5wdXRGcmFtZVNpemU7IC8vIGNvbnRyYWN0ZWQgaW5wdXQgZnJhbWUgc2l6ZQogICAgIHZvaWQgICAgICAgICAgICAgICAgKm1Db250cmFjdGVkQnVmZmVyOwogICAgIHNpemVfdCAgICAgICAgICAgICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lczsKLSAgICBzaXplX3QgICAgICAgICAgICAgICBtQ29udHJhY3RlZEZyYW1lU2l6ZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICBtQ29udHJhY3RlZE91dHB1dEZyYW1lU2l6ZTsgLy8gY29udHJhY3RlZCBvdXRwdXQgZnJhbWUgc2l6ZQogfTsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggMzg1NjgxNy4uYWQ0MDJkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTc2LDYgKzc2LDcgQEAKIC8vCiBjY19iaW5hcnkgewogICAgIG5hbWU6ICJtaXhlcm9wc19vYmpkdW1wIiwKKyAgICBoZWFkZXJfbGliczogWyJsaWJhdWRpb3V0aWxzX2hlYWRlcnMiXSwKICAgICBzcmNzOiBbIm1peGVyb3BzX29iamR1bXAuY3BwIl0sCiB9CiAKQEAgLTg0LDYgKzg1LDE2IEBACiAvLwogY2NfYmVuY2htYXJrIHsKICAgICBuYW1lOiAibWl4ZXJvcHNfYmVuY2htYXJrIiwKKyAgICBoZWFkZXJfbGliczogWyJsaWJhdWRpb3V0aWxzX2hlYWRlcnMiXSwKICAgICBzcmNzOiBbIm1peGVyb3BzX2JlbmNobWFyay5jcHAiXSwKICAgICBzdGF0aWNfbGliczogWyJsaWJnb29nbGUtYmVuY2htYXJrIl0sCiB9CisKKy8vCisvLyBtaXhlcm9wcyB1bml0IHRlc3QKKy8vCitjY190ZXN0IHsKKyAgICBuYW1lOiAibWl4ZXJvcHNfdGVzdHMiLAorICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvcHJvY2Vzc2luZ190ZXN0X2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJtaXhlcm9wc190ZXN0cy5jcHAiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9taXhlcm9wc19iZW5jaG1hcmsuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL21peGVyb3BzX2JlbmNobWFyay5jcHAKaW5kZXggN2E0YzVjNy4uZjg2NmIxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL21peGVyb3BzX2JlbmNobWFyay5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL21peGVyb3BzX2JlbmNobWFyay5jcHAKQEAgLTE2LDExICsxNiw5IEBACiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotI2luY2x1ZGUgIi4uLy4uLy4uLy4uL3N5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlL2F1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaCIKICNkZWZpbmUgTE9HX0FMV0FZU19GQVRBTCguLi4pCiAKICNpbmNsdWRlIDwuLi9BdWRpb01peGVyT3BzLmg+Ci0KICNpbmNsdWRlIDxiZW5jaG1hcmsvYmVuY2htYXJrLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL21peGVyb3BzX3Rlc3RzLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9taXhlcm9wc190ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwMGJhOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9taXhlcm9wc190ZXN0cy5jcHAKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIm1peGVyb3BfdGVzdHMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPC4uL0F1ZGlvTWl4ZXJPcHMuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gTm90ZTogZ3Rlc3QgdGVtcGxhdGVkIHRlc3RzIHJlcXVpcmUgdHlwZW5hbWVzLCBub3QgaW50ZWdlcnMuCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIGludCBOQ0hBTj4KK2NsYXNzIE1peGVyT3BzQmFzaWNUZXN0IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgdm9pZCB0ZXN0U3RlcmVvVm9sdW1lKCkgeworICAgICAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmNoYW5uZWxzOworCisgICAgICAgIGNvbnN0ZXhwciBzaXplX3QgRlJBTUVfQ09VTlQgPSAxMDAwOworICAgICAgICBjb25zdGV4cHIgc2l6ZV90IFNBTVBMRV9DT1VOVCA9IEZSQU1FX0NPVU5UICogTkNIQU47CisKKyAgICAgICAgY29uc3QgZmxvYXQgaW5bU0FNUExFX0NPVU5UXSA9IHtbMCAuLi4gKFNBTVBMRV9DT1VOVCAtIDEpXSA9IDEuZn07CisKKyAgICAgICAgQVVESU9fR0VPTUVUUllfU0lERSBzaWRlc1tOQ0hBTl07CisgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbCA9IGNhbm9uaWNhbENoYW5uZWxNYXNrRnJvbUNvdW50KE5DSEFOKTsKKyAgICAgICAgY29uc3RleHByIHVuc2lnbmVkIExGRV9MRkUyID0KKyAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZIHwgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWV8yOworICAgICAgICBib29sIGhhc19MRkVfTEZFMiA9IChjaGFubmVsICYgTEZFX0xGRTIpID09IExGRV9MRkUyOworICAgICAgICB3aGlsZSAoY2hhbm5lbCAhPSAwKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgaW5kZXggPSBfX2J1aWx0aW5fY3R6KGNoYW5uZWwpOworICAgICAgICAgICAgaWYgKGhhc19MRkVfTEZFMiAmJiAoMSA8PCBpbmRleCkgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSkgeworICAgICAgICAgICAgICAgIHNpZGVzW2krK10gPSBBVURJT19HRU9NRVRSWV9TSURFX0xFRlQ7IC8vIHNwZWNpYWwgY2FzZQorICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNfTEZFX0xGRTIgJiYgKDEgPDwgaW5kZXgpID09IEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1lfMikgeworICAgICAgICAgICAgICAgIHNpZGVzW2krK10gPSBBVURJT19HRU9NRVRSWV9TSURFX1JJR0hUOyAvLyBzcGVjaWFsIGNhc2UKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2lkZXNbaSsrXSA9IHNpZGVGcm9tQ2hhbm5lbElkeChpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFubmVsICY9IH4oMSA8PCBpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCB2b2xhWzJdID0gezEuZiwgMC5mfTsgLy8gbGVmdCB2b2x1bWUgYXQgbWF4LgorICAgICAgICBmbG9hdCBvdXRbU0FNUExFX0NPVU5UXXt9OworICAgICAgICBmbG9hdCBhdXhbRlJBTUVfQ09VTlRde307CisgICAgICAgIGZsb2F0IHZvbGF1eCA9IDAuNTsKKyAgICAgICAgeworICAgICAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRSwgTkNIQU4+KG91dCwgRlJBTUVfQ09VTlQsIGluLCBhdXgsIHZvbGEsIHZvbGF1eCk7CisgICAgICAgICAgICBjb25zdCBmbG9hdCAqb3V0cCA9IG91dDsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICphdXhwID0gYXV4OworICAgICAgICAgICAgY29uc3QgZmxvYXQgbGVmdCA9IHZvbGFbMF07CisgICAgICAgICAgICBjb25zdCBmbG9hdCBjZW50ZXIgPSAodm9sYVswXSArIHZvbGFbMV0pICogMC41OworICAgICAgICAgICAgY29uc3QgZmxvYXQgcmlnaHQgPSB2b2xhWzFdOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGUkFNRV9DT1VOVDsgKytpKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBOQ0hBTjsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGF1ZGlvID0gKm91dHArKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpZGVzW2pdID09IEFVRElPX0dFT01FVFJZX1NJREVfTEVGVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKGxlZnQsIGF1ZGlvKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaWRlc1tqXSA9PSBBVURJT19HRU9NRVRSWV9TSURFX0NFTlRFUikgeworICAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKGNlbnRlciwgYXVkaW8pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKHJpZ2h0LCBhdWRpbyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRVhQRUNUX0VRKHZvbGF1eCwgKmF1eHArKyk7ICAvLyB3b3JrcyBpZiBhbGwgY2hhbm5lbHMgY29udGFpbiAxLmYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmbG9hdCB2b2xiWzJdID0gezAuZiwgMC41Zn07IC8vIHJpZ2h0IHZvbHVtZSBhdCBoYWxmIG1heC4KKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhpcyBhY2N1bXVsYXRlcyBpbnRvIG91dCwgYXV4LgorICAgICAgICAgICAgLy8gZmxvYXQgb3V0W1NBTVBMRV9DT1VOVF17fTsKKyAgICAgICAgICAgIC8vIGZsb2F0IGF1eFtGUkFNRV9DT1VOVF17fTsKKyAgICAgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEUsIE5DSEFOPihvdXQsIEZSQU1FX0NPVU5ULCBpbiwgYXV4LCB2b2xiLCB2b2xhdXgpOworICAgICAgICAgICAgY29uc3QgZmxvYXQgKm91dHAgPSBvdXQ7CisgICAgICAgICAgICBjb25zdCBmbG9hdCAqYXV4cCA9IGF1eDsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGxlZnQgPSB2b2xhWzBdICsgdm9sYlswXTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGNlbnRlciA9ICh2b2xhWzBdICsgdm9sYVsxXSArIHZvbGJbMF0gKyB2b2xiWzFdKSAqIDAuNTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHJpZ2h0ID0gdm9sYVsxXSArIHZvbGJbMV07CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZSQU1FX0NPVU5UOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IE5DSEFOOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgYXVkaW8gPSAqb3V0cCsrOworICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZXNbal0gPT0gQVVESU9fR0VPTUVUUllfU0lERV9MRUZUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRVEobGVmdCwgYXVkaW8pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpZGVzW2pdID09IEFVRElPX0dFT01FVFJZX1NJREVfQ0VOVEVSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoY2VudGVyLCBhdWRpbyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRVEocmlnaHQsIGF1ZGlvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBhdXggaXMgYWNjdW11bGF0ZWQgc28gMnggdGhlIGFtcGxpdHVkZQorICAgICAgICAgICAgICAgIEVYUEVDVF9FUSh2b2xhdXggKiAyLmYsICphdXhwKyspOyAgLy8gd29ya3MgaWYgYWxsIGNoYW5uZWxzIGNvbnRhaW4gMS5mCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB7IC8vIHRlc3QgYXV4IGFzIGRlcml2ZWQgZnJvbSBvdXQuCisgICAgICAgICAgICAvLyBBVVggY2hhbm5lbCBpcyB0aGUgd2VpZ2h0ZWQgc3VtIG9mIGFsbCBvZiB0aGUgb3V0cHV0IGNoYW5uZWxzIHByaW9yIHRvIHZvbHVtZQorICAgICAgICAgICAgLy8gYWRqdXN0bWVudC4gIFdlIG11c3Qgc2V0IEwgYW5kIFIgdG8gdGhlIHNhbWUgdm9sdW1lIHRvIGFsbG93IGNvbXB1dGF0aW9uCisgICAgICAgICAgICAvLyBvZiBBVVggZnJvbSB0aGUgb3V0cHV0IHZhbHVlcy4KKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHZvbG1vbm8gPSAwLjI1ZjsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHZvbGxyWzJdID0ge3ZvbG1vbm8sIHZvbG1vbm99OyAvLyBhbGwgdGhlIHNhbWUuCisgICAgICAgICAgICBmbG9hdCBvdXRbU0FNUExFX0NPVU5UXXt9OworICAgICAgICAgICAgZmxvYXQgYXV4W0ZSQU1FX0NPVU5UXXt9OworICAgICAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRSwgTkNIQU4+KG91dCwgRlJBTUVfQ09VTlQsIGluLCBhdXgsIHZvbGxyLCB2b2xhdXgpOworICAgICAgICAgICAgY29uc3QgZmxvYXQgKm91dHAgPSBvdXQ7CisgICAgICAgICAgICBjb25zdCBmbG9hdCAqYXV4cCA9IGF1eDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlJBTUVfQ09VTlQ7ICsraSkgeworICAgICAgICAgICAgICAgIGZsb2F0IGFjY3VtID0gMC5mOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgTkNIQU47ICsraikgeworICAgICAgICAgICAgICAgICAgICBhY2N1bSArPSAqb3V0cCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoYWNjdW0gLyBOQ0hBTiAqIHZvbGF1eCAvIHZvbG1vbm8sICphdXhwKyspOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfTsKKworVEVTVChtaXhlcm9wcywgc3RlcmVvdm9sdW1lXzEpIHsgLy8gTm90ZTogbW9ubyBub3QgdXNlZCBmb3Igb3V0cHV0IHNpbmtzIHlldC4KKyAgICBNaXhlck9wc0Jhc2ljVGVzdDxNSVhUWVBFX01VTFRJX1NURVJFT1ZPTCwgMT46OnRlc3RTdGVyZW9Wb2x1bWUoKTsKK30KK1RFU1QobWl4ZXJvcHMsIHN0ZXJlb3ZvbHVtZV8yKSB7CisgICAgTWl4ZXJPcHNCYXNpY1Rlc3Q8TUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wsIDI+Ojp0ZXN0U3RlcmVvVm9sdW1lKCk7Cit9CitURVNUKG1peGVyb3BzLCBzdGVyZW92b2x1bWVfMykgeworICAgIE1peGVyT3BzQmFzaWNUZXN0PE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MLCAzPjo6dGVzdFN0ZXJlb1ZvbHVtZSgpOworfQorVEVTVChtaXhlcm9wcywgc3RlcmVvdm9sdW1lXzQpIHsKKyAgICBNaXhlck9wc0Jhc2ljVGVzdDxNSVhUWVBFX01VTFRJX1NURVJFT1ZPTCwgND46OnRlc3RTdGVyZW9Wb2x1bWUoKTsKK30KK1RFU1QobWl4ZXJvcHMsIHN0ZXJlb3ZvbHVtZV81KSB7CisgICAgTWl4ZXJPcHNCYXNpY1Rlc3Q8TUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wsIDU+Ojp0ZXN0U3RlcmVvVm9sdW1lKCk7Cit9CitURVNUKG1peGVyb3BzLCBzdGVyZW92b2x1bWVfNikgeworICAgIE1peGVyT3BzQmFzaWNUZXN0PE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MLCA2Pjo6dGVzdFN0ZXJlb1ZvbHVtZSgpOworfQorVEVTVChtaXhlcm9wcywgc3RlcmVvdm9sdW1lXzcpIHsKKyAgICBNaXhlck9wc0Jhc2ljVGVzdDxNSVhUWVBFX01VTFRJX1NURVJFT1ZPTCwgNz46OnRlc3RTdGVyZW9Wb2x1bWUoKTsKK30KK1RFU1QobWl4ZXJvcHMsIHN0ZXJlb3ZvbHVtZV84KSB7CisgICAgTWl4ZXJPcHNCYXNpY1Rlc3Q8TUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wsIDg+Ojp0ZXN0U3RlcmVvVm9sdW1lKCk7Cit9CitURVNUKG1peGVyb3BzLCBzdGVyZW92b2x1bWVfMTIpIHsKKyAgICBpZiBjb25zdGV4cHIgKEZDQ19MSU1JVCA+PSAxMikgeyAvLyBOT1RFOiBGQ0NfTElNSVQgaXMgYW4gZW51bSwgc28gY2FuJ3QgI2lmCisgICAgICAgIE1peGVyT3BzQmFzaWNUZXN0PE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MLCAxMj46OnRlc3RTdGVyZW9Wb2x1bWUoKTsKKyAgICB9Cit9CitURVNUKG1peGVyb3BzLCBzdGVyZW92b2x1bWVfMjQpIHsKKyAgICBpZiBjb25zdGV4cHIgKEZDQ19MSU1JVCA+PSAyNCkgeworICAgICAgICBNaXhlck9wc0Jhc2ljVGVzdDxNSVhUWVBFX01VTFRJX1NURVJFT1ZPTCwgMjQ+Ojp0ZXN0U3RlcmVvVm9sdW1lKCk7CisgICAgfQorfQorVEVTVChtaXhlcm9wcywgY2hhbm5lbF9lcXVpdmFsZW5jZSkgeworICAgIC8vIHdlIG11c3QgbWF0Y2ggdGhlIGNvbnN0ZXhwciBmdW5jdGlvbiB3aXRoIHRoZSBzeXN0ZW0gZGV0ZXJtaW5lZCBjaGFubmVsIG1hc2sgZnJvbSBjb3VudC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZDQ19MSU1JVDsgKytpKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGFjdHVhbCA9IGNhbm9uaWNhbENoYW5uZWxNYXNrRnJvbUNvdW50KGkpOworICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBzeXN0ZW0gPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoaSk7CisgICAgICAgIGlmIChzeXN0ZW0gPT0gQVVESU9fQ0hBTk5FTF9JTlZBTElEKSBjb250aW51ZTsKKyAgICAgICAgRVhQRUNUX0VRKHN5c3RlbSwgYWN0dWFsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCmluZGV4IGIyNmQwMjguLmFiZTYyMmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCkBAIC0yNCw2ICsyNCwxMCBAQAogICAgIHZlbmRvcjogdHJ1ZSwKICAgICBzcmNzOiBbIkVmZmVjdERvd25taXguY3BwIl0sCiAKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICIuIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliY3V0aWxzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmNwcAppbmRleCBmNTAwYmMzLi5kOGY1Nzg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaW5jbHVkZSAiRWZmZWN0RG93bm1peC5oIgotI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9DaGFubmVsTWl4Lmg+CiAKIC8vIERvIG5vdCBzdWJtaXQgd2l0aCBET1dOTUlYX1RFU1RfQ0hBTk5FTF9JTkRFWCBkZWZpbmVkLCBzdHJpY3RseSBmb3IgdGVzdGluZwogLy8jZGVmaW5lIERPV05NSVhfVEVTVF9DSEFOTkVMX0lOREVYIDAKQEAgLTM1LDEyICszNSwxMyBAQAogfSBkb3dubWl4X3N0YXRlX3Q7CiAKIC8qIHBhcmFtZXRlcnMgZm9yIGVhY2ggZG93bm1peGVyICovCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3QgZG93bm1peF9vYmplY3RfdCB7CiAgICAgZG93bm1peF9zdGF0ZV90IHN0YXRlOwogICAgIGRvd25taXhfdHlwZV90IHR5cGU7CiAgICAgYm9vbCBhcHBseV92b2x1bWVfY29ycmVjdGlvbjsKICAgICB1aW50OF90IGlucHV0X2NoYW5uZWxfY291bnQ7Ci19IGRvd25taXhfb2JqZWN0X3Q7CisgICAgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmNoYW5uZWxzOjpDaGFubmVsTWl4IGNoYW5uZWxNaXg7Cit9OwogCiB0eXBlZGVmIHN0cnVjdCBkb3dubWl4X21vZHVsZV9zIHsKICAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICppdGZlOwpAQCAtNzcsMTEgKzc4LDYgQEAKICAgICAgICAgZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgdWludDMyX3Qgc2l6ZSwgdm9pZCAqcFZhbHVlKTsKIHN0YXRpYyBpbnQgRG93bm1peF9nZXRQYXJhbWV0ZXIoCiAgICAgICAgIGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKTsKLXN0YXRpYyB2b2lkIERvd25taXhfZm9sZEZyb21RdWFkKGZsb2F0ICpwU3JjLCBmbG9hdCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKLXN0YXRpYyB2b2lkIERvd25taXhfZm9sZEZyb201UG9pbnQxKGZsb2F0ICpwU3JjLCBmbG9hdCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKLXN0YXRpYyB2b2lkIERvd25taXhfZm9sZEZyb203UG9pbnQxKGZsb2F0ICpwU3JjLCBmbG9hdCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKLXN0YXRpYyBib29sIERvd25taXhfZm9sZEdlbmVyaWMoCi0gICAgICAgIHVpbnQzMl90IG1hc2ssIGZsb2F0ICpwU3JjLCBmbG9hdCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKIAogLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZG93bm1peCBlZmZlY3QKIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0Rvd25taXhJbnRlcmZhY2UgPSB7CkBAIC0xOTIsOSArMTg4LDExIEBACiAgICAgaWYgKCFtYXNrKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgLy8gY2hlY2sgYWdhaW5zdCB1bnN1cHBvcnRlZCBjaGFubmVscwotICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfT1VUXzIyUE9JTlQyKSB7Ci0gICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjaGFubmVscyBpbiAldSIsIG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9PVVRfMjJQT0lOVDIpOworICAgIC8vIGNoZWNrIGFnYWluc3QgdW5zdXBwb3J0ZWQgY2hhbm5lbHMgKHVwIHRvIEZDQ18yNikKKyAgICBjb25zdGV4cHIgdWludDMyX3QgTUFYSU1VTV9DSEFOTkVMX01BU0sgPSBBVURJT19DSEFOTkVMX09VVF8yMlBPSU5UMgorICAgICAgICAgICAgfCBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9XSURFX0xFRlQgfCBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9XSURFX1JJR0hUOworICAgIGlmIChtYXNrICYgfk1BWElNVU1fQ0hBTk5FTF9NQVNLKSB7CisgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjaGFubmVscyBpbiAlI3giLCBtYXNrICYgfk1BWElNVU1fQ0hBTk5FTF9NQVNLKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKQEAgLTMxNSw3ICszMTMsOCBAQAogICAgICAgICBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpIHsKIAogICAgIGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXI7Ci0gICAgZmxvYXQgKnBTcmMsICpwRHN0OworICAgIGNvbnN0IGZsb2F0ICpwU3JjOworICAgIGZsb2F0ICpwRHN0OwogICAgIGRvd25taXhfbW9kdWxlX3QgKnBEd21Nb2R1bGUgPSAoZG93bm1peF9tb2R1bGVfdCAqKXNlbGY7CiAKICAgICBpZiAocER3bU1vZHVsZSA9PSBOVUxMKSB7CkBAIC0zNDQsNyArMzQzLDggQEAKIAogICAgIGNvbnN0IGJvb2wgYWNjdW11bGF0ZSA9CiAgICAgICAgICAgICAocER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOwotICAgIGNvbnN0IHVpbnQzMl90IGRvd25taXhJbnB1dENoYW5uZWxNYXNrID0gcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzOworICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGRvd25taXhJbnB1dENoYW5uZWxNYXNrID0KKyAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHM7CiAKICAgICBzd2l0Y2gocERvd25taXhlci0+dHlwZSkgewogCkBAIC0zNjgsMzggKzM2OCwxMyBAQAogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBET1dOTUlYX1RZUEVfRk9MRDoKLSNpZmRlZiBET1dOTUlYX0FMV0FZU19VU0VfR0VORVJJQ19ET1dOTUlYRVIKLSAgICAgICAgICAvLyBieXBhc3MgdGhlIG9wdGltaXplZCBkb3dubWl4IHJvdXRpbmVzIGZvciB0aGUgY29tbW9uIGZvcm1hdHMKLSAgICAgICAgICBpZiAoIURvd25taXhfZm9sZEdlbmVyaWMoCi0gICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgewotICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gJSN4IGlzIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICAvLyBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBmb3JtYXRzCi0gICAgICAgIHN3aXRjaCAoZG93bm1peElucHV0Q2hhbm5lbE1hc2spIHsKLSAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0s6Ci0gICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFOgotICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbVF1YWQocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSzoKLSAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREU6Ci0gICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMToKLSAgICAgICAgICAgIERvd25taXhfZm9sZEZyb203UG9pbnQxKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmICghRG93bm1peF9mb2xkR2VuZXJpYygKLSAgICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2ssIHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSkpIHsKKyAgICAgIGNhc2UgRE9XTk1JWF9UWVBFX0ZPTEQ6IHsKKyAgICAgICAgICAgIGlmICghcERvd25taXhlci0+Y2hhbm5lbE1peC5wcm9jZXNzKAorICAgICAgICAgICAgICAgICAgICBwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUsIGRvd25taXhJbnB1dENoYW5uZWxNYXNrKSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJNdWx0aWNoYW5uZWwgY29uZmlndXJhdGlvbiAlI3ggaXMgbm90IHN1cHBvcnRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2spOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKQEAgLTY3NCw2ICs2NDksMTIgQEAKICAgICAgICAgQUxPR0UoIkRvd25taXhfQ29uZmlndXJlIGVycm9yOiBpbnZhbGlkIGNvbmZpZyIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CisgICAgLy8gd2hlbiBjb25maWd1cmluZyB0aGUgZWZmZWN0LCBkbyBub3QgYWxsb3cgYSBibGFuayBvciB1bnN1cHBvcnRlZCBjaGFubmVsIG1hc2sKKyAgICBpZiAoIURvd25taXhfdmFsaWRDaGFubmVsTWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscykpIHsKKyAgICAgICAgQUxPR0UoIkRvd25taXhfQ29uZmlndXJlIGVycm9yOiBpbnB1dCBjaGFubmVsIG1hc2soMHgleCkgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CiAKICAgICBpZiAoJnBEd21Nb2R1bGUtPmNvbmZpZyAhPSBwQ29uZmlnKSB7CiAgICAgICAgIG1lbWNweSgmcER3bU1vZHVsZS0+Y29uZmlnLCBwQ29uZmlnLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSk7CkBAIC02ODQsMTIgKzY2NSw2IEBACiAgICAgICAgIHBEb3dubWl4ZXItPmFwcGx5X3ZvbHVtZV9jb3JyZWN0aW9uID0gZmFsc2U7CiAgICAgICAgIHBEb3dubWl4ZXItPmlucHV0X2NoYW5uZWxfY291bnQgPSA4OyAvLyBtYXRjaGVzIGRlZmF1bHQgaW5wdXQgb2YgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMQogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHdoZW4gY29uZmlndXJpbmcgdGhlIGVmZmVjdCwgZG8gbm90IGFsbG93IGEgYmxhbmsgb3IgdW5zdXBwb3J0ZWQgY2hhbm5lbCBtYXNrCi0gICAgICAgIGlmICghRG93bm1peF92YWxpZENoYW5uZWxNYXNrKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKSkgewotICAgICAgICAgICAgQUxPR0UoIkRvd25taXhfQ29uZmlndXJlIGVycm9yOiBpbnB1dCBjaGFubmVsIG1hc2soMHgleCkgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9CiAgICAgICAgIHBEb3dubWl4ZXItPmlucHV0X2NoYW5uZWxfY291bnQgPQogICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CiAgICAgfQpAQCAtNzgwLDcgKzc1NSw2IEBACiAgICAgcmV0dXJuIDA7CiB9IC8qIGVuZCBEb3dubWl4X3NldFBhcmFtZXRlciAqLwogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRG93bm1peF9nZXRQYXJhbWV0ZXIoKQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC04MjksMjk5ICs4MDMsMyBAQAogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRG93bm1peF9nZXRQYXJhbWV0ZXIgKi8KIAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIERvd25taXhfZm9sZEZyb21RdWFkKCkKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUHVycG9zZToKLSAqIGRvd25taXggYSBxdWFkIHNpZ25hbCB0byBzdGVyZW8KLSAqCi0gKiBJbnB1dHM6Ci0gKiAgcFNyYyAgICAgICBxdWFkIGF1ZGlvIHNhbXBsZXMgdG8gZG93bm1peAotICogIG51bUZyYW1lcyAgdGhlIG51bWJlciBvZiBxdWFkIGZyYW1lcyB0byBkb3dubWl4Ci0gKiAgYWNjdW11bGF0ZSB3aGV0aGVyIHRvIG1peCAod2hlbiB0cnVlKSB0aGUgcmVzdWx0IG9mIHRoZSBkb3dubWl4IHdpdGggdGhlIGNvbnRlbnRzIG9mIHBEc3QsCi0gKiAgICAgICAgICAgICAgIG9yIG92ZXJ3cml0ZSBwRHN0ICh3aGVuIGZhbHNlKQotICoKLSAqIE91dHB1dHM6Ci0gKiAgcERzdCAgICAgICBkb3dubWl4ZWQgc3RlcmVvIGF1ZGlvIHNhbXBsZXMKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotdm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChmbG9hdCAqcFNyYywgZmxvYXQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBSTAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIFJSCi0gICAgaWYgKGFjY3VtdWxhdGUpIHsKLSAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgewotICAgICAgICAgICAgLy8gRkwgKyBSTAotICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMF0gKyAoKHBTcmNbMF0gKyBwU3JjWzJdKSAvIDIuMGYpKTsKLSAgICAgICAgICAgIC8vIEZSICsgUlIKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKChwU3JjWzFdICsgcFNyY1szXSkgLyAyLjBmKSk7Ci0gICAgICAgICAgICBwU3JjICs9IDQ7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCi0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIEZMICsgUkwKLSAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdCgocFNyY1swXSArIHBTcmNbMl0pIC8gMi4wZik7Ci0gICAgICAgICAgICAvLyBGUiArIFJSCi0gICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQoKHBTcmNbMV0gKyBwU3JjWzNdKSAvIDIuMGYpOwotICAgICAgICAgICAgcFNyYyArPSA0OwotICAgICAgICAgICAgcERzdCArPSAyOwotICAgICAgICAgICAgbnVtRnJhbWVzLS07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRG93bm1peF9mb2xkRnJvbTVQb2ludDEoKQotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBQdXJwb3NlOgotICogZG93bm1peCBhIDUuMSBzaWduYWwgdG8gc3RlcmVvCi0gKgotICogSW5wdXRzOgotICogIHBTcmMgICAgICAgNS4xIGF1ZGlvIHNhbXBsZXMgdG8gZG93bm1peAotICogIG51bUZyYW1lcyAgdGhlIG51bWJlciBvZiA1LjEgZnJhbWVzIHRvIGRvd25taXgKLSAqICBhY2N1bXVsYXRlIHdoZXRoZXIgdG8gbWl4ICh3aGVuIHRydWUpIHRoZSByZXN1bHQgb2YgdGhlIGRvd25taXggd2l0aCB0aGUgY29udGVudHMgb2YgcERzdCwKLSAqICAgICAgICAgICAgICAgb3Igb3ZlcndyaXRlIHBEc3QgKHdoZW4gZmFsc2UpCi0gKgotICogT3V0cHV0czoKLSAqICBwRHN0ICAgICAgIGRvd25taXhlZCBzdGVyZW8gYXVkaW8gc2FtcGxlcwotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi12b2lkIERvd25taXhfZm9sZEZyb201UG9pbnQxKGZsb2F0ICpwU3JjLCBmbG9hdCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7Ci0gICAgZmxvYXQgbHQsIHJ0LCBjZW50ZXJQbHVzTGZlQ29udHJpYjsgLy8gc2FtcGxlcyBpbiBRMTkuMTIgZm9ybWF0Ci0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMSBpcyBGUgotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAyIGlzIEZDCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDMgaXMgTEZFCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDQgaXMgUkwKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggNSBpcyBSUgotICAgIC8vIGNvZGUgaXMgbW9zdGx5IGR1cGxpY2F0ZWQgYmV0d2VlbiB0aGUgdHdvIHZhbHVlcyBvZiBhY2N1bXVsYXRlIHRvIGF2b2lkIHJlcGVhdGluZyB0aGUgdGVzdAotICAgIC8vIGZvciBldmVyeSBzYW1wbGUKLSAgICBpZiAoYWNjdW11bGF0ZSkgewotICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7Ci0gICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCi0gICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKLSAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOwotICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJMCi0gICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNF07Ci0gICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgUlIKLSAgICAgICAgICAgIHJ0ID0gcFNyY1sxXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s1XTsKLSAgICAgICAgICAgIC8vIGFjY3VtdWxhdGUgaW4gZGVzdGluYXRpb24KLSAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgKGx0IC8gMi4wZikpOwotICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMV0gKyAocnQgLyAyLjBmKSk7Ci0gICAgICAgICAgICBwU3JjICs9IDY7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCi0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKLSAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKQotICAgICAgICAgICAgICAgICAgICArIChwU3JjWzNdICogTUlOVVNfM19EQl9JTl9GTE9BVCk7Ci0gICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgUkwKLSAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s0XTsKLSAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBSUgotICAgICAgICAgICAgcnQgPSBwU3JjWzFdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzVdOwotICAgICAgICAgICAgLy8gc3RvcmUgaW4gZGVzdGluYXRpb24KLSAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChsdCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChydCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKLSAgICAgICAgICAgIHBTcmMgKz0gNjsKLSAgICAgICAgICAgIHBEc3QgKz0gMjsKLSAgICAgICAgICAgIG51bUZyYW1lcy0tOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIERvd25taXhfZm9sZEZyb203UG9pbnQxKCkKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUHVycG9zZToKLSAqIGRvd25taXggYSA3LjEgc2lnbmFsIHRvIHN0ZXJlbwotICoKLSAqIElucHV0czoKLSAqICBwU3JjICAgICAgIDcuMSBhdWRpbyBzYW1wbGVzIHRvIGRvd25taXgKLSAqICBudW1GcmFtZXMgIHRoZSBudW1iZXIgb2YgNy4xIGZyYW1lcyB0byBkb3dubWl4Ci0gKiAgYWNjdW11bGF0ZSB3aGV0aGVyIHRvIG1peCAod2hlbiB0cnVlKSB0aGUgcmVzdWx0IG9mIHRoZSBkb3dubWl4IHdpdGggdGhlIGNvbnRlbnRzIG9mIHBEc3QsCi0gKiAgICAgICAgICAgICAgIG9yIG92ZXJ3cml0ZSBwRHN0ICh3aGVuIGZhbHNlKQotICoKLSAqIE91dHB1dHM6Ci0gKiAgcERzdCAgICAgICBkb3dubWl4ZWQgc3RlcmVvIGF1ZGlvIHNhbXBsZXMKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotdm9pZCBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShmbG9hdCAqcFNyYywgZmxvYXQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewotICAgIGZsb2F0IGx0LCBydCwgY2VudGVyUGx1c0xmZUNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBGQwotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIExGRQotICAgIC8vIHNhbXBsZSBhdCBpbmRleCA0IGlzIFJMCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDUgaXMgUlIKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggNiBpcyBTTAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCA3IGlzIFNSCi0gICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0Ci0gICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQotICAgIGlmIChhY2N1bXVsYXRlKSB7Ci0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKLSAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKQotICAgICAgICAgICAgICAgICAgICArIChwU3JjWzNdICogTUlOVVNfM19EQl9JTl9GTE9BVCk7Ci0gICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgU0wgKyBSTAotICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzZdICsgcFNyY1s0XTsKLSAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTUiArIFJSCi0gICAgICAgICAgICBydCA9IHBTcmNbMV0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbN10gKyBwU3JjWzVdOwotICAgICAgICAgICAgLy9hY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArIChsdCAvIDIuMGYpKTsKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKHJ0IC8gMi4wZikpOwotICAgICAgICAgICAgcFNyYyArPSA4OwotICAgICAgICAgICAgcERzdCArPSAyOwotICAgICAgICAgICAgbnVtRnJhbWVzLS07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgeyAvLyBzYW1lIGNvZGUgYXMgYWJvdmUgYnV0IHdpdGhvdXQgYWRkaW5nIGFuZCBjbGFtcGluZyBwRHN0W2ldIHRvIGl0c2VsZgotICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7Ci0gICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCi0gICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKLSAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOwotICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNMICsgUkwKLSAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s2XSArIHBTcmNbNF07Ci0gICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgU1IgKyBSUgotICAgICAgICAgICAgcnQgPSBwU3JjWzFdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzddICsgcFNyY1s1XTsKLSAgICAgICAgICAgIC8vIHN0b3JlIGluIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQobHQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCi0gICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocnQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCi0gICAgICAgICAgICBwU3JjICs9IDg7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBEb3dubWl4X2ZvbGRHZW5lcmljKCkKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUHVycG9zZToKLSAqIGRvd25taXggdG8gc3RlcmVvIGEgbXVsdGljaGFubmVsIHNpZ25hbCBvZiBhcmJpdHJhcnkgY2hhbm5lbCBwb3NpdGlvbiBtYXNrLgotICoKLSAqIElucHV0czoKLSAqICBtYXNrICAgICAgIHRoZSBjaGFubmVsIG1hc2sgb2YgcFNyYwotICogIHBTcmMgICAgICAgbXVsdGljaGFubmVsIGF1ZGlvIGJ1ZmZlciB0byBkb3dubWl4Ci0gKiAgbnVtRnJhbWVzICB0aGUgbnVtYmVyIG9mIG11bHRpY2hhbm5lbCBmcmFtZXMgdG8gZG93bm1peAotICogIGFjY3VtdWxhdGUgd2hldGhlciB0byBtaXggKHdoZW4gdHJ1ZSkgdGhlIHJlc3VsdCBvZiB0aGUgZG93bm1peCB3aXRoIHRoZSBjb250ZW50cyBvZiBwRHN0LAotICogICAgICAgICAgICAgICBvciBvdmVyd3JpdGUgcERzdCAod2hlbiBmYWxzZSkKLSAqCi0gKiBPdXRwdXRzOgotICogIHBEc3QgICAgICAgZG93bm1peGVkIHN0ZXJlbyBhdWRpbyBzYW1wbGVzCi0gKgotICogUmV0dXJuczogZmFsc2UgaWYgbXVsdGljaGFubmVsIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLWJvb2wgRG93bm1peF9mb2xkR2VuZXJpYygKLSAgICAgICAgdWludDMyX3QgbWFzaywgZmxvYXQgKnBTcmMsIGZsb2F0ICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKLQotICAgIGlmICghRG93bm1peF92YWxpZENoYW5uZWxNYXNrKG1hc2spKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY29uc3QgaW50IG51bUNoYW4gPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWFzayk7Ci0KLSAgICAvLyBjb21wdXRlIGF0IHdoYXQgaW5kZXggZWFjaCBjaGFubmVsIGlzOiBzYW1wbGVzIHdpbGwgYmUgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLSAgICAvLyAgIEZMICBGUiAgRkMgICAgTEZFICAgQkwgIEJSICBCQyAgICBTTCAgU1IKLSAgICAvLwotICAgIC8vICAodHJhbnNmZXIgbWF0cml4KQotICAgIC8vICAgRkwgIEZSICBGQyAgICBMRkUgICBCTCAgQlIgIEJDICAgIFNMICBTUgotICAgIC8vICAgMC41ICAgICAwLjM1MyAwLjM1MyAwLjUgICAgIDAuMzUzIDAuNQotICAgIC8vICAgICAgIDAuNSAwLjM1MyAwLjM1MyAgICAgMC41IDAuMzUzICAgICAwLjUKLQotICAgIC8vIGRlcml2ZSB0aGUgaW5kaWNlcyBmb3IgdGhlIHRyYW5zZmVyIG1hdHJpeCBjb2x1bW5zIHRoYXQgaGF2ZSBub24temVybyB2YWx1ZXMuCi0gICAgaW50IGluZGV4RkwgPSAtMTsKLSAgICBpbnQgaW5kZXhGUiA9IC0xOwotICAgIGludCBpbmRleEZDID0gLTE7Ci0gICAgaW50IGluZGV4TEZFID0gLTE7Ci0gICAgaW50IGluZGV4QkwgPSAtMTsKLSAgICBpbnQgaW5kZXhCUiA9IC0xOwotICAgIGludCBpbmRleEJDID0gLTE7Ci0gICAgaW50IGluZGV4U0wgPSAtMTsKLSAgICBpbnQgaW5kZXhTUiA9IC0xOwotICAgIGludCBpbmRleCA9IDA7Ci0gICAgZm9yICh1bnNpZ25lZCB0bXAgPSBtYXNrOwotICAgICAgICAgKHRtcCAmIChBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIHwgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpKSAhPSAwOwotICAgICAgICAgKytpbmRleCkgewotICAgICAgICBjb25zdCB1bnNpZ25lZCBsb3dlc3RCaXQgPSB0bXAgJiAtKHNpZ25lZCl0bXA7Ci0gICAgICAgIHN3aXRjaCAobG93ZXN0Qml0KSB7Ci0gICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVDoKLSAgICAgICAgICAgIGluZGV4RkwgPSBpbmRleDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUOgotICAgICAgICAgICAgaW5kZXhGUiA9IGluZGV4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSOgotICAgICAgICAgICAgaW5kZXhGQyA9IGluZGV4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWToKLSAgICAgICAgICAgIGluZGV4TEZFID0gaW5kZXg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF9CQUNLX0xFRlQ6Ci0gICAgICAgICAgICBpbmRleEJMID0gaW5kZXg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF9CQUNLX1JJR0hUOgotICAgICAgICAgICAgaW5kZXhCUiA9IGluZGV4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVI6Ci0gICAgICAgICAgICBpbmRleEJDID0gaW5kZXg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF9TSURFX0xFRlQ6Ci0gICAgICAgICAgICBpbmRleFNMID0gaW5kZXg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hUOgotICAgICAgICAgICAgaW5kZXhTUiA9IGluZGV4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdG1wIF49IGxvd2VzdEJpdDsKLSAgICB9Ci0KLSAgICAvLyBXaXRoIGdvb2QgYnJhbmNoIHByZWRpY3Rpb24sIHRoaXMgc2hvdWxkIHJ1biByZWFzb25hYmx5IGZhc3QuCi0gICAgLy8gQWxzbyBjb25zaWRlciB1c2luZyBhIHRyYW5zZmVyIG1hdHJpeCBmb3JtLgotICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgLy8gY29tcHV0ZSBjb250cmlidXRpb24gb2YgRkMsIEJDIGFuZCBMRkUKLSAgICAgICAgZmxvYXQgY2VudGVyc0xmZUNvbnRyaWIgPSAwOwotICAgICAgICBpZiAoaW5kZXhGQyA+PSAwKSBjZW50ZXJzTGZlQ29udHJpYiA9IHBTcmNbaW5kZXhGQ107Ci0gICAgICAgIGlmIChpbmRleExGRSA+PSAwKSBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4TEZFXTsKLSAgICAgICAgaWYgKGluZGV4QkMgPj0gMCkgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleEJDXTsKLSAgICAgICAgY2VudGVyc0xmZUNvbnRyaWIgKj0gTUlOVVNfM19EQl9JTl9GTE9BVDsKLQotICAgICAgICBmbG9hdCBjaFsyXTsKLSAgICAgICAgY2hbMF0gPSBjZW50ZXJzTGZlQ29udHJpYjsKLSAgICAgICAgY2hbMV0gPSBjZW50ZXJzTGZlQ29udHJpYjsKLQotICAgICAgICAvLyBtaXggaW4gbGVmdCAvIHJpZ2h0IGNoYW5uZWxzCi0gICAgICAgIGlmIChpbmRleEZMID49IDApIGNoWzBdICs9IHBTcmNbaW5kZXhGTF07Ci0gICAgICAgIGlmIChpbmRleEZSID49IDApIGNoWzFdICs9IHBTcmNbaW5kZXhGUl07Ci0KLSAgICAgICAgaWYgKGluZGV4U0wgPj0gMCkgY2hbMF0gKz0gcFNyY1tpbmRleFNMXTsKLSAgICAgICAgaWYgKGluZGV4U1IgPj0gMCkgY2hbMV0gKz0gcFNyY1tpbmRleFNSXTsgLy8gbm90ZSBwYWlyIGNoZWNrcyBlbmZvcmNlIHRoaXMgaWYgaW5kZXhTTCAhPSAwCi0KLSAgICAgICAgaWYgKGluZGV4QkwgPj0gMCkgY2hbMF0gKz0gcFNyY1tpbmRleEJMXTsKLSAgICAgICAgaWYgKGluZGV4QlIgPj0gMCkgY2hbMV0gKz0gcFNyY1tpbmRleEJSXTsgLy8gbm90ZSBwYWlyIGNoZWNrcyBlbmZvcmNlIHRoaXMgaWYgaW5kZXhCTCAhPSAwCi0KLSAgICAgICAgLy8gc2NhbGUgdG8gcHJldmVudCBvdmVyZmxvdy4KLSAgICAgICAgY2hbMF0gKj0gMC41ZjsKLSAgICAgICAgY2hbMV0gKj0gMC41ZjsKLQotICAgICAgICBpZiAoYWNjdW11bGF0ZSkgewotICAgICAgICAgICAgY2hbMF0gKz0gcERzdFswXTsKLSAgICAgICAgICAgIGNoWzFdICs9IHBEc3RbMV07Ci0gICAgICAgIH0KLQotICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQoY2hbMF0pOwotICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQoY2hbMV0pOwotICAgICAgICBwU3JjICs9IG51bUNoYW47Ci0gICAgICAgIHBEc3QgKz0gMjsKLSAgICAgICAgbnVtRnJhbWVzLS07Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L2JlbmNobWFyay9kb3dubWl4X2JlbmNobWFyay5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvYmVuY2htYXJrL2Rvd25taXhfYmVuY2htYXJrLmNwcAppbmRleCBlZTE2OWMyLi5kOWQ0MGVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvYmVuY2htYXJrL2Rvd25taXhfYmVuY2htYXJrLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvYmVuY2htYXJrL2Rvd25taXhfYmVuY2htYXJrLmNwcApAQCAtMzUsMTYgKzM1LDE0IEBACiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAogICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDEsCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiwKLSAgICBBVURJT19DSEFOTkVMX09VVF9RVUFELAotICAgIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSywKKyAgICBBVURJT19DSEFOTkVMX09VVF9RVUFELCAvLyBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0sKICAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUsCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1VSUk9VTkQsCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiwKICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyLAogICAgIEFVRElPX0NIQU5ORUxfT1VUX1BFTlRBLAogICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwKLSAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFLAogICAgIEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEsCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UMiwKQEAgLTYyLDU4ICs2MCwzNCBAQAogc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0ZyYW1lQ291bnQgPSAxMDAwOwogCiAvKgotUGl4ZWwgM1hMCi1kb3dubWl4X2JlbmNobWFyazoKLSAgI0JNX0Rvd25taXgvMCAgICAgNDcyMyBucyAgICA0NzA4IG5zICAgICAgIDE0ODY5NAotICAjQk1fRG93bm1peC8xICAgICA0NzE3IG5zICAgIDQ3MDIgbnMgICAgICAgMTQ4ODczCi0gICNCTV9Eb3dubWl4LzIgICAgIDQ4MDMgbnMgICAgNDc4OCBucyAgICAgICAxNDU4OTMKLSAgI0JNX0Rvd25taXgvMyAgICAgNTA1NiBucyAgICA1MDQxIG5zICAgICAgIDEzOTExMAotICAjQk1fRG93bm1peC80ICAgICA0NzEwIG5zICAgIDQ2OTYgbnMgICAgICAgMTQ5NjI1Ci0gICNCTV9Eb3dubWl4LzUgICAgIDE1MTQgbnMgICAgMTUwOSBucyAgICAgICA0NjM2OTQKLSAgI0JNX0Rvd25taXgvNiAgICAgMTUxMyBucyAgICAxNTA5IG5zICAgICAgIDQ2MzQ1MQotICAjQk1fRG93bm1peC83ICAgICAxNTE2IG5zICAgIDE1MTEgbnMgICAgICAgNDYzODk5Ci0gICNCTV9Eb3dubWl4LzggICAgIDQ0NDUgbnMgICAgNDQzMSBucyAgICAgICAxNTc4MzEKLSAgI0JNX0Rvd25taXgvOSAgICAgNTA4MSBucyAgICA1MDY1IG5zICAgICAgIDEzODQxMgotICAjQk1fRG93bm1peC8xMCAgICA0MzU0IG5zICAgIDQzNDEgbnMgICAgICAgMTYxMjQ3Ci0gICNCTV9Eb3dubWl4LzExICAgIDQ0MTEgbnMgICAgNDM5NyBucyAgICAgICAxNTg4OTMKLSAgI0JNX0Rvd25taXgvMTIgICAgNDQzNCBucyAgICA0NDIwIG5zICAgICAgIDE1Nzk5MgotICAjQk1fRG93bm1peC8xMyAgICA0ODQ1IG5zICAgIDQ4MzAgbnMgICAgICAgMTQ0ODczCi0gICNCTV9Eb3dubWl4LzE0ICAgIDQ4NTEgbnMgICAgNDgzNSBucyAgICAgICAxNDQ5NTQKLSAgI0JNX0Rvd25taXgvMTUgICAgNDg4NCBucyAgICA0ODcwIG5zICAgICAgIDE0NDIzMwotICAjQk1fRG93bm1peC8xNiAgICA1ODMyIG5zICAgIDU4MTMgbnMgICAgICAgMTIwNTY1Ci0gICNCTV9Eb3dubWl4LzE3ICAgIDUyNDEgbnMgICAgNTIyNCBucyAgICAgICAxMzM5MjcKLSAgI0JNX0Rvd25taXgvMTggICAgNTA0NCBucyAgICA1MDI4IG5zICAgICAgIDEzOTEzMQotICAjQk1fRG93bm1peC8xOSAgICA1MjQ0IG5zICAgIDUyMjcgbnMgICAgICAgMTMyMzE1Ci0gICNCTV9Eb3dubWl4LzIwICAgIDU5NDMgbnMgICAgNTkyMyBucyAgICAgICAxMTc3NTkKLSAgI0JNX0Rvd25taXgvMjEgICAgNTk5MCBucyAgICA1OTcxIG5zICAgICAgIDExNzI2MwotICAjQk1fRG93bm1peC8yMiAgICA0NDY4IG5zICAgIDQ0NTQgbnMgICAgICAgMTU2Njg5Ci0gICNCTV9Eb3dubWl4LzIzICAgIDczMDYgbnMgICAgNzI4NiBucyAgICAgICAgOTU5MTEKLS0tCi1kb3dubWl4X2JlbmNobWFyazogKGdlbmVyaWMgZm9sZCkKLSAgI0JNX0Rvd25taXgvMCAgICAgNDcyMiBucyAgICA0NzA3IG5zICAgICAgIDE0OTg0NwotICAjQk1fRG93bm1peC8xICAgICA0NzE0IG5zICAgIDQ2OTggbnMgICAgICAgMTQ4NzQ4Ci0gICNCTV9Eb3dubWl4LzIgICAgIDQ3OTQgbnMgICAgNDc3OSBucyAgICAgICAxNDU2NjEKLSAgI0JNX0Rvd25taXgvMyAgICAgNTA1MyBucyAgICA1MDM1IG5zICAgICAgIDEzOTE3MgotICAjQk1fRG93bm1peC80ICAgICA0Njk1IG5zICAgIDQ2NzggbnMgICAgICAgMTQ5NzYyCi0gICNCTV9Eb3dubWl4LzUgICAgIDQzODEgbnMgICAgNDM2OCBucyAgICAgICAxNTk2NzUKLSAgI0JNX0Rvd25taXgvNiAgICAgNDM4NyBucyAgICA0MzczIG5zICAgICAgIDE2MDI2NwotICAjQk1fRG93bm1peC83ICAgICA0NzMyIG5zICAgIDQ3MTcgbnMgICAgICAgMTQ4NTE0Ci0gICNCTV9Eb3dubWl4LzggICAgIDQ0MzAgbnMgICAgNDQxNSBucyAgICAgICAxNTgxMzMKLSAgI0JNX0Rvd25taXgvOSAgICAgNTEwMSBucyAgICA1MDg0IG5zICAgICAgIDEzODM1MwotICAjQk1fRG93bm1peC8xMCAgICA0MzU2IG5zICAgIDQzNDMgbnMgICAgICAgMTYwODIxCi0gICNCTV9Eb3dubWl4LzExICAgIDQzOTcgbnMgICAgNDM4MyBucyAgICAgICAxNTk5OTUKLSAgI0JNX0Rvd25taXgvMTIgICAgNDQzOCBucyAgICA0NDI0IG5zICAgICAgIDE1ODExNwotICAjQk1fRG93bm1peC8xMyAgICA1MjQzIG5zICAgIDUyMjYgbnMgICAgICAgMTMzODYzCi0gICNCTV9Eb3dubWl4LzE0ICAgIDUyNTkgbnMgICAgNTI0MiBucyAgICAgICAxMzE4NTUKLSAgI0JNX0Rvd25taXgvMTUgICAgNTI0NSBucyAgICA1MjI4IG5zICAgICAgIDEzMzY4NgotICAjQk1fRG93bm1peC8xNiAgICA1ODI5IG5zICAgIDU4MDkgbnMgICAgICAgMTIwNTQzCi0gICNCTV9Eb3dubWl4LzE3ICAgIDUyNDUgbnMgICAgNTIyOCBucyAgICAgICAxMzM1MzMKLSAgI0JNX0Rvd25taXgvMTggICAgNTkzNSBucyAgICA1OTE2IG5zICAgICAgIDExODI4MgotICAjQk1fRG93bm1peC8xOSAgICA1MjYzIG5zICAgIDUyNDUgbnMgICAgICAgMTMzNjU3Ci0gICNCTV9Eb3dubWl4LzIwICAgIDU5OTggbnMgICAgNTk3OCBucyAgICAgICAxMTQ2OTMKLSAgI0JNX0Rvd25taXgvMjEgICAgNTk4OSBucyAgICA1OTY5IG5zICAgICAgIDExNzQ1MAotICAjQk1fRG93bm1peC8yMiAgICA0NDQyIG5zICAgIDQ0MzEgbnMgICAgICAgMTU3OTEzCi0gICNCTV9Eb3dubWl4LzIzICAgIDczMDkgbnMgICAgNzI5MCBucyAgICAgICAgOTU3OTcKK1BpeGVsIDRYTAorJCBhZGIgc2hlbGwgL2RhdGEvYmVuY2htYXJrdGVzdC9kb3dubWl4X2JlbmNobWFyay92ZW5kb3IvZG93bm1peF9iZW5jaG1hcmsKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JlbmNobWFyayAgICAgICAgICAgICAgVGltZSAgICAgICAgICAgICBDUFUgICBJdGVyYXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk1fRG93bm1peC8wICAgICAgICAzNjM4IG5zICAgICAgICAgMzYyNCBucyAgICAgICAxOTc1MTcgQVVESU9fQ0hBTk5FTF9PVVRfTU9OTworQk1fRG93bm1peC8xICAgICAgICA0MDQwIG5zICAgICAgICAgNDAyNCBucyAgICAgICAxNzg3NjYKK0JNX0Rvd25taXgvMiAgICAgICAgNDc1OSBucyAgICAgICAgIDQ3NDAgbnMgICAgICAgMTM0NzQxIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTworQk1fRG93bm1peC8zICAgICAgICA2MDQyIG5zICAgICAgICAgNjAxNyBucyAgICAgICAxMjk1NDYgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMQorQk1fRG93bm1peC80ICAgICAgICA2ODk3IG5zICAgICAgICAgNjg2OCBucyAgICAgICAgOTYzMTYgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMgorQk1fRG93bm1peC81ICAgICAgICAyMTE3IG5zICAgICAgICAgMjEwOSBucyAgICAgICAzMzE3MDUgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRAorQk1fRG93bm1peC82ICAgICAgICAyMDk3IG5zICAgICAgICAgMjA4OCBucyAgICAgICAzMzU0MjEgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFCitCTV9Eb3dubWl4LzcgICAgICAgIDcyOTEgbnMgICAgICAgICA3MjYzIG5zICAgICAgICA5NjI1NiBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORAorQk1fRG93bm1peC84ICAgICAgICA4MjQ2IG5zICAgICAgICAgODIwNiBucyAgICAgICAgODQzMTggQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMgorQk1fRG93bm1peC85ICAgICAgICA4MzQxIG5zICAgICAgICAgODMwMyBucyAgICAgICAgODQyOTggQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMgorQk1fRG93bm1peC8xMCAgICAgICA3NTQ5IG5zICAgICAgICAgNzUxNyBucyAgICAgICAgODQyOTMgQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEKK0JNX0Rvd25taXgvMTEgICAgICAgOTM5NSBucyAgICAgICAgIDkzNTQgbnMgICAgICAgIDc1MjA5IEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIKK0JNX0Rvd25taXgvMTIgICAgICAgMzI2NyBucyAgICAgICAgIDMyNTMgbnMgICAgICAgMjE1NTk2IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEKK0JNX0Rvd25taXgvMTMgICAgICAgMzE3OCBucyAgICAgICAgIDMxNjMgbnMgICAgICAgMjIwMTMyIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERQorQk1fRG93bm1peC8xNCAgICAgIDEwMjQ1IG5zICAgICAgICAxMDE5OSBucyAgICAgICAgNjc0ODYgQVVESU9fQ0hBTk5FTF9PVVRfNlBPSU5UMQorQk1fRG93bm1peC8xNSAgICAgIDEwOTc1IG5zICAgICAgICAxMDkyOSBucyAgICAgICAgNjEzNTkgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UMgorQk1fRG93bm1peC8xNiAgICAgICAzNzk2IG5zICAgICAgICAgMzc4MCBucyAgICAgICAxODQ3MjggQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMQorQk1fRG93bm1peC8xNyAgICAgIDEzNTYyIG5zICAgICAgICAxMzUwMyBucyAgICAgICAgNTE4MjMgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UNAorQk1fRG93bm1peC8xOCAgICAgIDEzNTczIG5zICAgICAgICAxMzUxNiBucyAgICAgICAgNTE4MDAgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UMgorQk1fRG93bm1peC8xOSAgICAgIDE1NTAyIG5zICAgICAgICAxNTQzNSBucyAgICAgICAgNDcxNDcgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UNAorQk1fRG93bm1peC8yMCAgICAgIDE2NjkzIG5zICAgICAgICAxNjYyNCBucyAgICAgICAgNDIxMDkgQVVESU9fQ0hBTk5FTF9PVVRfMTNQT0lOVF8zNjBSQQorQk1fRG93bm1peC8yMSAgICAgIDI4MjY3IG5zICAgICAgICAyODExNiBucyAgICAgICAgMjQ5ODIgQVVESU9fQ0hBTk5FTF9PVVRfMjJQT0lOVDIKICovCiAKIHN0YXRpYyB2b2lkIEJNX0Rvd25taXgoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKQEAgLTEyNSw3ICs5OSw3IEBACiAgICAgc3RkOjptaW5zdGRfcmFuZCBnZW4oY2hhbm5lbE1hc2spOwogICAgIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjw+IGRpcygtMS4wZiwgMS4wZik7CiAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGlucHV0KGtGcmFtZUNvdW50ICogY2hhbm5lbENvdW50KTsKLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gb3V0cHV0KGtGcmFtZUNvdW50ICogMik7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG91dHB1dChrRnJhbWVDb3VudCAqIEZDQ18yKTsKICAgICBmb3IgKGF1dG8mIGluIDogaW5wdXQpIHsKICAgICAgICAgaW4gPSBkaXMoZ2VuKTsKICAgICB9CkBAIC0xODcsNyArMTYxLDggQEAKICAgICAgICAgYmVuY2htYXJrOjpDbG9iYmVyTWVtb3J5KCk7CiAgICAgfQogCi0gICAgc3RhdGUuU2V0Q29tcGxleGl0eU4oc3RhdGUucmFuZ2UoMCkpOworICAgIHN0YXRlLlNldENvbXBsZXhpdHlOKGNoYW5uZWxDb3VudCk7CisgICAgc3RhdGUuU2V0TGFiZWwoYXVkaW9fY2hhbm5lbF9vdXRfbWFza190b19zdHJpbmcoY2hhbm5lbE1hc2spKTsKIAogICAgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0ucmVsZWFzZV9lZmZlY3QoZWZmZWN0SGFuZGxlKTsgc3RhdHVzICE9IDApIHsKICAgICAgICAgQUxPR0UoInJlbGVhc2VfZWZmZWN0IHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDQ5NDAxMTcuLjM5MmE2ZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xOCw5ICsxOCw2IEBACiAgICAgZ3Rlc3Q6IHRydWUsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgdmVuZG9yOiB0cnVlLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgiLAotICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCiAgICAgXSwKQEAgLTUxLDkgKzQ4LDYgQEAKICAgICBuYW1lOiJkb3dubWl4dGVzdCIsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IGZhbHNlLAogICAgIHByb3ByaWV0YXJ5OiB0cnVlLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgiLAotICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4X3Rlc3RzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4X3Rlc3RzLmNwcAppbmRleCBkNGI3YTNhLi4yMGUxOWEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvZG93bm1peF90ZXN0cy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2Rvd25taXhfdGVzdHMuY3BwCkBAIC0zMywxNiArMzMsMTQgQEAKICAgICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMSwKICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyLAotICAgIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSwogICAgIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSwKICAgICBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCwKICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLAogICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIsCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEsCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMVBPSU5UMiwKLSAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLAotICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSywKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCAvLyBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0sKICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUsCiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNlBPSU5UMSwKICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyLApAQCAtNTIsMTAgKzUwLDcyIEBACiAgICAgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UNCwKICAgICBBVURJT19DSEFOTkVMX09VVF8xM1BPSU5UXzM2MFJBLAogICAgIEFVRElPX0NIQU5ORUxfT1VUXzIyUE9JTlQyLAorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190KEFVRElPX0NIQU5ORUxfT1VUXzIyUE9JTlQyCisgICAgICAgICAgICB8IEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1dJREVfTEVGVCB8IEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1dJREVfUklHSFQpLAogfTsKIAotc3RhdGljIGNvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBrQ29uc2lkZXJlZENoYW5uZWxzID0KLSAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEgfCBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUik7Citjb25zdGV4cHIgZmxvYXQgQ09FRl8yNSA9IDAuMjUwODkwOTUzNmY7Citjb25zdGV4cHIgZmxvYXQgQ09FRl8zNSA9IDAuMzU0MzkyODkxNWY7Citjb25zdGV4cHIgZmxvYXQgQ09FRl8zNiA9IDAuMzU1MjM0Mzg1OWY7Citjb25zdGV4cHIgZmxvYXQgQ09FRl82MSA9IDAuNjA1NzA0MzQyOGY7CisKK2NvbnN0ZXhwciBpbmxpbmUgZmxvYXQga1NjYWxlRnJvbUNoYW5uZWxJZHhMZWZ0W10gPSB7CisgICAgMS5mLCAgICAgICAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUICAgICAgICAgICAgPSAweDF1LAorICAgIDAuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgICAgICAgICAgID0gMHgydSwKKyAgICBNX1NRUlQxXzIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiAgICAgICAgICA9IDB4NHUsCisgICAgMC41ZiwgICAgICAvLyBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZICAgICAgICAgPSAweDh1LAorICAgIE1fU1FSVDFfMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19MRUZUICAgICAgICAgICAgID0gMHgxMHUsCisgICAgMC5mLCAgICAgICAvLyBBVURJT19DSEFOTkVMX09VVF9CQUNLX1JJR0hUICAgICAgICAgICAgPSAweDIwdSwKKyAgICBDT0VGXzYxLCAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlRfT0ZfQ0VOVEVSICA9IDB4NDB1LAorICAgIENPRUZfMjUsICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSID0gMHg4MHUsCisgICAgMC41ZiwgICAgICAvLyBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUiAgICAgICAgICAgPSAweDEwMHUsCisgICAgTV9TUVJUMV8yLCAvLyBBVURJT19DSEFOTkVMX09VVF9TSURFX0xFRlQgICAgICAgICAgICAgPSAweDIwMHUsCisgICAgMC5mLCAgICAgICAvLyBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hUICAgICAgICAgICAgPSAweDQwMHUsCisgICAgQ09FRl8zNiwgICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQ0VOVEVSICAgICAgICAgICAgPSAweDgwMHUsCisgICAgMS5mLCAgICAgICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfTEVGVCAgICAgICAgPSAweDEwMDB1LAorICAgIE1fU1FSVDFfMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX0NFTlRFUiAgICAgID0gMHgyMDAwdSwKKyAgICAwLmYsICAgICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9SSUdIVCAgICAgICA9IDB4NDAwMHUsCisgICAgTV9TUVJUMV8yLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19MRUZUICAgICAgICAgPSAweDgwMDB1LAorICAgIENPRUZfMzUsICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfQ0VOVEVSICAgICAgID0gMHgxMDAwMHUsCisgICAgMC5mLCAgICAgICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19SSUdIVCAgICAgICAgPSAweDIwMDAwdSwKKyAgICBDT0VGXzYxLCAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9TSURFX0xFRlQgICAgICAgICA9IDB4NDAwMDB1LAorICAgIDAuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfUklHSFQgICAgICAgID0gMHg4MDAwMHUsCisgICAgMS5mLCAgICAgICAvLyBBVURJT19DSEFOTkVMX09VVF9CT1RUT01fRlJPTlRfTEVGVCAgICAgPSAweDEwMDAwMHUsCisgICAgTV9TUVJUMV8yLCAvLyBBVURJT19DSEFOTkVMX09VVF9CT1RUT01fRlJPTlRfQ0VOVEVSICAgPSAweDIwMDAwMHUsCisgICAgMC5mLCAvLyBBVURJT19DSEFOTkVMX09VVF9CT1RUT01fRlJPTlRfUklHSFQgICAgPSAweDQwMDAwMHUsCisgICAgMC5mLCAvLyBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZXzIgICAgICAgPSAweDgwMDAwMHUsCisgICAgTV9TUVJUMV8yLCAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9XSURFX0xFRlQgICAgICAgPSAweDEwMDAwMDB1LAorICAgIDAuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfV0lERV9SSUdIVCAgICAgID0gMHgyMDAwMDAwdSwKK307CisKK2NvbnN0ZXhwciBpbmxpbmUgZmxvYXQga1NjYWxlRnJvbUNoYW5uZWxJZHhSaWdodFtdID0geworICAgIDAuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCAgICAgICAgICAgID0gMHgxdSwKKyAgICAxLmYsICAgICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUICAgICAgICAgICA9IDB4MnUsCisgICAgTV9TUVJUMV8yLCAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIgICAgICAgICAgPSAweDR1LAorICAgIDAuNWYsICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSAgICAgICAgID0gMHg4dSwKKyAgICAwLmYsICAgICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfTEVGVCAgICAgICAgICAgICA9IDB4MTB1LAorICAgIE1fU1FSVDFfMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCAgICAgICAgICAgID0gMHgyMHUsCisgICAgQ09FRl8yNSwgICAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUX09GX0NFTlRFUiAgPSAweDQwdSwKKyAgICBDT0VGXzYxLCAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUX09GX0NFTlRFUiA9IDB4ODB1LAorICAgIDAuNWYsICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIgICAgICAgICAgID0gMHgxMDB1LAorICAgIDAuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUICAgICAgICAgICAgID0gMHgyMDB1LAorICAgIE1fU1FSVDFfMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9SSUdIVCAgICAgICAgICAgID0gMHg0MDB1LAorICAgIENPRUZfMzYsICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0NFTlRFUiAgICAgICAgICAgID0gMHg4MDB1LAorICAgIDAuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX0xFRlQgICAgICAgID0gMHgxMDAwdSwKKyAgICBNX1NRUlQxXzIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9DRU5URVIgICAgICA9IDB4MjAwMHUsCisgICAgMS5mLCAgICAgICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfUklHSFQgICAgICAgPSAweDQwMDB1LAorICAgIDAuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfTEVGVCAgICAgICAgID0gMHg4MDAwdSwKKyAgICBDT0VGXzM1LCAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0NFTlRFUiAgICAgICA9IDB4MTAwMDB1LAorICAgIE1fU1FSVDFfMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQgICAgICAgID0gMHgyMDAwMHUsCisgICAgMC5mLCAgICAgICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9MRUZUICAgICAgICAgPSAweDQwMDAwdSwKKyAgICBDT0VGXzYxLCAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9TSURFX1JJR0hUICAgICAgICA9IDB4ODAwMDB1LAorICAgIDAuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQk9UVE9NX0ZST05UX0xFRlQgICAgID0gMHgxMDAwMDB1LAorICAgIE1fU1FSVDFfMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQk9UVE9NX0ZST05UX0NFTlRFUiAgID0gMHgyMDAwMDB1LAorICAgIDEuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQk9UVE9NX0ZST05UX1JJR0hUICAgID0gMHg0MDAwMDB1LAorICAgIE1fU1FSVDFfMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWV8yICAgICAgID0gMHg4MDAwMDB1LAorICAgIDAuZiwgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfV0lERV9MRUZUICAgICAgID0gMHgxMDAwMDAwdSwKKyAgICBNX1NRUlQxXzIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1dJREVfUklHSFQgICAgICA9IDB4MjAwMDAwMHUsCit9OwogCiAvLyBEb3dubWl4IGRvZXNuJ3QgY2hhbmdlIHdpdGggc2FtcGxlIHJhdGUKIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtTYW1wbGVSYXRlc1tdID0gewpAQCAtOTMsOCArMTUzLDggQEAKICAgICB2b2lkIHRlc3RCYWxhbmNlKGludCBzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgewogICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjphdWRpb191dGlsczo6Y2hhbm5lbHM7CiAKLSAgICAgICAgc2l6ZV90IGZyYW1lcyA9IDEwMDsKLSAgICAgICAgdW5zaWduZWQgb3V0Q2hhbm5lbHMgPSAyOworICAgICAgICBzaXplX3QgZnJhbWVzID0gMTAwOyAvLyBzZXQgdG8gYW4gZXZlbiBudW1iZXIgKDIsIDQsIDYgLi4uICkgc3RyZWFtIGFsdGVybmF0ZXMgKzEsIC0xLgorICAgICAgICBjb25zdGV4cHIgdW5zaWduZWQgb3V0Q2hhbm5lbHMgPSAyOwogICAgICAgICB1bnNpZ25lZCBpbkNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKICAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGlucHV0KGZyYW1lcyAqIGluQ2hhbm5lbHMpOwogICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gb3V0cHV0KGZyYW1lcyAqIG91dENoYW5uZWxzKTsKQEAgLTEwMiw3ICsxNjIsNyBAQAogICAgICAgICBkb3VibGUgc2F2ZWRQb3dlclszMl1bMl17fTsKICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgY2hhbm5lbCA9IGNoYW5uZWxNYXNrOyBjaGFubmVsICE9IDA7ICsraSkgewogICAgICAgICAgICAgY29uc3QgaW50IGluZGV4ID0gX19idWlsdGluX2N0eihjaGFubmVsKTsKLSAgICAgICAgICAgIEFTU0VSVF9MVChpbmRleCwgRkNDXzI0KTsKKyAgICAgICAgICAgIEFTU0VSVF9MVChpbmRleCwgRkNDXzI2KTsKICAgICAgICAgICAgIGNvbnN0IGludCBwYWlySW5kZXggPSBwYWlySWR4RnJvbUNoYW5uZWxJZHgoaW5kZXgpOwogICAgICAgICAgICAgY29uc3QgQVVESU9fR0VPTUVUUllfU0lERSBzaWRlID0gc2lkZUZyb21DaGFubmVsSWR4KGluZGV4KTsKICAgICAgICAgICAgIGNvbnN0IGludCBjaGFubmVsQml0ID0gMSA8PCBpbmRleDsKQEAgLTExOSw3ICsxNzksNyBAQAogCiAgICAgICAgICAgICBhdXRvIHN0YXRzID0gY2hhbm5lbFN0YXRpc3RpY3Mob3V0cHV0LCAyIC8qIGNoYW5uZWxzICovKTsKICAgICAgICAgICAgIC8vIHByaW50ZigicG93ZXI6ICVzICVzXG4iLCBzdGF0c1swXS50b1N0cmluZygpLmNfc3RyKCksIHN0YXRzWzFdLnRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICBkb3VibGUgcG93ZXJbMl0gPSB7IHN0YXRzWzBdLmdldFZhcmlhbmNlKCksIHN0YXRzWzFdLmdldFZhcmlhbmNlKCkgfTsKKyAgICAgICAgICAgIGRvdWJsZSBwb3dlclsyXSA9IHsgc3RhdHNbMF0uZ2V0UG9wVmFyaWFuY2UoKSwgc3RhdHNbMV0uZ2V0UG9wVmFyaWFuY2UoKSB9OwogCiAgICAgICAgICAgICAvLyBDaGVjayBzeW1tZXRyaWMgcG93ZXIgZm9yIHBhaXIgY2hhbm5lbHMgb24gZXhjaGFuZ2Ugb2YgbGVmdC9yaWdodCBwb3NpdGlvbi4KICAgICAgICAgICAgIC8vIHRvIGRvIHRoaXMsIHdlIHNhdmUgcHJldmlvdXMgcG93ZXIgbWVhc3VyZW1lbnRzLgpAQCAtMTMwLDI4ICsxOTAsMzkgQEAKICAgICAgICAgICAgIHNhdmVkUG93ZXJbaW5kZXhdWzBdID0gcG93ZXJbMF07CiAgICAgICAgICAgICBzYXZlZFBvd2VyW2luZGV4XVsxXSA9IHBvd2VyWzFdOwogCi0gICAgICAgICAgICAvLyBDb25maXJtIGV4YWN0bHkgdGhlIG1peCBhbW91bnQgcHJlc2NyaWJlZCBieSB0aGUgZXhpc3RpbmcgZG93bm1peCBlZmZlY3QuCi0gICAgICAgICAgICAvLyBGb3IgZnV0dXJlIGNoYW5nZXMgdG8gdGhlIGRvd25taXggZWZmZWN0LCB0aGUgbmVhcm5lc3MgbmVlZHMgdG8gYmUgcmVsYXhlZAotICAgICAgICAgICAgLy8gdG8gY29tcGFyZSBiZWhhdmlvciBTIG9yIGVhcmxpZXIuCi0gICAgICAgICAgICBpZiAoKGNoYW5uZWxCaXQgJiBrQ29uc2lkZXJlZENoYW5uZWxzKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZm9yIGNoYW5uZWxzIG5vdCBjb25zaWRlcmVkLCBleHBlY3QgMCBwb3dlciBmb3IgbGVnYWN5IGRvd25taXgKLSAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoMC5mLCBwb3dlclswXSk7Ci0gICAgICAgICAgICAgICAgRVhQRUNUX0VRKDAuZiwgcG93ZXJbMV0pOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uc3RleHByIGZsb2F0IFBPV0VSX1RPTEVSQU5DRSA9IDAuMDE7ICAvLyBmb3IgdmFyaWFuY2Ugc3VtIGVycm9yLgorICAgICAgICAgICAgY29uc3RleHByIGZsb2F0IFBPV0VSX1RPTEVSQU5DRSA9IDAuMDAxOworICAgICAgICAgICAgY29uc3QgZmxvYXQgZXhwZWN0ZWRQb3dlciA9CisgICAgICAgICAgICAgICAgICAgIGtTY2FsZUZyb21DaGFubmVsSWR4TGVmdFtpbmRleF0gKiBrU2NhbGVGcm9tQ2hhbm5lbElkeExlZnRbaW5kZXhdCisgICAgICAgICAgICAgICAgICAgICsga1NjYWxlRnJvbUNoYW5uZWxJZHhSaWdodFtpbmRleF0gKiBrU2NhbGVGcm9tQ2hhbm5lbElkeFJpZ2h0W2luZGV4XTsKKyAgICAgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkUG93ZXIsIHBvd2VyWzBdICsgcG93ZXJbMV0sIFBPV0VSX1RPTEVSQU5DRSk7CiAgICAgICAgICAgICBzd2l0Y2ggKHNpZGUpIHsKICAgICAgICAgICAgIGNhc2UgQVVESU9fR0VPTUVUUllfU0lERV9MRUZUOgotICAgICAgICAgICAgICAgIEVYUEVDVF9ORUFSKDAuMjVmLCBwb3dlclswXSwgUE9XRVJfVE9MRVJBTkNFKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbEJpdCA9PSBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUX09GX0NFTlRFUikgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKDAuZiwgcG93ZXJbMV0pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBVURJT19HRU9NRVRSWV9TSURFX1JJR0hUOgorICAgICAgICAgICAgICAgIGlmIChjaGFubmVsQml0ID09IEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUX09GX0NFTlRFUikgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKDAuZiwgcG93ZXJbMF0pOwotICAgICAgICAgICAgICAgIEVYUEVDVF9ORUFSKDAuMjVmLCBwb3dlclsxXSwgUE9XRVJfVE9MRVJBTkNFKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQVVESU9fR0VPTUVUUllfU0lERV9DRU5URVI6Ci0gICAgICAgICAgICAgICAgRVhQRUNUX05FQVIoMC4xMjVmLCBwb3dlclswXSwgUE9XRVJfVE9MRVJBTkNFKTsKLSAgICAgICAgICAgICAgICBFWFBFQ1RfTkVBUigwLjEyNWYsIHBvd2VyWzFdLCBQT1dFUl9UT0xFUkFOQ0UpOworICAgICAgICAgICAgICAgIGlmIChjaGFubmVsQml0ID09IEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWV8yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoMC5mLCBwb3dlclsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9ORUFSX0VQU0lMT04ocG93ZXJbMF0sIHBvd2VyWzFdKTsgLy8gYWx3YXlzIHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkUG93ZXIsIHBvd2VyWzBdICsgcG93ZXJbMV0sIFBPV0VSX1RPTEVSQU5DRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbEJpdCA9PSBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZXzIpIHsKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKDAuZiwgcG93ZXJbMF0pOworICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZFBvd2VyLCBwb3dlclsxXSwgUE9XRVJfVE9MRVJBTkNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEVYUEVDVF9ORUFSX0VQU0lMT04ocG93ZXJbMF0sIHBvd2VyWzFdKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTE3OCw2ICsyNDksNyBAQAogICAgICAgICAgICAgICAgIGhhbmRsZV8sIEVGRkVDVF9DTURfU0VUX0NPTkZJRywKICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwgJmNvbmZpZ18sICZyZXBseVNpemUsICZyZXBseSk7CiAgICAgICAgIEFTU0VSVF9FUSgwLCBlcnIpOworICAgICAgICBBU1NFUlRfRVEoMCwgcmVwbHkpOwogICAgICAgICBlcnIgPSAoZG93bm1peEFwaS0+Y29tbWFuZCkoCiAgICAgICAgICAgICAgICAgaGFuZGxlXywgRUZGRUNUX0NNRF9FTkFCTEUsCiAgICAgICAgICAgICAgICAgMCwgbnVsbHB0ciwgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKQEAgLTE4OCw2ICsyNjAsMjcgQEAKICAgICAgICAgQVNTRVJUX0VRKDAsIGVycik7CiAgICAgfQogCisgICAgLy8gVGhpcyB0ZXN0IGFzc3VtZXMgdGhlIGNoYW5uZWwgbWFzayBpcyBpbnZhbGlkLgorICAgIHZvaWQgdGVzdEludmFsaWRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBpbnZhbGlkQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgcmVjb25maWcoNDgwMDAgLyogc2FtcGxlUmF0ZSAqLywgaW52YWxpZENoYW5uZWxNYXNrKTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBzZXNzaW9uSWQgPSAwOworICAgICAgICBjb25zdCBpbnQzMl90IGlvSWQgPSAwOworICAgICAgICBpbnQzMl90IGVyciA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLmNyZWF0ZV9lZmZlY3QoCisgICAgICAgICAgICAgICAgJmRvd25taXhfdXVpZF8sIHNlc3Npb25JZCwgaW9JZCwgICZoYW5kbGVfKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIGVycik7CisKKyAgICAgICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqIGNvbnN0IGRvd25taXhBcGkgPSAqaGFuZGxlXzsKKyAgICAgICAgaW50MzJfdCByZXBseSA9IDA7CisgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9ICh1aW50MzJfdClzaXplb2YocmVwbHkpOworICAgICAgICBlcnIgPSAoZG93bm1peEFwaS0+Y29tbWFuZCkoCisgICAgICAgICAgICAgICAgaGFuZGxlXywgRUZGRUNUX0NNRF9TRVRfQ09ORklHLAorICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfY29uZmlnX3QpLCAmY29uZmlnXywgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIGVycik7CisgICAgICAgIEFTU0VSVF9ORSgwLCByZXBseSk7ICAvLyBlcnJvciBoYXMgb2NjdXJyZWQuCisgICAgICAgIGVyciA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLnJlbGVhc2VfZWZmZWN0KGhhbmRsZV8pOworICAgICAgICBBU1NFUlRfRVEoMCwgZXJyKTsKKyAgICB9CisKIHByaXZhdGU6CiAgICAgdm9pZCByZWNvbmZpZyhpbnQgc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIHsKICAgICAgICAgY29uZmlnXy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKQEAgLTIzNCw2ICszMjcsMTYgQEAKICAgICBpbnQgaW5wdXRDaGFubmVsQ291bnRfe307CiB9OwogCitURVNUKERvd25taXhUZXN0U2ltcGxlLCBpbnZhbGlkQ2hhbm5lbE1hc2spIHsKKyAgICAvLyBGaWxsIGluIGEgZHVtbXkgdGVzdCBtZXRob2QgdG8gdXNlIERvd25taXhUZXN0IG91dHNpZGUgb2YgYSBwYXJhbWV0ZXJpemVkIHRlc3QuCisgICAgY2xhc3MgRG93bm1peFRlc3RDb21wbGV0ZSA6IHB1YmxpYyBEb3dubWl4VGVzdCB7CisgICAgICAgIHZvaWQgVGVzdEJvZHkoKSBvdmVycmlkZSB7fQorICAgIH0gZG93bm1peHRlc3Q7CisKKyAgICBjb25zdGV4cHIgYXV0byBJTlZBTElEX0NIQU5ORUxfTUFTSyA9IGF1ZGlvX2NoYW5uZWxfbWFza190KDEgPDwgMzEpOworICAgIGRvd25taXh0ZXN0LnRlc3RJbnZhbGlkQ2hhbm5lbE1hc2soSU5WQUxJRF9DSEFOTkVMX01BU0spOworfQorCiBURVNUX1AoRG93bm1peFRlc3QsIGJhc2ljKSB7CiAgICAgdGVzdEJhbGFuY2Uoa1NhbXBsZVJhdGVzW3N0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpXSwKICAgICAgICAgICAgIGtDaGFubmVsUG9zaXRpb25NYXNrc1tzdGQ6OmdldDwxPihHZXRQYXJhbSgpKV0pOwpAQCAtMjQ0LDEwICszNDcsMTEgQEAKICAgICAgICAgOjp0ZXN0aW5nOjpDb21iaW5lKAogICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClzdGQ6OnNpemUoa1NhbXBsZVJhdGVzKSksCiAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KXN0ZDo6c2l6ZShrQ2hhbm5lbFBvc2l0aW9uTWFza3MpKQotICAgICAgICAgICAgICAgICkpOwotCi1pbnQgbWFpbihpbnQgYXJnYywgLyogY29uc3QgKi8gY2hhcioqIGFyZ3YpIHsKLSAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLSAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwotICAgIHJldHVybiBzdGF0dXM7Ci19CisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgW10oY29uc3QgdGVzdGluZzo6VGVzdFBhcmFtSW5mbzxEb3dubWl4VGVzdDo6UGFyYW1UeXBlPiYgaW5mbykgeworICAgICAgICAgICAgY29uc3QgaW50IGluZGV4ID0gc3RkOjpnZXQ8MT4oaW5mby5wYXJhbSk7CisgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGtDaGFubmVsUG9zaXRpb25NYXNrc1tpbmRleF07CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lID0gc3RkOjpzdHJpbmcoYXVkaW9fY2hhbm5lbF9vdXRfbWFza190b19zdHJpbmcoY2hhbm5lbE1hc2spKQorICAgICAgICAgICAgICAgICsgIl8iICsgc3RkOjp0b19zdHJpbmcoc3RkOjpnZXQ8MD4oaW5mby5wYXJhbSkpICsgIl8iICsgc3RkOjp0b19zdHJpbmcoaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0FuZHJvaWQuYnAKaW5kZXggYTY2MDk1Ny4uMDNjZTMyOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9BbmRyb2lkLmJwCkBAIC00NSw2ICs0NSw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidXRpbHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvRWZmZWN0SGFwdGljR2VuZXJhdG9yLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0VmZmVjdEhhcHRpY0dlbmVyYXRvci5jcHAKaW5kZXggNjVhMjBhNy4uMzEzN2UxMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvRWZmZWN0SGFwdGljR2VuZXJhdG9yLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9FZmZlY3RIYXB0aWNHZW5lcmF0b3IuY3BwCkBAIC0yMiwxMiArMjIsMTUgQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlZG91YmxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9oYXB0aWNnZW5lcmF0b3IuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTM1LDYgKzM4LDcgQEAKIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgREVGQVVMVF9SRVNPTkFOVF9GUkVRVUVOQ1kgPSAxNTAuMGY7CiBzdGF0aWMgY29uc3RleHByIGZsb2F0IERFRkFVTFRfQlNGX1pFUk9fUSA9IDguMGY7CiBzdGF0aWMgY29uc3RleHByIGZsb2F0IERFRkFVTFRfQlNGX1BPTEVfUSA9IDQuMGY7CitzdGF0aWMgY29uc3RleHByIGZsb2F0IERFRkFVTFRfRElTVE9SVElPTl9PVVRQVVRfR0FJTiA9IDEuNWY7CiAKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKQEAgLTgxLDYgKzg1LDE1IEBACiAKIG5hbWVzcGFjZSB7CiAKK2Zsb2F0IGdldEZsb2F0UHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgZmxvYXQgZGVmYXVsdFZhbHVlKSB7CisgICAgZmxvYXQgcmVzdWx0OworICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoa2V5LCAiIik7CisgICAgaWYgKCF2YWx1ZS5lbXB0eSgpICYmIGFuZHJvaWQ6OmJhc2U6OlBhcnNlRmxvYXQodmFsdWUsICZyZXN1bHQpKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Cit9CisKIGludCBIYXB0aWNHZW5lcmF0b3JfSW5pdChzdHJ1Y3QgSGFwdGljR2VuZXJhdG9yQ29udGV4dCAqY29udGV4dCkgewogICAgIGNvbnRleHQtPml0ZmUgPSAmZ0hhcHRpY0dlbmVyYXRvckludGVyZmFjZTsKIApAQCAtMTE0LDcgKzEyNyw5IEBACiAgICAgY29udGV4dC0+cGFyYW0uZGlzdG9ydGlvbkNvcm5lckZyZXF1ZW5jeSA9IDMwMC4wZjsKICAgICBjb250ZXh0LT5wYXJhbS5kaXN0b3J0aW9uSW5wdXRHYWluID0gMC4zZjsKICAgICBjb250ZXh0LT5wYXJhbS5kaXN0b3J0aW9uQ3ViZVRocmVzaG9sZCA9IDAuMWY7Ci0gICAgY29udGV4dC0+cGFyYW0uZGlzdG9ydGlvbk91dHB1dEdhaW4gPSAxLjVmOworICAgIGNvbnRleHQtPnBhcmFtLmRpc3RvcnRpb25PdXRwdXRHYWluID0gZ2V0RmxvYXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICJ2ZW5kb3IuYXVkaW8uaGFwdGljZ2VuZXJhdG9yLmRpc3RvcnRpb24ub3V0cHV0LmdhaW4iLCBERUZBVUxUX0RJU1RPUlRJT05fT1VUUFVUX0dBSU4pOworICAgIEFMT0dEKCJVc2luZyBkaXN0b3J0aW9uIG91dHB1dCBnYWluIGFzICVmIiwgY29udGV4dC0+cGFyYW0uZGlzdG9ydGlvbk91dHB1dEdhaW4pOwogCiAgICAgY29udGV4dC0+c3RhdGUgPSBIQVBUSUNHRU5FUkFUT1JfU1RBVEVfSU5JVElBTElaRUQ7CiAgICAgcmV0dXJuIDA7CkBAIC0yODcsMTUgKzMwMiwxNyBAQAogICAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBIR19QQVJBTV9WSUJSQVRPUl9JTkZPOiB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxscHRyIHx8IHNpemUgIT0gMiAqIHNpemVvZihmbG9hdCkpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGxwdHIgfHwgc2l6ZSAhPSAzICogc2l6ZW9mKGZsb2F0KSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KICAgICAgICAgY29uc3QgZmxvYXQgcmVzb25hbnRGcmVxdWVuY3kgPSAqKGZsb2F0KikgdmFsdWU7CiAgICAgICAgIGNvbnN0IGZsb2F0IHFGYWN0b3IgPSAqKChmbG9hdCAqKSB2YWx1ZSArIDEpOworICAgICAgICBjb25zdCBmbG9hdCBtYXhBbXBsaXR1ZGUgPSAqKChmbG9hdCAqKSB2YWx1ZSArIDIpOwogICAgICAgICBjb250ZXh0LT5wYXJhbS5yZXNvbmFudEZyZXF1ZW5jeSA9CiAgICAgICAgICAgICAgICAgaXNuYW4ocmVzb25hbnRGcmVxdWVuY3kpID8gREVGQVVMVF9SRVNPTkFOVF9GUkVRVUVOQ1kgOiByZXNvbmFudEZyZXF1ZW5jeTsKICAgICAgICAgY29udGV4dC0+cGFyYW0uYnNmWmVyb1EgPSBpc25hbihxRmFjdG9yKSA/IERFRkFVTFRfQlNGX1BPTEVfUSA6IHFGYWN0b3I7CiAgICAgICAgIGNvbnRleHQtPnBhcmFtLmJzZlBvbGVRID0gY29udGV4dC0+cGFyYW0uYnNmWmVyb1EgLyAyLjBmOworICAgICAgICBjb250ZXh0LT5wYXJhbS5tYXhIYXB0aWNBbXBsaXR1ZGUgPSBtYXhBbXBsaXR1ZGU7CiAKICAgICAgICAgaWYgKGNvbnRleHQtPnByb2Nlc3NvcnNSZWNvcmQuYnBmICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIGNvbnRleHQtPnByb2Nlc3NvcnNSZWNvcmQuYnBmLT5zZXRDb2VmZmljaWVudHMoCkBAIC00NDgsNyArNDY1LDggQEAKICAgICBmbG9hdCogaGFwdGljT3V0QnVmZmVyID0gSGFwdGljR2VuZXJhdG9yX3J1blByb2Nlc3NpbmdDaGFpbigKICAgICAgICAgICAgIGNvbnRleHQtPnByb2Nlc3NpbmdDaGFpbiwgY29udGV4dC0+aW5wdXRCdWZmZXIuZGF0YSgpLAogICAgICAgICAgICAgY29udGV4dC0+b3V0cHV0QnVmZmVyLmRhdGEoKSwgaW5CdWZmZXItPmZyYW1lQ291bnQpOwotICAgIG9zOjpzY2FsZUhhcHRpY0RhdGEoaGFwdGljT3V0QnVmZmVyLCBoYXB0aWNTYW1wbGVDb3VudCwgY29udGV4dC0+cGFyYW0ubWF4SGFwdGljSW50ZW5zaXR5KTsKKyAgICBvczo6c2NhbGVIYXB0aWNEYXRhKGhhcHRpY091dEJ1ZmZlciwgaGFwdGljU2FtcGxlQ291bnQsIGNvbnRleHQtPnBhcmFtLm1heEhhcHRpY0ludGVuc2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnBhcmFtLm1heEhhcHRpY0FtcGxpdHVkZSk7CiAKICAgICAvLyBGb3IgaGFwdGljIGRhdGEsIHRoZSBoYXB0aWMgcGxheWJhY2sgdGhyZWFkIHdpbGwgY29weSB0aGUgZGF0YSBmcm9tIGVmZmVjdCBpbnB1dCBidWZmZXIsCiAgICAgLy8gd2hpY2ggY29udGFpbnMgaGFwdGljIGRhdGEgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBkaXJlY3RseSB0byBzaW5rIGJ1ZmZlci4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0VmZmVjdEhhcHRpY0dlbmVyYXRvci5oIGIvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvRWZmZWN0SGFwdGljR2VuZXJhdG9yLmgKaW5kZXggOTZiNzQ0YS4uODVlOTYxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvRWZmZWN0SGFwdGljR2VuZXJhdG9yLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvRWZmZWN0SGFwdGljR2VuZXJhdG9yLmgKQEAgLTUxLDYgKzUxLDcgQEAKICAgICAvLyBBIG1hcCBmcm9tIHRyYWNrIGlkIHRvIGhhcHRpYyBpbnRlbnNpdHkuCiAgICAgc3RkOjptYXA8aW50LCBvczo6SGFwdGljU2NhbGU+IGlkMkludGVuc2l0eTsKICAgICBvczo6SGFwdGljU2NhbGUgbWF4SGFwdGljSW50ZW5zaXR5OyAvLyBtYXggaW50ZW5zaXR5IHdpbGwgYmUgdXNlZCB0byBzY2FsZSBoYXB0aWMgZGF0YS4KKyAgICBmbG9hdCBtYXhIYXB0aWNBbXBsaXR1ZGU7IC8vIG1heCBhbXBsaXR1ZGUgd2lsbCBiZSB1c2VkIHRvIGxpbWl0IGhhcHRpYyBkYXRhIGFic29sdXRlIHZhbHVlcy4KIAogICAgIGZsb2F0IHJlc29uYW50RnJlcXVlbmN5OwogICAgIGZsb2F0IGJwZlE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL0FuZHJvaWQuYnAKaW5kZXggOGEyNWI4NS4uYzIxYzVmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vYmVuY2htYXJrcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2JlbmNobWFya3MvQW5kcm9pZC5icApAQCAtMjksOSArMjksNiBAQAogICAgIG5hbWU6ICJyZXZlcmJfYmVuY2htYXJrIiwKICAgICB2ZW5kb3I6IHRydWUsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiIiwKLSAgICBdLAogICAgIHNyY3M6IFsicmV2ZXJiX2JlbmNobWFyay5jcHAiXSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlicmV2ZXJiIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jcHAKaW5kZXggN2U1Y2FlZC4uY2NlZjVhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jcHAKQEAgLTEzNSw3ICsxMzUsNiBAQAogICAgIExWTV9VSU5UMzIgZnMgPQogICAgICAgICAgICAgKExWTV9VSU5UMzIpTFZFUU5CX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07IC8qIFNhbXBsZSByYXRlICovCiAgICAgTFZNX1VJTlQzMiBmYzsgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAgTFZNX0lOVDE2IFFGYWN0b3I7IC8qIEZpbHRlciBRIGZhY3RvciAqLwogCiAgICAgcEluc3RhbmNlLT5OQmFuZHMgPSBwUGFyYW1zLT5OQmFuZHM7CiAKQEAgLTE0NCw3ICsxNDMsNiBAQAogICAgICAgICAgKiBHZXQgdGhlIGZpbHRlciBzZXR0aW5ncwogICAgICAgICAgKi8KICAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5OyAvKiBHZXQgdGhlIGJhbmQgY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgICAgICBRRmFjdG9yID0gKExWTV9JTlQxNilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uUUZhY3RvcjsgLyogR2V0IHRoZSBiYW5kIFEgZmFjdG9yICovCiAKICAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ7IC8qIERlZmF1bHQgdG8gc2luZ2xlIHByZWNpc2lvbiAqLwogCkBAIC0zMTMsOSArMzExLDkgQEAKICAgICAgKi8KICAgICBwSW5zdGFuY2UtPmVxQmlxdWFkLnJlc2l6ZShwUGFyYW1zLT5OQmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+KHBQYXJhbXMtPk5yQ2hhbm5lbHMpKTsKLSAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KHBJbnN0YW5jZSk7CiAKICAgICBpZiAoYkNoYW5nZSB8fCBtb2RlQ2hhbmdlKSB7CisgICAgICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkocEluc3RhbmNlKTsKICAgICAgICAgLyoKICAgICAgICAgICogSWYgdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkIGNsZWFyIHRoZSBoaXN0b3J5CiAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuY3BwCmluZGV4IDhlNjM1MDIuLmZmZWQ2ZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jcHAKQEAgLTQyMSw3ICs0MjEsNiBAQAogICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKICAgICAgKi8KICAgICBMVk1fRkxPQVQgVDA7Ci0gICAgTFZNX0ZMT0FUIEQ7CiAgICAgTFZNX0ZMT0FUIEEwOwogICAgIExWTV9GTE9BVCBCMTsKICAgICBMVk1fRkxPQVQgQjI7CkBAIC00NDQsOSArNDQzLDYgQEAKICAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcwogICAgICAqLwogICAgIFQwID0gRnJlcXVlbmN5ICogTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbRnNdOyAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KLSAgICBEID0gMzIwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKDEqMTAwKjJeNSkgKi8KLSAgICAvKiBGb3JjZSBEID0gMSA6IHRoZSBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSB1c2VkIGZvciBhIHBlYWtpbmcgZmlsdGVyLgotICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwogCiAgICAgLyoKICAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CkBAIC01MzUsNyArNTMxLDYgQEAKICAgICAgKiBJbnRlcm1lZGlhdGUgdmFyaWFibGVzIGFuZCB0ZW1wb3JhcnkgdmFsdWVzCiAgICAgICovCiAgICAgTFZNX0ZMT0FUIFQwOwotICAgIExWTV9GTE9BVCBEOwogICAgIExWTV9GTE9BVCBBMDsKICAgICBMVk1fRkxPQVQgQjE7CiAgICAgTFZNX0ZMT0FUIEIyOwpAQCAtNTU4LDkgKzU1Myw2IEBACiAgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKICAgICAgKi8KICAgICBUMCA9IEZyZXF1ZW5jeSAqIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW0ZzXTsgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCi0gICAgRCA9IDMyMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDAwMDAwICgxKjEwMCoyXjUpICovCi0gICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KLSAgICAgICBUaGUgRCBwYXJhbWV0ZXIgZG8gbm90IGV4aXN0IGZvciBhIEJhbmRQYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KIAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggOTkzOWVkMS4uN2Q3ZjhiOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xOCwxMCArMTgsNiBAQAogICAgICAgICAiRWZmZWN0UmV2ZXJiVGVzdC5jcHAiLAogICAgICAgICAiRWZmZWN0VGVzdEhlbHBlci5jcHAiLAogICAgIF0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIiLAotICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGlicmV2ZXJiIiwKQEAgLTEwOCwxMCArMTA0LDYgQEAKICAgICBwcm9wcmlldGFyeTogdHJ1ZSwKICAgICBndGVzdDogZmFsc2UsCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIiLAotICAgIF0sCi0KICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0QnVuZGxlVGVzdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9FZmZlY3RCdW5kbGVUZXN0LmNwcAppbmRleCA4ODFmZmIxLi4wMThjYjdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9FZmZlY3RCdW5kbGVUZXN0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9FZmZlY3RCdW5kbGVUZXN0LmNwcApAQCAtMTQsMjkgKzE0LDM5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X2Jhc3Nib29zdC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9lcXVhbGl6ZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlydHVhbGl6ZXIuaD4KICNpbmNsdWRlICJFZmZlY3RUZXN0SGVscGVyLmgiCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotLy8gVXBkYXRlIGlzQmFzc0Jvb3N0LCBpZiB0aGUgb3JkZXIgb2YgZWZmZWN0cyBpcyB1cGRhdGVkCi1jb25zdGV4cHIgZWZmZWN0X3V1aWRfdCBrRWZmZWN0VXVpZHNbXSA9IHsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordHlwZWRlZiBlbnVtIHsKKyAgICBFRkZFQ1RfQkFTU19CT09TVCwKKyAgICBFRkZFQ1RfRVFVQUxJWkVSLAorICAgIEVGRkVDVF9WSVJUVUFMSVpFUiwKKyAgICBFRkZFQ1RfVk9MVU1FCit9IGVmZmVjdF90eXBlX3Q7CisKK2NvbnN0IHN0ZDo6bWFwPGVmZmVjdF90eXBlX3QsIGVmZmVjdF91dWlkX3Q+IGtFZmZlY3RVdWlkcyA9IHsKICAgICAgICAgLy8gTlhQIFNXIEJhc3NCb29zdAotICAgICAgICB7MHg4NjMxZjMwMCwgMHg3MmUyLCAweDExZGYsIDB4YjU3ZSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKLSAgICAgICAgLy8gTlhQIFNXIFZpcnR1YWxpemVyCi0gICAgICAgIHsweDFkNDAzM2MwLCAweDg1NTcsIDB4MTFkZiwgMHg5ZjJkLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICB7RUZGRUNUX0JBU1NfQk9PU1QsCisgICAgICAgICB7MHg4NjMxZjMwMCwgMHg3MmUyLCAweDExZGYsIDB4YjU3ZSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fX0sCiAgICAgICAgIC8vIE5YUCBTVyBFcXVhbGl6ZXIKLSAgICAgICAgezB4Y2U3NzJmMjAsIDB4ODQ3ZCwgMHgxMWRmLCAweGJiMTcsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIHtFRkZFQ1RfRVFVQUxJWkVSLAorICAgICAgICAgezB4Y2U3NzJmMjAsIDB4ODQ3ZCwgMHgxMWRmLCAweGJiMTcsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX19LAorICAgICAgICAvLyBOWFAgU1cgVmlydHVhbGl6ZXIKKyAgICAgICAge0VGRkVDVF9WSVJUVUFMSVpFUiwKKyAgICAgICAgIHsweDFkNDAzM2MwLCAweDg1NTcsIDB4MTFkZiwgMHg5ZjJkLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19fSwKICAgICAgICAgLy8gTlhQIFNXIFZvbHVtZQotICAgICAgICB7MHgxMTkzNDFhMCwgMHg4NDY5LCAweDExZGYsIDB4ODFmOSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAge0VGRkVDVF9WT0xVTUUsIHsweDExOTM0MWEwLCAweDg0NjksIDB4MTFkZiwgMHg4MWY5LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19fSwKIH07CiAKLXN0YXRpYyBib29sIGlzQmFzc0Jvb3N0KGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQpIHsKLSAgICAvLyBVcGRhdGUgdGhpcywgaWYgdGhlIG9yZGVyIG9mIGVmZmVjdHMgaW4ga0VmZmVjdFV1aWRzIGlzIHVwZGF0ZWQKLSAgICByZXR1cm4gdXVpZCA9PSAma0VmZmVjdFV1aWRzWzBdOwotfQorY29uc3Qgc2l6ZV90IGtOdW1FZmZlY3RVdWlkcyA9IHN0ZDo6c2l6ZShrRWZmZWN0VXVpZHMpOwogCi1jb25zdGV4cHIgc2l6ZV90IGtOdW1FZmZlY3RVdWlkcyA9IHN0ZDo6c2l6ZShrRWZmZWN0VXVpZHMpOworY29uc3RleHByIGZsb2F0IGtNaW5BbXBsaXR1ZGUgPSAtMS4wZjsKK2NvbnN0ZXhwciBmbG9hdCBrTWF4QW1wbGl0dWRlID0gMS4wZjsKIAotdHlwZWRlZiBzdGQ6OnR1cGxlPGludCwgaW50LCBpbnQsIGludCwgaW50PiBTaW5nbGVFZmZlY3RUZXN0UGFyYW07Cit1c2luZyBTaW5nbGVFZmZlY3RUZXN0UGFyYW0gPSBzdGQ6OnR1cGxlPGludCwgaW50LCBpbnQsIGludCwgaW50PjsKIGNsYXNzIFNpbmdsZUVmZmVjdFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFNpbmdsZUVmZmVjdFRlc3RQYXJhbT4gewogICBwdWJsaWM6CiAgICAgU2luZ2xlRWZmZWN0VGVzdCgpCkBAIC00Niw3ICs1Niw4IEBACiAgICAgICAgICAgbUZyYW1lQ291bnQoRWZmZWN0VGVzdEhlbHBlcjo6a0ZyYW1lQ291bnRzW3N0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpXSksCiAgICAgICAgICAgbUxvb3BDb3VudChFZmZlY3RUZXN0SGVscGVyOjprTG9vcENvdW50c1tzdGQ6OmdldDwzPihHZXRQYXJhbSgpKV0pLAogICAgICAgICAgIG1Ub3RhbEZyYW1lQ291bnQobUZyYW1lQ291bnQgKiBtTG9vcENvdW50KSwKLSAgICAgICAgICBtVXVpZCgma0VmZmVjdFV1aWRzW3N0ZDo6Z2V0PDQ+KEdldFBhcmFtKCkpXSkge30KKyAgICAgICAgICBtRWZmZWN0VHlwZSgoZWZmZWN0X3R5cGVfdClzdGQ6OmdldDw0PihHZXRQYXJhbSgpKSksCisgICAgICAgICAgbVV1aWQoa0VmZmVjdFV1aWRzLmF0KG1FZmZlY3RUeXBlKSkge30KIAogICAgIGNvbnN0IHNpemVfdCBtQ2hNYXNrOwogICAgIGNvbnN0IHNpemVfdCBtQ2hhbm5lbENvdW50OwpAQCAtNTQsNyArNjUsOCBAQAogICAgIGNvbnN0IHNpemVfdCBtRnJhbWVDb3VudDsKICAgICBjb25zdCBzaXplX3QgbUxvb3BDb3VudDsKICAgICBjb25zdCBzaXplX3QgbVRvdGFsRnJhbWVDb3VudDsKLSAgICBjb25zdCBlZmZlY3RfdXVpZF90KiBtVXVpZDsKKyAgICBjb25zdCBlZmZlY3RfdHlwZV90IG1FZmZlY3RUeXBlOworICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgbVV1aWQ7CiB9OwogCiAvLyBUZXN0cyBhcHBseWluZyBhIHNpbmdsZSBlZmZlY3QKQEAgLTYzLDcgKzc1LDcgQEAKICAgICAgICAgICAgICAgICAgPDwgImNoTWFzazogIiA8PCBtQ2hNYXNrIDw8ICIgc2FtcGxlUmF0ZTogIiA8PCBtU2FtcGxlUmF0ZQogICAgICAgICAgICAgICAgICA8PCAiIGZyYW1lQ291bnQ6ICIgPDwgbUZyYW1lQ291bnQgPDwgIiBsb29wQ291bnQ6ICIgPDwgbUxvb3BDb3VudCk7CiAKLSAgICBFZmZlY3RUZXN0SGVscGVyIGVmZmVjdChtVXVpZCwgbUNoTWFzaywgbUNoTWFzaywgbVNhbXBsZVJhdGUsIG1GcmFtZUNvdW50LCBtTG9vcENvdW50KTsKKyAgICBFZmZlY3RUZXN0SGVscGVyIGVmZmVjdCgmbVV1aWQsIG1DaE1hc2ssIG1DaE1hc2ssIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbUxvb3BDb3VudCk7CiAKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlZmZlY3QuY3JlYXRlRWZmZWN0KCkpOwogICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVmZmVjdC5zZXRDb25maWcoKSk7CkBAIC03Miw3ICs4NCw3IEBACiAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGlucHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50KTsKICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gb3V0cHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50KTsKICAgICBzdGQ6Om1pbnN0ZF9yYW5kIGdlbihtQ2hNYXNrKTsKLSAgICBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248PiBkaXMoLTEuMGYsIDEuMGYpOworICAgIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjw+IGRpcyhrTWluQW1wbGl0dWRlLCBrTWF4QW1wbGl0dWRlKTsKICAgICBmb3IgKGF1dG8mIGluIDogaW5wdXQpIHsKICAgICAgICAgaW4gPSBkaXMoZ2VuKTsKICAgICB9CkBAIC04OCw3ICsxMDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KUVmZmVjdFRlc3RIZWxwZXI6OmtOdW1Mb29wQ291bnRzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClrTnVtRWZmZWN0VXVpZHMpKSk7CiAKLXR5cGVkZWYgc3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQ+IFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0UGFyYW07Cit1c2luZyBTaW5nbGVFZmZlY3RDb21wYXJpc29uVGVzdFBhcmFtID0gc3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQ+OwogY2xhc3MgU2luZ2xlRWZmZWN0Q29tcGFyaXNvblRlc3QKICAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08U2luZ2xlRWZmZWN0Q29tcGFyaXNvblRlc3RQYXJhbT4gewogICBwdWJsaWM6CkBAIC05NywxMyArMTA5LDE1IEBACiAgICAgICAgICAgbUZyYW1lQ291bnQoRWZmZWN0VGVzdEhlbHBlcjo6a0ZyYW1lQ291bnRzW3N0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpXSksCiAgICAgICAgICAgbUxvb3BDb3VudChFZmZlY3RUZXN0SGVscGVyOjprTG9vcENvdW50c1tzdGQ6OmdldDwyPihHZXRQYXJhbSgpKV0pLAogICAgICAgICAgIG1Ub3RhbEZyYW1lQ291bnQobUZyYW1lQ291bnQgKiBtTG9vcENvdW50KSwKLSAgICAgICAgICBtVXVpZCgma0VmZmVjdFV1aWRzW3N0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpXSkge30KKyAgICAgICAgICBtRWZmZWN0VHlwZSgoZWZmZWN0X3R5cGVfdClzdGQ6OmdldDwzPihHZXRQYXJhbSgpKSksCisgICAgICAgICAgbVV1aWQoa0VmZmVjdFV1aWRzLmF0KG1FZmZlY3RUeXBlKSkge30KIAogICAgIGNvbnN0IHNpemVfdCBtU2FtcGxlUmF0ZTsKICAgICBjb25zdCBzaXplX3QgbUZyYW1lQ291bnQ7CiAgICAgY29uc3Qgc2l6ZV90IG1Mb29wQ291bnQ7CiAgICAgY29uc3Qgc2l6ZV90IG1Ub3RhbEZyYW1lQ291bnQ7Ci0gICAgY29uc3QgZWZmZWN0X3V1aWRfdCogbVV1aWQ7CisgICAgY29uc3QgZWZmZWN0X3R5cGVfdCBtRWZmZWN0VHlwZTsKKyAgICBjb25zdCBlZmZlY3RfdXVpZF90IG1VdWlkOwogfTsKIAogLy8gQ29tcGFyZXMgZmlyc3QgdHdvIGNoYW5uZWxzIGluIG11bHRpLWNoYW5uZWwgb3V0cHV0IHRvIHN0ZXJlbyBvdXRwdXQgd2hlbiBzYW1lIGVmZmVjdCBpcyBhcHBsaWVkCkBAIC0xMTUsNyArMTI5LDcgQEAKICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gbW9ub0lucHV0KG1Ub3RhbEZyYW1lQ291bnQpOwogCiAgICAgc3RkOjptaW5zdGRfcmFuZCBnZW4obVNhbXBsZVJhdGUpOwotICAgIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjw+IGRpcygtMS4wZiwgMS4wZik7CisgICAgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPD4gZGlzKGtNaW5BbXBsaXR1ZGUsIGtNYXhBbXBsaXR1ZGUpOwogICAgIGZvciAoYXV0byYgaW4gOiBtb25vSW5wdXQpIHsKICAgICAgICAgaW4gPSBkaXMoZ2VuKTsKICAgICB9CkBAIC0xMjYsNyArMTQwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgbVRvdGFsRnJhbWVDb3VudCAqIHNpemVvZihmbG9hdCkgKiBGQ0NfMSk7CiAKICAgICAvLyBBcHBseSBlZmZlY3Qgb24gc3RlcmVvIGNoYW5uZWxzCi0gICAgRWZmZWN0VGVzdEhlbHBlciBzdGVyZW9FZmZlY3QobVV1aWQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAorICAgIEVmZmVjdFRlc3RIZWxwZXIgc3RlcmVvRWZmZWN0KCZtVXVpZCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1GcmFtZUNvdW50LCBtTG9vcENvdW50KTsKIAogICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHN0ZXJlb0VmZmVjdC5jcmVhdGVFZmZlY3QoKSk7CkBAIC0xNDIsNyArMTU2LDcgQEAKIAogICAgIGZvciAoc2l6ZV90IGNoTWFzayA6IEVmZmVjdFRlc3RIZWxwZXI6OmtDaE1hc2tzKSB7CiAgICAgICAgIHNpemVfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hNYXNrKTsKLSAgICAgICAgRWZmZWN0VGVzdEhlbHBlciB0ZXN0RWZmZWN0KG1VdWlkLCBjaE1hc2ssIGNoTWFzaywgbVNhbXBsZVJhdGUsIG1GcmFtZUNvdW50LCBtTG9vcENvdW50KTsKKyAgICAgICAgRWZmZWN0VGVzdEhlbHBlciB0ZXN0RWZmZWN0KCZtVXVpZCwgY2hNYXNrLCBjaE1hc2ssIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbUxvb3BDb3VudCk7CiAKICAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5jcmVhdGVFZmZlY3QoKSk7CiAgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3Quc2V0Q29uZmlnKCkpOwpAQCAtMTcwLDcgKzE4NCw3IEBACiAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChzdGVyZW9UZXN0STE2LmRhdGEoKSwgc3RlcmVvVGVzdE91dHB1dC5kYXRhKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxGcmFtZUNvdW50ICogRkNDXzIpOwogCi0gICAgICAgIGlmIChpc0Jhc3NCb29zdChtVXVpZCkpIHsKKyAgICAgICAgaWYgKEVGRkVDVF9CQVNTX0JPT1NUID09IG1FZmZlY3RUeXBlKSB7CiAgICAgICAgICAgICAvLyBTTlIgbXVzdCBiZSBhYm92ZSB0aGUgdGhyZXNob2xkCiAgICAgICAgICAgICBmbG9hdCBzbnIgPSBjb21wdXRlU25yPGludDE2X3Q+KHN0ZXJlb1JlZkkxNi5kYXRhKCksIHN0ZXJlb1Rlc3RJMTYuZGF0YSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxGcmFtZUNvdW50ICogRkNDXzIpOwpAQCAtMTkxLDYgKzIwNSwxMzUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtTG9vcENvdW50cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpa051bUVmZmVjdFV1aWRzKSkpOwogCit1c2luZyBTaW5nbGVFZmZlY3REZWZhdWx0U2V0UGFyYW1UZXN0UGFyYW0gPSBzdGQ6OnR1cGxlPGludCwgaW50LCBpbnQ+OworY2xhc3MgU2luZ2xlRWZmZWN0RGVmYXVsdFNldFBhcmFtVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxTaW5nbGVFZmZlY3REZWZhdWx0U2V0UGFyYW1UZXN0UGFyYW0+IHsKKyAgcHVibGljOgorICAgIFNpbmdsZUVmZmVjdERlZmF1bHRTZXRQYXJhbVRlc3QoKQorICAgICAgICA6IG1DaE1hc2soRWZmZWN0VGVzdEhlbHBlcjo6a0NoTWFza3Nbc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtQ2hhbm5lbENvdW50KGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hNYXNrKSksCisgICAgICAgICAgbVNhbXBsZVJhdGUoMTYwMDApLAorICAgICAgICAgIG1GcmFtZUNvdW50KEVmZmVjdFRlc3RIZWxwZXI6OmtGcmFtZUNvdW50c1tzdGQ6OmdldDwxPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1Mb29wQ291bnQoMSksCisgICAgICAgICAgbVRvdGFsRnJhbWVDb3VudChtRnJhbWVDb3VudCAqIG1Mb29wQ291bnQpLAorICAgICAgICAgIG1FZmZlY3RUeXBlKChlZmZlY3RfdHlwZV90KXN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpKSwKKyAgICAgICAgICBtVXVpZChrRWZmZWN0VXVpZHMuYXQobUVmZmVjdFR5cGUpKSB7fQorCisgICAgY29uc3Qgc2l6ZV90IG1DaE1hc2s7CisgICAgY29uc3Qgc2l6ZV90IG1DaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1TYW1wbGVSYXRlOworICAgIGNvbnN0IHNpemVfdCBtRnJhbWVDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbUxvb3BDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbVRvdGFsRnJhbWVDb3VudDsKKyAgICBjb25zdCBlZmZlY3RfdHlwZV90IG1FZmZlY3RUeXBlOworICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgbVV1aWQ7Cit9OworCisvLyBUZXN0cyB2ZXJpZnlpbmcgdGhhdCByZWR1bmRhbnQgc2V0UGFyYW0gY2FsbHMgZG8gbm90IGFsdGVyIG91dHB1dAorVEVTVF9QKFNpbmdsZUVmZmVjdERlZmF1bHRTZXRQYXJhbVRlc3QsIFNpbXBsZVByb2Nlc3MpIHsKKyAgICBTQ09QRURfVFJBQ0UodGVzdGluZzo6TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgIDw8ICJjaE1hc2s6ICIgPDwgbUNoTWFzayA8PCAiIHNhbXBsZVJhdGU6ICIgPDwgbVNhbXBsZVJhdGUKKyAgICAgICAgICAgICAgICAgPDwgIiBmcmFtZUNvdW50OiAiIDw8IG1GcmFtZUNvdW50IDw8ICIgbG9vcENvdW50OiAiIDw8IG1Mb29wQ291bnQpOworICAgIC8vIGVmZmVjdC5wcm9jZXNzKCkgaGFuZGxlcyBtVG90YWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCBzYW1wbGVzIGluIGVhY2ggY2FsbC4KKyAgICAvLyBUaGlzIHRlc3QgY2FsbHMgcHJvY2VzcygpIHR3aWNlIHBlciBlZmZlY3QsIGhlbmNlIHRvdGFsIHNhbXBsZXMgd2hlbiBhbGxvY2F0aW5nCisgICAgLy8gaW5wdXQgYW5kIG91dHB1dCB2ZWN0b3JzIGlzIHR3aWNlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwcm9jZXNzZWQgaW4gb25lIGNhbGwuCisgICAgc2l6ZV90IHRvdGFsTnVtU2FtcGxlcyA9IDIgKiBtVG90YWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudDsKKyAgICAvLyBJbml0aWFsaXplIGlucHV0IGJ1ZmZlciB3aXRoIGRldGVybWluaXN0aWMgcHNldWRvLXJhbmRvbSB2YWx1ZXMKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gaW5wdXQodG90YWxOdW1TYW1wbGVzKTsKKyAgICBzdGQ6Om1pbnN0ZF9yYW5kIGdlbihtQ2hNYXNrKTsKKyAgICBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248PiBkaXMoa01pbkFtcGxpdHVkZSwga01heEFtcGxpdHVkZSk7CisgICAgZm9yIChhdXRvJiBpbiA6IGlucHV0KSB7CisgICAgICAgIGluID0gZGlzKGdlbik7CisgICAgfQorCisgICAgdWludDMyX3Qga2V5OworICAgIGludDMyX3QgdmFsdWUxLCB2YWx1ZTI7CisgICAgc3dpdGNoIChtRWZmZWN0VHlwZSkgeworICAgICAgICBjYXNlIEVGRkVDVF9CQVNTX0JPT1NUOgorICAgICAgICAgICAga2V5ID0gQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIOworICAgICAgICAgICAgdmFsdWUxID0gMTsKKyAgICAgICAgICAgIHZhbHVlMiA9IDE0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUZGRUNUX1ZJUlRVQUxJWkVSOgorICAgICAgICAgICAga2V5ID0gVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEg7CisgICAgICAgICAgICB2YWx1ZTEgPSAwOworICAgICAgICAgICAgdmFsdWUyID0gMTAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUZGRUNUX0VRVUFMSVpFUjoKKyAgICAgICAgICAgIGtleSA9IEVRX1BBUkFNX0NVUl9QUkVTRVQ7CisgICAgICAgICAgICB2YWx1ZTEgPSAwOworICAgICAgICAgICAgdmFsdWUyID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVGRkVDVF9WT0xVTUU6CisgICAgICAgICAgICBrZXkgPSAwIC8qIFZPTFVNRV9QQVJBTV9MRVZFTCAqLzsKKyAgICAgICAgICAgIHZhbHVlMSA9IDA7CisgICAgICAgICAgICB2YWx1ZTIgPSAtMTAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBGQUlMKCkgPDwgIlVuc3VwcG9ydGVkIGVmZmVjdCB0eXBlIDogIiA8PCBtRWZmZWN0VHlwZTsKKyAgICB9CisKKyAgICBFZmZlY3RUZXN0SGVscGVyIHJlZkVmZmVjdCgmbVV1aWQsIG1DaE1hc2ssIG1DaE1hc2ssIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbUxvb3BDb3VudCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShyZWZFZmZlY3QuY3JlYXRlRWZmZWN0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHJlZkVmZmVjdC5zZXRDb25maWcoKSk7CisKKyAgICBpZiAoRUZGRUNUX0JBU1NfQk9PU1QgPT0gbUVmZmVjdFR5cGUpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocmVmRWZmZWN0LnNldFBhcmFtPGludDE2X3Q+KGtleSwgdmFsdWUxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocmVmRWZmZWN0LnNldFBhcmFtPGludDMyX3Q+KGtleSwgdmFsdWUxKSk7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiByZWZPdXRwdXQodG90YWxOdW1TYW1wbGVzKTsKKyAgICBmbG9hdCogcElucHV0ID0gaW5wdXQuZGF0YSgpOworICAgIGZsb2F0KiBwT3V0cHV0ID0gcmVmT3V0cHV0LmRhdGEoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShyZWZFZmZlY3QucHJvY2VzcyhwSW5wdXQsIHBPdXRwdXQpKTsKKworICAgIHBJbnB1dCArPSB0b3RhbE51bVNhbXBsZXMgLyAyOworICAgIHBPdXRwdXQgKz0gdG90YWxOdW1TYW1wbGVzIC8gMjsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShyZWZFZmZlY3QucHJvY2VzcyhwSW5wdXQsIHBPdXRwdXQpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShyZWZFZmZlY3QucmVsZWFzZUVmZmVjdCgpKTsKKworICAgIEVmZmVjdFRlc3RIZWxwZXIgdGVzdEVmZmVjdCgmbVV1aWQsIG1DaE1hc2ssIG1DaE1hc2ssIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbUxvb3BDb3VudCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LmNyZWF0ZUVmZmVjdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LnNldENvbmZpZygpKTsKKworICAgIGlmIChFRkZFQ1RfQkFTU19CT09TVCA9PSBtRWZmZWN0VHlwZSkgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LnNldFBhcmFtPGludDE2X3Q+KGtleSwgdmFsdWUxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5zZXRQYXJhbTxpbnQzMl90PihrZXksIHZhbHVlMSkpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiB0ZXN0T3V0cHV0KHRvdGFsTnVtU2FtcGxlcyk7CisgICAgcElucHV0ID0gaW5wdXQuZGF0YSgpOworICAgIHBPdXRwdXQgPSB0ZXN0T3V0cHV0LmRhdGEoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LnByb2Nlc3MocElucHV0LCBwT3V0cHV0KSk7CisKKyAgICAvLyBDYWxsIHNldFBhcmFtIG9uY2UgdG8gY2hhbmdlIHRoZSBwYXJhbWV0ZXJzLCBhbmQgdGhlbiBjYWxsIHNldFBhcmFtIGFnYWluCisgICAgLy8gdG8gcmVzdG9yZSB0aGUgcGFyYW1ldGVycyB0byB0aGUgaW5pdGlhbCBzdGF0ZSwgbWFraW5nIHRoZSBmaXJzdCBzZXRQYXJhbQorICAgIC8vIGNhbGwgcmVkdW5kYW50CisgICAgaWYgKEVGRkVDVF9CQVNTX0JPT1NUID09IG1FZmZlY3RUeXBlKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3Quc2V0UGFyYW08aW50MTZfdD4oa2V5LCB2YWx1ZTIpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5zZXRQYXJhbTxpbnQxNl90PihrZXksIHZhbHVlMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3Quc2V0UGFyYW08aW50MzJfdD4oa2V5LCB2YWx1ZTIpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5zZXRQYXJhbTxpbnQzMl90PihrZXksIHZhbHVlMSkpOworICAgIH0KKworICAgIHBJbnB1dCArPSB0b3RhbE51bVNhbXBsZXMgLyAyOworICAgIHBPdXRwdXQgKz0gdG90YWxOdW1TYW1wbGVzIC8gMjsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LnByb2Nlc3MocElucHV0LCBwT3V0cHV0KSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5yZWxlYXNlRWZmZWN0KCkpOworICAgIEFTU0VSVF9UUlVFKGFyZU5lYXJseVNhbWUocmVmT3V0cHV0LmRhdGEoKSwgdGVzdE91dHB1dC5kYXRhKCksIHRvdGFsTnVtU2FtcGxlcykpCisgICAgICAgICAgICA8PCAiT3V0cHV0cyBkbyBub3QgbWF0Y2ggd2l0aCBkZWZhdWx0IHNldFBhcmFtIGNhbGxzIjsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBFZmZlY3RCdW5kbGVUZXN0QWxsLCBTaW5nbGVFZmZlY3REZWZhdWx0U2V0UGFyYW1UZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OkNvbWJpbmUoOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KUVmZmVjdFRlc3RIZWxwZXI6OmtOdW1DaE1hc2tzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtRnJhbWVDb3VudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KWtOdW1FZmZlY3RVdWlkcykpKTsKKwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0VmZmVjdFRlc3RIZWxwZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5jcHAKaW5kZXggNjI1YzE1YS4uZWM3MjdjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5jcHAKQEAgLTUwLDIzICs1MCw2IEBACiAgICAgQVNTRVJUX0VRKHJlcGx5LCAwKSA8PCAiY21kX2VuYWJsZSByZXBseSBub24gemVybyAiIDw8IHJlcGx5OwogfQogCi12b2lkIEVmZmVjdFRlc3RIZWxwZXI6OnNldFBhcmFtKHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHZhbHVlKSB7Ci0gICAgaW50IHJlcGx5ID0gMDsKLSAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOwotICAgIHVpbnQzMl90IHBhcmFtRGF0YVsyXSA9IHt0eXBlLCB2YWx1ZX07Ci0gICAgYXV0byBlZmZlY3RQYXJhbSA9IG5ldyBlZmZlY3RfcGFyYW1fdFtzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKHBhcmFtRGF0YSldOwotICAgIG1lbWNweSgmZWZmZWN0UGFyYW0tPmRhdGFbMF0sICZwYXJhbURhdGFbMF0sIHNpemVvZihwYXJhbURhdGEpKTsKLSAgICBlZmZlY3RQYXJhbS0+cHNpemUgPSBzaXplb2YocGFyYW1EYXRhWzBdKTsKLSAgICBlZmZlY3RQYXJhbS0+dnNpemUgPSBzaXplb2YocGFyYW1EYXRhWzFdKTsKLSAgICBpbnQgc3RhdHVzID0gKCptRWZmZWN0SGFuZGxlKQotICAgICAgICAgICAgICAgICAgICAgICAgIC0+Y29tbWFuZChtRWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihwYXJhbURhdGEpLCBlZmZlY3RQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKLSAgICBkZWxldGVbXSBlZmZlY3RQYXJhbTsKLSAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAic2V0X3BhcmFtIHJldHVybmVkIGFuIGVycm9yICIgPDwgc3RhdHVzOwotICAgIEFTU0VSVF9FUShyZXBseSwgMCkgPDwgInNldF9wYXJhbSByZXBseSBub24gemVybyAiIDw8IHJlcGx5OwotfQotCiB2b2lkIEVmZmVjdFRlc3RIZWxwZXI6OnByb2Nlc3MoZmxvYXQqIGlucHV0LCBmbG9hdCogb3V0cHV0KSB7CiAgICAgYXVkaW9fYnVmZmVyX3QgaW5CdWZmZXIgPSB7LmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudCwgLmYzMiA9IGlucHV0fTsKICAgICBhdWRpb19idWZmZXJfdCBvdXRCdWZmZXIgPSB7LmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudCwgLmYzMiA9IG91dHB1dH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9FZmZlY3RUZXN0SGVscGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9FZmZlY3RUZXN0SGVscGVyLmgKaW5kZXggMzg1NGQ0Ni4uYmNlZTg0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0VmZmVjdFRlc3RIZWxwZXIuaApAQCAtNTAsNiArNTAsMjMgQEAKICAgICByZXR1cm4gc25yOwogfQogCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBmbG9hdCBhcmVOZWFybHlTYW1lKGNvbnN0IFQqIHJlZiwgY29uc3QgVCogdHN0LCBzaXplX3QgY291bnQpIHsKKyAgICBUIGRlbHRhOworICAgIGlmIGNvbnN0ZXhwciAoc3RkOjppc19mbG9hdGluZ19wb2ludF92PFQ+KSB7CisgICAgICAgIGRlbHRhID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6ZXBzaWxvbigpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlbHRhID0gMTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIGNvbnN0IGRvdWJsZSBkaWZmKHRzdFtpXSAtIHJlZltpXSk7CisgICAgICAgIGlmIChhYnMoZGlmZikgPiBkZWx0YSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiBjbGFzcyBFZmZlY3RUZXN0SGVscGVyIHsKICAgcHVibGljOgogICAgIEVmZmVjdFRlc3RIZWxwZXIoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCwgc2l6ZV90IGluQ2hNYXNrLCBzaXplX3Qgb3V0Q2hNYXNrLApAQCAtNjUsNyArODIsMjUgQEAKICAgICB2b2lkIGNyZWF0ZUVmZmVjdCgpOwogICAgIHZvaWQgcmVsZWFzZUVmZmVjdCgpOwogICAgIHZvaWQgc2V0Q29uZmlnKCk7Ci0gICAgdm9pZCBzZXRQYXJhbSh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCB2YWwpOworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBWQUxVRV9EVFlQRT4KKyAgICB2b2lkIHNldFBhcmFtKHVpbnQzMl90IHR5cGUsIFZBTFVFX0RUWVBFIGNvbnN0IHZhbHVlKSB7CisgICAgICAgIGludCByZXBseSA9IDA7CisgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisKKyAgICAgICAgdWludDhfdCBwYXJhbURhdGFbc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZih0eXBlKSArIHNpemVvZih2YWx1ZSldOworICAgICAgICBhdXRvIGVmZmVjdFBhcmFtID0gKGVmZmVjdF9wYXJhbV90KilwYXJhbURhdGE7CisKKyAgICAgICAgbWVtY3B5KCZlZmZlY3RQYXJhbS0+ZGF0YVswXSwgJnR5cGUsIHNpemVvZih0eXBlKSk7CisgICAgICAgIG1lbWNweSgmZWZmZWN0UGFyYW0tPmRhdGFbc2l6ZW9mKHR5cGUpXSwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKKyAgICAgICAgZWZmZWN0UGFyYW0tPnBzaXplID0gc2l6ZW9mKHR5cGUpOworICAgICAgICBlZmZlY3RQYXJhbS0+dnNpemUgPSBzaXplb2YodmFsdWUpOworICAgICAgICBpbnQgc3RhdHVzID0gKCptRWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQobUVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKHR5cGUpICsgc2l6ZW9mKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdFBhcmFtLCAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAic2V0X3BhcmFtIHJldHVybmVkIGFuIGVycm9yICIgPDwgc3RhdHVzOworICAgICAgICBBU1NFUlRfRVEocmVwbHksIDApIDw8ICJzZXRfcGFyYW0gcmVwbHkgbm9uIHplcm8gIiA8PCByZXBseTsKKyAgICB9OwogICAgIHZvaWQgcHJvY2VzcyhmbG9hdCogaW5wdXQsIGZsb2F0KiBvdXRwdXQpOwogCiAgICAgLy8gQ29ycmVzcG9uZHMgdG8gU05SIGZvciAxIGJpdCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGludDE2X3Qgc2lnbmFscwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCmluZGV4IGUxNjllM2MuLjEyODc1MTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAKQEAgLTg5LDYgKzg5LDggQEAKIAogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJSZXZlcmIiXSwKIAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiUmV2ZXJiIl0sCisKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCiAgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nLy5jbGFuZy1mb3JtYXQgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvLmNsYW5nLWZvcm1hdApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggZjFiNGY2OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvLmNsYW5nLWZvcm1hdAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uLy4uLy4uL2J1aWxkL3Nvb25nL3NjcmlwdHMvc3lzdGVtLWNsYW5nLWZvcm1hdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcAppbmRleCAxOWE4YjJmLi42MWEyYmY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCkBAIC0xNTAsNiArMTUwLDcgQEAKIAogYm9vbCBzSGFzQXV4Q2hhbm5lbHNbUFJFUFJPQ19OVU1fRUZGRUNUU10gPSB7CiAgICAgICAgIGZhbHNlLCAgLy8gUFJFUFJPQ19BR0MKKyAgICAgICAgZmFsc2UsICAvLyBQUkVQUk9DX0FHQzIKICAgICAgICAgdHJ1ZSwgICAvLyBQUkVQUk9DX0FFQwogICAgICAgICB0cnVlLCAgIC8vIFBSRVBST0NfTlMKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvY29ycmVsYXRpb24uY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL2NvcnJlbGF0aW9uLmNwcAppbmRleCBlYjU2ZmMzLi4wODUzNjczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvY29ycmVsYXRpb24uY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9jb3JyZWxhdGlvbi5jcHAKQEAgLTM2LDcgKzM2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBzaWdZLCBpbnQgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgZW5hYmxlQ3Jvc3NDb3JyKSB7CiAgICAgZmxvYXQgbWF4Q29yclZhbCA9IDAuZiwgcHJldkNvcnJWYWwgPSAwLmY7Ci0gICAgaW50IGRlbGF5ID0gMCwgcGVha0luZGV4ID0gMCwgZmxhZyA9IDA7CisgICAgaW50IHBlYWtJbmRleCA9IDAsIGZsYWcgPSAwOwogICAgIGludCBsb29wTGltID0gKDEgPT0gZW5hYmxlQ3Jvc3NDb3JyKSA/IGxlbiA6IGtNaW5Mb29wTGltaXRWYWx1ZTsKICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHBlYWtJbmRleFZlY3Qoa051bVBlYWtzLCAwKTsKICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcGVha1ZhbHVlVmVjdChrTnVtUGVha3MsIDAuZik7CkBAIC00Nyw3ICs0Nyw2IEBACiAgICAgICAgIH0KICAgICAgICAgY29yclZhbCAvPSBsZW4gLSBpOwogICAgICAgICBpZiAoY29yclZhbCA+IG1heENvcnJWYWwpIHsKLSAgICAgICAgICAgIGRlbGF5ID0gaTsKICAgICAgICAgICAgIG1heENvcnJWYWwgPSBjb3JyVmFsOwogICAgICAgICB9CiAgICAgICAgIC8vIENvcnJlbGF0aW9uIHBlYWtzIGFyZSBleHBlY3RlZCB0byBiZSBvYnNlcnZlZCBhdCBlcXVhbCBpbnRlcnZhbHMuIFRoZSBpbnRlcnZhbCBsZW5ndGggaXMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmE1NmJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzcgQEAKKy8vIFRlc3QgUmV2ZXJiIGxpYnJhcnkKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJlZmZlY3RzX3Rlc3RsaWJzX2xpY2Vuc2UiLAorICAgIF0sCit9CisKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfdGVzdGxpYnNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnJldmVyYnRlc3QiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJFZmZlY3RSZXZlcmIuYyIsCisgICAgICAgICJFZmZlY3RzTWF0aC5jIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tYWRkcmVzcy1vZi1wYWNrZWQtbWVtYmVyIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmVxdWFsaXplcnRlc3QiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJBdWRpb0JpcXVhZEZpbHRlci5jcHAiLAorICAgICAgICAiQXVkaW9Db2VmSW50ZXJwb2xhdG9yLmNwcCIsCisgICAgICAgICJBdWRpb0VxdWFsaXplci5jcHAiLAorICAgICAgICAiQXVkaW9QZWFraW5nRmlsdGVyLmNwcCIsCisgICAgICAgICJBdWRpb1NoZWx2aW5nRmlsdGVyLmNwcCIsCisgICAgICAgICJFZmZlY3RFcXVhbGl6ZXIuY3BwIiwKKyAgICAgICAgIkVmZmVjdHNNYXRoLmMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogInNvdW5kZngiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQW5kcm9pZC5ta18KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YzM3M2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIFRlc3QgUmV2ZXJiIGxpYnJhcnkKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotCUVmZmVjdFJldmVyYi5jLmFybSBcCi0JRWZmZWN0c01hdGguYy5hcm0KLQotTE9DQUxfQ0ZMQUdTIDo9IC1PMgotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotCWxpYmRsCi0KLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHNvdW5kZngKLUxPQ0FMX01PRFVMRSA6PSBsaWJyZXZlcmJ0ZXN0Ci0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0jIFRlc3QgRXF1YWxpemVyIGxpYnJhcnkKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotCUVmZmVjdHNNYXRoLmMuYXJtIFwKLQlFZmZlY3RFcXVhbGl6ZXIuY3BwIFwKLQlBdWRpb0JpcXVhZEZpbHRlci5jcHAuYXJtIFwKLQlBdWRpb0NvZWZJbnRlcnBvbGF0b3IuY3BwLmFybSBcCi0JQXVkaW9QZWFraW5nRmlsdGVyLmNwcC5hcm0gXAotCUF1ZGlvU2hlbHZpbmdGaWx0ZXIuY3BwLmFybSBcCi0JQXVkaW9FcXVhbGl6ZXIuY3BwLmFybQotCi1MT0NBTF9DRkxBR1MgOj0gLU8yCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0JbGliZGwKLQotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gc291bmRmeAotTE9DQUxfTU9EVUxFIDo9IGxpYmVxdWFsaXplcnRlc3QKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9FcXVhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0VxdWFsaXplci5jcHAKaW5kZXggNGYzYTMwOC4uMTQxNzUwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0VxdWFsaXplci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0VxdWFsaXplci5jcHAKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxuZXc+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaW5jbHVkZSAiQXVkaW9FcXVhbGl6ZXIuaCIKICNpbmNsdWRlICJBdWRpb1BlYWtpbmdGaWx0ZXIuaCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9QZWFraW5nRmlsdGVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9QZWFraW5nRmlsdGVyLmNwcAppbmRleCA5OTMyM2FjLi40MjU3ZWNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvUGVha2luZ0ZpbHRlci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1BlYWtpbmdGaWx0ZXIuY3BwCkBAIC04Nyw5ICs4Nyw5IEBACiB2b2lkIEF1ZGlvUGVha2luZ0ZpbHRlcjo6Y29tbWl0KGJvb2wgaW1tZWRpYXRlKSB7CiAgICAgYXVkaW9fY29lZl90IGNvZWZzWzVdOwogICAgIGludCBpbnRDb29yZFszXSA9IHsKLSAgICAgICAgbUZyZXF1ZW5jeSA+PiBGUkVRX1BSRUNJU0lPTl9CSVRTLAorICAgICAgICAoaW50KShtRnJlcXVlbmN5ID4+IEZSRVFfUFJFQ0lTSU9OX0JJVFMpLAogICAgICAgICBtR2FpbiA+PiBHQUlOX1BSRUNJU0lPTl9CSVRTLAotICAgICAgICBtQmFuZHdpZHRoID4+IEJBTkRXSURUSF9QUkVDSVNJT05fQklUUworICAgICAgICAoaW50KShtQmFuZHdpZHRoID4+IEJBTkRXSURUSF9QUkVDSVNJT05fQklUUykKICAgICB9OwogICAgIHVpbnQzMl90IGZyYWNDb29yZFszXSA9IHsKICAgICAgICAgbUZyZXF1ZW5jeSA8PCAoMzIgLSBGUkVRX1BSRUNJU0lPTl9CSVRTKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9TaGVsdmluZ0ZpbHRlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvU2hlbHZpbmdGaWx0ZXIuY3BwCmluZGV4IGUwMzEyODcuLmFkNDNjNWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9TaGVsdmluZ0ZpbHRlci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1NoZWx2aW5nRmlsdGVyLmNwcApAQCAtODksOCArODksOCBAQAogdm9pZCBBdWRpb1NoZWx2aW5nRmlsdGVyOjpjb21taXQoYm9vbCBpbW1lZGlhdGUpIHsKICAgICBhdWRpb19jb2VmX3QgY29lZnNbNV07CiAgICAgaW50IGludENvb3JkWzJdID0gewotICAgICAgICBtRnJlcXVlbmN5ID4+IEZSRVFfUFJFQ0lTSU9OX0JJVFMsCi0gICAgICAgIG1HYWluID4+IEdBSU5fUFJFQ0lTSU9OX0JJVFMKKyAgICAgICAgKGludCkobUZyZXF1ZW5jeSA+PiBGUkVRX1BSRUNJU0lPTl9CSVRTKSwKKyAgICAgICAgKGludCkobUdhaW4gPj4gR0FJTl9QUkVDSVNJT05fQklUUykKICAgICB9OwogICAgIHVpbnQzMl90IGZyYWNDb29yZFsyXSA9IHsKICAgICAgICAgbUZyZXF1ZW5jeSA8PCAoMzIgLSBGUkVRX1BSRUNJU0lPTl9CSVRTKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcAppbmRleCBkYjRkMDA5Li43MmI1MzBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RFcXVhbGl6ZXIuY3BwCkBAIC0xMzEsNyArMTMxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlvSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICpwSGFuZGxlKSB7CiAgICAgaW50IHJldDsKLSAgICBpbnQgaTsKKyAgICAodm9pZClzZXNzaW9uSWQ7CisgICAgKHZvaWQpaW9JZDsKIAogICAgIEFMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3Qgc3RhcnQiKTsKIApAQCAtMTYwLDcgKzE2MSw3IEBACiAgICAgcENvbnRleHQtPnN0YXRlID0gRVFVQUxJWkVSX1NUQVRFX0lOSVRJQUxJWkVEOwogCiAgICAgQUxPR1YoIkVmZmVjdExpYkNyZWF0ZUVmZmVjdCAlcCwgc2l6ZSAlZCIsCi0gICAgICAgICBwQ29udGV4dCwgQXVkaW9FcXVhbGl6ZXI6OkdldEluc3RhbmNlU2l6ZShrTnVtQmFuZHMpK3NpemVvZihFcXVhbGl6ZXJDb250ZXh0KSk7CisgICAgICAgICBwQ29udGV4dCwgKGludCkoQXVkaW9FcXVhbGl6ZXI6OkdldEluc3RhbmNlU2l6ZShrTnVtQmFuZHMpK3NpemVvZihFcXVhbGl6ZXJDb250ZXh0KSkpOwogCiAgICAgcmV0dXJuIDA7CiAKQEAgLTI5NCw3ICsyOTUsNiBAQAogCiBpbnQgRXF1YWxpemVyX2luaXQoRXF1YWxpemVyQ29udGV4dCAqcENvbnRleHQpCiB7Ci0gICAgaW50IHN0YXR1czsKIAogICAgIEFMT0dWKCJFcXVhbGl6ZXJfaW5pdCBzdGFydCIpOwogCkBAIC02MzAsNyArNjMwLDYgQEAKICAgICAgICAgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKIAogICAgIGFuZHJvaWQ6OkVxdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChhbmRyb2lkOjpFcXVhbGl6ZXJDb250ZXh0ICopIHNlbGY7Ci0gICAgaW50IHJldHNpemU7CiAKICAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwQ29udGV4dC0+c3RhdGUgPT0gRVFVQUxJWkVSX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC03NTAsMTMgKzc0OSwxMyBAQAogICAgICAgICBOVUxMCiB9OwogCi0KK19fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0gPSB7Ci0gICAgdGFnIDogQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAotICAgIHZlcnNpb24gOiBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKLSAgICBuYW1lIDogIlRlc3QgRXF1YWxpemVyIExpYnJhcnkiLAotICAgIGltcGxlbWVudG9yIDogIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAotICAgIGNyZWF0ZV9lZmZlY3QgOiBhbmRyb2lkOjpFZmZlY3RDcmVhdGUsCi0gICAgcmVsZWFzZV9lZmZlY3QgOiBhbmRyb2lkOjpFZmZlY3RSZWxlYXNlLAotICAgIGdldF9kZXNjcmlwdG9yIDogYW5kcm9pZDo6RWZmZWN0R2V0RGVzY3JpcHRvciwKKyAgICAudGFnID0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAorICAgIC52ZXJzaW9uID0gRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCisgICAgLm5hbWUgPSAiVGVzdCBFcXVhbGl6ZXIgTGlicmFyeSIsCisgICAgLmltcGxlbWVudG9yID0gIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAorICAgIC5jcmVhdGVfZWZmZWN0ID0gYW5kcm9pZDo6RWZmZWN0Q3JlYXRlLAorICAgIC5yZWxlYXNlX2VmZmVjdCA9IGFuZHJvaWQ6OkVmZmVjdFJlbGVhc2UsCisgICAgLmdldF9kZXNjcmlwdG9yID0gYW5kcm9pZDo6RWZmZWN0R2V0RGVzY3JpcHRvciwKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5jIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuYwppbmRleCBmY2U5YmVkLi5lZmJhNGY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMKQEAgLTEwNyw2ICsxMDcsOCBAQAogICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2M7CiAgICAgaW50IGF1eCA9IDA7CiAgICAgaW50IHByZXNldCA9IDA7CisgICAgKHZvaWQpc2Vzc2lvbklkOworICAgICh2b2lkKWlvSWQ7CiAKICAgICBBTE9HVigiRWZmZWN0TGliQ3JlYXRlRWZmZWN0IHN0YXJ0Iik7CiAKQEAgLTE0OSw3ICsxNTEsNyBAQAogCiAgICAgbW9kdWxlLT5jb250ZXh0Lm1TdGF0ZSA9IFJFVkVSQl9TVEFURV9JTklUSUFMSVpFRDsKIAotICAgIEFMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3QgJXAgLHNpemUgJWQiLCBtb2R1bGUsIHNpemVvZihyZXZlcmJfbW9kdWxlX3QpKTsKKyAgICBBTE9HVigiRWZmZWN0TGliQ3JlYXRlRWZmZWN0ICVwICxzaXplICV6dSIsIG1vZHVsZSwgc2l6ZW9mKHJldmVyYl9tb2R1bGVfdCkpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0yODMsNyArMjg1LDYgQEAKICAgICAgICAgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKICAgICByZXZlcmJfbW9kdWxlX3QgKnBSdmJNb2R1bGUgPSAocmV2ZXJiX21vZHVsZV90ICopIHNlbGY7CiAgICAgcmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiOwotICAgIGludCByZXRzaXplOwogCiAgICAgaWYgKHBSdmJNb2R1bGUgPT0gTlVMTCB8fAogICAgICAgICAgICAgcFJ2Yk1vZHVsZS0+Y29udGV4dC5tU3RhdGUgPT0gUkVWRVJCX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKQEAgLTc1OCw3ICs3NTksNiBAQAogICAgIGludDMyX3QgKnBWYWx1ZTMyOwogICAgIGludDE2X3QgKnBWYWx1ZTE2OwogICAgIHRfcmV2ZXJiX3NldHRpbmdzICpwUHJvcGVydGllczsKLSAgICBpbnQzMl90IGk7CiAgICAgaW50MzJfdCB0ZW1wOwogICAgIGludDMyX3QgdGVtcDI7CiAgICAgdWludDMyX3Qgc2l6ZTsKQEAgLTE2NTQsNyArMTY1NCw2IEBACiAgICAgaW50MzJfdCBuQXBPdXQ7CiAKICAgICBpbnQzMl90IGo7Ci0gICAgaW50MzJfdCBuRWFybHlPdXQ7CiAKICAgICBpbnQzMl90IHRlbXBWYWx1ZTsKIApAQCAtMjIwMyw2ICsyMjAyLDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAorX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQogYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKICAgICAudGFnID0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAogICAgIC52ZXJzaW9uID0gRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuaAppbmRleCA3NTZjNWVhLi44ZjQwNWQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmgKQEAgLTQ0Myw3ICs0NDMsNCBAQAogKi8KIHN0YXRpYyBpbnQgUmV2ZXJiVXBkYXRlUm9vbShyZXZlcmJfb2JqZWN0X3QqIHBSZXZlcmJEYXRhLCBib29sIGZ1bGxVcGRhdGUpOwogCi0KLXN0YXRpYyBpbnQgUmV2ZXJiQ29tcHV0ZUNvbnN0YW50cyhyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmJEYXRhLCB1aW50MzJfdCBzYW1wbGluZ1JhdGUpOwotCiAjZW5kaWYgLypBTkRST0lEX0VGRkVDVFJFVkVSQl9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlcnJvci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZXJyb3IvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTRkMzU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZXJyb3IvQW5kcm9pZC5icApAQCAtMCwwICsxLDY3IEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmV4cGVjdGVkdXRpbHNfaGVhZGVycyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnV0aWxzX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnV0aWxzX2hlYWRlcnMiLAorICAgIF0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCit9CisKK2NjX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogImxpYmV4cGVjdGVkdXRpbHNfdGVzdCIsCisgICAgc3JjczogWworICAgICAgICAiZXhwZWN0ZWRfdXRpbHNfdGVzdC5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliZXhwZWN0ZWR1dGlsc19oZWFkZXJzIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJlcnJvcl9oZWFkZXJzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJleHBlY3RlZHV0aWxzX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliZXhwZWN0ZWR1dGlsc19oZWFkZXJzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZXJyb3IvZXhwZWN0ZWRfdXRpbHNfdGVzdC5jcHAgYi9tZWRpYS9saWJlcnJvci9leHBlY3RlZF91dGlsc190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTIyMTBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZXJyb3IvZXhwZWN0ZWRfdXRpbHNfdGVzdC5jcHAKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZXJyb3IvZXhwZWN0ZWRfdXRpbHMuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIExPR19UQUcgIlJlc3VsdC10ZXN0IgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZm9vIHsKKworY2xhc3MgVmFsdWUgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgVmFsdWUoaW50IGkpIDogbUludChpKSB7fQorICAgIFZhbHVlKGNvbnN0IFZhbHVlJikgPSBkZWxldGU7CisgICAgVmFsdWUoVmFsdWUmJikgPSBkZWZhdWx0OworCisgICAgb3BlcmF0b3IgaW50KCkgY29uc3QgeyByZXR1cm4gbUludDsgfQorCisgIHByaXZhdGU6CisgICAgY29uc3QgaW50IG1JbnQ7Cit9OworCitjbGFzcyBTdGF0dXMgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgU3RhdHVzKGludCBpKSA6IG1JbnQoaSkge30KKyAgICBTdGF0dXMoY29uc3QgU3RhdHVzJikgPSBkZWxldGU7CisgICAgU3RhdHVzKFN0YXR1cyYmKSA9IGRlZmF1bHQ7CisKKyAgICBvcGVyYXRvciBpbnQoKSBjb25zdCB7IHJldHVybiBtSW50OyB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBpbnQgbUludDsKK307CisKK2Jvb2wgZXJyb3JJc09rKGNvbnN0IFN0YXR1cyYgZSkgeworICAgIHJldHVybiBlID09IDA7Cit9CisKK3N0ZDo6c3RyaW5nIGVycm9yVG9TdHJpbmcoY29uc3QgU3RhdHVzJiBlKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0cjsKKyAgICBzdHIgPDwgZTsKKyAgICByZXR1cm4gc3RyLnN0cigpOworfQorCit1c2luZyBSZXN1bHQgPSBiYXNlOjpleHBlY3RlZDxWYWx1ZSwgU3RhdHVzPjsKKworfSAgLy8gbmFtZXNwYWNlIGZvbworCituYW1lc3BhY2UgeworCit1c2luZyBmb286OlJlc3VsdDsKK3VzaW5nIGZvbzo6U3RhdHVzOwordXNpbmcgZm9vOjpWYWx1ZTsKKworVEVTVChSZXN1bHQsIFZhbHVlT3JSZXR1cm5TdWNjZXNzKSB7CisgICAgUmVzdWx0IHJlc3VsdCA9IFtdKCkgLT4gUmVzdWx0IHsKKyAgICAgICAgVmFsdWUgaW50ZXJtZWRpYXRlID0gVkFMVUVfT1JfUkVUVVJOKFJlc3VsdChWYWx1ZSgzKSkpOworICAgICAgICByZXR1cm4gVmFsdWUoaW50ZXJtZWRpYXRlICsgMSk7CisgICAgfSgpOworICAgIEFTU0VSVF9UUlVFKHJlc3VsdC5vaygpKTsKKyAgICBFWFBFQ1RfRVEoNCwgcmVzdWx0LnZhbHVlKCkpOworfQorCitURVNUKFJlc3VsdCwgVmFsdWVPclJldHVybkZhaWx1cmUpIHsKKyAgICBSZXN1bHQgcmVzdWx0ID0gW10oKSAtPiBSZXN1bHQgeworICAgICAgICBWYWx1ZSBpbnRlcm1lZGlhdGUgPSBWQUxVRV9PUl9SRVRVUk4oUmVzdWx0KGJhc2U6OnVuZXhwZWN0ZWQoU3RhdHVzKDIpKSkpOworICAgICAgICByZXR1cm4gVmFsdWUoaW50ZXJtZWRpYXRlICsgMSk7CisgICAgfSgpOworICAgIEFTU0VSVF9GQUxTRShyZXN1bHQub2soKSk7CisgICAgRVhQRUNUX0VRKDIsIHJlc3VsdC5lcnJvcigpKTsKK30KKworVEVTVChSZXN1bHQsIFZhbHVlT3JSZXR1cm5TdGF0dXNTdWNjZXNzKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IFtdKCkgLT4gU3RhdHVzIHsKKyAgICAgICAgVmFsdWUgaW50ZXJtZWRpYXRlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhSZXN1bHQoVmFsdWUoMykpKTsKKyAgICAgICAgKHZvaWQpIGludGVybWVkaWF0ZTsKKyAgICAgICAgcmV0dXJuIFN0YXR1cygwKTsKKyAgICB9KCk7CisgICAgRVhQRUNUX0VRKDAsIHN0YXR1cyk7Cit9CisKK1RFU1QoUmVzdWx0LCBWYWx1ZU9yUmV0dXJuU3RhdHVzRmFpbHVyZSkgeworICAgIFN0YXR1cyBzdGF0dXMgPSBbXSgpIC0+IFN0YXR1cyB7CisgICAgICAgIFZhbHVlIGludGVybWVkaWF0ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoUmVzdWx0KGJhc2U6OnVuZXhwZWN0ZWQoU3RhdHVzKDEpKSkpOworICAgICAgICAodm9pZCkgaW50ZXJtZWRpYXRlOworICAgICAgICByZXR1cm4gU3RhdHVzKDApOworICAgIH0oKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RhdHVzKTsKK30KKworVEVTVChSZXN1bHQsIFJldHVybklmRXJyb3JTdWNjZXNzKSB7CisgICAgUmVzdWx0IHJlc3VsdCA9IFtdKCkgLT4gUmVzdWx0IHsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKFN0YXR1cygwKSk7CisgICAgICAgIHJldHVybiBWYWx1ZSg1KTsKKyAgICB9KCk7CisgICAgQVNTRVJUX1RSVUUocmVzdWx0Lm9rKCkpOworICAgIEVYUEVDVF9FUSg1LCByZXN1bHQudmFsdWUoKSk7Cit9CisKK1RFU1QoUmVzdWx0LCBSZXR1cm5JZkVycm9yRmFpbHVyZSkgeworICAgIFJlc3VsdCByZXN1bHQgPSBbXSgpIC0+IFJlc3VsdCB7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihTdGF0dXMoNCkpOworICAgICAgICByZXR1cm4gVmFsdWUoNSk7CisgICAgfSgpOworICAgIEFTU0VSVF9GQUxTRShyZXN1bHQub2soKSk7CisgICAgRVhQRUNUX0VRKDQsIHJlc3VsdC5lcnJvcigpKTsKK30KKworVEVTVChSZXN1bHQsIFJldHVyblN0YXR1c0lmRXJyb3JTdWNjZXNzKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IFtdKCkgLT4gU3RhdHVzIHsKKyAgICAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihTdGF0dXMoMCkpOworICAgICAgICByZXR1cm4gU3RhdHVzKDcpOworICAgIH0oKTsKKyAgICBFWFBFQ1RfRVEoNywgc3RhdHVzKTsKK30KKworVEVTVChSZXN1bHQsIFJldHVyblN0YXR1c0lmRXJyb3JGYWlsdXJlKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IFtdKCkgLT4gU3RhdHVzIHsKKyAgICAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihTdGF0dXMoMykpOworICAgICAgICByZXR1cm4gU3RhdHVzKDApOworICAgIH0oKTsKKyAgICBFWFBFQ1RfRVEoMywgc3RhdHVzKTsKK30KKworVEVTVChSZXN1bHQsIFZhbHVlT3JGYXRhbFN1Y2Nlc3MpIHsKKyAgICBWYWx1ZSB2YWx1ZSA9IFZBTFVFX09SX0ZBVEFMKFJlc3VsdChWYWx1ZSg3KSkpOworICAgIEVYUEVDVF9FUSg3LCB2YWx1ZSk7Cit9CisKK1RFU1QoUmVzdWx0LCBWYWx1ZU9yRmF0YWxGYWlsdXJlKSB7CisgICAgRVhQRUNUX0RFQVRIKFZBTFVFX09SX0ZBVEFMKFJlc3VsdChiYXNlOjp1bmV4cGVjdGVkKFN0YXR1cygzKSkpKSwgIiIpOworfQorCitURVNUKFJlc3VsdCwgRmF0YWxJZkVycm9yU3VjY2VzcykgeworICAgIEZBVEFMX0lGX0VSUk9SKFN0YXR1cygwKSk7Cit9CisKK1RFU1QoUmVzdWx0LCBGYXRhbElmRXJyb3JGYWlsdXJlKSB7CisgICAgRVhQRUNUX0RFQVRIKEZBVEFMX0lGX0VSUk9SKFN0YXR1cygzKSksICIiKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZXJyb3IvaW5jbHVkZS9lcnJvci9SZXN1bHQuaCBiL21lZGlhL2xpYmVycm9yL2luY2x1ZGUvZXJyb3IvUmVzdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwZTZkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVycm9yL2luY2x1ZGUvZXJyb3IvUmVzdWx0LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGVycm9yL2V4cGVjdGVkX3V0aWxzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlcnJvciB7CisKKy8qKgorICogQSBjb252ZW5pZW5jZSBzaG9ydC1oYW5kIGZvciBiYXNlOjpleHBlY3RlZCwgd2hlcmUgdGhlIGVycm9yIHR5cGUgaXMgYSBzdGF0dXNfdC4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit1c2luZyBSZXN1bHQgPSBiYXNlOjpleHBlY3RlZDxULCBzdGF0dXNfdD47CisKK30gIC8vIG5hbWVzcGFjZSBlcnJvcgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLy8gQmVsb3cgYXJlIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgZXJyb3JJc09rIGFuZCBlcnJvclRvU3RyaW5nIGZvciBzdGF0dXNfdCAuCisvLyBUaGlzIGFsbG93cyBzdGF0dXNfdCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGV4cGVjdGVkX3V0aWxzLmggbWFjcm9zLgorLy8gVW5mb3J0dWFudGVseSwgc2luY2Ugc3RhdHVzX3QgaXMgbWVyZWx5IGEgdHlwZWRlZiBmb3IgaW50IHJhdGhlciB0aGFuIGEgdW5pcXVlIHR5cGUsIHdlIGhhdmUgdG8KKy8vIG92ZXJsb2FkIHRoZXNlIG1ldGhvZHMgZm9yIGFueSBpbnQsIGFuZCBkbyBzbyBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBmb3IgQURMIHRvIHdvcmsuCisKK2lubGluZSBib29sIGVycm9ySXNPayhpbnQgc3RhdHVzKSB7CisgICAgcmV0dXJuIHN0YXR1cyA9PSBhbmRyb2lkOjpPSzsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIGVycm9yVG9TdHJpbmcoaW50IHN0YXR1cykgeworICAgIHJldHVybiBhbmRyb2lkOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZXJyb3IvaW5jbHVkZS9lcnJvci9leHBlY3RlZF91dGlscy5oIGIvbWVkaWEvbGliZXJyb3IvaW5jbHVkZS9lcnJvci9leHBlY3RlZF91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYzg1MTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlcnJvci9pbmNsdWRlL2Vycm9yL2V4cGVjdGVkX3V0aWxzLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZXhwZWN0ZWQuaD4KKyNpbmNsdWRlIDxsb2cvbG9nX21haW4uaD4KKworLyoqCisgKiBVc2VmdWwgbWFjcm9zIGZvciB3b3JraW5nIHdpdGggc3RhdHVzIGNvZGVzIGFuZCBiYXNlOjpleHBlY3RlZC4KKyAqCisgKiBUaGVzZSBtYWNyb3MgZmFjaWxpdGF0ZSB2YXJpb3VzIGtpbmRzIG9mIHN0cmF0ZWdpZXMgZm9yIHJlZHVjdGlvbiBvZiBlcnJvci1oYW5kbGluZy1yZWxhdGVkCisgKiBib2lsZXJwbGF0ZS4gVGhleSBjYW4gYmUgY2FuIGJlIGNsYXNzaWZpZWQgYnkgdGhlIGZvbGxvd2luZyBjcml0ZXJpYToKKyAqIC0gV2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBzdGFuZGFsb25lIHN0YXR1cyBjb2RlIHZzLiBiYXNlOjpleHBlY3RlZCAoc3RhdHVzIG9yIHZhbHVlKS4gSW4gdGhlCisgKiAgIGxhdHRlciBjYXNlLCB0aGUgbWFjcm8gd2lsbCBldmFsdWF0ZSB0byB0aGUgY29udGFpbmVkIHZhbHVlIGluIHRoZSBjYXNlIG9mIHN1Y2Nlc3MuCisgKiAtIFdoZXRoZXIgdG8gRkFUQUwgb3IgcmV0dXJuIGluIHJlc3BvbnNlIHRvIGFuIGVycm9yLgorICogICAtIEluIHRoZSBsYXR0ZXIgY2FzZSwgd2hldGhlciB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uIHJldHVybnMgYSBzdGF0dXMgY29kZSBvciBhIGJhc2U6OmV4cGVjdGVkLgorICoKKyAqIFRoZSB0YWJsZSBiZWxvdyBzdW1tYXJpemVzIHdoaWNoIG1hY3JvIHNlcnZlcyB3aGljaCBjYXNlLCBiYXNlZCBvbiB0aG9zZSBjcml0ZXJpYToKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgRXJyb3IgcmVzcG9uc2UgfCBGQVRBTCAgICAgICAgICAgIHwgRWFybHkgcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgRXhwcmVzc2lvbiB0eXBlICAgIHwgICAgICAgICAgICAgICAgICB8IEZ1bmN0aW9uIHJldHVybnMgZXhwZWN0ZWQgfCBGdW5jdGlvbiByZXR1cm5zIHN0YXR1cyAgfAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8IHN0YXR1cyBjb2RlICAgICAgICB8IEZBVEFMX0lGX0VSUk9SKCkgfCBSRVRVUk5fSUZfRVJST1IoKSAgICAgICAgIHwgUkVUVVJOX1NUQVRVU19JRl9FUlJPUigpIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCBleHBlY3RlZCAgICAgICAgICAgfCBWQUxVRV9PUl9GQVRBTCgpIHwgVkFMVUVfT1JfUkVUVVJOKCkgICAgICAgICB8IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoKSB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBBbGwgbWFjcm9zIGV4cGVjdCB0aGF0OgorICogLSBUaGUgZXJyb3IgdHlwZSBhbmQgdmFsdWUgdmFsdWUgdHlwZSBhcmUgbW92YWJsZS4KKyAqIC0gVGhlIG1hY3JvIGFyZ3VtZW50IGNhbiBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIHVzaW5nIGBhdXRvIHggPSAoZXhwKWAuCisgKiAtIFRoZSBleHByZXNzaW9uIGVycm9ySXNPayhlKSBmb3IgdGhlIGVycm9yIHR5cGUgZXZhbHVhdGVhIHRvIGEgYm9vbCB3aGljaCBpcyB0cnVlIGlmZiB0aGUKKyAqICAgc3RhdHVzIGlzIGNvbnNpZGVyZWQgc3VjY2Vzcy4KKyAqIC0gVGhlIGV4cHJlc3Npb24gZXJyb3JUb1N0cmluZyhlKSBmb3IgYSBnaXZlbiBlcnJvciB0eXBlIGV2YWx1YXRlZCB0byBhIHN0ZDo6c3RyaW5nIGNvbnRhaW5pbmcgYQorICogICBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBzdGF0dXMuCisgKi8KKworI2RlZmluZSBWQUxVRV9PUl9SRVRVUk4oZXhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF1dG8gX3RtcCA9IChleHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIV90bXAub2soKSkgcmV0dXJuIDo6YW5kcm9pZDo6YmFzZTo6dW5leHBlY3RlZChzdGQ6Om1vdmUoX3RtcC5lcnJvcigpKSk7IFwKKyAgICAgICAgc3RkOjptb3ZlKF90bXAudmFsdWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSkKKworI2RlZmluZSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGV4cCkgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXV0byBfdG1wID0gKGV4cCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIV90bXAub2soKSkgcmV0dXJuIHN0ZDo6bW92ZShfdG1wLmVycm9yKCkpOyBcCisgICAgICAgIHN0ZDo6bW92ZShfdG1wLnZhbHVlKCkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9KQorCisjZGVmaW5lIFZBTFVFX09SX0ZBVEFMKGV4cCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdXRvIF90bXAgPSAoZXhwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIV90bXAub2soKSwgIkZ1bmN0aW9uOiAlcyBMaW5lOiAlZCBGYWlsZWQgcmVzdWx0ICglcykiLCBfX0ZVTkNUSU9OX18sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgZXJyb3JUb1N0cmluZyhfdG1wLmVycm9yKCkpLmNfc3RyKCkpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSkKKworI2RlZmluZSBSRVRVUk5fSUZfRVJST1IoZXhwKSBcCisgICAgaWYgKGF1dG8gX3RtcCA9IChleHApOyAhZXJyb3JJc09rKF90bXApKSByZXR1cm4gOjphbmRyb2lkOjpiYXNlOjp1bmV4cGVjdGVkKHN0ZDo6bW92ZShfdG1wKSk7CisKKyNkZWZpbmUgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihleHApIFwKKyAgICBpZiAoYXV0byBfdG1wID0gKGV4cCk7ICFlcnJvcklzT2soX3RtcCkpIHJldHVybiBfdG1wOworCisjZGVmaW5lIEZBVEFMX0lGX0VSUk9SKGV4cCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXV0byBfdG1wID0gKGV4cCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWVycm9ySXNPayhfdG1wKSwgIkZ1bmN0aW9uOiAlcyBMaW5lOiAlZCBGYWlsZWQgcmVzdWx0OiAoJXMpIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGVycm9yVG9TdHJpbmcoX3RtcCkuY19zdHIoKSk7ICAgICAgICAgXAorICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2M2Y5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsODMgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmhlYWR0cmFja2luZyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgc3JjczogWworICAgICAgIkhlYWRUcmFja2luZ1Byb2Nlc3Nvci5jcHAiLAorICAgICAgIk1vZGVTZWxlY3Rvci5jcHAiLAorICAgICAgIlBvc2UuY3BwIiwKKyAgICAgICJQb3NlQmlhcy5jcHAiLAorICAgICAgIlBvc2VEcmlmdENvbXBlbnNhdG9yLmNwcCIsCisgICAgICAiUG9zZVJhdGVMaW1pdGVyLmNwcCIsCisgICAgICAiUXVhdGVybmlvblV0aWwuY3BwIiwKKyAgICAgICJTY3JlZW5IZWFkRnVzaW9uLmNwcCIsCisgICAgICAiU3RpbGxuZXNzRGV0ZWN0b3IuY3BwIiwKKyAgICAgICJUd2lzdC5jcHAiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliZWlnZW4iLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliZWlnZW4iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJoZWFkdHJhY2tpbmctYmluZGluZyIsCisgICAgc3JjczogWworICAgICAgIlNlbnNvclBvc2VQcm92aWRlci5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmhlYWR0cmFja2luZyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic2Vuc29yIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmhlYWR0cmFja2luZyIsCisgICAgICAgICJsaWJzZW5zb3IiLAorICAgIF0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogIlNlbnNvclBvc2VQcm92aWRlci1leGFtcGxlIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJTZW5zb3JQb3NlUHJvdmlkZXItZXhhbXBsZS5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmhlYWR0cmFja2luZyIsCisgICAgICAgICJsaWJoZWFkdHJhY2tpbmctYmluZGluZyIsCisgICAgICAgICJsaWJzZW5zb3IiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogImxpYmhlYWR0cmFja2luZy10ZXN0IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJIZWFkVHJhY2tpbmdQcm9jZXNzb3ItdGVzdC5jcHAiLAorICAgICAgICAiTW9kZVNlbGVjdG9yLXRlc3QuY3BwIiwKKyAgICAgICAgIlBvc2UtdGVzdC5jcHAiLAorICAgICAgICAiUG9zZUJpYXMtdGVzdC5jcHAiLAorICAgICAgICAiUG9zZURyaWZ0Q29tcGVuc2F0b3ItdGVzdC5jcHAiLAorICAgICAgICAiUG9zZVJhdGVMaW1pdGVyLXRlc3QuY3BwIiwKKyAgICAgICAgIlF1YXRlcm5pb25VdGlsLXRlc3QuY3BwIiwKKyAgICAgICAgIlNjcmVlbkhlYWRGdXNpb24tdGVzdC5jcHAiLAorICAgICAgICAiU3RpbGxuZXNzRGV0ZWN0b3ItdGVzdC5jcHAiLAorICAgICAgICAiVHdpc3QtdGVzdC5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmhlYWR0cmFja2luZyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9IZWFkVHJhY2tpbmdQcm9jZXNzb3ItdGVzdC5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvSGVhZFRyYWNraW5nUHJvY2Vzc29yLXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTE5MmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvSGVhZFRyYWNraW5nUHJvY2Vzc29yLXRlc3QuY3BwCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIm1lZGlhL0hlYWRUcmFja2luZ1Byb2Nlc3Nvci5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIlF1YXRlcm5pb25VdGlsLmgiCisjaW5jbHVkZSAiVGVzdFV0aWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB7CisKK3VzaW5nIEVpZ2VuOjpRdWF0ZXJuaW9uZjsKK3VzaW5nIEVpZ2VuOjpWZWN0b3IzZjsKK3VzaW5nIE9wdGlvbnMgPSBIZWFkVHJhY2tpbmdQcm9jZXNzb3I6Ok9wdGlvbnM7CisKK1RFU1QoSGVhZFRyYWNraW5nUHJvY2Vzc29yLCBJbml0aWFsKSB7CisgICAgZm9yIChhdXRvIG1vZGUgOiB7SGVhZFRyYWNraW5nTW9kZTo6U1RBVElDLCBIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSwKKyAgICAgICAgICAgICAgICAgICAgICBIZWFkVHJhY2tpbmdNb2RlOjpTQ1JFRU5fUkVMQVRJVkV9KSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxIZWFkVHJhY2tpbmdQcm9jZXNzb3I+IHByb2Nlc3NvciA9CisgICAgICAgICAgICAgICAgY3JlYXRlSGVhZFRyYWNraW5nUHJvY2Vzc29yKE9wdGlvbnN7fSwgbW9kZSk7CisgICAgICAgIHByb2Nlc3Nvci0+Y2FsY3VsYXRlKDApOworICAgICAgICBFWFBFQ1RfRVEocHJvY2Vzc29yLT5nZXRBY3R1YWxNb2RlKCksIEhlYWRUcmFja2luZ01vZGU6OlNUQVRJQyk7CisgICAgICAgIEVYUEVDVF9FUShwcm9jZXNzb3ItPmdldEhlYWRUb1N0YWdlUG9zZSgpLCBQb3NlM2YoKSk7CisgICAgfQorfQorCitURVNUKEhlYWRUcmFja2luZ1Byb2Nlc3NvciwgQmFzaWNDb21wb3NpdGlvbikgeworICAgIGNvbnN0IFBvc2UzZiB3b3JsZFRvSGVhZHt7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCl9OworICAgIGNvbnN0IFBvc2UzZiB3b3JsZFRvU2NyZWVue3s0LCA1LCA2fSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKX07CisgICAgY29uc3QgUG9zZTNmIHNjcmVlblRvU3RhZ2V7ezcsIDgsIDl9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpfTsKKyAgICBjb25zdCBmbG9hdCBwaHlzaWNhbFRvTG9naWNhbCA9IE1fUElfMjsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxIZWFkVHJhY2tpbmdQcm9jZXNzb3I+IHByb2Nlc3NvciA9CisgICAgICAgICAgICBjcmVhdGVIZWFkVHJhY2tpbmdQcm9jZXNzb3IoT3B0aW9uc3t9LCBIZWFkVHJhY2tpbmdNb2RlOjpTQ1JFRU5fUkVMQVRJVkUpOworCisgICAgLy8gRXN0YWJsaXNoIGEgYmFzZWxpbmUgZm9yIHRoZSBkcmlmdCBjb21wZW5zYXRvcnMuCisgICAgcHJvY2Vzc29yLT5zZXRXb3JsZFRvSGVhZFBvc2UoMCwgUG9zZTNmKCksIFR3aXN0M2YoKSk7CisgICAgcHJvY2Vzc29yLT5zZXRXb3JsZFRvU2NyZWVuUG9zZSgwLCBQb3NlM2YoKSk7CisKKyAgICBwcm9jZXNzb3ItPnNldERpc3BsYXlPcmllbnRhdGlvbihwaHlzaWNhbFRvTG9naWNhbCk7CisgICAgcHJvY2Vzc29yLT5zZXRXb3JsZFRvSGVhZFBvc2UoMCwgd29ybGRUb0hlYWQsIFR3aXN0M2YoKSk7CisgICAgcHJvY2Vzc29yLT5zZXRXb3JsZFRvU2NyZWVuUG9zZSgwLCB3b3JsZFRvU2NyZWVuKTsKKyAgICBwcm9jZXNzb3ItPnNldFNjcmVlblRvU3RhZ2VQb3NlKHNjcmVlblRvU3RhZ2UpOworICAgIHByb2Nlc3Nvci0+Y2FsY3VsYXRlKDApOworICAgIEFTU0VSVF9FUShwcm9jZXNzb3ItPmdldEFjdHVhbE1vZGUoKSwgSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFKTsKKyAgICBFWFBFQ1RfRVEocHJvY2Vzc29yLT5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgd29ybGRUb0hlYWQuaW52ZXJzZSgpICogd29ybGRUb1NjcmVlbiAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zZTNmKHJvdGF0ZVkoLXBoeXNpY2FsVG9Mb2dpY2FsKSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlblRvU3RhZ2UpOworCisgICAgcHJvY2Vzc29yLT5zZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSk7CisgICAgcHJvY2Vzc29yLT5jYWxjdWxhdGUoMCk7CisgICAgQVNTRVJUX0VRKHByb2Nlc3Nvci0+Z2V0QWN0dWFsTW9kZSgpLCBIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSk7CisgICAgRVhQRUNUX0VRKHByb2Nlc3Nvci0+Z2V0SGVhZFRvU3RhZ2VQb3NlKCksIHdvcmxkVG9IZWFkLmludmVyc2UoKSAqIHNjcmVlblRvU3RhZ2UpOworCisgICAgcHJvY2Vzc29yLT5zZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUMpOworICAgIHByb2Nlc3Nvci0+Y2FsY3VsYXRlKDApOworICAgIEFTU0VSVF9FUShwcm9jZXNzb3ItPmdldEFjdHVhbE1vZGUoKSwgSGVhZFRyYWNraW5nTW9kZTo6U1RBVElDKTsKKyAgICBFWFBFQ1RfRVEocHJvY2Vzc29yLT5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgc2NyZWVuVG9TdGFnZSk7Cit9CisKK1RFU1QoSGVhZFRyYWNraW5nUHJvY2Vzc29yLCBQcmVkaWN0aW9uKSB7CisgICAgY29uc3QgUG9zZTNmIHdvcmxkVG9IZWFke3sxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKX07CisgICAgY29uc3QgVHdpc3QzZiBoZWFkVHdpc3R7ezQsIDUsIDZ9LCBxdWF0ZXJuaW9uVG9Sb3RhdGlvblZlY3RvcihRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKSAvIDEwfTsKKyAgICBjb25zdCBQb3NlM2Ygd29ybGRUb1NjcmVlbnt7NCwgNSwgNn0sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCl9OworCisgICAgc3RkOjp1bmlxdWVfcHRyPEhlYWRUcmFja2luZ1Byb2Nlc3Nvcj4gcHJvY2Vzc29yID0gY3JlYXRlSGVhZFRyYWNraW5nUHJvY2Vzc29yKAorICAgICAgICAgICAgT3B0aW9uc3sucHJlZGljdGlvbkR1cmF0aW9uID0gMi5mfSwgSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkUpOworCisgICAgLy8gRXN0YWJsaXNoIGEgYmFzZWxpbmUgZm9yIHRoZSBkcmlmdCBjb21wZW5zYXRvcnMuCisgICAgcHJvY2Vzc29yLT5zZXRXb3JsZFRvSGVhZFBvc2UoMCwgUG9zZTNmKCksIFR3aXN0M2YoKSk7CisgICAgcHJvY2Vzc29yLT5zZXRXb3JsZFRvU2NyZWVuUG9zZSgwLCBQb3NlM2YoKSk7CisKKyAgICBwcm9jZXNzb3ItPnNldFdvcmxkVG9IZWFkUG9zZSgwLCB3b3JsZFRvSGVhZCwgaGVhZFR3aXN0KTsKKyAgICBwcm9jZXNzb3ItPnNldFdvcmxkVG9TY3JlZW5Qb3NlKDAsIHdvcmxkVG9TY3JlZW4pOworICAgIHByb2Nlc3Nvci0+Y2FsY3VsYXRlKDApOworICAgIEFTU0VSVF9FUShwcm9jZXNzb3ItPmdldEFjdHVhbE1vZGUoKSwgSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkUpOworICAgIEVYUEVDVF9FUShwcm9jZXNzb3ItPmdldEhlYWRUb1N0YWdlUG9zZSgpLCAod29ybGRUb0hlYWQgKiBpbnRlZ3JhdGUoaGVhZFR3aXN0LCAyLmYpKS5pbnZlcnNlKCkpOworCisgICAgcHJvY2Vzc29yLT5zZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlOjpTQ1JFRU5fUkVMQVRJVkUpOworICAgIHByb2Nlc3Nvci0+Y2FsY3VsYXRlKDApOworICAgIEFTU0VSVF9FUShwcm9jZXNzb3ItPmdldEFjdHVhbE1vZGUoKSwgSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFKTsKKyAgICBFWFBFQ1RfRVEocHJvY2Vzc29yLT5nZXRIZWFkVG9TdGFnZVBvc2UoKSwKKyAgICAgICAgICAgICAgKHdvcmxkVG9IZWFkICogaW50ZWdyYXRlKGhlYWRUd2lzdCwgMi5mKSkuaW52ZXJzZSgpICogd29ybGRUb1NjcmVlbik7CisKKyAgICBwcm9jZXNzb3ItPnNldERlc2lyZWRNb2RlKEhlYWRUcmFja2luZ01vZGU6OlNUQVRJQyk7CisgICAgcHJvY2Vzc29yLT5jYWxjdWxhdGUoMCk7CisgICAgQVNTRVJUX0VRKHByb2Nlc3Nvci0+Z2V0QWN0dWFsTW9kZSgpLCBIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUMpOworICAgIEVYUEVDVF9FUShwcm9jZXNzb3ItPmdldEhlYWRUb1N0YWdlUG9zZSgpLCBQb3NlM2YoKSk7Cit9CisKK1RFU1QoSGVhZFRyYWNraW5nUHJvY2Vzc29yLCBTbW9vdGhNb2RlU3dpdGNoKSB7CisgICAgY29uc3QgUG9zZTNmIHRhcmdldEhlYWRUb1dvcmxkID0gUG9zZTNmKHs0LCAwLCAwfSwgcm90YXRlWihNX1BJIC8gMikpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPEhlYWRUcmFja2luZ1Byb2Nlc3Nvcj4gcHJvY2Vzc29yID0gY3JlYXRlSGVhZFRyYWNraW5nUHJvY2Vzc29yKAorICAgICAgICAgICAgT3B0aW9uc3subWF4VHJhbnNsYXRpb25hbFZlbG9jaXR5ID0gMX0sIEhlYWRUcmFja2luZ01vZGU6OlNUQVRJQyk7CisKKyAgICAvLyBFc3RhYmxpc2ggYSBiYXNlbGluZSBmb3IgdGhlIGRyaWZ0IGNvbXBlbnNhdG9ycy4KKyAgICBwcm9jZXNzb3ItPnNldFdvcmxkVG9IZWFkUG9zZSgwLCBQb3NlM2YoKSwgVHdpc3QzZigpKTsKKyAgICBwcm9jZXNzb3ItPnNldFdvcmxkVG9TY3JlZW5Qb3NlKDAsIFBvc2UzZigpKTsKKworICAgIHByb2Nlc3Nvci0+Y2FsY3VsYXRlKDApOworCisgICAgcHJvY2Vzc29yLT5zZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSk7CisgICAgcHJvY2Vzc29yLT5zZXRXb3JsZFRvSGVhZFBvc2UoMCwgdGFyZ2V0SGVhZFRvV29ybGQuaW52ZXJzZSgpLCBUd2lzdDNmKCkpOworCisgICAgLy8gV2UncmUgZXhwZWN0aW5nIGEgZ3JhZHVhbCBtb3ZlIHRvIHRoZSB0YXJnZXQuCisgICAgcHJvY2Vzc29yLT5jYWxjdWxhdGUoMCk7CisgICAgRVhQRUNUX0VRKEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFLCBwcm9jZXNzb3ItPmdldEFjdHVhbE1vZGUoKSk7CisgICAgRVhQRUNUX0VRKHByb2Nlc3Nvci0+Z2V0SGVhZFRvU3RhZ2VQb3NlKCksIFBvc2UzZigpKTsKKworICAgIHByb2Nlc3Nvci0+Y2FsY3VsYXRlKDIpOworICAgIEVYUEVDVF9FUShIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSwgcHJvY2Vzc29yLT5nZXRBY3R1YWxNb2RlKCkpOworICAgIEVYUEVDVF9FUShwcm9jZXNzb3ItPmdldEhlYWRUb1N0YWdlUG9zZSgpLCBQb3NlM2YoezIsIDAsIDB9LCByb3RhdGVaKE1fUEkgLyA0KSkpOworCisgICAgcHJvY2Vzc29yLT5jYWxjdWxhdGUoNCk7CisgICAgRVhQRUNUX0VRKEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFLCBwcm9jZXNzb3ItPmdldEFjdHVhbE1vZGUoKSk7CisgICAgRVhQRUNUX0VRKHByb2Nlc3Nvci0+Z2V0SGVhZFRvU3RhZ2VQb3NlKCksIHRhcmdldEhlYWRUb1dvcmxkKTsKKworICAgIC8vIE5vdyB0aGF0IHdlJ3ZlIHJlYWNoZWQgdGhlIHRhcmdldCwgd2Ugc2hvdWxkIG5vIGxvbmdlciBiZSByYXRlIGxpbWl0aW5nLgorICAgIHByb2Nlc3Nvci0+c2V0V29ybGRUb0hlYWRQb3NlKDQsIFBvc2UzZigpLCBUd2lzdDNmKCkpOworICAgIHByb2Nlc3Nvci0+Y2FsY3VsYXRlKDUpOworICAgIEVYUEVDVF9FUShIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSwgcHJvY2Vzc29yLT5nZXRBY3R1YWxNb2RlKCkpOworICAgIEVYUEVDVF9FUShwcm9jZXNzb3ItPmdldEhlYWRUb1N0YWdlUG9zZSgpLCBQb3NlM2YoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL0hlYWRUcmFja2luZ1Byb2Nlc3Nvci5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvSGVhZFRyYWNraW5nUHJvY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWZhZThhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL0hlYWRUcmFja2luZ1Byb2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpe30KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIm1lZGlhL0hlYWRUcmFja2luZ1Byb2Nlc3Nvci5oIgorCisjaW5jbHVkZSAiTW9kZVNlbGVjdG9yLmgiCisjaW5jbHVkZSAiUG9zZUJpYXMuaCIKKyNpbmNsdWRlICJRdWF0ZXJuaW9uVXRpbC5oIgorI2luY2x1ZGUgIlNjcmVlbkhlYWRGdXNpb24uaCIKKyNpbmNsdWRlICJTdGlsbG5lc3NEZXRlY3Rvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHsKKwordXNpbmcgRWlnZW46OlF1YXRlcm5pb25mOwordXNpbmcgRWlnZW46OlZlY3RvcjNmOworCitjbGFzcyBIZWFkVHJhY2tpbmdQcm9jZXNzb3JJbXBsIDogcHVibGljIEhlYWRUcmFja2luZ1Byb2Nlc3NvciB7CisgIHB1YmxpYzoKKyAgICBIZWFkVHJhY2tpbmdQcm9jZXNzb3JJbXBsKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIEhlYWRUcmFja2luZ01vZGUgaW5pdGlhbE1vZGUpCisgICAgICAgIDogbU9wdGlvbnMob3B0aW9ucyksCisgICAgICAgICAgbUhlYWRTdGlsbG5lc3NEZXRlY3RvcihTdGlsbG5lc3NEZXRlY3Rvcjo6T3B0aW9uc3sKKyAgICAgICAgICAgICAgICAgIC5kZWZhdWx0VmFsdWUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgIC53aW5kb3dEdXJhdGlvbiA9IG9wdGlvbnMuYXV0b1JlY2VudGVyV2luZG93RHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAudHJhbnNsYXRpb25hbFRocmVzaG9sZCA9IG9wdGlvbnMuYXV0b1JlY2VudGVyVHJhbnNsYXRpb25hbFRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgIC5yb3RhdGlvbmFsVGhyZXNob2xkID0gb3B0aW9ucy5hdXRvUmVjZW50ZXJSb3RhdGlvbmFsVGhyZXNob2xkLAorICAgICAgICAgIH0pLAorICAgICAgICAgIG1TY3JlZW5TdGlsbG5lc3NEZXRlY3RvcihTdGlsbG5lc3NEZXRlY3Rvcjo6T3B0aW9uc3sKKyAgICAgICAgICAgICAgICAgIC5kZWZhdWx0VmFsdWUgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgLndpbmRvd0R1cmF0aW9uID0gb3B0aW9ucy5zY3JlZW5TdGlsbG5lc3NXaW5kb3dEdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgIC50cmFuc2xhdGlvbmFsVGhyZXNob2xkID0gb3B0aW9ucy5zY3JlZW5TdGlsbG5lc3NUcmFuc2xhdGlvbmFsVGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgLnJvdGF0aW9uYWxUaHJlc2hvbGQgPSBvcHRpb25zLnNjcmVlblN0aWxsbmVzc1JvdGF0aW9uYWxUaHJlc2hvbGQsCisgICAgICAgICAgfSksCisgICAgICAgICAgbU1vZGVTZWxlY3RvcihNb2RlU2VsZWN0b3I6Ok9wdGlvbnN7LmZyZXNobmVzc1RpbWVvdXQgPSBvcHRpb25zLmZyZXNobmVzc1RpbWVvdXR9LAorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE1vZGUpLAorICAgICAgICAgIG1SYXRlTGltaXRlcihQb3NlUmF0ZUxpbWl0ZXI6Ok9wdGlvbnN7CisgICAgICAgICAgICAgICAgICAubWF4VHJhbnNsYXRpb25hbFZlbG9jaXR5ID0gb3B0aW9ucy5tYXhUcmFuc2xhdGlvbmFsVmVsb2NpdHksCisgICAgICAgICAgICAgICAgICAubWF4Um90YXRpb25hbFZlbG9jaXR5ID0gb3B0aW9ucy5tYXhSb3RhdGlvbmFsVmVsb2NpdHl9KSB7fQorCisgICAgdm9pZCBzZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlIG1vZGUpIG92ZXJyaWRlIHsgbU1vZGVTZWxlY3Rvci5zZXREZXNpcmVkTW9kZShtb2RlKTsgfQorCisgICAgdm9pZCBzZXRXb3JsZFRvSGVhZFBvc2UoaW50NjRfdCB0aW1lc3RhbXAsIGNvbnN0IFBvc2UzZiYgd29ybGRUb0hlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpc3QzZiYgaGVhZFR3aXN0KSBvdmVycmlkZSB7CisgICAgICAgIFBvc2UzZiBwcmVkaWN0ZWRXb3JsZFRvSGVhZCA9CisgICAgICAgICAgICAgICAgd29ybGRUb0hlYWQgKiBpbnRlZ3JhdGUoaGVhZFR3aXN0LCBtT3B0aW9ucy5wcmVkaWN0aW9uRHVyYXRpb24pOworICAgICAgICBtSGVhZFBvc2VCaWFzLnNldElucHV0KHByZWRpY3RlZFdvcmxkVG9IZWFkKTsKKyAgICAgICAgbUhlYWRTdGlsbG5lc3NEZXRlY3Rvci5zZXRJbnB1dCh0aW1lc3RhbXAsIHByZWRpY3RlZFdvcmxkVG9IZWFkKTsKKyAgICAgICAgbVdvcmxkVG9IZWFkVGltZXN0YW1wID0gdGltZXN0YW1wOworICAgIH0KKworICAgIHZvaWQgc2V0V29ybGRUb1NjcmVlblBvc2UoaW50NjRfdCB0aW1lc3RhbXAsIGNvbnN0IFBvc2UzZiYgd29ybGRUb1NjcmVlbikgb3ZlcnJpZGUgeworICAgICAgICBpZiAobVBoeXNpY2FsVG9Mb2dpY2FsQW5nbGUgIT0gbVBlbmRpbmdQaHlzaWNhbFRvTG9naWNhbEFuZ2xlKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBpbnRyb2R1Y2luZyBhbiBhcnRpZmljaWFsIGRpc2NvbnRpbnVpdHkuIEVuYWJsZSB0aGUgcmF0ZSBsaW1pdGVyLgorICAgICAgICAgICAgbVJhdGVMaW1pdGVyLmVuYWJsZSgpOworICAgICAgICAgICAgbVBoeXNpY2FsVG9Mb2dpY2FsQW5nbGUgPSBtUGVuZGluZ1BoeXNpY2FsVG9Mb2dpY2FsQW5nbGU7CisgICAgICAgIH0KKworICAgICAgICBQb3NlM2Ygd29ybGRUb0xvZ2ljYWxTY3JlZW4gPSB3b3JsZFRvU2NyZWVuICogUG9zZTNmKHJvdGF0ZVkoLW1QaHlzaWNhbFRvTG9naWNhbEFuZ2xlKSk7CisgICAgICAgIG1TY3JlZW5Qb3NlQmlhcy5zZXRJbnB1dCh3b3JsZFRvTG9naWNhbFNjcmVlbik7CisgICAgICAgIG1TY3JlZW5TdGlsbG5lc3NEZXRlY3Rvci5zZXRJbnB1dCh0aW1lc3RhbXAsIHdvcmxkVG9Mb2dpY2FsU2NyZWVuKTsKKyAgICAgICAgbVdvcmxkVG9TY3JlZW5UaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgfQorCisgICAgdm9pZCBzZXRTY3JlZW5Ub1N0YWdlUG9zZShjb25zdCBQb3NlM2YmIHNjcmVlblRvU3RhZ2UpIG92ZXJyaWRlIHsKKyAgICAgICAgbU1vZGVTZWxlY3Rvci5zZXRTY3JlZW5Ub1N0YWdlUG9zZShzY3JlZW5Ub1N0YWdlKTsKKyAgICB9CisKKyAgICB2b2lkIHNldERpc3BsYXlPcmllbnRhdGlvbihmbG9hdCBwaHlzaWNhbFRvTG9naWNhbEFuZ2xlKSBvdmVycmlkZSB7CisgICAgICAgIG1QZW5kaW5nUGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSA9IHBoeXNpY2FsVG9Mb2dpY2FsQW5nbGU7CisgICAgfQorCisgICAgdm9pZCBjYWxjdWxhdGUoaW50NjRfdCB0aW1lc3RhbXApIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gSGFuZGxlIHRoZSBzY3JlZW4gZmlyc3QsIHNpbmNlIGl0IG1pZ2h0IHRyaWdnZXIgYSByZWNlbnRlcmluZyBvZiB0aGUgaGVhZC4KKyAgICAgICAgaWYgKG1Xb3JsZFRvU2NyZWVuVGltZXN0YW1wLmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgICBjb25zdCBQb3NlM2Ygd29ybGRUb0xvZ2ljYWxTY3JlZW4gPSBtU2NyZWVuUG9zZUJpYXMuZ2V0T3V0cHV0KCk7CisgICAgICAgICAgICBib29sIHNjcmVlblN0YWJsZSA9IG1TY3JlZW5TdGlsbG5lc3NEZXRlY3Rvci5jYWxjdWxhdGUodGltZXN0YW1wKTsKKyAgICAgICAgICAgIG1Nb2RlU2VsZWN0b3Iuc2V0U2NyZWVuU3RhYmxlKG1Xb3JsZFRvU2NyZWVuVGltZXN0YW1wLnZhbHVlKCksIHNjcmVlblN0YWJsZSk7CisgICAgICAgICAgICAvLyBXaGVuZXZlciB0aGUgc2NyZWVuIGlzIHVuc3RhYmxlLCByZWNlbnRlciB0aGUgaGVhZCBwb3NlLgorICAgICAgICAgICAgaWYgKCFzY3JlZW5TdGFibGUpIHsKKyAgICAgICAgICAgICAgICByZWNlbnRlcih0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2NyZWVuSGVhZEZ1c2lvbi5zZXRXb3JsZFRvU2NyZWVuUG9zZShtV29ybGRUb1NjcmVlblRpbWVzdGFtcC52YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRUb0xvZ2ljYWxTY3JlZW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIGhlYWQuCisgICAgICAgIGlmIChtV29ybGRUb0hlYWRUaW1lc3RhbXAuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgICAgIFBvc2UzZiB3b3JsZFRvSGVhZCA9IG1IZWFkUG9zZUJpYXMuZ2V0T3V0cHV0KCk7CisgICAgICAgICAgICAvLyBBdXRvLXJlY2VudGVyLgorICAgICAgICAgICAgaWYgKG1IZWFkU3RpbGxuZXNzRGV0ZWN0b3IuY2FsY3VsYXRlKHRpbWVzdGFtcCkpIHsKKyAgICAgICAgICAgICAgICByZWNlbnRlcih0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgd29ybGRUb0hlYWQgPSBtSGVhZFBvc2VCaWFzLmdldE91dHB1dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU2NyZWVuSGVhZEZ1c2lvbi5zZXRXb3JsZFRvSGVhZFBvc2UobVdvcmxkVG9IZWFkVGltZXN0YW1wLnZhbHVlKCksIHdvcmxkVG9IZWFkKTsKKyAgICAgICAgICAgIG1Nb2RlU2VsZWN0b3Iuc2V0V29ybGRUb0hlYWRQb3NlKG1Xb3JsZFRvSGVhZFRpbWVzdGFtcC52YWx1ZSgpLCB3b3JsZFRvSGVhZCk7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIG1heWJlU2NyZWVuVG9IZWFkID0gbVNjcmVlbkhlYWRGdXNpb24uY2FsY3VsYXRlKCk7CisgICAgICAgIGlmIChtYXliZVNjcmVlblRvSGVhZC5oYXNfdmFsdWUoKSkgeworICAgICAgICAgICAgbU1vZGVTZWxlY3Rvci5zZXRTY3JlZW5Ub0hlYWRQb3NlKG1heWJlU2NyZWVuVG9IZWFkLT50aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmVTY3JlZW5Ub0hlYWQtPnBvc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1vZGVTZWxlY3Rvci5zZXRTY3JlZW5Ub0hlYWRQb3NlKHRpbWVzdGFtcCwgc3RkOjpudWxsb3B0KTsKKyAgICAgICAgfQorCisgICAgICAgIEhlYWRUcmFja2luZ01vZGUgcHJldk1vZGUgPSBtTW9kZVNlbGVjdG9yLmdldEFjdHVhbE1vZGUoKTsKKyAgICAgICAgbU1vZGVTZWxlY3Rvci5jYWxjdWxhdGUodGltZXN0YW1wKTsKKyAgICAgICAgaWYgKG1Nb2RlU2VsZWN0b3IuZ2V0QWN0dWFsTW9kZSgpICE9IHByZXZNb2RlKSB7CisgICAgICAgICAgICAvLyBNb2RlIGhhcyBjaGFuZ2VkLCBlbmFibGUgcmF0ZSBsaW1pdGluZy4KKyAgICAgICAgICAgIG1SYXRlTGltaXRlci5lbmFibGUoKTsKKyAgICAgICAgfQorICAgICAgICBtUmF0ZUxpbWl0ZXIuc2V0VGFyZ2V0KG1Nb2RlU2VsZWN0b3IuZ2V0SGVhZFRvU3RhZ2VQb3NlKCkpOworICAgICAgICBtSGVhZFRvU3RhZ2VQb3NlID0gbVJhdGVMaW1pdGVyLmNhbGN1bGF0ZVBvc2UodGltZXN0YW1wKTsKKyAgICB9CisKKyAgICBQb3NlM2YgZ2V0SGVhZFRvU3RhZ2VQb3NlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUhlYWRUb1N0YWdlUG9zZTsgfQorCisgICAgSGVhZFRyYWNraW5nTW9kZSBnZXRBY3R1YWxNb2RlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbU1vZGVTZWxlY3Rvci5nZXRBY3R1YWxNb2RlKCk7IH0KKworICAgIHZvaWQgcmVjZW50ZXIoYm9vbCByZWNlbnRlckhlYWQsIGJvb2wgcmVjZW50ZXJTY3JlZW4pIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKHJlY2VudGVySGVhZCkgeworICAgICAgICAgICAgbUhlYWRQb3NlQmlhcy5yZWNlbnRlcigpOworICAgICAgICAgICAgbUhlYWRTdGlsbG5lc3NEZXRlY3Rvci5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIGlmIChyZWNlbnRlclNjcmVlbikgeworICAgICAgICAgICAgbVNjcmVlblBvc2VCaWFzLnJlY2VudGVyKCk7CisgICAgICAgICAgICBtU2NyZWVuU3RpbGxuZXNzRGV0ZWN0b3IucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIGEgc2Vuc29yIGJlaW5nIHJlY2VudGVyZWQgaXMgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgbW9kZSwgYXBwbHkgcmF0ZSBsaW1pdGluZyB0bworICAgICAgICAvLyBhdm9pZCBkaXNjb250aW51aXRpZXMuCisgICAgICAgIEhlYWRUcmFja2luZ01vZGUgbW9kZSA9IG1Nb2RlU2VsZWN0b3IuZ2V0QWN0dWFsTW9kZSgpOworICAgICAgICBpZiAoKHJlY2VudGVySGVhZCAmJiAobW9kZSA9PSBIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PSBIZWFkVHJhY2tpbmdNb2RlOjpTQ1JFRU5fUkVMQVRJVkUpKSB8fAorICAgICAgICAgICAgKHJlY2VudGVyU2NyZWVuICYmIG1vZGUgPT0gSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFKSkgeworICAgICAgICAgICAgbVJhdGVMaW1pdGVyLmVuYWJsZSgpOworICAgICAgICB9CisgICAgfQorCisgIHByaXZhdGU6CisgICAgY29uc3QgT3B0aW9ucyBtT3B0aW9uczsKKyAgICBmbG9hdCBtUGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSA9IDA7CisgICAgLy8gV2Ugc3RvcmUgdGhlIHBoeXNpY2FsIHRvIGxvZ2ljYWwgYW5nbGUgYXMgInBlbmRpbmciIHVudGlsIHRoZSBuZXh0IHdvcmxkLXRvLXNjcmVlbiBzYW1wbGUgaXQKKyAgICAvLyBhcHBsaWVzIHRvIGFycml2ZXMuCisgICAgZmxvYXQgbVBlbmRpbmdQaHlzaWNhbFRvTG9naWNhbEFuZ2xlID0gMDsKKyAgICBzdGQ6Om9wdGlvbmFsPGludDY0X3Q+IG1Xb3JsZFRvSGVhZFRpbWVzdGFtcDsKKyAgICBzdGQ6Om9wdGlvbmFsPGludDY0X3Q+IG1Xb3JsZFRvU2NyZWVuVGltZXN0YW1wOworICAgIFBvc2UzZiBtSGVhZFRvU3RhZ2VQb3NlOworICAgIFBvc2VCaWFzIG1IZWFkUG9zZUJpYXM7CisgICAgUG9zZUJpYXMgbVNjcmVlblBvc2VCaWFzOworICAgIFN0aWxsbmVzc0RldGVjdG9yIG1IZWFkU3RpbGxuZXNzRGV0ZWN0b3I7CisgICAgU3RpbGxuZXNzRGV0ZWN0b3IgbVNjcmVlblN0aWxsbmVzc0RldGVjdG9yOworICAgIFNjcmVlbkhlYWRGdXNpb24gbVNjcmVlbkhlYWRGdXNpb247CisgICAgTW9kZVNlbGVjdG9yIG1Nb2RlU2VsZWN0b3I7CisgICAgUG9zZVJhdGVMaW1pdGVyIG1SYXRlTGltaXRlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitzdGQ6OnVuaXF1ZV9wdHI8SGVhZFRyYWNraW5nUHJvY2Vzc29yPiBjcmVhdGVIZWFkVHJhY2tpbmdQcm9jZXNzb3IoCisgICAgICAgIGNvbnN0IEhlYWRUcmFja2luZ1Byb2Nlc3Nvcjo6T3B0aW9ucyYgb3B0aW9ucywgSGVhZFRyYWNraW5nTW9kZSBpbml0aWFsTW9kZSkgeworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEhlYWRUcmFja2luZ1Byb2Nlc3NvckltcGw+KG9wdGlvbnMsIGluaXRpYWxNb2RlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL01vZGVTZWxlY3Rvci10ZXN0LmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Nb2RlU2VsZWN0b3ItdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzNmU2YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Nb2RlU2VsZWN0b3ItdGVzdC5jcHAKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTW9kZVNlbGVjdG9yLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiUXVhdGVybmlvblV0aWwuaCIKKyNpbmNsdWRlICJUZXN0VXRpbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHsKKwordXNpbmcgRWlnZW46OlF1YXRlcm5pb25mOwordXNpbmcgRWlnZW46OlZlY3RvcjNmOworCitURVNUKE1vZGVTZWxlY3RvciwgSW5pdGlhbCkgeworICAgIE1vZGVTZWxlY3Rvcjo6T3B0aW9ucyBvcHRpb25zOworICAgIE1vZGVTZWxlY3RvciBzZWxlY3RvcihvcHRpb25zKTsKKworICAgIHNlbGVjdG9yLmNhbGN1bGF0ZSgwKTsKKyAgICBFWFBFQ1RfRVEoSGVhZFRyYWNraW5nTW9kZTo6U1RBVElDLCBzZWxlY3Rvci5nZXRBY3R1YWxNb2RlKCkpOworICAgIEVYUEVDVF9FUShzZWxlY3Rvci5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgUG9zZTNmKCkpOworfQorCitURVNUKE1vZGVTZWxlY3RvciwgSW5pdGlhbFdvcmxkUmVsYXRpdmUpIHsKKyAgICBjb25zdCBQb3NlM2Ygd29ybGRUb0hlYWQoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKworICAgIE1vZGVTZWxlY3Rvcjo6T3B0aW9ucyBvcHRpb25zOworICAgIE1vZGVTZWxlY3RvciBzZWxlY3RvcihvcHRpb25zLCBIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRSk7CisKKyAgICBzZWxlY3Rvci5zZXRXb3JsZFRvSGVhZFBvc2UoMCwgd29ybGRUb0hlYWQpOworICAgIHNlbGVjdG9yLnNldFNjcmVlblN0YWJsZSgwLCB0cnVlKTsKKyAgICBzZWxlY3Rvci5jYWxjdWxhdGUoMCk7CisgICAgRVhQRUNUX0VRKEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFLCBzZWxlY3Rvci5nZXRBY3R1YWxNb2RlKCkpOworICAgIEVYUEVDVF9FUShzZWxlY3Rvci5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgd29ybGRUb0hlYWQuaW52ZXJzZSgpKTsKK30KKworVEVTVChNb2RlU2VsZWN0b3IsIEluaXRpYWxTY3JlZW5SZWxhdGl2ZSkgeworICAgIGNvbnN0IFBvc2UzZiBzY3JlZW5Ub0hlYWQoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKworICAgIE1vZGVTZWxlY3Rvcjo6T3B0aW9ucyBvcHRpb25zOworICAgIE1vZGVTZWxlY3RvciBzZWxlY3RvcihvcHRpb25zLCBIZWFkVHJhY2tpbmdNb2RlOjpTQ1JFRU5fUkVMQVRJVkUpOworCisgICAgc2VsZWN0b3Iuc2V0U2NyZWVuVG9IZWFkUG9zZSgwLCBzY3JlZW5Ub0hlYWQpOworICAgIHNlbGVjdG9yLmNhbGN1bGF0ZSgwKTsKKyAgICBFWFBFQ1RfRVEoSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFLCBzZWxlY3Rvci5nZXRBY3R1YWxNb2RlKCkpOworICAgIEVYUEVDVF9FUShzZWxlY3Rvci5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgc2NyZWVuVG9IZWFkLmludmVyc2UoKSk7Cit9CisKK1RFU1QoTW9kZVNlbGVjdG9yLCBXb3JsZFJlbGF0aXZlKSB7CisgICAgY29uc3QgUG9zZTNmIHdvcmxkVG9IZWFkKHsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgY29uc3QgUG9zZTNmIHNjcmVlblRvU3RhZ2UoezQsIDUsIDZ9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKworICAgIE1vZGVTZWxlY3Rvcjo6T3B0aW9ucyBvcHRpb25zOworICAgIE1vZGVTZWxlY3RvciBzZWxlY3RvcihvcHRpb25zKTsKKworICAgIHNlbGVjdG9yLnNldFNjcmVlblRvU3RhZ2VQb3NlKHNjcmVlblRvU3RhZ2UpOworICAgIHNlbGVjdG9yLnNldERlc2lyZWRNb2RlKEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFKTsKKyAgICBzZWxlY3Rvci5zZXRXb3JsZFRvSGVhZFBvc2UoMCwgd29ybGRUb0hlYWQpOworICAgIHNlbGVjdG9yLnNldFNjcmVlblN0YWJsZSgwLCB0cnVlKTsKKyAgICBzZWxlY3Rvci5jYWxjdWxhdGUoMCk7CisgICAgRVhQRUNUX0VRKEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFLCBzZWxlY3Rvci5nZXRBY3R1YWxNb2RlKCkpOworICAgIEVYUEVDVF9FUShzZWxlY3Rvci5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgd29ybGRUb0hlYWQuaW52ZXJzZSgpICogc2NyZWVuVG9TdGFnZSk7Cit9CisKK1RFU1QoTW9kZVNlbGVjdG9yLCBXb3JsZFJlbGF0aXZlVW5zdGFibGUpIHsKKyAgICBjb25zdCBQb3NlM2Ygd29ybGRUb0hlYWQoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBjb25zdCBQb3NlM2Ygc2NyZWVuVG9TdGFnZSh7NCwgNSwgNn0sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworCisgICAgTW9kZVNlbGVjdG9yOjpPcHRpb25zIG9wdGlvbnN7LmZyZXNobmVzc1RpbWVvdXQgPSAxMDB9OworICAgIE1vZGVTZWxlY3RvciBzZWxlY3RvcihvcHRpb25zKTsKKworICAgIHNlbGVjdG9yLnNldFNjcmVlblRvU3RhZ2VQb3NlKHNjcmVlblRvU3RhZ2UpOworICAgIHNlbGVjdG9yLnNldERlc2lyZWRNb2RlKEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFKTsKKyAgICBzZWxlY3Rvci5zZXRXb3JsZFRvSGVhZFBvc2UoMCwgd29ybGRUb0hlYWQpOworICAgIHNlbGVjdG9yLnNldFNjcmVlblN0YWJsZSgwLCBmYWxzZSk7CisgICAgc2VsZWN0b3IuY2FsY3VsYXRlKDEwKTsKKyAgICBFWFBFQ1RfRVEoSGVhZFRyYWNraW5nTW9kZTo6U1RBVElDLCBzZWxlY3Rvci5nZXRBY3R1YWxNb2RlKCkpOworICAgIEVYUEVDVF9FUShzZWxlY3Rvci5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgc2NyZWVuVG9TdGFnZSk7Cit9CisKK1RFU1QoTW9kZVNlbGVjdG9yLCBXb3JsZFJlbGF0aXZlU3RhYmxlU3RhbGUpIHsKKyAgICBjb25zdCBQb3NlM2Ygd29ybGRUb0hlYWQoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBjb25zdCBQb3NlM2Ygc2NyZWVuVG9TdGFnZSh7NCwgNSwgNn0sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworCisgICAgTW9kZVNlbGVjdG9yOjpPcHRpb25zIG9wdGlvbnN7LmZyZXNobmVzc1RpbWVvdXQgPSAxMDB9OworICAgIE1vZGVTZWxlY3RvciBzZWxlY3RvcihvcHRpb25zKTsKKworICAgIHNlbGVjdG9yLnNldFNjcmVlblRvU3RhZ2VQb3NlKHNjcmVlblRvU3RhZ2UpOworICAgIHNlbGVjdG9yLnNldERlc2lyZWRNb2RlKEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFKTsKKyAgICBzZWxlY3Rvci5zZXRXb3JsZFRvSGVhZFBvc2UoMTAwLCB3b3JsZFRvSGVhZCk7CisgICAgc2VsZWN0b3Iuc2V0U2NyZWVuU3RhYmxlKDAsIHRydWUpOworICAgIHNlbGVjdG9yLmNhbGN1bGF0ZSgxMDEpOworICAgIEVYUEVDVF9FUShIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUMsIHNlbGVjdG9yLmdldEFjdHVhbE1vZGUoKSk7CisgICAgRVhQRUNUX0VRKHNlbGVjdG9yLmdldEhlYWRUb1N0YWdlUG9zZSgpLCBzY3JlZW5Ub1N0YWdlKTsKK30KKworVEVTVChNb2RlU2VsZWN0b3IsIFdvcmxkUmVsYXRpdmVTdGFsZSkgeworICAgIGNvbnN0IFBvc2UzZiB3b3JsZFRvSGVhZCh7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIGNvbnN0IFBvc2UzZiBzY3JlZW5Ub1N0YWdlKHs0LCA1LCA2fSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisKKyAgICBNb2RlU2VsZWN0b3I6Ok9wdGlvbnMgb3B0aW9uc3suZnJlc2huZXNzVGltZW91dCA9IDEwMH07CisgICAgTW9kZVNlbGVjdG9yIHNlbGVjdG9yKG9wdGlvbnMpOworCisgICAgc2VsZWN0b3Iuc2V0U2NyZWVuVG9TdGFnZVBvc2Uoc2NyZWVuVG9TdGFnZSk7CisgICAgc2VsZWN0b3Iuc2V0RGVzaXJlZE1vZGUoSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkUpOworICAgIHNlbGVjdG9yLnNldFdvcmxkVG9IZWFkUG9zZSgwLCB3b3JsZFRvSGVhZCk7CisgICAgc2VsZWN0b3IuY2FsY3VsYXRlKDEwMSk7CisgICAgRVhQRUNUX0VRKEhlYWRUcmFja2luZ01vZGU6OlNUQVRJQywgc2VsZWN0b3IuZ2V0QWN0dWFsTW9kZSgpKTsKKyAgICBFWFBFQ1RfRVEoc2VsZWN0b3IuZ2V0SGVhZFRvU3RhZ2VQb3NlKCksIHNjcmVlblRvU3RhZ2UpOworfQorCitURVNUKE1vZGVTZWxlY3RvciwgU2NyZWVuUmVsYXRpdmUpIHsKKyAgICBjb25zdCBQb3NlM2Ygc2NyZWVuVG9IZWFkKHsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgY29uc3QgUG9zZTNmIHNjcmVlblRvU3RhZ2UoezQsIDUsIDZ9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKworICAgIE1vZGVTZWxlY3Rvcjo6T3B0aW9ucyBvcHRpb25zOworICAgIE1vZGVTZWxlY3RvciBzZWxlY3RvcihvcHRpb25zKTsKKworICAgIHNlbGVjdG9yLnNldFNjcmVlblRvU3RhZ2VQb3NlKHNjcmVlblRvU3RhZ2UpOworICAgIHNlbGVjdG9yLnNldERlc2lyZWRNb2RlKEhlYWRUcmFja2luZ01vZGU6OlNDUkVFTl9SRUxBVElWRSk7CisgICAgc2VsZWN0b3Iuc2V0U2NyZWVuVG9IZWFkUG9zZSgwLCBzY3JlZW5Ub0hlYWQpOworICAgIHNlbGVjdG9yLmNhbGN1bGF0ZSgwKTsKKyAgICBFWFBFQ1RfRVEoSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFLCBzZWxlY3Rvci5nZXRBY3R1YWxNb2RlKCkpOworICAgIEVYUEVDVF9FUShzZWxlY3Rvci5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgc2NyZWVuVG9IZWFkLmludmVyc2UoKSAqIHNjcmVlblRvU3RhZ2UpOworfQorCitURVNUKE1vZGVTZWxlY3RvciwgU2NyZWVuUmVsYXRpdmVTdGFsZVRvV29ybGRSZWxhdGl2ZSkgeworICAgIGNvbnN0IFBvc2UzZiBzY3JlZW5Ub0hlYWQoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBjb25zdCBQb3NlM2Ygc2NyZWVuVG9TdGFnZSh7NCwgNSwgNn0sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIGNvbnN0IFBvc2UzZiB3b3JsZFRvSGVhZCh7NywgOCwgOX0sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworCisgICAgTW9kZVNlbGVjdG9yOjpPcHRpb25zIG9wdGlvbnN7LmZyZXNobmVzc1RpbWVvdXQgPSAxMDB9OworICAgIE1vZGVTZWxlY3RvciBzZWxlY3RvcihvcHRpb25zKTsKKworICAgIHNlbGVjdG9yLnNldFNjcmVlblRvU3RhZ2VQb3NlKHNjcmVlblRvU3RhZ2UpOworICAgIHNlbGVjdG9yLnNldERlc2lyZWRNb2RlKEhlYWRUcmFja2luZ01vZGU6OlNDUkVFTl9SRUxBVElWRSk7CisgICAgc2VsZWN0b3Iuc2V0U2NyZWVuVG9IZWFkUG9zZSgwLCBzY3JlZW5Ub0hlYWQpOworICAgIHNlbGVjdG9yLnNldFdvcmxkVG9IZWFkUG9zZSg1MCwgd29ybGRUb0hlYWQpOworICAgIHNlbGVjdG9yLnNldFNjcmVlblN0YWJsZSg1MCwgdHJ1ZSk7CisgICAgc2VsZWN0b3IuY2FsY3VsYXRlKDEwMSk7CisgICAgRVhQRUNUX0VRKEhlYWRUcmFja2luZ01vZGU6OldPUkxEX1JFTEFUSVZFLCBzZWxlY3Rvci5nZXRBY3R1YWxNb2RlKCkpOworICAgIEVYUEVDVF9FUShzZWxlY3Rvci5nZXRIZWFkVG9TdGFnZVBvc2UoKSwgd29ybGRUb0hlYWQuaW52ZXJzZSgpICogc2NyZWVuVG9TdGFnZSk7Cit9CisKK1RFU1QoTW9kZVNlbGVjdG9yLCBTY3JlZW5SZWxhdGl2ZUludmFsaWRUb1dvcmxkUmVsYXRpdmUpIHsKKyAgICBjb25zdCBQb3NlM2Ygc2NyZWVuVG9TdGFnZSh7NCwgNSwgNn0sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIGNvbnN0IFBvc2UzZiB3b3JsZFRvSGVhZCh7NywgOCwgOX0sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworCisgICAgTW9kZVNlbGVjdG9yOjpPcHRpb25zIG9wdGlvbnM7CisgICAgTW9kZVNlbGVjdG9yIHNlbGVjdG9yKG9wdGlvbnMpOworCisgICAgc2VsZWN0b3Iuc2V0U2NyZWVuVG9TdGFnZVBvc2Uoc2NyZWVuVG9TdGFnZSk7CisKKyAgICBzZWxlY3Rvci5zZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlOjpTQ1JFRU5fUkVMQVRJVkUpOworICAgIHNlbGVjdG9yLnNldFNjcmVlblRvSGVhZFBvc2UoNTAsIHN0ZDo6bnVsbG9wdCk7CisgICAgc2VsZWN0b3Iuc2V0V29ybGRUb0hlYWRQb3NlKDUwLCB3b3JsZFRvSGVhZCk7CisgICAgc2VsZWN0b3Iuc2V0U2NyZWVuU3RhYmxlKDUwLCB0cnVlKTsKKyAgICBzZWxlY3Rvci5jYWxjdWxhdGUoMTAxKTsKKyAgICBFWFBFQ1RfRVEoSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkUsIHNlbGVjdG9yLmdldEFjdHVhbE1vZGUoKSk7CisgICAgRVhQRUNUX0VRKHNlbGVjdG9yLmdldEhlYWRUb1N0YWdlUG9zZSgpLCB3b3JsZFRvSGVhZC5pbnZlcnNlKCkgKiBzY3JlZW5Ub1N0YWdlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvTW9kZVNlbGVjdG9yLmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Nb2RlU2VsZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiM2EyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvTW9kZVNlbGVjdG9yLmNwcApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJNb2RlU2VsZWN0b3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworTW9kZVNlbGVjdG9yOjpNb2RlU2VsZWN0b3IoY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgSGVhZFRyYWNraW5nTW9kZSBpbml0aWFsTW9kZSkKKyAgICA6IG1PcHRpb25zKG9wdGlvbnMpLCBtRGVzaXJlZE1vZGUoaW5pdGlhbE1vZGUpLCBtQWN0dWFsTW9kZShpbml0aWFsTW9kZSkge30KKwordm9pZCBNb2RlU2VsZWN0b3I6OnNldERlc2lyZWRNb2RlKEhlYWRUcmFja2luZ01vZGUgbW9kZSkgeworICAgIG1EZXNpcmVkTW9kZSA9IG1vZGU7Cit9CisKK3ZvaWQgTW9kZVNlbGVjdG9yOjpzZXRTY3JlZW5Ub1N0YWdlUG9zZShjb25zdCBQb3NlM2YmIHNjcmVlblRvU3RhZ2UpIHsKKyAgICBtU2NyZWVuVG9TdGFnZSA9IHNjcmVlblRvU3RhZ2U7Cit9CisKK3ZvaWQgTW9kZVNlbGVjdG9yOjpzZXRTY3JlZW5Ub0hlYWRQb3NlKGludDY0X3QgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxQb3NlM2Y+JiBzY3JlZW5Ub0hlYWQpIHsKKyAgICBtU2NyZWVuVG9IZWFkID0gc2NyZWVuVG9IZWFkOworICAgIG1TY3JlZW5Ub0hlYWRUaW1lc3RhbXAgPSB0aW1lc3RhbXA7Cit9CisKK3ZvaWQgTW9kZVNlbGVjdG9yOjpzZXRXb3JsZFRvSGVhZFBvc2UoaW50NjRfdCB0aW1lc3RhbXAsIGNvbnN0IFBvc2UzZiYgd29ybGRUb0hlYWQpIHsKKyAgICBtV29ybGRUb0hlYWQgPSB3b3JsZFRvSGVhZDsKKyAgICBtV29ybGRUb0hlYWRUaW1lc3RhbXAgPSB0aW1lc3RhbXA7Cit9CisKK3ZvaWQgTW9kZVNlbGVjdG9yOjpzZXRTY3JlZW5TdGFibGUoaW50NjRfdCB0aW1lc3RhbXAsIGJvb2wgc3RhYmxlKSB7CisgICAgbVNjcmVlblN0YWJsZSA9IHN0YWJsZTsKKyAgICBtU2NyZWVuU3RhYmxlVGltZXN0YW1wID0gdGltZXN0YW1wOworfQorCit2b2lkIE1vZGVTZWxlY3Rvcjo6Y2FsY3VsYXRlQWN0dWFsTW9kZShpbnQ2NF90IHRpbWVzdGFtcCkgeworICAgIGJvb2wgaXNWYWxpZFNjcmVlblRvSGVhZCA9IG1TY3JlZW5Ub0hlYWQuaGFzX3ZhbHVlKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAgLSBtU2NyZWVuVG9IZWFkVGltZXN0YW1wIDwgbU9wdGlvbnMuZnJlc2huZXNzVGltZW91dDsKKyAgICBib29sIGlzVmFsaWRXb3JsZFRvSGVhZCA9IG1Xb3JsZFRvSGVhZC5oYXNfdmFsdWUoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wIC0gbVdvcmxkVG9IZWFkVGltZXN0YW1wIDwgbU9wdGlvbnMuZnJlc2huZXNzVGltZW91dDsKKyAgICBib29sIGlzVmFsaWRTY3JlZW5TdGFibGUgPSBtU2NyZWVuU3RhYmxlLmhhc192YWx1ZSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAgLSBtU2NyZWVuU3RhYmxlVGltZXN0YW1wIDwgbU9wdGlvbnMuZnJlc2huZXNzVGltZW91dDsKKworICAgIEhlYWRUcmFja2luZ01vZGUgbW9kZSA9IG1EZXNpcmVkTW9kZTsKKworICAgIC8vIE9wdGlvbmFsIGRvd25ncmFkZSBmcm9tIHNjcmVlbi1yZWxhdGl2ZSB0byB3b3JsZC1yZWxhdGl2ZS4KKyAgICBpZiAobW9kZSA9PSBIZWFkVHJhY2tpbmdNb2RlOjpTQ1JFRU5fUkVMQVRJVkUpIHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkU2NyZWVuVG9IZWFkKSB7CisgICAgICAgICAgICBtb2RlID0gSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBPcHRpb25hbCBkb3duZ3JhZGUgZnJvbSB3b3JsZC1yZWxhdGl2ZSB0byBzdGF0aWMuCisgICAgaWYgKG1vZGUgPT0gSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkUpIHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkV29ybGRUb0hlYWQgfHwgIWlzVmFsaWRTY3JlZW5TdGFibGUgfHwgIW1TY3JlZW5TdGFibGUudmFsdWUoKSkgeworICAgICAgICAgICAgbW9kZSA9IEhlYWRUcmFja2luZ01vZGU6OlNUQVRJQzsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1BY3R1YWxNb2RlID0gbW9kZTsKK30KKwordm9pZCBNb2RlU2VsZWN0b3I6OmNhbGN1bGF0ZShpbnQ2NF90IHRpbWVzdGFtcCkgeworICAgIGNhbGN1bGF0ZUFjdHVhbE1vZGUodGltZXN0YW1wKTsKKworICAgIHN3aXRjaCAobUFjdHVhbE1vZGUpIHsKKyAgICAgICAgY2FzZSBIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUM6CisgICAgICAgICAgICBtSGVhZFRvU3RhZ2UgPSBtU2NyZWVuVG9TdGFnZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkU6CisgICAgICAgICAgICBtSGVhZFRvU3RhZ2UgPSBtV29ybGRUb0hlYWQudmFsdWUoKS5pbnZlcnNlKCkgKiBtU2NyZWVuVG9TdGFnZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFOgorICAgICAgICAgICAgbUhlYWRUb1N0YWdlID0gbVNjcmVlblRvSGVhZC52YWx1ZSgpLmludmVyc2UoKSAqIG1TY3JlZW5Ub1N0YWdlOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitQb3NlM2YgTW9kZVNlbGVjdG9yOjpnZXRIZWFkVG9TdGFnZVBvc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1IZWFkVG9TdGFnZTsKK30KKworSGVhZFRyYWNraW5nTW9kZSBNb2RlU2VsZWN0b3I6OmdldEFjdHVhbE1vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1BY3R1YWxNb2RlOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvTW9kZVNlbGVjdG9yLmggYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvTW9kZVNlbGVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzNzA0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Nb2RlU2VsZWN0b3IuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG9wdGlvbmFsPgorCisjaW5jbHVkZSAibWVkaWEvSGVhZFRyYWNraW5nTW9kZS5oIgorI2luY2x1ZGUgIm1lZGlhL1Bvc2UuaCIKKworI2luY2x1ZGUgIlBvc2VSYXRlTGltaXRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCisvKioKKyAqIEhlYWQtdHJhY2tpbmcgbW9kZSBzZWxlY3Rvci4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBwcm9kdWN0aW9uIG9mIHRoZSBkZXRlcm1pbmluZyBwb3NlIGZvciBhdWRpbyB2aXJ0dWFsaXphdGlvbiwgYmFzZWQKKyAqIG9uIGEgbnVtYmVyIG9mIGF2YWlsYWJsZSBzb3VyY2VzIGFuZCBhIHNlbGVjdGFibGUgbW9kZS4KKyAqCisgKiBUeXBpY2FsIGZsb3cgaXM6CisgKiBNb2RlU2VsZWN0b3Igc2VsZWN0b3IoLi4uKTsKKyAqIHdoaWxlICguLi4pIHsKKyAqICAgICAvLyBTZXQgaW5wdXRzLgorICogICAgIHNlbGVjdG9yLnNldEZvbyguLi4pOworICogICAgIHNlbGVjdG9yLnNldEJhciguLi4pOworICoKKyAqICAgICAvLyBVcGRhdGUgb3V0cHV0cyBiYXNlZCBvbiBpbnB1dHMuCisgKiAgICAgc2VsZWN0b3IuY2FsY3VsYXRlKC4uLik7CisgKgorICogICAgIC8vIEdldCBvdXRwdXRzLgorICogICAgIFBvc2UzZiBwb3NlID0gc2VsZWN0b3IuZ2V0SGVhZFRvU3RhZ2VQb3NlKCk7CisgKiB9CisgKgorICogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkLXNhZmUsIGJ1dCB0aHJlYWQtY29tcGF0aWJsZS4KKyAqCisgKiBGb3IgZGV0YWlscyBvbiB0aGUgZnJhbWVzIG9mIHJlZmVyZW5jZSBpbnZvbHZlZCwgdGhlaXIgY29tcG9zaXRpb24gYW5kIHRoZSBkZWZpbml0aW9ucyB0byB0aGUKKyAqIGRpZmZlcmVudCBtb2RlcywgcmVmZXIgdG86CisgKiBnby9pbW1lcnNpdmUtYXVkaW8tZnJhbWVzCisgKgorICogVGhlIGFjdHVhbCBtb2RlIG1heSBkZXZpYXRlIGZyb20gdGhlIGRlc2lyZWQgbW9kZSBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgorICogLSBXaGVuIHdlIGNhbm5vdCBnZXQgYSB2YWxpZCBhbmQgZnJlc2ggZXN0aW1hdGUgb2YgdGhlIHNjcmVlbi10by1oZWFkIHBvc2UsIHdlIHdpbGwgZmFsbCBiYWNrCisgKiAgIGZyb20gc2NyZWVuLXJlbGF0aXZlIHRvIHdvcmxkLXJlbGF0aXZlLgorICogLSBXaGVuIHdlIGNhbm5vdCBnZXQgYSBmcmVzaCBlc3RpbWF0ZSBvZiB0aGUgd29ybGQtdG8taGVhZCBwb3NlLCB3ZSB3aWxsIGZhbGwgYmFjayBmcm9tCisgKiAgIHdvcmxkLXJlbGF0aXZlIHRvIHN0YXRpYy4KKyAqIC0gSW4gd29ybGQtcmVsYXRpdmUgbW9kZSwgaWYgdGhlIHNjcmVlbiBpcyB1bnN0YWJsZSwgd2Ugd2lsbCBmYWxsIGJhY2sgdG8gc3RhdGljLgorICoKKyAqIEFsbCB0aGUgdGltZXN0YW1wcyB1c2VkIGhlcmUgYXJlIG9mIGFyYml0cmFyeSB1bml0cyBhbmQgb3JpZ2luLiBUaGV5IGp1c3QgbmVlZCB0byBiZSBjb25zaXN0ZW50CisgKiBiZXR3ZWVuIGFsbCB0aGUgY2FsbHMgYW5kIHdpdGggdGhlIE9wdGlvbnMgcHJvdmlkZWQgZm9yIGRldGVybWluaW5nIGZyZXNobmVzcyBhbmQgcmF0ZSBsaW1pdGluZy4KKyAqLworY2xhc3MgTW9kZVNlbGVjdG9yIHsKKyAgcHVibGljOgorICAgIHN0cnVjdCBPcHRpb25zIHsKKyAgICAgICAgaW50NjRfdCBmcmVzaG5lc3NUaW1lb3V0ID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KCk7CisgICAgfTsKKworICAgIE1vZGVTZWxlY3Rvcihjb25zdCBPcHRpb25zJiBvcHRpb25zLCBIZWFkVHJhY2tpbmdNb2RlIGluaXRpYWxNb2RlID0gSGVhZFRyYWNraW5nTW9kZTo6U1RBVElDKTsKKworICAgIC8qKiBTZXRzIHRoZSBkZXNpcmVkIGhlYWQtdHJhY2tpbmcgbW9kZS4gKi8KKyAgICB2b2lkIHNldERlc2lyZWRNb2RlKEhlYWRUcmFja2luZ01vZGUgbW9kZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNjcmVlbi10by1zdGFnZSBwb3NlLCB1c2VkIGluIGFsbCBtb2Rlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldFNjcmVlblRvU3RhZ2VQb3NlKGNvbnN0IFBvc2UzZiYgc2NyZWVuVG9TdGFnZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNjcmVlbi10by1oZWFkIHBvc2UsIHVzZWQgaW4gc2NyZWVuLXJlbGF0aXZlIG1vZGUuCisgICAgICogVGhlIHRpbWVzdGFtcCBuZWVkcyB0byByZWZsZWN0IGhvdyBmcmVzaCB0aGUgc2FtcGxlIGlzIChub3QgbmVjZXNzYXJpbHkgd2hpY2ggcG9pbnQgaW4gdGltZQorICAgICAqIGl0IGFwcGxpZXMgdG8pLiBudWxsb3B0IGNhbiBiZSB1c2VkIGlmIGl0IGlzIGRldGVybWluZWQgdGhhdCB0aGUgbGlzdGVuZXIgaXMgbm90IGluIGZyb250IG9mCisgICAgICogdGhlIHNjcmVlbi4KKyAgICAgKi8KKyAgICB2b2lkIHNldFNjcmVlblRvSGVhZFBvc2UoaW50NjRfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8UG9zZTNmPiYgc2NyZWVuVG9IZWFkKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgd29ybGQtdG8taGVhZCBwb3NlLCB1c2VkIGluIHdvcmxkLXJlbGF0aXZlIG1vZGUuCisgICAgICogVGhlIHRpbWVzdGFtcCBuZWVkcyB0byByZWZsZWN0IGhvdyBmcmVzaCB0aGUgc2FtcGxlIGlzIChub3QgbmVjZXNzYXJpbHkgd2hpY2ggcG9pbnQgaW4gdGltZQorICAgICAqIGl0IGFwcGxpZXMgdG8pLgorICAgICAqLworICAgIHZvaWQgc2V0V29ybGRUb0hlYWRQb3NlKGludDY0X3QgdGltZXN0YW1wLCBjb25zdCBQb3NlM2YmIHdvcmxkVG9IZWFkKTsKKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRoZSBzY3JlZW4gaXMgY29uc2lkZXJlZCBzdGFibGUuCisgICAgICogVGhlIHRpbWVzdGFtcCBuZWVkcyB0byByZWZsZWN0IGhvdyBmcmVzaCB0aGUgc2FtcGxlIGlzLgorICAgICAqLworICAgICB2b2lkIHNldFNjcmVlblN0YWJsZShpbnQ2NF90IHRpbWVzdGFtcCwgYm9vbCBzdGFibGUpOworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhbGwgdGhlIHByZXZpb3VzIGlucHV0cyBhbmQgdXBkYXRlIHRoZSBvdXRwdXRzLgorICAgICAqLworICAgIHZvaWQgY2FsY3VsYXRlKGludDY0X3QgdGltZXN0YW1wKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYWdncmVnYXRlIGhlYWQtdG8tc3RhZ2UgcG9zZSAocHJpbWFyeSBvdXRwdXQgb2YgdGhpcyBtb2R1bGUpLgorICAgICAqLworICAgIFBvc2UzZiBnZXRIZWFkVG9TdGFnZVBvc2UoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYWN0dWFsIGhlYWQtdHJhY2tpbmcgbW9kZSAod2hpY2ggbWF5IGRldmlhdGUgZnJvbSB0aGUgZGVzaXJlZCBvbmUgYXMgbWVudGlvbmVkIGluIHRoZQorICAgICAqIGNsYXNzIGRvY3VtZW50YXRpb24gYWJvdmUpLgorICAgICAqLworICAgIEhlYWRUcmFja2luZ01vZGUgZ2V0QWN0dWFsTW9kZSgpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgY29uc3QgT3B0aW9ucyBtT3B0aW9uczsKKworICAgIEhlYWRUcmFja2luZ01vZGUgbURlc2lyZWRNb2RlOworICAgIFBvc2UzZiBtU2NyZWVuVG9TdGFnZTsKKyAgICBzdGQ6Om9wdGlvbmFsPFBvc2UzZj4gbVNjcmVlblRvSGVhZDsKKyAgICBpbnQ2NF90IG1TY3JlZW5Ub0hlYWRUaW1lc3RhbXA7CisgICAgc3RkOjpvcHRpb25hbDxQb3NlM2Y+IG1Xb3JsZFRvSGVhZDsKKyAgICBpbnQ2NF90IG1Xb3JsZFRvSGVhZFRpbWVzdGFtcDsKKyAgICBzdGQ6Om9wdGlvbmFsPGJvb2w+IG1TY3JlZW5TdGFibGU7CisgICAgaW50NjRfdCBtU2NyZWVuU3RhYmxlVGltZXN0YW1wOworCisgICAgSGVhZFRyYWNraW5nTW9kZSBtQWN0dWFsTW9kZTsKKyAgICBQb3NlM2YgbUhlYWRUb1N0YWdlOworCisgICAgdm9pZCBjYWxjdWxhdGVBY3R1YWxNb2RlKGludDY0X3QgdGltZXN0YW1wKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9PV05FUlMgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZDAzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvT1dORVJTCkBAIC0wLDAgKzEsMiBAQAoreXRhaUBnb29nbGUuY29tCitlbGF1cmVudEBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZS10ZXN0LmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlLXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTE4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZS10ZXN0LmNwcApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJtZWRpYS9Qb3NlLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiUXVhdGVybmlvblV0aWwuaCIKKyNpbmNsdWRlICJUZXN0VXRpbC5oIgorCit1c2luZyBhbmRyb2lkOjptZWRpYTo6UG9zZTNmOwordXNpbmcgRWlnZW46OlF1YXRlcm5pb25mOwordXNpbmcgRWlnZW46OlZlY3RvcjNmOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHsKKworVEVTVChQb3NlLCBDdG9yRGVmYXVsdCkgeworICAgIFBvc2UzZiBwb3NlOworICAgIEVYUEVDVF9FUShwb3NlLnRyYW5zbGF0aW9uKCksIFZlY3RvcjNmOjpaZXJvKCkpOworICAgIEVYUEVDVF9FUShwb3NlLnJvdGF0aW9uKCksIFF1YXRlcm5pb25mOjpJZGVudGl0eSgpKTsKK30KKworVEVTVChQb3NlLCBDdG9yUm90YXRpb24pIHsKKyAgICBRdWF0ZXJuaW9uZiByb3QgPSBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpOworICAgIFBvc2UzZiBwb3NlKHJvdCk7CisgICAgRVhQRUNUX0VRKHBvc2UudHJhbnNsYXRpb24oKSwgVmVjdG9yM2Y6Olplcm8oKSk7CisgICAgRVhQRUNUX0VRKHBvc2Uucm90YXRpb24oKSwgcm90KTsKK30KKworVEVTVChQb3NlLCBDdG9yVHJhbnNsYXRpb24pIHsKKyAgICBWZWN0b3IzZiB0cmFuc3sxLCAyLCAzfTsKKyAgICBQb3NlM2YgcG9zZSh0cmFucyk7CisgICAgRVhQRUNUX0VRKHBvc2UudHJhbnNsYXRpb24oKSwgdHJhbnMpOworICAgIEVYUEVDVF9FUShwb3NlLnJvdGF0aW9uKCksIFF1YXRlcm5pb25mOjpJZGVudGl0eSgpKTsKK30KKworVEVTVChQb3NlLCBDdG9yVHJhbnNsYXRpb25Sb3RhdGlvbikgeworICAgIFF1YXRlcm5pb25mIHJvdCA9IFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCk7CisgICAgVmVjdG9yM2YgdHJhbnN7MSwgMiwgM307CisgICAgUG9zZTNmIHBvc2UodHJhbnMsIHJvdCk7CisgICAgRVhQRUNUX0VRKHBvc2UudHJhbnNsYXRpb24oKSwgdHJhbnMpOworICAgIEVYUEVDVF9FUShwb3NlLnJvdGF0aW9uKCksIHJvdCk7Cit9CisKK1RFU1QoUG9zZSwgSW52ZXJzZSkgeworICAgIFBvc2UzZiBwb3NlKHsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgRVhQRUNUX0VRKHBvc2UuaW52ZXJzZSgpICogcG9zZSwgUG9zZTNmKCkpOworICAgIEVYUEVDVF9FUShwb3NlICogcG9zZS5pbnZlcnNlKCksIFBvc2UzZigpKTsKK30KKworVEVTVChQb3NlLCBJc0FwcHJveCkgeworICAgIGNvbnN0ZXhwciBmbG9hdCBlcHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZXBzaWxvbigpOworCisgICAgRVhQRUNUX0VRKFBvc2UzZih7MSwgMiwgM30sIHJvdGF0aW9uVmVjdG9yVG9RdWF0ZXJuaW9uKHs0LCA1LCA2fSkpLAorICAgICAgICAgICAgICBQb3NlM2YoezEgKyBlcHMsIDIgKyBlcHMsIDMgKyBlcHN9LAorICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25WZWN0b3JUb1F1YXRlcm5pb24oezQgKyBlcHMsIDUgKyBlcHMsIDYgKyBlcHN9KSkpOworCisgICAgRVhQRUNUX05FKFBvc2UzZih7MSwgMiwgM30sIHJvdGF0aW9uVmVjdG9yVG9RdWF0ZXJuaW9uKHs0LCA1LCA2fSkpLAorICAgICAgICAgICAgICBQb3NlM2YoezEuMDEsIDIsIDN9LCByb3RhdGlvblZlY3RvclRvUXVhdGVybmlvbih7NCwgNSwgNn0pKSk7CisKKyAgICBFWFBFQ1RfTkUoUG9zZTNmKHsxLCAyLCAzfSwgcm90YXRpb25WZWN0b3JUb1F1YXRlcm5pb24oezQsIDUsIDZ9KSksCisgICAgICAgICAgICAgIFBvc2UzZih7MSwgMiwgM30sIHJvdGF0aW9uVmVjdG9yVG9RdWF0ZXJuaW9uKHs0LjAxLCA1LCA2fSkpKTsKK30KKworVEVTVChQb3NlLCBDb21wb3NlKSB7CisgICAgUG9zZTNmIHAxKHsxLCAyLCAzfSwgcm90YXRlWihNX1BJXzIpKTsKKyAgICBQb3NlM2YgcDIoezQsIDUsIDZ9LCByb3RhdGVYKE1fUElfMikpOworICAgIFBvc2UzZiBwMyh7LTQsIDYsIDl9LCBwMS5yb3RhdGlvbigpICogcDIucm90YXRpb24oKSk7CisgICAgRVhQRUNUX0VRKHAxICogcDIsIHAzKTsKK30KKworVEVTVChQb3NlLCBNb3ZlV2l0aFJhdGVMaW1pdF9Ob0xpbWl0KSB7CisgICAgUG9zZTNmIGZyb20oezEsIDEsIDF9LCBRdWF0ZXJuaW9uZjo6SWRlbnRpdHkoKSk7CisgICAgUG9zZTNmIHRvKHsxLCAxLCAyfSwgcm90YXRlWihNX1BJXzIpKTsKKyAgICBhdXRvIHJlc3VsdCA9IG1vdmVXaXRoUmF0ZUxpbWl0KGZyb20sIHRvLCAxLCAxMCwgMTApOworICAgIEVYUEVDVF9FUShzdGQ6OmdldDwwPihyZXN1bHQpLCB0byk7CisgICAgRVhQRUNUX0ZBTFNFKHN0ZDo6Z2V0PDE+KHJlc3VsdCkpOworfQorCitURVNUKFBvc2UsIE1vdmVXaXRoUmF0ZUxpbWl0X1RyYW5zbGF0aW9uTGltaXQpIHsKKyAgICBQb3NlM2YgZnJvbSh7MSwgMSwgMX0sIFF1YXRlcm5pb25mOjpJZGVudGl0eSgpKTsKKyAgICBQb3NlM2YgdG8oezEsIDEsIDJ9LCByb3RhdGVaKE1fUElfMikpOworICAgIGF1dG8gcmVzdWx0ID0gbW92ZVdpdGhSYXRlTGltaXQoZnJvbSwgdG8sIDEsIDAuNWYsIDEwKTsKKyAgICBQb3NlM2YgZXhwZWN0ZWQoezEsIDEsIDEuNWZ9LCByb3RhdGVaKE1fUElfNCkpOworICAgIEVYUEVDVF9FUShzdGQ6OmdldDwwPihyZXN1bHQpLCBleHBlY3RlZCk7CisgICAgRVhQRUNUX1RSVUUoc3RkOjpnZXQ8MT4ocmVzdWx0KSk7Cit9CisKK1RFU1QoUG9zZSwgTW92ZVdpdGhSYXRlTGltaXRfUm90YXRpb25MaW1pdCkgeworICAgIFBvc2UzZiBmcm9tKHsxLCAxLCAxfSwgUXVhdGVybmlvbmY6OklkZW50aXR5KCkpOworICAgIFBvc2UzZiB0byh7MSwgMSwgMn0sIHJvdGF0ZVooTV9QSV8yKSk7CisgICAgYXV0byByZXN1bHQgPSBtb3ZlV2l0aFJhdGVMaW1pdChmcm9tLCB0bywgMSwgMTAsIE1fUElfNCk7CisgICAgUG9zZTNmIGV4cGVjdGVkKHsxLCAxLCAxLjVmfSwgcm90YXRlWihNX1BJXzQpKTsKKyAgICBFWFBFQ1RfRVEoc3RkOjpnZXQ8MD4ocmVzdWx0KSwgZXhwZWN0ZWQpOworICAgIEVYUEVDVF9UUlVFKHN0ZDo6Z2V0PDE+KHJlc3VsdCkpOworfQorCitURVNUKFBvc2UsIEZsb2F0VmVjdG9yUm91bmRUcmlwMSkgeworICAgIC8vIFJvdGF0aW9uIHZlY3RvciBtYWduaXR1ZGUgbXVzdCBiZSBsZXNzIHRoYW4gUGkuCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHZlYyA9IHsgMSwgMiwgMywgMC40LCAwLjUsIDAuNn07CisgICAgc3RkOjpvcHRpb25hbDxQb3NlM2Y+IHBvc2UgPSBQb3NlM2Y6OmZyb21WZWN0b3IodmVjKTsKKyAgICBBU1NFUlRfVFJVRShwb3NlLmhhc192YWx1ZSgpKTsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcmVjb25zdHJ1Y3RlZCA9IHBvc2UtPnRvVmVjdG9yKCk7CisgICAgRVhQRUNUX0VRKHZlYywgcmVjb25zdHJ1Y3RlZCk7Cit9CisKK1RFU1QoUG9zZSwgRmxvYXRWZWN0b3JSb3VuZFRyaXAyKSB7CisgICAgUG9zZTNmIHBvc2UoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gdmVjID0gcG9zZS50b1ZlY3RvcigpOworICAgIHN0ZDo6b3B0aW9uYWw8UG9zZTNmPiByZWNvbnN0cnVjdGVkID0gUG9zZTNmOjpmcm9tVmVjdG9yKHZlYyk7CisgICAgQVNTRVJUX1RSVUUocmVjb25zdHJ1Y3RlZC5oYXNfdmFsdWUoKSk7CisgICAgRVhQRUNUX0VRKHBvc2UsIHJlY29uc3RydWN0ZWQudmFsdWUoKSk7Cit9CisKK1RFU1QoUG9zZSwgRmxvYXRWZWN0b3JJbnZhbGlkKSB7CisgICAgRVhQRUNUX0ZBTFNFKFBvc2UzZjo6ZnJvbVZlY3Rvcih7fSkuaGFzX3ZhbHVlKCkpOworICAgIEVYUEVDVF9GQUxTRShQb3NlM2Y6OmZyb21WZWN0b3IoezEsIDIsIDMsIDQsIDV9KS5oYXNfdmFsdWUoKSk7CisgICAgRVhQRUNUX0ZBTFNFKFBvc2UzZjo6ZnJvbVZlY3Rvcih7MSwgMiwgMywgNCwgNSwgNiwgN30pLmhhc192YWx1ZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZS5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzOTUxMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlLmNwcApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIm1lZGlhL1Bvc2UuaCIKKyNpbmNsdWRlICJtZWRpYS9Ud2lzdC5oIgorI2luY2x1ZGUgIlF1YXRlcm5pb25VdGlsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKK3VzaW5nIEVpZ2VuOjpWZWN0b3IzZjsKKworc3RkOjpvcHRpb25hbDxQb3NlM2Y+IFBvc2UzZjo6ZnJvbVZlY3Rvcihjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4mIHZlYykgeworICAgIGlmICh2ZWMuc2l6ZSgpICE9IDYpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICB9CisgICAgcmV0dXJuIFBvc2UzZih7dmVjWzBdLCB2ZWNbMV0sIHZlY1syXX0sIHJvdGF0aW9uVmVjdG9yVG9RdWF0ZXJuaW9uKHt2ZWNbM10sIHZlY1s0XSwgdmVjWzVdfSkpOworfQorCitzdGQ6OnZlY3RvcjxmbG9hdD4gUG9zZTNmOjp0b1ZlY3RvcigpIGNvbnN0IHsKKyAgICBFaWdlbjo6VmVjdG9yM2Ygcm90ID0gcXVhdGVybmlvblRvUm90YXRpb25WZWN0b3IobVJvdGF0aW9uKTsKKyAgICByZXR1cm4ge21UcmFuc2xhdGlvblswXSwgbVRyYW5zbGF0aW9uWzFdLCBtVHJhbnNsYXRpb25bMl0sIHJvdFswXSwgcm90WzFdLCByb3RbMl19OworfQorCitzdGQ6OnR1cGxlPFBvc2UzZiwgYm9vbD4gbW92ZVdpdGhSYXRlTGltaXQoY29uc3QgUG9zZTNmJiBmcm9tLCBjb25zdCBQb3NlM2YmIHRvLCBmbG9hdCB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFRyYW5zbGF0aW9uYWxWZWxvY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSb3RhdGlvbmFsVmVsb2NpdHkpIHsKKyAgICAvLyBOZXZlciByYXRlIGxpbWl0IGlmIGJvdGggbGltaXRzIGFyZSBzZXQgdG8gaW5maW5pdHkuCisgICAgaWYgKGlzaW5mKG1heFRyYW5zbGF0aW9uYWxWZWxvY2l0eSkgJiYgaXNpbmYobWF4Um90YXRpb25hbFZlbG9jaXR5KSkgeworICAgICAgICByZXR1cm4ge3RvLCBmYWxzZX07CisgICAgfQorICAgIC8vIEFsd2F5cyByYXRlIGxpbWl0IGlmIHQgaXMgMCAocmVxdWlyZWQgdG8gYXZvaWQgZGl2aXNpb24gYnkgMCkuCisgICAgaWYgKHQgPT0gMCB8fCBtYXhUcmFuc2xhdGlvbmFsVmVsb2NpdHkgPT0gMCB8fCBtYXhSb3RhdGlvbmFsVmVsb2NpdHkgPT0gMCkgeworICAgICAgICByZXR1cm4ge2Zyb20sIHRydWV9OworICAgIH0KKworICAgIFBvc2UzZiBmcm9tVG9UbyA9IGZyb20uaW52ZXJzZSgpICogdG87CisgICAgVHdpc3QzZiB0d2lzdCA9IGRpZmZlcmVudGlhdGUoZnJvbVRvVG8sIHQpOworICAgIGZsb2F0IGFuZ3VsYXJSb3RhdGlvbmFsUmF0aW8gPSB0d2lzdC5zY2FsYXJSb3RhdGlvbmFsVmVsb2NpdHkoKSAvIG1heFJvdGF0aW9uYWxWZWxvY2l0eTsKKyAgICBmbG9hdCB0cmFuc2xhdGlvbmFsVmVsb2NpdHlSYXRpbyA9CisgICAgICAgICAgICB0d2lzdC5zY2FsYXJUcmFuc2xhdGlvbmFsVmVsb2NpdHkoKSAvIG1heFRyYW5zbGF0aW9uYWxWZWxvY2l0eTsKKyAgICBmbG9hdCBtYXhSYXRpbyA9IHN0ZDo6bWF4KGFuZ3VsYXJSb3RhdGlvbmFsUmF0aW8sIHRyYW5zbGF0aW9uYWxWZWxvY2l0eVJhdGlvKTsKKyAgICBpZiAobWF4UmF0aW8gPD0gMSkgeworICAgICAgICByZXR1cm4ge3RvLCBmYWxzZX07CisgICAgfQorICAgIHJldHVybiB7ZnJvbSAqIGludGVncmF0ZSh0d2lzdCwgdCAvIG1heFJhdGlvKSwgdHJ1ZX07Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBQb3NlM2YmIHBvc2UpIHsKKyAgICBvcyA8PCAidHJhbnNsYXRpb246ICIgPDwgcG9zZS50cmFuc2xhdGlvbigpLnRyYW5zcG9zZSgpCisgICAgICAgPDwgIiBxdWF0ZXJuaW9uOiAiIDw8IHBvc2Uucm90YXRpb24oKS5jb2VmZnMoKS50cmFuc3Bvc2UoKTsKKyAgICByZXR1cm4gb3M7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlQmlhcy10ZXN0LmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlQmlhcy10ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjQyYTJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VCaWFzLXRlc3QuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIlBvc2VCaWFzLmgiCisjaW5jbHVkZSAiUXVhdGVybmlvblV0aWwuaCIKKyNpbmNsdWRlICJUZXN0VXRpbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHsKKwordXNpbmcgRWlnZW46OlF1YXRlcm5pb25mOwordXNpbmcgRWlnZW46OlZlY3RvcjNmOworCitURVNUKFBvc2VCaWFzLCBJbml0aWFsKSB7CisgICAgUG9zZUJpYXMgYmlhczsKKyAgICBFWFBFQ1RfRVEoYmlhcy5nZXRPdXRwdXQoKSwgUG9zZTNmKCkpOworfQorCitURVNUKFBvc2VCaWFzLCBCYXNpYykgeworICAgIFBvc2UzZiBwb3NlMSh7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIFBvc2UzZiBwb3NlMih7NCwgNSwgNn0sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworCisgICAgUG9zZUJpYXMgYmlhczsKKyAgICBiaWFzLnNldElucHV0KHBvc2UxKTsKKyAgICBFWFBFQ1RfRVEocG9zZTEsIGJpYXMuZ2V0T3V0cHV0KCkpOworICAgIGJpYXMucmVjZW50ZXIoKTsKKyAgICBFWFBFQ1RfRVEoYmlhcy5nZXRPdXRwdXQoKSwgUG9zZTNmKCkpOworICAgIGJpYXMuc2V0SW5wdXQocG9zZTIpOworICAgIEVYUEVDVF9FUShiaWFzLmdldE91dHB1dCgpLCBwb3NlMS5pbnZlcnNlKCkgKiBwb3NlMik7CisgICAgYmlhcy5yZWNlbnRlcigpOworICAgIEVYUEVDVF9FUShiaWFzLmdldE91dHB1dCgpLCBQb3NlM2YoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VCaWFzLmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlQmlhcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhZmNhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlQmlhcy5jcHAKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIil7fQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiUG9zZUJpYXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKwordm9pZCBQb3NlQmlhczo6c2V0SW5wdXQoY29uc3QgUG9zZTNmJiBpbnB1dCkgeworICAgIG1MYXN0V29ybGRUb0lucHV0ID0gaW5wdXQ7Cit9CisKK3ZvaWQgUG9zZUJpYXM6OnJlY2VudGVyKCkgeworICAgIG1CaWFzVG9Xb3JsZCA9IG1MYXN0V29ybGRUb0lucHV0LmludmVyc2UoKTsKK30KKworUG9zZTNmIFBvc2VCaWFzOjpnZXRPdXRwdXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1CaWFzVG9Xb3JsZCAqIG1MYXN0V29ybGRUb0lucHV0OworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZUJpYXMuaCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlQmlhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhY2I0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZUJpYXMuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAibWVkaWEvUG9zZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCisvKioKKyAqIEJpYXNpbmcgZm9yIGEgc3RyZWFtIG9mIHBvc2VzLgorICoKKyAqIFRoaXMgZmlsdGVyIHRha2VzIGEgc3RyZWFtIG9mIHBvc2VzIGFuZCBhdCBhbnkgdGltZSBkdXJpbmcgdGhlIHN0cmVhbSwgY2FuIGNoYW5nZSB0aGUgZnJhbWUgb2YKKyAqIHJlZmVyZW5jZSBmb3IgdGhlIHN0cmVhbSB0byBiZSB0aGF0IG9mIHRoZSBsYXN0IHBvc2UgcmVjZWl2ZWQsIHZpYSB0aGUgcmVjZW50ZXIoKSBvcGVyYXRpb24uCisgKgorICogVHlwaWNhbCB1c2FnZToKKyAqIFBvc2VCaWFzIGJpYXM7CisgKgorICogYmlhcy5zZXRJbnB1dCguLi4pOworICogb3V0cHV0ID0gYmlhcy5nZXRPdXRwdXQoKTsKKyAqIGJpYXMuc2V0SW5wdXQoLi4uKTsKKyAqIG91dHB1dCA9IGJpYXMuZ2V0T3V0cHV0KCk7CisgKiBiaWFzLnNldElucHV0KC4uLik7CisgKiBvdXRwdXQgPSBiaWFzLmdldE91dHB1dCgpOworICogYmlhcy5yZWNlbnRlcigpOyAgLy8gUmVmZXJlbmNlIGZyYW1lIGlzIG5vdyBlcXVhbCB0byB0aGUgbGFzdCBpbnB1dC4KKyAqIG91dHB1dCA9IGJpYXMuZ2V0T3V0cHV0KCk7ICAvLyBUaGlzIGlzIG5vdyB0aGUgaWRlbnRpdHkgcG9zZS4KKyAqCisgKiBUaGVyZSBkb2Vzbid0IG5lZWQgdG8gYmUgYSAxOjEgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBzZXRJbnB1dCgpIGFuZCBnZXRPdXRwdXQoKSBjYWxscy4KKyAqIFRoZSBpbml0aWFsIGJpYXMgcG9pbnQgaXMgaWRlbnRpdHkuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0aHJlYWQtY29tcGF0aWJsZSwgYnV0IG5vdCB0aHJlYWQtc2FmZS4KKyAqLworY2xhc3MgUG9zZUJpYXMgeworICBwdWJsaWM6CisgICAgdm9pZCBzZXRJbnB1dChjb25zdCBQb3NlM2YmIGlucHV0KTsKKworICAgIHZvaWQgcmVjZW50ZXIoKTsKKworICAgIFBvc2UzZiBnZXRPdXRwdXQoKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIFBvc2UzZiBtTGFzdFdvcmxkVG9JbnB1dDsKKyAgICBQb3NlM2YgbUJpYXNUb1dvcmxkOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VEcmlmdENvbXBlbnNhdG9yLXRlc3QuY3BwIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VEcmlmdENvbXBlbnNhdG9yLXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMGEwNWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZURyaWZ0Q29tcGVuc2F0b3ItdGVzdC5jcHAKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxjbWF0aD4KKworI2luY2x1ZGUgIlBvc2VEcmlmdENvbXBlbnNhdG9yLmgiCisjaW5jbHVkZSAiUXVhdGVybmlvblV0aWwuaCIKKyNpbmNsdWRlICJUZXN0VXRpbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHsKKwordXNpbmcgRWlnZW46OlF1YXRlcm5pb25mOwordXNpbmcgRWlnZW46OlZlY3RvcjNmOwordXNpbmcgT3B0aW9ucyA9IFBvc2VEcmlmdENvbXBlbnNhdG9yOjpPcHRpb25zOworCitURVNUKFBvc2VEcmlmdENvbXBlbnNhdG9yLCBJbml0aWFsKSB7CisgICAgUG9zZURyaWZ0Q29tcGVuc2F0b3IgY29tcChPcHRpb25ze30pOworICAgIEVYUEVDVF9FUShjb21wLmdldE91dHB1dCgpLCBQb3NlM2YoKSk7Cit9CisKK1RFU1QoUG9zZURyaWZ0Q29tcGVuc2F0b3IsIE5vRHJpZnQpIHsKKyAgICBQb3NlM2YgcG9zZTEoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBQb3NlM2YgcG9zZTIoezQsIDUsIDZ9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBQb3NlRHJpZnRDb21wZW5zYXRvciBjb21wKE9wdGlvbnN7fSk7CisKKyAgICAvLyBGaXJzdCBwb3NlIHNldHMgdGhlIGJhc2VsaW5lLgorICAgIGNvbXAuc2V0SW5wdXQoMTAwMCwgcG9zZTEpOworICAgIEVYUEVDVF9FUShjb21wLmdldE91dHB1dCgpLCBQb3NlM2YoKSk7CisKKyAgICBjb21wLnNldElucHV0KDIwMDAsIHBvc2UyKTsKKyAgICBFWFBFQ1RfRVEoY29tcC5nZXRPdXRwdXQoKSwgcG9zZTEuaW52ZXJzZSgpICogcG9zZTIpOworCisgICAgLy8gUmVjZW50ZXJpbmcgcmVzZXRzIHRoZSBiYXNlbGluZS4KKyAgICBjb21wLnJlY2VudGVyKCk7CisgICAgRVhQRUNUX0VRKGNvbXAuZ2V0T3V0cHV0KCksIFBvc2UzZigpKTsKKworICAgIGNvbXAuc2V0SW5wdXQoMzAwMCwgcG9zZTEpOworICAgIEVYUEVDVF9FUShjb21wLmdldE91dHB1dCgpLCBQb3NlM2YoKSk7CisKKyAgICBjb21wLnNldElucHV0KDQwMDAsIHBvc2UyKTsKKyAgICBFWFBFQ1RfRVEoY29tcC5nZXRPdXRwdXQoKSwgcG9zZTEuaW52ZXJzZSgpICogcG9zZTIpOworfQorCitURVNUKFBvc2VEcmlmdENvbXBlbnNhdG9yLCBOb0RyaWZ0WmVyb1RpbWUpIHsKKyAgICBQb3NlM2YgcG9zZTEoezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBQb3NlM2YgcG9zZTIoezQsIDUsIDZ9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBQb3NlRHJpZnRDb21wZW5zYXRvciBjb21wKE9wdGlvbnN7fSk7CisKKyAgICBjb21wLnNldElucHV0KDEwMDAsIHBvc2UxKTsKKyAgICBFWFBFQ1RfRVEoY29tcC5nZXRPdXRwdXQoKSwgUG9zZTNmKCkpOworCisgICAgY29tcC5zZXRJbnB1dCgxMDAwLCBwb3NlMik7CisgICAgRVhQRUNUX0VRKGNvbXAuZ2V0T3V0cHV0KCksIHBvc2UxLmludmVyc2UoKSAqIHBvc2UyKTsKKworICAgIGNvbXAucmVjZW50ZXIoKTsKKyAgICBFWFBFQ1RfRVEoY29tcC5nZXRPdXRwdXQoKSwgUG9zZTNmKCkpOworCisgICAgY29tcC5zZXRJbnB1dCgxMDAwLCBwb3NlMSk7CisgICAgRVhQRUNUX0VRKGNvbXAuZ2V0T3V0cHV0KCksIFBvc2UzZigpKTsKKworICAgIGNvbXAuc2V0SW5wdXQoMTAwMCwgcG9zZTIpOworICAgIEVYUEVDVF9FUShjb21wLmdldE91dHB1dCgpLCBwb3NlMS5pbnZlcnNlKCkgKiBwb3NlMik7Cit9CisKK1RFU1QoUG9zZURyaWZ0Q29tcGVuc2F0b3IsIEFzeW1wdG90aWMpIHsKKyAgICBQb3NlM2YgcG9zZSh7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworCisgICAgUG9zZURyaWZ0Q29tcGVuc2F0b3IgY29tcCgKKyAgICAgICAgICAgIE9wdGlvbnN7LnRyYW5zbGF0aW9uYWxEcmlmdFRpbWVDb25zdGFudCA9IDEsIC5yb3RhdGlvbmFsRHJpZnRUaW1lQ29uc3RhbnQgPSAxfSk7CisKKyAgICAvLyBTZXQgdGhlIHNhbWUgcG9zZSBmb3IgYSBsb25nIHRpbWUuCisgICAgZm9yIChpbnQ2NF90IHQgPSAwOyB0IDwgMTAwMDsgKyt0KSB7CisgICAgICAgIGNvbXAuc2V0SW5wdXQodCwgcG9zZSk7CisgICAgfQorCisgICAgLy8gT3V0cHV0IHdvdWxkIGhhdmUgZmFkZWQgdG8gYXBwcm94LiBpZGVudGl0eS4KKyAgICBFWFBFQ1RfRVEoY29tcC5nZXRPdXRwdXQoKSwgUG9zZTNmKCkpOworfQorCitURVNUKFBvc2VEcmlmdENvbXBlbnNhdG9yLCBGYXN0KSB7CisgICAgUG9zZTNmIHBvc2UxKHsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgUG9zZTNmIHBvc2UyKHs0LCA1LCA2fSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgUG9zZURyaWZ0Q29tcGVuc2F0b3IgY29tcCgKKyAgICAgICAgICAgIE9wdGlvbnN7LnRyYW5zbGF0aW9uYWxEcmlmdFRpbWVDb25zdGFudCA9IDFlNywgLnJvdGF0aW9uYWxEcmlmdFRpbWVDb25zdGFudCA9IDFlN30pOworCisgICAgY29tcC5zZXRJbnB1dCgwLCBwb3NlMSk7CisgICAgRVhQRUNUX0VRKGNvbXAuZ2V0T3V0cHV0KCksIFBvc2UzZigpKTsKKworICAgIGNvbXAuc2V0SW5wdXQoMSwgcG9zZTIpOworICAgIEVYUEVDVF9FUShjb21wLmdldE91dHB1dCgpLCBwb3NlMS5pbnZlcnNlKCkgKiBwb3NlMik7CisKKyAgICBjb21wLnJlY2VudGVyKCk7CisgICAgRVhQRUNUX0VRKGNvbXAuZ2V0T3V0cHV0KCksIFBvc2UzZigpKTsKKworICAgIGNvbXAuc2V0SW5wdXQoMiwgcG9zZTEpOworICAgIEVYUEVDVF9FUShjb21wLmdldE91dHB1dCgpLCBQb3NlM2YoKSk7CisKKyAgICBjb21wLnNldElucHV0KDMsIHBvc2UyKTsKKyAgICBFWFBFQ1RfRVEoY29tcC5nZXRPdXRwdXQoKSwgcG9zZTEuaW52ZXJzZSgpICogcG9zZTIpOworfQorCitURVNUKFBvc2VEcmlmdENvbXBlbnNhdG9yLCBEcmlmdCkgeworICAgIFBvc2UzZiBwb3NlMSh7MSwgMiwgM30sIHJvdGF0ZVooLU1fUEkgKiAzIC8gNCkpOworICAgIFBvc2VEcmlmdENvbXBlbnNhdG9yIGNvbXAoCisgICAgICAgICAgICBPcHRpb25zey50cmFuc2xhdGlvbmFsRHJpZnRUaW1lQ29uc3RhbnQgPSA1MDAsIC5yb3RhdGlvbmFsRHJpZnRUaW1lQ29uc3RhbnQgPSAxMDAwfSk7CisKKyAgICAvLyBFc3RhYmxpc2ggYSBiYXNlbGluZS4KKyAgICBjb21wLnNldElucHV0KDEwMDAsIFBvc2UzZigpKTsKKworICAgIC8vIEluaXRpYWwgcG9zZSBpcyB1c2VkIGFzIGlzLgorICAgIGNvbXAuc2V0SW5wdXQoMTAwMCwgcG9zZTEpOworICAgIEVYUEVDVF9FUShjb21wLmdldE91dHB1dCgpLCBwb3NlMSk7CisKKyAgICAvLyBBZnRlciAxMDAwIHRpY2tzLCBvdXIgcm90YXRpb24gc2hvdWxkIGJlIGV4cCgtMSkgYW5kIHRyYW5zbGF0aW9uIGV4cCgtMikgZnJvbSBpZGVudGl0eS4KKyAgICBjb21wLnNldElucHV0KDIwMDAsIHBvc2UxKTsKKyAgICBFWFBFQ1RfRVEoY29tcC5nZXRPdXRwdXQoKSwKKyAgICAgICAgICAgICAgUG9zZTNmKFZlY3RvcjNmezEsIDIsIDN9ICogc3RkOjpleHBmKC0yKSwgcm90YXRlWigtTV9QSSAqIDMgLyA0ICogc3RkOjpleHBmKC0xKSkpKTsKKworICAgIC8vIEFzIGxvbmcgYXMgdGhlIGlucHV0IHN0YXlzIHRoZSBzYW1lLCB3ZSdsbCBjb250aW51ZSB0byBhZHZhbmNlIHRvd2FyZHMgaWRlbnRpdHkuCisgICAgY29tcC5zZXRJbnB1dCgzMDAwLCBwb3NlMSk7CisgICAgRVhQRUNUX0VRKGNvbXAuZ2V0T3V0cHV0KCksCisgICAgICAgICAgICAgIFBvc2UzZihWZWN0b3IzZnsxLCAyLCAzfSAqIHN0ZDo6ZXhwZigtNCksIHJvdGF0ZVooLU1fUEkgKiAzIC8gNCAqIHN0ZDo6ZXhwZigtMikpKSk7CisKKyAgICBjb21wLnJlY2VudGVyKCk7CisgICAgRVhQRUNUX0VRKGNvbXAuZ2V0T3V0cHV0KCksIFBvc2UzZigpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZURyaWZ0Q29tcGVuc2F0b3IuY3BwIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VEcmlmdENvbXBlbnNhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTkwY2FkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VEcmlmdENvbXBlbnNhdG9yLmNwcApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKXt9CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJQb3NlRHJpZnRDb21wZW5zYXRvci5oIgorCisjaW5jbHVkZSA8Y21hdGg+CisKKyNpbmNsdWRlICJRdWF0ZXJuaW9uVXRpbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCit1c2luZyBFaWdlbjo6UXVhdGVybmlvbmY7Cit1c2luZyBFaWdlbjo6VmVjdG9yM2Y7CisKK1Bvc2VEcmlmdENvbXBlbnNhdG9yOjpQb3NlRHJpZnRDb21wZW5zYXRvcihjb25zdCBPcHRpb25zJiBvcHRpb25zKSA6IG1PcHRpb25zKG9wdGlvbnMpIHt9CisKK3ZvaWQgUG9zZURyaWZ0Q29tcGVuc2F0b3I6OnNldElucHV0KGludDY0X3QgdGltZXN0YW1wLCBjb25zdCBQb3NlM2YmIGlucHV0KSB7CisgICAgaWYgKG1UaW1lc3RhbXAuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgLy8gQXZvaWQgY29tcHV0YXRpb24gdXBvbiBmaXJzdCBpbnB1dCAob25seSBzZXRzIHRoZSBpbml0aWFsIHN0YXRlKS4KKyAgICAgICAgUG9zZTNmIHByZXZJbnB1dFRvSW5wdXQgPSBtUHJldklucHV0LmludmVyc2UoKSAqIGlucHV0OworICAgICAgICBtT3V0cHV0ID0gc2NhbGUobU91dHB1dCwgdGltZXN0YW1wIC0gbVRpbWVzdGFtcC52YWx1ZSgpKSAqIHByZXZJbnB1dFRvSW5wdXQ7CisgICAgfQorICAgIG1QcmV2SW5wdXQgPSBpbnB1dDsKKyAgICBtVGltZXN0YW1wID0gdGltZXN0YW1wOworfQorCit2b2lkIFBvc2VEcmlmdENvbXBlbnNhdG9yOjpyZWNlbnRlcigpIHsKKyAgICBtVGltZXN0YW1wLnJlc2V0KCk7CisgICAgbU91dHB1dCA9IFBvc2UzZigpOworfQorCitQb3NlM2YgUG9zZURyaWZ0Q29tcGVuc2F0b3I6OmdldE91dHB1dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU91dHB1dDsKK30KKworUG9zZTNmIFBvc2VEcmlmdENvbXBlbnNhdG9yOjpzY2FsZShjb25zdCBQb3NlM2YmIHBvc2UsIGludDY0X3QgZHQpIHsKKyAgICAvLyBUcmFuc2xhdGlvbi4KKyAgICBWZWN0b3IzZiB0cmFuc2xhdGlvbiA9IHBvc2UudHJhbnNsYXRpb24oKTsKKyAgICB0cmFuc2xhdGlvbiAqPSBzdGQ6OmV4cGYoLXN0YXRpY19jYXN0PGZsb2F0PihkdCkgLyBtT3B0aW9ucy50cmFuc2xhdGlvbmFsRHJpZnRUaW1lQ29uc3RhbnQpOworCisgICAgLy8gUm90YXRpb24uCisgICAgVmVjdG9yM2Ygcm90YXRpb25WZWMgPSBxdWF0ZXJuaW9uVG9Sb3RhdGlvblZlY3Rvcihwb3NlLnJvdGF0aW9uKCkpOworICAgIHJvdGF0aW9uVmVjICo9IHN0ZDo6ZXhwZigtc3RhdGljX2Nhc3Q8ZmxvYXQ+KGR0KSAvIG1PcHRpb25zLnJvdGF0aW9uYWxEcmlmdFRpbWVDb25zdGFudCk7CisKKyAgICByZXR1cm4gUG9zZTNmKHRyYW5zbGF0aW9uLCByb3RhdGlvblZlY3RvclRvUXVhdGVybmlvbihyb3RhdGlvblZlYykpOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZURyaWZ0Q29tcGVuc2F0b3IuaCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlRHJpZnRDb21wZW5zYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MTQ4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZURyaWZ0Q29tcGVuc2F0b3IuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8b3B0aW9uYWw+CisKKyNpbmNsdWRlICJtZWRpYS9Qb3NlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8qKgorICogRHJpZnQgY29tcGVuc2F0b3IgZm9yIGEgc3RyZWFtIG9mIHBvc2VzLgorICoKKyAqIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBoaWdoLXBhc3MgZmlsdGVyIGZvciBhIHBvc2Ugc3RyZWFtLCByZW1vdmluZyBhbnkgREMtb2Zmc2V0IC8gYmlhcy4gVGhlCisgKiBwcm92aWRlZCBpbnB1dCBzdHJlYW0gd2lsbCBiZSAicHVsbGVkIiB0b3dhcmQgaWRlbnRpdHkgd2l0aCBhbiBleHBvbmVudGlhbCBkZWNheSBmaWx0ZXIgd2l0aCBhCisgKiBjb25maWd1cmFibGUgdGltZSBjb25zdGFudC4gUm90YXRpb24gYW5kIHRyYW5zbGF0aW9uIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkuCisgKgorICogVHlwaWNhbCB1c2FnZToKKyAqIFBvc2VEcmlmdENvbXBlbnNhdG9yIGNvbXAoLi4uKTsKKyAqCisgKiB3aGlsZSAoLi4uKSB7CisgKiAgIGNvbXAuc2V0SW5wdXQoLi4uKTsKKyAqICAgUG9zZTNmIG91dHB1dCA9IGNvbXAuZ2V0T3V0cHV0KCk7CisgKiB9CisgKgorICogVGhlcmUgZG9lc24ndCBuZWVkIHRvIGJlIGEgMToxIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gc2V0SW5wdXQoKSBhbmQgZ2V0T3V0cHV0KCkgY2FsbHMuIFRoZQorICogb3V0cHV0IHRpbWVzdGFtcCBpcyBhbHdheXMgdGhhdCBvZiB0aGUgbGFzdCBzZXRJbnB1dCgpIGNhbGwuIENhbGxpbmcgcmVjZW50ZXIoKSB3aWxsIHJlc2V0IHRoZQorICogYmlhcyB0byB0aGUgY3VycmVudCBvdXRwdXQsIGNhdXNpbmcgdGhlIG91dHB1dCB0byBiZSBpZGVudGl0eS4KKyAqCisgKiBUaGUgaW5pdGlhbCBiaWFzIHBvaW50IGlzIGlkZW50aXR5LgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdGhyZWFkLWNvbXBhdGlibGUsIGJ1dCBub3QgdGhyZWFkLXNhZmUuCisgKi8KK2NsYXNzIFBvc2VEcmlmdENvbXBlbnNhdG9yIHsKKyAgcHVibGljOgorICAgIHN0cnVjdCBPcHRpb25zIHsKKyAgICAgICAgZmxvYXQgdHJhbnNsYXRpb25hbERyaWZ0VGltZUNvbnN0YW50ID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisgICAgICAgIGZsb2F0IHJvdGF0aW9uYWxEcmlmdFRpbWVDb25zdGFudCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICAgIH07CisKKyAgICBleHBsaWNpdCBQb3NlRHJpZnRDb21wZW5zYXRvcihjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworICAgIHZvaWQgc2V0SW5wdXQoaW50NjRfdCB0aW1lc3RhbXAsIGNvbnN0IFBvc2UzZiYgaW5wdXQpOworCisgICAgdm9pZCByZWNlbnRlcigpOworCisgICAgUG9zZTNmIGdldE91dHB1dCgpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgY29uc3QgT3B0aW9ucyBtT3B0aW9uczsKKworICAgIFBvc2UzZiBtUHJldklucHV0OworICAgIFBvc2UzZiBtT3V0cHV0OworICAgIHN0ZDo6b3B0aW9uYWw8aW50NjRfdD4gbVRpbWVzdGFtcDsKKworICAgIFBvc2UzZiBzY2FsZShjb25zdCBQb3NlM2YmIHBvc2UsIGludDY0X3QgZHQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VQcm9jZXNzaW5nR3JhcGgucG5nIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VQcm9jZXNzaW5nR3JhcGgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNWI2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZVByb2Nlc3NpbmdHcmFwaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VSYXRlTGltaXRlci10ZXN0LmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlUmF0ZUxpbWl0ZXItdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwNjE4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlUmF0ZUxpbWl0ZXItdGVzdC5jcHAKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIlBvc2VSYXRlTGltaXRlci5oIgorI2luY2x1ZGUgIlF1YXRlcm5pb25VdGlsLmgiCisjaW5jbHVkZSAiVGVzdFV0aWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB7CisKK3VzaW5nIEVpZ2VuOjpRdWF0ZXJuaW9uZjsKK3VzaW5nIEVpZ2VuOjpWZWN0b3IzZjsKK3VzaW5nIE9wdGlvbnMgPSBQb3NlUmF0ZUxpbWl0ZXI6Ok9wdGlvbnM7CisKK1RFU1QoUG9zZVJhdGVMaW1pdGVyLCBJbml0aWFsKSB7CisgICAgUG9zZTNmIHRhcmdldCh7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIFBvc2VSYXRlTGltaXRlciBsaW1pdGVyKE9wdGlvbnN7Lm1heFRyYW5zbGF0aW9uYWxWZWxvY2l0eSA9IDEwLCAubWF4Um90YXRpb25hbFZlbG9jaXR5ID0gMTB9KTsKKyAgICBsaW1pdGVyLnNldFRhcmdldCh0YXJnZXQpOworICAgIEVYUEVDVF9FUShsaW1pdGVyLmNhbGN1bGF0ZVBvc2UoMTAwMCksIHRhcmdldCk7Cit9CisKK1RFU1QoUG9zZVJhdGVMaW1pdGVyLCBVbmxpbWl0ZWRaZXJvVGltZSkgeworICAgIFBvc2UzZiB0YXJnZXQxKHsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgUG9zZTNmIHRhcmdldDIoezQsIDUsIDZ9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBQb3NlUmF0ZUxpbWl0ZXIgbGltaXRlcihPcHRpb25ze30pOworICAgIGxpbWl0ZXIuc2V0VGFyZ2V0KHRhcmdldDEpOworICAgIEVYUEVDVF9FUShsaW1pdGVyLmNhbGN1bGF0ZVBvc2UoMCksIHRhcmdldDEpOworICAgIGxpbWl0ZXIuc2V0VGFyZ2V0KHRhcmdldDIpOworICAgIEVYUEVDVF9FUShsaW1pdGVyLmNhbGN1bGF0ZVBvc2UoMCksIHRhcmdldDIpOworICAgIGxpbWl0ZXIuc2V0VGFyZ2V0KHRhcmdldDEpOworICAgIEVYUEVDVF9FUShsaW1pdGVyLmNhbGN1bGF0ZVBvc2UoMCksIHRhcmdldDEpOworfQorCitURVNUKFBvc2VSYXRlTGltaXRlciwgTGltaXRlZCkgeworICAgIFBvc2UzZiBwb3NlMSh7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpJZGVudGl0eSgpKTsKKyAgICBQb3NlM2YgcG9zZTIoezEsIDIsIDh9LCByb3RhdGVaKE1fUEkgKiA1IC8gOCkpOworICAgIFBvc2VSYXRlTGltaXRlciBsaW1pdGVyKE9wdGlvbnN7Lm1heFRyYW5zbGF0aW9uYWxWZWxvY2l0eSA9IDEsIC5tYXhSb3RhdGlvbmFsVmVsb2NpdHkgPSAxMH0pOworICAgIGxpbWl0ZXIuc2V0VGFyZ2V0KHBvc2UyKTsKKyAgICBFWFBFQ1RfRVEobGltaXRlci5jYWxjdWxhdGVQb3NlKDEwMDApLCBwb3NlMik7CisKKyAgICAvLyBSYXRlIGxpbWl0aW5nIGlzIGluYWN0aXZlLiBTaG91bGQgdHJhY2sgZGVzcGl0ZSB0aGUgdmlvbGF0aW9uLgorICAgIGxpbWl0ZXIuc2V0VGFyZ2V0KHBvc2UxKTsKKyAgICBFWFBFQ1RfRVEobGltaXRlci5jYWxjdWxhdGVQb3NlKDEwMDEpLCBwb3NlMSk7CisKKyAgICAvLyBFbmFibGUgcmF0ZSBsaW1pdGluZyBhbmQgb2JzZXJ2ZSBncmFkdWFsIG1vdGlvbiBmcm9tIHBvc2UxIHRvIHBvc2UyLgorICAgIGxpbWl0ZXIuZW5hYmxlKCk7CisgICAgbGltaXRlci5zZXRUYXJnZXQocG9zZTIpOworICAgIEVYUEVDVF9FUShsaW1pdGVyLmNhbGN1bGF0ZVBvc2UoMTAwMiksIFBvc2UzZih7MSwgMiwgNH0sIHJvdGF0ZVooTV9QSSAqIDEgLyA4KSkpOworICAgIGxpbWl0ZXIuc2V0VGFyZ2V0KHBvc2UyKTsKKyAgICBFWFBFQ1RfRVEobGltaXRlci5jYWxjdWxhdGVQb3NlKDEwMDMpLCBQb3NlM2YoezEsIDIsIDV9LCByb3RhdGVaKE1fUEkgKiAyIC8gOCkpKTsKKyAgICAvLyBTa2lwIGEgdGljay4KKyAgICBsaW1pdGVyLnNldFRhcmdldChwb3NlMik7CisgICAgRVhQRUNUX0VRKGxpbWl0ZXIuY2FsY3VsYXRlUG9zZSgxMDA1KSwgUG9zZTNmKHsxLCAyLCA3fSwgcm90YXRlWihNX1BJICogNCAvIDgpKSk7CisgICAgbGltaXRlci5zZXRUYXJnZXQocG9zZTIpOworICAgIEVYUEVDVF9FUShsaW1pdGVyLmNhbGN1bGF0ZVBvc2UoMTAwNiksIHBvc2UyKTsKKworICAgIC8vIFdlIHJlYWNoZWQgdGhlIHRhcmdldCwgc28gcmF0ZSBsaW1pdGluZyBzaG91bGQgbm93IGJlIGRpc2FibGVkLgorICAgIGxpbWl0ZXIuc2V0VGFyZ2V0KHBvc2UxKTsKKyAgICBFWFBFQ1RfRVEobGltaXRlci5jYWxjdWxhdGVQb3NlKDEwMDcpLCBwb3NlMSk7Cit9CisKK1RFU1QoUG9zZVJhdGVMaW1pdGVyLCBSZXNldCkgeworICAgIFBvc2UzZiBwb3NlMSh7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpJZGVudGl0eSgpKTsKKyAgICBQb3NlM2YgcG9zZTIoezEsIDIsIDh9LCByb3RhdGVaKE1fUEkgKiA1IC8gOCkpOworICAgIFBvc2VSYXRlTGltaXRlciBsaW1pdGVyKE9wdGlvbnN7Lm1heFRyYW5zbGF0aW9uYWxWZWxvY2l0eSA9IDEsIC5tYXhSb3RhdGlvbmFsVmVsb2NpdHkgPSAxMH0pOworICAgIGxpbWl0ZXIuc2V0VGFyZ2V0KHBvc2UxKTsKKyAgICBFWFBFQ1RfRVEobGltaXRlci5jYWxjdWxhdGVQb3NlKDEwMDApLCBwb3NlMSk7CisKKyAgICAvLyBFbmFibGUgcmF0ZSBsaW1pdGluZyBhbmQgb2JzZXJ2ZSBncmFkdWFsIG1vdGlvbiBmcm9tIHBvc2UxIHRvIHBvc2UyLgorICAgIGxpbWl0ZXIuZW5hYmxlKCk7CisgICAgbGltaXRlci5zZXRUYXJnZXQocG9zZTIpOworICAgIEVYUEVDVF9FUShsaW1pdGVyLmNhbGN1bGF0ZVBvc2UoMTAwMSksIFBvc2UzZih7MSwgMiwgNH0sIHJvdGF0ZVooTV9QSSAqIDEgLyA4KSkpOworCisgICAgLy8gUmVzZXQgdGhlIHBvc2UgYW5kIGRpc2FibGUgcmF0ZSBsaW1pdGluZy4KKyAgICBsaW1pdGVyLnJlc2V0KHBvc2UyKTsKKyAgICBFWFBFQ1RfRVEobGltaXRlci5jYWxjdWxhdGVQb3NlKDEwMDIpLCBwb3NlMik7CisKKyAgICAvLyBSYXRlIGxpbWl0aW5nIHNob3VsZCBub3cgYmUgZGlzYWJsZWQuCisgICAgbGltaXRlci5zZXRUYXJnZXQocG9zZTEpOworICAgIEVYUEVDVF9FUShsaW1pdGVyLmNhbGN1bGF0ZVBvc2UoMTAwMyksIHBvc2UxKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZVJhdGVMaW1pdGVyLmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlUmF0ZUxpbWl0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MGUyMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUG9zZVJhdGVMaW1pdGVyLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKXt9CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJQb3NlUmF0ZUxpbWl0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworUG9zZVJhdGVMaW1pdGVyOjpQb3NlUmF0ZUxpbWl0ZXIoY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgOiBtT3B0aW9ucyhvcHRpb25zKSwgbUxpbWl0aW5nKGZhbHNlKSB7fQorCit2b2lkIFBvc2VSYXRlTGltaXRlcjo6ZW5hYmxlKCkgeworICAgIG1MaW1pdGluZyA9IHRydWU7Cit9CisKK3ZvaWQgUG9zZVJhdGVMaW1pdGVyOjpyZXNldChjb25zdCBQb3NlM2YmIHRhcmdldCkgeworICAgIG1MaW1pdGluZyA9IGZhbHNlOworICAgIG1UYXJnZXRQb3NlID0gdGFyZ2V0OworfQorCit2b2lkIFBvc2VSYXRlTGltaXRlcjo6c2V0VGFyZ2V0KGNvbnN0IFBvc2UzZiYgdGFyZ2V0KSB7CisgICAgbVRhcmdldFBvc2UgPSB0YXJnZXQ7Cit9CisKK1Bvc2UzZiBQb3NlUmF0ZUxpbWl0ZXI6OmNhbGN1bGF0ZVBvc2UoaW50NjRfdCB0aW1lc3RhbXApIHsKKyAgICBhc3NlcnQobVRhcmdldFBvc2UuaGFzX3ZhbHVlKCkpOworICAgIFBvc2UzZiBwb3NlOworICAgIGlmIChtTGltaXRpbmcgJiYgbU91dHB1dC5oYXNfdmFsdWUoKSkgeworICAgICAgICBzdGQ6OnRpZShwb3NlLCBtTGltaXRpbmcpID0gbW92ZVdpdGhSYXRlTGltaXQoCisgICAgICAgICAgICAgICAgbU91dHB1dC0+cG9zZSwgbVRhcmdldFBvc2UudmFsdWUoKSwgdGltZXN0YW1wIC0gbU91dHB1dC0+dGltZXN0YW1wLAorICAgICAgICAgICAgICAgIG1PcHRpb25zLm1heFRyYW5zbGF0aW9uYWxWZWxvY2l0eSwgbU9wdGlvbnMubWF4Um90YXRpb25hbFZlbG9jaXR5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBwb3NlID0gbVRhcmdldFBvc2UudmFsdWUoKTsKKyAgICB9CisgICAgbU91dHB1dCA9IFBvaW50e3Bvc2UsIHRpbWVzdGFtcH07CisgICAgcmV0dXJuIHBvc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlUmF0ZUxpbWl0ZXIuaCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9Qb3NlUmF0ZUxpbWl0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTJmZTgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Bvc2VSYXRlTGltaXRlci5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxvcHRpb25hbD4KKworI2luY2x1ZGUgIm1lZGlhL1Bvc2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworLyoqCisgKiBMaW1pdHMgYSBzdHJlYW0gb2YgcG9zZXMgdG8gYSBnaXZlbiBtYXhpbXVtIHRyYW5zbGF0aW9uYWwgYW5kIHJvdGF0aW9uYWwgdmVsb2NpdGllcy4KKyAqCisgKiBOb3JtYWwgb3BlcmF0aW9uOgorICoKKyAqIFBvc2UzZiBvdXRwdXQ7CisgKiBQb3NlUmF0ZUxpbWl0ZXIgbGltaXRlciguLi4pOworICoKKyAqIC8vIExpbWl0aW5nIGlzIGRpc2FibGVkLiBPdXRwdXQgd2lsbCBiZSB0aGUgc2FtZSBhcyBsYXN0IGlucHV0LgorICogbGltaXRlci5zZXRUYXJnZXQoLi4uKTsKKyAqIG91dHB1dCA9IGxpbWl0ZXIuY2FsY3VsYXRlUG9zZSguLi4pOworICogbGltaXRlci5zZXRUYXJnZXQoLi4uKTsKKyAqIG91dHB1dCA9IGxpbWl0ZXIuY2FsY3VsYXRlUG9zZSguLi4pOworICoKKyAqIC8vIEVuYWJsZSBsaW1pdGluZy4gT3V0cHV0IHdpbGwgbm8gbG9uZ2VyIGJlIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIGxhc3QgaW5wdXQuCisgKiBsaW1pdGVyLmVuYWJsZSgpOworICogbGltaXRlci5zZXRUYXJnZXQoLi4uKTsKKyAqIG91dHB1dCA9IGxpbWl0ZXIuY2FsY3VsYXRlUG9zZSguLi4pOworICogbGltaXRlci5zZXRUYXJnZXQoLi4uKTsKKyAqIG91dHB1dCA9IGxpbWl0ZXIuY2FsY3VsYXRlUG9zZSguLi4pOworICoKKyAqIC8vIFdoZW4gZXZlbnR1YWxseSB0aGUgb3V0cHV0IGhhcyBiZWVuIGFibGUgdG8gY2F0Y2ggdXAgd2l0aCB0aGUgbGFzdCBpbnB1dCwgdGhlIGxpbWl0ZWQgd2lsbCBiZQorICogLy8gYXV0b21hdGljYWxseSBkaXNhYmxlZCBhZ2FpbiBhbmQgdGhlIG91dHB1dCB3aWxsIG1hdGNoIHRoZSBpbnB1dCBhZ2Fpbi4KKyAqIGxpbWl0ZXIuc2V0VGFyZ2V0KC4uLik7CisgKiBvdXRwdXQgPSBsaW1pdGVyLmNhbGN1bGF0ZVBvc2UoLi4uKTsKKyAqCisgKiBBcyBzaG93biBhYm92ZSwgdGhlIGxpbWl0ZXIgaXMgdHVybmVkIG9uIG1hbnVhbGx5IHZpYSBlbmFibGUoKSwgYnV0IHR1cm5zIG9mZiBhdXRvbWF0aWNhbGx5IGFzCisgKiBzb29uIGFzIHRoZSBvdXRwdXQgaXMgYWJsZSB0byBjYXRjaCB1cCB0byB0aGUgaW5wdXQuIFRoZSBpbnRlbnRpb24gaXMgdGhhdCByYXRlIGxpbWl0aW5nIHdpbGwgYmUKKyAqIHR1cm5lZCBvbiBhdCBzcGVjaWZpYyB0aW1lcyB0byBzbW9vdGggb3V0IGFueSBhcnRpZmljaWFsIGRpc2NvbnRpbnVpdGllcyBpbnRyb2R1Y2VkIHRvIHRoZSBwb3NlCisgKiBzdHJlYW0sIGJ1dCB0aGUgcmVzdCBvZiB0aGUgdGltZSB3aWxsIGJlIGEgc2ltcGxlIHBhc3N0aHJvdWdoLgorCisgKiBzZXRUYXJnZXQoLi4uKSBhbmQgY2FsY3VsYXRlUG9zZSguLi4pIGRvbid0IGhhdmUgdG8gYmUgb3JkZXJlZCBpbiBhbnkgcGFydGljdWxhciB3YXkuIEhvd2V2ZXIsCisgKiBzZXRUYXJnZXQgb3IgcmVzZXQoKSBtdXN0IGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIHByaW9yIHRvIHRoZSBmaXJzdCBjYWxjdWxhdGVQb3NlKCkuCisgKgorICogQ2FsbGluZyByZXNldCgpIGluc3RlYWQgb2Ygc2V0VGFyZ2V0KCkgZm9yY2VzIHRoZSBvdXRwdXQgdG8gdGhlIGdpdmVuIHBvc2UgYW5kIGRpc2FibGVzIHJhdGUKKyAqIGxpbWl0aW5nLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdGhyZWFkLWNvbXBhdGlibGUsIGJ1dCBub3QgdGhyZWFkLXNhZmUuCisgKi8KK2NsYXNzIFBvc2VSYXRlTGltaXRlciB7CisgIHB1YmxpYzoKKyAgICBzdHJ1Y3QgT3B0aW9ucyB7CisgICAgICAgIGZsb2F0IG1heFRyYW5zbGF0aW9uYWxWZWxvY2l0eSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICAgICAgICBmbG9hdCBtYXhSb3RhdGlvbmFsVmVsb2NpdHkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgICB9OworCisgICAgZXhwbGljaXQgUG9zZVJhdGVMaW1pdGVyKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworCisgICAgdm9pZCBlbmFibGUoKTsKKworICAgIHZvaWQgcmVzZXQoY29uc3QgUG9zZTNmJiB0YXJnZXQpOworICAgIHZvaWQgc2V0VGFyZ2V0KGNvbnN0IFBvc2UzZiYgdGFyZ2V0KTsKKworICAgIFBvc2UzZiBjYWxjdWxhdGVQb3NlKGludDY0X3QgdGltZXN0YW1wKTsKKworICBwcml2YXRlOgorICAgIHN0cnVjdCBQb2ludCB7CisgICAgICAgIFBvc2UzZiBwb3NlOworICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcDsKKyAgICB9OworCisgICAgY29uc3QgT3B0aW9ucyBtT3B0aW9uczsKKyAgICBib29sIG1MaW1pdGluZzsKKyAgICBzdGQ6Om9wdGlvbmFsPFBvc2UzZj4gbVRhcmdldFBvc2U7CisgICAgc3RkOjpvcHRpb25hbDxQb2ludD4gbU91dHB1dDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9RdWF0ZXJuaW9uVXRpbC10ZXN0LmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9RdWF0ZXJuaW9uVXRpbC10ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzllNTRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1F1YXRlcm5pb25VdGlsLXRlc3QuY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIlF1YXRlcm5pb25VdGlsLmgiCisjaW5jbHVkZSAiVGVzdFV0aWwuaCIKKwordXNpbmcgRWlnZW46OlF1YXRlcm5pb25mOwordXNpbmcgRWlnZW46OlZlY3RvcjNmOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHsKKworVEVTVChRdWF0ZXJuaW9uVXRpbCwgUm90YXRpb25WZWN0b3JUb1F1YXRlcm5pb24pIHsKKyAgICAvLyA5MCBkZWdyZWVzIGFyb3VuZCBaLgorICAgIFZlY3RvcjNmIHJvdCA9IHswLCAwLCBNX1BJXzJ9OworICAgIFF1YXRlcm5pb25mIHF1YXQgPSByb3RhdGlvblZlY3RvclRvUXVhdGVybmlvbihyb3QpOworICAgIEFTU0VSVF9FUShxdWF0ICogVmVjdG9yM2YoMSwgMCwgMCksIFZlY3RvcjNmKDAsIDEsIDApKTsKKyAgICBBU1NFUlRfRVEocXVhdCAqIFZlY3RvcjNmKDAsIDEsIDApLCBWZWN0b3IzZigtMSwgMCwgMCkpOworICAgIEFTU0VSVF9FUShxdWF0ICogVmVjdG9yM2YoMCwgMCwgMSksIFZlY3RvcjNmKDAsIDAsIDEpKTsKK30KKworVEVTVChRdWF0ZXJuaW9uVXRpbCwgUXVhdGVybmlvblRvUm90YXRpb25WZWN0b3IpIHsKKyAgICBRdWF0ZXJuaW9uZiBxdWF0ID0gUXVhdGVybmlvbmY6OkZyb21Ud29WZWN0b3JzKFZlY3RvcjNmKDEsIDAsIDApLCBWZWN0b3IzZigwLCAxLCAwKSk7CisgICAgVmVjdG9yM2Ygcm90ID0gcXVhdGVybmlvblRvUm90YXRpb25WZWN0b3IocXVhdCk7CisgICAgQVNTRVJUX0VRKHJvdCwgVmVjdG9yM2YoMCwgMCwgTV9QSV8yKSk7Cit9CisKK1RFU1QoUXVhdGVybmlvblV0aWwsIFJvdW5kVHJpcEZyb21RdWF0ZXJuaW9uKSB7CisgICAgUXVhdGVybmlvbmYgcXVhdGVybmlvbiA9IFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCk7CisgICAgRVhQRUNUX0VRKHF1YXRlcm5pb24sIHJvdGF0aW9uVmVjdG9yVG9RdWF0ZXJuaW9uKHF1YXRlcm5pb25Ub1JvdGF0aW9uVmVjdG9yKHF1YXRlcm5pb24pKSk7Cit9CisKK1RFU1QoUXVhdGVybmlvblV0aWwsIFJvdW5kVHJpcEZyb21WZWN0b3IpIHsKKyAgICBWZWN0b3IzZiB2ZWN7MC4xLCAwLjIsIDAuM307CisgICAgRVhQRUNUX0VRKHZlYywgcXVhdGVybmlvblRvUm90YXRpb25WZWN0b3Iocm90YXRpb25WZWN0b3JUb1F1YXRlcm5pb24odmVjKSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9RdWF0ZXJuaW9uVXRpbC5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUXVhdGVybmlvblV0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMDkwZGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUXVhdGVybmlvblV0aWwuY3BwCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlF1YXRlcm5pb25VdGlsLmgiCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCit1c2luZyBFaWdlbjo6TnVtVHJhaXRzOwordXNpbmcgRWlnZW46OlF1YXRlcm5pb25mOwordXNpbmcgRWlnZW46OlZlY3RvcjNmOworCituYW1lc3BhY2UgeworCitWZWN0b3IzZiBMb2dTVTIoY29uc3QgUXVhdGVybmlvbmYmIHEpIHsKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgbG9nYXJpdGhtaWMgbWFwIG9mIFNVKDIpIHVzaW5nIGF0YW4uCisgICAgLy8gVGhpcyBmb2xsb3dzIEhlcnR6YmVyZyBldCBhbC4gIkludGVncmF0aW5nIEdlbmVyaWMgU2Vuc29yIEZ1c2lvbiBBbGdvcml0aG1zCisgICAgLy8gd2l0aCBTb3VuZCBTdGF0ZSBSZXByZXNlbnRhdGlvbnMgdGhyb3VnaCBFbmNhcHN1bGF0aW9uIG9mIE1hbmlmb2xkcyIsIEVxLgorICAgIC8vICgzMSkKKyAgICAvLyBXZSB1c2UgYXNpbiBhbmQgYWNvcyBpbnN0ZWFkIG9mIGF0YW4gdG8gZW5hYmxlIHRoZSB1c2Ugb2YgRWlnZW4gQXV0b2RpZmYKKyAgICAvLyB3aXRoIFNVMi4KKyAgICBjb25zdCBmbG9hdCBzaWduX29mX3cgPSBxLncoKSA8IDAuZiA/IC0xLmYgOiAxLmY7CisgICAgY29uc3QgZmxvYXQgYWJzX3cgPSBzaWduX29mX3cgKiBxLncoKTsKKyAgICBjb25zdCBWZWN0b3IzZiB2ID0gc2lnbl9vZl93ICogcS52ZWMoKTsKKyAgICBjb25zdCBmbG9hdCBzcXVhcmVkX25vcm1fb2ZfdiA9IHYuc3F1YXJlZE5vcm0oKTsKKworICAgIGFzc2VydChhYnMoMS5mIC0gYWJzX3cgKiBhYnNfdyAtIHNxdWFyZWRfbm9ybV9vZl92KSA8IE51bVRyYWl0czxmbG9hdD46OmR1bW15X3ByZWNpc2lvbigpKTsKKworICAgIGlmIChzcXVhcmVkX25vcm1fb2ZfdiA+IE51bVRyYWl0czxmbG9hdD46OmR1bW15X3ByZWNpc2lvbigpKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IG5vcm1fb2ZfdiA9IHNxcnQoc3F1YXJlZF9ub3JtX29mX3YpOworICAgICAgICBpZiAoYWJzX3cgPiBOdW1UcmFpdHM8ZmxvYXQ+OjpkdW1teV9wcmVjaXNpb24oKSkgeworICAgICAgICAgICAgLy8gYXNpbih4KSA9IGFjb3MoeCkgYXQgeCA9IDEvc3FydCgyKS4KKyAgICAgICAgICAgIGlmIChub3JtX29mX3YgPD0gZmxvYXQoTV9TUVJUMV8yKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoYXNpbihub3JtX29mX3YpIC8gbm9ybV9vZl92KSAqIHY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKGFjb3MoYWJzX3cpIC8gbm9ybV9vZl92KSAqIHY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChNX1BJXzIgLyBub3JtX29mX3YpICogdjsKKyAgICB9CisKKyAgICAvLyBUYXlsb3IgZXhwYW5zaW9uIGF0IHNxdWFyZWRfbm9ybV9vZl92ID09IDAKKyAgICByZXR1cm4gKDEuZiAvIGFic193IC0gc3F1YXJlZF9ub3JtX29mX3YgLyAoMy5mICogcG93KGFic193LCAzKSkpICogdjsKK30KKworUXVhdGVybmlvbmYgRXhwU1UyKGNvbnN0IFZlY3RvcjNmJiBkZWx0YSkgeworICAgIFF1YXRlcm5pb25mIHFfZGVsdGE7CisgICAgY29uc3QgZmxvYXQgdGhldGFfc3F1YXJlZCA9IGRlbHRhLnNxdWFyZWROb3JtKCk7CisgICAgaWYgKHRoZXRhX3NxdWFyZWQgPiBOdW1UcmFpdHM8ZmxvYXQ+OjpkdW1teV9wcmVjaXNpb24oKSkgeworICAgICAgICBjb25zdCBmbG9hdCB0aGV0YSA9IHNxcnQodGhldGFfc3F1YXJlZCk7CisgICAgICAgIHFfZGVsdGEudygpID0gY29zKHRoZXRhKTsKKyAgICAgICAgcV9kZWx0YS52ZWMoKSA9IChzaW4odGhldGEpIC8gdGhldGEpICogZGVsdGE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gdGF5bG9yIGV4cGFuc2lvbnMgYXJvdW5kIHRoZXRhID09IDAKKyAgICAgICAgcV9kZWx0YS53KCkgPSAxLmYgLSAwLjVmICogdGhldGFfc3F1YXJlZDsKKyAgICAgICAgcV9kZWx0YS52ZWMoKSA9ICgxLmYgLSAxLmYgLyA2LmYgKiB0aGV0YV9zcXVhcmVkKSAqIGRlbHRhOworICAgIH0KKyAgICByZXR1cm4gcV9kZWx0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK1F1YXRlcm5pb25mIHJvdGF0aW9uVmVjdG9yVG9RdWF0ZXJuaW9uKGNvbnN0IFZlY3RvcjNmJiByb3RhdGlvblZlY3RvcikgeworICAgIC8vICBTVSgyKSBpcyBhIGRvdWJsZSBjb3ZlciBvZiBTTygzKSwgdGh1cyB3ZSBoYXZlIHRvIGhhbGYgdGhlIHRhbmdlbnQgdmVjdG9yCisgICAgLy8gIGRlbHRhCisgICAgY29uc3QgVmVjdG9yM2YgaGFsZl9kZWx0YSA9IDAuNWYgKiByb3RhdGlvblZlY3RvcjsKKyAgICByZXR1cm4gRXhwU1UyKGhhbGZfZGVsdGEpOworfQorCitWZWN0b3IzZiBxdWF0ZXJuaW9uVG9Sb3RhdGlvblZlY3Rvcihjb25zdCBRdWF0ZXJuaW9uZiYgcXVhdGVybmlvbikgeworICAgIC8vIFNVKDIpIGlzIGEgZG91YmxlIGNvdmVyIG9mIFNPKDMpLCB0aHVzIHdlIGhhdmUgdG8gbXVsdGlwbHkgdGhlIHRhbmdlbnQKKyAgICAvLyB2ZWN0b3IgZGVsdGEgYnkgdHdvCisgICAgcmV0dXJuIDIuZiAqIExvZ1NVMihxdWF0ZXJuaW9uKTsKK30KKworUXVhdGVybmlvbmYgcm90YXRlWChmbG9hdCBhbmdsZSkgeworICAgIHJldHVybiByb3RhdGlvblZlY3RvclRvUXVhdGVybmlvbihWZWN0b3IzZigxLCAwLCAwKSAqIGFuZ2xlKTsKK30KKworUXVhdGVybmlvbmYgcm90YXRlWShmbG9hdCBhbmdsZSkgeworICAgIHJldHVybiByb3RhdGlvblZlY3RvclRvUXVhdGVybmlvbihWZWN0b3IzZigwLCAxLCAwKSAqIGFuZ2xlKTsKK30KKworUXVhdGVybmlvbmYgcm90YXRlWihmbG9hdCBhbmdsZSkgeworICAgIHJldHVybiByb3RhdGlvblZlY3RvclRvUXVhdGVybmlvbihWZWN0b3IzZigwLCAwLCAxKSAqIGFuZ2xlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1F1YXRlcm5pb25VdGlsLmggYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUXVhdGVybmlvblV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2EyY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1F1YXRlcm5pb25VdGlsLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCisvKioKKyAqIENvbnZlcnRzIGEgcm90YXRpb24gdmVjdG9yIHRvIGFuIGVxdWl2YWxlbnQgcXVhdGVybmlvbi4KKyAqIFRoZSByb3RhdGlvbiB2ZWN0b3IgaXMgZ2l2ZW4gYXMgYSAzLXZlY3RvciB3aG9zZSBkaXJlY3Rpb24gcmVwcmVzZW50cyB0aGUgcm90YXRpb24gYXhpcyBhbmQgaXRzCisgKiBtYWduaXR1ZGUgdGhlIHJvdGF0aW9uIGFuZ2xlIChpbiByYWRpYW5zKSBhcm91bmQgdGhhdCBheGlzLgorICovCitFaWdlbjo6UXVhdGVybmlvbmYgcm90YXRpb25WZWN0b3JUb1F1YXRlcm5pb24oY29uc3QgRWlnZW46OlZlY3RvcjNmJiByb3RhdGlvblZlY3Rvcik7CisKKy8qKgorICogQ29udmVydHMgYSBxdWF0ZXJuaW9uIHRvIGFuIGVxdWl2YWxlbnQgcm90YXRpb24gdmVjdG9yLgorICogVGhlIHJvdGF0aW9uIHZlY3RvciBpcyBnaXZlbiBhcyBhIDMtdmVjdG9yIHdob3NlIGRpcmVjdGlvbiByZXByZXNlbnRzIHRoZSByb3RhdGlvbiBheGlzIGFuZCBpdHMKKyAqIG1hZ25pdHVkZSB0aGUgcm90YXRpb24gYW5nbGUgKGluIHJhZGlhbnMpIGFyb3VuZCB0aGF0IGF4aXMuCisgKi8KK0VpZ2VuOjpWZWN0b3IzZiBxdWF0ZXJuaW9uVG9Sb3RhdGlvblZlY3Rvcihjb25zdCBFaWdlbjo6UXVhdGVybmlvbmYmIHF1YXRlcm5pb24pOworCisvKioKKyAqIFJldHVybnMgYSBxdWF0ZXJuaW9uIHJlcHJlc2VudGluZyBhIHJvdGF0aW9uIGFyb3VuZCB0aGUgWC1heGlzIHdpdGggdGhlIGdpdmVuIGFtb3VudCAoaW4KKyAqIHJhZGlhbnMpLgorICovCitFaWdlbjo6UXVhdGVybmlvbmYgcm90YXRlWChmbG9hdCBhbmdsZSk7CisKKy8qKgorICogUmV0dXJucyBhIHF1YXRlcm5pb24gcmVwcmVzZW50aW5nIGEgcm90YXRpb24gYXJvdW5kIHRoZSBZLWF4aXMgd2l0aCB0aGUgZ2l2ZW4gYW1vdW50IChpbgorICogcmFkaWFucykuCisgKi8KK0VpZ2VuOjpRdWF0ZXJuaW9uZiByb3RhdGVZKGZsb2F0IGFuZ2xlKTsKKworLyoqCisgKiBSZXR1cm5zIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgYSByb3RhdGlvbiBhcm91bmQgdGhlIFotYXhpcyB3aXRoIHRoZSBnaXZlbiBhbW91bnQgKGluCisgKiByYWRpYW5zKS4KKyAqLworRWlnZW46OlF1YXRlcm5pb25mIHJvdGF0ZVooZmxvYXQgYW5nbGUpOworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvUkVBRE1FLm1kIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGY3YmIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1JFQURNRS5tZApAQCAtMCwwICsxLDE4NyBAQAorIyBIZWFkLVRyYWNraW5nIExpYnJhcnkgRm9yIEltbWVyc2l2ZSBBdWRpbworCitUaGlzIGxpYnJhcnkgaGFuZGxlcyB0aGUgcHJvY2Vzc2luZyBvZiBoZWFkLXRyYWNraW5nIGluZm9ybWF0aW9uLCBuZWNlc3NhcnkgZm9yCitJbW1lcnNpdmUgQXVkaW8gZnVuY3Rpb25hbGl0eS4gSXQgZ29lcyBmcm9tIGJhcmUgc2Vuc29yIHJlYWRpbmcgaW50byB0aGUgZmluYWwKK3Bvc2UgZmVkIGludG8gYSB2aXJ0dWFsaXplci4KKworIyMgQmFzaWMgVXNhZ2UKKworVGhlIG1haW4gZW50cnkgcG9pbnQgaW50byB0aGlzIGxpYnJhcnkgaXMgdGhlIGBIZWFkVHJhY2tpbmdQcm9jZXNzb3JgIGNsYXNzLgorVGhpcyBjbGFzcyBpcyBwcm92aWRlZCB3aXRoIHRoZSBmb2xsb3dpbmcgaW5wdXRzOgorCistIEhlYWQgcG9zZSwgcmVsYXRpdmUgdG8gc29tZSBhcmJpdHJhcnkgd29ybGQgZnJhbWUuCistIFNjcmVlbiBwb3NlLCByZWxhdGl2ZSB0byBzb21lIGFyYml0cmFyeSB3b3JsZCBmcmFtZS4KKy0gRGlzcGxheSBvcmllbnRhdGlvbiwgZGVmaW5lZCBhcyB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgInBoeXNpY2FsIiBzY3JlZW4gYW5kCisgIHRoZSAibG9naWNhbCIgc2NyZWVuLgorLSBUcmFuc2Zvcm0gYmV0d2VlbiB0aGUgc2NyZWVuIGFuZCB0aGUgc291bmQgc3RhZ2UuCistIERlc2lyZWQgb3BlcmF0aW9uYWwgbW9kZToKKyAgICAtIFN0YXRpYzogb25seSB0aGUgc291bmQgc3RhZ2UgcG9zZSBpcyB0YWtlbiBpbnRvIGFjY291bnQuIFRoaXMgd2lsbCByZXN1bHQKKyAgICAgIGluIGFuIGV4cGVyaWVuY2Ugd2hlcmUgdGhlIHNvdW5kIHN0YWdlIG1vdmVkIHdpdGggdGhlIGxpc3RlbmVyJ3MgaGVhZC4KKyAgICAtIFdvcmxkLXJlbGF0aXZlOiBib3RoIHRoZSBoZWFkIHBvc2UgYW5kIHN0YWdlIHBvc2UgYXJlIHRha2VuIGludG8gYWNjb3VudC4KKyAgICAgIFRoaXMgd2lsbCByZXN1bHQgaW4gYW4gZXhwZXJpZW5jZSB3aGVyZSB0aGUgc291bmQgc3RhZ2UgaXMgcGVyY2VpdmVkIHRvIGJlCisgICAgICBsb2NhdGVkIGF0IGEgZml4ZWQgcGxhY2UgaW4gdGhlIHdvcmxkLgorICAgIC0gU2NyZWVuLXJlbGF0aXZlOiB0aGUgaGVhZCBwb3NlLCBzY3JlZW4gcG9zZSBhbmQgc3RhZ2UgcG9zZSBhcmUgYWxsIHRha2VuCisgICAgICBpbnRvIGFjY291bnQuIFRoaXMgd2lsbCByZXN1bHQgaW4gYW4gZXhwZXJpZW5jZSB3aGVyZSB0aGUgc291bmQgc3RhZ2UgaXMKKyAgICAgIHBlcmNlaXZlZCB0byBiZSBsb2NhdGVkIGF0IGEgZml4ZWQgcGxhY2UgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbi4KKworT25jZSBpbnB1dHMgYXJlIHByb3ZpZGVkLCB0aGUgYGNhbGN1bGF0ZSgpYCBtZXRob2Qgd2lsbCBtYWtlIHRoZSBmb2xsb3dpbmcKK291dHB1dCBhdmFpbGFibGU6CisKKy0gU3RhZ2UgcG9zZSwgcmVsYXRpdmUgdG8gdGhlIGhlYWQuIFRoaXMgYWdncmVnYXRlcyBhbGwgdGhlIGlucHV0cyBtZW50aW9uZWQKKyAgYWJvdmUgYW5kIGlzIHJlYWR5IHRvIGJlIGZlZCBpbnRvIGEgdmlydHVhbGl6ZXIuCistIEFjdHVhbCBvcGVyYXRpb25hbCBtb2RlLiBNYXkgZGV2aWF0ZSBmcm9tIHRoZSBkZXNpcmVkIG9uZSBpbiBjYXNlcyB3aGVyZSB0aGUKKyAgZGVzaXJlZCBtb2RlIGNhbm5vdCBiZSBjYWxjdWxhdGVkIChmb3IgZXhhbXBsZSwgYXMgcmVzdWx0IG9mIGRyb3BwZWQgbWVzc2FnZXMKKyAgZnJvbSBvbmUgb2YgdGhlIHNlbnNvcnMpLgorCitBIGByZWNlbnRlcigpYCBvcGVyYXRpb24gaXMgYWxzbyBhdmFpbGFibGUsIHdoaWNoIGluZGljYXRlcyB0byB0aGUgc3lzdGVtIHRoYXQKK3doYXRldmVyIHBvc2UgdGhlIHNjcmVlbiBhbmQgaGVhZCBhcmUgY3VycmVudGx5IGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIHRoZQorImNlbnRlciIgcG9zZSwgb3IgZnJhbWUgb2YgcmVmZXJlbmNlLgorCisjIyBQb3NlLVJlbGF0ZWQgQ29udmVudGlvbnMKKworIyMjIE5hbWluZyBhbmQgQ29tcG9zaXRpb24KKworV2hlbiByZWZlcnJpbmcgdG8gcG9zZXMgaW4gY29kZSwgaXQgaXMgYWx3YXlzIGdvb2QgcHJhY3RpY2UgdG8gZm9sbG93Citjb252ZW50aW9uYWwgbmFtaW5nLCB3aGljaCBoaWdobGlnaHRzIHRoZSByZWZlcmVuY2UgYW5kIHRhcmdldCBmcmFtZXMgY2xlYXJseToKKworQmFkOgorCitgYGAKK1Bvc2UzZiBoZWFkUG9zZTsKK2BgYAorCitHb29kOgorCitgYGAKK1Bvc2UzZiB3b3JsZFRvSGVhZDsgIC8vIOKAnHdvcmxk4oCdIGlzIHRoZSByZWZlcmVuY2UgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAvLyDigJxoZWFk4oCdIGlzIHRoZSB0YXJnZXQgZnJhbWUuCitgYGAKKworQnkgZm9sbG93aW5nIHRoaXMgY29udmVudGlvbiwgaXQgaXMgZWFzeSB0byBmb2xsb3cgY29ycmVjdCBjb21wb3NpdGlvbiBvZiBwb3NlcywKK2J5IG1ha2luZyBzdXJlIGFkamFjZW50IGZyYW1lcyBhcmUgaWRlbnRpY2FsOgorCitgYGAKK1Bvc2UzZiBhVG9EID0gYVRvQiAqIGJUb0MgKiBjVG9EOworYGBgCisKK0FuZCBzaW1pbGFybHksIGludmVydGluZyB0aGUgdHJhbnNmb3JtIHNpbXBseSBmbGlwcyB0aGUgcmVmZXJlbmNlIGFuZCB0YXJnZXQ6CisKK2BgYAorUG9zZTNmIGFUb0IgPSBiVG9BLmludmVyc2UoKTsKK2BgYAorCisjIyMgVHdpc3QKKwor4oCcVHdpc3TigJ0gaXMgdG8gcG9zZSB3aGF0IHZlbG9jaXR5IGlzIHRvIGRpc3RhbmNlOiBpdCBpcyB0aGUgdGltZS1kZXJpdmF0aXZlIG9mIGEKK3Bvc2UsIHJlcHJlc2VudGluZyB0aGUgY2hhbmdlIGluIHBvc2Ugb3ZlciBhIHNob3J0IHBlcmlvZCBvZiB0aW1lLiBJdHMgbmFtaW5nCitjb252ZW50aW9uIGFsd2F5cyBzdGF0ZXMgb25lIGZyYW1lLCBlLmcuOgorVHdpc3QzZiBoZWFkVHdpc3Q7CisKK1RoaXMgbWVhbnMgdGhhdCB0aGlzIHR3aXN0IHJlcHJlc2VudHMgdGhlIGhlYWQtYXQtdGltZS1UIHRvIGhlYWQtYXQtdGltZS1UK2R0Cit0cmFuc2Zvcm0uIFR3aXN0cyBhcmUgbm90IGNvbXBvc2FibGUgaW4gdGhlIHNhbWUgd2F5IGFzIHBvc2VzLgorCisjIyMgRnJhbWVzIG9mIEludGVyZXN0CisKK1RoZSBmcmFtZXMgb2YgaW50ZXJlc3QgaW4gdGhpcyBsaWJyYXJ5IGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6CisKKyMjIyMgSGVhZAorCitUaGlzIGlzIHRoZSBsaXN0ZW5lcuKAmXMgaGVhZC4gVGhlIG9yaWdpbiBpcyBhdCB0aGUgY2VudGVyIHBvaW50IGJldHdlZW4gdGhlCitlYXItZHJ1bXMsIHRoZSBYLWF4aXMgZ29lcyBmcm9tIGxlZnQgZWFyIHRvIHJpZ2h0IGVhciwgWS1heGlzIGdvZXMgZnJvbSB0aGUgYmFjaworb2YgdGhlIGhlYWQgdG93YXJkcyB0aGUgZmFjZSBhbmQgWi1heGlzIGdvZXMgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBoZWFkIHRvIHRoZQordG9wLgorCisjIyMjIFNjcmVlbgorCitUaGlzIGlzIHRoZSBwcmltYXJ5IHNjcmVlbiB0aGF0IHRoZSB1c2VyIHdpbGwgYmUgbG9va2luZyBhdCwgd2hpY2ggaXMgcmVsZXZhbnQKK2ZvciBzb21lIEltbWVyc2l2ZSBBdWRpbyB1c2UtY2FzZXMsIHN1Y2ggYXMgd2F0Y2hpbmcgYSBtb3ZpZS4gV2Ugd2lsbCBmb2xsb3cgYQorZGlmZmVyZW50IGNvbnZlbnRpb24gZm9yIHRoaXMgZnJhbWUgdGhhbiB3aGF0IHRoZSBTZW5zb3IgZnJhbWV3b3JrIHVzZXMuIFRoZQorb3JpZ2luIGlzIGF0IHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4gWC1heGlzIGdvZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0LCBaLWF4aXMKK2dvZXMgZnJvbSB0aGUgc2NyZWVuIGJvdHRvbSB0byB0aGUgc2NyZWVuIHRvcCwgWS1heGlzIGdvZXMg4oCcaW50b+KAnSB0aGUgc2NyZWVuICgKK2Zyb20gdGhlIGRpcmVjdGlvbiBvZiB0aGUgdmlld2VyKS4gVGhlIHVwL2Rvd24vbGVmdC9yaWdodCBvZiB0aGUgc2NyZWVuIGFyZQorZGVmaW5lZCBhcyB0aGUgbG9naWNhbCBkaXJlY3Rpb25zIHVzZWQgZm9yIGRpc3BsYXkuIFNvIHdoZW4gZmxpcHBpbmcgdGhlIGRpc3BsYXkKK29yaWVudGF0aW9uIGJldHdlZW4g4oCcbGFuZHNjYXBl4oCdIGFuZCDigJxwb3J0cmFpdOKAnSwgdGhlIGZyYW1lIG9mIHJlZmVyZW5jZSB3aWxsCitjaGFuZ2Ugd2l0aCByZXNwZWN0IHRvIHRoZSBwaHlzaWNhbCBzY3JlZW4uCisKKyMjIyMgU3RhZ2UKKworVGhpcyBpcyB0aGUgZnJhbWUgb2YgcmVmZXJlbmNlIHVzZWQgYnkgdGhlIHZpcnR1YWxpemVyIGZvciBwb3NpdGlvbmluZyBzb3VuZAorb2JqZWN0cy4gSXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgcGh5c2ljYWwgZnJhbWUuIEluIGEgdHlwaWNhbAorbXVsdGktY2hhbm5lbCBzY2VuYXJpbywgdGhlIGxpc3RlbmVyIGlzIGF0IHRoZSBvcmlnaW4sIHRoZSBYLWF4aXMgZ29lcyBmcm9tIGxlZnQKK3RvIHJpZ2h0LCBZLWF4aXMgZnJvbSBiYWNrIHRvIGZyb250IGFuZCBaLWF4aXMgZnJvbSBkb3duIHRvIHVwLiBGb3IgZXhhbXBsZSwgYQorZnJvbnQtcmlnaHQgc3BlYWtlciBpcyBsb2NhdGVkIGF0IHBvc2l0aXZlIFgsIFkgYW5kIFo9MCwgYSBoZWlnaHQgc3BlYWtlciB3aWxsCitoYXZlIGEgcG9zaXRpdmUgWi4KKworIyMjIyBXb3JsZAorCitJdCBpcyBzb21ldGltZXMgY29udmVuaWVudCB0byB1c2UgYW4gaW50ZXJtZWRpYXRlIGZyYW1lIHdoZW4gZGVhbGluZyB3aXRoCitoZWFkLXRvLXNjcmVlbiB0cmFuc2Zvcm1zLiBUaGUg4oCcd29ybGTigJ0gZnJhbWUgaXMgYSBmcmFtZSBvZiByZWZlcmVuY2UgaW4gdGhlCitwaHlzaWNhbCB3b3JsZCwgcmVsYXRpdmUgdG8gd2hpY2ggd2UgY2FuIG1lYXN1cmUgdGhlIGhlYWQgcG9zZSBhbmQgc2NyZWVuIHBvc2UuCitJdCBpcyBhcmJpdHJhcnksIGJ1dCBleHBlY3RlZCB0byBiZSBzdGFibGUgKGZpeGVkKS4KKworIyMgUHJvY2Vzc2luZyBEZXNjcmlwdGlvbgorCishW1Bvc2UgcHJvY2Vzc2luZyBncmFwaF0oUG9zZVByb2Nlc3NpbmdHcmFwaC5wbmcpCisKK1RoZSBkaWFncmFtIGFib3ZlIGlsbHVzdHJhdGVzIHRoZSBwcm9jZXNzaW5nIHRoYXQgdGFrZXMgcGxhY2UgZnJvbSB0aGUgaW5wdXRzIHRvCit0aGUgb3V0cHV0cy4KKworIyMjIFByZWRpY3RvcgorCitUaGUgUHJlZGljdG9yIGJsb2NrIGdldHMgcG9zZSArIHR3aXN0IChwb3NlIGRlcml2YXRpdmUpIGFuZCBleHRyYXBvbGF0ZXMgdG8KK29idGFpbiBhIHByZWRpY3RlZCBoZWFkIHBvc2UgKHcvIGdpdmVuIGxhdGVuY3kpLgorCisjIyMgQmlhcworCitUaGUgQmlhcyBibG9ja3MgZXN0YWJsaXNoIHRoZSByZWZlcmVuY2UgZnJhbWUgZm9yIHRoZSBwb3NlcyBieSBoYXZpbmcgdGhlCithYmlsaXR5IHRvIHNldCB0aGUgY3VycmVudCBwb3NlIGFzIHRoZSByZWZlcmVuY2UgZm9yIGZ1dHVyZSBwb3NlcyAocmVjZW50ZXJpbmcpLgorCisjIyMgT3JpZW50YXRpb24gQ29tcGVuc2F0aW9uCisKK1RoZSBPcmllbnRhdGlvbiBDb21wZW5zYXRpb24gYmxvY2sgYXBwbGllcyB0aGUgZGlzcGxheSBvcmllbnRhdGlvbiB0byB0aGUgc2NyZWVuCitwb3NlIHRvIG9idGFpbiB0aGUgcG9zZSBvZiB0aGUg4oCcbG9naWNhbCBzY3JlZW7igJ0gZnJhbWUsIGluIHdoaWNoIHRoZSBZLWF4aXMgaXMKK3BvaW50aW5nIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGxvZ2ljYWwgc2NyZWVuIOKAnHVw4oCdIHJhdGhlciB0aGFuIHRoZSBwaHlzaWNhbAorb25lLgorCisjIyMgU2NyZWVuLVJlbGF0aXZlIFBvc2UKKworVGhlIFNjcmVlbi1SZWxhdGl2ZSBQb3NlIGJsb2NrIGlzIHByb3ZpZGVkIHdpdGggYSBoZWFkIHBvc2UgYW5kIGEgc2NyZWVuIHBvc2UKK2FuZCBlc3RpbWF0ZXMgdGhlIHBvc2Ugb2YgdGhlIGhlYWQgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbi4gT3B0aW9uYWxseSwgdGhpcworbW9kdWxlIG1heSBpbmRpY2F0ZSB0aGF0IHRoZSB1c2VyIGlzIGxpa2VseSBub3QgaW4gZnJvbnQgb2YgdGhlIHNjcmVlbiB2aWEgdGhlCivigJx2YWxpZOKAnSBvdXRwdXQuCisKKyMjIyBTdGlsbG5lc3MgRGV0ZWN0b3IKKworVGhlIHN0aWxsbmVzcyBkZXRlY3RvciBibG9ja3MgZGV0ZWN0IHdoZW4gdGhlaXIgaW5jb21pbmcgcG9zZSBzdHJlYW0gaGFzIGJlZW4KK3N0YWJsZSBmb3IgYSBnaXZlbiBhbW91bnQgb2YgdGltZSAoYWxsb3dpbmcgZm9yIGEgY29uZmlndXJhYmxlIGFtb3VudCBvZiBlcnJvcikuCitXaGVuIHRoZSBoZWFkIGlzIGNvbnNpZGVyZWQgc3RpbGwsIHdlIHdvdWxkIHRyaWdnZXIgYSByZWNlbnRlciBvcGVyYXRpb24KKyjigJxhdXRvLXJlY2VudGVyaW5n4oCdKSBhbmQgd2hlbiB0aGUgc2NyZWVuIGlzIGNvbnNpZGVyZWQgbm90IHN0aWxsLCB0aGUgbW9kZQorc2VsZWN0b3Igd291bGQgdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gZm9yY2Ugc3RhdGljIG1vZGUuCisKKyMjIyBNb2RlIFNlbGVjdG9yCisKK1RoZSBNb2RlIFNlbGVjdG9yIGJsb2NrIGFnZ3JlZ2F0ZXMgdGhlIHZhcmlvdXMgc291cmNlcyBvZiBwb3NlIGluZm9ybWF0aW9uIGludG8KK2EgaGVhZC10by1zdGFnZSBwb3NlIHRoYXQgaXMgZ29pbmcgdG8gZmVlZCB0aGUgdmlydHVhbGl6ZXIuIEl0IGlzIGNvbnRyb2xsZWQgYnkKK3RoZSDigJxkZXNpcmVkIG1vZGXigJ0gc2lnbmFsIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHByZWZlcmVuY2UgaXMgdG8gYmUgaW4KK2VpdGhlciBzdGF0aWMsIHdvcmxkLXJlbGF0aXZlIG9yIHNjcmVlbi1yZWxhdGl2ZS4KKworVGhlIGFjdHVhbCBtb2RlIG1heSBkaXZlcmdlIGZyb20gdGhlIGRlc2lyZWQgbW9kZS4gSXQgaXMgZGV0ZXJtaW5lZCBhcyBmb2xsb3dzOgorCistIElmIHRoZSBkZXNpcmVkIG1vZGUgaXMgc3RhdGljLCB0aGUgYWN0dWFsIG1vZGUgaXMgc3RhdGljLgorLSBJZiB0aGUgZGVzaXJlZCBtb2RlIGlzIHdvcmxkLXJlbGF0aXZlOgorICAgIC0gSWYgaGVhZCBhbmQgc2NyZWVuIHBvc2VzIGFyZSBmcmVzaCBhbmQgdGhlIHNjcmVlbiBpcyBzdGFibGUgKHN0aWxsbmVzcworICAgICAgZGV0ZWN0b3Igb3V0cHV0IGlzIHRydWUpLCB0aGUgYWN0dWFsIG1vZGUgaXMgd29ybGQtcmVsYXRpdmUuCisgICAgLSBPdGhlcndpc2UgdGhlIGFjdHVhbCBtb2RlIGlzIHN0YXRpYy4KKy0gSWYgdGhlIGRlc2lyZWQgbW9kZSBpcyBzY3JlZW4tcmVsYXRpdmU6CisgICAgLSBJZiBoZWFkIGFuZCBzY3JlZW4gcG9zZXMgYXJlIGZyZXNoIGFuZCB0aGUg4oCYdmFsaWTigJkgc2lnbmFsIGlzIGFzc2VydGVkLCB0aGUKKyAgICAgIGFjdHVhbCBtb2RlIGlzIHNjcmVlbi1yZWxhdGl2ZS4KKyAgICAtIE90aGVyd2lzZSwgYXBwbHkgdGhlIHNhbWUgcnVsZXMgYXMgdGhlIGRlc2lyZWQgbW9kZSBiZWluZyB3b3JsZC1yZWxhdGl2ZS4KKworIyMjIFJhdGUgTGltaXRlcgorCitBIFJhdGUgTGltaXRlciBibG9jayBpcyBhcHBsaWVkIHRvIHRoZSBmaW5hbCBvdXRwdXQgdG8gc21vb3RoIG91dCBhbnkgYWJydXB0Cit0cmFuc2l0aW9ucyBjYXVzZWQgYnkgYW55IG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzOgorCistIE1vZGUgc3dpdGNoLgorLSBEaXNwbGF5IG9yaWVudGF0aW9uIHN3aXRjaC4KKy0gUmVjZW50ZXIgb3BlcmF0aW9uLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1NjcmVlbkhlYWRGdXNpb24tdGVzdC5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU2NyZWVuSGVhZEZ1c2lvbi10ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2YyN2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1NjcmVlbkhlYWRGdXNpb24tdGVzdC5jcHAKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiU2NyZWVuSGVhZEZ1c2lvbi5oIgorI2luY2x1ZGUgIlRlc3RVdGlsLmgiCisKK3VzaW5nIEVpZ2VuOjpRdWF0ZXJuaW9uZjsKK3VzaW5nIEVpZ2VuOjpWZWN0b3IzZjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB7CisKK1RFU1QoU2NyZWVuSGVhZEZ1c2lvbiwgSW5pdCkgeworICAgIFNjcmVlbkhlYWRGdXNpb24gZnVzaW9uOworICAgIEVYUEVDVF9GQUxTRShmdXNpb24uY2FsY3VsYXRlKCkuaGFzX3ZhbHVlKCkpOworfQorCitURVNUKFNjcmVlbkhlYWRGdXNpb24sIENhbGN1bGF0ZV9Ob0hlYWQpIHsKKyAgICBTY3JlZW5IZWFkRnVzaW9uIGZ1c2lvbjsKKyAgICBmdXNpb24uc2V0V29ybGRUb1NjcmVlblBvc2UoMCwgUG9zZTNmKCkpOworICAgIEVYUEVDVF9GQUxTRShmdXNpb24uY2FsY3VsYXRlKCkuaGFzX3ZhbHVlKCkpOworfQorCitURVNUKFNjcmVlbkhlYWRGdXNpb24sIENhbGN1bGF0ZV9Ob1NjcmVlbikgeworICAgIFNjcmVlbkhlYWRGdXNpb24gZnVzaW9uOworICAgIGZ1c2lvbi5zZXRXb3JsZFRvSGVhZFBvc2UoMCwgUG9zZTNmKCkpOworICAgIEVYUEVDVF9GQUxTRShmdXNpb24uY2FsY3VsYXRlKCkuaGFzX3ZhbHVlKCkpOworfQorCitURVNUKFNjcmVlbkhlYWRGdXNpb24sIENhbGN1bGF0ZSkgeworICAgIFBvc2UzZiB3b3JsZFRvU2NyZWVuMSh7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIFBvc2UzZiB3b3JsZFRvSGVhZDEoezQsIDUsIDZ9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBQb3NlM2Ygd29ybGRUb1NjcmVlbjIoezExLCAxMiwgMTN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBQb3NlM2Ygd29ybGRUb0hlYWQyKHsxNCwgMTUsIDE2fSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisKKyAgICBTY3JlZW5IZWFkRnVzaW9uIGZ1c2lvbjsKKyAgICBmdXNpb24uc2V0V29ybGRUb0hlYWRQb3NlKDEyMywgd29ybGRUb0hlYWQxKTsKKyAgICBmdXNpb24uc2V0V29ybGRUb1NjcmVlblBvc2UoNDU2LCB3b3JsZFRvU2NyZWVuMSk7CisgICAgYXV0byByZXN1bHQgPSBmdXNpb24uY2FsY3VsYXRlKCk7CisgICAgQVNTRVJUX1RSVUUocmVzdWx0Lmhhc192YWx1ZSgpKTsKKyAgICBFWFBFQ1RfRVEoMTIzLCByZXN1bHQtPnRpbWVzdGFtcCk7CisgICAgRVhQRUNUX0VRKHdvcmxkVG9TY3JlZW4xLmludmVyc2UoKSAqIHdvcmxkVG9IZWFkMSwgcmVzdWx0LT5wb3NlKTsKKworICAgIGZ1c2lvbi5zZXRXb3JsZFRvSGVhZFBvc2UoNTY3LCB3b3JsZFRvSGVhZDIpOworICAgIHJlc3VsdCA9IGZ1c2lvbi5jYWxjdWxhdGUoKTsKKyAgICBBU1NFUlRfVFJVRShyZXN1bHQuaGFzX3ZhbHVlKCkpOworICAgIEVYUEVDVF9FUSg0NTYsIHJlc3VsdC0+dGltZXN0YW1wKTsKKyAgICBFWFBFQ1RfRVEod29ybGRUb1NjcmVlbjEuaW52ZXJzZSgpICogd29ybGRUb0hlYWQyLCByZXN1bHQtPnBvc2UpOworCisgICAgZnVzaW9uLnNldFdvcmxkVG9TY3JlZW5Qb3NlKDY3OCwgd29ybGRUb1NjcmVlbjIpOworICAgIHJlc3VsdCA9IGZ1c2lvbi5jYWxjdWxhdGUoKTsKKyAgICBBU1NFUlRfVFJVRShyZXN1bHQuaGFzX3ZhbHVlKCkpOworICAgIEVYUEVDVF9FUSg1NjcsIHJlc3VsdC0+dGltZXN0YW1wKTsKKyAgICBFWFBFQ1RfRVEod29ybGRUb1NjcmVlbjIuaW52ZXJzZSgpICogd29ybGRUb0hlYWQyLCByZXN1bHQtPnBvc2UpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9TY3JlZW5IZWFkRnVzaW9uLmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TY3JlZW5IZWFkRnVzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDIzNTcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1NjcmVlbkhlYWRGdXNpb24uY3BwCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpe30KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlNjcmVlbkhlYWRGdXNpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKwordm9pZCBTY3JlZW5IZWFkRnVzaW9uOjpzZXRXb3JsZFRvSGVhZFBvc2UoaW50NjRfdCB0aW1lc3RhbXAsIGNvbnN0IFBvc2UzZiYgd29ybGRUb0hlYWQpIHsKKyAgICBtV29ybGRUb0hlYWQgPSBUaW1lc3RhbXBlZFBvc2V7LnRpbWVzdGFtcCA9IHRpbWVzdGFtcCwgLnBvc2UgPSB3b3JsZFRvSGVhZH07Cit9CisKK3ZvaWQgU2NyZWVuSGVhZEZ1c2lvbjo6c2V0V29ybGRUb1NjcmVlblBvc2UoaW50NjRfdCB0aW1lc3RhbXAsIGNvbnN0IFBvc2UzZiYgd29ybGRUb1NjcmVlbikgeworICAgIG1Xb3JsZFRvU2NyZWVuID0gVGltZXN0YW1wZWRQb3Nley50aW1lc3RhbXAgPSB0aW1lc3RhbXAsIC5wb3NlID0gd29ybGRUb1NjcmVlbn07Cit9CisKK3N0ZDo6b3B0aW9uYWw8U2NyZWVuSGVhZEZ1c2lvbjo6VGltZXN0YW1wZWRQb3NlPiBTY3JlZW5IZWFkRnVzaW9uOjpjYWxjdWxhdGUoKSB7CisgICAgLy8gVE9ETzogdGhpcyBpcyB0ZW1wb3JhcnksIHNpbXBsaXN0aWMgbG9naWMuCisgICAgaWYgKCFtV29ybGRUb0hlYWQuaGFzX3ZhbHVlKCkgfHwgIW1Xb3JsZFRvU2NyZWVuLmhhc192YWx1ZSgpKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgfQorICAgIHJldHVybiBUaW1lc3RhbXBlZFBvc2V7CisgICAgICAgICAgICAudGltZXN0YW1wID0gc3RkOjptaW4obVdvcmxkVG9IZWFkLT50aW1lc3RhbXAsIG1Xb3JsZFRvU2NyZWVuLT50aW1lc3RhbXApLAorICAgICAgICAgICAgLnBvc2UgPSBtV29ybGRUb1NjcmVlbi0+cG9zZS5pbnZlcnNlKCkgKiBtV29ybGRUb0hlYWQtPnBvc2V9OworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU2NyZWVuSGVhZEZ1c2lvbi5oIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1NjcmVlbkhlYWRGdXNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTgxMTAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1NjcmVlbkhlYWRGdXNpb24uaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8b3B0aW9uYWw+CisKKyNpbmNsdWRlICJtZWRpYS9Qb3NlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8qKgorICogQ29tYmluZXMgd29ybGQtdG8taGVhZCBwb3NlIHdpdGggd29ybGQtdG8tc2NyZWVuIHBvc2UgdG8gb2J0YWluIHNjcmVlbi10by1oZWFkLgorICoKKyAqIElucHV0IHBvc2VzIG1heSBhcnJpdmUgc2VwYXJhdGVseS4gVGhlIGxhc3QgcG9zZSBvZiBlYWNoIGtpbmQgaXMgdGFrZW4gaW50byBhY2NvdW50LiBUaGUKKyAqIHRpbWVzdGFtcCBvZiB0aGUgb3V0cHV0IGlzIHRoZSBlYWxpZXIgKG9sZGVyKSB0aW1lc3RhbXAgb2YgdGhlIHR3byBpbnB1dHMuCisgKgorICogT3V0cHV0IG1heSBiZSBudWxsb3B0IGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6CisgKiAtIEVpdGhlciBvbmUgb2YgdGhlIGlucHV0cyBoYXMgbm90IHlldCBiZWVuIHByb3ZpZGVkLgorICogLSBJdCBpcyBlc3RpbWF0ZWQgdGhhdCB0aGUgdXNlciBpcyBubyBsb25nZXIgZmFjaW5nIHRoZSBzY3JlZW4uCisgKgorICogVHlwaWNhbCB1c2FnZToKKyAqCisgKiBTY3JlZW5IZWFkRnVzaW9uIGZ1c2lvbiguLi4pOworICogZnVzaW9uLnNldFdvcmxkVG9IZWFkUG9zZSguLi4pOworICogZnVzaW9uLnNldFdvcmxkVG9TY3JlZW5Qb3NlKC4uLik7CisgKiBhdXRvIG91dHB1dCA9IGZ1c2lvbi5jYWxjdWxhdGUoKTsKKyAqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCB0aHJlYWQtc2FmZSwgYnV0IHRocmVhZC1jb21wYXRpYmxlLgorICovCitjbGFzcyBTY3JlZW5IZWFkRnVzaW9uIHsKKyAgcHVibGljOgorICAgIHN0cnVjdCBUaW1lc3RhbXBlZFBvc2UgeworICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcDsKKyAgICAgICAgUG9zZTNmIHBvc2U7CisgICAgfTsKKworICAgIHZvaWQgc2V0V29ybGRUb0hlYWRQb3NlKGludDY0X3QgdGltZXN0YW1wLCBjb25zdCBQb3NlM2YmIHdvcmxkVG9IZWFkKTsKKworICAgIHZvaWQgc2V0V29ybGRUb1NjcmVlblBvc2UoaW50NjRfdCB0aW1lc3RhbXAsIGNvbnN0IFBvc2UzZiYgd29ybGRUb1NjcmVlbik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzY3JlZW4tdG8taGVhZCBwb3NlLCBvciBudWxsb3B0IGlmIGludmFsaWQuCisgICAgICovCisgICAgc3RkOjpvcHRpb25hbDxUaW1lc3RhbXBlZFBvc2U+IGNhbGN1bGF0ZSgpOworCisgIHByaXZhdGU6CisgICAgc3RkOjpvcHRpb25hbDxUaW1lc3RhbXBlZFBvc2U+IG1Xb3JsZFRvSGVhZDsKKyAgICBzdGQ6Om9wdGlvbmFsPFRpbWVzdGFtcGVkUG9zZT4gbVdvcmxkVG9TY3JlZW47Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU2Vuc29yUG9zZVByb3ZpZGVyLWV4YW1wbGUuY3BwIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1NlbnNvclBvc2VQcm92aWRlci1leGFtcGxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGUyMjJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1NlbnNvclBvc2VQcm92aWRlci1leGFtcGxlLmNwcApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8YW5kcm9pZC9zZW5zb3IuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9zZW5zb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3lzdGVtQ2xvY2suaD4KKworI2luY2x1ZGUgPG1lZGlhL1NlbnNvclBvc2VQcm92aWRlci5oPgorI2luY2x1ZGUgPHNlbnNvci9TZW5zb3IuaD4KKyNpbmNsdWRlIDxzZW5zb3IvU2Vuc29yTWFuYWdlci5oPgorCit1c2luZyBhbmRyb2lkOjplbGFwc2VkUmVhbHRpbWVOYW5vOwordXNpbmcgYW5kcm9pZDo6U2Vuc29yOwordXNpbmcgYW5kcm9pZDo6U2Vuc29yTWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwordXNpbmcgYW5kcm9pZDo6bWVkaWE6OlBvc2UzZjsKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjpTZW5zb3JQb3NlUHJvdmlkZXI7Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6VHdpc3QzZjsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworCitjb25zdCBjaGFyIGtQYWNrYWdlTmFtZVtdID0gIlNlbnNvclBvc2VQcm92aWRlci1leGFtcGxlIjsKKworY2xhc3MgTGlzdGVuZXIgOiBwdWJsaWMgU2Vuc29yUG9zZVByb3ZpZGVyOjpMaXN0ZW5lciB7CisgIHB1YmxpYzoKKyAgICB2b2lkIG9uUG9zZShpbnQ2NF90IHRpbWVzdGFtcCwgaW50MzJfdCBoYW5kbGUsIGNvbnN0IFBvc2UzZiYgcG9zZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFR3aXN0M2Y+JiB0d2lzdCwgYm9vbCBpc05ld1JlZmVyZW5jZSkgb3ZlcnJpZGUgeworICAgICAgICBpbnQ2NF90IG5vdyA9IGVsYXBzZWRSZWFsdGltZU5hbm8oKTsKKworICAgICAgICBzdGQ6OmNvdXQgPDwgIm9uUG9zZSB0PSIgPDwgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgICA8PCAiIGxhZz0iIDw8ICgobm93IC0gdGltZXN0YW1wKSAvIDFlNikgPDwgIlttc10iCisgICAgICAgICAgICAgICAgICA8PCAiIHNlbnNvcj0iIDw8IGhhbmRsZQorICAgICAgICAgICAgICAgICAgPDwgIiBwb3NlPSIgPDwgcG9zZQorICAgICAgICAgICAgICAgICAgPDwgIiB0d2lzdD0iOworICAgICAgICBpZiAodHdpc3QuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCB0d2lzdC52YWx1ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICI8bm9uZT4iOworICAgICAgICB9CisgICAgICAgIHN0ZDo6Y291dCA8PCAiIGlzTmV3UmVmZXJlbmNlPSIgPDwgaXNOZXdSZWZlcmVuY2UgPDwgc3RkOjplbmRsOworICAgIH0KK307CisKK2ludCBtYWluKCkgeworICAgIFNlbnNvck1hbmFnZXImIHNlbnNvck1hbmFnZXIgPSBTZW5zb3JNYW5hZ2VyOjpnZXRJbnN0YW5jZUZvclBhY2thZ2UoU3RyaW5nMTYoa1BhY2thZ2VOYW1lKSk7CisKKyAgICBjb25zdCBTZW5zb3IqIGhlYWRTZW5zb3IgPSBzZW5zb3JNYW5hZ2VyLmdldERlZmF1bHRTZW5zb3IoU0VOU09SX1RZUEVfR0FNRV9ST1RBVElPTl9WRUNUT1IpOworICAgIGNvbnN0IFNlbnNvciogc2NyZWVuU2Vuc29yID0gc2Vuc29yTWFuYWdlci5nZXREZWZhdWx0U2Vuc29yKFNFTlNPUl9UWVBFX1JPVEFUSU9OX1ZFQ1RPUik7CisKKyAgICBMaXN0ZW5lciBsaXN0ZW5lcjsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxTZW5zb3JQb3NlUHJvdmlkZXI+IHByb3ZpZGVyID0KKyAgICAgICAgICAgIFNlbnNvclBvc2VQcm92aWRlcjo6Y3JlYXRlKGtQYWNrYWdlTmFtZSwgJmxpc3RlbmVyKTsKKyAgICBpZiAoIXByb3ZpZGVyLT5zdGFydFNlbnNvcihoZWFkU2Vuc29yLT5nZXRIYW5kbGUoKSwgNTAwbXMpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiRmFpbGVkIHRvIHN0YXJ0IGhlYWQgc2Vuc29yIiA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIHNsZWVwKDIpOworICAgIGlmICghcHJvdmlkZXItPnN0YXJ0U2Vuc29yKHNjcmVlblNlbnNvci0+Z2V0SGFuZGxlKCksIDUwMG1zKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIkZhaWxlZCB0byBzdGFydCBzY3JlZW5TZW5zb3Igc2Vuc29yIiA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIHNsZWVwKDIpOworICAgIHByb3ZpZGVyLT5zdG9wU2Vuc29yKGhlYWRTZW5zb3ItPmdldEhhbmRsZSgpKTsKKyAgICBzbGVlcCgyKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9TZW5zb3JQb3NlUHJvdmlkZXIuY3BwIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1NlbnNvclBvc2VQcm92aWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViYWY2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TZW5zb3JQb3NlUHJvdmlkZXIuY3BwCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL1NlbnNvclBvc2VQcm92aWRlci5oPgorCisjZGVmaW5lIExPR19UQUcgIlNlbnNvclBvc2VQcm92aWRlciIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxmdXR1cmU+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KKyNpbmNsdWRlIDxsb2cvbG9nX21haW4uaD4KKyNpbmNsdWRlIDxzZW5zb3IvU2Vuc29yRXZlbnRRdWV1ZS5oPgorI2luY2x1ZGUgPHNlbnNvci9TZW5zb3JNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9vcGVyLmg+CisKKyNpbmNsdWRlICJRdWF0ZXJuaW9uVXRpbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHsKKworLy8gSWRlbnRpZmllciB0byB1c2UgZm9yIG91ciBldmVudCBxdWV1ZSBvbiB0aGUgbG9vcC4KKy8vIFRoZSBudW1iZXIgMTkgaXMgYXJiaXRyYXJ5LCBvbmx5IHVzZWZ1bCBpZiB1c2luZyBtdWx0aXBsZSBvYmplY3RzIG9uIHRoZSBzYW1lIGxvb3Blci4KK2NvbnN0ZXhwciBpbnQga0lkZW50ID0gMTk7CisKK3N0YXRpYyBpbmxpbmUgTG9vcGVyKiBBTG9vcGVyX3RvX0xvb3BlcihBTG9vcGVyKiBhbG9vcGVyKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8TG9vcGVyKj4oYWxvb3Blcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgQUxvb3BlciogTG9vcGVyX3RvX0FMb29wZXIoTG9vcGVyKiBsb29wZXIpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxBTG9vcGVyKj4obG9vcGVyKTsKK30KKworLyoqCisgKiBSQUlJLXdyYXBwZXIgYXJvdW5kIFNlbnNvckV2ZW50UXVldWUsIHdoaWNoIHVucmVnaXN0ZXJzIGl0IG9uIGRlc3RydWN0aW9uLgorICovCitjbGFzcyBFdmVudFF1ZXVlR3VhcmQgeworICBwdWJsaWM6CisgICAgRXZlbnRRdWV1ZUd1YXJkKGNvbnN0IHNwPFNlbnNvckV2ZW50UXVldWU+JiBxdWV1ZSwgTG9vcGVyKiBsb29wZXIpIDogbVF1ZXVlKHF1ZXVlKSB7CisgICAgICAgIG1RdWV1ZS0+bG9vcGVyID0gTG9vcGVyX3RvX0FMb29wZXIobG9vcGVyKTsKKyAgICAgICAgbVF1ZXVlLT5yZXF1ZXN0QWRkaXRpb25hbEluZm8gPSBmYWxzZTsKKyAgICAgICAgbG9vcGVyLT5hZGRGZChtUXVldWUtPmdldEZkKCksIGtJZGVudCwgQUxPT1BFUl9FVkVOVF9JTlBVVCwgbnVsbHB0ciwgbnVsbHB0cik7CisgICAgfQorCisgICAgfkV2ZW50UXVldWVHdWFyZCgpIHsKKyAgICAgICAgaWYgKG1RdWV1ZSkgeworICAgICAgICAgICAgQUxvb3Blcl90b19Mb29wZXIobVF1ZXVlLT5sb29wZXIpLT5yZW1vdmVGZChtUXVldWUtPmdldEZkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgRXZlbnRRdWV1ZUd1YXJkKGNvbnN0IEV2ZW50UXVldWVHdWFyZCYpID0gZGVsZXRlOworICAgIEV2ZW50UXVldWVHdWFyZCYgb3BlcmF0b3I9KGNvbnN0IEV2ZW50UXVldWVHdWFyZCYpID0gZGVsZXRlOworCisgICAgW1tub2Rpc2NhcmRdXSBTZW5zb3JFdmVudFF1ZXVlKiBnZXQoKSBjb25zdCB7IHJldHVybiBtUXVldWUuZ2V0KCk7IH0KKworICBwcml2YXRlOgorICAgIHNwPFNlbnNvckV2ZW50UXVldWU+IG1RdWV1ZTsKK307CisKKy8qKgorICogUkFJSS13cmFwcGVyIGFyb3VuZCBhbiBlbmFibGVkIHNlbnNvciwgd2hpY2ggZGlzYWJsZXMgaXQgdXBvbiBkZXN0cnVjdGlvbi4KKyAqLworY2xhc3MgU2Vuc29yRW5hYmxlR3VhcmQgeworICBwdWJsaWM6CisgICAgU2Vuc29yRW5hYmxlR3VhcmQoY29uc3Qgc3A8U2Vuc29yRXZlbnRRdWV1ZT4mIHF1ZXVlLCBpbnQzMl90IHNlbnNvcikKKyAgICAgICAgOiBtUXVldWUocXVldWUpLCBtU2Vuc29yKHNlbnNvcikge30KKworICAgIH5TZW5zb3JFbmFibGVHdWFyZCgpIHsKKyAgICAgICAgaWYgKG1TZW5zb3IgIT0gU2Vuc29yUG9zZVByb3ZpZGVyOjpJTlZBTElEX0hBTkRMRSkgeworICAgICAgICAgICAgaW50IHJldCA9IG1RdWV1ZS0+ZGlzYWJsZVNlbnNvcihtU2Vuc29yKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRpc2FibGUgc2Vuc29yOiAlcyIsIHN0cmVycm9yKHJldCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgU2Vuc29yRW5hYmxlR3VhcmQoY29uc3QgU2Vuc29yRW5hYmxlR3VhcmQmKSA9IGRlbGV0ZTsKKyAgICBTZW5zb3JFbmFibGVHdWFyZCYgb3BlcmF0b3I9KGNvbnN0IFNlbnNvckVuYWJsZUd1YXJkJikgPSBkZWxldGU7CisKKyAgICAvLyBFbmFibGUgbW92aW5nLgorICAgIFNlbnNvckVuYWJsZUd1YXJkKFNlbnNvckVuYWJsZUd1YXJkJiYgb3RoZXIpIDogbVF1ZXVlKG90aGVyLm1RdWV1ZSksIG1TZW5zb3Iob3RoZXIubVNlbnNvcikgeworICAgICAgICBvdGhlci5tU2Vuc29yID0gU2Vuc29yUG9zZVByb3ZpZGVyOjpJTlZBTElEX0hBTkRMRTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzcDxTZW5zb3JFdmVudFF1ZXVlPiBjb25zdCBtUXVldWU7CisgICAgaW50MzJfdCBtU2Vuc29yOworfTsKKworLyoqCisgKiBTdHJlYW1zIHRoZSByZXF1aXJlZCBldmVudHMgdG8gYSBQb3NlTGlzdGVuZXIsIGJhc2VkIG9uIGV2ZW50cyBvcmlnaW5hdGluZyBmcm9tIHRoZSBTZW5zb3Igc3RhY2suCisgKi8KK2NsYXNzIFNlbnNvclBvc2VQcm92aWRlckltcGwgOiBwdWJsaWMgU2Vuc29yUG9zZVByb3ZpZGVyIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8U2Vuc29yUG9zZVByb3ZpZGVyPiBjcmVhdGUoY29uc3QgY2hhciogcGFja2FnZU5hbWUsIExpc3RlbmVyKiBsaXN0ZW5lcikgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U2Vuc29yUG9zZVByb3ZpZGVySW1wbD4gcmVzdWx0KAorICAgICAgICAgICAgICAgIG5ldyBTZW5zb3JQb3NlUHJvdmlkZXJJbXBsKHBhY2thZ2VOYW1lLCBsaXN0ZW5lcikpOworICAgICAgICByZXR1cm4gcmVzdWx0LT53YWl0SW5pdEZpbmlzaGVkKCkgPyBzdGQ6Om1vdmUocmVzdWx0KSA6IG51bGxwdHI7CisgICAgfQorCisgICAgflNlbnNvclBvc2VQcm92aWRlckltcGwoKSBvdmVycmlkZSB7CisgICAgICAgIC8vIERpc2FibGUgYWxsIGFjdGl2ZSBzZW5zb3JzLgorICAgICAgICBtRW5hYmxlZFNlbnNvcnMuY2xlYXIoKTsKKyAgICAgICAgbUxvb3Blci0+d2FrZSgpOworICAgICAgICBtVGhyZWFkLmpvaW4oKTsKKyAgICB9CisKKyAgICBib29sIHN0YXJ0U2Vuc29yKGludDMyX3Qgc2Vuc29yLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIHNhbXBsaW5nUGVyaW9kKSBvdmVycmlkZSB7CisgICAgICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHNlbnNvcidzIGRhdGEgZm9ybWF0LgorICAgICAgICBEYXRhRm9ybWF0IGZvcm1hdCA9IGdldFNlbnNvckZvcm1hdChzZW5zb3IpOworICAgICAgICBpZiAoZm9ybWF0ID09IERhdGFGb3JtYXQ6OmtVbmtub3duKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBmb3JtYXQgZm9yIHNlbnNvciAlIiBQUklkMzIsIHNlbnNvcik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTXV0ZXgpOworICAgICAgICAgICAgbUVuYWJsZWRTZW5zb3JzRXh0cmEuZW1wbGFjZShzZW5zb3IsIFNlbnNvckV4dHJheyAuZm9ybWF0ID0gZm9ybWF0IH0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gRW5hYmxlIHRoZSBzZW5zb3IuCisgICAgICAgIGlmIChtUXVldWUtPmVuYWJsZVNlbnNvcihzZW5zb3IsIHNhbXBsaW5nUGVyaW9kLmNvdW50KCksIDAsIDApKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGVuYWJsZSBzZW5zb3IiKTsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1NdXRleCk7CisgICAgICAgICAgICBtRW5hYmxlZFNlbnNvcnNFeHRyYS5lcmFzZShzZW5zb3IpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbUVuYWJsZWRTZW5zb3JzLmVtcGxhY2Uoc2Vuc29yLCBTZW5zb3JFbmFibGVHdWFyZChtUXVldWUuZ2V0KCksIHNlbnNvcikpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHN0b3BTZW5zb3IoaW50IGhhbmRsZSkgb3ZlcnJpZGUgeworICAgICAgICBtRW5hYmxlZFNlbnNvcnMuZXJhc2UoaGFuZGxlKTsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobU11dGV4KTsKKyAgICAgICAgbUVuYWJsZWRTZW5zb3JzRXh0cmEuZXJhc2UoaGFuZGxlKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBlbnVtIERhdGFGb3JtYXQgeworICAgICAgICBrVW5rbm93biwKKyAgICAgICAga1F1YXRlcm5pb24sCisgICAgICAgIGtSb3RhdGlvblZlY3RvcnNBbmREaXNjb250aW51aXR5Q291bnQsCisgICAgfTsKKworICAgIHN0cnVjdCBQb3NlRXZlbnQgeworICAgICAgICBQb3NlM2YgcG9zZTsKKyAgICAgICAgc3RkOjpvcHRpb25hbDxUd2lzdDNmPiB0d2lzdDsKKyAgICAgICAgYm9vbCBpc05ld1JlZmVyZW5jZTsKKyAgICB9OworCisgICAgc3RydWN0IFNlbnNvckV4dHJhIHsKKyAgICAgICAgRGF0YUZvcm1hdCBmb3JtYXQ7CisgICAgICAgIHN0ZDo6b3B0aW9uYWw8aW50MzJfdD4gZGlzY29udGludWl0eUNvdW50OworICAgIH07CisKKyAgICBzcDxMb29wZXI+IG1Mb29wZXI7CisgICAgTGlzdGVuZXIqIGNvbnN0IG1MaXN0ZW5lcjsKKyAgICBTZW5zb3JNYW5hZ2VyKiBjb25zdCBtU2Vuc29yTWFuYWdlcjsKKyAgICBzdGQ6OnRocmVhZCBtVGhyZWFkOworICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6bWFwPGludDMyX3QsIFNlbnNvckVuYWJsZUd1YXJkPiBtRW5hYmxlZFNlbnNvcnM7CisgICAgc3RkOjptYXA8aW50MzJfdCwgU2Vuc29yRXh0cmE+IG1FbmFibGVkU2Vuc29yc0V4dHJhIEdVQVJERURfQlkobU11dGV4KTsKKyAgICBzcDxTZW5zb3JFdmVudFF1ZXVlPiBtUXVldWU7CisKKyAgICAvLyBXZSBtdXN0IGRvIHNvbWUgb2YgdGhlIGluaXRpYWxpemF0aW9uIG9wZXJhdGlvbnMgb24gdGhlIHdvcmtlciB0aHJlYWQsIGJlY2F1c2UgdGhlIEFQSSByZWxpZXMKKyAgICAvLyBvbiB0aGUgdGhyZWFkLWxvY2FsIGxvb3Blci4gSW4gYWRkaXRpb24sIGFzIGEgbWF0dGVyIG9mIGNvbnZlbmllbmNlLCB3ZSBzdG9yZSBzb21lIG9mIHRoZQorICAgIC8vIHN0YXRlIG9uIHRoZSBzdGFjay4KKyAgICAvLyBGb3IgdGhhdCByZWFzb24sIHdlIHVzZSBhIHR3by1zdGVwIGluaXRpYWxpemF0aW9uIGFwcHJvYWNoLCB3aGVyZSB0aGUgY3RvciBtb3N0bHkganVzdCBzdGFydHMKKyAgICAvLyB0aGUgd29ya2VyIHRocmVhZCBhbmQgdGhhdCB0aHJlYWQgd291bGQgbm90aWZ5LCB2aWEgdGhlIHByb21pc2UgYmVsb3cgd2hlbmV2ZXIgaW5pdGlhbGl6YXRpb24KKyAgICAvLyBpcyBmaW5pc2hlZCwgYW5kIHdoZXRoZXIgaXQgd2FzIHN1Y2Nlc3NmdWwuCisgICAgc3RkOjpwcm9taXNlPGJvb2w+IG1Jbml0UHJvbWlzZTsKKworICAgIFNlbnNvclBvc2VQcm92aWRlckltcGwoY29uc3QgY2hhciogcGFja2FnZU5hbWUsIExpc3RlbmVyKiBsaXN0ZW5lcikKKyAgICAgICAgOiBtTGlzdGVuZXIobGlzdGVuZXIpLAorICAgICAgICAgIG1TZW5zb3JNYW5hZ2VyKCZTZW5zb3JNYW5hZ2VyOjpnZXRJbnN0YW5jZUZvclBhY2thZ2UoU3RyaW5nMTYocGFja2FnZU5hbWUpKSksCisgICAgICAgICAgbVRocmVhZChbdGhpc10geyB0aHJlYWRGdW5jKCk7IH0pIHt9CisKKyAgICB2b2lkIGluaXRGaW5pc2hlZChib29sIHN1Y2Nlc3MpIHsgbUluaXRQcm9taXNlLnNldF92YWx1ZShzdWNjZXNzKTsgfQorCisgICAgYm9vbCB3YWl0SW5pdEZpbmlzaGVkKCkgeyByZXR1cm4gbUluaXRQcm9taXNlLmdldF9mdXR1cmUoKS5nZXQoKTsgfQorCisgICAgdm9pZCB0aHJlYWRGdW5jKCkgeworICAgICAgICAvLyBPYnRhaW4gbG9vcGVyLgorICAgICAgICBtTG9vcGVyID0gTG9vcGVyOjpwcmVwYXJlKEFMT09QRVJfUFJFUEFSRV9BTExPV19OT05fQ0FMTEJBQ0tTKTsKKworICAgICAgICAvLyBDcmVhdGUgZXZlbnQgcXVldWUuCisgICAgICAgIG1RdWV1ZSA9IG1TZW5zb3JNYW5hZ2VyLT5jcmVhdGVFdmVudFF1ZXVlKCk7CisKKyAgICAgICAgaWYgKG1RdWV1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBhIHNlbnNvciBldmVudCBxdWV1ZSIpOworICAgICAgICAgICAgaW5pdEZpbmlzaGVkKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEV2ZW50UXVldWVHdWFyZCBldmVudFF1ZXVlR3VhcmQobVF1ZXVlLCBtTG9vcGVyLmdldCgpKTsKKworICAgICAgICBpbml0RmluaXNoZWQodHJ1ZSk7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCByZXQgPSBtTG9vcGVyLT5wb2xsT25jZSgtMSAvKiBubyB0aW1lb3V0ICovLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKTsKKworICAgICAgICAgICAgc3dpdGNoIChyZXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFMT09QRVJfUE9MTF9XQUtFOgorICAgICAgICAgICAgICAgICAgICAvLyBOb3JtYWwgd2F5IHRvIGV4aXQuCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgIGNhc2Uga0lkZW50OgorICAgICAgICAgICAgICAgICAgICAvLyBQb3NzaWJsZSBldmVudHMgb24gb3VyIHF1ZXVlLgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmV4cGVjdGVkIHN0YXR1cyBvdXQgb2YgTG9vcGVyOjpwb2xsT25jZTogJWQiLCByZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQcm9jZXNzIGFuIGV2ZW50LgorICAgICAgICAgICAgQVNlbnNvckV2ZW50IGV2ZW50OworICAgICAgICAgICAgc3NpemVfdCBhY3R1YWwgPSBtUXVldWUtPnJlYWQoJmV2ZW50LCAxKTsKKyAgICAgICAgICAgIGlmIChhY3R1YWwgPiAwKSB7CisgICAgICAgICAgICAgICAgbVF1ZXVlLT5zZW5kQWNrKCZldmVudCwgYWN0dWFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzaXplX3Qgc2l6ZSA9IG1RdWV1ZS0+ZmlsdGVyRXZlbnRzKCZldmVudCwgYWN0dWFsKTsKKworICAgICAgICAgICAgaWYgKHNpemUgPCAwIHx8IHNpemUgPiAxKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gU2Vuc29yRXZlbnRRdWV1ZTo6ZmlsdGVyRXZlbnRzOiAlemQiLCBzaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBObyBldmVudHMuCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhbmRsZUV2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgaGFuZGxlRXZlbnQoY29uc3QgQVNlbnNvckV2ZW50JiBldmVudCkgeworICAgICAgICBQb3NlRXZlbnQgdmFsdWU7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1NdXRleCk7CisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBtRW5hYmxlZFNlbnNvcnNFeHRyYS5maW5kKGV2ZW50LnNlbnNvcik7CisgICAgICAgICAgICBpZiAoaXRlciA9PSBtRW5hYmxlZFNlbnNvcnNFeHRyYS5lbmQoKSkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB3ZSBoYXZlIGFueSBwZW5kaW5nIGV2ZW50cyBzaG9ydGx5IGFmdGVyIHN0b3BwaW5nLgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gcGFyc2VFdmVudChldmVudCwgaXRlci0+c2Vjb25kLmZvcm1hdCwgJml0ZXItPnNlY29uZC5kaXNjb250aW51aXR5Q291bnQpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lci0+b25Qb3NlKGV2ZW50LnRpbWVzdGFtcCwgZXZlbnQuc2Vuc29yLCB2YWx1ZS5wb3NlLCB2YWx1ZS50d2lzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuaXNOZXdSZWZlcmVuY2UpOworICAgIH0KKworICAgIERhdGFGb3JtYXQgZ2V0U2Vuc29yRm9ybWF0KGludDMyX3QgaGFuZGxlKSB7CisgICAgICAgIHN0ZDo6b3B0aW9uYWw8Y29uc3QgU2Vuc29yPiBzZW5zb3IgPSBnZXRTZW5zb3JCeUhhbmRsZShoYW5kbGUpOworICAgICAgICBpZiAoIXNlbnNvcikgeworICAgICAgICAgICAgQUxPR0UoIlNlbnNvciBub3QgZm91bmQ6ICVkIiwgaGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBEYXRhRm9ybWF0OjprVW5rbm93bjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2Vuc29yLT5nZXRUeXBlKCkgPT0gQVNFTlNPUl9UWVBFX1JPVEFUSU9OX1ZFQ1RPUiB8fAorICAgICAgICAgICAgc2Vuc29yLT5nZXRUeXBlKCkgPT0gQVNFTlNPUl9UWVBFX0dBTUVfUk9UQVRJT05fVkVDVE9SKSB7CisgICAgICAgICAgICByZXR1cm4gRGF0YUZvcm1hdDo6a1F1YXRlcm5pb247CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2Vuc29yLT5nZXRUeXBlKCkgPT0gQVNFTlNPUl9UWVBFX0hFQURfVFJBQ0tFUikgeworICAgICAgICAgICAgcmV0dXJuIERhdGFGb3JtYXQ6OmtSb3RhdGlvblZlY3RvcnNBbmREaXNjb250aW51aXR5Q291bnQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gRGF0YUZvcm1hdDo6a1Vua25vd247CisgICAgfQorCisgICAgc3RkOjpvcHRpb25hbDxjb25zdCBTZW5zb3I+IGdldFNlbnNvckJ5SGFuZGxlKGludDMyX3QgaGFuZGxlKSBvdmVycmlkZSB7CisgICAgICAgIGNvbnN0IFNlbnNvciogY29uc3QqIGxpc3Q7CisgICAgICAgIHNzaXplX3Qgc2l6ZTsKKworICAgICAgICAvLyBTZWFyY2ggc3RhdGljIHNlbnNvciBsaXN0LgorICAgICAgICBzaXplID0gbVNlbnNvck1hbmFnZXItPmdldFNlbnNvckxpc3QoJmxpc3QpOworICAgICAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXRTZW5zb3JMaXN0IGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJXpkIiwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICBpZiAobGlzdFtpXS0+Z2V0SGFuZGxlKCkgPT0gaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICpsaXN0W2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2VhcmNoIGR5bmFtaWMgc2Vuc29yIGxpc3QuCisgICAgICAgIFZlY3RvcjxTZW5zb3I+IGR5bkxpc3Q7CisgICAgICAgIHNpemUgPSBtU2Vuc29yTWFuYWdlci0+Z2V0RHluYW1pY1NlbnNvckxpc3QoZHluTGlzdCk7CisgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoImdldER5bmFtaWNTZW5zb3JMaXN0IGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJXpkIiwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoZHluTGlzdFtpXS5nZXRIYW5kbGUoKSA9PSBoYW5kbGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZHluTGlzdFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgfQorCisgICAgc3RhdGljIFBvc2VFdmVudCBwYXJzZUV2ZW50KGNvbnN0IEFTZW5zb3JFdmVudCYgZXZlbnQsIERhdGFGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPGludDMyX3Q+KiBkaXNjb250aW51dHlDb3VudCkgeworICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBEYXRhRm9ybWF0OjprUXVhdGVybmlvbjogeworICAgICAgICAgICAgICAgIEVpZ2VuOjpRdWF0ZXJuaW9uZiBxdWF0KGV2ZW50LmRhdGFbM10sIGV2ZW50LmRhdGFbMF0sIGV2ZW50LmRhdGFbMV0sIGV2ZW50LmRhdGFbMl0pOworICAgICAgICAgICAgICAgIC8vIEFkYXB0IHRvIGRpZmZlcmVudCBmcmFtZSBjb252ZW50aW9uLgorICAgICAgICAgICAgICAgIHF1YXQgKj0gcm90YXRlWCgtTV9QSV8yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUG9zZUV2ZW50e1Bvc2UzZihxdWF0KSwgc3RkOjpvcHRpb25hbDxUd2lzdDNmPigpLCBmYWxzZX07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgRGF0YUZvcm1hdDo6a1JvdGF0aW9uVmVjdG9yc0FuZERpc2NvbnRpbnVpdHlDb3VudDogeworICAgICAgICAgICAgICAgIEVpZ2VuOjpWZWN0b3IzZiByb3RhdGlvbiA9IHtldmVudC5oZWFkX3RyYWNrZXIucngsIGV2ZW50LmhlYWRfdHJhY2tlci5yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuaGVhZF90cmFja2VyLnJ6fTsKKyAgICAgICAgICAgICAgICBFaWdlbjo6VmVjdG9yM2YgdHdpc3QgPSB7ZXZlbnQuaGVhZF90cmFja2VyLnZ4LCBldmVudC5oZWFkX3RyYWNrZXIudnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmhlYWRfdHJhY2tlci52en07CisgICAgICAgICAgICAgICAgRWlnZW46OlF1YXRlcm5pb25mIHF1YXQgPSByb3RhdGlvblZlY3RvclRvUXVhdGVybmlvbihyb3RhdGlvbik7CisgICAgICAgICAgICAgICAgYm9vbCBpc05ld1JlZmVyZW5jZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAhZGlzY29udGludXR5Q291bnQtPmhhc192YWx1ZSgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51dHlDb3VudC0+dmFsdWUoKSAhPSBldmVudC5oZWFkX3RyYWNrZXIuZGlzY29udGludWl0eV9jb3VudDsKKyAgICAgICAgICAgICAgICAqZGlzY29udGludXR5Q291bnQgPSBldmVudC5oZWFkX3RyYWNrZXIuZGlzY29udGludWl0eV9jb3VudDsKKworICAgICAgICAgICAgICAgIHJldHVybiBQb3NlRXZlbnR7UG9zZTNmKHF1YXQpLCBUd2lzdDNmKEVpZ2VuOjpWZWN0b3IzZjo6WmVybygpLCB0d2lzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05ld1JlZmVyZW5jZX07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5leHBlY3RlZCBzZW5zb3IgdHlwZTogJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KGZvcm1hdCkpOworICAgICAgICB9CisgICAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK3N0ZDo6dW5pcXVlX3B0cjxTZW5zb3JQb3NlUHJvdmlkZXI+IFNlbnNvclBvc2VQcm92aWRlcjo6Y3JlYXRlKGNvbnN0IGNoYXIqIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdGVuZXIqIGxpc3RlbmVyKSB7CisgICAgcmV0dXJuIFNlbnNvclBvc2VQcm92aWRlckltcGw6OmNyZWF0ZShwYWNrYWdlTmFtZSwgbGlzdGVuZXIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU3RpbGxuZXNzRGV0ZWN0b3ItdGVzdC5jcHAgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU3RpbGxuZXNzRGV0ZWN0b3ItdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjZDQ3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TdGlsbG5lc3NEZXRlY3Rvci10ZXN0LmNwcApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiUXVhdGVybmlvblV0aWwuaCIKKyNpbmNsdWRlICJTdGlsbG5lc3NEZXRlY3Rvci5oIgorI2luY2x1ZGUgIlRlc3RVdGlsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgeworCit1c2luZyBFaWdlbjo6UXVhdGVybmlvbmY7Cit1c2luZyBFaWdlbjo6VmVjdG9yM2Y7Cit1c2luZyBPcHRpb25zID0gU3RpbGxuZXNzRGV0ZWN0b3I6Ok9wdGlvbnM7CisKK2NsYXNzIFN0aWxsbmVzc0RldGVjdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGJvb2w+IHsKKyAgcHVibGljOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IG1EZWZhdWx0VmFsdWUgPSBHZXRQYXJhbSgpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGJvb2wgbURlZmF1bHRWYWx1ZTsKK307CisKK1RFU1RfUChTdGlsbG5lc3NEZXRlY3RvclRlc3QsIFN0aWxsKSB7CisgICAgU3RpbGxuZXNzRGV0ZWN0b3IgZGV0ZWN0b3IoT3B0aW9uc3suZGVmYXVsdFZhbHVlID0gbURlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aW5kb3dEdXJhdGlvbiA9IDEwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJhbnNsYXRpb25hbFRocmVzaG9sZCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucm90YXRpb25hbFRocmVzaG9sZCA9IDAuMDV9KTsKKworICAgIGNvbnN0IFBvc2UzZiBiYXNlbGluZShWZWN0b3IzZnsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgY29uc3QgUG9zZTNmIHdpdGhpblRocmVzaG9sZCA9CisgICAgICAgICAgICBiYXNlbGluZSAqIFBvc2UzZihWZWN0b3IzZigwLjMsIC0wLjMsIDApLCByb3RhdGVYKDAuMDEpICogcm90YXRlWSgtMC4wMSkpOworCisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSgwKSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMCwgYmFzZWxpbmUpOworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDMwMCwgd2l0aGluVGhyZXNob2xkKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDMwMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDYwMCwgYmFzZWxpbmUpOworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoNjAwKSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoOTk5LCB3aXRoaW5UaHJlc2hvbGQpOworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoOTk5KSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMTAwMCwgYmFzZWxpbmUpOworICAgIEVYUEVDVF9UUlVFKGRldGVjdG9yLmNhbGN1bGF0ZSgxMDAwKSk7Cit9CisKK1RFU1RfUChTdGlsbG5lc3NEZXRlY3RvclRlc3QsIFplcm9EdXJhdGlvbikgeworICAgIFN0aWxsbmVzc0RldGVjdG9yIGRldGVjdG9yKE9wdGlvbnN7LmRlZmF1bHRWYWx1ZSA9IG1EZWZhdWx0VmFsdWUsIC53aW5kb3dEdXJhdGlvbiA9IDB9KTsKKyAgICBFWFBFQ1RfVFJVRShkZXRlY3Rvci5jYWxjdWxhdGUoMCkpOworICAgIEVYUEVDVF9UUlVFKGRldGVjdG9yLmNhbGN1bGF0ZSgxMDAwKSk7Cit9CisKK1RFU1RfUChTdGlsbG5lc3NEZXRlY3RvclRlc3QsIE5vdFN0aWxsVHJhbnNsYXRpb24pIHsKKyAgICBTdGlsbG5lc3NEZXRlY3RvciBkZXRlY3RvcihPcHRpb25zey5kZWZhdWx0VmFsdWUgPSBtRGVmYXVsdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpbmRvd0R1cmF0aW9uID0gMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50cmFuc2xhdGlvbmFsVGhyZXNob2xkID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yb3RhdGlvbmFsVGhyZXNob2xkID0gMC4wNX0pOworCisgICAgY29uc3QgUG9zZTNmIGJhc2VsaW5lKFZlY3RvcjNmezEsIDIsIDN9LCBRdWF0ZXJuaW9uZjo6VW5pdFJhbmRvbSgpKTsKKyAgICBjb25zdCBQb3NlM2Ygd2l0aGluVGhyZXNob2xkID0KKyAgICAgICAgICAgIGJhc2VsaW5lICogUG9zZTNmKFZlY3RvcjNmKDAuMywgLTAuMywgMCksIHJvdGF0ZVgoMC4wMSkgKiByb3RhdGVZKC0wLjAxKSk7CisgICAgY29uc3QgUG9zZTNmIG91dHNpZGVUaHJlc2hvbGQgPSBiYXNlbGluZSAqIFBvc2UzZihWZWN0b3IzZigxLCAxLCAwKSk7CisKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgwLCBiYXNlbGluZSk7CisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSgwKSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMzAwLCBvdXRzaWRlVGhyZXNob2xkKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDMwMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDYwMCwgYmFzZWxpbmUpOworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoNjAwKSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMTI5OSwgd2l0aGluVGhyZXNob2xkKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGV0ZWN0b3IuY2FsY3VsYXRlKDEyOTkpKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgxMzAwLCBiYXNlbGluZSk7CisgICAgRVhQRUNUX1RSVUUoZGV0ZWN0b3IuY2FsY3VsYXRlKDEzMDApKTsKK30KKworVEVTVF9QKFN0aWxsbmVzc0RldGVjdG9yVGVzdCwgTm90U3RpbGxSb3RhdGlvbikgeworICAgIFN0aWxsbmVzc0RldGVjdG9yIGRldGVjdG9yKE9wdGlvbnN7LmRlZmF1bHRWYWx1ZSA9IG1EZWZhdWx0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2luZG93RHVyYXRpb24gPSAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyYW5zbGF0aW9uYWxUaHJlc2hvbGQgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJvdGF0aW9uYWxUaHJlc2hvbGQgPSAwLjA1fSk7CisKKyAgICBjb25zdCBQb3NlM2YgYmFzZWxpbmUoVmVjdG9yM2Z7MSwgMiwgM30sIFF1YXRlcm5pb25mOjpVbml0UmFuZG9tKCkpOworICAgIGNvbnN0IFBvc2UzZiB3aXRoaW5UaHJlc2hvbGQgPQorICAgICAgICAgICAgYmFzZWxpbmUgKiBQb3NlM2YoVmVjdG9yM2YoMC4zLCAtMC4zLCAwKSwgcm90YXRlWCgwLjAzKSAqIHJvdGF0ZVkoLTAuMDMpKTsKKyAgICBjb25zdCBQb3NlM2Ygb3V0c2lkZVRocmVzaG9sZCA9IGJhc2VsaW5lICogUG9zZTNmKHJvdGF0ZVooMC4wNikpOworCisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSgwKSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMCwgYmFzZWxpbmUpOworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDMwMCwgb3V0c2lkZVRocmVzaG9sZCk7CisgICAgRVhQRUNUX0VRKG1EZWZhdWx0VmFsdWUsIGRldGVjdG9yLmNhbGN1bGF0ZSgzMDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCg2MDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDYwMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDEyOTksIHdpdGhpblRocmVzaG9sZCk7CisgICAgRVhQRUNUX0ZBTFNFKGRldGVjdG9yLmNhbGN1bGF0ZSgxMjk5KSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMTMwMCwgYmFzZWxpbmUpOworICAgIEVYUEVDVF9UUlVFKGRldGVjdG9yLmNhbGN1bGF0ZSgxMzAwKSk7Cit9CisKK1RFU1RfUChTdGlsbG5lc3NEZXRlY3RvclRlc3QsIFN1cHByZXNzaW9uKSB7CisgICAgU3RpbGxuZXNzRGV0ZWN0b3IgZGV0ZWN0b3IoT3B0aW9uc3suZGVmYXVsdFZhbHVlID0gbURlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aW5kb3dEdXJhdGlvbiA9IDEwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJhbnNsYXRpb25hbFRocmVzaG9sZCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucm90YXRpb25hbFRocmVzaG9sZCA9IDAuMDV9KTsKKworICAgIGNvbnN0IFBvc2UzZiBiYXNlbGluZShWZWN0b3IzZnsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgY29uc3QgUG9zZTNmIG91dHNpZGVUaHJlc2hvbGQgPSBiYXNlbGluZSAqIFBvc2UzZihWZWN0b3IzZigxLjEsIDAsIDApKTsKKyAgICBjb25zdCBQb3NlM2YgbWlkZGxlUG9pbnQgPSBiYXNlbGluZSAqIFBvc2UzZihWZWN0b3IzZigwLjU1LCAwLCAwKSk7CisKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgwLCBiYXNlbGluZSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMTAwMCwgYmFzZWxpbmUpOworICAgIEVYUEVDVF9UUlVFKGRldGVjdG9yLmNhbGN1bGF0ZSgxMDAwKSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMTEwMCwgb3V0c2lkZVRocmVzaG9sZCk7CisgICAgRVhQRUNUX0ZBTFNFKGRldGVjdG9yLmNhbGN1bGF0ZSgxMTAwKSk7CisgICAgZGV0ZWN0b3Iuc2V0SW5wdXQoMTUwMCwgbWlkZGxlUG9pbnQpOworICAgIEVYUEVDVF9GQUxTRShkZXRlY3Rvci5jYWxjdWxhdGUoMTUwMCkpOworICAgIEVYUEVDVF9GQUxTRShkZXRlY3Rvci5jYWxjdWxhdGUoMTk5OSkpOworICAgIEVYUEVDVF9UUlVFKGRldGVjdG9yLmNhbGN1bGF0ZSgyMDAwKSk7Cit9CisKK1RFU1RfUChTdGlsbG5lc3NEZXRlY3RvclRlc3QsIFJlc2V0KSB7CisgICAgU3RpbGxuZXNzRGV0ZWN0b3IgZGV0ZWN0b3IoT3B0aW9uc3suZGVmYXVsdFZhbHVlID0gbURlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aW5kb3dEdXJhdGlvbiA9IDEwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJhbnNsYXRpb25hbFRocmVzaG9sZCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucm90YXRpb25hbFRocmVzaG9sZCA9IDAuMDV9KTsKKworICAgIGNvbnN0IFBvc2UzZiBiYXNlbGluZShWZWN0b3IzZnsxLCAyLCAzfSwgUXVhdGVybmlvbmY6OlVuaXRSYW5kb20oKSk7CisgICAgY29uc3QgUG9zZTNmIHdpdGhpblRocmVzaG9sZCA9CisgICAgICAgICAgICBiYXNlbGluZSAqIFBvc2UzZihWZWN0b3IzZigwLjMsIC0wLjMsIDApLCByb3RhdGVYKDAuMDEpICogcm90YXRlWSgtMC4wMSkpOworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDMwMCwgYmFzZWxpbmUpOworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoMzAwKSk7CisgICAgZGV0ZWN0b3IucmVzZXQoKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCg2MDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDYwMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDkwMCwgd2l0aGluVGhyZXNob2xkKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDkwMCkpOworICAgIGRldGVjdG9yLnNldElucHV0KDEyMDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfRVEobURlZmF1bHRWYWx1ZSwgZGV0ZWN0b3IuY2FsY3VsYXRlKDEyMDApKTsKKyAgICBkZXRlY3Rvci5zZXRJbnB1dCgxNTk5LCB3aXRoaW5UaHJlc2hvbGQpOworICAgIEVYUEVDVF9FUShtRGVmYXVsdFZhbHVlLCBkZXRlY3Rvci5jYWxjdWxhdGUoMTU5OSkpOworICAgIGRldGVjdG9yLnNldElucHV0KDE2MDAsIGJhc2VsaW5lKTsKKyAgICBFWFBFQ1RfVFJVRShkZXRlY3Rvci5jYWxjdWxhdGUoMTYwMCkpOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoU3RpbGxuZXNzRGV0ZWN0b3JUZXN0UGFyYW1ldHJpemVkLCBTdGlsbG5lc3NEZXRlY3RvclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzKGZhbHNlLCB0cnVlKSk7CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1N0aWxsbmVzc0RldGVjdG9yLmNwcCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TdGlsbG5lc3NEZXRlY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3Yzg5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9TdGlsbG5lc3NEZXRlY3Rvci5jcHAKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU3RpbGxuZXNzRGV0ZWN0b3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworU3RpbGxuZXNzRGV0ZWN0b3I6OlN0aWxsbmVzc0RldGVjdG9yKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgICAgOiBtT3B0aW9ucyhvcHRpb25zKSwgbUNvc0hhbGZSb3RhdGlvbmFsVGhyZXNob2xkKGNvcyhtT3B0aW9ucy5yb3RhdGlvbmFsVGhyZXNob2xkIC8gMikpIHt9CisKK3ZvaWQgU3RpbGxuZXNzRGV0ZWN0b3I6OnJlc2V0KCkgeworICAgIG1GaWZvLmNsZWFyKCk7CisgICAgbVdpbmRvd0Z1bGwgPSBmYWxzZTsKKyAgICBtU3VwcHJlc3Npb25EZWFkbGluZS5yZXNldCgpOworfQorCit2b2lkIFN0aWxsbmVzc0RldGVjdG9yOjpzZXRJbnB1dChpbnQ2NF90IHRpbWVzdGFtcCwgY29uc3QgUG9zZTNmJiBpbnB1dCkgeworICAgIG1GaWZvLnB1c2hfYmFjayhUaW1lc3RhbXBlZFBvc2V7dGltZXN0YW1wLCBpbnB1dH0pOworICAgIGRpc2NhcmRPbGQodGltZXN0YW1wKTsKK30KKworYm9vbCBTdGlsbG5lc3NEZXRlY3Rvcjo6Y2FsY3VsYXRlKGludDY0X3QgdGltZXN0YW1wKSB7CisgICAgZGlzY2FyZE9sZCh0aW1lc3RhbXApOworCisgICAgLy8gQ2hlY2sgd2hldGhlciBhbGwgdGhlIHBvc2VzIGluIHRoZSBxdWV1ZSBhcmUgaW4gdGhlIHByb3hpbWl0eSBvZiB0aGUgbmV3IG9uZS4gV2Ugd2FudCB0byBkbworICAgIC8vIHRoaXMgYmVmb3JlIGNoZWNraW5nIHRoZSBvdmVycmlkaW5nIGNvbmRpdGlvbnMgYmVsb3csIGluIG9yZGVyIHRvIHVwZGF0ZSB0aGUgc3VwcHJlc3Npb24KKyAgICAvLyBkZWFkbGluZSBjb3JyZWN0bHkuIFdlIGFsd2F5cyBnbyBmcm9tIGVuZCB0byBzdGFydCwgdG8gZmluZCB0aGUgbW9zdCByZWNlbnQgcG9zZSB0aGF0CisgICAgLy8gdmlvbGF0ZWQgc3RpbGxuZXNzIGFuZCB1cGRhdGUgdGhlIHN1cHByZXNzaW9uIGRlYWRsaW5lIGlmIGl0IGhhcyBub3QgYmVlbiBzZXQgb3IgaWYgdGhlIG5ldworICAgIC8vIG9uZSBlbmRzIGFmdGVyIHRoZSBjdXJyZW50IG9uZS4KKyAgICBib29sIG1vdmVkID0gZmFsc2U7CisKKyAgICBpZiAoIW1GaWZvLmVtcHR5KCkpIHsKKyAgICAgICAgZm9yIChhdXRvIGl0ZXIgPSBtRmlmby5yYmVnaW4oKSArIDE7IGl0ZXIgIT0gbUZpZm8ucmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIGV2ZW50ID0gKml0ZXI7CisgICAgICAgICAgICBpZiAoIWFyZU5lYXIoZXZlbnQucG9zZSwgbUZpZm8uYmFjaygpLnBvc2UpKSB7CisgICAgICAgICAgICAgICAgLy8gRW5hYmxlIHN1cHByZXNzaW9uIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHdpbmRvdy4KKyAgICAgICAgICAgICAgICBpbnQ2NF90IGRlYWRsaW5lID0gZXZlbnQudGltZXN0YW1wICsgbU9wdGlvbnMud2luZG93RHVyYXRpb247CisgICAgICAgICAgICAgICAgaWYgKCFtU3VwcHJlc3Npb25EZWFkbGluZS5oYXNfdmFsdWUoKSB8fCBtU3VwcHJlc3Npb25EZWFkbGluZS52YWx1ZSgpIDwgZGVhZGxpbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN1cHByZXNzaW9uRGVhZGxpbmUgPSBkZWFkbGluZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbW92ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIHdpbmRvdyBoYXMgbm90IGJlZW4gZnVsbCwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgIGlmICghbVdpbmRvd0Z1bGwpIHsKKyAgICAgICAgcmV0dXJuIG1PcHRpb25zLmRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICAvLyBGb3JjZSAiaW4gbW90aW9uIiB3aGlsZSB0aGUgc3VwcHJlc3Npb24gZGVhZGxpbmUgaXMgYWN0aXZlLgorICAgIGlmIChtU3VwcHJlc3Npb25EZWFkbGluZS5oYXNfdmFsdWUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuICFtb3ZlZDsKK30KKwordm9pZCBTdGlsbG5lc3NEZXRlY3Rvcjo6ZGlzY2FyZE9sZChpbnQ2NF90IHRpbWVzdGFtcCkgeworICAgIC8vIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIHRoZSB3aW5kb3cgZHVyYXRpb24gYmVpbmcgemVybyAoYWx3YXlzIGNvbnNpZGVyZWQgZnVsbCkuCisgICAgaWYgKG1PcHRpb25zLndpbmRvd0R1cmF0aW9uID09IDApIHsKKyAgICAgICAgbUZpZm8uY2xlYXIoKTsKKyAgICAgICAgbVdpbmRvd0Z1bGwgPSB0cnVlOworICAgIH0KKworICAgIC8vIFJlbW92ZSBhbnkgZXZlbnRzIGZyb20gdGhlIHF1ZXVlIHRoYXQgYXJlIG9sZGVyIHRoYW4gdGhlIHdpbmRvdy4gSWYgdGhlcmUgd2VyZSBhbnkgc3VjaAorICAgIC8vIGV2ZW50cyB3ZSBjb25zaWRlciB0aGUgd2luZG93IGZ1bGwuCisgICAgY29uc3QgaW50NjRfdCB3aW5kb3dTdGFydCA9IHRpbWVzdGFtcCAtIG1PcHRpb25zLndpbmRvd0R1cmF0aW9uOworICAgIHdoaWxlICghbUZpZm8uZW1wdHkoKSAmJiBtRmlmby5mcm9udCgpLnRpbWVzdGFtcCA8PSB3aW5kb3dTdGFydCkgeworICAgICAgICBtV2luZG93RnVsbCA9IHRydWU7CisgICAgICAgIG1GaWZvLnBvcF9mcm9udCgpOworICAgIH0KKworICAgIC8vIEV4cGlyZSB0aGUgc3VwcHJlc3Npb24gZGVhZGxpbmUuCisgICAgaWYgKG1TdXBwcmVzc2lvbkRlYWRsaW5lLmhhc192YWx1ZSgpICYmIG1TdXBwcmVzc2lvbkRlYWRsaW5lIDw9IHRpbWVzdGFtcCkgeworICAgICAgICBtU3VwcHJlc3Npb25EZWFkbGluZS5yZXNldCgpOworICAgIH0KK30KKworYm9vbCBTdGlsbG5lc3NEZXRlY3Rvcjo6YXJlTmVhcihjb25zdCBQb3NlM2YmIHBvc2UxLCBjb25zdCBQb3NlM2YmIHBvc2UyKSBjb25zdCB7CisgICAgLy8gQ2hlY2sgdHJhbnNsYXRpb24uIFdlIHVzZSB0aGUgTDEgbm9ybSB0byByZWR1Y2UgY29tcHV0YXRpb25hbCBsb2FkIG9uIGV4cGVuc2Ugb2YgYWNjdXJhY3kuCisgICAgLy8gVGhlIEwxIG5vcm0gaXMgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBhY3R1YWwgKEwyKSBub3JtLCBzbyB0aGlzIGFwcHJvYWNoIHdpbGwgZXJyIG9uIHRoZSBzaWRlCisgICAgLy8gb2YgIm5vdCBuZWFyIi4KKyAgICBpZiAoKHBvc2UxLnRyYW5zbGF0aW9uKCkgLSBwb3NlMi50cmFuc2xhdGlvbigpKS5scE5vcm08MT4oKSA+IG1PcHRpb25zLnRyYW5zbGF0aW9uYWxUaHJlc2hvbGQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENoZWNrIG9yaWVudGF0aW9uLgorICAgIC8vIFRoZSBhbmdsZSB4IGJldHdlZW4gdGhlIHF1YXRlcm5pb25zIGlzIGdyZWF0ZXIgdGhhbiB0aGF0IHRocmVzaG9sZCBpZmYKKyAgICAvLyBjb3MoeC8yKSA8IGNvcyh0aHJlc2hvbGQvMikuCisgICAgLy8gY29zKHgvMikgY2FuIGJlIGVmZmljaWVudGx5IGNhbGN1bGF0ZWQgYXMgdGhlIGRvdCBwcm9kdWN0IG9mIGJvdGggcXVhdGVybmlvbnMuCisgICAgaWYgKHBvc2UxLnJvdGF0aW9uKCkuZG90KHBvc2UyLnJvdGF0aW9uKCkpIDwgbUNvc0hhbGZSb3RhdGlvbmFsVGhyZXNob2xkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1N0aWxsbmVzc0RldGVjdG9yLmggYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvU3RpbGxuZXNzRGV0ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTRiMmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1N0aWxsbmVzc0RldGVjdG9yLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxkZXF1ZT4KKworI2luY2x1ZGUgPG1lZGlhL1Bvc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworLyoqCisgKiBHaXZlbiBhIHN0cmVhbSBvZiBwb3NlcywgZGV0ZXJtaW5lcyBpZiB0aGUgcG9zZSBpcyBzdGFibGUgKCJzdGlsbCIpLgorICogU3RpbGxuZXNzIGlzIGRlZmluZWQgYXMgYWxsIHBvc2VzIGluIHRoZSByZWNlbnQgaGlzdG9yeSAoIndpbmRvdyIpIGJlaW5nIG5lYXIgdGhlIG1vc3QgcmVjZW50CisgKiBzYW1wbGUuCisgKgorICogVHlwaWNhbCB1c2FnZToKKyAqCisgKiBTdGlsbG5lc3NEZXRlY3RvciBkZXRlY3RvcihTdGlsbmVzc0RldGVjdG9yOjpPcHRpb25zey4uLn0pOworICoKKyAqIHdoaWxlICguLi4pIHsKKyAqICAgIGRldGVjdG9yLnNldElucHV0KHRpbWVzdGFtcCwgcG9zZSk7CisgKiAgICBib29sIHN0aWxsID0gZGV0ZWN0b3IuY2FsY3VsYXRlKHRpbWVzdGFtcCk7CisgKiB9CisgKgorICogVGhlIGRldGVjdGlvbiBpcyBub3QgY29uc2lkZXJlZCByZWxpYWJsZSB1bnRpbCBhIHN1ZmZpY2llbnQgbnVtYmVyIG9mIHNhbXBsZXMgaGFzIGJlZW4gcHJvdmlkZWQKKyAqIGZvciBhbiBpbml0aWFsIGZpbGwtdXAgb2YgdGhlIHdpbmRvdy4gRHVyaW5nIHRoYXQgdGltZSwgdGhlIGRldGVjdG9yIHdpbGwgcmV0dXJuIHdoYXRldmVyIGRlZmF1bHQKKyAqIHZhbHVlIGhhcyBiZWVuIGNvbmZpZ3VyZWQuCisgKiBUaGUgcmVzZXQoKSBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZW1wdHkgdGhlIHdpbmRvdyBhZ2FpbiBhbmQgZ2V0IGJhY2sgdG8gdGhpcyBpbml0aWFsIHN0YXRlLgorICogSW4gdGhlIHNwZWNpYWwgY2FzZSBvZiB0aGUgd2luZG93IHNpemUgYmVpbmcgMCwgdGhlIHN0YXRlIHdpbGwgYWx3YXlzIGJlIGNvbnNpZGVyZWQgInN0aWxsIi4KKyAqLworY2xhc3MgU3RpbGxuZXNzRGV0ZWN0b3IgeworICBwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgZGV0ZWN0b3IuCisgICAgICovCisgICAgc3RydWN0IE9wdGlvbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogRHVyaW5nIHRoZSBpbml0aWFsIGZpbGwgb2YgdGhlIHdpbmRvdywgc2hvdWxkIHdlIGNvbnNpZGVyIHRoZSBzdGF0ZSBzdGlsbD8KKyAgICAgICAgICovCisgICAgICAgICBib29sIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhvdyBsb25nIGlzIHRoZSB3aW5kb3csIGluIHRpY2tzLiBUaGUgc3BlY2lhbCB2YWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSBzdHJlYW0gaXMKKyAgICAgICAgICogYWx3YXlzIGNvbnNpZGVyZWQgc3RpbGwuCisgICAgICAgICAqLworICAgICAgICBpbnQ2NF90IHdpbmRvd0R1cmF0aW9uOworICAgICAgICAvKioKKyAgICAgICAgICogSG93IG11Y2ggb2YgYSB0cmFuc2xhdGlvbmFsIGRldmlhdGlvbiBmcm9tIHRoZSB0YXJnZXQgKGluIG1ldGVycykgaXMgY29uc2lkZXJlZCBtb3Rpb24uCisgICAgICAgICAqIFRoaXMgaXMgYW4gYXBwcm94aW1hdGUgcXVhbnRpdHkgLSB0aGUgYWN0dWFsIHRocmVzaG9sZCBtaWdodCBiZSBhIGxpdHRsZSBkaWZmZXJlbnQgYXMgd2UKKyAgICAgICAgICogdHJhZGUtb2ZmIGFjY3VyYWN5IHdpdGggY29tcHV0YXRpb25hbCBlZmZpY2llbmN5LgorICAgICAgICAgKi8KKyAgICAgICAgZmxvYXQgdHJhbnNsYXRpb25hbFRocmVzaG9sZDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhvdyBtdWNoIG9mIGEgcm90YXRpb25hbCBkZXZpYXRpb24gZnJvbSB0aGUgdGFyZ2V0IChpbiByYWRpYW5zKSBpcyBjb25zaWRlcmVkIG1vdGlvbi4KKyAgICAgICAgICogVGhpcyBpcyBhbiBhcHByb3hpbWF0ZSBxdWFudGl0eSAtIHRoZSBhY3R1YWwgdGhyZXNob2xkIG1pZ2h0IGJlIGEgbGl0dGxlIGRpZmZlcmVudCBhcyB3ZQorICAgICAgICAgKiB0cmFkZS1vZmYgYWNjdXJhY3kgd2l0aCBjb21wdXRhdGlvbmFsIGVmZmljaWVuY3kuCisgICAgICAgICAqLworICAgICAgICBmbG9hdCByb3RhdGlvbmFsVGhyZXNob2xkOworICAgIH07CisKKyAgICAvKiogQ3Rvci4gKi8KKyAgICBleHBsaWNpdCBTdGlsbG5lc3NEZXRlY3Rvcihjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworICAgIC8qKiBDbGVhciB0aGUgd2luZG93LiAqLworICAgIHZvaWQgcmVzZXQoKTsKKyAgICAvKiogUHVzaCBhIG5ldyBzYW1wbGUuICovCisgICAgdm9pZCBzZXRJbnB1dChpbnQ2NF90IHRpbWVzdGFtcCwgY29uc3QgUG9zZTNmJiBpbnB1dCk7CisgICAgLyoqIENhbGN1bGF0ZSB3aGV0aGVyIHRoZSBzdHJlYW0gaXMgc3RpbGwgYXQgdGhlIGdpdmVuIHRpbWVzdGFtcC4gKi8KKyAgICBib29sIGNhbGN1bGF0ZShpbnQ2NF90IHRpbWVzdGFtcCk7CisKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgVGltZXN0YW1wZWRQb3NlIHsKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgIFBvc2UzZiBwb3NlOworICAgIH07CisKKyAgICBjb25zdCBPcHRpb25zIG1PcHRpb25zOworICAgIC8vIFByZWNhbGN1bGF0ZWQgY29zKG1PcHRpb25zLnJvdGF0aW9uYWxUaHJlc2hvbGQgLyAyKQorICAgIGNvbnN0IGZsb2F0IG1Db3NIYWxmUm90YXRpb25hbFRocmVzaG9sZDsKKyAgICBzdGQ6OmRlcXVlPFRpbWVzdGFtcGVkUG9zZT4gbUZpZm87CisgICAgYm9vbCBtV2luZG93RnVsbCA9IGZhbHNlOworICAgIC8vIEFzIHNvb24gYXMgbW90aW9uIGlzIGRldGVjdGVkLCB0aGlzIHdpbGwgYmUgc2V0IGZvciB0aGUgdGltZSBvZiBkZXRlY3Rpb24gKyB3aW5kb3cgZHVyYXRpb24sCisgICAgLy8gYW5kIGR1cmluZyB0aGlzIHRpbWUgd2Ugd2lsbCBhbHdheXMgY29uc2lkZXIgb3V0c2VsdmVzIGluIG1vdGlvbiB3aXRob3V0IGNoZWNraW5nLiBUaGlzIGlzCisgICAgLy8gdXNlZCBmb3IgaHl0ZXJlc2lzIHB1cnBvc2VzLCBzaW5jZSBiZWNhdXNlIG9mIHRoZSBhcHByb3hpbWF0ZSBtZXRob2Qgd2UgdXNlIGZvciBkZXRlcm1pbmluZworICAgIC8vIHN0aWxsbmVzcywgd2UgbWF5IHRvZ2dsZSBiYWNrIGFuZCBmb3J0aCBhdCBhIHJhdGUgZmFzdGVyIHRoYW4gdGhlIHdpbmRvdyBzaWRlLgorICAgIHN0ZDo6b3B0aW9uYWw8aW50NjRfdD4gbVN1cHByZXNzaW9uRGVhZGxpbmU7CisKKyAgICBib29sIGFyZU5lYXIoY29uc3QgUG9zZTNmJiBwb3NlMSwgY29uc3QgUG9zZTNmJiBwb3NlMikgY29uc3Q7CisgICAgdm9pZCBkaXNjYXJkT2xkKGludDY0X3QgdGltZXN0YW1wKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9UZXN0VXRpbC5oIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1Rlc3RVdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzNmQ4NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9UZXN0VXRpbC5oCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIm1lZGlhL1Bvc2UuaCIKKyNpbmNsdWRlICJtZWRpYS9Ud2lzdC5oIgorCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgZmxvYXQga1Bvc2VDb21wYXJpc29uUHJlY2lzaW9uID0gMWUtNTsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIFRoZXNlIHNwZWNpYWxpemF0aW9ucyBtYWtlIHtFWFBFQ1QsQVNTRVJUfV97RVEsTkV9IHdvcmsgY29ycmVjdGx5IGZvciBQb3NlM2YsIFR3aXN0M2YsIFZlY3RvcjNmCisvLyBhbmQgUXVhdGVybmlvbmYuCituYW1lc3BhY2UgdGVzdGluZyB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8PgoraW5saW5lIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJFUTxhbmRyb2lkOjptZWRpYTo6UG9zZTNmLCBhbmRyb2lkOjptZWRpYTo6UG9zZTNmPigKKyAgICAgICAgY29uc3QgY2hhciogbGhzX2V4cHJlc3Npb24sIGNvbnN0IGNoYXIqIHJoc19leHByZXNzaW9uLCBjb25zdCBhbmRyb2lkOjptZWRpYTo6UG9zZTNmJiBsaHMsCisgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjpQb3NlM2YmIHJocykgeworICAgIGlmIChsaHMuaXNBcHByb3gocmhzLCBrUG9zZUNvbXBhcmlzb25QcmVjaXNpb24pKSB7CisgICAgICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgICAgfQorCisgICAgcmV0dXJuIENtcEhlbHBlckVRRmFpbHVyZShsaHNfZXhwcmVzc2lvbiwgcmhzX2V4cHJlc3Npb24sIGxocywgcmhzKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBBc3NlcnRpb25SZXN1bHQgQ21wSGVscGVyTkU8YW5kcm9pZDo6bWVkaWE6OlBvc2UzZiwgYW5kcm9pZDo6bWVkaWE6OlBvc2UzZj4oCisgICAgICAgIGNvbnN0IGNoYXIqIGxoc19leHByZXNzaW9uLCBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlBvc2UzZiYgbGhzLAorICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6UG9zZTNmJiByaHMpIHsKKyAgICBpZiAoIWxocy5pc0FwcHJveChyaHMsIGtQb3NlQ29tcGFyaXNvblByZWNpc2lvbikpIHsKKyAgICAgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQ21wSGVscGVyRVFGYWlsdXJlKGxoc19leHByZXNzaW9uLCByaHNfZXhwcmVzc2lvbiwgbGhzLCByaHMpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJFUTxhbmRyb2lkOjptZWRpYTo6VHdpc3QzZiwgYW5kcm9pZDo6bWVkaWE6OlR3aXN0M2Y+KAorICAgICAgICBjb25zdCBjaGFyKiBsaHNfZXhwcmVzc2lvbiwgY29uc3QgY2hhciogcmhzX2V4cHJlc3Npb24sIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjpUd2lzdDNmJiBsaHMsCisgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjpUd2lzdDNmJiByaHMpIHsKKyAgICBpZiAobGhzLmlzQXBwcm94KHJocywga1Bvc2VDb21wYXJpc29uUHJlY2lzaW9uKSkgeworICAgICAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICAgIH0KKworICAgIHJldHVybiBDbXBIZWxwZXJFUUZhaWx1cmUobGhzX2V4cHJlc3Npb24sIHJoc19leHByZXNzaW9uLCBsaHMsIHJocyk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlck5FPGFuZHJvaWQ6Om1lZGlhOjpUd2lzdDNmLCBhbmRyb2lkOjptZWRpYTo6VHdpc3QzZj4oCisgICAgICAgIGNvbnN0IGNoYXIqIGxoc19leHByZXNzaW9uLCBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlR3aXN0M2YmIGxocywKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlR3aXN0M2YmIHJocykgeworICAgIGlmICghbGhzLmlzQXBwcm94KHJocywga1Bvc2VDb21wYXJpc29uUHJlY2lzaW9uKSkgeworICAgICAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICAgIH0KKworICAgIHJldHVybiBDbXBIZWxwZXJFUUZhaWx1cmUobGhzX2V4cHJlc3Npb24sIHJoc19leHByZXNzaW9uLCBsaHMsIHJocyk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlckVRPEVpZ2VuOjpWZWN0b3IzZiwgRWlnZW46OlZlY3RvcjNmPihjb25zdCBjaGFyKiBsaHNfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJoc19leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWlnZW46OlZlY3RvcjNmJiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFaWdlbjo6VmVjdG9yM2YmIHJocykgeworICAgIGlmIChsaHMuaXNBcHByb3gocmhzKSkgeworICAgICAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICAgIH0KKworICAgIHJldHVybiBDbXBIZWxwZXJFUUZhaWx1cmUobGhzX2V4cHJlc3Npb24sIHJoc19leHByZXNzaW9uLCBsaHMsIHJocyk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlck5FPEVpZ2VuOjpWZWN0b3IzZiwgRWlnZW46OlZlY3RvcjNmPihjb25zdCBjaGFyKiBsaHNfZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJoc19leHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWlnZW46OlZlY3RvcjNmJiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFaWdlbjo6VmVjdG9yM2YmIHJocykgeworICAgIGlmICghbGhzLmlzQXBwcm94KHJocykpIHsKKyAgICAgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQ21wSGVscGVyRVFGYWlsdXJlKGxoc19leHByZXNzaW9uLCByaHNfZXhwcmVzc2lvbiwgbGhzLCByaHMpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIEFzc2VydGlvblJlc3VsdCBDbXBIZWxwZXJFUTxFaWdlbjo6UXVhdGVybmlvbmYsIEVpZ2VuOjpRdWF0ZXJuaW9uZj4oCisgICAgICAgIGNvbnN0IGNoYXIqIGxoc19leHByZXNzaW9uLCBjb25zdCBjaGFyKiByaHNfZXhwcmVzc2lvbiwgY29uc3QgRWlnZW46OlF1YXRlcm5pb25mJiBsaHMsCisgICAgICAgIGNvbnN0IEVpZ2VuOjpRdWF0ZXJuaW9uZiYgcmhzKSB7CisgICAgLy8gTmVnYXRpbmcgdGhlIGNvZWZzIHJlc3VsdHMgaW4gYW4gZXF1aXZhbGVudCBxdWF0ZXJuaW9uLgorICAgIGlmIChsaHMuaXNBcHByb3gocmhzKSB8fCBsaHMuaXNBcHByb3goRWlnZW46OlF1YXRlcm5pb25mKC1yaHMuY29lZmZzKCkpKSkgeworICAgICAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworICAgIH0KKworICAgIHJldHVybiBDbXBIZWxwZXJFUUZhaWx1cmUobGhzX2V4cHJlc3Npb24sIHJoc19leHByZXNzaW9uLCBsaHMsIHJocyk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgQXNzZXJ0aW9uUmVzdWx0IENtcEhlbHBlck5FPEVpZ2VuOjpRdWF0ZXJuaW9uZiwgRWlnZW46OlF1YXRlcm5pb25mPigKKyAgICAgICAgY29uc3QgY2hhciogbGhzX2V4cHJlc3Npb24sIGNvbnN0IGNoYXIqIHJoc19leHByZXNzaW9uLCBjb25zdCBFaWdlbjo6UXVhdGVybmlvbmYmIGxocywKKyAgICAgICAgY29uc3QgRWlnZW46OlF1YXRlcm5pb25mJiByaHMpIHsKKyAgICAvLyBOZWdhdGluZyB0aGUgY29lZnMgcmVzdWx0cyBpbiBhbiBlcXVpdmFsZW50IHF1YXRlcm5pb24uCisgICAgaWYgKCEobGhzLmlzQXBwcm94KHJocykgfHwgbGhzLmlzQXBwcm94KEVpZ2VuOjpRdWF0ZXJuaW9uZigtcmhzLmNvZWZmcygpKSkpKSB7CisgICAgICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7CisgICAgfQorCisgICAgcmV0dXJuIENtcEhlbHBlckVRRmFpbHVyZShsaHNfZXhwcmVzc2lvbiwgcmhzX2V4cHJlc3Npb24sIGxocywgcmhzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL1R3aXN0LXRlc3QuY3BwIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1R3aXN0LXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ODRlMWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvVHdpc3QtdGVzdC5jcHAKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJtZWRpYS9Ud2lzdC5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIlF1YXRlcm5pb25VdGlsLmgiCisjaW5jbHVkZSAiVGVzdFV0aWwuaCIKKwordXNpbmcgRWlnZW46OlF1YXRlcm5pb25mOwordXNpbmcgRWlnZW46OlZlY3RvcjNmOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHsKKworVEVTVChUd2lzdCwgRGVmYXVsdEN0b3IpIHsKKyAgICBUd2lzdDNmIHR3aXN0OworICAgIEVYUEVDVF9FUSh0d2lzdC50cmFuc2xhdGlvbmFsVmVsb2NpdHkoKSwgVmVjdG9yM2Y6Olplcm8oKSk7CisgICAgRVhQRUNUX0VRKHR3aXN0LnJvdGF0aW9uYWxWZWxvY2l0eSgpLCBWZWN0b3IzZjo6WmVybygpKTsKKyAgICBFWFBFQ1RfRkxPQVRfRVEodHdpc3Quc2NhbGFyUm90YXRpb25hbFZlbG9jaXR5KCksIDApOworICAgIEVYUEVDVF9GTE9BVF9FUSh0d2lzdC5zY2FsYXJUcmFuc2xhdGlvbmFsVmVsb2NpdHkoKSwgMCk7Cit9CisKK1RFU1QoVHdpc3QsIEZ1bGxDdG9yKSB7CisgICAgVmVjdG9yM2Ygcm90ezEsIDIsIDN9OworICAgIFZlY3RvcjNmIHRyYW5zezQsIDUsIDZ9OworICAgIFR3aXN0M2YgdHdpc3QodHJhbnMsIHJvdCk7CisgICAgRVhQRUNUX0VRKHR3aXN0LnRyYW5zbGF0aW9uYWxWZWxvY2l0eSgpLCB0cmFucyk7CisgICAgRVhQRUNUX0VRKHR3aXN0LnJvdGF0aW9uYWxWZWxvY2l0eSgpLCByb3QpOworICAgIEVYUEVDVF9GTE9BVF9FUSh0d2lzdC5zY2FsYXJSb3RhdGlvbmFsVmVsb2NpdHkoKSwgc3RkOjpzcXJ0KDE0LmYpKTsKKyAgICBFWFBFQ1RfRkxPQVRfRVEodHdpc3Quc2NhbGFyVHJhbnNsYXRpb25hbFZlbG9jaXR5KCksIHN0ZDo6c3FydCg3Ny5mKSk7Cit9CisKK1RFU1QoVHdpc3QsIEludGVncmF0ZSkgeworICAgIFZlY3RvcjNmIHRyYW5zezEsIDIsIDN9OworICAgIC8vIDQ1IGRlZy9zZWMgYXJvdW5kIFouCisgICAgVmVjdG9yM2Ygcm90ezAsIDAsIE1fUElfNH07CisgICAgVHdpc3QzZiB0d2lzdCh0cmFucywgcm90KTsKKyAgICBQb3NlM2YgcG9zZSA9IGludGVncmF0ZSh0d2lzdCwgMi5mKTsKKworICAgIEVYUEVDVF9FUShwb3NlLCBQb3NlM2YoVmVjdG9yM2Z7MiwgNCwgNn0sIHJvdGF0ZVooTV9QSV8yKSkpOworfQorCitURVNUKFR3aXN0LCBEaWZmZXJlbnRpYXRlKSB7CisgICAgUG9zZTNmIHBvc2UoVmVjdG9yM2Z7MiwgNCwgNn0sIHJvdGF0ZVooTV9QSV8yKSk7CisgICAgVHdpc3QzZiB0d2lzdCA9IGRpZmZlcmVudGlhdGUocG9zZSwgMi5mKTsKKyAgICBFWFBFQ1RfRVEodHdpc3QsIFR3aXN0M2YoVmVjdG9yM2YoMSwgMiwgMyksIFZlY3RvcjNmKDAsIDAsIE1fUElfNCkpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvVHdpc3QuY3BwIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1R3aXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjRjNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL1R3aXN0LmNwcApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIm1lZGlhL1R3aXN0LmgiCisKKyNpbmNsdWRlICJRdWF0ZXJuaW9uVXRpbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCitQb3NlM2YgaW50ZWdyYXRlKGNvbnN0IFR3aXN0M2YmIHR3aXN0LCBmbG9hdCBkdCkgeworICAgIEVpZ2VuOjpWZWN0b3IzZiB0cmFuc2xhdGlvbiA9IHR3aXN0LnRyYW5zbGF0aW9uYWxWZWxvY2l0eSgpICogZHQ7CisgICAgRWlnZW46OlZlY3RvcjNmIHJvdGF0aW9uVmVjdG9yID0gdHdpc3Qucm90YXRpb25hbFZlbG9jaXR5KCkgKiBkdDsKKyAgICByZXR1cm4gUG9zZTNmKHRyYW5zbGF0aW9uLCByb3RhdGlvblZlY3RvclRvUXVhdGVybmlvbihyb3RhdGlvblZlY3RvcikpOworfQorCitUd2lzdDNmIGRpZmZlcmVudGlhdGUoY29uc3QgUG9zZTNmJiBwb3NlLCBmbG9hdCBkdCkgeworICAgIEVpZ2VuOjpWZWN0b3IzZiB0cmFuc2xhdGlvbmFsVmVsb2NpdHkgPSBwb3NlLnRyYW5zbGF0aW9uKCkgLyBkdDsKKyAgICBFaWdlbjo6VmVjdG9yM2Ygcm90YXRpb25hbFZlbG9jaXR5ID0gcXVhdGVybmlvblRvUm90YXRpb25WZWN0b3IocG9zZS5yb3RhdGlvbigpKSAvIGR0OworICAgIHJldHVybiBUd2lzdDNmKHRyYW5zbGF0aW9uYWxWZWxvY2l0eSwgcm90YXRpb25hbFZlbG9jaXR5KTsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFR3aXN0M2YmIHR3aXN0KSB7CisgICAgb3MgPDwgInRyYW5zbGF0aW9uOiAiIDw8IHR3aXN0LnRyYW5zbGF0aW9uYWxWZWxvY2l0eSgpLnRyYW5zcG9zZSgpCisgICAgICAgPDwgIiByb3RhdGlvbiB2ZWN0b3I6ICIgPDwgdHdpc3Qucm90YXRpb25hbFZlbG9jaXR5KCkudHJhbnNwb3NlKCk7CisgICAgcmV0dXJuIG9zOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvaW5jbHVkZS9tZWRpYS9IZWFkVHJhY2tpbmdNb2RlLmggYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvaW5jbHVkZS9tZWRpYS9IZWFkVHJhY2tpbmdNb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0OTZlOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL0hlYWRUcmFja2luZ01vZGUuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCisvKioKKyAqIE1vZGUgb2YgaGVhZC10cmFja2luZy4KKyAqLworZW51bSBjbGFzcyBIZWFkVHJhY2tpbmdNb2RlIHsKKyAgICAvKiogTm8gaGVhZC10cmFja2luZyAtIHNjcmVlbi10by1oZWFkIHBvc2UgaXMgYXNzdW1lZCB0byBiZSBpZGVudGl0eS4gKi8KKyAgICBTVEFUSUMsCisgICAgLyoqIEhlYWQgdHJhY2tpbmcgZW5hYmxlZCAtIHdvcmxkLXRvLXNjcmVlbiBwb3NlIGlzIGFzc3VtZWQgdG8gYmUgaWRlbnRpdHkuICovCisgICAgV09STERfUkVMQVRJVkUsCisgICAgLyoqIEZ1bGwgc2NyZWVuLXRvLWhlYWQgdHJhY2tpbmcgZW5hYmxlZC4gKi8KKyAgICBTQ1JFRU5fUkVMQVRJVkUsCit9OworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWFkdHJhY2tpbmcvaW5jbHVkZS9tZWRpYS9IZWFkVHJhY2tpbmdQcm9jZXNzb3IuaCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL0hlYWRUcmFja2luZ1Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDRiZTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvaW5jbHVkZS9tZWRpYS9IZWFkVHJhY2tpbmdQcm9jZXNzb3IuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgIkhlYWRUcmFja2luZ01vZGUuaCIKKyNpbmNsdWRlICJQb3NlLmgiCisjaW5jbHVkZSAiVHdpc3QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworLyoqCisgKiBNYWluIGVudHJ5LXBvaW50IGZvciB0aGlzIGxpYnJhcnkuCisgKiBUaGlzIGludGVyZmFjZXMgZW5jb21wYXNzZXMgYWxsIHRoZSBwcm9jZXNzaW5nIHJlcXVpcmVkIGZvciBkZXRlcm1pbmluZyB0aGUgaGVhZC10by1zdGFnZSBwb3NlCisgKiB1c2VkIGZvciBhdWRpbyB2aXJ0dWFsaXphdGlvbi4KKyAqIFRoZSB1c2FnZSBpbnZvbHZlcyBwZXJpb2RpYyBzZXR0aW5nIG9mIHRoZSBpbnB1dHMsIGNhbGxpbmcgY2FsY3VsYXRlKCkgYW5kIG9idGFpbmluZyB0aGUgb3V0cHV0cy4KKyAqIFRoaXMgY2xhc3MgaXMgbm90IHRocmVhZC1zYWZlLCBidXQgdGhyZWFkLWNvbXBhdGlibGUuCisgKi8KK2NsYXNzIEhlYWRUcmFja2luZ1Byb2Nlc3NvciB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5IZWFkVHJhY2tpbmdQcm9jZXNzb3IoKSA9IGRlZmF1bHQ7CisKKyAgICBzdHJ1Y3QgT3B0aW9ucyB7CisgICAgICAgIGZsb2F0IG1heFRyYW5zbGF0aW9uYWxWZWxvY2l0eSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICAgICAgICBmbG9hdCBtYXhSb3RhdGlvbmFsVmVsb2NpdHkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgICAgICAgaW50NjRfdCBmcmVzaG5lc3NUaW1lb3V0ID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KCk7CisgICAgICAgIGZsb2F0IHByZWRpY3Rpb25EdXJhdGlvbiA9IDA7CisgICAgICAgIGludDY0X3QgYXV0b1JlY2VudGVyV2luZG93RHVyYXRpb24gPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgoKTsKKyAgICAgICAgZmxvYXQgYXV0b1JlY2VudGVyVHJhbnNsYXRpb25hbFRocmVzaG9sZCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICAgICAgICBmbG9hdCBhdXRvUmVjZW50ZXJSb3RhdGlvbmFsVGhyZXNob2xkID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisgICAgICAgIGludDY0X3Qgc2NyZWVuU3RpbGxuZXNzV2luZG93RHVyYXRpb24gPSAwOworICAgICAgICBmbG9hdCBzY3JlZW5TdGlsbG5lc3NUcmFuc2xhdGlvbmFsVGhyZXNob2xkID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisgICAgICAgIGZsb2F0IHNjcmVlblN0aWxsbmVzc1JvdGF0aW9uYWxUaHJlc2hvbGQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgICB9OworCisgICAgLyoqIFNldHMgdGhlIGRlc2lyZWQgaGVhZC10cmFja2luZyBtb2RlLiAqLworICAgIHZpcnR1YWwgdm9pZCBzZXREZXNpcmVkTW9kZShIZWFkVHJhY2tpbmdNb2RlIG1vZGUpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdvcmxkLXRvLWhlYWQgcG9zZSBhbmQgaGVhZCB0d2lzdCAodmVsb2NpdHkpLgorICAgICAqIGhlYWRUd2lzdCBpcyBnaXZlbiBpbiB0aGUgaGVhZCBjb29yZGluYXRlIGZyYW1lLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBzZXRXb3JsZFRvSGVhZFBvc2UoaW50NjRfdCB0aW1lc3RhbXAsIGNvbnN0IFBvc2UzZiYgd29ybGRUb0hlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2lzdDNmJiBoZWFkVHdpc3QpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdvcmxkLXRvLXNjcmVlbiBwb3NlLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBzZXRXb3JsZFRvU2NyZWVuUG9zZShpbnQ2NF90IHRpbWVzdGFtcCwgY29uc3QgUG9zZTNmJiB3b3JsZFRvU2NyZWVuKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNjcmVlbi10by1zdGFnZSBwb3NlLCB1c2VkIGluIGFsbCBtb2Rlcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgc2V0U2NyZWVuVG9TdGFnZVBvc2UoY29uc3QgUG9zZTNmJiBzY3JlZW5Ub1N0YWdlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkaXNwbGF5IG9yaWVudGF0aW9uLgorICAgICAqIE9yaWVudGF0aW9uIGlzIGV4cHJlc3NlZCBpbiB0aGUgYW5nbGUgb2Ygcm90YXRpb24gZnJvbSB0aGUgcGh5c2ljYWwgInVwIiBzaWRlIG9mIHRoZSBzY3JlZW4KKyAgICAgKiB0byB0aGUgbG9naWNhbCAidXAiIHNpZGUgb2YgdGhlIGNvbnRlbnQgZGlzcGxheWVkIHRoZSBzY3JlZW4uIENvdW50ZXJjbG9ja3dpc2UgYW5nbGVzLCBhcworICAgICAqIHZpZXdlZCB3aGlsZSBmYWNpbmcgdGhlIHNjcmVlbiBhcmUgcG9zaXRpdmUuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHNldERpc3BsYXlPcmllbnRhdGlvbihmbG9hdCBwaHlzaWNhbFRvTG9naWNhbEFuZ2xlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGFsbCB0aGUgcHJldmlvdXMgaW5wdXRzIGFuZCB1cGRhdGUgdGhlIG91dHB1dHMuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGNhbGN1bGF0ZShpbnQ2NF90IHRpbWVzdGFtcCkgPSAwOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhZ2dyZWdhdGUgaGVhZC10by1zdGFnZSBwb3NlIChwcmltYXJ5IG91dHB1dCBvZiB0aGlzIG1vZHVsZSkuCisgICAgICovCisgICAgdmlydHVhbCBQb3NlM2YgZ2V0SGVhZFRvU3RhZ2VQb3NlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhY3R1YWwgaGVhZC10cmFja2luZyBtb2RlICh3aGljaCBtYXkgZGV2aWF0ZSBmcm9tIHRoZSBkZXNpcmVkIG9uZSBhcyBtZW50aW9uZWQgaW4gdGhlCisgICAgICogY2xhc3MgZG9jdW1lbnRhdGlvbiBhYm92ZSkuCisgICAgICovCisgICAgdmlydHVhbCBIZWFkVHJhY2tpbmdNb2RlIGdldEFjdHVhbE1vZGUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhdXNlcyB0aGUgY3VycmVudCBwb3NlcyBmb3IgYm90aCB0aGUgaGVhZCBhbmQvb3Igc2NyZWVuIHRvIGJlIGNvbnNpZGVyZWQgImNlbnRlciIuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHJlY2VudGVyKGJvb2wgcmVjZW50ZXJIZWFkID0gdHJ1ZSwgYm9vbCByZWNlbnRlclNjcmVlbiA9IHRydWUpID0gMDsKK307CisKKy8qKgorICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmZWF0dXJpbmcgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBIZWFkVHJhY2tpbmdQcm9jZXNzb3IgaW50ZXJmYWNlLgorICovCitzdGQ6OnVuaXF1ZV9wdHI8SGVhZFRyYWNraW5nUHJvY2Vzc29yPiBjcmVhdGVIZWFkVHJhY2tpbmdQcm9jZXNzb3IoCisgICAgICAgIGNvbnN0IEhlYWRUcmFja2luZ1Byb2Nlc3Nvcjo6T3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgSGVhZFRyYWNraW5nTW9kZSBpbml0aWFsTW9kZSA9IEhlYWRUcmFja2luZ01vZGU6OlNUQVRJQyk7CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL1Bvc2UuaCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL1Bvc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjYwYmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL2luY2x1ZGUvbWVkaWEvUG9zZS5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCisvKioKKyAqIEEgNi1Eb0YgcG9zZS4KKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHByb3BlciByaWdpZCB0cmFuc2Zvcm1hdGlvbiAodHJhbnNsYXRpb24gKyByb3RhdGlvbikgYmV0d2VlbiBhIHJlZmVyZW5jZQorICogZnJhbWUgYW5kIGEgdGFyZ2V0IGZyYW1lLAorICoKKyAqIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaXhfZGVncmVlc19vZl9mcmVlZG9tCisgKi8KK2NsYXNzIFBvc2UzZiB7CisgIHB1YmxpYzoKKyAgICAvKiogVHlwaWNhbCBwcmVjaXNpb24gZm9yIGlzQXBwcm94IGNvbXBhcmlzb25zLiAqLworICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0R1bW15UHJlY2lzaW9uID0gMWUtNWY7CisKKyAgICBQb3NlM2YoY29uc3QgRWlnZW46OlZlY3RvcjNmJiB0cmFuc2xhdGlvbiwgY29uc3QgRWlnZW46OlF1YXRlcm5pb25mJiByb3RhdGlvbikKKyAgICAgICAgOiBtVHJhbnNsYXRpb24odHJhbnNsYXRpb24pLCBtUm90YXRpb24ocm90YXRpb24pIHt9CisKKyAgICBleHBsaWNpdCBQb3NlM2YoY29uc3QgRWlnZW46OlZlY3RvcjNmJiB0cmFuc2xhdGlvbikKKyAgICAgICAgOiBQb3NlM2YodHJhbnNsYXRpb24sIEVpZ2VuOjpRdWF0ZXJuaW9uZjo6SWRlbnRpdHkoKSkge30KKworICAgIGV4cGxpY2l0IFBvc2UzZihjb25zdCBFaWdlbjo6UXVhdGVybmlvbmYmIHJvdGF0aW9uKQorICAgICAgICA6IFBvc2UzZihFaWdlbjo6VmVjdG9yM2Y6Olplcm8oKSwgcm90YXRpb24pIHt9CisKKyAgICBQb3NlM2YoKSA6IFBvc2UzZihFaWdlbjo6VmVjdG9yM2Y6Olplcm8oKSwgRWlnZW46OlF1YXRlcm5pb25mOjpJZGVudGl0eSgpKSB7fQorCisgICAgUG9zZTNmKGNvbnN0IFBvc2UzZiYgb3RoZXIpIHsgKnRoaXMgPSBvdGhlcjsgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGluc3RhbmNlIGZyb20gYSB2ZWN0b3Itb2YtZmxvYXRzIHJlcHJlc2VudGF0aW9uLgorICAgICAqIFRoZSB2ZWN0b3IgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBleGFjdGx5IDYgZWxlbWVudHMsIHdoZXJlIHRoZSBmaXJzdCB0aHJlZSBhcmUgYSB0cmFuc2xhdGlvbgorICAgICAqIHZlY3RvciBhbmQgdGhlIGxhc3QgdGhyZWUgYXJlIGEgcm90YXRpb24gdmVjdG9yLgorICAgICAqCisgICAgICogUmV0dXJucyBudWxsb3B0IGlmIHRoZSBpbnB1dCB2ZWN0b3IgaXMgaWxsZWdhbC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjpvcHRpb25hbDxQb3NlM2Y+IGZyb21WZWN0b3IoY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiB2ZWMpOworCisgICAgLyoqCisgICAgICogQ29udmVydCBpbnN0YW5jZSB0byBhIHZlY3Rvci1vZi1mbG9hdHMgcmVwcmVzZW50YXRpb24uCisgICAgICogVGhlIHZlY3RvciB3aWxsIGhhdmUgZXhhY3RseSA2IGVsZW1lbnRzLCB3aGVyZSB0aGUgZmlyc3QgdGhyZWUgYXJlIGEgdHJhbnNsYXRpb24gdmVjdG9yIGFuZAorICAgICAqIHRoZSBsYXN0IHRocmVlIGFyZSBhIHJvdGF0aW9uIHZlY3Rvci4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gdG9WZWN0b3IoKSBjb25zdDsKKworICAgIFBvc2UzZiYgb3BlcmF0b3I9KGNvbnN0IFBvc2UzZiYgb3RoZXIpIHsKKyAgICAgICAgbVRyYW5zbGF0aW9uID0gb3RoZXIubVRyYW5zbGF0aW9uOworICAgICAgICBtUm90YXRpb24gPSBvdGhlci5tUm90YXRpb247CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBFaWdlbjo6VmVjdG9yM2YgdHJhbnNsYXRpb24oKSBjb25zdCB7IHJldHVybiBtVHJhbnNsYXRpb247IH07CisgICAgRWlnZW46OlF1YXRlcm5pb25mIHJvdGF0aW9uKCkgY29uc3QgeyByZXR1cm4gbVJvdGF0aW9uOyB9OworCisgICAgLyoqCisgICAgICogUmV2ZXJzZXMgdGhlIHJlZmVyZW5jZSBhbmQgdGFyZ2V0IGZyYW1lcy4KKyAgICAgKi8KKyAgICBQb3NlM2YgaW52ZXJzZSgpIGNvbnN0IHsKKyAgICAgICAgRWlnZW46OlF1YXRlcm5pb25mIGludlJvdGF0aW9uID0gbVJvdGF0aW9uLmludmVyc2UoKTsKKyAgICAgICAgcmV0dXJuIFBvc2UzZigtKGludlJvdGF0aW9uICogdHJhbnNsYXRpb24oKSksIGludlJvdGF0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wb3NlcyAoY2hhaW5zKSB0b2dldGhlciB0d28gcG9zZXMuIEJ5IGNvbnZlbnRpb24sIHRoaXMgb25seSBtYWtlcyBzZW5zZSBpZiB0aGUgdGFyZ2V0CisgICAgICogZnJhbWUgb2YgdGhlIGxlZnQtaGFuZCBwb3NlIGlzIHRoZSBzYW1lIHRoZSByZWZlcmVuY2UgZnJhbWUgb2YgdGhlIHJpZ2h0LWhhbmQgcG9zZS4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBvcGVyYXRvciBpcyBub3QgY29tbXV0YXRpdmUuCisgICAgICovCisgICAgUG9zZTNmIG9wZXJhdG9yKihjb25zdCBQb3NlM2YmIG90aGVyKSBjb25zdCB7CisgICAgICAgIFBvc2UzZiByZXN1bHQgPSAqdGhpczsKKyAgICAgICAgcmVzdWx0ICo9IG90aGVyOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIFBvc2UzZiYgb3BlcmF0b3IqPShjb25zdCBQb3NlM2YmIG90aGVyKSB7CisgICAgICAgIG1UcmFuc2xhdGlvbiArPSBtUm90YXRpb24gKiBvdGhlci5tVHJhbnNsYXRpb247CisgICAgICAgIG1Sb3RhdGlvbiAqPSBvdGhlci5tUm90YXRpb247CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGFuIGltcHJlY2lzZSAiZnV6enkiIGNvbXBhcmlzb24sIHdoaWNoIGlzIG9ubHkgdG8gYmUgdXNlZCBmb3IgdmFsaWRpdHktdGVzdGluZworICAgICAqIHB1cnBvc2VzLgorICAgICAqLworICAgIGJvb2wgaXNBcHByb3goY29uc3QgUG9zZTNmJiBvdGhlciwgZmxvYXQgcHJlYyA9IGtEdW1teVByZWNpc2lvbikgY29uc3QgeworICAgICAgICByZXR1cm4gKG1UcmFuc2xhdGlvbiAtIG90aGVyLm1UcmFuc2xhdGlvbikubm9ybSgpIDwgcHJlYyAmJgorICAgICAgICAgICAgICAgLy8gUXVhdGVybmlvbnMgYXJlIGVxdWl2YWxlbnQgdW5kZXIgc2lnbiBpbnZlcnNpb24uCisgICAgICAgICAgICAgICAoKG1Sb3RhdGlvbi5jb2VmZnMoKSAtIG90aGVyLm1Sb3RhdGlvbi5jb2VmZnMoKSkubm9ybSgpIDwgcHJlYyB8fAorICAgICAgICAgICAgICAgIChtUm90YXRpb24uY29lZmZzKCkgKyBvdGhlci5tUm90YXRpb24uY29lZmZzKCkpLm5vcm0oKSA8IHByZWMpOworICAgIH0KKworICBwcml2YXRlOgorICAgIEVpZ2VuOjpWZWN0b3IzZiBtVHJhbnNsYXRpb247CisgICAgRWlnZW46OlF1YXRlcm5pb25mIG1Sb3RhdGlvbjsKK307CisKKy8qKgorICogUHJldHR5LXByaW50ZXIgZm9yIFBvc2UzZi4KKyAqLworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFBvc2UzZiYgcG9zZSk7CisKKy8qKgorICogTW92ZSBiZXR3ZWVuIHRoZSAnZnJvbScgcG9zZSBhbmQgdGhlICd0bycgcG9zZSwgd2hpbGUgbWFraW5nIHN1cmUgdmVsb2NpdHkgbGltaXRzIGFyZSBlbmZvcmNlZC4KKyAqIElmIHZlbG9jaXR5IGxpbWl0cyBhcmUgbm90IHZpb2xhdGVkLCByZXR1cm5zIHRoZSAndG8nIHBvc2UgYW5kIGZhbHNlLgorICogSWYgdmVsb2NpdHkgbGltaXRzIGFyZSB2aW9sYXRlZCwgcmV0dXJucyBwb3NlIGZhcnRoZXN0IGFsb25nIHRoZSBwYXRoIHRoYXQgY2FuIGJlIHJlYWNoZWQgd2l0aGluCisgKiB0aGUgbGltaXRzLCBhbmQgdHJ1ZS4KKyAqLworc3RkOjp0dXBsZTxQb3NlM2YsIGJvb2w+IG1vdmVXaXRoUmF0ZUxpbWl0KGNvbnN0IFBvc2UzZiYgZnJvbSwgY29uc3QgUG9zZTNmJiB0bywgZmxvYXQgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhUcmFuc2xhdGlvbmFsVmVsb2NpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4Um90YXRpb25hbFZlbG9jaXR5KTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL2luY2x1ZGUvbWVkaWEvU2Vuc29yUG9zZVByb3ZpZGVyLmggYi9tZWRpYS9saWJoZWFkdHJhY2tpbmcvaW5jbHVkZS9tZWRpYS9TZW5zb3JQb3NlUHJvdmlkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQyMDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVhZHRyYWNraW5nL2luY2x1ZGUvbWVkaWEvU2Vuc29yUG9zZVByb3ZpZGVyLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG9wdGlvbmFsPgorCisjaW5jbHVkZSA8YW5kcm9pZC9zZW5zb3IuaD4KKyNpbmNsdWRlIDxzZW5zb3IvU2Vuc29yLmg+CisKKyNpbmNsdWRlICJQb3NlLmgiCisjaW5jbHVkZSAiVHdpc3QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworLyoqCisgKiBBIHV0aWxpdHkgcHJvdmlkaW5nIHN0cmVhbWluZyBvZiBwb3NlIGRhdGEgZnJvbSBtb3Rpb24gc2Vuc29ycyBwcm92aWRlZCBieSB0aGUgU2Vuc29yIEZyYW1ld29yay4KKyAqCisgKiBBIGxpdmUgaW5zdGFuY2Ugb2YgdGhpcyBpbnRlcmZhY2Uga2VlcHMgYXJvdW5kIHNvbWUgcmVzb3VyY2VzIHJlcXVpcmVkIGZvciBhY2Nlc3Npbmcgc2Vuc29yCisgKiByZWFkaW5ncyAoZS5nLiBhIHRocmVhZCBhbmQgYSBxdWV1ZSkuIFRob3NlIHdvdWxkIGJlIHJlbGVhc2VkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGRlbGV0ZWQuCisgKgorICogT25jZSBhbGl2ZSwgaW5kaXZpZHVhbCBzZW5zb3JzIGNhbiBiZSBzdWJzY3JpYmVkIHRvIHVzaW5nIHN0YXJ0U2Vuc29yKCkgYW5kIHVwZGF0ZXMgY2FuIGJlCisgKiBzdG9wcGVkIHZpYSBzdG9wU2Vuc29yKCkuIFRob3NlIHR3byBtZXRob2RzIHNob3VsZCBub3QgYmUgY2FsbGVkIGNvbmN1cnJlbnRseSBhbmQgY29ycmVjdCB1c2FnZQorICogaXMgYXNzdW1lZC4KKyAqLworY2xhc3MgU2Vuc29yUG9zZVByb3ZpZGVyIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBJTlZBTElEX0hBTkRMRSA9IEFTRU5TT1JfSU5WQUxJRDsKKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSBmb3IgY29uc3VtaW5nIHBvc2UtcmVsYXRlZCBzZW5zb3IgZXZlbnRzLgorICAgICAqCisgICAgICogVGhlIGxpc3RlbmVyIHdpbGwgYmUgcHJvdmlkZWQgd2l0aCBhIHN0cmVhbSBvZiBldmVudHMsIGVhY2ggaW5jbHVkaW5nOgorICAgICAqIC0gQSBoYW5kbGUgb2YgdGhlIHNlbnNvciByZXNwb25zaWJsZSBmb3IgdGhlIGV2ZW50LgorICAgICAqIC0gVGltZXN0YW1wLgorICAgICAqIC0gUG9zZS4KKyAgICAgKiAtIE9wdGlvbmFsIHR3aXN0ICh0aW1lLWRlcml2YXRpdmUgb2YgcG9zZSkuCisgICAgICoKKyAgICAgKiBTZW5zb3JzIGhhdmluZyBvbmx5IG9yaWVudGF0aW9uIGRhdGEgd2lsbCBoYXZlIHRoZSB0cmFuc2xhdGlvbiBwYXJ0IG9mIHRoZSBwb3NlIHNldCB0bworICAgICAqIGlkZW50aXR5LgorICAgICAqCisgICAgICogRXZlbnRzIGFyZSBkZWxpdmVyZWQgaW4gYSBzZXJpYWxpemVkIG1hbm5lciAoaS5lLiBjYWxsYmFja3MgZG8gbm90IG5lZWQgdG8gYmUgcmVlbnRyYW50KS4KKyAgICAgKiBDYWxsYmFja3Mgc2hvdWxkIG5vdCBibG9jay4KKyAgICAgKi8KKyAgICBjbGFzcyBMaXN0ZW5lciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfkxpc3RlbmVyKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZpcnR1YWwgdm9pZCBvblBvc2UoaW50NjRfdCB0aW1lc3RhbXAsIGludDMyX3QgaGFuZGxlLCBjb25zdCBQb3NlM2YmIHBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxUd2lzdDNmPiYgdHdpc3QsIGJvb2wgaXNOZXdSZWZlcmVuY2UpID0gMDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBTZW5zb3JQb3NlUHJvdmlkZXIgaW5zdGFuY2UuCisgICAgICogRXZlbnRzIHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBsaXN0ZW5lciBhcyBsb25nIGFzIHRoZSByZXR1cm5lZCBpbnN0YW5jZSBpcyBrZXB0IGFsaXZlLgorICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBDbGllbnQncyBwYWNrYWdlIG5hbWUuCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0aGF0IHdpbGwgZ2V0IHRoZSBldmVudHMuCisgICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxscHRyIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFNlbnNvclBvc2VQcm92aWRlcj4gY3JlYXRlKGNvbnN0IGNoYXIqIHBhY2thZ2VOYW1lLCBMaXN0ZW5lciogbGlzdGVuZXIpOworCisgICAgdmlydHVhbCB+U2Vuc29yUG9zZVByb3ZpZGVyKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogU3RhcnQgcmVjZWl2aW5nIHBvc2UgdXBkYXRlcyBmcm9tIGEgZ2l2ZW4gc2Vuc29yLgorICAgICAqIEF0dGVtcHRpbmcgdG8gc3RhcnQgYSBzZW5zb3IgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQgcmVzdWx0cyBpbiB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgICogQHBhcmFtIHNlbnNvciBUaGUgc2Vuc29yIHRvIHN1YnNjcmliZSB0by4KKyAgICAgKiBAcGFyYW0gc2FtcGxpbmdQZXJpb2QgU2FtcGxpbmcgaW50ZXJ2YWwsIGluIG1pY3Jvc2Vjb25kcy4gQWN0dWFsIHJhdGUgbWlnaHQgYmUgc2xpZ2h0bHkKKyAgICAgKiBkaWZmZXJlbnQuCisgICAgICogQHJldHVybiB0cnVlIGlmZiBzdWNjZWVkZWQuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHN0YXJ0U2Vuc29yKGludDMyX3Qgc2Vuc29yLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIHNhbXBsaW5nUGVyaW9kKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdG9wIGEgc2Vuc29yLCBwcmV2aW91c2x5IHN0YXJ0ZWQgd2l0aCBzdGFydFNlbnNvcigpLiBJdCBpcyBub3QgcmVxdWlyZWQgdG8gc3RvcCBhbGwgc2Vuc29ycworICAgICAqIGJlZm9yZSBkZWxldGluZyB0aGUgU2Vuc29yUG9zZVByb3ZpZGVyIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSBoYW5kbGUgVGhlIHNlbnNvciBoYW5kbGUsIGFzIHByb3ZpZGVkIHRvIHN0YXJ0U2Vuc29yKCkuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHN0b3BTZW5zb3IoaW50MzJfdCBoYW5kbGUpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNlbnNvciBvciBudWxsb3B0IGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAqCisgICAgICogVGhlIFNlbnNvciBvYmplY3QgaGFzIGNvbnN0IG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlZCB0bworICAgICAqIGRpc2NvdmVyIHByb3BlcnRpZXMgb2YgdGhlIHNlbnNvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6b3B0aW9uYWw8Y29uc3QgU2Vuc29yPiBnZXRTZW5zb3JCeUhhbmRsZShpbnQzMl90IGhhbmRsZSkgPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVhZHRyYWNraW5nL2luY2x1ZGUvbWVkaWEvVHdpc3QuaCBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL1R3aXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkxY2VhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlYWR0cmFja2luZy9pbmNsdWRlL21lZGlhL1R3aXN0LmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorCisjaW5jbHVkZSAiUG9zZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCisvKioKKyAqIEEgNi1Eb0YgdHdpc3QuCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHRyYW5zbGF0aW9uYWwgYW5kIHJvdGF0aW9uYWwgdmVsb2NpdHkgb2YgYSByaWdpZCBvYmplY3QsIHR5cGljYWxseQorICogcmVsYXRpdmUgdG8gaXRzIG93biBjb29yZGluYXRlLWZyYW1lLgorICogSXQgaXMgY3JlYXRlZCBieSB0d28gMy12ZWN0b3JzLCBvbmUgcmVwcmVzZW50aW5nIGxpbmVhciBtb3Rpb24gcGVyIHRpbWUtdW5pdCBhbmQgdGhlIG90aGVyLCBhCisgKiByb3RhdGlvbi12ZWN0b3IgaW4gcmFkaWFucyBwZXIgdGltZS11bml0IChyaWdodC1oYW5kZWQpLgorICovCitjbGFzcyBUd2lzdDNmIHsKKyAgcHVibGljOgorICAgIFR3aXN0M2YoY29uc3QgRWlnZW46OlZlY3RvcjNmJiB0cmFuc2xhdGlvbmFsVmVsb2NpdHksIGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgcm90YXRpb25hbFZlbG9jaXR5KQorICAgICAgICA6IG1UcmFuc2xhdGlvbmFsVmVsb2NpdHkodHJhbnNsYXRpb25hbFZlbG9jaXR5KSwgbVJvdGF0aW9uYWxWZWxvY2l0eShyb3RhdGlvbmFsVmVsb2NpdHkpIHt9CisKKyAgICBUd2lzdDNmKCkgOiBUd2lzdDNmKEVpZ2VuOjpWZWN0b3IzZjo6WmVybygpLCBFaWdlbjo6VmVjdG9yM2Y6Olplcm8oKSkge30KKworICAgIFR3aXN0M2YoY29uc3QgVHdpc3QzZiYgb3RoZXIpIHsgKnRoaXMgPSBvdGhlcjsgfQorCisgICAgVHdpc3QzZiYgb3BlcmF0b3I9KGNvbnN0IFR3aXN0M2YmIG90aGVyKSB7CisgICAgICAgIG1UcmFuc2xhdGlvbmFsVmVsb2NpdHkgPSBvdGhlci5tVHJhbnNsYXRpb25hbFZlbG9jaXR5OworICAgICAgICBtUm90YXRpb25hbFZlbG9jaXR5ID0gb3RoZXIubVJvdGF0aW9uYWxWZWxvY2l0eTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEVpZ2VuOjpWZWN0b3IzZiB0cmFuc2xhdGlvbmFsVmVsb2NpdHkoKSBjb25zdCB7IHJldHVybiBtVHJhbnNsYXRpb25hbFZlbG9jaXR5OyB9CisgICAgRWlnZW46OlZlY3RvcjNmIHJvdGF0aW9uYWxWZWxvY2l0eSgpIGNvbnN0IHsgcmV0dXJuIG1Sb3RhdGlvbmFsVmVsb2NpdHk7IH0KKworICAgIGZsb2F0IHNjYWxhclRyYW5zbGF0aW9uYWxWZWxvY2l0eSgpIGNvbnN0IHsgcmV0dXJuIG1UcmFuc2xhdGlvbmFsVmVsb2NpdHkubm9ybSgpOyB9CisgICAgZmxvYXQgc2NhbGFyUm90YXRpb25hbFZlbG9jaXR5KCkgY29uc3QgeyByZXR1cm4gbVJvdGF0aW9uYWxWZWxvY2l0eS5ub3JtKCk7IH0KKworICAgIGJvb2wgaXNBcHByb3goY29uc3QgVHdpc3QzZiYgb3RoZXIsCisgICAgICAgICAgICAgICAgICBmbG9hdCBwcmVjID0gRWlnZW46Ok51bVRyYWl0czxmbG9hdD46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHJhbnNsYXRpb25hbFZlbG9jaXR5LmlzQXBwcm94KG90aGVyLm1UcmFuc2xhdGlvbmFsVmVsb2NpdHksIHByZWMpICYmCisgICAgICAgICAgICAgICBtUm90YXRpb25hbFZlbG9jaXR5LmlzQXBwcm94KG90aGVyLm1Sb3RhdGlvbmFsVmVsb2NpdHksIHByZWMpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVHdpc3QzZiBvcGVyYXRvciooY29uc3QgVCYgcykgY29uc3QgeworICAgICAgICByZXR1cm4gVHdpc3QzZihtVHJhbnNsYXRpb25hbFZlbG9jaXR5ICogcywgbVJvdGF0aW9uYWxWZWxvY2l0eSAqIHMpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVHdpc3QzZiBvcGVyYXRvci8oY29uc3QgVCYgcykgY29uc3QgeworICAgICAgICByZXR1cm4gVHdpc3QzZihtVHJhbnNsYXRpb25hbFZlbG9jaXR5IC8gcywgbVJvdGF0aW9uYWxWZWxvY2l0eSAvIHMpOworICAgIH0KKworICBwcml2YXRlOgorICAgIEVpZ2VuOjpWZWN0b3IzZiBtVHJhbnNsYXRpb25hbFZlbG9jaXR5OworICAgIEVpZ2VuOjpWZWN0b3IzZiBtUm90YXRpb25hbFZlbG9jaXR5OworfTsKKworLyoqCisgKiBJbnRlZ3JhdGUgYSB0d2lzdCBvdmVyIHRpbWUgdG8gb2J0YWluIGEgcG9zZS4KKyAqIGR0IGlzIHRoZSB0aW1lIG92ZXIgd2hpY2ggdG8gaW50ZWdyYXRpb24uCisgKiBUaGUgcmVzdWx0aW5nIHBvc2UgcmVwcmVzZW50cyB0aGUgdHJhbnNmb3JtYXRpb24gYmV0d2VlbiB0aGUgc3RhcnRpbmcgcG9pbnQgYW5kIHRoZSBlbmRpbmcgcG9pbnQKKyAqIG9mIHRoZSBtb3Rpb24gb3ZlciB0aGUgdGltZSBwZXJpb2QuCisgKi8KK1Bvc2UzZiBpbnRlZ3JhdGUoY29uc3QgVHdpc3QzZiYgdHdpc3QsIGZsb2F0IGR0KTsKKworLyoqCisgKiBEaWZmZXJlbnRpYXRlIHBvc2UgdG8gb2J0YWluIGEgdHdpc3QuCisgKiBkdCBpcyB0aGUgdGltZSBvZiB0aGUgbW90aW9uIGJldHdlZW4gdGhlIHJlZmVyZW5jZSBhbmQgdGhlIHRhcmdldCBmcmFtZXMgb2YgdGhlIHBvc2UuCisgKi8KK1R3aXN0M2YgZGlmZmVyZW50aWF0ZShjb25zdCBQb3NlM2YmIHBvc2UsIGZsb2F0IGR0KTsKKworLyoqCisgKiBQcmV0dHktcHJpbnRlciBmb3IgdHdpc3QuCisgKi8KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBUd2lzdDNmJiB0d2lzdCk7CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvQW5kcm9pZC5icCBiL21lZGlhL2xpYmhlaWYvQW5kcm9pZC5icAppbmRleCA2YTM0MjdlLi41NWJhNjFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliaGVpZi9BbmRyb2lkLmJwCkBAIC0yNiw3ICsyNiw1IEBACiAgICAgICAgICItV2FsbCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogW10sCi0KICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcCBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcAppbmRleCA0YTk2ZTdiLi4xYjg2NTZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKKysrIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCkBAIC0xNSw2ICsxNSw3IEBACiAgKi8KIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgImluY2x1ZGUvSGVpZkRlY29kZXJBUEkuaCIKICNkZWZpbmUgTE9HX1RBRyAiSGVpZkRlY29kZXJJbXBsIgogCiAjaW5jbHVkZSAiSGVpZkRlY29kZXJJbXBsLmgiCkBAIC00Niw2ICs0Nyw3IEBACiAgICAgaW5mby0+bVJvdGF0aW9uQW5nbGUgPSB2aWRlb0ZyYW1lLT5tUm90YXRpb25BbmdsZTsKICAgICBpbmZvLT5tQnl0ZXNQZXJQaXhlbCA9IHZpZGVvRnJhbWUtPm1CeXRlc1BlclBpeGVsOwogICAgIGluZm8tPm1EdXJhdGlvblVzID0gdmlkZW9GcmFtZS0+bUR1cmF0aW9uVXM7CisgICAgaW5mby0+bUJpdERlcHRoID0gdmlkZW9GcmFtZS0+bUJpdERlcHRoOwogICAgIGlmICh2aWRlb0ZyYW1lLT5tSWNjU2l6ZSA+IDApIHsKICAgICAgICAgaW5mby0+bUljY0RhdGEuYXNzaWduKAogICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPmdldEZsYXR0ZW5lZEljY0RhdGEoKSwKQEAgLTM3NiwxMyArMzc4LDE0IEBACiAgICAgICAgIC8vICAgICAgIGlzc3VlIChlLmcuIGJ5IGNvcHlpbmcpLgogICAgICAgICBWaWRlb0ZyYW1lKiB2aWRlb0ZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KHNoYXJlZE1lbS0+dW5zZWN1cmVQb2ludGVyKCkpOwogCi0gICAgICAgIEFMT0dWKCJJbWFnZSBkaW1lbnNpb24gJWR4JWQsIGRpc3BsYXkgJWR4JWQsIGFuZ2xlICVkLCBpY2NTaXplICVkIiwKKyAgICAgICAgQUxPR1YoIkltYWdlIGRpbWVuc2lvbiAlZHglZCwgZGlzcGxheSAlZHglZCwgYW5nbGUgJWQsIGljY1NpemUgJWQsIGJpdERlcHRoICVkIiwKICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tV2lkdGgsCiAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+bUhlaWdodCwKICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tRGlzcGxheVdpZHRoLAogICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1EaXNwbGF5SGVpZ2h0LAogICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1Sb3RhdGlvbkFuZ2xlLAotICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1JY2NTaXplKTsKKyAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tSWNjU2l6ZSwKKyAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tQml0RGVwdGgpOwogCiAgICAgICAgIGluaXRGcmFtZUluZm8oJm1JbWFnZUluZm8sIHZpZGVvRnJhbWUpOwogCkBAIC00NzEsNyArNDc0LDcgQEAKIH0KIAogYm9vbCBIZWlmRGVjb2RlckltcGw6OnNldE91dHB1dENvbG9yKEhlaWZDb2xvckZvcm1hdCBoZWlmQ29sb3IpIHsKLSAgICBpZiAoaGVpZkNvbG9yID09IG1PdXRwdXRDb2xvcikgeworICAgIGlmIChoZWlmQ29sb3IgPT0gKEhlaWZDb2xvckZvcm1hdCltT3V0cHV0Q29sb3IpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC00OTEsNiArNDk0LDExIEBACiAgICAgICAgICAgICBtT3V0cHV0Q29sb3IgPSBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4ODsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGNhc2Uga0hlaWZDb2xvckZvcm1hdF9SR0JBXzEwMTAxMDI6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1PdXRwdXRDb2xvciA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBvdXRwdXQgY29sb3IgZm9ybWF0ICVkIiwgaGVpZkNvbG9yKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTcyMyw0ICs3MzEsMTMgQEAKICAgICByZXR1cm4gKG1DdXJTY2FubGluZSA+IG9sZFNjYW5saW5lKSA/IChtQ3VyU2NhbmxpbmUgLSBvbGRTY2FubGluZSkgOiAwOwogfQogCit1aW50MzJfdCBIZWlmRGVjb2RlckltcGw6OmdldENvbG9yRGVwdGgoKSB7CisgICAgSGVpZkZyYW1lSW5mbyogaW5mbyA9ICZtSW1hZ2VJbmZvOworICAgIGlmIChpbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1JbWFnZUluZm8ubUJpdERlcHRoOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5oIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuaAppbmRleCAyYjljNzEwLi44NmE4NjI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5oCisrKyBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmgKQEAgLTU0LDYgKzU0LDggQEAKIAogICAgIHNpemVfdCBza2lwU2NhbmxpbmVzKHNpemVfdCBjb3VudCkgb3ZlcnJpZGU7CiAKKyAgICB1aW50MzJfdCBnZXRDb2xvckRlcHRoKCkgb3ZlcnJpZGU7CisKIHByaXZhdGU6CiAgICAgc3RydWN0IERlY29kZVRocmVhZDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmggYi9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaAppbmRleCA5MDczNjcyLi5kYzEyNDg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaAorKysgYi9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaApAQCAtMjMsOSArMjMsMTAgQEAKICAqIFRoZSBvdXRwdXQgY29sb3IgcGl4ZWwgZm9ybWF0IG9mIGhlaWYgZGVjb2Rlci4KICAqLwogdHlwZWRlZiBlbnVtIHsKLSAgICBrSGVpZkNvbG9yRm9ybWF0X1JHQjU2NSAgICAgPSAwLAotICAgIGtIZWlmQ29sb3JGb3JtYXRfUkdCQV84ODg4ICA9IDEsCi0gICAga0hlaWZDb2xvckZvcm1hdF9CR1JBXzg4ODggID0gMiwKKyAgICBrSGVpZkNvbG9yRm9ybWF0X1JHQjU2NSAgICAgICA9IDAsCisgICAga0hlaWZDb2xvckZvcm1hdF9SR0JBXzg4ODggICAgPSAxLAorICAgIGtIZWlmQ29sb3JGb3JtYXRfQkdSQV84ODg4ICAgID0gMiwKKyAgICBrSGVpZkNvbG9yRm9ybWF0X1JHQkFfMTAxMDEwMiA9IDMsCiB9IEhlaWZDb2xvckZvcm1hdDsKIAogLyoKQEAgLTQ1LDcgKzQ2LDggQEAKICAgICB1aW50MzJfdCBtSGVpZ2h0OwogICAgIGludDMyX3QgIG1Sb3RhdGlvbkFuZ2xlOyAgICAgICAgICAgLy8gUm90YXRpb24gYW5nbGUsIGNsb2Nrd2lzZSwgc2hvdWxkIGJlIG11bHRpcGxlIG9mIDkwCiAgICAgdWludDMyX3QgbUJ5dGVzUGVyUGl4ZWw7ICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgZm9yIG9uZSBwaXhlbAotICAgIGludDY0X3QgbUR1cmF0aW9uVXM7ICAgICAgICAgICAgICAgLy8gRHVyYXRpb24gb2YgdGhlIGZyYW1lIGluIHVzCisgICAgaW50NjRfdCAgbUR1cmF0aW9uVXM7ICAgICAgICAgICAgICAvLyBEdXJhdGlvbiBvZiB0aGUgZnJhbWUgaW4gdXMKKyAgICB1aW50MzJfdCBtQml0RGVwdGg7ICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBiaXRzIGZvciBlYWNoIG9mIHRoZSBSL0cvQiBjaGFubmVscwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1JY2NEYXRhOyAgICAgLy8gSUNDIGRhdGEgYXJyYXkKIH07CiAKQEAgLTE2MSw2ICsxNjMsMTEgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHNpemVfdCBza2lwU2NhbmxpbmVzKHNpemVfdCBjb3VudCkgPSAwOwogCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIGNvbG9yIGRlcHRoIGluIGJpdHMgZm9yIGVhY2ggb2YgdGhlIFIvRy9CIGNoYW5uZWxzLgorICAgICAqLworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q29sb3JEZXB0aCgpID0gMDsKKwogcHJpdmF0ZToKICAgICBIZWlmRGVjb2Rlcihjb25zdCBIZWlmRnJhbWVJbmZvJikgPSBkZWxldGU7CiAgICAgSGVpZkRlY29kZXImIG9wZXJhdG9yPShjb25zdCBIZWlmRnJhbWVJbmZvJikgPSBkZWxldGU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAppbmRleCBlOThkN2Q4Li4yZGQ1Nzg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKQEAgLTE5LDYgKzE5LDEwIEBACiAgICAgbmFtZTogImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBoZWFkZXJfbGliczogWwpAQCAtMjE0LDYgKzIxOCwxMSBAQAogICAgIG5hbWU6ICJsaWJtZWRpYV9taWRpaW93cmFwcGVyIiwKIAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgXSwKKwogCiAgICAgc3JjczogWyJNaWRpSW9XcmFwcGVyLmNwcCJdLAogCkBAIC0zNDcsNiArMzU2LDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCiAgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJhdi10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtMzc4LDEyICszODgsMTIgQEAKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsKLSAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgXSwKIApAQCAtNDQwLDYgKzQ1MCw2IEBACiAKICAgICBhcGV4X2F2YWlsYWJsZTogWwogICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCi0gICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKaW5kZXggYzg5YzAyMy4uYzlmMzYxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCkBAIC0xNyw3ICsxNyw2IEBACiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvSURhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKaW5kZXggNjdkMzNmYS4uODU3NjhiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKQEAgLTIwLDEyICsyMCwxNCBAQAogI2RlZmluZSBMT0dfVEFHICJNZWRpYVByb2ZpbGVzIgogCiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8ZXhwYXQuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVByb2ZpbGVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8T01YX1ZpZGVvLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KIApAQCAtODYsNyArODgsMjQgQEAKICAgICB7ImgyNjMiLCBWSURFT19FTkNPREVSX0gyNjN9LAogICAgIHsiaDI2NCIsIFZJREVPX0VOQ09ERVJfSDI2NH0sCiAgICAgeyJtNHYiLCAgVklERU9fRU5DT0RFUl9NUEVHXzRfU1B9LAotICAgIHsiaGV2YyIsIFZJREVPX0VOQ09ERVJfSEVWQ30KKyAgICB7InZwOCIsICBWSURFT19FTkNPREVSX1ZQOH0sCisgICAgeyJoZXZjIiwgVklERU9fRU5DT0RFUl9IRVZDfSwKKyAgICB7InZwOSIsICBWSURFT19FTkNPREVSX1ZQOX0sCisgICAgeyJkb2xieXZpc2lvbiIsIFZJREVPX0VOQ09ERVJfRE9MQllfVklTSU9OfSwKK307CisKK2NvbnN0IE1lZGlhUHJvZmlsZXM6Ok5hbWVUb1RhZ01hcCBNZWRpYVByb2ZpbGVzOjpzQ2hyb21hU3Vic2FtcGxpbmdOYW1lTWFwW10gPSB7CisgICAgeyJ5dXYgNDoyOjAiLCBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQyMH0sCisgICAgeyJ5dXYgNDoyOjIiLCBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQyMn0sCisgICAgeyJ5dXYgNDo0OjQiLCBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQ0NH0sCit9OworCitjb25zdCBNZWRpYVByb2ZpbGVzOjpOYW1lVG9UYWdNYXAgTWVkaWFQcm9maWxlczo6c0hkckZvcm1hdE5hbWVNYXBbXSA9IHsKKyAgICB7InNkciIsIEhEUl9GT1JNQVRfTk9ORX0sCisgICAgeyJobGciLCBIRFJfRk9STUFUX0hMR30sCisgICAgeyJoZHIxMCIsIEhEUl9GT1JNQVRfSERSMTB9LAorICAgIHsiaGRyMTArIiwgSERSX0ZPUk1BVF9IRFIxMFBMVVN9LAorICAgIHsiZG9sYnl2aXNpb24iLCBIRFJfRk9STUFUX0RPTEJZX1ZJU0lPTn0sCiB9OwogCiBjb25zdCBNZWRpYVByb2ZpbGVzOjpOYW1lVG9UYWdNYXAgTWVkaWFQcm9maWxlczo6c0F1ZGlvRW5jb2Rlck5hbWVNYXBbXSA9IHsKQEAgLTE2NCwxMiArMTgzLDE4IEBACiBNZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0NvZGVjKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMmIGNvZGVjIFVOVVNFRCkKIHsKICAgICBBTE9HVigidmlkZW8gY29kZWM6Iik7Ci0gICAgQUxPR1YoImNvZGVjID0gJWQiLCBjb2RlYy5tQ29kZWMpOworICAgIEFMT0dWKCJjb2RlYyA9ICVkICglcykiLCBjb2RlYy5tQ29kZWMsCisgICAgICAgICAgICBmaW5kTmFtZUZvclRhZyhzVmlkZW9FbmNvZGVyTmFtZU1hcCwgTkVMRU0oc1ZpZGVvRW5jb2Rlck5hbWVNYXApLCBjb2RlYy5tQ29kZWMpKTsKICAgICBBTE9HVigiYml0IHJhdGU6ICVkIiwgY29kZWMubUJpdFJhdGUpOwogICAgIEFMT0dWKCJmcmFtZSB3aWR0aDogJWQiLCBjb2RlYy5tRnJhbWVXaWR0aCk7CiAgICAgQUxPR1YoImZyYW1lIGhlaWdodDogJWQiLCBjb2RlYy5tRnJhbWVIZWlnaHQpOwogICAgIEFMT0dWKCJmcmFtZSByYXRlOiAlZCIsIGNvZGVjLm1GcmFtZVJhdGUpOwogICAgIEFMT0dWKCJwcm9maWxlOiAlZCIsIGNvZGVjLm1Qcm9maWxlKTsKKyAgICBBTE9HVigiY2hyb21hOiAlcyIsIGZpbmROYW1lRm9yVGFnKHNDaHJvbWFTdWJzYW1wbGluZ05hbWVNYXAsIE5FTEVNKHNDaHJvbWFTdWJzYW1wbGluZ05hbWVNYXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMubUNocm9tYVN1YnNhbXBsaW5nKSk7CisgICAgQUxPR1YoImJpdCBkZXB0aDogJWQiLCBjb2RlYy5tQml0RGVwdGgpOworICAgIEFMT0dWKCJoZHIgZm9ybWF0OiAlcyIsIGZpbmROYW1lRm9yVGFnKHNIZHJGb3JtYXROYW1lTWFwLCBORUxFTShzSGRyRm9ybWF0TmFtZU1hcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMubUhkckZvcm1hdCkpOwogfQogCiAvKnN0YXRpYyovIHZvaWQKQEAgLTIzMiw2ICsyNTcsMTU1IEBACiAgICAgcmV0dXJuIHRhZzsKIH0KIAorLypzdGF0aWMqLyBjb25zdCBjaGFyICoKK01lZGlhUHJvZmlsZXM6OmZpbmROYW1lRm9yVGFnKAorICAgICAgICBjb25zdCBNZWRpYVByb2ZpbGVzOjpOYW1lVG9UYWdNYXAgKm1hcCwgc2l6ZV90IG5NYXBwaW5ncywgaW50IHRhZywgY29uc3QgY2hhciAqZGVmXykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5NYXBwaW5nczsgKytpKSB7CisgICAgICAgIGlmIChtYXBbaV0udGFnID09IHRhZykgeworICAgICAgICAgICAgcmV0dXJuIG1hcFtpXS5uYW1lOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZWZfOworfQorCisvKnN0YXRpYyovIGJvb2wKK01lZGlhUHJvZmlsZXM6OmRldGVjdEFkdmFuY2VkVmlkZW9Qcm9maWxlKAorICAgICAgICB2aWRlb19lbmNvZGVyIGNvZGVjLCBpbnQgcHJvZmlsZSwKKyAgICAgICAgY2hyb21hX3N1YnNhbXBsaW5nICpjaHJvbWEsIGludCAqYml0RGVwdGgsIGhkcl9mb3JtYXQgKmhkcikKK3sKKyAgICAvLyBkZWZhdWx0IHZhbHVlcworICAgICpjaHJvbWEgPSBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQyMDsKKyAgICAqYml0RGVwdGggPSA4OworICAgICpoZHIgPSBIRFJfRk9STUFUX05PTkU7CisKKyAgICBzd2l0Y2ggKGNvZGVjKSB7CisgICAgY2FzZSBWSURFT19FTkNPREVSX0gyNjM6CisgICAgY2FzZSBWSURFT19FTkNPREVSX01QRUdfNF9TUDoKKyAgICBjYXNlIFZJREVPX0VOQ09ERVJfVlA4OgorICAgICAgICAvLyB0aGVzZSBhcmUgYWx3YXlzIDQ6MjowIFNEUiA4LWJpdAorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgVklERU9fRU5DT0RFUl9IMjY0OgorICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlQmFzZWxpbmU6CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmU6CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZU1haW46CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUV4dGVuZGVkOgorICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVIaWdoOgorICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2g6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDEwOgorICAgICAgICAgICAgLy8gcmV0dXJuaW5nIGZhbHNlIGhlcmUgYXMgdGhpcyBjb3VsZCBiZSBhbiBITEcgc3RyZWFtCisgICAgICAgICAgICAqYml0RGVwdGggPSAxMDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDQyMjoKKyAgICAgICAgICAgICpjaHJvbWEgPSBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQyMjsKKyAgICAgICAgICAgIC8vIHJldHVybmluZyBmYWxzZSBoZXJlIGFzIGJpdC1kZXB0aCBjb3VsZCBiZSA4IG9yIDEwCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUhpZ2g0NDQ6CisgICAgICAgICAgICAqY2hyb21hID0gQ0hST01BX1NVQlNBTVBMSU5HX1lVVl80NDQ7CisgICAgICAgICAgICAvLyByZXR1cm5pbmcgZmFsc2UgaGVyZSBhcyBiaXQtZGVwdGggY291bGQgYmUgOCBvciAxMAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIGZsb3cgZG9lcyBub3QgZ2V0IGhlcmUKKworICAgIGNhc2UgVklERU9fRU5DT0RFUl9IRVZDOgorICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW46CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW4xMDoKKyAgICAgICAgICAgICpiaXREZXB0aCA9IDEwOworICAgICAgICAgICAgLy8gcmV0dXJuaW5nIGZhbHNlIGhlcmUgYXMgdGhpcyBjb3VsZCBiZSBhbiBITEcgc3RyZWFtCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMDoKKyAgICAgICAgICAgICpiaXREZXB0aCA9IDEwOworICAgICAgICAgICAgKmhkciA9IEhEUl9GT1JNQVRfSERSMTA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW4xMEhEUjEwUGx1czoKKyAgICAgICAgICAgICpiaXREZXB0aCA9IDEwOworICAgICAgICAgICAgKmhkciA9IEhEUl9GT1JNQVRfSERSMTBQTFVTOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmxvdyBkb2VzIG5vdCBnZXQgaGVyZQorCisgICAgY2FzZSBWSURFT19FTkNPREVSX1ZQOToKKyAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTA6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlMjoKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgYWx3YXlzIDEwLWJpdCBvbiBBbmRyb2lkICovCisgICAgICAgICAgICAqYml0RGVwdGggPSAxMDsKKyAgICAgICAgICAgIC8vIHJldHVybmluZyBmYWxzZSBoZXJlIGFzIHRoaXMgY291bGQgYmUgYW4gSExHIHN0cmVhbQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIFZQOVByb2ZpbGUySERSOgorICAgICAgICAgICAgLy8gdGhpcyBpcyBhbHdheXMgMTAtYml0IG9uIEFuZHJvaWQgKi8KKyAgICAgICAgICAgICpiaXREZXB0aCA9IDEwOworICAgICAgICAgICAgKmhkciA9IEhEUl9GT1JNQVRfSERSMTA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlMkhEUjEwUGx1czoKKyAgICAgICAgICAgICpiaXREZXB0aCA9IDEwOworICAgICAgICAgICAgKmhkciA9IEhEUl9GT1JNQVRfSERSMTBQTFVTOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmxvdyBkb2VzIG5vdCBnZXQgaGVyZQorCisgICAgY2FzZSBWSURFT19FTkNPREVSX0RPTEJZX1ZJU0lPTjoKKyAgICB7CisgICAgICAgIC8vIGZvciBEb2xieSBWaXNpb24gY29kZWMgd2UgYWx3YXlzIGFzc3VtZSAxMC1iaXQgRFYKKyAgICAgICAgKmJpdERlcHRoID0gMTA7CisgICAgICAgICpoZHIgPSBIRFJfRk9STUFUX0RPTEJZX1ZJU0lPTjsKKworICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVyIC8qIHByb2ZpbGUgMiBkZXByZWNhdGVkICovOgorICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZW4gLyogcHJvZmlsZSAzIGRlcHJlY2F0ZWQgKi86CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlciAvKiBwcm9maWxlIDAgZGVwcmVjYXRlZCAqLzoKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVuIC8qIHByb2ZpbGUgMSBkZXByZWNhdGVkICovOgorICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdHIgLyogZHZoZS4wNCAqLzoKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlU3RuIC8qIGR2aGUuMDUgKi86CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0aCAvKiBwcm9maWxlIDYgZGVwcmVjYXRlZCAqLzoKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRiIC8qIGR2aGUuMDcgKi86CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0ICAvKiBkdmhlLjA4ICovOgorICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSAgLyogZHZhdi4wOSAqLzoKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmF2MTEwIC8qIGR2YXYxLjEwICovOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmxvdyBkb2VzIG5vdCBnZXQgaGVyZQorICAgIH0KKworICAgIGNhc2UgVklERU9fRU5DT0RFUl9BVjE6CisgICAgICAgIHN3aXRjaCAocHJvZmlsZSkgeworICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluMTA6CisgICAgICAgICAgICAqYml0RGVwdGggPSAxMDsKKyAgICAgICAgICAgIC8vIHJldHVybmluZyBmYWxzZSBoZXJlIGFzIHRoaXMgY291bGQgYmUgYW4gSExHIHN0cmVhbQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluMTBIRFIxMDoKKyAgICAgICAgICAgICpiaXREZXB0aCA9IDEwOworICAgICAgICAgICAgKmhkciA9IEhEUl9GT1JNQVRfSERSMTA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjEwSERSMTBQbHVzOgorICAgICAgICAgICAgKmJpdERlcHRoID0gMTA7CisgICAgICAgICAgICAqaGRyID0gSERSX0ZPUk1BVF9IRFIxMFBMVVM7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBmbG93IGRvZXMgbm90IGdldCBoZXJlCisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIGZsb3cgZG9lcyBub3QgZ2V0IGhlcmUKK30KKwogLypzdGF0aWMqLyB2b2lkCiBNZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0NvZGVjKGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMsIE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKQogewpAQCAtMjUwLDEzICs0MjQsNTYgQEAKICAgICB9CiAKICAgICBpbnQgcHJvZmlsZSA9IC0xOwotICAgIGlmIChuYXR0cyA+PSAxMiAmJiAhc3RyY21wKCJwcm9maWxlIiwgYXR0c1sxMF0pKSB7Ci0gICAgICAgIHByb2ZpbGUgPSBhdG9pKGF0dHNbMTFdKTsKKyAgICBjaHJvbWFfc3Vic2FtcGxpbmcgY2hyb21hID0gQ0hST01BX1NVQlNBTVBMSU5HX1lVVl80MjA7CisgICAgaW50IGJpdERlcHRoID0gODsKKyAgICBoZHJfZm9ybWF0IGhkciA9IEhEUl9GT1JNQVRfTk9ORTsKKyAgICBpZiAoY29kZWMgPT0gVklERU9fRU5DT0RFUl9ET0xCWV9WSVNJT04pIHsKKyAgICAgICAgYml0RGVwdGggPSAxMDsKKyAgICAgICAgaGRyID0gSERSX0ZPUk1BVF9ET0xCWV9WSVNJT047CiAgICAgfQogCi0gICAgVmlkZW9Db2RlYyB2aWRlb0NvZGVjIHsKKyAgICBpZiAobmF0dHMgPj0gMTIgJiYgIXN0cmNtcCgicHJvZmlsZSIsIGF0dHNbMTBdKSkgeworICAgICAgICBwcm9maWxlID0gYXRvaShhdHRzWzExXSk7CisgICAgICAgIGlmICghZGV0ZWN0QWR2YW5jZWRWaWRlb1Byb2ZpbGUoCisgICAgICAgICAgICAgICAgKHZpZGVvX2VuY29kZXIpY29kZWMsIHByb2ZpbGUsICZjaHJvbWEsICZiaXREZXB0aCwgJmhkcikpIHsKKyAgICAgICAgICAgIC8vIGlmIG5vdCBkZXRlY3RlZCByZWFkIHZhbHVlcyBmcm9tIHRoZSBhdHRyaWJ1dGVzCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDEyOyBuYXR0cyA+PSBpeCArIDI7IGl4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgiY2hyb21hIiwgYXR0c1tpeF0pKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjaHJvbWFUYWcgPSBmaW5kVGFnRm9yTmFtZShzQ2hyb21hU3Vic2FtcGxpbmdOYW1lTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORUxFTShzQ2hyb21hU3Vic2FtcGxpbmdOYW1lTWFwKSwgYXR0c1tpeCArIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNocm9tYVRhZyA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk1lZGlhUHJvZmlsZXM6OmNyZWF0ZVZpZGVvQ29kZWMgaW52YWxpZCBjaHJvbWEgJXMiLCBhdHRzW2l4ICsgMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hyb21hID0gKGNocm9tYV9zdWJzYW1wbGluZyljaHJvbWFUYWc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoImJpdERlcHRoIiwgYXR0c1tpeF0pKSB7CisgICAgICAgICAgICAgICAgICAgIGJpdERlcHRoID0gYXRvaShhdHRzW2l4ICsgMV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoYml0RGVwdGggPCA4IHx8IGJpdERlcHRoID4gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0NvZGVjIGludmFsaWQgYmlkRGVwdGggJXMiLCBhdHRzW2l4ICsgMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJoZHIiLCBhdHRzW2l4XSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGhkclRhZyA9IGZpbmRUYWdGb3JOYW1lKHNIZHJGb3JtYXROYW1lTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVMRU0oc0hkckZvcm1hdE5hbWVNYXApLCBhdHRzW2l4ICsgMV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoaGRyVGFnID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTWVkaWFQcm9maWxlczo6Y3JlYXRlVmlkZW9Db2RlYyBpbnZhbGlkIGhkciAlcyIsIGF0dHNbaXggKyAxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZHIgPSAoaGRyX2Zvcm1hdCloZHJUYWc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmluZyBoZXJlLiBUT0RPOiByZXdyaXRlIHRoaXMgd2hvbGUgZmlsZSB0byBpZ25vcmUgaW52YWxpZCBhdHRycworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiTWVkaWFQcm9maWxlczo6Y3JlYXRlVmlkZW9Db2RlYyBpZ25vcmluZyBpbnZhbGlkIGF0dHIgJXMiLCBhdHRzW2l4XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgVmlkZW9Db2RlYyB2aWRlb0NvZGVjewogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dmlkZW9fZW5jb2Rlcj4oY29kZWMpLAotICAgICAgICAgICAgYXRvaShhdHRzWzNdKSwgYXRvaShhdHRzWzVdKSwgYXRvaShhdHRzWzddKSwgYXRvaShhdHRzWzldKSwgcHJvZmlsZSB9OworICAgICAgICAgICAgYXRvaShhdHRzWzNdKSAvKiBiaXRSYXRlICovLCBhdG9pKGF0dHNbNV0pIC8qIHdpZHRoICovLCBhdG9pKGF0dHNbN10pIC8qIGhlaWdodCAqLywKKyAgICAgICAgICAgIGF0b2koYXR0c1s5XSkgLyogZnJhbWVSYXRlICovLCBwcm9maWxlLCBjaHJvbWEsIGJpdERlcHRoLCBoZHIgfTsKICAgICBsb2dWaWRlb0NvZGVjKHZpZGVvQ29kZWMpOwogCiAgICAgc2l6ZV90IG5DYW1jb3JkZXJQcm9maWxlczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUmVzb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZS5jcHAKaW5kZXggZWM1MmE0OS4uYTZmMGI2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZS5jcHAKQEAgLTQzLDEwICs0MywxMCBAQAogfQogCiAvL3N0YXRpYwotTWVkaWFSZXNvdXJjZSBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKGJvb2wgc2VjdXJlLCBib29sIHZpZGVvLCBpbnQ2NF90IGluc3RhbmNlQ291bnQpIHsKK01lZGlhUmVzb3VyY2UgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZShib29sIHNlY3VyZSwgU3ViVHlwZSBzdWJUeXBlLCBpbnQ2NF90IGluc3RhbmNlQ291bnQpIHsKICAgICByZXR1cm4gTWVkaWFSZXNvdXJjZSgKICAgICAgICAgICAgIHNlY3VyZSA/IFR5cGU6OmtTZWN1cmVDb2RlYyA6IFR5cGU6OmtOb25TZWN1cmVDb2RlYywKLSAgICAgICAgICAgIHZpZGVvID8gU3ViVHlwZTo6a1ZpZGVvQ29kZWMgOiBTdWJUeXBlOjprQXVkaW9Db2RlYywKKyAgICAgICAgICAgIHN1YlR5cGUsCiAgICAgICAgICAgICBpbnN0YW5jZUNvdW50KTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaAppbmRleCA0YTg5OGUyLi5lNzViNjk0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaApAQCAtODEsNiArODEsMTkgQEAKICAgICBBVURJT19ERUNPREVSX1dNQSwKIH07CiAKK2VudW0gY2hyb21hX3N1YnNhbXBsaW5nIHsKKyAgICBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQyMCwKKyAgICBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQyMiwKKyAgICBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQ0NCwKK307CisKK2VudW0gaGRyX2Zvcm1hdCB7CisgICAgSERSX0ZPUk1BVF9OT05FLAorICAgIEhEUl9GT1JNQVRfSExHLAorICAgIEhEUl9GT1JNQVRfSERSMTAsCisgICAgSERSX0ZPUk1BVF9IRFIxMFBMVVMsCisgICAgSERSX0ZPUk1BVF9ET0xCWV9WSVNJT04sCit9OwogCiBjbGFzcyBNZWRpYVByb2ZpbGVzCiB7CkBAIC0xMTcsMTMgKzEzMCwxOSBAQAogICAgICAgICAgKiBAcGFyYW0gcHJvZmlsZSBjb2RlYyBwcm9maWxlIChmb3IgTWVkaWFDb2RlYykgb3IgLTEgZm9yIG5vbmUKICAgICAgICAgICovCiAgICAgICAgIFZpZGVvQ29kZWModmlkZW9fZW5jb2RlciBjb2RlYywgaW50IGJpdHJhdGUsIGludCBmcmFtZVdpZHRoLCBpbnQgZnJhbWVIZWlnaHQsIGludCBmcmFtZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgaW50IHByb2ZpbGUgPSAtMSkKKyAgICAgICAgICAgICAgICAgICBpbnQgcHJvZmlsZSA9IC0xLAorICAgICAgICAgICAgICAgICAgIGNocm9tYV9zdWJzYW1wbGluZyBjaHJvbWEgPSBDSFJPTUFfU1VCU0FNUExJTkdfWVVWXzQyMCwKKyAgICAgICAgICAgICAgICAgICBpbnQgYml0RGVwdGggPSA4LAorICAgICAgICAgICAgICAgICAgIGhkcl9mb3JtYXQgaGRyID0gSERSX0ZPUk1BVF9OT05FKQogICAgICAgICAgICAgOiBtQ29kZWMoY29kZWMpLAogICAgICAgICAgICAgICBtQml0UmF0ZShiaXRyYXRlKSwKICAgICAgICAgICAgICAgbUZyYW1lV2lkdGgoZnJhbWVXaWR0aCksCiAgICAgICAgICAgICAgIG1GcmFtZUhlaWdodChmcmFtZUhlaWdodCksCiAgICAgICAgICAgICAgIG1GcmFtZVJhdGUoZnJhbWVSYXRlKSwKLSAgICAgICAgICAgICAgbVByb2ZpbGUocHJvZmlsZSkgeworICAgICAgICAgICAgICBtUHJvZmlsZShwcm9maWxlKSwKKyAgICAgICAgICAgICAgbUNocm9tYVN1YnNhbXBsaW5nKGNocm9tYSksCisgICAgICAgICAgICAgIG1CaXREZXB0aChiaXREZXB0aCksCisgICAgICAgICAgICAgIG1IZHJGb3JtYXQoaGRyKSB7CiAgICAgICAgIH0KIAogICAgICAgICBWaWRlb0NvZGVjKGNvbnN0IFZpZGVvQ29kZWMmKSA9IGRlZmF1bHQ7CkBAIC0xNjAsNiArMTc5LDIxIEBACiAgICAgICAgICAgICByZXR1cm4gbVByb2ZpbGU7CiAgICAgICAgIH0KIAorICAgICAgICAvKiogUmV0dXJucyB0aGUgY2hyb21hIHN1YnNhbXBsaW5nLiAqLworICAgICAgICBjaHJvbWFfc3Vic2FtcGxpbmcgZ2V0Q2hyb21hU3Vic2FtcGxpbmcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUNocm9tYVN1YnNhbXBsaW5nOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFJldHVybnMgdGhlIGJpdCBkZXB0aC4gKi8KKyAgICAgICAgaW50IGdldEJpdERlcHRoKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1CaXREZXB0aDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBSZXR1cm5zIHRoZSBjaHJvbWEgc3Vic2FtcGxpbmcuICovCisgICAgICAgIGhkcl9mb3JtYXQgZ2V0SGRyRm9ybWF0KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1IZHJGb3JtYXQ7CisgICAgICAgIH0KKwogICAgIHByaXZhdGU6CiAgICAgICAgIHZpZGVvX2VuY29kZXIgbUNvZGVjOwogICAgICAgICBpbnQgbUJpdFJhdGU7CkBAIC0xNjcsNiArMjAxLDkgQEAKICAgICAgICAgaW50IG1GcmFtZUhlaWdodDsKICAgICAgICAgaW50IG1GcmFtZVJhdGU7CiAgICAgICAgIGludCBtUHJvZmlsZTsKKyAgICAgICAgY2hyb21hX3N1YnNhbXBsaW5nIG1DaHJvbWFTdWJzYW1wbGluZzsKKyAgICAgICAgaW50IG1CaXREZXB0aDsKKyAgICAgICAgaGRyX2Zvcm1hdCBtSGRyRm9ybWF0OwogICAgICAgICBmcmllbmQgY2xhc3MgTWVkaWFQcm9maWxlczsKICAgICB9OwogCkBAIC01MzMsNiArNTcwLDM5IEBACiAgICAgc3RhdGljIGludCBmaW5kVGFnRm9yTmFtZShjb25zdCBOYW1lVG9UYWdNYXAgKm1hcCwgc2l6ZV90IG5NYXBwaW5ncywgY29uc3QgY2hhciAqbmFtZSk7CiAKICAgICAvKioKKyAgICAgKiBGaW5kcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciBhbiBpbnRlZ2VyIGVudW0gdGFnLgorICAgICAqCisgICAgICogVGhpcyBpcyB0aGUgcmV2ZXJzZSBmb3IgZmluZFRhZ0Zvck5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXAgICAgICAgdGhlIG5hbWUtdG8tdGFnIG1hcCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gbk1hcHBpbmdzIHRoZSBudW1iZXIgb2YgbWFwcGluZ3MgaW4gfG1hcHwKKyAgICAgKiBAcGFyYW0gdGFnICAgICAgIHRoZSBlbnVtIHZhbHVlIHRvIGZpbmQKKyAgICAgKiBAcGFyYW0gZGVmXyAgICAgIHRoZSByZXR1cm4gdmFsdWUgaWYgdGhlIGVudW0gaXMgbm90IGZvdW5kCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHx0YWd8IG9yIHxkZWZffCBpZiBub3QgZm91bmQuCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmZpbmROYW1lRm9yVGFnKAorICAgICAgICAgICAgY29uc3QgTmFtZVRvVGFnTWFwICptYXAsIHNpemVfdCBuTWFwcGluZ3MsCisgICAgICAgICAgICBpbnQgdGFnLCBjb25zdCBjaGFyICpkZWZfID0gIih1bmtub3duKSIpOworCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgY2hyb21hIHN1YnNhbXBsaW5nLCBiaXQtZGVwdGggYW5kIGhkci1mb3JtYXQgZm9yCisgICAgICogYWR2YW5jZWQgY29kZWMgcHJvZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29kZWMgICAgdGhlIHZpZGVvIGNvZGVjIHR5cGUKKyAgICAgKiBAcGFyYW0gcHJvZmlsZSAgdGhlIE1lZGlhQ29kZWMgcHJvZmlsZQorICAgICAqIEBwYXJhbSBjaHJvbWEgICBwb2ludGVyIHRvIHRoZSBjaHJvbWEgc3Vic2FtcGxpbmcgb3V0cHV0CisgICAgICogQHBhcmFtIGJpdERlcHRoIHBvaW50ZXIgdG8gdGhlIGJpdCBkZXB0aCBvdXRwdXQKKyAgICAgKiBAcGFyYW0gaGRyICAgICAgcG9pbnRlciB0byB0aGUgaGRyIGZvcm1hdCBvdXRwdXQKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHByb2ZpbGUgZnVsbHkgZGV0ZXJtaW5lZCBjaHJvbWEsIGJpdC1kZXB0aCBhbmQgaGRyLWZvcm1hdCwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbCBkZXRlY3RBZHZhbmNlZFZpZGVvUHJvZmlsZSgKKyAgICAgICAgICAgIHZpZGVvX2VuY29kZXIgY29kZWMsIGludCBwcm9maWxlLAorICAgICAgICAgICAgY2hyb21hX3N1YnNhbXBsaW5nICpjaHJvbWEsIGludCAqYml0RGVwdGgsIGhkcl9mb3JtYXQgKmhkcik7CisKKyAgICAvKioKICAgICAgKiBDaGVjayBvbiBleGlzdGluZyBwcm9maWxlcyB3aXRoIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6CiAgICAgICogMS4gTG93IHF1YWxpdHkgcHJvZmlsZSBtdXN0IGhhdmUgdGhlIGxvd2VzdCB2aWRlbwogICAgICAqICAgIHJlc29sdXRpb24gcHJvZHVjdCAod2lkdGggeCBoZWlnaHQpCkBAIC01NDksNiArNjE5LDggQEAKIAogICAgIC8vIE1hcHBpbmdzIGZyb20gbmFtZSAoZm9yIGluc3RhbmNlLCBjb2RlYyBuYW1lKSB0byBlbnVtIHZhbHVlCiAgICAgc3RhdGljIGNvbnN0IE5hbWVUb1RhZ01hcCBzVmlkZW9FbmNvZGVyTmFtZU1hcFtdOworICAgIHN0YXRpYyBjb25zdCBOYW1lVG9UYWdNYXAgc0Nocm9tYVN1YnNhbXBsaW5nTmFtZU1hcFtdOworICAgIHN0YXRpYyBjb25zdCBOYW1lVG9UYWdNYXAgc0hkckZvcm1hdE5hbWVNYXBbXTsKICAgICBzdGF0aWMgY29uc3QgTmFtZVRvVGFnTWFwIHNBdWRpb0VuY29kZXJOYW1lTWFwW107CiAgICAgc3RhdGljIGNvbnN0IE5hbWVUb1RhZ01hcCBzRmlsZUZvcm1hdE1hcFtdOwogICAgIHN0YXRpYyBjb25zdCBOYW1lVG9UYWdNYXAgc1ZpZGVvRGVjb2Rlck5hbWVNYXBbXTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKaW5kZXggNDcxMjUyOC4uM2I2OWQ0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKQEAgLTM3LDcgKzM3LDggQEAKICAgICBNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgU3ViVHlwZSBzdWJUeXBlLCBpbnQ2NF90IHZhbHVlKTsKICAgICBNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmlkLCBpbnQ2NF90IHZhbHVlKTsKIAotICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIENvZGVjUmVzb3VyY2UoYm9vbCBzZWN1cmUsIGJvb2wgdmlkZW8sIGludDY0X3QgaW5zdGFuY2VDb3VudCA9IDEpOworICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIENvZGVjUmVzb3VyY2UoYm9vbCBzZWN1cmUsIE1lZGlhUmVzb3VyY2VTdWJUeXBlIHN1YlR5cGUsCisgICAgICAgICAgICBpbnQ2NF90IGluc3RhbmNlQ291bnQgPSAxKTsKICAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBHcmFwaGljTWVtb3J5UmVzb3VyY2UoaW50NjRfdCB2YWx1ZSk7CiAgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgQ3B1Qm9vc3RSZXNvdXJjZSgpOwogICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIFZpZGVvQmF0dGVyeVJlc291cmNlKCk7CkBAIC02Miw2ICs2Myw3IEBACiAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZTogcmV0dXJuICJ1bnNwZWNpZmllZCI7CiAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a0F1ZGlvQ29kZWM6ICAgICAgICAgcmV0dXJuICJhdWRpby1jb2RlYyI7CiAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1ZpZGVvQ29kZWM6ICAgICAgICAgcmV0dXJuICJ2aWRlby1jb2RlYyI7CisgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a0ltYWdlQ29kZWM6ICAgICAgICAgcmV0dXJuICJpbWFnZS1jb2RlYyI7CiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCmluZGV4IGQ1NGZmMzIuLmRkMTgxNDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCkBAIC0xMDgsNyArMTA4LDkgQEAKICAgICBWSURFT19FTkNPREVSX01QRUdfNF9TUCA9IDMsCiAgICAgVklERU9fRU5DT0RFUl9WUDggPSA0LAogICAgIFZJREVPX0VOQ09ERVJfSEVWQyA9IDUsCi0KKyAgICBWSURFT19FTkNPREVSX1ZQOSA9IDYsCisgICAgVklERU9fRU5DT0RFUl9ET0xCWV9WSVNJT04gPSA3LAorICAgIFZJREVPX0VOQ09ERVJfQVYxID0gOCwKICAgICBWSURFT19FTkNPREVSX0xJU1RfRU5EIC8vIG11c3QgYmUgdGhlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIHRoZSB2aWRlbyBlbmNvZGVyIHR5cGUKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAppbmRleCAxYzliOWU0Li41MjE1YzFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCkBAIC05NDksNiArOTQ5LDkgQEAKICAgICAgICAgbVZpZGVvV2lkdGggPSBleHQxOwogICAgICAgICBtVmlkZW9IZWlnaHQgPSBleHQyOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX1NUQVJURUQ6CisgICAgICAgIEFMT0dWKCJSZWNlaXZlZCBtZWRpYSBzdGFydGVkIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBNRURJQV9OT1RJRllfVElNRToKICAgICAgICAgQUxPR1YoIlJlY2VpdmVkIG5vdGlmeSB0aW1lIG1lc3NhZ2UiKTsKICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL3Rlc3RzL2NvZGVjbGlzdC9BbmRyb2lkLmJwCmluZGV4IDdkZDBjYWEuLjJlZDMxMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL3Rlc3RzL2NvZGVjbGlzdC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhL3Rlc3RzL2NvZGVjbGlzdC9BbmRyb2lkLmJwCkBAIC0yNSw5ICsyNSwyNSBAQAogCiBjY190ZXN0IHsKICAgICBuYW1lOiAiQ29kZWNMaXN0VGVzdCIsCi0gICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIiwgIm10cyJdLAogICAgIGd0ZXN0OiB0cnVlLAogCisgICAgLy8gU3VwcG9ydCBtdWx0aWxpYiB2YXJpYW50cyAodXNpbmcgZGlmZmVyZW50IHN1ZmZpeCBwZXIgc3ViLWFyY2hpdGVjdHVyZSksIHdoaWNoIGlzIG5lZWRlZCBvbgorICAgIC8vIGJ1aWxkIHRhcmdldHMgd2l0aCBzZWNvbmRhcnkgYXJjaGl0ZWN0dXJlcywgYXMgdGhlIE1UUyB0ZXN0IHN1aXRlIHBhY2thZ2luZyBsb2dpYyBmbGF0dGVucworICAgIC8vIGFsbCB0ZXN0IGFydGlmYWN0cyBpbnRvIGEgc2luZ2xlIGB0ZXN0Y2FzZXNgIGRpcmVjdG9yeS4KKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCisgICAgbXVsdGlsaWI6IHsKKyAgICAgICAgbGliMzI6IHsKKyAgICAgICAgICAgIHN1ZmZpeDogIjMyIiwKKyAgICAgICAgfSwKKyAgICAgICAgbGliNjQ6IHsKKyAgICAgICAgICAgIHN1ZmZpeDogIjY0IiwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgLy8gdXNlZCB3aXRoaW4gbWFpbmxpbmUgTVRTLCBidXQgb25seSB0byBSLCBub3QgdG8gUS4KKyAgICBtaW5fc2RrX3ZlcnNpb246ICIzMCIsCisKICAgICBzcmNzOiBbCiAgICAgICAgICJDb2RlY0xpc3RUZXN0LmNwcCIsCiAgICAgXSwKQEAgLTM1LDcgKzUxLDcgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYV9jb2RlY2xpc3QiLAorICAgICAgICAibGlibWVkaWFfY29kZWNsaXN0IiwgLy8gYXZhaWxhYmxlID49IFIKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3Rlc3RzL2NvZGVjbGlzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYWFiOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBDb2RlY0xpc3QgdW5pdCB0ZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9IkNvZGVjTGlzdFRlc3QiIC8+CisgICAgPG9iamVjdCB0eXBlPSJtb2R1bGVfY29udHJvbGxlciIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLnN1aXRlLm1vZHVsZS5TZGszME1vZHVsZUNvbnRyb2xsZXIiIC8+CisKKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLkZpbGVQdXNoZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImFwcGVuZC1iaXRuZXNzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQ29kZWNMaXN0VGVzdC0+L2RhdGEvbG9jYWwvdG1wL0NvZGVjTGlzdFRlc3QiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IkNvZGVjTGlzdFRlc3QiIC8+CisgICAgPC90ZXN0PgorCisKKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvT1dORVJTIGIvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmMmViYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvT1dORVJTCkBAIC0wLDAgKzEsMiBAQAorIyBCdWcgY29tcG9uZW50OiAxNTE4NjIKK3N1bmRvbmdhaG5AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFmb3JtYXRzaGFwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL0FuZHJvaWQuYnAKaW5kZXggYmRkMTQ2NS4uN2U4ZjM1MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFmb3JtYXRzaGFwZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYWZvcm1hdHNoYXBlci9BbmRyb2lkLmJwCkBAIC05NSwxMCArOTUsMTAgQEAKIAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKIAotICAgIGFwZXhfYXZhaWxhYmxlOiBbCi0gICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKLSAgICBdLAorICAgIC8vIHRoZSBsaWJyYXJ5IGxpdmVzIG9ubHkgaW4gdGhlIG1vZHVsZQorICAgIC8vIGZyYW1ld29yayBhY2Nlc3NlcyB3aXRoIGRsb3BlbigpIGFuZCB1c2VzICJsaWJtZWRpYWZvcm1hdHNoYXBlcl9oZWFkZXJzIiBzbyBib3RoCisgICAgLy8gc2lkZXMgdHJhY2sgdG8gdGhlIGludGVyZmFjZS4KKyAgICBhcGV4X2F2YWlsYWJsZTogWyJjb20uYW5kcm9pZC5tZWRpYSJdLAogCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9BbmRyb2lkLmJwCmluZGV4IDliNTQxOTkuLjE2NWE4YWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhaGVscGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvQW5kcm9pZC5icApAQCAtMjAsNyArMjAsNyBAQAogICAgIH0sCiAgICAgYXBleF9hdmFpbGFibGU6IFsKICAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAotICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnVwZGF0YWJsZSIsCisgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgiLAogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCiAgICAgXSwKQEAgLTI5LDYgKzI5LDcgQEAKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYV9oZWxwZXIiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LApAQCAtNDMsNyArNDQsMTAgQEAKICAgICAgICAgIi1XZXh0cmEiLAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsibGlidXRpbHMiLCAibGlibG9nIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAogICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLApAQCAtNTEsMTEgKzU1LDE2IEBACiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWwogICAgICAgICAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAogICAgIF0sCi0gICAgY2xhbmc6IHRydWUsCisKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICB0YXJnZXQ6IHsKICAgICAgICAgZGFyd2luOiB7CiAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICAgICAgfSwKICAgICB9LAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgInRlc3RfY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9BdWRpb1ZhbGlkYXRvci5jcHAgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9BdWRpb1ZhbGlkYXRvci5jcHAKaW5kZXggN2VkZGJlMS4uNWEwZDUxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvQXVkaW9WYWxpZGF0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL0F1ZGlvVmFsaWRhdG9yLmNwcApAQCAtNDcsOCArNDcsNyBAQAogICAgICAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90JiBkZXNjLCBzdGQ6OnN0cmluZ192aWV3IGJ1Z051bWJlcikKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZiAoY2hlY2tTdHJpbmdPdmVyZmxvdyhkZXNjLm5hbWUpCi0gICAgICAgIHwgLyogYWx3YXlzICovIGNoZWNrU3RyaW5nT3ZlcmZsb3coZGVzYy5pbXBsZW1lbnRvcikpIHsKKyAgICBpZiAoY2hlY2tTdHJpbmdPdmVyZmxvdyhkZXNjLm5hbWUpIHx8IGNoZWNrU3RyaW5nT3ZlcmZsb3coZGVzYy5pbXBsZW1lbnRvcikpIHsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgIH0KICAgICByZXR1cm4gc2FmZXR5TmV0TG9nKHN0YXR1cywgYnVnTnVtYmVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL1R5cGVDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKaW5kZXggZDNhNTE3Zi4uZTI5MzY0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKQEAgLTMwLDYgKzMwLDggQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fTU9ERV9JTl9DQUxMKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fTU9ERV9DQUxMX1NDUkVFTiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX01PREVfQ0FMTF9SRURJUkVDVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX01PREVfQ09NTVVOSUNBVElPTl9SRURJUkVDVCksCiAgICAgVEVSTUlOQVRPUgogfTsKIApAQCAtNTAsNiArNTIsOCBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX01VVEVfSEFQVElDKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19OT19TWVNURU1fQ0FQVFVSRSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQ0FQVFVSRV9QUklWQVRFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19DT05URU5UX1NQQVRJQUxJWkVEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19ORVZFUl9TUEFUSUFMSVpFKSwKICAgICBURVJNSU5BVE9SCiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCmluZGV4IGQ3NTgzOTEuLjhhMzhkZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCkBAIC02NSw2ICs2NSw3IEBACiAgICAgICAgICIvL2ZyYW1ld29ya3MvYmFzZS9hcGV4L21lZGlhL2ZyYW1ld29yayIsCiAgICAgICAgICIvL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSIsCiAgICAgICAgICIvL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9qbmkiLAorCSIvL3BhY2thZ2VzL21vZHVsZXMvTWVkaWEvYXBleC9mcmFtZXdvcmsiLAogICAgIF0sCiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9JTWVkaWFNZXRyaWNzU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhTWV0cmljc1NlcnZpY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTY3NWU2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9JTWVkaWFNZXRyaWNzU2VydmljZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFNZXRyaWNzIgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+ICAvLyBmb3Igc3RhdHVzX3QKLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYU1ldHJpY3NTZXJ2aWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVE9ETzogQ3VycmVudGx5IE9ORV9XQVkgdHJhbnNhY3Rpb25zLCBtYWtlIGJvdGggT05FX1dBWSBhbmQgc3luY2hyb25vdXMgb3B0aW9ucy4KLQotZW51bSB7Ci0gICAgU1VCTUlUX0lURU0gPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIFNVQk1JVF9CVUZGRVIsCi19OwotCi1jbGFzcyBCcE1lZGlhTWV0cmljc1NlcnZpY2U6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFNZXRyaWNzU2VydmljZT4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcE1lZGlhTWV0cmljc1NlcnZpY2UoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SU1lZGlhTWV0cmljc1NlcnZpY2U+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHN0YXR1c190IHN1Ym1pdChtZWRpYW1ldHJpY3M6Okl0ZW0gKml0ZW0pIG92ZXJyaWRlCi0gICAgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCIlczogKE9ORVdBWSkgaXRlbT0lcyIsIF9fZnVuY19fLCBpdGVtLT50b1N0cmluZygpLmNfc3RyKCkpOwotCi0gICAgICAgIFBhcmNlbCBkYXRhOwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhTWV0cmljc1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaXRlbS0+d3JpdGVUb1BhcmNlbCgmZGF0YSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsgLy8gYXNzdW1lIGZhaWx1cmUgbG9nZ2VkIGluIGl0ZW0KLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoCi0gICAgICAgICAgICAgICAgU1VCTUlUX0lURU0sIGRhdGEsIG51bGxwdHIgLyogcmVwbHkgKi8sIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKLSAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiJXM6IGJhZCByZXNwb25zZSBmcm9tIHNlcnZpY2UgZm9yIHN1Ym1pdCwgc3RhdHVzPSVkIiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdWJtaXRCdWZmZXIoY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSBvdmVycmlkZQotICAgIHsKLSAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyIHx8IGxlbmd0aCA+IElOVDMyX01BWCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiJXM6IChPTkVXQVkpIGxlbmd0aDolenUiLCBfX2Z1bmNfXywgbGVuZ3RoKTsKLQotICAgICAgICBQYXJjZWwgZGF0YTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYU1ldHJpY3NTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEud3JpdGVJbnQzMihsZW5ndGgpCi0gICAgICAgICAgICAgICAgPzogZGF0YS53cml0ZSgodWludDhfdCopYnVmZmVyLCBsZW5ndGgpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KAotICAgICAgICAgICAgICAgIFNVQk1JVF9CVUZGRVIsIGRhdGEsIG51bGxwdHIgLyogcmVwbHkgKi8sIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKLSAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiJXM6IGJhZCByZXNwb25zZSBmcm9tIHNlcnZpY2UgZm9yIHN1Ym1pdCwgc3RhdHVzPSVkIiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFNZXRyaWNzU2VydmljZSwgImFuZHJvaWQubWVkaWEuSU1lZGlhTWV0cmljc1NlcnZpY2UiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCbk1lZGlhTWV0cmljc1NlcnZpY2U6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICBjYXNlIFNVQk1JVF9JVEVNOiB7Ci0gICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRyaWNzU2VydmljZSwgZGF0YSwgcmVwbHkpOwotCi0gICAgICAgIG1lZGlhbWV0cmljczo6SXRlbSAqIGNvbnN0IGl0ZW0gPSBtZWRpYW1ldHJpY3M6Okl0ZW06OmNyZWF0ZSgpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpdGVtLT5yZWFkRnJvbVBhcmNlbChkYXRhKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeyAvLyBhc3N1bWUgZmFpbHVyZSBsb2dnZWQgaW4gaXRlbQotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBzdWJtaXRJbnRlcm5hbChpdGVtLCB0cnVlIC8qIHJlbGVhc2UgKi8pOwotICAgICAgICAvLyBhc3N1bWUgZmFpbHVyZSBsb2dnZWQgYnkgc3VibWl0SW50ZXJuYWwKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBjYXNlIFNVQk1JVF9CVUZGRVI6IHsKLSAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYU1ldHJpY3NTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgIGludDMyX3QgbGVuZ3RoOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmbGVuZ3RoKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBsZW5ndGggPD0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCB2b2lkICpwdHIgPSBkYXRhLnJlYWRJbnBsYWNlKGxlbmd0aCk7Ci0gICAgICAgIGlmIChwdHIgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBzdWJtaXRCdWZmZXIoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhciAqPihwdHIpLCBsZW5ndGgpOwotICAgICAgICAvLyBhc3N1bWUgZmFpbHVyZSBsb2dnZWQgYnkgc3VibWl0QnVmZmVyCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzSXRlbS5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzSXRlbS5jcHAKaW5kZXggZDU5N2E0ZC4uZWNiMjQ4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhTWV0cmljc0l0ZW0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3NJdGVtLmNwcApAQCAtMjMsOCArMjMsMTAgQEAKIAogI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtNTEsNiArNTMsMzMgQEAKIC8vIHRoZSBzZXJ2aWNlIGlzIG9mZi4KICNkZWZpbmUgU1ZDX1RSSUVTICAgICAgICAgICAgICAgMgogCitzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBpbnQzMl90PiYgZ2V0RXJyb3JTdHJpbmdNYXAoKSB7CisgICAgLy8gRE8gTk9UIE1PRElGWSBWQUxVRVMgKE9LIHRvIGFkZCBuZXcgb25lcykuCisgICAgLy8gVGhpcyBtYXkgYmUgZm91bmQgaW4gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3NDb25zdGFudHMuaAorICAgIHN0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGludDMyX3Q+IG1hcHsKKyAgICAgICAgeyIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9fRVJST1J9LAorICAgICAgICB7QU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9PSywgICAgICAgTk9fRVJST1J9LAorICAgICAgICB7QU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9BUkdVTUVOVCwgQkFEX1ZBTFVFfSwKKyAgICAgICAge0FNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfSU8sICAgICAgIERFQURfT0JKRUNUfSwKKyAgICAgICAge0FNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfTUVNT1JZLCAgIE5PX01FTU9SWX0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1NFQ1VSSVRZLCBQRVJNSVNTSU9OX0RFTklFRH0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1NUQVRFLCAgICBJTlZBTElEX09QRVJBVElPTn0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1RJTUVPVVQsICBXT1VMRF9CTE9DS30sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1VOS05PV04sICBVTktOT1dOX0VSUk9SfSwKKyAgICB9OworICAgIHJldHVybiBtYXA7Cit9CisKK3N0YXR1c190IHN0YXR1c1N0cmluZ1RvU3RhdHVzKGNvbnN0IGNoYXIgKmVycm9yKSB7CisgICAgY29uc3QgYXV0byYgbWFwID0gZ2V0RXJyb3JTdHJpbmdNYXAoKTsKKyAgICBpZiAoZXJyb3IgPT0gbnVsbHB0ciB8fCBlcnJvclswXSA9PSAnXDAnKSByZXR1cm4gTk9fRVJST1I7CisgICAgYXV0byBpdCA9IG1hcC5maW5kKGVycm9yKTsKKyAgICBpZiAoaXQgIT0gbWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKK30KKwogbWVkaWFtZXRyaWNzOjpJdGVtKiBtZWRpYW1ldHJpY3M6Okl0ZW06OmNvbnZlcnQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSkgewogICAgIG1lZGlhbWV0cmljczo6SXRlbSAqaXRlbSA9IChhbmRyb2lkOjptZWRpYW1ldHJpY3M6Okl0ZW0gKikgaGFuZGxlOwogICAgIHJldHVybiBpdGVtOwpAQCAtMzE1LDcgKzM0NCw4IEBACiAgICAgICAgIC8vIG5vdy4KICAgICAgICAgLy8gVE9ETyhiLzE5MDE1MTIwNSk6IEVpdGhlciBhbGxvdyB0aGUgSG90d29yZERldGVjdGlvblNlcnZpY2UgdG8gYWNjZXNzIE1lZGlhTWV0cmljcyBvcgogICAgICAgICAvLyBtYWtlIHRoaXMgZGlzYWJsaW5nIHNwZWNpZmljIHRvIHRoYXQgcHJvY2Vzcy4KLSAgICAgICAgaWYgKHVpZCA+PSBBSURfSVNPTEFURURfU1RBUlQgJiYgdWlkIDw9IEFJRF9JU09MQVRFRF9FTkQpIHsKKyAgICAgICAgdWlkX3QgYXBwaWQgPSBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpOworICAgICAgICBpZiAoYXBwaWQgPj0gQUlEX0lTT0xBVEVEX1NUQVJUICYmIGFwcGlkIDw9IEFJRF9JU09MQVRFRF9FTkQpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljc0NvbnN0YW50cy5oIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmgKaW5kZXggYTA5YTY3My4uMWMzMDUxMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmgKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmgKQEAgLTI1LDYgKzI1LDkgQEAKICAqIDIpIENvbnNpc3RlbnQgYmVoYXZpb3IgYW5kIGRvY3VtZW50YXRpb24uCiAgKi8KIAorI2RlZmluZSBBTUVESUFNRVRSSUNTX0lOSVRJQUxfTUFYX1ZPTFVNRSAoMC5mKQorI2RlZmluZSBBTUVESUFNRVRSSUNTX0lOSVRJQUxfTUlOX1ZPTFVNRSAoMS5mKQorCiAvKgogICogVGF4b25vbXkgb2YgYXVkaW8ga2V5cwogICoKQEAgLTQ4LDYgKzUxLDEyIEBACiAvLyBUaGUgQXVkaW9SZWNvcmQga2V5IGFwcGVuZHMgdGhlICJ0cmFja0lkIiB0byB0aGUgcHJlZml4LgogI2RlZmluZSBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fUkVDT1JEIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJTyAicmVjb3JkLiIKIAorLy8gVGhlIEF1ZGlvIFNlbnNvciBrZXkgYXBwZW5kcyB0aGUgc2Vuc29yIGhhbmRsZSBpbnRlZ2VyLgorI2RlZmluZSBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fU0VOU09SIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJTyAic2Vuc29yLiIKKworLy8gVGhlIEF1ZGlvIFNwYXRpYWxpemVyIGtleSBhcHBlbmRzIHRoZSBzcGF0aWFsaXplcklkIChjdXJyZW50bHkgMCkKKyNkZWZpbmUgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1NQQVRJQUxJWkVSIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJTyAic3BhdGlhbGl6ZXIuIgorCiAvLyBUaGUgQXVkaW9TdHJlYW0ga2V5IGFwcGVuZHMgdGhlICJzdHJlYW1JZCIgdG8gdGhlIHByZWZpeC4KICNkZWZpbmUgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1NUUkVBTSAgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPICJzdHJlYW0uIgogCkBAIC02MSw2ICs3MCwxMCBAQAogI2RlZmluZSBBTUVESUFNRVRSSUNTX0tFWV9BVURJT19GTElOR0VSICAgICAgIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJTyAiZmxpbmdlciIKICNkZWZpbmUgQU1FRElBTUVUUklDU19LRVlfQVVESU9fUE9MSUNZICAgICAgICBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU8gInBvbGljeSIKIAorLy8gRXJyb3Iga2V5cworI2RlZmluZSBBTUVESUFNRVRSSUNTX0tFWV9BVURJT19UUkFDS19FUlJPUiAgIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19UUkFDSyAiZXJyb3IiCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfS0VZX0FVRElPX1JFQ09SRF9FUlJPUiAgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1JFQ09SRCAiZXJyb3IiCisKIC8qCiAgKiBNZWRpYU1ldHJpY3MgUHJvcGVydGllcyBhcmUgdW5pZmllZCBzcGFjZSBmb3IgY29uc2lzdGVuY3kgYW5kIHJlYWRhYmlsaXR5LgogICovCkBAIC0xMTIsOSArMTI1LDE1IEBACiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VUSU1FTlMgICAiZGV2aWNlVGltZU5zIiAgIC8vIGludDY0X3QgcGxheWJhY2svcmVjb3JkIHRpbWUKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0RFVklDRVZPTFVNRSAgICJkZXZpY2VWb2x1bWUiICAgLy8gZG91YmxlIC0gYXZlcmFnZSBkZXZpY2Ugdm9sdW1lCiAKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0RFVklDRU1BWFZPTFVNRURVUkFUSU9OTlMgImRldmljZU1heFZvbHVtZUR1cmF0aW9uTnMiIC8vIGludDY0X3QKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0RFVklDRU1BWFZPTFVNRSAiZGV2aWNlTWF4Vm9sdW1lIiAvLyBkb3VibGUgLSBtYXhpbXVtIGRldmljZSB2b2x1bWUKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0RFVklDRU1JTlZPTFVNRURVUkFUSU9OTlMgImRldmljZU1pblZvbHVtZUR1cmF0aW9uTnMiIC8vIGludDY0X3QKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0RFVklDRU1JTlZPTFVNRSAiZGV2aWNlTWluVm9sdW1lIiAvLyBkb3VibGUgLSBtaW5pbXVtIGRldmljZSB2b2x1bWUKKwogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRElSRUNUSU9OICAgICAgImRpcmVjdGlvbiIgICAgICAvLyBzdHJpbmcgQUF1ZGlvIGlucHV0IG9yIG91dHB1dAogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRFVSQVRJT05OUyAgICAgImR1cmF0aW9uTnMiICAgICAvLyBpbnQ2NCBkdXJhdGlvbiB0aW1lIHNwYW4KICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VOQ09ESU5HICAgICAgICJlbmNvZGluZyIgICAgICAgLy8gc3RyaW5nIHZhbHVlIG9mIGZvcm1hdAorCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCAgICAgICAgICAiZXZlbnQjIiAgICAgICAgIC8vIHN0cmluZyB2YWx1ZSAob2Z0ZW4gZnVuYyBuYW1lKQogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVhFQ1VUSU9OVElNRU5TICJleGVjdXRpb25UaW1lTnMiICAvLyB0aW1lIHRvIGV4ZWN1dGUgdGhlIGV2ZW50CiAKQEAgLTEyMiwxMSArMTQxLDE3IEBACiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9GTEFHUyAgICAgICAgICAiZmxhZ3MiCiAKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0ZSQU1FQ09VTlQgICAgICJmcmFtZUNvdW50IiAgICAgLy8gaW50MzIKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0hFQURUUkFDS0lOR01PREVTICJoZWFkVHJhY2tpbmdNb2RlcyIgLy8gc3RyaW5nIHwsIGxpa2UgbW9kZXMuCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9JTlBVVERFVklDRVMgICAiaW5wdXREZXZpY2VzIiAgIC8vIHN0cmluZyB2YWx1ZQogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfSU5URVJOQUxUUkFDS0lEICJpbnRlcm5hbFRyYWNrSWQiIC8vIGludDMyCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9JTlRFUlZBTENPVU5UICAiaW50ZXJ2YWxDb3VudCIgIC8vIGludDMyCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9MQVRFTkNZTVMgICAgICAibGF0ZW5jeU1zIiAgICAgIC8vIGRvdWJsZSB2YWx1ZQorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfTEVWRUxTICAgICAgICAgImxldmVscyIgICAgICAgICAgLy8gc3RyaW5nIHwgd2l0aCBsZXZlbHMKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0xPR1NFU1NJT05JRCAgICJsb2dTZXNzaW9uSWQiICAgLy8gaGV4IHN0cmluZywgIiIgbm9uZQorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfTUVUSE9EQ09ERSAgICAgIm1ldGhvZENvZGUiICAgICAvLyBpbnQ2NF90IGFuIGludCBpbmRpY2F0aW5nIG1ldGhvZAorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfTUVUSE9ETkFNRSAgICAgIm1ldGhvZE5hbWUiICAgICAvLyBzdHJpbmcgbWV0aG9kIG5hbWUKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX01PREUgICAgICAgICAgICJtb2RlIiAgICAgICAgICAgLy8gc3RyaW5nCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9NT0RFUyAgICAgICAgICAibW9kZXMiICAgICAgICAgIC8vIHN0cmluZyB8IHdpdGggbW9kZXMKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX05BTUUgICAgICAgICAgICJuYW1lIiAgICAgICAgICAgLy8gc3RyaW5nIHZhbHVlCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9PUklHSU5BTEZMQUdTICAib3JpZ2luYWxGbGFncyIgIC8vIGludDMyCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9PVVRQVVRERVZJQ0VTICAib3V0cHV0RGV2aWNlcyIgIC8vIHN0cmluZyB2YWx1ZQpAQCAtMTQ2LDcgKzE3MSwxNyBAQAogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU1RBUlRVUE1TICAgICAgInN0YXJ0dXBNcyIgICAgICAvLyBkb3VibGUgdmFsdWUKIC8vIFN0YXRlIGlzICJBQ1RJVkUiIG9yICJTVE9QUEVEIiBmb3IgQXVkaW9SZWNvcmQKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX1NUQVRFICAgICAgICAgICJzdGF0ZSIgICAgICAgICAgLy8gc3RyaW5nCi0jZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVMgICAgICAgICAic3RhdHVzIiAgICAgICAgIC8vIGludDMyIHN0YXR1c190CisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVMgICAgICAgICAic3RhdHVzIyIgICAgICAgIC8vIGludDMyIHN0YXR1c190CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFBdWRpbyB1c2VzIHRoZWlyIG93biBzdGF0dXMgY29kZXMKKy8vIFN1cHBsZW1lbnRhbCBpbmZvcm1hdGlvbiB0byB0aGUgc3RhdHVzIGNvZGUuCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNTVUJDT0RFICAic3RhdHVzU3ViQ29kZSIgIC8vIGludDMyLCBzcGVjaWZpYyBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBzdGF0dXMuCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNNRVNTQUdFICAic3RhdHVzTWVzc2FnZSIgIC8vIHN0cmluZywgc3VwcGxlbWVudGFsIGluZm8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFyYml0cmFyeSBpbmZvcm1hdGlvbiB0cmVhdGVkIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uYWwsIG1heSBiZSBsb2djYXQgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBhbiBleGNlcHRpb24gd2l0aCBzdGFjayB0cmFjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJlYXRlZCBhcyAiZGVidWciIGluZm9ybWF0aW9uLgorCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TVFJFQU1UWVBFICAgICAic3RyZWFtVHlwZSIgICAgIC8vIHN0cmluZyAoQXVkaW9UcmFjaykKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX1RIUkVBRElEICAgICAgICJ0aHJlYWRJZCIgICAgICAgLy8gaW50MzIgdmFsdWUgaW8gaGFuZGxlCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9USFJPVFRMRU1TICAgICAidGhyb3R0bGVNcyIgICAgIC8vIGRvdWJsZQpAQCAtMjAxLDYgKzIzNiw3IEBACiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9TRVRWT0xVTUUgICJzZXRWb2x1bWUiICAvLyBBdWRpb1RyYWNrCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9TVEFSVCAgICAgICJzdGFydCIgIC8vIEF1ZGlvVHJhY2ssIEF1ZGlvUmVjb3JkCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9TVE9QICAgICAgICJzdG9wIiAgIC8vIEF1ZGlvVHJhY2ssIEF1ZGlvUmVjb3JkCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9USU1FT1VUICAgICJ0aW1lb3V0IiAgLy8gQXVkaW9GbGluZ2VyLCBBdWRpb1BvbGljeQogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfVU5ERVJSVU4gICAidW5kZXJydW4iIC8vIGZyb20gVGhyZWFkCiAKIC8vIFBvc3NpYmxlIHZhbHVlcyBmb3IgQU1FRElBTUVUUklDU19QUk9QX0NBTExFUk5BTUUKQEAgLTIxNSw0ICsyNTEsODMgQEAKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0NBTExFUk5BTUVfVkFMVUVfVE9ORUdFTkVSQVRPUiAidG9uZWdlbmVyYXRvciIgIC8vIGRpYWwgdG9uZXMKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0NBTExFUk5BTUVfVkFMVUVfVU5LTk9XTiAgICAgICAidW5rbm93biIgICAgICAgIC8vIGNhbGxlck5hbWUgbm90IHNldAogCisvLyBNYW55IHByb3BlcnRpZXMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIHNlbnNvci4KKy8vIFRoZSBtb2RlIGlzIGhvdyB0aGUgc2Vuc29yIGlzIGJlaW5nIGN1cnJlbnRseSB1c2VkLgorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfTU9ERV9WQUxVRV9IRUFEICAgICAgICAgICJoZWFkIiAgICAgICAgLy8gdXNlZCBmb3IgaGVhZCB0cmFja2luZworI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfTU9ERV9WQUxVRV9TQ1JFRU4gICAgICAgICJzY3JlZW4iICAgICAgLy8gdXNlZCBmb3Igc2NyZWVuCisKKy8vIE1lZGlhTWV0cmljcyBlcnJvcnMgYXJlIGV4cGVjdGVkIHRvIGNvdmVyIHRoZSBmb2xsb3dpbmcgc291cmNlczoKKy8vIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvYXBpL2phdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uLmh0bWwKKy8vIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvYXBpL2phdmEvbGFuZy9FeGNlcHRpb24uaHRtbAorLy8gaHR0cHM6Ly9jcy5hbmRyb2lkLmNvbS9hbmRyb2lkL3BsYXRmb3JtL3N1cGVycHJvamVjdC8rL21hc3RlcjpmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2JpbmRlci9pbmNsdWRlL2JpbmRlci9TdGF0dXMuaDtkcmM9ODhlMjVjMDg2MTQ5OWVlM2FiODg1ODE0ZGRkYzA5N2FiMjM0Y2I3YjtsPTU3CisvLyBodHRwczovL2NzLmFuZHJvaWQuY29tL2FuZHJvaWQvcGxhdGZvcm0vc3VwZXJwcm9qZWN0LysvbWFzdGVyOmZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9TeXN0ZW0uamF2YTtkcmM9M2FjMjQ2YzQzMjk0ZDdmNzAxMmJkY2IwY2NiN2JhZTFhYTY5NWJkNDtsPTc4NQorLy8gaHR0cHM6Ly9jcy5hbmRyb2lkLmNvbS9hbmRyb2lkL3BsYXRmb3JtL3N1cGVycHJvamVjdC8rL21hc3RlcjpmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaDtkcmM9Y2ZkM2E2ZmEzYWFhZjcxMmE4OTBkYzAyNDUyYjM4ZWY0MDEwODNiODtsPTEyMAorLy8gaHR0cHM6Ly9hYnNlaWwuaW8vZG9jcy9jcHAvZ3VpZGVzL3N0YXR1cy1jb2RlcworCisvLyBTdGF0dXMgZXJyb3JzOgorLy8gQW4gZW1wdHkgc3RhdHVzIHN0cmluZyBvciAib2siIGlzIGludGVycHJldGVkIGFzIG5vIGVycm9yLgorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX09LICAgICAgICAgICAgICAgICJvayIKKworLy8gRXJyb3IgY2F0ZWdvcnk6IGFyZ3VtZW50CisvLyAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorLy8gICBOdWxsUG9pbnRlckV4Y2VwdGlvbgorLy8gICBCQURfVkFMVUUKKy8vICAgYWJzbDo6SU5WQUxJRF9BUkdVTUVOVAorLy8gICBhYnNsOjpPVVRfT0ZfUkFOR0UKKy8vICAgT3V0IG9mIHJhbmdlLCBvdXQgb2YgYm91bmRzLgorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX0FSR1VNRU5UICAgICAgICAgICJhcmd1bWVudCIKKworLy8gRXJyb3IgY2F0ZWdvcnk6IGlvCisvLyAgIElPRXhjZXB0aW9uCisvLyAgIGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbiwgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24KKy8vICAgREVBRF9PQkpFQ1QKKy8vICAgRkFJTEVEX1RSQU5TQUNUSU9OCisvLyAgIElPX0VSUk9SCisvLyAgIGZpbGUgb3IgaW9jdGwgZmFpbHVyZQorLy8gICBTZXJ2aWNlLCBycGMsIGJpbmRlciwgb3Igc29ja2V0IGZhaWx1cmUuCisvLyAgIEhhcmR3YXJlIG9yIGRldmljZSBmYWlsdXJlLgorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX0lPICAgICAgICAgICAgICAgICJpbyIKKworLy8gRXJyb3IgY2F0ZWdvcnk6IG91dE9mTWVtb3J5CisvLyAgIE91dE9mTWVtb3J5RXhjZXB0aW9uCisvLyAgIE5PX01FTU9SWQorLy8gICBhYnNsOjpSRVNPVVJDRV9FWEhBVVNURUQKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9NRU1PUlkgICAgICAgICAgICAibWVtb3J5IgorCisvLyBFcnJvciBjYXRlZ29yeTogc2VjdXJpdHkKKy8vICAgU2VjdXJpdHlFeGNlcHRpb24KKy8vICAgUEVSTUlTU0lPTl9ERU5JRUQKKy8vICAgYWJzbDo6UEVSTUlTU0lPTl9ERU5JRUQKKy8vICAgYWJzbDo6VU5BVVRIRU5USUNBVEVECisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfU0VDVVJJVFkgICAgICAgICAgInNlY3VyaXR5IgorCisvLyBFcnJvciBjYXRlZ29yeTogc3RhdGUKKy8vICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisvLyAgIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisvLyAgIElOVkFMSURfT1BFUkFUSU9OCisvLyAgIE5PX0lOSVQKKy8vICAgYWJzbDo6Tk9UX0ZPVU5ECisvLyAgIGFic2w6OkFMUkVBRFlfRVhJU1RTCisvLyAgIGFic2w6OkZBSUxFRF9QUkVDT05ESVRJT04KKy8vICAgYWJzbDo6VU5BVkFJTEFCTEUKKy8vICAgYWJzbDo6VU5JTVBMRU1FTlRFRAorLy8gICBGdW5jdGlvbmFsaXR5IG5vdCBpbXBsZW1lbnRlZCAoYXJndW1lbnQgbWF5IG9yIG1heSBub3QgYmUgY29ycmVjdCkuCisvLyAgIENhbGwgdW5leHBlY3RlZCBvciBvdXQgb2Ygb3JkZXIuCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfU1RBVEUgICAgICAgICAgICAgInN0YXRlIgorCisvLyBFcnJvciBjYXRlZ29yeTogdGltZW91dAorLy8gICBUaW1lb3V0RXhjZXB0aW9uCisvLyAgIFdPVUxEX0JMT0NLCisvLyAgIGFic2w6OkRFQURMSU5FX0VYQ0VFREVECisvLyAgIGFic2w6OkFCT1JURUQKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9USU1FT1VUICAgICAgICAgICAidGltZW91dCIKKworLy8gRXJyb3IgY2F0ZWdvcnk6IHVua25vd24KKy8vICAgRXhjZXB0aW9uIChKYXZhIHNwZWNpZmllZCBub3QgbGlzdGVkIGFib3ZlLCBvciBjdXN0b20gYXBwL3NlcnZpY2UpCisvLyAgIFVOS05PV05fRVJST1IKKy8vICAgYWJzbDo6SU5URVJOQUwKKy8vICAgYWJzbDo6REFUQV9MT1NTCisvLyAgIENhdGNoLWFsbCBidWNrZXQgZm9yIGVycm9ycyBub3QgbGlzdGVkIGFib3ZlLgorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1VOS05PV04gICAgICAgICAgICJ1bmtub3duIgorCiAjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9NRURJQU1FVFJJQ1NDT05TVEFOVFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oCmluZGV4IGNiZjg5YzYuLmRlNTY2NjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhL01lZGlhTWV0cmljc0l0ZW0uaAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldHJpY3NJdGVtLmgKQEAgLTEwNiw2ICsxMDYsMzYgQEAKIH07CiAKIC8qCisgKiBIZWxwZXIgZm9yIHN0YXR1cyBjb252ZXJzaW9ucworICovCisKK2lubGluZSBjb25zdGV4cHIgY29uc3QgY2hhciogc3RhdHVzVG9TdGF0dXNTdHJpbmcoc3RhdHVzX3Qgc3RhdHVzKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIEJBRF9WQUxVRToKKyAgICAgICAgcmV0dXJuIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfQVJHVU1FTlQ7CisgICAgY2FzZSBERUFEX09CSkVDVDoKKyAgICBjYXNlIEZBSUxFRF9UUkFOU0FDVElPTjoKKyAgICAgICAgcmV0dXJuIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfSU87CisgICAgY2FzZSBOT19NRU1PUlk6CisgICAgICAgIHJldHVybiBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX01FTU9SWTsKKyAgICBjYXNlIFBFUk1JU1NJT05fREVOSUVEOgorICAgICAgICByZXR1cm4gQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9TRUNVUklUWTsKKyAgICBjYXNlIE5PX0lOSVQ6CisgICAgY2FzZSBJTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgcmV0dXJuIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfU1RBVEU7CisgICAgY2FzZSBXT1VMRF9CTE9DSzoKKyAgICAgICAgcmV0dXJuIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfVElNRU9VVDsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoc3RhdHVzID49IDApIHJldHVybiBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX09LOyAvLyBub24tbmVnYXRpdmUgdmFsdWVzICJPSyIKKyAgICAgICAgW1tmYWxsdGhyb3VnaF1dOyAgICAgICAgICAgIC8vIG5lZ2F0aXZlIHZhbHVlcyBhcmUgZXJyb3IuCisgICAgY2FzZSBVTktOT1dOX0VSUk9SOgorICAgICAgICByZXR1cm4gQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9VTktOT1dOOworICAgIH0KK30KKworc3RhdHVzX3Qgc3RhdHVzU3RyaW5nVG9TdGF0dXMoY29uc3QgY2hhciAqZXJyb3IpOworCisvKgogICogVGltZSBwcmludGluZwogICoKICAqIGtQcmludEZvcm1hdExvbmcgdGltZSBzdHJpbmcgaXMgMTkgY2hhcmFjdGVycyAoaW5jbHVkaW5nIG51bGwgdGVybWluYXRpb24pLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icAppbmRleCBmNTU2NzhkLi4yNjZjYjE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icApAQCAtNjUsMTAgKzY1LDE0IEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHNfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9ydHNwX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfd2VibV9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTg0LDEzICs4OCwxNiBAQAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0iLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYm1lZGlhdXRpbHNfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICIuIiwKKyAgICBdLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAppbmRleCAwNWY3MzY1Li5jZDQxMWVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcApAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgIk1lZGlhUGxheWVyRmFjdG9yeS5oIgogCiAjaW5jbHVkZSAiVGVzdFBsYXllclN0dWIuaCIKLSNpbmNsdWRlICJudXBsYXllci9OdVBsYXllckRyaXZlci5oIgorI2luY2x1ZGUgPG51cGxheWVyL051UGxheWVyRHJpdmVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCBkMjc4YTAxLi44ZTE5ZDAyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2RlZmluZSBMT0dfVEFHICJNZWRpYVBsYXllclNlcnZpY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgpAQCAtODEsNyArODIsNyBAQAogI2luY2x1ZGUgIk1lZGlhUGxheWVyRmFjdG9yeS5oIgogCiAjaW5jbHVkZSAiVGVzdFBsYXllclN0dWIuaCIKLSNpbmNsdWRlICJudXBsYXllci9OdVBsYXllckRyaXZlci5oIgorI2luY2x1ZGUgPG51cGxheWVyL051UGxheWVyRHJpdmVyLmg+CiAKIAogc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7CkBAIC02MTAsMjkgKzYxMSw0MiBAQAogICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICB9IGVsc2UgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gbUNsaWVudHMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgICAgICBzcDxDbGllbnQ+IGMgPSBtQ2xpZW50c1tpXS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoYyAhPSAwKSBjLT5kdW1wKGZkLCBhcmdzKTsKLSAgICAgICAgICAgIGNsaWVudHMuYWRkKGMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtTWVkaWFSZWNvcmRlckNsaWVudHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgTm8gbWVkaWEgcmVjb3JkZXIgY2xpZW50XG5cbiIpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICB7CisgICAgICAgICAgICAvLyBjYXB0dXJlIGNsaWVudHMgdW5kZXIgbG9jaworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG4gPSBtQ2xpZW50cy5zaXplKCk7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzcDxDbGllbnQ+IGMgPSBtQ2xpZW50c1tpXS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBjbGllbnRzLmFkZChjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gbU1lZGlhUmVjb3JkZXJDbGllbnRzLnNpemUoKTsgaSA8IG47ICsraSkgewogICAgICAgICAgICAgICAgIHNwPE1lZGlhUmVjb3JkZXJDbGllbnQ+IGMgPSBtTWVkaWFSZWNvcmRlckNsaWVudHNbaV0ucHJvbW90ZSgpOwotICAgICAgICAgICAgICAgIGlmIChjICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgTWVkaWFSZWNvcmRlckNsaWVudCBwaWQoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPm1BdHRyaWJ1dGlvblNvdXJjZS5waWQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAiXG4iOwotICAgICAgICAgICAgICAgICAgICBjLT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgIG1lZGlhUmVjb3JkZXJDbGllbnRzLmFkZChjKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvLyBkdW1wIGNsaWVudHMgb3V0c2lkZSBvZiBsb2NrCisgICAgICAgIGZvciAoY29uc3Qgc3A8Q2xpZW50PiAmYyA6IGNsaWVudHMpIHsKKyAgICAgICAgICAgIGMtPmR1bXAoZmQsIGFyZ3MpOworICAgICAgICB9CisgICAgICAgIGlmIChtZWRpYVJlY29yZGVyQ2xpZW50cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIE5vIG1lZGlhIHJlY29yZGVyIGNsaWVudFxuXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3A8TWVkaWFSZWNvcmRlckNsaWVudD4gJmMgOiBtZWRpYVJlY29yZGVyQ2xpZW50cykgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiIE1lZGlhUmVjb3JkZXJDbGllbnQgcGlkKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPm1BdHRyaWJ1dGlvblNvdXJjZS5waWQpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiXG4iOworICAgICAgICAgICAgICAgIGMtPmR1bXAoZmQsIGFyZ3MpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICByZXN1bHQuYXBwZW5kKCIgRmlsZXMgb3BlbmVkIGFuZC9vciBtYXBwZWQ6XG4iKTsKICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFIC0gMSwgIi9wcm9jLyVkL21hcHMiLCBnZXRwaWQoKSk7CiAgICAgICAgIEZJTEUgKmYgPSBmb3BlbihidWZmZXIsICJyIik7CkBAIC0xODMwLDcgKzE4NDQsNiBAQAogewogICAgIGNsb3NlKCk7CiAgICAgZnJlZShtQXR0cmlidXRlcyk7Ci0gICAgZGVsZXRlIG1DYWxsYmFja0RhdGE7CiB9CiAKIC8vc3RhdGljCkBAIC0yMDUxLDggKzIwNjQsNyBAQAogCiAgICAgICAgIG1SZWN5Y2xlZFRyYWNrLmNsZWFyKCk7CiAgICAgICAgIGNsb3NlX2woKTsKLSAgICAgICAgZGVsZXRlIG1DYWxsYmFja0RhdGE7Ci0gICAgICAgIG1DYWxsYmFja0RhdGEgPSBOVUxMOworICAgICAgICBtQ2FsbGJhY2tEYXRhLmNsZWFyKCk7CiAgICAgfQogfQogCkBAIC0yMTczLDcgKzIxODUsNyBAQAogICAgIH0KIAogICAgIHNwPEF1ZGlvVHJhY2s+IHQ7Ci0gICAgQ2FsbGJhY2tEYXRhICpuZXdjYmQgPSBOVUxMOworICAgIHNwPENhbGxiYWNrRGF0YT4gbmV3Y2JkOwogCiAgICAgLy8gV2UgZG9uJ3QgYXR0ZW1wdCB0byBjcmVhdGUgYSBuZXcgdHJhY2sgaWYgd2UgYXJlIHJlY3ljbGluZyBhbgogICAgIC8vIG9mZmxvYWRlZCB0cmFjay4gQnV0LCBpZiB3ZSBhcmUgcmVjeWNsaW5nIGEgbm9uLW9mZmxvYWRlZCBvciB3ZQpAQCAtMjE4Myw4ICsyMTk1LDggQEAKICAgICBpZiAoIShyZXVzZSAmJiBib3RoT2ZmbG9hZGVkKSkgewogICAgICAgICBBTE9HVigiY3JlYXRpbmcgbmV3IEF1ZGlvVHJhY2siKTsKIAotICAgICAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5ld2NiZCA9IG5ldyBDYWxsYmFja0RhdGEodGhpcyk7CisgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbmV3Y2JkID0gc3A8Q2FsbGJhY2tEYXRhPjo6bWFrZSh3cDxBdWRpb091dHB1dD46OmZyb21FeGlzdGluZyh0aGlzKSk7CiAgICAgICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCiAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLApAQCAtMjE5Miw3ICsyMjA0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIsCiAgICAgICAgICAgICAgICAgICAgIG5ld2NiZCwKICAgICAgICAgICAgICAgICAgICAgMCwgIC8vIG5vdGlmaWNhdGlvbiBmcmFtZXMKICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKQEAgLTIyMTksOCArMjIzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgLy8gY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgLy8gdXNlciBkYXRhCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIC8vIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgIDAsIC8vIG5vdGlmaWNhdGlvbiBmcmFtZXMKICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfREVGQVVMVCwKQEAgLTIyMzYsOCArMjI0Niw3IEBACiAgICAgICAgIHQtPnNldENhbGxlck5hbWUoIm1lZGlhIik7CiAgICAgICAgIGlmICgodCA9PSAwKSB8fCAodC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7CiAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGNyZWF0ZSBhdWRpbyB0cmFjayIpOwotICAgICAgICAgICAgZGVsZXRlIG5ld2NiZDsKLSAgICAgICAgICAgIC8vIHQgZ29lcyBvdXQgb2Ygc2NvcGUsIHNvIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvCisgICAgICAgICAgICAvLyB0LCBuZXdjYmQgZ29lcyBvdXQgb2Ygc2NvcGUsIHNvIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvCiAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIHN1Y2Nlc3NmdWwgQXVkaW9UcmFjayBpbml0aWFsaXphdGlvbiBpbXBsaWVzIGEgbGVnYWN5IHN0cmVhbSB0eXBlIHdhcyBnZW5lcmF0ZWQKQEAgLTIyNzEsNyArMjI4MCw2IEBACiAgICAgICAgICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRGF0YS0+c2V0T3V0cHV0KHRoaXMpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVsZXRlIG5ld2NiZDsKICAgICAgICAgICAgIHJldHVybiB1cGRhdGVUcmFjaygpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjM3Nyw3ICsyMzg1LDcgQEAKICAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAvLyB0d28gYWx0ZXJuYXRpdmUgYXBwcm9hY2hlcwogI2lmIDEKLSAgICAgICAgICAgICAgICBDYWxsYmFja0RhdGEgKmNhbGxiYWNrRGF0YSA9IG1DYWxsYmFja0RhdGE7CisgICAgICAgICAgICAgICAgc3A8Q2FsbGJhY2tEYXRhPiBjYWxsYmFja0RhdGEgPSBtQ2FsbGJhY2tEYXRhOwogICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgIC8vIHByb3BlciBhY3F1aXNpdGlvbiBzZXF1ZW5jZQogICAgICAgICAgICAgICAgIGNhbGxiYWNrRGF0YS0+bG9jaygpOwpAQCAtMjQxNCw5ICsyNDIyLDggQEAKICAgICAgICAgICAgIC8vIGZvciBleGFtcGxlLCB0aGUgbmV4dCBwbGF5ZXIgY291bGQgYmUgcHJlcGFyZWQgYW5kIHNlZWtlZC4KICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAvLyBQcmVzdW1pbmcgaXQgaXNuJ3QgYWR2aXNhYmxlIHRvIGZvcmNlIHRoZSB0cmFjayBvdmVyLgotICAgICAgICAgICAgIGlmIChtTmV4dE91dHB1dC0+bVRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgICBpZiAobU5leHRPdXRwdXQtPm1UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0QoIlJlY3ljbGluZyB0cmFjayBmb3IgZ2FwbGVzcyBwbGF5YmFjayIpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBtTmV4dE91dHB1dC0+bUNhbGxiYWNrRGF0YTsKICAgICAgICAgICAgICAgICBtTmV4dE91dHB1dC0+bUNhbGxiYWNrRGF0YSA9IG1DYWxsYmFja0RhdGE7CiAgICAgICAgICAgICAgICAgbU5leHRPdXRwdXQtPm1SZWN5Y2xlZFRyYWNrID0gbVRyYWNrOwogICAgICAgICAgICAgICAgIG1OZXh0T3V0cHV0LT5tU2FtcGxlUmF0ZUh6ID0gbVNhbXBsZVJhdGVIejsKQEAgLTI0MjQsMTEgKzI0MzEsMTEgQEAKICAgICAgICAgICAgICAgICBtTmV4dE91dHB1dC0+bUZsYWdzID0gbUZsYWdzOwogICAgICAgICAgICAgICAgIG1OZXh0T3V0cHV0LT5tRnJhbWVTaXplID0gbUZyYW1lU2l6ZTsKICAgICAgICAgICAgICAgICBjbG9zZV9sKCk7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrRGF0YSA9IE5VTEw7ICAvLyBkZXN0cnVjdGlvbiBoYW5kbGVkIGJ5IG1OZXh0T3V0cHV0CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrRGF0YS5jbGVhcigpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBTE9HVygiSWdub3JpbmcgZ2FwbGVzcyBwbGF5YmFjayBiZWNhdXNlIG5leHQgcGxheWVyIGhhcyBhbHJlYWR5IHN0YXJ0ZWQiKTsKICAgICAgICAgICAgICAgICAvLyByZW1vdmUgdHJhY2sgaW4gY2FzZSByZXNvdXJjZSBuZWVkZWQgZm9yIGZ1dHVyZSBwbGF5ZXJzLgotICAgICAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0RhdGEtPmVuZFRyYWNrU3dpdGNoKCk7ICAvLyByZWxlYXNlIGxvY2sgZm9yIGNhbGxiYWNrcyBiZWZvcmUgY2xvc2UuCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNsb3NlX2woKTsKQEAgLTI0NjcsOCArMjQ3NCwxMyBAQAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpwYXVzZSgpCiB7CiAgICAgQUxPR1YoInBhdXNlIik7CisgICAgLy8gV2UgdXNlIHBhdXNlQW5kV2FpdCgpIGluc3RlYWQgb2YgcGF1c2UoKSB0byBlbnN1cmUgdHJhY2tzIHJhbXAgdG8gc2lsZW5jZSBiZWZvcmUKKyAgICAvLyBhbnkgZmx1c2guIFdlIGNob29zZSA0MCBtcyB0aW1lb3V0IHRvIGFsbG93IDEgZGVlcCBidWZmZXIgbWl4ZXIgcGVyaW9kCisgICAgLy8gdG8gb2NjdXIuICBPZnRlbiB3YWl0aW5nIGlzIDAgLSAyMCBtcy4KKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisgICAgY29uc3RleHByIGF1dG8gVElNRU9VVF9NUyA9IDQwbXM7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgIT0gMCkgbVRyYWNrLT5wYXVzZSgpOworICAgIGlmIChtVHJhY2sgIT0gMCkgbVRyYWNrLT5wYXVzZUFuZFdhaXQoVElNRU9VVF9NUyk7CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Y2xvc2UoKQpAQCAtMjY1MCw3NiArMjY2Miw3MSBAQAogICAgIH0KIH0KIAotLy8gc3RhdGljCi12b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OkNhbGxiYWNrV3JhcHBlcigKLSAgICAgICAgaW50IGV2ZW50LCB2b2lkICpjb29raWUsIHZvaWQgKmluZm8pIHsKLSAgICAvL0FMT0dWKCJjYWxsYmFja3dyYXBwZXIiKTsKLSAgICBDYWxsYmFja0RhdGEgKmRhdGEgPSAoQ2FsbGJhY2tEYXRhKiljb29raWU7Ci0gICAgLy8gbG9jayB0byBlbnN1cmUgd2UgYXJlbid0IGNhdWdodCBpbiB0aGUgbWlkZGxlIG9mIGEgdHJhY2sgc3dpdGNoLgotICAgIGRhdGEtPmxvY2soKTsKLSAgICBBdWRpb091dHB1dCAqbWUgPSBkYXRhLT5nZXRPdXRwdXQoKTsKLSAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmJ1ZmZlciA9IChBdWRpb1RyYWNrOjpCdWZmZXIgKilpbmZvOwotICAgIGlmIChtZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIG5vIG91dHB1dCBzZXQsIGxpa2VseSBiZWNhdXNlIHRoZSB0cmFjayB3YXMgc2NoZWR1bGVkIHRvIGJlIHJldXNlZAotICAgICAgICAvLyBieSBhbm90aGVyIHBsYXllciwgYnV0IHRoZSBmb3JtYXQgdHVybmVkIG91dCB0byBiZSBpbmNvbXBhdGlibGUuCi0gICAgICAgIGRhdGEtPnVubG9jaygpOwotICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSA9IDA7Ci0gICAgICAgIH0KK3NpemVfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpDYWxsYmFja0RhdGE6Om9uTW9yZURhdGEoY29uc3QgQXVkaW9UcmFjazo6QnVmZmVyJiBidWZmZXIpIHsKKyAgICBBTE9HRCgiZGF0YSBjYWxsYmFjayIpOworICAgIGxvY2soKTsKKyAgICBzcDxBdWRpb091dHB1dD4gbWUgPSBnZXRPdXRwdXQoKTsKKyAgICBpZiAobWUgPT0gbnVsbHB0cikgeworICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNpemVfdCBhY3R1YWxTaXplID0gKCptZS0+bUNhbGxiYWNrKSgKKyAgICAgICAgICAgIG1lLmdldCgpLCBidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpLCBtZS0+bUNhbGxiYWNrQ29va2llLAorICAgICAgICAgICAgQ0JfRVZFTlRfRklMTF9CVUZGRVIpOworCisgICAgLy8gTG9nIHdoZW4gbm8gZGF0YSBpcyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsYmFjay4KKyAgICAvLyAoMSkgV2UgbWF5IGhhdmUgbm8gZGF0YSAoZXNwZWNpYWxseSB3aXRoIG5ldHdvcmsgc3RyZWFtaW5nIHNvdXJjZXMpLgorICAgIC8vICgyKSBXZSBtYXkgaGF2ZSByZWFjaGVkIHRoZSBFT1MgYW5kIHRoZSBhdWRpbyB0cmFjayBpcyBub3Qgc3RvcHBlZCB5ZXQuCisgICAgLy8gTm90ZSB0aGF0IEF3ZXNvbWVQbGF5ZXIvQXVkaW9QbGF5ZXIgd2lsbCBvbmx5IHJldHVybiB6ZXJvIHNpemUgd2hlbiBpdCByZWFjaGVzIHRoZSBFT1MuCisgICAgLy8gTnVQbGF5ZXJSZW5kZXJlciB3aWxsIHJldHVybiB6ZXJvIHdoZW4gaXQgZG9lc24ndCBoYXZlIGRhdGEgKGl0IGRvZXNuJ3QgYmxvY2sgdG8gZmlsbCkuCisgICAgLy8KKyAgICAvLyBUaGlzIGlzIGEgYmVuaWduIGJ1c3ktd2FpdCwgd2l0aCB0aGUgbmV4dCBkYXRhIHJlcXVlc3QgZ2VuZXJhdGVkIDEwIG1zIG9yIG1vcmUgbGF0ZXI7CisgICAgLy8gbmV2ZXJ0aGVsZXNzIGZvciBwb3dlciByZWFzb25zLCB3ZSBkb24ndCB3YW50IHRvIHNlZSB0b28gbWFueSBvZiB0aGVzZS4KKworICAgIEFMT0dWX0lGKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwLCAiY2FsbGJhY2t3cmFwcGVyOiBlbXB0eSBidWZmZXIgcmV0dXJuZWQiKTsKKyAgICB1bmxvY2soKTsKKyAgICByZXR1cm4gYWN0dWFsU2l6ZTsKK30KKwordm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpDYWxsYmFja0RhdGE6Om9uU3RyZWFtRW5kKCkgeworICAgIGxvY2soKTsKKyAgICBzcDxBdWRpb091dHB1dD4gbWUgPSBnZXRPdXRwdXQoKTsKKyAgICBpZiAobWUgPT0gbnVsbHB0cikgeworICAgICAgICB1bmxvY2soKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBBTE9HVigiY2FsbGJhY2t3cmFwcGVyOiBkZWxpdmVyIEVWRU5UX1NUUkVBTV9FTkQiKTsKKyAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLmdldCgpLCBOVUxMIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAorICAgICAgICAgICAgbWUtPm1DYWxsYmFja0Nvb2tpZSwgQ0JfRVZFTlRfU1RSRUFNX0VORCk7CisgICAgdW5sb2NrKCk7Cit9CiAKLSAgICBzd2l0Y2goZXZlbnQpIHsKLSAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX01PUkVfREFUQTogewotICAgICAgICBzaXplX3QgYWN0dWFsU2l6ZSA9ICgqbWUtPm1DYWxsYmFjaykoCi0gICAgICAgICAgICAgICAgbWUsIGJ1ZmZlci0+cmF3LCBidWZmZXItPnNpemUsIG1lLT5tQ2FsbGJhY2tDb29raWUsCi0gICAgICAgICAgICAgICAgQ0JfRVZFTlRfRklMTF9CVUZGRVIpOwogCi0gICAgICAgIC8vIExvZyB3aGVuIG5vIGRhdGEgaXMgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbGJhY2suCi0gICAgICAgIC8vICgxKSBXZSBtYXkgaGF2ZSBubyBkYXRhIChlc3BlY2lhbGx5IHdpdGggbmV0d29yayBzdHJlYW1pbmcgc291cmNlcykuCi0gICAgICAgIC8vICgyKSBXZSBtYXkgaGF2ZSByZWFjaGVkIHRoZSBFT1MgYW5kIHRoZSBhdWRpbyB0cmFjayBpcyBub3Qgc3RvcHBlZCB5ZXQuCi0gICAgICAgIC8vIE5vdGUgdGhhdCBBd2Vzb21lUGxheWVyL0F1ZGlvUGxheWVyIHdpbGwgb25seSByZXR1cm4gemVybyBzaXplIHdoZW4gaXQgcmVhY2hlcyB0aGUgRU9TLgotICAgICAgICAvLyBOdVBsYXllclJlbmRlcmVyIHdpbGwgcmV0dXJuIHplcm8gd2hlbiBpdCBkb2Vzbid0IGhhdmUgZGF0YSAoaXQgZG9lc24ndCBibG9jayB0byBmaWxsKS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhpcyBpcyBhIGJlbmlnbiBidXN5LXdhaXQsIHdpdGggdGhlIG5leHQgZGF0YSByZXF1ZXN0IGdlbmVyYXRlZCAxMCBtcyBvciBtb3JlIGxhdGVyOwotICAgICAgICAvLyBuZXZlcnRoZWxlc3MgZm9yIHBvd2VyIHJlYXNvbnMsIHdlIGRvbid0IHdhbnQgdG8gc2VlIHRvbyBtYW55IG9mIHRoZXNlLgotCi0gICAgICAgIEFMT0dWX0lGKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwLCAiY2FsbGJhY2t3cmFwcGVyOiBlbXB0eSBidWZmZXIgcmV0dXJuZWQiKTsKLQotICAgICAgICBidWZmZXItPnNpemUgPSBhY3R1YWxTaXplOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9TVFJFQU1fRU5EOgotICAgICAgICAvLyBjdXJyZW50bHkgb25seSBvY2N1cnMgZm9yIG9mZmxvYWRlZCBjYWxsYmFja3MKLSAgICAgICAgQUxPR1YoImNhbGxiYWNrd3JhcHBlcjogZGVsaXZlciBFVkVOVF9TVFJFQU1fRU5EIik7Ci0gICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsIE5VTEwgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCi0gICAgICAgICAgICAgICAgbWUtPm1DYWxsYmFja0Nvb2tpZSwgQ0JfRVZFTlRfU1RSRUFNX0VORCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9ORVdfSUFVRElPVFJBQ0sgOgotICAgICAgICBBTE9HVigiY2FsbGJhY2t3cmFwcGVyOiBkZWxpdmVyIEVWRU5UX1RFQVJfRE9XTiIpOwotICAgICAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLCAgTlVMTCAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKLSAgICAgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9URUFSX0RPV04pOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfVU5ERVJSVU46Ci0gICAgICAgIC8vIFRoaXMgb2NjdXJzIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSBhdmFpbGFibGUsIHR5cGljYWxseQotICAgICAgICAvLyB3aGVuIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBzdXBwbHkgZGF0YSB0byB0aGUgQXVkaW9UcmFjay4gIEl0IGNhbiBhbHNvCi0gICAgICAgIC8vIG9jY3VyIGluIG5vbi1vZmZsb2FkZWQgbW9kZSB3aGVuIHRoZSBhdWRpbyBkZXZpY2UgY29tZXMgb3V0IG9mIHN0YW5kYnkuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIElmIGFuIEF1ZGlvVHJhY2sgdW5kZXJydW5zIGl0IG91dHB1dHMgc2lsZW5jZS4gU2luY2UgdGhpcyBoYXBwZW5zIHN1ZGRlbmx5Ci0gICAgICAgIC8vIGl0IG1heSBzb3VuZCBsaWtlIGFuIGF1ZGlibGUgcG9wIG9yIGdsaXRjaC4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIHVuZGVycnVuIGV2ZW50IGlzIHNlbnQgb25jZSBwZXIgdHJhY2sgdW5kZXJydW47IHRoZSBjb25kaXRpb24gaXMgcmVzZXQKLSAgICAgICAgLy8gd2hlbiBtb3JlIGRhdGEgaXMgc2VudCB0byB0aGUgQXVkaW9UcmFjay4KLSAgICAgICAgQUxPR0QoImNhbGxiYWNrd3JhcHBlcjogRVZFTlRfVU5ERVJSVU4gKGRpc2NhcmRlZCkiKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgicmVjZWl2ZWQgdW5rbm93biBldmVudCB0eXBlOiAlZCBpbnNpZGUgQ2FsbGJhY2tXcmFwcGVyICEiLCBldmVudCk7Cit2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OkNhbGxiYWNrRGF0YTo6b25OZXdJQXVkaW9UcmFjaygpIHsKKyAgICBsb2NrKCk7CisgICAgc3A8QXVkaW9PdXRwdXQ+IG1lID0gZ2V0T3V0cHV0KCk7CisgICAgaWYgKG1lID09IG51bGxwdHIpIHsKKyAgICAgICAgdW5sb2NrKCk7CisgICAgICAgIHJldHVybjsKICAgICB9CisgICAgQUxPR1YoImNhbGxiYWNrd3JhcHBlcjogZGVsaXZlciBFVkVOVF9URUFSX0RPV04iKTsKKyAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLmdldCgpLCAgTlVMTCAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKKyAgICAgICAgICAgIG1lLT5tQ2FsbGJhY2tDb29raWUsIENCX0VWRU5UX1RFQVJfRE9XTik7CisgICAgdW5sb2NrKCk7Cit9CiAKLSAgICBkYXRhLT51bmxvY2soKTsKK3ZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Q2FsbGJhY2tEYXRhOjpvblVuZGVycnVuKCkgeworICAgIC8vIFRoaXMgb2NjdXJzIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSBhdmFpbGFibGUsIHR5cGljYWxseQorICAgIC8vIHdoZW4gdGhlcmUgaXMgYSBmYWlsdXJlIHRvIHN1cHBseSBkYXRhIHRvIHRoZSBBdWRpb1RyYWNrLiAgSXQgY2FuIGFsc28KKyAgICAvLyBvY2N1ciBpbiBub24tb2ZmbG9hZGVkIG1vZGUgd2hlbiB0aGUgYXVkaW8gZGV2aWNlIGNvbWVzIG91dCBvZiBzdGFuZGJ5LgorICAgIC8vCisgICAgLy8gSWYgYW4gQXVkaW9UcmFjayB1bmRlcnJ1bnMgaXQgb3V0cHV0cyBzaWxlbmNlLiBTaW5jZSB0aGlzIGhhcHBlbnMgc3VkZGVubHkKKyAgICAvLyBpdCBtYXkgc291bmQgbGlrZSBhbiBhdWRpYmxlIHBvcCBvciBnbGl0Y2guCisgICAgLy8KKyAgICAvLyBUaGUgdW5kZXJydW4gZXZlbnQgaXMgc2VudCBvbmNlIHBlciB0cmFjayB1bmRlcnJ1bjsgdGhlIGNvbmRpdGlvbiBpcyByZXNldAorICAgIC8vIHdoZW4gbW9yZSBkYXRhIGlzIHNlbnQgdG8gdGhlIEF1ZGlvVHJhY2suCisgICAgQUxPR0QoImNhbGxiYWNrd3JhcHBlcjogRVZFTlRfVU5ERVJSVU4gKGRpc2NhcmRlZCkiKTsKKwogfQogCiBhdWRpb19zZXNzaW9uX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Z2V0U2Vzc2lvbklkKCkgY29uc3QKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCA5ODA5MWJlLi44NmJlM2ZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCkBAIC0zMCw5ICszMCwxMSBAQAogI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU3luY2hyb25pemF0aW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtNDEsNyArNDMsNiBAQAogCiB1c2luZyBjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCi1jbGFzcyBBdWRpb1RyYWNrOwogc3RydWN0IEFWU3luY1NldHRpbmdzOwogY2xhc3MgRGVhdGhOb3RpZmllcjsKIGNsYXNzIElEYXRhU291cmNlOwpAQCAtMTYxLDcgKzE2Miw3IEBACiAgICAgICAgIHNwPEF1ZGlvT3V0cHV0PiAgICAgICAgIG1OZXh0T3V0cHV0OwogICAgICAgICBBdWRpb0NhbGxiYWNrICAgICAgICAgICBtQ2FsbGJhY2s7CiAgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0Nvb2tpZTsKLSAgICAgICAgQ2FsbGJhY2tEYXRhICogICAgICAgICAgbUNhbGxiYWNrRGF0YTsKKyAgICAgICAgc3A8Q2FsbGJhY2tEYXRhPiAgICAgICAgbUNhbGxiYWNrRGF0YTsKICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgbVN0cmVhbVR5cGU7CiAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqICAgIG1BdHRyaWJ1dGVzOwogICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTGVmdFZvbHVtZTsKQEAgLTE4OSwxNSArMTkwLDE1IEBACiAgICAgICAgIC8vIENhbGxiYWNrRGF0YSBpcyB3aGF0IGlzIHBhc3NlZCB0byB0aGUgQXVkaW9UcmFjayBhcyB0aGUgInVzZXIiIGRhdGEuCiAgICAgICAgIC8vIFdlIG5lZWQgdG8gYmUgYWJsZSB0byB0YXJnZXQgdGhpcyB0byBhIGRpZmZlcmVudCBPdXRwdXQgb24gdGhlIGZseSwKICAgICAgICAgLy8gc28gd2UgY2FuJ3QgdXNlIHRoZSBPdXRwdXQgaXRzZWxmIGZvciB0aGlzLgotICAgICAgICBjbGFzcyBDYWxsYmFja0RhdGEgeworICAgICAgICBjbGFzcyBDYWxsYmFja0RhdGEgOiBwdWJsaWMgQXVkaW9UcmFjazo6SUF1ZGlvVHJhY2tDYWxsYmFjayB7CiAgICAgICAgICAgICBmcmllbmQgQXVkaW9PdXRwdXQ7CiAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGV4cGxpY2l0IENhbGxiYWNrRGF0YShBdWRpb091dHB1dCAqY29va2llKSB7CisgICAgICAgICAgICBleHBsaWNpdCBDYWxsYmFja0RhdGEoY29uc3Qgd3A8QXVkaW9PdXRwdXQ+JiBjb29raWUpIHsKICAgICAgICAgICAgICAgICBtRGF0YSA9IGNvb2tpZTsKICAgICAgICAgICAgICAgICBtU3dpdGNoaW5nID0gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBdWRpb091dHB1dCAqICAgZ2V0T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbURhdGE7IH0KLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRPdXRwdXQoQXVkaW9PdXRwdXQqIG5ld2Nvb2tpZSkgeyBtRGF0YSA9IG5ld2Nvb2tpZTsgfQorICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXQ+IGdldE91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhLmxvYWQoKS5wcm9tb3RlKCk7IH0KKyAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRPdXRwdXQoY29uc3Qgd3A8QXVkaW9PdXRwdXQ+JiBuZXdjb29raWUpIHsgbURhdGEuc3RvcmUobmV3Y29va2llKTsgfQogICAgICAgICAgICAgLy8gbG9jay91bmxvY2sgYXJlIHVzZWQgYnkgdGhlIGNhbGxiYWNrIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIHBheWxvYWQgb2YgdGhpcyBvYmplY3QKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBsb2NrKCkgY29uc3QgeyBtTG9jay5sb2NrKCk7IH0KICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICB1bmxvY2soKSBjb25zdCB7IG1Mb2NrLnVubG9jaygpOyB9CkBAIC0yMjAsOCArMjIxLDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1Td2l0Y2hpbmcgPSBmYWxzZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkOgorICAgICAgICAgICAgc2l6ZV90IG9uTW9yZURhdGEoY29uc3QgQXVkaW9UcmFjazo6QnVmZmVyJiBidWZmZXIpIG92ZXJyaWRlOworICAgICAgICAgICAgdm9pZCBvblVuZGVycnVuKCkgb3ZlcnJpZGU7CisgICAgICAgICAgICB2b2lkIG9uU3RyZWFtRW5kKCkgb3ZlcnJpZGU7CisgICAgICAgICAgICB2b2lkIG9uTmV3SUF1ZGlvVHJhY2soKSBvdmVycmlkZTsKICAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIEF1ZGlvT3V0cHV0ICogICBtRGF0YTsKKyAgICAgICAgICAgIG1lZGlhdXRpbHM6OmF0b21pY193cDxBdWRpb091dHB1dD4gbURhdGE7CiAgICAgICAgICAgICBtdXRhYmxlIE11dGV4ICAgbUxvY2s7IC8vIGEgcmVjdXJzaXZlIG11dGV4IG1pZ2h0IG1ha2UgdGhpcyB1bm5lY2Vzc2FyeS4KICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBtU3dpdGNoaW5nOwogICAgICAgICAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2FsbGJhY2tEYXRhKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAppbmRleCBhOTE0MDA2Li40YWE4MGJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCkBAIC0xMjYsOCArMTI2LDEzIEBACiAgICAgfQogCiAgICAgaWYgKChhcyA9PSBBVURJT19TT1VSQ0VfRk1fVFVORVIKLSAgICAgICAgICAgICYmICEoY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChtQXR0cmlidXRpb25Tb3VyY2UpCisgICAgICAgICAgICAgICAgJiYgIShjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKG1BdHRyaWJ1dGlvblNvdXJjZSkKICAgICAgICAgICAgICAgICAgICAgfHwgY2FwdHVyZVR1bmVyQXVkaW9JbnB1dEFsbG93ZWQobUF0dHJpYnV0aW9uU291cmNlKSkpCisgICAgICAgICAgICB8fCAoYXMgPT0gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVgKKyAgICAgICAgICAgICAgICAmJiAhKGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQobUF0dHJpYnV0aW9uU291cmNlKQorICAgICAgICAgICAgICAgICAgICB8fCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKG1BdHRyaWJ1dGlvblNvdXJjZSkpKQorICAgICAgICAgICAgfHwgKGFzID09IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRQorICAgICAgICAgICAgICAgICYmICFjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKG1BdHRyaWJ1dGlvblNvdXJjZSkpCiAgICAgICAgICAgICB8fCAhcmVjb3JkaW5nQWxsb3dlZChtQXR0cmlidXRpb25Tb3VyY2UsIChhdWRpb19zb3VyY2VfdClhcykpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCAyYWFiZDUzLi5iM2Y3ZjI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8ZGF0YXNvdXJjZS9QbGF5ZXJTZXJ2aWNlRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxkYXRhc291cmNlL1BsYXllclNlcnZpY2VGaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KQEAgLTE5NCwxOCArMTk1LDggQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgaWYgKG1ldGFPbmx5KSB7Ci0gICAgICAgIHJldHVybiBGcmFtZURlY29kZXI6OmdldE1ldGFkYXRhT25seSh0cmFja01ldGEsIGNvbG9yRm9ybWF0LCB0aHVtYm5haWwpOwotICAgIH0KLQotICAgIHNwPElNZWRpYVNvdXJjZT4gc291cmNlID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7Ci0KLSAgICBpZiAoc291cmNlLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoInVuYWJsZSB0byBpbnN0YW50aWF0ZSBpbWFnZSB0cmFjay4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCiAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBib29sIGlzSGVpZiA9IGZhbHNlOwogICAgIGlmICghdHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgewogICAgICAgICBBTE9HRSgiaW1hZ2UgdHJhY2sgaGFzIG5vIG1pbWUgdHlwZSIpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTIxNSwyMCArMjA2LDc5IEBACiAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDOwogICAgICAgICB0cmFja01ldGEgPSBuZXcgTWV0YURhdGEoKnRyYWNrTWV0YSk7CiAgICAgICAgIHRyYWNrTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUpOworICAgICAgICBpc0hlaWYgPSB0cnVlOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQVZJRikpIHsKICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMTsKICAgICAgICAgdHJhY2tNZXRhID0gbmV3IE1ldGFEYXRhKCp0cmFja01ldGEpOwogICAgICAgICB0cmFja01ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lKTsKICAgICB9CiAKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOworICAgIHN0YXR1c190IGVyciA9IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSh0cmFja01ldGEsICZmb3JtYXQpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImdldEltYWdlSW50ZXJuYWw6IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSgpIGZhaWxlZCwgdW5hYmxlIHRvIGV4dHJhY3QgaW1hZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdWludDMyX3QgYml0RGVwdGggPSA4OworICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgeworICAgICAgICBpbnQzMl90IHByb2ZpbGU7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigicHJvZmlsZSIsICZwcm9maWxlKSkgeworICAgICAgICAgICAgaWYgKEhFVkNQcm9maWxlTWFpbjEwID09IHByb2ZpbGUgfHwgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMCA9PSBwcm9maWxlIHx8CisgICAgICAgICAgICAgICAgICAgIEhFVkNQcm9maWxlTWFpbjEwSERSMTBQbHVzID09IHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgIGJpdERlcHRoID0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkpIHsKKyAgICAgICAgaW50MzJfdCBwcm9maWxlOworICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoInByb2ZpbGUiLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgICAgIGlmIChBVjFQcm9maWxlTWFpbjEwID09IHByb2ZpbGUgfHwgQVYxUHJvZmlsZU1haW4xMEhEUjEwID09IHByb2ZpbGUgfHwKKyAgICAgICAgICAgICAgICAgICAgQVYxUHJvZmlsZU1haW4xMEhEUjEwUGx1cyA9PSBwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgICBiaXREZXB0aCA9IDEwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFPbmx5KSB7CisgICAgICAgIHJldHVybiBGcmFtZURlY29kZXI6OmdldE1ldGFkYXRhT25seSh0cmFja01ldGEsIGNvbG9yRm9ybWF0LCB0aHVtYm5haWwsIGJpdERlcHRoKTsKKyAgICB9CisKKyAgICBzcDxJTWVkaWFTb3VyY2U+IHNvdXJjZSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKGkpOworCisgICAgaWYgKHNvdXJjZS5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJ1bmFibGUgdG8gaW5zdGFudGlhdGUgaW1hZ2UgdHJhY2suIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIGJvb2wgcHJlZmVyaHcgPSBwcm9wZXJ0eV9nZXRfYm9vbCgKICAgICAgICAgICAgICJtZWRpYS5zdGFnZWZyaWdodC50aHVtYm5haWwucHJlZmVyX2h3X2NvZGVjcyIsIGZhbHNlKTsKICAgICB1aW50MzJfdCBmbGFncyA9IHByZWZlcmh3ID8gMCA6IE1lZGlhQ29kZWNMaXN0OjprUHJlZmVyU29mdHdhcmVDb2RlY3M7CiAgICAgVmVjdG9yPEFTdHJpbmc+IG1hdGNoaW5nQ29kZWNzOworCisgICAgLy8gSWYgZGVjb2RpbmcgdGh1bWJuYWlsIGNoZWNrIGRlY29kZXIgc3VwcG9ydHMgdGh1bWJuYWlsIGRpbWVuc2lvbnMgaW5zdGVhZAorICAgIGludDMyX3QgdGh1bWJIZWlnaHQsIHRodW1iV2lkdGg7CisgICAgaWYgKHRodW1ibmFpbCAmJiBmb3JtYXQgIT0gTlVMTAorICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVRodW1ibmFpbEhlaWdodCwgJnRodW1iSGVpZ2h0KQorICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVRodW1ibmFpbFdpZHRoLCAmdGh1bWJXaWR0aCkpIHsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgdGh1bWJIZWlnaHQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIHRodW1iV2lkdGgpOworICAgIH0KKworICAgIC8vIElmIGRlY29kaW5nIHRpbGVkIEhFSUYgY2hlY2sgZGVjb2RlciBzdXBwb3J0cyB0aWxlIGRpbWVuc2lvbnMgaW5zdGVhZAorICAgIGlmICghdGh1bWJuYWlsICYmIGlzSGVpZiAmJiBmb3JtYXQgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IHRpbGVXaWR0aCwgdGlsZUhlaWdodDsKKyAgICAgICAgaWYgKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlUaWxlV2lkdGgsICZ0aWxlV2lkdGgpICYmIHRpbGVXaWR0aCA+IDAKKyAgICAgICAgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5VGlsZUhlaWdodCwgJnRpbGVIZWlnaHQpICYmIHRpbGVIZWlnaHQgPiAwKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoZWlnaHQiLCB0aWxlSGVpZ2h0KTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgdGlsZVdpZHRoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIE1lZGlhQ29kZWNMaXN0OjpmaW5kTWF0Y2hpbmdDb2RlY3MoCiAgICAgICAgICAgICBtaW1lLAogICAgICAgICAgICAgZmFsc2UsIC8qIGVuY29kZXIgKi8KICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgJm1hdGNoaW5nQ29kZWNzKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOyArK2kpIHsKQEAgLTM0OCwxMSArMzk4LDE5IEBACiAgICAgYm9vbCBwcmVmZXJodyA9IHByb3BlcnR5X2dldF9ib29sKAogICAgICAgICAgICAgIm1lZGlhLnN0YWdlZnJpZ2h0LnRodW1ibmFpbC5wcmVmZXJfaHdfY29kZWNzIiwgZmFsc2UpOwogICAgIHVpbnQzMl90IGZsYWdzID0gcHJlZmVyaHcgPyAwIDogTWVkaWFDb2RlY0xpc3Q6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjczsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOworICAgIHN0YXR1c190IGVyciA9IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSh0cmFja01ldGEsICZmb3JtYXQpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImdldEZyYW1lSW50ZXJuYWw6IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSgpIGZhaWxlZCwgdW5hYmxlIHRvIGV4dHJhY3QgZnJhbWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgICAgVmVjdG9yPEFTdHJpbmc+IG1hdGNoaW5nQ29kZWNzOwogICAgIE1lZGlhQ29kZWNMaXN0OjpmaW5kTWF0Y2hpbmdDb2RlY3MoCiAgICAgICAgICAgICBtaW1lLAogICAgICAgICAgICAgZmFsc2UsIC8qIGVuY29kZXIgKi8KICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgJm1hdGNoaW5nQ29kZWNzKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOyArK2kpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAppbmRleCBiZmZkN2IzLi5lYTFmZGY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCkBAIC0xNiwxMyArMTYsMTYgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJTdGFnZWZyaWdodFJlY29yZGVyIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfVklERU8KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAvLyBUT0RPL3dvcmthcm91bmQ6IGluY2x1ZGluZyBiYXNlIGxvZ2dpbmcgbm93IGFzIGl0IGNvbmZsaWN0cyB3aXRoIEFEZWJ1Zy5oCiAvLyBhbmQgaXQgbXVzdCBiZSBpbmNsdWRlZCBmaXJzdC4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiV2VibVdyaXRlci5oIgorI2luY2x1ZGUgPHdlYm0vV2VibVdyaXRlci5oPgorCiAjaW5jbHVkZSAiU3RhZ2VmcmlnaHRSZWNvcmRlci5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgpAQCAtNjQsNyArNjcsNyBAQAogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKLSNpbmNsdWRlICJBUlRQV3JpdGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTg1Niw2ICsxODU5LDcgQEAKIC8vIFNldCB1cCB0aGUgYXBwcm9wcmlhdGUgTWVkaWFTb3VyY2UgZGVwZW5kaW5nIG9uIHRoZSBjaG9zZW4gb3B0aW9uCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE1lZGlhU291cmNlKAogICAgICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiAqbWVkaWFTb3VyY2UpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0RFRkFVTFQKICAgICAgICAgICAgIHx8IG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfQ0FNRVJBKSB7CiAgICAgICAgIHNwPENhbWVyYVNvdXJjZT4gY2FtZXJhU291cmNlOwpAQCAtMTkzNiw2ICsxOTQwLDcgQEAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwVmlkZW9FbmNvZGVyKAogICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJmNhbWVyYVNvdXJjZSwKICAgICAgICAgc3A8TWVkaWFDb2RlY1NvdXJjZT4gKnNvdXJjZSkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc291cmNlLT5jbGVhcigpOwogCiAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOwpAQCAtMjExNCw2ICsyMTE5LDcgQEAKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBBdWRpb0VuY29kZXIoY29uc3Qgc3A8TWVkaWFXcml0ZXI+JiB3cml0ZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICBpZiAoT0sgIT0gKHN0YXR1cyA9IGNoZWNrQXVkaW9FbmNvZGVyQ2FwYWJpbGl0aWVzKCkpKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCBkNmRlNDdmLi5kNzc4NWRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9kYXRhc291cmNlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9BbmRyb2lkLmJwCmluZGV4IDE5ZmMxNzIuLmZlYTAzMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9kYXRhc291cmNlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2RhdGFzb3VyY2UvQW5kcm9pZC5icApAQCAtMTksNyArMTksNiBAQAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNmYxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJtZWRpYXBsYXllcnNlcnZpY2VfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhcGxheWVyc2VydmljZV9saWNlbnNlIiwKKyAgICBdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYm1lZGlhcGxheWVyc2VydmljZUZ1enplcl9kZWZhdWx0cyIsCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhcGxheWVyc2VydmljZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtZWRpYXJlY29yZGVyX2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAibWVkaWFyZWNvcmRlcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJtZWRpYXBsYXllcnNlcnZpY2VGdXp6ZXJfZGVmYXVsdHMiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAorICAgICAgICAibGliYmFzZSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYXYtdHlwZXMtYWlkbC1jcHAiLAorICAgICAgICAibWVkaWFfcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAorICAgICAgICAibGliYW5kcm9pZF9uZXQiLAorICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibWV0YWRhdGFyZXRyaWV2ZXJfZnV6emVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJtZXRhZGF0YXJldHJpZXZlcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJtZWRpYXBsYXllcnNlcnZpY2VGdXp6ZXJfZGVmYXVsdHMiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnBsYXllcnNlcnZpY2VfZGF0YXNvdXJjZSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtZWRpYXBsYXllcl9mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm1lZGlhcGxheWVyX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYm1lZGlhcGxheWVyc2VydmljZUZ1enplcl9kZWZhdWx0cyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicGxheWVyc2VydmljZV9kYXRhc291cmNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X251cGxheWVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAiYXYtdHlwZXMtYWlkbC1jcHAiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYWN0aXZpdHltYW5hZ2VyX2FpZGwiLAorICAgICAgICAibGliYW5kcm9pZF9uZXQiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgICAgICJsaWJjb2RlYzJfY2xpZW50IiwKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICAgICAgImxpYmRybWZyYW1ld29yayIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2NvZGVjbGlzdCIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlibWVkaWFkcm0iLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAorICAgICAgICAibGlibmV0ZF9jbGllbnQiLAorICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2Z1enplci9SRUFETUUubWQgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTNjODA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw4MyBAQAorIyBGdXp6ZXIgZm9yIGxpYm1lZGlhcGxheWVyc2VydmljZQorIyMgVGFibGUgb2YgY29udGVudHMKKysgW1N0YWdlZnJpZ2h0TWVkaWFSZWNvcmRlcl0oI1N0YWdlZnJpZ2h0TWVkaWFSZWNvcmRlcikKKysgW1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXJdKCNTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyKQorKyBbTWVkaWFQbGF5ZXJdKCNNZWRpYVBsYXllcikKKworIyA8YSBuYW1lPSJTdGFnZWZyaWdodE1lZGlhUmVjb3JkZXIiPjwvYT4gRnV6emVyIGZvciBTdGFnZWZyaWdodE1lZGlhUmVjb3JkZXIKKworU3RhZ2VmcmlnaHRNZWRpYVJlY29yZGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIE91dHB1dCBGb3JtYXRzIChwYXJhbWV0ZXIgbmFtZTogYHNldE91dHB1dEZvcm1hdGApCisyLiBBdWRpbyBFbmNvZGVycyAocGFyYW1ldGVyIG5hbWU6IGBzZXRBdWRpb0VuY29kZXJgKQorMy4gVmlkZW8gRW5jb2RlcnMgKHBhcmFtZXRlciBuYW1lOiBgc2V0VmlkZW9FbmNvZGVyYCkKKzQuIEF1ZGlvIFNvdXJjZXMgKHBhcmFtZXRlciBuYW1lOiBgc2V0QXVkaW9Tb3VyY2VgKQorNS4gVmlkZW8gU291cmNlcyAocGFyYW1ldGVyIG5hbWU6IGBzZXRWaWRlb1NvdXJjZWApCis2LiBNaWNyb3Bob25lIERpcmVjdGlvbiAocGFyYW1ldGVyIG5hbWU6IGBzZXRNaWNyb3Bob25lRGlyZWN0aW9uYCkKKworWW91IGNhbiBmaW5kIHRoZSBwb3NzaWJsZSB2YWx1ZXMgaW4gdGhlIGZ1enplcidzIHNvdXJjZSBjb2RlLgorCisjIyMjIFN0ZXBzIHRvIHJ1bgorMS4gQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtZWRpYXJlY29yZGVyX2Z1enplcgorYGBgCisyLiBSdW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbWVkaWFyZWNvcmRlcl9mdXp6ZXIvbWVkaWFyZWNvcmRlcl9mdXp6ZXIKK2BgYAorCisjIDxhIG5hbWU9IlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIiPjwvYT4gRnV6emVyIGZvciBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyCisKK1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBkYXRhIHNvdXJjZXM6CisxLiBVcmwgKHBhcmFtZXRlciBuYW1lOiBgdXJsYCkKKzIuIEZpbGUgZGVzY3JpcHRvciAocGFyYW1ldGVyIG5hbWU6IGBmZGApCiszLiBEYXRhU291cmNlIChwYXJhbWV0ZXIgbmFtZTogYHNvdXJjZWApCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgdXJsYCB8IFVybCBvZiBkYXRhIHNvdXJjZSB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYGZkYCB8IEZpbGUgZGVzY3JpcHRvciB2YWx1ZSBvZiBpbnB1dCBmaWxlIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgc291cmNlYCB8IERhdGFTb3VyY2Ugb2JqZWN0IHwgRGF0YSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8CisKKyMjIyMgU3RlcHMgdG8gcnVuCisxLiBCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIG1ldGFkYXRhcmV0cmlldmVyX2Z1enplcgorYGBgCisyLiBUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbWV0YWRhdGFyZXRyaWV2ZXJfZnV6emVyL21ldGFkYXRhcmV0cmlldmVyX2Z1enplcgorYGBgCisKKyMgPGEgbmFtZT0iTWVkaWFQbGF5ZXIiPjwvYT4gRnV6emVyIGZvciBNZWRpYVBsYXllcgorCitNZWRpYVBsYXllclNlcnZpY2Ugc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBkYXRhIHNvdXJjZXM6CisxLiBVcmwgKHBhcmFtZXRlciBuYW1lOiBgdXJsYCkKKzIuIEZpbGUgZGVzY3JpcHRvciAocGFyYW1ldGVyIG5hbWU6IGBmZGApCiszLiBJU3RyZWFtU291cmNlICAocGFyYW1ldGVyIG5hbWU6IGBzb3VyY2VgKQorNC4gSURhdGFTb3VyY2UgKHBhcmFtZXRlciBuYW1lOiBgc291cmNlYCkKKzUuIFJUUCBQYXJhbWV0ZXJzICAocGFyYW1ldGVyIG5hbWU6IGBydHBQYXJhbXNgKQorCitNZWRpYVBsYXllclNlcnZpY2Ugc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorMS4gQXVkaW8gc2Vzc2lvbnMgKHBhcmFtZXRlciBuYW1lOiBgYXVkaW9TZXNzaW9uSWRgKQorMi4gQXVkaW8gc3RyZXRjaCBtb2RlcyAocGFyYW1ldGVyIG5hbWU6IGBtU3RyZXRjaE1vZGVgKQorMy4gQXVkaW8gZmFsbGJhY2sgbW9kZXMgIChwYXJhbWV0ZXIgbmFtZTogYG1GYWxsYmFja01vZGVgKQorNC4gTWVkaWEgcGFyYW1ldGVyIGtleXMgKHBhcmFtZXRlciBuYW1lOiBga2V5YCkKKzUuIEF1ZGlvIFN0cmVhbSBUeXBlcyAocGFyYW1ldGVyIG5hbWU6IGBzdHJlYW1UeXBlYCkKKzYuIE1lZGlhIEV2ZW50IFR5cGVzIChwYXJhbWV0ZXIgbmFtZTogYG1zZ2ApCis3LiBNZWRpYSBJbmZvIFR5cGVzIChwYXJhbWV0ZXIgbmFtZTogYGV4dDFgKQorCitZb3UgY2FuIGZpbmQgdGhlIHBvc3NpYmxlIHZhbHVlcyBpbiB0aGUgZnV6emVyJ3Mgc291cmNlIGNvZGUuCisKKyMjIyMgU3RlcHMgdG8gcnVuCisxLiBCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIG1lZGlhcGxheWVyX2Z1enplcgorYGBgCisyLiBUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbWVkaWFwbGF5ZXJfZnV6emVyL21lZGlhcGxheWVyX2Z1enplcgorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZnV6emVyL21lZGlhcGxheWVyX2Z1enplci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZnV6emVyL21lZGlhcGxheWVyX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5OWY0NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9mdXp6ZXIvbWVkaWFwbGF5ZXJfZnV6emVyLmNwcApAQCAtMCwwICsxLDM2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKyNpbmNsdWRlIDxNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CisjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgorCitjb25zdGV4cHIgaW50MzJfdCBrVXVpZFNpemUgPSAxNjsKK2NvbnN0ZXhwciBpbnQzMl90IGtNYXhTbGVlcFRpbWVJbk1zID0gMTAwOworY29uc3RleHByIGludDMyX3Qga01pblNsZWVwVGltZUluTXMgPSAwOworY29uc3RleHByIGludDMyX3Qga1BsYXlDb3VudE1pbiA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBrUGxheUNvdW50TWF4ID0gMTA7Citjb25zdGV4cHIgaW50MzJfdCBrTWF4RGltZW5zaW9uID0gODE5MjsKK2NvbnN0ZXhwciBpbnQzMl90IGtNaW5EaW1lbnNpb24gPSAwOworCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NvbnN0ZXhwciBhdWRpb19zZXNzaW9uX3Qga1N1cHBvcnRlZEF1ZGlvU2Vzc2lvbnNbXSA9IHsKKyAgICBBVURJT19TRVNTSU9OX0RFVklDRSwgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UsIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWH07CisKK2NvbnN0ZXhwciBhdWRpb190aW1lc3RyZXRjaF9zdHJldGNoX21vZGVfdCBrQXVkaW9TdHJldGNoTW9kZXNbXSA9IHsKKyAgICBBVURJT19USU1FU1RSRVRDSF9TVFJFVENIX0RFRkFVTFQsIEFVRElPX1RJTUVTVFJFVENIX1NUUkVUQ0hfVk9JQ0V9OworCitjb25zdGV4cHIgYXVkaW9fdGltZXN0cmV0Y2hfZmFsbGJhY2tfbW9kZV90IGtBdWRpb0ZhbGxiYWNrTW9kZXNbXSA9IHsKKyAgICBBVURJT19USU1FU1RSRVRDSF9GQUxMQkFDS19DVVRfUkVQRUFULCBBVURJT19USU1FU1RSRVRDSF9GQUxMQkFDS19ERUZBVUxULAorICAgIEFVRElPX1RJTUVTVFJFVENIX0ZBTExCQUNLX01VVEUsIEFVRElPX1RJTUVTVFJFVENIX0ZBTExCQUNLX0ZBSUx9OworCitjb25zdGV4cHIgbWVkaWFfcGFyYW1ldGVyX2tleXMga01lZGlhUGFyYW1LZXlzW10gPSB7CisgICAgS0VZX1BBUkFNRVRFUl9DQUNIRV9TVEFUX0NPTExFQ1RfRlJFUV9NUywgS0VZX1BBUkFNRVRFUl9BVURJT19DSEFOTkVMX0NPVU5ULAorICAgIEtFWV9QQVJBTUVURVJfUExBWUJBQ0tfUkFURV9QRVJNSUxMRSwgS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTLAorICAgIEtFWV9QQVJBTUVURVJfUlRQX0FUVFJJQlVURVN9OworCitjb25zdGV4cHIgYXVkaW9fc3RyZWFtX3R5cGVfdCBrQXVkaW9TdHJlYW1UeXBlc1tdID0geworICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCAgICBBVURJT19TVFJFQU1fU1lTVEVNLAorICAgIEFVRElPX1NUUkVBTV9SSU5HLCAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgICAgICAgICBBVURJT19TVFJFQU1fQUxBUk0sCisgICAgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08sIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFLAorICAgIEFVRElPX1NUUkVBTV9EVE1GLCAgICAgICAgIEFVRElPX1NUUkVBTV9UVFMsICAgICAgICAgICBBVURJT19TVFJFQU1fQVNTSVNUQU5UfTsKKworY29uc3RleHByIG1lZGlhX2V2ZW50X3R5cGUga01lZGlhRXZlbnRUeXBlc1tdID0ge01FRElBX05PUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9QUkVQQVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9QTEFZQkFDS19DT01QTEVURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9CVUZGRVJJTkdfVVBEQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1NFRUtfQ09NUExFVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfU0VUX1ZJREVPX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfU1RBUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9QQVVTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfU1RPUFBFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9TS0lQUEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX05PVElGWV9USU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1RJTUVEX1RFWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9TVUJUSVRMRV9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01FVEFfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9EUk1fSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9USU1FX0RJU0NPTlRJTlVJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfSU1TX1JYX05PVElDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9BVURJT19ST1VUSU5HX0NIQU5HRUR9OworCitjb25zdGV4cHIgbWVkaWFfaW5mb190eXBlIGtNZWRpYUluZm9UeXBlc1tdID0geworICAgIE1FRElBX0lORk9fVU5LTk9XTiwgICAgICAgICAgIE1FRElBX0lORk9fU1RBUlRFRF9BU19ORVhULAorICAgIE1FRElBX0lORk9fUkVOREVSSU5HX1NUQVJULCAgIE1FRElBX0lORk9fVklERU9fVFJBQ0tfTEFHR0lORywKKyAgICBNRURJQV9JTkZPX0JVRkZFUklOR19TVEFSVCwgICBNRURJQV9JTkZPX0JVRkZFUklOR19FTkQsCisgICAgTUVESUFfSU5GT19ORVRXT1JLX0JBTkRXSURUSCwgTUVESUFfSU5GT19CQURfSU5URVJMRUFWSU5HLAorICAgIE1FRElBX0lORk9fTk9UX1NFRUtBQkxFLCAgICAgIE1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFLAorICAgIE1FRElBX0lORk9fUExBWV9BVURJT19FUlJPUiwgIE1FRElBX0lORk9fUExBWV9WSURFT19FUlJPUiwKKyAgICBNRURJQV9JTkZPX1RJTUVEX1RFWFRfRVJST1J9OworCitjb25zdCBjaGFyICprVXJsUHJlZml4W10gPSB7ImRhdGE6IiwgImh0dHA6Ly8iLCAiaHR0cHM6Ly8iLCAicnRzcDovLyIsICJjb250ZW50Oi8vIiwgInRlc3Q6Ly8ifTsKKworc3RydWN0IFRlc3RTdHJlYW1Tb3VyY2UgOiBwdWJsaWMgSVN0cmVhbVNvdXJjZSB7CisgICAgdm9pZCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJU3RyZWFtTGlzdGVuZXI+ICYgLypsaXN0ZW5lciovKSBvdmVycmlkZXt9OworICAgIHZvaWQgc2V0QnVmZmVycyhjb25zdCBWZWN0b3I8c3A8SU1lbW9yeT4+ICYgLypidWZmZXJzKi8pIG92ZXJyaWRle307CisgICAgdm9pZCBvbkJ1ZmZlckF2YWlsYWJsZShzaXplX3QgLyppbmRleCovKSBvdmVycmlkZXt9OworICAgIElCaW5kZXIgKm9uQXNCaW5kZXIoKSB7IHJldHVybiBudWxscHRyOyB9OworfTsKKworY2xhc3MgQmluZGVyRGVhdGhOb3RpZmllciA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CisgICBwdWJsaWM6CisgICAgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICYpIHsgYWJvcnQoKTsgfQorfTsKKworY2xhc3MgTWVkaWFQbGF5ZXJTZXJ2aWNlRnV6emVyIHsKKyAgIHB1YmxpYzoKKyAgICBNZWRpYVBsYXllclNlcnZpY2VGdXp6ZXIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpCisgICAgICAgIDogbUZkcChkYXRhLCBzaXplKSwgbURhdGFTb3VyY2VGZChtZW1mZF9jcmVhdGUoIklucHV0RmlsZSIsIE1GRF9BTExPV19TRUFMSU5HKSl7fTsKKyAgICB+TWVkaWFQbGF5ZXJTZXJ2aWNlRnV6emVyKCkgeyBjbG9zZShtRGF0YVNvdXJjZUZkKTsgfTsKKyAgICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICBwcml2YXRlOgorICAgIGJvb2wgc2V0RGF0YVNvdXJjZShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBpbnZva2VNZWRpYVBsYXllcigpOworICAgIEZ1enplZERhdGFQcm92aWRlciBtRmRwOworICAgIHNwPElNZWRpYVBsYXllcj4gbU1lZGlhUGxheWVyID0gbnVsbHB0cjsKKyAgICBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+IG1NZWRpYVBsYXllckNsaWVudCA9IG51bGxwdHI7CisgICAgY29uc3QgaW50MzJfdCBtRGF0YVNvdXJjZUZkOworfTsKKworYm9vbCBNZWRpYVBsYXllclNlcnZpY2VGdXp6ZXI6OnNldERhdGFTb3VyY2UoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSAtMTsKKyAgICBlbnVtIERhdGFTb3VyY2VUeXBlIHtodHRwLCBmZCwgc3RyZWFtLCBmaWxlLCBzb2NrZXQsIGtNYXhWYWx1ZSA9IHNvY2tldH07CisgICAgc3dpdGNoIChtRmRwLkNvbnN1bWVFbnVtPERhdGFTb3VyY2VUeXBlPigpKSB7CisgICAgICAgIGNhc2UgaHR0cDogeworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gaGVhZGVyczsKKyAgICAgICAgICAgIGhlYWRlcnMuYWRkKFN0cmluZzgobUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpKTsKKworICAgICAgICAgICAgdWludDMyX3QgZGF0YUJsb2JTaXplID0gbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQxNl90PigwLCBzaXplKTsKKyAgICAgICAgICAgIHZlY3Rvcjx1aW50OF90PiB1cmlTdWZmaXggPSBtRmRwLkNvbnN1bWVCeXRlczx1aW50OF90PihkYXRhQmxvYlNpemUpOworCisgICAgICAgICAgICBzdHJpbmcgdXJpKG1GZHAuUGlja1ZhbHVlSW5BcnJheShrVXJsUHJlZml4KSk7CisgICAgICAgICAgICB1cmkgKz0gIjtiYXNlNjQsIjsKKyAgICAgICAgICAgIEFTdHJpbmcgb3V0OworICAgICAgICAgICAgZW5jb2RlQmFzZTY0KHVyaVN1ZmZpeC5kYXRhKCksIHVyaVN1ZmZpeC5zaXplKCksICZvdXQpOworICAgICAgICAgICAgdXJpICs9IG91dC5jX3N0cigpOworICAgICAgICAgICAgc3RhdHVzID0gbU1lZGlhUGxheWVyLT5zZXREYXRhU291cmNlKG51bGxwdHIgLypodHRwU2VydmljZSovLCB1cmkuY19zdHIoKSwgJmhlYWRlcnMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBmZDogeworICAgICAgICAgICAgd3JpdGUobURhdGFTb3VyY2VGZCwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IG1NZWRpYVBsYXllci0+c2V0RGF0YVNvdXJjZShtRGF0YVNvdXJjZUZkLCAwLCBzaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Ugc3RyZWFtOiB7CisgICAgICAgICAgICBzcDxJU3RyZWFtU291cmNlPiBzdHJlYW1Tb3VyY2UgPSBzcDxUZXN0U3RyZWFtU291cmNlPjo6bWFrZSgpOworICAgICAgICAgICAgc3RhdHVzID0gbU1lZGlhUGxheWVyLT5zZXREYXRhU291cmNlKHN0cmVhbVNvdXJjZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGZpbGU6IHsKKyAgICAgICAgICAgIHdyaXRlKG1EYXRhU291cmNlRmQsIGRhdGEsIHNpemUpOworCisgICAgICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gbmV3IEZpbGVTb3VyY2UoZHVwKG1EYXRhU291cmNlRmQpLCAwLCBzaXplKTsKKyAgICAgICAgICAgIHNwPElEYXRhU291cmNlPiBpRGF0YVNvdXJjZSA9IFJlbW90ZURhdGFTb3VyY2U6OndyYXAoZGF0YVNvdXJjZSk7CisgICAgICAgICAgICBpZiAoIWlEYXRhU291cmNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gbU1lZGlhUGxheWVyLT5zZXREYXRhU291cmNlKGlEYXRhU291cmNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Ugc29ja2V0OiB7CisgICAgICAgICAgICBTdHJpbmc4IHJ0cFBhcmFtcyA9IFN0cmluZzgobUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gZW5kcG9pbnQ7CisgICAgICAgICAgICBlbmRwb2ludC5zaW5fZmFtaWx5ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8dW5zaWduZWQgc2hvcnQ+KCk7CisgICAgICAgICAgICBlbmRwb2ludC5zaW5fcG9ydCA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQxNl90PigpOworICAgICAgICAgICAgbU1lZGlhUGxheWVyLT5zZXRSZXRyYW5zbWl0RW5kcG9pbnQoJmVuZHBvaW50KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1NZWRpYVBsYXllci0+c2V0RGF0YVNvdXJjZShydHBQYXJhbXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBNZWRpYVBsYXllclNlcnZpY2VGdXp6ZXI6Omludm9rZU1lZGlhUGxheWVyKCkgeworICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gY29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OworICAgIFN0cmluZzggbmFtZSA9IFN0cmluZzgobUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSk7CisgICAgdWludDMyX3Qgd2lkdGggPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KGtNaW5EaW1lbnNpb24sIGtNYXhEaW1lbnNpb24pOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oa01pbkRpbWVuc2lvbiwga01heERpbWVuc2lvbik7CisgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIHVpbnQzMl90IGZsYWdzID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBzcDxTdXJmYWNlQ29udHJvbD4gc3VyZmFjZUNvbnRyb2wgPQorICAgICAgICBjb21wb3NlckNsaWVudC0+Y3JlYXRlU3VyZmFjZShuYW1lLCB3aWR0aCwgaGVpZ2h0LCBwaXhlbEZvcm1hdCwgZmxhZ3MpOworICAgIGlmIChzdXJmYWNlQ29udHJvbCkgeworICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gc3VyZmFjZUNvbnRyb2wtPmdldFN1cmZhY2UoKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLT5zZXRWaWRlb1N1cmZhY2VUZXh0dXJlKHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSk7CisgICAgfQorCisgICAgQnVmZmVyaW5nU2V0dGluZ3MgYnVmZmVyaW5nOworICAgIGJ1ZmZlcmluZy5tSW5pdGlhbE1hcmtNcyA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgYnVmZmVyaW5nLm1SZXN1bWVQbGF5YmFja01hcmtNcyA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgbU1lZGlhUGxheWVyLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOworICAgIG1NZWRpYVBsYXllci0+Z2V0QnVmZmVyaW5nU2V0dGluZ3MoJmJ1ZmZlcmluZyk7CisKKyAgICBtTWVkaWFQbGF5ZXItPnByZXBhcmVBc3luYygpOworICAgIHNpemVfdCBwbGF5Q291bnQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PihrUGxheUNvdW50TWluLCBrUGxheUNvdW50TWF4KTsKKyAgICBmb3IgKHNpemVfdCBJZHggPSAwOyBJZHggPCBwbGF5Q291bnQ7ICsrSWR4KSB7CisgICAgICAgIG1NZWRpYVBsYXllci0+c3RhcnQoKTsKKyAgICAgICAgdGhpc190aHJlYWQ6OnNsZWVwX2ZvcihjaHJvbm86Om1pbGxpc2Vjb25kcygKKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PihrTWluU2xlZXBUaW1lSW5Ncywga01heFNsZWVwVGltZUluTXMpKSk7CisgICAgICAgIG1NZWRpYVBsYXllci0+cGF1c2UoKTsKKyAgICAgICAgdGhpc190aHJlYWQ6OnNsZWVwX2ZvcihjaHJvbm86Om1pbGxpc2Vjb25kcygKKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PihrTWluU2xlZXBUaW1lSW5Ncywga01heFNsZWVwVGltZUluTXMpKSk7CisgICAgICAgIG1NZWRpYVBsYXllci0+c3RvcCgpOworICAgIH0KKyAgICBib29sIHN0YXRlOworICAgIG1NZWRpYVBsYXllci0+aXNQbGF5aW5nKCZzdGF0ZSk7CisKKyAgICBBdWRpb1BsYXliYWNrUmF0ZSByYXRlOworICAgIHJhdGUubVNwZWVkID0gbUZkcC5Db25zdW1lRmxvYXRpbmdQb2ludDxmbG9hdD4oKTsKKyAgICByYXRlLm1QaXRjaCA9IG1GZHAuQ29uc3VtZUZsb2F0aW5nUG9pbnQ8ZmxvYXQ+KCk7CisgICAgcmF0ZS5tU3RyZXRjaE1vZGUgPSBtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa0F1ZGlvU3RyZXRjaE1vZGVzKTsKKyAgICByYXRlLm1GYWxsYmFja01vZGUgPSBtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa0F1ZGlvRmFsbGJhY2tNb2Rlcyk7CisgICAgbU1lZGlhUGxheWVyLT5zZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOworICAgIG1NZWRpYVBsYXllci0+Z2V0UGxheWJhY2tTZXR0aW5ncygmcmF0ZSk7CisKKyAgICBBVlN5bmNTZXR0aW5ncyAqYXZTeW5jU2V0dGluZ3MgPSBuZXcgQVZTeW5jU2V0dGluZ3MoKTsKKyAgICBmbG9hdCB2aWRlb0Zwc0hpbnQgPSBtRmRwLkNvbnN1bWVGbG9hdGluZ1BvaW50PGZsb2F0PigpOworICAgIG1NZWRpYVBsYXllci0+c2V0U3luY1NldHRpbmdzKCphdlN5bmNTZXR0aW5ncywgdmlkZW9GcHNIaW50KTsKKyAgICBtTWVkaWFQbGF5ZXItPmdldFN5bmNTZXR0aW5ncyhhdlN5bmNTZXR0aW5ncywgJnZpZGVvRnBzSGludCk7CisgICAgZGVsZXRlIGF2U3luY1NldHRpbmdzOworCisgICAgbU1lZGlhUGxheWVyLT5zZWVrVG8obUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisKKyAgICBpbnQzMl90IG1zZWM7CisgICAgbU1lZGlhUGxheWVyLT5nZXRDdXJyZW50UG9zaXRpb24oJm1zZWMpOworICAgIG1NZWRpYVBsYXllci0+Z2V0RHVyYXRpb24oJm1zZWMpOworICAgIG1NZWRpYVBsYXllci0+cmVzZXQoKTsKKworICAgIG1NZWRpYVBsYXllci0+bm90aWZ5QXQobUZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKSk7CisKKyAgICBtTWVkaWFQbGF5ZXItPnNldEF1ZGlvU3RyZWFtVHlwZShtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa0F1ZGlvU3RyZWFtVHlwZXMpKTsKKyAgICBtTWVkaWFQbGF5ZXItPnNldExvb3BpbmcobUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgZmxvYXQgbGVmdCA9IG1GZHAuQ29uc3VtZUZsb2F0aW5nUG9pbnQ8ZmxvYXQ+KCk7CisgICAgZmxvYXQgcmlnaHQgPSBtRmRwLkNvbnN1bWVGbG9hdGluZ1BvaW50PGZsb2F0PigpOworICAgIG1NZWRpYVBsYXllci0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KTsKKworICAgIFBhcmNlbCByZXF1ZXN0LCByZXBseTsKKyAgICByZXF1ZXN0LndyaXRlSW50MzIobUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgcmVxdWVzdC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgbU1lZGlhUGxheWVyLT5pbnZva2UocmVxdWVzdCwgJnJlcGx5KTsKKworICAgIFBhcmNlbCBmaWx0ZXI7CisgICAgZmlsdGVyLndyaXRlSW50MzIobUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgZmlsdGVyLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICBtTWVkaWFQbGF5ZXItPnNldE1ldGFkYXRhRmlsdGVyKGZpbHRlcik7CisKKyAgICBib29sIHVwZGF0ZU9ubHkgPSBtRmRwLkNvbnN1bWVCb29sKCk7CisgICAgYm9vbCBhcHBseUZpbHRlciA9IG1GZHAuQ29uc3VtZUJvb2woKTsKKyAgICBtTWVkaWFQbGF5ZXItPmdldE1ldGFkYXRhKHVwZGF0ZU9ubHksIGFwcGx5RmlsdGVyLCAmcmVwbHkpOworICAgIG1NZWRpYVBsYXllci0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1GZHAuQ29uc3VtZUZsb2F0aW5nUG9pbnQ8ZmxvYXQ+KCkpOworICAgIG1NZWRpYVBsYXllci0+YXR0YWNoQXV4RWZmZWN0KG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworCisgICAgaW50MzJfdCBrZXkgPSBtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa01lZGlhUGFyYW1LZXlzKTsKKyAgICByZXF1ZXN0LndyaXRlSW50MzIobUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgcmVxdWVzdC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgbU1lZGlhUGxheWVyLT5zZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KTsKKyAgICBrZXkgPSBtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa01lZGlhUGFyYW1LZXlzKTsKKyAgICBtTWVkaWFQbGF5ZXItPmdldFBhcmFtZXRlcihrZXksICZyZXBseSk7CisKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gZW5kcG9pbnQ7CisgICAgbU1lZGlhUGxheWVyLT5nZXRSZXRyYW5zbWl0RW5kcG9pbnQoJmVuZHBvaW50KTsKKworICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2U7CisgICAgYXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUgPSBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpOworICAgIGF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gc3A8QkJpbmRlcj46Om1ha2UoKTsKKyAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBtcFNlcnZpY2UoSU1lZGlhRGVhdGhOb3RpZmllcjo6Z2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCkpOworICAgIHNwPElNZWRpYVBsYXllcj4gbU5leHRNZWRpYVBsYXllciA9IG1wU2VydmljZS0+Y3JlYXRlKAorICAgICAgICBtTWVkaWFQbGF5ZXJDbGllbnQsIG1GZHAuUGlja1ZhbHVlSW5BcnJheShrU3VwcG9ydGVkQXVkaW9TZXNzaW9ucyksIGF0dHJpYnV0aW9uU291cmNlKTsKKyAgICBtTWVkaWFQbGF5ZXItPnNldE5leHRQbGF5ZXIobU5leHRNZWRpYVBsYXllcik7CisKKyAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiBjb25maWd1cmF0aW9uID0KKyAgICAgICAgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj46Om1ha2UoKTsKKyAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+IG9wZXJhdGlvbiA9IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj46Om1ha2UoKTsKKyAgICBtTWVkaWFQbGF5ZXItPmFwcGx5Vm9sdW1lU2hhcGVyKGNvbmZpZ3VyYXRpb24sIG9wZXJhdGlvbik7CisKKyAgICBtTWVkaWFQbGF5ZXItPmdldFZvbHVtZVNoYXBlclN0YXRlKG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIHVpbnQ4X3QgdXVpZFtrVXVpZFNpemVdOworICAgIGZvciAoaW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwga1V1aWRTaXplOyArK2luZGV4KSB7CisgICAgICAgIHV1aWRbaW5kZXhdID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDhfdD4oKTsKKyAgICB9CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGRybVNlc3Npb25JZDsKKyAgICBkcm1TZXNzaW9uSWQucHVzaF9iYWNrKG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ4X3Q+KCkpOworICAgIG1NZWRpYVBsYXllci0+cHJlcGFyZURybSh1dWlkLCBkcm1TZXNzaW9uSWQpOworICAgIG1NZWRpYVBsYXllci0+cmVsZWFzZURybSgpOworCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgbU1lZGlhUGxheWVyLT5zZXRPdXRwdXREZXZpY2UoZGV2aWNlSWQpOworICAgIG1NZWRpYVBsYXllci0+Z2V0Um91dGVkRGV2aWNlSWQoJmRldmljZUlkKTsKKworICAgIG1NZWRpYVBsYXllci0+ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhtRmRwLkNvbnN1bWVCb29sKCkpOworCisgICAgc3A8TWVkaWFQbGF5ZXI+IG1lZGlhUGxheWVyID0gKE1lZGlhUGxheWVyICopbU1lZGlhUGxheWVyLmdldCgpOworCisgICAgaW50MzJfdCBtc2cgPSBtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa01lZGlhRXZlbnRUeXBlcyk7CisgICAgaW50MzJfdCBleHQxID0gbUZkcC5QaWNrVmFsdWVJbkFycmF5KGtNZWRpYUluZm9UeXBlcyk7CisgICAgaW50MzJfdCBleHQyID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBQYXJjZWwgb2JqOworICAgIG9iai53cml0ZUludDMyKG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIG9iai5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgbWVkaWFQbGF5ZXItPm5vdGlmeShtc2csIGV4dDEsIGV4dDIsICZvYmopOworCisgICAgaW50MzJfdCBtZWRpYVBsYXllckR1bXBGZCA9IG1lbWZkX2NyZWF0ZSgiT3V0cHV0RHVtcEZpbGUiLCBNRkRfQUxMT1dfU0VBTElORyk7CisgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgIGFyZ3MucHVzaF9iYWNrKFN0cmluZzE2KG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpKTsKKyAgICBtZWRpYVBsYXllci0+ZHVtcChtZWRpYVBsYXllckR1bXBGZCwgYXJncyk7CisgICAgY2xvc2UobWVkaWFQbGF5ZXJEdW1wRmQpOworCisgICAgbU1lZGlhUGxheWVyLT5kaXNjb25uZWN0KCk7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlRnV6emVyOjpwcm9jZXNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOworCisgICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gbXBTZXJ2aWNlKElNZWRpYURlYXRoTm90aWZpZXI6OmdldE1lZGlhUGxheWVyU2VydmljZSgpKTsKKyAgICBpZiAoIW1wU2VydmljZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBtZWRpYUNvZGVjTGlzdCA9IG1wU2VydmljZS0+Z2V0Q29kZWNMaXN0KCk7CisKKyAgICBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4gcmVtb3RlRGlzcGxheUNsaWVudDsKKyAgICBzcDxJUmVtb3RlRGlzcGxheT4gcmVtb3RlRGlzcGxheSA9IG1wU2VydmljZS0+bGlzdGVuRm9yUmVtb3RlRGlzcGxheSgKKyAgICAgICAgU3RyaW5nMTYobUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSkgLypvcFBhY2thZ2VOYW1lKi8sIHJlbW90ZURpc3BsYXlDbGllbnQsCisgICAgICAgIFN0cmluZzgobUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSkgLyppZmFjZSovKTsKKworICAgIG1wU2VydmljZS0+YWRkQmF0dGVyeURhdGEobUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCkpOworICAgIFBhcmNlbCByZXBseTsKKyAgICBtcFNlcnZpY2UtPnB1bGxCYXR0ZXJ5RGF0YSgmcmVwbHkpOworCisgICAgc3A8TWVkaWFQbGF5ZXJTZXJ2aWNlPiBtZWRpYVBsYXllclNlcnZpY2UgPSAoTWVkaWFQbGF5ZXJTZXJ2aWNlICopbXBTZXJ2aWNlLmdldCgpOworICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2U7CisgICAgYXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUgPSBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpOworICAgIGF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gc3A8QkJpbmRlcj46Om1ha2UoKTsKKyAgICBtTWVkaWFQbGF5ZXIgPSBtZWRpYVBsYXllclNlcnZpY2UtPmNyZWF0ZSgKKyAgICAgICAgbU1lZGlhUGxheWVyQ2xpZW50LCBtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa1N1cHBvcnRlZEF1ZGlvU2Vzc2lvbnMpLCBhdHRyaWJ1dGlvblNvdXJjZSk7CisKKyAgICBpbnQzMl90IG1lZGlhUGxheWVyU2VydmljZUR1bXBGZCA9IG1lbWZkX2NyZWF0ZSgiT3V0cHV0RHVtcEZpbGUiLCBNRkRfQUxMT1dfU0VBTElORyk7CisgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgIGFyZ3MucHVzaF9iYWNrKFN0cmluZzE2KG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpKTsKKyAgICBtZWRpYVBsYXllclNlcnZpY2UtPmR1bXAobWVkaWFQbGF5ZXJTZXJ2aWNlRHVtcEZkLCBhcmdzKTsKKyAgICBjbG9zZShtZWRpYVBsYXllclNlcnZpY2VEdW1wRmQpOworCisgICAgaWYgKCFtTWVkaWFQbGF5ZXIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzZXREYXRhU291cmNlKGRhdGEsIHNpemUpKSB7CisgICAgICAgIGludm9rZU1lZGlhUGxheWVyKCk7CisgICAgfQorfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlRnV6emVyIG1wc0Z1enplcihkYXRhLCBzaXplKTsKKyAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgbXBzRnV6emVyLnByb2Nlc3MoZGF0YSwgc2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2Z1enplci9tZWRpYXJlY29yZGVyX2Z1enplci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZnV6emVyL21lZGlhcmVjb3JkZXJfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDA0MGZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2Z1enplci9tZWRpYXJlY29yZGVyX2Z1enplci5jcHAKQEAgLTAsMCArMSwzMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgorCisjaW5jbHVkZSA8U3RhZ2VmcmlnaHRSZWNvcmRlci5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgorI2luY2x1ZGUgPHRocmVhZD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOworCitjb25zdGV4cHIgdmlkZW9fc291cmNlIGtTdXBwb3J0ZWRWaWRlb1NvdXJjZXNbXSA9IHtWSURFT19TT1VSQ0VfREVGQVVMVCwgVklERU9fU09VUkNFX0NBTUVSQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJREVPX1NPVVJDRV9TVVJGQUNFfTsKKworY29uc3RleHByIGF1ZGlvX3NvdXJjZV90IGtTdXBwb3J0ZWRBdWRpb1NvdXJjZXNbXSA9IHsKKyAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCisgICAgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSywgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTkssCisgICAgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEwsICAgICAgICBBVURJT19TT1VSQ0VfQ0FNQ09SREVSLAorICAgIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiwgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04sCisgICAgQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVgsICAgICBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQsCisgICAgQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFLCBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UsCisgICAgQVVESU9fU09VUkNFX0ZNX1RVTkVSLCAgICAgICAgICBBVURJT19TT1VSQ0VfSE9UV09SRH07CisKK2NvbnN0ZXhwciBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGtTdXBwb3J0ZWRNaWNyb3Bob25lRGlyZWN0aW9uc1tdID0geworICAgIE1JQ19ESVJFQ1RJT05fVU5TUEVDSUZJRUQsIE1JQ19ESVJFQ1RJT05fRlJPTlQsIE1JQ19ESVJFQ1RJT05fQkFDSywgTUlDX0RJUkVDVElPTl9FWFRFUk5BTH07CisKK3N0cnVjdCBSZWNvcmRpbmdDb25maWcgeworICAgIG91dHB1dF9mb3JtYXQgb3V0cHV0Rm9ybWF0OworICAgIGF1ZGlvX2VuY29kZXIgYXVkaW9FbmNvZGVyOworICAgIHZpZGVvX2VuY29kZXIgdmlkZW9FbmNvZGVyOworfTsKKworY29uc3Qgc3RydWN0IFJlY29yZGluZ0NvbmZpZyBrUmVjb3JkaW5nQ29uZmlnTGlzdFtdID0geworICAgIHtPVVRQVVRfRk9STUFUX0FNUl9OQiwgQVVESU9fRU5DT0RFUl9BTVJfTkIsIFZJREVPX0VOQ09ERVJfREVGQVVMVH0sCisgICAge09VVFBVVF9GT1JNQVRfQU1SX1dCLCBBVURJT19FTkNPREVSX0FNUl9XQiwgVklERU9fRU5DT0RFUl9ERUZBVUxUfSwKKyAgICB7T1VUUFVUX0ZPUk1BVF9BQUNfQURUUywgQVVESU9fRU5DT0RFUl9BQUMsIFZJREVPX0VOQ09ERVJfREVGQVVMVH0sCisgICAge09VVFBVVF9GT1JNQVRfQUFDX0FEVFMsIEFVRElPX0VOQ09ERVJfSEVfQUFDLCBWSURFT19FTkNPREVSX0RFRkFVTFR9LAorICAgIHtPVVRQVVRfRk9STUFUX0FBQ19BRFRTLCBBVURJT19FTkNPREVSX0FBQ19FTEQsIFZJREVPX0VOQ09ERVJfREVGQVVMVH0sCisgICAge09VVFBVVF9GT1JNQVRfT0dHLCBBVURJT19FTkNPREVSX09QVVMsIFZJREVPX0VOQ09ERVJfREVGQVVMVH0sCisgICAge09VVFBVVF9GT1JNQVRfUlRQX0FWUCwgQVVESU9fRU5DT0RFUl9ERUZBVUxULCBWSURFT19FTkNPREVSX0RFRkFVTFR9LAorICAgIHtPVVRQVVRfRk9STUFUX01QRUcyVFMsIEFVRElPX0VOQ09ERVJfQUFDLCBWSURFT19FTkNPREVSX0gyNjR9LAorICAgIHtPVVRQVVRfRk9STUFUX1dFQk0sIEFVRElPX0VOQ09ERVJfVk9SQklTLCBWSURFT19FTkNPREVSX1ZQOH0sCisgICAge09VVFBVVF9GT1JNQVRfVEhSRUVfR1BQLCBBVURJT19FTkNPREVSX0RFRkFVTFQsIFZJREVPX0VOQ09ERVJfTVBFR180X1NQfSwKKyAgICB7T1VUUFVUX0ZPUk1BVF9NUEVHXzQsIEFVRElPX0VOQ09ERVJfQUFDLCBWSURFT19FTkNPREVSX0gyNjR9LAorICAgIHtPVVRQVVRfRk9STUFUX01QRUdfNCwgQVVESU9fRU5DT0RFUl9ERUZBVUxULCBWSURFT19FTkNPREVSX01QRUdfNF9TUH0sCisgICAge09VVFBVVF9GT1JNQVRfTVBFR180LCBBVURJT19FTkNPREVSX0RFRkFVTFQsIFZJREVPX0VOQ09ERVJfSEVWQ319OworCitjb25zdCBzdHJpbmcga1BhcmFtZXRlcnNMaXN0W10gPSB7Im1heC1kdXJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heC1maWxlc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVybGVhdmUtZHVyYXRpb24tdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbS1tb3ZpZS10aW1lLXNjYWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0tZ2VvdGFnLWxvbmdpdHVkZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtLWdlb3RhZy1sYXRpdHVkZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtLXRyYWNrLXRpbWUtc3RhdHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8tcGFyYW0tc2FtcGxpbmctcmF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvLXBhcmFtLWVuY29kaW5nLWJpdHJhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby1wYXJhbS1udW1iZXItb2YtY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby1wYXJhbS10aW1lLXNjYWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8tcGFyYW0tcm90YXRpb24tYW5nbGUtZGVncmVlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvLXBhcmFtLWVuY29kaW5nLWJpdHJhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby1wYXJhbS1iaXRyYXRlLW1vZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby1wYXJhbS1pLWZyYW1lcy1pbnRlcnZhbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvLXBhcmFtLWVuY29kZXItcHJvZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvLXBhcmFtLWVuY29kZXItbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby1wYXJhbS1jYW1lcmEtaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby1wYXJhbS10aW1lLXNjYWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0tdXNlLTY0Yml0LW9mZnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWUtbGFwc2UtZW5hYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZS1sYXBzZS1mcHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydHAtcGFyYW0tbG9jYWwtaXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydHAtcGFyYW0tbG9jYWwtcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ0cC1wYXJhbS1yZW1vdGUtcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ0cC1wYXJhbS1zZWxmLWlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnRwLXBhcmFtLW9wcG9uZW50LWlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnRwLXBhcmFtLXBheWxvYWQtdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ0cC1wYXJhbS1leHQtY3ZvLWV4dG1hcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ0cC1wYXJhbS1leHQtY3ZvLWRlZ3JlZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby1wYXJhbS1yZXF1ZXN0LWktZnJhbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydHAtcGFyYW0tc2V0LXNvY2tldC1kc2NwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnRwLXBhcmFtLXNldC1zb2NrZXQtbmV0d29yayJ9OworCitjb25zdGV4cHIgaW50MzJfdCBrTWF4U2xlZXBUaW1lSW5NcyA9IDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtNaW5TbGVlcFRpbWVJbk1zID0gMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtNaW5WaWRlb1NpemUgPSAyOworY29uc3RleHByIGludDMyX3Qga01heFZpZGVvU2l6ZSA9IDgxOTI7Citjb25zdGV4cHIgaW50MzJfdCBrTnVtUmVjb3JkTWluID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IGtOdW1SZWNvcmRNYXggPSAxMDsKKworY2xhc3MgVGVzdEF1ZGlvRGV2aWNlQ2FsbGJhY2sgOiBwdWJsaWMgQXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2sgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgflRlc3RBdWRpb0RldmljZUNhbGxiYWNrKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCBvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IC8qYXVkaW9JbyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IC8qZGV2aWNlSWQqLykgb3ZlcnJpZGV7fTsKK307CisKK2NsYXNzIFRlc3RDYW1lcmEgOiBwdWJsaWMgSUNhbWVyYSB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB+VGVzdENhbWVyYSgpID0gZGVmYXVsdDsKKworICAgIGJpbmRlcjo6U3RhdHVzIGRpc2Nvbm5lY3QoKSBvdmVycmlkZSB7IHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsgfTsKKyAgICBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+ICYgLypjbGllbnQqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfTsKKyAgICBzdGF0dXNfdCBsb2NrKCkgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfTsKKyAgICBzdGF0dXNfdCB1bmxvY2soKSBvdmVycmlkZSB7IHJldHVybiAwOyB9OworICAgIHN0YXR1c190IHNldFByZXZpZXdUYXJnZXQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJiAvKmJ1ZmZlclByb2R1Y2VyKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsKKyAgICB2b2lkIHNldFByZXZpZXdDYWxsYmFja0ZsYWcoaW50IC8qZmxhZyovKSBvdmVycmlkZXt9OworICAgIHN0YXR1c190IHNldFByZXZpZXdDYWxsYmFja1RhcmdldCgKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJiAvKmNhbGxiYWNrUHJvZHVjZXIqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9OworICAgIHN0YXR1c190IHN0YXJ0UHJldmlldygpIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH07CisgICAgdm9pZCBzdG9wUHJldmlldygpIG92ZXJyaWRle307CisgICAgYm9vbCBwcmV2aWV3RW5hYmxlZCgpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH07CisgICAgc3RhdHVzX3Qgc3RhcnRSZWNvcmRpbmcoKSBvdmVycmlkZSB7IHJldHVybiAwOyB9OworICAgIHZvaWQgc3RvcFJlY29yZGluZygpIG92ZXJyaWRle307CisgICAgYm9vbCByZWNvcmRpbmdFbmFibGVkKCkgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfTsKKyAgICB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiAmIC8qbWVtKi8pIG92ZXJyaWRle307CisgICAgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUobmF0aXZlX2hhbmRsZV90ICogLypoYW5kbGUqLykgb3ZlcnJpZGV7fTsKKyAgICB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZUJhdGNoKGNvbnN0IHZlY3RvcjxuYXRpdmVfaGFuZGxlX3QgKj4gJiAvKmhhbmRsZXMqLykgb3ZlcnJpZGV7fTsKKyAgICBzdGF0dXNfdCBhdXRvRm9jdXMoKSBvdmVycmlkZSB7IHJldHVybiAwOyB9OworICAgIHN0YXR1c190IGNhbmNlbEF1dG9Gb2N1cygpIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH07CisgICAgc3RhdHVzX3QgdGFrZVBpY3R1cmUoaW50IC8qbXNnVHlwZSovKSBvdmVycmlkZSB7IHJldHVybiAwOyB9OworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCAmIC8qcGFyYW1zKi8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH07CisgICAgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gU3RyaW5nOCgpOyB9OworICAgIHN0YXR1c190IHNlbmRDb21tYW5kKGludDMyX3QgLypjbWQqLywgaW50MzJfdCAvKmFyZzEqLywgaW50MzJfdCAvKmFyZzIqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9OworICAgIHN0YXR1c190IHNldFZpZGVvQnVmZmVyTW9kZShpbnQzMl90IC8qdmlkZW9CdWZmZXJNb2RlKi8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH07CisgICAgc3RhdHVzX3Qgc2V0VmlkZW9UYXJnZXQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJiAvKmJ1ZmZlclByb2R1Y2VyKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsKKyAgICBzdGF0dXNfdCBzZXRBdWRpb1Jlc3RyaWN0aW9uKGludDMyX3QgLyptb2RlKi8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH07CisgICAgaW50MzJfdCBnZXRHbG9iYWxBdWRpb1Jlc3RyaWN0aW9uKCkgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfTsKKyAgICBJQmluZGVyICpvbkFzQmluZGVyKCkgb3ZlcnJpZGUgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxJQmluZGVyICo+KHRoaXMpOyB9OworfTsKKworY2xhc3MgVGVzdE1lZGlhUmVjb3JkZXJDbGllbnQgOiBwdWJsaWMgSU1lZGlhUmVjb3JkZXJDbGllbnQgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgflRlc3RNZWRpYVJlY29yZGVyQ2xpZW50KCkgPSBkZWZhdWx0OworCisgICAgdm9pZCBub3RpZnkoaW50IC8qbXNnKi8sIGludCAvKmV4dDEqLywgaW50IC8qZXh0MiovKSBvdmVycmlkZXt9OworICAgIElCaW5kZXIgKm9uQXNCaW5kZXIoKSBvdmVycmlkZSB7IHJldHVybiByZWludGVycHJldF9jYXN0PElCaW5kZXIgKj4odGhpcyk7IH07Cit9OworCitjbGFzcyBNZWRpYVJlY29yZGVyQ2xpZW50RnV6emVyIHsKKyAgIHB1YmxpYzoKKyAgICBNZWRpYVJlY29yZGVyQ2xpZW50RnV6emVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB+TWVkaWFSZWNvcmRlckNsaWVudEZ1enplcigpIHsgY2xvc2UobU1lZGlhUmVjb3JkZXJPdXRwdXRGZCk7IH0KKyAgICB2b2lkIHByb2Nlc3MoKTsKKworICAgcHJpdmF0ZToKKyAgICB2b2lkIHNldENvbmZpZygpOworICAgIHZvaWQgZ2V0Q29uZmlnKCk7CisgICAgdm9pZCBkdW1wSW5mbygpOworCisgICAgRnV6emVkRGF0YVByb3ZpZGVyIG1GZHA7CisgICAgdW5pcXVlX3B0cjxNZWRpYVJlY29yZGVyQmFzZT4gbVN0ZlJlY29yZGVyID0gbnVsbHB0cjsKKyAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQgbUNvbXBvc2VyQ2xpZW50OworICAgIHNwPFN1cmZhY2VDb250cm9sPiBtU3VyZmFjZUNvbnRyb2wgPSBudWxscHRyOworICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlID0gbnVsbHB0cjsKKyAgICBjb25zdCBpbnQzMl90IG1NZWRpYVJlY29yZGVyT3V0cHV0RmQ7Cit9OworCit2b2lkIE1lZGlhUmVjb3JkZXJDbGllbnRGdXp6ZXI6OmdldENvbmZpZygpIHsKKyAgICBpbnQzMl90IG1heDsKKyAgICBtU3RmUmVjb3JkZXItPmdldE1heEFtcGxpdHVkZSgmbWF4KTsKKworICAgIGludDMyX3QgZGV2aWNlSWQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIG1TdGZSZWNvcmRlci0+c2V0SW5wdXREZXZpY2UoZGV2aWNlSWQpOworICAgIG1TdGZSZWNvcmRlci0+Z2V0Um91dGVkRGV2aWNlSWQoJmRldmljZUlkKTsKKworICAgIHZlY3RvcjxhbmRyb2lkOjptZWRpYTo6TWljcm9waG9uZUluZm8+IGFjdGl2ZU1pY3JvcGhvbmVze307CisgICAgbVN0ZlJlY29yZGVyLT5nZXRBY3RpdmVNaWNyb3Bob25lcygmYWN0aXZlTWljcm9waG9uZXMpOworCisgICAgaW50MzJfdCBwb3J0SWQ7CisgICAgbVN0ZlJlY29yZGVyLT5nZXRQb3J0SWQoJnBvcnRJZCk7CisKKyAgICB1aW50NjRfdCBieXRlczsKKyAgICBtU3RmUmVjb3JkZXItPmdldFJ0cERhdGFVc2FnZSgmYnl0ZXMpOworCisgICAgUGFyY2VsIHBhcmNlbDsKKyAgICBtU3RmUmVjb3JkZXItPmdldE1ldHJpY3MoJnBhcmNlbCk7CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXIgPSBtU3RmUmVjb3JkZXItPnF1ZXJ5U3VyZmFjZU1lZGlhU291cmNlKCk7Cit9CisKK3ZvaWQgTWVkaWFSZWNvcmRlckNsaWVudEZ1enplcjo6ZHVtcEluZm8oKSB7CisgICAgaW50MzJfdCBkdW1wRmQgPSBtZW1mZF9jcmVhdGUoIkR1bXBGaWxlIiwgTUZEX0FMTE9XX1NFQUxJTkcpOworICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICBhcmdzLnB1c2hfYmFjayhTdHJpbmcxNihtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKSk7CisgICAgbVN0ZlJlY29yZGVyLT5kdW1wKGR1bXBGZCwgYXJncyk7CisgICAgY2xvc2UoZHVtcEZkKTsKK30KKwordm9pZCBNZWRpYVJlY29yZGVyQ2xpZW50RnV6emVyOjpzZXRDb25maWcoKSB7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRPdXRwdXRGaWxlKG1NZWRpYVJlY29yZGVyT3V0cHV0RmQpOworICAgIG1TdGZSZWNvcmRlci0+c2V0QXVkaW9Tb3VyY2UobUZkcC5QaWNrVmFsdWVJbkFycmF5KGtTdXBwb3J0ZWRBdWRpb1NvdXJjZXMpKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldFZpZGVvU291cmNlKG1GZHAuUGlja1ZhbHVlSW5BcnJheShrU3VwcG9ydGVkVmlkZW9Tb3VyY2VzKSk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICBtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa1N1cHBvcnRlZE1pY3JvcGhvbmVEaXJlY3Rpb25zKSk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRQcml2YWN5U2Vuc2l0aXZlKG1GZHAuQ29uc3VtZUJvb2woKSk7CisgICAgYm9vbCBpc1ByaXZhY3lTZW5zaXRpdmU7CisgICAgbVN0ZlJlY29yZGVyLT5pc1ByaXZhY3lTZW5zaXRpdmUoJmlzUHJpdmFjeVNlbnNpdGl2ZSk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRWaWRlb1NpemUobUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KGtNaW5WaWRlb1NpemUsIGtNYXhWaWRlb1NpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PihrTWluVmlkZW9TaXplLCBrTWF4VmlkZW9TaXplKSk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRWaWRlb0ZyYW1lUmF0ZShtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICBtU3RmUmVjb3JkZXItPmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobUZkcC5Db25zdW1lQm9vbCgpKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihtRmRwLkNvbnN1bWVGbG9hdGluZ1BvaW50PGZsb2F0PigpKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldENsaWVudE5hbWUoU3RyaW5nMTYobUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSkpOworCisgICAgaW50MzJfdCBJZHggPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oMCwgc2l6ZShrUmVjb3JkaW5nQ29uZmlnTGlzdCkgLSAxKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldE91dHB1dEZvcm1hdChrUmVjb3JkaW5nQ29uZmlnTGlzdFtJZHhdLm91dHB1dEZvcm1hdCk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRBdWRpb0VuY29kZXIoa1JlY29yZGluZ0NvbmZpZ0xpc3RbSWR4XS5hdWRpb0VuY29kZXIpOworICAgIG1TdGZSZWNvcmRlci0+c2V0VmlkZW9FbmNvZGVyKGtSZWNvcmRpbmdDb25maWdMaXN0W0lkeF0udmlkZW9FbmNvZGVyKTsKKworICAgIGludDMyX3QgbmV4dE91dHB1dEZkID0gbWVtZmRfY3JlYXRlKCJOZXh0T3V0cHV0RmlsZSIsIE1GRF9BTExPV19TRUFMSU5HKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldE5leHRPdXRwdXRGaWxlKG5leHRPdXRwdXRGZCk7CisgICAgY2xvc2UobmV4dE91dHB1dEZkKTsKKworICAgIGZvciAoSWR4ID0gMDsgSWR4IDwgc2l6ZShrUGFyYW1ldGVyc0xpc3QpOyArK0lkeCkgeworICAgICAgICBpZiAobUZkcC5Db25zdW1lQm9vbCgpKSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICAgICAgICAgIG1TdGZSZWNvcmRlci0+c2V0UGFyYW1ldGVycygKKyAgICAgICAgICAgICAgICBTdHJpbmc4KChrUGFyYW1ldGVyc0xpc3RbSWR4XSArICI9IiArIHRvX3N0cmluZyh2YWx1ZSkpLmNfc3RyKCkpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworTWVkaWFSZWNvcmRlckNsaWVudEZ1enplcjo6TWVkaWFSZWNvcmRlckNsaWVudEZ1enplcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkKKyAgICA6IG1GZHAoZGF0YSwgc2l6ZSksIG1NZWRpYVJlY29yZGVyT3V0cHV0RmQobWVtZmRfY3JlYXRlKCJPdXRwdXRGaWxlIiwgTUZEX0FMTE9XX1NFQUxJTkcpKSB7CisgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZSA9IG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCk7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOworICAgIG1TdGZSZWNvcmRlciA9IG1ha2VfdW5pcXVlPFN0YWdlZnJpZ2h0UmVjb3JkZXI+KGF0dHJpYnV0aW9uU291cmNlKTsKKworICAgIG1TdXJmYWNlQ29udHJvbCA9IG1Db21wb3NlckNsaWVudC5jcmVhdGVTdXJmYWNlKAorICAgICAgICBTdHJpbmc4KG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpLCBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKSwKKyAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCksIG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCksCisgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIGlmIChtU3VyZmFjZUNvbnRyb2wpIHsKKyAgICAgICAgbVN1cmZhY2UgPSBtU3VyZmFjZUNvbnRyb2wtPmdldFN1cmZhY2UoKTsKKyAgICAgICAgbVN0ZlJlY29yZGVyLT5zZXRQcmV2aWV3U3VyZmFjZShtU3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKTsKKyAgICB9CisKKyAgICBzcDxUZXN0TWVkaWFSZWNvcmRlckNsaWVudD4gbGlzdGVuZXIgPSBzcDxUZXN0TWVkaWFSZWNvcmRlckNsaWVudD46Om1ha2UoKTsKKyAgICBtU3RmUmVjb3JkZXItPnNldExpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIHNwPFRlc3RDYW1lcmE+IHRlc3RDYW1lcmEgPSBzcDxUZXN0Q2FtZXJhPjo6bWFrZSgpOworICAgIHNwPENhbWVyYT4gY2FtZXJhID0gQ2FtZXJhOjpjcmVhdGUodGVzdENhbWVyYSk7CisgICAgbVN0ZlJlY29yZGVyLT5zZXRDYW1lcmEoY2FtZXJhLT5yZW1vdGUoKSwgY2FtZXJhLT5nZXRSZWNvcmRpbmdQcm94eSgpKTsKKworICAgIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBwZXJzaXN0ZW50U3VyZmFjZSA9IHNwPFBlcnNpc3RlbnRTdXJmYWNlPjo6bWFrZSgpOworICAgIG1TdGZSZWNvcmRlci0+c2V0SW5wdXRTdXJmYWNlKHBlcnNpc3RlbnRTdXJmYWNlKTsKKworICAgIHNwPFRlc3RBdWRpb0RldmljZUNhbGxiYWNrPiBjYWxsYmFjayA9IHNwPFRlc3RBdWRpb0RldmljZUNhbGxiYWNrPjo6bWFrZSgpOworICAgIG1TdGZSZWNvcmRlci0+c2V0QXVkaW9EZXZpY2VDYWxsYmFjayhjYWxsYmFjayk7Cit9CisKK3ZvaWQgTWVkaWFSZWNvcmRlckNsaWVudEZ1enplcjo6cHJvY2VzcygpIHsKKyAgICBzZXRDb25maWcoKTsKKworICAgIG1TdGZSZWNvcmRlci0+aW5pdCgpOworICAgIG1TdGZSZWNvcmRlci0+cHJlcGFyZSgpOworICAgIHNpemVfdCBudW1SZWNvcmQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PihrTnVtUmVjb3JkTWluLCBrTnVtUmVjb3JkTWF4KTsKKyAgICBmb3IgKHNpemVfdCBJZHggPSAwOyBJZHggPCBudW1SZWNvcmQ7ICsrSWR4KSB7CisgICAgICAgIG1TdGZSZWNvcmRlci0+c3RhcnQoKTsKKyAgICAgICAgdGhpc190aHJlYWQ6OnNsZWVwX2ZvcihjaHJvbm86Om1pbGxpc2Vjb25kcygKKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PihrTWluU2xlZXBUaW1lSW5Ncywga01heFNsZWVwVGltZUluTXMpKSk7CisgICAgICAgIG1TdGZSZWNvcmRlci0+cGF1c2UoKTsKKyAgICAgICAgdGhpc190aHJlYWQ6OnNsZWVwX2ZvcihjaHJvbm86Om1pbGxpc2Vjb25kcygKKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PihrTWluU2xlZXBUaW1lSW5Ncywga01heFNsZWVwVGltZUluTXMpKSk7CisgICAgICAgIG1TdGZSZWNvcmRlci0+cmVzdW1lKCk7CisgICAgICAgIHRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoY2hyb25vOjptaWxsaXNlY29uZHMoCisgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oa01pblNsZWVwVGltZUluTXMsIGtNYXhTbGVlcFRpbWVJbk1zKSkpOworICAgICAgICBtU3RmUmVjb3JkZXItPnN0b3AoKTsKKyAgICB9CisgICAgZHVtcEluZm8oKTsKKyAgICBnZXRDb25maWcoKTsKKworICAgIG1TdGZSZWNvcmRlci0+Y2xvc2UoKTsKKyAgICBtU3RmUmVjb3JkZXItPnJlc2V0KCk7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBNZWRpYVJlY29yZGVyQ2xpZW50RnV6emVyIG1yY0Z1enplcihkYXRhLCBzaXplKTsKKyAgICBtcmNGdXp6ZXIucHJvY2VzcygpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2Z1enplci9tZXRhZGF0YXJldHJpZXZlcl9mdXp6ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2Z1enplci9tZXRhZGF0YXJldHJpZXZlcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Y2I2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZnV6emVyL21ldGFkYXRhcmV0cmlldmVyX2Z1enplci5jcHAKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisjaW5jbHVkZSA8U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxkYXRhc291cmNlL0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKworI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjb25zdCBjaGFyICprTWltZVR5cGVzW10gPSB7TUVESUFfTUlNRVRZUEVfSU1BR0VfSlBFRywgICAgICAgICBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4LCAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVYxLCAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVywgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRCwgICAgTUVESUFfTUlNRVRZUEVfVklERU9fRElWWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYMywgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1hWSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTUpQRUcsICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NSURJLCAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCwgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDLCAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNLCAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMsICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDM19KT0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0LCAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQywgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19XTUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNfQURQQ00sICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19EVklfSU1BX0FEUENNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCwgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHLCAgICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUywgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9BVkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyUFMsICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfSEVJRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFAsICAgICAgICAgIE1FRElBX01JTUVUWVBFX1RFWFRfU1VCUklQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1RFWFRfVlRULCAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNjA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1RFWFRfQ0VBXzcwOCwgICAgICAgTUVESUFfTUlNRVRZUEVfREFUQV9USU1FRF9JRDN9OworCitjbGFzcyBNZXRhZGF0YVJldHJpZXZlckZ1enplciB7CisgICBwdWJsaWM6CisgICAgTWV0YWRhdGFSZXRyaWV2ZXJGdXp6ZXIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpCisgICAgICAgIDogbUZkcChkYXRhLCBzaXplKSwKKyAgICAgICAgICBtTWRSZXRyaWV2ZXIobmV3IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKSksCisgICAgICAgICAgbURhdGFTb3VyY2VGZChtZW1mZF9jcmVhdGUoIklucHV0RmlsZSIsIE1GRF9BTExPV19TRUFMSU5HKSkge30KKyAgICB+TWV0YWRhdGFSZXRyaWV2ZXJGdXp6ZXIoKSB7IGNsb3NlKG1EYXRhU291cmNlRmQpOyB9CisgICAgYm9vbCBzZXREYXRhU291cmNlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGdldERhdGEoKTsKKworICAgcHJpdmF0ZToKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgbUZkcDsKKyAgICBzcDxTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyPiBtTWRSZXRyaWV2ZXIgPSBudWxscHRyOworICAgIGNvbnN0IGludDMyX3QgbURhdGFTb3VyY2VGZDsKK307CisKK3ZvaWQgTWV0YWRhdGFSZXRyaWV2ZXJGdXp6ZXI6OmdldERhdGEoKSB7CisgICAgaW50NjRfdCB0aW1lVXMgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpOworICAgIGludDMyX3Qgb3B0aW9uID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBib29sIG1ldGFPbmx5ID0gbUZkcC5Db25zdW1lQm9vbCgpOworICAgIG1NZFJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUodGltZVVzLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CisKKyAgICBpbnQzMl90IGluZGV4ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBjb2xvckZvcm1hdCA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgbWV0YU9ubHkgPSBtRmRwLkNvbnN1bWVCb29sKCk7CisgICAgYm9vbCB0aHVtYm5haWwgPSBtRmRwLkNvbnN1bWVCb29sKCk7CisgICAgbU1kUmV0cmlldmVyLT5nZXRJbWFnZUF0SW5kZXgoaW5kZXgsIGNvbG9yRm9ybWF0LCBtZXRhT25seSwgdGh1bWJuYWlsKTsKKworICAgIGluZGV4ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBjb2xvckZvcm1hdCA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgaW50MzJfdCBsZWZ0ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBpbnQzMl90IHRvcCA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgaW50MzJfdCByaWdodCA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgaW50MzJfdCBib3R0b20gPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIG1NZFJldHJpZXZlci0+Z2V0SW1hZ2VSZWN0QXRJbmRleChpbmRleCwgY29sb3JGb3JtYXQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisKKyAgICBpbmRleCA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgY29sb3JGb3JtYXQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIG1ldGFPbmx5ID0gbUZkcC5Db25zdW1lQm9vbCgpOworICAgIG1NZFJldHJpZXZlci0+Z2V0RnJhbWVBdEluZGV4KGluZGV4LCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOworCisgICAgbU1kUmV0cmlldmVyLT5leHRyYWN0QWxidW1BcnQoKTsKKworICAgIGludDMyX3Qga2V5Q29kZSA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgbU1kUmV0cmlldmVyLT5leHRyYWN0TWV0YWRhdGEoa2V5Q29kZSk7Cit9CisKK2Jvb2wgTWV0YWRhdGFSZXRyaWV2ZXJGdXp6ZXI6OnNldERhdGFTb3VyY2UoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSAtMTsKKworICAgIGVudW0gRGF0YVNvdXJjZUNob2ljZSB7RnJvbUh0dHAsIEZyb21GZCwgRnJvbUZpbGVTb3VyY2UsIGtNYXhWYWx1ZSA9IEZyb21GaWxlU291cmNlfTsKKyAgICBzd2l0Y2ggKG1GZHAuQ29uc3VtZUVudW08RGF0YVNvdXJjZUNob2ljZT4oKSkgeworICAgICAgICBjYXNlIEZyb21IdHRwOiB7CisgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtSGVhZGVyczsKKyAgICAgICAgICAgIG1IZWFkZXJzLmFkZChTdHJpbmc4KG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgobUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSkpOworCisgICAgICAgICAgICB1aW50MzJfdCBkYXRhQmxvYlNpemUgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDE2X3Q+KDAsIHNpemUpOworICAgICAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IHVyaVN1ZmZpeCA9IG1GZHAuQ29uc3VtZUJ5dGVzPHVpbnQ4X3Q+KGRhdGFCbG9iU2l6ZSk7CisKKyAgICAgICAgICAgIHN0cmluZyB1cmkoImRhdGE6Iik7CisgICAgICAgICAgICB1cmkgKz0gIjtiYXNlNjQsIjsKKyAgICAgICAgICAgIEFTdHJpbmcgb3V0OworICAgICAgICAgICAgZW5jb2RlQmFzZTY0KHVyaVN1ZmZpeC5kYXRhKCksIHVyaVN1ZmZpeC5zaXplKCksICZvdXQpOworICAgICAgICAgICAgdXJpICs9IG91dC5jX3N0cigpOworICAgICAgICAgICAgc3RhdHVzID0gbU1kUmV0cmlldmVyLT5zZXREYXRhU291cmNlKG51bGxwdHIgLypodHRwU2VydmljZSovLCB1cmkuY19zdHIoKSwgJm1IZWFkZXJzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRnJvbUZkOiB7CisgICAgICAgICAgICB3cml0ZShtRGF0YVNvdXJjZUZkLCBkYXRhLCBzaXplKTsKKworICAgICAgICAgICAgc3RhdHVzID0gbU1kUmV0cmlldmVyLT5zZXREYXRhU291cmNlKG1EYXRhU291cmNlRmQsIDAsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9tRmlsZVNvdXJjZTogeworICAgICAgICAgICAgd3JpdGUobURhdGFTb3VyY2VGZCwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShkdXAobURhdGFTb3VyY2VGZCksIDAsIHNpemUpOworICAgICAgICAgICAgc3RhdHVzID0gbU1kUmV0cmlldmVyLT5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UsIG1GZHAuUGlja1ZhbHVlSW5BcnJheShrTWltZVR5cGVzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTWV0YWRhdGFSZXRyaWV2ZXJGdXp6ZXIgbXJ0RnV6emVyKGRhdGEsIHNpemUpOworICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICBpZiAobXJ0RnV6emVyLnNldERhdGFTb3VyY2UoZGF0YSwgc2l6ZSkpIHsKKyAgICAgICAgbXJ0RnV6emVyLmdldERhdGEoKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQVdha2VMb2NrLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suY3BwCmluZGV4IGFmOWNmNDUuLmMzYmQyMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suY3BwCkBAIC02Miw3ICs2Miw4IEBACiAgICAgICAgICAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT5hY3F1aXJlV2FrZUxvY2soCiAgICAgICAgICAgICAgICAgICAgIGJpbmRlciwgUE9XRVJNQU5BR0VSX1BBUlRJQUxfV0FLRV9MT0NLLAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigiQVdha2VMb2NrIiksIFN0cmluZzE2KCJtZWRpYSIpLAotICAgICAgICAgICAgICAgICAgICB7fSAvKiB3b3JrU291cmNlICovLCB7fSAvKiBoaXN0b3J5VGFnICovLCAtMSAvKiBkaXNwbGF5SWQgKi8pOworICAgICAgICAgICAgICAgICAgICB7fSAvKiB3b3JrU291cmNlICovLCB7fSAvKiBoaXN0b3J5VGFnICovLCAtMSAvKiBkaXNwbGF5SWQgKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogY2FsbGJhY2sgKi8pOwogICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgICAgICAgICBpZiAoc3RhdHVzLmlzT2soKSkgewogICAgICAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuID0gYmluZGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5icAppbmRleCA2ZDMzOGRiLi43MWEzMTY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5icApAQCAtMzcsMjAgKzM3LDIyIEBACiAgICAgICAgICJTdHJlYW1pbmdTb3VyY2UuY3BwIiwKICAgICBdLAogCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlL251cGxheWVyIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKwogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKICAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKLSAgICBdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cyIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaHR0cGxpdmVfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9ydHNwX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTc0LDEwICs3NiwxMiBAQAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlibWVkaWFkcm0iLAogICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtLVYxLW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJwbGF5ZXJzZXJ2aWNlX2RhdGFzb3VyY2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKICAgICBdLAogCiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X251cGxheWVyIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcAppbmRleCA0MzlkYmU4Li4zNmU0ZDRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSAiR2VuZXJpY1NvdXJjZS5oIgogI2luY2x1ZGUgIk51UGxheWVyRHJtLmgiCiAKLSNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8ZGF0YXNvdXJjZS9QbGF5ZXJTZXJ2aWNlRGF0YVNvdXJjZUZhY3RvcnkuaD4KQEAgLTQ0LDYgKzQzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKaW5kZXggNzdlNzg4NS4uNGU3MWU4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCkBAIC0xOSw4ICsxOSw2IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJIVFRQTGl2ZVNvdXJjZS5oIgotCi0jaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogI2luY2x1ZGUgIkxpdmVEYXRhU291cmNlLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgpAQCAtMzEsNiArMjksNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaD4KIAogLy8gZGVmYXVsdCBidWZmZXIgcHJlcGFyZS9yZWFkeS91bmRlcmZsb3cgbWFya3MKIHN0YXRpYyBjb25zdCBpbnQga1JlYWR5TWFya01zICAgICA9IDUwMDA7ICAvLyA1IHNlY29uZHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCmluZGV4IDlhZTdkZGIuLjliNGZjOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcApAQCAtMzUsOSArMzUsNyBAQAogI2luY2x1ZGUgIlJUU1BTb3VyY2UuaCIKICNpbmNsdWRlICJTdHJlYW1pbmdTb3VyY2UuaCIKICNpbmNsdWRlICJHZW5lcmljU291cmNlLmgiCi0jaW5jbHVkZSAiVGV4dERlc2NyaXB0aW9ucy5oIgotCi0jaW5jbHVkZSAiQVRTUGFyc2VyLmgiCisjaW5jbHVkZSA8dGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKQEAgLTU2LDYgKzU0LDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKKyNpbmNsdWRlIDxtcGVnMnRzL0FUU1BhcnNlci5oPgorCiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogCkBAIC0yODkzLDYgKzI4OTMsMzggQEAKICAgICAgICAgICAgIGluLndyaXRlSW50MzIocmVjdlRpbWVVcyAmIDB4RkZGRkZGRkYpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBBUlRQU291cmNlOjpSVENQX1JSOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQ2NF90IHJlY3ZUaW1lVXM7CisgICAgICAgICAgICBpbnQzMl90IHNlbmRlcklkOworICAgICAgICAgICAgaW50MzJfdCBzc3JjOworICAgICAgICAgICAgaW50MzJfdCBmcmFjdGlvbjsKKyAgICAgICAgICAgIGludDMyX3QgbG9zdDsKKyAgICAgICAgICAgIGludDMyX3QgbGFzdFNlcTsKKyAgICAgICAgICAgIGludDMyX3Qgaml0dGVyOworICAgICAgICAgICAgaW50MzJfdCBsc3I7CisgICAgICAgICAgICBpbnQzMl90IGRsc3I7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgicmVjdi10aW1lLXVzIiwgJnJlY3ZUaW1lVXMpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJydGNwLXJyLXNzcmMiLCAmc2VuZGVySWQpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJydGNwLXJyYi1zc3JjIiwgJnNzcmMpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJydGNwLXJyYi1mcmFjdGlvbiIsICZmcmFjdGlvbikpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0Y3AtcnJiLWxvc3QiLCAmbG9zdCkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0Y3AtcnJiLWxhc3RTZXEiLCAmbGFzdFNlcSkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0Y3AtcnJiLWppdHRlciIsICZqaXR0ZXIpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJydGNwLXJyYi1sc3IiLCAmbHNyKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicnRjcC1ycmItZGxzciIsICZkbHNyKSk7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKHJlY3ZUaW1lVXMgPj4gMzIpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihyZWN2VGltZVVzICYgMHhGRkZGRkZGRik7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKHNlbmRlcklkKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIoc3NyYyk7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKGZyYWN0aW9uKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIobG9zdCk7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKGxhc3RTZXEpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihqaXR0ZXIpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihsc3IpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihkbHNyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICAgIGNhc2UgQVJUUFNvdXJjZTo6UlRDUF9UU0ZCOiAgIC8vIFJUQ1AgVFNGQgogICAgICAgICBjYXNlIEFSVFBTb3VyY2U6OlJUQ1BfUFNGQjogICAvLyBSVENQIFBTRkIKICAgICAgICAgY2FzZSBBUlRQU291cmNlOjpSVFBfQVVUT0RPV046CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCmluZGV4IDJjMWYxNTguLjUyYjIwNDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCkBAIC00MCwxMCArNDAsOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmg+CisjaW5jbHVkZSA8bXBlZzJ0cy9BVFNQYXJzZXIuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogCi0jaW5jbHVkZSAiQVRTUGFyc2VyLmgiCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGZsb2F0IGtEaXNwbGF5UmVmcmVzaGluZ1JhdGUgPSA2MC5mOyAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIHRoZSBkaXNwbGF5CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcAppbmRleCA3OTMwMTRlLi5jYjkxZmQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAKQEAgLTMwLDggKzMwLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotCi0jaW5jbHVkZSAiQVRTUGFyc2VyLmgiCisjaW5jbHVkZSA8bXBlZzJ0cy9BVFNQYXJzZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKaW5kZXggNGE2NWY3MS4uNDVmYWM3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcApAQCAtNzMsNiArNzMsMTAgQEAKIC8vIGlzIGNsb3NlZCB0byBhbGxvdyB0aGUgYXVkaW8gRFNQIHRvIHBvd2VyIGRvd24uCiBzdGF0aWMgY29uc3QgaW50NjRfdCBrT2ZmbG9hZFBhdXNlTWF4VXMgPSAxMDAwMDAwMExMOwogCisvLyBBZGRpdGlvbmFsIGRlbGF5IGFmdGVyIHRlYXJkb3duIGJlZm9yZSByZWxlYXNpbmcgdGhlIHdha2UgbG9jayB0byBhbGxvdyB0aW1lIGZvciB0aGUgYXVkaW8gcGF0aAorLy8gdG8gYmUgY29tcGxldGVseSByZWxlYXNlZAorc3RhdGljIGNvbnN0IGludDY0X3Qga1dha2Vsb2NrUmVsZWFzZURlbGF5VXMgPSAyMDAwMDAwTEw7CisKIC8vIE1heGltdW0gYWxsb3dlZCBkZWxheSBmcm9tIEF1ZGlvU2luaywgMS41IHNlY29uZHMuCiBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4QWxsb3dlZEF1ZGlvU2lua0RlbGF5VXMgPSAxNTAwMDAwTEw7CiAKQEAgLTc5Myw2ICs3OTcsMjAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJBdWRpbyBPZmZsb2FkIHRlYXIgZG93biBkdWUgdG8gcGF1c2UgdGltZW91dC4iKTsKICAgICAgICAgICAgIG9uQXVkaW9UZWFyRG93bihrRHVlVG9UaW1lb3V0KTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBuZXdNc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlV2FrZUxvY2ssIHRoaXMpOworICAgICAgICAgICAgbmV3TXNnLT5zZXRJbnQzMigiZHJhaW5HZW5lcmF0aW9uIiwgZ2VuZXJhdGlvbik7CisgICAgICAgICAgICBuZXdNc2ctPnBvc3Qoa1dha2Vsb2NrUmVsZWFzZURlbGF5VXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVsZWFzZVdha2VMb2NrOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZHJhaW5HZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigicmVsZWFzaW5nIGF1ZGlvIG9mZmxvYWQgcGF1c2Ugd2FrZWxvY2suIik7CiAgICAgICAgICAgICBtV2FrZUxvY2stPnJlbGVhc2UoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNjczLDI0ICsxNjkxLDE4IEBACiAKICAgICAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKIAotICAgICAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKLSAgICAgICAgICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7Ci0gICAgICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOwotICAgICAgICAgICAgaWYgKCFtUGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7Ci0gICAgICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOworICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOworICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOworICAgICAgICBpZiAoIW9mZmxvYWRpbmdBdWRpbygpKSB7CiAgICAgICAgICAgICAvLyBDYWxsIHN0b3AoKSB0byBzaWduYWwgdG8gdGhlIEF1ZGlvU2luayB0byBjb21wbGV0ZWx5IGZpbGwgdGhlCiAgICAgICAgICAgICAvLyBpbnRlcm5hbCBidWZmZXIgYmVmb3JlIHJlc3VtaW5nIHBsYXliYWNrLgogICAgICAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgaWdub3JlZCBhZnRlciBmbHVzaCgpLgogICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOwotICAgICAgICAgICAgaWYgKCFtUGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuID0gMDsKICAgICAgICAgfQorICAgICAgICBpZiAoIW1QYXVzZWQpIHsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgIH0KICAgICAgICAgbU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzID0gLTE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZmx1c2hRdWV1ZSgmbVZpZGVvUXVldWUpOwpAQCAtMTc5MSw2ICsxODAzLDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIHN0YXJ0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7CisKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgICAgIC8vIHdlIGRvIG5vdCBpbmNyZW1lbnQgYXVkaW8gZHJhaW4gZ2VuZXJhdGlvbiBzbyB0aGF0IHdlIGZpbGwgYXVkaW8gYnVmZmVyIGR1cmluZyBwYXVzZS4KQEAgLTE4MDUsNyArMTgxOSw2IEBACiAKICAgICAvLyBOb3RlOiBhdWRpbyBkYXRhIG1heSBub3QgaGF2ZSBiZWVuIGRlY29kZWQsIGFuZCB0aGUgQXVkaW9TaW5rIG1heSBub3QgYmUgb3BlbmVkLgogICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7Ci0gICAgc3RhcnRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKTsKIAogICAgIEFMT0dWKCJub3cgcGF1c2VkIGF1ZGlvIHF1ZXVlIGhhcyAlenUgZW50cmllcywgdmlkZW8gaGFzICV6dSBlbnRyaWVzIiwKICAgICAgICAgICBtQXVkaW9RdWV1ZS5zaXplKCksIG1WaWRlb1F1ZXVlLnNpemUoKSk7CkBAIC0xOTMzLDEyICsxOTQ2LDI3IEBACiAgICAgaW50MzJfdCBudW1DaGFubmVsczsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykpOwogCi0gICAgaW50MzJfdCByYXdDaGFubmVsTWFzazsKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9Ci0gICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigiY2hhbm5lbC1tYXNrIiwgJnJhd0NoYW5uZWxNYXNrKSA/Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihyYXdDaGFubmVsTWFzaykKLSAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmFsIHRvIHRoZSBBdWRpb1NpbmsgdG8gZGVyaXZlIHRoZSBtYXNrIGZyb20gY291bnQuCi0gICAgICAgICAgICAgICAgICAgIDogQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSOworICAgIC8vIGNoYW5uZWwgbWFzayBpbmZvIGFzIHJlYWQgZnJvbSB0aGUgYXVkaW8gZm9ybWF0CisgICAgaW50MzJfdCBjaGFubmVsTWFza0Zyb21Gb3JtYXQ7CisgICAgLy8gY2hhbm5lbCBtYXNrIHRvIHVzZSBmb3IgbmF0aXZlIHBsYXliYWNrCisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2s7CisgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJjaGFubmVsLW1hc2siLCAmY2hhbm5lbE1hc2tGcm9tRm9ybWF0KSkgeworICAgICAgICAvLyBLRVlfQ0hBTk5FTF9NQVNLIGZvbGxvd3MgdGhlIGFuZHJvaWQubWVkaWEuQXVkaW9Gb3JtYXQgamF2YSBtYXNrCisgICAgICAgIC8vIHdoaWNoIGlzIGxlZnQtYml0c2hpZnRlZCBieSAyIHJlbGF0aXZlIHRvIHRoZSBuYXRpdmUgbWFzaworICAgICAgICBpZiAoKGNoYW5uZWxNYXNrRnJvbUZvcm1hdCAmIDBiMTEpICE9IDApIHsKKyAgICAgICAgICAgIC8vIHJlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgbWFzayAoc3VwcG9zZWQgdG8gZm9sbG93IEF1ZGlvRm9ybWF0IGNvbnN0YW50cworICAgICAgICAgICAgLy8gZm9yIG91dHB1dCBtYXNrcyB3aXRoIHRoZSAyIGxlYXN0LXNpZ25pZmljYW50IGJpdHMgYXQgMCksIGJ1dAorICAgICAgICAgICAgLy8gaXQgbWF5IGNvbWUgZnJvbSBhbiBleHRyYWN0b3IgdGhhdCB1c2VzIG5hdGl2ZSBtYXNrczoga2VlcGluZworICAgICAgICAgICAgLy8gdGhlIG1hc2sgYXMgZ2l2ZW4gaXMgb2sgYXMgaXQgY29udGFpbnMgYXQgbGVhc3QgbW9ubyBvciBzdGVyZW8KKyAgICAgICAgICAgIC8vIGFuZCBwb3RlbnRpYWxseSB0aGUgaGFwdGljIGNoYW5uZWxzCisgICAgICAgICAgICBjaGFubmVsTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihjaGFubmVsTWFza0Zyb21Gb3JtYXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oY2hhbm5lbE1hc2tGcm9tRm9ybWF0ID4+IDIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbm8gbWFzayBmb3VuZDogdGhlIG1hc2sgd2lsbCBiZSBkZXJpdmVkIGZyb20gdGhlIGNoYW5uZWwgY291bnQKKyAgICAgICAgY2hhbm5lbE1hc2sgPSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVI7CisgICAgfQogCiAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFBTb3VyY2UuY3BwCmluZGV4IDRkNmE0ODMuLjZhMTc5NzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFBTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFBTb3VyY2UuY3BwCkBAIC0zMzYsNyArMzM2LDcgQEAKICAgICAqZHVyYXRpb25VcyA9IDBsbDsKIAogICAgIGludDY0X3QgYXVkaW9EdXJhdGlvblVzOwotICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMCisgICAgaWYgKG1BdWRpb1RyYWNrICE9IE5VTEwgJiYgbUF1ZGlvVHJhY2stPmdldEZvcm1hdCgpICE9IE5VTEwKICAgICAgICAgICAgICYmIG1BdWRpb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KAogICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgJmF1ZGlvRHVyYXRpb25VcykKICAgICAgICAgICAgICYmIGF1ZGlvRHVyYXRpb25VcyA+ICpkdXJhdGlvblVzKSB7CkBAIC0zNDQsNyArMzQ0LDcgQEAKICAgICB9CiAKICAgICBpbnQ2NF90IHZpZGVvRHVyYXRpb25VczsKLSAgICBpZiAobVZpZGVvVHJhY2sgIT0gTlVMTAorICAgIGlmIChtVmlkZW9UcmFjayAhPSBOVUxMICYmIG1WaWRlb1RyYWNrLT5nZXRGb3JtYXQoKSAhPSBOVUxMCiAgICAgICAgICAgICAmJiBtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQ2NCgKICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICZ2aWRlb0R1cmF0aW9uVXMpCiAgICAgICAgICAgICAmJiB2aWRlb0R1cmF0aW9uVXMgPiAqZHVyYXRpb25VcykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCmluZGV4IDhlMDVkZTguLjc1Y2VkY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKQEAgLTIwLDEzICsyMCwxMiBAQAogCiAjaW5jbHVkZSAiUlRTUFNvdXJjZS5oIgogCi0jaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgIk15SGFuZGxlci5oIgotI2luY2x1ZGUgIlNEUExvYWRlci5oIgotCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCmluZGV4IGJlYzI3ZDMuLjlkNjdjYTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCkBAIC0yMCw4ICsyMCw2IEBACiAKICNpbmNsdWRlICJTdHJlYW1pbmdTb3VyY2UuaCIKIAotI2luY2x1ZGUgIkFUU1BhcnNlci5oIgotI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKICNpbmNsdWRlICJOdVBsYXllclN0cmVhbUxpc3RlbmVyLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgpAQCAtMzEsNiArMjksOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFLZXlzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oPgorI2luY2x1ZGUgPG1wZWcydHMvQVRTUGFyc2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FXYWtlTG9jay5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvQVdha2VMb2NrLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvQVdha2VMb2NrLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCmluZGV4IDdhMmFiOGYuLjgwZTA2ZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCkBAIC0yMSwxMSArMjEsMTAgQEAKICNpbmNsdWRlICJOdVBsYXllci5oIgogI2luY2x1ZGUgIk51UGxheWVyU291cmNlLmgiCiAKLSNpbmNsdWRlICJBVFNQYXJzZXIuaCIKLQogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bXBlZzJ0cy9BVFNQYXJzZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlckJhc2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyRGVjb2RlckJhc2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlckJhc2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyQmFzZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyRHJtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllckRybS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAppbmRleCAzZDJiMDMzLi4zNjQwNjc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaApAQCAtMTAwLDYgKzEwMCw3IEBACiAgICAgICAgIGtXaGF0TWVkaWFSZW5kZXJpbmdTdGFydCAgICAgID0gJ21kcmQnLAogICAgICAgICBrV2hhdEF1ZGlvVGVhckRvd24gICAgICAgICAgICA9ICdhZFREJywKICAgICAgICAga1doYXRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQgPSAnYU9QVCcsCisgICAgICAgIGtXaGF0UmVsZWFzZVdha2VMb2NrICAgICAgICAgID0gJ2FkUkwnLAogICAgIH07CiAKICAgICBlbnVtIEF1ZGlvVGVhckRvd25SZWFzb24gewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU3RyZWFtTGlzdGVuZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL051UGxheWVyU3RyZWFtTGlzdGVuZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU3RyZWFtTGlzdGVuZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9SVFBTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9pbmNsdWRlL251cGxheWVyL1JUUFNvdXJjZS5oCmluZGV4IDNiNGY5ZTkuLjdkOWJiOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFBTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9SVFBTb3VyY2UuaApAQCAtMjMsMjUgKzIzLDIwIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oPgorI2luY2x1ZGUgPG1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oPgogCiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKLSNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCi0jaW5jbHVkZSAiQVBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgIkFSVFBDb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgotI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKICNpbmNsdWRlICJOdVBsYXllclNvdXJjZS5oIgogCi0KLQotCi0KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUxvb3BlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9SVFNQU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oCmluZGV4IDAzZmNlMDguLjc0OTdlNDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL2luY2x1ZGUvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlICJOdVBsYXllclNvdXJjZS5oIgogCi0jaW5jbHVkZSAiQVRTUGFyc2VyLmgiCisjaW5jbHVkZSA8bXBlZzJ0cy9BVFNQYXJzZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvaW5jbHVkZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icAppbmRleCA5ODYyNmZkLi45OTIwMmI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icApAQCAtMzAsNyArMzAsNyBAQAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrIiwKICAgICBdLAogCiAgICAgaW5jbHVkZV9kaXJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAKaW5kZXggYzgxYTY1OS4uMmJlYjQ3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0RybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9Ecm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcApAQCAtNjEsNyArNjEsMTEgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIGlzVmFsaWRQaWQoaW50IC8qIHBpZCAqLykgeworICAgIHZpcnR1YWwgYm9vbCBpc1BpZFRydXN0ZWQoaW50IC8qIHBpZCAqLykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNQaWRVaWRUcnVzdGVkKGludCAvKiBwaWQgKi8sIGludCAvKiB1aWQgKi8pIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvQW5kcm9pZC5icAppbmRleCA5MjIzNmVhLi42ZWI4YzZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9zdGFnZWZyaWdodFJlY29yZGVyL0FuZHJvaWQuYnAKQEAgLTMzLDEwICszMyw2IEBACiAgICAgICAgICJTdGFnZWZyaWdodFJlY29yZGVyVGVzdC5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIiwKLSAgICBdLAotCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhcGxheWVyc2VydmljZSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKaW5kZXggMDQyODUwYy4uOTM3NjUwZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icApAQCAtMTA2LDggKzEwNiw4IEBACiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAotICAgICAgICAicmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS1WMS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGsiLAorICAgICAgICAicmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS1WMS1uZGsiLAogICAgICAgICAibGlic3RhdHNsb2dfbWVkaWEiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9Db250cm9sbGVyQ2xpZW50SW50ZXJmYWNlLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQ29udHJvbGxlckNsaWVudEludGVyZmFjZS5oCmluZGV4IDkzMTFlMmUuLmVhNjNkYTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9Db250cm9sbGVyQ2xpZW50SW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL0NvbnRyb2xsZXJDbGllbnRJbnRlcmZhY2UuaApAQCAtNjYsNyArNjYsNyBAQAogICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIHNlc3Npb24gZG9lc24ndCBleGlzdCwgb3IgdGhlIGNsaWVudCBpcyBhbHJlYWR5IHJlcXVlc3RpbmcgdGhlCiAgICAgICogc2Vzc2lvbi4gUmV0dXJucyB0cnVlIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgYWRkQ2xpZW50VWlkKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIHVpZF90IGNsaWVudFVpZCk7CisgICAgdmlydHVhbCBib29sIGFkZENsaWVudFVpZChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLCB1aWRfdCBjbGllbnRVaWQpID0gMDsKIAogICAgIC8qKgogICAgICAqIFJldHJpZXZlcyB0aGUgKHVuc29ydGVkKSBsaXN0IG9mIGFsbCBjbGllbnRzIHJlcXVlc3RpbmcgdGhlIHNlc3Npb24gaWRlbnRpZmllZCBieQpAQCAtODEsNyArODEsNyBAQAogICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIHNlc3Npb24gZG9lc24ndCBleGlzdC4gUmV0dXJucyB0cnVlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICB2aXJ0dWFsIGJvb2wgZ2V0Q2xpZW50VWlkcyhDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBvdXRfY2xpZW50VWlkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4qIG91dF9jbGllbnRVaWRzKSA9IDA7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5Db250cm9sbGVyQ2xpZW50SW50ZXJmYWNlKCkgPSBkZWZhdWx0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDYwMzYxMWEuLjdhNjk4MGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTMxLDcgKzMxLDcgQEAKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrIiwKICAgICAgICAgImxpYm1lZGlhdHJhbnNjb2RpbmciLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9NZWRpYVRyYW5zY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhVHJhbnNjb2Rlci5jcHAKaW5kZXggZTIwZjdhYi4uNDExYjZlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhVHJhbnNjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhVHJhbnNjb2Rlci5jcHAKQEAgLTU1LDggKzU1LDggQEAKICAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHNyY0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmc3JjTWltZSk7CiAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG9wdGlvbnMsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJmRzdE1pbWUpIHx8CiAgICAgICAgIHN0cmNtcChzcmNNaW1lLCBkc3RNaW1lKSA9PSAwKSB7Ci0gICAgICAgIHNyY1BhcmFtc1RvQ29weS5wdXNoX2JhY2soRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSwgU3RyaW5nKSk7Ci0gICAgICAgIHNyY1BhcmFtc1RvQ29weS5wdXNoX2JhY2soRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfTEVWRUwsIFN0cmluZykpOworICAgICAgICBzcmNQYXJhbXNUb0NvcHkucHVzaF9iYWNrKEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEUsIEludDMyKSk7CisgICAgICAgIHNyY1BhcmFtc1RvQ29weS5wdXNoX2JhY2soRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfTEVWRUwsIEludDMyKSk7CiAgICAgfQogCiAgICAgLy8gLS0tLS0tLSBEZWZpbmUgcGFyYW1ldGVycyB0byBjb3B5IGZyb20gdGhlIGNhbGxlcidzIG9wdGlvbnMgLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKaW5kZXggMzQ4YjRmOC4uNjM1ZjY3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaAorKysgYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCkBAIC00MiwxMCArNDIsNiBAQAogICAgIC8vdmlydHVhbCBzaXplX3QgZnJhbWVzVW5kZXJydW4oKSBjb25zdDsKICAgICAvL3ZpcnR1YWwgc2l6ZV90IHVuZGVycnVucygpIGNvbnN0OwogCi0gICAgLy8gVGhpcyBpcyBhbiBvdmVyLWVzdGltYXRlLCBhbmQgY291bGQgZHVwZSB0aGUgY2FsbGVyIGludG8gbWFraW5nIGEgYmxvY2tpbmcgd3JpdGUoKQotICAgIC8vIEZJWE1FIFVzZSBhbiBhdWRpbyBIQUwgQVBJIHRvIHF1ZXJ5IHRoZSBidWZmZXIgZW1wdHlpbmcgc3RhdHVzIHdoZW4gaXQncyBhdmFpbGFibGUuCi0gICAgdmlydHVhbCBzc2l6ZV90IGF2YWlsYWJsZVRvV3JpdGUoKSB7IHJldHVybiBtU3RyZWFtQnVmZmVyU2l6ZUJ5dGVzIC8gbUZyYW1lU2l6ZTsgfQotCiAgICAgdmlydHVhbCBzc2l6ZV90IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lc3RhbXApOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKaW5kZXggMWFhMTg0OC4uNTJjNGMwZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCkBAIC03Nyw2ICs3Nyw3IEBACiBuYW1lc3BhY2UgewogCiBjb25zdGV4cHIgY2hhciBUVU5ORUxfUEVFS19LRVlbXSA9ICJhbmRyb2lkLl90cmlnZ2VyLXR1bm5lbC1wZWVrIjsKK2NvbnN0ZXhwciBjaGFyIFRVTk5FTF9QRUVLX1NFVF9MRUdBQ1lfS0VZW10gPSAiYW5kcm9pZC5fdHVubmVsLXBlZWstc2V0LWxlZ2FjeSI7CiAKIH0KIApAQCAtMjE5NSw3ICsyMTk2LDEwIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy1tYXgtb3V0cHV0LWNoYW5uZWxfY291bnQiLCAmbWF4T3V0cHV0Q2hhbm5lbENvdW50KSkgewotICAgICAgICAgICAgICAgIG1heE91dHB1dENoYW5uZWxDb3VudCA9IC0xOworICAgICAgICAgICAgICAgIC8vIGNoZWNrIG5vbiBBQUMtc3BlY2lmaWMga2V5CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigibWF4LW91dHB1dC1jaGFubmVsLWNvdW50IiwgJm1heE91dHB1dENoYW5uZWxDb3VudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4T3V0cHV0Q2hhbm5lbENvdW50ID0gLTE7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLXBjbS1saW1pdGVyLWVuYWJsZSIsICZwY21MaW1pdGVyRW5hYmxlKSkgewogICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIHVua25vd24KQEAgLTI0ODAsMTcgKzI0ODQsMzkgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBPTVhfQ09ORklHX0JPT0xFQU5UWVBFIGNvbmZpZzsKLSAgICBJbml0T01YUGFyYW1zKCZjb25maWcpOwotICAgIGNvbmZpZy5iRW5hYmxlZCA9IChPTVhfQk9PTCkodHVubmVsUGVlayAhPSAwKTsKKyAgICBPTVhfQ09ORklHX0JPT0xFQU5UWVBFIHR1bm5lbFBlZWtDb25maWc7CisgICAgSW5pdE9NWFBhcmFtcygmdHVubmVsUGVla0NvbmZpZyk7CisgICAgdHVubmVsUGVla0NvbmZpZy5iRW5hYmxlZCA9IChPTVhfQk9PTCkodHVubmVsUGVlayAhPSAwKTsKICAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+c2V0Q29uZmlnKAogICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnQW5kcm9pZFR1bm5lbFBlZWssCi0gICAgICAgICAgICAmY29uZmlnLCBzaXplb2YoY29uZmlnKSk7CisgICAgICAgICAgICAmdHVubmVsUGVla0NvbmZpZywgc2l6ZW9mKHR1bm5lbFBlZWtDb25maWcpKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJkZWNvZGVyIGNhbm5vdCBzZXQgJXMgdG8gJWQgKGVyciAlZCkiLAotICAgICAgICAgICAgICBUVU5ORUxfUEVFS19LRVksIHR1bm5lbFBlZWssIGVycik7CisgICAgICAgICAgICAgICAgVFVOTkVMX1BFRUtfS0VZLCB0dW5uZWxQZWVrLCBlcnIpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBBQ29kZWM6OnNldFR1bm5lbFBlZWtMZWdhY3koaW50MzJfdCBpc0xlZ2FjeSkgeworICAgIGlmIChtSXNFbmNvZGVyKSB7CisgICAgICAgIEFMT0dFKCJlbmNvZGVyIGRvZXMgbm90IHN1cHBvcnQgJXMiLCBUVU5ORUxfUEVFS19TRVRfTEVHQUNZX0tFWSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICghbVR1bm5lbGVkKSB7CisgICAgICAgIEFMT0dFKCIlcyBpcyBvbmx5IHN1cHBvcnRlZCBpbiB0dW5uZWwgbW9kZSIsIFRVTk5FTF9QRUVLX1NFVF9MRUdBQ1lfS0VZKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBPTVhfQ09ORklHX0JPT0xFQU5UWVBFIHR1bm5lbFBlZWtMZWdhY3lNb2RlQ29uZmlnOworICAgIEluaXRPTVhQYXJhbXMoJnR1bm5lbFBlZWtMZWdhY3lNb2RlQ29uZmlnKTsKKyAgICB0dW5uZWxQZWVrTGVnYWN5TW9kZUNvbmZpZy5iRW5hYmxlZCA9IChPTVhfQk9PTCkoaXNMZWdhY3kgIT0gMCk7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWE5vZGUtPnNldENvbmZpZygKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ0FuZHJvaWRUdW5uZWxQZWVrTGVnYWN5TW9kZSwKKyAgICAgICAgICAgICZ0dW5uZWxQZWVrTGVnYWN5TW9kZUNvbmZpZywgc2l6ZW9mKHR1bm5lbFBlZWtMZWdhY3lNb2RlQ29uZmlnKSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZGVjb2RlciBjYW5ub3Qgc2V0IHZpZGVvIHBlZWsgbGVnYWN5IG1vZGUgdG8gJWQgKGVyciAlZCkiLAorICAgICAgICAgICAgICAgIGlzTGVnYWN5LCAgZXJyKTsKKyAgICB9CiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtMzMwNCwxMCArMzMzMCwxMiBAQAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIm5hdGl2ZV93aW5kb3dfc2V0X3NpZGViYW5kX3N0cmVhbSglcCkgZmFpbGVkISAoZXJyICVkKS4iLAogICAgICAgICAgICAgICAgIHNpZGViYW5kSGFuZGxlLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKHNpZGViYW5kSGFuZGxlKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShzaWRlYmFuZEhhbmRsZSk7CisKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnNldFZpZGVvUG9ydEZvcm1hdFR5cGUoCkBAIC01Mzk1LDIxICs1NDIzLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWE5vZGUtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjRHJjUHJlc2VudGF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXNlbnRhdGlvbiwgc2l6ZW9mKHByZXNlbnRhdGlvbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1lbmNvZGVkLXRhcmdldC1sZXZlbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uLm5FbmNvZGVkVGFyZ2V0TGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLWN1dC1sZXZlbCIsIHByZXNlbnRhdGlvbi5uRHJjQ3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWRyYy1ib29zdC1sZXZlbCIsIHByZXNlbnRhdGlvbi5uRHJjQm9vc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLWhlYXZ5LWNvbXByZXNzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24ubkhlYXZ5Q29tcHJlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtdGFyZ2V0LXJlZi1sZXZlbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uLm5UYXJnZXRSZWZlcmVuY2VMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtZWZmZWN0LXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uRHJjRWZmZWN0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtYWxidW0tbW9kZSIsIHByZXNlbnRhdGlvbi5uRHJjQWxidW1Nb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWRyYy1vdXRwdXQtbG91ZG5lc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uRHJjT3V0cHV0TG91ZG5lc3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZW5jb2RlZC10YXJnZXQtbGV2ZWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uLm5FbmNvZGVkVGFyZ2V0TGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtY3V0LWxldmVsIiwgcHJlc2VudGF0aW9uLm5EcmNDdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtYm9vc3QtbGV2ZWwiLCBwcmVzZW50YXRpb24ubkRyY0Jvb3N0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLWhlYXZ5LWNvbXByZXNzaW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uSGVhdnlDb21wcmVzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLXRhcmdldC1yZWYtbGV2ZWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uLm5UYXJnZXRSZWZlcmVuY2VMZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWRyYy1lZmZlY3QtdHlwZSIsIHByZXNlbnRhdGlvbi5uRHJjRWZmZWN0VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWRyYy1hbGJ1bS1tb2RlIiwgcHJlc2VudGF0aW9uLm5EcmNBbGJ1bU1vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtb3V0cHV0LWxvdWRuZXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uRHJjT3V0cHV0TG91ZG5lc3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTQzMSw2ICs1NDU5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5uU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImJpdHJhdGUiLCBwYXJhbXMubkJpdFJhdGUpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtcHJvZmlsZSIsIHBhcmFtcy5lQUFDUHJvZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNzkyOCwxMSArNzk1NywyMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaW50MzJfdCB0dW5uZWxQZWVrID0gMDsKLSAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoVFVOTkVMX1BFRUtfS0VZLCAmdHVubmVsUGVlaykpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0VHVubmVsUGVlayh0dW5uZWxQZWVrKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICB7CisgICAgICAgIGludDMyX3QgdHVubmVsUGVlayA9IDA7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihUVU5ORUxfUEVFS19LRVksICZ0dW5uZWxQZWVrKSkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0VHVubmVsUGVlayh0dW5uZWxQZWVrKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgaW50MzJfdCB0dW5uZWxQZWVrU2V0TGVnYWN5ID0gMDsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKFRVTk5FTF9QRUVLX1NFVF9MRUdBQ1lfS0VZLCAmdHVubmVsUGVla1NldExlZ2FjeSkpIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNldFR1bm5lbFBlZWtMZWdhY3kodHVubmVsUGVla1NldExlZ2FjeSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtOTIwNSw0ICs5MjQ1LDE5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBBQ29kZWM6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1ldGVycyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gKm5hbWVzKSB7CisgICAgaWYgKCFuYW1lcykgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFDb2RlYzo6c3Vic2NyaWJlVG9QYXJhbWV0ZXJzKFtbbWF5YmVfdW51c2VkXV0gY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcykgeworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQUNvZGVjOjp1bnN1YnNjcmliZUZyb21QYXJhbWV0ZXJzKFtbbWF5YmVfdW51c2VkXV0gY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcykgeworICAgIHJldHVybiBPSzsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCmluZGV4IGEwNTJhNzAuLjEwYmFlYzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icApAQCAtMTA5LDYgKzEwOSw3IEBACiAKICAgICBzcmNzOiBbCiAgICAgICAgICJDb2RlY0Jhc2UuY3BwIiwKKyAgICAgICAgIkRhdGFDb252ZXJ0ZXIuY3BwIiwKICAgICAgICAgIkZyYW1lUmVuZGVyVHJhY2tlci5jcHAiLAogICAgICAgICAiTWVkaWFDb2RlY0xpc3RXcml0ZXIuY3BwIiwKICAgICAgICAgIlNraXBDdXRCdWZmZXIuY3BwIiwKQEAgLTEyNSw2ICsxMjYsNyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCkBAIC0yNTEsNiArMjUzLDQwIEBACiAgICAgICAgIF0sCiAgICAgfSwKIH0KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zdXJmYWNlX3V0aWxzIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlN1cmZhY2VVdGlscy5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodCIsCiAKQEAgLTI2Niw3ICszMDIsNiBAQAogICAgICAgICAiQ2FsbGJhY2tNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiQ2FtZXJhU291cmNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIiwKLSAgICAgICAgIkRhdGFDb252ZXJ0ZXIuY3BwIiwKICAgICAgICAgIkZyYW1lRGVjb2Rlci5jcHAiLAogICAgICAgICAiSGV2Y1V0aWxzLmNwcCIsCiAgICAgICAgICJJbnRlcmZhY2VVdGlscy5jcHAiLApAQCAtMzQwLDYgKzM3NSw3IEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAppbmRleCBiNmFjZGM4Li5iZmU4NTM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCkBAIC0zNiwyMSArMzYsOSBAQAogCiB1c2luZyBjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCi1zdGF0aWMgdm9pZCBBdWRpb1JlY29yZENhbGxiYWNrRnVuY3Rpb24oaW50IGV2ZW50LCB2b2lkICp1c2VyLCB2b2lkICppbmZvKSB7Ci0gICAgQXVkaW9Tb3VyY2UgKnNvdXJjZSA9IChBdWRpb1NvdXJjZSAqKSB1c2VyOwotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBBdWRpb1JlY29yZDo6RVZFTlRfTU9SRV9EQVRBOiB7Ci0gICAgICAgICAgICBzb3VyY2UtPmRhdGFDYWxsYmFjaygqKChBdWRpb1JlY29yZDo6QnVmZmVyICopIGluZm8pKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQXVkaW9SZWNvcmQ6OkVWRU5UX09WRVJSVU46IHsKLSAgICAgICAgICAgIEFMT0dXKCJBdWRpb1JlY29yZCByZXBvcnRlZCBvdmVycnVuISIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGRvZXMgbm90aGluZwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQorCit2b2lkIEF1ZGlvU291cmNlOjpvbk92ZXJydW4oKSB7CisgICAgQUxPR1coIkF1ZGlvUmVjb3JkIHJlcG9ydGVkIG92ZXJydW4hIik7CiB9CiAKIEF1ZGlvU291cmNlOjpBdWRpb1NvdXJjZSgKQEAgLTEyOSw4ICsxMTcsNyBAQAogICAgICAgICBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpLAogICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgKHNpemVfdCkgKGJ1ZkNvdW50ICogZnJhbWVDb3VudCksCi0gICAgICAgIEF1ZGlvUmVjb3JkQ2FsbGJhY2tGdW5jdGlvbiwKLSAgICAgICAgdGhpcywKKyAgICAgICAgd3A8QXVkaW9SZWNvcmQ6OklBdWRpb1JlY29yZENhbGxiYWNrPnt0aGlzfSwKICAgICAgICAgZnJhbWVDb3VudCAvKm5vdGlmaWNhdGlvbkZyYW1lcyovLAogICAgICAgICBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICBBdWRpb1JlY29yZDo6VFJBTlNGRVJfREVGQVVMVCwKQEAgLTM1OSw3ICszNDYsNyBAQAogICAgIHJldHVybjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OmRhdGFDYWxsYmFjayhjb25zdCBBdWRpb1JlY29yZDo6QnVmZmVyJiBhdWRpb0J1ZmZlcikgeworc2l6ZV90IEF1ZGlvU291cmNlOjpvbk1vcmVEYXRhKGNvbnN0IEF1ZGlvUmVjb3JkOjpCdWZmZXImIGF1ZGlvQnVmZmVyKSB7CiAgICAgaW50NjRfdCB0aW1lVXMsIHBvc2l0aW9uLCB0aW1lTnM7CiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdHM7CiAgICAgRXh0ZW5kZWRUaW1lc3RhbXA6OkxvY2F0aW9uIGxvY2F0aW9uOwpAQCAtMzg0LDIxICszNzEsMjEgQEAKIAogICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6ICUiIFBSSWQ2NCAiIHVzIiwgdGltZVVzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCiAgICAgaWYgKCFtU3RhcnRlZCkgewogICAgICAgICBBTE9HVygiU3B1cmlvdXMgY2FsbGJhY2sgZnJvbSBBdWRpb1JlY29yZC4gRHJvcCB0aGUgYXVkaW8gZGF0YS4iKTsKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gYXVkaW9CdWZmZXIuc2l6ZSgpOwogICAgIH0KIAotICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKIAogICAgIC8vIERyb3AgcmV0cmlldmVkIGFuZCBwcmV2aW91c2x5IGxvc3QgYXVkaW8gZGF0YS4KICAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID09IDAgJiYgdGltZVVzIDwgbVN0YXJ0VGltZVVzKSB7CiAgICAgICAgICh2b2lkKSBtUmVjb3JkLT5nZXRJbnB1dEZyYW1lc0xvc3QoKTsKLSAgICAgICAgaW50NjRfdCByZWNlaWV2ZWRGcmFtZXMgPSBidWZmZXJTaXplIC8gbVJlY29yZC0+ZnJhbWVTaXplKCk7CisgICAgICAgIGludDY0X3QgcmVjZWlldmVkRnJhbWVzID0gYXVkaW9CdWZmZXIuc2l6ZSgpIC8gbVJlY29yZC0+ZnJhbWVTaXplKCk7CiAgICAgICAgIEFMT0dWKCJEcm9wIGF1ZGlvIGRhdGEoJSIgUFJJZDY0ICIgZnJhbWVzKSBhdCAlIiBQUklkNjQgIi8lIiBQUklkNjQgIiB1cyIsCiAgICAgICAgICAgICAgICAgcmVjZWlldmVkRnJhbWVzLCB0aW1lVXMsIG1TdGFydFRpbWVVcyk7CiAgICAgICAgIG1OdW1GcmFtZXNTa2lwcGVkICs9IHJlY2VpZXZlZEZyYW1lczsKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gYXVkaW9CdWZmZXIuc2l6ZSgpOwogICAgIH0KIAogICAgIGlmIChtU3RvcFN5c3RlbVRpbWVVcyAhPSAtMSAmJiB0aW1lVXMgPj0gbVN0b3BTeXN0ZW1UaW1lVXMpIHsKQEAgLTQwNiw3ICszOTMsNyBAQAogICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCAobG9uZyBsb25nKW1TdG9wU3lzdGVtVGltZVVzKTsKICAgICAgICAgbU5vTW9yZUZyYW1lc1RvUmVhZCA9IHRydWU7CiAgICAgICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gYXVkaW9CdWZmZXIuc2l6ZSgpOwogICAgIH0KIAogICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPT0gMCAmJiBtUHJldlNhbXBsZVRpbWVVcyA9PSAwKSB7CkBAIC00MjcsNyArNDE0LDcgQEAKICAgICB9CiAKICAgICBDSEVDS19FUShudW1Mb3N0Qnl0ZXMgJiAxLCAwdSk7Ci0gICAgQ0hFQ0tfRVEoYXVkaW9CdWZmZXIuc2l6ZSAmIDEsIDB1KTsKKyAgICBDSEVDS19FUShhdWRpb0J1ZmZlci5zaXplKCkgJiAxLCAwdSk7CiAgICAgaWYgKG51bUxvc3RCeXRlcyA+IDApIHsKICAgICAgICAgLy8gTG9zcyBvZiBhdWRpbyBmcmFtZXMgc2hvdWxkIGhhcHBlbiByYXJlbHk7IHRodXMgdGhlIExPR1cgc2hvdWxkCiAgICAgICAgIC8vIG5vdCBjYXVzZSBhIGxvZ2dpbmcgc3BhbQpAQCAtNDQ5LDE3ICs0MzYsMTcgQEAKICAgICAgICAgcXVldWVJbnB1dEJ1ZmZlcl9sKGxvc3RBdWRpb0J1ZmZlciwgdGltZVVzKTsKICAgICB9CiAKLSAgICBpZiAoYXVkaW9CdWZmZXIuc2l6ZSA9PSAwKSB7CisgICAgaWYgKGF1ZGlvQnVmZmVyLnNpemUoKSA9PSAwKSB7CiAgICAgICAgIEFMT0dXKCJOb3RoaW5nIGlzIGF2YWlsYWJsZSBmcm9tIEF1ZGlvUmVjb3JkIGNhbGxiYWNrIGJ1ZmZlciIpOwotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHJldHVybiBhdWRpb0J1ZmZlci5zaXplKCk7CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihidWZmZXJTaXplKTsKKyAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGF1ZGlvQnVmZmVyLnNpemUoKSk7CiAgICAgbWVtY3B5KCh1aW50OF90ICopIGJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgYXVkaW9CdWZmZXIuaTE2LCBhdWRpb0J1ZmZlci5zaXplKTsKLSAgICBidWZmZXItPnNldF9yYW5nZSgwLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIGF1ZGlvQnVmZmVyLmRhdGEoKSwgYXVkaW9CdWZmZXIuc2l6ZSgpKTsKKyAgICBidWZmZXItPnNldF9yYW5nZSgwLCBhdWRpb0J1ZmZlci5zaXplKCkpOwogICAgIHF1ZXVlSW5wdXRCdWZmZXJfbChidWZmZXIsIHRpbWVVcyk7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBhdWRpb0J1ZmZlci5zaXplKCk7CiB9CiAKIHZvaWQgQXVkaW9Tb3VyY2U6OnF1ZXVlSW5wdXRCdWZmZXJfbChNZWRpYUJ1ZmZlciAqYnVmZmVyLCBpbnQ2NF90IHRpbWVVcykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKaW5kZXggOTVhZmE2Mi4uOTYwNzQyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCkBAIC01NjQsOSArNTY0LDExIEBACiAgICAgLy8gU2V0IHRoZSBwcmV2aWV3IGRpc3BsYXkuIFNraXAgdGhpcyBpZiBtU3VyZmFjZSBpcyBudWxsIGJlY2F1c2UKICAgICAvLyBhcHBsaWNhdGlvbnMgbWF5IGFscmVhZHkgc2V0IGEgc3VyZmFjZSB0byB0aGUgY2FtZXJhLgogICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIFRoaXMgQ0hFQ0sgaXMgZ29vZCwgc2luY2Ugd2UganVzdCBwYXNzZWQgdGhlIGxvY2svdW5sb2NrCi0gICAgICAgIC8vIGNoZWNrIGVhcmxpZXIgYnkgY2FsbGluZyBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKCkuCi0gICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNhbWVyYS0+c2V0UHJldmlld1RhcmdldChtU3VyZmFjZSkpOworICAgICAgICAvLyBTdXJmYWNlIG1heSBiZSBzZXQgaW5jb3JyZWN0bHkgb3IgY291bGQgYWxyZWFkeSBiZSB1c2VkIGV2ZW4gaWYgd2UganVzdAorICAgICAgICAvLyBwYXNzZWQgdGhlIGxvY2svdW5sb2NrIGNoZWNrIGVhcmxpZXIgYnkgY2FsbGluZyBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKCkuCisgICAgICAgIGlmICgoZXJyID0gbUNhbWVyYS0+c2V0UHJldmlld1RhcmdldChtU3VyZmFjZSkpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gVXNlIGJ1ZmZlciBxdWV1ZSB0byByZWNlaXZlIHZpZGVvIGJ1ZmZlcnMgZnJvbSBjYW1lcmEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCmluZGV4IGVmZDQwNzAuLjNkZjg3NjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lQ2FwdHVyZVByb2Nlc3Nvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC00OSw3ICs1MCw3IEBACiAKIHNwPElNZW1vcnk+IGFsbG9jVmlkZW9GcmFtZShjb25zdCBzcDxNZXRhRGF0YT4mIHRyYWNrTWV0YSwKICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgdGlsZVdpZHRoLCBpbnQzMl90IHRpbGVIZWlnaHQsCi0gICAgICAgIGludDMyX3QgZHN0QnBwLCBib29sIGFsbG9jUm90YXRlZCwgYm9vbCBtZXRhT25seSkgeworICAgICAgICBpbnQzMl90IGRzdEJwcCwgdWludDMyX3QgYml0RGVwdGgsIGJvb2wgYWxsb2NSb3RhdGVkLCBib29sIG1ldGFPbmx5KSB7CiAgICAgaW50MzJfdCByb3RhdGlvbkFuZ2xlOwogICAgIGlmICghdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25BbmdsZSkpIHsKICAgICAgICAgcm90YXRpb25BbmdsZSA9IDA7ICAvLyBCeSBkZWZhdWx0LCBubyByb3RhdGlvbgpAQCAtMTA0LDcgKzEwNSw3IEBACiAgICAgfQogCiAgICAgVmlkZW9GcmFtZSBmcmFtZSh3aWR0aCwgaGVpZ2h0LCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQsCi0gICAgICAgICAgICB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIHJvdGF0aW9uQW5nbGUsIGRzdEJwcCwgIW1ldGFPbmx5LCBpY2NTaXplKTsKKyAgICAgICAgICAgIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgcm90YXRpb25BbmdsZSwgZHN0QnBwLCBiaXREZXB0aCwgIW1ldGFPbmx5LCBpY2NTaXplKTsKIAogICAgIHNpemVfdCBzaXplID0gZnJhbWUuZ2V0RmxhdHRlbmVkU2l6ZSgpOwogICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBoZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNpemUsIDAsICJNZXRhZGF0YVJldHJpZXZlckNsaWVudCIpOwpAQCAtMTI1LDE1ICsxMjYsMTUgQEAKIAogc3A8SU1lbW9yeT4gYWxsb2NWaWRlb0ZyYW1lKGNvbnN0IHNwPE1ldGFEYXRhPiYgdHJhY2tNZXRhLAogICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCB0aWxlV2lkdGgsIGludDMyX3QgdGlsZUhlaWdodCwKLSAgICAgICAgaW50MzJfdCBkc3RCcHAsIGJvb2wgYWxsb2NSb3RhdGVkID0gZmFsc2UpIHsKLSAgICByZXR1cm4gYWxsb2NWaWRlb0ZyYW1lKHRyYWNrTWV0YSwgd2lkdGgsIGhlaWdodCwgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBkc3RCcHAsCisgICAgICAgIGludDMyX3QgZHN0QnBwLCB1aW50OF90IGJpdERlcHRoLCBib29sIGFsbG9jUm90YXRlZCA9IGZhbHNlKSB7CisgICAgcmV0dXJuIGFsbG9jVmlkZW9GcmFtZSh0cmFja01ldGEsIHdpZHRoLCBoZWlnaHQsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgZHN0QnBwLCBiaXREZXB0aCwKICAgICAgICAgICAgIGFsbG9jUm90YXRlZCwgZmFsc2UgLyptZXRhT25seSovKTsKIH0KIAogc3A8SU1lbW9yeT4gYWxsb2NNZXRhRnJhbWUoY29uc3Qgc3A8TWV0YURhdGE+JiB0cmFja01ldGEsCiAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IHRpbGVXaWR0aCwgaW50MzJfdCB0aWxlSGVpZ2h0LAotICAgICAgICBpbnQzMl90IGRzdEJwcCkgewotICAgIHJldHVybiBhbGxvY1ZpZGVvRnJhbWUodHJhY2tNZXRhLCB3aWR0aCwgaGVpZ2h0LCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIGRzdEJwcCwKKyAgICAgICAgaW50MzJfdCBkc3RCcHAsIHVpbnQ4X3QgYml0RGVwdGgpIHsKKyAgICByZXR1cm4gYWxsb2NWaWRlb0ZyYW1lKHRyYWNrTWV0YSwgd2lkdGgsIGhlaWdodCwgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBkc3RCcHAsIGJpdERlcHRoLAogICAgICAgICAgICAgZmFsc2UgLyphbGxvY1JvdGF0ZWQqLywgdHJ1ZSAvKm1ldGFPbmx5Ki8pOwogfQogCkBAIC0xOTIsNiArMTkzLDEzIEBACiAgICAgICAgICAgICAqZHN0QnBwID0gNDsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI6CisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3RGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpQ09MT1JfRm9ybWF0MzJiaXRBQkdSMjEwMTAxMDsKKyAgICAgICAgICAgICpjYXB0dXJlRm9ybWF0ID0gdWk6OlBpeGVsRm9ybWF0OjpSR0JBXzEwMTAxMDI7CisgICAgICAgICAgICAqZHN0QnBwID0gNDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjb2xvciBmb3JtYXQ6ICVkIiwgY29sb3JGb3JtYXQpOwpAQCAtMjAzLDcgKzIxMSw3IEBACiAKIC8vc3RhdGljCiBzcDxJTWVtb3J5PiBGcmFtZURlY29kZXI6OmdldE1ldGFkYXRhT25seSgKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsIGludCBjb2xvckZvcm1hdCwgYm9vbCB0aHVtYm5haWwpIHsKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsIGludCBjb2xvckZvcm1hdCwgYm9vbCB0aHVtYm5haWwsIHVpbnQzMl90IGJpdERlcHRoKSB7CiAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZHN0Rm9ybWF0OwogICAgIHVpOjpQaXhlbEZvcm1hdCBjYXB0dXJlRm9ybWF0OwogICAgIGludDMyX3QgZHN0QnBwOwpAQCAtMjI3LDcgKzIzNSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzcDxJTWVtb3J5PiBtZXRhTWVtID0gYWxsb2NNZXRhRnJhbWUodHJhY2tNZXRhLCB3aWR0aCwgaGVpZ2h0LCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIGRzdEJwcCk7CisgICAgc3A8SU1lbW9yeT4gbWV0YU1lbSA9CisgICAgICAgICAgICBhbGxvY01ldGFGcmFtZSh0cmFja01ldGEsIHdpZHRoLCBoZWlnaHQsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgZHN0QnBwLCBiaXREZXB0aCk7CiAKICAgICAvLyB0cnkgdG8gZmlsbCBzZXF1ZW5jZSBtZXRhJ3MgZHVyYXRpb24gYmFzZWQgb24gYXZlcmFnZSBmcmFtZSByYXRlLAogICAgIC8vIGRlZmF1bHQgdG8gMzNtcyBpZiBmcmFtZSByYXRlIGlzIHVuYXZhaWxhYmxlLgpAQCAtMjYyLDEzICsyNzEsMTAgQEAKIH0KIAogYm9vbCBpc0hEUihjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewotICAgIHVpbnQzMl90IHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXI7CisgICAgdWludDMyX3Qgc3RhbmRhcmQsIHRyYW5zZmVyOwogICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXN0YW5kYXJkIiwgKGludDMyX3QqKSZzdGFuZGFyZCkpIHsKICAgICAgICAgc3RhbmRhcmQgPSAwOwogICAgIH0KLSAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1yYW5nZSIsIChpbnQzMl90KikmcmFuZ2UpKSB7Ci0gICAgICAgIHJhbmdlID0gMDsKLSAgICB9CiAgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItdHJhbnNmZXIiLCAoaW50MzJfdCopJnRyYW5zZmVyKSkgewogICAgICAgICB0cmFuc2ZlciA9IDA7CiAgICAgfQpAQCAtNTI2LDggKzUzMiwxMSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICAvLyBUT0RPOiBVc2UgRmxleGlibGUgY29sb3IgaW5zdGVhZAotICAgIHZpZGVvRm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7CisgICAgaWYgKGRzdEZvcm1hdCgpID09IENPTE9SX0Zvcm1hdDMyYml0QUJHUjIxMDEwMTApIHsKKyAgICAgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBDT0xPUl9Gb3JtYXRZVVZQMDEwKTsKKyAgICB9IGVsc2UgeworICAgICAgICB2aWRlb0Zvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworICAgIH0KIAogICAgIC8vIEZvciB0aGUgdGh1bWJuYWlsIGV4dHJhY3Rpb24gY2FzZSwgdHJ5IHRvIGFsbG9jYXRlIHNpbmdsZSBidWZmZXIgaW4gYm90aAogICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgcG9ydHMsIGlmIHNlZWtpbmcgdG8gYSBzeW5jIGZyYW1lLiBOT1RFOiBUaGlzIHJlcXVlc3QgbWF5CkBAIC02MzUsNiArNjQ0LDE2IEBACiAgICAgICAgIGNyb3BfYm90dG9tID0gaGVpZ2h0IC0gMTsKICAgICB9CiAKKyAgICBpbnQzMl90IHNsaWNlX2hlaWdodDsKKyAgICBpZiAob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoInNsaWNlLWhlaWdodCIsICZzbGljZV9oZWlnaHQpICYmIHNsaWNlX2hlaWdodCA+IDApIHsKKyAgICAgICAgaGVpZ2h0ID0gc2xpY2VfaGVpZ2h0OworICAgIH0KKworICAgIHVpbnQzMl90IGJpdERlcHRoID0gODsKKyAgICBpZiAoQ09MT1JfRm9ybWF0WVVWUDAxMCA9PSBzcmNGb3JtYXQpIHsKKyAgICAgICAgYml0RGVwdGggPSAxMDsKKyAgICB9CisKICAgICBpZiAobUZyYW1lID09IE5VTEwpIHsKICAgICAgICAgc3A8SU1lbW9yeT4gZnJhbWVNZW0gPSBhbGxvY1ZpZGVvRnJhbWUoCiAgICAgICAgICAgICAgICAgdHJhY2tNZXRhKCksCkBAIC02NDMsNiArNjYyLDcgQEAKICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgZHN0QnBwKCksCisgICAgICAgICAgICAgICAgYml0RGVwdGgsCiAgICAgICAgICAgICAgICAgbUNhcHR1cmVMYXllciAhPSBudWxscHRyIC8qYWxsb2NSb3RhdGVkKi8pOwogICAgICAgICBpZiAoZnJhbWVNZW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKQEAgLTc5Niw4ICs4MTYsMTYgQEAKICAgICBpZiAob3ZlcnJpZGVNZXRhID09IE5VTEwpIHsKICAgICAgICAgLy8gY2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgdGlsZWQgaGVpZgogICAgICAgICBpbnQzMl90IHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgZ3JpZFJvd3MsIGdyaWRDb2xzOworICAgICAgICBpbnQzMl90IHdpZHRoQ29sc1Byb2R1Y3QgPSAwOworICAgICAgICBpbnQzMl90IGhlaWdodFJvd3NQcm9kdWN0ID0gMDsKICAgICAgICAgaWYgKGZpbmRHcmlkSW5mbyh0cmFja01ldGEoKSwgJnRpbGVXaWR0aCwgJnRpbGVIZWlnaHQsICZncmlkUm93cywgJmdyaWRDb2xzKSkgewotICAgICAgICAgICAgaWYgKG1XaWR0aCA8PSB0aWxlV2lkdGggKiBncmlkQ29scyAmJiBtSGVpZ2h0IDw9IHRpbGVIZWlnaHQgKiBncmlkUm93cykgeworICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3codGlsZVdpZHRoLCBncmlkQ29scywgJndpZHRoQ29sc1Byb2R1Y3QpIHx8CisgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3codGlsZUhlaWdodCwgZ3JpZFJvd3MsICZoZWlnaHRSb3dzUHJvZHVjdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTXVsdGlwbGljYXRpb24gb3ZlcmZsb3dlZCBHcmlkIHNpemU6ICVkeCVkLCBQaWN0dXJlIHNpemU6ICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRDb2xzLCBncmlkUm93cywgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtV2lkdGggPD0gd2lkdGhDb2xzUHJvZHVjdCAmJiBtSGVpZ2h0IDw9IGhlaWdodFJvd3NQcm9kdWN0KSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoImdyaWQ6ICVkeCVkLCB0aWxlIHNpemU6ICVkeCVkLCBwaWN0dXJlIHNpemU6ICVkeCVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRDb2xzLCBncmlkUm93cywgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBtV2lkdGgsIG1IZWlnaHQpOwogCkBAIC04MjYsOCArODU0LDExIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIC8vIFRPRE86IFVzZSBGbGV4aWJsZSBjb2xvciBpbnN0ZWFkCi0gICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICBpZiAoZHN0Rm9ybWF0KCkgPT0gQ09MT1JfRm9ybWF0MzJiaXRBQkdSMjEwMTAxMCkgeworICAgICAgICB2aWRlb0Zvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIENPTE9SX0Zvcm1hdFlVVlAwMTApOworICAgIH0gZWxzZSB7CisgICAgICAgIHZpZGVvRm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7CisgICAgfQogCiAgICAgaWYgKChtR3JpZFJvd3MgPT0gMSkgJiYgKG1HcmlkQ29scyA9PSAxKSkgewogICAgICAgICB2aWRlb0Zvcm1hdC0+c2V0SW50MzIoImFuZHJvaWQuX251bS1pbnB1dC1idWZmZXJzIiwgMSk7CkBAIC04ODIsMTQgKzkxMywzMiBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlOwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7Ci0gICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGUpKTsKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgc3JjRm9ybWF0OworICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpID09IGZhbHNlKSB7CisgICAgICAgIEFMT0dFKCJNZWRpYUltYWdlRGVjb2Rlcjo6b25PdXRwdXRSZWNlaXZlZDp3aWR0aCBpcyBtaXNzaW5nIGluIG91dHB1dEZvcm1hdCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBpZiAob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpID09IGZhbHNlKSB7CisgICAgICAgIEFMT0dFKCJNZWRpYUltYWdlRGVjb2Rlcjo6b25PdXRwdXRSZWNlaXZlZDpoZWlnaHQgaXMgbWlzc2luZyBpbiBvdXRwdXRGb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaWYgKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJzdHJpZGUiLCAmc3RyaWRlKSA9PSBmYWxzZSkgeworICAgICAgICBBTE9HRSgiTWVkaWFJbWFnZURlY29kZXI6Om9uT3V0cHV0UmVjZWl2ZWQ6c3RyaWRlIGlzIG1pc3NpbmcgaW4gb3V0cHV0Rm9ybWF0Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnNyY0Zvcm1hdCkgPT0gZmFsc2UpIHsKKyAgICAgICAgQUxPR0UoIk1lZGlhSW1hZ2VEZWNvZGVyOjpvbk91dHB1dFJlY2VpdmVkOiBjb2xvciBmb3JtYXQgaXMgbWlzc2luZyBpbiBvdXRwdXRGb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBiaXREZXB0aCA9IDg7CisgICAgaWYgKENPTE9SX0Zvcm1hdFlVVlAwMTAgPT0gc3JjRm9ybWF0KSB7CisgICAgICAgIGJpdERlcHRoID0gMTA7CisgICAgfQogCiAgICAgaWYgKG1GcmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIHNwPElNZW1vcnk+IGZyYW1lTWVtID0gYWxsb2NWaWRlb0ZyYW1lKAotICAgICAgICAgICAgICAgIHRyYWNrTWV0YSgpLCBtV2lkdGgsIG1IZWlnaHQsIG1UaWxlV2lkdGgsIG1UaWxlSGVpZ2h0LCBkc3RCcHAoKSk7CisgICAgICAgICAgICAgICAgdHJhY2tNZXRhKCksIG1XaWR0aCwgbUhlaWdodCwgbVRpbGVXaWR0aCwgbVRpbGVIZWlnaHQsIGRzdEJwcCgpLCBiaXREZXB0aCk7CiAKICAgICAgICAgaWYgKGZyYW1lTWVtID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CkBAIC05MDAsOSArOTQ5LDYgQEAKICAgICAgICAgc2V0RnJhbWUoZnJhbWVNZW0pOwogICAgIH0KIAotICAgIGludDMyX3Qgc3JjRm9ybWF0OwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmc3JjRm9ybWF0KSk7Ci0KICAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgZHN0Rm9ybWF0KCkpOwogCiAgICAgdWludDMyX3Qgc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2ZlcjsKQEAgLTkyNCw2ICs5NzAsMTEgQEAKICAgICAgICAgY3JvcF9ib3R0b20gPSBoZWlnaHQgLSAxOwogICAgIH0KIAorICAgIGludDMyX3Qgc2xpY2VfaGVpZ2h0OworICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigic2xpY2UtaGVpZ2h0IiwgJnNsaWNlX2hlaWdodCkgJiYgc2xpY2VfaGVpZ2h0ID4gMCkgeworICAgICAgICBoZWlnaHQgPSBzbGljZV9oZWlnaHQ7CisgICAgfQorCiAgICAgaW50MzJfdCBjcm9wX3dpZHRoLCBjcm9wX2hlaWdodDsKICAgICBjcm9wX3dpZHRoID0gY3JvcF9yaWdodCAtIGNyb3BfbGVmdCArIDE7CiAgICAgY3JvcF9oZWlnaHQgPSBjcm9wX2JvdHRvbSAtIGNyb3BfdG9wICsgMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAppbmRleCA3YzdmY2FjLi42M2QzMTgwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CkBAIC00NCw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgpAQCAtMTU2LDcgKzE1OCw3IEBACiAgICAgYm9vbCBpc0hlaWMoKSBjb25zdCB7IHJldHVybiBtSXNIZWljOyB9CiAgICAgYm9vbCBpc0F1ZGlvKCkgY29uc3QgeyByZXR1cm4gbUlzQXVkaW87IH0KICAgICBib29sIGlzTVBFRzQoKSBjb25zdCB7IHJldHVybiBtSXNNUEVHNDsgfQotICAgIGJvb2wgdXNlUHJlZml4KCkgY29uc3QgeyByZXR1cm4gbUlzQXZjIHx8IG1Jc0hldmMgfHwgbUlzSGVpYzsgfQorICAgIGJvb2wgdXNlUHJlZml4KCkgY29uc3QgeyByZXR1cm4gbUlzQXZjIHx8IG1Jc0hldmMgfHwgbUlzSGVpYyB8fCBtSXNEb3ZpOyB9CiAgICAgYm9vbCBpc0V4aWZEYXRhKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50MzJfdCAqdGlmZkhkck9mZnNldCkgY29uc3Q7CiAgICAgdm9pZCBhZGRDaHVua09mZnNldChvZmY2NF90IG9mZnNldCk7CiAgICAgdm9pZCBhZGRJdGVtT2Zmc2V0QW5kU2l6ZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIGJvb2wgaXNFeGlmKTsKQEAgLTE2NCw2ICsxNjYsNyBAQAogICAgIFRyYWNrSWQmIGdldFRyYWNrSWQoKSB7IHJldHVybiBtVHJhY2tJZDsgfQogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKICAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0Rm91ckNDRm9yTWltZShjb25zdCBjaGFyICptaW1lKTsKKyAgICBjb25zdCBjaGFyICpnZXREb3ZpRm91ckNDKCkgY29uc3Q7CiAgICAgY29uc3QgY2hhciAqZ2V0VHJhY2tUeXBlKCkgY29uc3Q7CiAgICAgdm9pZCByZXNldEludGVybmFsKCk7CiAgICAgaW50NjRfdCB0cmFja01ldGFEYXRhU2l6ZSgpOwpAQCAtMzE2LDYgKzMxOSw3IEBACiAgICAgdm9sYXRpbGUgYm9vbCBtU3RhcnRlZDsKICAgICBib29sIG1Jc0F2YzsKICAgICBib29sIG1Jc0hldmM7CisgICAgYm9vbCBtSXNEb3ZpOwogICAgIGJvb2wgbUlzQXVkaW87CiAgICAgYm9vbCBtSXNWaWRlbzsKICAgICBib29sIG1Jc0hlaWM7CkBAIC0zNzAsNiArMzc0LDggQEAKICAgICB1aW50OF90IG1Qcm9maWxlQ29tcGF0aWJsZTsKICAgICB1aW50OF90IG1MZXZlbElkYzsKIAorICAgIGludDMyX3QgbURvdmlQcm9maWxlOworCiAgICAgdm9pZCAqbUNvZGVjU3BlY2lmaWNEYXRhOwogICAgIHNpemVfdCBtQ29kZWNTcGVjaWZpY0RhdGFTaXplOwogICAgIGJvb2wgbUdvdEFsbENvZGVjU3BlY2lmaWNEYXRhOwpAQCAtNDIyLDYgKzQyOCw4IEBACiAgICAgc3RhdHVzX3QgcGFyc2VIRVZDQ29kZWNTcGVjaWZpY0RhdGEoCiAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgSGV2Y1BhcmFtZXRlclNldHMgJnBhcmFtU2V0cyk7CiAKKyAgICBzdGF0dXNfdCBnZXREb2xieVZpc2lvblByb2ZpbGUoKTsKKwogICAgIC8vIFRyYWNrIGF1dGhvcmluZyBwcm9ncmVzcyBzdGF0dXMKICAgICB2b2lkIHRyYWNrUHJvZ3Jlc3NTdGF0dXMoaW50NjRfdCB0aW1lVXMsIHN0YXR1c190IGVyciA9IE9LKTsKICAgICB2b2lkIGluaXRUcmFja2luZ1Byb2dyZXNzU3RhdHVzKE1ldGFEYXRhICpwYXJhbXMpOwpAQCAtNDU5LDYgKzQ2Nyw3IEBACiAgICAgdm9pZCB3cml0ZVBhc3BCb3goKTsKICAgICB2b2lkIHdyaXRlQXZjY0JveCgpOwogICAgIHZvaWQgd3JpdGVIdmNjQm94KCk7CisgICAgdm9pZCB3cml0ZURvdmlDb25maWdCb3goKTsKICAgICB2b2lkIHdyaXRlVXJsQm94KCk7CiAgICAgdm9pZCB3cml0ZURyZWZCb3goKTsKICAgICB2b2lkIHdyaXRlRGluZkJveCgpOwpAQCAtNDcwLDYgKzQ3OSw3IEBACiAgICAgdm9pZCB3cml0ZUhkbHJCb3goKTsKICAgICB2b2lkIHdyaXRlVGtoZEJveCh1aW50MzJfdCBub3cpOwogICAgIHZvaWQgd3JpdGVDb2xyQm94KCk7CisgICAgdm9pZCB3cml0ZU1kY3ZBbmRDbGxpQm94ZXMoKTsKICAgICB2b2lkIHdyaXRlTXA0YUVzZHNCb3goKTsKICAgICB2b2lkIHdyaXRlTXA0dkVzZHNCb3goKTsKICAgICB2b2lkIHdyaXRlQXVkaW9Gb3VyQ0NCb3goKTsKQEAgLTYxNyw2ICs2MjcsMTcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK2NvbnN0IGNoYXIgKk1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0RG92aUZvdXJDQygpIGNvbnN0IHsKKyAgICBpZiAobURvdmlQcm9maWxlID09IERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdG4pIHsKKyAgICAgICAgcmV0dXJuICJkdmgxIjsKKyAgICB9IGVsc2UgaWYgKG1Eb3ZpUHJvZmlsZSA9PSBEb2xieVZpc2lvblByb2ZpbGVEdmhlU3QpIHsKKyAgICAgICAgcmV0dXJuICJodmMxIjsKKyAgICB9IGVsc2UgaWYgKG1Eb3ZpUHJvZmlsZSA9PSBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2UpIHsKKyAgICAgICAgcmV0dXJuICJhdmMxIjsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKIC8vIHN0YXRpYwogY29uc3QgY2hhciAqTVBFRzRXcml0ZXI6OlRyYWNrOjpnZXRGb3VyQ0NGb3JNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKICAgICBpZiAobWltZSA9PSBOVUxMKSB7CkBAIC02NzEsNyArNjkyLDE0IEBACiAgICAgICAgIG1Jc0JhY2tncm91bmRNb2RlIHw9IGlzQmFja2dyb3VuZE1vZGU7CiAgICAgfQogCi0gICAgaWYgKFRyYWNrOjpnZXRGb3VyQ0NGb3JNaW1lKG1pbWUpID09IE5VTEwpIHsKKyAgICBpZiAoIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04pKSB7CisgICAgICAgIC8vIEZvciBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sCisgICAgICAgIC8vIGdldEZvdXJDQ0Zvck1pbWUoKSByZXF1aXJlcyBwcm9maWxlIGluZm9ybWF0aW9uCisgICAgICAgIC8vIHRvIGRlY2lkZSB0aGUgZmluYWwgRm91ckNDIGNvZGVzLgorICAgICAgICAvLyBTbyB3ZSBsZXQgdGhlIGNyZWF0aW9uIG9mIHRoZSBuZXcgdHJhY2sgbm93IGFuZAorICAgICAgICAvLyBhc3NpZ24gRm91ckNDIGNvZGVzIGxhdGVyIHVzaW5nIGdldERvdmlGb3VyQ0MoKQorICAgICAgICBBTE9HVigiQWRkIHNvdXJjZSBtaW1lICclcyciLCBtaW1lKTsKKyAgICB9IGVsc2UgaWYgKFRyYWNrOjpnZXRGb3VyQ0NGb3JNaW1lKG1pbWUpID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG1pbWUgJyVzJyIsIG1pbWUpOwogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQpAQCAtMjE1MCw2ICsyMTc4LDcgQEAKICAgICAgIG1NaW5DdHRzT2Zmc2V0VGltZVVzKDApLAogICAgICAgbU1pbkN0dHNPZmZzZXRUaWNrcygwKSwKICAgICAgIG1NYXhDdHRzT2Zmc2V0VGlja3MoMCksCisgICAgICBtRG92aVByb2ZpbGUoMCksCiAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGEoTlVMTCksCiAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKDApLAogICAgICAgbUdvdEFsbENvZGVjU3BlY2lmaWNEYXRhKGZhbHNlKSwKQEAgLTIxNzYsNiArMjIwNSw3IEBACiAgICAgbU1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOwogICAgIG1Jc0F2YyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CiAgICAgbUlzSGV2YyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgIG1Jc0RvdmkgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04pOwogICAgIG1Jc0F1ZGlvID0gIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KTsKICAgICBtSXNWaWRlbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNik7CiAgICAgbUlzSGVpYyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CkBAIC0yNjEwLDcgKzI2NDAsMTIgQEAKICAgICAgICAgICAgICAgICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykpIHsKICAgICAgICAgbU1ldGEtPmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTikpIHsKLSAgICAgICAgbU1ldGEtPmZpbmREYXRhKGtLZXlEVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKTsKKyAgICAgICAgZ2V0RG9sYnlWaXNpb25Qcm9maWxlKCk7CisgICAgICAgIGlmICghbU1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSAmJgorICAgICAgICAgICAgICAgICFtTWV0YS0+ZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkOiBObyBIVkNDL0FWQ0MgZm9yIERvbGJ5IFZpc2lvbiAuLlxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSB8fAogICAgICAgICAgICAgICAgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewogICAgICAgICBpZiAobU1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewpAQCAtMjY1MSw2ICsyNjg2LDcgQEAKICAgICAgICAgZnJlZShtQ29kZWNTcGVjaWZpY0RhdGEpOwogICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGEgPSBOVUxMOwogICAgIH0KKwogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6aW5pdFRyYWNraW5nUHJvZ3Jlc3NTdGF0dXMoTWV0YURhdGEgKnBhcmFtcykgewpAQCAtMzMyOSw2ICszMzY1LDQwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OmdldERvbGJ5VmlzaW9uUHJvZmlsZSgpIHsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBOVUxMOworICAgIHNpemVfdCBzaXplID0gMDsKKworICAgIGlmICghbU1ldGEtPmZpbmREYXRhKGtLZXlEVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSAmJgorICAgICAgICAhbU1ldGEtPmZpbmREYXRhKGtLZXlEVlZDLCAmdHlwZSwgJmRhdGEsICZzaXplKSAmJgorICAgICAgICAhbU1ldGEtPmZpbmREYXRhKGtLZXlEVldDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCBnZXR0aW5nIERvdmkgY29uZmlnIGZvciBEb2xieSBWaXNpb24gJWQiLCAoaW50KXNpemUpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgc3RhdGljIGNvbnN0IEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4gZG9sYnlWaXNpb25Qcm9maWxlTWFwID0geworICAgICAgICB7MSwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlbn0sCisgICAgICAgIHszLCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVufSwKKyAgICAgICAgezQsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdHJ9LAorICAgICAgICB7NSwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0bn0sCisgICAgICAgIHs2LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRofSwKKyAgICAgICAgezcsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGJ9LAorICAgICAgICB7OCwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0fSwKKyAgICAgICAgezksIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZX0sCisgICAgICAgIHsxMCwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdjExMH0KKyAgICB9OworCisgICAgLy8gRG9sYnkgVmlzaW9uIHByb2ZpbGUgaW5mb3JtYXRpb24gaXMgZXh0cmFjdGVkIGFzIHBlcgorICAgIC8vIGh0dHBzOi8vZG9sYnkubXkuc2FsZXNmb3JjZS5jb20vc2ZjL3AvIzcwMDAwMDAwOVl1Ry9hLzR1MDAwMDAwbDZGQi8wNzZ3SFlFbXlFZnowOW0wVjFibzg1XzI1aGxVSmphaVdUYnpvck5tWVk0CisgICAgdWludDhfdCBkdl9wcm9maWxlID0gKCgoKHVpbnQ4X3QgKilkYXRhKVsyXSA+PiAxKSAmIDB4N2YpOworCisgICAgaWYgKCFkb2xieVZpc2lvblByb2ZpbGVNYXAubWFwKGR2X3Byb2ZpbGUsICZtRG92aVByb2ZpbGUpKSB7CisgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBEb2xieSBQcm9maWxlIGZyb20gRFYgQ29uZmlnIGRhdGEiKTsKKyAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogLyoKICAqIFVwZGF0ZXMgdGhlIGRyaWZ0IHRpbWUgZnJvbSB0aGUgYXVkaW8gdHJhY2sgc28gdGhhdAogICogdGhlIHZpZGVvIHRyYWNrIGNhbiBnZXQgdGhlIHVwZGF0ZWQgZHJpZnQgdGltZSBpbmZvcm1hdGlvbgpAQCAtMzQ3NCw4ICszNTQ0LDI3IEBACiAgICAgICAgICAgICAgICAgICAgIGVyciA9IGNvcHlDb2RlY1NwZWNpZmljRGF0YSgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Jc0RvdmkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gZ2V0RG9sYnlWaXNpb25Qcm9maWxlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0eXBlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRG92aVByb2ZpbGUgPT0gRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobURvdmlQcm9maWxlIDwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1ldGEtPmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkRWIFByb2ZpbGVzID4gRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSyAmJiBkYXRhICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5Q29kZWNTcGVjaWZpY0RhdGEoKHVpbnQ4X3QgKilkYXRhLCBzaXplKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtR290QWxsQ29kZWNTcGVjaWZpY0RhdGEgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAgICAgICAgICAgICBpZiAoT0sgIT0gZXJyKSB7CkBAIC00MTczLDYgKzQyNjIsNyBAQAogICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgbWltZSkgfHwKICAgICAgICAgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lKSB8fAogICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCBtaW1lKSB8fAorICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sIG1pbWUpIHx8CiAgICAgICAgICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywgbWltZSkpIHsKICAgICAgICAgaWYgKCFtQ29kZWNTcGVjaWZpY0RhdGEgfHwKICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YVNpemUgPD0gMCkgewpAQCAtNDI5Nyw3ICs0Mzg3LDEzIEBACiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBib29sIHN1Y2Nlc3MgPSBtTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CiAgICAgQ0hFQ0soc3VjY2Vzcyk7Ci0gICAgY29uc3QgY2hhciAqZm91cmNjID0gZ2V0Rm91ckNDRm9yTWltZShtaW1lKTsKKyAgICBjb25zdCBjaGFyICpmb3VyY2M7CisgICAgaWYgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OKSkgeworICAgICAgICBmb3VyY2MgPSBnZXREb3ZpRm91ckNDKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm91cmNjID0gZ2V0Rm91ckNDRm9yTWltZShtaW1lKTsKKyAgICB9CisKICAgICBpZiAoZm91cmNjID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIlVua25vd24gbWltZSB0eXBlICclcycuIiwgbWltZSk7CiAgICAgICAgIFRSRVNQQVNTKCk7CkBAIC00MzM3LDEwICs0NDMzLDIwIEBACiAgICAgICAgIHdyaXRlQXZjY0JveCgpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgbWltZSkpIHsKICAgICAgICAgd3JpdGVIdmNjQm94KCk7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sIG1pbWUpKSB7CisgICAgICAgIGlmIChtRG92aVByb2ZpbGUgPD0gRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0KSB7CisgICAgICAgICAgICB3cml0ZUh2Y2NCb3goKTsKKyAgICAgICAgfSBlbHNlIGlmIChtRG92aVByb2ZpbGUgPT0gRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlKSB7CisgICAgICAgICAgICB3cml0ZUF2Y2NCb3goKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBUUkVTUEFTUygiVW5zdXBwb3J0ZWQgRG9sYnkgVmlzaW9uIHByb2ZpbGUiKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZURvdmlDb25maWdCb3goKTsKICAgICB9CiAKICAgICB3cml0ZVBhc3BCb3goKTsKICAgICB3cml0ZUNvbHJCb3goKTsKKyAgICB3cml0ZU1kY3ZBbmRDbGxpQm94ZXMoKTsKICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gbXA0diwgczI2MyBvciBhdmMxCiB9CiAKQEAgLTQzNDksMzAgKzQ0NTUsODIgQEAKICAgICBtZW1zZXQoJmFzcGVjdHMsIDAsIHNpemVvZihhc3BlY3RzKSk7CiAgICAgLy8gQ29sb3IgbWV0YWRhdGEgbWF5IGhhdmUgY2hhbmdlZC4KICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIC8vIFRSSUNLWTogdXNpbmcgfCBpbnN0ZWFkIG9mIHx8IGJlY2F1c2Ugd2Ugd2FudCB0byBleGVjdXRlIGFsbCBmaW5kSW50MzItcwotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCAoaW50MzJfdCopJmFzcGVjdHMubVByaW1hcmllcykKLSAgICAgICAgICAgIHwgbWV0YS0+ZmluZEludDMyKGtLZXlUcmFuc2ZlckZ1bmN0aW9uLCAoaW50MzJfdCopJmFzcGVjdHMubVRyYW5zZmVyKQotICAgICAgICAgICAgfCBtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yTWF0cml4LCAoaW50MzJfdCopJmFzcGVjdHMubU1hdHJpeENvZWZmcykKLSAgICAgICAgICAgIHwgbWV0YS0+ZmluZEludDMyKGtLZXlDb2xvclJhbmdlLCAoaW50MzJfdCopJmFzcGVjdHMubVJhbmdlKSkgewotICAgICAgICBpbnQzMl90IHByaW1hcmllcywgdHJhbnNmZXIsIGNvZWZmczsKLSAgICAgICAgYm9vbCBmdWxsUmFuZ2U7Ci0gICAgICAgIEFMT0dWKCJwcmltYXJpZXM9JXMgdHJhbnNmZXI9JXMgbWF0cml4PSVzIHJhbmdlPSVzIiwKLSAgICAgICAgICAgICAgICBhc1N0cmluZyhhc3BlY3RzLm1QcmltYXJpZXMpLAotICAgICAgICAgICAgICAgIGFzU3RyaW5nKGFzcGVjdHMubVRyYW5zZmVyKSwKLSAgICAgICAgICAgICAgICBhc1N0cmluZyhhc3BlY3RzLm1NYXRyaXhDb2VmZnMpLAotICAgICAgICAgICAgICAgIGFzU3RyaW5nKGFzcGVjdHMubVJhbmdlKSk7Ci0gICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRDb2RlY0NvbG9yQXNwZWN0c1RvSXNvQXNwZWN0cygKLSAgICAgICAgICAgICAgICBhc3BlY3RzLCAmcHJpbWFyaWVzLCAmdHJhbnNmZXIsICZjb2VmZnMsICZmdWxsUmFuZ2UpOwotICAgICAgICBtT3duZXItPmJlZ2luQm94KCJjb2xyIik7Ci0gICAgICAgIG1Pd25lci0+d3JpdGVGb3VyY2MoIm5jbHgiKTsKLSAgICAgICAgbU93bmVyLT53cml0ZUludDE2KHByaW1hcmllcyk7Ci0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNih0cmFuc2Zlcik7Ci0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNihjb2VmZnMpOwotICAgICAgICBtT3duZXItPndyaXRlSW50OChpbnQ4X3QoZnVsbFJhbmdlID8gMHg4MCA6IDB4MCkpOwotICAgICAgICBtT3duZXItPmVuZEJveCgpOyAvLyBjb2xyCi0gICAgfSBlbHNlIHsKKyAgICBib29sIGZpbmRQcmltYXJpZXMgPSBtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCAoaW50MzJfdCopJmFzcGVjdHMubVByaW1hcmllcyk7CisgICAgYm9vbCBmaW5kVHJhbnNmZXIgPSBtZXRhLT5maW5kSW50MzIoa0tleVRyYW5zZmVyRnVuY3Rpb24sIChpbnQzMl90KikmYXNwZWN0cy5tVHJhbnNmZXIpOworICAgIGJvb2wgZmluZE1hdHJpeCA9IG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JNYXRyaXgsIChpbnQzMl90KikmYXNwZWN0cy5tTWF0cml4Q29lZmZzKTsKKyAgICBib29sIGZpbmRSYW5nZSA9IG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JSYW5nZSwgKGludDMyX3QqKSZhc3BlY3RzLm1SYW5nZSk7CisgICAgaWYgKCFmaW5kUHJpbWFyaWVzICYmICFmaW5kVHJhbnNmZXIgJiYgIWZpbmRNYXRyaXggJiYgIWZpbmRSYW5nZSkgewogICAgICAgICBBTE9HVigibm8gY29sb3IgaW5mb3JtYXRpb24iKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIGludDMyX3QgcHJpbWFyaWVzLCB0cmFuc2ZlciwgY29lZmZzOworICAgIGJvb2wgZnVsbFJhbmdlOworICAgIEFMT0dWKCJwcmltYXJpZXM9JXMgdHJhbnNmZXI9JXMgbWF0cml4PSVzIHJhbmdlPSVzIiwKKyAgICAgICAgICAgIGFzU3RyaW5nKGFzcGVjdHMubVByaW1hcmllcyksCisgICAgICAgICAgICBhc1N0cmluZyhhc3BlY3RzLm1UcmFuc2ZlciksCisgICAgICAgICAgICBhc1N0cmluZyhhc3BlY3RzLm1NYXRyaXhDb2VmZnMpLAorICAgICAgICAgICAgYXNTdHJpbmcoYXNwZWN0cy5tUmFuZ2UpKTsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb0lzb0FzcGVjdHMoCisgICAgICAgICAgICBhc3BlY3RzLCAmcHJpbWFyaWVzLCAmdHJhbnNmZXIsICZjb2VmZnMsICZmdWxsUmFuZ2UpOworICAgIG1Pd25lci0+YmVnaW5Cb3goImNvbHIiKTsKKyAgICBtT3duZXItPndyaXRlRm91cmNjKCJuY2x4Iik7CisgICAgbU93bmVyLT53cml0ZUludDE2KHByaW1hcmllcyk7CisgICAgbU93bmVyLT53cml0ZUludDE2KHRyYW5zZmVyKTsKKyAgICBtT3duZXItPndyaXRlSW50MTYoY29lZmZzKTsKKyAgICBtT3duZXItPndyaXRlSW50OChpbnQ4X3QoZnVsbFJhbmdlID8gMHg4MCA6IDB4MCkpOworICAgIG1Pd25lci0+ZW5kQm94KCk7IC8vIGNvbHIKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlTWRjdkFuZENsbGlCb3hlcygpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOworICAgIHVpbnQzMl90IHR5cGU7CisgICAgY29uc3QgdWludDhfdCogZGF0YTsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBib29sIGZvdW5kID0KKyAgICAgICAgICAgIG1ldGEtPmZpbmREYXRhKGtLZXlIZHJTdGF0aWNJbmZvLCAmdHlwZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKio+KCZkYXRhKSwgJnNpemUpOworICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgcmV0dXJuOyAvLyBOb3RoaW5nIHRvIGVuY29kZS4KKyAgICB9CisgICAgaWYgKHNpemUgIT0gMjUpIHsKKyAgICAgICAgQUxPR1coIklnbm9yaW5nIEhEUiBzdGF0aWMgaW5mbyB3aXRoIHVuZXhwZWN0ZWQgc2l6ZSAlZCIsIChpbnQpc2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDE2X3QgZGlzcGxheVByaW1hcmllc1JYID0gVTE2TEVfQVQoJmRhdGFbMV0pOworICAgIHVpbnQxNl90IGRpc3BsYXlQcmltYXJpZXNSWSA9IFUxNkxFX0FUKCZkYXRhWzNdKTsKKworICAgIHVpbnQxNl90IGRpc3BsYXlQcmltYXJpZXNHWCA9IFUxNkxFX0FUKCZkYXRhWzVdKTsKKyAgICB1aW50MTZfdCBkaXNwbGF5UHJpbWFyaWVzR1kgPSBVMTZMRV9BVCgmZGF0YVs3XSk7CisKKyAgICB1aW50MTZfdCBkaXNwbGF5UHJpbWFyaWVzQlggPSBVMTZMRV9BVCgmZGF0YVs5XSk7CisgICAgdWludDE2X3QgZGlzcGxheVByaW1hcmllc0JZID0gVTE2TEVfQVQoJmRhdGFbMTFdKTsKKworICAgIHVpbnQxNl90IHdoaXRlUG9pbnRYID0gVTE2TEVfQVQoJmRhdGFbMTNdKTsKKyAgICB1aW50MTZfdCB3aGl0ZVBvaW50WSA9IFUxNkxFX0FUKCZkYXRhWzE1XSk7CisKKyAgICB1aW50MTZfdCBtYXhEaXNwbGF5TWFzdGVyaW5nTHVtaW5hbmNlID0gVTE2TEVfQVQoJmRhdGFbMTddKTsKKyAgICB1aW50MTZfdCBtaW5EaXNwbGF5TWFzdGVyaW5nTHVtaW5hbmNlID0gVTE2TEVfQVQoJmRhdGFbMTldKTsKKworICAgIHVpbnQxNl90IG1heENvbnRlbnRMaWdodExldmVsID0gVTE2TEVfQVQoJmRhdGFbMjFdKTsKKyAgICB1aW50MTZfdCBtYXhQaWNBdmVyYWdlTGlnaHRMZXZlbCA9IFUxNkxFX0FUKCZkYXRhWzIzXSk7CisKKyAgICBtT3duZXItPmJlZ2luQm94KCJtZGN2Iik7CisgICAgbU93bmVyLT53cml0ZUludDE2KGRpc3BsYXlQcmltYXJpZXNHWCk7CisgICAgbU93bmVyLT53cml0ZUludDE2KGRpc3BsYXlQcmltYXJpZXNHWSk7CisgICAgbU93bmVyLT53cml0ZUludDE2KGRpc3BsYXlQcmltYXJpZXNCWCk7CisgICAgbU93bmVyLT53cml0ZUludDE2KGRpc3BsYXlQcmltYXJpZXNCWSk7CisgICAgbU93bmVyLT53cml0ZUludDE2KGRpc3BsYXlQcmltYXJpZXNSWCk7CisgICAgbU93bmVyLT53cml0ZUludDE2KGRpc3BsYXlQcmltYXJpZXNSWSk7CisgICAgbU93bmVyLT53cml0ZUludDE2KHdoaXRlUG9pbnRYKTsKKyAgICBtT3duZXItPndyaXRlSW50MTYod2hpdGVQb2ludFkpOworICAgIG1Pd25lci0+d3JpdGVJbnQzMihtYXhEaXNwbGF5TWFzdGVyaW5nTHVtaW5hbmNlICogMTAwMDApOworICAgIG1Pd25lci0+d3JpdGVJbnQzMihtaW5EaXNwbGF5TWFzdGVyaW5nTHVtaW5hbmNlICogMTAwMDApOworICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBtZGN2LgorCisgICAgbU93bmVyLT5iZWdpbkJveCgiY2xsaSIpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNihtYXhDb250ZW50TGlnaHRMZXZlbCk7CisgICAgbU93bmVyLT53cml0ZUludDE2KG1heFBpY0F2ZXJhZ2VMaWdodExldmVsKTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gY2xsaS4KIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlQXVkaW9Gb3VyQ0NCb3goKSB7CkBAIC00ODI5LDEyICs0OTg3LDExIEBACiAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGF2Y0MKIH0KIAotCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVIdmNjQm94KCkgewogICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YSk7CiAgICAgQ0hFQ0tfR0UobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSwgNXUpOwogCi0gICAgLy8gUGF0Y2ggYXZjYydzIGxlbmd0aFNpemUgZmllbGQgdG8gbWF0Y2ggdGhlIG51bWJlcgorICAgIC8vIFBhdGNoIGh2Y2MncyBsZW5ndGhTaXplIGZpZWxkIHRvIG1hdGNoIHRoZSBudW1iZXIKICAgICAvLyBvZiBieXRlcyB3ZSB1c2UgdG8gaW5kaWNhdGUgdGhlIHNpemUgb2YgYSBuYWwgdW5pdC4KICAgICB1aW50OF90ICpwdHIgPSAodWludDhfdCAqKW1Db2RlY1NwZWNpZmljRGF0YTsKICAgICBwdHJbMjFdID0gKHB0clsyMV0gJiAweGZjKSB8IChtT3duZXItPnVzZU5hbExlbmd0aEZvdXIoKSA/IDMgOiAxKTsKQEAgLTQ4NDMsNiArNTAwMCwzMiBAQAogICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBodmNDCiB9CiAKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZURvdmlDb25maWdCb3goKSB7CisgICAgQ0hFQ0tfTkUobURvdmlQcm9maWxlLCAwdSk7CisKKyAgICB1aW50MzJfdCB0eXBlID0gMDsKKyAgICBjb25zdCB2b2lkICpkYXRhID0gbnVsbHB0cjsKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgLy8gY2hlY2sgdG8gc2VlIHdoaWNoIGtleSBoYXMgdGhlIGNvbmZpZ3VyYXRpb24gYm94LgorICAgIGlmIChtTWV0YS0+ZmluZERhdGEoa0tleURWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpIHx8CisgICAgICAgIG1NZXRhLT5maW5kRGF0YShrS2V5RFZWQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkgfHwKKyAgICAgICAgbU1ldGEtPmZpbmREYXRhKGtLZXlEVldDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworCisgICAgICAgLy8gaWYgdGhpcyBib3ggaXMgcHJlc2VudCB3ZSB3cml0ZSB0aGUgYm94LCBvcgorICAgICAgIC8vIHRoaXMgbXA0IHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSBiYWNrd2FyZAorICAgICAgIC8vIGNvbXBhdGlibGUgc3RyZWFtLgorICAgICAgICBpZiAobURvdmlQcm9maWxlID4gRG9sYnlWaXNpb25Qcm9maWxlRHZhdjExMCkgeworICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiZHZ3QyIpOworICAgICAgICB9IGVsc2UgaWYgKG1Eb3ZpUHJvZmlsZSA+IERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGIpIHsKKyAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImR2dkMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImR2Y0MiKTsKKyAgICAgICAgfQorICAgICAgICBtT3duZXItPndyaXRlKGRhdGEsIHNpemUpOworICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gZHZ3Qy9kdnZDL2R2Y0MKKyAgICB9Cit9CisKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZUQyNjNCb3goKSB7CiAgICAgbU93bmVyLT5iZWdpbkJveCgiZDI2MyIpOwogICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlbmRvcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFBcHBlbmRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFwcGVuZGVyLmNwcAppbmRleCA1ZDgwYjMwLi4yMWRjZmExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFwcGVuZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFwcGVuZGVyLmNwcApAQCAtNzUsMTAgKzc1LDIxIEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgaWYgKHN0cmNtcCgiTVBFRzRFeHRyYWN0b3IiLCBtRXh0cmFjdG9yLT5nZXROYW1lKCkpID09IDApIHsKKyAgICBzcDxBTWVzc2FnZT4gZmlsZUZvcm1hdDsKKyAgICBzdGF0dXMgPSBtRXh0cmFjdG9yLT5nZXRGaWxlRm9ybWF0KCZmaWxlRm9ybWF0KTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJleHRyYWN0b3JfZ2V0RmlsZUZvcm1hdCBmYWlsZWQsIHN0YXR1cyA6JWQiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIEFTdHJpbmcgZmlsZU1pbWU7CisgICAgZmlsZUZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZmaWxlTWltZSk7CisgICAgLy8gb25seSBjb21wYXJlIHRoZSBlbmQgb2YgdGhlIGZpbGUgTUlNRSB0eXBlIHRvIGFsbG93IGZvciB2ZW5kb3IgY3VzdG9taXplZCBtaW1lIHR5cGUKKyAgICBpZiAoZmlsZU1pbWUuZW5kc1dpdGgoIm1wNCIpKXsKICAgICAgICAgbUZvcm1hdCA9IE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfTVBFR180OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBmb3JtYXQsIGV4dHJhY3RvciBuYW1lOiVzIiwgbUV4dHJhY3Rvci0+Z2V0TmFtZSgpKTsKKyAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGZpbGUgZm9ybWF0LCBleHRyYWN0b3IgbmFtZTolcywgZmlsZWZvcm1hdCAlcyIsCisgICAgICAgICAgICAgIG1FeHRyYWN0b3ItPmdldE5hbWUoKSwgZmlsZU1pbWUuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKaW5kZXggYzAzMjM2YS4uZTUwODgwYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKQEAgLTEwMiw2ICsxMDIsOCBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY01vZGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1vZGUiOyAgICAvKiBhdWRpbywgdmlkZW8gKi8KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNNb2RlVmlkZW8gPSAidmlkZW8iOyAgICAgICAgICAgIC8qIHZhbHVlcyByZXR1cm5lZCBmb3Iga0NvZGVjTW9kZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY01vZGVBdWRpbyA9ICJhdWRpbyI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTW9kZUltYWdlID0gImltYWdlIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNNb2RlVW5rbm93biA9ICJ1bmtub3duIjsKIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNFbmNvZGVyID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lbmNvZGVyIjsgLyogMCwxICovCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjU2VjdXJlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5zZWN1cmUiOyAgIC8qIDAsIDEgKi8KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNXaWR0aCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMud2lkdGgiOyAgICAgLyogMC4ubiAqLwpAQCAtMTEyLDYgKzExNCwxNSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0NhcHR1cmVSYXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jYXB0dXJlLXJhdGUiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY09wZXJhdGluZ1JhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm9wZXJhdGluZy1yYXRlIjsKIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNQcmlvcml0eSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucHJpb3JpdHkiOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0NvbmZpZ0NvbG9yU3RhbmRhcmQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNvbmZpZy1jb2xvci1zdGFuZGFyZCI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjQ29uZmlnQ29sb3JSYW5nZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY29uZmlnLWNvbG9yLXJhbmdlIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNDb25maWdDb2xvclRyYW5zZmVyID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jb25maWctY29sb3ItdHJhbnNmZXIiOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1BhcnNlZENvbG9yU3RhbmRhcmQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnBhcnNlZC1jb2xvci1zdGFuZGFyZCI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUGFyc2VkQ29sb3JSYW5nZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucGFyc2VkLWNvbG9yLXJhbmdlIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNQYXJzZWRDb2xvclRyYW5zZmVyID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5wYXJzZWQtY29sb3ItdHJhbnNmZXIiOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0hEUlN0YXRpY0luZm8gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmhkci1zdGF0aWMtaW5mbyI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjSERSMTBQbHVzSW5mbyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuaGRyMTAtcGx1cy1pbmZvIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNIRFJGb3JtYXQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmhkci1mb3JtYXQiOwogCiAvLyBNaW4vTWF4IFFQIGJlZm9yZSBzaGFwaW5nCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjT3JpZ2luYWxWaWRlb1FQSU1pbiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMub3JpZ2luYWwtdmlkZW8tcXAtaS1taW4iOwpAQCAtMTc3LDkgKzE4OCwxMiBAQAogLy8gWFhYIHN1cHByZXNzIHVudGlsIHdlIGdldCBvdXIgcmVwcmVzZW50YXRpb24gcmlnaHQKIHN0YXRpYyBib29sIGtFbWl0SGlzdG9ncmFtID0gZmFsc2U7CiAKK3N0YXRpYyBpbnQ2NF90IGdldElkKElSZXNvdXJjZU1hbmFnZXJDbGllbnQgY29uc3QgKiBjbGllbnQpIHsKKyAgICByZXR1cm4gKGludDY0X3QpIGNsaWVudDsKK30KIAogc3RhdGljIGludDY0X3QgZ2V0SWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICZjbGllbnQpIHsKLSAgICByZXR1cm4gKGludDY0X3QpIGNsaWVudC5nZXQoKTsKKyAgICByZXR1cm4gZ2V0SWQoY2xpZW50LmdldCgpKTsKIH0KIAogc3RhdGljIGJvb2wgaXNSZXNvdXJjZUVycm9yKHN0YXR1c190IGVycikgewpAQCAtMTk2LDEyICsyMTAsMjAgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIHN0cnVjdCBSZXNvdXJjZU1hbmFnZXJDbGllbnQgOiBwdWJsaWMgQm5SZXNvdXJjZU1hbmFnZXJDbGllbnQgewotICAgIGV4cGxpY2l0IFJlc291cmNlTWFuYWdlckNsaWVudChNZWRpYUNvZGVjKiBjb2RlYykgOiBtTWVkaWFDb2RlYyhjb2RlYykge30KKyAgICBleHBsaWNpdCBSZXNvdXJjZU1hbmFnZXJDbGllbnQoTWVkaWFDb2RlYyogY29kZWMsIGludDMyX3QgcGlkKSA6CisgICAgICAgICAgICBtTWVkaWFDb2RlYyhjb2RlYyksIG1QaWQocGlkKSB7fQogCiAgICAgU3RhdHVzIHJlY2xhaW1SZXNvdXJjZShib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKICAgICAgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBtTWVkaWFDb2RlYy5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChjb2RlYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBjb2RlYyBpcyBhbHJlYWR5IGdvbmUuCisgICAgICAgICAgICAvLyBDb2RlYyBpcyBhbHJlYWR5IGdvbmUsIHNvIHJlbW92ZSB0aGUgcmVzb3VyY2VzIGFzIHdlbGwKKyAgICAgICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcihBU2VydmljZU1hbmFnZXJfZ2V0U2VydmljZSgibWVkaWEucmVzb3VyY2VfbWFuYWdlciIpKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gc2VydmljZSA9CisgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpmcm9tQmluZGVyKGJpbmRlcik7CisgICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk1lZGlhQ29kZWM6OlJlc291cmNlTWFuYWdlckNsaWVudCB1bmFibGUgdG8gZmluZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXJ2aWNlLT5yZW1vdmVDbGllbnQobVBpZCwgZ2V0SWQodGhpcykpOwogICAgICAgICAgICAgKl9haWRsX3JldHVybiA9IHRydWU7CiAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICAgICAgICB9CkBAIC0yMzgsNiArMjYwLDcgQEAKIAogcHJpdmF0ZToKICAgICB3cDxNZWRpYUNvZGVjPiBtTWVkaWFDb2RlYzsKKyAgICBpbnQzMl90IG1QaWQ7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXNvdXJjZU1hbmFnZXJDbGllbnQpOwogfTsKQEAgLTI0Nyw3ICsyNzAsNyBAQAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICZjbGllbnQpOwogICAgIHZpcnR1YWwgflJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eSgpOwogCi0gICAgdm9pZCBpbml0KCk7CisgICAgc3RhdHVzX3QgaW5pdCgpOwogCiAgICAgLy8gaW1wbGVtZW50cyBEZWF0aFJlY2lwaWVudAogICAgIHN0YXRpYyB2b2lkIEJpbmRlckRpZWRDYWxsYmFjayh2b2lkKiBjb29raWUpOwpAQCAtMjc2LDYgKzI5OSw5IEBACiAgICAgICAgIHBpZF90IHBpZCwgdWlkX3QgdWlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gJmNsaWVudCkKICAgICAgICAgOiBtUGlkKHBpZCksIG1VaWQodWlkKSwgbUNsaWVudChjbGllbnQpLAogICAgICAgICAgIG1EZWF0aFJlY2lwaWVudChBSUJpbmRlcl9EZWF0aFJlY2lwaWVudF9uZXcoQmluZGVyRGllZENhbGxiYWNrKSkgeworICAgIGlmIChtVWlkID09IE1lZGlhQ29kZWM6OmtOb1VpZCkgeworICAgICAgICBtVWlkID0gQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpOworICAgIH0KICAgICBpZiAobVBpZCA9PSBNZWRpYUNvZGVjOjprTm9QaWQpIHsKICAgICAgICAgbVBpZCA9IEFJQmluZGVyX2dldENhbGxpbmdQaWQoKTsKICAgICB9CkBAIC0yOTQsMTIgKzMyMCwyNiBAQAogICAgIH0KIH0KIAotdm9pZCBNZWRpYUNvZGVjOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHk6OmluaXQoKSB7CitzdGF0dXNfdCBNZWRpYUNvZGVjOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHk6OmluaXQoKSB7CiAgICAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyKEFTZXJ2aWNlTWFuYWdlcl9nZXRTZXJ2aWNlKCJtZWRpYS5yZXNvdXJjZV9tYW5hZ2VyIikpOwogICAgIG1TZXJ2aWNlID0gSVJlc291cmNlTWFuYWdlclNlcnZpY2U6OmZyb21CaW5kZXIoYmluZGVyKTsKICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIik7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaW50IGNhbGxlclBpZCA9IEFJQmluZGVyX2dldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGVyVWlkID0gQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpOworICAgIGlmIChtUGlkICE9IGNhbGxlclBpZCB8fCBtVWlkICE9IGNhbGxlclVpZCkgeworICAgICAgICAvLyBNZWRpYSBwcm9jZXNzZXMgZG9uJ3QgbmVlZCBzcGVjaWFsIHBlcm1pc3Npb25zIHRvIGFjdCBvbiBiZWhhbGYgb2Ygb3RoZXIgcHJvY2Vzc2VzLgorICAgICAgICBpZiAoY2FsbGVyVWlkICE9IEFJRF9NRURJQSkgeworICAgICAgICAgICAgY2hhciBjb25zdCAqIHBlcm1pc3Npb24gPSAiYW5kcm9pZC5wZXJtaXNzaW9uLk1FRElBX1JFU09VUkNFX09WRVJSSURFX1BJRCI7CisgICAgICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYocGVybWlzc2lvbikpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzIGlzIHJlcXVpcmVkIHRvIG92ZXJyaWRlIHRoZSBjYWxsZXIncyBQSUQgZm9yIG1lZGlhIHJlc291cmNlIG1hbmFnZW1lbnQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24pOworICAgICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIEtpbGwgY2xpZW50cyBwZW5kaW5nIHJlbW92YWwuCkBAIC0zMTAsNiArMzUwLDcgQEAKIAogICAgIC8vIGFmdGVyIHRoaXMsIHJlcXVpcmUgbUxvY2sgd2hlbmV2ZXIgdXNpbmcgbVNlcnZpY2UKICAgICBBSUJpbmRlcl9saW5rVG9EZWF0aChtU2VydmljZS0+YXNCaW5kZXIoKS5nZXQoKSwgbURlYXRoUmVjaXBpZW50LmdldCgpLCB0aGlzKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIC8vc3RhdGljCkBAIC02NDksNiArNjkwLDI0IEBACiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKK3N0YXRpYyBNZWRpYVJlc291cmNlU3ViVHlwZSB0b01lZGlhUmVzb3VyY2VTdWJUeXBlKE1lZGlhQ29kZWM6OkRvbWFpbiBkb21haW4pIHsKKyAgICBzd2l0Y2ggKGRvbWFpbikgeworICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkRPTUFJTl9WSURFTzogcmV0dXJuIE1lZGlhUmVzb3VyY2VTdWJUeXBlOjprVmlkZW9Db2RlYzsKKyAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpET01BSU5fQVVESU86IHJldHVybiBNZWRpYVJlc291cmNlU3ViVHlwZTo6a0F1ZGlvQ29kZWM7CisgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6RE9NQUlOX0lNQUdFOiByZXR1cm4gTWVkaWFSZXNvdXJjZVN1YlR5cGU6OmtJbWFnZUNvZGVjOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2VTdWJUeXBlOjprVW5zcGVjaWZpZWRTdWJUeXBlOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiB0b0NvZGVjTW9kZShNZWRpYUNvZGVjOjpEb21haW4gZG9tYWluKSB7CisgICAgc3dpdGNoIChkb21haW4pIHsKKyAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpET01BSU5fVklERU86IHJldHVybiBrQ29kZWNNb2RlVmlkZW87CisgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6RE9NQUlOX0FVRElPOiByZXR1cm4ga0NvZGVjTW9kZUF1ZGlvOworICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkRPTUFJTl9JTUFHRTogcmV0dXJuIGtDb2RlY01vZGVJbWFnZTsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrQ29kZWNNb2RlVW5rbm93bjsKKyAgICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNzQ0LDEwICs4MDMsMTMgQEAKICAgICAgIG1GbGFncygwKSwKICAgICAgIG1TdGlja3lFcnJvcihPSyksCiAgICAgICBtU29mdFJlbmRlcmVyKE5VTEwpLAotICAgICAgbUlzVmlkZW8oZmFsc2UpLAotICAgICAgbVZpZGVvV2lkdGgoMCksCi0gICAgICBtVmlkZW9IZWlnaHQoMCksCisgICAgICBtRG9tYWluKERPTUFJTl9VTktOT1dOKSwKKyAgICAgIG1XaWR0aCgwKSwKKyAgICAgIG1IZWlnaHQoMCksCiAgICAgICBtUm90YXRpb25EZWdyZWVzKDApLAorICAgICAgbUNvbmZpZ0NvbG9yVHJhbnNmZXIoLTEpLAorICAgICAgbUhEUlN0YXRpY0luZm8oZmFsc2UpLAorICAgICAgbUhEUjEwUGx1c0luZm8oZmFsc2UpLAogICAgICAgbURlcXVldWVJbnB1dFRpbWVvdXRHZW5lcmF0aW9uKDApLAogICAgICAgbURlcXVldWVJbnB1dFJlcGx5SUQoMCksCiAgICAgICBtRGVxdWV1ZU91dHB1dFRpbWVvdXRHZW5lcmF0aW9uKDApLApAQCAtNzU1LDcgKzgxNyw3IEBACiAgICAgICBtVHVubmVsZWRJbnB1dFdpZHRoKDApLAogICAgICAgbVR1bm5lbGVkSW5wdXRIZWlnaHQoMCksCiAgICAgICBtVHVubmVsZWQoZmFsc2UpLAotICAgICAgbVR1bm5lbFBlZWtTdGF0ZShUdW5uZWxQZWVrU3RhdGU6OmtFbmFibGVkTm9CdWZmZXIpLAorICAgICAgbVR1bm5lbFBlZWtTdGF0ZShUdW5uZWxQZWVrU3RhdGU6OmtMZWdhY3lNb2RlKSwKICAgICAgIG1IYXZlSW5wdXRTdXJmYWNlKGZhbHNlKSwKICAgICAgIG1IYXZlUGVuZGluZ0lucHV0QnVmZmVycyhmYWxzZSksCiAgICAgICBtQ3B1Qm9vc3RSZXF1ZXN0ZWQoZmFsc2UpLApAQCAtNzczLDEzICs4MzUsOCBAQAogICAgICAgbUlucHV0QnVmZmVyQ291bnRlcigwKSwKICAgICAgIG1HZXRDb2RlY0Jhc2UoZ2V0Q29kZWNCYXNlKSwKICAgICAgIG1HZXRDb2RlY0luZm8oZ2V0Q29kZWNJbmZvKSB7Ci0gICAgaWYgKHVpZCA9PSBrTm9VaWQpIHsKLSAgICAgICAgbVVpZCA9IEFJQmluZGVyX2dldENhbGxpbmdVaWQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtVWlkID0gdWlkOwotICAgIH0KLSAgICBtUmVzb3VyY2VNYW5hZ2VyUHJveHkgPSBuZXcgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5KHBpZCwgbVVpZCwKLSAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFJlc291cmNlTWFuYWdlckNsaWVudD4odGhpcykpOworICAgIG1SZXNvdXJjZU1hbmFnZXJQcm94eSA9IG5ldyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHkocGlkLCB1aWQsCisgICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxSZXNvdXJjZU1hbmFnZXJDbGllbnQ+KHRoaXMsIHBpZCkpOwogICAgIGlmICghbUdldENvZGVjQmFzZSkgewogICAgICAgICBtR2V0Q29kZWNCYXNlID0gW10oY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgY2hhciAqb3duZXIpIHsKICAgICAgICAgICAgIHJldHVybiBHZXRDb2RlY0Jhc2UobmFtZSwgb3duZXIpOwpAQCAtODA3LDcgKzg2NCw2IEBACiAgICAgICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAgICAgICAgIH07CiAgICAgfQotCiAgICAgaW5pdE1lZGlhbWV0cmljcygpOwogfQogCkBAIC04OTgsMTIgKzk1NCw3MiBAQAogICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0ZpcnN0RnJhbWVJbmRleExvd0xhdGVuY3lNb2RlT24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhPZkZpcnN0RnJhbWVXaGVuTG93TGF0ZW5jeU9uKTsKICAgICB9CisKKyAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0hEUlN0YXRpY0luZm8sIG1IRFJTdGF0aWNJbmZvID8gMSA6IDApOworICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjSERSMTBQbHVzSW5mbywgbUhEUjEwUGx1c0luZm8gPyAxIDogMCk7CiAjaWYgMAogICAgIC8vIGVuYWJsZSBmb3Igc2hvcnQgdGVybSwgb25seSB3aGlsZSBkZWJ1Z2dpbmcKICAgICB1cGRhdGVFcGhlbWVyYWxNZWRpYW1ldHJpY3MobU1ldHJpY3NIYW5kbGUpOwogI2VuZGlmCiB9CiAKK3ZvaWQgTWVkaWFDb2RlYzo6dXBkYXRlSERSRm9ybWF0TWV0cmljKCkgeworICAgIGludDMyX3QgcHJvZmlsZSA9IC0xOworICAgIEFTdHJpbmcgbWVkaWFUeXBlOworICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX1BST0ZJTEUsICZwcm9maWxlKQorICAgICAgICAgICAgJiYgbU91dHB1dEZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtZWRpYVR5cGUpKSB7CisgICAgICAgIGhkcl9mb3JtYXQgaGRyRm9ybWF0ID0gZ2V0SERSRm9ybWF0KHByb2ZpbGUsIG1Db25maWdDb2xvclRyYW5zZmVyLCBtZWRpYVR5cGUpOworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0hEUkZvcm1hdCwgc3RhdGljX2Nhc3Q8aW50PihoZHJGb3JtYXQpKTsKKyAgICB9Cit9CisKK2hkcl9mb3JtYXQgTWVkaWFDb2RlYzo6Z2V0SERSRm9ybWF0KGNvbnN0IGludDMyX3QgcHJvZmlsZSwgY29uc3QgaW50MzJfdCB0cmFuc2ZlciwKKyAgICAgICAgY29uc3QgQVN0cmluZyAmbWVkaWFUeXBlKSB7CisgICAgc3dpdGNoICh0cmFuc2ZlcikgeworICAgICAgICBjYXNlIENPTE9SX1RSQU5TRkVSX1NUMjA4NDoKKyAgICAgICAgICAgIGlmIChtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVlA5UHJvZmlsZTJIRFI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSERSX0ZPUk1BVF9IRFIxMDsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBWUDlQcm9maWxlMkhEUjEwUGx1czoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIRFJfRk9STUFUX0hEUjEwUExVUzsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIRFJfRk9STUFUX05PTkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVYxUHJvZmlsZU1haW4xMEhEUjEwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhEUl9GT1JNQVRfSERSMTA7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVYxUHJvZmlsZU1haW4xMEhEUjEwUGx1czoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIRFJfRk9STUFUX0hEUjEwUExVUzsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIRFJfRk9STUFUX05PTkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvZmlsZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEhFVkNQcm9maWxlTWFpbjEwSERSMTA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSERSX0ZPUk1BVF9IRFIxMDsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW4xMEhEUjEwUGx1czoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIRFJfRk9STUFUX0hEUjEwUExVUzsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIRFJfRk9STUFUX05PTkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSERSX0ZPUk1BVF9OT05FOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIENPTE9SX1RSQU5TRkVSX0hMRzoKKyAgICAgICAgICAgIGlmICghbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBIRFJfRk9STUFUX0hMRzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogRE9MQlkgZm9ybWF0CisgICAgICAgICAgICAgICAgcmV0dXJuIEhEUl9GT1JNQVRfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBIRFJfRk9STUFUX05PTkU7CisgICAgfQorfQorCisKIHZvaWQgTWVkaWFDb2RlYzo6dXBkYXRlRXBoZW1lcmFsTWVkaWFtZXRyaWNzKG1lZGlhbWV0cmljc19oYW5kbGVfdCBpdGVtKSB7CiAgICAgQUxPR0QoIk1lZGlhQ29kZWM6OnVwZGF0ZUVwaGVtZXJhbE1lZGlhbWV0cmljcygpIik7CiAKQEAgLTk3MSw2ICsxMDg3LDggQEAKIAogY29uc3RleHByIGNvbnN0IGNoYXIgKk1lZGlhQ29kZWM6OmFzU3RyaW5nKFR1bm5lbFBlZWtTdGF0ZSBzdGF0ZSwgY29uc3QgY2hhciAqZGVmYXVsdF9zdHJpbmcpewogICAgIHN3aXRjaChzdGF0ZSkgeworICAgICAgICBjYXNlIFR1bm5lbFBlZWtTdGF0ZTo6a0xlZ2FjeU1vZGU6CisgICAgICAgICAgICByZXR1cm4gIkxlZ2FjeU1vZGUiOwogICAgICAgICBjYXNlIFR1bm5lbFBlZWtTdGF0ZTo6a0VuYWJsZWROb0J1ZmZlcjoKICAgICAgICAgICAgIHJldHVybiAiRW5hYmxlZE5vQnVmZmVyIjsKICAgICAgICAgY2FzZSBUdW5uZWxQZWVrU3RhdGU6OmtEaXNhYmxlZE5vQnVmZmVyOgpAQCAtOTk3LDYgKzExMTUsOSBAQAogICAgIFR1bm5lbFBlZWtTdGF0ZSBwcmV2aW91c1N0YXRlID0gbVR1bm5lbFBlZWtTdGF0ZTsKICAgICBpZih0dW5uZWxQZWVrID09IDApewogICAgICAgICBzd2l0Y2ggKG1UdW5uZWxQZWVrU3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgVHVubmVsUGVla1N0YXRlOjprTGVnYWN5TW9kZToKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJhbmRyb2lkLl90dW5uZWwtcGVlay1zZXQtbGVnYWN5IiwgMCk7CisgICAgICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOwogICAgICAgICAgICAgY2FzZSBUdW5uZWxQZWVrU3RhdGU6OmtFbmFibGVkTm9CdWZmZXI6CiAgICAgICAgICAgICAgICAgbVR1bm5lbFBlZWtTdGF0ZSA9IFR1bm5lbFBlZWtTdGF0ZTo6a0Rpc2FibGVkTm9CdWZmZXI7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDA5LDYgKzExMzAsOSBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3dpdGNoIChtVHVubmVsUGVla1N0YXRlKSB7CisgICAgICAgICAgICBjYXNlIFR1bm5lbFBlZWtTdGF0ZTo6a0xlZ2FjeU1vZGU6CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYW5kcm9pZC5fdHVubmVsLXBlZWstc2V0LWxlZ2FjeSIsIDApOworICAgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKICAgICAgICAgICAgIGNhc2UgVHVubmVsUGVla1N0YXRlOjprRGlzYWJsZWROb0J1ZmZlcjoKICAgICAgICAgICAgICAgICBtVHVubmVsUGVla1N0YXRlID0gVHVubmVsUGVla1N0YXRlOjprRW5hYmxlZE5vQnVmZmVyOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE1NSw3ICsxMjc5LDcgQEAKICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgaWYgKG1Jc1ZpZGVvICYmIChtRmxhZ3MgJiBrRmxhZ0lzRW5jb2RlcikpIHsKKyAgICBpZiAobURvbWFpbiA9PSBET01BSU5fVklERU8gJiYgKG1GbGFncyAmIGtGbGFnSXNFbmNvZGVyKSkgewogICAgICAgICBtQnl0ZXNJbnB1dCArPSBidWZmZXItPnNpemUoKTsKICAgICAgICAgbUZyYW1lc0lucHV0Kys7CiAgICAgfQpAQCAtMTE4NCw3ICsxMzA4LDcgQEAKIAogICAgIENIRUNLX05FKG1TdGF0ZSwgVU5JTklUSUFMSVpFRCk7CiAKLSAgICBpZiAobUlzVmlkZW8gJiYgKG1GbGFncyAmIGtGbGFnSXNFbmNvZGVyKSkgeworICAgIGlmIChtRG9tYWluID09IERPTUFJTl9WSURFTyAmJiAobUZsYWdzICYga0ZsYWdJc0VuY29kZXIpKSB7CiAgICAgICAgIGludDMyX3QgZmxhZ3MgPSAwOwogICAgICAgICAodm9pZCkgYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZmxhZ3MiLCAmZmxhZ3MpOwogCkBAIC0xMzYzLDcgKzE0ODcsMTEgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6aW5pdChjb25zdCBBU3RyaW5nICZuYW1lKSB7Ci0gICAgbVJlc291cmNlTWFuYWdlclByb3h5LT5pbml0KCk7CisgICAgc3RhdHVzX3QgZXJyID0gbVJlc291cmNlTWFuYWdlclByb3h5LT5pbml0KCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtQ29kZWMgPSBOVUxMOyAvLyByZW1vdmUgdGhlIGNvZGVjCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQogCiAgICAgLy8gc2F2ZSBpbml0IHBhcmFtZXRlcnMgZm9yIHJlc2V0CiAgICAgbUluaXROYW1lID0gbmFtZTsKQEAgLTEzNzgsNyArMTUwNiw3IEBACiAgICAgYm9vbCBzZWN1cmVDb2RlYyA9IGZhbHNlOwogICAgIGNvbnN0IGNoYXIgKm93bmVyID0gIiI7CiAgICAgaWYgKCFuYW1lLnN0YXJ0c1dpdGgoImFuZHJvaWQuZmlsdGVyLiIpKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1HZXRDb2RlY0luZm8obmFtZSwgJm1Db2RlY0luZm8pOworICAgICAgICBlcnIgPSBtR2V0Q29kZWNJbmZvKG5hbWUsICZtQ29kZWNJbmZvKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgbUNvZGVjID0gTlVMTDsgIC8vIHJlbW92ZSB0aGUgY29kZWMuCiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMTM5Miw3ICsxNTIwLDEzIEBACiAgICAgICAgIG1Db2RlY0luZm8tPmdldFN1cHBvcnRlZE1lZGlhVHlwZXMoJm1lZGlhVHlwZXMpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lZGlhVHlwZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIGlmIChtZWRpYVR5cGVzW2ldLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7Ci0gICAgICAgICAgICAgICAgbUlzVmlkZW8gPSB0cnVlOworICAgICAgICAgICAgICAgIG1Eb21haW4gPSBET01BSU5fVklERU87CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZXNbaV0uc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKKyAgICAgICAgICAgICAgICBtRG9tYWluID0gRE9NQUlOX0FVRElPOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGVzW2ldLnN0YXJ0c1dpdGgoImltYWdlLyIpKSB7CisgICAgICAgICAgICAgICAgbURvbWFpbiA9IERPTUFJTl9JTUFHRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTQwNSwxMiArMTUzOSwxNyBAQAogICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAgICAgfQogCi0gICAgaWYgKG1Jc1ZpZGVvKSB7CisgICAgaWYgKG1Eb21haW4gPT0gRE9NQUlOX1ZJREVPKSB7CiAgICAgICAgIC8vIHZpZGVvIGNvZGVjIG5lZWRzIGRlZGljYXRlZCBsb29wZXIKICAgICAgICAgaWYgKG1Db2RlY0xvb3BlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICAgICAgICAgIG1Db2RlY0xvb3BlciA9IG5ldyBBTG9vcGVyOwogICAgICAgICAgICAgbUNvZGVjTG9vcGVyLT5zZXROYW1lKCJDb2RlY0xvb3BlciIpOwotICAgICAgICAgICAgbUNvZGVjTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgICAgICAgICAgZXJyID0gbUNvZGVjTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgICAgICAgICAgaWYgKE9LICE9IGVycikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyBMb29wZXIgZmFpbGVkIHRvIHN0YXJ0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIG1Db2RlY0xvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1Db2RlYyk7CkBAIC0xNDM4LDE3ICsxNTc3LDE1IEBACiAKICAgICBpZiAobU1ldHJpY3NIYW5kbGUgIT0gMCkgewogICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga0NvZGVjQ29kZWMsIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNWaWRlbyA/IGtDb2RlY01vZGVWaWRlbyA6IGtDb2RlY01vZGVBdWRpbyk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNNb2RlLCB0b0NvZGVjTW9kZShtRG9tYWluKSk7CiAgICAgfQogCi0gICAgaWYgKG1Jc1ZpZGVvKSB7CisgICAgaWYgKG1Eb21haW4gPT0gRE9NQUlOX1ZJREVPKSB7CiAgICAgICAgIG1CYXR0ZXJ5Q2hlY2tlciA9IG5ldyBCYXR0ZXJ5Q2hlY2tlcihuZXcgQU1lc3NhZ2Uoa1doYXRDaGVja0JhdHRlcnlTdGF0cywgdGhpcykpOwogICAgIH0KIAotICAgIHN0YXR1c190IGVycjsKICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7Ci0gICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKHNlY3VyZUNvZGVjLCBtSXNWaWRlbykpOworICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZShzZWN1cmVDb2RlYywgdG9NZWRpYVJlc291cmNlU3ViVHlwZShtRG9tYWluKSkpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IGtNYXhSZXRyeTsgKytpKSB7CiAgICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIHJlY2xhaW0gcmVzb3VyY2UgZm9yIHRoZSBmaXJzdCB0aW1lLgpAQCAtMTUxMSw2ICsxNjQ4LDkgQEAKICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCB0aGlzKTsKIAorICAgIC8vIFRPRE86IHZhbGlkaXR5IGNoZWNrIGxvZy1zZXNzaW9uLWlkOiBpdCBzaG91bGQgYmUgYSAzMi1oZXgtZGlnaXQuCisgICAgZm9ybWF0LT5maW5kU3RyaW5nKCJsb2ctc2Vzc2lvbi1pZCIsICZtTG9nU2Vzc2lvbklkKTsKKwogICAgIGlmIChtTWV0cmljc0hhbmRsZSAhPSAwKSB7CiAgICAgICAgIGludDMyX3QgcHJvZmlsZSA9IDA7CiAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigicHJvZmlsZSIsICZwcm9maWxlKSkgewpAQCAtMTUyMiwyMSArMTY2MiwyMCBAQAogICAgICAgICB9CiAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjRW5jb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIENPTkZJR1VSRV9GTEFHX0VOQ09ERSkgPyAxIDogMCk7CisKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0xvZ1Nlc3Npb25JZCwgbUxvZ1Nlc3Npb25JZC5jX3N0cigpKTsKICAgICB9CiAKLSAgICBpZiAobUlzVmlkZW8pIHsKLSAgICAgICAgLy8gVE9ETzogdmFsaWRpdHkgY2hlY2sgbG9nLXNlc3Npb24taWQ6IGl0IHNob3VsZCBiZSBhIDMyLWhleC1kaWdpdC4KLSAgICAgICAgZm9ybWF0LT5maW5kU3RyaW5nKCJsb2ctc2Vzc2lvbi1pZCIsICZtTG9nU2Vzc2lvbklkKTsKLSAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJm1WaWRlb1dpZHRoKTsKLSAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZtVmlkZW9IZWlnaHQpOworICAgIGlmIChtRG9tYWluID09IERPTUFJTl9WSURFTyB8fCBtRG9tYWluID09IERPTUFJTl9JTUFHRSkgeworICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmbVdpZHRoKTsKKyAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZtSGVpZ2h0KTsKICAgICAgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigicm90YXRpb24tZGVncmVlcyIsICZtUm90YXRpb25EZWdyZWVzKSkgewogICAgICAgICAgICAgbVJvdGF0aW9uRGVncmVlcyA9IDA7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobU1ldHJpY3NIYW5kbGUgIT0gMCkgewotICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0xvZ1Nlc3Npb25JZCwgbUxvZ1Nlc3Npb25JZC5jX3N0cigpKTsKLSAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjV2lkdGgsIG1WaWRlb1dpZHRoKTsKLSAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjSGVpZ2h0LCBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNXaWR0aCwgbVdpZHRoKTsKKyAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjSGVpZ2h0LCBtSGVpZ2h0KTsKICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjUm90YXRpb24sIG1Sb3RhdGlvbkRlZ3JlZXMpOwogICAgICAgICAgICAgaW50MzJfdCBtYXhXaWR0aCA9IDA7CiAgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoIm1heC13aWR0aCIsICZtYXhXaWR0aCkpIHsKQEAgLTE1NTAsMjggKzE2ODksNDggQEAKICAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KSkgewogICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjQ29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsb2F0IGZyYW1lUmF0ZSA9IC0xLjA7Ci0gICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnJhbWVSYXRlKSkgewotICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXREb3VibGUobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0ZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgIGlmIChtRG9tYWluID09IERPTUFJTl9WSURFTykgeworICAgICAgICAgICAgICAgIGZsb2F0IGZyYW1lUmF0ZSA9IC0xLjA7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlIiwgJmZyYW1lUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldERvdWJsZShtTWV0cmljc0hhbmRsZSwga0NvZGVjRnJhbWVSYXRlLCBmcmFtZVJhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmbG9hdCBjYXB0dXJlUmF0ZSA9IC0xLjA7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEZsb2F0KCJjYXB0dXJlLXJhdGUiLCAmY2FwdHVyZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXREb3VibGUobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0NhcHR1cmVSYXRlLCBjYXB0dXJlUmF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZsb2F0IG9wZXJhdGluZ1JhdGUgPSAtMS4wOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRGbG9hdCgib3BlcmF0aW5nLXJhdGUiLCAmb3BlcmF0aW5nUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldERvdWJsZShtTWV0cmljc0hhbmRsZSwga0NvZGVjT3BlcmF0aW5nUmF0ZSwgb3BlcmF0aW5nUmF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoInByaW9yaXR5IiwgJnByaW9yaXR5KSkgeworICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1ByaW9yaXR5LCBwcmlvcml0eSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgZmxvYXQgY2FwdHVyZVJhdGUgPSAtMS4wOwotICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEZsb2F0KCJjYXB0dXJlLXJhdGUiLCAmY2FwdHVyZVJhdGUpKSB7Ci0gICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldERvdWJsZShtTWV0cmljc0hhbmRsZSwga0NvZGVjQ2FwdHVyZVJhdGUsIGNhcHR1cmVSYXRlKTsKKyAgICAgICAgICAgIGludDMyX3QgY29sb3JTdGFuZGFyZCA9IC0xOworICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9TVEFOREFSRCwgJmNvbG9yU3RhbmRhcmQpKSB7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNDb25maWdDb2xvclN0YW5kYXJkLCBjb2xvclN0YW5kYXJkKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsb2F0IG9wZXJhdGluZ1JhdGUgPSAtMS4wOwotICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEZsb2F0KCJvcGVyYXRpbmctcmF0ZSIsICZvcGVyYXRpbmdSYXRlKSkgewotICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXREb3VibGUobU1ldHJpY3NIYW5kbGUsIGtDb2RlY09wZXJhdGluZ1JhdGUsIG9wZXJhdGluZ1JhdGUpOworICAgICAgICAgICAgaW50MzJfdCBjb2xvclJhbmdlID0gLTE7CisgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1JBTkdFLCAmY29sb3JSYW5nZSkpIHsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0NvbmZpZ0NvbG9yUmFuZ2UsIGNvbG9yUmFuZ2UpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IC0xOwotICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJwcmlvcml0eSIsICZwcmlvcml0eSkpIHsKLSAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1ByaW9yaXR5LCBwcmlvcml0eSk7CisgICAgICAgICAgICBpbnQzMl90IGNvbG9yVHJhbnNmZXIgPSAtMTsKKyAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsICZjb2xvclRyYW5zZmVyKSkgeworICAgICAgICAgICAgICAgIG1Db25maWdDb2xvclRyYW5zZmVyID0gY29sb3JUcmFuc2ZlcjsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0NvbmZpZ0NvbG9yVHJhbnNmZXIsIGNvbG9yVHJhbnNmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSERSU3RhdGljSW5mbyBpbmZvOworICAgICAgICAgICAgaWYgKENvbG9yVXRpbHM6OmdldEhEUlN0YXRpY0luZm9Gcm9tRm9ybWF0KGZvcm1hdCwgJmluZm8pCisgICAgICAgICAgICAgICAgICAgICYmIENvbG9yVXRpbHM6OmlzSERSU3RhdGljSW5mb1ZhbGlkKCZpbmZvKSkgeworICAgICAgICAgICAgICAgIG1IRFJTdGF0aWNJbmZvID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIFByZXZlbnQgcG9zc2libGUgaW50ZWdlciBvdmVyZmxvdyBpbiBkb3duc3RyZWFtIGNvZGUuCi0gICAgICAgIGlmIChtVmlkZW9XaWR0aCA8IDAgfHwgbVZpZGVvSGVpZ2h0IDwgMCB8fAotICAgICAgICAgICAgICAgKHVpbnQ2NF90KW1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0ID4gKHVpbnQ2NF90KUlOVDMyX01BWCAvIDQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHNpemUocyksIHdpZHRoPSVkLCBoZWlnaHQ9JWQiLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgaWYgKG1XaWR0aCA8IDAgfHwgbUhlaWdodCA8IDAgfHwKKyAgICAgICAgICAgICAgICh1aW50NjRfdCltV2lkdGggKiBtSGVpZ2h0ID4gKHVpbnQ2NF90KUlOVDMyX01BWCAvIDQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHNpemUocyksIHdpZHRoPSVkLCBoZWlnaHQ9JWQiLCBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCkBAIC0xNjA0LDcgKzE3NjMsNyBAQAogICAgIH0KIAogICAgIC8vIHB1c2ggbWluL21heCBRUCB0byBNZWRpYU1ldHJpY3MgYWZ0ZXIgc2hhcGluZwotICAgIGlmIChtSXNWaWRlbyAmJiBtTWV0cmljc0hhbmRsZSAhPSAwKSB7CisgICAgaWYgKG1Eb21haW4gPT0gRE9NQUlOX1ZJREVPICYmIG1NZXRyaWNzSGFuZGxlICE9IDApIHsKICAgICAgICAgaW50MzJfdCBxcElNaW4gPSAtMTsKICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJ2aWRlby1xcC1pLW1pbiIsICZxcElNaW4pKSB7CiAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1JlcXVlc3RlZFZpZGVvUVBJTWluLCBxcElNaW4pOwpAQCAtMTY1Nyw3ICsxODE2LDggQEAKIAogICAgIHN0YXR1c190IGVycjsKICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7Ci0gICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKG1GbGFncyAmIGtGbGFnSXNTZWN1cmUsIG1Jc1ZpZGVvKSk7CisgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKG1GbGFncyAmIGtGbGFnSXNTZWN1cmUsCisgICAgICAgICAgICB0b01lZGlhUmVzb3VyY2VTdWJUeXBlKG1Eb21haW4pKSk7CiAgICAgLy8gRG9uJ3Qga25vdyB0aGUgYnVmZmVyIHNpemUgYXQgdGhpcyBwb2ludCwgYnV0IGl0J3MgZmluZSB0byB1c2UgMSBiZWNhdXNlCiAgICAgLy8gdGhlIHJlY2xhaW1SZXNvdXJjZSBjYWxsIGRvZXNuJ3QgY29uc2lkZXIgdGhlIHJlcXVlc3RlcidzIGJ1ZmZlciBzaXplIGZvciBub3cuCiAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlOjpHcmFwaGljTWVtb3J5UmVzb3VyY2UoMSkpOwpAQCAtMjA3OSw3ICsyMjM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBib29sIHJldmVyc2UpIHsKICAgICBBU3RyaW5nIG1lZGlhVHlwZTsKICAgICBpZiAoIWZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtZWRpYVR5cGUpKSB7Ci0gICAgICAgIEFMT0dXKCJtYXBGb3JtYXQ6IG5vIG1lZGlhVHlwZSBpbmZvcm1hdGlvbiIpOworICAgICAgICBBTE9HVigibWFwRm9ybWF0OiBubyBtZWRpYVR5cGUgaW5mb3JtYXRpb24iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBBTE9HVigibWFwRm9ybWF0OiBjb2RlYyAlcyBtZWRpYXR5cGUgJXMga2luZCAlcyByZXZlcnNlICVkIiwgY29tcG9uZW50TmFtZS5jX3N0cigpLApAQCAtMjIzOCw3ICsyMzk4LDcgQEAKIH0KIAogdWludDY0X3QgTWVkaWFDb2RlYzo6Z2V0R3JhcGhpY0J1ZmZlclNpemUoKSB7Ci0gICAgaWYgKCFtSXNWaWRlbykgeworICAgIGlmIChtRG9tYWluICE9IERPTUFJTl9WSURFTyAmJiBtRG9tYWluICE9IERPTUFJTl9JTUFHRSkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTIyNDYsNyArMjQwNiw3IEBACiAgICAgc2l6ZV90IHBvcnROdW0gPSBzaXplb2YobVBvcnRCdWZmZXJzKSAvIHNpemVvZigobVBvcnRCdWZmZXJzKVswXSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb3J0TnVtOyArK2kpIHsKICAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBqdXN0IGFuIGVzdGltYXRpb24sIHdlIHNob3VsZCBnZXQgdGhlIHJlYWwgYnVmZmVyIHNpemUgZnJvbSBBQ29kZWMuCi0gICAgICAgIHNpemUgKz0gbVBvcnRCdWZmZXJzW2ldLnNpemUoKSAqIG1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0ICogMyAvIDI7CisgICAgICAgIHNpemUgKz0gbVBvcnRCdWZmZXJzW2ldLnNpemUoKSAqIG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMjsKICAgICB9CiAgICAgcmV0dXJuIHNpemU7CiB9CkBAIC0yMjU4LDcgKzI0MTgsOCBAQAogCiAgICAgc3RhdHVzX3QgZXJyOwogICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKLSAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UobUZsYWdzICYga0ZsYWdJc1NlY3VyZSwgbUlzVmlkZW8pKTsKKyAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UobUZsYWdzICYga0ZsYWdJc1NlY3VyZSwKKyAgICAgICAgICAgIHRvTWVkaWFSZXNvdXJjZVN1YlR5cGUobURvbWFpbikpKTsKICAgICAvLyBEb24ndCBrbm93IHRoZSBidWZmZXIgc2l6ZSBhdCB0aGlzIHBvaW50LCBidXQgaXQncyBmaW5lIHRvIHVzZSAxIGJlY2F1c2UKICAgICAvLyB0aGUgcmVjbGFpbVJlc291cmNlIGNhbGwgZG9lc24ndCBjb25zaWRlciB0aGUgcmVxdWVzdGVyJ3MgYnVmZmVyIHNpemUgZm9yIG5vdy4KICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2U6OkdyYXBoaWNNZW1vcnlSZXNvdXJjZSgxKSk7CkBAIC0yNDYxLDcgKzI2MjIsOSBAQAogICAgIG1zZy0+c2V0T2JqZWN0KCJjMmJ1ZmZlciIsIG9iaik7CiAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgcHJlc2VudGF0aW9uVGltZVVzKTsKICAgICBtc2ctPnNldEludDMyKCJmbGFncyIsIGZsYWdzKTsKLSAgICBtc2ctPnNldE1lc3NhZ2UoInR1bmluZ3MiLCB0dW5pbmdzKTsKKyAgICBpZiAodHVuaW5ncyAmJiB0dW5pbmdzLT5jb3VudEVudHJpZXMoKSA+IDApIHsKKyAgICAgICAgbXNnLT5zZXRNZXNzYWdlKCJ0dW5pbmdzIiwgdHVuaW5ncyk7CisgICAgfQogICAgIG1zZy0+c2V0UG9pbnRlcigiZXJyb3JEZXRhaWxNc2ciLCBlcnJvckRldGFpbE1zZyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC0yNTAzLDcgKzI2NjYsOSBAQAogICAgIG1zZy0+c2V0SW50MzIoInNraXBCbG9ja3MiLCBwYXR0ZXJuLm1Ta2lwQmxvY2tzKTsKICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCBwcmVzZW50YXRpb25UaW1lVXMpOwogICAgIG1zZy0+c2V0SW50MzIoImZsYWdzIiwgZmxhZ3MpOwotICAgIG1zZy0+c2V0TWVzc2FnZSgidHVuaW5ncyIsIHR1bmluZ3MpOworICAgIGlmICh0dW5pbmdzICYmIHR1bmluZ3MtPmNvdW50RW50cmllcygpID4gMCkgeworICAgICAgICBtc2ctPnNldE1lc3NhZ2UoInR1bmluZ3MiLCB0dW5pbmdzKTsKKyAgICB9CiAgICAgbXNnLT5zZXRQb2ludGVyKCJlcnJvckRldGFpbE1zZyIsIGVycm9yRGV0YWlsTXNnKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKQEAgLTI5NzUsOCArMzE0MCw5IEBACiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhY3Rpb25Db2RlIiwgJmFjdGlvbkNvZGUpKTsKIAotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMgcmVwb3J0ZWQgZXJyICUjeCwgYWN0aW9uQ29kZSAlZCwgd2hpbGUgaW4gc3RhdGUgJWQvJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgYWN0aW9uQ29kZSwgbVN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMgcmVwb3J0ZWQgZXJyICUjeC8lcywgYWN0aW9uQ29kZSAlZCwgd2hpbGUgaW4gc3RhdGUgJWQvJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgU3RyTWVkaWFFcnJvcihlcnIpLmNfc3RyKCksIGFjdGlvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IERFQURfT0JKRUNUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdTYXdNZWRpYVNlcnZlckRpZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdJc0NvbXBvbmVudEFsbG9jYXRlZDsKQEAgLTMwMzIsMTAgKzMxOTgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVE9QUElORzoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdTYXdNZWRpYVNlcnZlckRpZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvc3RQZW5kaW5nUmVwbGllcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUkVMRUFTSU5HICYmICFtUmVwbHlJRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlJlbGVhc2luZyBhc3luY2hyb25vdXNseSwgc28gbm90aGluZyB0byByZXBseSBoZXJlLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVkaWFTZXJ2ZXIgZGllZCwgdGhlcmUgZGVmaW5pdGVseSB3b24ndAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBhIHNodXRkb3duIGNvbXBsZXRlIG5vdGlmaWNhdGlvbiBhZnRlcgpAQCAtMzA0OCw4ICszMjEyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUkVMRUFTSU5HKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3N0UGVuZGluZ1JlcGxpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXBseUlEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKG9yaWdpbiArICI6ZGVhZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm5vIHBlbmRpbmcgcmVwbGllczogJXM6ZGVhZCBmb2xsb3dpbmcgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luLmNfc3RyKCksIG1MYXN0UmVwbHlPcmlnaW4uY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVzcG9uc2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtUmVwbHlJRCkgewpAQCAtMzE4NSwxMCArMzM1MiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNTZWN1cmUsIDApOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1ZpZGVvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpbyBjb2RlYyBpcyBjdXJyZW50bHkgaWdub3JlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZU1hbmFnZXJQcm94eS0+YWRkUmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UobUZsYWdzICYga0ZsYWdJc1NlY3VyZSwgbUlzVmlkZW8pKTsKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXMgYXR0ciA9IG1Db2RlY0luZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1Db2RlY0luZm8tPmdldEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXMoMCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKGF0dHIgJiBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc1NvZnR3YXJlT25seSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvZnR3YXJlIGNvZGVjIGlzIGN1cnJlbnRseSBpZ25vcmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlTWFuYWdlclByb3h5LT5hZGRSZXNvdXJjZShNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmIGtGbGFnSXNTZWN1cmUsIHRvTWVkaWFSZXNvdXJjZVN1YlR5cGUobURvbWFpbikpKTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoImtXaGF0Q29tcG9uZW50QWxsb2NhdGVkIik7CkBAIC0zMjEyLDYgKzMzODIsOCBAQAogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJpbnB1dC1mb3JtYXQiLCAmbUlucHV0Rm9ybWF0KSk7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoIm91dHB1dC1mb3JtYXQiLCAmbU91dHB1dEZvcm1hdCkpOwogCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUhEUkZvcm1hdE1ldHJpYygpOworCiAgICAgICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRvIGNvbmZpcm1pbmcgdGhlIG9wdC1pbiBiZWhhdmlvciB0byBtaW5pbWl6ZSBhbnkgYmVoYXZpb3JhbCBjaGFuZ2UKICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdXJmYWNlICE9IG51bGxwdHIgJiYgIW1BbGxvd0ZyYW1lRHJvcHBpbmdCeVN1cmZhY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25hbCBmcmFtZSBkcm9wcGluZyBtb2RlIGluIHRoZSBpbnB1dCBmb3JtYXQgYXMgdGhpcyBtYXkgYWxzbyBiZQpAQCAtMzI5Myw2ICszNDY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUhEUkZvcm1hdE1ldHJpYygpOwogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sob2JqICE9IE5VTEwpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldE9iamVjdCgiaW5wdXQtc3VyZmFjZSIsIG9iaik7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSGF2ZUlucHV0U3VyZmFjZSA9IHRydWU7CkBAIC0zMzE3LDYgKzM0OTAsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiaW5wdXQtZm9ybWF0IiwgJm1JbnB1dEZvcm1hdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgib3V0cHV0LWZvcm1hdCIsICZtT3V0cHV0Rm9ybWF0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVIRFJGb3JtYXRNZXRyaWMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1IYXZlSW5wdXRTdXJmYWNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKQEAgLTMzNTQsNyArMzUyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIFNUQVJUSU5HKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1ZpZGVvKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRG9tYWluID09IERPTUFJTl9WSURFTyB8fCBtRG9tYWluID09IERPTUFJTl9JTUFHRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlTWFuYWdlclByb3h5LT5hZGRSZXNvdXJjZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6R3JhcGhpY01lbW9yeVJlc291cmNlKGdldEdyYXBoaWNCdWZmZXJTaXplKCkpKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzM3NywxMCArMzU1MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgVHVubmVsUGVla1N0YXRlIHByZXZpb3VzU3RhdGUgPSBtVHVubmVsUGVla1N0YXRlOwotICAgICAgICAgICAgICAgICAgICBtVHVubmVsUGVla1N0YXRlID0gVHVubmVsUGVla1N0YXRlOjprQnVmZmVyUmVuZGVyZWQ7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUdW5uZWxQZWVrU3RhdGU6ICVzIC0+ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcocHJldmlvdXNTdGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKFR1bm5lbFBlZWtTdGF0ZTo6a0J1ZmZlclJlbmRlcmVkKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtVHVubmVsUGVla1N0YXRlICE9IFR1bm5lbFBlZWtTdGF0ZTo6a0xlZ2FjeU1vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UdW5uZWxQZWVrU3RhdGUgPSBUdW5uZWxQZWVrU3RhdGU6OmtCdWZmZXJSZW5kZXJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUdW5uZWxQZWVrU3RhdGU6ICVzIC0+ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcocHJldmlvdXNTdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKFR1bm5lbFBlZWtTdGF0ZTo6a0J1ZmZlclJlbmRlcmVkKSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tEdXJhdGlvbihtc2cpOwogICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IHdlIGhhdmUgYSBub3RpZmljYXRpb24gc2V0CiAgICAgICAgICAgICAgICAgICAgIGlmIChtT25GcmFtZVJlbmRlcmVkTm90aWZpY2F0aW9uICE9IE5VTEwpIHsKQEAgLTM1MDIsNiArMzY3OCwyMCBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdERyYWluVGhpc0J1ZmZlcjoKICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgobUZsYWdzICYga0ZsYWdVc2VCbG9ja01vZGVsKSA9PSAwICYmIG1UdW5uZWxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJidWZmZXIiLCAmb2JqKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIgPSBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjQnVmZmVyICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gYXN5bmNocm9ub3VzIG1vZGUsIG91dHB1dCBmb3JtYXQgY2hhbmdlIGlzIHByb2Nlc3NlZCBpbW1lZGlhdGVseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPdXRwdXRGb3JtYXRDaGFuZ2VJZk5lZWRlZChidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyQ2hhbm5lbC0+ZGlzY2FyZEJ1ZmZlcihidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAvKiBzaXplX3QgaW5kZXggPSAqL3VwZGF0ZUJ1ZmZlcnMoa1BvcnRJbmRleE91dHB1dCwgbXNnKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IEZMVVNISU5HCkBAIC0zNzgzLDYgKzM5NzMsMTQgQEAKICAgICAgICAgICAgICAgICBtVHVubmVsZWQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gSWYgbVR1bm5lbFBlZWtTdGF0ZSBpcyBzdGlsbCBpbiBrTGVnYWN5TW9kZSBhdCB0aGlzIHBvaW50LAorICAgICAgICAgICAgLy8gY29uZmlndXJlIHRoZSBjb2RlYyBpbiBsZWdhY3kgbW9kZQorICAgICAgICAgICAgaWYgKG1UdW5uZWxlZCAmJiAobVR1bm5lbFBlZWtTdGF0ZSA9PSBUdW5uZWxQZWVrU3RhdGU6OmtMZWdhY3lNb2RlKSkgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiYW5kcm9pZC5fdHVubmVsLXBlZWstc2V0LWxlZ2FjeSIsIDEpOworICAgICAgICAgICAgICAgIG9uU2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpbnQzMl90IGJhY2tncm91bmQgPSAwOwogICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl9iYWNrZ3JvdW5kLW1vZGUiLCAmYmFja2dyb3VuZCkgJiYgYmFja2dyb3VuZCkgewogICAgICAgICAgICAgICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eShnZXR0aWQoKSwgQU5EUk9JRF9QUklPUklUWV9CQUNLR1JPVU5EKTsKQEAgLTM5MDEsMTAgKzQwOTksMTIgQEAKICAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogICAgICAgICAgICAgVHVubmVsUGVla1N0YXRlIHByZXZpb3VzU3RhdGUgPSBtVHVubmVsUGVla1N0YXRlOwotICAgICAgICAgICAgbVR1bm5lbFBlZWtTdGF0ZSA9IFR1bm5lbFBlZWtTdGF0ZTo6a0VuYWJsZWROb0J1ZmZlcjsKLSAgICAgICAgICAgIEFMT0dWKCJUdW5uZWxQZWVrU3RhdGU6ICVzIC0+ICVzIiwKLSAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHByZXZpb3VzU3RhdGUpLAotICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoVHVubmVsUGVla1N0YXRlOjprRW5hYmxlZE5vQnVmZmVyKSk7CisgICAgICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSAhPSBUdW5uZWxQZWVrU3RhdGU6OmtMZWdhY3lNb2RlKSB7CisgICAgICAgICAgICAgICAgbVR1bm5lbFBlZWtTdGF0ZSA9IFR1bm5lbFBlZWtTdGF0ZTo6a0VuYWJsZWROb0J1ZmZlcjsKKyAgICAgICAgICAgICAgICBBTE9HVigiVHVubmVsUGVla1N0YXRlOiAlcyAtPiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhwcmV2aW91c1N0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKFR1bm5lbFBlZWtTdGF0ZTo6a0VuYWJsZWROb0J1ZmZlcikpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtUmVwbHlJRCA9IHJlcGx5SUQ7CiAgICAgICAgICAgICBzZXRTdGF0ZShTVEFSVElORyk7CkBAIC00MDQ2LDI2ICs0MjQ2LDI5IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChhc3luY05vdGlmeSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtUmVsZWFzZVN1cmZhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHVzYWdlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZS0+Z2V0Q29uc3VtZXJVc2FnZSgmdXNhZ2UpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2VTdXJmYWNlLnJlc2V0KG5ldyBSZWxlYXNlU3VyZmFjZSh1c2FnZSkpOworICAgICAgICAgICAgYm9vbCBmb3JjZVN5bmMgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChhc3luY05vdGlmeSAhPSBudWxscHRyICYmIG1TdXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1SZWxlYXNlU3VyZmFjZSkgeworICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB1c2FnZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZS0+Z2V0Q29uc3VtZXJVc2FnZSgmdXNhZ2UpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TdXJmYWNlICE9IG1SZWxlYXNlU3VyZmFjZS0+Z2V0U3VyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25uZWN0VG9TdXJmYWNlKG1SZWxlYXNlU3VyZmFjZS0+Z2V0U3VyZmFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXX0lGKGVyciAhPSBPSywgImVycm9yIGNvbm5lY3RpbmcgdG8gcmVsZWFzZSBzdXJmYWNlOiBlcnIgPSAlZCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LICYmICEobUZsYWdzICYga0ZsYWdVc2VzU29mdHdhcmVSZW5kZXJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtQ29kZWMtPnNldFN1cmZhY2UobVJlbGVhc2VTdXJmYWNlLT5nZXRTdXJmYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXX0lGKGVyciAhPSBPSywgImVycm9yIHNldHRpbmcgcmVsZWFzZSBzdXJmYWNlOiBlcnIgPSAlZCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpZGlzY29ubmVjdEZyb21TdXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UgPSBtUmVsZWFzZVN1cmZhY2UtPmdldFN1cmZhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2VTdXJmYWNlLnJlc2V0KG5ldyBSZWxlYXNlU3VyZmFjZSh1c2FnZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVN1cmZhY2UgIT0gbVJlbGVhc2VTdXJmYWNlLT5nZXRTdXJmYWNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gY29ubmVjdFRvU3VyZmFjZShtUmVsZWFzZVN1cmZhY2UtPmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXX0lGKGVyciAhPSBPSywgImVycm9yIGNvbm5lY3RpbmcgdG8gcmVsZWFzZSBzdXJmYWNlOiBlcnIgPSAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgIShtRmxhZ3MgJiBrRmxhZ1VzZXNTb2Z0d2FyZVJlbmRlcmVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbUNvZGVjLT5zZXRTdXJmYWNlKG1SZWxlYXNlU3VyZmFjZS0+Z2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXX0lGKGVyciAhPSBPSywgImVycm9yIHNldHRpbmcgcmVsZWFzZSBzdXJmYWNlOiBlcnIgPSAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpZGlzY29ubmVjdEZyb21TdXJmYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZSA9IG1SZWxlYXNlU3VyZmFjZS0+Z2V0U3VyZmFjZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd2VyZSBub3QgYWJsZSB0byBzd2l0Y2ggdGhlIHN1cmZhY2UsIHNvIGZvcmNlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzeW5jaHJvbm91cyByZWxlYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VTeW5jID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTQwODksOCArNDI5MiwxMCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoYXN5bmNOb3RpZnkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIG1SZXNvdXJjZU1hbmFnZXJQcm94eS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKCk7Ci0gICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygia1doYXRSZWxlYXNlOmFzeW5jIik7CisgICAgICAgICAgICAgICAgaWYgKCFmb3JjZVN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlTWFuYWdlclByb3h5LT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwoKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygia1doYXRSZWxlYXNlOmFzeW5jIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGFzeW5jTm90aWZ5UG9zdC5jbGVhcigpOwogICAgICAgICAgICAgICAgIG1Bc3luY1JlbGVhc2VDb21wbGV0ZU5vdGlmaWNhdGlvbiA9IGFzeW5jTm90aWZ5OwogICAgICAgICAgICAgfQpAQCAtNDM0MCwxMCArNDU0NSwxMiBAQAogICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxGbHVzaCgpOwogICAgICAgICAgICAgcmV0dXJuQnVmZmVyc1RvQ29kZWMoKTsKICAgICAgICAgICAgIFR1bm5lbFBlZWtTdGF0ZSBwcmV2aW91c1N0YXRlID0gbVR1bm5lbFBlZWtTdGF0ZTsKLSAgICAgICAgICAgIG1UdW5uZWxQZWVrU3RhdGUgPSBUdW5uZWxQZWVrU3RhdGU6OmtFbmFibGVkTm9CdWZmZXI7Ci0gICAgICAgICAgICBBTE9HVigiVHVubmVsUGVla1N0YXRlOiAlcyAtPiAlcyIsCi0gICAgICAgICAgICAgICAgICBhc1N0cmluZyhwcmV2aW91c1N0YXRlKSwKLSAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKFR1bm5lbFBlZWtTdGF0ZTo6a0VuYWJsZWROb0J1ZmZlcikpOworICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RhdGUgIT0gVHVubmVsUGVla1N0YXRlOjprTGVnYWN5TW9kZSkgeworICAgICAgICAgICAgICAgIG1UdW5uZWxQZWVrU3RhdGUgPSBUdW5uZWxQZWVrU3RhdGU6OmtFbmFibGVkTm9CdWZmZXI7CisgICAgICAgICAgICAgICAgQUxPR1YoIlR1bm5lbFBlZWtTdGF0ZTogJXMgLT4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcocHJldmlvdXNTdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhUdW5uZWxQZWVrU3RhdGU6OmtFbmFibGVkTm9CdWZmZXIpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTQ0NzQsNiArNDY4MSw3IEBACiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRPYmplY3QoImNoYW5nZWRLZXlzIiwgY2hhbmdlZEtleXMpOwogICAgIH0KICAgICBtT3V0cHV0Rm9ybWF0ID0gZm9ybWF0OworICAgIHVwZGF0ZUhEUkZvcm1hdE1ldHJpYygpOwogICAgIG1hcEZvcm1hdChtQ29tcG9uZW50TmFtZSwgZm9ybWF0LCBudWxscHRyLCB0cnVlKTsKICAgICBBTE9HVigiWyVzXSBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgdG86ICVzIiwKICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKDQpLmNfc3RyKCkpOwpAQCAtNDQ5OSw2ICs0NzA3LDkgQEAKICAgICAgICAgICAgIEhEUlN0YXRpY0luZm8gaW5mbzsKICAgICAgICAgICAgIGlmIChDb2xvclV0aWxzOjpnZXRIRFJTdGF0aWNJbmZvRnJvbUZvcm1hdChtT3V0cHV0Rm9ybWF0LCAmaW5mbykpIHsKICAgICAgICAgICAgICAgICBzZXROYXRpdmVXaW5kb3dIZHJNZXRhZGF0YShtU3VyZmFjZS5nZXQoKSwgJmluZm8pOworICAgICAgICAgICAgICAgIGlmIChDb2xvclV0aWxzOjppc0hEUlN0YXRpY0luZm9WYWxpZCgmaW5mbykpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhEUlN0YXRpY0luZm8gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC00NTA3LDYgKzQ3MTgsNyBAQAogICAgICAgICAgICAgICAgICYmIGhkcjEwUGx1c0luZm8gIT0gbnVsbHB0ciAmJiBoZHIxMFBsdXNJbmZvLT5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2hkcjEwX3BsdXNfbWV0YWRhdGEobVN1cmZhY2UuZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPnNpemUoKSwgaGRyMTBQbHVzSW5mby0+ZGF0YSgpKTsKKyAgICAgICAgICAgIG1IRFIxMFBsdXNJbmZvID0gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJ2aWRlby8iKSkgewpAQCAtNDU1MSw2ICs0NzYzLDIxIEBACiAgICAgICAgICAgICBtQ3J5cHRvLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOwogICAgICAgICB9CiAgICAgfQorCisgICAgaWYgKG1NZXRyaWNzSGFuZGxlICE9IDApIHsKKyAgICAgICAgaW50MzJfdCBjb2xvclN0YW5kYXJkID0gLTE7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsICZjb2xvclN0YW5kYXJkKSkgeworICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNQYXJzZWRDb2xvclN0YW5kYXJkLCBjb2xvclN0YW5kYXJkKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGNvbG9yUmFuZ2UgPSAtMTsKKyAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCBLRVlfQ09MT1JfUkFOR0UsICZjb2xvclJhbmdlKSkgeworICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNQYXJzZWRDb2xvclJhbmdlLCBjb2xvclJhbmdlKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGNvbG9yVHJhbnNmZXIgPSAtMTsKKyAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgJmNvbG9yVHJhbnNmZXIpKSB7CisgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1BhcnNlZENvbG9yVHJhbnNmZXIsIGNvbG9yVHJhbnNmZXIpOworICAgICAgICB9CisgICAgfQogfQogCiB2b2lkIE1lZGlhQ29kZWM6OmV4dHJhY3RDU0QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKQEAgLTQ1ODAsNyArNDgwNyw2IEBACiAgICAgbUNTRC5lcmFzZShtQ1NELmJlZ2luKCkpOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXI7CiAgICAgc3A8aGFyZHdhcmU6OkhpZGxNZW1vcnk+IG1lbW9yeTsKLSAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKIAogICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1VzZUJsb2NrTW9kZWwpIHsKICAgICAgICAgaWYgKGhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSkgewpAQCAtNDYwMSw3ICs0ODI3LDYgQEAKICAgICAgICAgICAgIG1lbWNweShtZW0tPnVuc2VjdXJlUG9pbnRlcigpLCBjc2QtPmRhdGEoKSwgY3NkLT5zaXplKCkpOwogICAgICAgICAgICAgc3NpemVfdCBoZWFwT2Zmc2V0OwogICAgICAgICAgICAgbWVtb3J5ID0gaGFyZHdhcmU6OmZyb21IZWFwKG1lbS0+Z2V0TWVtb3J5KCZoZWFwT2Zmc2V0LCBudWxscHRyKSk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gaGVhcE9mZnNldDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jayA9CiAgICAgICAgICAgICAgICAgRmV0Y2hMaW5lYXJCbG9jayhjc2QtPnNpemUoKSwge3N0ZDo6c3RyaW5ne21Db21wb25lbnROYW1lLmNfc3RyKCl9fSk7CkBAIC00NjQzLDEyICs0ODY4LDEwIEBACiAgICAgICAgIHNwPFdyYXBwZXJPYmplY3Q8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4+IG9iansKICAgICAgICAgICAgIG5ldyBXcmFwcGVyT2JqZWN0PHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+e2MyQnVmZmVyfX07CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KCJjMmJ1ZmZlciIsIG9iaik7Ci0gICAgICAgIG1zZy0+c2V0TWVzc2FnZSgidHVuaW5ncyIsIG5ldyBBTWVzc2FnZSk7CiAgICAgfSBlbHNlIGlmIChtZW1vcnkpIHsKICAgICAgICAgc3A8V3JhcHBlck9iamVjdDxzcDxoYXJkd2FyZTo6SGlkbE1lbW9yeT4+PiBvYmp7CiAgICAgICAgICAgICBuZXcgV3JhcHBlck9iamVjdDxzcDxoYXJkd2FyZTo6SGlkbE1lbW9yeT4+e21lbW9yeX19OwogICAgICAgICBtc2ctPnNldE9iamVjdCgibWVtb3J5Iiwgb2JqKTsKLSAgICAgICAgbXNnLT5zZXRNZXNzYWdlKCJ0dW5pbmdzIiwgbmV3IEFNZXNzYWdlKTsKICAgICB9CiAKICAgICByZXR1cm4gb25RdWV1ZUlucHV0QnVmZmVyKG1zZyk7CkBAIC00Nzc1LDggKzQ5OTgsOCBAQAogICAgIH0KICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlczsKICAgICBzaXplX3QgbnVtU3ViU2FtcGxlczsKLSAgICBjb25zdCB1aW50OF90ICprZXk7Ci0gICAgY29uc3QgdWludDhfdCAqaXY7CisgICAgY29uc3QgdWludDhfdCAqa2V5ID0gTlVMTDsKKyAgICBjb25zdCB1aW50OF90ICppdiA9IE5VTEw7CiAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUgPSBDcnlwdG9QbHVnaW46OmtNb2RlX1VuZW5jcnlwdGVkOwogCiAgICAgLy8gV2UgYWxsb3cgdGhlIHNpbXBsZXIgcXVldWVJbnB1dEJ1ZmZlciBBUEkgdG8gYmUgdXNlZCBldmVuIGluCkBAIC00NzkxLDggKzUwMTQsNiBAQAogCiAgICAgICAgICAgICBzdWJTYW1wbGVzID0gJnNzOwogICAgICAgICAgICAgbnVtU3ViU2FtcGxlcyA9IDE7Ci0gICAgICAgICAgICBrZXkgPSBOVUxMOwotICAgICAgICAgICAgaXYgPSBOVUxMOwogICAgICAgICAgICAgcGF0dGVybi5tRW5jcnlwdEJsb2NrcyA9IDA7CiAgICAgICAgICAgICBwYXR0ZXJuLm1Ta2lwQmxvY2tzID0gMDsKICAgICAgICAgfQpAQCAtNDgzMCw5ICs1MDUxLDEwIEBACiAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyID0gaW5mby0+bURhdGE7CiAKICAgICBpZiAoYzJCdWZmZXIgfHwgbWVtb3J5KSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiB0dW5pbmdzOwotICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJ0dW5pbmdzIiwgJnR1bmluZ3MpKTsKLSAgICAgICAgb25TZXRQYXJhbWV0ZXJzKHR1bmluZ3MpOworICAgICAgICBzcDxBTWVzc2FnZT4gdHVuaW5ncyA9IE5VTEw7CisgICAgICAgIGlmIChtc2ctPmZpbmRNZXNzYWdlKCJ0dW5pbmdzIiwgJnR1bmluZ3MpICYmIHR1bmluZ3MgIT0gTlVMTCkgeworICAgICAgICAgICAgb25TZXRQYXJhbWV0ZXJzKHR1bmluZ3MpOworICAgICAgICB9CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgICAgIGlmIChjMkJ1ZmZlcikgewpAQCAtNDg2NCw2ICs1MDg2LDggQEAKICAgICAgICAgb2Zmc2V0ID0gYnVmZmVyLT5vZmZzZXQoKTsKICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HSSgiYmxvY2sgbW9kZWwgYnVmZmVyIGF0dGFjaCBmYWlsZWQ6IGVyciA9ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgU3RyTWVkaWFFcnJvcihlcnIpLmNfc3RyKCksIGVycik7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCmluZGV4IDYyNDM4MjguLmEzMDQwZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKQEAgLTE4LDggKzE4LDYgQEAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY0xpc3QiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oIgotCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CkBAIC0zNCw2ICszMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ0NvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWMySW5mb0J1aWxkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CkBAIC01MDksNiArNTA4LDI5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBwcm9maWxlID0gLTE7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigicHJvZmlsZSIsICZwcm9maWxlKSkgeworICAgICAgICAgICAgaW50MzJfdCBsZXZlbCA9IC0xOworICAgICAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoImxldmVsIiwgJmxldmVsKTsKKyAgICAgICAgICAgIFZlY3RvcjxNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsPiBwcm9maWxlTGV2ZWxzOworICAgICAgICAgICAgY2FwYWJpbGl0aWVzLT5nZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKCZwcm9maWxlTGV2ZWxzKTsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBwcm9maWxlTGV2ZWxzLmJlZ2luKCk7CisgICAgICAgICAgICBmb3IgKDsgaXQgIT0gcHJvZmlsZUxldmVscy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlICE9IGl0LT5tUHJvZmlsZSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxldmVsID4gLTEgJiYgbGV2ZWwgPiBpdC0+bUxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGl0ID09IHByb2ZpbGVMZXZlbHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiQ29kZWMgZG9lcyBub3Qgc3VwcG9ydCBwcm9maWxlICVkIHdpdGggbGV2ZWwgJWQiLCBwcm9maWxlLCBsZXZlbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gaGF2ZW4ndCBmb3VuZCBhIHJlYXNvbiB0byBkaXNjYXJkIHRoaXMgb25lCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKaW5kZXggNGExNjdkMS4uOTMwNGU0NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcApAQCAtMTgsOCArMTgsNiBAQAogI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcyIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmgiCi0KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgpAQCAtMzAsNiArMjgsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKaW5kZXggMDEwN2MzMi4uYjA3ZjhmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKQEAgLTk0MywxMCArOTQzLDE3IEBACiAKICAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IG91dGJ1ZjsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1FbmNvZGVyLT5nZXRPdXRwdXRCdWZmZXIoaW5kZXgsICZvdXRidWYpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSyB8fCBvdXRidWYgPT0gTlVMTCB8fCBvdXRidWYtPmRhdGEoKSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgfHwgb3V0YnVmLT5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGVyciAhPSBPSyB8fCBvdXRidWYgPT0gTlVMTCB8fCBvdXRidWYtPmRhdGEoKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgc2lnbmFsRU9TKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG91dGJ1Zi0+c2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBaZXJvIGxlbmd0aCBDU0QgYnVmZmVycyBhcmUgbm90IHRyZWF0ZWQgYXMgYW4gZXJyb3IKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRykgeworICAgICAgICAgICAgICAgICAgICBtRW5jb2Rlci0+cmVsZWFzZU91dHB1dEJ1ZmZlcihpbmRleCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbmFsRU9TKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWYgPSBuZXcgTWVkaWFCdWZmZXIob3V0YnVmLT5zaXplKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ1dyaXRlci5jcHAKaW5kZXggMGJjNTk3Ni4uMGY1ZTk1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dXcml0ZXIuY3BwCkBAIC02Nyw3ICs2NywxMSBAQAogICAgICAgICBtRmQgPSAtMTsKICAgICB9CiAKLSAgICBmcmVlKG1Pcyk7CisgICAgaWYgKG1PcyAhPSBudWxscHRyKSB7CisgICAgICAgIG9nZ19zdHJlYW1fY2xlYXIobU9zKTsKKyAgICAgICAgZnJlZShtT3MpOworICAgICAgICBtT3MgPSBudWxscHRyOworICAgIH0KIH0KIAogc3RhdHVzX3QgT2dnV3JpdGVyOjppbml0Q2hlY2soKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwCmluZGV4IGVlOTAxNmQuLmRlOTE1MzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwCkBAIC0xNDUsNyArMTQ1LDE5IEBACiAgICAgaWYgKGF2YWlsYWJsZSA8IG51bSkgewogICAgICAgICBpbnQzMl90IG5ld2NhcGFjaXR5ID0gbUNhcGFjaXR5ICsgKG51bSAtIGF2YWlsYWJsZSk7CiAgICAgICAgIGNoYXIgKiBuZXdidWZmZXIgPSBuZXcgY2hhcltuZXdjYXBhY2l0eV07Ci0gICAgICAgIG1lbWNweShuZXdidWZmZXIsIG1DdXRCdWZmZXIsIG1DYXBhY2l0eSk7CisgICAgICAgIGlmIChtV3JpdGVIZWFkIDwgbVJlYWRIZWFkKSB7CisgICAgICAgICAgICAvLyBkYXRhIGlzbid0IGNvbnRpbnVvdXMsIG5lZWQgdG8gbWVtY3B5IHR3aWNlCisgICAgICAgICAgICAvLyB0byBtb3ZlIHByZXZpb3VzIGRhdGEgdG8gbmV3IGJ1ZmZlci4KKyAgICAgICAgICAgIHNpemVfdCBjb3B5TGVmdCA9IG1DYXBhY2l0eSAtIG1SZWFkSGVhZDsKKyAgICAgICAgICAgIG1lbWNweShuZXdidWZmZXIsIG1DdXRCdWZmZXIgKyBtUmVhZEhlYWQsIGNvcHlMZWZ0KTsKKyAgICAgICAgICAgIG1lbWNweShuZXdidWZmZXIgKyBjb3B5TGVmdCwgbUN1dEJ1ZmZlciwgbVdyaXRlSGVhZCk7CisgICAgICAgICAgICBtUmVhZEhlYWQgPSAwOworICAgICAgICAgICAgbVdyaXRlSGVhZCArPSBjb3B5TGVmdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShuZXdidWZmZXIsIG1DdXRCdWZmZXIgKyBtUmVhZEhlYWQsIG1Xcml0ZUhlYWQgLSBtUmVhZEhlYWQpOworICAgICAgICAgICAgbVdyaXRlSGVhZCAtPSBtUmVhZEhlYWQ7CisgICAgICAgICAgICBtUmVhZEhlYWQgPSAwOworICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSBbXSBtQ3V0QnVmZmVyOwogICAgICAgICBtQ2FwYWNpdHkgPSBuZXdjYXBhY2l0eTsKICAgICAgICAgbUN1dEJ1ZmZlciA9IG5ld2J1ZmZlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORwppbmRleCA3Y2UyOTY4Li4yMjg4NWM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVEVTVF9NQVBQSU5HCkBAIC0xMyw3ICsxMywxOCBAQAogCiAgICJwcmVzdWJtaXQtbGFyZ2UiOiBbCiAgICAgewotICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFUZXN0Q2FzZXMiLAorICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFNaXNjVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhQXVkaW9UZXN0Q2FzZXMiLAogICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgIHsKICAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQiCkBAIC0yMywxMCArMzQsNTQgQEAKICAgICAgICAgfSwKICAgICAgICAgLy8gVE9ETzogYi8xNDkzMTQ0MTkKICAgICAgICAgewotICAgICAgICAgICJleGNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5BdWRpb1BsYXliYWNrQ2FwdHVyZVRlc3QiCisgICAgICAgICAgImV4Y2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuYXVkaW8uY3RzLkF1ZGlvUGxheWJhY2tDYXB0dXJlVGVzdCIKICAgICAgICAgfSwKICAgICAgICAgewotICAgICAgICAgICJleGNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5BdWRpb1JlY29yZFRlc3QiCisgICAgICAgICAgImV4Y2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuYXVkaW8uY3RzLkF1ZGlvUmVjb3JkVGVzdCIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFEZWNvZGVyVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhRW5jb2RlclRlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJleGNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNNZWRpYUNvZGVjVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhUGxheWVyVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCiAgICAgICAgIH0KICAgICAgIF0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKaW5kZXggNGMxOGY4Ny4uYTQ0M2VkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcApAQCAtMjgsOSArMjgsNiBAQAogI2luY2x1ZGUgImluY2x1ZGUvSGV2Y1V0aWxzLmgiCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9WaWRlb0V4dC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC01Nyw2ICs1NCwxNCBAQAogI2RlZmluZSBBTUVESUFGT1JNQVRfS0VZX01QRUdIX0NPTVBBVElCTEVfU0VUUyBcCiAgICJtcGVnaC1jb21wYXRpYmxlLXNldHMiCiAKK25hbWVzcGFjZSB7CisgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgcG9zc2libHkgYmUgaGFuZGxlZCBpbiBhbiBlbHNlCisgICAgY29uc3RleHByIHN0YXRpYyBpbnQzMl90IEFBQ09iamVjdE51bGwgPSAwOworCisgICAgLy8gVE9ETzogZGVjaWRlIGlmIHdlIHNob3VsZCBqdXN0IG5vdCB0cmFuc21pdCB0aGUgbGV2ZWwgaW4gdGhpcyBjYXNlCisgICAgY29uc3RleHByIHN0YXRpYyBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxVbmtub3duID0gMDsKK30KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgc3RhdHVzX3QgY29weU5BTFVUb0FCdWZmZXIoc3A8QUJ1ZmZlcj4gKmJ1ZmZlciwgY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3QgbGVuZ3RoKSB7CkBAIC0xMjEsMTQgKzEyNiwxMCBAQAogICAgIH0KIH0KIAotc3RhdGljIGJvb2wgaXNIZHIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKLSAgICAvLyBpZiBDU0Qgc3BlY2lmaWVzIEhEUiB0cmFuc2ZlcihzKSwgd2UgYXNzdW1lIEhEUi4gT3RoZXJ3aXNlLCBpZiBpdCBzcGVjaWZpZXMgbm9uLUhEUgotICAgIC8vIHRyYW5zZmVycywgd2UgbXVzdCBhc3N1bWUgbm9uLUhEUi4gVGhpcyBpcyBiZWNhdXNlIENTRCB0cnVtcHMgYW55IGNvbG9yLXRyYW5zZmVyIGtleQotICAgIC8vIGluIHRoZSBmb3JtYXQuCi0gICAgaW50MzJfdCBpc0hkcjsKLSAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoImFuZHJvaWQuX2lzLWhkciIsICZpc0hkcikpIHsKLSAgICAgICAgcmV0dXJuIGlzSGRyOwotICAgIH0KKy8qKgorICogUmV0dXJucyB0cnVlIGlmLCBhbmQgb25seSBpZiwgdGhlIGdpdmVuIGZvcm1hdCBjb3JyZXNwb25kcyB0byBIRFIxMCBvciBIRFIxMCsuCisgKi8KK3N0YXRpYyBib29sIGlzSGRyMTBvcjEwUGx1cyhjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewogCiAgICAgLy8gaWYgdXNlci9jb250YWluZXIgc3VwcGxpZWQgSERSIHN0YXRpYyBpbmZvIHdpdGhvdXQgdHJhbnNmZXIgc2V0LCBhc3N1bWUgdHJ1ZQogICAgIGlmICgoZm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikgfHwgZm9ybWF0LT5jb250YWlucygiaGRyMTAtcGx1cy1pbmZvIikpCkBAIC0xMzgsOCArMTM5LDcgQEAKICAgICAvLyBvdGhlcndpc2UsIHZlcmlmeSB0aGF0IGFuIEhEUiB0cmFuc2ZlciBmdW5jdGlvbiBpcyBzZXQKICAgICBpbnQzMl90IHRyYW5zZmVyOwogICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItdHJhbnNmZXIiLCAmdHJhbnNmZXIpKSB7Ci0gICAgICAgIHJldHVybiB0cmFuc2ZlciA9PSBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclNUMjA4NAotICAgICAgICAgICAgICAgIHx8IHRyYW5zZmVyID09IENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVySExHOworICAgICAgICByZXR1cm4gdHJhbnNmZXIgPT0gQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJTVDIwODQ7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KQEAgLTE1NiwyMSArMTU2LDIyIEBACiAgICAgICAgIGF1ZGlvT2JqZWN0VHlwZSA+Pj0gMTE7CiAgICAgfQogCi0gICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDE2X3QsIE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRT4gcHJvZmlsZXMgewotICAgICAgICB7IDEsICBPTVhfQVVESU9fQUFDT2JqZWN0TWFpbiAgICAgfSwKLSAgICAgICAgeyAyLCAgT01YX0FVRElPX0FBQ09iamVjdExDICAgICAgIH0sCi0gICAgICAgIHsgMywgIE9NWF9BVURJT19BQUNPYmplY3RTU1IgICAgICB9LAotICAgICAgICB7IDQsICBPTVhfQVVESU9fQUFDT2JqZWN0TFRQICAgICAgfSwKLSAgICAgICAgeyA1LCAgT01YX0FVRElPX0FBQ09iamVjdEhFICAgICAgIH0sCi0gICAgICAgIHsgNiwgIE9NWF9BVURJT19BQUNPYmplY3RTY2FsYWJsZSB9LAotICAgICAgICB7IDE3LCBPTVhfQVVESU9fQUFDT2JqZWN0RVJMQyAgICAgfSwKLSAgICAgICAgeyAyMywgT01YX0FVRElPX0FBQ09iamVjdExEICAgICAgIH0sCi0gICAgICAgIHsgMjksIE9NWF9BVURJT19BQUNPYmplY3RIRV9QUyAgICB9LAotICAgICAgICB7IDM5LCBPTVhfQVVESU9fQUFDT2JqZWN0RUxEICAgICAgfSwKLSAgICAgICAgeyA0MiwgT01YX0FVRElPX0FBQ09iamVjdFhIRSAgICAgIH0sCisKKyAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50MTZfdCwgaW50MzJfdD4gcHJvZmlsZXMgeworICAgICAgICB7IDEsICBBQUNPYmplY3RNYWluICAgICB9LAorICAgICAgICB7IDIsICBBQUNPYmplY3RMQyAgICAgICB9LAorICAgICAgICB7IDMsICBBQUNPYmplY3RTU1IgICAgICB9LAorICAgICAgICB7IDQsICBBQUNPYmplY3RMVFAgICAgICB9LAorICAgICAgICB7IDUsICBBQUNPYmplY3RIRSAgICAgICB9LAorICAgICAgICB7IDYsICBBQUNPYmplY3RTY2FsYWJsZSB9LAorICAgICAgICB7IDE3LCBBQUNPYmplY3RFUkxDICAgICB9LAorICAgICAgICB7IDIzLCBBQUNPYmplY3RMRCAgICAgICB9LAorICAgICAgICB7IDI5LCBBQUNPYmplY3RIRV9QUyAgICB9LAorICAgICAgICB7IDM5LCBBQUNPYmplY3RFTEQgICAgICB9LAorICAgICAgICB7IDQyLCBBQUNPYmplY3RYSEUgICAgICB9LAogICAgIH07CiAKLSAgICBPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUgcHJvZmlsZTsKKyAgICBpbnQzMl90IHByb2ZpbGU7CiAgICAgaWYgKHByb2ZpbGVzLm1hcChhdWRpb09iamVjdFR5cGUsICZwcm9maWxlKSkgewogICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm9maWxlIiwgcHJvZmlsZSk7CiAgICAgfQpAQCAtMTg0LDU5ICsxODUsOTIgQEAKICAgICBjb25zdCB1aW50OF90IGNvbnN0cmFpbnRzID0gcHRyWzJdOwogICAgIGNvbnN0IHVpbnQ4X3QgbGV2ZWwgPSBwdHJbM107CiAKLSAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fQVZDTEVWRUxUWVBFPiBsZXZlbHMgewotICAgICAgICB7ICA5LCBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LCAvLyB0ZWNobmljYWxseSwgOSBpcyBvbmx5IHVzZWQgZm9yIEhpZ2grIHByb2ZpbGVzCi0gICAgICAgIHsgMTAsIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCi0gICAgICAgIHsgMTEsIE9NWF9WSURFT19BVkNMZXZlbDExIH0sIC8vIHByZWZlciBsZXZlbCAxLjEgZm9yIHRoZSB2YWx1ZSAxMQotICAgICAgICB7IDExLCBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAotICAgICAgICB7IDEyLCBPTVhfVklERU9fQVZDTGV2ZWwxMiB9LAotICAgICAgICB7IDEzLCBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAotICAgICAgICB7IDIwLCBPTVhfVklERU9fQVZDTGV2ZWwyICB9LAotICAgICAgICB7IDIxLCBPTVhfVklERU9fQVZDTGV2ZWwyMSB9LAotICAgICAgICB7IDIyLCBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAotICAgICAgICB7IDMwLCBPTVhfVklERU9fQVZDTGV2ZWwzICB9LAotICAgICAgICB7IDMxLCBPTVhfVklERU9fQVZDTGV2ZWwzMSB9LAotICAgICAgICB7IDMyLCBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAotICAgICAgICB7IDQwLCBPTVhfVklERU9fQVZDTGV2ZWw0ICB9LAotICAgICAgICB7IDQxLCBPTVhfVklERU9fQVZDTGV2ZWw0MSB9LAotICAgICAgICB7IDQyLCBPTVhfVklERU9fQVZDTGV2ZWw0MiB9LAotICAgICAgICB7IDUwLCBPTVhfVklERU9fQVZDTGV2ZWw1ICB9LAotICAgICAgICB7IDUxLCBPTVhfVklERU9fQVZDTGV2ZWw1MSB9LAotICAgICAgICB7IDUyLCBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAotICAgICAgICB7IDYwLCBPTVhfVklERU9fQVZDTGV2ZWw2ICB9LAotICAgICAgICB7IDYxLCBPTVhfVklERU9fQVZDTGV2ZWw2MSB9LAotICAgICAgICB7IDYyLCBPTVhfVklERU9fQVZDTGV2ZWw2MiB9LAorICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+IGxldmVscyB7CisgICAgICAgIHsgIDksIEFWQ0xldmVsMWIgfSwgLy8gdGVjaG5pY2FsbHksIDkgaXMgb25seSB1c2VkIGZvciBIaWdoKyBwcm9maWxlcworICAgICAgICB7IDEwLCBBVkNMZXZlbDEgIH0sCisgICAgICAgIHsgMTEsIEFWQ0xldmVsMTEgfSwgLy8gcHJlZmVyIGxldmVsIDEuMSBmb3IgdGhlIHZhbHVlIDExCisgICAgICAgIHsgMTEsIEFWQ0xldmVsMWIgfSwKKyAgICAgICAgeyAxMiwgQVZDTGV2ZWwxMiB9LAorICAgICAgICB7IDEzLCBBVkNMZXZlbDEzIH0sCisgICAgICAgIHsgMjAsIEFWQ0xldmVsMiAgfSwKKyAgICAgICAgeyAyMSwgQVZDTGV2ZWwyMSB9LAorICAgICAgICB7IDIyLCBBVkNMZXZlbDIyIH0sCisgICAgICAgIHsgMzAsIEFWQ0xldmVsMyAgfSwKKyAgICAgICAgeyAzMSwgQVZDTGV2ZWwzMSB9LAorICAgICAgICB7IDMyLCBBVkNMZXZlbDMyIH0sCisgICAgICAgIHsgNDAsIEFWQ0xldmVsNCAgfSwKKyAgICAgICAgeyA0MSwgQVZDTGV2ZWw0MSB9LAorICAgICAgICB7IDQyLCBBVkNMZXZlbDQyIH0sCisgICAgICAgIHsgNTAsIEFWQ0xldmVsNSAgfSwKKyAgICAgICAgeyA1MSwgQVZDTGV2ZWw1MSB9LAorICAgICAgICB7IDUyLCBBVkNMZXZlbDUyIH0sCisgICAgICAgIHsgNjAsIEFWQ0xldmVsNiAgfSwKKyAgICAgICAgeyA2MSwgQVZDTGV2ZWw2MSB9LAorICAgICAgICB7IDYyLCBBVkNMZXZlbDYyIH0sCiAgICAgfTsKLSAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fQVZDUFJPRklMRVRZUEU+IHByb2ZpbGVzIHsKLSAgICAgICAgeyA2NiwgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSB9LAotICAgICAgICB7IDc3LCBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4gICAgIH0sCi0gICAgICAgIHsgODgsIE9NWF9WSURFT19BVkNQcm9maWxlRXh0ZW5kZWQgfSwKLSAgICAgICAgeyAxMDAsIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCAgICB9LAotICAgICAgICB7IDExMCwgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoMTAgIH0sCi0gICAgICAgIHsgMTIyLCBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g0MjIgfSwKLSAgICAgICAgeyAyNDQsIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDQ0NCB9LAorICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+IHByb2ZpbGVzIHsKKyAgICAgICAgeyA2NiwgQVZDUHJvZmlsZUJhc2VsaW5lIH0sCisgICAgICAgIHsgNzcsIEFWQ1Byb2ZpbGVNYWluICAgICB9LAorICAgICAgICB7IDg4LCBBVkNQcm9maWxlRXh0ZW5kZWQgfSwKKyAgICAgICAgeyAxMDAsIEFWQ1Byb2ZpbGVIaWdoICAgIH0sCisgICAgICAgIHsgMTEwLCBBVkNQcm9maWxlSGlnaDEwICB9LAorICAgICAgICB7IDEyMiwgQVZDUHJvZmlsZUhpZ2g0MjIgfSwKKyAgICAgICAgeyAyNDQsIEFWQ1Byb2ZpbGVIaWdoNDQ0IH0sCiAgICAgfTsKIAogICAgIC8vIHNldCBwcm9maWxlICYgbGV2ZWwgaWYgdGhleSBhcmUgcmVjb2duaXplZAotICAgIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSBjb2RlY1Byb2ZpbGU7Ci0gICAgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSBjb2RlY0xldmVsOworICAgIGludDMyX3QgY29kZWNQcm9maWxlOworICAgIGludDMyX3QgY29kZWNMZXZlbDsKICAgICBpZiAocHJvZmlsZXMubWFwKHByb2ZpbGUsICZjb2RlY1Byb2ZpbGUpKSB7CiAgICAgICAgIGlmIChwcm9maWxlID09IDY2ICYmIChjb25zdHJhaW50cyAmIDB4NDApKSB7Ci0gICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSAoT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFKU9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRCYXNlbGluZTsKKyAgICAgICAgICAgIGNvZGVjUHJvZmlsZSA9IEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lOwogICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gMTAwICYmIChjb25zdHJhaW50cyAmIDB4MEMpID09IDB4MEMpIHsKLSAgICAgICAgICAgIGNvZGVjUHJvZmlsZSA9IChPTVhfVklERU9fQVZDUFJPRklMRVRZUEUpT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2g7CisgICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSBBVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoOwogICAgICAgICB9CiAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInByb2ZpbGUiLCBjb2RlY1Byb2ZpbGUpOwogICAgICAgICBpZiAobGV2ZWxzLm1hcChsZXZlbCwgJmNvZGVjTGV2ZWwpKSB7CiAgICAgICAgICAgICAvLyBmb3IgOSAmJiAxMSBkZWNpZGUgbGV2ZWwgYmFzZWQgb24gcHJvZmlsZSBhbmQgY29uc3RyYWludF9zZXQzIGZsYWcKICAgICAgICAgICAgIGlmIChsZXZlbCA9PSAxMSAmJiAocHJvZmlsZSA9PSA2NiB8fCBwcm9maWxlID09IDc3IHx8IHByb2ZpbGUgPT0gODgpKSB7Ci0gICAgICAgICAgICAgICAgY29kZWNMZXZlbCA9IChjb25zdHJhaW50cyAmIDB4MTApID8gT01YX1ZJREVPX0FWQ0xldmVsMWIgOiBPTVhfVklERU9fQVZDTGV2ZWwxMTsKKyAgICAgICAgICAgICAgICBjb2RlY0xldmVsID0gKGNvbnN0cmFpbnRzICYgMHgxMCkgPyBBVkNMZXZlbDFiIDogQVZDTGV2ZWwxMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImxldmVsIiwgY29kZWNMZXZlbCk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKK3N0YXRpYyBjb25zdCBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+JiAgZ2V0RG9sYnlWaXNpb25Qcm9maWxlVGFibGUoKSB7CisgICAgc3RhdGljIGNvbnN0IEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4gcHJvZmlsZVRhYmxlID0geworICAgICAgICB7MSwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlbn0sCisgICAgICAgIHszLCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVufSwKKyAgICAgICAgezQsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdHJ9LAorICAgICAgICB7NSwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0bn0sCisgICAgICAgIHs2LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRofSwKKyAgICAgICAgezcsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGJ9LAorICAgICAgICB7OCwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0fSwKKyAgICAgICAgezksIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZX0sCisgICAgICAgIHsxMCwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdjExMH0sCisgICAgfTsKKyAgICByZXR1cm4gcHJvZmlsZVRhYmxlOworfQorCitzdGF0aWMgY29uc3QgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiYgIGdldERvbGJ5VmlzaW9uTGV2ZWxzVGFibGUoKSB7CisgICAgc3RhdGljIGNvbnN0IEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4gbGV2ZWxzVGFibGUgPSB7CisgICAgICAgIHswLCBEb2xieVZpc2lvbkxldmVsVW5rbm93bn0sCisgICAgICAgIHsxLCBEb2xieVZpc2lvbkxldmVsSGQyNH0sCisgICAgICAgIHsyLCBEb2xieVZpc2lvbkxldmVsSGQzMH0sCisgICAgICAgIHszLCBEb2xieVZpc2lvbkxldmVsRmhkMjR9LAorICAgICAgICB7NCwgRG9sYnlWaXNpb25MZXZlbEZoZDMwfSwKKyAgICAgICAgezUsIERvbGJ5VmlzaW9uTGV2ZWxGaGQ2MH0sCisgICAgICAgIHs2LCBEb2xieVZpc2lvbkxldmVsVWhkMjR9LAorICAgICAgICB7NywgRG9sYnlWaXNpb25MZXZlbFVoZDMwfSwKKyAgICAgICAgezgsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ0OH0sCisgICAgICAgIHs5LCBEb2xieVZpc2lvbkxldmVsVWhkNjB9LAorICAgICAgICB7MTAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQxMjB9LAorICAgICAgICB7MTEsIERvbGJ5VmlzaW9uTGV2ZWw4azMwfSwKKyAgICAgICAgezEyLCBEb2xieVZpc2lvbkxldmVsOGs2MH0sCisgICAgfTsKKyAgICByZXR1cm4gbGV2ZWxzVGFibGU7Cit9CiBzdGF0aWMgdm9pZCBwYXJzZURvbGJ5VmlzaW9uUHJvZmlsZUxldmVsRnJvbUR2Y2MoY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKICAgICAvLyBkdl9tYWpvci5kdl9taW5vciBTaG91bGQgYmUgMS4wIG9yIDIuMQogICAgIGlmIChzaXplICE9IDI0IHx8ICgocHRyWzBdICE9IDEgfHwgcHRyWzFdICE9IDApICYmIChwdHJbMF0gIT0gMiB8fCBwdHJbMV0gIT0gMSkpKSB7CkBAIC0yNTYsNDEgKzI5MCwyMCBAQAogCiAgICAgLy8gQWxsIERvbGJ5IFByb2ZpbGVzIHdpbGwgaGF2ZSBwcm9maWxlIGFuZCBsZXZlbCBpbmZvIGluIE1lZGlhRm9ybWF0CiAgICAgLy8gUHJvZmlsZSA4IGFuZCA5IHdpbGwgaGF2ZSBibF9jb21wYXRpYmlsaXR5X2lkIHRvby4KLSAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fRE9MQllWSVNJT05QUk9GSUxFVFlQRT4gcHJvZmlsZXN7Ci0gICAgICAgIHsxLCBPTVhfVklERU9fRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlbn0sCi0gICAgICAgIHszLCBPTVhfVklERU9fRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlbn0sCi0gICAgICAgIHs0LCBPTVhfVklERU9fRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0cn0sCi0gICAgICAgIHs1LCBPTVhfVklERU9fRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0bn0sCi0gICAgICAgIHs2LCBPTVhfVklERU9fRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0aH0sCi0gICAgICAgIHs3LCBPTVhfVklERU9fRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0Yn0sCi0gICAgICAgIHs4LCBPTVhfVklERU9fRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0fSwKLSAgICAgICAgezksIE9NWF9WSURFT19Eb2xieVZpc2lvblByb2ZpbGVEdmF2U2V9LAotICAgICAgICB7MTAsIE9NWF9WSURFT19Eb2xieVZpc2lvblByb2ZpbGVEdmF2MTEwfSwKLSAgICB9OworICAgIGNvbnN0IEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4gJnByb2ZpbGVzID0gZ2V0RG9sYnlWaXNpb25Qcm9maWxlVGFibGUoKTsKKyAgICBjb25zdCBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+ICZsZXZlbHMgPSBnZXREb2xieVZpc2lvbkxldmVsc1RhYmxlKCk7CiAKLSAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fRE9MQllWSVNJT05MRVZFTFRZUEU+IGxldmVsc3sKLSAgICAgICAgezAsIE9NWF9WSURFT19Eb2xieVZpc2lvbkxldmVsVW5rbm93bn0sCi0gICAgICAgIHsxLCBPTVhfVklERU9fRG9sYnlWaXNpb25MZXZlbEhkMjR9LAotICAgICAgICB7MiwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uTGV2ZWxIZDMwfSwKLSAgICAgICAgezMsIE9NWF9WSURFT19Eb2xieVZpc2lvbkxldmVsRmhkMjR9LAotICAgICAgICB7NCwgT01YX1ZJREVPX0RvbGJ5VmlzaW9uTGV2ZWxGaGQzMH0sCi0gICAgICAgIHs1LCBPTVhfVklERU9fRG9sYnlWaXNpb25MZXZlbEZoZDYwfSwKLSAgICAgICAgezYsIE9NWF9WSURFT19Eb2xieVZpc2lvbkxldmVsVWhkMjR9LAotICAgICAgICB7NywgT01YX1ZJREVPX0RvbGJ5VmlzaW9uTGV2ZWxVaGQzMH0sCi0gICAgICAgIHs4LCBPTVhfVklERU9fRG9sYnlWaXNpb25MZXZlbFVoZDQ4fSwKLSAgICAgICAgezksIE9NWF9WSURFT19Eb2xieVZpc2lvbkxldmVsVWhkNjB9LAotICAgIH07CiAgICAgLy8gc2V0IHJwdUFzc29jCiAgICAgaWYgKHJwdV9wcmVzZW50X2ZsYWcgJiYgZWxfcHJlc2VudF9mbGFnICYmICFibF9wcmVzZW50X2ZsYWcpIHsKICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicnB1QXNzb2MiLCAxKTsKICAgICB9CiAgICAgLy8gc2V0IHByb2ZpbGUgJiBsZXZlbCBpZiB0aGV5IGFyZSByZWNvZ25pemVkCi0gICAgT01YX1ZJREVPX0RPTEJZVklTSU9OUFJPRklMRVRZUEUgY29kZWNQcm9maWxlOwotICAgIE9NWF9WSURFT19ET0xCWVZJU0lPTkxFVkVMVFlQRSBjb2RlY0xldmVsOworICAgIGludDMyX3QgY29kZWNQcm9maWxlOworICAgIGludDMyX3QgY29kZWNMZXZlbDsKICAgICBpZiAocHJvZmlsZXMubWFwKHByb2ZpbGUsICZjb2RlY1Byb2ZpbGUpKSB7CiAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInByb2ZpbGUiLCBjb2RlY1Byb2ZpbGUpOwotICAgICAgICBpZiAoY29kZWNQcm9maWxlID09IE9NWF9WSURFT19Eb2xieVZpc2lvblByb2ZpbGVEdmhlU3QgfHwKLSAgICAgICAgICAgIGNvZGVjUHJvZmlsZSA9PSBPTVhfVklERU9fRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlKSB7CisgICAgICAgIGlmIChjb2RlY1Byb2ZpbGUgPT0gRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0IHx8CisgICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPT0gRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlKSB7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJibF9jb21wYXRpYmlsaXR5X2lkIiwgYmxfY29tcGF0aWJpbGl0eV9pZCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGxldmVscy5tYXAobGV2ZWwsICZjb2RlY0xldmVsKSkgewpAQCAtMzA3LDMyICszMjAsMzIgQEAKICAgICBjb25zdCB1aW50OF90IHByb2ZpbGUgPSBwdHJbNl07CiAgICAgY29uc3QgdWludDhfdCBsZXZlbCA9IHB0cls1XTsKIAotICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIE9NWF9WSURFT19IMjYzUFJPRklMRVRZUEU+IHByb2ZpbGVzIHsKLSAgICAgICAgeyAwLCBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSB9LAotICAgICAgICB7IDEsIE9NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcgfSwKLSAgICAgICAgeyAyLCBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGUgfSwKLSAgICAgICAgeyAzLCBPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMiB9LAotICAgICAgICB7IDQsIE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YzIH0sCi0gICAgICAgIHsgNSwgT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaENvbXByZXNzaW9uIH0sCi0gICAgICAgIHsgNiwgT01YX1ZJREVPX0gyNjNQcm9maWxlSW50ZXJuZXQgfSwKLSAgICAgICAgeyA3LCBPTVhfVklERU9fSDI2M1Byb2ZpbGVJbnRlcmxhY2UgfSwKLSAgICAgICAgeyA4LCBPTVhfVklERU9fSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeSB9LAorICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+IHByb2ZpbGVzIHsKKyAgICAgICAgeyAwLCBIMjYzUHJvZmlsZUJhc2VsaW5lIH0sCisgICAgICAgIHsgMSwgSDI2M1Byb2ZpbGVIMzIwQ29kaW5nIH0sCisgICAgICAgIHsgMiwgSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGUgfSwKKyAgICAgICAgeyAzLCBIMjYzUHJvZmlsZUlTV1YyIH0sCisgICAgICAgIHsgNCwgSDI2M1Byb2ZpbGVJU1dWMyB9LAorICAgICAgICB7IDUsIEgyNjNQcm9maWxlSGlnaENvbXByZXNzaW9uIH0sCisgICAgICAgIHsgNiwgSDI2M1Byb2ZpbGVJbnRlcm5ldCB9LAorICAgICAgICB7IDcsIEgyNjNQcm9maWxlSW50ZXJsYWNlIH0sCisgICAgICAgIHsgOCwgSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeSB9LAogICAgIH07CiAKLSAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fSDI2M0xFVkVMVFlQRT4gbGV2ZWxzIHsKLSAgICAgICAgeyAxMCwgT01YX1ZJREVPX0gyNjNMZXZlbDEwIH0sCi0gICAgICAgIHsgMjAsIE9NWF9WSURFT19IMjYzTGV2ZWwyMCB9LAotICAgICAgICB7IDMwLCBPTVhfVklERU9fSDI2M0xldmVsMzAgfSwKLSAgICAgICAgeyA0MCwgT01YX1ZJREVPX0gyNjNMZXZlbDQwIH0sCi0gICAgICAgIHsgNDUsIE9NWF9WSURFT19IMjYzTGV2ZWw0NSB9LAotICAgICAgICB7IDUwLCBPTVhfVklERU9fSDI2M0xldmVsNTAgfSwKLSAgICAgICAgeyA2MCwgT01YX1ZJREVPX0gyNjNMZXZlbDYwIH0sCi0gICAgICAgIHsgNzAsIE9NWF9WSURFT19IMjYzTGV2ZWw3MCB9LAorICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+IGxldmVscyB7CisgICAgICAgIHsgMTAsIEgyNjNMZXZlbDEwIH0sCisgICAgICAgIHsgMjAsIEgyNjNMZXZlbDIwIH0sCisgICAgICAgIHsgMzAsIEgyNjNMZXZlbDMwIH0sCisgICAgICAgIHsgNDAsIEgyNjNMZXZlbDQwIH0sCisgICAgICAgIHsgNDUsIEgyNjNMZXZlbDQ1IH0sCisgICAgICAgIHsgNTAsIEgyNjNMZXZlbDUwIH0sCisgICAgICAgIHsgNjAsIEgyNjNMZXZlbDYwIH0sCisgICAgICAgIHsgNzAsIEgyNjNMZXZlbDcwIH0sCiAgICAgfTsKIAogICAgIC8vIHNldCBwcm9maWxlICYgbGV2ZWwgaWYgdGhleSBhcmUgcmVjb2duaXplZAotICAgIE9NWF9WSURFT19IMjYzUFJPRklMRVRZUEUgY29kZWNQcm9maWxlOwotICAgIE9NWF9WSURFT19IMjYzTEVWRUxUWVBFIGNvZGVjTGV2ZWw7CisgICAgaW50MzJfdCBjb2RlY1Byb2ZpbGU7CisgICAgaW50MzJfdCBjb2RlY0xldmVsOwogICAgIGlmIChwcm9maWxlcy5tYXAocHJvZmlsZSwgJmNvZGVjUHJvZmlsZSkpIHsKICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvZmlsZSIsIGNvZGVjUHJvZmlsZSk7CiAgICAgICAgIGlmIChsZXZlbHMubWFwKGxldmVsLCAmY29kZWNMZXZlbCkpIHsKQEAgLTM1MCw1OSArMzYzLDYzIEBACiAgICAgY29uc3QgdWludDhfdCB0aWVyID0gKHB0clsxXSAmIDB4MjApID4+IDU7CiAgICAgY29uc3QgdWludDhfdCBsZXZlbCA9IHB0clsxMl07CiAKLSAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDxzdGQ6OnBhaXI8dWludDhfdCwgdWludDhfdD4sIE9NWF9WSURFT19IRVZDTEVWRUxUWVBFPiBsZXZlbHMgewotICAgICAgICB7IHsgMCwgMzAgIH0sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDEgIH0sCi0gICAgICAgIHsgeyAwLCA2MCAgfSwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMiAgfSwKLSAgICAgICAgeyB7IDAsIDYzICB9LCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwyMSB9LAotICAgICAgICB7IHsgMCwgOTAgIH0sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDMgIH0sCi0gICAgICAgIHsgeyAwLCA5MyAgfSwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMzEgfSwKLSAgICAgICAgeyB7IDAsIDEyMCB9LCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw0ICB9LAotICAgICAgICB7IHsgMCwgMTIzIH0sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDQxIH0sCi0gICAgICAgIHsgeyAwLCAxNTAgfSwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNSAgfSwKLSAgICAgICAgeyB7IDAsIDE1MyB9LCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MSB9LAotICAgICAgICB7IHsgMCwgMTU2IH0sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDUyIH0sCi0gICAgICAgIHsgeyAwLCAxODAgfSwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNiAgfSwKLSAgICAgICAgeyB7IDAsIDE4MyB9LCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw2MSB9LAotICAgICAgICB7IHsgMCwgMTg2IH0sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDYyIH0sCi0gICAgICAgIHsgeyAxLCAzMCAgfSwgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMSAgfSwKLSAgICAgICAgeyB7IDEsIDYwICB9LCBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWwyICB9LAotICAgICAgICB7IHsgMSwgNjMgIH0sIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDIxIH0sCi0gICAgICAgIHsgeyAxLCA5MCAgfSwgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMyAgfSwKLSAgICAgICAgeyB7IDEsIDkzICB9LCBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWwzMSB9LAotICAgICAgICB7IHsgMSwgMTIwIH0sIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDQgIH0sCi0gICAgICAgIHsgeyAxLCAxMjMgfSwgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNDEgfSwKLSAgICAgICAgeyB7IDEsIDE1MCB9LCBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw1ICB9LAotICAgICAgICB7IHsgMSwgMTUzIH0sIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDUxIH0sCi0gICAgICAgIHsgeyAxLCAxNTYgfSwgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNTIgfSwKLSAgICAgICAgeyB7IDEsIDE4MCB9LCBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw2ICB9LAotICAgICAgICB7IHsgMSwgMTgzIH0sIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDYxIH0sCi0gICAgICAgIHsgeyAxLCAxODYgfSwgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNjIgfSwKKyAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDxzdGQ6OnBhaXI8dWludDhfdCwgdWludDhfdD4sIGludDMyX3Q+IGxldmVscyB7CisgICAgICAgIHsgeyAwLCAzMCAgfSwgSEVWQ01haW5UaWVyTGV2ZWwxICB9LAorICAgICAgICB7IHsgMCwgNjAgIH0sIEhFVkNNYWluVGllckxldmVsMiAgfSwKKyAgICAgICAgeyB7IDAsIDYzICB9LCBIRVZDTWFpblRpZXJMZXZlbDIxIH0sCisgICAgICAgIHsgeyAwLCA5MCAgfSwgSEVWQ01haW5UaWVyTGV2ZWwzICB9LAorICAgICAgICB7IHsgMCwgOTMgIH0sIEhFVkNNYWluVGllckxldmVsMzEgfSwKKyAgICAgICAgeyB7IDAsIDEyMCB9LCBIRVZDTWFpblRpZXJMZXZlbDQgIH0sCisgICAgICAgIHsgeyAwLCAxMjMgfSwgSEVWQ01haW5UaWVyTGV2ZWw0MSB9LAorICAgICAgICB7IHsgMCwgMTUwIH0sIEhFVkNNYWluVGllckxldmVsNSAgfSwKKyAgICAgICAgeyB7IDAsIDE1MyB9LCBIRVZDTWFpblRpZXJMZXZlbDUxIH0sCisgICAgICAgIHsgeyAwLCAxNTYgfSwgSEVWQ01haW5UaWVyTGV2ZWw1MiB9LAorICAgICAgICB7IHsgMCwgMTgwIH0sIEhFVkNNYWluVGllckxldmVsNiAgfSwKKyAgICAgICAgeyB7IDAsIDE4MyB9LCBIRVZDTWFpblRpZXJMZXZlbDYxIH0sCisgICAgICAgIHsgeyAwLCAxODYgfSwgSEVWQ01haW5UaWVyTGV2ZWw2MiB9LAorICAgICAgICB7IHsgMSwgMzAgIH0sIEhFVkNIaWdoVGllckxldmVsMSAgfSwKKyAgICAgICAgeyB7IDEsIDYwICB9LCBIRVZDSGlnaFRpZXJMZXZlbDIgIH0sCisgICAgICAgIHsgeyAxLCA2MyAgfSwgSEVWQ0hpZ2hUaWVyTGV2ZWwyMSB9LAorICAgICAgICB7IHsgMSwgOTAgIH0sIEhFVkNIaWdoVGllckxldmVsMyAgfSwKKyAgICAgICAgeyB7IDEsIDkzICB9LCBIRVZDSGlnaFRpZXJMZXZlbDMxIH0sCisgICAgICAgIHsgeyAxLCAxMjAgfSwgSEVWQ0hpZ2hUaWVyTGV2ZWw0ICB9LAorICAgICAgICB7IHsgMSwgMTIzIH0sIEhFVkNIaWdoVGllckxldmVsNDEgfSwKKyAgICAgICAgeyB7IDEsIDE1MCB9LCBIRVZDSGlnaFRpZXJMZXZlbDUgIH0sCisgICAgICAgIHsgeyAxLCAxNTMgfSwgSEVWQ0hpZ2hUaWVyTGV2ZWw1MSB9LAorICAgICAgICB7IHsgMSwgMTU2IH0sIEhFVkNIaWdoVGllckxldmVsNTIgfSwKKyAgICAgICAgeyB7IDEsIDE4MCB9LCBIRVZDSGlnaFRpZXJMZXZlbDYgIH0sCisgICAgICAgIHsgeyAxLCAxODMgfSwgSEVWQ0hpZ2hUaWVyTGV2ZWw2MSB9LAorICAgICAgICB7IHsgMSwgMTg2IH0sIEhFVkNIaWdoVGllckxldmVsNjIgfSwKICAgICB9OwogCi0gICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX0hFVkNQUk9GSUxFVFlQRT4gcHJvZmlsZXMgewotICAgICAgICB7IDEsIE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4gICB9LAotICAgICAgICB7IDIsIE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4xMCB9LAorICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+IHByb2ZpbGVzIHsKKyAgICAgICAgeyAxLCBIRVZDUHJvZmlsZU1haW4gICB9LAorICAgICAgICB7IDIsIEhFVkNQcm9maWxlTWFpbjEwIH0sCiAgICAgICAgIC8vIHVzZSBNYWluIGZvciBNYWluIFN0aWxsIFBpY3R1cmUgZGVjb2RpbmcKLSAgICAgICAgeyAzLCBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluIH0sCisgICAgICAgIHsgMywgSEVWQ1Byb2ZpbGVNYWluIH0sCiAgICAgfTsKIAogICAgIC8vIHNldCBwcm9maWxlICYgbGV2ZWwgaWYgdGhleSBhcmUgcmVjb2duaXplZAotICAgIE9NWF9WSURFT19IRVZDUFJPRklMRVRZUEUgY29kZWNQcm9maWxlOwotICAgIE9NWF9WSURFT19IRVZDTEVWRUxUWVBFIGNvZGVjTGV2ZWw7CisgICAgaW50MzJfdCBjb2RlY1Byb2ZpbGU7CisgICAgaW50MzJfdCBjb2RlY0xldmVsOwogICAgIGlmICghcHJvZmlsZXMubWFwKHByb2ZpbGUsICZjb2RlY1Byb2ZpbGUpKSB7CiAgICAgICAgIGlmIChwdHJbMl0gJiAweDQwIC8qIGdlbmVyYWwgY29tcGF0aWJpbGl0eSBmbGFnIDEgKi8pIHsKICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGNhc2UgY292ZXJzIE1haW4gU3RpbGwgUGljdHVyZSB0b28KLSAgICAgICAgICAgIGNvZGVjUHJvZmlsZSA9IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW47CisgICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSBIRVZDUHJvZmlsZU1haW47CiAgICAgICAgIH0gZWxzZSBpZiAocHRyWzJdICYgMHgyMCAvKiBnZW5lcmFsIGNvbXBhdGliaWxpdHkgZmxhZyAyICovKSB7Ci0gICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluMTA7CisgICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSBIRVZDUHJvZmlsZU1haW4xMDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8vIGJ1bXAgdG8gSERSIHByb2ZpbGUKLSAgICBpZiAoaXNIZHIoZm9ybWF0KSAmJiBjb2RlY1Byb2ZpbGUgPT0gT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjEwKSB7Ci0gICAgICAgIGNvZGVjUHJvZmlsZSA9IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4xMEhEUjEwOworICAgIGlmIChpc0hkcjEwb3IxMFBsdXMoZm9ybWF0KSAmJiBjb2RlY1Byb2ZpbGUgPT0gSEVWQ1Byb2ZpbGVNYWluMTApIHsKKyAgICAgICAgaWYgKGZvcm1hdC0+Y29udGFpbnMoImhkcjEwLXBsdXMtaW5mbyIpKSB7CisgICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSBIRVZDUHJvZmlsZU1haW4xMEhEUjEwUGx1czsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvZGVjUHJvZmlsZSA9IEhFVkNQcm9maWxlTWFpbjEwSERSMTA7CisgICAgICAgIH0KICAgICB9CiAKICAgICBmb3JtYXQtPnNldEludDMyKCJwcm9maWxlIiwgY29kZWNQcm9maWxlKTsKQEAgLTQyMiwzNiArNDM5LDM2IEBACiAgICAgICAgIH0KICAgICAgICAgY29uc3QgdWludDhfdCBpbmRpY2F0aW9uID0gKChzZXFbNF0gJiAweEYpIDw8IDQpIHwgKChzZXFbNV0gJiAweEYwKSA+PiA0KTsKIAotICAgICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fTVBFRzJQUk9GSUxFVFlQRT4gcHJvZmlsZXMgewotICAgICAgICAgICAgeyAweDUwLCBPTVhfVklERU9fTVBFRzJQcm9maWxlU2ltcGxlICB9LAotICAgICAgICAgICAgeyAweDQwLCBPTVhfVklERU9fTVBFRzJQcm9maWxlTWFpbiAgICB9LAotICAgICAgICAgICAgeyAweDMwLCBPTVhfVklERU9fTVBFRzJQcm9maWxlU05SICAgICB9LAotICAgICAgICAgICAgeyAweDIwLCBPTVhfVklERU9fTVBFRzJQcm9maWxlU3BhdGlhbCB9LAotICAgICAgICAgICAgeyAweDEwLCBPTVhfVklERU9fTVBFRzJQcm9maWxlSGlnaCAgICB9LAorICAgICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBwcm9maWxlcyB7CisgICAgICAgICAgICB7IDB4NTAsIE1QRUcyUHJvZmlsZVNpbXBsZSAgfSwKKyAgICAgICAgICAgIHsgMHg0MCwgTVBFRzJQcm9maWxlTWFpbiAgICB9LAorICAgICAgICAgICAgeyAweDMwLCBNUEVHMlByb2ZpbGVTTlIgICAgIH0sCisgICAgICAgICAgICB7IDB4MjAsIE1QRUcyUHJvZmlsZVNwYXRpYWwgfSwKKyAgICAgICAgICAgIHsgMHgxMCwgTVBFRzJQcm9maWxlSGlnaCAgICB9LAogICAgICAgICB9OwogCi0gICAgICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIE9NWF9WSURFT19NUEVHMkxFVkVMVFlQRT4gbGV2ZWxzIHsKLSAgICAgICAgICAgIHsgMHgwQSwgT01YX1ZJREVPX01QRUcyTGV2ZWxMTCAgfSwKLSAgICAgICAgICAgIHsgMHgwOCwgT01YX1ZJREVPX01QRUcyTGV2ZWxNTCAgfSwKLSAgICAgICAgICAgIHsgMHgwNiwgT01YX1ZJREVPX01QRUcyTGV2ZWxIMTQgfSwKLSAgICAgICAgICAgIHsgMHgwNCwgT01YX1ZJREVPX01QRUcyTGV2ZWxITCAgfSwKLSAgICAgICAgICAgIHsgMHgwMiwgT01YX1ZJREVPX01QRUcyTGV2ZWxIUCAgfSwKKyAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4gbGV2ZWxzIHsKKyAgICAgICAgICAgIHsgMHgwQSwgTVBFRzJMZXZlbExMICB9LAorICAgICAgICAgICAgeyAweDA4LCBNUEVHMkxldmVsTUwgIH0sCisgICAgICAgICAgICB7IDB4MDYsIE1QRUcyTGV2ZWxIMTQgfSwKKyAgICAgICAgICAgIHsgMHgwNCwgTVBFRzJMZXZlbEhMICB9LAorICAgICAgICAgICAgeyAweDAyLCBNUEVHMkxldmVsSFAgIH0sCiAgICAgICAgIH07CiAKICAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwKLSAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8T01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEUsIE9NWF9WSURFT19NUEVHMkxFVkVMVFlQRT4+IGVzY2FwZXMgeworICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4gZXNjYXBlcyB7CiAgICAgICAgICAgICAvKiB1bnN1cHBvcnRlZAotICAgICAgICAgICAgeyAweDhFLCB7IFhYWF9NUEVHMlByb2ZpbGVNdWx0aVZpZXcsIE9NWF9WSURFT19NUEVHMkxldmVsTEwgIH0gfSwKLSAgICAgICAgICAgIHsgMHg4RCwgeyBYWFhfTVBFRzJQcm9maWxlTXVsdGlWaWV3LCBPTVhfVklERU9fTVBFRzJMZXZlbE1MICB9IH0sCi0gICAgICAgICAgICB7IDB4OEIsIHsgWFhYX01QRUcyUHJvZmlsZU11bHRpVmlldywgT01YX1ZJREVPX01QRUcyTGV2ZWxIMTQgfSB9LAotICAgICAgICAgICAgeyAweDhBLCB7IFhYWF9NUEVHMlByb2ZpbGVNdWx0aVZpZXcsIE9NWF9WSURFT19NUEVHMkxldmVsSEwgIH0gfSwgKi8KLSAgICAgICAgICAgIHsgMHg4NSwgeyBPTVhfVklERU9fTVBFRzJQcm9maWxlNDIyLCBPTVhfVklERU9fTVBFRzJMZXZlbE1MICB9IH0sCi0gICAgICAgICAgICB7IDB4ODIsIHsgT01YX1ZJREVPX01QRUcyUHJvZmlsZTQyMiwgT01YX1ZJREVPX01QRUcyTGV2ZWxITCAgfSB9LAorICAgICAgICAgICAgeyAweDhFLCB7IFhYWF9NUEVHMlByb2ZpbGVNdWx0aVZpZXcsIE1QRUcyTGV2ZWxMTCAgfSB9LAorICAgICAgICAgICAgeyAweDhELCB7IFhYWF9NUEVHMlByb2ZpbGVNdWx0aVZpZXcsIE1QRUcyTGV2ZWxNTCAgfSB9LAorICAgICAgICAgICAgeyAweDhCLCB7IFhYWF9NUEVHMlByb2ZpbGVNdWx0aVZpZXcsIE1QRUcyTGV2ZWxIMTQgfSB9LAorICAgICAgICAgICAgeyAweDhBLCB7IFhYWF9NUEVHMlByb2ZpbGVNdWx0aVZpZXcsIE1QRUcyTGV2ZWxITCAgfSB9LCAqLworICAgICAgICAgICAgeyAweDg1LCB7IE1QRUcyUHJvZmlsZTQyMiwgTVBFRzJMZXZlbE1MICB9IH0sCisgICAgICAgICAgICB7IDB4ODIsIHsgTVBFRzJQcm9maWxlNDIyLCBNUEVHMkxldmVsSEwgIH0gfSwKICAgICAgICAgfTsKIAotICAgICAgICBPTVhfVklERU9fTVBFRzJQUk9GSUxFVFlQRSBwcm9maWxlOwotICAgICAgICBPTVhfVklERU9fTVBFRzJMRVZFTFRZUEUgbGV2ZWw7Ci0gICAgICAgIHN0ZDo6cGFpcjxPTVhfVklERU9fTVBFRzJQUk9GSUxFVFlQRSwgT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFPiBwcm9maWxlTGV2ZWw7CisgICAgICAgIGludDMyX3QgcHJvZmlsZTsKKyAgICAgICAgaW50MzJfdCBsZXZlbDsKKyAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+IHByb2ZpbGVMZXZlbDsKICAgICAgICAgaWYgKGVzY2FwZXMubWFwKGluZGljYXRpb24sICZwcm9maWxlTGV2ZWwpKSB7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm9maWxlIiwgcHJvZmlsZUxldmVsLmZpcnN0KTsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImxldmVsIiwgcHJvZmlsZUxldmVsLnNlY29uZCk7CkBAIC00NjgsMTYgKzQ4NSwxNiBAQAogICAgIC8vIGVzZHMgc2VlbXMgdG8gb25seSBjb250YWluIHRoZSBwcm9maWxlIGZvciBNUEVHLTIKICAgICB1aW50OF90IG9ialR5cGU7CiAgICAgaWYgKGVzZHMuZ2V0T2JqZWN0VHlwZUluZGljYXRpb24oJm9ialR5cGUpID09IE9LKSB7Ci0gICAgICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIE9NWF9WSURFT19NUEVHMlBST0ZJTEVUWVBFPiBwcm9maWxlc3sKLSAgICAgICAgICAgIHsgMHg2MCwgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNpbXBsZSAgfSwKLSAgICAgICAgICAgIHsgMHg2MSwgT01YX1ZJREVPX01QRUcyUHJvZmlsZU1haW4gICAgfSwKLSAgICAgICAgICAgIHsgMHg2MiwgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNOUiAgICAgfSwKLSAgICAgICAgICAgIHsgMHg2MywgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNwYXRpYWwgfSwKLSAgICAgICAgICAgIHsgMHg2NCwgT01YX1ZJREVPX01QRUcyUHJvZmlsZUhpZ2ggICAgfSwKLSAgICAgICAgICAgIHsgMHg2NSwgT01YX1ZJREVPX01QRUcyUHJvZmlsZTQyMiAgICAgfSwKKyAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4gcHJvZmlsZXN7CisgICAgICAgICAgICB7IDB4NjAsIE1QRUcyUHJvZmlsZVNpbXBsZSAgfSwKKyAgICAgICAgICAgIHsgMHg2MSwgTVBFRzJQcm9maWxlTWFpbiAgICB9LAorICAgICAgICAgICAgeyAweDYyLCBNUEVHMlByb2ZpbGVTTlIgICAgIH0sCisgICAgICAgICAgICB7IDB4NjMsIE1QRUcyUHJvZmlsZVNwYXRpYWwgfSwKKyAgICAgICAgICAgIHsgMHg2NCwgTVBFRzJQcm9maWxlSGlnaCAgICB9LAorICAgICAgICAgICAgeyAweDY1LCBNUEVHMlByb2ZpbGU0MjIgICAgIH0sCiAgICAgICAgIH07CiAKLSAgICAgICAgT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEUgcHJvZmlsZTsKKyAgICAgICAgaW50MzJfdCBwcm9maWxlOwogICAgICAgICBpZiAocHJvZmlsZXMubWFwKG9ialR5cGUsICZwcm9maWxlKSkgewogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvZmlsZSIsIHByb2ZpbGUpOwogICAgICAgICB9CkBAIC00OTIsODIgKzUwOSw4MiBAQAogICAgICAgICBjb25zdCB1aW50OF90IGluZGljYXRpb24gPSBzZXFbNF07CiAKICAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwKLSAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8T01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEUsIE9NWF9WSURFT19NUEVHNExFVkVMVFlQRT4+IHRhYmxlIHsKLSAgICAgICAgICAgIHsgMGIwMDAwMDAwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjAwMDAwMDEwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCi0gICAgICAgICAgICB7IDBiMDAwMDAwMTEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDMgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMDAwMDEwMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsNGEgfSB9LAotICAgICAgICAgICAgeyAwYjAwMDAwMTAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw1ICB9IH0sCi0gICAgICAgICAgICB7IDBiMDAwMDAxMTAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDYgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMDAwMTAwMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMCAgfSB9LAotICAgICAgICAgICAgeyAwYjAwMDAxMDAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwwYiB9IH0sCi0gICAgICAgICAgICB7IDBiMDAwMTAwMDAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDAgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMDAxMDAwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUsICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjAwMDEwMDEwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZSwgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiB0YWJsZSB7CisgICAgICAgICAgICB7IDBiMDAwMDAwMDEsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMDAwMTAsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMDAwMTEsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMDAxMDAsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWw0YSB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMDAxMDEsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWw1ICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMDAxMTAsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWw2ICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMDEwMDAsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWwwICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMDEwMDEsIHsgTVBFRzRQcm9maWxlU2ltcGxlLCAgICAgICAgICAgIE1QRUc0TGV2ZWwwYiB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMTAwMDAsIHsgTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUsICAgIE1QRUc0TGV2ZWwwICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMTAwMDEsIHsgTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUsICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMTAwMTAsIHsgTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUsICAgIE1QRUc0TGV2ZWwyICB9IH0sCiAgICAgICAgICAgICAvKiB1bnN1cHBvcnRlZAotICAgICAgICAgICAgeyAwYjAwMDExMTAxLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZUVSLCAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwwICB9IH0sCi0gICAgICAgICAgICB7IDBiMDAwMTExMTAsIHsgWFhYX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlRVIsICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMDAxMTExMSwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGVFUiwgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LCAqLwotICAgICAgICAgICAgeyAwYjAwMTAwMDAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlLCAgICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMDAxMDAwMTAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmUsICAgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMDExMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlTWFpbiwgICAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjAwMTEwMDExLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluLCAgICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICB9IH0sCi0gICAgICAgICAgICB7IDBiMDAxMTAxMDAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZU1haW4sICAgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDQgIH0gfSwKKyAgICAgICAgICAgIHsgMGIwMDAxMTEwMSwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGVFUiwgICAgICAgIE1QRUc0TGV2ZWwwICB9IH0sCisgICAgICAgICAgICB7IDBiMDAwMTExMTAsIHsgWFhYX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlRVIsICAgICAgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjAwMDExMTExLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZUVSLCAgICAgICAgTVBFRzRMZXZlbDIgIH0gfSwgKi8KKyAgICAgICAgICAgIHsgMGIwMDEwMDAwMSwgeyBNUEVHNFByb2ZpbGVDb3JlLCAgICAgICAgICAgICAgTVBFRzRMZXZlbDEgIH0gfSwKKyAgICAgICAgICAgIHsgMGIwMDEwMDAxMCwgeyBNUEVHNFByb2ZpbGVDb3JlLCAgICAgICAgICAgICAgTVBFRzRMZXZlbDIgIH0gfSwKKyAgICAgICAgICAgIHsgMGIwMDExMDAxMCwgeyBNUEVHNFByb2ZpbGVNYWluLCAgICAgICAgICAgICAgTVBFRzRMZXZlbDIgIH0gfSwKKyAgICAgICAgICAgIHsgMGIwMDExMDAxMSwgeyBNUEVHNFByb2ZpbGVNYWluLCAgICAgICAgICAgICAgTVBFRzRMZXZlbDMgIH0gfSwKKyAgICAgICAgICAgIHsgMGIwMDExMDEwMCwgeyBNUEVHNFByb2ZpbGVNYWluLCAgICAgICAgICAgICAgTVBFRzRMZXZlbDQgIH0gfSwKICAgICAgICAgICAgIC8qIGRlcHJlY2F0ZWQKLSAgICAgICAgICAgIHsgMGIwMTAwMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlTmJpdCwgICAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LCAqLwotICAgICAgICAgICAgeyAwYjAxMDEwMDAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTY2FsYWJsZVRleHR1cmUsICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMDExMDAwMDEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZhY2UsICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMTEwMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlRmFjZSwgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjAxMTAwMDExLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGQkEsICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMDExMDAxMDAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZCQSwgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwKLSAgICAgICAgICAgIHsgMGIwMTExMDAwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZCwgICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjAxMTEwMDEwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVCYXNpY0FuaW1hdGVkLCAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCi0gICAgICAgICAgICB7IDBiMTAwMDAwMDEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUh5YnJpZCwgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMDAwMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlSHlicmlkLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjEwMDEwMDAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lLCAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMTAwMTAwMTAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUsICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMDAxMDAxMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgIE9NWF9WSURFT19NUEVHNExldmVsMyAgfSB9LAotICAgICAgICAgICAgeyAwYjEwMDEwMTAwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lLCAgT01YX1ZJREVPX01QRUc0TGV2ZWw0ICB9IH0sCi0gICAgICAgICAgICB7IDBiMTAxMDAwMDEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMDEwMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlLCAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjEwMTAwMDExLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlU2NhbGFibGUsICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICB9IH0sCi0gICAgICAgICAgICB7IDBiMTAxMTAwMDEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMDExMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjEwMTEwMDExLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZywgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICB9IH0sCi0gICAgICAgICAgICB7IDBiMTAxMTAxMDAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDQgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTAwMDAwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlLCAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjExMDAwMDEwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvcmUsICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCi0gICAgICAgICAgICB7IDBiMTEwMTAwMDEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUsICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTAxMDAxMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjExMDEwMDExLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNjYWxhYmxlLCAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMDEwMDAwMTAsIHsgTVBFRzRQcm9maWxlTmJpdCwgICAgICAgICAgICAgIE1QRUc0TGV2ZWwyICB9IH0sICovCisgICAgICAgICAgICB7IDBiMDEwMTAwMDEsIHsgTVBFRzRQcm9maWxlU2NhbGFibGVUZXh0dXJlLCAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMDExMDAwMDEsIHsgTVBFRzRQcm9maWxlU2ltcGxlRmFjZSwgICAgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMDExMDAwMTAsIHsgTVBFRzRQcm9maWxlU2ltcGxlRmFjZSwgICAgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMDExMDAwMTEsIHsgTVBFRzRQcm9maWxlU2ltcGxlRkJBLCAgICAgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMDExMDAxMDAsIHsgTVBFRzRQcm9maWxlU2ltcGxlRkJBLCAgICAgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMDExMTAwMDEsIHsgTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZCwgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMDExMTAwMTAsIHsgTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZCwgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTAwMDAwMDEsIHsgTVBFRzRQcm9maWxlSHlicmlkLCAgICAgICAgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTAwMDAwMTAsIHsgTVBFRzRQcm9maWxlSHlicmlkLCAgICAgICAgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTAwMTAwMDEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTAwMTAwMTAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTAwMTAwMTEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgIE1QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMTAwMTAxMDAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgIE1QRUc0TGV2ZWw0ICB9IH0sCisgICAgICAgICAgICB7IDBiMTAxMDAwMDEsIHsgTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlLCAgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTAxMDAwMTAsIHsgTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlLCAgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTAxMDAwMTEsIHsgTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlLCAgICAgIE1QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMTAxMTAwMDEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTAxMTAwMTAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTAxMTAwMTEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsICAgIE1QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMTAxMTAxMDAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsICAgIE1QRUc0TGV2ZWw0ICB9IH0sCisgICAgICAgICAgICB7IDBiMTEwMDAwMDEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlLCAgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTEwMDAwMTAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlLCAgICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTEwMTAwMDEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTEwMTAwMTAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTEwMTAwMTEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgIE1QRUc0TGV2ZWwzICB9IH0sCiAgICAgICAgICAgICAvKiB1bnN1cHBvcnRlZAotICAgICAgICAgICAgeyAwYjExMTAwMDAxLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTdHVkaW8sICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMDAwMTAsIHsgWFhYX01QRUc0UHJvZmlsZVNpbXBsZVN0dWRpbywgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTEwMDAxMSwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU3R1ZGlvLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMyAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTAwMTAwLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTdHVkaW8sICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw0ICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMDAxMDEsIHsgWFhYX01QRUc0UHJvZmlsZUNvcmVTdHVkaW8sICAgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTEwMDExMCwgeyBYWFhfTVBFRzRQcm9maWxlQ29yZVN0dWRpbywgICAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTAwMTExLCB7IFhYWF9NUEVHNFByb2ZpbGVDb3JlU3R1ZGlvLCAgICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMDEwMDAsIHsgWFhYX01QRUc0UHJvZmlsZUNvcmVTdHVkaW8sICAgICAgICAgICAgICBPTVhfVklERU9fTVBFRzRMZXZlbDQgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTEwMTAxMSwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU3R1ZGlvLCAgICAgICAgICAgIE9NWF9WSURFT19NUEVHNExldmVsNSAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTAxMTAwLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTdHVkaW8sICAgICAgICAgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw2ICB9IH0sICovCi0gICAgICAgICAgICB7IDBiMTExMTAwMDAsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDAgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTExMDAwMSwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTEwMDEwLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMTAwMTEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDMgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTExMDEwMCwgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE9NWF9WSURFT19NUEVHNExldmVsNCAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTEwMTAxLCB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw1ICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMTAxMTEsIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCAgICBPTVhfVklERU9fTVBFRzRMZXZlbDNiIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTEwMDAwMSwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU3R1ZGlvLCAgICAgICAgICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMDAwMTAsIHsgWFhYX01QRUc0UHJvZmlsZVNpbXBsZVN0dWRpbywgICAgICAgICAgICBNUEVHNExldmVsMiAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTAwMDExLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTdHVkaW8sICAgICAgICAgICAgTVBFRzRMZXZlbDMgIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTEwMDEwMCwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU3R1ZGlvLCAgICAgICAgICAgIE1QRUc0TGV2ZWw0ICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMDAxMDEsIHsgWFhYX01QRUc0UHJvZmlsZUNvcmVTdHVkaW8sICAgICAgICAgICAgICBNUEVHNExldmVsMSAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTAwMTEwLCB7IFhYWF9NUEVHNFByb2ZpbGVDb3JlU3R1ZGlvLCAgICAgICAgICAgICAgTVBFRzRMZXZlbDIgIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTEwMDExMSwgeyBYWFhfTVBFRzRQcm9maWxlQ29yZVN0dWRpbywgICAgICAgICAgICAgIE1QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMDEwMDAsIHsgWFhYX01QRUc0UHJvZmlsZUNvcmVTdHVkaW8sICAgICAgICAgICAgICBNUEVHNExldmVsNCAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTAxMDExLCB7IFhYWF9NUEVHNFByb2ZpbGVTaW1wbGVTdHVkaW8sICAgICAgICAgICAgTVBFRzRMZXZlbDUgIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTEwMTEwMCwgeyBYWFhfTVBFRzRQcm9maWxlU2ltcGxlU3R1ZGlvLCAgICAgICAgICAgIE1QRUc0TGV2ZWw2ICB9IH0sICovCisgICAgICAgICAgICB7IDBiMTExMTAwMDAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE1QRUc0TGV2ZWwwICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTAwMDEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE1QRUc0TGV2ZWwxICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTAwMTAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTAwMTEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE1QRUc0TGV2ZWwzICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTAxMDAsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE1QRUc0TGV2ZWw0ICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTAxMDEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE1QRUc0TGV2ZWw1ICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTAxMTEsIHsgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsICAgIE1QRUc0TGV2ZWwzYiB9IH0sCiAgICAgICAgICAgICAvKiBkZXByZWNhdGVkCi0gICAgICAgICAgICB7IDBiMTExMTEwMDAsIHsgWFhYX01QRUc0UHJvZmlsZUZpbmVHcmFudWxhcml0eVNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDAgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTExMTAwMSwgeyBYWFhfTVBFRzRQcm9maWxlRmluZUdyYW51bGFyaXR5U2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsMSAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTExMDEwLCB7IFhYWF9NUEVHNFByb2ZpbGVGaW5lR3JhbnVsYXJpdHlTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyICB9IH0sCi0gICAgICAgICAgICB7IDBiMTExMTEwMTEsIHsgWFhYX01QRUc0UHJvZmlsZUZpbmVHcmFudWxhcml0eVNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDMgIH0gfSwKLSAgICAgICAgICAgIHsgMGIxMTExMTEwMCwgeyBYWFhfTVBFRzRQcm9maWxlRmluZUdyYW51bGFyaXR5U2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsNCAgfSB9LAotICAgICAgICAgICAgeyAwYjExMTExMTAxLCB7IFhYWF9NUEVHNFByb2ZpbGVGaW5lR3JhbnVsYXJpdHlTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw1ICB9IH0sICovCisgICAgICAgICAgICB7IDBiMTExMTEwMDAsIHsgWFhYX01QRUc0UHJvZmlsZUZpbmVHcmFudWxhcml0eVNjYWxhYmxlLCBNUEVHNExldmVsMCAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTExMDAxLCB7IFhYWF9NUEVHNFByb2ZpbGVGaW5lR3JhbnVsYXJpdHlTY2FsYWJsZSwgTVBFRzRMZXZlbDEgIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTExMTAxMCwgeyBYWFhfTVBFRzRQcm9maWxlRmluZUdyYW51bGFyaXR5U2NhbGFibGUsIE1QRUc0TGV2ZWwyICB9IH0sCisgICAgICAgICAgICB7IDBiMTExMTEwMTEsIHsgWFhYX01QRUc0UHJvZmlsZUZpbmVHcmFudWxhcml0eVNjYWxhYmxlLCBNUEVHNExldmVsMyAgfSB9LAorICAgICAgICAgICAgeyAwYjExMTExMTAwLCB7IFhYWF9NUEVHNFByb2ZpbGVGaW5lR3JhbnVsYXJpdHlTY2FsYWJsZSwgTVBFRzRMZXZlbDQgIH0gfSwKKyAgICAgICAgICAgIHsgMGIxMTExMTEwMSwgeyBYWFhfTVBFRzRQcm9maWxlRmluZUdyYW51bGFyaXR5U2NhbGFibGUsIE1QRUc0TGV2ZWw1ICB9IH0sICovCiAgICAgICAgIH07CiAKLSAgICAgICAgc3RkOjpwYWlyPE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFLCBPTVhfVklERU9fTVBFRzRMRVZFTFRZUEU+IHByb2ZpbGVMZXZlbDsKKyAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+IHByb2ZpbGVMZXZlbDsKICAgICAgICAgaWYgKHRhYmxlLm1hcChpbmRpY2F0aW9uLCAmcHJvZmlsZUxldmVsKSkgewogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvZmlsZSIsIHByb2ZpbGVMZXZlbC5maXJzdCk7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJsZXZlbCIsIHByb2ZpbGVMZXZlbC5zZWNvbmQpOwpAQCAtNTkwLDIzICs2MDcsMzIgQEAKICAgICAgICAgc3dpdGNoIChpZCkgewogICAgICAgICAgICAgY2FzZSAxIC8qIHByb2ZpbGVJZCAqLzoKICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX1ZQOVBST0ZJTEVUWVBFPiBwcm9maWxlcyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB7IDAsIE9NWF9WSURFT19WUDlQcm9maWxlMCB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAxLCBPTVhfVklERU9fVlA5UHJvZmlsZTEgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgMiwgT01YX1ZJREVPX1ZQOVByb2ZpbGUyIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDMsIE9NWF9WSURFT19WUDlQcm9maWxlMyB9LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBwcm9maWxlcyB7CisgICAgICAgICAgICAgICAgICAgICAgICB7IDAsIFZQOVByb2ZpbGUwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDEsIFZQOVByb2ZpbGUxIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDIsIFZQOVByb2ZpbGUyIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDMsIFZQOVByb2ZpbGUzIH0sCiAgICAgICAgICAgICAgICAgICAgIH07CiAKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8T01YX1ZJREVPX1ZQOVBST0ZJTEVUWVBFLCBPTVhfVklERU9fVlA5UFJPRklMRVRZUEU+IHRvSGRyIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUyLCBPTVhfVklERU9fVlA5UHJvZmlsZTJIRFIgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUzLCBPTVhfVklERU9fVlA5UHJvZmlsZTNIRFIgfSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8aW50MzJfdCwgaW50MzJfdD4gdG9IZHIxMCB7CisgICAgICAgICAgICAgICAgICAgICAgICB7IFZQOVByb2ZpbGUyLCBWUDlQcm9maWxlMkhEUiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyBWUDlQcm9maWxlMywgVlA5UHJvZmlsZTNIRFIgfSwKICAgICAgICAgICAgICAgICAgICAgfTsKIAotICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVlA5UFJPRklMRVRZUEUgcHJvZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8aW50MzJfdCwgaW50MzJfdD4gdG9IZHIxMFBsdXMgeworICAgICAgICAgICAgICAgICAgICAgICAgeyBWUDlQcm9maWxlMiwgVlA5UHJvZmlsZTJIRFIxMFBsdXMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgVlA5UHJvZmlsZTMsIFZQOVByb2ZpbGUzSERSMTBQbHVzIH0sCisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcm9maWxlOwogICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZXMubWFwKGRhdGFbMF0sICZwcm9maWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBIRFIgcHJvZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSGRyKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0hkci5sb29rdXAocHJvZmlsZSwgJnByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSGRyMTBvcjEwUGx1cyhmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC0+Y29udGFpbnMoImhkcjEwLXBsdXMtaW5mbyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvSGRyMTBQbHVzLmxvb2t1cChwcm9maWxlLCAmcHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9IZHIxMC5sb29rdXAocHJvZmlsZSwgJnByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvZmlsZSIsIHByb2ZpbGUpOwpAQCAtNjE1LDI0ICs2NDEsMjQgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMiAvKiBsZXZlbElkICovOgogICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMSkgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fVlA5TEVWRUxUWVBFPiBsZXZlbHMgewotICAgICAgICAgICAgICAgICAgICAgICAgeyAxMCwgT01YX1ZJREVPX1ZQOUxldmVsMSAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgMTEsIE9NWF9WSURFT19WUDlMZXZlbDExIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDIwLCBPTVhfVklERU9fVlA5TGV2ZWwyICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAyMSwgT01YX1ZJREVPX1ZQOUxldmVsMjEgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgMzAsIE9NWF9WSURFT19WUDlMZXZlbDMgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDMxLCBPTVhfVklERU9fVlA5TGV2ZWwzMSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyA0MCwgT01YX1ZJREVPX1ZQOUxldmVsNCAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgNDEsIE9NWF9WSURFT19WUDlMZXZlbDQxIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDUwLCBPTVhfVklERU9fVlA5TGV2ZWw1ICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyA1MSwgT01YX1ZJREVPX1ZQOUxldmVsNTEgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgNTIsIE9NWF9WSURFT19WUDlMZXZlbDUyIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7IDYwLCBPTVhfVklERU9fVlA5TGV2ZWw2ICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyA2MSwgT01YX1ZJREVPX1ZQOUxldmVsNjEgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgNjIsIE9NWF9WSURFT19WUDlMZXZlbDYyIH0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+IGxldmVscyB7CisgICAgICAgICAgICAgICAgICAgICAgICB7IDEwLCBWUDlMZXZlbDEgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDExLCBWUDlMZXZlbDExIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDIwLCBWUDlMZXZlbDIgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDIxLCBWUDlMZXZlbDIxIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDMwLCBWUDlMZXZlbDMgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDMxLCBWUDlMZXZlbDMxIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDQwLCBWUDlMZXZlbDQgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDQxLCBWUDlMZXZlbDQxIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDUwLCBWUDlMZXZlbDUgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDUxLCBWUDlMZXZlbDUxIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDUyLCBWUDlMZXZlbDUyIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDYwLCBWUDlMZXZlbDYgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDYxLCBWUDlMZXZlbDYxIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDYyLCBWUDlMZXZlbDYyIH0sCiAgICAgICAgICAgICAgICAgICAgIH07CiAKLSAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZQOUxFVkVMVFlQRSBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZXZlbDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVscy5tYXAoZGF0YVswXSwgJmxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigibGV2ZWwiLCBsZXZlbCk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTY2Niw3ICs2OTIsNyBAQAogICAgIGludDMyX3QgcHJvZmlsZTsKICAgICBpZiAocHJvZmlsZXMubWFwKHN0ZDo6bWFrZV9wYWlyKGhpZ2hCaXREZXB0aCwgcHJvZmlsZURhdGEpLCAmcHJvZmlsZSkpIHsKICAgICAgICAgLy8gYnVtcCB0byBIRFIgcHJvZmlsZQotICAgICAgICBpZiAoaXNIZHIoZm9ybWF0KSAmJiBwcm9maWxlID09IEFWMVByb2ZpbGVNYWluMTApIHsKKyAgICAgICAgaWYgKGlzSGRyMTBvcjEwUGx1cyhmb3JtYXQpICYmIHByb2ZpbGUgPT0gQVYxUHJvZmlsZU1haW4xMCkgewogICAgICAgICAgICAgaWYgKGZvcm1hdC0+Y29udGFpbnMoImhkcjEwLXBsdXMtaW5mbyIpKSB7CiAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IEFWMVByb2ZpbGVNYWluMTBIRFIxMFBsdXM7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTUwNCwxMCArMTUzMCwyMSBAQAogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTAiLCBidWZmZXIpOwogICAgIH0KIAotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleURWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpCisgICAgICAgICAgICB8fCBtZXRhLT5maW5kRGF0YShrS2V5RFZWQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKKyAgICAgICAgICAgIHx8IG1ldGEtPmZpbmREYXRhKGtLZXlEVldDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAgICAgICAgIEFMT0dWKCJEVjogY2FsbGluZyBwYXJzZURvbGJ5VmlzaW9uUHJvZmlsZUxldmVsRnJvbUR2Y2Mgd2l0aCBkYXRhIHNpemUgJXp1Iiwgc2l6ZSk7CiAgICAgICAgIHBhcnNlRG9sYnlWaXNpb25Qcm9maWxlTGV2ZWxGcm9tRHZjYyhwdHIsIHNpemUsIG1zZyk7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgYnVmZmVyLT5iYXNlKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOworCisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMiIsIGJ1ZmZlcik7CiAgICAgfQogCiAgICAgKmZvcm1hdCA9IG1zZzsKQEAgLTE3NTksMjQgKzE3OTYsMzkgQEAKICAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSB8fCBtaW1lLnN0YXJ0c1dpdGgoImltYWdlLyIpKSB7CiAgICAgICAgIGludDMyX3Qgd2lkdGg7CiAgICAgICAgIGludDMyX3QgaGVpZ2h0OwotICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSAmJiBtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKLSAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwotICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpIHx8ICFtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKICAgICAgICAgICAgIEFMT0dWKCJkaWQgbm90IGZpbmQgd2lkdGggYW5kL29yIGhlaWdodCIpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQorICAgICAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgdmFsdWUgb2Ygd2lkdGg6ICVkIGFuZC9vciBoZWlnaHQ6ICVkIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwogCi0gICAgICAgIGludDMyX3Qgc2FyV2lkdGgsIHNhckhlaWdodDsKLSAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJzYXItd2lkdGgiLCAmc2FyV2lkdGgpCi0gICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoInNhci1oZWlnaHQiLCAmc2FySGVpZ2h0KSkgeworICAgICAgICBpbnQzMl90IHNhcldpZHRoID0gLTEsIHNhckhlaWdodCA9IC0xOworICAgICAgICBib29sIGZvdW5kV2lkdGgsIGZvdW5kSGVpZ2h0OworICAgICAgICBmb3VuZFdpZHRoID0gbXNnLT5maW5kSW50MzIoInNhci13aWR0aCIsICZzYXJXaWR0aCk7CisgICAgICAgIGZvdW5kSGVpZ2h0ID0gbXNnLT5maW5kSW50MzIoInNhci1oZWlnaHQiLCAmc2FySGVpZ2h0KTsKKyAgICAgICAgaWYgKGZvdW5kV2lkdGggfHwgZm91bmRIZWlnaHQpIHsKKyAgICAgICAgICAgIGlmIChzYXJXaWR0aCA8PSAwIHx8IHNhckhlaWdodCA8PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgdmFsdWUgb2Ygc2FyV2lkdGg6ICVkIGFuZC9vciBzYXJIZWlnaHQ6ICVkIiwgc2FyV2lkdGgsIHNhckhlaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlTQVJXaWR0aCwgc2FyV2lkdGgpOwogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNBUkhlaWdodCwgc2FySGVpZ2h0KTsKICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0OwotICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImRpc3BsYXktd2lkdGgiLCAmZGlzcGxheVdpZHRoKQotICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJkaXNwbGF5LWhlaWdodCIsICZkaXNwbGF5SGVpZ2h0KSkgeworICAgICAgICBpbnQzMl90IGRpc3BsYXlXaWR0aCA9IC0xLCBkaXNwbGF5SGVpZ2h0ID0gLTE7CisgICAgICAgIGZvdW5kV2lkdGggPSBtc2ctPmZpbmRJbnQzMigiZGlzcGxheS13aWR0aCIsICZkaXNwbGF5V2lkdGgpOworICAgICAgICBmb3VuZEhlaWdodCA9IG1zZy0+ZmluZEludDMyKCJkaXNwbGF5LWhlaWdodCIsICZkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgaWYgKGZvdW5kV2lkdGggfHwgZm91bmRIZWlnaHQpIHsKKyAgICAgICAgICAgIGlmIChkaXNwbGF5V2lkdGggPD0gMCB8fCBkaXNwbGF5SGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB2YWx1ZSBvZiBkaXNwbGF5V2lkdGg6ICVkIGFuZC9vciBkaXNwbGF5SGVpZ2h0OiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCBkaXNwbGF5V2lkdGgpOwogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIGRpc3BsYXlIZWlnaHQpOwogICAgICAgICB9CkBAIC0xNzg2LDE3ICsxODM4LDI5IEBACiAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImlzLWRlZmF1bHQiLCAmaXNQcmltYXJ5KSAmJiBpc1ByaW1hcnkpIHsKICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VHJhY2tJc0RlZmF1bHQsIDEpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50MzJfdCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIGdyaWRSb3dzLCBncmlkQ29sczsKLSAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigidGlsZS13aWR0aCIsICZ0aWxlV2lkdGgpKSB7CisgICAgICAgICAgICBpbnQzMl90IHRpbGVXaWR0aCA9IC0xLCB0aWxlSGVpZ2h0ID0gLTE7CisgICAgICAgICAgICBmb3VuZFdpZHRoID0gbXNnLT5maW5kSW50MzIoInRpbGUtd2lkdGgiLCAmdGlsZVdpZHRoKTsKKyAgICAgICAgICAgIGZvdW5kSGVpZ2h0ID0gbXNnLT5maW5kSW50MzIoInRpbGUtaGVpZ2h0IiwgJnRpbGVIZWlnaHQpOworICAgICAgICAgICAgaWYgKGZvdW5kV2lkdGggfHwgZm91bmRIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBpZiAodGlsZVdpZHRoIDw9IDAgfHwgdGlsZUhlaWdodCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHZhbHVlIG9mIHRpbGVXaWR0aDogJWQgYW5kL29yIHRpbGVIZWlnaHQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlV2lkdGgsIHRpbGVIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGlsZVdpZHRoLCB0aWxlV2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJ0aWxlLWhlaWdodCIsICZ0aWxlSGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlSGVpZ2h0LCB0aWxlSGVpZ2h0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZ3JpZC1yb3dzIiwgJmdyaWRSb3dzKSkgeworICAgICAgICAgICAgaW50MzJfdCBncmlkUm93cyA9IC0xLCBncmlkQ29scyA9IC0xOworICAgICAgICAgICAgYm9vbCBmb3VuZFJvd3MsIGZvdW5kQ29sczsKKyAgICAgICAgICAgIGZvdW5kUm93cyA9IG1zZy0+ZmluZEludDMyKCJncmlkLXJvd3MiLCAmZ3JpZFJvd3MpOworICAgICAgICAgICAgZm91bmRDb2xzID0gbXNnLT5maW5kSW50MzIoImdyaWQtY29scyIsICZncmlkQ29scyk7CisgICAgICAgICAgICBpZiAoZm91bmRSb3dzIHx8IGZvdW5kQ29scykgeworICAgICAgICAgICAgICAgIGlmIChncmlkUm93cyA8PSAwIHx8IGdyaWRDb2xzIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgdmFsdWUgb2YgZ3JpZFJvd3M6ICVkIGFuZC9vciBncmlkQ29sczogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRSb3dzLCBncmlkQ29scyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkUm93cywgZ3JpZFJvd3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJncmlkLWNvbHMiLCAmZ3JpZENvbHMpKSB7CiAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUdyaWRDb2xzLCBncmlkQ29scyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE4MTIsNiArMTg3NiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcFRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BCb3R0b20pKSB7CisgICAgICAgICAgICBpZiAoY3JvcExlZnQgPCAwIHx8IGNyb3BMZWZ0ID4gY3JvcFJpZ2h0IHx8IGNyb3BSaWdodCA+PSB3aWR0aCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHZhbHVlIG9mIGNyb3BMZWZ0OiAlZCBhbmQvb3IgY3JvcFJpZ2h0OiAlZCIsIGNyb3BMZWZ0LCBjcm9wUmlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3JvcFRvcCA8IDAgfHwgY3JvcFRvcCA+IGNyb3BCb3R0b20gfHwgY3JvcEJvdHRvbSA+PSBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB2YWx1ZSBvZiBjcm9wVG9wOiAlZCBhbmQvb3IgY3JvcEJvdHRvbTogJWQiLCBjcm9wVG9wLCBjcm9wQm90dG9tKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbWV0YS0+c2V0UmVjdChrS2V5Q3JvcFJlY3QsIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOwogICAgICAgICB9CiAKQEAgLTE4NTUsOSArMTkyNywxNiBAQAogICAgICAgICAgICAgQUxPR1YoImRpZCBub3QgZmluZCBjaGFubmVsLWNvdW50IGFuZC9vciBzYW1wbGUtcmF0ZSIpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQorICAgICAgICAvLyBjaGFubmVsIGNvdW50IGNhbiBiZSB6ZXJvIGluIHNvbWUgY2FzZXMgbGlrZSBtcGVnIGgKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgPD0gMCB8fCBudW1DaGFubmVscyA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHZhbHVlIG9mIGNoYW5uZWwtY291bnQ6ICVkIGFuZC9vciBzYW1wbGUtcmF0ZTogJWQiLAorICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOwogICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZTsKKyAgICAgICAgLy8gVE9ETzooYi8yMDQ0MzA5NTIpIGFkZCBhcHByb3ByaWF0ZSBib3VuZCBjaGVjayBmb3IgYml0c1BlclNhbXBsZQogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImJpdHMtcGVyLXNhbXBsZSIsICZiaXRzUGVyU2FtcGxlKSkgewogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGJpdHNQZXJTYW1wbGUpOwogICAgICAgICB9CkBAIC0xOTY3LDMwICsyMDQ2LDE0NyBAQAogICAgICAgICAgICAgICAgICAgIG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfSU1BR0VfQVZJRikgewogICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVYxQywgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OKSB7Ci0gICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjc2QtMiIsICZjc2QyKSkgewotICAgICAgICAgICAgICAgIC8vZHZjYyBzaG91bGQgYmUgMjQKLSAgICAgICAgICAgICAgICBpZiAoY3NkMi0+c2l6ZSgpID09IDI0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleURWQ0MsIGtUeXBlRFZDQywgY3NkMi0+ZGF0YSgpLCBjc2QyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkdmNjID0gY3NkMi0+ZGF0YSgpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHByb2ZpbGUgPSBkdmNjWzJdID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlID4gMSAmJiBwcm9maWxlIDwgOSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaHZjYyhjc2Qwc2l6ZSArIDEwMjQpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlSFZDQyhjc2QwLCBodmNjLmRhdGEoKSwgaHZjYy5zaXplKCksIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga1R5cGVIVkNDLCBodmNjLmRhdGEoKSwgb3V0c2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRG9sYnlWaXNpb25Qcm9maWxlRHZhdjExMCA9PSBwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVjFDLCAwLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjc2QxOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBhdmNjKGNzZDBzaXplICsgY3NkMS0+c2l6ZSgpICsgMTAyNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlQVZDQyhjc2QwLCBjc2QxLCBhdmNjLmRhdGEoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLCBhdmNjLmRhdGEoKSwgb3V0c2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgcHJvZmlsZSA9IC0xOworICAgICAgICAgICAgdWludDhfdCBibENvbXBhdGliaWxpdHlJZCA9IC0xOworICAgICAgICAgICAgaW50MzJfdCBsZXZlbCA9IDA7CisgICAgICAgICAgICB1aW50OF90IHByb2ZpbGVWYWwgPSAtMTsKKyAgICAgICAgICAgIHVpbnQ4X3QgcHJvZmlsZVZhbDEgPSAtMTsKKyAgICAgICAgICAgIHVpbnQ4X3QgcHJvZmlsZVZhbDIgPSAtMTsKKyAgICAgICAgICAgIGNvbnN0ZXhwciBzaXplX3QgZHZjY1NpemUgPSAyNDsKKworICAgICAgICAgICAgY29uc3QgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiAmcHJvZmlsZXMgPQorICAgICAgICAgICAgICAgIGdldERvbGJ5VmlzaW9uUHJvZmlsZVRhYmxlKCk7CisgICAgICAgICAgICBjb25zdCBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+ICZsZXZlbHMgPQorICAgICAgICAgICAgICAgIGdldERvbGJ5VmlzaW9uTGV2ZWxzVGFibGUoKTsKKworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRCdWZmZXIoImNzZC0yIiwgJmNzZDIpKSB7CisgICAgICAgICAgICAgICAgLy8gTVA0IGV4dHJhY3RvcnMgYXJlIGV4cGVjdGVkIHRvIGdlbmVyYXRlIGNzZCBidWZmZXIKKyAgICAgICAgICAgICAgICAvLyBzb21lIGVuY29kZXJzIG1pZ2h0IG5vdCBiZSBnZW5lcmF0aW5nIGl0LCBpbiB3aGljaAorICAgICAgICAgICAgICAgIC8vIGNhc2Ugd2UgcG9wdWxhdGUgdGhlIHRyYWNrIG1ldGFkYXRhIGR2IChjY3x2Y3x3YykKKyAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSAncHJvZmlsZScgYW5kICdsZXZlbCcgaW5mby4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgYWNjb3JkaW5nIHRvIERvbGJ5IFZpc2lvbiBJU09CTUZGIHNwZWMKKworICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoInByb2ZpbGUiLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkRvbGJ5IFZpc2lvbiBwcm9maWxlIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigibGV2ZWwiLCAmbGV2ZWwpOworCisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUgPT0gRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcHJvZmlsZXMucmxvb2t1cChEb2xieVZpc2lvblByb2ZpbGVEdmhlU3QsICZwcm9maWxlVmFsKSkgeyAvLyBkdmhlLjA4CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRG9sYnkgVmlzaW9uIHByb2ZpbGUgbG9va3VwIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJsQ29tcGF0aWJpbGl0eUlkID0gNDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcHJvZmlsZXMucmxvb2t1cChEb2xieVZpc2lvblByb2ZpbGVEdmF2U2UsICZwcm9maWxlVmFsKSkgeyAvLyBkdmF2LjA5CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRG9sYnkgVmlzaW9uIHByb2ZpbGUgbG9va3VwIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJsQ29tcGF0aWJpbGl0eUlkID0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRG9sYnkgVmlzaW9uIHByb2ZpbGUgbG9vayB1cCBlcnJvciIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByb2ZpbGUgPSAoaW50MzJfdCkgcHJvZmlsZVZhbDsKKworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGV2ZWxfdmFsID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWxldmVscy5tYXAobGV2ZWwsICZsZXZlbF92YWwpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJEb2xieSBWaXNpb24gbGV2ZWwgbG9va3VwIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZHZjYyhkdmNjU2l6ZSk7CisKKyAgICAgICAgICAgICAgICBkdmNjWzBdID0gMTsgLy8gbWFqb3IgdmVyc2lvbgorICAgICAgICAgICAgICAgIGR2Y2NbMV0gPSAwOyAvLyBtaW5vciB2ZXJzaW9uCisgICAgICAgICAgICAgICAgZHZjY1syXSA9ICh1aW50OF90KSgocHJvZmlsZSAmIDB4N2YpIDw8IDEpOyAvLyBkb2xieSB2aXNpb24gcHJvZmlsZQorICAgICAgICAgICAgICAgIGR2Y2NbMl0gPSAodWludDhfdCkoKGR2Y2NbMl0gfCAodWludDhfdCkoKGxldmVsX3ZhbCA+PiA1KSAmIDB4MSkpICYgMHhmZik7CisgICAgICAgICAgICAgICAgZHZjY1szXSA9ICh1aW50OF90KSgobGV2ZWxfdmFsICYgMHgxZikgPDwgMyk7IC8vIGRvbGJ5IHZpc2lvbiBsZXZlbAorICAgICAgICAgICAgICAgIGR2Y2NbM10gPSAodWludDhfdCkoZHZjY1szXSB8ICgxIDw8IDIpKTsgLy8gcnB1X3ByZXNlbnRfZmxhZworICAgICAgICAgICAgICAgIGR2Y2NbM10gPSAodWludDhfdCkoZHZjY1szXSB8ICgxKSk7IC8vIGJsX3ByZXNlbnRfZmxhZworICAgICAgICAgICAgICAgIGR2Y2NbNF0gPSAodWludDhfdCkoYmxDb21wYXRpYmlsaXR5SWQgPDwgNCk7IC8vIGJsX2NvbXBhdGliaWxpdHkgaWQKKworICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJsb29rdXAoRG9sYnlWaXNpb25Qcm9maWxlRHZhdjExMCwgJnByb2ZpbGVWYWwpOworICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJsb29rdXAoRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0YiwgJnByb2ZpbGVWYWwxKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZSA+IChpbnQzMl90KSBwcm9maWxlVmFsKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleURWV0MsIGtUeXBlRFZXQywgZHZjYy5kYXRhKCksIGR2Y2NTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPiAoaW50MzJfdCkgcHJvZmlsZVZhbDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RFZWQywga1R5cGVEVlZDLCBkdmNjLmRhdGEoKSwgZHZjY1NpemUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleURWQ0MsIGtUeXBlRFZDQywgZHZjYy5kYXRhKCksIGR2Y2NTaXplKTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIldlIG5lZWQgY3NkLTIhIS4gJXMiLCBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGNzZC0yLCBqdXN0IHVzZSB0aGF0IHRvIHBvcHVsYXRlIGR2Y2MKKyAgICAgICAgICAgICAgICBpZiAoY3NkMi0+c2l6ZSgpID09IGR2Y2NTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmR2Y2MgPSBjc2QyLT5kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBkdmNjWzJdID4+IDE7CisKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMucmxvb2t1cChEb2xieVZpc2lvblByb2ZpbGVEdmF2MTEwLCAmcHJvZmlsZVZhbCk7CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJsb29rdXAoRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0YiwgJnByb2ZpbGVWYWwxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUgPiAoaW50MzJfdCkgcHJvZmlsZVZhbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RFZXQywga1R5cGVEVldDLCBjc2QyLT5kYXRhKCksIGNzZDItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA+IChpbnQzMl90KSBwcm9maWxlVmFsMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RFZWQywga1R5cGVEVlZDLCBjc2QyLT5kYXRhKCksIGNzZDItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RFZDQywga1R5cGVEVkNDLCBjc2QyLT5kYXRhKCksIGNzZDItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb252ZXJ0IE1lc3NhZ2VUb01ldGFkYXRhIGNzZC0yIGlzIHByZXNlbnQgYnV0IG5vdCB2YWxpZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2ZpbGVzLnJsb29rdXAoRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlbiwgJnByb2ZpbGVWYWwpOworICAgICAgICAgICAgcHJvZmlsZXMucmxvb2t1cChEb2xieVZpc2lvblByb2ZpbGVEdmF2U2UsICZwcm9maWxlVmFsMSk7CisgICAgICAgICAgICBwcm9maWxlcy5ybG9va3VwKERvbGJ5VmlzaW9uUHJvZmlsZUR2YXYxMTAsICZwcm9maWxlVmFsMik7CisgICAgICAgICAgICBpZiAoKHByb2ZpbGUgPiAoaW50MzJfdCkgcHJvZmlsZVZhbCkgJiYgKHByb2ZpbGUgPCAoaW50MzJfdCkgcHJvZmlsZVZhbDEpKSB7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaHZjYyhjc2Qwc2l6ZSArIDEwMjQpOworICAgICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUhWQ0MoY3NkMCwgaHZjYy5kYXRhKCksIGh2Y2Muc2l6ZSgpLCA0KTsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGh2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSAoaW50MzJfdCkgcHJvZmlsZVZhbDIpIHsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVjFDLCAwLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNzZDE7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYXZjYyhjc2Qwc2l6ZSArIGNzZDEtPnNpemUoKSArIDEwMjQpOworICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0c2l6ZSA9IHJlYXNzZW1ibGVBVkNDKGNzZDAsIGNzZDEsIGF2Y2MuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLCBhdmNjLmRhdGEoKSwgb3V0c2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZG9sYnkgdmlzaW9uIGF2YywgY3NkMCBhbHNvIGhvbGRzIGNzZDEKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgY3NkMHJlYWxzaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGZpbmROZXh0TmFsU3RhcnRDb2RlKGNzZDAtPmRhdGEoKSArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NkMC0+c2l6ZSgpIC0gaSkgLSBjc2QwLT5kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2QwcmVhbHNpemUgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaSArPSA0OworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKGkgPCBjc2QwLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIwIC0+IGNzZDAKKyAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyMCA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKGNzZDByZWFsc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIwLmdldCgpID09IE5VTEwgfHwgYnVmZmVyMC0+YmFzZSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlcjAtPmRhdGEoKSwgY3NkMC0+ZGF0YSgpLCBjc2QwcmVhbHNpemUpOworICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIxIC0+IGNzZDEKKyAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyMSA9IG5ldyAoc3RkOjpub3Rocm93KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCdWZmZXIoY3NkMC0+c2l6ZSgpIC0gY3NkMHJlYWxzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcjEuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXIxLT5iYXNlKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyMS0+ZGF0YSgpLCBjc2QwLT5kYXRhKCkrY3NkMHJlYWxzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2QwLT5zaXplKCkgLSBjc2QwcmVhbHNpemUpOworCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGF2Y2MoY3NkMC0+c2l6ZSgpICsgMTAyNCk7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUFWQ0MoYnVmZmVyMCwgYnVmZmVyMSwgYXZjYy5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGF2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVZwOUNvZGVjUHJpdmF0ZSwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwpAQCAtMjEzMSwyOSArMjMyNywyOSBAQAogfQogCiBzdHJ1Y3QgYWFjX2Zvcm1hdF9jb252X3QgewotICAgIE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSBlQWFjUHJvZmlsZVR5cGU7CisgICAgaW50MzJfdCBlQWFjUHJvZmlsZVR5cGU7CiAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhYWNfZm9ybWF0X2NvbnZfdCBwcm9maWxlTG9va3VwW10gPSB7Ci0gICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TWFpbiwgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTUFJTn0sCi0gICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TEMsICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTEN9LAotICAgIHsgT01YX0FVRElPX0FBQ09iamVjdFNTUiwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX1NTUn0sCi0gICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TFRQLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTFRQfSwKLSAgICB7IE9NWF9BVURJT19BQUNPYmplY3RIRSwgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMX0sCi0gICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0U2NhbGFibGUsICAgIEFVRElPX0ZPUk1BVF9BQUNfU0NBTEFCTEV9LAotICAgIHsgT01YX0FVRElPX0FBQ09iamVjdEVSTEMsICAgICAgICBBVURJT19GT1JNQVRfQUFDX0VSTEN9LAotICAgIHsgT01YX0FVRElPX0FBQ09iamVjdExELCAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xEfSwKLSAgICB7IE9NWF9BVURJT19BQUNPYmplY3RIRV9QUywgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMn0sCi0gICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0RUxELCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfRUxEfSwKLSAgICB7IE9NWF9BVURJT19BQUNPYmplY3RYSEUsICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19YSEV9LAotICAgIHsgT01YX0FVRElPX0FBQ09iamVjdE51bGwsICAgICAgICBBVURJT19GT1JNQVRfQUFDfSwKKyAgICB7IEFBQ09iamVjdE1haW4sICAgICAgICBBVURJT19GT1JNQVRfQUFDX01BSU59LAorICAgIHsgQUFDT2JqZWN0TEMsICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTEN9LAorICAgIHsgQUFDT2JqZWN0U1NSLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfU1NSfSwKKyAgICB7IEFBQ09iamVjdExUUCwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xUUH0sCisgICAgeyBBQUNPYmplY3RIRSwgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMX0sCisgICAgeyBBQUNPYmplY3RTY2FsYWJsZSwgICAgQVVESU9fRk9STUFUX0FBQ19TQ0FMQUJMRX0sCisgICAgeyBBQUNPYmplY3RFUkxDLCAgICAgICAgQVVESU9fRk9STUFUX0FBQ19FUkxDfSwKKyAgICB7IEFBQ09iamVjdExELCAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xEfSwKKyAgICB7IEFBQ09iamVjdEhFX1BTLCAgICAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YyfSwKKyAgICB7IEFBQ09iamVjdEVMRCwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0VMRH0sCisgICAgeyBBQUNPYmplY3RYSEUsICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19YSEV9LAorICAgIHsgQUFDT2JqZWN0TnVsbCwgICAgICAgIEFVRElPX0ZPUk1BVF9BQUN9LAogfTsKIAogdm9pZCBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdCggYXVkaW9fZm9ybWF0X3QmIGZvcm1hdCwgdWludDY0X3QgZUFhY1Byb2ZpbGUpCiB7Ci1jb25zdCBzdHJ1Y3QgYWFjX2Zvcm1hdF9jb252X3QqIHAgPSAmcHJvZmlsZUxvb2t1cFswXTsKLSAgICB3aGlsZSAocC0+ZUFhY1Byb2ZpbGVUeXBlICE9IE9NWF9BVURJT19BQUNPYmplY3ROdWxsKSB7CisgICAgY29uc3Qgc3RydWN0IGFhY19mb3JtYXRfY29udl90KiBwID0gJnByb2ZpbGVMb29rdXBbMF07CisgICAgd2hpbGUgKHAtPmVBYWNQcm9maWxlVHlwZSAhPSBBQUNPYmplY3ROdWxsKSB7CiAgICAgICAgIGlmIChlQWFjUHJvZmlsZSA9PSBwLT5lQWFjUHJvZmlsZVR5cGUpIHsKICAgICAgICAgICAgIGZvcm1hdCA9IHAtPmZvcm1hdDsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTIxOTMsNyArMjM4OSw3IEBACiAgICAgLy8gT2ZmbG9hZGluZyBkZXBlbmRzIG9uIGF1ZGlvIERTUCBjYXBhYmlsaXRpZXMuCiAgICAgaW50MzJfdCBhYWNhb3QgPSAtMTsKICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlBQUNBT1QsICZhYWNhb3QpKSB7Ci0gICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KGluZm8tPmZvcm1hdCwoT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFKSBhYWNhb3QpOworICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChpbmZvLT5mb3JtYXQsIGFhY2FvdCk7CiAgICAgfQogCiAgICAgaW50MzJfdCBzcmF0ZSA9IC0xOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcAppbmRleCA0ZTViNWUyLi5kZThlNDI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcApAQCAtMjIsOCArMjIsOCBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KLSNpbmNsdWRlIDx1aS9EaXNwbGF5U3RhdEluZm8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2d1aS9JU3VyZmFjZUNvbXBvc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9ndWkvRGlzcGxheVN0YXRJbmZvLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CkBAIC0zOSwyMSArMzksMjIgQEAKICAgICBtVnN5bmNUaW1lID0gMDsKICAgICBtVnN5bmNQZXJpb2QgPSAwOwogCisgICAgLy8gVE9ETyhiLzIyMDAyMTI1NSk6IHdyYXAgdGhpcyBpbnRvIFN1cmZhY2VDb21wb3NlckNsaWVudAogICAgIGlmIChtQ29tcG9zZXIgPT0gTlVMTCkgewotICAgICAgICBTdHJpbmcxNiBuYW1lKCJTdXJmYWNlRmxpbmdlciIpOworICAgICAgICBTdHJpbmcxNiBuYW1lKCJTdXJmYWNlRmxpbmdlckFJREwiKTsKICAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgICAgICBtQ29tcG9zZXIgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZUNvbXBvc2VyPihzbS0+Y2hlY2tTZXJ2aWNlKG5hbWUpKTsKKyAgICAgICAgbUNvbXBvc2VyID0gaW50ZXJmYWNlX2Nhc3Q8Z3VpOjpJU3VyZmFjZUNvbXBvc2VyPihzbS0+Y2hlY2tTZXJ2aWNlKG5hbWUpKTsKICAgICB9CiAgICAgaWYgKG1Db21wb3NlciAhPSBOVUxMKSB7Ci0gICAgICAgIERpc3BsYXlTdGF0SW5mbyBzdGF0czsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gbUNvbXBvc2VyLT5nZXREaXNwbGF5U3RhdHMoTlVMTCAvKiBkaXNwbGF5ICovLCAmc3RhdHMpOwotICAgICAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIGd1aTo6RGlzcGxheVN0YXRJbmZvIHN0YXRzOworICAgICAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBtQ29tcG9zZXItPmdldERpc3BsYXlTdGF0cyhudWxscHRyLyogZGlzcGxheSAqLywgJnN0YXRzKTsKKyAgICAgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgICAgIEFMT0dWKCJ2c3luYyB0aW1lOiVsbGQgcGVyaW9kOiVsbGQiLAogICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXN0YXRzLnZzeW5jVGltZSwgKGxvbmcgbG9uZylzdGF0cy52c3luY1BlcmlvZCk7CiAgICAgICAgICAgICBtVnN5bmNUaW1lID0gc3RhdHMudnN5bmNUaW1lOwogICAgICAgICAgICAgbVZzeW5jUGVyaW9kID0gc3RhdHMudnN5bmNQZXJpb2Q7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiZ2V0RGlzcGxheVN0YXRzIHJldHVybmVkICVkIiwgcmVzKTsKKyAgICAgICAgICAgIEFMT0dXKCJnZXREaXNwbGF5U3RhdHMgcmV0dXJuZWQgJWQiLCBzdGF0dXMudHJhbnNhY3Rpb25FcnJvcigpKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dXKCJjb3VsZCBub3QgZ2V0IHN1cmZhY2UgbUNvbXBvc2VyIHNlcnZpY2UiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icAppbmRleCAwODY5MWU3Li5hZmZjODM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0yMSw2ICsyMSwxMCBAQAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogCiAgICAgc3JjczogWyJjbW5NZW1vcnkuYyJdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAppbmRleCBmYjZjNGUyLi5iYjFjYjBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKQEAgLTM1NCw3ICszNTQsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobXBlZzR0eXBlLT5lUHJvZmlsZSAhPSBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZSB8fAotICAgICAgICAgICAgICAgIG1wZWc0dHlwZS0+ZUxldmVsICE9IE9NWF9WSURFT19NUEVHNExldmVsMiB8fAorICAgICAgICAgICAgICAgIG1wZWc0dHlwZS0+ZUxldmVsID4gT01YX1ZJREVPX01QRUc0TGV2ZWwyIHx8CiAgICAgICAgICAgICAgICAgKG1wZWc0dHlwZS0+bkFsbG93ZWRQaWN0dXJlVHlwZXMgJiBPTVhfVklERU9fUGljdHVyZVR5cGVCKSB8fAogICAgICAgICAgICAgICAgIG1wZWc0dHlwZS0+bkJGcmFtZXMgIT0gMCB8fAogICAgICAgICAgICAgICAgIG1wZWc0dHlwZS0+bklEQ1ZMQ1RocmVzaG9sZCAhPSAwIHx8CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLmJwCmluZGV4IDA2Y2ViZDMuLjdmZjliMTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLmJwCkBAIC0yNSwxMCArMjUsNiBAQAogICAgICAgICAiU29mdHdhcmVSZW5kZXJlci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLApAQCAtMzcsNiArMzMsNyBAQAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYnl1dl9zdGF0aWMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCmluZGV4IGM3ZGM0MTUuLjRiNGY2NWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKICNpbmNsdWRlICJsaWJ5dXYvY29udmVydF9mcm9tLmgiCkBAIC01MSwzNSArNTIsMTgzIEBACiBzdGF0aWMgYm9vbCBpc1JHQihPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCkgewogICAgIHJldHVybiBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUKICAgICAgICAgICAgIHx8IGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4Ci0gICAgICAgICAgICB8fCBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODsKKyAgICAgICAgICAgIHx8IGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4CisgICAgICAgICAgICB8fCBjb2xvckZvcm1hdCA9PSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1IyMTAxMDEwOwogfQogCi1ib29sIENvbG9yQ29udmVydGVyOjpDb2xvclNwYWNlOjppc0J0NzA5KCkgewotICAgIHJldHVybiAobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ3MDkpOworYm9vbCBDb2xvckNvbnZlcnRlcjo6Q29sb3JTcGFjZTo6aXNCdDIwMjAoKSBjb25zdCB7CisgICAgcmV0dXJuIChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDIwMjApOwogfQogCitib29sIENvbG9yQ29udmVydGVyOjpDb2xvclNwYWNlOjppc0g0MjAoKSBjb25zdCB7CisgICAgcmV0dXJuIChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDcwOSkKKyAgICAgICAgICAgICYmIChtUmFuZ2UgPT0gQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VMaW1pdGVkKTsKK30KIAotYm9vbCBDb2xvckNvbnZlcnRlcjo6Q29sb3JTcGFjZTo6aXNKcGVnKCkgeworLy8gdGhlIG1hdHJpeCBjb2VmZmljaWVudHMgYXJlIHRoZSBzYW1lIGZvciBib3RoIDYwMS42MjUgYW5kIDYwMS41MjUgc3RhbmRhcmRzCitib29sIENvbG9yQ29udmVydGVyOjpDb2xvclNwYWNlOjppc0k0MjAoKSBjb25zdCB7CisgICAgcmV0dXJuICgobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ2MDFfNjI1KQorICAgICAgICAgICAgfHwgKG1TdGFuZGFyZCA9PSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzUyNSkpCisgICAgICAgICAgICAmJiAobVJhbmdlID09IENvbG9yVXRpbHM6OmtDb2xvclJhbmdlTGltaXRlZCk7Cit9CisKK2Jvb2wgQ29sb3JDb252ZXJ0ZXI6OkNvbG9yU3BhY2U6OmlzSjQyMCgpIGNvbnN0IHsKICAgICByZXR1cm4gKChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV82MjUpCiAgICAgICAgICAgICB8fCAobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ2MDFfNTI1KSkKICAgICAgICAgICAgICYmIChtUmFuZ2UgPT0gQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VGdWxsKTsKIH0KIAorLyoqCisgKiBUaGlzIGNsYXNzIGFwcHJveGltYXRlcyB0aGUgc3RhbmRhcmQgWVVWIHRvIFJHQiBjb252ZXJzaW9ucyBieSBmYWN0b3JpbmcgdGhlIG1hdHJpeAorICogY29lZmZpY2llbnRzIHRvIDEvMjU2dGgtcyAoYXMgZGl2aWRpbmcgYnkgMjU2IGlzIGVhc3kgdG8gZG8gd2l0aCByaWdodCBzaGlmdCkuIFRoZSBjaG9zZW4gdmFsdWUKKyAqIG9mIDI1NiBpcyBzb21ld2hhdCBhcmJpdHJhcnkgYW5kIHdhcyBub3QgZGVwZW5kZW50IG9uIHRoZSBiaXQtZGVwdGgsIGJ1dCBpdCBkb2VzIGxpbWl0IHRoZQorICogcHJlY2lzaW9uIG9mIHRoZSBtYXRyaXggY29lZmZpY2llbnRzIChLUiAmIEtCKS4KKyAqCisgKiBUaGUgbWF4aW11bSBjb2xvciBlcnJvciBhZnRlciBjbGlwcGluZyBmcm9tIHVzaW5nIDI1NiBpcyBhIGRpc3RhbmNlIG9mOgorICogICAwLjQgKDgtYml0KSAvIDEuNCAoMTAtYml0KSBmb3IgZ3JlZW5zIGluIEJULjYwMQorICogICAwLjUgKDgtYml0KSAvIDEuOSAoMTAtYml0KSBmb3IgY3lhbnMgaW4gQlQuNzA5LCBhbmQKKyAqICAgMC4zICg4LWJpdCkgLyAxLjMgKDEwLWJpdCkgZm9yIHZpb2xldHMgaW4gQlQuMjAyMCAoaXQgaXMgMC40IGZvciAxMC1iaXQgQlQuMjAyMCBsaW1pdGVkKQorICoKKyAqIE5vdGUgZm9yIHJlZmVyZW5jZTogbGlieXV2IGlzIHVzaW5nIGEgZGl2aXNvciBvZiA2NCBpbnN0ZWFkIG9mIDI1NiB0byBlbnN1cmUgbm8gb3ZlcmZsb3cgaW4KKyAqIDE2LWJpdCBtYXRoLiBUaGUgbWF4aW11bSBjb2xvciBlcnJvciBmb3IgbGlieXV2IGlzIDMuNSAvIDE0LgorICoKKyAqIFRoZSBjbGFtcGluZyBpcyBkb25lIHVzaW5nIGEgbG9va3VwIHZlY3RvciB3aGVyZSBuZWdhdGl2ZSBpbmRpY2VzIGFyZSBtYXBwZWQgdG8gMAorICogYW5kIGluZGljZXMgPiAyNTUgYXJlIG1hcHBlZCB0byAyNTUuIChGb3IgMTAtYml0IHRoZXNlIGFyZSBjbGFtcGVkIHRvIDAgdG8gMTAyMykKKyAqCisgKiBUaGUgbWF0cmljZXMgYXJlIGFzc3VtZWQgdG8gYmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQgKG5vdGUgdGhlIHNpZ24gb24gdGhlIDJuZCByb3cpOgorICoKKyAqIFsgUiBdICAgICBbIF95ICAgICAwICAgIF9yX3YgXSAgIFsgWSAtICBDMTYgXQorICogWyBHIF0gID0gIFsgX3kgIC1fZ191ICAtX2dfdiBdICogWyBVIC0gQzEyOCBdCisgKiBbIEIgXSAgICAgWyBfeSAgIF9iX3UgICAgIDAgIF0gICBbIFYgLSBDMTI4IF0KKyAqCisgKiBDMTYgaXMgMSA8PCAoYml0ZGVwdGggLSA0KSBmb3IgbGltaXRlZCByYW5nZSwgYW5kIDAgZm9yIGZ1bGwgcmFuZ2UKKyAqIEMxMjggaXMgMSA8PCAoYml0ZGVwdGggLSAxKQorICogQzI1NSBpcyAoMSA8PCBiaXRkZXB0aCkgLSAxCisgKgorICogVGhlIG1pbiBhbmQgbWF4IHZhbHVlcyBmcm9tIHRoZXNlIGVxdWF0aW9ucyBkZXRlcm1pbmUgdGhlIGNsaXAgcmFuZ2UgbmVlZGVkIGZvciBjbGFtcGluZzoKKyAqCisgKiBtaW4gPSAtIChfeSAqIEMxNiArIG1heCgoX2dfdSArIF9nX3YpICogKEMyNTUtQzEyOCksIG1heChfcl92LCBfYl91KSAqIEMxMjgpKSAvIDI1NgorICogbWF4ID0gKF95ICogKEMyNTUgLSBDMTYpICsgbWF4KChfZ191ICsgX2dfdikgKiBDMTI4LCBtYXgoX3JfdiwgX2JfdSkgKiAoQzI1NS1DMTI4KSkgKyAxMjgpIC8gMjU2CisgKi8KKworc3RydWN0IENvbG9yQ29udmVydGVyOjpDb2VmZnMgeworICAgIGludDMyX3QgX3k7CisgICAgaW50MzJfdCBfcl92OworICAgIGludDMyX3QgX2dfdTsKKyAgICBpbnQzMl90IF9nX3Y7CisgICAgaW50MzJfdCBfYl91OworfTsKKworLyoKKworQ29sb3IgY29udmVyc2lvbiBydWxlcyBhcmUgZGljdGF0ZWQgYnkgSVNPIChlLmcuIElTTzpJRUMgMjMwMDg6MikKKworTGltaXRlZCByYW5nZSBtZWFucyBZIGlzIGluIFsxNiwgMjM1XSwgVSBhbmQgViBhcmUgaW4gWzE2LCAyMjRdIGNvcnJlc3BvbmRpbmcgdG8gWy0wLjUgdG8gMC41XS4KKworRnVsbCByYW5nZSBtZWFucyBZIGlzIGluIFswLCAyNTVdLCBVIGFuZCBWIGFyZSBpbiBbMC41LCAyNTUuNV0gY29ycmVzcG9uZGluZyB0byBbLTAuNSB0byAuNV0uCisKK1JHQiBpcyBhbHdheXMgaW4gZnVsbCByYW5nZSAoWzAsIDI1NV0pCisKK1RoZSBjb2xvciBwcmltYXJpZXMgZGV0ZXJtaW5lIHRoZSBLUiBhbmQgS0IgdmFsdWVzOgorCisKK0ZvciBmdWxsIHJhbmdlIChhc3N1bWluZyA4LWJpdHMpIElTTyBkZWZpbmVzOgorCisoICAgWSAgICkgICAoICBLUiAgICAgIDEtS1ItS0IgICAgICAgS0IgICkKKyggICAgICAgKSAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgIChSKQorKCAgICAgICApICAgKC1LUi8yICAgLSgxLUtSLUtCKS8yICAgICAgICApICAgKCApCisoVSAtIDEyOCkgPSAoLS0tLS0gICAtLS0tLS0tLS0tLS0gICAgMC41ICkgKiAoRykKKyggICAgICAgKSAgICgoMS1LQikgICAgICgxLUtCKSAgICAgICAgICAgKSAgICggKQorKCAgICAgICApICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgKEIpCisoICAgICAgICkgICAoICAgICAgICAtKDEtS1ItS0IpLzIgIC1LQi8yICkKKyhWIC0gMTI4KSAgICggMC41ICAgIC0tLS0tLS0tLS0tLSAgLS0tLS0gKQorICAgICAgICAgICAgKCAgICAgICAgICAgKDEtS1IpICAgICAoMS1LUikpCisKKyh0aGUgbWF0aCBpcyByb3VuZGVkLCAxMjggaXMgKDEgPDwgKGJpdGRlcHRoIC0gMSkpICkKKworRnJvbSB0aGlzCisKKyhSKSAgICAgICggMSAgICAgICAwICAgICAgICAyKigxLUtSKSAgICkgICAoICAgWSAgICkKKyggKSAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAoICAgICAgICkKKyggKSAgICAgICggICAgMipLQiooS0ItMSkgIDIqS1IqKEtSLTEpICkgICAoICAgICAgICkKKyhHKSAgPSAgICggMSAgLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tICkgKiAoVSAtIDEyOCkKKyggKSAgICAgICggICAgICAxLUtSLUtCICAgICAgMS1LUi1LQiAgICkgICAoICAgICAgICkKKyggKSAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAoICAgICAgICkKKyhCKSAgICAgICggMSAgIDIqKDEtS0IpICAgICAgICAgMCAgICAgICkgICAoViAtIDEyOCkKKworRm9yIGxpbWl0ZWQgcmFuZ2UsIHRoaXMgYmVjb21lcworCisoUikgICAgICAoIDEgICAgICAgMCAgICAgICAgMiooMS1LUikgICApICAgKDI1NS8yMTkgIDAgIDApICAgKFkgLSAgMTYpCisoICkgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgKCAgICAgICAgICAgICApICAgKCAgICAgICApCisoICkgICAgICAoICAgIDIqS0IqKEtCLTEpICAyKktSKihLUi0xKSApICAgKCAgICAgICAgICAgICApICAgKCAgICAgICApCisoRykgID0gICAoIDEgIC0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLSApICogKDAgIDI1NS8yMjQgIDApICogKFUgLSAxMjgpCisoICkgICAgICAoICAgICAgMS1LUi1LQiAgICAgIDEtS1ItS0IgICApICAgKCAgICAgICAgICAgICApICAgKCAgICAgICApCisoICkgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgKCAgICAgICAgICAgICApICAgKCAgICAgICApCisoQikgICAgICAoIDEgICAyKigxLUtCKSAgICAgICAgIDAgICAgICApICAgKDAgIDAgIDI1NS8yMjQpICAgKFYgLSAxMjgpCisKKyggRm9yIG5vbi04LWJpdCwgMTYgaXMgKDEgPDwgKGJpdGRlcHRoIC0gNCkpLCAxMjggaXMgKDEgPDwgKGJpdGRlcHRoIC0gMSkpLAorICAyNTUgaXMgKCgxIDw8IGJpdGRlcHRoKSAtIDEpLCAyMTkgaXMgKDIxOSA8PCAoYml0ZGVwdGggLSA4KSkgYW5kCisgIDIyNCBpcyAoMjI0IDw8IChiaXRkZXB0aCAtIDgpKSwgc28gdGhlIG1hdHJpeCBjb2VmZmljaWVudHMgc2xpZ2h0bHkgY2hhbmdlLiApCisKKyovCisKK25hbWVzcGFjZSB7CisKKy8qKgorICogQlQuNjAxOiAgS19SID0gMC4yOTk7ICBLX0IgPSAwLjExNAorICoKKyAqIGNsaXAgcmFuZ2UgOC1iaXQ6IFstMjc3LCA1MzVdLCAxMC1iaXQ6IFstMTExMSwgMjE1NV0KKyAqLworY29uc3Qgc3RydWN0IENvbG9yQ29udmVydGVyOjpDb2VmZnMgQlQ2MDFfRlVMTCAgICAgID0geyAyNTYsIDM1OSwgIDg4LCAxODMsIDQ1NCB9OworY29uc3Qgc3RydWN0IENvbG9yQ29udmVydGVyOjpDb2VmZnMgQlQ2MDFfTElNSVRFRCAgID0geyAyOTgsIDQwOSwgMTAwLCAyMDgsIDUxNiB9OworY29uc3Qgc3RydWN0IENvbG9yQ29udmVydGVyOjpDb2VmZnMgQlQ2MDFfTFREXzEwQklUID0geyAyOTksIDQxMCwgMTAxLCAyMDksIDUxOCB9OworCisvKioKKyAqIEJULjcwOTogIEtfUiA9IDAuMjEyNjsgS19CID0gMC4wNzIyCisgKgorICogY2xpcCByYW5nZSA4LWJpdDogWy0yODksIDU0N10sIDEwLWJpdDogWy0xMTU5LCAyMjAyXQorICovCitjb25zdCBzdHJ1Y3QgQ29sb3JDb252ZXJ0ZXI6OkNvZWZmcyBCVDcwOV9GVUxMICAgICAgPSB7IDI1NiwgNDAzLCAgNDgsIDEyMCwgNDc1IH07Citjb25zdCBzdHJ1Y3QgQ29sb3JDb252ZXJ0ZXI6OkNvZWZmcyBCVDcwOV9MSU1JVEVEICAgPSB7IDI5OCwgNDU5LCAgNTUsIDEzNiwgNTQxIH07Citjb25zdCBzdHJ1Y3QgQ29sb3JDb252ZXJ0ZXI6OkNvZWZmcyBCVDcwOV9MVERfMTBCSVQgPSB7IDI5MCwgNDYwLCAgNTUsIDEzNywgNTQyIH07CisKKy8qKgorICogQlQuMjAyMDogIEtfUiA9IDAuMjYyNzsgS19CID0gMC4wNTkzCisgKgorICogY2xpcCByYW5nZSA4LWJpdDogWy0yOTQsIDU1Ml0sIDEwLWJpdDogWy0xMTc1LCAyMjE4XQorICoKKyAqIFRoaXMgaXMgdGhlIGxhcmdlc3QgY2xpcCByYW5nZS4KKyAqLworY29uc3Qgc3RydWN0IENvbG9yQ29udmVydGVyOjpDb2VmZnMgQlQyMDIwX0ZVTEwgICAgICA9IHsgMjU2LCAzNzcsICA0MiwgMTQ2LCA0ODIgfTsKK2NvbnN0IHN0cnVjdCBDb2xvckNvbnZlcnRlcjo6Q29lZmZzIEJUMjAyMF9MSU1JVEVEICAgPSB7IDI5OCwgNDMwLCAgNDgsIDE2NywgNTQ4IH07Citjb25zdCBzdHJ1Y3QgQ29sb3JDb252ZXJ0ZXI6OkNvZWZmcyBCVDIwMjBfTFREXzEwQklUID0geyAyOTksIDQzMSwgIDQ4LCAxNjcsIDU1MCB9OworCitjb25zdGV4cHIgaW50IENMSVBfUkFOR0VfTUlOXzhCSVQgPSAtMjk0OworY29uc3RleHByIGludCBDTElQX1JBTkdFX01BWF84QklUID0gNTUyOworCitjb25zdGV4cHIgaW50IENMSVBfUkFOR0VfTUlOXzEwQklUID0gLTExNzU7Citjb25zdGV4cHIgaW50IENMSVBfUkFOR0VfTUFYXzEwQklUID0gMjIxODsKKworfQorCiBDb2xvckNvbnZlcnRlcjo6Q29sb3JDb252ZXJ0ZXIoCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGZyb20sIE9NWF9DT0xPUl9GT1JNQVRUWVBFIHRvKQogICAgIDogbVNyY0Zvcm1hdChmcm9tKSwKICAgICAgIG1Ec3RGb3JtYXQodG8pLAogICAgICAgbVNyY0NvbG9yU3BhY2UoezAsIDAsIDB9KSwKLSAgICAgIG1DbGlwKE5VTEwpIHsKKyAgICAgIG1DbGlwKE5VTEwpLAorICAgICAgbUNsaXAxMEJpdChOVUxMKSB7CiB9CiAKIENvbG9yQ29udmVydGVyOjp+Q29sb3JDb252ZXJ0ZXIoKSB7CiAgICAgZGVsZXRlW10gbUNsaXA7CiAgICAgbUNsaXAgPSBOVUxMOworICAgIGRlbGV0ZVtdIG1DbGlwMTBCaXQ7CisgICAgbUNsaXAxMEJpdCA9IE5VTEw7CiB9CiAKIGJvb2wgQ29sb3JDb252ZXJ0ZXI6OmlzVmFsaWQoKSBjb25zdCB7Ci0gICAgc3dpdGNoIChtU3JjRm9ybWF0KSB7CisgICAgc3dpdGNoICgoaW50MzJfdCltU3JjRm9ybWF0KSB7CiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2OgogICAgICAgICAgICAgaWYgKG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQ0NFk0MTApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTk4LDEwICsyNDcsMTMgQEAKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKICNpZmRlZiBVU0VfTElCWVVWCiAgICAgICAgICAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUKLSAgICAgICAgICAgICAgICAgICAgfHwgbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4ODsKKyAgICAgICAgICAgICAgICAgICAgfHwgbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4OAorICAgICAgICAgICAgICAgICAgICB8fCBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OwogI2Vsc2UKICAgICAgICAgICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NTsKICNlbmRpZgorICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVlAwMTA6CisgICAgICAgICAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1IyMTAxMDEwOwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNDMsOSArMjk1LDEwIEBACiAgICAgICBtQ3JvcFRvcChjcm9wVG9wKSwKICAgICAgIG1Dcm9wUmlnaHQoY3JvcFJpZ2h0KSwKICAgICAgIG1Dcm9wQm90dG9tKGNyb3BCb3R0b20pIHsKLSAgICBzd2l0Y2gobUNvbG9yRm9ybWF0KSB7CisgICAgc3dpdGNoKChpbnQzMl90KW1Db2xvckZvcm1hdCkgewogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2OgorICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWUDAxMDoKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgICAgIG1CcHAgPSAyOwogICAgICAgICBtU3RyaWRlID0gMiAqIG1XaWR0aDsKQEAgLTE1Myw2ICszMDYsNyBAQAogCiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OgorICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRBQkdSMjEwMTAxMDoKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0NDRZNDEwOgogICAgICAgICBtQnBwID0gNDsKICAgICAgICAgbVN0cmlkZSA9IDQgKiBtV2lkdGg7CkBAIC0yMTMsNyArMzY3LDcgQEAKIAogICAgIHN0YXR1c190IGVycjsKIAotICAgIHN3aXRjaCAobVNyY0Zvcm1hdCkgeworICAgIHN3aXRjaCAoKGludDMyX3QpbVNyY0Zvcm1hdCkgewogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CiAjaWZkZWYgVVNFX0xJQllVVgogICAgICAgICAgICAgZXJyID0gY29udmVydFlVVjQyMFBsYW5hclVzZUxpYllVVihzcmMsIGRzdCk7CkBAIC0yMzUsNiArMzg5LDE5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWUDAxMDoKKyAgICAgICAgeworI2lmIFBFUkZfUFJPRklMSU5HCisgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyNlbmRpZgorICAgICAgICAgICAgZXJyID0gY29udmVydFlVVlAwMTAoc3JjLCBkc3QpOworI2lmIFBFUkZfUFJPRklMSU5HCisgICAgICAgICAgICBpbnQ2NF90IGVuZFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgICAgICBBTE9HRCgiY29udmVydFlVVlAwMTAgdG9vayAlbGxkIHVzIiwgKGxvbmcgbG9uZykgKGVuZFRpbWVVcyAtIHN0YXJ0VGltZVVzKSk7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgogICAgICAgICAgICAgZXJyID0gY29udmVydENiWUNyWShzcmMsIGRzdCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTI2NSwxMCArNDMyLDUzIEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAorY29uc3Qgc3RydWN0IENvbG9yQ29udmVydGVyOjpDb2VmZnMgKkNvbG9yQ29udmVydGVyOjpnZXRNYXRyaXgoKSBjb25zdCB7CisgICAgY29uc3QgYm9vbCBpc0Z1bGxSYW5nZSA9IG1TcmNDb2xvclNwYWNlLm1SYW5nZSA9PSBDb2xvclV0aWxzOjprQ29sb3JSYW5nZUZ1bGw7CisgICAgY29uc3QgYm9vbCBpczEwQml0ID0gKG1TcmNGb3JtYXQgPT0gQ09MT1JfRm9ybWF0WVVWUDAxMAorICAgICAgICAgICAgfHwgbVNyY0Zvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYpOworCisgICAgc3dpdGNoIChtU3JjQ29sb3JTcGFjZS5tU3RhbmRhcmQpIHsKKyAgICBjYXNlIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ2MDFfNTI1OgorICAgIGNhc2UgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV82MjU6CisgICAgICAgIHJldHVybiAoaXNGdWxsUmFuZ2UgPyAmQlQ2MDFfRlVMTCA6CisgICAgICAgICAgICAgICAgaXMxMEJpdCA/ICZCVDYwMV9MVERfMTBCSVQgOiAmQlQ2MDFfTElNSVRFRCk7CisKKyAgICBjYXNlIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ3MDk6CisgICAgICAgIHJldHVybiAoaXNGdWxsUmFuZ2UgPyAmQlQ3MDlfRlVMTCA6CisgICAgICAgICAgICAgICAgaXMxMEJpdCA/ICZCVDcwOV9MVERfMTBCSVQgOiAmQlQ3MDlfTElNSVRFRCk7CisKKyAgICBjYXNlIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQyMDIwOgorICAgICAgICByZXR1cm4gKGlzRnVsbFJhbmdlID8gJkJUMjAyMF9GVUxMIDoKKyAgICAgICAgICAgICAgICBpczEwQml0ID8gJkJUMjAyMF9MVERfMTBCSVQgOiAmQlQyMDIwX0xJTUlURUQpOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gZm9yIG5vdyB1c2UgdGhlIGRlZmF1bHQgbWF0cmljZXMgZm9yIHVuaGFuZGxlZCBjb2xvciBzcGFjZXMKKyAgICAgICAgLy8gVE9ETzogZmFpbD8KKyAgICAgICAgLy8gcmV0dXJuIG51bGxwdHI7CisgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKworICAgIGNhc2UgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRVbnNwZWNpZmllZDoKKyAgICAgICAgcmV0dXJuIGlzMTBCaXQgPyAmQlQyMDIwX0xURF8xMEJJVCA6ICZCVDYwMV9MSU1JVEVEOworCisgICAgfQorfQorCiBzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydENiWUNyWSgKICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CiAgICAgLy8gWFhYIFVudGVzdGVkCiAKKyAgICBjb25zdCBzdHJ1Y3QgQ29lZmZzICptYXRyaXggPSBnZXRNYXRyaXgoKTsKKyAgICBpZiAoIW1hdHJpeCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgc2lnbmVkIF9iX3UgPSBtYXRyaXgtPl9iX3U7CisgICAgc2lnbmVkIF9uZWdfZ191ID0gLW1hdHJpeC0+X2dfdTsKKyAgICBzaWduZWQgX25lZ19nX3YgPSAtbWF0cml4LT5fZ192OworICAgIHNpZ25lZCBfcl92ID0gbWF0cml4LT5fcl92OworICAgIHNpZ25lZCBfeSA9IG1hdHJpeC0+X3k7CisgICAgc2lnbmVkIF9jMTYgPSBtU3JjQ29sb3JTcGFjZS5tUmFuZ2UgPT0gQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VMaW1pdGVkID8gMTYgOiAwOworCiAgICAgdWludDhfdCAqa0FkanVzdGVkQ2xpcCA9IGluaXRDbGlwKCk7CiAKICAgICB1aW50MTZfdCAqZHN0X3B0ciA9ICh1aW50MTZfdCAqKWRzdC5tQml0cwpAQCAtMjc5LDIyICs0ODksMjIgQEAKIAogICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgc3JjLmNyb3BIZWlnaHQoKTsgKyt5KSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc3JjLmNyb3BXaWR0aCgpOyB4ICs9IDIpIHsKLSAgICAgICAgICAgIHNpZ25lZCB5MSA9IChzaWduZWQpc3JjX3B0clsyICogeCArIDFdIC0gMTY7Ci0gICAgICAgICAgICBzaWduZWQgeTIgPSAoc2lnbmVkKXNyY19wdHJbMiAqIHggKyAzXSAtIDE2OworICAgICAgICAgICAgc2lnbmVkIHkxID0gKHNpZ25lZClzcmNfcHRyWzIgKiB4ICsgMV0gLSBfYzE2OworICAgICAgICAgICAgc2lnbmVkIHkyID0gKHNpZ25lZClzcmNfcHRyWzIgKiB4ICsgM10gLSBfYzE2OwogICAgICAgICAgICAgc2lnbmVkIHUgPSAoc2lnbmVkKXNyY19wdHJbMiAqIHhdIC0gMTI4OwogICAgICAgICAgICAgc2lnbmVkIHYgPSAoc2lnbmVkKXNyY19wdHJbMiAqIHggKyAyXSAtIDEyODsKIAotICAgICAgICAgICAgc2lnbmVkIHVfYiA9IHUgKiA1MTc7Ci0gICAgICAgICAgICBzaWduZWQgdV9nID0gLXUgKiAxMDA7Ci0gICAgICAgICAgICBzaWduZWQgdl9nID0gLXYgKiAyMDg7Ci0gICAgICAgICAgICBzaWduZWQgdl9yID0gdiAqIDQwOTsKKyAgICAgICAgICAgIHNpZ25lZCB1X2IgPSB1ICogX2JfdTsKKyAgICAgICAgICAgIHNpZ25lZCB1X2cgPSB1ICogX25lZ19nX3U7CisgICAgICAgICAgICBzaWduZWQgdl9nID0gdiAqIF9uZWdfZ192OworICAgICAgICAgICAgc2lnbmVkIHZfciA9IHYgKiBfcl92OwogCi0gICAgICAgICAgICBzaWduZWQgdG1wMSA9IHkxICogMjk4OworICAgICAgICAgICAgc2lnbmVkIHRtcDEgPSB5MSAqIF95ICsgMTI4OwogICAgICAgICAgICAgc2lnbmVkIGIxID0gKHRtcDEgKyB1X2IpIC8gMjU2OwogICAgICAgICAgICAgc2lnbmVkIGcxID0gKHRtcDEgKyB2X2cgKyB1X2cpIC8gMjU2OwogICAgICAgICAgICAgc2lnbmVkIHIxID0gKHRtcDEgKyB2X3IpIC8gMjU2OwogCi0gICAgICAgICAgICBzaWduZWQgdG1wMiA9IHkyICogMjk4OworICAgICAgICAgICAgc2lnbmVkIHRtcDIgPSB5MiAqIF95ICsgMTI4OwogICAgICAgICAgICAgc2lnbmVkIGIyID0gKHRtcDIgKyB1X2IpIC8gMjU2OwogICAgICAgICAgICAgc2lnbmVkIGcyID0gKHRtcDIgKyB2X2cgKyB1X2cpIC8gMjU2OwogICAgICAgICAgICAgc2lnbmVkIHIyID0gKHRtcDIgKyB2X3IpIC8gMjU2OwpAQCAtMzIzLDE1ICs1MzMsMzIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKKy8qCisgICAgbGlieXV2IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29sb3Igc3BhY2VzOgorCisgICAgSTQyMDogQlQuNjAxIGxpbWl0ZWQgcmFuZ2UKKyAgICBKNDIwOiBCVC42MDEgZnVsbCByYW5nZSAoanBlZykKKyAgICBINDIwOiBCVC43MDkgbGltaXRlZCByYW5nZQorCisqLworCiAjZGVmaW5lIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgcmdiKSBpbnQgKCpmdW5jKSggICAgIFwKLSAgICAgICAgY29uc3QgdWludDhfdCosIGludCwgY29uc3QgdWludDhfdCosIGludCwgICAgICAgICAgIFwKLSAgICAgICAgY29uc3QgdWludDhfdCosIGludCwgdWludDhfdCosIGludCwgaW50LCBpbnQpICAgICAgIFwKLSAgICAgICAgPSBtU3JjQ29sb3JTcGFjZS5pc0J0NzA5KCkgPyBsaWJ5dXY6Okg0MjBUbyMjcmdiIFwKLSAgICAgICAgOiBtU3JjQ29sb3JTcGFjZS5pc0pwZWcoKSA/IGxpYnl1djo6SjQyMFRvIyNyZ2IgIFwKKyAgICAgICAgY29uc3QgdWludDhfdCosIGludCwgY29uc3QgdWludDhfdCosIGludCwgICAgICAgXAorICAgICAgICBjb25zdCB1aW50OF90KiwgaW50LCB1aW50OF90KiwgaW50LCBpbnQsIGludCkgICBcCisgICAgICAgID0gbVNyY0NvbG9yU3BhY2UuaXNINDIwKCkgPyBsaWJ5dXY6Okg0MjBUbyMjcmdiIFwKKyAgICAgICAgOiBtU3JjQ29sb3JTcGFjZS5pc0o0MjAoKSA/IGxpYnl1djo6SjQyMFRvIyNyZ2IgXAogICAgICAgICA6IGxpYnl1djo6STQyMFRvIyNyZ2IKIAogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBQbGFuYXJVc2VMaWJZVVYoCiAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgeworICAgIC8vIEZhbGwgYmFjayB0byBvdXIgY29udmVyc2lvbiBpZiBsaWJ5dXYgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY29sb3Igc3BhY2UuCisgICAgLy8gSTQyMCAoQlQuNjAxIGxpbWl0ZWQpIGlzIGRlZmF1bHQsIHNvIGRvbid0IGZhbGwgYmFjayBpZiB3ZSBlbmQgdXAgdXNpbmcgaXQgYW55d2F5LgorICAgIGlmICghbVNyY0NvbG9yU3BhY2UuaXNINDIwKCkgJiYgIW1TcmNDb2xvclNwYWNlLmlzSjQyMCgpCisgICAgICAgICAgICAvLyAmJiAhbVNyY0NvbG9yU3BhY2UuaXNJNDIwKCkgLyogc2FtZSBhcyBsaW5lIGJlbG93ICovCisgICAgICAgICAgICAmJiBnZXRNYXRyaXgoKSAhPSAmQlQ2MDFfTElNSVRFRCkgeworICAgICAgICByZXR1cm4gY29udmVydFlVVjQyMFBsYW5hcihzcmMsIGRzdCk7CisgICAgfQorCiAgICAgdWludDhfdCAqZHN0X3B0ciA9ICh1aW50OF90ICopZHN0Lm1CaXRzCiAgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHA7CiAKQEAgLTM3OSw2ICs2MDYsMTMgQEAKIAogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVXNlTGliWVVWKAogICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKKyAgICAvLyBGYWxsIGJhY2sgdG8gb3VyIGNvbnZlcnNpb24gaWYgbGlieXV2IGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvbG9yIHNwYWNlLgorICAgIC8vIGxpYnl1diBvbmx5IHN1cHBvcnRzIEJULjYwMSBsaW1pdGVkIHJhbmdlIE5WMTIuIERvbid0IGZhbGwgYmFjayBpZiB3ZSBlbmQgdXAgdXNpbmcgaXQgYW55d2F5LgorICAgIGlmICgvLyAhbVNyY0NvbG9yU3BhY2UuaXNJNDIwKCkgJiYgLyogc2FtZSBhcyBiZWxvdyAqLworICAgICAgICBnZXRNYXRyaXgoKSAhPSAmQlQ2MDFfTElNSVRFRCkgeworICAgICAgICByZXR1cm4gY29udmVydFlVVjQyMFNlbWlQbGFuYXIoc3JjLCBkc3QpOworICAgIH0KKwogICAgIHVpbnQ4X3QgKmRzdF9wdHIgPSAodWludDhfdCAqKWRzdC5tQml0cwogICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tU3RyaWRlICsgZHN0Lm1Dcm9wTGVmdCAqIGRzdC5tQnBwOwogCkBAIC00MTksMTYgKzY1MywxNiBAQAogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKICAgICAgICAgcmV0dXJuIFtdKHZvaWQgKnNyY195LCB2b2lkICpzcmNfdSwgdm9pZCAqc3JjX3YsIHNpemVfdCB4LAogICAgICAgICAgICAgICAgICAgc2lnbmVkICp5MSwgc2lnbmVkICp5Miwgc2lnbmVkICp1LCBzaWduZWQgKnYpIHsKLSAgICAgICAgICAgICp5MSA9ICgodWludDhfdCopc3JjX3kpW3hdIC0gMTY7Ci0gICAgICAgICAgICAqeTIgPSAoKHVpbnQ4X3QqKXNyY195KVt4ICsgMV0gLSAxNjsKKyAgICAgICAgICAgICp5MSA9ICgodWludDhfdCopc3JjX3kpW3hdOworICAgICAgICAgICAgKnkyID0gKCh1aW50OF90KilzcmNfeSlbeCArIDFdOwogICAgICAgICAgICAgKnUgPSAoKHVpbnQ4X3QqKXNyY191KVt4IC8gMl0gLSAxMjg7CiAgICAgICAgICAgICAqdiA9ICgodWludDhfdCopc3JjX3YpW3ggLyAyXSAtIDEyODsKICAgICAgICAgfTsKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKICAgICAgICAgcmV0dXJuIFtdKHZvaWQgKnNyY195LCB2b2lkICpzcmNfdSwgdm9pZCAqc3JjX3YsIHNpemVfdCB4LAogICAgICAgICAgICAgICAgIHNpZ25lZCAqeTEsIHNpZ25lZCAqeTIsIHNpZ25lZCAqdSwgc2lnbmVkICp2KSB7Ci0gICAgICAgICAgICAqeTEgPSAoc2lnbmVkKSgoKHVpbnQxNl90KilzcmNfeSlbeF0gPj4gMikgLSAxNjsKLSAgICAgICAgICAgICp5MiA9IChzaWduZWQpKCgodWludDE2X3QqKXNyY195KVt4ICsgMV0gPj4gMikgLSAxNjsKKyAgICAgICAgICAgICp5MSA9IChzaWduZWQpKCgodWludDE2X3QqKXNyY195KVt4XSA+PiAyKTsKKyAgICAgICAgICAgICp5MiA9IChzaWduZWQpKCgodWludDE2X3QqKXNyY195KVt4ICsgMV0gPj4gMik7CiAgICAgICAgICAgICAqdSA9IChzaWduZWQpKCgodWludDE2X3QqKXNyY191KVt4IC8gMl0gPj4gMikgLSAxMjg7CiAgICAgICAgICAgICAqdiA9IChzaWduZWQpKCgodWludDE2X3QqKXNyY192KVt4IC8gMl0gPj4gMikgLSAxMjg7CiAgICAgICAgIH07CkBAIC00MzgsMjQgKzY3MiwyNiBAQAogICAgIHJldHVybiBudWxscHRyOwogfQogCisvLyBUUklDS1k6IHRoaXMgbWV0aG9kIG9ubHkgc3VwcG9ydHMgUkdCQV8xMDEwMTAyIG91dHB1dCBmb3IgMTAtYml0IHNvdXJjZXMsIGFuZCBhbGwgb3RoZXIgb3V0cHV0cworLy8gZm9yIDgtYml0IHNvdXJjZXMgYXMgdGhlIHR5cGUgb2Yga0FkanVzdGVkQ2xpcCBpcyBoYXJkY29kZWQgYmFzZWQgb24gb3V0cHV0LCBub3QgaW5wdXQuCiBzdGQ6OmZ1bmN0aW9uPHZvaWQgKHZvaWQgKiwgYm9vbCwgc2lnbmVkLCBzaWduZWQsIHNpZ25lZCwgc2lnbmVkLCBzaWduZWQsIHNpZ25lZCk+Ci1nZXRXcml0ZVRvRHN0KE9NWF9DT0xPUl9GT1JNQVRUWVBFIGRzdEZvcm1hdCwgdWludDhfdCAqa0FkanVzdGVkQ2xpcCkgewotICAgIHN3aXRjaCAoZHN0Rm9ybWF0KSB7CitnZXRXcml0ZVRvRHN0KE9NWF9DT0xPUl9GT1JNQVRUWVBFIGRzdEZvcm1hdCwgdm9pZCAqa0FkanVzdGVkQ2xpcCkgeworICAgIHN3aXRjaCAoKGludClkc3RGb3JtYXQpIHsKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NToKICAgICB7CiAgICAgICAgIHJldHVybiBba0FkanVzdGVkQ2xpcF0odm9pZCAqZHN0X3B0ciwgYm9vbCB1bmNyb3BwZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIHIxLCBzaWduZWQgZzEsIHNpZ25lZCBiMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcjIsIHNpZ25lZCBnMiwgc2lnbmVkIGIyKSB7CiAgICAgICAgICAgICB1aW50MzJfdCByZ2IxID0KLSAgICAgICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbcjFdID4+IDMpIDw8IDExKQotICAgICAgICAgICAgICAgIHwgKChrQWRqdXN0ZWRDbGlwW2cxXSA+PiAyKSA8PCA1KQotICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjFdID4+IDMpOworICAgICAgICAgICAgICAgICgoKCh1aW50OF90ICopa0FkanVzdGVkQ2xpcClbcjFdID4+IDMpIDw8IDExKQorICAgICAgICAgICAgICAgIHwgKCgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtnMV0gPj4gMikgPDwgNSkKKyAgICAgICAgICAgICAgICB8ICgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtiMV0gPj4gMyk7CiAKICAgICAgICAgICAgIGlmICh1bmNyb3BwZWQpIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCByZ2IyID0KLSAgICAgICAgICAgICAgICAgICAgKChrQWRqdXN0ZWRDbGlwW3IyXSA+PiAzKSA8PCAxMSkKLSAgICAgICAgICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzJdID4+IDIpIDw8IDUpCi0gICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjJdID4+IDMpOworICAgICAgICAgICAgICAgICAgICAoKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW3IyXSA+PiAzKSA8PCAxMSkKKyAgICAgICAgICAgICAgICAgICAgfCAoKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW2cyXSA+PiAyKSA8PCA1KQorICAgICAgICAgICAgICAgICAgICB8ICgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtiMl0gPj4gMyk7CiAKICAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopZHN0X3B0ciA9IChyZ2IyIDw8IDE2KSB8IHJnYjE7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNDY5LDE2ICs3MDUsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcjEsIHNpZ25lZCBnMSwgc2lnbmVkIGIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCByMiwgc2lnbmVkIGcyLCBzaWduZWQgYjIpIHsKICAgICAgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVswXSA9Ci0gICAgICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW3IxXSkKLSAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtnMV0gPDwgOCkKLSAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtiMV0gPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtyMV0pCisgICAgICAgICAgICAgICAgICAgIHwgKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW2cxXSA8PCA4KQorICAgICAgICAgICAgICAgICAgICB8ICgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtiMV0gPDwgMTYpCiAgICAgICAgICAgICAgICAgICAgIHwgKDB4RkYgPDwgMjQpOwogCiAgICAgICAgICAgICBpZiAodW5jcm9wcGVkKSB7CiAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCAqKWRzdF9wdHIpWzFdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW3IyXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbZzJdIDw8IDgpCi0gICAgICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2IyXSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtyMl0pCisgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtnMl0gPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW2IyXSA8PCAxNikKICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDB4RkYgPDwgMjQpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwpAQCAtNDg5LDIwICs3MjUsNDEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcjEsIHNpZ25lZCBnMSwgc2lnbmVkIGIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCByMiwgc2lnbmVkIGcyLCBzaWduZWQgYjIpIHsKICAgICAgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVswXSA9Ci0gICAgICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW2IxXSkKLSAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtnMV0gPDwgOCkKLSAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtyMV0gPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtiMV0pCisgICAgICAgICAgICAgICAgICAgIHwgKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW2cxXSA8PCA4KQorICAgICAgICAgICAgICAgICAgICB8ICgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtyMV0gPDwgMTYpCiAgICAgICAgICAgICAgICAgICAgIHwgKDB4RkYgPDwgMjQpOwogCiAgICAgICAgICAgICBpZiAodW5jcm9wcGVkKSB7CiAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCAqKWRzdF9wdHIpWzFdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW2IyXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbZzJdIDw8IDgpCi0gICAgICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW3IyXSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtiMl0pCisgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKHVpbnQ4X3QgKilrQWRqdXN0ZWRDbGlwKVtnMl0gPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKCgodWludDhfdCAqKWtBZGp1c3RlZENsaXApW3IyXSA8PCAxNikKICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDB4RkYgPDwgMjQpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwogICAgIH0KKyAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QUJHUjIxMDEwMTA6CisgICAgeworICAgICAgICByZXR1cm4gW2tBZGp1c3RlZENsaXBdKHZvaWQgKmRzdF9wdHIsIGJvb2wgdW5jcm9wcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCByMSwgc2lnbmVkIGcxLCBzaWduZWQgYjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIHIyLCBzaWduZWQgZzIsIHNpZ25lZCBiMikgeworICAgICAgICAgICAgKCh1aW50MzJfdCAqKWRzdF9wdHIpWzBdID0KKyAgICAgICAgICAgICAgICAgICAgKCgodWludDE2X3QgKilrQWRqdXN0ZWRDbGlwKVtyMV0pCisgICAgICAgICAgICAgICAgICAgIHwgKCgodWludDE2X3QgKilrQWRqdXN0ZWRDbGlwKVtnMV0gPDwgMTApCisgICAgICAgICAgICAgICAgICAgIHwgKCgodWludDE2X3QgKilrQWRqdXN0ZWRDbGlwKVtiMV0gPDwgMjApCisgICAgICAgICAgICAgICAgICAgIHwgKDMgPDwgMzApOworCisgICAgICAgICAgICBpZiAodW5jcm9wcGVkKSB7CisgICAgICAgICAgICAgICAgKCh1aW50MzJfdCAqKWRzdF9wdHIpWzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQxNl90ICopa0FkanVzdGVkQ2xpcClbcjJdKQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoKCh1aW50MTZfdCAqKWtBZGp1c3RlZENsaXApW2cyXSA8PCAxMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKCgodWludDE2X3QgKilrQWRqdXN0ZWRDbGlwKVtiMl0gPDwgMjApCisgICAgICAgICAgICAgICAgICAgICAgICB8ICgzIDw8IDMwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKICAgICBkZWZhdWx0OgogICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KQEAgLTUxMSwxMCArNzY4LDIyIEBACiAKIHN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWNDIwUGxhbmFyKAogICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKKyAgICBjb25zdCBzdHJ1Y3QgQ29lZmZzICptYXRyaXggPSBnZXRNYXRyaXgoKTsKKyAgICBpZiAoIW1hdHJpeCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgc2lnbmVkIF9iX3UgPSBtYXRyaXgtPl9iX3U7CisgICAgc2lnbmVkIF9uZWdfZ191ID0gLW1hdHJpeC0+X2dfdTsKKyAgICBzaWduZWQgX25lZ19nX3YgPSAtbWF0cml4LT5fZ192OworICAgIHNpZ25lZCBfcl92ID0gbWF0cml4LT5fcl92OworICAgIHNpZ25lZCBfeSA9IG1hdHJpeC0+X3k7CisgICAgc2lnbmVkIF9jMTYgPSBtU3JjQ29sb3JTcGFjZS5tUmFuZ2UgPT0gQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VMaW1pdGVkID8gMTYgOiAwOworCiAgICAgdWludDhfdCAqa0FkanVzdGVkQ2xpcCA9IGluaXRDbGlwKCk7CiAKICAgICBhdXRvIHJlYWRGcm9tU3JjID0gZ2V0UmVhZEZyb21TcmMobVNyY0Zvcm1hdCk7Ci0gICAgYXV0byB3cml0ZVRvRHN0ID0gZ2V0V3JpdGVUb0RzdChtRHN0Rm9ybWF0LCBrQWRqdXN0ZWRDbGlwKTsKKyAgICBhdXRvIHdyaXRlVG9Ec3QgPSBnZXRXcml0ZVRvRHN0KG1Ec3RGb3JtYXQsICh2b2lkICopa0FkanVzdGVkQ2xpcCk7CiAKICAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKICAgICAgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHA7CkBAIC01MjksMzggKzc5OCwyMCBAQAogCiAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzcmMuY3JvcEhlaWdodCgpOyArK3kpIHsKICAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBzcmMuY3JvcFdpZHRoKCk7IHggKz0gMikgewotICAgICAgICAgICAgLy8gQiA9IDEuMTY0ICogKFkgLSAxNikgKyAyLjAxOCAqIChVIC0gMTI4KQotICAgICAgICAgICAgLy8gRyA9IDEuMTY0ICogKFkgLSAxNikgLSAwLjgxMyAqIChWIC0gMTI4KSAtIDAuMzkxICogKFUgLSAxMjgpCi0gICAgICAgICAgICAvLyBSID0gMS4xNjQgKiAoWSAtIDE2KSArIDEuNTk2ICogKFYgLSAxMjgpCi0KLSAgICAgICAgICAgIC8vIEIgPSAyOTgvMjU2ICogKFkgLSAxNikgKyA1MTcvMjU2ICogKFUgLSAxMjgpCi0gICAgICAgICAgICAvLyBHID0gLi4uLi4uLi4uLi4uLi4uLi4uIC0gMjA4LzI1NiAqIChWIC0gMTI4KSAtIDEwMC8yNTYgKiAoVSAtIDEyOCkKLSAgICAgICAgICAgIC8vIFIgPSAuLi4uLi4uLi4uLi4uLi4uLi4gKyA0MDkvMjU2ICogKFYgLSAxMjgpCi0KLSAgICAgICAgICAgIC8vIG1pbl9CID0gKDI5OCAqICgtIDE2KSArIDUxNyAqICgtIDEyOCkpIC8gMjU2ID0gLTI3NwotICAgICAgICAgICAgLy8gbWluX0cgPSAoMjk4ICogKC0gMTYpIC0gMjA4ICogKDI1NSAtIDEyOCkgLSAxMDAgKiAoMjU1IC0gMTI4KSkgLyAyNTYgPSAtMTcyCi0gICAgICAgICAgICAvLyBtaW5fUiA9ICgyOTggKiAoLSAxNikgKyA0MDkgKiAoLSAxMjgpKSAvIDI1NiA9IC0yMjMKLQotICAgICAgICAgICAgLy8gbWF4X0IgPSAoMjk4ICogKDI1NSAtIDE2KSArIDUxNyAqICgyNTUgLSAxMjgpKSAvIDI1NiA9IDUzNAotICAgICAgICAgICAgLy8gbWF4X0cgPSAoMjk4ICogKDI1NSAtIDE2KSAtIDIwOCAqICgtIDEyOCkgLSAxMDAgKiAoLSAxMjgpKSAvIDI1NiA9IDQzMgotICAgICAgICAgICAgLy8gbWF4X1IgPSAoMjk4ICogKDI1NSAtIDE2KSArIDQwOSAqICgyNTUgLSAxMjgpKSAvIDI1NiA9IDQ4MQotCi0gICAgICAgICAgICAvLyBjbGlwIHJhbmdlIC0yNzggLi4gNTM1Ci0KICAgICAgICAgICAgIHNpZ25lZCB5MSwgeTIsIHUsIHY7CiAgICAgICAgICAgICByZWFkRnJvbVNyYyhzcmNfeSwgc3JjX3UsIHNyY192LCB4LCAmeTEsICZ5MiwgJnUsICZ2KTsKIAotICAgICAgICAgICAgc2lnbmVkIHVfYiA9IHUgKiA1MTc7Ci0gICAgICAgICAgICBzaWduZWQgdV9nID0gLXUgKiAxMDA7Ci0gICAgICAgICAgICBzaWduZWQgdl9nID0gLXYgKiAyMDg7Ci0gICAgICAgICAgICBzaWduZWQgdl9yID0gdiAqIDQwOTsKKyAgICAgICAgICAgIHNpZ25lZCB1X2IgPSB1ICogX2JfdTsKKyAgICAgICAgICAgIHNpZ25lZCB1X2cgPSB1ICogX25lZ19nX3U7CisgICAgICAgICAgICBzaWduZWQgdl9nID0gdiAqIF9uZWdfZ192OworICAgICAgICAgICAgc2lnbmVkIHZfciA9IHYgKiBfcl92OwogCi0gICAgICAgICAgICBzaWduZWQgdG1wMSA9IHkxICogMjk4OworICAgICAgICAgICAgc2lnbmVkIHRtcDEgPSAoeTEgLSBfYzE2KSAqIF95ICsgMTI4OwogICAgICAgICAgICAgc2lnbmVkIGIxID0gKHRtcDEgKyB1X2IpIC8gMjU2OwogICAgICAgICAgICAgc2lnbmVkIGcxID0gKHRtcDEgKyB2X2cgKyB1X2cpIC8gMjU2OwogICAgICAgICAgICAgc2lnbmVkIHIxID0gKHRtcDEgKyB2X3IpIC8gMjU2OwogCi0gICAgICAgICAgICBzaWduZWQgdG1wMiA9IHkyICogMjk4OworICAgICAgICAgICAgc2lnbmVkIHRtcDIgPSAoeTIgLSBfYzE2KSAqIF95ICsgMTI4OwogICAgICAgICAgICAgc2lnbmVkIGIyID0gKHRtcDIgKyB1X2IpIC8gMjU2OwogICAgICAgICAgICAgc2lnbmVkIGcyID0gKHRtcDIgKyB2X2cgKyB1X2cpIC8gMjU2OwogICAgICAgICAgICAgc2lnbmVkIHIyID0gKHRtcDIgKyB2X3IpIC8gMjU2OwpAQCAtNTkxLDM0ICs4NDIsODQgQEAKICAgICByZXR1cm4gY29udmVydFlVVjQyMFBsYW5hcihzcmMsIGRzdCk7CiB9CiAKLS8qCi0gKiBQYWNrIDEwLWJpdCBZVVYgaW50byBSR0JBXzEwMTAxMDIuCi0gKgotICogTWVkaWEgc2VuZHMgMTAtYml0IFlVViBpbiBhIFJHQkFfMTAxMDEwMiBmb3JtYXQgYnVmZmVyLiBTRiB3aWxsIGhhbmRsZQotICogdGhlIGNvbnZlcnNpb24gdG8gUkdCIHVzaW5nIFJlbmRlckVuZ2luZSBmYWxsYmFjay4KLSAqCi0gKiBXZSBkbyBub3QgcGVyZm9ybSBhIFlVVi0+UkdCIGNvbnZlcnNpb24gaGVyZSwgaG93ZXZlciB0aGUgY29udmVyc2lvbiB3aXRoCi0gKiBCVDIwMjAgdG8gRnVsbCByYW5nZSBpcyBiZWxvdyBmb3IgcmVmZXJlbmNlOgotICoKLSAqICAgQiA9IDEuMTY4ICAqKFkgLSA2NCkgKyAyLjE0OCAgKihVIC0gNTEyKQotICogICBHID0gMS4xNjggICooWSAtIDY0KSAtIDAuNjUyICAqKFYgLSA1MTIpIC0gMC4xODggICooVSAtIDUxMikKLSAqICAgUiA9IDEuMTY4ICAqKFkgLSA2NCkgKyAxLjY4MyAgKihWIC0gNTEyKQotICoKLSAqICAgQiA9IDExOTYvMTAyNCAgKihZIC0gNjQpICsgMjIwMC8xMDI0ICAqKFUgLSA1MTIpCi0gKiAgIEcgPSAuLi4uLi4uLi4uLi4uLi4uLi4uLiAtICA2NjgvMTAyNCAgKihWIC0gNTEyKSAtIDE5Mi8xMDI0ICAqKFUgLSA1MTIpCi0gKiAgIFIgPSAuLi4uLi4uLi4uLi4uLi4uLi4uLiArIDE3MjMvMTAyNCAgKihWIC0gNTEyKQotICoKLSAqICAgbWluX0IgPSAoMTE5NiAgKigtIDY0KSArIDIyMDAgICooLSA1MTIpKSAvIDEwMjQgPSAtMTE3NQotICogICBtaW5fRyA9ICgxMTk2ICAqKC0gNjQpIC0gNjY4ICAqKDEwMjMgLSA1MTIpIC0gMTkyICAqKDEwMjMgLSA1MTIpKSAvIDEwMjQgPSAtNTA0Ci0gKiAgIG1pbl9SID0gKDExOTYgICooLSA2NCkgKyAxNzIzICAqKC0gNTEyKSkgLyAxMDI0ID0gLTkzNwotICoKLSAqICAgbWF4X0IgPSAoMTE5NiAgKigxMDIzIC0gNjQpICsgMjIwMCAgKigxMDIzIC0gNTEyKSkgLyAxMDI0ID0gMjIxOAotICogICBtYXhfRyA9ICgxMTk2ICAqKDEwMjMgLSA2NCkgLSA2NjggICooLSA1MTIpIC0gMTkyICAqKC0gNTEyKSkgLyAxMDI0ID0gMTU1MQotICogICBtYXhfUiA9ICgxMTk2ICAqKDEwMjMgLSA2NCkgKyAxNzIzICAqKDEwMjMgLSA1MTIpKSAvIDEwMjQgPSAxOTgwCi0gKgotICogICBjbGlwIHJhbmdlIC0xMTc1IC4uIDIyMTgKLSAqCi0gKi8KK3N0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWUDAxMCgKKyAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CisgICAgaWYgKG1Ec3RGb3JtYXQgPT0gQ09MT1JfRm9ybWF0MzJiaXRBQkdSMjEwMTAxMCkgeworICAgICAgICByZXR1cm4gY29udmVydFlVVlAwMTBUb1JHQkExMDEwMTAyKHNyYywgZHN0KTsKKyAgICB9CisKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWUDAxMFRvUkdCQTEwMTAxMDIoCisgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgeworICAgIGNvbnN0IHN0cnVjdCBDb2VmZnMgKm1hdHJpeCA9IGdldE1hdHJpeCgpOworICAgIGlmICghbWF0cml4KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBzaWduZWQgX2JfdSA9IG1hdHJpeC0+X2JfdTsKKyAgICBzaWduZWQgX25lZ19nX3UgPSAtbWF0cml4LT5fZ191OworICAgIHNpZ25lZCBfbmVnX2dfdiA9IC1tYXRyaXgtPl9nX3Y7CisgICAgc2lnbmVkIF9yX3YgPSBtYXRyaXgtPl9yX3Y7CisgICAgc2lnbmVkIF95ID0gbWF0cml4LT5feTsKKyAgICBzaWduZWQgX2MxNiA9IG1TcmNDb2xvclNwYWNlLm1SYW5nZSA9PSBDb2xvclV0aWxzOjprQ29sb3JSYW5nZUxpbWl0ZWQgPyA2NCA6IDA7CisKKyAgICB1aW50MTZfdCAqa0FkanVzdGVkQ2xpcDEwYml0ID0gaW5pdENsaXAxMEJpdCgpOworCisvLyAgICBhdXRvIHJlYWRGcm9tU3JjID0gZ2V0UmVhZEZyb21TcmMobVNyY0Zvcm1hdCk7CisgICAgYXV0byB3cml0ZVRvRHN0ID0gZ2V0V3JpdGVUb0RzdChtRHN0Rm9ybWF0LCAodm9pZCAqKWtBZGp1c3RlZENsaXAxMGJpdCk7CisKKyAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKKyAgICAgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHA7CisKKyAgICB1aW50MTZfdCAqc3JjX3kgPSAodWludDE2X3QgKikoKHVpbnQ4X3QgKilzcmMubUJpdHMKKyAgICAgICAgICAgICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0ICogc3JjLm1CcHApOworCisgICAgdWludDE2X3QgKnNyY191diA9ICh1aW50MTZfdCAqKSgodWludDhfdCAqKXNyYy5tQml0cworICAgICAgICAgICAgKyBzcmMubVN0cmlkZSAqIHNyYy5tSGVpZ2h0CisgICAgICAgICAgICArIChzcmMubUNyb3BUb3AgLyAyKSAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdCAqIHNyYy5tQnBwKTsKKworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgc3JjLmNyb3BIZWlnaHQoKTsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc3JjLmNyb3BXaWR0aCgpOyB4ICs9IDIpIHsKKyAgICAgICAgICAgIHNpZ25lZCB5MSwgeTIsIHUsIHY7CisgICAgICAgICAgICB5MSA9IChzcmNfeVt4XSA+PiA2KSAtIF9jMTY7CisgICAgICAgICAgICB5MiA9IChzcmNfeVt4ICsgMV0gPj4gNikgLSBfYzE2OworICAgICAgICAgICAgdSA9IGludChzcmNfdXZbeF0gPj4gNikgLSA1MTI7CisgICAgICAgICAgICB2ID0gaW50KHNyY191dlt4ICsgMV0gPj4gNikgLSA1MTI7CisKKyAgICAgICAgICAgIHNpZ25lZCB1X2IgPSB1ICogX2JfdTsKKyAgICAgICAgICAgIHNpZ25lZCB1X2cgPSB1ICogX25lZ19nX3U7CisgICAgICAgICAgICBzaWduZWQgdl9nID0gdiAqIF9uZWdfZ192OworICAgICAgICAgICAgc2lnbmVkIHZfciA9IHYgKiBfcl92OworCisgICAgICAgICAgICBzaWduZWQgdG1wMSA9IHkxICogX3kgKyAxMjg7CisgICAgICAgICAgICBzaWduZWQgYjEgPSAodG1wMSArIHVfYikgLyAyNTY7CisgICAgICAgICAgICBzaWduZWQgZzEgPSAodG1wMSArIHZfZyArIHVfZykgLyAyNTY7CisgICAgICAgICAgICBzaWduZWQgcjEgPSAodG1wMSArIHZfcikgLyAyNTY7CisKKyAgICAgICAgICAgIHNpZ25lZCB0bXAyID0geTIgKiBfeSArIDEyODsKKyAgICAgICAgICAgIHNpZ25lZCBiMiA9ICh0bXAyICsgdV9iKSAvIDI1NjsKKyAgICAgICAgICAgIHNpZ25lZCBnMiA9ICh0bXAyICsgdl9nICsgdV9nKSAvIDI1NjsKKyAgICAgICAgICAgIHNpZ25lZCByMiA9ICh0bXAyICsgdl9yKSAvIDI1NjsKKworICAgICAgICAgICAgYm9vbCB1bmNyb3BwZWQgPSB4ICsgMSA8IHNyYy5jcm9wV2lkdGgoKTsKKworICAgICAgICAgICAgd3JpdGVUb0RzdChkc3RfcHRyICsgeCAqIGRzdC5tQnBwLCB1bmNyb3BwZWQsIHIxLCBnMSwgYjEsIHIyLCBnMiwgYjIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjX3kgKz0gc3JjLm1TdHJpZGUgLyAyOworCisgICAgICAgIGlmICh5ICYgMSkgeworICAgICAgICAgICAgc3JjX3V2ICs9IHNyYy5tU3RyaWRlIC8gMjsKKyAgICAgICAgfQorCisgICAgICAgIGRzdF9wdHIgKz0gZHN0Lm1TdHJpZGU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiAKICNpZiAhVVNFX05FT05fWTQxMAogCkBAIC04MjEsMTEgKzExMjIsNiBAQAogCiBzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFFDT01ZVVY0MjBTZW1pUGxhbmFyKAogICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKLSAgICB1aW50OF90ICprQWRqdXN0ZWRDbGlwID0gaW5pdENsaXAoKTsKLQotICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopZHN0Lm1CaXRzCi0gICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1XaWR0aCArIGRzdC5tQ3JvcExlZnQ7Ci0KICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7CiAKQEAgLTgzMyw2NyArMTEyOSwyNSBAQAogICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyY195ICsgc3JjLm1XaWR0aCAqIHNyYy5tSGVpZ2h0CiAgICAgICAgICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7CiAKLSAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5jcm9wSGVpZ2h0KCk7ICsreSkgewotICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNyYy5jcm9wV2lkdGgoKTsgeCArPSAyKSB7Ci0gICAgICAgICAgICBzaWduZWQgeTEgPSAoc2lnbmVkKXNyY195W3hdIC0gMTY7Ci0gICAgICAgICAgICBzaWduZWQgeTIgPSAoc2lnbmVkKXNyY195W3ggKyAxXSAtIDE2OworICAgIC8qIFFDT01ZVVY0MjBTZW1pUGxhbmFyIGlzIE5WMjEsIHdoaWxlIE1lZGlhQ29kZWMgdXNlcyBOVjEyICovCisgICAgcmV0dXJuIGNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyQmFzZSgKKyAgICAgICAgICAgIHNyYywgZHN0LCBzcmNfeSwgc3JjX3UsIHNyYy5tV2lkdGggLyogcm93X2luYyAqLywgdHJ1ZSAvKiBpc05WMjEgKi8pOworfQogCi0gICAgICAgICAgICBzaWduZWQgdSA9IChzaWduZWQpc3JjX3VbeCAmIH4xXSAtIDEyODsKLSAgICAgICAgICAgIHNpZ25lZCB2ID0gKHNpZ25lZClzcmNfdVsoeCAmIH4xKSArIDFdIC0gMTI4Oworc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRUSVlVVjQyMFBhY2tlZFNlbWlQbGFuYXIoCisgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgeworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVdpZHRoICsgc3JjLm1Dcm9wTGVmdDsKIAotICAgICAgICAgICAgc2lnbmVkIHVfYiA9IHUgKiA1MTc7Ci0gICAgICAgICAgICBzaWduZWQgdV9nID0gLXUgKiAxMDA7Ci0gICAgICAgICAgICBzaWduZWQgdl9nID0gLXYgKiAyMDg7Ci0gICAgICAgICAgICBzaWduZWQgdl9yID0gdiAqIDQwOTsKKyAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjX3kgKyBzcmMubVdpZHRoICogKHNyYy5tSGVpZ2h0IC0gc3JjLm1Dcm9wVG9wIC8gMik7CiAKLSAgICAgICAgICAgIHNpZ25lZCB0bXAxID0geTEgKiAyOTg7Ci0gICAgICAgICAgICBzaWduZWQgYjEgPSAodG1wMSArIHVfYikgLyAyNTY7Ci0gICAgICAgICAgICBzaWduZWQgZzEgPSAodG1wMSArIHZfZyArIHVfZykgLyAyNTY7Ci0gICAgICAgICAgICBzaWduZWQgcjEgPSAodG1wMSArIHZfcikgLyAyNTY7Ci0KLSAgICAgICAgICAgIHNpZ25lZCB0bXAyID0geTIgKiAyOTg7Ci0gICAgICAgICAgICBzaWduZWQgYjIgPSAodG1wMiArIHVfYikgLyAyNTY7Ci0gICAgICAgICAgICBzaWduZWQgZzIgPSAodG1wMiArIHZfZyArIHVfZykgLyAyNTY7Ci0gICAgICAgICAgICBzaWduZWQgcjIgPSAodG1wMiArIHZfcikgLyAyNTY7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHJnYjEgPQotICAgICAgICAgICAgICAgICgoa0FkanVzdGVkQ2xpcFtiMV0gPj4gMykgPDwgMTEpCi0gICAgICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzFdID4+IDIpIDw8IDUpCi0gICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtyMV0gPj4gMyk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHJnYjIgPQotICAgICAgICAgICAgICAgICgoa0FkanVzdGVkQ2xpcFtiMl0gPj4gMykgPDwgMTEpCi0gICAgICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzJdID4+IDIpIDw8IDUpCi0gICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtyMl0gPj4gMyk7Ci0KLSAgICAgICAgICAgIGlmICh4ICsgMSA8IHNyYy5jcm9wV2lkdGgoKSkgewotICAgICAgICAgICAgICAgICoodWludDMyX3QgKikoJmRzdF9wdHJbeF0pID0gKHJnYjIgPDwgMTYpIHwgcmdiMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZHN0X3B0clt4XSA9IHJnYjE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzcmNfeSArPSBzcmMubVdpZHRoOwotCi0gICAgICAgIGlmICh5ICYgMSkgewotICAgICAgICAgICAgc3JjX3UgKz0gc3JjLm1XaWR0aDsKLSAgICAgICAgfQotCi0gICAgICAgIGRzdF9wdHIgKz0gZHN0Lm1XaWR0aDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIGNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyQmFzZSgKKyAgICAgICAgICAgIHNyYywgZHN0LCBzcmNfeSwgc3JjX3UsIHNyYy5tV2lkdGggLyogcm93X2luYyAqLyk7CiB9CiAKIHN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWNDIwU2VtaVBsYW5hcigKICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7Ci0gICAgLy8gWFhYIFVudGVzdGVkCi0KLSAgICB1aW50OF90ICprQWRqdXN0ZWRDbGlwID0gaW5pdENsaXAoKTsKLQotICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopKCh1aW50OF90ICopCi0gICAgICAgICAgICBkc3QubUJpdHMgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcCk7Ci0KICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OwogCkBAIC05MDEsOTAgKzExNTUsNDkgQEAKICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUhlaWdodCAqIHNyYy5tU3RyaWRlICsKICAgICAgICAgKHNyYy5tQ3JvcFRvcCAvIDIpICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OwogCi0gICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzcmMuY3JvcEhlaWdodCgpOyArK3kpIHsKLSAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBzcmMuY3JvcFdpZHRoKCk7IHggKz0gMikgewotICAgICAgICAgICAgc2lnbmVkIHkxID0gKHNpZ25lZClzcmNfeVt4XSAtIDE2OwotICAgICAgICAgICAgc2lnbmVkIHkyID0gKHNpZ25lZClzcmNfeVt4ICsgMV0gLSAxNjsKLQotICAgICAgICAgICAgc2lnbmVkIHYgPSAoc2lnbmVkKXNyY191W3ggJiB+MV0gLSAxMjg7Ci0gICAgICAgICAgICBzaWduZWQgdSA9IChzaWduZWQpc3JjX3VbKHggJiB+MSkgKyAxXSAtIDEyODsKLQotICAgICAgICAgICAgc2lnbmVkIHVfYiA9IHUgKiA1MTc7Ci0gICAgICAgICAgICBzaWduZWQgdV9nID0gLXUgKiAxMDA7Ci0gICAgICAgICAgICBzaWduZWQgdl9nID0gLXYgKiAyMDg7Ci0gICAgICAgICAgICBzaWduZWQgdl9yID0gdiAqIDQwOTsKLQotICAgICAgICAgICAgc2lnbmVkIHRtcDEgPSB5MSAqIDI5ODsKLSAgICAgICAgICAgIHNpZ25lZCBiMSA9ICh0bXAxICsgdV9iKSAvIDI1NjsKLSAgICAgICAgICAgIHNpZ25lZCBnMSA9ICh0bXAxICsgdl9nICsgdV9nKSAvIDI1NjsKLSAgICAgICAgICAgIHNpZ25lZCByMSA9ICh0bXAxICsgdl9yKSAvIDI1NjsKLQotICAgICAgICAgICAgc2lnbmVkIHRtcDIgPSB5MiAqIDI5ODsKLSAgICAgICAgICAgIHNpZ25lZCBiMiA9ICh0bXAyICsgdV9iKSAvIDI1NjsKLSAgICAgICAgICAgIHNpZ25lZCBnMiA9ICh0bXAyICsgdl9nICsgdV9nKSAvIDI1NjsKLSAgICAgICAgICAgIHNpZ25lZCByMiA9ICh0bXAyICsgdl9yKSAvIDI1NjsKLQotICAgICAgICAgICAgdWludDMyX3QgcmdiMSA9Ci0gICAgICAgICAgICAgICAgKChrQWRqdXN0ZWRDbGlwW2IxXSA+PiAzKSA8PCAxMSkKLSAgICAgICAgICAgICAgICB8ICgoa0FkanVzdGVkQ2xpcFtnMV0gPj4gMikgPDwgNSkKLSAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW3IxXSA+PiAzKTsKLQotICAgICAgICAgICAgdWludDMyX3QgcmdiMiA9Ci0gICAgICAgICAgICAgICAgKChrQWRqdXN0ZWRDbGlwW2IyXSA+PiAzKSA8PCAxMSkKLSAgICAgICAgICAgICAgICB8ICgoa0FkanVzdGVkQ2xpcFtnMl0gPj4gMikgPDwgNSkKLSAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW3IyXSA+PiAzKTsKLQotICAgICAgICAgICAgaWYgKHggKyAxIDwgc3JjLmNyb3BXaWR0aCgpKSB7Ci0gICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKSgmZHN0X3B0clt4XSkgPSAocmdiMiA8PCAxNikgfCByZ2IxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkc3RfcHRyW3hdID0gcmdiMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNyY195ICs9IHNyYy5tU3RyaWRlOwotCi0gICAgICAgIGlmICh5ICYgMSkgewotICAgICAgICAgICAgc3JjX3UgKz0gc3JjLm1TdHJpZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBkc3RfcHRyID0gKHVpbnQxNl90KikoKHVpbnQ4X3QqKWRzdF9wdHIgKyBkc3QubVN0cmlkZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hckJhc2UoCisgICAgICAgICAgICBzcmMsIGRzdCwgc3JjX3ksIHNyY191LCBzcmMubVN0cmlkZSAvKiByb3dfaW5jICovKTsKIH0KIAotc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRUSVlVVjQyMFBhY2tlZFNlbWlQbGFuYXIoCi0gICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgeworc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyQmFzZSgKKyAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0LAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSwgY29uc3QgdWludDhfdCAqc3JjX3UsIHNpemVfdCByb3dfaW5jLCBib29sIGlzTlYyMSkgeworICAgIGNvbnN0IHN0cnVjdCBDb2VmZnMgKm1hdHJpeCA9IGdldE1hdHJpeCgpOworICAgIGlmICghbWF0cml4KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBzaWduZWQgX2JfdSA9IG1hdHJpeC0+X2JfdTsKKyAgICBzaWduZWQgX25lZ19nX3UgPSAtbWF0cml4LT5fZ191OworICAgIHNpZ25lZCBfbmVnX2dfdiA9IC1tYXRyaXgtPl9nX3Y7CisgICAgc2lnbmVkIF9yX3YgPSBtYXRyaXgtPl9yX3Y7CisgICAgc2lnbmVkIF95ID0gbWF0cml4LT5feTsKKyAgICBzaWduZWQgX2MxNiA9IG1TcmNDb2xvclNwYWNlLm1SYW5nZSA9PSBDb2xvclV0aWxzOjprQ29sb3JSYW5nZUxpbWl0ZWQgPyAxNiA6IDA7CisKICAgICB1aW50OF90ICprQWRqdXN0ZWRDbGlwID0gaW5pdENsaXAoKTsKIAotICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopZHN0Lm1CaXRzCi0gICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1XaWR0aCArIGRzdC5tQ3JvcExlZnQ7Ci0KLSAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7Ci0KLSAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjX3kgKyBzcmMubVdpZHRoICogKHNyYy5tSGVpZ2h0IC0gc3JjLm1Dcm9wVG9wIC8gMik7CisgICAgdWludDE2X3QgKmRzdF9wdHIgPSAodWludDE2X3QgKikoKHVpbnQ4X3QgKikKKyAgICAgICAgICAgIGRzdC5tQml0cyArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tU3RyaWRlICsgZHN0Lm1Dcm9wTGVmdCAqIGRzdC5tQnBwKTsKIAogICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgc3JjLmNyb3BIZWlnaHQoKTsgKyt5KSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc3JjLmNyb3BXaWR0aCgpOyB4ICs9IDIpIHsKLSAgICAgICAgICAgIHNpZ25lZCB5MSA9IChzaWduZWQpc3JjX3lbeF0gLSAxNjsKLSAgICAgICAgICAgIHNpZ25lZCB5MiA9IChzaWduZWQpc3JjX3lbeCArIDFdIC0gMTY7CisgICAgICAgICAgICBzaWduZWQgeTEgPSAoc2lnbmVkKXNyY195W3hdIC0gX2MxNjsKKyAgICAgICAgICAgIHNpZ25lZCB5MiA9IChzaWduZWQpc3JjX3lbeCArIDFdIC0gX2MxNjsKIAotICAgICAgICAgICAgc2lnbmVkIHUgPSAoc2lnbmVkKXNyY191W3ggJiB+MV0gLSAxMjg7Ci0gICAgICAgICAgICBzaWduZWQgdiA9IChzaWduZWQpc3JjX3VbKHggJiB+MSkgKyAxXSAtIDEyODsKKyAgICAgICAgICAgIHNpZ25lZCB1ID0gKHNpZ25lZClzcmNfdVsoeCAmIH4xKSArIGlzTlYyMV0gLSAxMjg7CisgICAgICAgICAgICBzaWduZWQgdiA9IChzaWduZWQpc3JjX3VbKHggJiB+MSkgKyAhaXNOVjIxXSAtIDEyODsKIAotICAgICAgICAgICAgc2lnbmVkIHVfYiA9IHUgKiA1MTc7Ci0gICAgICAgICAgICBzaWduZWQgdV9nID0gLXUgKiAxMDA7Ci0gICAgICAgICAgICBzaWduZWQgdl9nID0gLXYgKiAyMDg7Ci0gICAgICAgICAgICBzaWduZWQgdl9yID0gdiAqIDQwOTsKKyAgICAgICAgICAgIHNpZ25lZCB1X2IgPSB1ICogX2JfdTsKKyAgICAgICAgICAgIHNpZ25lZCB1X2cgPSB1ICogX25lZ19nX3U7CisgICAgICAgICAgICBzaWduZWQgdl9nID0gdiAqIF9uZWdfZ192OworICAgICAgICAgICAgc2lnbmVkIHZfciA9IHYgKiBfcl92OwogCi0gICAgICAgICAgICBzaWduZWQgdG1wMSA9IHkxICogMjk4OworICAgICAgICAgICAgc2lnbmVkIHRtcDEgPSB5MSAqIF95ICsgMTI4OwogICAgICAgICAgICAgc2lnbmVkIGIxID0gKHRtcDEgKyB1X2IpIC8gMjU2OwogICAgICAgICAgICAgc2lnbmVkIGcxID0gKHRtcDEgKyB2X2cgKyB1X2cpIC8gMjU2OwogICAgICAgICAgICAgc2lnbmVkIHIxID0gKHRtcDEgKyB2X3IpIC8gMjU2OwogCi0gICAgICAgICAgICBzaWduZWQgdG1wMiA9IHkyICogMjk4OworICAgICAgICAgICAgc2lnbmVkIHRtcDIgPSB5MiAqIF95ICsgMTI4OwogICAgICAgICAgICAgc2lnbmVkIGIyID0gKHRtcDIgKyB1X2IpIC8gMjU2OwogICAgICAgICAgICAgc2lnbmVkIGcyID0gKHRtcDIgKyB2X2cgKyB1X2cpIC8gMjU2OwogICAgICAgICAgICAgc2lnbmVkIHIyID0gKHRtcDIgKyB2X3IpIC8gMjU2OwpAQCAtMTAwNiwzMSArMTIxOSw0MCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgc3JjX3kgKz0gc3JjLm1XaWR0aDsKKyAgICAgICAgc3JjX3kgKz0gcm93X2luYzsKIAogICAgICAgICBpZiAoeSAmIDEpIHsKLSAgICAgICAgICAgIHNyY191ICs9IHNyYy5tV2lkdGg7CisgICAgICAgICAgICBzcmNfdSArPSByb3dfaW5jOwogICAgICAgICB9CiAKLSAgICAgICAgZHN0X3B0ciArPSBkc3QubVdpZHRoOworICAgICAgICBkc3RfcHRyID0gKHVpbnQxNl90KikoKHVpbnQ4X3QqKWRzdF9wdHIgKyBkc3QubVN0cmlkZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCiB1aW50OF90ICpDb2xvckNvbnZlcnRlcjo6aW5pdENsaXAoKSB7Ci0gICAgc3RhdGljIGNvbnN0IHNpZ25lZCBrQ2xpcE1pbiA9IC0yNzg7Ci0gICAgc3RhdGljIGNvbnN0IHNpZ25lZCBrQ2xpcE1heCA9IDUzNTsKLQogICAgIGlmIChtQ2xpcCA9PSBOVUxMKSB7Ci0gICAgICAgIG1DbGlwID0gbmV3IHVpbnQ4X3Rba0NsaXBNYXggLSBrQ2xpcE1pbiArIDFdOworICAgICAgICBtQ2xpcCA9IG5ldyB1aW50OF90W0NMSVBfUkFOR0VfTUFYXzhCSVQgLSBDTElQX1JBTkdFX01JTl84QklUICsgMV07CiAKLSAgICAgICAgZm9yIChzaWduZWQgaSA9IGtDbGlwTWluOyBpIDw9IGtDbGlwTWF4OyArK2kpIHsKLSAgICAgICAgICAgIG1DbGlwW2kgLSBrQ2xpcE1pbl0gPSAoaSA8IDApID8gMCA6IChpID4gMjU1KSA/IDI1NSA6ICh1aW50OF90KWk7CisgICAgICAgIGZvciAoc2lnbmVkIGkgPSBDTElQX1JBTkdFX01JTl84QklUOyBpIDw9IENMSVBfUkFOR0VfTUFYXzhCSVQ7ICsraSkgeworICAgICAgICAgICAgbUNsaXBbaSAtIENMSVBfUkFOR0VfTUlOXzhCSVRdID0gKGkgPCAwKSA/IDAgOiAoaSA+IDI1NSkgPyAyNTUgOiAodWludDhfdClpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuICZtQ2xpcFsta0NsaXBNaW5dOworICAgIHJldHVybiAmbUNsaXBbLUNMSVBfUkFOR0VfTUlOXzhCSVRdOworfQorCit1aW50MTZfdCAqQ29sb3JDb252ZXJ0ZXI6OmluaXRDbGlwMTBCaXQoKSB7CisgICAgaWYgKG1DbGlwMTBCaXQgPT0gTlVMTCkgeworICAgICAgICBtQ2xpcDEwQml0ID0gbmV3IHVpbnQxNl90W0NMSVBfUkFOR0VfTUFYXzEwQklUIC0gQ0xJUF9SQU5HRV9NSU5fMTBCSVQgKyAxXTsKKworICAgICAgICBmb3IgKHNpZ25lZCBpID0gQ0xJUF9SQU5HRV9NSU5fMTBCSVQ7IGkgPD0gQ0xJUF9SQU5HRV9NQVhfMTBCSVQ7ICsraSkgeworICAgICAgICAgICAgbUNsaXAxMEJpdFtpIC0gQ0xJUF9SQU5HRV9NSU5fMTBCSVRdID0gKGkgPCAwKSA/IDAgOiAoaSA+IDEwMjMpID8gMTAyMyA6ICh1aW50MTZfdClpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICZtQ2xpcDEwQml0Wy1DTElQX1JBTkdFX01JTl8xMEJJVF07CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0FuZHJvaWQuYnAKaW5kZXggYWNjOWU4Ny4uZTZkNTlhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQW5kcm9pZC5icApAQCAtMjIsOCArMjIsMTIgQEAKICAgICAgICAgIlplcm9GaWx0ZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUvZmlsdGVycyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9Db2xvckNvbnZlcnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvaW5jbHVkZS9maWx0ZXJzL0NvbG9yQ29udmVydC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0NvbG9yQ29udmVydC5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL2luY2x1ZGUvZmlsdGVycy9Db2xvckNvbnZlcnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9HcmFwaGljQnVmZmVyTGlzdGVuZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvaW5jbHVkZS9maWx0ZXJzL0dyYXBoaWNCdWZmZXJMaXN0ZW5lci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0dyYXBoaWNCdWZmZXJMaXN0ZW5lci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL2luY2x1ZGUvZmlsdGVycy9HcmFwaGljQnVmZmVyTGlzdGVuZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9JbnRyaW5zaWNCbHVyRmlsdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL2luY2x1ZGUvZmlsdGVycy9JbnRyaW5zaWNCbHVyRmlsdGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvSW50cmluc2ljQmx1ckZpbHRlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL2luY2x1ZGUvZmlsdGVycy9JbnRyaW5zaWNCbHVyRmlsdGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvUlNGaWx0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvaW5jbHVkZS9maWx0ZXJzL1JTRmlsdGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvUlNGaWx0ZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9pbmNsdWRlL2ZpbHRlcnMvUlNGaWx0ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TYXR1cmF0aW9uRmlsdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL2luY2x1ZGUvZmlsdGVycy9TYXR1cmF0aW9uRmlsdGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvU2F0dXJhdGlvbkZpbHRlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL2luY2x1ZGUvZmlsdGVycy9TYXR1cmF0aW9uRmlsdGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvU2ltcGxlRmlsdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL2luY2x1ZGUvZmlsdGVycy9TaW1wbGVGaWx0ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TaW1wbGVGaWx0ZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9pbmNsdWRlL2ZpbHRlcnMvU2ltcGxlRmlsdGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvWmVyb0ZpbHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9pbmNsdWRlL2ZpbHRlcnMvWmVyb0ZpbHRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1plcm9GaWx0ZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9pbmNsdWRlL2ZpbHRlcnMvWmVyb0ZpbHRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAppbmRleCA2NjVhYWUxLi44M2ZjYzAxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTIxLDYgKzIxLDEyIEBACiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKIAogICAgIHNyY3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCmluZGV4IDBhNGU1OTguLjQzMzRmMWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcApAQCAtMTksNiArMTksOCBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlICJBTG9vcGVyUm9zdGVyLmgiCiAKICNpbmNsdWRlICJBRGVidWcuaCIKQEAgLTE0Miw3ICsxNDQsNyBAQAogICAgICAgICAgICAgc3A8QUhhbmRsZXI+IGhhbmRsZXIgPSBpbmZvLm1IYW5kbGVyLnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBoYW5kbGVyLT5tVmVyYm9zZVN0YXRzID0gdmVyYm9zZVN0YXRzOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kRm9ybWF0KCI6ICV1IG1lc3NhZ2VzIHByb2Nlc3NlZCIsIGhhbmRsZXItPm1NZXNzYWdlQ291bnRlcik7CisgICAgICAgICAgICAgICAgcy5hcHBlbmRGb3JtYXQoIjogJSIgUFJJdTY0ICIgbWVzc2FnZXMgcHJvY2Vzc2VkIiwgaGFuZGxlci0+bU1lc3NhZ2VDb3VudGVyKTsKICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZVN0YXRzKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaGFuZGxlci0+bU1lc3NhZ2VzLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZvdXJjY1sxNV07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCmluZGV4IGMyMTE0YjMuLjVjOTljYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCkBAIC0zMyw3ICszMyw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KIAotI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjZW5kaWYKIApAQCAtNjU5LDcgKzY1OSw3IEBACiAgICAgcmV0dXJuIHM7CiB9CiAKLSNpZiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQorI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAvLyBzdGF0aWMKIHNwPEFNZXNzYWdlPiBBTWVzc2FnZTo6RnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCwgc2l6ZV90IG1heE5lc3RpbmdMZXZlbCkgewogICAgIGludDMyX3Qgd2hhdCA9IHBhcmNlbC5yZWFkSW50MzIoKTsKQEAgLTgyNSw3ICs4MjUsNyBAQAogICAgICAgICB9CiAgICAgfQogfQotI2VuZGlmICAvLyAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQorI2VuZGlmICAvLyBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogCiBzcDxBTWVzc2FnZT4gQU1lc3NhZ2U6OmNoYW5nZXNGcm9tKGNvbnN0IHNwPGNvbnN0IEFNZXNzYWdlPiAmb3RoZXIsIGJvb2wgZGVlcCkgY29uc3QgewogICAgIGlmIChvdGhlciA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcAppbmRleCBiMWVkMDc3Li5hNWUwZmY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlICJBRGVidWcuaCIKICNpbmNsdWRlICJBU3RyaW5nLmgiCiAKLSNpZiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQorI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2VuZGlmCiAKQEAgLTM2NSw3ICszNjUsNyBAQAogICAgIHJldHVybiAhc3RyY2FzZWNtcChtRGF0YSArIG1TaXplIC0gc3VmZml4TGVuLCBzdWZmaXgpOwogfQogCi0jaWYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogLy8gc3RhdGljCiBBU3RyaW5nIEFTdHJpbmc6OkZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKICAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKQEAgLTM4MCw3ICszODAsNyBAQAogICAgIH0KICAgICByZXR1cm4gZXJyOwogfQotI2VuZGlmIC8vICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjZW5kaWYgLy8gZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKIAogQVN0cmluZyBBU3RyaW5nUHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CiAgICAgdmFfbGlzdCBhcDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAppbmRleCBkZDJjNjZmLi5jYTE3MTE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCkBAIC0yMyw2ICsyMywxMSBAQAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiB9CiAKIGNjX2RlZmF1bHRzIHsKQEAgLTMzLDE4ICszOCwxMyBAQAogICAgIH0sCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9hcmVjdC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2xpYnMvbmF0aXZlYmFzZS9pbmNsdWRlIiwKLSAgICBdLAogCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJpbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24iLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAiYXYtaGVhZGVycyIsCiAgICAgICAgIC8vIHRoaXMgaXMgb25seSBuZWVkZWQgZm9yIHRoZSB2ZW5kb3IgdmFyaWFudCB0aGF0IHJlbW92ZXMgbGliYmluZGVyLCBidXQgdmVuZG9yCiAgICAgICAgIC8vIHRhcmdldCBiZWxvdyBkb2VzIG5vdCBhbGxvdyBhZGRpbmcgaGVhZGVyX2xpYnMuCiAgICAgICAgICJsaWJiaW5kZXJfaGVhZGVycyIsCkBAIC0xMjAsOCArMTIwLDYgQEAKICAgICAgICAgfSwKICAgICB9LAogCi0gICAgY2xhbmc6IHRydWUsCi0KICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApAQCAtMTM1LDEyICsxMzMsMTkgQEAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9kZWZhdWx0cyJdLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAogfQogCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fd2l0aG91dF9pbWVtb3J5IiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2RlZmF1bHRzIl0sCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbImNvbS5hbmRyb2lkLm1lZGlhIl0sCisKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLVduby1tdWx0aWNoYXIiLApAQCAtMTY1LDcgKzE3MCw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnV0aWxzIiwgICAgICAgICAgICAgLy8gZm9yIHNwPD4KKyAgICAgICAgImxpYnV0aWxzIiwgLy8gZm9yIHNwPD4KICAgICAgICAgLy8gYWN0dWFsbHkgaW52b2tlcyB0aGlzLCBidXQgY2FsbGVkIGZyb20gZm9sa3Mgd2hvIGFscmVhZHkgbG9hZCBpdAogICAgICAgICAvLyAibGlibWVkaWFuZGsiLAogICAgIF0sCkBAIC0xOTMsOCArMTk4LDYgQEAKICAgICAgICAgIkNvbG9yVXRpbHNfZmlsbC5jcHAiLAogICAgIF0sCiAKLSAgICBjbGFuZzogdHJ1ZSwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCkBAIC0yMTEsNCArMjE0LDMgQEAKICAgICBdLAogCiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCmluZGV4IGZhNzIyYjUuLjZkYzgxNTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcApAQCAtNTkwLDkgKzU5MCwxMCBAQAogICAgIHVpbnQzMl90IGdmeFJhbmdlID0gcmFuZ2U7CiAgICAgdWludDMyX3QgZ2Z4U3RhbmRhcmQgPSBzdGFuZGFyZDsKICAgICB1aW50MzJfdCBnZnhUcmFuc2ZlciA9IHRyYW5zZmVyOwotICAgIC8vIFRSSUNLWTogdXNlICYgdG8gZW5zdXJlIGFsbCB0aHJlZSBtYXBwaW5ncyBhcmUgY29tcGxldGVkCi0gICAgaWYgKCEoc0dmeFJhbmdlcy5tYXAocmFuZ2UsICZnZnhSYW5nZSkgJiBzR2Z4U3RhbmRhcmRzLm1hcChzdGFuZGFyZCwgJmdmeFN0YW5kYXJkKQotICAgICAgICAgICAgJiBzR2Z4VHJhbnNmZXJzLm1hcCh0cmFuc2ZlciwgJmdmeFRyYW5zZmVyKSkpIHsKKyAgICBib29sIG1hcHBlZFJhbmdlID0gc0dmeFJhbmdlcy5tYXAocmFuZ2UsICZnZnhSYW5nZSk7CisgICAgYm9vbCBtYXBwZWRTdGFuZGFyZCA9IHNHZnhTdGFuZGFyZHMubWFwKHN0YW5kYXJkLCAmZ2Z4U3RhbmRhcmQpOworICAgIGJvb2wgbWFwcGVkVHJhbnNmZXIgPSBzR2Z4VHJhbnNmZXJzLm1hcCh0cmFuc2ZlciwgJmdmeFRyYW5zZmVyKTsKKyAgICBpZiAoISAobWFwcGVkUmFuZ2UgJiYgbWFwcGVkU3RhbmRhcmQgJiYgbWFwcGVkVHJhbnNmZXIpKSB7CiAgICAgICAgIEFMT0dXKCJjb3VsZCBub3Qgc2FmZWx5IG1hcCBwbGF0Zm9ybSBjb2xvciBhc3BlY3RzIChSOiV1KCVzKSBTOiV1KCVzKSBUOiV1KCVzKSB0byAiCiAgICAgICAgICAgICAgICJncmFwaGljcyBkYXRhc3BhY2UgKFI6JXUgUzoldSBUOiV1KSIsCiAgICAgICAgICAgICAgIHJhbmdlLCBhc1N0cmluZyhyYW5nZSksIHN0YW5kYXJkLCBhc1N0cmluZyhzdGFuZGFyZCksIHRyYW5zZmVyLCBhc1N0cmluZyh0cmFuc2ZlciksCkBAIC02MjYsOSArNjI3LDEwIEBACiAgICAgQ1U6OkNvbG9yUmFuZ2UgICAgY3VSYW5nZSAgICA9IENVOjprQ29sb3JSYW5nZVVuc3BlY2lmaWVkOwogICAgIENVOjpDb2xvclN0YW5kYXJkIGN1U3RhbmRhcmQgPSBDVTo6a0NvbG9yU3RhbmRhcmRVbnNwZWNpZmllZDsKICAgICBDVTo6Q29sb3JUcmFuc2ZlciBjdVRyYW5zZmVyID0gQ1U6OmtDb2xvclRyYW5zZmVyVW5zcGVjaWZpZWQ7Ci0gICAgLy8gVFJJQ0tZOiB1c2UgJiB0byBlbnN1cmUgYWxsIHRocmVlIG1hcHBpbmdzIGFyZSBjb21wbGV0ZWQKLSAgICBpZiAoIShzR2Z4UmFuZ2VzLm1hcChnZnhSYW5nZSwgJmN1UmFuZ2UpICYgc0dmeFN0YW5kYXJkcy5tYXAoZ2Z4U3RhbmRhcmQsICZjdVN0YW5kYXJkKQotICAgICAgICAgICAgJiBzR2Z4VHJhbnNmZXJzLm1hcChnZnhUcmFuc2ZlciwgJmN1VHJhbnNmZXIpKSkgeworICAgIGJvb2wgbWFwcGVkUmFuZ2UgPSBzR2Z4UmFuZ2VzLm1hcChnZnhSYW5nZSwgJmN1UmFuZ2UpOworICAgIGJvb2wgbWFwcGVkU3RhbmRhcmQgPSBzR2Z4U3RhbmRhcmRzLm1hcChnZnhTdGFuZGFyZCwgJmN1U3RhbmRhcmQpOworICAgIGJvb2wgbWFwcGVkVHJhbnNmZXIgPSBzR2Z4VHJhbnNmZXJzLm1hcChnZnhUcmFuc2ZlciwgJmN1VHJhbnNmZXIpOworICAgIGlmICghIChtYXBwZWRSYW5nZSAmJiBtYXBwZWRTdGFuZGFyZCAmJiBtYXBwZWRUcmFuc2ZlcikpIHsKICAgICAgICAgQUxPR1coImNvdWxkIG5vdCBzYWZlbHkgbWFwIGdyYXBoaWNzIGRhdGFzcGFjZSAoUjoldSBTOiV1IFQ6JXUpIHRvICIKICAgICAgICAgICAgICAgInBsYXRmb3JtIGNvbG9yIGFzcGVjdHMgKFI6JXUoJXMpIFM6JXUoJXMpIFQ6JXUoJXMpIiwKICAgICAgICAgICAgICAgZ2Z4UmFuZ2UsIGdmeFN0YW5kYXJkLCBnZnhUcmFuc2ZlciwKQEAgLTc4MSw1ICs3ODMsMTQgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorLy8gc3RhdGljCitib29sIENvbG9yVXRpbHM6OmlzSERSU3RhdGljSW5mb1ZhbGlkKEhEUlN0YXRpY0luZm8gKmluZm8pIHsKKyAgICBpZiAoaW5mby0+c1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlID4gMC4wZgorICAgICAgICAmJiBpbmZvLT5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgPiAwLjBmKSAgcmV0dXJuIHRydWU7CisgICAgaWYgKGluZm8tPnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwgPiAwLjBmCisgICAgICAgICYmIGluZm8tPnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA+IDAuMGYpICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcAppbmRleCBhZGE1ZDgxLi41YzRlYzE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCkBAIC02MCwxMiArNjAsNjYgQEAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDNCA9ICJhdWRpby9hYzQiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTUhBMSA9ICJhdWRpby9taGExIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX01ITTEgPSAiYXVkaW8vbWhtMSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9CTF9MMyA9ICJhdWRpby9taG0xLjAzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX0JMX0w0ID0gImF1ZGlvL21obTEuMDQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTENfTDMgPSAiYXVkaW8vbWhtMS4wZCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9MQ19MNCA9ICJhdWRpby9taG0xLjBlIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRCA9ICJhdWRpby9zY3JhbWJsZWQiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQyA9ICJhdWRpby9hbGFjIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1dNQSA9ICJhdWRpby94LW1zLXdtYSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NU19BRFBDTSA9ICJhdWRpby94LWFkcGNtLW1zIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RWSV9JTUFfQURQQ00gPSAiYXVkaW8veC1hZHBjbS1kdmktaW1hIjsKLQorY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRFRTID0gImF1ZGlvL3ZuZC5kdHMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRFRTX0hEID0gImF1ZGlvL3ZuZC5kdHMuaGQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRFRTX1VIRCA9ICJhdWRpby92bmQuZHRzLnVoZCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FVlJDID0gImF1ZGlvL2V2cmMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRVZSQ0IgPSAiYXVkaW8vZXZyY2IiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRVZSQ1dCID0gImF1ZGlvL2V2cmN3YiI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FVlJDTlcgPSAiYXVkaW8vZXZyY253IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQl9QTFVTID0gImF1ZGlvL2Ftci13YisiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQVBUWCA9ICJhdWRpby9hcHR4IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RSQSA9ICJhdWRpby92bmQuZHJhIjsKKy8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RPTEJZX01BVCA9ICJhdWRpby92bmQuZG9sYnkubWF0IjsKKy8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RPTEJZX01BVF8xXzAgPSAiYXVkaW8vdm5kLmRvbGJ5Lm1hdC4xLjAiOworLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfTUFUXzJfMCA9ICJhdWRpby92bmQuZG9sYnkubWF0LjIuMCI7CisvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCitjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19ET0xCWV9NQVRfMl8xID0gImF1ZGlvL3ZuZC5kb2xieS5tYXQuMi4xIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RPTEJZX1RSVUVIRCA9ICJhdWRpby92bmQuZG9sYnkubWxwIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19NUDQgPSAiYXVkaW8vbXA0YS40MCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTUFJTiA9ICJhdWRpby9tcDRhLjQwLjAxIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19MQyA9ICJhdWRpby9tcDRhLjQwLjAyIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19TU1IgPSAiYXVkaW8vbXA0YS40MC4wMyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTFRQID0gImF1ZGlvL21wNGEuNDAuMDQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0hFX1YxID0gImF1ZGlvL21wNGEuNDAuMDUiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX1NDQUxBQkxFID0gImF1ZGlvL21wNGEuNDAuMDYiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0VSTEMgPSAiYXVkaW8vbXA0YS40MC4xNyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTEQgPSAiYXVkaW8vbXA0YS40MC4yMyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfSEVfVjIgPSAiYXVkaW8vbXA0YS40MC4yOSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfRUxEID0gImF1ZGlvL21wNGEuNDAuMzkiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX1hIRSA9ICJhdWRpby9tcDRhLjQwLjQyIjsKKy8vIE5vdGU6IG5vdCBpbiB0aGUgSUFOQSByZWdpc3RyeS4KK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRElGID0gImF1ZGlvL2FhYy1hZGlmIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX01BSU4gPSAiYXVkaW8vYWFjLWFkdHMuMDEiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfTEMgPSAiYXVkaW8vYWFjLWFkdHMuMDIiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfU1NSID0gImF1ZGlvL2FhYy1hZHRzLjAzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0xUUCA9ICJhdWRpby9hYWMtYWR0cy4wNCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19IRV9WMSA9ICJhdWRpby9hYWMtYWR0cy4wNSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19TQ0FMQUJMRSA9ICJhdWRpby9hYWMtYWR0cy4wNiI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19FUkxDID0gImF1ZGlvL2FhYy1hZHRzLjE3IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0xEID0gImF1ZGlvL2FhYy1hZHRzLjIzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0hFX1YyID0gImF1ZGlvL2FhYy1hZHRzLjI5IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0VMRCA9ICJhdWRpby9hYWMtYWR0cy4zOSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19YSEUgPSAiYXVkaW8vYWFjLWFkdHMuNDIiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xBVE1fTEMgPSAiYXVkaW8vbXA0YS1sYXRtLjAyIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19MQVRNX0hFX1YxID0gImF1ZGlvL21wNGEtbGF0bS4wNSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfTEFUTV9IRV9WMiA9ICJhdWRpby9tcDRhLWxhdG0uMjkiOworLy8gTm90ZTogbm90IGluIHRoZSBJQU5BIHJlZ2lzdHJ5LgorY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fSUVDNjE5MzcgPSAiYXVkaW8veC1pZWM2MTkzNyI7CisvLyBOb3RlOiBub3QgaW4gdGhlIElBTkEgcmVnaXN0cnkuCitjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19JRUM2MDk1OCA9ICJhdWRpby94LWllYzYwOTU4IjsKIAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0ID0gInZpZGVvL21wNCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWID0gImF1ZGlvL3gtd2F2IjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YS5jcHAKaW5kZXggN2Y0OGNmZC4uNzc5MTNkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YS5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCi0jaWYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNlbmRpZgogCkBAIC00OCw3ICs0OCw3IEBACiBNZXRhRGF0YTo6fk1ldGFEYXRhKCkgewogfQogCi0jaWYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogLyogc3RhdGljICovCiBzcDxNZXRhRGF0YT4gTWV0YURhdGE6OmNyZWF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YUJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YUJhc2UuY3BwCmluZGV4IDNmMDUwZWEuLjMzNzA3NDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGFCYXNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhQmFzZS5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KIAotI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjZW5kaWYKIApAQCAtNDUyLDcgKzQ1Miw3IEBACiAgICAgfQogfQogCi0jaWYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogc3RhdHVzX3QgTWV0YURhdGFCYXNlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAmcGFyY2VsKSB7CiAgICAgc3RhdHVzX3QgcmV0OwogICAgIHNpemVfdCBudW1JdGVtcyA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy5zaXplKCk7CkBAIC01MjEsOSArNTIxLDY0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHNldERhdGEoa2V5LCB0eXBlLCBibG9iLmRhdGEoKSwgc2l6ZSk7CiAgICAgICAgICAgICAgICAgYmxvYi5yZWxlYXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVFlQRV9DX1NUUklORykgeworICAgICAgICAgICAgICAgIC8vIGNvcHkgZGF0YSBkaXJlY3RseSBmcm9tIFBhcmNlbCBzdG9yYWdlLCB0aGVuIGFkdmFuY2UgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAvLyBOQjogcmVhZElucGxhY2UoKSBidW1wcyBwb3NpdGlvbiwgaXQgaXMgTk9UIGlkZW1wb3RlbnQuCisgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjID0gcGFyY2VsLnJlYWRJbnBsYWNlKHNpemUpOworICAgICAgICAgICAgICAgIGNoYXIgKnN0ciA9IChjaGFyICopIHNyYzsKKyAgICAgICAgICAgICAgICBpZiAoc3JjID09IG51bGxwdHIgfHwgc2l6ZSA9PSAwIHx8IHN0cltzaXplLTFdICE9ICdcMCcpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjY0tleVs1XTsKKyAgICAgICAgICAgICAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhrZXksIGNjS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiaWdub3Jpbmcga2V5ICclcycgc3RyaW5nIHdpdGggbm8gZGF0YSAoZXhwZWN0ZWQgJWQpIiwgY2NLZXksIHNpemUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGtleSAnJXMnOiB1bnRlcm1pbmF0ZWQgc3RyaW5nIG9mICVkIGJ5dGVzIiwgY2NLZXksIHNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RGF0YShrZXksIHR5cGUsIHNyYywgc2l6ZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBjb3B5IGRhdGEgZGlyZWN0bHkgZnJvbSBQYXJjZWwgc3RvcmFnZSwgdGhlbiBhZHZhbmNlIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgc2V0RGF0YShrZXksIHR5cGUsIHBhcmNlbC5yZWFkSW5wbGFjZShzaXplKSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHJlY2VpdmVkIHNpemUgaXMgZW5vdWdoCisgICAgICAgICAgICAgICAgdWludDMyX3QgbmVlZGVkID0gMDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0lOVDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkID0gc2l6ZW9mKGludDMyX3QpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCA9IHNpemVvZihpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgPSBzaXplb2YoZmxvYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9QT0lOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTkI6IHRoaXMgcmVqZWN0cyBwYXNzaW5nIGJldHdlZW4gMzItYml0IGFuZCA2NC1iaXQgc3BhY2UuCisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgPSBzaXplb2Yodm9pZCopOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9SRUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkID0gc2l6ZW9mKFJlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tc3RhbmRhcmQgZW50aXRpZXMgY2FuIGJlIGFueSBzaXplID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjID0gcGFyY2VsLnJlYWRJbnBsYWNlKHNpemUpOworICAgICAgICAgICAgICAgIGlmIChzcmMgPT0gbnVsbHB0ciB8fCAobmVlZGVkICE9IDAgJiYgc2l6ZSAhPSBuZWVkZWQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgY2NLZXlbNV07CisgICAgICAgICAgICAgICAgICAgIE1ha2VGb3VyQ0NTdHJpbmcoa2V5LCBjY0tleSk7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgY2NUeXBlWzVdOworICAgICAgICAgICAgICAgICAgICBNYWtlRm91ckNDU3RyaW5nKHR5cGUsIGNjVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcmMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGtleSAnJXMnIHR5cGUgJyVzJyBtaXNzaW5nIGRhdGEgKGV4cGVjdGVkICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY0tleSwgY2NUeXBlLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBrZXkgJyVzJzogdHlwZSAnJXMnIGJ5dGVzOiBleHBlY3RlZCAlZCAhPSAlZCByZWNlaXZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NLZXksIGNjVHlwZSwgbmVlZGVkLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNldERhdGEoa2V5LCB0eXBlLCBzcmMsIHNpemUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgIH0KIApAQCAtNTMyLDcgKzU4Nyw3IEBACiAgICAgQUxPR1coIm5vIG1ldGFkYXRhIGluIHBhcmNlbCIpOwogICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogfQotI2VuZGlmIC8vICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCisjZW5kaWYgLy8gZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmgKaW5kZXggNTNkOGE5Yi4uMzM3NDYwYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oCkBAIC02Niw3ICs2Niw3IEBACiAgICAgfQogCiAgICAgYm9vbCBtVmVyYm9zZVN0YXRzOwotICAgIHVpbnQzMl90IG1NZXNzYWdlQ291bnRlcjsKKyAgICB1aW50NjRfdCBtTWVzc2FnZUNvdW50ZXI7CiAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIHVpbnQzMl90PiBtTWVzc2FnZXM7CiAKICAgICB2b2lkIGRlbGl2ZXJNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaAppbmRleCBhMmI2YzRmLi43MmM4MDc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCkBAIC0xOTMsNiArMTkzLDkgQEAKICAgICBzdGF0aWMgdm9pZCBzZXRIRFJTdGF0aWNJbmZvSW50b0FNZWRpYUZvcm1hdChjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCk7CiAgICAgLy8gKGludGVybmFsKSB1c2VkIGJ5IHRoZSBzZXRIRFJTdGF0aWNJbmZvSW5mbyogcm91dGluZXMKICAgICBzdGF0aWMgdm9pZCBmaWxsSGRyU3RhdGljSW5mb0J1ZmZlciggY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgdWludDhfdCAqZGF0YSk7CisKKyAgICAvLyBkZXRlcm1pbmUgd2hldGhlciBIRFIgc3RhdGljIGluZm8gaXMgdmFsaWQKKyAgICBzdGF0aWMgYm9vbCBpc0hEUlN0YXRpY0luZm9WYWxpZChIRFJTdGF0aWNJbmZvICppbmZvKTsKIH07CiAKIGlubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoYW5kcm9pZDo6Q29sb3JVdGlsczo6Q29sb3JTdGFuZGFyZCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oCmluZGV4IGY1Y2VjZWYuLmZiOGMyOTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oCkBAIC02MiwxMiArNjIsNTkgQEAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQzQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTUhBMTsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9NSE0xOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX0JMX0wzOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX0JMX0w0OworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX0xDX0wzOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX0xDX0w0OwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1dNQTsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NU19BRFBDTTsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19EVklfSU1BX0FEUENNOwotCitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRFRTOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RUU19IRDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19EVFNfVUhEOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VWUkM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRVZSQ0I7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRVZSQ1dCOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VWUkNOVzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0JfUExVUzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BUFRYOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RSQTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19ET0xCWV9NQVQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfTUFUXzFfMDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19ET0xCWV9NQVRfMl8wOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RPTEJZX01BVF8yXzE7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRE9MQllfVFJVRUhEOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19NUDQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX01BSU47CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xDOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19TU1I7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xUUDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfSEVfVjE7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX1NDQUxBQkxFOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19FUkxDOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19MRDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfSEVfVjI7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0VMRDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfWEhFOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRElGOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX01BSU47CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfTEM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFNfU1NSOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0xUUDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19IRV9WMTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19TQ0FMQUJMRTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19FUkxDOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0xEOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0hFX1YyOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTX0VMRDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUU19YSEU7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xBVE1fTEM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xBVE1fSEVfVjE7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0xBVE1fSEVfVjI7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fSUVDNjE5Mzc7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fSUVDNjA5NTg7CiAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQW5kcm9pZC5icAppbmRleCA1OTRkYTU2Li5lZTdkYjIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkLmJwCkBAIC00MywxMCArNDMsNiBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uIiwKLSAgICBdLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icAppbmRleCBlNTA3NDJlLi5lNzJjZTQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xOCwxMCArMTgsNiBAQAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCi0gICAgXSwKLQogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQuYnAKaW5kZXggZjRkNmQ5OS4uZjI1MzE4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5icApAQCAtMTIsMTAgKzEyLDggQEAKIAogICAgIHNyY3M6IFsiSFRUUEhlbHBlci5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgICAgICAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pIiwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icAppbmRleCAwYjBhY2JmLi43ZTI2YmQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKQEAgLTI4LDExICsyOCw2IEBACiAgICAgICAgICJQbGF5bGlzdEZldGNoZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCkBAIC02NSw2ICs2MCw4IEBACiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaHR0cGxpdmVfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCkBAIC03NCwzICs3MSw4IEBACiAgICAgXSwKIAogfQorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZV9oZWFkZXJzIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAppbmRleCAzYmFkMDE1Li4wOWNhMWM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAiTTNVUGFyc2VyLmgiCiAjaW5jbHVkZSAiUGxheWxpc3RGZXRjaGVyLmgiCiAKLSNpbmNsdWRlICJtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCIKKyNpbmNsdWRlIDxtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKaW5kZXggN2E2ZDQ4Ny4uZWQzOGEyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCkBAIC0yNCw3ICsyNCw3IEBACiAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKLSNpbmNsdWRlICJtcGVnMnRzL0FUU1BhcnNlci5oIgorI2luY2x1ZGUgPG1wZWcydHMvQVRTUGFyc2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKaW5kZXggYjIzYWE4YS4uYjMzOWZkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCkBAIC0yNCw5ICsyNCw5IEBACiAjaW5jbHVkZSAiSFRUUERvd25sb2FkZXIuaCIKICNpbmNsdWRlICJMaXZlU2Vzc2lvbi5oIgogI2luY2x1ZGUgIk0zVVBhcnNlci5oIgotI2luY2x1ZGUgImluY2x1ZGUvSUQzLmgiCi0jaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCi0jaW5jbHVkZSAibXBlZzJ0cy9IbHNTYW1wbGVEZWNyeXB0b3IuaCIKKyNpbmNsdWRlIDxJRDMuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaD4KKyNpbmNsdWRlIDxtcGVnMnRzL0hsc1NhbXBsZURlY3J5cHRvci5oPgogCiAjaW5jbHVkZSA8ZGF0YXNvdXJjZS9EYXRhVVJJU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oCmluZGV4IDVkM2Y5YzEuLjcxNmRmNjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CiAKLSNpbmNsdWRlICJtcGVnMnRzL0FUU1BhcnNlci5oIgorI2luY2x1ZGUgPG1wZWcydHMvQVRTUGFyc2VyLmg+CiAjaW5jbHVkZSAiTGl2ZVNlc3Npb24uaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWZkOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfaHR0cGxpdmVfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlX2xpY2Vuc2UiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJodHRwbGl2ZV9mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImh0dHBsaXZlX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2lkMyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZV9oZWFkZXJzIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICBdLAorICAgIGNvcnB1czogWyJjb3JwdXMvKiJdLAorICAgIGRpY3Rpb25hcnk6ICJodHRwbGl2ZV9mdXp6ZXIuZGljdCIsCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E2NGVhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw1NiBAQAorIyBGdXp6ZXIgZm9yIGxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUgbGlicmFyeSBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBub3QgaGFyZGNvZGVkLCBidXQgaW5zdGVhZCBzZWxlY3RlZCBiYXNlZCBvbgoraW5jb21pbmcgZGF0YS5BbHNvLCBzZXZlcmFsIC5tM3U4IGZpbGVzIGFyZSBoYW5kLWNyYWZ0ZWQgYW5kIGFkZGVkIHRvIHRoZSBjb3JwdXMgZGlyZWN0b3J5IHRvIGluY3JlYXNlIHRoZSBjb2RlIGNvdmVyYWdlLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK2xpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIEZpbmFsIFJlc3VsdCAocGFyYW1ldGVyIG5hbWU6IGBmaW5hbFJlc3VsdGApCisyLiBGbGFncyAocGFyYW1ldGVyIG5hbWU6IGBmbGFnc2ApCiszLiBUaW1lIFVzIChwYXJhbWV0ZXIgbmFtZTogYHRpbWVVc2ApCis0LiBUcmFjayBJbmRleCAocGFyYW1ldGVyIG5hbWU6IGB0cmFja0luZGV4YCkKKzUuIEluZGV4IChwYXJhbWV0ZXIgbmFtZTogYGluZGV4YCkKKzYuIFNlbGVjdCAocGFyYW1ldGVyIG5hbWU6IGBzZWxlY3RgKQorCit8IFBhcmFtZXRlcnwgVmFsaWQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYGZpbmFsUmVzdWx0YCB8IGAtMzRgIHRvIGAtMWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYGZsYWdzYCB8IGAwYCB0byBgMWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYHRpbWVVc2AgfCBgMGAgdG8gYDEwMDAwMDAwYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfCBgdHJhY2tJbmRleGAgfCBgVUlOVDMyX01JTmAgdG8gYFVJTlQzMl9NQVhgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGBpbmRleGAgfCBgVUlOVDMyX01JTmAgdG8gYFVJTlQzMl9NQVhgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGBzZWxlY3RgIHwgYFRydWVgIHRvIGBGYWxzZWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKKworVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIGlzIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gZmVlZHMgdGhlIGVudGlyZSBpbnB1dCBkYXRhIHRvIHRoZSBodHRwbGl2ZSBtb2R1bGUuCitUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIHRvbGVyYXRlcyBhbnkga2luZCBvZiBpbnB1dCAoZW1wdHksIGh1Z2UsCittYWxmb3JtZWQsIGV0YykgYW5kIGRvZXNudCBgZXhpdCgpYCBvbiBhbnkgaW5wdXQgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUKK2NoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGh0dHBsaXZlX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgaHR0cGxpdmVfZnV6emVyCitgYGAKKyMjIyMgU3RlcHMgdG8gcnVuCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgcHVzaCAkQU5EUk9JRF9QUk9EVUNUX09VVC9kYXRhL2Z1enovJChUQVJHRVRfQVJDSCkvbGliIC9kYXRhL2Z1enovJChUQVJHRVRfQVJDSCkvbGliCisgICQgYWRiIHB1c2ggJEFORFJPSURfUFJPRFVDVF9PVVQvZGF0YS9mdXp6LyQoVEFSR0VUX0FSQ0gpL2h0dHBsaXZlX2Z1enplciAvZGF0YS9mdXp6LyQoVEFSR0VUX0FSQ0gpL2h0dHBsaXZlX2Z1enplcgorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6LyR7VEFSR0VUX0FSQ0h9L2h0dHBsaXZlX2Z1enplci9odHRwbGl2ZV9mdXp6ZXIgL2RhdGEvZnV6ei8ke1RBUkdFVF9BUkNIfS9odHRwbGl2ZV9mdXp6ZXIvY29ycHVzCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2NyeXB0LmtleSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvY3J5cHQua2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZDVkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2NyeXB0LmtleQpAQCAtMCwwICsxLDIgQEAKK9sKK4HPjPzQNdCJX3jvSM4zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2VuY3J5cHRlZC5tM3U4IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9lbmNyeXB0ZWQubTN1OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmIwZWFjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9lbmNyeXB0ZWQubTN1OApAQCAtMCwwICsxLDEyIEBACisjRVhUTTNVCisjRVhULVgtVEFSR0VURFVSQVRJT046MTAKKyNFWFQtWC1BTExPVy1DQUNIRTpZRVMKKyNFWFQtWC1QTEFZTElTVC1UWVBFOlZPRAorI0VYVC1YLVZFUlNJT046MworI0VYVC1YLU1FRElBLVNFUVVFTkNFOjEKKyNFWFQtWC1LRVk6TUVUSE9EPUFFUy0xMjgsVVJJPSIuLi8uLi9mdXp6L2FybTY0L2h0dHBsaXZlX2Z1enplci9jb3JwdXMvY3J5cHQua2V5IgorI0VYVElORjoxMC4wMDAsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFRJTkY6NS4wOTIsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFQtWC1FTkRMSVNUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2hscy5tM3U4IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9obHMubTN1OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzM4ZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9obHMubTN1OApAQCAtMCwwICsxLDggQEAKKyNFWFRNM1UKKyNFWFQtWC1UQVJHRVREVVJBVElPTjoxMAorI0VYVC1YLU1FRElBLVNFUVVFTkNFOjAKKyNFWFRJTkY6MTAsIG5vIGRlc2MKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVElORjoxMCwgbm8gZGVzYworaHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UyLnRzCisjRVhULVgtRU5ETElTVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDEubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXgxLm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFlZmY1OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXgxLm0zdTgKQEAgLTAsMCArMSwxNCBAQAorI0VYVE0zVQorI0VYVC1YLVZFUlNJT046NAorI0VYVC1YLVRBUkdFVERVUkFUSU9OOjUKKyNFWFQtWC1LRVk6TUVUSE9EPU5PTkUKKyNFWFQtWC1ESVNDT05USU5VSVRZLVNFUVVFTkNFOjAKKyNFWFQtWC1QTEFZTElTVC1UWVBFOlZPRAorI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UwLnRzCisjRVhULVgtRElTQ09OVElOVUlUWQorI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTIudHMKKyNFWFQtWC1FTkRMSVNUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4Mi5tM3U4IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDIubTN1OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2EwMTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDIubTN1OApAQCAtMCwwICsxLDYgQEAKKyNFWFRNM1UKKyNFWFQtWC1JTkRFUEVOREVOVC1TRUdNRU5UUworI0VYVC1YLVNUUkVBTS1JTkY6Q0xPU0VELUNBUFRJT05TPU5PTkUsQkFORFdJRFRIPTE2NTM0MCxSRVNPTFVUSU9OPTI1NngxNDQsQ09ERUNTPSJtcDRhLjQwLjUsYXZjMS40MmMwMGIiCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL3Byb2dfaW5kZXgubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6Q0xPU0VELUNBUFRJT05TPU5PTkUsQkFORFdJRFRIPTM0NDM4OCxSRVNPTFVUSU9OPTQyNngyNDAsQ09ERUNTPSJtcDRhLjQwLjUsYXZjMS40ZDQwMTUiCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL3Byb2dfaW5kZXgxLm0zdTgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXgzLm0zdTggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4My5tM3U4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiN2Y0ODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4My5tM3U4CkBAIC0wLDAgKzEsMTMgQEAKKyNFWFRNM1UKKyNFWFQtWC1WRVJTSU9OOjQKKyNFWFQtWC1UQVJHRVREVVJBVElPTjo1CisjRVhULVgtS0VZOk1FVEhPRD1BRVMtMTI4LFVSST0iaHR0cHM6Ly9kZW1vLnVuaWZpZWQtc3RyZWFtaW5nLmNvbS92aWRlby90ZWFycy1vZi1zdGVlbC9hZXMua2V5IixJVj0wWDk5Yjc0MDA3YjYyNTRlNGJkMWM2ZTAzNjMxY2FkMTViCisjRVhULVgtUExBWUxJU1QtVFlQRTpWT0QKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVC1YLURJU0NPTlRJTlVJVFkKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMi50cworI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UzLnRzCisjRVhULVgtRU5ETElTVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDQubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg0Lm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliYTM3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg0Lm0zdTgKQEAgLTAsMCArMSwxNSBAQAorI0VYVE0zVQorI0VYVC1YLVZFUlNJT046NAorI0VYVC1YLVRBUkdFVERVUkFUSU9OOjUKKyNFWFQtWC1LRVk6TUVUSE9EPVNBTVBMRS1BRVMsVVJJPSJkYXRhOnRleHQvcGxhaW47Y2hhcnNldD11dGYtOCxhNGNkOTk5NWExYWE5MWUxIixJVj0wWDk5Yjc0MDA3YjYyNTRlNGJkMWM2ZTAzNjMxY2FkMTViCisjRVhULVgtRElTQ09OVElOVUlUWS1TRVFVRU5DRTowCisjRVhULVgtUExBWUxJU1QtVFlQRTpWT0QKKyNFWFQtWC1ESVNDT05USU5VSVRZCisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTAudHMKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVC1YLURJU0NPTlRJTlVJVFkKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMi50cworI0VYVC1YLUVORExJU1QKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg1Lm0zdTggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4NS5tM3U4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjBkZTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4NS5tM3U4CkBAIC0wLDAgKzEsMTQgQEAKKyNFWFRNM1UKKyNFWFQtWC1UQVJHRVREVVJBVElPTjoxMQorI0VYVC1YLUtFWTpNRVRIT0Q9Tk9ORQorI0VYVC1YLU1FRElBLVNFUVVFTkNFOjAKKyNFWFQtWC1WRVJTSU9OOjQKKyNFWFRJTkY6MTAuMCwKKyNFWFQtWC1CWVRFUkFOR0U6MTBAMAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhUSU5GOjEwLjAsCisjRVhULVgtQllURVJBTkdFOjIwQDEwCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFRJTkY6MTAuMCwKKyNFWFQtWC1CWVRFUkFOR0U6ODAKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDYubTN1OCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg2Lm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4MzY4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvaW5kZXg2Lm0zdTgKQEAgLTAsMCArMSwxMiBAQAorI0VYVE0zVQorI0VYVC1YLVZFUlNJT046NAorI0VYVC1YLVRBUkdFVERVUkFUSU9OOjUKKyNFWFQtWC1LRVk6TUVUSE9EPUFFUy0xMjgsVVJJPSJkYXRhOnRleHQvcGxhaW47Y2hhcnNldD11dGYtOCxhNGNkOTk5NWExYWE5MWUxIixJVj0weDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwCisjRVhULVgtUExBWUxJU1QtVFlQRTpWT0QKKyNFWFRJTkY6NSwKK2h0dHBzOi8vbm9uLmV4aXN0ZW50c2l0ZS5jb20vdGVzdC1kb2VzbnQtZGVyZWZlcmVuY2UtdGhlc2UtcGF0aHMvZmlsZVNlcXVlbmNlMS50cworI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UyLnRzCisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTMudHMKKyNFWFQtWC1FTkRMSVNUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4Ny5tM3U4IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDcubTN1OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDk5NDhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDcubTN1OApAQCAtMCwwICsxLDQ2IEBACisjRVhUTTNVCisjRVhULVgtVkVSU0lPTjo0CisjIyBDcmVhdGVkIHdpdGggVW5pZmllZCBTdHJlYW1pbmcgUGxhdGZvcm0gICh2ZXJzaW9uPTEuMTEuMy0yNDQzOCkKKyNFWFQtWC1TRVNTSU9OLUtFWTpNRVRIT0Q9QUVTLTEyOCxVUkk9Imh0dHBzOi8vZGVtby51bmlmaWVkLXN0cmVhbWluZy5jb20vdmlkZW8vdGVhcnMtb2Ytc3RlZWwvYWVzLmtleSIKKworIyBBVURJTyBncm91cHMKKyNFWFQtWC1NRURJQTpUWVBFPUFVRElPLEdST1VQLUlEPSJhdWRpby1hYWNsLTY0IixMQU5HVUFHRT0iZW4iLE5BTUU9IkVuZ2xpc2giLERFRkFVTFQ9WUVTLEFVVE9TRUxFQ1Q9WUVTLENIQU5ORUxTPSIyIgorI0VYVC1YLU1FRElBOlRZUEU9QVVESU8sR1JPVVAtSUQ9ImF1ZGlvLWFhY2wtMTI4IixMQU5HVUFHRT0iZW4iLE5BTUU9IkVuZ2xpc2giLERFRkFVTFQ9WUVTLEFVVE9TRUxFQ1Q9WUVTLENIQU5ORUxTPSIyIgorCisjIFNVQlRJVExFUyBncm91cHMKKyNFWFQtWC1NRURJQTpUWVBFPVNVQlRJVExFUyxHUk9VUC1JRD0idGV4dHN0cmVhbSIsTEFOR1VBR0U9ImVuIixOQU1FPSJFbmdsaXNoIixERUZBVUxUPVlFUyxBVVRPU0VMRUNUPVlFUyxVUkk9InRlYXJzLW9mLXN0ZWVsLWFlcy10ZXh0c3RyZWFtX2VuZz0xMDAwLm0zdTgiCisjRVhULVgtTUVESUE6VFlQRT1TVUJUSVRMRVMsR1JPVVAtSUQ9InRleHRzdHJlYW0iLExBTkdVQUdFPSJydSIsTkFNRT0iUnVzc2lhbiIsQVVUT1NFTEVDVD1ZRVMsVVJJPSJ0ZWFycy1vZi1zdGVlbC1hZXMtdGV4dHN0cmVhbV9ydXM9MTAwMC5tM3U4IgorCisjIHZhcmlhbnRzCisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9NDk0MDAwLENPREVDUz0ibXA0YS40MC4yLGF2YzEuNDJDMDBEIixSRVNPTFVUSU9OPTIyNHgxMDAsRlJBTUUtUkFURT0yNCxBVURJTz0iYXVkaW8tYWFjbC02NCIsU1VCVElUTEVTPSJ0ZXh0c3RyZWFtIixDTE9TRUQtQ0FQVElPTlM9Tk9ORQordGVhcnMtb2Ytc3RlZWwtYWVzLWF1ZGlvX2VuZz02NDAwOC12aWRlb19lbmc9NDAxMDAwLm0zdTgKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD05MzMwMDAsQ09ERUNTPSJtcDRhLjQwLjIsYXZjMS40MkMwMTYiLFJFU09MVVRJT049NDQ4eDIwMCxGUkFNRS1SQVRFPTI0LEFVRElPPSJhdWRpby1hYWNsLTEyOCIsU1VCVElUTEVTPSJ0ZXh0c3RyZWFtIixDTE9TRUQtQ0FQVElPTlM9Tk9ORQordGVhcnMtb2Ytc3RlZWwtYWVzLWF1ZGlvX2VuZz0xMjgwMDItdmlkZW9fZW5nPTc1MTAwMC5tM3U4CisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9MTE5ODAwMCxDT0RFQ1M9Im1wNGEuNDAuMixhdmMxLjRENDAxRiIsUkVTT0xVVElPTj03ODR4MzUwLEZSQU1FLVJBVEU9MjQsQVVESU89ImF1ZGlvLWFhY2wtMTI4IixTVUJUSVRMRVM9InRleHRzdHJlYW0iLENMT1NFRC1DQVBUSU9OUz1OT05FCit0ZWFycy1vZi1zdGVlbC1hZXMtYXVkaW9fZW5nPTEyODAwMi12aWRlb19lbmc9MTAwMTAwMC5tM3U4CisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9MTcyODAwMCxDT0RFQ1M9Im1wNGEuNDAuMixhdmMxLjY0MDAyOCIsUkVTT0xVVElPTj0xNjgweDc1MCxGUkFNRS1SQVRFPTI0LFZJREVPLVJBTkdFPVNEUixBVURJTz0iYXVkaW8tYWFjbC0xMjgiLFNVQlRJVExFUz0idGV4dHN0cmVhbSIsQ0xPU0VELUNBUFRJT05TPU5PTkUKK3RlYXJzLW9mLXN0ZWVsLWFlcy1hdWRpb19lbmc9MTI4MDAyLXZpZGVvX2VuZz0xNTAxMDAwLm0zdTgKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD0yNDY5MDAwLENPREVDUz0ibXA0YS40MC4yLGF2YzEuNjQwMDI4IixSRVNPTFVUSU9OPTE2ODB4NzUwLEZSQU1FLVJBVEU9MjQsVklERU8tUkFOR0U9U0RSLEFVRElPPSJhdWRpby1hYWNsLTEyOCIsU1VCVElUTEVTPSJ0ZXh0c3RyZWFtIixDTE9TRUQtQ0FQVElPTlM9Tk9ORQordGVhcnMtb2Ytc3RlZWwtYWVzLWF1ZGlvX2VuZz0xMjgwMDItdmlkZW9fZW5nPTIyMDAwMDAubTN1OAorCisjIHZhcmlhbnRzCisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9MTAyNTAwMCxDT0RFQ1M9Im1wNGEuNDAuMixodmMxLjEuNi5MMTUwLjkwIixSRVNPTFVUSU9OPTE2ODB4NzUwLEZSQU1FLVJBVEU9MjQsVklERU8tUkFOR0U9U0RSLEFVRElPPSJhdWRpby1hYWNsLTY0IixTVUJUSVRMRVM9InRleHRzdHJlYW0iLENMT1NFRC1DQVBUSU9OUz1OT05FCit0ZWFycy1vZi1zdGVlbC1hZXMtYXVkaW9fZW5nPTY0MDA4LXZpZGVvX2VuZ18xPTkwMjAwMC5tM3U4CisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9MTM2ODAwMCxDT0RFQ1M9Im1wNGEuNDAuMixodmMxLjEuNi5MMTUwLjkwIixSRVNPTFVUSU9OPTI1NzZ4MTE1MCxGUkFNRS1SQVRFPTI0LFZJREVPLVJBTkdFPVNEUixBVURJTz0iYXVkaW8tYWFjbC0xMjgiLFNVQlRJVExFUz0idGV4dHN0cmVhbSIsQ0xPU0VELUNBUFRJT05TPU5PTkUKK3RlYXJzLW9mLXN0ZWVsLWFlcy1hdWRpb19lbmc9MTI4MDAyLXZpZGVvX2VuZ18xPTExNjEwMDAubTN1OAorI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTE4MTUwMDAsQ09ERUNTPSJtcDRhLjQwLjIsaHZjMS4xLjYuTDE1MC45MCIsUkVTT0xVVElPTj0zMzYweDE1MDAsRlJBTUUtUkFURT0yNCxWSURFTy1SQU5HRT1TRFIsQVVESU89ImF1ZGlvLWFhY2wtMTI4IixTVUJUSVRMRVM9InRleHRzdHJlYW0iLENMT1NFRC1DQVBUSU9OUz1OT05FCit0ZWFycy1vZi1zdGVlbC1hZXMtYXVkaW9fZW5nPTEyODAwMi12aWRlb19lbmdfMT0xNTgzMDAwLm0zdTgKKworIyB2YXJpYW50cworI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTY5MDAwLENPREVDUz0ibXA0YS40MC4yIixBVURJTz0iYXVkaW8tYWFjbC02NCIsU1VCVElUTEVTPSJ0ZXh0c3RyZWFtIgordGVhcnMtb2Ytc3RlZWwtYWVzLWF1ZGlvX2VuZz02NDAwOC5tM3U4CisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9MTM3MDAwLENPREVDUz0ibXA0YS40MC4yIixBVURJTz0iYXVkaW8tYWFjbC0xMjgiLFNVQlRJVExFUz0idGV4dHN0cmVhbSIKK3RlYXJzLW9mLXN0ZWVsLWFlcy1hdWRpb19lbmc9MTI4MDAyLm0zdTgKKworIyBrZXlmcmFtZXMKKyNFWFQtWC1JLUZSQU1FLVNUUkVBTS1JTkY6QkFORFdJRFRIPTU0MDAwLENPREVDUz0iYXZjMS40MkMwMEQiLFJFU09MVVRJT049MjI0eDEwMCxVUkk9ImtleWZyYW1lcy90ZWFycy1vZi1zdGVlbC1hZXMtdmlkZW9fZW5nPTQwMTAwMC5tM3U4IgorI0VYVC1YLUktRlJBTUUtU1RSRUFNLUlORjpCQU5EV0lEVEg9MTAwMDAwLENPREVDUz0iYXZjMS40MkMwMTYiLFJFU09MVVRJT049NDQ4eDIwMCxVUkk9ImtleWZyYW1lcy90ZWFycy1vZi1zdGVlbC1hZXMtdmlkZW9fZW5nPTc1MTAwMC5tM3U4IgorI0VYVC1YLUktRlJBTUUtU1RSRUFNLUlORjpCQU5EV0lEVEg9MTMzMDAwLENPREVDUz0iYXZjMS40RDQwMUYiLFJFU09MVVRJT049Nzg0eDM1MCxVUkk9ImtleWZyYW1lcy90ZWFycy1vZi1zdGVlbC1hZXMtdmlkZW9fZW5nPTEwMDEwMDAubTN1OCIKKyNFWFQtWC1JLUZSQU1FLVNUUkVBTS1JTkY6QkFORFdJRFRIPTEyMDAwMCxDT0RFQ1M9Imh2YzEuMS42LkwxNTAuOTAiLFJFU09MVVRJT049MTY4MHg3NTAsVklERU8tUkFOR0U9U0RSLFVSST0ia2V5ZnJhbWVzL3RlYXJzLW9mLXN0ZWVsLWFlcy12aWRlb19lbmdfMT05MDIwMDAubTN1OCIKKyNFWFQtWC1JLUZSQU1FLVNUUkVBTS1JTkY6QkFORFdJRFRIPTE1NDAwMCxDT0RFQ1M9Imh2YzEuMS42LkwxNTAuOTAiLFJFU09MVVRJT049MjU3NngxMTUwLFZJREVPLVJBTkdFPVNEUixVUkk9ImtleWZyYW1lcy90ZWFycy1vZi1zdGVlbC1hZXMtdmlkZW9fZW5nXzE9MTE2MTAwMC5tM3U4IgorI0VYVC1YLUktRlJBTUUtU1RSRUFNLUlORjpCQU5EV0lEVEg9MjEwMDAwLENPREVDUz0iaHZjMS4xLjYuTDE1MC45MCIsUkVTT0xVVElPTj0zMzYweDE1MDAsVklERU8tUkFOR0U9U0RSLFVSST0ia2V5ZnJhbWVzL3RlYXJzLW9mLXN0ZWVsLWFlcy12aWRlb19lbmdfMT0xNTgzMDAwLm0zdTgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvY29ycHVzL2luZGV4OC5tM3U4IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDgubTN1OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTNkNTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9pbmRleDgubTN1OApAQCAtMCwwICsxLDEzIEBACisjRVhUTTNVCisjRVhULVgtVkVSU0lPTjo1CisKKyNFWFQtWC1NRURJQTpUWVBFPUFVRElPLEdST1VQLUlEPSJhdWRpbyIsTkFNRT0iRW5nbGlzaCBzdGVyZW8iLExBTkdVQUdFPSJlbiIsQVVUT1NFTEVDVD1ZRVMsVVJJPSIuLi8uLi9mdXp6L2FybTY0L2h0dHBsaXZlX2Z1enplci9pbmRleDEubTN1OCIKKworI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPTYyODAwMCxDT0RFQ1M9ImF2YzEuNDJjMDBkLG1wNGEuNDAuMiIsUkVTT0xVVElPTj0zMjB4MTgwLEFVRElPPSJhdWRpbyIKKy4uLy4uL2Z1enovYXJtNjQvaHR0cGxpdmVfZnV6emVyL2luZGV4MS5tM3U4CisjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9OTI4MDAwLENPREVDUz0iYXZjMS40MmMwMGQsbXA0YS40MC4yIixSRVNPTFVUSU9OPTQ4MHgyNzAsQVVESU89ImF1ZGlvIgorLi4vLi4vZnV6ei9hcm02NC9odHRwbGl2ZV9mdXp6ZXIvaW5kZXgyLm0zdTgKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD0xNzI4MDAwLENPREVDUz0iYXZjMS40MmMwMGQsbXA0YS40MC4yIixSRVNPTFVUSU9OPTY0MHgzNjAsQVVESU89ImF1ZGlvIgorLi4vLi4vZnV6ei9hcm02NC9odHRwbGl2ZV9mdXp6ZXIvaW5kZXgzLm0zdTgKKyNFWFQtWC1TVFJFQU0tSU5GOkJBTkRXSURUSD0yNTI4MDAwLENPREVDUz0iYXZjMS40MmMwMGQsbXA0YS40MC4yIixSRVNPTFVUSU9OPTk2MHg1NDAsQVVESU89ImF1ZGlvIgorLi4vLi4vZnV6ei9hcm02NC9odHRwbGl2ZV9mdXp6ZXIvaW5kZXgxLm0zdTgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvcHJvZ19pbmRleC5tM3U4IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvZnV6emVyL2NvcnB1cy9wcm9nX2luZGV4Lm0zdTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4ODQyMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9jb3JwdXMvcHJvZ19pbmRleC5tM3U4CkBAIC0wLDAgKzEsMTcgQEAKKyNFWFRNM1UKKyNFWFQtWC1NRURJQTpUWVBFPUFVRElPLEdST1VQLUlEPSJhdWRpbyIsTEFOR1VBR0U9ImVuZyIsTkFNRT0iRW5nbGlzaCIsQVVUT1NFTEVDVD1ZRVMsREVGQVVMVD1ZRVMsVVJJPSJjb3JwdXMvaW5kZXgxLm0zdTgiCisjRVhULVgtTUVESUE6VFlQRT1BVURJTyxHUk9VUC1JRD0iYXVkaW8iLExBTkdVQUdFPSJmcmUiLE5BTUU9IkZyYW7Dp2FpcyIsQVVUT1NFTEVDVD1ZRVMsREVGQVVMVD1OTyxVUkk9ImNvcnB1cy9pbmRleDEubTN1OCIKKyNFWFQtWC1NRURJQTpUWVBFPUFVRElPLEdST1VQLUlEPSJhdWRpbyIsTEFOR1VBR0U9InNwIixOQU1FPSJFc3Bhbm9sIixBVVRPU0VMRUNUPVlFUyxERUZBVUxUPU5PLFVSST0iY29ycHVzL2luZGV4MS5tM3U4IgorI0VYVC1YLVZFUlNJT046NAorI0VYVC1YLVRBUkdFVERVUkFUSU9OOjUKKyNFWFQtWC1LRVk6TUVUSE9EPU5PTkUKKyNFWFQtWC1ESVNDT05USU5VSVRZLVNFUVVFTkNFOjAKKyNFWFQtWC1QTEFZTElTVC1UWVBFOlZPRAorI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhULVgtRElTQ09OVElOVUlUWQorI0VYVElORjo1LAoraHR0cHM6Ly9ub24uZXhpc3RlbnRzaXRlLmNvbS90ZXN0LWRvZXNudC1kZXJlZmVyZW5jZS10aGVzZS1wYXRocy9maWxlU2VxdWVuY2UxLnRzCisjRVhUSU5GOjUsCitodHRwczovL25vbi5leGlzdGVudHNpdGUuY29tL3Rlc3QtZG9lc250LWRlcmVmZXJlbmNlLXRoZXNlLXBhdGhzL2ZpbGVTZXF1ZW5jZTEudHMKKyNFWFQtWC1FTkRMSVNUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvaHR0cGxpdmVfZnV6emVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9odHRwbGl2ZV9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzc3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvaHR0cGxpdmVfZnV6emVyLmNwcApAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxMaXZlRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPExpdmVTZXNzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllcl9jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NvbnN0ZXhwciBjaGFyIGtGaWxlTmFtZVByZWZpeFtdID0gIi9kYXRhL2xvY2FsL3RtcC9odHRwbGl2ZS0iOworY29uc3RleHByIGNoYXIga0ZpbGVOYW1lU3VmZml4W10gPSAiLm0zdTgiOworY29uc3RleHByIGNoYXIga0ZpbGVVcmxQcmVmaXhbXSA9ICJmaWxlOi8vIjsKK2NvbnN0ZXhwciBpbnQ2NF90IGtPZmZTZXQgPSAwOworY29uc3RleHByIGludDMyX3Qga1JlYWR5TWFya01zID0gNTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtQcmVwYXJlTWFya01zID0gMTUwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtFcnJvck5vTWF4ID0gLTE7Citjb25zdGV4cHIgaW50MzJfdCBrRXJyb3JOb01pbiA9IC0zNDsKK2NvbnN0ZXhwciBpbnQzMl90IGtNYXhUaW1lVXMgPSAxMDAwOworY29uc3RleHByIGludDMyX3Qga1JhbmRvbVN0cmluZ0xlbmd0aCA9IDY0OworY29uc3RleHByIGludDMyX3Qga1JhbmdlTWluID0gMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtSYW5nZU1heCA9IDEwMDA7CisKK2NvbnN0ZXhwciBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBrVmFsaWRTdHJlYW1UeXBlW10gPSB7CisgICAgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU8sIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1ZJREVPLAorICAgIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUywgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfTUVUQURBVEF9OworCitjb25zdGV4cHIgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBrVmFsaWRTZWVrTW9kZVtdID0geworICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQywKKyAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlOjpTRUVLX05FWFRfU1lOQywKKyAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlOjpTRUVLX0NMT1NFU1RfU1lOQywKKyAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlOjpTRUVLX0NMT1NFU1QsCisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZTo6U0VFS19GUkFNRV9JTkRFWH07CisKK2NvbnN0ZXhwciBtZWRpYV90cmFja190eXBlIGtWYWxpZE1lZGlhVHJhY2tUeXBlW10gPSB7CisgICAgTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOLCAgTUVESUFfVFJBQ0tfVFlQRV9WSURFTywKKyAgICBNRURJQV9UUkFDS19UWVBFX0FVRElPLCAgICBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCwKKyAgICBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFLCBNRURJQV9UUkFDS19UWVBFX01FVEFEQVRBfTsKKworc3RydWN0IFRlc3RBSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CitwdWJsaWM6CisgIFRlc3RBSGFuZGxlcihzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gc2lnbmFsRW9zRnVuY3Rpb24pCisgICAgICA6IG1TaWduYWxFb3NGdW5jdGlvbihzaWduYWxFb3NGdW5jdGlvbikge30KKyAgdmlydHVhbCB+VGVzdEFIYW5kbGVyKCkge30KKworcHJvdGVjdGVkOgorICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZSB7CisgICAgaW50MzJfdCB3aGF0ID0gLTE7CisgICAgbXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCk7CisgICAgc3dpdGNoICh3aGF0KSB7CisgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRFcnJvcjoKKyAgICBjYXNlIExpdmVTZXNzaW9uOjprV2hhdFByZXBhcmVkOgorICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0UHJlcGFyYXRpb25GYWlsZWQ6IHsKKyAgICAgIG1TaWduYWxFb3NGdW5jdGlvbigpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IG1TaWduYWxFb3NGdW5jdGlvbjsKK307CisKK3N0cnVjdCBUZXN0TWVkaWFIVFRQQ29ubmVjdGlvbiA6IHB1YmxpYyBNZWRpYUhUVFBDb25uZWN0aW9uIHsKK3B1YmxpYzoKKyAgVGVzdE1lZGlhSFRUUENvbm5lY3Rpb24oKSB7fQorICB2aXJ0dWFsIH5UZXN0TWVkaWFIVFRQQ29ubmVjdGlvbigpIHt9CisKKyAgdmlydHVhbCBib29sIGNvbm5lY3QoY29uc3QgY2hhciAqIC8qdXJpKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICogLypoZWFkZXJzKi8pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCkgeyByZXR1cm47IH0KKworICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3QgLypvZmZzZXQqLywgdm9pZCAqIC8qZGF0YSovLCBzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBzaXplOworICB9CisKKyAgdmlydHVhbCBvZmY2NF90IGdldFNpemUoKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TUlNRVR5cGUoU3RyaW5nOCAqIC8qbWltZVR5cGUqLykgeyByZXR1cm4gTk9fRVJST1I7IH0KKyAgdmlydHVhbCBzdGF0dXNfdCBnZXRVcmkoU3RyaW5nOCAqIC8qdXJpKi8pIHsgcmV0dXJuIE5PX0VSUk9SOyB9CisKK3ByaXZhdGU6CisgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRlc3RNZWRpYUhUVFBDb25uZWN0aW9uKTsKK307CisKK3N0cnVjdCBUZXN0TWVkaWFIVFRQU2VydmljZSA6IHB1YmxpYyBNZWRpYUhUVFBTZXJ2aWNlIHsKK3B1YmxpYzoKKyAgVGVzdE1lZGlhSFRUUFNlcnZpY2UoKSB7fQorICB+VGVzdE1lZGlhSFRUUFNlcnZpY2UoKXt9OworCisgIHZpcnR1YWwgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gbWFrZUhUVFBDb25uZWN0aW9uKCkgeworICAgIG1lZGlhSFRUUENvbm5lY3Rpb24gPSBzcDxUZXN0TWVkaWFIVFRQQ29ubmVjdGlvbj46Om1ha2UoKTsKKyAgICByZXR1cm4gbWVkaWFIVFRQQ29ubmVjdGlvbjsKKyAgfQorCitwcml2YXRlOgorICBzcDxUZXN0TWVkaWFIVFRQQ29ubmVjdGlvbj4gbWVkaWFIVFRQQ29ubmVjdGlvbiA9IG51bGxwdHI7CisgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRlc3RNZWRpYUhUVFBTZXJ2aWNlKTsKK307CisKK2NsYXNzIEh0dHBMaXZlRnV6emVyIHsKK3B1YmxpYzoKKyAgdm9pZCBwcm9jZXNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgdm9pZCBkZUluaXRMaXZlU2Vzc2lvbigpOworICB+SHR0cExpdmVGdXp6ZXIoKSB7IGRlSW5pdExpdmVTZXNzaW9uKCk7IH0KKworcHJpdmF0ZToKKyAgdm9pZCBpbnZva2VMaXZlRGF0YVNvdXJjZSgpOworICB2b2lkIGNyZWF0ZU0zVThGaWxlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgdm9pZCBpbml0TGl2ZURhdGFTb3VyY2UoKTsKKyAgdm9pZCBpbnZva2VMaXZlU2Vzc2lvbigpOworICB2b2lkIGluaXRMaXZlU2Vzc2lvbigpOworICB2b2lkIGludm9rZURlcXVldWVBY2Nlc3NVbml0KCk7CisgIHZvaWQgaW52b2tlQ29ubmVjdEFzeW5jKCk7CisgIHZvaWQgaW52b2tlU2Vla1RvKCk7CisgIHZvaWQgaW52b2tlR2V0Q29uZmlnKCk7CisgIHZvaWQgc2lnbmFsRW9zKCk7CisgIHN0cmluZyBnZW5lcmF0ZUZpbGVOYW1lKCk7CisgIHNwPExpdmVEYXRhU291cmNlPiBtTGl2ZURhdGFTb3VyY2UgPSBudWxscHRyOworICBzcDxMaXZlU2Vzc2lvbj4gbUxpdmVTZXNzaW9uID0gbnVsbHB0cjsKKyAgc3A8QUxvb3Blcj4gbUxpdmVMb29wZXIgPSBudWxscHRyOworICBzcDxUZXN0TWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2UgPSBudWxscHRyOworICBzcDxUZXN0QUhhbmRsZXI+IG1IYW5kbGVyID0gbnVsbHB0cjsKKyAgRnV6emVkRGF0YVByb3ZpZGVyICptRkRQID0gbnVsbHB0cjsKKyAgYm9vbCBtRW9zUmVhY2hlZCA9IGZhbHNlOworICBzdGQ6Om11dGV4IG1Eb3dubG9hZENvbXBsZXRlTXV0ZXg7CisgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kaXRpb25hbFZhcmlhYmxlOworfTsKKworc3RyaW5nIEh0dHBMaXZlRnV6emVyOjpnZW5lcmF0ZUZpbGVOYW1lKCkgeworICByZXR1cm4ga0ZpbGVOYW1lUHJlZml4ICsgdG9fc3RyaW5nKGdldHBpZCgpKSArIGtGaWxlTmFtZVN1ZmZpeDsKK30KKwordm9pZCBIdHRwTGl2ZUZ1enplcjo6Y3JlYXRlTTNVOEZpbGUoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgb2ZzdHJlYW0gbTN1OEZpbGU7CisgIHN0cmluZyBjdXJyZW50RmlsZU5hbWUgPSBnZW5lcmF0ZUZpbGVOYW1lKCk7CisgIG0zdThGaWxlLm9wZW4oY3VycmVudEZpbGVOYW1lLCBpb3M6Om91dCB8IGlvczo6YmluYXJ5KTsKKyAgbTN1OEZpbGUud3JpdGUoKGNoYXIgKilkYXRhLCBzaXplKTsKKyAgbTN1OEZpbGUuY2xvc2UoKTsKK30KKwordm9pZCBIdHRwTGl2ZUZ1enplcjo6aW5pdExpdmVEYXRhU291cmNlKCkgeworICBtTGl2ZURhdGFTb3VyY2UgPSBzcDxMaXZlRGF0YVNvdXJjZT46Om1ha2UoKTsKK30KKwordm9pZCBIdHRwTGl2ZUZ1enplcjo6aW52b2tlTGl2ZURhdGFTb3VyY2UoKSB7CisgIGluaXRMaXZlRGF0YVNvdXJjZSgpOworICBzaXplX3Qgc2l6ZSA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PihrUmFuZ2VNaW4sIGtSYW5nZU1heCk7CisgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOworICBtTGl2ZURhdGFTb3VyY2UtPnF1ZXVlQnVmZmVyKGJ1ZmZlcik7CisgIHVpbnQ4X3QgKmRhdGEgPSBuZXcgdWludDhfdFtzaXplXTsKKyAgbUxpdmVEYXRhU291cmNlLT5yZWFkQXROb25CbG9ja2luZyhrT2ZmU2V0LCBkYXRhLCBzaXplKTsKKyAgaW50MzJfdCBmaW5hbFJlc3VsdCA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2Uoa0Vycm9yTm9NaW4sIGtFcnJvck5vTWF4KTsKKyAgbUxpdmVEYXRhU291cmNlLT5xdWV1ZUVPUyhmaW5hbFJlc3VsdCk7CisgIG1MaXZlRGF0YVNvdXJjZS0+cmVzZXQoKTsKKyAgbUxpdmVEYXRhU291cmNlLT5jb3VudFF1ZXVlZEJ1ZmZlcnMoKTsKKyAgbUxpdmVEYXRhU291cmNlLT5pbml0Q2hlY2soKTsKKyAgZGVsZXRlW10gZGF0YTsKK30KKwordm9pZCBIdHRwTGl2ZUZ1enplcjo6aW5pdExpdmVTZXNzaW9uKCkgeworICBBTG9vcGVyUm9zdGVyIGxvb3BlclJvc3RlcjsKKyAgbUhhbmRsZXIgPQorICAgICAgc3A8VGVzdEFIYW5kbGVyPjo6bWFrZShzdGQ6OmJpbmQoJkh0dHBMaXZlRnV6emVyOjpzaWduYWxFb3MsIHRoaXMpKTsKKyAgbUxpdmVMb29wZXIgPSBzcDxBTG9vcGVyPjo6bWFrZSgpOworICBtTGl2ZUxvb3Blci0+c2V0TmFtZSgiaHR0cCBsaXZlIik7CisgIG1MaXZlTG9vcGVyLT5zdGFydCgpOworICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gc3A8QU1lc3NhZ2U+OjptYWtlKDAsIG1IYW5kbGVyKTsKKyAgaHR0cFNlcnZpY2UgPSBuZXcgVGVzdE1lZGlhSFRUUFNlcnZpY2UoKTsKKyAgdWludDMyX3QgZmxhZ3MgPSBtRkRQLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgIG1MaXZlU2Vzc2lvbiA9IHNwPExpdmVTZXNzaW9uPjo6bWFrZShub3RpZnksIGZsYWdzLCBodHRwU2VydmljZSk7CisgIG1MaXZlTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUxpdmVTZXNzaW9uKTsKKyAgbG9vcGVyUm9zdGVyLnJlZ2lzdGVySGFuZGxlcihtTGl2ZUxvb3BlciwgbUhhbmRsZXIpOworfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjppbnZva2VEZXF1ZXVlQWNjZXNzVW5pdCgpIHsKKyAgTGl2ZVNlc3Npb246OlN0cmVhbVR5cGUgc3RyZWFtID0gbUZEUC0+UGlja1ZhbHVlSW5BcnJheShrVmFsaWRTdHJlYW1UeXBlKTsKKyAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICBtTGl2ZVNlc3Npb24tPmRlcXVldWVBY2Nlc3NVbml0KHN0cmVhbSwgJmJ1ZmZlcik7Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6Omludm9rZVNlZWtUbygpIHsKKyAgaW50NjRfdCB0aW1lVXMgPSBtRkRQLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDY0X3Q+KDAsIGtNYXhUaW1lVXMpOworICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUgPQorICAgICAgbUZEUC0+UGlja1ZhbHVlSW5BcnJheShrVmFsaWRTZWVrTW9kZSk7CisgIG1MaXZlU2Vzc2lvbi0+c2Vla1RvKHRpbWVVcywgbW9kZSk7Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6Omludm9rZUdldENvbmZpZygpIHsKKyAgbUxpdmVTZXNzaW9uLT5nZXRUcmFja0NvdW50KCk7CisgIHNpemVfdCB0cmFja0luZGV4ID0gbUZEUC0+Q29uc3VtZUludGVncmFsPHNpemVfdD4oKTsKKyAgbUxpdmVTZXNzaW9uLT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7CisgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IG1GRFAtPlBpY2tWYWx1ZUluQXJyYXkoa1ZhbGlkTWVkaWFUcmFja1R5cGUpOworICBtTGl2ZVNlc3Npb24tPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7CisgIHNwPE1ldGFEYXRhPiBtZXRhOworICBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBzdHJlYW0gPSBtRkRQLT5QaWNrVmFsdWVJbkFycmF5KGtWYWxpZFN0cmVhbVR5cGUpOworICBtTGl2ZVNlc3Npb24tPmdldFN0cmVhbUZvcm1hdE1ldGEoc3RyZWFtLCAmbWV0YSk7CisgIG1MaXZlU2Vzc2lvbi0+Z2V0S2V5Rm9yU3RyZWFtKHN0cmVhbSk7CisgIGlmIChzdHJlYW0gIT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTKSB7CisgICAgbUxpdmVTZXNzaW9uLT5nZXRTb3VyY2VUeXBlRm9yU3RyZWFtKHN0cmVhbSk7CisgIH0KK30KKwordm9pZCBIdHRwTGl2ZUZ1enplcjo6aW52b2tlQ29ubmVjdEFzeW5jKCkgeworICBzdHJpbmcgY3VycmVudEZpbGVOYW1lID0gZ2VuZXJhdGVGaWxlTmFtZSgpOworICBzdHJpbmcgdXJsID0ga0ZpbGVVcmxQcmVmaXggKyBjdXJyZW50RmlsZU5hbWU7CisgIHN0cmluZyBzdHJfMSA9IG1GRFAtPkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa1JhbmRvbVN0cmluZ0xlbmd0aCk7CisgIHN0cmluZyBzdHJfMiA9IG1GRFAtPkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa1JhbmRvbVN0cmluZ0xlbmd0aCk7CisKKyAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gaGVhZGVyczsKKyAgaGVhZGVycy5hZGQoU3RyaW5nOChzdHJfMS5jX3N0cigpKSwgU3RyaW5nOChzdHJfMi5jX3N0cigpKSk7CisgIG1MaXZlU2Vzc2lvbi0+Y29ubmVjdEFzeW5jKHVybC5jX3N0cigpLCAmaGVhZGVycyk7Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6Omludm9rZUxpdmVTZXNzaW9uKCkgeworICBpbml0TGl2ZVNlc3Npb24oKTsKKyAgQnVmZmVyaW5nU2V0dGluZ3MgYnVmZmVyaW5nU2V0dGluZ3M7CisgIGJ1ZmZlcmluZ1NldHRpbmdzLm1Jbml0aWFsTWFya01zID0ga1ByZXBhcmVNYXJrTXM7CisgIGJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcyA9IGtSZWFkeU1hcmtNczsKKyAgbUxpdmVTZXNzaW9uLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmdTZXR0aW5ncyk7CisgIGludm9rZUNvbm5lY3RBc3luYygpOworICBzdGQ6OnVuaXF1ZV9sb2NrIHdhaXRGb3JEb3dubG9hZENvbXBsZXRlKG1Eb3dubG9hZENvbXBsZXRlTXV0ZXgpOworICBtQ29uZGl0aW9uYWxWYXJpYWJsZS53YWl0KHdhaXRGb3JEb3dubG9hZENvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzXSB7IHJldHVybiBtRW9zUmVhY2hlZDsgfSk7CisgIGlmIChtTGl2ZVNlc3Npb24tPmlzU2Vla2FibGUoKSkgeworICAgIGludm9rZVNlZWtUbygpOworICB9CisgIGludm9rZURlcXVldWVBY2Nlc3NVbml0KCk7CisgIHNpemVfdCBpbmRleCA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDxzaXplX3Q+KCk7CisgIGJvb2wgc2VsZWN0ID0gbUZEUC0+Q29uc3VtZUJvb2woKTsKKyAgbUxpdmVTZXNzaW9uLT5zZWxlY3RUcmFjayhpbmRleCwgc2VsZWN0KTsKKyAgbUxpdmVTZXNzaW9uLT5oYXNEeW5hbWljRHVyYXRpb24oKTsKKyAgaW50NjRfdCBmaXJzdFRpbWVVcyA9CisgICAgICBtRkRQLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDY0X3Q+KGtSYW5nZU1pbiwga1JhbmdlTWF4KTsKKyAgaW50NjRfdCB0aW1lVXMgPSBtRkRQLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDY0X3Q+KGtSYW5nZU1pbiwga1JhbmdlTWF4KTsKKyAgaW50MzJfdCBkaXNjb250aW51aXR5U2VxID0gbUZEUC0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgIG1MaXZlU2Vzc2lvbi0+Y2FsY3VsYXRlTWVkaWFUaW1lVXMoZmlyc3RUaW1lVXMsIHRpbWVVcywgZGlzY29udGludWl0eVNlcSk7CisgIGludm9rZUdldENvbmZpZygpOworfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjpwcm9jZXNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIG1GRFAgPSBuZXcgRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICBjcmVhdGVNM1U4RmlsZShkYXRhLCBzaXplKTsKKyAgaW52b2tlTGl2ZURhdGFTb3VyY2UoKTsKKyAgaW52b2tlTGl2ZVNlc3Npb24oKTsKKyAgZGVsZXRlIG1GRFA7Cit9CisKK3ZvaWQgSHR0cExpdmVGdXp6ZXI6OmRlSW5pdExpdmVTZXNzaW9uKCkgeworICBpZiAobUxpdmVTZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICBtTGl2ZVNlc3Npb24tPmRpc2Nvbm5lY3QoKTsKKyAgICBtTGl2ZUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUxpdmVTZXNzaW9uLT5pZCgpKTsKKyAgICBtTGl2ZUxvb3Blci0+c3RvcCgpOworICB9CisgIG1MaXZlU2Vzc2lvbi5jbGVhcigpOworICBtTGl2ZUxvb3Blci5jbGVhcigpOworfQorCit2b2lkIEh0dHBMaXZlRnV6emVyOjpzaWduYWxFb3MoKSB7CisgIG1Fb3NSZWFjaGVkID0gdHJ1ZTsKKyAgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiB3YWl0Rm9yRG93bmxvYWRDb21wbGV0ZShtRG93bmxvYWRDb21wbGV0ZU11dGV4KTsKKyAgfQorICBtQ29uZGl0aW9uYWxWYXJpYWJsZS5ub3RpZnlfb25lKCk7CisgIHJldHVybjsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBIdHRwTGl2ZUZ1enplciBodHRwbGl2ZUZ1enplcjsKKyAgaHR0cGxpdmVGdXp6ZXIucHJvY2VzcyhkYXRhLCBzaXplKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvaHR0cGxpdmVfZnV6emVyLmRpY3QgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9mdXp6ZXIvaHR0cGxpdmVfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzY2M3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL2Z1enplci9odHRwbGl2ZV9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDE1IEBACisjbTN1OC1UYWdzCitrdzE9IiNFWFRNM1UiCitrdzI9IiNFWFQtWC1WRVJTSU9OOiIKK2t3Mz0iI0VYVC1YLVRBUkdFVERVUkFUSU9OOiIKK2t3ND0iI0VYVC1YLVBMQVlMSVNULVRZUEU6Igora3c1PSIjRVhUSU5GOiIKK2t3Nj0iI0VYVC1YLUVORExJU1QiCitrdzc9IiNFWFQtWC1NRURJQS1TRVFVRU5DRToiCitrdzg9IiNFWFQtWC1LRVk6TUVUSE9EPU5PTkUiCitrdzk9IiNFWFQtWC1ESVNDT05USU5VSVRZOiIKK2t3MTA9IiNFWFQtWC1ESVNDT05USU5VSVRZLVNFUVVFTkNFOjAiCitrdzExPSIjRVhULVgtU1RSRUFNLUlORjpCQU5EV0lEVEg9Igora3cxMj0iI0VYVC1YLVNUUkVBTS1JTkY6Q09ERUNTPSIKK2t3MTM9IiNFWFQtWC1CWVRFUkFOR0U6Igora3cxND0iI0VYVC1YLU1FRElBIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAppbmRleCAzZjViYTQ3Li5iZWEzZTM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icApAQCAtMjAsNiArMjAsMTEgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfaWQzIiwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCisKIAogICAgIHNyY3M6IFsiSUQzLmNwcCJdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL1RFU1RfTUFQUElORwppbmRleCBkODJkMjZlLi42MTA2OTA4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvVEVTVF9NQVBQSU5HCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9URVNUX01BUFBJTkcKQEAgLTksMTQgKzksMTUgQEAKIAogICAicHJlc3VibWl0LWxhcmdlIjogWwogICAgIC8vIHRoaXMgZG9lc24ndCBzZWVtIHRvIHJ1biBhbnkgdGVzdHMuCi0gICAgLy8gYnV0OiBjdHMtdHJhZGVmZWQgcnVuIC1tIEN0c01lZGlhVGVzdENhc2VzIC10IGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJUZXN0CisgICAgLy8gYnV0OiBjdHMtdHJhZGVmZWQgcnVuIC1tIEN0c01lZGlhTWlzY1Rlc3RDYXNlcyAtdCBcCisgICAgLy8gYW5kcm9pZC5tZWRpYS5taXNjLmN0cy5NZWRpYU1ldGFkYXRhUmV0cmlldmVyVGVzdAogICAgIC8vIGRvZXMgcnVuIGhlIDMyIGFuZCA2NCBiaXQgdGVzdHMsIGJ1dCBub3QgdGhlIGluc3RhbnQgdGVzdHMKICAgICAvLyBidXQgYWxsIEkga25vdyBpcyB0aGF0IHdpdGggJ2F0ZXN0JywgaXQncyBub3QgcnVubmluZwogICAgIHsKLSAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICJuYW1lIjogIkN0c01lZGlhTWlzY1Rlc3RDYXNlcyIsCiAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICB7Ci0gICAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFNZXRhZGF0YVJldHJpZXZlclRlc3QiCisgICAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5taXNjLmN0cy5NZWRpYU1ldGFkYXRhUmV0cmlldmVyVGVzdCIKICAgICAgICAgICB9CiAgICAgICBdCiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GcmFtZURlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhbWVEZWNvZGVyLmgKaW5kZXggZDU5ZTRmNS4uZTQxNzMyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GcmFtZURlY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0ZyYW1lRGVjb2Rlci5oCkBAIC01MCw3ICs1MCw4IEBACiAgICAgc3A8SU1lbW9yeT4gZXh0cmFjdEZyYW1lKEZyYW1lUmVjdCAqcmVjdCA9IE5VTEwpOwogCiAgICAgc3RhdGljIHNwPElNZW1vcnk+IGdldE1ldGFkYXRhT25seSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgdGh1bWJuYWlsID0gZmFsc2UpOworICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsIGludCBjb2xvckZvcm1hdCwKKyAgICAgICAgICAgIGJvb2wgdGh1bWJuYWlsID0gZmFsc2UsIHVpbnQzMl90IGJpdERlcHRoID0gMCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5GcmFtZURlY29kZXIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCmluZGV4IGM4NGNjMTAuLjVhMjE3NTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaApAQCAtNzEsNiArNzEsOSBAQAogICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpOwogICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVN0YXJ0KCk7CiAgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkID0gZmFsc2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbWV0ZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAqbmFtZXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3Vic2NyaWJlVG9QYXJhbWV0ZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbmFtZXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5zdWJzY3JpYmVGcm9tUGFyYW1ldGVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IHF1ZXJ5Q2FwYWJpbGl0aWVzKAogICAgICAgICAgICAgY29uc3QgY2hhciogb3duZXIsIGNvbnN0IGNoYXIqIG5hbWUsCkBAIC01MTksNiArNTIyLDcgQEAKICAgICBzdGF0dXNfdCBzZXRMYXRlbmN5KHVpbnQzMl90IGxhdGVuY3kpOwogICAgIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOwogICAgIHN0YXR1c190IHNldFR1bm5lbFBlZWsoaW50MzJfdCB0dW5uZWxQZWVrKTsKKyAgICBzdGF0dXNfdCBzZXRUdW5uZWxQZWVrTGVnYWN5KGludDMyX3QgaXNMZWdhY3kpOwogICAgIHN0YXR1c190IHNldEF1ZGlvUHJlc2VudGF0aW9uKGludDMyX3QgcHJlc2VudGF0aW9uSWQsIGludDMyX3QgcHJvZ3JhbUlkKTsKICAgICBzdGF0dXNfdCBzZXRPcGVyYXRpbmdSYXRlKGZsb2F0IHJhdGVGbG9hdCwgYm9vbCBpc1ZpZGVvKTsKICAgICBzdGF0dXNfdCBnZXRJbnRyYVJlZnJlc2hQZXJpb2QodWludDMyX3QgKmludHJhUmVmcmVzaFBlcmlvZCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKaW5kZXggNDNkNTBmMS4uNWU4NDk3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaApAQCAtMzUsNyArMzUsOSBAQAogCiBjbGFzcyBBdWRpb1JlY29yZDsKIAotc3RydWN0IEF1ZGlvU291cmNlIDogcHVibGljIE1lZGlhU291cmNlLCBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciB7CitzdHJ1Y3QgQXVkaW9Tb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBBdWRpb1JlY29yZDo6SUF1ZGlvUmVjb3JkQ2FsbGJhY2sgewogICAgIC8vIE5vdGUgdGhhdCB0aGUgImNoYW5uZWxzIiBwYXJhbWV0ZXIgX2lzXyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLAogICAgIC8vIF9ub3RfIGEgYml0bWFzayBvZiBhdWRpb19jaGFubmVsc190IGNvbnN0YW50cy4KICAgICBBdWRpb1NvdXJjZSgKQEAgLTc0LDcgKzc2LDYgQEAKICAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0b3BUaW1lVXMoaW50NjRfdCBzdG9wVGltZVVzKTsKIAotICAgIHN0YXR1c190IGRhdGFDYWxsYmFjayhjb25zdCBBdWRpb1JlY29yZDo6QnVmZmVyJiBidWZmZXIpOwogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CiAKICAgICBzdGF0dXNfdCBzZXRJbnB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKQEAgLTE0Miw2ICsxNDMsMTAgQEAKICAgICB2b2lkIHdhaXRPdXRzdGFuZGluZ0VuY29kaW5nRnJhbWVzX2woKTsKICAgICBzdGF0dXNfdCByZXNldCgpOwogCisgICAgLy8gSUF1ZGlvUmVjb3JkQ2FsbGJhY2sgaW1wbGVtZW50YXRpb24KKyAgICBzaXplX3Qgb25Nb3JlRGF0YShjb25zdCBBdWRpb1JlY29yZDo6QnVmZmVyJikgb3ZlcnJpZGU7CisgICAgdm9pZCBvbk92ZXJydW4oKSBvdmVycmlkZTsKKwogICAgIEF1ZGlvU291cmNlKGNvbnN0IEF1ZGlvU291cmNlICYpOwogICAgIEF1ZGlvU291cmNlICZvcGVyYXRvcj0oY29uc3QgQXVkaW9Tb3VyY2UgJik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaAppbmRleCA3NWIwZDhlLi43YTA1ZjAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCkBAIC00NywxNCArNDcsMjAgQEAKICAgICAgICAgICAgIHNpemVfdCBkc3RDcm9wTGVmdCwgc2l6ZV90IGRzdENyb3BUb3AsCiAgICAgICAgICAgICBzaXplX3QgZHN0Q3JvcFJpZ2h0LCBzaXplX3QgZHN0Q3JvcEJvdHRvbSk7CiAKKyAgICBzdHJ1Y3QgQ29lZmZzOyAvLyBtYXRyaXggY29lZmZpY2llbnRzCisKIHByaXZhdGU6CiAgICAgc3RydWN0IENvbG9yU3BhY2UgewogICAgICAgICB1aW50MzJfdCBtU3RhbmRhcmQ7CiAgICAgICAgIHVpbnQzMl90IG1SYW5nZTsKICAgICAgICAgdWludDMyX3QgbVRyYW5zZmVyOwogCi0gICAgICAgIGJvb2wgaXNCdDcwOSgpOwotICAgICAgICBib29sIGlzSnBlZygpOworICAgICAgICBib29sIGlzQnQyMDIwKCkgY29uc3Q7CisKKyAgICAgICAgLy8gbGlieXV2IGhlbHBlciBtZXRob2RzCisgICAgICAgIGJvb2wgaXNINDIwKCkgY29uc3Q7CisgICAgICAgIGJvb2wgaXNJNDIwKCkgY29uc3Q7CisgICAgICAgIGJvb2wgaXNKNDIwKCkgY29uc3Q7CiAgICAgfTsKIAogICAgIHN0cnVjdCBCaXRtYXBQYXJhbXMgewpAQCAtNzgsOCArODQsMTMgQEAKICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBtU3JjRm9ybWF0LCBtRHN0Rm9ybWF0OwogICAgIENvbG9yU3BhY2UgbVNyY0NvbG9yU3BhY2U7CiAgICAgdWludDhfdCAqbUNsaXA7CisgICAgdWludDE2X3QgKm1DbGlwMTBCaXQ7CiAKICAgICB1aW50OF90ICppbml0Q2xpcCgpOworICAgIHVpbnQxNl90ICppbml0Q2xpcDEwQml0KCk7CisKKyAgICAvLyByZXR1cm5zIHRoZSBZVVYyUkdCIG1hdHJpeCBjb2VmZmljaWVudHMgYWNjb3JkaW5nIHRvIHRoZSBjb2xvciBhc3BlY3RzIGFuZCBiaXQgZGVwdGgKKyAgICBjb25zdCBzdHJ1Y3QgQ29lZmZzICpnZXRNYXRyaXgoKSBjb25zdDsKIAogICAgIHN0YXR1c190IGNvbnZlcnRDYllDclkoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwpAQCAtMTA4LDkgKzExOSwxOSBAQAogICAgIHN0YXR1c190IGNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyKAogICAgICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KTsKIAorICAgIHN0YXR1c190IGNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyQmFzZSgKKyAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195LCBjb25zdCB1aW50OF90ICpzcmNfdSwgc2l6ZV90IHJvd19pbmMsIGJvb2wgaXNOVjIxID0gZmFsc2UpOworCiAgICAgc3RhdHVzX3QgY29udmVydFRJWVVWNDIwUGFja2VkU2VtaVBsYW5hcigKICAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CiAKKyAgICBzdGF0dXNfdCBjb252ZXJ0WVVWUDAxMCgKKyAgICAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOworCisgICAgc3RhdHVzX3QgY29udmVydFlVVlAwMTBUb1JHQkExMDEwMTAyKAorICAgICAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CisKICAgICBDb2xvckNvbnZlcnRlcihjb25zdCBDb2xvckNvbnZlcnRlciAmKTsKICAgICBDb2xvckNvbnZlcnRlciAmb3BlcmF0b3I9KGNvbnN0IENvbG9yQ29udmVydGVyICYpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAppbmRleCAyYzAzZjI3Li5mMDcwYWFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCkBAIC0xMDUsNyArMTA1LDYgQEAKICAgICAgICAgaWYgKG1NZW1vcnkuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtTWVtb3J5LT51bnNlY3VyZVBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKICAgICAgICAgaW50MzJfdCByZW1vdGVSZWZjb3VudCA9CiAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1NZW1vcnktPnVuc2VjdXJlUG9pbnRlcigpKS0+Z2V0UmVtb3RlUmVmY291bnQoKTsKLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHNvIHRoYXQgcmVtb3RlUmVmQ291bnQoKSBpcyBub24tbmVnYXRpdmUuCiAgICAgICAgIHJldHVybiByZW1vdGVSZWZjb3VudCA+PSAwID8gcmVtb3RlUmVmY291bnQgOiAwOyAvLyBkbyBub3QgYWxsb3cgY29ycnVwdGVkIGRhdGEuCiAjZWxzZQogICAgICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKaW5kZXggZDM3MjE0MC4uMWQyZDcxMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljcy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CkBAIC03MCw2ICs3MSwxMyBAQAogdXNpbmcgYWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhUmVzb3VyY2VQYXJjZWw7CiAKIHN0cnVjdCBNZWRpYUNvZGVjIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBlbnVtIERvbWFpbiB7CisgICAgICAgIERPTUFJTl9VTktOT1dOID0gMCwKKyAgICAgICAgRE9NQUlOX1ZJREVPID0gMSwKKyAgICAgICAgRE9NQUlOX0FVRElPID0gMiwKKyAgICAgICAgRE9NQUlOX0lNQUdFID0gMworICAgIH07CisKICAgICBlbnVtIENvbmZpZ3VyZUZsYWdzIHsKICAgICAgICAgQ09ORklHVVJFX0ZMQUdfRU5DT0RFICAgICAgICAgICA9IDEsCiAgICAgICAgIENPTkZJR1VSRV9GTEFHX1VTRV9CTE9DS19NT0RFTCAgPSAyLApAQCAtMzkwLDYgKzM5OCw3IEBACiAgICAgLy8gPGFsbCBzdGF0ZXM+ICAgICAtPiBFbmFibGVkTm9CdWZmZXIgIHdoZW4gZmx1c2gKICAgICAvLyA8YWxsIHN0YXRlcz4gICAgIC0+IEVuYWJsZWROb0J1ZmZlciAgd2hlbiBzdG9wIHRoZW4gY29uZmlndXJlIHRoZW4gc3RhcnQKICAgICBlbnVtIHN0cnVjdCBUdW5uZWxQZWVrU3RhdGUgeworICAgICAgICBrTGVnYWN5TW9kZSwKICAgICAgICAga0Rpc2FibGVkTm9CdWZmZXIsCiAgICAgICAgIGtFbmFibGVkTm9CdWZmZXIsCiAgICAgICAgIGtEaXNhYmxlZFF1ZXVlZCwKQEAgLTQwMSw3ICs0MTAsNiBAQAogICAgIHN0cnVjdCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHk7CiAKICAgICBTdGF0ZSBtU3RhdGU7Ci0gICAgdWlkX3QgbVVpZDsKICAgICBib29sIG1SZWxlYXNlZEJ5UmVzb3VyY2VNYW5hZ2VyOwogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAgICAgc3A8QUxvb3Blcj4gbUNvZGVjTG9vcGVyOwpAQCAtNDM4LDEzICs0NDYsMjAgQEAKIAogICAgIHNwPFJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eT4gbVJlc291cmNlTWFuYWdlclByb3h5OwogCi0gICAgYm9vbCBtSXNWaWRlbzsKKyAgICBEb21haW4gbURvbWFpbjsKICAgICBBU3RyaW5nIG1Mb2dTZXNzaW9uSWQ7Ci0gICAgaW50MzJfdCBtVmlkZW9XaWR0aDsKLSAgICBpbnQzMl90IG1WaWRlb0hlaWdodDsKKyAgICBpbnQzMl90IG1XaWR0aDsKKyAgICBpbnQzMl90IG1IZWlnaHQ7CiAgICAgaW50MzJfdCBtUm90YXRpb25EZWdyZWVzOwogICAgIGludDMyX3QgbUFsbG93RnJhbWVEcm9wcGluZ0J5U3VyZmFjZTsKIAorICAgIGludDMyX3QgbUNvbmZpZ0NvbG9yVHJhbnNmZXI7CisgICAgYm9vbCBtSERSU3RhdGljSW5mbzsKKyAgICBib29sIG1IRFIxMFBsdXNJbmZvOworICAgIHZvaWQgdXBkYXRlSERSRm9ybWF0TWV0cmljKCk7CisgICAgaGRyX2Zvcm1hdCBnZXRIRFJGb3JtYXQoY29uc3QgaW50MzJfdCBwcm9maWxlLCBjb25zdCBpbnQzMl90IHRyYW5zZmVyLAorICAgICAgICAgICAgY29uc3QgQVN0cmluZyAmbWVkaWFUeXBlKTsKKwogICAgIC8vIGluaXRpYWwgY3JlYXRlIHBhcmFtZXRlcnMKICAgICBBU3RyaW5nIG1Jbml0TmFtZTsKIApAQCAtNDk2LDcgKzUxMSw3IEBACiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyQ2hhbm5lbEJhc2U+IG1CdWZmZXJDaGFubmVsOwogCi0gICAgUGxheWJhY2tEdXJhdGlvbkFjY3VtdWxhdG9yICogbVBsYXliYWNrRHVyYXRpb25BY2N1bXVsYXRvcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UGxheWJhY2tEdXJhdGlvbkFjY3VtdWxhdG9yPiBtUGxheWJhY2tEdXJhdGlvbkFjY3VtdWxhdG9yOwogICAgIGJvb2wgbUlzU3VyZmFjZVRvU2NyZWVuOwogCiAgICAgTWVkaWFDb2RlYygKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmgKaW5kZXggNDIzN2U4Yy4uNzg3OTJjNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmgKQEAgLTM2NCw3ICszNjQsNyBAQAogaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BVjFQcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgewogICAgIHN3aXRjaCAoaSkgewogICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluODogICAgICAgICAgIHJldHVybiAiTWFpbjgiOwotICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluMTA6ICAgICAgICAgIHJldHVybiAiTWFpbjEwSERSIjsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjEwOiAgICAgICAgICByZXR1cm4gIk1haW4xMCI7CiAgICAgICAgIGNhc2UgQVYxUHJvZmlsZU1haW4xMEhEUjEwOiAgICAgcmV0dXJuICJNYWluMTBIRFIxMCI7CiAgICAgICAgIGNhc2UgQVYxUHJvZmlsZU1haW4xMEhEUjEwUGx1czogcmV0dXJuICJNYWluMTBIRFJQbHVzIjsKICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOwpAQCAtNTQwLDYgKzU0MCw5IEBACiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsVWhkMzAgICA9IDB4NDA7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsVWhkNDggICA9IDB4ODA7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsVWhkNjAgICA9IDB4MTAwOworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbFVoZDEyMCAgPSAweDIwMDsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWw4azMwICAgID0gMHg0MDA7Citjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsOGs2MCAgICA9IDB4ODAwOwogCiBpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0RvbGJ5VmlzaW9uTGV2ZWwoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CiAgICAgc3dpdGNoIChpKSB7CkBAIC01NTIsNiArNTU1LDkgQEAKICAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsVWhkMzA6IHJldHVybiAiVWhkMzAiOwogICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxVaGQ0ODogcmV0dXJuICJVaGQ0OCI7CiAgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbFVoZDYwOiByZXR1cm4gIlVoZDYwIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsVWhkMTIwOiByZXR1cm4gIlVoZDEyMCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbDhrMzA6ICByZXR1cm4gIjhrMzAiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWw4azYwOiAgcmV0dXJuICI4azYwIjsKICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CiAgICAgfQogfQpAQCAtNTg2LDkgKzU5MiwxMSBAQAogY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODggICAgICAgICAgICAgPSAxMjsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDI0Yml0UkdCODg4ICAgICAgICAgICAgID0gMTE7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQyNWJpdEFSR0IxODg4ICAgICAgICAgICA9IDE0OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MzJiaXRBQkdSMjEwMTAxMCAgICAgICAgPSAweDdGMDBBQUEyOwogY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MzJiaXRBQkdSODg4OCAgICAgICAgICAgPSAweDdGMDBBMDAwOwogY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4OCAgICAgICAgICAgPSAxNjsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODggICAgICAgICAgID0gMTU7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQ2NGJpdEFCR1JGbG9hdCAgICAgICAgICA9IDB4N0YwMDBGMTY7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQ4Yml0UkdCMzMyICAgICAgICAgICAgICA9IDI7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRDYllDclkgICAgICAgICAgICAgICAgICA9IDI3OwogY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0Q3JZQ2JZICAgICAgICAgICAgICAgICAgPSAyODsKQEAgLTY0Miw5ICs2NTAsMTEgQEAKICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNGJpdEJHUjg4ODogICAgICAgICAgICAgICByZXR1cm4gIjI0Yml0QkdSODg4IjsKICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNGJpdFJHQjg4ODogICAgICAgICAgICAgICByZXR1cm4gIjI0Yml0UkdCODg4IjsKICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNWJpdEFSR0IxODg4OiAgICAgICAgICAgICByZXR1cm4gIjI1Yml0QVJHQjE4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QUJHUjIxMDEwMTA6ICAgICAgICAgIHJldHVybiAiMzJiaXRBQkdSMjEwMTAxMCI7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRBQkdSODg4ODogICAgICAgICAgICAgcmV0dXJuICIzMmJpdEFCR1I4ODg4IjsKICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFSR0I4ODg4OiAgICAgICAgICAgICByZXR1cm4gIjMyYml0QVJHQjg4ODgiOwogICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg6ICAgICAgICAgICAgIHJldHVybiAiMzJiaXRCR1JBODg4OCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0NjRiaXRBQkdSRmxvYXQ6ICAgICAgICAgICAgcmV0dXJuICI2NGJpdEFCR1JGbG9hdCI7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0OGJpdFJHQjMzMjogICAgICAgICAgICAgICAgcmV0dXJuICI4Yml0UkdCMzMyIjsKICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRDYllDclk6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNiWUNyWSI7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0Q3JZQ2JZOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDcllDYlkiOwpAQCAtNjc3LDYgKzY4Nyw3IEBACiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyU2VtaVBsYW5hcjogICAgICAgICAgcmV0dXJuICJZVVY0MjJTZW1pUGxhbmFyIjsKICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0NDRGbGV4aWJsZTogICAgICAgICAgICByZXR1cm4gIllVVjQ0NEZsZXhpYmxlIjsKICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0NDRJbnRlcmxlYXZlZDogICAgICAgICByZXR1cm4gIllVVjQ0NEludGVybGVhdmVkIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVZQMDEwOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIllVVlAwMTAiOwogICAgICAgICBjYXNlIENPTE9SX1FDT01fRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjogICAgIHJldHVybiAiUUNPTV9ZVVY0MjBTZW1pUGxhbmFyIjsKICAgICAgICAgY2FzZSBDT0xPUl9USV9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOiByZXR1cm4gIlRJX1lVVjQyMFBhY2tlZFNlbWlQbGFuYXIiOwogICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CkBAIC02ODQsNiArNjk1LDcgQEAKIH0KIAogY29uc3RleHByIGNoYXIgRkVBVFVSRV9BZGFwdGl2ZVBsYXliYWNrW10gICAgICAgPSAiYWRhcHRpdmUtcGxheWJhY2siOworY29uc3RleHByIGNoYXIgRkVBVFVSRV9FbmNvZGluZ1N0YXRpc3RpY3NbXSAgICAgPSAiZW5jb2Rpbmctc3RhdGlzdGljcyI7CiBjb25zdGV4cHIgY2hhciBGRUFUVVJFX0ludHJhUmVmcmVzaFtdID0gImludHJhLXJlZnJlc2giOwogY29uc3RleHByIGNoYXIgRkVBVFVSRV9QYXJ0aWFsRnJhbWVbXSA9ICJwYXJ0aWFsLWZyYW1lIjsKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfUXBCb3VuZHNbXSA9ICJxcC1ib3VuZHMiOwpAQCAtNzM3LDYgKzc0OSwxNCBAQAogY29uc3RleHByIGludDMyX3QgQ09MT1JfVFJBTlNGRVJfU0RSX1ZJREVPID0gMzsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX1RSQU5TRkVSX1NUMjA4NCA9IDY7CiAKK2NvbnN0ZXhwciBpbnQzMl90IFBJQ1RVUkVfVFlQRV9JID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IFBJQ1RVUkVfVFlQRV9QID0gMjsKK2NvbnN0ZXhwciBpbnQzMl90IFBJQ1RVUkVfVFlQRV9CID0gMzsKK2NvbnN0ZXhwciBpbnQzMl90IFBJQ1RVUkVfVFlQRV9VTktOT1dOID0gMDsKKworY29uc3RleHByIGludDMyX3QgVklERU9fRU5DT0RJTkdfU1RBVElTVElDU19MRVZFTF8xID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IFZJREVPX0VOQ09ESU5HX1NUQVRJU1RJQ1NfTEVWRUxfTk9ORSA9IDA7CisKIGNvbnN0ZXhwciBjaGFyIEtFWV9BQUNfRFJDX0FMQlVNX01PREVbXSA9ICJhYWMtZHJjLWFsYnVtLW1vZGUiOwogY29uc3RleHByIGNoYXIgS0VZX0FBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SW10gPSAiYWFjLWRyYy1jdXQtbGV2ZWwiOwogY29uc3RleHByIGNoYXIgS0VZX0FBQ19EUkNfQk9PU1RfRkFDVE9SW10gPSAiYWFjLWRyYy1ib29zdC1sZXZlbCI7CkBAIC03ODksMTIgKzgwOSwxNCBAQAogY29uc3RleHByIGNoYXIgS0VZX01BWF9GUFNfVE9fRU5DT0RFUltdID0gIm1heC1mcHMtdG8tZW5jb2RlciI7CiBjb25zdGV4cHIgY2hhciBLRVlfTUFYX0hFSUdIVFtdID0gIm1heC1oZWlnaHQiOwogY29uc3RleHByIGNoYXIgS0VZX01BWF9JTlBVVF9TSVpFW10gPSAibWF4LWlucHV0LXNpemUiOworY29uc3RleHByIGNoYXIgS0VZX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVFtdID0gIm1heC1vdXRwdXQtY2hhbm5lbC1jb3VudCI7CiBjb25zdGV4cHIgY2hhciBLRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUltdID0gIm1heC1wdHMtZ2FwLXRvLWVuY29kZXIiOwogY29uc3RleHByIGNoYXIgS0VZX01BWF9XSURUSFtdID0gIm1heC13aWR0aCI7CiBjb25zdGV4cHIgY2hhciBLRVlfTUlNRVtdID0gIm1pbWUiOwogY29uc3RleHByIGNoYXIgS0VZX09QRVJBVElOR19SQVRFW10gPSAib3BlcmF0aW5nLXJhdGUiOwogY29uc3RleHByIGNoYXIgS0VZX09VVFBVVF9SRU9SREVSX0RFUFRIW10gPSAib3V0cHV0LXJlb3JkZXItZGVwdGgiOwogY29uc3RleHByIGNoYXIgS0VZX1BDTV9FTkNPRElOR1tdID0gInBjbS1lbmNvZGluZyI7Citjb25zdGV4cHIgY2hhciBLRVlfUElDVFVSRV9UWVBFW10gPSAicGljdHVyZS10eXBlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9QSVhFTF9BU1BFQ1RfUkFUSU9fSEVJR0hUW10gPSAic2FyLWhlaWdodCI7CiBjb25zdGV4cHIgY2hhciBLRVlfUElYRUxfQVNQRUNUX1JBVElPX1dJRFRIW10gPSAic2FyLXdpZHRoIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9QUkVQRU5EX0hFQURFUl9UT19TWU5DX0ZSQU1FU1tdID0gInByZXBlbmQtc3BzLXBwcy10by1pZHItZnJhbWVzIjsKQEAgLTgxMSw2ICs4MzMsOCBAQAogY29uc3RleHByIGNoYXIgS0VZX1RJTEVfSEVJR0hUW10gPSAidGlsZS1oZWlnaHQiOwogY29uc3RleHByIGNoYXIgS0VZX1RJTEVfV0lEVEhbXSA9ICJ0aWxlLXdpZHRoIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9UUkFDS19JRFtdID0gInRyYWNrLWlkIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9WSURFT19FTkNPRElOR19TVEFUSVNUSUNTX0xFVkVMW10gPSAidmlkZW8tZW5jb2Rpbmctc3RhdGlzdGljcy1sZXZlbCI7Citjb25zdGV4cHIgY2hhciBLRVlfVklERU9fUVBfQVZFUkFHRVtdID0gInZpZGVvLXFwLWF2ZXJhZ2UiOwogY29uc3RleHByIGNoYXIgS0VZX1ZJREVPX1FQX0JfTUFYW10gPSAidmlkZW8tcXAtYi1tYXgiOwogY29uc3RleHByIGNoYXIgS0VZX1ZJREVPX1FQX0JfTUlOW10gPSAidmlkZW8tcXAtYi1taW4iOwogY29uc3RleHByIGNoYXIgS0VZX1ZJREVPX1FQX0lfTUFYW10gPSAidmlkZW8tcXAtaS1tYXgiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKaW5kZXggZDFkZjJjYS4uYjkxYzg1MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaApAQCAtMTYzLDExICsxNjMsMjggQEAKICAgICAgICAgICAgIHx8IChFUlJPUl9EUk1fVkVORE9SX01JTiA8PSBlcnIgJiYgZXJyIDw9IEVSUk9SX0RSTV9WRU5ET1JfTUFYKTsKIH0KIAotc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBTdHJDcnlwdG9FcnJvcihzdGF0dXNfdCBlcnIpIHsKICNkZWZpbmUgU1RBVFVTX0NBU0UoU1RBVFVTKSBcCiAgICAgY2FzZSBTVEFUVVM6ICAgICAgICAgICAgXAogICAgICAgICByZXR1cm4gI1NUQVRVUwogCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIFN0ck1lZGlhRXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisgICAgc3dpdGNoKGVycikgeworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9BTFJFQURZX0NPTk5FQ1RFRCk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX05PVF9DT05ORUNURUQpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9VTktOT1dOX0hPU1QpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9DQU5OT1RfQ09OTkVDVCk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0lPKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfQ09OTkVDVElPTl9MT1NUKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfTUFMRk9STUVEKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfT1VUX09GX1JBTkdFKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX1VOU1VQUE9SVEVEKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXNUb1N0cmluZyhlcnIpOworfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIFN0ckNyeXB0b0Vycm9yKHN0YXR1c190IGVycikgewogICAgIHN3aXRjaCAoZXJyKSB7CiAgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0RSTV9VTktOT1dOKTsKICAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX05PX0xJQ0VOU0UpOwpAQCAtMjA5LDEwICsyMjYsMTAgQEAKICAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX1NUT1JBR0VfUkVBRCk7CiAgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0RSTV9TVE9SQUdFX1dSSVRFKTsKICAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX1pFUk9fU1VCU0FNUExFUyk7Ci0jdW5kZWYgU1RBVFVTX0NBU0UKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1c1RvU3RyaW5nKGVycik7CiB9CisjdW5kZWYgU1RBVFVTX0NBU0UKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKaW5kZXggYzgwMDEyZS4uODhjMWYzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCkBAIC02MCw2ICs2MCw4IEBACiAgICAga0tleUFWQ0MgICAgICAgICAgICAgID0gJ2F2Y2MnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5SFZDQyAgICAgICAgICAgICAgPSAnaHZjYycsICAvLyByYXcgZGF0YQogICAgIGtLZXlEVkNDICAgICAgICAgICAgICA9ICdkdmNjJywgIC8vIHJhdyBkYXRhCisgICAga0tleURWVkMgICAgICAgICAgICAgID0gJ2R2dmMnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5RFZXQyAgICAgICAgICAgICAgPSAnZHZ3YycsICAvLyByYXcgZGF0YQogICAgIGtLZXlBVjFDICAgICAgICAgICAgICA9ICdhdjFjJywgIC8vIHJhdyBkYXRhCiAgICAga0tleVRodW1ibmFpbEhWQ0MgICAgID0gJ3RodmMnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5VGh1bWJuYWlsQVYxQyAgICAgPSAndGF2MScsICAvLyByYXcgZGF0YQpAQCAtMjgzLDYgKzI4NSw4IEBACiAgICAga1R5cGVIVkNDICAgICAgICA9ICdodmNjJywKICAgICBrVHlwZUFWMUMgICAgICAgID0gJ2F2MWMnLAogICAgIGtUeXBlRFZDQyAgICAgICAgPSAnZHZjYycsCisgICAga1R5cGVEVlZDICAgICAgICA9ICdkdnZjJywKKyAgICBrVHlwZURWV0MgICAgICAgID0gJ2R2d2MnLAogICAgIGtUeXBlRDI2MyAgICAgICAgPSAnZDI2MycsCiAgICAga1R5cGVIQ09TICAgICAgICA9ICdoY29zJywKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmgKaW5kZXggYjhhM2MxMC4uMDZiOWM5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm8uaApAQCAtMzAsNyArMzAsOCBAQAogICAgIFByb2Nlc3NJbmZvKCk7CiAKICAgICB2aXJ0dWFsIGJvb2wgZ2V0UHJpb3JpdHkoaW50IHBpZCwgaW50KiBwcmlvcml0eSk7Ci0gICAgdmlydHVhbCBib29sIGlzVmFsaWRQaWQoaW50IHBpZCk7CisgICAgdmlydHVhbCBib29sIGlzUGlkVHJ1c3RlZChpbnQgcGlkKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNQaWRVaWRUcnVzdGVkKGludCBwaWQsIGludCB1aWQpOwogICAgIHZpcnR1YWwgYm9vbCBvdmVycmlkZVByb2Nlc3NJbmZvKGludCBwaWQsIGludCBwcm9jU3RhdGUsIGludCBvb21TY29yZSk7CiAgICAgdmlydHVhbCB2b2lkIHJlbW92ZVByb2Nlc3NJbmZvT3ZlcnJpZGUoaW50IHBpZCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm9JbnRlcmZhY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm9JbnRlcmZhY2UuaAppbmRleCA5MjYwMTgxLi5iN2ZjODU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oCkBAIC0yMyw3ICsyMyw4IEBACiAKIHN0cnVjdCBQcm9jZXNzSW5mb0ludGVyZmFjZSA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICB2aXJ0dWFsIGJvb2wgZ2V0UHJpb3JpdHkoaW50IHBpZCwgaW50KiBwcmlvcml0eSkgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkUGlkKGludCBwaWQpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNQaWRUcnVzdGVkKGludCBwaWQpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNQaWRVaWRUcnVzdGVkKGludCBwaWQsIGludCB1aWQpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgb3ZlcnJpZGVQcm9jZXNzSW5mbyhpbnQgcGlkLCBpbnQgcHJvY1N0YXRlLCBpbnQgb29tU2NvcmUpOwogICAgIHZpcnR1YWwgdm9pZCByZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlKGludCBwaWQpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCmluZGV4IGZjZmNiZWMuLmE0ZjUxMmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCkBAIC0yMSw3ICsyMSw5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSVN1cmZhY2VDb21wb3NlcjsKK25hbWVzcGFjZSBndWkgeworICAgIGNsYXNzIElTdXJmYWNlQ29tcG9zZXI7Cit9CiAKIHN0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyIDogcHVibGljIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlIHsKICAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CkBAIC0zMiw3ICszNCw3IEBACiAKIHByaXZhdGU6CiAgICAgdm9pZCB1cGRhdGVWc3luYygpIG92ZXJyaWRlOwotICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IG1Db21wb3NlcjsKKyAgICBzcDxndWk6OklTdXJmYWNlQ29tcG9zZXI+IG1Db21wb3NlcjsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKaW5kZXggZmJmYThjYy4uMjgzZGYxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icApAQCAtNTQsMTYgKzU0LDIxIEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAogICAgIF0sCiAKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlL21wZWcydHMiXSwKIAogICAgIHdob2xlX3N0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKICAgICBdLAogCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X3Nka19kZWZhdWx0cyIsCisKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCi0KICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLQogICAgIHRhcmdldDogewogICAgICAgICBkYXJ3aW46IHsKICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLApAQCAtNzEsMTAgKzc2LDE5IEBACiAgICAgfSwKIH0KIAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X2hlYWRlcnMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfc2RrX2RlZmF1bHRzIiwKKyAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9kZWZhdWx0cyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfc2RrX2RlZmF1bHRzIiwKICAgICBdLAogICAgIGNmbGFnczogWwogICAgICAgICAiLURFTkFCTEVfQ1JZUFRPIiwKQEAgLTkxLDYgKzEwNSw3IEBACiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9ub2NyeXB0byIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9kZWZhdWx0cyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfc2RrX2RlZmF1bHRzIiwKICAgICBdLAogICAgIGFwZXhfYXZhaWxhYmxlOiBbCiAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9pbmNsdWRlL21wZWcydHMvQVRTUGFyc2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvaW5jbHVkZS9tcGVnMnRzL0FUU1BhcnNlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvaW5jbHVkZS9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvaW5jbHVkZS9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL2luY2x1ZGUvbXBlZzJ0cy9DYXNNYW5hZ2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL2luY2x1ZGUvbXBlZzJ0cy9DYXNNYW5hZ2VyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9pbmNsdWRlL21wZWcydHMvRVNRdWV1ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9pbmNsdWRlL21wZWcydHMvRVNRdWV1ZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0hsc1NhbXBsZURlY3J5cHRvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9pbmNsdWRlL21wZWcydHMvSGxzU2FtcGxlRGVjcnlwdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvSGxzU2FtcGxlRGVjcnlwdG9yLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvaW5jbHVkZS9tcGVnMnRzL0hsc1NhbXBsZURlY3J5cHRvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL1NhbXBsZURlY3J5cHRvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9pbmNsdWRlL21wZWcydHMvU2FtcGxlRGVjcnlwdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvU2FtcGxlRGVjcnlwdG9yLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvaW5jbHVkZS9tcGVnMnRzL1NhbXBsZURlY3J5cHRvci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9BbmRyb2lkLmJwCmluZGV4IDQ2NGIwMzkuLjM0YThkM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9BbmRyb2lkLmJwCkBAIC01NywxMSArNTcsNiBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvIiwKLSAgICBdLAotCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3QuY3BwCmluZGV4IDc5YzIzM2IuLjllMjRhOTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3QuY3BwCkBAIC0yNiw5ICsyNiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KLQotI2luY2x1ZGUgIm1wZWcydHMvQVRTUGFyc2VyLmgiCi0jaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCisjaW5jbHVkZSA8bXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmg+CisjaW5jbHVkZSA8bXBlZzJ0cy9BVFNQYXJzZXIuaD4KIAogI2luY2x1ZGUgIk1wZWcydHNVbml0VGVzdEVudmlyb25tZW50LmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwCmluZGV4IGU4ZmVlNDIuLjQ4MjdkOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmNwcApAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgPGRsZmNuLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KIAorI2luY2x1ZGUgPHNzdHJlYW0+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogT01YU3RvcmU6Ok9NWFN0b3JlKCkgewpAQCAtOTksOSArMTAxLDM1IEBACiAgICAgfQogfQogCitzdGF0aWMgaW50IGdldEZpcnN0QXBpTGV2ZWwoKSB7CisgICAgaW50IGJvYXJkQXBpTGV2ZWwgPSBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgicm8uYm9hcmQuZmlyc3RfYXBpX2xldmVsIiwgMCk7CisgICAgaWYgKGJvYXJkQXBpTGV2ZWwgIT0gMCkgeworICAgICAgICByZXR1cm4gYm9hcmRBcGlMZXZlbDsKKyAgICB9CisKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoInJvLnByb2R1Y3QuZmlyc3RfYXBpX2xldmVsIiwgX19BTkRST0lEX0FQSV9UX18pOworfQorCitzdGF0aWMgYm9vbCBpc1RWKCkgeworICAgIHN0YXRpYyBjb25zdCBib29sIGtJc1R2ID0gW10oKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNoYXJhY3RlcmlzdGljcyA9IGFuZHJvaWQ6OmJhc2U6OkdldFByb3BlcnR5KCJyby5idWlsZC5jaGFyYWN0ZXJpc3RpY3MiLCAiIik7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzKGNoYXJhY3RlcmlzdGljcyk7CisgICAgICAgIGZvciAoc3RkOjpzdHJpbmcgaXRlbTsgc3RkOjpnZXRsaW5lKHNzLCBpdGVtLCAnLCcpOyApIHsKKyAgICAgICAgICAgIGlmIChpdGVtID09ICJ0diIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSgpOworICAgIHJldHVybiBrSXNUdjsKK30KKwogdm9pZCBPTVhTdG9yZTo6YWRkUGx1Z2luKE9NWFBsdWdpbkJhc2UgKnBsdWdpbikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKKyAgICBib29sIHR5cGVUViA9IGlzVFYoKTsKKyAgICBpbnQgZmlyc3RBcGlMZXZlbCA9IGdldEZpcnN0QXBpTGV2ZWwoKTsKKwogICAgIE9NWF9VMzIgaW5kZXggPSAwOwogCiAgICAgY2hhciBuYW1lWzEyOF07CkBAIC0xMTAsNiArMTM4LDMyIEBACiAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHNpemVvZihuYW1lKSwgaW5kZXgrKykpID09IE9NWF9FcnJvck5vbmUpIHsKICAgICAgICAgU3RyaW5nOCBuYW1lOChuYW1lKTsKIAorICAgICAgICBWZWN0b3I8U3RyaW5nOD4gcm9sZXM7CisgICAgICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gcGx1Z2luLT5nZXRSb2xlc09mQ29tcG9uZW50KG5hbWUsICZyb2xlcyk7CisgICAgICAgIGlmIChlcnIgPT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKFN0cmluZzggcm9sZSA6IHJvbGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHJvbGUuZmluZCgidmlkZW9fZGVjb2RlciIpICE9IC0xIHx8IHJvbGUuZmluZCgidmlkZW9fZW5jb2RlciIpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdEFwaUxldmVsID49IF9fQU5EUk9JRF9BUElfVF9fKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0eXBlVFYgJiYgZmlyc3RBcGlMZXZlbCA+PSBfX0FORFJPSURfQVBJX1NfXykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocm9sZS5maW5kKCJhdWRpb19kZWNvZGVyIikgIT0gLTEgfHwgcm9sZS5maW5kKCJhdWRpb19lbmNvZGVyIikgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0QXBpTGV2ZWwgPj0gX19BTkRST0lEX0FQSV9UX18pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2tpcCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgaWYgKG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuaW5kZXhPZktleShuYW1lOCkgPj0gMCkgewogICAgICAgICAgICAgQUxPR0UoIkEgY29tcG9uZW50IG9mIG5hbWUgJyVzJyBhbHJlYWR5IGV4aXN0cywgaWdub3JpbmcgdGhpcyBvbmUuIiwKICAgICAgICAgICAgICAgICAgbmFtZTguc3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icAppbmRleCA4M2NjODBlLi4xNTlmZDE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icApAQCAtNDMsNyArNDMsNiBAQAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAotICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L0FuZHJvaWQuYnAKaW5kZXggOWE3YmFkOS4uM2MwMGExYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L0FuZHJvaWQuYnAKQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKLSAgICBjbGFuZzogdHJ1ZSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCiAgICAgICAgICItV2Vycm9yPWZvcm1hdCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBTVJBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmNwcAppbmRleCBiYjJhMjM4Li5lNzczMDMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBTVJBc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFNUkFzc2VtYmxlci5jcHAKQEAgLTE4LDkgKzE4LDggQEAKICNkZWZpbmUgTE9HX1RBRyAiQUFNUkFzc2VtYmxlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkFBTVJBc3NlbWJsZXIuaCIKLQotI2luY2x1ZGUgIkFSVFBTb3VyY2UuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FBTVJBc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmNwcAppbmRleCBiMThlOGNhLi5kZGY3OTdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5jcHAKQEAgLTE4LDkgKzE4LDkgQEAKICNkZWZpbmUgTE9HX1RBRyAiQUFWQ0Fzc2VtYmxlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkFBVkNBc3NlbWJsZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuaD4KIAotI2luY2x1ZGUgIkFSVFBTb3VyY2UuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUgyNjNBc3NlbWJsZXIuY3BwCmluZGV4IDM0MzZlOTUuLjU4NGI0ZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUgyNjNBc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUgyNjNBc3NlbWJsZXIuY3BwCkBAIC0xNyw5ICsxNyw5IEBACiAjZGVmaW5lIExPR19UQUcgIkFIMjYzQXNzZW1ibGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQUgyNjNBc3NlbWJsZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmg+CiAKLSNpbmNsdWRlICJBUlRQU291cmNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmNwcAppbmRleCBiMjQwMzM5Li5iYjQyZDFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmNwcApAQCAtMTgsMTQgKzE4LDE0IEBACiAjZGVmaW5lIExPR19UQUcgIkFIRVZDQXNzZW1ibGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQUhFVkNBc3NlbWJsZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmg+CiAKLSNpbmNsdWRlICJBUlRQU291cmNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmg+CiAKKyNpbmNsdWRlIDxIZXZjVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxpbmNsdWRlL0hldmNVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuY3BwCmluZGV4IDA5ODg3NzQuLjIxMDFkZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuY3BwCkBAIC0xOCwxMCArMTgsMTAgQEAKICNkZWZpbmUgTE9HX1RBRyAiQU1QRUcyVFNBc3NlbWJsZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJBTVBFRzJUU0Fzc2VtYmxlci5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuaD4KIAotI2luY2x1ZGUgIkFSVFBTb3VyY2UuaCIKLSNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmNwcAppbmRleCA0MzAyYWVlLi4wZmMwM2FlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmNwcApAQCAtMTcsOSArMTcsOSBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJBTVBFRzRBdWRpb0Fzc2VtYmxlciIKIAotI2luY2x1ZGUgIkFNUEVHNEF1ZGlvQXNzZW1ibGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5oPgogCi0jaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcAppbmRleCA3YmQzM2MxLi4xYzhlZWY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5jcHAKQEAgLTE4LDEwICsxOCwxMCBAQAogI2RlZmluZSBMT0dfVEFHICJBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5oPgogCi0jaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgotI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgpAQCAtMjA0LDcgKzIwNCw3IEBACiB9OwogCiBib29sIEFNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXI6OmluaXRDaGVjaygpIHsKLSAgICBpZihtU2l6ZUxlbmd0aCA9PSAwIHx8IG1JbmRleExlbmd0aCA9PSAwIHx8IG1JbmRleERlbHRhTGVuZ3RoID09IDApIHsKKyAgICBpZihtSXNHZW5lcmljICYmIChtU2l6ZUxlbmd0aCA9PSAwIHx8IG1JbmRleExlbmd0aCA9PSAwIHx8IG1JbmRleERlbHRhTGVuZ3RoID09IDApKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTI0Nzc3NTM3Iik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcAppbmRleCAxNjlkZjQ2Li5kYjYzMTgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKQEAgLTE4LDEwICsxOCw5IEBACiAjZGVmaW5lIExPR19UQUcgIkFQYWNrZXRTb3VyY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJBUGFja2V0U291cmNlLmgiCi0KLSNpbmNsdWRlICJBUmF3QXVkaW9Bc3NlbWJsZXIuaCIKLSNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaD4KIAogI2luY2x1ZGUgPGN0eXBlLmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuY3BwCmluZGV4IDUyYWEzYTAuLmI5ODY5ZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmNwcApAQCAtMTUsNyArMTUsNyBAQAogICovCiAKICNkZWZpbmUgTE9HX1RBRyAiQVJUUEFzc2VtYmxlciIKLSNpbmNsdWRlICJBUlRQQXNzZW1ibGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcAppbmRleCAwYmQzNDJhLi5hNjFmNDhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcApAQCAtMTgsOSArMTgsMTAgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVJUUENvbm5lY3Rpb24iCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJBUlRQQ29ubmVjdGlvbi5oIgotI2luY2x1ZGUgIkFSVFBTb3VyY2UuaCIKLSNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTQxLDYgKzQyLDEwIEBACiAgICAgcmV0dXJuIGRhdGFbMF0gPDwgOCB8IGRhdGFbMV07CiB9CiAKK3N0YXRpYyB1aW50MzJfdCB1MjRhdChjb25zdCB1aW50OF90ICpkYXRhKSB7CisgICAgcmV0dXJuIHUxNmF0KGRhdGEpIDw8IDE2IHwgZGF0YVsyXTsKK30KKwogc3RhdGljIHVpbnQzMl90IHUzMmF0KGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKICAgICByZXR1cm4gdTE2YXQoZGF0YSkgPDwgMTYgfCB1MTZhdCgmZGF0YVsyXSk7CiB9CkBAIC01NTgsNiArNTYzLDcgQEAKICAgICAgICAgICAgICAgICBpZiAobiAhPSAoc3NpemVfdClidWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHNlbmQgUlRDUCByZWNlaXZlciByZXBvcnQgKCVzKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPj0gMCA/ICJjb25uZWN0aW9uIGdvbmUiIDogc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICAgICAgKytpdDsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCkBAIC04NzYsMTEgKzg4MiwxNSBAQAogICAgICAgICBzd2l0Y2ggKGRhdGFbMV0pIHsKICAgICAgICAgICAgIGNhc2UgMjAwOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhcnNlU1IocywgZGF0YSwgaGVhZGVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwYXJzZVNlbmRlclJlcG9ydChzLCBkYXRhLCBoZWFkZXJMZW5ndGgpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjYXNlIDIwMTogIC8vIFJSCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyc2VSZWNlaXZlclJlcG9ydChzLCBkYXRhLCBoZWFkZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSAyMDI6ICAvLyBTREVTCiAgICAgICAgICAgICBjYXNlIDIwNDogIC8vIEFQUAogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtOTM5LDE4ICs5NDksNDQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEFSVFBDb25uZWN0aW9uOjpwYXJzZVNSKAorc3RhdHVzX3QgQVJUUENvbm5lY3Rpb246OnBhcnNlU2VuZGVyUmVwb3J0KAogICAgICAgICBTdHJlYW1JbmZvICpzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIHNpemVfdCBSQyA9IGRhdGFbMF0gJiAweDFmOwotCi0gICAgaWYgKHNpemUgPCAoNyArIFJDICogNikgKiA0KSB7Ci0gICAgICAgIC8vIFBhY2tldCB0b28gc2hvcnQgZm9yIHRoZSBtaW5pbWFsIFNSIGhlYWRlci4KKyAgICBBTE9HX0FTU0VSVChzaXplID49IDEsICJwYXJzZVNlbmRlclJlcG9ydDogaW52YWxpZCBwYWNrZXQgc2l6ZS4iKTsKKyAgICBzaXplX3QgcmVjZXB0aW9uUmVwb3J0Q291bnQgPSBkYXRhWzBdICYgMHgxZjsKKyAgICBpZiAoc2l6ZSA8ICg3ICsgKHJlY2VwdGlvblJlcG9ydENvdW50ICogNikpICogNCkgeworICAgICAgICAvLyBQYWNrZXQgdG9vIHNob3J0IGZvciB0aGUgbWluaW1hbCBzZW5kZXIgcmVwb3J0IGhlYWRlci4KICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHVpbnQzMl90IGlkID0gdTMyYXQoJmRhdGFbNF0pOworICAgIGludDY0X3QgcmVjdlRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgdWludDMyX3Qgc2VuZGVySWQgPSB1MzJhdCgmZGF0YVs0XSk7CiAgICAgdWludDY0X3QgbnRwVGltZSA9IHU2NGF0KCZkYXRhWzhdKTsKICAgICB1aW50MzJfdCBydHBUaW1lID0gdTMyYXQoJmRhdGFbMTZdKTsKKyAgICB1aW50MzJfdCBwa3RDb3VudCA9IHUzMmF0KCZkYXRhWzIwXSk7CisgICAgdWludDMyX3Qgb2N0Q291bnQgPSB1MzJhdCgmZGF0YVsyNF0pOworCisgICAgQUxPR0QoIlNSIHJlY2VpdmVkOiBzc3JjPTB4JTA4eCwgcnRwVGltZSV1ID09IG50cFRpbWUgJWxsdSwgcGt0PSV1LCBvY3Q9JXUiLAorICAgICAgICAgICAgc2VuZGVySWQsIHJ0cFRpbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpbnRwVGltZSwgcGt0Q291bnQsIG9jdENvdW50KTsKKworICAgIHNwPEFSVFBTb3VyY2U+IHNvdXJjZSA9IGZpbmRTb3VyY2Uocywgc2VuZGVySWQpOworICAgIHNvdXJjZS0+dGltZVVwZGF0ZShyZWN2VGltZVVzLCBydHBUaW1lLCBudHBUaW1lKTsKKworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHJlY2VwdGlvblJlcG9ydENvdW50OyBpKyspIHsKKyAgICAgICAgaW50MzJfdCBvZmZzZXQgPSAyOCArIChpICogMjQpOworICAgICAgICBwYXJzZVJlY2VwdGlvblJlcG9ydEJsb2NrKHMsIHJlY3ZUaW1lVXMsIHNlbmRlcklkLCBkYXRhICsgb2Zmc2V0LCBzaXplIC0gb2Zmc2V0KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgQVJUUENvbm5lY3Rpb246OnBhcnNlUmVjZWl2ZXJSZXBvcnQoCisgICAgICAgIFN0cmVhbUluZm8gKnMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR19BU1NFUlQoc2l6ZSA+PSAxLCAicGFyc2VSZWNlaXZlclJlcG9ydDogaW52YWxpZCBwYWNrZXQgc2l6ZS4iKTsKKyAgICBzaXplX3QgcmVjZXB0aW9uUmVwb3J0Q291bnQgPSBkYXRhWzBdICYgMHgxZjsKKyAgICBpZiAoc2l6ZSA8ICgyICsgKHJlY2VwdGlvblJlcG9ydENvdW50ICogNikpICogNCkgeworICAgICAgICAvLyBQYWNrZXQgdG9vIHNob3J0IGZvciB0aGUgbWluaW1hbCByZWNlaXZlciByZXBvcnQgaGVhZGVyLgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCiAjaWYgMAogICAgIEFMT0dJKCJYWFggdGltZVVwZGF0ZTogc3NyYz0weCUwOHgsIHJ0cFRpbWUgJXUgPT0gbnRwVGltZSAlLjNmIiwKQEAgLTk1OCwxMCArOTk0LDQwIEBACiAgICAgICAgICBydHBUaW1lLAogICAgICAgICAgKG50cFRpbWUgPj4gMzIpICsgKGRvdWJsZSkobnRwVGltZSAmIDB4ZmZmZmZmZmYpIC8gKDFsbCA8PCAzMikpOwogI2VuZGlmCisgICAgaW50NjRfdCByZWN2VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICB1aW50MzJfdCBzZW5kZXJJZCA9IHUzMmF0KCZkYXRhWzRdKTsKIAotICAgIHNwPEFSVFBTb3VyY2U+IHNvdXJjZSA9IGZpbmRTb3VyY2UocywgaWQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVjZXB0aW9uUmVwb3J0Q291bnQ7IGkrKykgeworICAgICAgICBpbnQzMl90IG9mZnNldCA9IDggKyAoaSAqIDI0KTsKKyAgICAgICAgcGFyc2VSZWNlcHRpb25SZXBvcnRCbG9jayhzLCByZWN2VGltZVVzLCBzZW5kZXJJZCwgZGF0YSArIG9mZnNldCwgc2l6ZSAtIG9mZnNldCk7CisgICAgfQogCi0gICAgc291cmNlLT50aW1lVXBkYXRlKHJ0cFRpbWUsIG50cFRpbWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0dXNfdCBBUlRQQ29ubmVjdGlvbjo6cGFyc2VSZWNlcHRpb25SZXBvcnRCbG9jaygKKyAgICAgICAgU3RyZWFtSW5mbyAqcywgaW50NjRfdCByZWN2VGltZVVzLCB1aW50MzJfdCBzZW5kZXJJZCwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HX0FTU0VSVChzaXplID49IDI0LCAicGFyc2VSZWNlcHRpb25SZXBvcnRCbG9jazogaW52YWxpZCBwYWNrZXQgc2l6ZS4iKTsKKyAgICBpZiAoc2l6ZSA8IDI0KSB7CisgICAgICAgIC8vIHJlbWFpbmluZyBzaXplIGlzIHNtYWxsZXIgdGhhbiByZWNlcHRpb24gcmVwb3J0IGJsb2NrIHNpemUuCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB1aW50MzJfdCByYklkID0gdTMyYXQoJmRhdGFbMF0pOworICAgIHVpbnQzMl90IGZMb3N0ID0gZGF0YVs0XTsKKyAgICBpbnQzMl90IGN1bUxvc3QgPSB1MjRhdCgmZGF0YVs1XSk7CisgICAgdWludDMyX3QgZWhTZXEgPSB1MzJhdCgmZGF0YVs4XSk7CisgICAgdWludDMyX3Qgaml0dGVyID0gdTMyYXQoJmRhdGFbMTJdKTsKKyAgICB1aW50MzJfdCBsc3IgPSB1MzJhdCgmZGF0YVsxNl0pOworICAgIHVpbnQzMl90IGRsc3IgPSB1MzJhdCgmZGF0YVsyMF0pOworCisgICAgQUxPR0QoIlJlY2VwdGlvbiBSZXBvcnQgQmxvY2s6IHQ6JWxsdSBzaWQ6JXUgcmlkOiV1IGZsOiV1IGNsOiV1IGhzOiV1IGp0OiV1IGxzcjoldSBkbHNyOiV1IiwKKyAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVjdlRpbWVVcywgc2VuZGVySWQsIHJiSWQsIGZMb3N0LCBjdW1Mb3N0LAorICAgICAgICAgICAgZWhTZXEsIGppdHRlciwgbHNyLCBkbHNyKTsKKyAgICBzcDxBUlRQU291cmNlPiBzb3VyY2UgPSBmaW5kU291cmNlKHMsIHNlbmRlcklkKTsKKyAgICBzcDxSZWNlcHRpb25SZXBvcnRCbG9jaz4gcnJiID0gbmV3IFJlY2VwdGlvblJlcG9ydEJsb2NrKAorICAgICAgICAgICAgcmJJZCwgZkxvc3QsIGN1bUxvc3QsIGVoU2VxLCBqaXR0ZXIsIGxzciwgZGxzcik7CisgICAgc291cmNlLT5wcm9jZXNzUmVjZXB0aW9uUmVwb3J0QmxvY2socmVjdlRpbWVVcywgc2VuZGVySWQsIHJyYik7CiAKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5jcHAKaW5kZXggZTVhY2IwNi4uZGFlNDZmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5jcHAKQEAgLTE4LDcgKzE4LDEwIEBACiAjZGVmaW5lIExPR19UQUcgIkFSVFBTZXNzaW9uIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQVJUUFNlc3Npb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTI5LDkgKzMyLDYgQEAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAKLSNpbmNsdWRlICJBUGFja2V0U291cmNlLmgiCi0jaW5jbHVkZSAiQVJUUENvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAKaW5kZXggMzhhMzcwYi4uNzE3ZDhhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuY3BwCkBAIC0xOCwxNyArMTgsMTcgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVJUUFNvdXJjZSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkFSVFBTb3VyY2UuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaD4KIAotI2luY2x1ZGUgIkFBTVJBc3NlbWJsZXIuaCIKLSNpbmNsdWRlICJBQVZDQXNzZW1ibGVyLmgiCi0jaW5jbHVkZSAiQUhFVkNBc3NlbWJsZXIuaCIKLSNpbmNsdWRlICJBSDI2M0Fzc2VtYmxlci5oIgotI2luY2x1ZGUgIkFNUEVHMlRTQXNzZW1ibGVyLmgiCi0jaW5jbHVkZSAiQU1QRUc0QXVkaW9Bc3NlbWJsZXIuaCIKLSNpbmNsdWRlICJBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmgiCi0jaW5jbHVkZSAiQVJhd0F1ZGlvQXNzZW1ibGVyLmgiCi0jaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQUFNUkFzc2VtYmxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQUhFVkNBc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTEzMiwxMCArMTMyLDEwIEBACiAgICAgfQogfQogCi12b2lkIEFSVFBTb3VyY2U6OnRpbWVVcGRhdGUodWludDMyX3QgcnRwVGltZSwgdWludDY0X3QgbnRwVGltZSkgewordm9pZCBBUlRQU291cmNlOjp0aW1lVXBkYXRlKGludDY0X3QgcmVjdlRpbWVVcywgdWludDMyX3QgcnRwVGltZSwgdWludDY0X3QgbnRwVGltZSkgewogICAgIG1MYXN0U3JSdHBUaW1lID0gcnRwVGltZTsKICAgICBtTGFzdFNyTnRwVGltZSA9IG50cFRpbWU7Ci0gICAgbUxhc3RTclVwZGF0ZVRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgbUxhc3RTclVwZGF0ZVRpbWVVcyA9IHJlY3ZUaW1lVXM7CiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigidGltZS11cGRhdGUiLCB0cnVlKTsKQEAgLTE0Myw3ICsxNDMsMzAgQEAKICAgICBub3RpZnktPnNldEludDY0KCJudHAtdGltZSIsIG50cFRpbWUpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtZXZlbnQiLCAxKTsKICAgICBub3RpZnktPnNldEludDMyKCJwYXlsb2FkLXR5cGUiLCBSVENQX1NSKTsKLSAgICBub3RpZnktPnNldEludDY0KCJyZWN2LXRpbWUtdXMiLCBtTGFzdFNyVXBkYXRlVGltZVVzKTsKKyAgICBub3RpZnktPnNldEludDY0KCJyZWN2LXRpbWUtdXMiLCByZWN2VGltZVVzKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBBUlRQU291cmNlOjpwcm9jZXNzUmVjZXB0aW9uUmVwb3J0QmxvY2soCisgICAgICAgIGludDY0X3QgcmVjdlRpbWVVcywgdWludDMyX3Qgc2VuZGVySWQsIHNwPFJlY2VwdGlvblJlcG9ydEJsb2NrPiBycmIpIHsKKyAgICBtTGFzdFJyVXBkYXRlVGltZVVzID0gcmVjdlRpbWVVczsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJydGNwLWV2ZW50IiwgMSk7CisgICAgLy8gQSBSZWNlcHRpb24gUmVwb3J0IEJsb2NrIChSUkIpIGNhbiBiZSBpbmNsdWRlZCBpbiBib3RoIFNlbmRlciBSZXBvcnQgYW5kIFJlY2VpdmVyIFJlcG9ydC4KKyAgICAvLyBCdXQgaXQgbWVhbnMgJ1BhY2tldCBSZWNlcHRpb24gUmVwb3J0JyBhY3R1YWxseS4KKyAgICAvLyBTbyB0aGF0LCB3ZSB3aWxsIHJlcG9ydCBSUkIgYXMgUlIgc2luY2UgdGhlcmUgaXMgbm8gbWVhbmluZyBkaWZmZXJlbmNlCisgICAgLy8gYmV0d2VlbiBSUkIoUmVjZXB0aW9uIFJlcG9ydCBCbG9jaykgYW5kIFJSKFJlY2VpdmVyIFJlcG9ydCkuCisgICAgbm90aWZ5LT5zZXRJbnQzMigicGF5bG9hZC10eXBlIiwgUlRDUF9SUik7CisgICAgbm90aWZ5LT5zZXRJbnQ2NCgicmVjdi10aW1lLXVzIiwgcmVjdlRpbWVVcyk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicnRjcC1yci1zc3JjIiwgc2VuZGVySWQpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtcnJiLXNzcmMiLCBycmItPnNzcmMpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtcnJiLWZyYWN0aW9uIiwgcnJiLT5mcmFjdGlvbik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicnRjcC1ycmItbG9zdCIsIHJyYi0+bG9zdCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicnRjcC1ycmItbGFzdFNlcSIsIHJyYi0+bGFzdFNlcSk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicnRjcC1ycmItaml0dGVyIiwgcnJiLT5qaXR0ZXIpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtcnJiLWxzciIsIHJyYi0+bHNyKTsKKyAgICBub3RpZnktPnNldEludDMyKCJydGNwLXJyYi1kbHNyIiwgcnJiLT5kbHNyKTsKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIApAQCAtNDUzLDcgKzQ3Niw4IEBACiAgICAgZGF0YVsxOF0gPSAobUhpZ2hlc3RTZXFOdW1iZXIgPj4gOCkgJiAweGZmOwogICAgIGRhdGFbMTldID0gbUhpZ2hlc3RTZXFOdW1iZXIgJiAweGZmOwogCi0gICAgdWludDMyX3Qgaml0dGVyVGltZSA9IDA7CisgICAgdWludDMyX3Qgaml0dGVyVGltZU1zID0gKHVpbnQzMl90KWdldEludGVyQXJyaXZhbEppdHRlclRpbWVNcygpOworICAgIHVpbnQzMl90IGppdHRlclRpbWUgPSBqaXR0ZXJUaW1lTXMgKiBtQ2xvY2tSYXRlIC8gMTAwMDsKICAgICBkYXRhWzIwXSA9IGppdHRlclRpbWUgPj4gMjQ7ICAgIC8vIEludGVyYXJyaXZhbCBqaXR0ZXIKICAgICBkYXRhWzIxXSA9IChqaXR0ZXJUaW1lID4+IDE2KSAmIDB4ZmY7CiAgICAgZGF0YVsyMl0gPSAoaml0dGVyVGltZSA+PiA4KSAmIDB4ZmY7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcAppbmRleCAxMWM3YWViLi44OTkwZjBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVJUUFdyaXRlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkFSVFBXcml0ZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKaW5kZXggYzMzYmYzZi4uYWFiNjNhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtMTgsOCArMTgsOCBAQAogI2RlZmluZSBMT0dfVEFHICJBUlRTUENvbm5lY3Rpb24iCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJBUlRTUENvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJOZXR3b3JrVXRpbHMuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmg+CiAKICNpbmNsdWRlIDxkYXRhc291cmNlL0hUVFBCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5jcHAKaW5kZXggMTY3ZjdhNC4uOTIxMGFmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmNwcApAQCAtMTgsMTAgKzE4LDEwIEBACiAjZGVmaW5lIExPR19UQUcgIkFSYXdBdWRpb0Fzc2VtYmxlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkFSYXdBdWRpb0Fzc2VtYmxlci5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmg+CiAKLSNpbmNsdWRlICJBUlRQU291cmNlLmgiCi0jaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCmluZGV4IDViNWI0YjEuLjIxN2VjYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJBU2Vzc2lvbkRlc2NyaXB0aW9uIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icAppbmRleCAzNGQxNzg4Li41YjYzY2MyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCkBAIC00NywxMCArNDcsOSBAQAogICAgICAgICAibGlibWVkaWEiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZCIsCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcF9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgYXJjaDogewpAQCAtNzMsNiArNzIsMTggQEAKICAgICB9LAogfQogCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9ydHNwX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKIApAQCAtOTAsNiArMTAxLDEwIEBACiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCisvLyAyMDIyLTAxLTEzOiB0aGlzIGlzIHN0YWxlOyBpdCdzIGJlZW4gZGlzYWJsZWQgZm9yIDUgeWVhcnMuCisvLyB0ZXN0IHJlZmVyZW5jZXMgVURQUHVzaGVyIGFuZCBBUlRQU2Vzc2lvbiwgbmVpdGhlciBvZiB3aGljaCBpcyBidWlsdCBpbnRvCisvLyBsaWJzdGFnZWZyaWdodF9ydHNwCisvLwogY2NfdGVzdCB7CiAgICAgbmFtZTogInJ0cF90ZXN0IiwKICAgICBndGVzdDogZmFsc2UsCkBAIC0xMDgsMTAgKzEyMyw5IEBACiAKICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9ydHNwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9jbWRzL3N0YWdlZnJpZ2h0IiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcF9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0ppdHRlckNhbGN1bGF0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmNwcAppbmRleCA5M2I1YTgzLi45M2FmZTljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0ppdHRlckNhbGN1bGF0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvSml0dGVyQ2FsY3VsYXRvci5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiSml0dGVyQ2FsYyIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkppdHRlckNhbGN1bGF0b3IuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0ppdHRlckNhbGN1bGF0b3IuaD4KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCkBAIC0zOCwxNCArMzgsMTMgQEAKICAgICBtSW50ZXJBcnJpdmFsSml0dGVyVXMgPSBpbnRlcjsKIH0KIAotdm9pZCBKaXR0ZXJDYWxjOjpwdXRCYXNlRGF0YShpbnQ2NF90IHJ0cFRpbWUsIGludDY0X3QgYXJyaXZhbFRpbWVVcykgewotICAgIC8vIEEgUlRQIHRpbWUgd3JhcHMgYXJvdW5kIGFmdGVyIFVJTlQzMl9NQVguIFdlIG11c3QgY29uc2lkZXIgdGhpcyBjYXNlLgotICAgIGNvbnN0IGludDY0X3QgVUlOVDMyX01TQiA9IDB4ODAwMDAwMDA7Ci0gICAgaW50NjRfdCBvdmVyZmxvd01hc2sgPSAobUZpcnN0VGltZVN0YW1wICYgVUlOVDMyX01TQiAmIH5ydHBUaW1lKSA8PCAxOwotICAgIGludDY0X3QgdGVtcFJ0cFRpbWUgPSBvdmVyZmxvd01hc2sgfCBydHBUaW1lOwordm9pZCBKaXR0ZXJDYWxjOjpwdXRCYXNlRGF0YSh1aW50MzJfdCBydHBUaW1lLCBpbnQ2NF90IGFycml2YWxUaW1lVXMpIHsKKyAgICAvLyBBIFJUUCB0aW1lIHdyYXBzIGFyb3VuZCBhZnRlciBVSU5UMzJfTUFYLiBPdmVyZmxvdyBjYW4gcHJlc2VudC4KKyAgICB1aW50MzJfdCBkaWZmID0gMDsKKyAgICBfX2J1aWx0aW5fdXN1Yl9vdmVyZmxvdyhydHBUaW1lLCBtRmlyc3RUaW1lU3RhbXAsICZkaWZmKTsKIAogICAgIC8vIEJhc2Ugaml0dGVyIGltcGxlbWVudGF0aW9uIGNhbiBiZSB2YXJpb3VzCi0gICAgaW50NjRfdCBzY2hlZHVsZWRUaW1lVXMgPSAodGVtcFJ0cFRpbWUgLSAoaW50NjRfdCltRmlyc3RUaW1lU3RhbXApICogMTAwMDAwMGxsIC8gbUNsb2NrUmF0ZTsKKyAgICBpbnQ2NF90IHNjaGVkdWxlZFRpbWVVcyA9ICgoaW50MzJfdClkaWZmKSAqIDEwMDAwMDBsbCAvIG1DbG9ja1JhdGU7CiAgICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gYXJyaXZhbFRpbWVVcyAtIG1GaXJzdEFycml2YWxUaW1lVXM7CiAgICAgaW50NjRfdCBjb3JyZWN0aW9uVGltZVVzID0gZWxhcHNlZFRpbWVVcyAtIHNjaGVkdWxlZFRpbWVVczsgLy8gYWRkaXRpb25hbCBwcm9wYWdhdGlvbiBkZWxheTsKICAgICBtQmFzZUppdHRlclVzID0gKG1CYXNlSml0dGVyVXMgKiAxNSArIGNvcnJlY3Rpb25UaW1lVXMpIC8gMTY7CkBAIC01MywxOCArNTIsMTMgQEAKICAgICAgICAgICAgIChsb25nIGxvbmcpbUJhc2VKaXR0ZXJVcywgKGxvbmcgbG9uZyljb3JyZWN0aW9uVGltZVVzKTsKIH0KIAotdm9pZCBKaXR0ZXJDYWxjOjpwdXRJbnRlckFycml2YWxEYXRhKGludDY0X3QgcnRwVGltZSwgaW50NjRfdCBhcnJpdmFsVGltZVVzKSB7Ci0gICAgY29uc3QgaW50NjRfdCBVSU5UMzJfTVNCID0gMHg4MDAwMDAwMDsKLSAgICBpbnQ2NF90IHRlbXBSdHBUaW1lID0gcnRwVGltZTsKLSAgICBpbnQ2NF90IHRlbXBMYXN0VGltZVN0YW1wID0gbUxhc3RUaW1lU3RhbXA7Ci0KLSAgICAvLyBBIFJUUCB0aW1lIHdyYXBzIGFyb3VuZCBhZnRlciBVSU5UMzJfTUFYLiBXZSBtdXN0IGNvbnNpZGVyIHRoaXMgY2FzZS4KLSAgICBpbnQ2NF90IG92ZXJmbG93TWFzayA9IChtTGFzdFRpbWVTdGFtcCBeIHJ0cFRpbWUpICYgVUlOVDMyX01TQjsKLSAgICB0ZW1wUnRwVGltZSB8PSAoKG92ZXJmbG93TWFzayAmIH5ydHBUaW1lKSA8PCAxKTsKLSAgICB0ZW1wTGFzdFRpbWVTdGFtcCB8PSAoKG92ZXJmbG93TWFzayAmIH5tTGFzdFRpbWVTdGFtcCkgPDwgMSk7Cit2b2lkIEppdHRlckNhbGM6OnB1dEludGVyQXJyaXZhbERhdGEodWludDMyX3QgcnRwVGltZSwgaW50NjRfdCBhcnJpdmFsVGltZVVzKSB7CisgICAgLy8gQSBSVFAgdGltZSB3cmFwcyBhcm91bmQgYWZ0ZXIgVUlOVDMyX01BWC4gT3ZlcmZsb3cgY2FuIHByZXNlbnQuCisgICAgdWludDMyX3QgZGlmZiA9IDA7CisgICAgX19idWlsdGluX3VzdWJfb3ZlcmZsb3cocnRwVGltZSwgbUxhc3RUaW1lU3RhbXAsICZkaWZmKTsKIAogICAgIC8vIDYuNC4xIG9mIFJGQzM1NTAgZGVmaW5lcyB0aGlzIGludGVyYXJyaXZhbCBqaXR0ZXIgdmFsdWUuCi0gICAgaW50NjRfdCBkaWZmVGltZVN0YW1wVXMgPSBhYnModGVtcFJ0cFRpbWUgLSB0ZW1wTGFzdFRpbWVTdGFtcCkgKiAxMDAwMDAwbGwgLyBtQ2xvY2tSYXRlOworICAgIGludDY0X3QgZGlmZlRpbWVTdGFtcFVzID0gYWJzKChpbnQzMl90KWRpZmYpICogMTAwMDAwMGxsIC8gbUNsb2NrUmF0ZTsKICAgICBpbnQ2NF90IGRpZmZBcnJpdmFsVXMgPSBhcnJpdmFsVGltZVVzIC0gbUxhc3RBcnJpdmFsVGltZVVzOyAvLyBDYW4ndCBiZSBtaW51cwogICAgIEFMT0dWKCJkaWZmVGltZVN0YW1wVXMgJWxsZCBcdFx0IGRpZmZBcnJpdmFsVXMgJWxsZCIsCiAgICAgICAgICAgICAobG9uZyBsb25nKWRpZmZUaW1lU3RhbXBVcywgKGxvbmcgbG9uZylkaWZmQXJyaXZhbFVzKTsKQEAgLTcyLDcgKzY2LDcgQEAKICAgICBpbnQ2NF90IHZhcmlhbmNlVXMgPSBkaWZmQXJyaXZhbFVzIC0gZGlmZlRpbWVTdGFtcFVzOwogICAgIG1JbnRlckFycml2YWxKaXR0ZXJVcyA9IChtSW50ZXJBcnJpdmFsSml0dGVyVXMgKiAxNSArIGFicyh2YXJpYW5jZVVzKSkgLyAxNjsKIAotICAgIG1MYXN0VGltZVN0YW1wID0gKHVpbnQzMl90KXJ0cFRpbWU7CisgICAgbUxhc3RUaW1lU3RhbXAgPSBydHBUaW1lOwogICAgIG1MYXN0QXJyaXZhbFRpbWVVcyA9IGFycml2YWxUaW1lVXM7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlUcmFuc21pdHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeVRyYW5zbWl0dGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDRhZmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeVRyYW5zbWl0dGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5ODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTVlfVFJBTlNNSVRURVJfSF8KLQotI2RlZmluZSBNWV9UUkFOU01JVFRFUl9IXwotCi0jaW5jbHVkZSAiQVJUUENvbm5lY3Rpb24uaCIKLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0KLSNpZmRlZiBBTkRST0lECi0jaW5jbHVkZSAiVmlkZW9Tb3VyY2UuaCIKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oPgotI2VuZGlmCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotI2RlZmluZSBUUkFDS19TVUZGSVggICAgInRyYWNraWQ9MSIKLSNkZWZpbmUgUFQgICAgICAgICAgICAgIDk2Ci0jZGVmaW5lIFBUX1NUUiAgICAgICAgICAiOTYiCi0KLSNkZWZpbmUgVVNFUk5BTUUgICAgICAgICJiY2FzdCIKLSNkZWZpbmUgUEFTU1dPUkQgICAgICAgICJ0ZXN0IgotCi1zdGF0aWMgaW50IHVuaWZvcm1SYW5kKGludCBsaW1pdCkgewotICAgIHJldHVybiAoKGRvdWJsZSlyYW5kKCkgKiBsaW1pdCkgLyBSQU5EX01BWDsKLX0KLQotc3RhdGljIGJvb2wgR2V0QXR0cmlidXRlKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdmFsdWUpIHsKLSAgICB2YWx1ZS0+Y2xlYXIoKTsKLQotICAgIHNpemVfdCBrZXlMZW4gPSBzdHJsZW4oa2V5KTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIocywgJzsnKTsKLQotICAgICAgICBzaXplX3QgbGVuID0KLSAgICAgICAgICAgIChjb2xvblBvcyA9PSBOVUxMKSA/IHN0cmxlbihzKSA6IGNvbG9uUG9zIC0gczsKLQotICAgICAgICBpZiAobGVuID49IGtleUxlbiArIDEgJiYgc1trZXlMZW5dID09ICc9JyAmJiAhc3RybmNtcChzLCBrZXksIGtleUxlbikpIHsKLSAgICAgICAgICAgIHZhbHVlLT5zZXRUbygmc1trZXlMZW4gKyAxXSwgbGVuIC0ga2V5TGVuIC0gMSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb2xvblBvcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzID0gY29sb25Qb3MgKyAxOwotICAgIH0KLX0KLQotc3RydWN0IE15VHJhbnNtaXR0ZXIgOiBwdWJsaWMgQUhhbmRsZXIgewotICAgIE15VHJhbnNtaXR0ZXIoY29uc3QgY2hhciAqdXJsLCBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyKQotICAgICAgICA6IG1TZXJ2ZXJVUkwodXJsKSwKLSAgICAgICAgICBtTG9vcGVyKGxvb3BlciksCi0gICAgICAgICAgbUNvbm4obmV3IEFSVFNQQ29ubmVjdGlvbiksCi0gICAgICAgICAgbUNvbm5lY3RlZChmYWxzZSksCi0gICAgICAgICAgbUF1dGhUeXBlKE5PTkUpLAotICAgICAgICAgIG1SVFBTb2NrZXQoLTEpLAotICAgICAgICAgIG1SVENQU29ja2V0KC0xKSwKLSAgICAgICAgICBtU291cmNlSUQocmFuZCgpKSwKLSAgICAgICAgICBtU2VxTm8odW5pZm9ybVJhbmQoNjU1MzYpKSwKLSAgICAgICAgICBtUlRQVGltZUJhc2UocmFuZCgpKSwKLSAgICAgICAgICBtTnVtU2FtcGxlc1NlbnQoMCksCi0gICAgICAgICAgbU51bVJUUFNlbnQoMCksCi0gICAgICAgICAgbU51bVJUUE9jdGV0c1NlbnQoMCksCi0gICAgICAgICAgbUxhc3RSVFBUaW1lKDApLAotICAgICAgICAgIG1MYXN0TlRQVGltZSgwKSB7Ci0gICAgICAgIG1TdHJlYW1VUkwgPSBtU2VydmVyVVJMOwotICAgICAgICBtU3RyZWFtVVJMLmFwcGVuZCgiL2Jhem9uZy5zZHAiKTsKLQotICAgICAgICBtVHJhY2tVUkwgPSBtU3RyZWFtVVJMOwotICAgICAgICBtVHJhY2tVUkwuYXBwZW5kKCIvIik7Ci0gICAgICAgIG1UcmFja1VSTC5hcHBlbmQoVFJBQ0tfU1VGRklYKTsKLQotICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7Ci0gICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtQ29ubik7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdjb25uJywgdGhpcyk7Ci0gICAgICAgIG1Db25uLT5jb25uZWN0KG1TZXJ2ZXJVUkwuY19zdHIoKSwgcmVwbHkpOwotCi0jaWZkZWYgQU5EUk9JRAotICAgICAgICBpbnQgd2lkdGggPSA2NDA7Ci0gICAgICAgIGludCBoZWlnaHQgPSA0ODA7Ci0KLSAgICAgICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IG5ldyBWaWRlb1NvdXJjZSh3aWR0aCwgaGVpZ2h0KTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gZW5jTWV0YSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgZW5jTWV0YS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoIndpZHRoIiwgd2lkdGgpOwotICAgICAgICBlbmNNZXRhLT5zZXRJbnQzMigiaGVpZ2h0IiwgaGVpZ2h0KTsKLSAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoImZyYW1lLXJhdGUiLCAzMCk7Ci0gICAgICAgIGVuY01ldGEtPnNldEludDMyKCJiaXRyYXRlIiwgMjU2MDAwKTsKLSAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoImktZnJhbWUtaW50ZXJ2YWwiLCAxMCk7Ci0KLSAgICAgICAgc3A8QUxvb3Blcj4gZW5jTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgICAgIGVuY0xvb3Blci0+c2V0TmFtZSgicnRzcF90cmFuc21pdHRlciIpOwotICAgICAgICBlbmNMb29wZXItPnN0YXJ0KCk7Ci0KLSAgICAgICAgbUVuY29kZXIgPSBNZWRpYUNvZGVjU291cmNlOjpDcmVhdGUoZW5jTG9vcGVyLCBlbmNNZXRhLCBzb3VyY2UpOwotCi0gICAgICAgIG1FbmNvZGVyLT5zdGFydCgpOwotCi0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgICAgIENIRUNLX0VRKG1FbmNvZGVyLT5yZWFkKCZidWZmZXIpLCAoc3RhdHVzX3QpT0spOwotICAgICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7Ci0KLSAgICAgICAgbWFrZUgyNjRTUHJvcFBhcmFtU2V0cyhidWZmZXIpOwotCi0gICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBidWZmZXIgPSBOVUxMOwotI2VuZGlmCi0gICAgfQotCi0gICAgdWludDY0X3QgbnRwVGltZSgpIHsKLSAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwotCi0gICAgICAgIHVpbnQ2NF90IG5vd1VzID0gdHYudHZfc2VjICogMTAwMDAwMGxsICsgdHYudHZfdXNlYzsKLQotICAgICAgICBub3dVcyArPSAoKDcwbGwgKiAzNjUgKyAxNykgKiAyNCkgKiA2MCAqIDYwICogMTAwMDAwMGxsOwotCi0gICAgICAgIHVpbnQ2NF90IGhpID0gbm93VXMgLyAxMDAwMDAwbGw7Ci0gICAgICAgIHVpbnQ2NF90IGxvID0gKCgxbGwgPDwgMzIpICogKG5vd1VzICUgMTAwMDAwMGxsKSkgLyAxMDAwMDAwbGw7Ci0KLSAgICAgICAgcmV0dXJuIChoaSA8PCAzMikgfCBsbzsKLSAgICB9Ci0KLSAgICB2b2lkIGlzc3VlQW5ub3VuY2UoKSB7Ci0gICAgICAgIEFTdHJpbmcgc2RwOwotICAgICAgICBzZHAgPSAidj0wXHJcbiI7Ci0KLSAgICAgICAgc2RwLmFwcGVuZCgibz0tICIpOwotCi0gICAgICAgIHVpbnQ2NF90IG50cCA9IG50cFRpbWUoKTsKLSAgICAgICAgc2RwLmFwcGVuZChudHApOwotICAgICAgICBzZHAuYXBwZW5kKCIgIik7Ci0gICAgICAgIHNkcC5hcHBlbmQobnRwKTsKLSAgICAgICAgc2RwLmFwcGVuZCgiIElOIElQNCAxMjcuMC4wLjBcclxuIik7Ci0KLSAgICAgICAgc2RwLmFwcGVuZCgKLSAgICAgICAgICAgICAgInM9U2FtcGxlXHJcbiIKLSAgICAgICAgICAgICAgImk9UGxheWluZyBhcm91bmQgd2l0aCBBTk5PVU5DRVxyXG4iCi0gICAgICAgICAgICAgICJjPUlOIElQNCAiKTsKLQotICAgICAgICBzdHJ1Y3QgaW5fYWRkciBhZGRyOwotICAgICAgICBhZGRyLnNfYWRkciA9IGh0b25sKG1TZXJ2ZXJJUCk7Ci0KLSAgICAgICAgc2RwLmFwcGVuZChpbmV0X250b2EoYWRkcikpOwotCi0gICAgICAgIHNkcC5hcHBlbmQoCi0gICAgICAgICAgICAgICJcclxuIgotICAgICAgICAgICAgICAidD0wIDBcclxuIgotICAgICAgICAgICAgICAiYT1yYW5nZTpucHQ9bm93LVxyXG4iKTsKLQotI2lmZGVmIEFORFJPSUQKLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtRW5jb2Rlci0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7Ci0KLSAgICAgICAgc2RwLmFwcGVuZCgKLSAgICAgICAgICAgICAgIm09dmlkZW8gMCBSVFAvQVZQICIgUFRfU1RSICJcclxuIgotICAgICAgICAgICAgICAiYj1BUyAzMjAwMDBcclxuIgotICAgICAgICAgICAgICAiYT1ydHBtYXA6IiBQVF9TVFIgIiBIMjY0LzkwMDAwXHJcbiIpOwotCi0gICAgICAgIHNkcC5hcHBlbmQoImE9Y2xpcHJlY3QgMCwwLCIpOwotICAgICAgICBzZHAuYXBwZW5kKGhlaWdodCk7Ci0gICAgICAgIHNkcC5hcHBlbmQoIiwiKTsKLSAgICAgICAgc2RwLmFwcGVuZCh3aWR0aCk7Ci0gICAgICAgIHNkcC5hcHBlbmQoIlxyXG4iKTsKLQotICAgICAgICBzZHAuYXBwZW5kKAotICAgICAgICAgICAgICAiYT1mcmFtZXNpemU6IiBQVF9TVFIgIiAiKTsKLSAgICAgICAgc2RwLmFwcGVuZCh3aWR0aCk7Ci0gICAgICAgIHNkcC5hcHBlbmQoIi0iKTsKLSAgICAgICAgc2RwLmFwcGVuZChoZWlnaHQpOwotICAgICAgICBzZHAuYXBwZW5kKCJcclxuIik7Ci0KLSAgICAgICAgc2RwLmFwcGVuZCgKLSAgICAgICAgICAgICAgImE9Zm10cDoiIFBUX1NUUiAiIHByb2ZpbGUtbGV2ZWwtaWQ9NDJDMDE1O3Nwcm9wLXBhcmFtZXRlci1zZXRzPSIpOwotCi0gICAgICAgIHNkcC5hcHBlbmQobVNlcVBhcmFtU2V0KTsKLSAgICAgICAgc2RwLmFwcGVuZCgiLCIpOwotICAgICAgICBzZHAuYXBwZW5kKG1QaWNQYXJhbVNldCk7Ci0gICAgICAgIHNkcC5hcHBlbmQoIjtwYWNrZXRpemF0aW9uLW1vZGU9MVxyXG4iKTsKLSNlbHNlCi0gICAgICAgIHNkcC5hcHBlbmQoCi0gICAgICAgICAgICAgICAgIm09YXVkaW8gMCBSVFAvQVZQICIgUFRfU1RSICJcclxuIgotICAgICAgICAgICAgICAgICJhPXJ0cG1hcDoiIFBUX1NUUiAiIEw4LzgwMDAvMVxyXG4iKTsKLSNlbmRpZgotCi0gICAgICAgIHNkcC5hcHBlbmQoImE9Y29udHJvbDoiIFRSQUNLX1NVRkZJWCAiXHJcbiIpOwotCi0gICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKLSAgICAgICAgcmVxdWVzdC5hcHBlbmQoIkFOTk9VTkNFICIpOwotICAgICAgICByZXF1ZXN0LmFwcGVuZChtU3RyZWFtVVJMKTsKLSAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKLQotICAgICAgICBhZGRBdXRoZW50aWNhdGlvbigmcmVxdWVzdCwgIkFOTk9VTkNFIiwgbVN0cmVhbVVSTC5jX3N0cigpKTsKLQotICAgICAgICByZXF1ZXN0LmFwcGVuZCgiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9zZHBcclxuIik7Ci0gICAgICAgIHJlcXVlc3QuYXBwZW5kKCJDb250ZW50LUxlbmd0aDogIik7Ci0gICAgICAgIHJlcXVlc3QuYXBwZW5kKHNkcC5zaXplKCkpOwotICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotCi0gICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgIHJlcXVlc3QuYXBwZW5kKHNkcCk7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdhbm5vJywgdGhpcyk7Ci0gICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKLSAgICB9Ci0KLSAgICB2b2lkIEgoY29uc3QgQVN0cmluZyAmcywgQVN0cmluZyAqb3V0KSB7Ci0gICAgICAgIG91dC0+Y2xlYXIoKTsKLQotICAgICAgICBNRDVfQ1RYIG07Ci0gICAgICAgIE1ENV9Jbml0KCZtKTsKLSAgICAgICAgTUQ1X1VwZGF0ZSgmbSwgcy5jX3N0cigpLCBzLnNpemUoKSk7Ci0KLSAgICAgICAgdWludDhfdCBrZXlbMTZdOwotICAgICAgICBNRDVfRmluYWwoa2V5LCAmbSk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxNjsgKytpKSB7Ci0gICAgICAgICAgICBjaGFyIG5pYmJsZSA9IGtleVtpXSA+PiA0OwotICAgICAgICAgICAgaWYgKG5pYmJsZSA8PSA5KSB7Ci0gICAgICAgICAgICAgICAgbmliYmxlICs9ICcwJzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmliYmxlICs9ICdhJyAtIDEwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LT5hcHBlbmQoJm5pYmJsZSwgMSk7Ci0KLSAgICAgICAgICAgIG5pYmJsZSA9IGtleVtpXSAmIDB4MGY7Ci0gICAgICAgICAgICBpZiAobmliYmxlIDw9IDkpIHsKLSAgICAgICAgICAgICAgICBuaWJibGUgKz0gJzAnOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuaWJibGUgKz0gJ2EnIC0gMTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQtPmFwcGVuZCgmbmliYmxlLCAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgYXV0aGVudGljYXRlKGNvbnN0IHNwPEFSVFNQUmVzcG9uc2U+ICZyZXNwb25zZSkgewotICAgICAgICBzc2l6ZV90IGkgPSByZXNwb25zZS0+bUhlYWRlcnMuaW5kZXhPZktleSgid3d3LWF1dGhlbnRpY2F0ZSIpOwotICAgICAgICBDSEVDS19HRShpLCAwKTsKLQotICAgICAgICBBU3RyaW5nIHZhbHVlID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7Ci0KLSAgICAgICAgaWYgKCFzdHJuY21wKHZhbHVlLmNfc3RyKCksICJCYXNpYyIsIDUpKSB7Ci0gICAgICAgICAgICBtQXV0aFR5cGUgPSBCQVNJQzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENIRUNLKCFzdHJuY21wKHZhbHVlLmNfc3RyKCksICJEaWdlc3QiLCA2KSk7Ci0gICAgICAgICAgICBtQXV0aFR5cGUgPSBESUdFU1Q7Ci0KLSAgICAgICAgICAgIGkgPSB2YWx1ZS5maW5kKCJub25jZT0iKTsKLSAgICAgICAgICAgIENIRUNLX0dFKGksIDApOwotICAgICAgICAgICAgQ0hFQ0tfRVEodmFsdWUuY19zdHIoKVtpICsgNl0sICdcIicpOwotICAgICAgICAgICAgc3NpemVfdCBqID0gdmFsdWUuZmluZCgiXCIiLCBpICsgNyk7Ci0gICAgICAgICAgICBDSEVDS19HRShqLCAwKTsKLQotICAgICAgICAgICAgbU5vbmNlLnNldFRvKHZhbHVlLCBpICsgNywgaiAtIGkgLSA3KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlzc3VlQW5ub3VuY2UoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEF1dGhlbnRpY2F0aW9uKAotICAgICAgICAgICAgQVN0cmluZyAqcmVxdWVzdCwgY29uc3QgY2hhciAqbWV0aG9kLCBjb25zdCBjaGFyICp1cmwpIHsKLSAgICAgICAgaWYgKG1BdXRoVHlwZSA9PSBOT05FKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUF1dGhUeXBlID09IEJBU0lDKSB7Ci0gICAgICAgICAgICByZXF1ZXN0LT5hcHBlbmQoIkF1dGhvcml6YXRpb246IEJhc2ljIFltTmhjM1E2ZEdWemRBbz1cclxuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBDSEVDS19FUSgoaW50KW1BdXRoVHlwZSwgKGludClESUdFU1QpOwotCi0gICAgICAgIEFTdHJpbmcgQTE7Ci0gICAgICAgIEExLmFwcGVuZChVU0VSTkFNRSk7Ci0gICAgICAgIEExLmFwcGVuZCgiOiIpOwotICAgICAgICBBMS5hcHBlbmQoIlN0cmVhbWluZyBTZXJ2ZXIiKTsKLSAgICAgICAgQTEuYXBwZW5kKCI6Iik7Ci0gICAgICAgIEExLmFwcGVuZChQQVNTV09SRCk7Ci0KLSAgICAgICAgQVN0cmluZyBBMjsKLSAgICAgICAgQTIuYXBwZW5kKG1ldGhvZCk7Ci0gICAgICAgIEEyLmFwcGVuZCgiOiIpOwotICAgICAgICBBMi5hcHBlbmQodXJsKTsKLQotICAgICAgICBBU3RyaW5nIEhBMSwgSEEyOwotICAgICAgICBIKEExLCAmSEExKTsKLSAgICAgICAgSChBMiwgJkhBMik7Ci0KLSAgICAgICAgQVN0cmluZyB0bXA7Ci0gICAgICAgIHRtcC5hcHBlbmQoSEExKTsKLSAgICAgICAgdG1wLmFwcGVuZCgiOiIpOwotICAgICAgICB0bXAuYXBwZW5kKG1Ob25jZSk7Ci0gICAgICAgIHRtcC5hcHBlbmQoIjoiKTsKLSAgICAgICAgdG1wLmFwcGVuZChIQTIpOwotCi0gICAgICAgIEFTdHJpbmcgZGlnZXN0OwotICAgICAgICBIKHRtcCwgJmRpZ2VzdCk7Ci0KLSAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJBdXRob3JpemF0aW9uOiBEaWdlc3QgIik7Ci0gICAgICAgIHJlcXVlc3QtPmFwcGVuZCgibm9uY2U9XCIiKTsKLSAgICAgICAgcmVxdWVzdC0+YXBwZW5kKG1Ob25jZSk7Ci0gICAgICAgIHJlcXVlc3QtPmFwcGVuZCgiXCIsICIpOwotICAgICAgICByZXF1ZXN0LT5hcHBlbmQoInVzZXJuYW1lPVwiIiBVU0VSTkFNRSAiXCIsICIpOwotICAgICAgICByZXF1ZXN0LT5hcHBlbmQoInVyaT1cIiIpOwotICAgICAgICByZXF1ZXN0LT5hcHBlbmQodXJsKTsKLSAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJcIiwgIik7Ci0gICAgICAgIHJlcXVlc3QtPmFwcGVuZCgicmVzcG9uc2U9XCIiKTsKLSAgICAgICAgcmVxdWVzdC0+YXBwZW5kKGRpZ2VzdCk7Ci0gICAgICAgIHJlcXVlc3QtPmFwcGVuZCgiXCIiKTsKLSAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJcclxuIik7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKLSAgICAgICAgICAgIGNhc2UgJ2Nvbm4nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7Ci0KLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgImNvbm5lY3Rpb24gcmVxdWVzdCBjb21wbGV0ZWQgd2l0aCByZXN1bHQgIgotICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0IDw8ICIgKCIgPDwgc3RyZXJyb3IoLXJlc3VsdCkgPDwgIikiOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgdGhpcykpLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlcnZlci1pcCIsIChpbnQzMl90ICopJm1TZXJ2ZXJJUCkpOwotCi0gICAgICAgICAgICAgICAgaXNzdWVBbm5vdW5jZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlICdhbm5vJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOwotCi0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJBTk5PVU5DRSBjb21wbGV0ZWQgd2l0aCByZXN1bHQgIgotICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0IDw8ICIgKCIgPDwgc3RyZXJyb3IoLXJlc3VsdCkgPDwgIikiOwotCi0gICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgicmVzcG9uc2UiLCAmb2JqKSk7Ci0gICAgICAgICAgICAgICAgc3A8QVJUU1BSZXNwb25zZT4gcmVzcG9uc2U7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gc3RhdGljX2Nhc3Q8QVJUU1BSZXNwb25zZSAqPihvYmouZ2V0KCkpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXNwb25zZSAhPSBOVUxMKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UtPm1TdGF0dXNDb2RlID09IDQwMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdXRoVHlwZSAhPSBOT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJGQUlMRUQgdG8gYXV0aGVudGljYXRlIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgdGhpcykpLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZShyZXNwb25zZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0sgfHwgcmVzcG9uc2UtPm1TdGF0dXNDb2RlICE9IDIwMCkgewotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgdGhpcykpLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJ0cFBvcnQ7Ci0gICAgICAgICAgICAgICAgQVJUUENvbm5lY3Rpb246Ok1ha2VQb3J0UGFpcigmbVJUUFNvY2tldCwgJm1SVENQU29ja2V0LCAmcnRwUG9ydCk7Ci0KLSAgICAgICAgICAgICAgICAvLyAobmV3IEFNZXNzYWdlKCdwb2xsJywgdGhpcykpLT5wb3N0KCk7Ci0KLSAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlNFVFVQICIpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1UcmFja1VSTCk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKLQotICAgICAgICAgICAgICAgIGFkZEF1dGhlbnRpY2F0aW9uKCZyZXF1ZXN0LCAiU0VUVVAiLCBtVHJhY2tVUkwuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiVHJhbnNwb3J0OiBSVFAvQVZQO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9Iik7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQocnRwUG9ydCk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIi0iKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChydHBQb3J0ICsgMSk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIjttb2RlPXJlY29yZFxyXG4iKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZXR1JywgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0jaWYgMAotICAgICAgICAgICAgY2FzZSAncG9sbCc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmRfc2V0IHJzOwotICAgICAgICAgICAgICAgIEZEX1pFUk8oJnJzKTsKLSAgICAgICAgICAgICAgICBGRF9TRVQobVJUQ1BTb2NrZXQsICZycyk7Ci0KLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICAgICAgICAgICAgICB0di50dl9zZWMgPSAwOwotICAgICAgICAgICAgICAgIHR2LnR2X3VzZWMgPSAwOwotCi0gICAgICAgICAgICAgICAgaW50IHJlcyA9IHNlbGVjdChtUlRDUFNvY2tldCArIDEsICZycywgTlVMTCwgTlVMTCwgJnR2KTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcig2NTUzNik7Ci0gICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbiA9IHJlY3YobVJUQ1BTb2NrZXQsIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSwgMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG4gPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicmVjdiByZXR1cm5lZCAiIDw8IG47Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgInJlY3YgcmV0dXJuZWQgIiA8PCBuIDw8ICIgYnl0ZXMgb2YgZGF0YS4iOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBuKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1zZy0+cG9zdCg1MDAwMCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgY2FzZSAnc2V0dSc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKLQotICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiU0VUVVAgY29tcGxldGVkIHdpdGggcmVzdWx0ICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKLQotICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInJlc3BvbnNlIiwgJm9iaikpOwotICAgICAgICAgICAgICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHN0YXRpY19jYXN0PEFSVFNQUmVzcG9uc2UgKj4ob2JqLmdldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzcG9uc2UgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSyB8fCByZXNwb25zZS0+bVN0YXR1c0NvZGUgIT0gMjAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCB0aGlzKSktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3NpemVfdCBpID0gcmVzcG9uc2UtPm1IZWFkZXJzLmluZGV4T2ZLZXkoInNlc3Npb24iKTsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShpLCAwKTsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbklEID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgaSA9IG1TZXNzaW9uSUQuZmluZCgiOyIpOwotICAgICAgICAgICAgICAgIGlmIChpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG9wdGlvbnMsIGkuZS4gIjt0aW1lb3V0PTkwIgotICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklELmVyYXNlKGksIG1TZXNzaW9uSUQuc2l6ZSgpIC0gaSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaSA9IHJlc3BvbnNlLT5tSGVhZGVycy5pbmRleE9mS2V5KCJ0cmFuc3BvcnQiKTsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShpLCAwKTsKLSAgICAgICAgICAgICAgICBBU3RyaW5nIHRyYW5zcG9ydCA9IHJlc3BvbnNlLT5tSGVhZGVycy52YWx1ZUF0KGkpOwotCi0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJ0cmFuc3BvcnQgPSAnIiA8PCB0cmFuc3BvcnQgPDwgIiciOwotCi0gICAgICAgICAgICAgICAgQVN0cmluZyB2YWx1ZTsKLSAgICAgICAgICAgICAgICBDSEVDSyhHZXRBdHRyaWJ1dGUodHJhbnNwb3J0LmNfc3RyKCksICJzZXJ2ZXJfcG9ydCIsICZ2YWx1ZSkpOwotCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgcnRwUG9ydCwgcnRjcFBvcnQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoc3NjYW5mKHZhbHVlLmNfc3RyKCksICIldS0ldSIsICZydHBQb3J0LCAmcnRjcFBvcnQpLCAyKTsKLQotICAgICAgICAgICAgICAgIENIRUNLKEdldEF0dHJpYnV0ZSh0cmFuc3BvcnQuY19zdHIoKSwgInNvdXJjZSIsICZ2YWx1ZSkpOwotCi0gICAgICAgICAgICAgICAgbWVtc2V0KG1SZW1vdGVBZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YobVJlbW90ZUFkZHIuc2luX3plcm8pKTsKLSAgICAgICAgICAgICAgICBtUmVtb3RlQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICAgICAgICAgICAgICBtUmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIodmFsdWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUFkZHIuc2luX3BvcnQgPSBodG9ucyhydHBQb3J0KTsKLQotICAgICAgICAgICAgICAgIG1SZW1vdGVSVENQQWRkciA9IG1SZW1vdGVBZGRyOwotICAgICAgICAgICAgICAgIG1SZW1vdGVSVENQQWRkci5zaW5fcG9ydCA9IGh0b25zKHJ0cFBvcnQgKyAxKTsKLQotICAgICAgICAgICAgICAgIENIRUNLX0VRKDAsIGNvbm5lY3QobVJUUFNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmbVJlbW90ZUFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobVJlbW90ZUFkZHIpKSk7Ci0KLSAgICAgICAgICAgICAgICBDSEVDS19FUSgwLCBjb25uZWN0KG1SVENQU29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZtUmVtb3RlUlRDUEFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobVJlbW90ZVJUQ1BBZGRyKSkpOwotCi0gICAgICAgICAgICAgICAgdWludDMyX3QgeCA9IG50b2hsKG1SZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJzZW5kaW5nIGRhdGEgdG8gIgotICAgICAgICAgICAgICAgICAgICAgPDwgKHggPj4gMjQpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiLiIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICgoeCA+PiAxNikgJiAweGZmKQotICAgICAgICAgICAgICAgICAgICAgPDwgIi4iCi0gICAgICAgICAgICAgICAgICAgICA8PCAoKHggPj4gOCkgJiAweGZmKQotICAgICAgICAgICAgICAgICAgICAgPDwgIi4iCi0gICAgICAgICAgICAgICAgICAgICA8PCAoeCAmIDB4ZmYpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiOiIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHJ0cFBvcnQ7Ci0KLSAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlJFQ09SRCAiKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU3RyZWFtVVJMKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIFJUU1AvMS4wXHJcbiIpOwotCi0gICAgICAgICAgICAgICAgYWRkQXV0aGVudGljYXRpb24oJnJlcXVlc3QsICJSRUNPUkQiLCBtU3RyZWFtVVJMLmNfc3RyKCkpOwotCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlNlc3Npb246ICIpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncmVjbycsIHRoaXMpOwotICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAncmVjbyc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKLQotICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiUkVDT1JEIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAiCi0gICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7Ci0KLSAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJyZXNwb25zZSIsICZvYmopKTsKLSAgICAgICAgICAgICAgICBzcDxBUlRTUFJlc3BvbnNlPiByZXNwb25zZTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBzdGF0aWNfY2FzdDxBUlRTUFJlc3BvbnNlICo+KG9iai5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3BvbnNlICE9IE5VTEwpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdtb3JlJywgdGhpcykpLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnc3IgICcsIHRoaXMpKS0+cG9zdCgpOwotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2FsaXYnLCB0aGlzKSktPnBvc3QoMzAwMDAwMDBsbCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgJ2FsaXYnOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghbUNvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIk9QVElPTlMgIik7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVN0cmVhbVVSTCk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKLQotICAgICAgICAgICAgICAgIGFkZEF1dGhlbnRpY2F0aW9uKCZyZXF1ZXN0LCAiUkVDT1JEIiwgbVN0cmVhbVVSTC5jX3N0cigpKTsKLQotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJTZXNzaW9uOiAiKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ29wdHMnLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgJ29wdHMnOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7Ci0KLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIk9QVElPTlMgY29tcGxldGVkIHdpdGggcmVzdWx0ICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKLQotICAgICAgICAgICAgICAgIGlmICghbUNvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhbGl2JywgdGhpcykpLT5wb3N0KDMwMDAwMDAwbGwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlICdtb3JlJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1Db25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoNjU1MzYpOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgICAgICBkYXRhWzBdID0gMHg4MDsKLSAgICAgICAgICAgICAgICBkYXRhWzFdID0gKDEgPDwgNykgfCBQVDsgIC8vIE0tYml0Ci0gICAgICAgICAgICAgICAgZGF0YVsyXSA9IChtU2VxTm8gPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgICAgIGRhdGFbM10gPSBtU2VxTm8gJiAweGZmOwotICAgICAgICAgICAgICAgIGRhdGFbOF0gPSBtU291cmNlSUQgPj4gMjQ7Ci0gICAgICAgICAgICAgICAgZGF0YVs5XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKLSAgICAgICAgICAgICAgICBkYXRhWzEwXSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgICAgIGRhdGFbMTFdID0gbVNvdXJjZUlEICYgMHhmZjsKLQotI2lmZGVmIEFORFJPSUQKLSAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWYgPSBOVUxMOwotICAgICAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUVuY29kZXItPnJlYWQoJm1lZGlhQnVmKSwgKHN0YXR1c190KU9LKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgICAgICAgICBDSEVDSyhtZWRpYUJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotCi0gICAgICAgICAgICAgICAgdWludDMyX3QgcnRwVGltZSA9IG1SVFBUaW1lQmFzZSArICh0aW1lVXMgKiA5IC8gMTAwbGwpOwotCi0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWVkaWFEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltZWRpYUJ1Zi0+ZGF0YSgpICsgbWVkaWFCdWYtPnJhbmdlX29mZnNldCgpOwotCi0gICAgICAgICAgICAgICAgQ0hFQ0soIW1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIG1lZGlhRGF0YSwgNCkpOwotCi0gICAgICAgICAgICAgICAgQ0hFQ0tfTEUobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpIC0gNCArIDEyLCBidWZmZXItPnNpemUoKSk7Ci0KLSAgICAgICAgICAgICAgICBtZW1jcHkoJmRhdGFbMTJdLAotICAgICAgICAgICAgICAgICAgICAgICBtZWRpYURhdGEgKyA0LCBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA0KTsKLQotICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpIC0gNCArIDEyKTsKLQotICAgICAgICAgICAgICAgIG1lZGlhQnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbWVkaWFCdWYgPSBOVUxMOwotI2Vsc2UKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgbU51bVJUUFNlbnQgKiAxMjg7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KCZkYXRhWzEyXSwgMCwgMTI4KTsKLSAgICAgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDEyICsgMTI4KTsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgZGF0YVs0XSA9IHJ0cFRpbWUgPj4gMjQ7Ci0gICAgICAgICAgICAgICAgZGF0YVs1XSA9IChydHBUaW1lID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgZGF0YVs2XSA9IChydHBUaW1lID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgICAgICBkYXRhWzddID0gcnRwVGltZSAmIDB4ZmY7Ci0KLSAgICAgICAgICAgICAgICBzc2l6ZV90IG4gPSBzZW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJUUFNvY2tldCwgZGF0YSwgYnVmZmVyLT5zaXplKCksIDApOwotICAgICAgICAgICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJzZW5kIGZhaWxlZCAoIiA8PCBzdHJlcnJvcihlcnJubykgPDwgIikiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDSEVDS19FUShuLCAoc3NpemVfdClidWZmZXItPnNpemUoKSk7Ci0KLSAgICAgICAgICAgICAgICArK21TZXFObzsKLQotICAgICAgICAgICAgICAgICsrbU51bVJUUFNlbnQ7Ci0gICAgICAgICAgICAgICAgbU51bVJUUE9jdGV0c1NlbnQgKz0gYnVmZmVyLT5zaXplKCkgLSAxMjsKLQotICAgICAgICAgICAgICAgIG1MYXN0UlRQVGltZSA9IHJ0cFRpbWU7Ci0gICAgICAgICAgICAgICAgbUxhc3ROVFBUaW1lID0gbnRwVGltZSgpOwotCi0jaWZkZWYgQU5EUk9JRAotICAgICAgICAgICAgICAgIGlmIChtTnVtUlRQU2VudCA8IDYwICogMjUpIHsgIC8vIDYwIHNlY3Mgd29ydGgKLSAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KDQwMDAwKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgaWYgKG1OdW1SVFBPY3RldHNTZW50IDwgODAwMCAqIDYwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwgKiAxMjggLyA4MDAwKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiVGhhdCdzIGVub3VnaCwgcGF1c2luZy4iOwotCi0gICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlBBVVNFICIpOwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU3RyZWFtVVJMKTsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKLQotICAgICAgICAgICAgICAgICAgICBhZGRBdXRoZW50aWNhdGlvbigmcmVxdWVzdCwgIlBBVVNFIiwgbVN0cmVhbVVSTC5jX3N0cigpKTsKLQotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiU2Vzc2lvbjogIik7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotCi0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncGF1cycsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlICdzciAgJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1Db25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoNjU1MzYpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7Ci0KLSAgICAgICAgICAgICAgICBhZGRTUihidWZmZXIpOwotICAgICAgICAgICAgICAgIGFkZFNERVMoYnVmZmVyKTsKLQotICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IG4gPSBzZW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJUQ1BTb2NrZXQsIGRhdGEsIGJ1ZmZlci0+c2l6ZSgpLCAwKTsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShuLCAoc3NpemVfdClidWZmZXItPnNpemUoKSk7Ci0KLSAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMzAwMDAwMCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgJ3BhdXMnOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7Ci0KLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlBBVVNFIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAiCi0gICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7Ci0KLSAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJyZXNwb25zZSIsICZvYmopKTsKLSAgICAgICAgICAgICAgICBzcDxBUlRTUFJlc3BvbnNlPiByZXNwb25zZTsKLQotICAgICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiVEVBUkRPV04gIik7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVN0cmVhbVVSTCk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKLQotICAgICAgICAgICAgICAgIGFkZEF1dGhlbnRpY2F0aW9uKCZyZXF1ZXN0LCAiVEVBUkRPV04iLCBtU3RyZWFtVVJMLmNfc3RyKCkpOwotCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlNlc3Npb246ICIpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgndGVhcicsIHRoaXMpOwotICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAndGVhcic6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKLQotICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiVEVBUkRPV04gY29tcGxldGVkIHdpdGggcmVzdWx0ICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKLQotICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInJlc3BvbnNlIiwgJm9iaikpOwotICAgICAgICAgICAgICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHN0YXRpY19jYXN0PEFSVFNQUmVzcG9uc2UgKj4ob2JqLmdldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzcG9uc2UgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlICdkaXNjJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgImRpc2Nvbm5lY3QgY29tcGxldGVkIjsKLQotICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgdGhpcykpLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgJ3F1aXQnOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uLT5kaXNjb25uZWN0KG5ldyBBTWVzc2FnZSgnZGlzYycsIHRoaXMpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1SVFBTb2NrZXQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZShtUlRQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgbVJUUFNvY2tldCA9IC0xOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtUlRDUFNvY2tldCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlKG1SVENQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgbVJUQ1BTb2NrZXQgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSNpZmRlZiBBTkRST0lECi0gICAgICAgICAgICAgICAgbUVuY29kZXItPnN0b3AoKTsKLSAgICAgICAgICAgICAgICBtRW5jb2Rlci5jbGVhcigpOwotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBtTG9vcGVyLT5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICAgICAgfQotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk15VHJhbnNtaXR0ZXIoKSB7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGVudW0gQXV0aFR5cGUgewotICAgICAgICBOT05FLAotICAgICAgICBCQVNJQywKLSAgICAgICAgRElHRVNUCi0gICAgfTsKLQotICAgIEFTdHJpbmcgbVNlcnZlclVSTDsKLSAgICBBU3RyaW5nIG1UcmFja1VSTDsKLSAgICBBU3RyaW5nIG1TdHJlYW1VUkw7Ci0KLSAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwotICAgIHNwPEFSVFNQQ29ubmVjdGlvbj4gbUNvbm47Ci0gICAgYm9vbCBtQ29ubmVjdGVkOwotICAgIHVpbnQzMl90IG1TZXJ2ZXJJUDsKLSAgICBBdXRoVHlwZSBtQXV0aFR5cGU7Ci0gICAgQVN0cmluZyBtTm9uY2U7Ci0gICAgQVN0cmluZyBtU2Vzc2lvbklEOwotICAgIGludCBtUlRQU29ja2V0LCBtUlRDUFNvY2tldDsKLSAgICB1aW50MzJfdCBtU291cmNlSUQ7Ci0gICAgdWludDMyX3QgbVNlcU5vOwotICAgIHVpbnQzMl90IG1SVFBUaW1lQmFzZTsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbVJlbW90ZUFkZHI7Ci0gICAgc3RydWN0IHNvY2thZGRyX2luIG1SZW1vdGVSVENQQWRkcjsKLSAgICBzaXplX3QgbU51bVNhbXBsZXNTZW50OwotICAgIHVpbnQzMl90IG1OdW1SVFBTZW50OwotICAgIHVpbnQzMl90IG1OdW1SVFBPY3RldHNTZW50OwotICAgIHVpbnQzMl90IG1MYXN0UlRQVGltZTsKLSAgICB1aW50NjRfdCBtTGFzdE5UUFRpbWU7Ci0KLSNpZmRlZiBBTkRST0lECi0gICAgc3A8TWVkaWFTb3VyY2U+IG1FbmNvZGVyOwotICAgIEFTdHJpbmcgbVNlcVBhcmFtU2V0OwotICAgIEFTdHJpbmcgbVBpY1BhcmFtU2V0OwotCi0gICAgdm9pZCBtYWtlSDI2NFNQcm9wUGFyYW1TZXRzKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIga1N0YXJ0Q29kZVtdID0gIlx4MDBceDAwXHgwMFx4MDEiOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQotICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0gICAgICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLQotICAgICAgICBDSEVDS19HRShzaXplLCAwdSk7Ci0gICAgICAgIENIRUNLKCFtZW1jbXAoa1N0YXJ0Q29kZSwgZGF0YSwgNCkpOwotCi0gICAgICAgIGRhdGEgKz0gNDsKLSAgICAgICAgc2l6ZSAtPSA0OwotCi0gICAgICAgIHNpemVfdCBzdGFydENvZGVQb3MgPSAwOwotICAgICAgICB3aGlsZSAoc3RhcnRDb2RlUG9zICsgMyA8IHNpemUKLSAgICAgICAgICAgICAgICAmJiBtZW1jbXAoa1N0YXJ0Q29kZSwgJmRhdGFbc3RhcnRDb2RlUG9zXSwgNCkpIHsKLSAgICAgICAgICAgICsrc3RhcnRDb2RlUG9zOwotICAgICAgICB9Ci0KLSAgICAgICAgQ0hFQ0tfTFQoc3RhcnRDb2RlUG9zICsgMywgc2l6ZSk7Ci0KLSAgICAgICAgZW5jb2RlQmFzZTY0KGRhdGEsIHN0YXJ0Q29kZVBvcywgJm1TZXFQYXJhbVNldCk7Ci0KLSAgICAgICAgZW5jb2RlQmFzZTY0KCZkYXRhW3N0YXJ0Q29kZVBvcyArIDRdLCBzaXplIC0gc3RhcnRDb2RlUG9zIC0gNCwKLSAgICAgICAgICAgICAgICAgICAgICZtUGljUGFyYW1TZXQpOwotICAgIH0KLSNlbmRpZgotCi0gICAgdm9pZCBhZGRTUihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7Ci0gICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpOwotCi0gICAgICAgIGRhdGFbMF0gPSAweDgwIHwgMDsKLSAgICAgICAgZGF0YVsxXSA9IDIwMDsgIC8vIFNSCi0gICAgICAgIGRhdGFbMl0gPSAwOwotICAgICAgICBkYXRhWzNdID0gNjsKLSAgICAgICAgZGF0YVs0XSA9IG1Tb3VyY2VJRCA+PiAyNDsKLSAgICAgICAgZGF0YVs1XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKLSAgICAgICAgZGF0YVs2XSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOwotICAgICAgICBkYXRhWzddID0gbVNvdXJjZUlEICYgMHhmZjsKLQotICAgICAgICBkYXRhWzhdID0gbUxhc3ROVFBUaW1lID4+ICg2NCAtIDgpOwotICAgICAgICBkYXRhWzldID0gKG1MYXN0TlRQVGltZSA+PiAoNjQgLSAxNikpICYgMHhmZjsKLSAgICAgICAgZGF0YVsxMF0gPSAobUxhc3ROVFBUaW1lID4+ICg2NCAtIDI0KSkgJiAweGZmOwotICAgICAgICBkYXRhWzExXSA9IChtTGFzdE5UUFRpbWUgPj4gMzIpICYgMHhmZjsKLSAgICAgICAgZGF0YVsxMl0gPSAobUxhc3ROVFBUaW1lID4+IDI0KSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbMTNdID0gKG1MYXN0TlRQVGltZSA+PiAxNikgJiAweGZmOwotICAgICAgICBkYXRhWzE0XSA9IChtTGFzdE5UUFRpbWUgPj4gOCkgJiAweGZmOwotICAgICAgICBkYXRhWzE1XSA9IG1MYXN0TlRQVGltZSAmIDB4ZmY7Ci0KLSAgICAgICAgZGF0YVsxNl0gPSAobUxhc3RSVFBUaW1lID4+IDI0KSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbMTddID0gKG1MYXN0UlRQVGltZSA+PiAxNikgJiAweGZmOwotICAgICAgICBkYXRhWzE4XSA9IChtTGFzdFJUUFRpbWUgPj4gOCkgJiAweGZmOwotICAgICAgICBkYXRhWzE5XSA9IG1MYXN0UlRQVGltZSAmIDB4ZmY7Ci0KLSAgICAgICAgZGF0YVsyMF0gPSBtTnVtUlRQU2VudCA+PiAyNDsKLSAgICAgICAgZGF0YVsyMV0gPSAobU51bVJUUFNlbnQgPj4gMTYpICYgMHhmZjsKLSAgICAgICAgZGF0YVsyMl0gPSAobU51bVJUUFNlbnQgPj4gOCkgJiAweGZmOwotICAgICAgICBkYXRhWzIzXSA9IG1OdW1SVFBTZW50ICYgMHhmZjsKLQotICAgICAgICBkYXRhWzI0XSA9IG1OdW1SVFBPY3RldHNTZW50ID4+IDI0OwotICAgICAgICBkYXRhWzI1XSA9IChtTnVtUlRQT2N0ZXRzU2VudCA+PiAxNikgJiAweGZmOwotICAgICAgICBkYXRhWzI2XSA9IChtTnVtUlRQT2N0ZXRzU2VudCA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgIGRhdGFbMjddID0gbU51bVJUUE9jdGV0c1NlbnQgJiAweGZmOwotCi0gICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkgKyAyOCk7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRTREVTKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKLSAgICAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCk7Ci0gICAgICAgIGRhdGFbMF0gPSAweDgwIHwgMTsKLSAgICAgICAgZGF0YVsxXSA9IDIwMjsgIC8vIFNERVMKLSAgICAgICAgZGF0YVs0XSA9IG1Tb3VyY2VJRCA+PiAyNDsKLSAgICAgICAgZGF0YVs1XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKLSAgICAgICAgZGF0YVs2XSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOwotICAgICAgICBkYXRhWzddID0gbVNvdXJjZUlEICYgMHhmZjsKLQotICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gODsKLQotICAgICAgICBkYXRhW29mZnNldCsrXSA9IDE7ICAvLyBDTkFNRQotCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICprQ05BTUUgPSAiYW5kaWhAbGFwdG9wIjsKLSAgICAgICAgZGF0YVtvZmZzZXQrK10gPSBzdHJsZW4oa0NOQU1FKTsKLQotICAgICAgICBtZW1jcHkoJmRhdGFbb2Zmc2V0XSwga0NOQU1FLCBzdHJsZW4oa0NOQU1FKSk7Ci0gICAgICAgIG9mZnNldCArPSBzdHJsZW4oa0NOQU1FKTsKLQotICAgICAgICBkYXRhW29mZnNldCsrXSA9IDc7ICAvLyBOT1RFCi0KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtOT1RFID0gIkhlbGwncyBmcm96ZW4gb3Zlci4iOwotICAgICAgICBkYXRhW29mZnNldCsrXSA9IHN0cmxlbihrTk9URSk7Ci0KLSAgICAgICAgbWVtY3B5KCZkYXRhW29mZnNldF0sIGtOT1RFLCBzdHJsZW4oa05PVEUpKTsKLSAgICAgICAgb2Zmc2V0ICs9IHN0cmxlbihrTk9URSk7Ci0KLSAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOwotCi0gICAgICAgIGlmICgob2Zmc2V0ICUgNCkgPiAwKSB7Ci0gICAgICAgICAgICBzaXplX3QgY291bnQgPSA0IC0gKG9mZnNldCAlIDQpOwotICAgICAgICAgICAgc3dpdGNoIChjb3VudCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IG51bVdvcmRzID0gKG9mZnNldCAvIDQpIC0gMTsKLSAgICAgICAgZGF0YVsyXSA9IG51bVdvcmRzID4+IDg7Ci0gICAgICAgIGRhdGFbM10gPSBudW1Xb3JkcyAmIDB4ZmY7Ci0KLSAgICAgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSArIG9mZnNldCk7Ci0gICAgfQotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXlUcmFuc21pdHRlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1ZX1RSQU5TTUlUVEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAKaW5kZXggYzA1M2JlOC4uZThlYzY0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcApAQCAtMjAsNyArMjAsNyBAQAogI2RlZmluZSBMT0dfVEFHICJOZXR3b3JrVXRpbHMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJOZXR3b3JrVXRpbHMuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oPgogI2luY2x1ZGUgPGN1dGlscy9xdGFndWlkLmg+CiAjaW5jbHVkZSA8TmV0ZENsaWVudC5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHNGb3JBcHBQcm9jLmNwcAppbmRleCA2NjIxNTljLi4zMGZjMzhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiTmV0d29ya1V0aWxzIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuaD4KIAogLy8gTmV0d29ya1V0aWxzIGltcGxlbWVudGF0aW9uIGZvciBhcHBsaWNhdGlvbiBwcm9jZXNzLgogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9RdWFsTWFuYWdlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1F1YWxNYW5hZ2VyLmNwcAppbmRleCAzN2FhMzI2Li5mMWY4MjIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1F1YWxNYW5hZ2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1F1YWxNYW5hZ2VyLmNwcApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiUXVhbE1hbmFnZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL1F1YWxNYW5hZ2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCmluZGV4IGUyMzYyNjcuLjhjZDMzY2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKQEAgLTE4LDkgKzE4LDEwIEBACiAjZGVmaW5lIExPR19UQUcgIlNEUExvYWRlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgImluY2x1ZGUvU0RQTG9hZGVyLmgiCisvLyAjaW5jbHVkZSAiaW5jbHVkZS9TRFBMb2FkZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5oPgogCi0jaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oPgogCiAjaW5jbHVkZSA8ZGF0YXNvdXJjZS9NZWRpYUhUVFAuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5jcHAKaW5kZXggNWM2ODVhMS4uNGU4MTJmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmNwcApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJVRFBQdXNoZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJVRFBQdXNoZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFNUkFzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQUFNUkFzc2VtYmxlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBTVJBc3NlbWJsZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQUFNUkFzc2VtYmxlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQUgyNjNBc3NlbWJsZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5oCnNpbWlsYXJpdHkgaW5kZXggODElCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmgKaW5kZXggZjk1OWM0MC4uMzkxNjFiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5oCkBAIC0xMDUsNiArMTA1LDI3IEBACiAgICAgICAgICAgICAobG9uZyBsb25nKXJ0cCwgKGxvbmcgbG9uZylwbGF5LCAobG9uZyBsb25nKWV4cCwgaXNFeHApOwogfQogCitzdHJ1Y3QgUmVjZXB0aW9uUmVwb3J0QmxvY2sgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgdWludDMyX3Qgc3NyYzsgICAgICAgLy8gc3NyYyBvZiBkYXRhIHNvdXJjZSBiZWluZyByZXBvcnRlZAorICAgIHVpbnQzMl90IGZyYWN0aW9uOyAgIC8vIGZyYWN0aW9uIGxvc3Qgc2luY2UgbGFzdCBTUi9SUgorICAgIGludDMyX3QgbG9zdDsgICAgICAgIC8vIGN1bXVsLiBuby4gcGt0cyBsb3N0IChzaWduZWQhKQorICAgIHVpbnQzMl90IGxhc3RTZXE7ICAgIC8vIGV4dGVuZGVkIGxhc3Qgc2VxLiBuby4gcmVjZWl2ZWQKKyAgICB1aW50MzJfdCBqaXR0ZXI7ICAgICAvLyBpbnRlcmFycml2YWwgaml0dGVyCisgICAgdWludDMyX3QgbHNyOyAgICAgICAgLy8gbGFzdCBTUiBwYWNrZXQgZnJvbSB0aGlzIHNvdXJjZQorICAgIHVpbnQzMl90IGRsc3I7ICAgICAgIC8vIGRlbGF5IHNpbmNlIGxhc3QgU1IgcGFja2V0CisKKyAgICBSZWNlcHRpb25SZXBvcnRCbG9jayh1aW50MzJfdCBzc3JjLCB1aW50MzJfdCBmcmFjdGlvbiwgaW50MzJfdCBsb3N0LCB1aW50MzJfdCBsYXN0U2VxLAorICAgICAgICAgICAgdWludDMyX3Qgaml0dGVyLCB1aW50MzJfdCBsc3IsIHVpbnQzMl90IGRsc3IpIHsKKyAgICAgICAgdGhpcy0+c3NyYyA9IHNzcmM7CisgICAgICAgIHRoaXMtPmZyYWN0aW9uID0gZnJhY3Rpb247CisgICAgICAgIHRoaXMtPmxvc3QgPSBsb3N0OworICAgICAgICB0aGlzLT5sYXN0U2VxID0gbGFzdFNlcTsKKyAgICAgICAgdGhpcy0+aml0dGVyID0gaml0dGVyOworICAgICAgICB0aGlzLT5sc3IgPSBsc3I7CisgICAgICAgIHRoaXMtPmRsc3IgPSBkbHNyOworICAgIH0KK307CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQV9SVFBfQVNTRU1CTEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oCnNpbWlsYXJpdHkgaW5kZXggOTIlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uaAppbmRleCAzNmNjYTMxLi43M2QyODY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uaApAQCAtMTEwLDcgKzExMCwxMCBAQAogICAgIHN0YXR1c190IHBhcnNlUlRQKFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogICAgIHN0YXR1c190IHBhcnNlUlRQRXh0KFN0cmVhbUluZm8gKnMsIGNvbnN0IHVpbnQ4X3QgKmV4dERhdGEsIHNpemVfdCBleHRMZW4sIGludDMyX3QgKmN2b0RlZ3JlZXMpOwogICAgIHN0YXR1c190IHBhcnNlUlRDUChTdHJlYW1JbmZvICppbmZvLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKLSAgICBzdGF0dXNfdCBwYXJzZVNSKFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZVNlbmRlclJlcG9ydChTdHJlYW1JbmZvICppbmZvLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VSZWNlaXZlclJlcG9ydChTdHJlYW1JbmZvICppbmZvLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VSZWNlcHRpb25SZXBvcnRCbG9jayhTdHJlYW1JbmZvICppbmZvLAorICAgICAgICAgICAgaW50NjRfdCByZWN2VGltZVVzLCB1aW50MzJfdCBzZW5kZXJJZCwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IHBhcnNlVFNGQihTdHJlYW1JbmZvICppbmZvLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAgICAgc3RhdHVzX3QgcGFyc2VQU0ZCKFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKICAgICBzdGF0dXNfdCBwYXJzZUJZRShTdHJlYW1JbmZvICppbmZvLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTZXNzaW9uLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTZXNzaW9uLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmgKaW5kZXggNDk4NGU5MS4uZTliNDk0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCkBAIC0zNiw2ICszNiw3IEBACiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBBTWVzc2FnZTsKIHN0cnVjdCBBUlRQQXNzZW1ibGVyOworc3RydWN0IFJlY2VwdGlvblJlcG9ydEJsb2NrOwogc3RydWN0IEFTZXNzaW9uRGVzY3JpcHRpb247CiAKIHN0cnVjdCBBUlRQU291cmNlIDogcHVibGljIFJlZkJhc2UgewpAQCAtNTksOCArNjAsMTAgQEAKIAogICAgIHZvaWQgcHJvY2Vzc1JUUFBhY2tldChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKICAgICB2b2lkIHByb2Nlc3NSVFBQYWNrZXQoKTsKKyAgICB2b2lkIHByb2Nlc3NSZWNlcHRpb25SZXBvcnRCbG9jaygKKyAgICAgICAgICAgIGludDY0X3QgcmVjdlRpbWVVcywgdWludDMyX3Qgc2VuZGVySWQsIHNwPFJlY2VwdGlvblJlcG9ydEJsb2NrPiBycmIpOwogICAgIHZvaWQgdGltZVJlc2V0KCk7Ci0gICAgdm9pZCB0aW1lVXBkYXRlKHVpbnQzMl90IHJ0cFRpbWUsIHVpbnQ2NF90IG50cFRpbWUpOworICAgIHZvaWQgdGltZVVwZGF0ZShpbnQ2NF90IHJlY3ZUaW1lVXMsIHVpbnQzMl90IHJ0cFRpbWUsIHVpbnQ2NF90IG50cFRpbWUpOwogICAgIHZvaWQgYnllUmVjZWl2ZWQoKTsKIAogICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiAqcXVldWUoKSB7IHJldHVybiAmbVF1ZXVlOyB9CkBAIC0xMzUsNiArMTM4LDggQEAKICAgICB1aW50NjRfdCBtTGFzdFNyTnRwVGltZTsKICAgICBpbnQ2NF90IG1MYXN0U3JVcGRhdGVUaW1lVXM7CiAKKyAgICBpbnQ2NF90IG1MYXN0UnJVcGRhdGVUaW1lVXM7CisKICAgICBib29sIG1Jc0ZpcnN0UnRwUnRjcEdhcDsKICAgICBkb3VibGUgbUF2Z1J0cFJ0Y3BHYXBNczsKICAgICBkb3VibGUgbUF2Z1VuZGVybGluZURlbGF5TXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvSml0dGVyQ2FsY3VsYXRvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvSml0dGVyQ2FsY3VsYXRvci5oCnNpbWlsYXJpdHkgaW5kZXggOTAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvSml0dGVyQ2FsY3VsYXRvci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmgKaW5kZXggZmYzNmYxZi4uNGYzYjc2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvSml0dGVyQ2FsY3VsYXRvci5oCkBAIC00MCw4ICs0MCw4IEBACiAgICAgSml0dGVyQ2FsYyhpbnQzMl90IGNsb2NrUmF0ZSk7CiAKICAgICB2b2lkIGluaXQodWludDMyX3QgcnRwVGltZSwgaW50NjRfdCBhcnJpdmFsVGltZVVzLCBpbnQzMl90IGJhc2UsIGludDMyX3QgaW50ZXIpOwotICAgIHZvaWQgcHV0SW50ZXJBcnJpdmFsRGF0YShpbnQ2NF90IHJ0cFRpbWUsIGludDY0X3QgYXJyaXZhbFRpbWUpOwotICAgIHZvaWQgcHV0QmFzZURhdGEoaW50NjRfdCBydHBUaW1lLCBpbnQ2NF90IGFycml2YWxUaW1lVXMpOworICAgIHZvaWQgcHV0SW50ZXJBcnJpdmFsRGF0YSh1aW50MzJfdCBydHBUaW1lLCBpbnQ2NF90IGFycml2YWxUaW1lKTsKKyAgICB2b2lkIHB1dEJhc2VEYXRhKHVpbnQzMl90IHJ0cFRpbWUsIGludDY0X3QgYXJyaXZhbFRpbWVVcyk7CiAgICAgaW50MzJfdCBnZXRCYXNlSml0dGVyTXMoKTsKICAgICBpbnQzMl90IGdldEludGVyQXJyaXZhbEppdHRlck1zKCk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9RdWFsTWFuYWdlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9RdWFsTWFuYWdlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9RdWFsTWFuYWdlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NEUExvYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU0RQTG9hZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1RyYWZmaWNSZWNvcmRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvVHJhZmZpY1JlY29yZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVHJhZmZpY1JlY29yZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL1RyYWZmaWNSZWNvcmRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1ZpZGVvU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9WaWRlb1NvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1ZpZGVvU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ydHNwL1ZpZGVvU291cmNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvcnRwX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9ydHBfdGVzdC5jcHAKaW5kZXggNDU5MDY5OS4uYThjZDdlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9ydHBfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9ydHBfdGVzdC5jcHAKQEAgLTI3LDkgKzI3LDkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmg+CiAKLSNpbmNsdWRlICJBUlRQU2Vzc2lvbi5oIgotI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKLSNpbmNsdWRlICJVRFBQdXNoZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ydHNwL0FSVFBTZXNzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTE4Miw3ICsxODIsNyBAQAogICAgIENIRUNLX0VRKGRlY29kZXItPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CiAKICAgICBmb3IgKDs7KSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZWNvZGVyLT5yZWFkKCZidWZmZXIpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTIwMSw3ICsyMDEsNyBAQAogI2lmIDEKICAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgIT0gMCkgewogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CiAKICAgICAgICAgICAgIHByaW50ZigiZGVjb2RlciByZXR1cm5lZCBmcmFtZSBvZiBzaXplICV6dSBhdCB0aW1lICUuMmYgc2Vjc1xuIiwKICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpLCB0aW1lVXMgLyAxRTYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggYTc5OWExMy4uZTZiNjdjZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zMiwxMSArMzIsNiBAQAogICAgICAgICAibGlibG9nIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgXSwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0FuZHJvaWQuYnAKaW5kZXggOTFiZjM4NS4uN2EwYmE1MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvQW5kcm9pZC5icApAQCAtNDQsMTAgKzQ0LDYgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgIF0sCi0KICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNVbml0VGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0hFVkNVdGlsc1VuaXRUZXN0LmNwcAppbmRleCAzMjRhMDQyLi5jNDNlMWY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0hFVkNVdGlsc1VuaXRUZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0hFVkNVdGlsc1VuaXRUZXN0LmNwcApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGZzdHJlYW0+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KLSNpbmNsdWRlICJpbmNsdWRlL0hldmNVdGlscy5oIgorI2luY2x1ZGUgPEhldmNVdGlscy5oPgogCiAjaW5jbHVkZSAiSEVWQ1V0aWxzVGVzdEVudmlyb25tZW50LmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdC5jcHAKaW5kZXggMGMyMmE0Mi4uMjA3MzdkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdC5jcHAKQEAgLTIwLDExICsyMCwxMCBAQAogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAotI2luY2x1ZGUgIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmgiCi0KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmg+CiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2V4dHJhY3RvckZhY3RvcnkvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2V4dHJhY3RvckZhY3RvcnkvQW5kcm9pZC5icAppbmRleCAxM2Q1Yjg5Li5hMDY3Mjg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9leHRyYWN0b3JGYWN0b3J5L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZXh0cmFjdG9yRmFjdG9yeS9BbmRyb2lkLmJwCkBAIC01MSwxMCArNTEsNiBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgXSwKLQogICAgIC8vIFRPRE86IChiLzE1MDE4MTU4MykKICAgICBjb21waWxlX211bHRpbGliOiAiZmlyc3QiLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0FuZHJvaWQuYnAKaW5kZXggMDA5NzgzMC4uMmJjZmQ2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvQW5kcm9pZC5icApAQCAtMzIsOSArMzIsNiBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgIm1lZGlhX3Blcm1pc3Npb24tYWlkbC1jcHAiLAogICAgIF0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICBdLAogfQogCiBjY19mdXp6IHsKQEAgLTc0LDYgKzcxLDcgQEAKICAgICBzcmNzOiBbCiAgICAgICAgICJGcmFtZURlY29kZXJGdXp6ZXIuY3BwIiwKICAgICBdLAorICAgIGNvcnB1czogWyJjb3JwdXMvKiJdLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X2Z1enplcl9kZWZhdWx0cyJdLAogfQogCkBAIC04NSwxMCArODMsMTAgQEAKICAgICBdLAogICAgIGRpY3Rpb25hcnk6ICJkaWN0aW9uYXJpZXMvZm9ybWF0cy5kaWN0IiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9mdXp6ZXJfZGVmYXVsdHMiXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfd2VibV9oZWFkZXJzIiwKKyAgICBdLAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF93ZWJtIiwKICAgICAgICAgImxpYmRhdGFzb3VyY2UiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCi0gICAgICAgICJsaWJvZ2ciLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0ZyYW1lRGVjb2RlckZ1enplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0ZyYW1lRGVjb2RlckZ1enplci5jcHAKaW5kZXggYzI1MTQ3OS4uNDIxOGQyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GcmFtZURlY29kZXJGdXp6ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvRnJhbWVEZWNvZGVyRnV6emVyLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgImluY2x1ZGUvRnJhbWVEZWNvZGVyLmgiCisjaW5jbHVkZSA8RnJhbWVEZWNvZGVyLmg+CiAjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CkBAIC00NiwxMiArNDYsMTUgQEAKICAgICB9CiAKICAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpKSB7Ci0gICAgICAgIHN3aXRjaCAoZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgMykpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBkZWNvZGVyLT5pbml0KC8qZnJhbWVUaW1lVXMqLyBmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9wdGlvbiovIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50PigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb2xvckZvcm1hdCovIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50PigpKTsKKyAgICAgICAgdWludDhfdCBzd2l0Y2hDYXNlID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgMyk7CisgICAgICAgIHN3aXRjaCAoc3dpdGNoQ2FzZSkgeworICAgICAgICAgICAgY2FzZSAwOiB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcyA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKTsKKyAgICAgICAgICAgICAgICBpbnQgb3B0aW9uID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisgICAgICAgICAgICAgICAgaW50IGNvbG9yRm9ybWF0ID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisgICAgICAgICAgICAgICAgZGVjb2Rlci0+aW5pdChmcmFtZVRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgZGVjb2Rlci0+ZXh0cmFjdEZyYW1lKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0Z1enplck1lZGlhVXRpbGl0eS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0Z1enplck1lZGlhVXRpbGl0eS5jcHAKaW5kZXggODEwYWU5NS4uZDk0YzhmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GdXp6ZXJNZWRpYVV0aWxpdHkuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvRnV6emVyTWVkaWFVdGlsaXR5LmNwcApAQCAtMjMsNyArMjMsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oPgogCiAjaW5jbHVkZSAiTWVkaWFNaW1lVHlwZXMuaCIKLSNpbmNsdWRlICJ3ZWJtL1dlYm1Xcml0ZXIuaCIKKworI2luY2x1ZGUgPHdlYm0vV2VibVdyaXRlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBzdGQ6OnN0cmluZyBnZW5NaW1lVHlwZShGdXp6ZWREYXRhUHJvdmlkZXIgKmRhdGFQcm92aWRlcikgewpAQCAtMTIxLDQgKzEyMiw0IEBACiAgICAgfQogICAgIHJldHVybiB3cml0ZXI7CiB9Ci19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9jb2xvcl9mb3JtYXRfcmdiXzU2NS5kYXQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL2NvcnB1cy9jb2xvcl9mb3JtYXRfcmdiXzU2NS5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4ZTIxZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvY29ycHVzL2NvbG9yX2Zvcm1hdF9yZ2JfNTY1LmRhdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhQ29kZWNUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21lZGlhY29kZWMvTWVkaWFDb2RlY1Rlc3QuY3BwCmluZGV4IGFjMWU5YjEuLmE4ZTY0YjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21lZGlhY29kZWMvTWVkaWFDb2RlY1Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21lZGlhY29kZWMvTWVkaWFDb2RlY1Rlc3QuY3BwCkBAIC0zOTMsMyArMzkzLDUxIEBACiAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKSk7CiAgICAgbG9vcGVyLT5zdG9wKCk7CiB9CisKK1RFU1QoTWVkaWFDb2RlY1Rlc3QsIERlYWRXaGlsZVN0b3BwaW5nRXJyb3IpIHsKKyAgICAvLyBUZXN0IHNjZW5hcmlvOgorICAgIC8vCisgICAgLy8gMSkgQ2xpZW50IHRocmVhZCBjYWxscyBzdG9wKCk7IE1lZGlhQ29kZWMgbG9vcGVyIHRocmVhZCBjYWxscworICAgIC8vICAgIGluaXRpYXRlU2h1dGRvd24oKTsgc2h1dGRvd24gaXMgYmVpbmcgaGFuZGxlZCBhdCB0aGUgY29tcG9uZW50IHRocmVhZC4KKyAgICAvLyAyKSBBbiBlcnJvciBvY2N1cnMgd2hpbGUgaGFuZGxpbmcgaW5pdGlhdGVTaHV0ZG93bigpLgorICAgIC8vIDMpIE1lZGlhQ29kZWMgbG9vcGVyIHRocmVhZCBoYW5kbGVzIHRoZSBlcnJvci4KKyAgICAvLyA0KSBDb2RlYyBzZXJ2aWNlIGRpZXMgYWZ0ZXIgdGhlIGVycm9yIGlzIGhhbmRsZWQKKyAgICAvLyA1KSBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQgaGFuZGxlcyB0aGUgZGVhdGguCisKKyAgICBzdGF0aWMgY29uc3QgQVN0cmluZyBrQ29kZWNOYW1leyJ0ZXN0LmNvZGVjIn07CisgICAgc3RhdGljIGNvbnN0IEFTdHJpbmcga0NvZGVjT3duZXJ7Im5vYm9keSJ9OworICAgIHN0YXRpYyBjb25zdCBBU3RyaW5nIGtNZWRpYVR5cGV7InZpZGVvL3gtdGVzdCJ9OworCisgICAgc3A8TW9ja0NvZGVjPiBtb2NrQ29kZWM7CisgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlY0Jhc2U+KGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IGNoYXIgKm93bmVyKT4gZ2V0Q29kZWNCYXNlID0KKyAgICAgICAgWyZtb2NrQ29kZWNdKGNvbnN0IEFTdHJpbmcgJiwgY29uc3QgY2hhciAqKSB7CisgICAgICAgICAgICBtb2NrQ29kZWMgPSBuZXcgTW9ja0NvZGVjKFtdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNb2NrQnVmZmVyQ2hhbm5lbD4gJikgeworICAgICAgICAgICAgICAgIC8vIE5vIG1vY2sgc2V0dXAsIGFzIHdlIGRvbid0IGV4cGVjdCBhbnkgYnVmZmVyIG9wZXJhdGlvbnMKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIHNjZW5hcmlvLgorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBPTl9DQUxMKCptb2NrQ29kZWMsIGluaXRpYXRlQWxsb2NhdGVDb21wb25lbnQoXykpCisgICAgICAgICAgICAgICAgLldpbGxCeURlZmF1bHQoW21vY2tDb2RlY10oY29uc3Qgc3A8QU1lc3NhZ2U+ICYpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vbkNvbXBvbmVudEFsbG9jYXRlZChrQ29kZWNOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgT05fQ0FMTCgqbW9ja0NvZGVjLCBpbml0aWF0ZVNodXRkb3duKF8pKQorICAgICAgICAgICAgICAgIC5XaWxsQnlEZWZhdWx0KFttb2NrQ29kZWNdKGJvb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gMikKKyAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gNCkKKyAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vbkVycm9yKERFQURfT0JKRUNULCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICAgICAgICAgIC8vIENvZGVjIHNlcnZpY2UgaGFzIGRpZWQsIG5vIGNhbGxiYWNrLgorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIG1vY2tDb2RlYzsKKyAgICAgICAgfTsKKworICAgIHNwPEFMb29wZXI+IGxvb3BlcntuZXcgQUxvb3Blcn07CisgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBTZXR1cE1lZGlhQ29kZWMoCisgICAgICAgICAgICBrQ29kZWNPd25lciwga0NvZGVjTmFtZSwga01lZGlhVHlwZSwgbG9vcGVyLCBnZXRDb2RlY0Jhc2UpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBjb2RlYykgPDwgIkNvZGVjIG11c3Qgbm90IGJlIG51bGwiOworICAgIEFTU0VSVF9ORShudWxscHRyLCBtb2NrQ29kZWMpIDw8ICJNb2NrQ29kZWMgbXVzdCBub3QgYmUgbnVsbCI7CisKKyAgICBjb2RlYy0+c3RvcCgpOworICAgIC8vIHNsZWVwIGhlcmUgc28gdGhhdCB0aGUgbG9vcGVyIHRocmVhZCBjYW4gaGFuZGxlIHRoZSBlcnJvcgorICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpOworICAgIGxvb3Blci0+c3RvcCgpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZC5icAppbmRleCAzOGQ1ZWNjLi40OWZiNTY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZC5icApAQCAtNTIsMTAgKzUyLDYgQEAKICAgICAgICAgImxpYm9nZyIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgXSwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwCmluZGV4IDY1OTBlZjcuLjYxOWUwNmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwCkBAIC0zNSw4ICszNSwxNiBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZS90aW1lZHRleHQiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L2luY2x1ZGUvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L2luY2x1ZGUvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQuYnAKaW5kZXggMGI2MzJiZi4uYWU5N2M1MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLmJwCkBAIC0zNiwxNyArMzYsMTcgQEAKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRVbml0VGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRVbml0VGVzdC5jcHAKaW5kZXggZDg1YWUzOS4uZjkzNGI1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFVuaXRUZXN0LmNwcApAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAKLSNpbmNsdWRlICJ0aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5oIgorI2luY2x1ZGUgPHRpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmg+CiAKICNpbmNsdWRlICJUaW1lZFRleHRUZXN0RW52aXJvbm1lbnQuaCIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwCmluZGV4IDMyYTIyYmEuLjZlZDNlMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAKQEAgLTMzLDcgKzMzLDExIEBACiAgICAgICAgICJXZWJtV3JpdGVyLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUvd2VibSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmRhdGFzb3VyY2UiLApAQCAtNDQsNyArNDgsMjAgQEAKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImF2LWhlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCi0gICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIH0KKworCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF93ZWJtX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vRWJtbFV0aWwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL0VibWxVdGlsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vRWJtbFV0aWwuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vRWJtbFV0aWwuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9MaW5rZWRCbG9ja2luZ1F1ZXVlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL2luY2x1ZGUvd2VibS9MaW5rZWRCbG9ja2luZ1F1ZXVlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vTGlua2VkQmxvY2tpbmdRdWV1ZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL2luY2x1ZGUvd2VibS9MaW5rZWRCbG9ja2luZ1F1ZXVlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUNvbnN0YW50cy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vV2VibUNvbnN0YW50cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Db25zdGFudHMuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vV2VibUNvbnN0YW50cy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL2luY2x1ZGUvd2VibS9XZWJtRWxlbWVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vaW5jbHVkZS93ZWJtL1dlYm1FbGVtZW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL2luY2x1ZGUvd2VibS9XZWJtRnJhbWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vV2VibUZyYW1lLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL2luY2x1ZGUvd2VibS9XZWJtRnJhbWVUaHJlYWQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vV2VibUZyYW1lVGhyZWFkLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vV2VibVdyaXRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9pbmNsdWRlL3dlYm0vV2VibVdyaXRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNDQ0Mzc2Ni4uNjI5ZWU0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vdGVzdHMvQW5kcm9pZC5icApAQCAtMzEsOCArMzEsOCBAQAogICAgICAgICAiV2VibUZyYW1lVGhyZWFkVW5pdFRlc3QuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvQW5kcm9pZC5icAppbmRleCBhMzNiODg4Li5iODFmMjdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL0FuZHJvaWQuYnAKQEAgLTExOSw3ICsxMTksNyBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfd2VibSIsCiAgICAgICAgICJsaWJkYXRhc291cmNlIiwKICAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9Xcml0ZXJGdXp6ZXJCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL1dyaXRlckZ1enplckJhc2UuY3BwCmluZGV4IGVlN2FmNzAuLmI5N2YzNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL1dyaXRlckZ1enplckJhc2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL1dyaXRlckZ1enplckJhc2UuY3BwCkBAIC0xNzQsMTAgKzE3NCwxMyBAQAogICAgICAgICAgICAgcGFyYW1zLnNhbXBsZVJhdGUgPSAxNjAwMDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBhcmFtcy5zYW1wbGVSYXRlID0gbWF4KDEsIHBhcmFtcy5zYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIHBhcmFtcy5jaGFubmVsQ291bnQgPSBtYXgoMCwgcGFyYW1zLmNoYW5uZWxDb3VudCk7CiAgICAgICAgIH0KICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5jaGFubmVsQ291bnQpOwogICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5zYW1wbGVSYXRlKTsKICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKHBhcmFtcy5taW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgcGFyYW1zLndpZHRoID0gbWF4KDEsIHBhcmFtcy53aWR0aCk7CisgICAgICAgIHBhcmFtcy5oZWlnaHQgPSBtYXgoMSwgcGFyYW1zLmhlaWdodCk7CiAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgcGFyYW1zLndpZHRoKTsKICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgcGFyYW1zLmhlaWdodCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icAppbmRleCAwNTVkZDgwLi5hZmM4NzNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icApAQCAtNDEsOCArNDEsNiBAQAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCiAKLSAgICBjbGFuZzogdHJ1ZSwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJ3YXRjaGRvZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlid2F0Y2hkb2cvQW5kcm9pZC5icAppbmRleCA0MTFjMjA2Li41NTA2YTczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJ3YXRjaGRvZy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYndhdGNoZG9nL0FuZHJvaWQuYnAKQEAgLTM5LDcgKzM5LDcgQEAKICAgICAgICAgZGFyd2luOiB7CiAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICAgICAgfSwKLSAgICAgICAgbGludXhfZ2xpYmM6IHsKKyAgICAgICAgZ2xpYmM6IHsKICAgICAgICAgICAgIGNmbGFnczogWwogICAgICAgICAgICAgICAgICItRHNpZ2V2X25vdGlmeV90aHJlYWRfaWQ9X3NpZ2V2X3VuLl90aWQiLAogICAgICAgICAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwCmluZGV4IGUyNTY1OGYuLmVkZGRhYTQgMTAwNjQ0Ci0tLSBhL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icApAQCAtMzMsNyArMzMsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCi0gICAgICAgICJsaWJhbmRyb2lkaWN1IiwKKyAgICAgICAgImxpYmljdSIsCiAgICAgICAgICJsaWJmbXEiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKQEAgLTQ3LDExICs0Nyw2IEBACiAgICAgICAgICJsaWJyZWdpc3Rlcm1zZXh0IiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyIiwKLSAgICBdLAotCiAgICAgLy8gQnkgZGVmYXVsdCBtZWRpYXNlcnZlciBydW5zIGluIDMyLWJpdCB0byBzYXZlIG1lbW9yeSwgZXhjZXB0CiAgICAgLy8gb24gNjQtYml0LW9ubHkgbHVuY2ggdGFyZ2V0cy4KICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcCBiL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCmluZGV4IDU4ZTJkMmEuLjAyNjg0N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCisrKyBiL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCkBAIC0yNSw5ICsyNSw4IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSAiUmVnaXN0ZXJFeHRlbnNpb25zLmgiCiAKLS8vIGZyb20gTE9DQUxfQ19JTkNMVURFUwotI2luY2x1ZGUgIk1lZGlhUGxheWVyU2VydmljZS5oIgotI2luY2x1ZGUgIlJlc291cmNlTWFuYWdlclNlcnZpY2UuaCIKKyNpbmNsdWRlIDxNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvT1dORVJTIGIvbWVkaWEvbXRwL09XTkVSUwppbmRleCAxOTI4YmE4Li41NGQzZDRhIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvT1dORVJTCisrKyBiL21lZGlhL210cC9PV05FUlMKQEAgLTEsNiArMSw1IEBACiBzZXQgbm9wYXJlbnQKIAotbWFyY29uZUBnb29nbGUuY29tCiBqc2hhcmtleUBhbmRyb2lkLmNvbQogamFtZXN3ZWlAZ29vZ2xlLmNvbQogcm1vanVtZGVyQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL25kay9BbmRyb2lkLmJwIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKaW5kZXggOGQ1MjdlOS4uZGRjNzFkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKQEAgLTYzLDYgKzYzLDcgQEAKIH0KIAogLy8gZm9yIHVzZSB3aXRoIGhlYWRlcl9saWJzCisvLyBzdXBwb3J0cyB1c2UgYXMgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+IG5vdCA8TmRrTWVkaWFFeHRyYWN0b3IuaD4KIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLApAQCAtMTAzLDggKzEwNCw2IEBACiAgICAgXSwKIAogICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCiAgICAgICAgICJzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUiLAogICAgIF0sCiAKQEAgLTE0NSw2ICsxNDQsNyBAQAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYm1lZGlhbmRrX3V0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtLVYxLW5kayIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsiam5pX2hlYWRlcnMiXSwKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICAgIHN0dWJzOiB7CiAgICAgICAgIHN5bWJvbF9maWxlOiAibGlibWVkaWFuZGsubWFwLnR4dCIsCiAgICAgICAgIHZlcnNpb25zOiBbIjI5Il0sCi0gICAgfSwKKyAgICB9CiB9CiAKIGNjX2xpYnJhcnkgewpAQCAtMTc3LDkgKzE3Nyw4IEBACiAgICAgICAgICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsvaW5jbHVkZSIsCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwpAQCAtMTkzLDcgKzE5Miw5IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCkBAIC0yMjMsNiArMjI0LDcgQEAKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCiAgICAgXSwKKwogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAogICAgIF0sCkBAIC0yMzAsOSArMjMyLDYgQEAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCiAgICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrLyIsCi0gICAgXSwKIH0KIAogY2NfbGlicmFyeV9zdGF0aWMgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlLmNwcCBiL21lZGlhL25kay9OZGtJbWFnZS5jcHAKaW5kZXggNWZkZDQ1YS4uMTJhMGQ1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8YW5kcm9pZF9tZWRpYV9VdGlscy5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZC9BSGFyZHdhcmVCdWZmZXJIZWxwZXJzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhMy5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtMzc1LDggKzM3NCw4IEBACiAgICAgdWludDhfdCoganBlZ0J1ZmZlciA9IG1Mb2NrZWRCdWZmZXItPmRhdGE7CiAKICAgICAvLyBGaXJzdCBjaGVjayBmb3IgSlBFRyB0cmFuc3BvcnQgaGVhZGVyIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgotICAgIHVpbnQ4X3QqIGhlYWRlciA9IGpwZWdCdWZmZXIgKyAod2lkdGggLSBzaXplb2Yoc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iKSk7Ci0gICAgc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iKiBibG9iID0gKHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYiopKGhlYWRlcik7CisgICAgdWludDhfdCogaGVhZGVyID0ganBlZ0J1ZmZlciArICh3aWR0aCAtIHNpemVvZihzdHJ1Y3QgY2FtZXJhM19qcGVnX2Jsb2JfdjIpKTsKKyAgICBzdHJ1Y3QgY2FtZXJhM19qcGVnX2Jsb2JfdjIqIGJsb2IgPSAoc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iX3YyKikoaGVhZGVyKTsKICAgICBpZiAoYmxvYi0+anBlZ19ibG9iX2lkID09IENBTUVSQTNfSlBFR19CTE9CX0lEKSB7CiAgICAgICAgIHNpemUgPSBibG9iLT5qcGVnX3NpemU7CiAgICAgICAgIEFMT0dWKCIlczogSnBlZyBzaXplID0gJWQiLCBfX0ZVTkNUSU9OX18sIHNpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCmluZGV4IDFhZTJiNDQuLjM4ZTQyMmQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKQEAgLTE1LDYgKzE1LDggQEAKICAqLwogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzZXQ+CiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFDb2RlYyIKQEAgLTI5LDYgKzMxLDcgQEAKICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KQEAgLTQxLDYgKzQ0LDcgQEAKIAogCiBzdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgeworCiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0gZWxzZSBpZiAoZXJyID09IC1FQUdBSU4pIHsKQEAgLTUwLDcgKzU0LDE4IEBACiAgICAgfSBlbHNlIGlmIChlcnIgPT0gREVBRF9PQkpFQ1QpIHsKICAgICAgICAgcmV0dXJuIEFNRURJQUNPREVDX0VSUk9SX1JFQ0xBSU1FRDsKICAgICB9Ci0gICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKworICAgIHsKKyAgICAgICAgLy8gbWluaW1pemUgbG9nIGZsb29kaW5nLiBTb21lIENUUyBiZWhhdmlvciBtYWRlIHRoaXMgbm9pc3kgYW5kIGFwcHMgY291bGQgZG8gdGhlIHNhbWUuCisgICAgICAgIHN0YXRpYyBzdGQ6OnNldDxzdGF0dXNfdD4gdW50cmFuc2xhdGVkOworICAgICAgICBzdGF0aWMgc3RkOjptdXRleCBtdXRleDsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG11dGV4KTsKKworICAgICAgICBpZiAodW50cmFuc2xhdGVkLmZpbmQoZXJyKSA9PSB1bnRyYW5zbGF0ZWQuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnRyYW5zbGF0ZWQgc2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOworICAgICAgICAgICAgdW50cmFuc2xhdGVkLmluc2VydChlcnIpOworICAgICAgICB9CisgICAgfQogICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKIH0KIApAQCAtNTksNiArNzQsNyBAQAogICAgIGtXaGF0QXN5bmNOb3RpZnksCiAgICAga1doYXRSZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb25zLAogICAgIGtXaGF0U3RvcEFjdGl2aXR5Tm90aWZpY2F0aW9ucywKKyAgICBrV2hhdEZyYW1lUmVuZGVyZWROb3RpZnksCiB9OwogCiBzdHJ1Y3QgQU1lZGlhQ29kZWNQZXJzaXN0ZW50U3VyZmFjZSA6IHB1YmxpYyBTdXJmYWNlIHsKQEAgLTk4LDYgKzExNCwxMSBAQAogICAgIG11dGFibGUgTXV0ZXggbUFzeW5jQ2FsbGJhY2tMb2NrOwogICAgIEFNZWRpYUNvZGVjT25Bc3luY05vdGlmeUNhbGxiYWNrIG1Bc3luY0NhbGxiYWNrOwogICAgIHZvaWQgKm1Bc3luY0NhbGxiYWNrVXNlckRhdGE7CisKKyAgICBzcDxBTWVzc2FnZT4gbUZyYW1lUmVuZGVyZWROb3RpZnk7CisgICAgbXV0YWJsZSBNdXRleCBtRnJhbWVSZW5kZXJlZENhbGxiYWNrTG9jazsKKyAgICBBTWVkaWFDb2RlY09uRnJhbWVSZW5kZXJlZCBtRnJhbWVSZW5kZXJlZENhbGxiYWNrOworICAgIHZvaWQgKm1GcmFtZVJlbmRlcmVkQ2FsbGJhY2tVc2VyRGF0YTsKIH07CiAKIENvZGVjSGFuZGxlcjo6Q29kZWNIYW5kbGVyKEFNZWRpYUNvZGVjICpjb2RlYykgewpAQCAtMTU4LDggKzE3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrTG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tQXN5bmNDYWxsYmFja1VzZXJEYXRhICE9IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrLm9uQXN5bmNJbnB1dEF2YWlsYWJsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jSW5wdXRBdmFpbGFibGUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY0lucHV0QXZhaWxhYmxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQXN5bmNDYWxsYmFja1VzZXJEYXRhLApAQCAtMjA1LDggKzIyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWZsYWdzfTsKIAogICAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tMb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEgIT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY091dHB1dEF2YWlsYWJsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jT3V0cHV0QXZhaWxhYmxlICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrLm9uQXN5bmNPdXRwdXRBdmFpbGFibGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEsCkBAIC0yMzQsOCArMjUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqYU1lZGlhRm9ybWF0ID0gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJmNvcHkpOwogCiAgICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNvZGVjLT5tQXN5bmNDYWxsYmFja0xvY2spOwotICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jRm9ybWF0Q2hhbmdlZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jRm9ybWF0Q2hhbmdlZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jRm9ybWF0Q2hhbmdlZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSwKQEAgLTI1OSwxMiArMjc3LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBtc2ctPmZpbmRTdHJpbmcoImRldGFpbCIsICZkZXRhaWwpOwotICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHJlcG9ydGVkIGVycm9yKDB4JXgpLCBhY3Rpb25Db2RlKCVkKSwgZGV0YWlsKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsIGFjdGlvbkNvZGUsIGRldGFpbC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyByZXBvcnRlZCBlcnJvcigweCV4LyVzKSwgYWN0aW9uQ29kZSglZCksIGRldGFpbCglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBTdHJNZWRpYUVycm9yKGVycikuY19zdHIoKSwgYWN0aW9uQ29kZSwgZGV0YWlsLmNfc3RyKCkpOwogCiAgICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNvZGVjLT5tQXN5bmNDYWxsYmFja0xvY2spOwotICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jRXJyb3IgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY0Vycm9yICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrLm9uQXN5bmNFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSwKQEAgLTI5OCw2ICszMTUsNDMgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdEZyYW1lUmVuZGVyZWROb3RpZnk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBkYXRhOworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRNZXNzYWdlKCJkYXRhIiwgJmRhdGEpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImtXaGF0RnJhbWVSZW5kZXJlZE5vdGlmeTogZGF0YSBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQU1lc3NhZ2U6OlR5cGUgdHlwZTsKKyAgICAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXMsIHN5c3RlbU5hbm87CisgICAgICAgICAgICBzaXplX3QgaW5kZXggPSAwOworCisgICAgICAgICAgICAvLyBUT0RPLiBUaGlzIGNvZGUgaGFzIGRlcGVuZGVuY3kgd2l0aCBNZWRpYUNvZGVjOjpDcmVhdGVGcmFtZXNSZW5kZXJlZE1lc3NhZ2UuCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgZGF0YS0+Y291bnRFbnRyaWVzKCk7IGl4KyspIHsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIG5hbWUgPSBkYXRhLT5nZXRFbnRyeU5hbWVBdChpeCwgJnR5cGUpOworICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoQVN0cmluZ1ByaW50ZigiJXp1LW1lZGlhLXRpbWUtdXMiLCBpbmRleCkuY19zdHIoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGRhdGEgPSBtc2ctPmdldEVudHJ5QXQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbmQoJm1lZGlhVGltZVVzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChBU3RyaW5nUHJpbnRmKCIlenUtc3lzdGVtLW5hbm8iLCBpbmRleCkuY19zdHIoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGRhdGEgPSBtc2ctPmdldEVudHJ5QXQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbmQoJnN5c3RlbU5hbm8pOworCisgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ29kZWMtPm1GcmFtZVJlbmRlcmVkQ2FsbGJhY2tMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUZyYW1lUmVuZGVyZWRDYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1GcmFtZVJlbmRlcmVkQ2FsbGJhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tRnJhbWVSZW5kZXJlZENhbGxiYWNrVXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVGltZVVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1OYW5vKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoInNob3VsZG4ndCBiZSBoZXJlIik7CiAgICAgICAgICAgICBicmVhazsKQEAgLTQ1MiwxNyArNTA2LDE5IEBACiAgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG5hdGl2ZUZvcm1hdDsKICAgICBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGZvcm1hdCwgJm5hdGl2ZUZvcm1hdCk7Ci0gICAgQUxPR1YoImNvbmZpZ3VyZSB3aXRoIGZvcm1hdDogJXMiLCBuYXRpdmVGb3JtYXQtPmRlYnVnU3RyaW5nKDApLmNfc3RyKCkpOworICAgIC8vIGNyZWF0ZSBvdXIgc2hhbGxvdyBjb3B5LCBzbyB3ZSBhcmVuJ3QgdmljdGltIHRvIGFueSBsYXRlciBjaGFuZ2VzLgorICAgIHNwPEFNZXNzYWdlPiBkdXBOYXRpdmVGb3JtYXQgPSBuYXRpdmVGb3JtYXQtPmR1cCgpOworICAgIEFMT0dWKCJjb25maWd1cmUgd2l0aCBmb3JtYXQ6ICVzIiwgZHVwTmF0aXZlRm9ybWF0LT5kZWJ1Z1N0cmluZygwKS5jX3N0cigpKTsKICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gTlVMTDsKICAgICBpZiAod2luZG93ICE9IE5VTEwpIHsKICAgICAgICAgc3VyZmFjZSA9IChTdXJmYWNlKikgd2luZG93OwogICAgIH0KIAotICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tQ29kZWMtPmNvbmZpZ3VyZShuYXRpdmVGb3JtYXQsIHN1cmZhY2UsCisgICAgc3RhdHVzX3QgZXJyID0gbURhdGEtPm1Db2RlYy0+Y29uZmlndXJlKGR1cE5hdGl2ZUZvcm1hdCwgc3VyZmFjZSwKICAgICAgICAgICAgIGNyeXB0byA/IGNyeXB0by0+bUNyeXB0byA6IE5VTEwsIGZsYWdzKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJjb25maWd1cmU6IGVyciglZCksIGZhaWxlZCB3aXRoIGZvcm1hdDogJXMiLAotICAgICAgICAgICAgICBlcnIsIG5hdGl2ZUZvcm1hdC0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7CisgICAgICAgICAgICAgIGVyciwgZHVwTmF0aXZlRm9ybWF0LT5kZWJ1Z1N0cmluZygwKS5jX3N0cigpKTsKICAgICB9CiAgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihlcnIpOwogfQpAQCAtNDcyLDIyICs1MjgsNDYgQEAKICAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLAogICAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayBjYWxsYmFjaywKICAgICAgICAgdm9pZCAqdXNlcmRhdGEpIHsKLSAgICBpZiAobURhdGEtPm1Bc3luY05vdGlmeSA9PSBOVUxMICYmIHVzZXJkYXRhICE9IE5VTEwpIHsKLSAgICAgICAgbURhdGEtPm1Bc3luY05vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEFzeW5jTm90aWZ5LCBtRGF0YS0+bUhhbmRsZXIpOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRGF0YS0+bUNvZGVjLT5zZXRDYWxsYmFjayhtRGF0YS0+bUFzeW5jTm90aWZ5KTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoInNldEFzeW5jTm90aWZ5Q2FsbGJhY2s6IGVyciglZCksIGZhaWxlZCB0byBzZXQgYXN5bmMgY2FsbGJhY2siLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihlcnIpOwotICAgICAgICB9Ci0gICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EYXRhLT5tQXN5bmNDYWxsYmFja0xvY2spOworCisgICAgaWYgKG1EYXRhLT5tQXN5bmNOb3RpZnkgPT0gTlVMTCkgeworICAgICAgICBtRGF0YS0+bUFzeW5jTm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0QXN5bmNOb3RpZnksIG1EYXRhLT5tSGFuZGxlcik7CisgICAgfQorCisgICAgLy8gYWx3YXlzIGNhbGwsIGNvZGVjIG1heSBoYXZlIGJlZW4gcmVzZXQvcmUtY29uZmlndXJlZCBzaW5jZSBsYXN0IGNhbGwuCisgICAgc3RhdHVzX3QgZXJyID0gbURhdGEtPm1Db2RlYy0+c2V0Q2FsbGJhY2sobURhdGEtPm1Bc3luY05vdGlmeSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgic2V0QXN5bmNOb3RpZnlDYWxsYmFjazogZXJyKCVkKSwgZmFpbGVkIHRvIHNldCBhc3luYyBjYWxsYmFjayIsIGVycik7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKKyAgICB9CisKICAgICBtRGF0YS0+bUFzeW5jQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICBtRGF0YS0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSA9IHVzZXJkYXRhOwogCiAgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAorRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zZXRPbkZyYW1lUmVuZGVyZWRDYWxsYmFjaygKKyAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLAorICAgICAgICBBTWVkaWFDb2RlY09uRnJhbWVSZW5kZXJlZCBjYWxsYmFjaywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURhdGEtPm1GcmFtZVJlbmRlcmVkQ2FsbGJhY2tMb2NrKTsKKyAgICBpZiAobURhdGEtPm1GcmFtZVJlbmRlcmVkTm90aWZ5ID09IE5VTEwpIHsKKyAgICAgICAgbURhdGEtPm1GcmFtZVJlbmRlcmVkTm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0RnJhbWVSZW5kZXJlZE5vdGlmeSwgbURhdGEtPm1IYW5kbGVyKTsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gbURhdGEtPm1Db2RlYy0+c2V0T25GcmFtZVJlbmRlcmVkTm90aWZpY2F0aW9uKG1EYXRhLT5tRnJhbWVSZW5kZXJlZE5vdGlmeSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgic2V0T25GcmFtZVJlbmRlcmVkTm90aWZ5Q2FsbGJhY2s6IGVyciglZCksIGZhaWxlZCB0byBzZXQgY2FsbGJhY2siLCBlcnIpOworICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7CisgICAgfQorCisgICAgbURhdGEtPm1GcmFtZVJlbmRlcmVkQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICBtRGF0YS0+bUZyYW1lUmVuZGVyZWRDYWxsYmFja1VzZXJEYXRhID0gdXNlcmRhdGE7CisKKyAgICByZXR1cm4gQU1FRElBX09LOworfQogCiBFWFBPUlQKIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3JlbGVhc2VDcnlwdG8oQU1lZGlhQ29kZWMgKm1EYXRhKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcAppbmRleCA2ZTk5NDVkLi41OWMxMTAzIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKQEAgLTk3LDYgKzk3LDggQEAKICAgICBMaXN0PGlkdmVjX3Q+IG1JZHM7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVF1ZXJ5UmVzdWx0czsKICAgICBWZWN0b3I8dWludDhfdD4gbUtleVJlcXVlc3Q7CisgICAgU3RyaW5nOCBtRGVmYXVsdFVybDsKKyAgICBBTWVkaWFEcm1LZXlSZXF1ZXN0VHlwZSBta2V5UmVxdWVzdFR5cGU7CiAgICAgVmVjdG9yPHVpbnQ4X3Q+IG1Qcm92aXNpb25SZXF1ZXN0OwogICAgIFN0cmluZzggbVByb3Zpc2lvblVybDsKICAgICBTdHJpbmc4IG1Qcm9wZXJ0eVN0cmluZzsKQEAgLTQxNiw2ICs0MTgsMjEgQEAKICAgICAgICAgY29uc3QgQU1lZGlhRHJtS2V5VmFsdWUgKm9wdGlvbmFsUGFyYW1ldGVycywgc2l6ZV90IG51bU9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgY29uc3QgdWludDhfdCAqKmtleVJlcXVlc3QsIHNpemVfdCAqa2V5UmVxdWVzdFNpemUpIHsKIAorICAgIHJldHVybiBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdFdpdGhEZWZhdWx0VXJsQW5kVHlwZShtT2JqLAorICAgICAgICBzY29wZSwgaW5pdCwgaW5pdFNpemUsIG1pbWVUeXBlLCBrZXlUeXBlLCBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIG51bU9wdGlvbmFsUGFyYW1ldGVycywga2V5UmVxdWVzdCwKKyAgICAgICAga2V5UmVxdWVzdFNpemUsIE5VTEwsIE5VTEwpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0V2l0aERlZmF1bHRVcmxBbmRUeXBlKEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtU2NvcGUgKnNjb3BlLCBjb25zdCB1aW50OF90ICppbml0LCBzaXplX3QgaW5pdFNpemUsCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlLCBBTWVkaWFEcm1LZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IEFNZWRpYURybUtleVZhbHVlICpvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIHNpemVfdCBudW1PcHRpb25hbFBhcmFtZXRlcnMsIGNvbnN0IHVpbnQ4X3QgKiprZXlSZXF1ZXN0LAorICAgICAgICBzaXplX3QgKmtleVJlcXVlc3RTaXplLCBjb25zdCBjaGFyICoqZGVmYXVsdFVybCwKKyAgICAgICAgQU1lZGlhRHJtS2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlKSB7CisKICAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CiAgICAgfQpAQCAtNDQ5LDE4ICs0NjYsNDMgQEAKICAgICAgICAgbWRPcHRpb25hbFBhcmFtZXRlcnMuYWRkKFN0cmluZzgob3B0aW9uYWxQYXJhbWV0ZXJzW2ldLm1LZXkpLAogICAgICAgICAgICAgICAgIFN0cmluZzgob3B0aW9uYWxQYXJhbWV0ZXJzW2ldLm1WYWx1ZSkpOwogICAgIH0KLSAgICBTdHJpbmc4IGRlZmF1bHRVcmw7Ci0gICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZTsKKworICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgcmVxdWVzdFR5cGU7CiAgICAgbU9iai0+bUtleVJlcXVlc3QuY2xlYXIoKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRLZXlSZXF1ZXN0KCppdGVyLCBtZEluaXQsIFN0cmluZzgobWltZVR5cGUpLAotICAgICAgICAgICAgbWRLZXlUeXBlLCBtZE9wdGlvbmFsUGFyYW1ldGVycywgbU9iai0+bUtleVJlcXVlc3QsIGRlZmF1bHRVcmwsCi0gICAgICAgICAgICAma2V5UmVxdWVzdFR5cGUpOworICAgICAgICAgICAgbWRLZXlUeXBlLCBtZE9wdGlvbmFsUGFyYW1ldGVycywgbU9iai0+bUtleVJlcXVlc3QsIG1PYmotPm1EZWZhdWx0VXJsLAorICAgICAgICAgICAgJnJlcXVlc3RUeXBlKTsKICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKICAgICB9IGVsc2UgewogICAgICAgICAqa2V5UmVxdWVzdCA9IG1PYmotPm1LZXlSZXF1ZXN0LmFycmF5KCk7CiAgICAgICAgICprZXlSZXF1ZXN0U2l6ZSA9IG1PYmotPm1LZXlSZXF1ZXN0LnNpemUoKTsKKyAgICAgICAgaWYgKGRlZmF1bHRVcmwgIT0gTlVMTCkKKyAgICAgICAgICAgICpkZWZhdWx0VXJsID0gbU9iai0+bURlZmF1bHRVcmwuc3RyaW5nKCk7CisgICAgICAgIHN3aXRjaChyZXF1ZXN0VHlwZSkgeworICAgICAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Jbml0aWFsOgorICAgICAgICAgICAgICAgIG1PYmotPm1rZXlSZXF1ZXN0VHlwZSA9IEtFWV9SRVFVRVNUX1RZUEVfSU5JVElBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVuZXdhbDoKKyAgICAgICAgICAgICAgICBtT2JqLT5ta2V5UmVxdWVzdFR5cGUgPSBLRVlfUkVRVUVTVF9UWVBFX1JFTkVXQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbGVhc2U6CisgICAgICAgICAgICAgICAgbU9iai0+bWtleVJlcXVlc3RUeXBlID0gS0VZX1JFUVVFU1RfVFlQRV9SRUxFQVNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOgorICAgICAgICAgICAgICAgIG1PYmotPm1rZXlSZXF1ZXN0VHlwZSA9IEtFWV9SRVFVRVNUX1RZUEVfTk9ORTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfVXBkYXRlOgorICAgICAgICAgICAgICAgIG1PYmotPm1rZXlSZXF1ZXN0VHlwZSA9IEtFWV9SRVFVRVNUX1RZUEVfVVBEQVRFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgICAgIH0KKworICAgICAgICBpZiAoa2V5UmVxdWVzdFR5cGUgIT0gTlVMTCkKKyAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IG1PYmotPm1rZXlSZXF1ZXN0VHlwZTsKICAgICB9CisKICAgICByZXR1cm4gQU1FRElBX09LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcAppbmRleCAwN2ZjNWRlLi42ZDNjMzQ4IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTM4OCw5ICszODgsMTEgQEAKICAgICAgICAgbW9kZSA9IENyeXB0b1BsdWdpbjo6a01vZGVfQUVTX0NUUjsKICAgICB9CiAKKyAgICBzcDxBQnVmZmVyPiBjbGVhcmJ1ZjsKKyAgICBzcDxBQnVmZmVyPiBjcnlwdGVkYnVmOwogICAgIGlmIChzaXplb2YodWludDMyX3QpICE9IHNpemVvZihzaXplX3QpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGNsZWFyYnVmICAgPSBVMzJBcnJheVRvU2l6ZUJ1ZihudW1TdWJTYW1wbGVzLCAodWludDMyX3QgKiljbGVhcmRhdGEpOwotICAgICAgICBzcDxBQnVmZmVyPiBjcnlwdGVkYnVmID0gVTMyQXJyYXlUb1NpemVCdWYobnVtU3ViU2FtcGxlcywgKHVpbnQzMl90ICopY3J5cHRlZGRhdGEpOworICAgICAgICBjbGVhcmJ1ZiAgID0gVTMyQXJyYXlUb1NpemVCdWYobnVtU3ViU2FtcGxlcywgKHVpbnQzMl90ICopY2xlYXJkYXRhKTsKKyAgICAgICAgY3J5cHRlZGJ1ZiA9IFUzMkFycmF5VG9TaXplQnVmKG51bVN1YlNhbXBsZXMsICh1aW50MzJfdCAqKWNyeXB0ZWRkYXRhKTsKICAgICAgICAgY2xlYXJkYXRhICAgPSBjbGVhcmJ1ZiAgICA9PSBOVUxMID8gTlVMTCA6IGNsZWFyYnVmLT5kYXRhKCk7CiAgICAgICAgIGNyeXB0ZWRkYXRhID0gY3J5cHRlZGRhdGEgPT0gTlVMTCA/IE5VTEwgOiBjcnlwdGVkYnVmLT5kYXRhKCk7CiAgICAgICAgIGlmKGNyeXB0ZWRkYXRhID09IE5VTEwgfHwgY2xlYXJkYXRhID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCmluZGV4IGMxNzkzY2UuLjkyMzQ1M2EgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcApAQCAtMjAwLDggKzIwMCwxMSBAQAogICAgIEFTdHJpbmcgdG1wOwogICAgIGlmIChtRGF0YS0+bUZvcm1hdC0+ZmluZFN0cmluZyhuYW1lLCAmdG1wKSkgewogICAgICAgICBTdHJpbmc4IHJldCh0bXAuY19zdHIoKSk7Ci0gICAgICAgIG1EYXRhLT5tU3RyaW5nQ2FjaGUuYWRkKFN0cmluZzgobmFtZSksIHJldCk7Ci0gICAgICAgICpvdXQgPSByZXQuc3RyaW5nKCk7CisgICAgICAgIHNzaXplX3QgaSA9IG1EYXRhLT5tU3RyaW5nQ2FjaGUuYWRkKFN0cmluZzgobmFtZSksIHJldCk7CisgICAgICAgIGlmIChpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICpvdXQgPSBtRGF0YS0+bVN0cmluZ0NhY2hlLnZhbHVlQXQoaSkuc3RyaW5nKCk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC0zNTEsOCArMzU0LDE0IEBACiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NSU1FID0gIm1pbWUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEgPSAibXBlZy11c2VyLWRhdGEiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUiA9ICJtcGVnMi1zdHJlYW0taGVhZGVyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01QRUdIX0NPTVBBVElCTEVfU0VUUyA9ICJtcGVnaC1jb21wYXRpYmxlLXNldHMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFR0hfUFJPRklMRV9MRVZFTF9JTkRJQ0FUSU9OID0KKyAgICAgICAgIm1wZWdoLXByb2ZpbGUtbGV2ZWwtaW5kaWNhdGlvbiI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHSF9SRUZFUkVOQ0VfQ0hBTk5FTF9MQVlPVVQgPQorICAgICAgICAibXBlZ2gtcmVmZXJlbmNlLWNoYW5uZWwtbGF5b3V0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFID0gIm9wZXJhdGluZy1yYXRlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORyA9ICJwY20tZW5jb2RpbmciOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUElDVFVSRV9UWVBFID0gInBpY3R1cmUtdHlwZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUklPUklUWSA9ICJwcmlvcml0eSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFID0gInByb2ZpbGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU4gPSAicGNtLWJpZy1lbmRpYW4iOwpAQCAtMzg2LDYgKzM5NSw5IEBACiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCA9ICJ0cmFjay1pZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWCA9ICJ0cmFjay1pbmRleCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTID0gInZhbGlkLXNhbXBsZXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVklERU9fRU5DT0RJTkdfU1RBVElTVElDU19MRVZFTCA9CisgICAgICAgICJ2aWRlby1lbmNvZGluZy1zdGF0aXN0aWNzLWxldmVsIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1ZJREVPX1FQX0FWRVJBR0UgPSAidmlkZW8tcXAtYXZlcmFnZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX1ZJREVPX1FQX0JfTUFYID0gInZpZGVvLXFwLWItbWF4IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfVklERU9fUVBfQl9NSU4gPSAidmlkZW8tcXAtYi1taW4iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9JX01BWCA9ICJ2aWRlby1xcC1pLW1heCI7CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvT1dORVJTIGIvbWVkaWEvbmRrL09XTkVSUwppbmRleCA5ZGM0NDFlLi44MzY0NGYwIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvT1dORVJTCisrKyBiL21lZGlhL25kay9PV05FUlMKQEAgLTEsMyArMSw0IEBACi1tYXJjb25lQGdvb2dsZS5jb20KK2Vzc2lja0Bnb29nbGUuY29tCitsYWpvc0Bnb29nbGUuY29tCiAjIEZvciBBSW1hZ2UvQUltYWdlUmVhZGVyCiBpbmNsdWRlIHBsYXRmb3JtL2ZyYW1ld29ya3MvYXY6L2NhbWVyYS9PV05FUlMKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaAppbmRleCA1MTkxNDhlLi40OTM4Zjc2IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCkBAIC0zOSw2ICszOSw4IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPgorCiAjaW5jbHVkZSAiTmRrTWVkaWFDcnlwdG8uaCIKICNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCiAjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXQuaCIKQEAgLTEyMiw2ICsxMjQsMjUgQEAKIH0gQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2s7CiAKIC8qKgorICogQ2FsbGVkIHdoZW4gYW4gb3V0cHV0IGZyYW1lIGhhcyByZW5kZXJlZCBvbiB0aGUgb3V0cHV0IHN1cmZhY2UuCisgKgorICogXHBhcmFtIGNvZGVjICAgICAgIFRoZSBjb2RlYyBvYmplY3QgdGhhdCBnZW5lcmF0ZWQgdGhpcyBub3RpZmljYXRpb24uCisgKiBccGFyYW0gdXNlcmRhdGEgICAgVGhlIHVzZXIgZGF0YSBzZXQgYXQgQU1lZGlhQ29kZWNfc2V0T25GcmFtZVJlbmRlcmVkQ2FsbGJhY2suCisgKiBccGFyYW0gbWVkaWFUaW1lVXMgVGhlIHByZXNlbnRhdGlvbiB0aW1lIChtZWRpYSB0aW1lKSBvZiB0aGUgZnJhbWUgcmVuZGVyZWQuCisgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB1c3VhbGx5IHRoZSBzYW1lIGFzIHNwZWNpZmllZCBpbgorICogICAgICAgICAgICAgICAgICAgIEFNZWRpYUNvZGVjX3F1ZXVlSW5wdXRCdWZmZXIsIGJ1dCBzb21lIGNvZGVjcyBtYXkgYWx0ZXIKKyAqICAgICAgICAgICAgICAgICAgICB0aGUgbWVkaWEgdGltZSBieSBhcHBseWluZyBzb21lIHRpbWUtYmFzZWQgdHJhbnNmb3JtYXRpb24sCisgKiAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyBmcmFtZSByYXRlIGNvbnZlcnNpb24uIEluIHRoYXQgY2FzZSwgcHJlc2VudGF0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgdGltZSBjb3JyZXNwb25kcyB0byB0aGUgYWN0dWFsIG91dHB1dCBmcmFtZSByZW5kZXJlZC4KKyAqIFxwYXJhbSBzeXN0ZW1OYW5vICBUaGUgc3lzdGVtIHRpbWUgd2hlbiB0aGUgZnJhbWUgd2FzIHJlbmRlcmVkLgorICovCit0eXBlZGVmIHZvaWQgKCpBTWVkaWFDb2RlY09uRnJhbWVSZW5kZXJlZCkoCisgICAgICAgIEFNZWRpYUNvZGVjICpjb2RlYywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXMsCisgICAgICAgIGludDY0X3Qgc3lzdGVtTmFubyk7CisKKy8qKgogICogQ3JlYXRlIGNvZGVjIGJ5IG5hbWUuIFVzZSB0aGlzIGlmIHlvdSBrbm93IHRoZSBleGFjdCBjb2RlYyB5b3Ugd2FudCB0byB1c2UuCiAgKiBXaGVuIGNvbmZpZ3VyaW5nLCB5b3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgd2hldGhlciB0byB1c2UgdGhlIGNvZGVjIGFzIGFuCiAgKiBlbmNvZGVyIG9yIGRlY29kZXIuCkBAIC00MTYsMTggKzQzNywyOCBAQAogCiAvKioKICAqIFNldCBhbiBhc3luY2hyb25vdXMgY2FsbGJhY2sgZm9yIGFjdGlvbmFibGUgQU1lZGlhQ29kZWMgZXZlbnRzLgotICogV2hlbiBhc3luY2hyb25vdXMgY2FsbGJhY2sgaXMgZW5hYmxlZCwgdGhlIGNsaWVudCBzaG91bGQgbm90IGNhbGwKKyAqIFdoZW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrIGlzIGVuYWJsZWQsIGl0IGlzIGFuIGVycm9yIGZvciB0aGUgY2xpZW50IHRvIGNhbGwKICAqIEFNZWRpYUNvZGVjX2dldElucHV0QnVmZmVycygpLCBBTWVkaWFDb2RlY19nZXRPdXRwdXRCdWZmZXJzKCksCiAgKiBBTWVkaWFDb2RlY19kZXF1ZXVlSW5wdXRCdWZmZXIoKSBvciBBTWVkaWFDb2RlY19kZXF1ZXVlT3V0cHV0QnVmZmVyKCkuCiAgKgotICogQWxzbywgQU1lZGlhQ29kZWNfZmx1c2goKSBiZWhhdmVzIGRpZmZlcmVudGx5IGluIGFzeW5jaHJvbm91cyBtb2RlLgotICogQWZ0ZXIgY2FsbGluZyBBTWVkaWFDb2RlY19mbHVzaCgpLCB5b3UgbXVzdCBjYWxsIEFNZWRpYUNvZGVjX3N0YXJ0KCkgdG8KLSAqICJyZXN1bWUiIHJlY2VpdmluZyBpbnB1dCBidWZmZXJzLCBldmVuIGlmIGFuIGlucHV0IHN1cmZhY2Ugd2FzIGNyZWF0ZWQuCisgKiBBTWVkaWFDb2RlY19mbHVzaCgpIGJlaGF2ZXMgZGlmZmVyZW50bHkgaW4gYXN5bmNocm9ub3VzIG1vZGUuCisgKiBBZnRlciBjYWxsaW5nIEFNZWRpYUNvZGVjX2ZsdXNoKCksIHRoZSBjbGllbnQgbXVzdCBjYWxsIEFNZWRpYUNvZGVjX3N0YXJ0KCkgdG8KKyAqICJyZXN1bWUiIHJlY2VpdmluZyBpbnB1dCBidWZmZXJzLiBFdmVuIGlmIHRoZSBjbGllbnQgZG9lcyBub3QgcmVjZWl2ZQorICogQU1lZGlhQ29kZWNPbkFzeW5jSW5wdXRBdmFpbGFibGUgY2FsbGJhY2tzIGZyb20gdmlkZW8gZW5jb2RlcnMgY29uZmlndXJlZAorICogd2l0aCBhbiBpbnB1dCBzdXJmYWNlLCB0aGUgY2xpZW50IHN0aWxsIG5lZWRzIHRvIGNhbGwgQU1lZGlhQ29kZWNfc3RhcnQoKQorICogdG8gcmVzdW1lIHRoZSBpbnB1dCBzdXJmYWNlIHRvIHNlbmQgYnVmZmVycyB0byB0aGUgZW5jb2RlcnMuCisgKgorICogV2hlbiBjYWxsZWQgd2l0aCBudWxsIGNhbGxiYWNrLCB0aGlzIG1ldGhvZCB1bnJlZ2lzdGVycyBhbnkgcHJldmlvdXNseSBzZXQgY2FsbGJhY2suCiAgKgogICogUmVmZXIgdG8gdGhlIGRlZmluaXRpb24gb2YgQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2sgb24gaG93IGVhY2gKICAqIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBhbmQgd2hhdCBhcmUgc3BlY2lmaWVkLgotICogVGhlIHNwZWNpZmllZCB1c2VyZGF0YSBpcyB0aGUgcG9pbnRlciB1c2VkIHdoZW4gdGhvc2UgY2FsbGJhY2sgZnVuY3Rpb25zIGFyZQotICogY2FsbGVkLgorICogVGhlIHNwZWNpZmllZCB1c2VyZGF0YSBpcyBvcGFxdWUgZGF0YSB3aGljaCB3aWxsIGJlIHBhc3NlZCBhbG9uZworICogd2hlbiB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIGFyZSBjYWxsZWQuIE1lZGlhQ29kZWMgZG9lcyBub3QgbG9vayBhdCBvciBhbHRlciB0aGUKKyAqIHZhbHVlIG9mIHVzZXJkYXRhLiBPZnRlbiBpdCBpcyBhIHBvaW50ZXIgdG8gYSBjbGllbnQtb3duZWQgb2JqZWN0LAorICogYW5kIGNsaWVudCBtYW5hZ2VzIHRoZSBsaWZlY3ljbGUgb2YgdGhlIG9iamVjdCBpbiB0aGF0IGNhc2UuCisgKgorICogT25jZSB0aGUgY2FsbGJhY2sgaXMgdW5yZWdpc3RlcmVkIG9yIHRoZSBjb2RlYyBpcyByZXNldCAvIHJlbGVhc2VkLCB0aGUKKyAqIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQuCiAgKgogICogQWxsIGNhbGxiYWNrcyBhcmUgZmlyZWQgb24gb25lIE5ESyBpbnRlcm5hbCB0aHJlYWQuCiAgKiBBTWVkaWFDb2RlY19zZXRBc3luY05vdGlmeUNhbGxiYWNrIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIHRoZSBjYWxsYmFjayB0aHJlYWQuCkBAIC00NDEsNiArNDcyLDM5IEBACiAgICAgICAgIHZvaWQgKnVzZXJkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKKyAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhbiBvdXRwdXQgZnJhbWUgaXMgcmVuZGVyZWQgb24gdGhlIG91dHB1dCBzdXJmYWNlLgorICoKKyAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgaW4gYW55IGNvZGVjIHN0YXRlLCBidXQgd2lsbCBvbmx5IGhhdmUgYW4gZWZmZWN0IGluIHRoZQorICogRXhlY3V0aW5nIHN0YXRlIGZvciBjb2RlY3MgdGhhdCByZW5kZXIgYnVmZmVycyB0byB0aGUgb3V0cHV0IHN1cmZhY2UuCisgKgorICogVGhpcyBjYWxsYmFjayBpcyBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5OiB0byBnZXQgcHJlY2lzZQorICogcmVuZGVyIHRpbWluZyBzYW1wbGVzLCBhbmQgY2FuIGJlIHNpZ25pZmljYW50bHkgZGVsYXllZCBhbmQgYmF0Y2hlZC4gU29tZSBmcmFtZXMgbWF5IGhhdmUKKyAqIGJlZW4gcmVuZGVyZWQgZXZlbiBpZiB0aGVyZSB3YXMgbm8gY2FsbGJhY2sgZ2VuZXJhdGVkLgorICoKKyAqIFdoZW4gY2FsbGVkIHdpdGggbnVsbCBjYWxsYmFjaywgdGhpcyBtZXRob2QgdW5yZWdpc3RlcnMgYW55IHByZXZpb3VzbHkgc2V0IGNhbGxiYWNrLgorICoKKyAqIFJlZmVyIHRvIHRoZSBkZWZpbml0aW9uIG9mIEFNZWRpYUNvZGVjT25GcmFtZVJlbmRlcmVkIG9uIGhvdyBlYWNoCisgKiBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgYW5kIHdoYXQgYXJlIHNwZWNpZmllZC4KKyAqIFRoZSBzcGVjaWZpZWQgdXNlcmRhdGEgaXMgb3BhcXVlIGRhdGEgd2hpY2ggd2lsbCBiZSBwYXNzZWQgYWxvbmcKKyAqIHdoZW4gdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgY2FsbGVkLiBNZWRpYUNvZGVjIGRvZXMgbm90IGxvb2sgYXQgb3IgYWx0ZXIgdGhlCisgKiB2YWx1ZSBvZiB1c2VyZGF0YS4gT2Z0ZW4gaXQgaXMgYSBwb2ludGVyIHRvIGEgY2xpZW50LW93bmVkIG9iamVjdCwKKyAqIGFuZCBjbGllbnQgbWFuYWdlcyB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBvYmplY3QgaW4gdGhhdCBjYXNlLgorICoKKyAqIE9uY2UgdGhlIGNhbGxiYWNrIGlzIHVucmVnaXN0ZXJlZCBvciB0aGUgY29kZWMgaXMgcmVzZXQgLyByZWxlYXNlZCwgdGhlCisgKiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkLgorICoKKyAqIEFsbCBjYWxsYmFja3MgYXJlIGZpcmVkIG9uIG9uZSBOREsgaW50ZXJuYWwgdGhyZWFkLgorICogQU1lZGlhQ29kZWNfc2V0T25GcmFtZVJlbmRlcmVkQ2FsbGJhY2sgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gdGhlIGNhbGxiYWNrIHRocmVhZC4KKyAqIE5vIGhlYXZ5IGR1dHkgdGFzayBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIGNhbGxiYWNrIHRocmVhZC4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQW5kcm9pZCBULgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zZXRPbkZyYW1lUmVuZGVyZWRDYWxsYmFjaygKKyAgICAgICAgQU1lZGlhQ29kZWMqLAorICAgICAgICBBTWVkaWFDb2RlY09uRnJhbWVSZW5kZXJlZCBjYWxsYmFjaywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpIF9fSU5UUk9EVUNFRF9JTihfX0FORFJPSURfQVBJX1RfXyk7CisKKy8qKgogICogUmVsZWFzZSB0aGUgY3J5cHRvIGlmIGFwcGxpY2FibGUuCiAgKgogICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyOC4KZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oCmluZGV4IDg0OWE4ZjkuLjRlY2EzZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaApAQCAtMTEyLDYgKzExMiw0MSBAQAogfSBBTWVkaWFEcm1LZXlUeXBlOwogCiAvKioKKyAqIEludHJvZHVjZWQgaW4gQVBJIDMzLgorICovCit0eXBlZGVmIGVudW0gQU1lZGlhRHJtS2V5UmVxdWVzdFR5cGUgOiBpbnQzMl90IHsKKyAgICAvKioKKyAgICAgKiBLZXkgcmVxdWVzdCB0eXBlIGlzIGluaXRpYWwgbGljZW5zZSByZXF1ZXN0LgorICAgICAqIEFuIGluaXRpYWwgbGljZW5zZSByZXF1ZXN0IGlzIG5lY2Vzc2FyeSB0byBsb2FkIGtleXMuCisgICAgICovCisgICAgS0VZX1JFUVVFU1RfVFlQRV9JTklUSUFMLAorCisgICAgLyoqCisgICAgICogS2V5IHJlcXVlc3QgdHlwZSBpcyBsaWNlbnNlIHJlbmV3YWwuCisgICAgICogQSByZW5ld2FsIGxpY2Vuc2UgcmVxdWVzdCBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGUga2V5cyBmcm9tIGV4cGlyaW5nLgorICAgICAqLworICAgIEtFWV9SRVFVRVNUX1RZUEVfUkVORVdBTCwKKworICAgIC8qKgorICAgICAqIEtleSByZXF1ZXN0IHR5cGUgaXMgbGljZW5zZSByZWxlYXNlLgorICAgICAqIEEgbGljZW5zZSByZWxlYXNlIHJlcXVlc3QgaW5kaWNhdGVzIHRoYXQga2V5cyBhcmUgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBLRVlfUkVRVUVTVF9UWVBFX1JFTEVBU0UsCisKKyAgICAvKioKKyAgICAgKiBLZXlzIGFyZSBhbHJlYWR5IGxvYWRlZCBhbmQgYXJlIGF2YWlsYWJsZSBmb3IgdXNlLiBObyBsaWNlbnNlIHJlcXVlc3QgaXMgbmVjZXNzYXJ5LCBhbmQKKyAgICAgKiBubyBrZXkgcmVxdWVzdCBkYXRhIGlzIHJldHVybmVkLgorICAgICAqLworICAgIEtFWV9SRVFVRVNUX1RZUEVfTk9ORSwKKworICAgIC8qKgorICAgICAqIEtleXMgaGF2ZSBiZWVuIGxvYWRlZCBidXQgYW4gYWRkaXRpb25hbCBsaWNlbnNlIHJlcXVlc3QgaXMgbmVlZGVkCisgICAgICogdG8gdXBkYXRlIHRoZWlyIHZhbHVlcy4KKyAgICAgKi8KKyAgICBLRVlfUkVRVUVTVF9UWVBFX1VQREFURQorfSBBTWVkaWFEcm1LZXlSZXF1ZXN0VHlwZTsKKworLyoqCiAgKiAgRGF0YSB0eXBlIGNvbnRhaW5pbmcge2tleSwgdmFsdWV9IHBhaXIKICAqLwogdHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRHJtS2V5VmFsdWVQYWlyIHsKQEAgLTI0OCw3ICsyODMsMTAgQEAKICAqIHRvIG9idGFpbiBvciByZWxlYXNlIGtleXMgdXNlZCB0byBkZWNyeXB0IGVuY3J5cHRlZCBjb250ZW50LgogICogQU1lZGlhRHJtX2dldEtleVJlcXVlc3QgaXMgdXNlZCB0byBvYnRhaW4gYW4gb3BhcXVlIGtleSByZXF1ZXN0IGJ5dGUgYXJyYXkgdGhhdAogICogaXMgZGVsaXZlcmVkIHRvIHRoZSBsaWNlbnNlIHNlcnZlci4gIFRoZSBvcGFxdWUga2V5IHJlcXVlc3QgYnl0ZSBhcnJheSBpcwotICogcmV0dXJuZWQgaW4gS2V5UmVxdWVzdC5kYXRhLgorICogcmV0dXJuZWQgaW4gKmtleVJlcXVlc3QgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJlcXVlc3QgaXMKKyAqIHJldHVybmVkIGluICprZXlSZXF1ZXN0U2l6ZS4KKyAqIFRoaXMgQVBJIGhhcyBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQU1lZGlhRHJtX2dldEtleVJlcXVlc3RXaXRoRGVmYXVsdFVybEFuZFR5cGUoKQorICogd2hlbiBkZWZhdWx0VXJsIGFuZCBrZXlSZXF1ZXN0VHlwZSBhcmUgcGFzc2VkIGluIGFzIE5VTEwuCiAgKgogICogQWZ0ZXIgdGhlIGFwcCBoYXMgcmVjZWl2ZWQgdGhlIGtleSByZXF1ZXN0IHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciwKICAqIGl0IHNob3VsZCBkZWxpdmVyIHRvIHRoZSByZXNwb25zZSB0byB0aGUgRFJNIGVuZ2luZSBwbHVnaW4gdXNpbmcgdGhlIG1ldGhvZApAQCAtMjgwLDExICszMTgsMTQgQEAKICAqICAgYnkgdGhlIGNhbGxlcgogICoKICAqIE9uIGV4aXQ6CisgKiAgIElmIHRoaXMgcmV0dXJucyBBTUVESUFfT0ssCiAgKiAgIDEuIFRoZSBrZXlSZXF1ZXN0IHBvaW50ZXIgd2lsbCByZWZlcmVuY2UgdGhlIG9wYXF1ZSBrZXkgcmVxdWVzdCBkYXRhLiAgSXQKICAqICAgICAgIHdpbGwgcmVzaWRlIGluIG1lbW9yeSBvd25lZCBieSB0aGUgQU1lZGlhRHJtIG9iamVjdCwgYW5kIHdpbGwgcmVtYWluCi0gKiAgICAgICBhY2Nlc3NpYmxlIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gQU1lZGlhRHJtX2dldEtleVJlcXVlc3Qgb3IgdW50aWwgdGhlCisgKiAgICAgICBhY2Nlc3NpYmxlIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gQU1lZGlhRHJtX2dldEtleVJlcXVlc3QKKyAqICAgICAgIG9yIEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0V2l0aERlZmF1bHRVcmxBbmRUeXBlIG9yIHVudGlsIHRoZQogICogICAgICAgTWVkaWFEcm0gb2JqZWN0IGlzIHJlbGVhc2VkLgogICogICAyLiBrZXlSZXF1ZXN0U2l6ZSB3aWxsIGJlIHNldCB0byB0aGUgc2l6ZSBvZiB0aGUgcmVxdWVzdAorICogICBJZiB0aGlzIGRvZXMgbm90IHJldHVybiBBTUVESUFfT0ssIHZhbHVlIG9mIHRoZXNlIHBhcmFtZXRlcnMgc2hvdWxkIG5vdCBiZSB1c2VkLgogICoKICAqIFJldHVybnMgTUVESUFEUk1fTk9UX1BST1ZJU0lPTkVEX0VSUk9SIGlmIHJlcHJvdmlzaW9uaW5nIGlzIG5lZWRlZCwgZHVlIHRvIGEKICAqIHByb2JsZW0gd2l0aCB0aGUgZGV2aWNlIGNlcnRpZmljYXRlLgpAQCAtMjk3LDYgKzMzOCw3MiBAQAogICAgICAgICBjb25zdCB1aW50OF90ICoqa2V5UmVxdWVzdCwgc2l6ZV90ICprZXlSZXF1ZXN0U2l6ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCisgKiBBIGtleSByZXF1ZXN0L3Jlc3BvbnNlIGV4Y2hhbmdlIG9jY3VycyBiZXR3ZWVuIHRoZSBhcHAgYW5kIGEgbGljZW5zZSBzZXJ2ZXIKKyAqIHRvIG9idGFpbiBvciByZWxlYXNlIGtleXMgdXNlZCB0byBkZWNyeXB0IGVuY3J5cHRlZCBjb250ZW50LgorICogQU1lZGlhRHJtX2dldEtleVJlcXVlc3QgaXMgdXNlZCB0byBvYnRhaW4gYW4gb3BhcXVlIGtleSByZXF1ZXN0IGJ5dGUgYXJyYXkgdGhhdAorICogaXMgZGVsaXZlcmVkIHRvIHRoZSBsaWNlbnNlIHNlcnZlci4gIFRoZSBvcGFxdWUga2V5IHJlcXVlc3QgYnl0ZSBhcnJheSBpcworICogcmV0dXJuZWQgaW4gKmtleVJlcXVlc3QgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJlcXVlc3QgaXMKKyAqIHJldHVybmVkIGluICprZXlSZXF1ZXN0U2l6ZS4KKyAqCisgKiBBZnRlciB0aGUgYXBwIGhhcyByZWNlaXZlZCB0aGUga2V5IHJlcXVlc3QgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLAorICogaXQgc2hvdWxkIGRlbGl2ZXIgdG8gdGhlIHJlc3BvbnNlIHRvIHRoZSBEUk0gZW5naW5lIHBsdWdpbiB1c2luZyB0aGUgbWV0aG9kCisgKiBBTWVkaWFEcm1fcHJvdmlkZUtleVJlc3BvbnNlLgorICoKKyAqIHNjb3BlIG1heSBiZSBhIHNlc3Npb25JZCBvciBhIGtleVNldElkLCBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmllZCBrZXlUeXBlLgorICogV2hlbiB0aGUga2V5VHlwZSBpcyBLRVlfVFlQRV9TVFJFQU1JTkcgb3IgS0VZX1RZUEVfT0ZGTElORSwgc2NvcGUgc2hvdWxkIGJlIHNldAorICogdG8gdGhlIHNlc3Npb25JZCB0aGUga2V5cyB3aWxsIGJlIHByb3ZpZGVkIHRvLiAgV2hlbiB0aGUga2V5VHlwZSBpcworICogS0VZX1RZUEVfUkVMRUFTRSwgc2NvcGUgc2hvdWxkIGJlIHNldCB0byB0aGUga2V5U2V0SWQgb2YgdGhlIGtleXMgYmVpbmcgcmVsZWFzZWQuCisgKiBSZWxlYXNpbmcga2V5cyBmcm9tIGEgZGV2aWNlIGludmFsaWRhdGVzIHRoZW0gZm9yIGFsbCBzZXNzaW9ucy4KKyAqCisgKiBpbml0IGNvbnRhaW5lci1zcGVjaWZpYyBkYXRhLCBpdHMgbWVhbmluZyBpcyBpbnRlcnByZXRlZCBiYXNlZCBvbiB0aGUgbWltZSB0eXBlCisgKiBwcm92aWRlZCBpbiB0aGUgbWltZVR5cGUgcGFyYW1ldGVyLiAgSXQgY291bGQgY29udGFpbiwgZm9yIGV4YW1wbGUsIHRoZSBjb250ZW50CisgKiBJRCwga2V5IElEIG9yIG90aGVyIGRhdGEgb2J0YWluZWQgZnJvbSB0aGUgY29udGVudCBtZXRhZGF0YSB0aGF0IGlzIHJlcXVpcmVkIGluCisgKiBnZW5lcmF0aW5nIHRoZSBrZXkgcmVxdWVzdC4gaW5pdCBtYXkgYmUgbnVsbCB3aGVuIGtleVR5cGUgaXMgS0VZX1RZUEVfUkVMRUFTRS4KKyAqCisgKiBpbml0U2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGluaXREYXRhCisgKgorICogbWltZVR5cGUgaWRlbnRpZmllcyB0aGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LgorICoKKyAqIGtleVR5cGUgc3BlY2lmZXMgdGhlIHR5cGUgb2YgdGhlIHJlcXVlc3QuIFRoZSByZXF1ZXN0IG1heSBiZSB0byBhY3F1aXJlIGtleXMgZm9yCisgKiAgIHN0cmVhbWluZyBvciBvZmZsaW5lIGNvbnRlbnQsIG9yIHRvIHJlbGVhc2UgcHJldmlvdXNseSBhY3F1aXJlZCBrZXlzLCB3aGljaCBhcmUKKyAqICAgaWRlbnRpZmllZCBieSBhIGtleVNldElkLgorICoKKyAqIG9wdGlvbmFsUGFyYW1ldGVycyBhcmUgaW5jbHVkZWQgaW4gdGhlIGtleSByZXF1ZXN0IG1lc3NhZ2UgdG8gYWxsb3cgYSBjbGllbnQKKyAqICAgYXBwbGljYXRpb24gdG8gcHJvdmlkZSBhZGRpdGlvbmFsIG1lc3NhZ2UgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyLgorICoKKyAqIG51bU9wdGlvbmFsUGFyYW1ldGVycyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzIHByb3ZpZGVkCisgKiAgIGJ5IHRoZSBjYWxsZXIKKyAqCisgKiBPbiBleGl0OgorICogICBJZiB0aGlzIHJldHVybnMgQU1FRElBX09LLAorICogICAxLiBUaGUga2V5UmVxdWVzdCBwb2ludGVyIHdpbGwgcmVmZXJlbmNlIHRoZSBvcGFxdWUga2V5IHJlcXVlc3QgZGF0YS4gIEl0CisgKiAgICAgICB3aWxsIHJlc2lkZSBpbiBtZW1vcnkgb3duZWQgYnkgdGhlIEFNZWRpYURybSBvYmplY3QsIGFuZCB3aWxsIHJlbWFpbgorICogICAgICAgYWNjZXNzaWJsZSB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIGVpdGhlciBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdAorICogICAgICAgb3IgQU1lZGlhRHJtX2dldEtleVJlcXVlc3RXaXRoRGVmYXVsdFVybEFuZFR5cGUgb3IgdW50aWwgdGhlCisgKiAgICAgICBNZWRpYURybSBvYmplY3QgaXMgcmVsZWFzZWQuCisgKiAgIDIuIGtleVJlcXVlc3RTaXplIHdpbGwgYmUgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSByZXF1ZXN0LgorICogICAzLiBkZWZhdWx0VXJsIHdpbGwgYmUgc2V0IHRvIHRoZSByZWNvbW1lbmRlZCBVUkwgdG8gZGVsaXZlciB0aGUga2V5IHJlcXVlc3QuCisgKiAgICAgIFRoZSBkZWZhdWx0VXJsIHBvaW50ZXIgd2lsbCByZWZlcmVuY2UgYSBOVUxMIHRlcm1pbmF0ZWQgVVJMIHN0cmluZy4KKyAqICAgICAgSXQgd2lsbCBiZSBVVEYtOCBlbmNvZGVkIGFuZCBoYXZlIHNhbWUgbGlmZXRpbWUgd2l0aCB0aGUga2V5IHJlcXVlc3QgZGF0YQorICogICAgICBLZXlSZXF1ZXN0IHBvaW50ZXIgcmVmZXJlbmNlcyB0by4gUGFzc2luZyBpbiBOVUxMIG1lYW5zIHlvdSBkb24ndCBuZWVkIGl0CisgKiAgICAgIHRvIGJlIHJlcG9ydGVkLgorICogICA0LiBrZXlSZXF1ZXN0VHlwZSB3aWxsIGJlIHNldCB0byB0aGUga2V5IHJlcXVlc3QgdHlwZS4gUGFzc2luZyBpbiBOVUxMIG1lYW5zCisqICAgICAgIHlvdSBkb24ndCBuZWVkIGl0IHRvIGJlIHJlcG9ydGVkLgorICoKKyAqIFJldHVybnMgTUVESUFEUk1fTk9UX1BST1ZJU0lPTkVEX0VSUk9SIGlmIHJlcHJvdmlzaW9uaW5nIGlzIG5lZWRlZCwgZHVlIHRvIGEKKyAqIHByb2JsZW0gd2l0aCB0aGUgZGV2aWNlIGNlcnRpZmljYXRlLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMzMuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0V2l0aERlZmF1bHRVcmxBbmRUeXBlKEFNZWRpYURybSAqLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1TY29wZSAqc2NvcGUsIGNvbnN0IHVpbnQ4X3QgKmluaXQsIHNpemVfdCBpbml0U2l6ZSwKKyAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsIEFNZWRpYURybUtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtS2V5VmFsdWUgKm9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgc2l6ZV90IG51bU9wdGlvbmFsUGFyYW1ldGVycywgY29uc3QgdWludDhfdCAqKmtleVJlcXVlc3QsCisgICAgICAgIHNpemVfdCAqa2V5UmVxdWVzdFNpemUsIGNvbnN0IGNoYXIgKipkZWZhdWx0VXJsLAorICAgICAgICBBTWVkaWFEcm1LZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpIF9fSU5UUk9EVUNFRF9JTihfX0FORFJPSURfQVBJX1RfXyk7CisKKy8qKgogICogQSBrZXkgcmVzcG9uc2UgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgbGljZW5zZSBzZXJ2ZXIgYnkgdGhlIGFwcCwgdGhlbiBpdCBpcwogICogcHJvdmlkZWQgdG8gdGhlIERSTSBlbmdpbmUgcGx1Z2luIHVzaW5nIHByb3ZpZGVLZXlSZXNwb25zZS4gIFdoZW4gdGhlCiAgKiByZXNwb25zZSBpcyBmb3IgYW4gb2ZmbGluZSBrZXkgcmVxdWVzdCwgYSBrZXlTZXRJZCBpcyByZXR1cm5lZCB0aGF0IGNhbiBiZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKaW5kZXggZmJkODU1ZC4uMjE5NTY1NyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCkBAIC0zMTEsNiArMzExLDEwIEBACiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQVNUX1NBTVBMRV9JTkRFWF9JTl9DSFVOSyBfX0lOVFJPRFVDRURfSU4oMzEpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1RJTUVfQkVGT1JFX0FQUEVORCBfX0lOVFJPRFVDRURfSU4oMzEpOwogCitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QSUNUVVJFX1RZUEUgX19JTlRST0RVQ0VEX0lOKDMzKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1ZJREVPX0VOQ09ESU5HX1NUQVRJU1RJQ1NfTEVWRUwgX19JTlRST0RVQ0VEX0lOKDMzKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1ZJREVPX1FQX0FWRVJBR0UgX19JTlRST0RVQ0VEX0lOKDMzKTsKKwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9CX01BWCBfX0lOVFJPRFVDRURfSU4oMzEpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9CX01JTiBfX0lOVFJPRFVDRURfSU4oMzEpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9JX01BWCBfX0lOVFJPRFVDRURfSU4oMzEpOwpAQCAtMzIwLDYgKzMyNCwzNCBAQAogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9QX01BWCBfX0lOVFJPRFVDRURfSU4oMzEpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9QX01JTiBfX0lOVFJPRFVDRURfSU4oMzEpOwogCisvKioKKyAqIE1QRUctSCBhdWRpbyBwcm9maWxlIGFuZCBsZXZlbCBjb21wYXRpYmlsaXR5LgorICoKKyAqIFNlZSBGREFtZF8yIG9mIElTT19JRUNfMjMwMDgtMzsyMDE5IE1IQVByb2ZpbGVBbmRMZXZlbENvbXBhdGliaWxpdHlTZXRCb3guCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMi4KKyAqLworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFR0hfQ09NUEFUSUJMRV9TRVRTIF9fSU5UUk9EVUNFRF9JTigzMik7CisKKy8qKgorICogTVBFRy1IIGF1ZGlvIHByb2ZpbGUgbGV2ZWwgaW5kaWNhdGlvbi4KKyAqCisgKiBTZWUgSVNPX0lFQ18yMzAwOC0zOzIwMTkgTUhBRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQgbXBlZ2gzZGFQcm9maWxlTGV2ZWxJbmRpY2F0aW9uLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMzIuCisgKi8KK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01QRUdIX1BST0ZJTEVfTEVWRUxfSU5ESUNBVElPTiBfX0lOVFJPRFVDRURfSU4oMzIpOworCisvKioKKyAqIE1QRUctSCBhdWRpbyByZWZlcmVuY2UgY2hhbm5lbCBsYXlvdXQuCisgKgorICogU2VlIElTT19JRUNfMjMwMDgtMzsyMDE5IE1IQURlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkIHJlZmVyZW5jZUNoYW5uZWxMYXlvdXQKKyAqIGFuZCBJU09fSUVDXzIzMDAx4oCQOCBDaGFubmVsQ29uZmlndXJhdGlvbiB2YWx1ZS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMyLgorICovCitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHSF9SRUZFUkVOQ0VfQ0hBTk5FTF9MQVlPVVQgX19JTlRST0RVQ0VEX0lOKDMyKTsKKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0IGIvbWVkaWEvbmRrL2xpYm1lZGlhbmRrLm1hcC50eHQKaW5kZXggN2U5ZTU3ZS4uYzhmYWNlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2xpYm1lZGlhbmRrLm1hcC50eHQKKysrIGIvbWVkaWEvbmRrL2xpYm1lZGlhbmRrLm1hcC50eHQKQEAgLTEyNiw2ICsxMjYsOSBAQAogICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRTsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEE7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX01QRUcyX1NUUkVBTV9IRUFERVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX01QRUdIX0NPTVBBVElCTEVfU0VUUzsgIyB2YXIgaW50cm9kdWNlZD0zMgorICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFR0hfUFJPRklMRV9MRVZFTF9JTkRJQ0FUSU9OOyAjIHZhciBpbnRyb2R1Y2VkPTMyCisgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHSF9SRUZFUkVOQ0VfQ0hBTk5FTF9MQVlPVVQ7ICMgdmFyIGludHJvZHVjZWQ9MzIKICAgICBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HOyAjIHZhciBpbnRyb2R1Y2VkPTI4CkBAIC0yMDAsNiArMjAzLDcgQEAKICAgICBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyOwogICAgIEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXJBdFRpbWU7CiAgICAgQU1lZGlhQ29kZWNfc2V0QXN5bmNOb3RpZnlDYWxsYmFjazsgIyBpbnRyb2R1Y2VkPTI4CisgICAgQU1lZGlhQ29kZWNfc2V0T25GcmFtZVJlbmRlcmVkQ2FsbGJhY2s7ICMgaW50cm9kdWNlZD1UaXJhbWlzdQogICAgIEFNZWRpYUNvZGVjX3NldE91dHB1dFN1cmZhY2U7ICMgaW50cm9kdWNlZD0yNAogICAgIEFNZWRpYUNvZGVjX3NldFBhcmFtZXRlcnM7ICMgaW50cm9kdWNlZD0yNgogICAgIEFNZWRpYUNvZGVjX3NldElucHV0U3VyZmFjZTsgIyBpbnRyb2R1Y2VkPTI2CkBAIC0yMjYsNiArMjMwLDcgQEAKICAgICBBTWVkaWFEcm1fZGVjcnlwdDsKICAgICBBTWVkaWFEcm1fZW5jcnlwdDsKICAgICBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdDsKKyAgICBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdFdpdGhEZWZhdWx0VXJsQW5kVHlwZTsgIyBpbnRyb2R1Y2VkPVRpcmFtaXN1CiAgICAgQU1lZGlhRHJtX2dldFByb3BlcnR5Qnl0ZUFycmF5OwogICAgIEFNZWRpYURybV9nZXRQcm9wZXJ0eVN0cmluZzsKICAgICBBTWVkaWFEcm1fZ2V0UHJvdmlzaW9uUmVxdWVzdDsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBiMTc1NDFkLi43NWQ3M2JmIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zMCw3ICszMCw4IEBACiAgICAgICAgIGFuZHJvaWQ6cm91bmRJY29uPSJAbWlwbWFwL2ljX2xhdW5jaGVyX3JvdW5kIgogICAgICAgICBhbmRyb2lkOnN1cHBvcnRzUnRsPSJ0cnVlIgogICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvQXBwVGhlbWUiPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXIuTWFpbkFjdGl2aXR5Ij4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyLk1haW5BY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgpAQCAtNDIsNCArNDMsNCBAQAogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhLnNhbXBsZXZpZGVvZW5jb2RlciIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iU2FtcGxlVmlkZW9FbmNvZGVyIFRlc3QiLz4KIAotPC9tYW5pZmVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9BbmRyb2lkLmJwCmluZGV4IDJlMDZkYTUuLjRiNDRkY2YgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvQW5kcm9pZC5icAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L0FuZHJvaWQuYnAKQEAgLTY5LDcgKzY5LDYgQEAKIGphdmFfZGVmYXVsdHMgewogICAgIG5hbWU6ICJNZWRpYUJlbmNobWFyay1kZWZhdWx0cyIsCiAKLSAgICBzZGtfdmVyc2lvbjogInN5c3RlbV9jdXJyZW50IiwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOCIsCi0gICAgdGFyZ2V0X3Nka192ZXJzaW9uOiAiMjkiLAorICAgIHRhcmdldF9zZGtfdmVyc2lvbjogIjMwIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvYnVpbGQuZ3JhZGxlIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9idWlsZC5ncmFkbGUKaW5kZXggYjJhZWUxYS4uYjIyMmQ0NyAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9idWlsZC5ncmFkbGUKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9idWlsZC5ncmFkbGUKQEAgLTE3LDIxICsxNywyMSBAQAogYnVpbGRzY3JpcHQgewogICAgIHJlcG9zaXRvcmllcyB7CiAgICAgICAgIGdvb2dsZSgpCi0gICAgICAgIGpjZW50ZXIoKQorICAgICAgICBtYXZlbkNlbnRyYWwoKQogICAgIH0KICAgICBkZXBlbmRlbmNpZXMgewotICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTozLjUuMCcKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6NC4yLjEnCiAgICAgfQogfQogCiBhcHBseSBwbHVnaW46ICdjb20uYW5kcm9pZC5hcHBsaWNhdGlvbicKIAogYW5kcm9pZCB7Ci0gICAgY29tcGlsZVNka1ZlcnNpb24gMjkKKyAgICBjb21waWxlU2RrVmVyc2lvbiAzMAogICAgIGRlZmF1bHRDb25maWcgewogICAgICAgICBhcHBsaWNhdGlvbklkICJjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsiCiAgICAgICAgIG1pblNka1ZlcnNpb24gMjgKLSAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiAyOQorICAgICAgICB0YXJnZXRTZGtWZXJzaW9uIDMwCiAgICAgICAgIHZlcnNpb25Db2RlIDEKICAgICAgICAgdmVyc2lvbk5hbWUgIjEuMCIKICAgICAgICAgdGVzdEluc3RydW1lbnRhdGlvblJ1bm5lciAiYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgpAQCAtNTcsMjAgKzU3LDIwIEBACiAgICAgZXh0ZXJuYWxOYXRpdmVCdWlsZCB7CiAgICAgICAgIGNtYWtlIHsKICAgICAgICAgICAgIHBhdGggInNyYy9tYWluL2NwcC9DTWFrZUxpc3RzLnR4dCIKLSAgICAgICAgICAgIHZlcnNpb24gIjMuMTAuMiIKKyAgICAgICAgICAgIHZlcnNpb24gIjMuMTguMSIKICAgICAgICAgfQogICAgIH0KIH0KIAogcmVwb3NpdG9yaWVzIHsKICAgICBnb29nbGUoKQotICAgIGpjZW50ZXIoKQorICAgIG1hdmVuQ2VudHJhbCgpCiB9CiAKIGRlcGVuZGVuY2llcyB7CiAgICAgaW1wbGVtZW50YXRpb24gZmlsZVRyZWUoZGlyOiAnbGlicycsIGluY2x1ZGU6IFsnKi5qYXInXSkKLSAgICBpbXBsZW1lbnRhdGlvbiAnYW5kcm9pZHguYXBwY29tcGF0OmFwcGNvbXBhdDoxLjEuMCcKLSAgICB0ZXN0SW1wbGVtZW50YXRpb24gJ2p1bml0Omp1bml0OjQuMTInCi0gICAgYW5kcm9pZFRlc3RJbXBsZW1lbnRhdGlvbiAnYW5kcm9pZHgudGVzdDpydW5uZXI6MS4yLjAnCi0gICAgYW5kcm9pZFRlc3RJbXBsZW1lbnRhdGlvbiAnYW5kcm9pZHgudGVzdC5leHQ6anVuaXQ6MS4xLjEnCisgICAgaW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LmFwcGNvbXBhdDphcHBjb21wYXQ6MS4zLjAnCisgICAgdGVzdEltcGxlbWVudGF0aW9uICdqdW5pdDpqdW5pdDo0LjEzLjInCisgICAgYW5kcm9pZFRlc3RJbXBsZW1lbnRhdGlvbiAnYW5kcm9pZHgudGVzdDpydW5uZXI6MS4zLjAnCisgICAgYW5kcm9pZFRlc3RJbXBsZW1lbnRhdGlvbiAnYW5kcm9pZHgudGVzdC5leHQ6anVuaXQ6MS4xLjInCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL0FuZHJvaWQuYnAKaW5kZXggYWY5MjQyNC4uMDE5MmQ2OCAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvQW5kcm9pZC5icAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9BbmRyb2lkLmJwCkBAIC05LDcgKzksNiBAQAogCiBjY190ZXN0X2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYWJlbmNobWFya19qbmkiLAotICAgIHNka192ZXJzaW9uOiAiY3VycmVudCIsCiAKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfY29tbW9uLWRlZmF1bHRzIiwKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9BbmRyb2lkLmJwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvY29tbW9uL0FuZHJvaWQuYnAKaW5kZXggNmI1NGM2YS4uNzk4ODk3OSAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTU1LDcgKzU1LDYgQEAKIAogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJtZWRpYWJlbmNobWFyay1kZWZhdWx0cyIsCi0gICAgc2RrX3ZlcnNpb246ICJjdXJyZW50IiwKICAgICBzdGw6ICJjKytfc2hhcmVkIiwKIAogICAgIHNoYXJlZF9saWJzOiBbCkBAIC05NSwxMCArOTQsNiBAQAogICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUiLAotICAgIF0sCi0KICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliY29kZWMyX2NsaWVudCIsCiAgICAgICAgICJsaWJtZWRpYW5kayIsCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9leHRyYWN0b3IvRXh0cmFjdG9yLmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2V4dHJhY3Rvci9FeHRyYWN0b3IuY3BwCmluZGV4IGYwYmIzYjkuLjNiZGZiYWQgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2V4dHJhY3Rvci9FeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2V4dHJhY3Rvci9FeHRyYWN0b3IuY3BwCkBAIC0xMjQsOSArMTI0LDcgQEAKIAogICAgIGludDY0X3Qgc1RpbWUgPSBtU3RhdHMtPmdldEN1clRpbWUoKTsKICAgICBpZiAobUV4dHJhY3RvcikgewotICAgICAgICAvLyBUT0RPOiAoYi8xNDAxMjg1MDUpIE11bHRpcGxlIGNhbGxzIHJlc3VsdCBpbiBEb1MuCi0gICAgICAgIC8vIFVuY29tbWVudCBjYWxsIHRvIEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUoKSBvbmNlIHRoaXMgaXMgcmVzb2x2ZWQKLSAgICAgICAgLy8gQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShtRXh0cmFjdG9yKTsKKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShtRXh0cmFjdG9yKTsKICAgICAgICAgbUV4dHJhY3RvciA9IG51bGxwdHI7CiAgICAgfQogICAgIGludDY0X3QgZVRpbWUgPSBtU3RhdHMtPmdldEN1clRpbWUoKTsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggMGZiZDIwZC4uOWE4Y2FhMyAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTMzLDcgKzMzLDEyIEBACiAKICAgICBzcmNzOiBbIkV4dHJhY3RvclRlc3QuY3BwIl0sCiAKLSAgICBzdGF0aWNfbGliczogWyJsaWJtZWRpYWJlbmNobWFya19leHRyYWN0b3IiXQorICAgIHN0YXRpY19saWJzOiBbImxpYm1lZGlhYmVuY2htYXJrX2V4dHJhY3RvciJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgXSwKIH0KIAogY2NfdGVzdCB7CkBAIC01MCw2ICs1NSwxMSBAQAogICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfZXh0cmFjdG9yIiwKICAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2RlY29kZXIiLAogICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKKyAgICBdLAogfQogCiBjY190ZXN0IHsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRGVjb2RlclRlc3QuY3BwCmluZGV4IDgxZWYwMmEuLjM2NjY3MjQgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0RlY29kZXJUZXN0LmNwcApAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPGxpbWl0cz4KIAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KKwogI2luY2x1ZGUgIkJlbmNobWFya1Rlc3RFbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgIkRlY29kZXIuaCIKIApAQCAtMTc1LDYgKzE3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjMi5hbmRyb2lkLmhldmMuZGVjb2RlciIsIHRydWUpKSk7CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIEFCaW5kZXJQcm9jZXNzX3N0YXJ0VGhyZWFkUG9vbCgpOwogICAgIGdFbnYgPSBuZXcgQmVuY2htYXJrVGVzdEVudmlyb25tZW50KCk7CiAgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5jcHAKaW5kZXggZDE0ZDE1Yi4uMjdlZTliYSAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0V4dHJhY3RvclRlc3QuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FeHRyYWN0b3JUZXN0LmNwcApAQCAtMTksNiArMTksOCBAQAogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KKwogI2luY2x1ZGUgIkJlbmNobWFya1Rlc3RFbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgIkV4dHJhY3Rvci5oIgogCkBAIC03Myw2ICs3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKSk7CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIEFCaW5kZXJQcm9jZXNzX3N0YXJ0VGhyZWFkUG9vbCgpOwogICAgIGdFbnYgPSBuZXcgQmVuY2htYXJrVGVzdEVudmlyb25tZW50KCk7CiAgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvdXRpbHMvQW5kcm9pZC5icAppbmRleCBiZmU3M2Q1Li5hMzhlZjU3IDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTI4LDEyICsyOCwxOCBAQAogICAgICAgICAiQUltYWdlUmVhZGVyVXRpbHMuY3BwIiwKICAgICAgICAgIkJhdHRlcnlOb3RpZmllci5jcHAiLAogICAgICAgICAiSVNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNwcCIsCisgICAgICAgICJMaWJyYXJ5LmNwcCIsCiAgICAgICAgICJMaW1pdFByb2Nlc3NNZW1vcnkuY3BwIiwKKyAgICAgICAgIk1lZGlhVXRpbHNEZWxheWVkLmNwcCIsCiAgICAgICAgICJNZW1vcnlMZWFrVHJhY2tVdGlsLmNwcCIsCisgICAgICAgICJNZXRob2RTdGF0aXN0aWNzLmNwcCIsCisgICAgICAgICJQcm9jZXNzLmNwcCIsCiAgICAgICAgICJQcm9jZXNzSW5mby5jcHAiLAogICAgICAgICAiU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuY3BwIiwKICAgICAgICAgIlNlcnZpY2VVdGlsaXRpZXMuY3BwIiwKKyAgICAgICAgIlRocmVhZFNuYXBzaG90LmNwcCIsCiAgICAgICAgICJUaW1lQ2hlY2suY3BwIiwKKyAgICAgICAgIlRpbWVyVGhyZWFkLmNwcCIsCiAgICAgXSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliY19tYWxsb2NfZGVidWdfYmFja3RyYWNlIiwKQEAgLTQyLDcgKzQ4LDcgQEAKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAotICAgICAgICAibGliYXVkaW91dGlscyIsIC8vIGZvciBjbG9jay5oCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwgLy8gZm9yIGNsb2NrLmgsIFN0YXRpc3RpY3MuaAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtNTEsNiArNTcsNyBAQAogICAgICAgICAibGlicGVybWlzc2lvbiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYmJhdHRlcnlzdGF0c19haWRsIiwKQEAgLTczLDYgKzgwLDEwIEBACiAgICAgICAgICJsaWJwZXJtaXNzaW9uIiwKICAgICBdLAogCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgImxpYm1lZGlhdXRpbHNfZGVsYXllZCIsICAvLyBsYXp5IGxvYWRlZAorICAgIF0sCisKICAgICBpbmNsdWRlX2RpcnM6IFsKICAgICAgICAgLy8gRm9yIERFQlVHR0VSX1NJR05BTAogICAgICAgICAic3lzdGVtL2NvcmUvZGVidWdnZXJkL2luY2x1ZGUiLApAQCAtODEsOSArOTIsNjggQEAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KIAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYm1lZGlhdXRpbHNfZGVsYXllZCIsIC8vIG1hdGNoIHdpdGggTUVESUFVVElMU19ERUxBWUVEX0xJQlJBUllfTkFNRQorICAgIHNyY3M6IFsKKyAgICAgICAgIk1lZGlhVXRpbHNEZWxheWVkTGlicmFyeS5jcHAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ1dGlsc2NhbGxzdGFjayIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYm1lZGlhdXRpbHNfdmVuZG9yIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLCAgLy8gcmVxdWlyZWQgZm9yIHBsYXRmb3JtL2hhcmR3YXJlL2ludGVyZmFjZXMKKyAgICBzcmNzOiBbCisgICAgICAgICJNZW1vcnlMZWFrVHJhY2tVdGlsLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliY19tYWxsb2NfZGVidWdfYmFja3RyYWNlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImJpb25pY19saWJjX3BsYXRmb3JtX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQorCisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYm1lZGlhdXRpbHNfaGVhZGVycyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwgIC8vIHJlcXVpcmVkIGZvciBwbGF0Zm9ybS9oYXJkd2FyZS9pbnRlcmZhY2VzCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KKworY2NfdGVzdCB7CisgICAgbmFtZTogImxpYm1lZGlhdXRpbHNfdGVzdCIsCisgICAgc3JjczogWworICAgICAgICAibWVtb3J5LXRlc3QuY3BwIiwKKyAgICAgICAgIlRpbWVyVGhyZWFkLXRlc3QuY3BwIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAibGlidXRpbHMiLAorICAgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL0xpYnJhcnkuY3BwIGIvbWVkaWEvdXRpbHMvTGlicmFyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlMjJiZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL0xpYnJhcnkuY3BwCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkxpYnJhcnkiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9MaWJyYXJ5Lmg+CisKK25hbWVzcGFjZSB7CisKK3N0ZDo6c3RyaW5nIGRsZXJyb3JJZlByZXNlbnQoKSB7CisgICAgY29uc3QgY2hhciAqZGxlcnIgPSBkbGVycm9yKCk7CisgICAgaWYgKGRsZXJyID09IG51bGxwdHIpIHJldHVybiAiZGxlcnJvcjogbm9uZSI7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJkbGVycm9yOiAnIikuYXBwZW5kKGRsZXJyKS5hcHBlbmQoIiciKTsKK30KKworfQorbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMgeworCitzdGQ6OnNoYXJlZF9wdHI8dm9pZD4gbG9hZExpYnJhcnkoY29uc3QgY2hhciAqbGlicmFyeU5hbWUsIGludCBmbGFncykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjx2b2lkPiBsaWJyYXJ5eworICAgICAgICBkbG9wZW4obGlicmFyeU5hbWUsIGZsYWdzKSwKKyAgICAgICAgW10odm9pZCAqbGliKSB7CisgICAgICAgICAgICBpZiAobGliICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgcmV0ID0gZGxjbG9zZShsaWIpOworICAgICAgICAgICAgICAgIEFMT0dXX0lGKHJldCAhPTAsICIlczogZGxjbG9zZSglcCkgPT0gJWQsICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBsaWIsIHJldCwgZGxlcnJvcklmUHJlc2VudCgpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIGlmICghbGlicmFyeSkgeworICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCBsb2FkIGxpYnJhcnlOYW1lICVzLCAlcyIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbGlicmFyeU5hbWUsIGRsZXJyb3JJZlByZXNlbnQoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKyAgICByZXR1cm4gbGlicmFyeTsKK30KKworc3RkOjpzaGFyZWRfcHRyPHZvaWQ+IGdldFVudHlwZWRPYmplY3RGcm9tTGlicmFyeSgKKyAgICAgICAgY29uc3QgY2hhciAqb2JqZWN0TmFtZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPHZvaWQ+JiBsaWJyYXJ5KSB7CisgICAgaWYgKCFsaWJyYXJ5KSB7CisgICAgICAgIEFMT0dXKCIlczogbnVsbCBsaWJyYXJ5LCBjYW5ub3QgbG9hZCBvYmplY3ROYW1lICVzIiwgX19mdW5jX18sIG9iamVjdE5hbWUpOworICAgICAgICByZXR1cm4ge307CisgICAgfQorICAgIHZvaWQgKnB0ciA9IGRsc3ltKGxpYnJhcnkuZ2V0KCksIG9iamVjdE5hbWUpOworICAgIGlmIChwdHIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCBsb2FkIG9iamVjdE5hbWUgJXMsICVzIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgb2JqZWN0TmFtZSwgZGxlcnJvcklmUHJlc2VudCgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4ge307CisgICAgfQorCisgICAgLy8gTm90ZTogd2UgdXNlIHRoZSAiYWxpYXNpbmciIGNvbnN0cnVjdG9yIG9mIHRoZSBzdGQ6c2hhcmVkX3B0ci4KKyAgICAvLworICAgIC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9tZW1vcnkvc2hhcmVkX3B0ci9zaGFyZWRfcHRyCisgICAgLy8KKyAgICByZXR1cm4geyBsaWJyYXJ5LCBwdHIgfTsgIC8vIHJldHVybnMgc2hhcmVkX3B0ciB0byBwdHIsIGJ1dCByZWYgY291bnRlZCBvbiBsaWJyYXJ5LgorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9NZWRpYVV0aWxzRGVsYXllZC5jcHAgYi9tZWRpYS91dGlscy9NZWRpYVV0aWxzRGVsYXllZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjMDkyZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL01lZGlhVXRpbHNEZWxheWVkLmNwcApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhdXRpbHMvTGlicmFyeS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvTWVkaWFVdGlsc0RlbGF5ZWQuaD4KKyNpbmNsdWRlICJNZWRpYVV0aWxzRGVsYXllZExpYnJhcnkuaCIKKworI2RlZmluZSBMT0dfVEFHICJNZWRpYVV0aWxzRGVsYXllZCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworbmFtZXNwYWNlIHsKKy8vICBTcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZvciBNZWRpYVV0aWxzIERlbGF5ZWQgTGlicmFyeS4KKworLy8gVGhlIGZvbGxvd2luZyB1c2Ugc3RhdGljIE1leWVyJ3Mgc2luZ2xldG9uIGNhY2hlcyBpbnN0ZWFkIG9mIGxldHRpbmcKKy8vIHJlZmNvdW50ZWQgbWFuYWdlbWVudCBhcyBwcm92aWRlZCBhYm92ZS4gVGhpcyBpcyBmb3Igc3BlZWQuCitzdGQ6OnNoYXJlZF9wdHI8dm9pZD4gZ2V0RGVsYXllZExpYnJhcnkoKSB7CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjx2b2lkPiBsaWJyYXJ5ID0gbG9hZExpYnJhcnkoTUVESUFVVElMU19ERUxBWUVEX0xJQlJBUllfTkFNRSk7CisgICAgcmV0dXJuIGxpYnJhcnk7Cit9CisKKy8vIEdldCB0aGUgZGVsYXllZCBkaXNwYXRjaCB0YWJsZS4gIFRoaXMgaXMgcmVmY291bnRlZCBhbmQga2VlcHMgdGhlIHVuZGVybHlpbmcgbGlicmFyeSBhbGl2ZS4KK3N0ZDo6c2hhcmVkX3B0cjxkZWxheWVkX2xpYnJhcnk6OkRlbGF5ZWREaXNwYXRjaFRhYmxlPiBnZXREZWxheWVkRGlzcGF0Y2hUYWJsZSgpIHsKKyAgICBzdGF0aWMgYXV0byBkZWxheWVkRGlzcGF0Y2hUYWJsZSA9CisgICAgICAgICAgICBnZXRPYmplY3RGcm9tTGlicmFyeTxkZWxheWVkX2xpYnJhcnk6OkRlbGF5ZWREaXNwYXRjaFRhYmxlPigKKyAgICAgICAgICAgICAgICAgICAgTUVESUFVVElMU19ERUxBWUVEX0RJU1BBVENIX1RBQkxFX1NZTUJPTF9OQU1FLCBnZXREZWxheWVkTGlicmFyeSgpKTsKKyAgICByZXR1cm4gZGVsYXllZERpc3BhdGNoVGFibGU7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKKy8vIFB1YmxpYyBpbXBsZW1lbnRhdGlvbnMgb2YgbWV0aG9kcyBoZXJlLgorCitzdGQ6OnN0cmluZyBnZXRDYWxsU3RhY2tTdHJpbmdGb3JUaWQocGlkX3QgdGlkKSB7CisgICAgYXV0byBkZWxheWVkRGlzcGF0Y2hUYWJsZSA9IGdldERlbGF5ZWREaXNwYXRjaFRhYmxlKCk7CisgICAgaWYgKCFkZWxheWVkRGlzcGF0Y2hUYWJsZSkgcmV0dXJuIHt9OyAgLy8gb24gZmFpbHVyZSwgcmV0dXJuIGVtcHR5IHN0cmluZworICAgIHJldHVybiBkZWxheWVkRGlzcGF0Y2hUYWJsZS0+Z2V0Q2FsbFN0YWNrU3RyaW5nRm9yVGlkKHRpZCk7Cit9CisKK30gLy8gYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvTWVkaWFVdGlsc0RlbGF5ZWRMaWJyYXJ5LmNwcCBiL21lZGlhL3V0aWxzL01lZGlhVXRpbHNEZWxheWVkTGlicmFyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1NGMxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL01lZGlhVXRpbHNEZWxheWVkTGlicmFyeS5jcHAKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJNZWRpYVV0aWxzRGVsYXllZExpYnJhcnkuaCIKKyNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4KKworLy8gTWV0aG9kcyB0aGF0IGFyZSBkeW5hbWljYWxseSBsaW5rZWQuCituYW1lc3BhY2UgeworCitzdGQ6OnN0cmluZyBnZXRDYWxsU3RhY2tTdHJpbmdGb3JUaWQocGlkX3QgdGlkKSB7CisgICAgYW5kcm9pZDo6Q2FsbFN0YWNrIGNze307CisgICAgY3MudXBkYXRlKDAgLyogaWdub3JlRGVwdGggKi8sIHRpZCk7CisgICAgcmV0dXJuIGNzLnRvU3RyaW5nKCkuY19zdHIoKTsKK30KKworfSAvLyBuYW1lc3BhY2UKKworLy8gbGVhdmUgZ2xvYmFsLCB0aGlzIGlzIHBpY2tlZCB1cCBmcm9tIGR5bmFtaWMgbGlua2luZworYW5kcm9pZDo6bWVkaWF1dGlsczo6ZGVsYXllZF9saWJyYXJ5OjpEZWxheWVkRGlzcGF0Y2hUYWJsZSBnRGVsYXllZERpc3BhdGNoVGFibGUgeworICAgIGdldENhbGxTdGFja1N0cmluZ0ZvclRpZCwKK307CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9NZWRpYVV0aWxzRGVsYXllZExpYnJhcnkuaCBiL21lZGlhL3V0aWxzL01lZGlhVXRpbHNEZWxheWVkTGlicmFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNzJhM2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9NZWRpYVV0aWxzRGVsYXllZExpYnJhcnkuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8vIFRoaXMgc2hvdWxkIG5vdCBiZSBkaXJlY3RseSBpbmNsdWRlZCBieSBjbGllbnRzLgorLy8gVXNlIE1lZGlhVXRpbHNEZWxheWVkLmggaW5zdGVhZC4KKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHM6OmRlbGF5ZWRfbGlicmFyeSB7CisKKy8vIFVzZSBhIGRpc3BhdGNoIHRhYmxlIHRvIHJldHVybiBtZXRob2RzIGZyb20gdGhlIGRlbGF5ZWQgbGlicmFyeQorc3RydWN0IERlbGF5ZWREaXNwYXRjaFRhYmxlIHsKKyAgICBzdGQ6OnN0cmluZyAoKmdldENhbGxTdGFja1N0cmluZ0ZvclRpZCkocGlkX3QgdGlkKTsKK307CisKKy8vIE1hdGNoIHdpdGggQW5kcm9pZC5icCBhbmQgTWVkaWFVdGlsc0RlbGF5ZWQuY3BwLgorI2RlZmluZSBNRURJQVVUSUxTX0RFTEFZRURfTElCUkFSWV9OQU1FICJsaWJtZWRpYXV0aWxzX2RlbGF5ZWQuc28iCisKKy8vIE1hdGNoIHdpdGggTWVkaWFVdGlsc0RlbGF5ZWQuY3BwIGFuZCBNZWRpYVV0aWxzRGVsYXllZExpYnJhcnkuY3BwCisjZGVmaW5lIE1FRElBVVRJTFNfREVMQVlFRF9ESVNQQVRDSF9UQUJMRV9TWU1CT0xfTkFNRSAiZ0RlbGF5ZWREaXNwYXRjaFRhYmxlIgorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzOjpkZWxheWVkX2xpYnJhcnkKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL01ldGhvZFN0YXRpc3RpY3MuY3BwIGIvbWVkaWEvdXRpbHMvTWV0aG9kU3RhdGlzdGljcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3OWIyMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL01ldGhvZFN0YXRpc3RpY3MuY3BwCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWF1dGlscy9NZXRob2RTdGF0aXN0aWNzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworLy8gUmVwb3NpdG9yeSBmb3IgTWV0aG9kU3RhdGlzdGljcyBPYmplY3RzCisKK3N0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+CitnZXRTdGF0aXN0aWNzQ2xhc3Nlc0Zvck1vZHVsZShzdGQ6OnN0cmluZ192aWV3IG1vZHVsZU5hbWUpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+PiBtIHsKKyAgICAgICAgeworICAgICAgICAgICAgTUVUSE9EX1NUQVRJU1RJQ1NfTU9EVUxFX05BTUVfQVVESU9fSElETCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+KAorICAgICAgICAgICAgICAgIG5ldyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57CisgICAgICAgICAgICAgICAgIkRldmljZUhhbEhpZGwiLAorICAgICAgICAgICAgICAgICJFZmZlY3RIYWxIaWRsIiwKKyAgICAgICAgICAgICAgICAiU3RyZWFtSW5IYWxIaWRsIiwKKyAgICAgICAgICAgICAgICAiU3RyZWFtT3V0SGFsSGlkbCIsCisgICAgICAgICAgICAgIH0pCisgICAgICAgIH0sCisgICAgfTsKKyAgICBhdXRvIGl0ID0gbS5maW5kKHttb2R1bGVOYW1lLmJlZ2luKCksIG1vZHVsZU5hbWUuZW5kKCl9KTsKKyAgICBpZiAoaXQgPT0gbS5lbmQoKSkgcmV0dXJuIHt9OworICAgIHJldHVybiBpdC0+c2Vjb25kOworfQorCitzdGF0aWMgdm9pZCBhZGRDbGFzc2VzVG9NYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4gJmNsYXNzTmFtZXMsCisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8TWV0aG9kU3RhdGlzdGljczxzdGQ6OnN0cmluZz4+PiAmbWFwKSB7CisgICAgaWYgKGNsYXNzTmFtZXMpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGFzc05hbWUgOiAqY2xhc3NOYW1lcykgeworICAgICAgICAgICAgbWFwLmVtcGxhY2UoY2xhc3NOYW1lLCBzdGQ6Om1ha2Vfc2hhcmVkPE1ldGhvZFN0YXRpc3RpY3M8c3RkOjpzdHJpbmc+PigpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc2luZ2xldG9uIHN0YXRpc3RpY3MgZm9yIERldmljZUhhbEhpZGwgU3RyZWFtT3V0SGFsSGlkbCBTdHJlYW1JbkhhbEhpZGwKK3N0ZDo6c2hhcmVkX3B0cjxNZXRob2RTdGF0aXN0aWNzPHN0ZDo6c3RyaW5nPj4KK2dldFN0YXRpc3RpY3NGb3JDbGFzcyhzdGQ6OnN0cmluZ192aWV3IGNsYXNzTmFtZSkgeworICAgIHN0YXRpYyBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPE1ldGhvZFN0YXRpc3RpY3M8c3RkOjpzdHJpbmc+Pj4gbSA9CisgICAgICAgIC8vIGNvcHkgZWxpZGVkIGluaXRpYWxpemF0aW9uIG9mIG1hcCBtLgorICAgICAgICBbXSgpeworICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxNZXRob2RTdGF0aXN0aWNzPHN0ZDo6c3RyaW5nPj4+IG07CisgICAgICAgICAgICBhZGRDbGFzc2VzVG9NYXAoCisgICAgICAgICAgICAgICAgICAgIGdldFN0YXRpc3RpY3NDbGFzc2VzRm9yTW9kdWxlKE1FVEhPRF9TVEFUSVNUSUNTX01PRFVMRV9OQU1FX0FVRElPX0hJREwpLAorICAgICAgICAgICAgICAgICAgICBtKTsKKyAgICAgICAgICAgIHJldHVybiBtOworICAgICAgICB9KCk7CisKKyAgICBhdXRvIGl0ID0gbS5maW5kKHtjbGFzc05hbWUuYmVnaW4oKSwgY2xhc3NOYW1lLmVuZCgpfSk7CisgICAgaWYgKGl0ID09IG0uZW5kKCkpIHJldHVybiB7fTsKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKK30KKworfSAvLyBhbmRyb2lkOjptZWRpYXV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9Qcm9jZXNzLmNwcCBiL21lZGlhL3V0aWxzL1Byb2Nlc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZTgwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9Qcm9jZXNzLmNwcApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJQcm9jZXNzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvUHJvY2Vzcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgorI2luY2x1ZGUgPGNzdGRsaWI+CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgcHJvY2Vzc0xpbmUoc3RkOjpzdHJpbmdfdmlldyBzLCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgZG91YmxlPiYgbSkgeworICAgIGlmIChzLmVtcHR5KCkpIHJldHVybjsKKworICAgIGNvbnN0IHNpemVfdCBjb2xvbl9wb3MgPSBzLmZpbmQoJzonKTsKKyAgICBpZiAoY29sb25fcG9zID09IHN0ZDo6c3RyaW5nX3ZpZXc6Om5wb3MpIHJldHVybjsKKworICAgIGNvbnN0IHNpemVfdCBzcGFjZV9wb3MgPSBzLmZpbmQoJyAnKTsKKyAgICBpZiAoc3BhY2VfcG9zID09IDAgfHwgc3BhY2VfcG9zID09IHN0ZDo6c3RyaW5nX3ZpZXc6Om5wb3MgfHwgc3BhY2VfcG9zID4gY29sb25fcG9zKSByZXR1cm47CisgICAgc3RkOjpzdHJpbmcga2V5KHMuZGF0YSgpLCBzLmRhdGEoKSArIHNwYWNlX3Bvcyk7CisKKyAgICBjb25zdCBzaXplX3QgdmFsdWVfcG9zID0gcy5maW5kX2ZpcnN0X25vdF9vZignICcsIGNvbG9uX3BvcyArIDEpOworICAgIGlmICh2YWx1ZV9wb3MgPT0gc3RkOjpzdHJpbmdfdmlldzo6bnBvcykgcmV0dXJuOworCisgICAgY29uc3QgZG91YmxlIHZhbHVlID0gc3RydG9kKHMuZGF0YSgpICsgdmFsdWVfcG9zLCBudWxscHRyIC8qIGVuZCAqLyk7CisgICAgbVtzdGQ6Om1vdmUoa2V5KV0gPSB2YWx1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMgeworCitzdGQ6OnN0cmluZyBnZXRUaHJlYWRTY2hlZEFzU3RyaW5nKHBpZF90IHRpZCkgeworICAgIGNvbnN0IHBpZF90IHBpZCA9IGdldHBpZCgpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBhdGggPSBzdGQ6OnN0cmluZygiL3Byb2MvIikuYXBwZW5kKHN0ZDo6dG9fc3RyaW5nKHBpZCkpCisgICAgICAgICAgICAuYXBwZW5kKCIvdGFzay8iKS5hcHBlbmQoc3RkOjp0b19zdHJpbmcodGlkKSkuYXBwZW5kKCIvc2NoZWQiKTsKKyAgICBzdGQ6OnN0cmluZyBzY2hlZDsKKyAgICAodm9pZClhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKHBhdGguY19zdHIoKSwgJnNjaGVkKTsKKyAgICByZXR1cm4gc2NoZWQ7Cit9CisKK3N0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBkb3VibGU+IHBhcnNlVGhyZWFkU2NoZWRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHNjaGVkU3RyaW5nKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGRvdWJsZT4gbTsKKyAgICBpZiAoc2NoZWRTdHJpbmcuZW1wdHkoKSkgcmV0dXJuIG07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ2xpc3QgPSBhbmRyb2lkOjpiYXNlOjpTcGxpdChzY2hlZFN0cmluZywgIlxuIik7CisKKyAgICAvLyAgT0sgd2UgdXNlIHZhbHVlcyBub3Qgc3RyaW5ncy4uLiBtWyJzdW1tYXJ5Il0gPSBzdHJpbmdsaXN0WzBdOworICAgIGZvciAoc2l6ZV90IGkgPSAyOyBpIDwgc3RyaW5nbGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBwcm9jZXNzTGluZShzdHJpbmdsaXN0W2ldLCBtKTsKKyAgICB9CisgICAgcmV0dXJuIG07Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1Byb2Nlc3NJbmZvLmNwcCBiL21lZGlhL3V0aWxzL1Byb2Nlc3NJbmZvLmNwcAppbmRleCBlMjEyNzk0Li5kYTE5OWM0IDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9Qcm9jZXNzSW5mby5jcHAKKysrIGIvbWVkaWEvdXRpbHMvUHJvY2Vzc0luZm8uY3BwCkBAIC02NCwxMSArNjQsMjcgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBQcm9jZXNzSW5mbzo6aXNWYWxpZFBpZChpbnQgcGlkKSB7Citib29sIFByb2Nlc3NJbmZvOjppc1BpZFRydXN0ZWQoaW50IHBpZCkgeworICAgIHJldHVybiBpc1BpZFVpZFRydXN0ZWQocGlkLCAtMSk7Cit9CisKK2Jvb2wgUHJvY2Vzc0luZm86OmlzUGlkVWlkVHJ1c3RlZChpbnQgcGlkLCBpbnQgdWlkKSB7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgaW50IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgLy8gVHJ1c3QgaXQgaWYgdGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgc2FtZSBwcm9jZXNzIG90aGVyd2lzZSBwaWQgaGFzIHRvIG1hdGNoIHRoZSBjYWxsaW5nIHBpZC4KLSAgICByZXR1cm4gKGNhbGxpbmdQaWQgPT0gZ2V0cGlkKCkpIHx8IChjYWxsaW5nUGlkID09IHBpZCkgfHwgKGNhbGxpbmdVaWQgPT0gQUlEX01FRElBKTsKKyAgICAvLyBBbHdheXMgdHJ1c3Qgd2hlbiB0aGUgY2FsbGVyIGlzIGFjdGluZyBvbiB0aGVpciBvd24gYmVoYWxmLgorICAgIGlmIChwaWQgPT0gY2FsbGluZ1BpZCAmJiAodWlkID09IGNhbGxpbmdVaWQgfHwgdWlkID09IC0xKSkgeyAvLyBVSUQgY2FuIGJlIG9wdGlvbmFsCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBJbXBsaWNpdGx5IHRydXN0IHdoZW4gdGhlIGNhbGxlciBpcyBvdXIgb3duIHByb2Nlc3MuCisgICAgaWYgKGNhbGxpbmdQaWQgPT0gZ2V0cGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIEltcGxpY2l0bHkgdHJ1c3Qgd2hlbiBhIG1lZGlhIHByb2Nlc3MgaXMgY2FsbGluZy4KKyAgICBpZiAoY2FsbGluZ1VpZCA9PSBBSURfTUVESUEpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIE90aGVyd2lzZSwgYWxsb3cgdGhlIGNhbGxlciB0byBhY3QgYXMgYW5vdGhlciBwcm9jZXNzIHdoZW4gdGhlIGNhbGxlciBoYXMgcGVybWlzc2lvbnMuCisgICAgcmV0dXJuIGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5NRURJQV9SRVNPVVJDRV9PVkVSUklERV9QSUQiKSk7CiB9CiAKIGJvb2wgUHJvY2Vzc0luZm86Om92ZXJyaWRlUHJvY2Vzc0luZm8oaW50IHBpZCwgaW50IHByb2NTdGF0ZSwgaW50IG9vbVNjb3JlKSB7CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcCBiL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwCmluZGV4IDljN2I4NjMuLjA3ZjQ1MjkgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwCisrKyBiL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwCkBAIC00NSw2ICs0NSw3IEBACiBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8oImFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iKTsKIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5UGhvbmVTdGF0ZSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURSIpOwogc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlBdWRpb1JvdXRpbmcoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOworc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYWxsQXVkaW9JbnRlcmNlcHRpb24oImFuZHJvaWQucGVybWlzc2lvbi5DQUxMX0FVRElPX0lOVEVSQ0VQVElPTiIpOwogCiBzdGF0aWMgU3RyaW5nMTYgcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKFBlcm1pc3Npb25Db250cm9sbGVyJiBwZXJtaXNzaW9uQ29udHJvbGxlciwKICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4gb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7CkBAIC03MSw2ICs3Miw3IEBACiAgIHN3aXRjaCAoc291cmNlKSB7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfSE9UV09SRDoKICAgICAgIHJldHVybiBBcHBPcHNNYW5hZ2VyOjpPUF9SRUNPUkRfQVVESU9fSE9UV09SRDsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRTogLy8gZmFsbHRocm91Z2gKICAgICBjYXNlIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOgogICAgICAgcmV0dXJuIEFwcE9wc01hbmFnZXI6Ok9QX1JFQ09SRF9BVURJT19PVVRQVVQ7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6CkBAIC0xMDEsNyArMTAzLDExIEBACiAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBteUF0dHJpYnV0aW9uU291cmNlOwogICAgIG15QXR0cmlidXRpb25Tb3VyY2UudWlkID0gVkFMVUVfT1JfRkFUQUwoYW5kcm9pZDo6bGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChnZXR1aWQoKSkpOwogICAgIG15QXR0cmlidXRpb25Tb3VyY2UucGlkID0gVkFMVUVfT1JfRkFUQUwoYW5kcm9pZDo6bGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdChnZXRwaWQoKSkpOwotICAgIG15QXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOworICAgIGlmIChjYWxsZXJBdHRyaWJ1dGlvblNvdXJjZS50b2tlbiAhPSBudWxscHRyKSB7CisgICAgICAgIG15QXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBjYWxsZXJBdHRyaWJ1dGlvblNvdXJjZS50b2tlbjsKKyAgICB9IGVsc2UgeworICAgICAgICBteUF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gc3A8QkJpbmRlcj46Om1ha2UoKTsKKyAgICB9CiAgICAgbXlBdHRyaWJ1dGlvblNvdXJjZS5uZXh0LnB1c2hfYmFjayhuZXh0QXR0cmlidXRpb25Tb3VyY2UpOwogCiAgICAgcmV0dXJuIHN0ZDo6b3B0aW9uYWw8QXR0cmlidXRpb25Tb3VyY2VTdGF0ZT57bXlBdHRyaWJ1dGlvblNvdXJjZX07CkBAIC0xNzUsMTAgKzE4MSwxNCBAQAogCiBib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpIHsKICAgICB1aWRfdCB1aWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KGF0dHJpYnV0aW9uU291cmNlLnVpZCkpOwotICAgIHBpZF90IHBpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QoYXR0cmlidXRpb25Tb3VyY2UucGlkKSk7CiAgICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQodWlkKSkgcmV0dXJuIHRydWU7CiAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlQXVkaW9PdXRwdXQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOwotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzQ2FwdHVyZUF1ZGlvT3V0cHV0LCBwaWQsIHVpZCk7CisgICAgLy8gVXNlIFBlcm1pc3Npb25DaGVja2VyLCB3aGljaCBpbmNsdWRlcyBzb21lIGxvZ2ljIGZvciBhbGxvd2luZyB0aGUgaXNvbGF0ZWQKKyAgICAvLyBIb3R3b3JkRGV0ZWN0aW9uU2VydmljZSB0byBob2xkIGNlcnRhaW4gcGVybWlzc2lvbnMuCisgICAgcGVybWlzc2lvbjo6UGVybWlzc2lvbkNoZWNrZXIgcGVybWlzc2lvbkNoZWNrZXI7CisgICAgYm9vbCBvayA9IChwZXJtaXNzaW9uQ2hlY2tlci5jaGVja1Blcm1pc3Npb25Gb3JQcmVmbGlnaHQoCisgICAgICAgICAgICBzQ2FwdHVyZUF1ZGlvT3V0cHV0LCBhdHRyaWJ1dGlvblNvdXJjZSwgU3RyaW5nMTYoKSwKKyAgICAgICAgICAgIEFwcE9wc01hbmFnZXI6Ok9QX05PTkUpICE9IHBlcm1pc3Npb246OlBlcm1pc3Npb25DaGVja2VyOjpQRVJNSVNTSU9OX0hBUkRfREVOSUVEKTsKICAgICBpZiAoIW9rKSBBTE9HVigiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKICAgICByZXR1cm4gb2s7CiB9CkBAIC0yMTQsNiArMjI0LDE3IEBACiAgICAgcmV0dXJuIG9rOwogfQogCitib29sIGFjY2Vzc1VsdHJhc291bmRBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKSB7CisgICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChhdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKKyAgICB1aWRfdCBwaWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3BpZF90KGF0dHJpYnV0aW9uU291cmNlLnBpZCkpOworICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZCkpIHJldHVybiB0cnVlOworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQWNjZXNzVWx0cmFzb3VuZCgKKyAgICAgICAgImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfVUxUUkFTT1VORCIpOworICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzQWNjZXNzVWx0cmFzb3VuZCwgcGlkLCB1aWQpOworICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfVUxUUkFTT1VORCIpOworICAgIHJldHVybiBvazsKK30KKwogYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpIHsKICAgICAvLyBDQVBUVVJFX0FVRElPX0hPVFdPUkQgcGVybWlzc2lvbiBpbXBsaWVzIFJFQ09SRF9BVURJTyBwZXJtaXNzaW9uCiAgICAgYm9vbCBvayA9IHJlY29yZGluZ0FsbG93ZWQoYXR0cmlidXRpb25Tb3VyY2UpOwpAQCAtMzA0LDYgKzMyNSwxNyBAQAogICAgIHJldHVybiBvazsKIH0KIAorYm9vbCBjYWxsQXVkaW9JbnRlcmNlcHRpb25BbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKSB7CisgICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChhdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKKyAgICBwaWRfdCBwaWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3BpZF90KGF0dHJpYnV0aW9uU291cmNlLnBpZCkpOworCisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc0NhbGxBdWRpb0ludGVyY2VwdGlvbiwgcGlkLCB1aWQpOworICAgIGlmICghb2spIEFMT0dWKCIlcygpOiBhbmRyb2lkLnBlcm1pc3Npb24uQ0FMTF9BVURJT19JTlRFUkNFUFRJT04gZGVuaWVkIGZvciB1aWQgJWQiLAorICAgICAgICBfX2Z1bmNfXywgdWlkKTsKKyAgICByZXR1cm4gb2s7Cit9CisKIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgZ2V0Q2FsbGluZ0F0dHJpYnV0aW9uU291cmNlKCkgewogICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2UgPSBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCk7CiAgICAgYXR0cmlidXRpb25Tb3VyY2UucGlkID0gVkFMVUVfT1JfRkFUQUwobGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdCgKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1RocmVhZFNuYXBzaG90LmNwcCBiL21lZGlhL3V0aWxzL1RocmVhZFNuYXBzaG90LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODI3MzhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvVGhyZWFkU25hcHNob3QuY3BwCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJUaHJlYWRTbmFwc2hvdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1RocmVhZFNuYXBzaG90Lmg+CisKKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1Byb2Nlc3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMgeworCitwaWRfdCBUaHJlYWRTbmFwc2hvdDo6Z2V0VGlkKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgcmV0dXJuIG1TdGF0ZS5tVGlkOworfQorCit2b2lkIFRocmVhZFNuYXBzaG90OjpzZXRUaWQocGlkX3QgdGlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1Mb2NrKTsKKyAgICBpZiAobVN0YXRlLm1UaWQgPT0gdGlkKSByZXR1cm47CisgICAgbVN0YXRlLnJlc2V0KHRpZCk7Cit9CisKK3ZvaWQgVGhyZWFkU25hcHNob3Q6OnJlc2V0KCkgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgbVN0YXRlLnJlc2V0KG1TdGF0ZS5tVGlkKTsKK30KKwordm9pZCBUaHJlYWRTbmFwc2hvdDo6b25CZWdpbigpIHsKKyAgICBzdGQ6OnN0cmluZyBzY2hlZCA9IGdldFRocmVhZFNjaGVkQXNTdHJpbmcoZ2V0VGlkKCkpOyAvLyB0aWQgY291bGQgcmFjZSBoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY2VwdCBhcyBiZW5pZ24uCisgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1Mb2NrKTsKKyAgICBtU3RhdGUub25CZWdpbihzdGQ6Om1vdmUoc2NoZWQpKTsKK30KKwordm9pZCBUaHJlYWRTbmFwc2hvdDo6b25FbmQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1Mb2NrKTsKKyAgICBtU3RhdGUub25FbmQoKTsKK30KKworc3RkOjpzdHJpbmcgVGhyZWFkU25hcHNob3Q6OnRvU3RyaW5nKCkgY29uc3QgeworICAgIC8vIE1ha2UgYSBsb2NhbCBjb3B5IG9mIHRoZSBzdGF0cyBkYXRhIHVuZGVyIGxvY2suCisgICAgU3RhdGUgc3RhdGU7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobUxvY2spOworICAgICAgICBzdGF0ZSA9IG1TdGF0ZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRlLnRvU3RyaW5nKCk7Cit9CisKK3ZvaWQgVGhyZWFkU25hcHNob3Q6OlN0YXRlOjpyZXNldChwaWRfdCB0aWQpIHsKKyAgICBtVGlkID0gdGlkOworICAgIG1CZWdpblRpbWVOcyA9IC0yOworICAgIG1FbmRUaW1lTnMgPSAtMTsKKyAgICBtQ3VtdWxhdGl2ZVRpbWVOcyA9IDA7CisgICAgbUJlZ2luU2NoZWQuY2xlYXIoKTsKK30KKwordm9pZCBUaHJlYWRTbmFwc2hvdDo6U3RhdGU6Om9uQmVnaW4oc3RkOjpzdHJpbmcgc2NoZWQpIHsKKyAgICBpZiAobUJlZ2luVGltZU5zIDwgbUVuZFRpbWVOcykgeworICAgICAgICBtQmVnaW5UaW1lTnMgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIG1CZWdpblNjaGVkID0gc3RkOjptb3ZlKHNjaGVkKTsKKyAgICB9Cit9CisKK3ZvaWQgVGhyZWFkU25hcHNob3Q6OlN0YXRlOjpvbkVuZCgpIHsKKyAgICBpZiAobUVuZFRpbWVOcyA8IG1CZWdpblRpbWVOcykgeworICAgICAgICBtRW5kVGltZU5zID0gc3lzdGVtVGltZSgpOworICAgICAgICBtQ3VtdWxhdGl2ZVRpbWVOcyArPSBtRW5kVGltZU5zIC0gbUJlZ2luVGltZU5zOworICAgIH0KK30KKworc3RkOjpzdHJpbmcgVGhyZWFkU25hcHNob3Q6OlN0YXRlOjp0b1N0cmluZygpIGNvbnN0IHsKKyAgICBpZiAobUJlZ2luVGltZU5zIDwgMCkgcmV0dXJuIHt9OyAgLy8gbmV2ZXIgYmVndW4uCisKKyAgICAvLyBjb21wdXRlIHRpbWUgaW50ZXJ2YWxzLgorICAgIGNvbnN0IGludDY0X3Qgbm93TnMgPSBzeXN0ZW1UaW1lKCk7CisgICAgaW50NjRfdCBjdW11bGF0aXZlVGltZU5zID0gbUN1bXVsYXRpdmVUaW1lTnM7CisgICAgaW50NjRfdCBkaWZmTnMgPSBtRW5kVGltZU5zIC0gbUJlZ2luVGltZU5zOyAvLyBpZiBvbkVuZCgpIGlzbid0IG1hdGNoZWQsIGRpZmZOcyA8IDAuCisgICAgaWYgKGRpZmZOcyA8IDApIHsKKyAgICAgICAgZGlmZk5zID0gbm93TnMgLSBtQmVnaW5UaW1lTnM7CisgICAgICAgIGN1bXVsYXRpdmVUaW1lTnMgKz0gZGlmZk5zOworICAgIH0KKyAgICAvLyBub3JtYWxpemF0aW9uIGZvciByYXRlIHZhcmlhYmxlcworICAgIGNvbnN0IGRvdWJsZSBsYXN0UnVuUGVyU2VjID0gIDFlOSAvIGRpZmZOczsKKyAgICBjb25zdCBkb3VibGUgdG90YWxQZXJTZWMgPSAxZTkgLyBjdW11bGF0aXZlVGltZU5zOworCisgICAgLy8gSEFORExFIFRIRSBTQ0hFRFVMRVIgU1RBVElTVElDUyBIRVJFCisgICAgLy8gY3VycmVudCBhbmQgZGlmZmVyZW50aWFsIHN0YXRpc3RpY3MgZm9yIHRoZSBzY2hlZHVsZXIuCisgICAgc3RkOjpzdHJpbmcgc2NoZWROb3cgPSBnZXRUaHJlYWRTY2hlZEFzU3RyaW5nKG1UaWQpOworICAgIGNvbnN0IGF1dG8gc2NoZWRNYXBUaGVuID0gcGFyc2VUaHJlYWRTY2hlZFN0cmluZyhtQmVnaW5TY2hlZCk7CisgICAgY29uc3QgYXV0byBzY2hlZE1hcE5vdyA9IHBhcnNlVGhyZWFkU2NoZWRTdHJpbmcoc2NoZWROb3cpOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogc2NoZWREaWZmS2V5TGlzdFtdID0geworICAgICAgICAic2Uuc3VtX2V4ZWNfcnVudGltZSIsCisgICAgICAgICJzZS5ucl9taWdyYXRpb25zIiwKKyAgICAgICAgInNlLnN0YXRpc3RpY3Mud2FpdF9zdW0iLAorICAgICAgICAic2Uuc3RhdGlzdGljcy53YWl0X2NvdW50IiwKKyAgICAgICAgInNlLnN0YXRpc3RpY3MuaW93YWl0X3N1bSIsCisgICAgICAgICJzZS5zdGF0aXN0aWNzLmlvd2FpdF9jb3VudCIsCisgICAgICAgICJzZS5zdGF0aXN0aWNzLm5yX2ZvcmNlZF9taWdyYXRpb25zIiwKKyAgICAgICAgIm5yX2ludm9sdW50YXJ5X3N3aXRjaGVzIiwKKyAgICB9OworCisgICAgLy8gY29tcHV0ZSBkaWZmZXJlbnRpYWwgcmF0ZSBzdGF0aXN0aWNzLgorICAgIHN0ZDo6c3RyaW5nIGRpZmZTdHJpbmc7CisgICAgZm9yIChjb25zdCBhdXRvIGRpZmZLZXkgOiBzY2hlZERpZmZLZXlMaXN0KSB7CisgICAgICAgIGlmIChhdXRvIGl0VGhlbiA9IHNjaGVkTWFwVGhlbi5maW5kKGRpZmZLZXkpOworICAgICAgICAgICAgICAgIGl0VGhlbiAhPSBzY2hlZE1hcFRoZW4uZW5kKCkpIHsKKworICAgICAgICAgICAgaWYgKGF1dG8gaXROb3cgPSBzY2hlZE1hcE5vdy5maW5kKGRpZmZLZXkpOworICAgICAgICAgICAgICAgICAgICBpdE5vdyAhPSBzY2hlZE1hcE5vdy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGF1dG8gZGlmZiA9IGl0Tm93LT5zZWNvbmQgLSBpdFRoZW4tPnNlY29uZDsKKyAgICAgICAgICAgICAgICBkaWZmICo9IGxhc3RSdW5QZXJTZWM7CisgICAgICAgICAgICAgICAgYXV0byB0b3RhbCA9IGl0Tm93LT5zZWNvbmQgKiB0b3RhbFBlclNlYzsKKyAgICAgICAgICAgICAgICBkaWZmU3RyaW5nLmFwcGVuZChkaWZmS2V5KS5hcHBlbmQoIiAgbGFzdC1ydW46IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoc3RkOjp0b19zdHJpbmcoZGlmZikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgIGN1bXVsYXRpdmU6IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoc3RkOjp0b19zdHJpbmcodG90YWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZGlmZlN0cmluZy5lbXB0eSgpKSB7CisgICAgICAgIHNjaGVkTm93LmFwcGVuZCgiKioqIHBlciBzZWNvbmQgc3RhdHMgKioqXG4iKS5hcHBlbmQoZGlmZlN0cmluZyk7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHNuYXBzaG90IHN0cmluZy4KKyAgICByZXR1cm4gc2NoZWROb3c7Cit9CisKK30gLy8gYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvVGltZUNoZWNrLmNwcCBiL21lZGlhL3V0aWxzL1RpbWVDaGVjay5jcHAKaW5kZXggODE5ZTE0Ni4uMDg0OGViMyAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvVGltZUNoZWNrLmNwcAorKysgYi9tZWRpYS91dGlscy9UaW1lQ2hlY2suY3BwCkBAIC0xNiwxMiArMTYsODAgQEAKIAogI2RlZmluZSBMT0dfVEFHICJUaW1lQ2hlY2siCiAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxtZWRpYXV0aWxzL1RpbWVDaGVjay5oPgorI2luY2x1ZGUgPG9wdGlvbmFsPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvRXZlbnRMb2cuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL01ldGhvZFN0YXRpc3RpY3MuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1RpbWVDaGVjay5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgImRlYnVnZ2VyZC9oYW5kbGVyLmgiCiAKLW5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBzdGQ6OnN0cmluZyAiSEg6TU06U1MuTVNjIiBmcm9tIGEgc3lzdGVtX2Nsb2NrIHRpbWVfcG9pbnQuCisgKi8KK3N0ZDo6c3RyaW5nIGZvcm1hdFRpbWUoc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCB0KSB7CisgICAgYXV0byB0aW1lX3N0cmluZyA9IGF1ZGlvX3V0aWxzX3RpbWVfc3RyaW5nX2Zyb21fbnMoCisgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHModC50aW1lX3NpbmNlX2Vwb2NoKCkpLmNvdW50KCkpOworCisgICAgLy8gVGhlIHRpbWUgc3RyaW5nIGlzIDE5IGNoYXJhY3RlcnMgKGluY2x1ZGluZyBudWxsIHRlcm1pbmF0aW9uKS4KKyAgICAvLyBFeGFtcGxlOiAiMDMtMjcgMTY6NDc6MDYuMTg3IgorICAgIC8vICAgICAgICAgICBNTSBERCBISCBNTSBTUyBNUworICAgIC8vIFdlIG9mZnNldCBieSA2IHRvIGdldCBISDpNTTpTUy5NU2MKKyAgICAvLworICAgIHJldHVybiB0aW1lX3N0cmluZy50aW1lICsgNjsgLy8gb2Zmc2V0IHRvIHJlbW92ZSBtb250aC9kYXkuCit9CisKKy8qKgorICogRmluZHMgdGhlIGVuZCBvZiB0aGUgY29tbW9uIHRpbWUgcHJlZml4LgorICoKKyAqIFRoaXMgaXMgYXMgYW4gb3B0aW9uIHRvIHJlbW92ZSB0aGUgY29tbW9uIHRpbWUgcHJlZml4IHRvIGF2b2lkCisgKiB1bm5lY2Vzc2FyeSBkdXBsaWNhdGVkIHN0cmluZ3MuCisgKgorICogXHBhcmFtIHRpbWUxIGEgdGltZSBzdHJpbmcKKyAqIFxwYXJhbSB0aW1lMiBhIHRpbWUgc3RyaW5nCisgKiBccmV0dXJuICAgICAgdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBjb21tb24gdGltZSBwcmVmaXggZW5kcy4gRm9yIGFiYnJldmlhdGVkCisgKiAgICAgICAgICAgICAgcHJpbnRpbmcgb2YgdGltZTIsIG9mZnNldCB0aGUgY2hhcmFjdGVyIHBvaW50ZXIgYnkgdGhpcyBwb3NpdGlvbi4KKyAqLworc3RhdGljIHNpemVfdCBjb21tb25UaW1lUHJlZml4UG9zaXRpb24oc3RkOjpzdHJpbmdfdmlldyB0aW1lMSwgc3RkOjpzdHJpbmdfdmlldyB0aW1lMikgeworICAgIGNvbnN0IHNpemVfdCBlbmRQb3MgPSBzdGQ6Om1pbih0aW1lMS5zaXplKCksIHRpbWUyLnNpemUoKSk7CisgICAgc2l6ZV90IGk7CisKKyAgICAvLyBGaW5kIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBtaXNtYXRjaCBiZXR3ZWVuIHN0cmluZ3MKKyAgICBmb3IgKGkgPSAwOyA7ICsraSkgeworICAgICAgICBpZiAoaSA9PSBlbmRQb3MpIHsKKyAgICAgICAgICAgIHJldHVybiBpOyAvLyBzdHJpbmdzIG1hdGNoIGNvbXBsZXRlbHkgdG8gdGhlIGxlbmd0aCBvZiBvbmUgb2YgdGhlIHN0cmluZ3MuCisgICAgICAgIH0KKyAgICAgICAgaWYgKHRpbWUxW2ldICE9IHRpbWUyW2ldKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAodGltZTFbaV0gPT0gJ1wwJykgeworICAgICAgICAgICAgcmV0dXJuIGk7IC8vICJwcmludGVkIiBzdHJpbmdzIG1hdGNoIGNvbXBsZXRlbHkuICBObyBuZWVkIHRvIGNoZWNrIGZ1cnRoZXIuCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBHbyBiYWNrd2FyZHMgdW50aWwgd2UgZmluZCBhIGRlbGltZXRlciBvciBzcGFjZS4KKyAgICBmb3IgKDsgaSA+IDAKKyAgICAgICAgICAgJiYgaXNkaWdpdCh0aW1lMVtpXSkgLy8gc3RpbGwgYSBudW1iZXIKKyAgICAgICAgICAgJiYgdGltZTFbaSAtIDFdICE9ICcgJworICAgICAgICAgOyAtLWkpIHsKKyAgICB9CisgICAgcmV0dXJuIGk7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgdW5pcXVlIHN1ZmZpeCBvZiB0aW1lMiB0aGF0IGlzbid0IHByZXNlbnQgaW4gdGltZTEuCisgKgorICogSWYgdGltZTIgaXMgaWRlbnRpY2FsIHRvIHRpbWUxLCB0aGVuIGFuIGVtcHR5IHN0cmluZ192aWV3IGlzIHJldHVybmVkLgorICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBlbGlkZSB0aGUgY29tbW9uIHByZWZpeCB3aGVuIHByaW50aW5nIHRpbWVzLgorICovCitzdGQ6OnN0cmluZ192aWV3IHRpbWVTdWZmaXgoc3RkOjpzdHJpbmdfdmlldyB0aW1lMSwgc3RkOjpzdHJpbmdfdmlldyB0aW1lMikgeworICAgIGNvbnN0IHNpemVfdCBwb3MgPSBjb21tb25UaW1lUHJlZml4UG9zaXRpb24odGltZTEsIHRpbWUyKTsKKyAgICByZXR1cm4gdGltZTIuc3Vic3RyKHBvcyk7Cit9CiAKIC8vIEF1ZGlvIEhBTCBzZXJ2ZXIgcGlkcyB2ZWN0b3IgdXNlZCB0byBnZW5lcmF0ZSBhdWRpbyBIQUwgcHJvY2Vzc2VzIHRvbWJzdG9uZQogLy8gd2hlbiBhdWRpb3NlcnZlciB3YXRjaGRvZyB0cmlnZ2Vycy4KQEAgLTM2LDcgKzEwNCw3IEBACiB2b2lkIFRpbWVDaGVjazo6YWNjZXNzQXVkaW9IYWxQaWRzKHN0ZDo6dmVjdG9yPHBpZF90PiogcGlkcywgYm9vbCB1cGRhdGUpIHsKICAgICBzdGF0aWMgY29uc3RleHByIGludCBrTnVtQXVkaW9IYWxQaWRzVmVjdG9ycyA9IDM7CiAgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHBpZF90PiBhdWRpb0hhbFBpZHNba051bUF1ZGlvSGFsUGlkc1ZlY3RvcnNdOwotICAgIHN0YXRpYyBzdGQ6OmF0b21pYzxpbnQ+IGN1ckF1ZGlvSGFsUGlkcyA9IDA7CisgICAgc3RhdGljIHN0ZDo6YXRvbWljPHVuc2lnbmVkPiBjdXJBdWRpb0hhbFBpZHMgPSAwOwogCiAgICAgaWYgKHVwZGF0ZSkgewogICAgICAgICBhdWRpb0hhbFBpZHNbKGN1ckF1ZGlvSGFsUGlkcysrICsgMSkgJSBrTnVtQXVkaW9IYWxQaWRzVmVjdG9yc10gPSAqcGlkczsKQEAgLTU4LDg0ICsxMjYsMTIxIEBACiB9CiAKIC8qIHN0YXRpYyAqLwotc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IFRpbWVDaGVjazo6Z2V0VGltZUNoZWNrVGhyZWFkKCkKLXsKLSAgICBzdGF0aWMgc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IHNUaW1lQ2hlY2tUaHJlYWQgPSBuZXcgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQoKTsKK1RpbWVyVGhyZWFkJiBUaW1lQ2hlY2s6OmdldFRpbWVDaGVja1RocmVhZCgpIHsKKyAgICBzdGF0aWMgVGltZXJUaHJlYWQgc1RpbWVDaGVja1RocmVhZHt9OwogICAgIHJldHVybiBzVGltZUNoZWNrVGhyZWFkOwogfQogCi1UaW1lQ2hlY2s6OlRpbWVDaGVjayhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykKLSAgICA6IG1FbmRUaW1lTnMoZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0YXJ0TW9uaXRvcmluZyh0YWcsIHRpbWVvdXRNcykpCi17CisvKiBzdGF0aWMgKi8KK3N0ZDo6c3RyaW5nIFRpbWVDaGVjazo6dG9TdHJpbmcoKSB7CisgICAgLy8gbm90ZSBwZW5kaW5nIGFuZCByZXRpcmVkIGFyZSBpbmRpdmlkdWFsbHkgbG9ja2VkIGZvciBtYXhpbXVtIGNvbmN1cnJlbmN5LAorICAgIC8vIHNuYXBzaG90IGlzIG5vdCBpbnN0YW50YW5lb3VzIGF0IGEgc2luZ2xlIHRpbWUuCisgICAgcmV0dXJuIGdldFRpbWVDaGVja1RocmVhZCgpLnRvU3RyaW5nKCk7CiB9CiAKK1RpbWVDaGVjazo6VGltZUNoZWNrKHN0ZDo6c3RyaW5nIHRhZywgT25UaW1lckZ1bmMmJiBvblRpbWVyLCB1aW50MzJfdCB0aW1lb3V0TXMsCisgICAgICAgIGJvb2wgY3Jhc2hPblRpbWVvdXQpCisgICAgOiBtVGltZUNoZWNrSGFuZGxlcihuZXcgVGltZUNoZWNrSGFuZGxlcnsKKyAgICAgICAgICAgIHN0ZDo6bW92ZSh0YWcpLCBzdGQ6Om1vdmUob25UaW1lciksIGNyYXNoT25UaW1lb3V0LAorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCksIGdldHRpZCgpfSkKKyAgICAsIG1UaW1lckhhbmRsZSh0aW1lb3V0TXMgPT0gMAorICAgICAgICAgICAgICA/IGdldFRpbWVDaGVja1RocmVhZCgpLnRyYWNrVGFzayhtVGltZUNoZWNrSGFuZGxlci0+dGFnKQorICAgICAgICAgICAgICA6IGdldFRpbWVDaGVja1RocmVhZCgpLnNjaGVkdWxlVGFzaygKKyAgICAgICAgICAgICAgICAgICAgICBtVGltZUNoZWNrSGFuZGxlci0+dGFnLAorICAgICAgICAgICAgICAgICAgICAgIC8vIFBhc3MgaW4gYWxsIHRoZSBhcmd1bWVudHMgYnkgdmFsdWUgdG8gdGhpcyB0YXNrIGZvciBzYWZldHkuCisgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRocmVhZCBjb3VsZCBjYWxsIHRoZSBjYWxsYmFjayBiZWZvcmUgdGhlIGNvbnN0cnVjdG9yIGlzIGZpbmlzaGVkLgorICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZXN0cnVjdG9yIGlzIG5vdCBibG9ja2VkIG9uIGNhbGxiYWNrLgorICAgICAgICAgICAgICAgICAgICAgIFsgdGltZUNoZWNrSGFuZGxlciA9IG1UaW1lQ2hlY2tIYW5kbGVyIF0geworICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lQ2hlY2tIYW5kbGVyLT5vblRpbWVvdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHModGltZW91dE1zKSkpIHt9CisKIFRpbWVDaGVjazo6flRpbWVDaGVjaygpIHsKLSAgICBnZXRUaW1lQ2hlY2tUaHJlYWQoKS0+c3RvcE1vbml0b3JpbmcobUVuZFRpbWVOcyk7Ci19Ci0KLVRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjp+VGltZUNoZWNrVGhyZWFkKCkKLXsKLSAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLSAgICByZXF1ZXN0RXhpdCgpOwotICAgIG1Nb25pdG9yUmVxdWVzdHMuY2xlYXIoKTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLX0KLQotbnNlY3NfdCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RhcnRNb25pdG9yaW5nKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7Ci0gICAgbnNlY3NfdCBlbmRUaW1lTnMgPSBzeXN0ZW1UaW1lKCkgKyBtaWxsaXNlY29uZHModGltZW91dE1zKTsKLSAgICBmb3IgKDsgbU1vbml0b3JSZXF1ZXN0cy5pbmRleE9mS2V5KGVuZFRpbWVOcykgPj0gMDsgKytlbmRUaW1lTnMpOwotICAgIG1Nb25pdG9yUmVxdWVzdHMuYWRkKGVuZFRpbWVOcywgdGFnKTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLSAgICByZXR1cm4gZW5kVGltZU5zOwotfQotCi12b2lkIFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjpzdG9wTW9uaXRvcmluZyhuc2Vjc190IGVuZFRpbWVOcykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwotICAgIG1Nb25pdG9yUmVxdWVzdHMucmVtb3ZlSXRlbShlbmRUaW1lTnMpOwotICAgIG1Db25kLnNpZ25hbCgpOwotfQotCi1ib29sIFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjp0aHJlYWRMb29wKCkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBUSU1FRF9PVVQ7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLQotICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbnNlY3NfdCBlbmRUaW1lTnMgPSBJTlQ2NF9NQVg7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnRhZyA9ICI8dW5zcGVjaWZpZWQ+IjsKLSAgICAgICAgLy8gS2V5ZWRWZWN0b3IgbU1vbml0b3JSZXF1ZXN0cyBpcyBvcmRlcmVkIHNvIHRha2UgZmlyc3QgZW50cnkgYXMgbmV4dCB0aW1lb3V0Ci0gICAgICAgIGlmIChtTW9uaXRvclJlcXVlc3RzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBlbmRUaW1lTnMgPSBtTW9uaXRvclJlcXVlc3RzLmtleUF0KDApOwotICAgICAgICAgICAgdGFnID0gbU1vbml0b3JSZXF1ZXN0cy52YWx1ZUF0KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgbnNlY3NfdCB3YWl0VGltZU5zID0gZW5kVGltZU5zIC0gc3lzdGVtVGltZSgpOwotICAgICAgICBpZiAod2FpdFRpbWVOcyA+IDApIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1Db25kLndhaXRSZWxhdGl2ZShtTXV0ZXgsIHdhaXRUaW1lTnMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIC8vIEdlbmVyYXRlIGF1ZGlvIEhBTCBwcm9jZXNzZXMgdG9tYnN0b25lcyBhbmQgYWxsb3cgdGltZSB0byBjb21wbGV0ZQotICAgICAgICAgICAgLy8gYmVmb3JlIGZvcmNpbmcgcmVzdGFydAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8cGlkX3Q+IHBpZHMgPSBnZXRBdWRpb0hhbFBpZHMoKTsKLSAgICAgICAgICAgIGlmIChwaWRzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwaWQgOiBwaWRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCJyZXF1ZXN0aW5nIHRvbWJzdG9uZSBmb3IgcGlkOiAlZCIsIHBpZCk7Ci0gICAgICAgICAgICAgICAgICAgIHNpZ3F1ZXVlKHBpZCwgREVCVUdHRVJfU0lHTkFMLCB7LnNpdmFsX2ludCA9IDB9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2xlZXAoMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dJKCJObyBIQUwgcHJvY2VzcyBwaWQgYXZhaWxhYmxlLCBza2lwcGluZyB0b21ic3RvbmVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMT0dfRVZFTlRfU1RSSU5HKExPR1RBR19BVURJT19CSU5ERVJfVElNRU9VVCwgdGFnKTsKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlRpbWVDaGVjayB0aW1lb3V0IGZvciAlcyIsIHRhZyk7Ci0gICAgICAgIH0KKyAgICBpZiAobVRpbWVDaGVja0hhbmRsZXIpIHsKKyAgICAgICAgbVRpbWVDaGVja0hhbmRsZXItPm9uQ2FuY2VsKG1UaW1lckhhbmRsZSk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAordm9pZCBUaW1lQ2hlY2s6OlRpbWVDaGVja0hhbmRsZXI6Om9uQ2FuY2VsKFRpbWVyVGhyZWFkOjpIYW5kbGUgdGltZXJIYW5kbGUpIGNvbnN0Cit7CisgICAgaWYgKFRpbWVDaGVjazo6Z2V0VGltZUNoZWNrVGhyZWFkKCkuY2FuY2VsVGFzayh0aW1lckhhbmRsZSkgJiYgb25UaW1lcikgeworICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IGVuZFRpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKKyAgICAgICAgb25UaW1lcihmYWxzZSAvKiB0aW1lb3V0ICovLAorICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxmbG9hdCwgc3RkOjptaWxsaT4+KAorICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZSAtIHN0YXJ0VGltZSkuY291bnQoKSk7CisgICAgfQorfQorCit2b2lkIFRpbWVDaGVjazo6VGltZUNoZWNrSGFuZGxlcjo6b25UaW1lb3V0KCkgY29uc3QKK3sKKyAgICBjb25zdCBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IGVuZFRpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKKyAgICBpZiAob25UaW1lcikgeworICAgICAgICBvblRpbWVyKHRydWUgLyogdGltZW91dCAqLywKKyAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZmxvYXQsIHN0ZDo6bWlsbGk+PigKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWUgLSBzdGFydFRpbWUpLmNvdW50KCkpOworICAgIH0KKworICAgIGlmICghY3Jhc2hPblRpbWVvdXQpIHJldHVybjsKKworICAgIC8vIEdlbmVyYXRlIHRoZSBUaW1lclRocmVhZCBzdW1tYXJ5IHN0cmluZyBlYXJseSBiZWZvcmUgc2VuZGluZyBzaWduYWxzIHRvIHRoZQorICAgIC8vIEhBTCBwcm9jZXNzZXMgd2hpY2ggY2FuIGFmZmVjdCB0aHJlYWQgYmVoYXZpb3IuCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3VtbWFyeSA9IGdldFRpbWVDaGVja1RocmVhZCgpLnRvU3RyaW5nKDQgLyogcmV0aXJlZENvdW50ICovKTsKKworICAgIC8vIEdlbmVyYXRlIGF1ZGlvIEhBTCBwcm9jZXNzZXMgdG9tYnN0b25lcyBhbmQgYWxsb3cgdGltZSB0byBjb21wbGV0ZQorICAgIC8vIGJlZm9yZSBmb3JjaW5nIHJlc3RhcnQKKyAgICBzdGQ6OnZlY3RvcjxwaWRfdD4gcGlkcyA9IFRpbWVDaGVjazo6Z2V0QXVkaW9IYWxQaWRzKCk7CisgICAgc3RkOjpzdHJpbmcgaGFsUGlkcyA9ICJIQUwgcGlkcyBbICI7CisgICAgaWYgKHBpZHMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwaWQgOiBwaWRzKSB7CisgICAgICAgICAgICBBTE9HSSgicmVxdWVzdGluZyB0b21ic3RvbmUgZm9yIHBpZDogJWQiLCBwaWQpOworICAgICAgICAgICAgaGFsUGlkcy5hcHBlbmQoc3RkOjp0b19zdHJpbmcocGlkKSkuYXBwZW5kKCIgIik7CisgICAgICAgICAgICBzaWdxdWV1ZShwaWQsIERFQlVHR0VSX1NJR05BTCwgey5zaXZhbF9pbnQgPSAwfSk7CisgICAgICAgIH0KKyAgICAgICAgc2xlZXAoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0koIk5vIEhBTCBwcm9jZXNzIHBpZCBhdmFpbGFibGUsIHNraXBwaW5nIHRvbWJzdG9uZXMiKTsKKyAgICB9CisgICAgaGFsUGlkcy5hcHBlbmQoIl0iKTsKKworICAgIExPR19FVkVOVF9TVFJJTkcoTE9HVEFHX0FVRElPX0JJTkRFUl9USU1FT1VULCB0YWcuY19zdHIoKSk7CisKKyAgICAvLyBDcmVhdGUgYWJvcnQgbWVzc2FnZSBzdHJpbmcgLSBjYXV0aW9uOiB0aGlzIGNhbiBiZSB2ZXJ5IGxhcmdlLgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGFib3J0TWVzc2FnZSA9IHN0ZDo6c3RyaW5nKCJUaW1lQ2hlY2sgdGltZW91dCBmb3IgIikKKyAgICAgICAgICAgIC5hcHBlbmQodGFnKQorICAgICAgICAgICAgLmFwcGVuZCgiIHNjaGVkdWxlZCAiKS5hcHBlbmQoZm9ybWF0VGltZShzdGFydFRpbWUpKQorICAgICAgICAgICAgLmFwcGVuZCgiIG9uIHRocmVhZCAiKS5hcHBlbmQoc3RkOjp0b19zdHJpbmcodGlkKSkuYXBwZW5kKCJcbiIpCisgICAgICAgICAgICAuYXBwZW5kKGhhbFBpZHMpLmFwcGVuZCgiXG4iKQorICAgICAgICAgICAgLmFwcGVuZChzdW1tYXJ5KTsKKworICAgIC8vIE5vdGU6IExPR19BTFdBWVNfRkFUQUwgbGltaXRzIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgLSBwZXIgbG9nL2xvZy5oOgorICAgIC8vIExvZyBtZXNzYWdlIHRleHQgbWF5IGJlIHRydW5jYXRlZCB0byBsZXNzIHRoYW4gYW4KKyAgICAvLyBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBsaW1pdCAoMTAyMyBieXRlcykuCisgICAgLy8KKyAgICAvLyBIZXJlLCB3ZSBzZW5kIHRoZSBzdHJpbmcgdGhyb3VnaCBhbmRyb2lkLWJhc2UvbG9nZ2luZy5oIExPRygpCisgICAgLy8gdG8gYXZvaWQgdGhlIHNpemUgbGltaXRhdGlvbi4gTE9HKEZBVEFMKSBkb2VzIGFuIGFib3J0IHdoZXJlYXMKKyAgICAvLyBMT0coRkFUQUxfV0lUSE9VVF9BQk9SVCkgZG9lcyBub3QgYWJvcnQuCisKKyAgICBMT0coRkFUQUwpIDw8IGFib3J0TWVzc2FnZTsKK30KKworLy8gQXV0b21hdGljYWxseSBjcmVhdGUgYSBUaW1lQ2hlY2sgY2xhc3MgZm9yIGEgY2xhc3MgYW5kIG1ldGhvZC4KKy8vIFRoaXMgaXMgdXNlZCBmb3IgQXVkaW8gSElETCBzdXBwb3J0LgorbWVkaWF1dGlsczo6VGltZUNoZWNrIG1ha2VUaW1lQ2hlY2tTdGF0c0ZvckNsYXNzTWV0aG9kKAorICAgICAgICBzdGQ6OnN0cmluZ192aWV3IGNsYXNzTmFtZSwgc3RkOjpzdHJpbmdfdmlldyBtZXRob2ROYW1lKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1ldGhvZFN0YXRpc3RpY3M8c3RkOjpzdHJpbmc+PiBzdGF0aXN0aWNzID0KKyAgICAgICAgICAgIG1lZGlhdXRpbHM6OmdldFN0YXRpc3RpY3NGb3JDbGFzcyhjbGFzc05hbWUpOworICAgIGlmICghc3RhdGlzdGljcykgcmV0dXJuIHt9OyAvLyBlbXB0eSBUaW1lQ2hlY2suCisgICAgcmV0dXJuIG1lZGlhdXRpbHM6OlRpbWVDaGVjaygKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGNsYXNzTmFtZSkuYXBwZW5kKCI6OiIpLmFwcGVuZChtZXRob2ROYW1lKSwKKyAgICAgICAgICAgIFsgY2xhenogPSBzdGQ6OnN0cmluZyhjbGFzc05hbWUpLCBtZXRob2QgPSBzdGQ6OnN0cmluZyhtZXRob2ROYW1lKSwKKyAgICAgICAgICAgICAgc3RhdHMgPSBzdGQ6Om1vdmUoc3RhdGlzdGljcykgXQorICAgICAgICAgICAgKGJvb2wgdGltZW91dCwgZmxvYXQgZWxhcHNlZE1zKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICA7IC8vIGlnbm9yZWQsIHRoZXJlIGlzIG5vIHRpbWVvdXQgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy0+ZXZlbnQobWV0aG9kLCBlbGFwc2VkTXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCAwIC8qIHRpbWVvdXRNcyAqLyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9UaW1lclRocmVhZC10ZXN0LmNwcCBiL21lZGlhL3V0aWxzL1RpbWVyVGhyZWFkLXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzY2Q2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9UaW1lclRocmVhZC10ZXN0LmNwcApAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9UaW1lclRocmVhZC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlsczsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGF1dG8ga0ppdHRlciA9IDEwbXM7CisKKy8vIEVhY2ggdGFzayB3cml0dGVuIGJ5ICpUb1N0cmluZygpIHdpbGwgc3RhcnQgd2l0aCBhIGxlZnQgYnJhY2UuCitjb25zdGV4cHIgY2hhciBSRVFVRVNUX1NUQVJUID0gJ3snOworCitpbmxpbmUgc2l6ZV90IGNvdW50Q2hhcnMoc3RkOjpzdHJpbmdfdmlldyBzLCBjaGFyIGMpIHsKKyAgICByZXR1cm4gc3RkOjpjb3VudChzLmJlZ2luKCksIHMuZW5kKCksIGMpOworfQorCitURVNUKFRpbWVyVGhyZWFkLCBCYXNpYykgeworICAgIHN0ZDo6YXRvbWljPGJvb2w+IHRhc2tSYW4gPSBmYWxzZTsKKyAgICBUaW1lclRocmVhZCB0aHJlYWQ7CisgICAgdGhyZWFkLnNjaGVkdWxlVGFzaygiQmFzaWMiLCBbJnRhc2tSYW5dIHsgdGFza1JhbiA9IHRydWU7IH0sIDEwMG1zKTsKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMTAwbXMgLSBrSml0dGVyKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1Jhbik7CisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDIgKiBrSml0dGVyKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuKTsKKyAgICBBU1NFUlRfRVEoMSwgY291bnRDaGFycyh0aHJlYWQucmV0aXJlZFRvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKK30KKworVEVTVChUaW1lclRocmVhZCwgQ2FuY2VsKSB7CisgICAgc3RkOjphdG9taWM8Ym9vbD4gdGFza1JhbiA9IGZhbHNlOworICAgIFRpbWVyVGhyZWFkIHRocmVhZDsKKyAgICBUaW1lclRocmVhZDo6SGFuZGxlIGhhbmRsZSA9CisgICAgICAgICAgICB0aHJlYWQuc2NoZWR1bGVUYXNrKCJDYW5jZWwiLCBbJnRhc2tSYW5dIHsgdGFza1JhbiA9IHRydWU7IH0sIDEwMG1zKTsKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMTAwbXMgLSBrSml0dGVyKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1Jhbik7CisgICAgQVNTRVJUX1RSVUUodGhyZWFkLmNhbmNlbFRhc2soaGFuZGxlKSk7CisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDIgKiBrSml0dGVyKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1Jhbik7CisgICAgQVNTRVJUX0VRKDEsIGNvdW50Q2hhcnModGhyZWFkLnJldGlyZWRUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7Cit9CisKK1RFU1QoVGltZXJUaHJlYWQsIENhbmNlbEFmdGVyUnVuKSB7CisgICAgc3RkOjphdG9taWM8Ym9vbD4gdGFza1JhbiA9IGZhbHNlOworICAgIFRpbWVyVGhyZWFkIHRocmVhZDsKKyAgICBUaW1lclRocmVhZDo6SGFuZGxlIGhhbmRsZSA9CisgICAgICAgICAgICB0aHJlYWQuc2NoZWR1bGVUYXNrKCJDYW5jZWxBZnRlclJ1biIsIFsmdGFza1Jhbl0geyB0YXNrUmFuID0gdHJ1ZTsgfSwgMTAwbXMpOworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxMDBtcyArIGtKaXR0ZXIpOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW4pOworICAgIEFTU0VSVF9GQUxTRSh0aHJlYWQuY2FuY2VsVGFzayhoYW5kbGUpKTsKKyAgICBBU1NFUlRfRVEoMSwgY291bnRDaGFycyh0aHJlYWQucmV0aXJlZFRvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKK30KKworVEVTVChUaW1lclRocmVhZCwgTXVsdGlwbGVUYXNrcykgeworICAgIHN0ZDo6YXJyYXk8c3RkOjphdG9taWM8Ym9vbD4sIDY+IHRhc2tSYW57fTsKKyAgICBUaW1lclRocmVhZCB0aHJlYWQ7CisKKyAgICBhdXRvIHN0YXJ0VGltZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworCisgICAgdGhyZWFkLnNjaGVkdWxlVGFzaygiMCIsIFsmdGFza1Jhbl0geyB0YXNrUmFuWzBdID0gdHJ1ZTsgfSwgMzAwbXMpOworICAgIHRocmVhZC5zY2hlZHVsZVRhc2soIjEiLCBbJnRhc2tSYW5dIHsgdGFza1JhblsxXSA9IHRydWU7IH0sIDEwMG1zKTsKKyAgICB0aHJlYWQuc2NoZWR1bGVUYXNrKCIyIiwgWyZ0YXNrUmFuXSB7IHRhc2tSYW5bMl0gPSB0cnVlOyB9LCAyMDBtcyk7CisgICAgdGhyZWFkLnNjaGVkdWxlVGFzaygiMyIsIFsmdGFza1Jhbl0geyB0YXNrUmFuWzNdID0gdHJ1ZTsgfSwgNDAwbXMpOworICAgIGF1dG8gaGFuZGxlNCA9IHRocmVhZC5zY2hlZHVsZVRhc2soIjQiLCBbJnRhc2tSYW5dIHsgdGFza1Jhbls0XSA9IHRydWU7IH0sIDIwMG1zKTsKKyAgICB0aHJlYWQuc2NoZWR1bGVUYXNrKCI1IiwgWyZ0YXNrUmFuXSB7IHRhc2tSYW5bNV0gPSB0cnVlOyB9LCAyMDBtcyk7CisKKyAgICAvLyA2IHRhc2tzIHBlbmRpbmcKKyAgICBBU1NFUlRfRVEoNiwgY291bnRDaGFycyh0aHJlYWQucGVuZGluZ1RvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKyAgICAvLyAwIHRhc2tzIGNvbXBsZXRlZAorICAgIEFTU0VSVF9FUSgwLCBjb3VudENoYXJzKHRocmVhZC5yZXRpcmVkVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworCisgICAgLy8gVGFzayAxIHNob3VsZCB0cmlnZ2VyIGFyb3VuZCAxMDBtcy4KKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF91bnRpbChzdGFydFRpbWUgKyAxMDBtcyAtIGtKaXR0ZXIpOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzBdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblsxXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bMl0pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzNdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1Jhbls0XSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bNV0pOworCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfdW50aWwoc3RhcnRUaW1lICsgMTAwbXMgKyBrSml0dGVyKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblswXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsxXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bMl0pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzNdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1Jhbls0XSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bNV0pOworCisgICAgLy8gQ2FuY2VsIHRhc2sgNCBiZWZvcmUgaXQgZ2V0cyBhIGNoYW5jZSB0byBydW4uCisgICAgdGhyZWFkLmNhbmNlbFRhc2soaGFuZGxlNCk7CisKKyAgICAvLyBUYXNrcyAyIGFuZCA1IHNob3VsZCB0cmlnZ2VyIGFyb3VuZCAyMDBtcy4KKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF91bnRpbChzdGFydFRpbWUgKyAyMDBtcyAtIGtKaXR0ZXIpOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzBdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzFdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblsyXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bM10pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzRdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1Jhbls1XSk7CisKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF91bnRpbChzdGFydFRpbWUgKyAyMDBtcyArIGtKaXR0ZXIpOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzBdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzFdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzJdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblszXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bNF0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bNV0pOworCisgICAgLy8gVGFzayAwIHNob3VsZCB0cmlnZ2VyIGFyb3VuZCAzMDBtcy4KKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF91bnRpbChzdGFydFRpbWUgKyAzMDBtcyAtIGtKaXR0ZXIpOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzBdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzFdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzJdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblszXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bNF0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bNV0pOworCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfdW50aWwoc3RhcnRUaW1lICsgMzAwbXMgKyBrSml0dGVyKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzBdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzFdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzJdKTsKKyAgICBBU1NFUlRfRkFMU0UodGFza1JhblszXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bNF0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bNV0pOworCisgICAgLy8gMSB0YXNrIHBlbmRpbmcKKyAgICBBU1NFUlRfRVEoMSwgY291bnRDaGFycyh0aHJlYWQucGVuZGluZ1RvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKyAgICAvLyA0IHRhc2tzIHJhbiBhbmQgMSBjYW5jZWxsZWQKKyAgICBBU1NFUlRfRVEoNCArIDEsIGNvdW50Q2hhcnModGhyZWFkLnJldGlyZWRUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisKKyAgICAvLyBUYXNrIDMgc2hvdWxkIHRyaWdnZXIgYXJvdW5kIDQwMG1zLgorICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX3VudGlsKHN0YXJ0VGltZSArIDQwMG1zIC0ga0ppdHRlcik7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblswXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsxXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsyXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bM10pOworICAgIEFTU0VSVF9GQUxTRSh0YXNrUmFuWzRdKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrUmFuWzVdKTsKKworICAgIC8vIDQgdGFza3MgcmFuIGFuZCAxIGNhbmNlbGxlZAorICAgIEFTU0VSVF9FUSg0ICsgMSwgY291bnRDaGFycyh0aHJlYWQucmV0aXJlZFRvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX3VudGlsKHN0YXJ0VGltZSArIDQwMG1zICsga0ppdHRlcik7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblswXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsxXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblsyXSk7CisgICAgQVNTRVJUX1RSVUUodGFza1JhblszXSk7CisgICAgQVNTRVJUX0ZBTFNFKHRhc2tSYW5bNF0pOworICAgIEFTU0VSVF9UUlVFKHRhc2tSYW5bNV0pOworCisgICAgLy8gMCB0YXNrcyBwZW5kaW5nCisgICAgQVNTRVJUX0VRKDAsIGNvdW50Q2hhcnModGhyZWFkLnBlbmRpbmdUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisgICAgLy8gNSB0YXNrcyByYW4gYW5kIDEgY2FuY2VsbGVkCisgICAgQVNTRVJUX0VRKDUgKyAxLCBjb3VudENoYXJzKHRocmVhZC5yZXRpcmVkVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworfQorCitURVNUKFRpbWVyVGhyZWFkLCBUcmFja2VkVGFza3MpIHsKKyAgICBUaW1lclRocmVhZCB0aHJlYWQ7CisKKyAgICBhdXRvIGhhbmRsZTAgPSB0aHJlYWQudHJhY2tUYXNrKCIwIik7CisgICAgYXV0byBoYW5kbGUxID0gdGhyZWFkLnRyYWNrVGFzaygiMSIpOworICAgIGF1dG8gaGFuZGxlMiA9IHRocmVhZC50cmFja1Rhc2soIjIiKTsKKworICAgIC8vIDMgdGFza3MgcGVuZGluZworICAgIEFTU0VSVF9FUSgzLCBjb3VudENoYXJzKHRocmVhZC5wZW5kaW5nVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworICAgIC8vIDAgdGFza3MgcmV0aXJlZAorICAgIEFTU0VSVF9FUSgwLCBjb3VudENoYXJzKHRocmVhZC5yZXRpcmVkVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworCisgICAgQVNTRVJUX1RSVUUodGhyZWFkLmNhbmNlbFRhc2soaGFuZGxlMCkpOworICAgIEFTU0VSVF9UUlVFKHRocmVhZC5jYW5jZWxUYXNrKGhhbmRsZTEpKTsKKworICAgIC8vIDEgdGFzayBwZW5kaW5nCisgICAgQVNTRVJUX0VRKDEsIGNvdW50Q2hhcnModGhyZWFkLnBlbmRpbmdUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisgICAgLy8gMiB0YXNrcyByZXRpcmVkCisgICAgQVNTRVJUX0VRKDIsIGNvdW50Q2hhcnModGhyZWFkLnJldGlyZWRUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisKKyAgICAvLyBoYW5kbGUxIGlzIHN0YWxlLCBjYW5jZWwgcmV0dXJucyBmYWxzZS4KKyAgICBBU1NFUlRfRkFMU0UodGhyZWFkLmNhbmNlbFRhc2soaGFuZGxlMSkpOworCisgICAgLy8gMSB0YXNrIHBlbmRpbmcKKyAgICBBU1NFUlRfRVEoMSwgY291bnRDaGFycyh0aHJlYWQucGVuZGluZ1RvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKyAgICAvLyAyIHRhc2tzIHJldGlyZWQKKyAgICBBU1NFUlRfRVEoMiwgY291bnRDaGFycyh0aHJlYWQucmV0aXJlZFRvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKworICAgIC8vIEFkZCBhbm90aGVyIHRyYWNrZWQgdGFzay4KKyAgICBhdXRvIGhhbmRsZTMgPSB0aHJlYWQudHJhY2tUYXNrKCIzIik7CisKKyAgICAvLyAyIHRhc2tzIHBlbmRpbmcKKyAgICBBU1NFUlRfRVEoMiwgY291bnRDaGFycyh0aHJlYWQucGVuZGluZ1RvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKyAgICAvLyAyIHRhc2tzIHJldGlyZWQKKyAgICBBU1NFUlRfRVEoMiwgY291bnRDaGFycyh0aHJlYWQucmV0aXJlZFRvU3RyaW5nKCksIFJFUVVFU1RfU1RBUlQpKTsKKworICAgIEFTU0VSVF9UUlVFKHRocmVhZC5jYW5jZWxUYXNrKGhhbmRsZTIpKTsKKworICAgIC8vIDEgdGFza3MgcGVuZGluZworICAgIEFTU0VSVF9FUSgxLCBjb3VudENoYXJzKHRocmVhZC5wZW5kaW5nVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworICAgIC8vIDMgdGFza3MgcmV0aXJlZAorICAgIEFTU0VSVF9FUSgzLCBjb3VudENoYXJzKHRocmVhZC5yZXRpcmVkVG9TdHJpbmcoKSwgUkVRVUVTVF9TVEFSVCkpOworCisgICAgQVNTRVJUX1RSVUUodGhyZWFkLmNhbmNlbFRhc2soaGFuZGxlMykpOworCisgICAgLy8gMCB0YXNrcyBwZW5kaW5nCisgICAgQVNTRVJUX0VRKDAsIGNvdW50Q2hhcnModGhyZWFkLnBlbmRpbmdUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7CisgICAgLy8gNCB0YXNrcyByZXRpcmVkCisgICAgQVNTRVJUX0VRKDQsIGNvdW50Q2hhcnModGhyZWFkLnJldGlyZWRUb1N0cmluZygpLCBSRVFVRVNUX1NUQVJUKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvVGltZXJUaHJlYWQuY3BwIGIvbWVkaWEvdXRpbHMvVGltZXJUaHJlYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZTZiMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9UaW1lclRocmVhZC5jcHAKQEAgLTAsMCArMSwzNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlRpbWVyVGhyZWFkIgorCisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxtZWRpYXV0aWxzL01lZGlhVXRpbHNEZWxheWVkLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9UaW1lclRocmVhZC5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZERlZnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMgeworCitleHRlcm4gc3RkOjpzdHJpbmcgZm9ybWF0VGltZShzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IHQpOworZXh0ZXJuIHN0ZDo6c3RyaW5nX3ZpZXcgdGltZVN1ZmZpeChzdGQ6OnN0cmluZ192aWV3IHRpbWUxLCBzdGQ6OnN0cmluZ192aWV3IHRpbWUyKTsKKworVGltZXJUaHJlYWQ6OkhhbmRsZSBUaW1lclRocmVhZDo6c2NoZWR1bGVUYXNrKAorICAgICAgICBzdGQ6OnN0cmluZyB0YWcsIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiYmIGZ1bmMsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dCkgeworICAgIGNvbnN0IGF1dG8gbm93ID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+IHJlcXVlc3R7CisgICAgICAgICAgICBuZXcgUmVxdWVzdHsgbm93LCBub3cgKyB0aW1lb3V0LCBnZXR0aWQoKSwgc3RkOjptb3ZlKHRhZykgfX07CisgICAgcmV0dXJuIG1Nb25pdG9yVGhyZWFkLmFkZChzdGQ6Om1vdmUocmVxdWVzdCksIHN0ZDo6bW92ZShmdW5jKSwgdGltZW91dCk7Cit9CisKK1RpbWVyVGhyZWFkOjpIYW5kbGUgVGltZXJUaHJlYWQ6OnRyYWNrVGFzayhzdGQ6OnN0cmluZyB0YWcpIHsKKyAgICBjb25zdCBhdXRvIG5vdyA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiByZXF1ZXN0eworICAgICAgICAgICAgbmV3IFJlcXVlc3R7IG5vdywgbm93LCBnZXR0aWQoKSwgc3RkOjptb3ZlKHRhZykgfX07CisgICAgcmV0dXJuIG1Ob1RpbWVvdXRNYXAuYWRkKHN0ZDo6bW92ZShyZXF1ZXN0KSk7Cit9CisKK2Jvb2wgVGltZXJUaHJlYWQ6OmNhbmNlbFRhc2soSGFuZGxlIGhhbmRsZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiByZXF1ZXN0ID0gbU5vVGltZW91dE1hcC5pc1ZhbGlkSGFuZGxlKGhhbmRsZSkgPworICAgICAgICAgICAgIG1Ob1RpbWVvdXRNYXAucmVtb3ZlKGhhbmRsZSkgOiBtTW9uaXRvclRocmVhZC5yZW1vdmUoaGFuZGxlKTsKKyAgICBpZiAoIXJlcXVlc3QpIHJldHVybiBmYWxzZTsKKyAgICBtUmV0aXJlZFF1ZXVlLmFkZChzdGQ6Om1vdmUocmVxdWVzdCkpOworICAgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnN0cmluZyBUaW1lclRocmVhZDo6dG9TdHJpbmcoc2l6ZV90IHJldGlyZWRDb3VudCkgY29uc3QgeworICAgIC8vIE5vdGU6IFRoZXNlIHJlcXVlc3QgcXVldWVzIGFyZSBzbmFwc2hvdCB2ZXJ5IGNsb3NlIHRvZ2V0aGVyIGJ1dAorICAgIC8vIG5vdCBhdCAiaWRlbnRpY2FsIiB0aW1lcyBhcyB3ZSBkb24ndCB1c2UgYSBjbGFzcy13aWRlIGxvY2suCisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+IHRpbWVvdXRSZXF1ZXN0czsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+IHJldGlyZWRSZXF1ZXN0czsKKyAgICBtVGltZW91dFF1ZXVlLmNvcHlSZXF1ZXN0cyh0aW1lb3V0UmVxdWVzdHMpOworICAgIG1SZXRpcmVkUXVldWUuY29weVJlcXVlc3RzKHJldGlyZWRSZXF1ZXN0cywgcmV0aXJlZENvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+IHBlbmRpbmdSZXF1ZXN0cyA9CisgICAgICAgIGdldFBlbmRpbmdSZXF1ZXN0cygpOworCisgICAgc3RydWN0IEFuYWx5c2lzIGFuYWx5c2lzID0gYW5hbHl6ZVRpbWVvdXQodGltZW91dFJlcXVlc3RzLCBwZW5kaW5nUmVxdWVzdHMpOworICAgIHN0ZDo6c3RyaW5nIGFuYWx5c2lzU3VtbWFyeTsKKyAgICBpZiAoIWFuYWx5c2lzLnN1bW1hcnkuZW1wdHkoKSkgeworICAgICAgICBhbmFseXNpc1N1bW1hcnkgPSBzdGQ6OnN0cmluZygiXG5hbmFseXNpcyBbICIpLmFwcGVuZChhbmFseXNpcy5zdW1tYXJ5KS5hcHBlbmQoIiBdIik7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRpbWVvdXRTdGFjazsKKyAgICBpZiAoYW5hbHlzaXMudGltZW91dFRpZCAhPSAtMSkgeworICAgICAgICB0aW1lb3V0U3RhY2sgPSBzdGQ6OnN0cmluZygiXG50aW1lb3V0KCIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChzdGQ6OnRvX3N0cmluZyhhbmFseXNpcy50aW1lb3V0VGlkKSkuYXBwZW5kKCIpIGNhbGxzdGFjayBbXG4iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoZ2V0Q2FsbFN0YWNrU3RyaW5nRm9yVGlkKGFuYWx5c2lzLnRpbWVvdXRUaWQpKS5hcHBlbmQoIl0iKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgYmxvY2tlZFN0YWNrOworICAgIGlmIChhbmFseXNpcy5IQUxCbG9ja2VkVGlkICE9IC0xKSB7CisgICAgICAgIGJsb2NrZWRTdGFjayA9IHN0ZDo6c3RyaW5nKCJcbmJsb2NrZWQoIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKHN0ZDo6dG9fc3RyaW5nKGFuYWx5c2lzLkhBTEJsb2NrZWRUaWQpKS5hcHBlbmQoIikgIGNhbGxzdGFjayBbXG4iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoZ2V0Q2FsbFN0YWNrU3RyaW5nRm9yVGlkKGFuYWx5c2lzLkhBTEJsb2NrZWRUaWQpKS5hcHBlbmQoIl0iKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIm5vdyAiKQorICAgICAgICAgICAgLmFwcGVuZChmb3JtYXRUaW1lKHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpKSkKKyAgICAgICAgICAgIC5hcHBlbmQoYW5hbHlzaXNTdW1tYXJ5KQorICAgICAgICAgICAgLmFwcGVuZCgiXG50aW1lb3V0IFsgIikKKyAgICAgICAgICAgIC5hcHBlbmQocmVxdWVzdHNUb1N0cmluZyh0aW1lb3V0UmVxdWVzdHMpKQorICAgICAgICAgICAgLmFwcGVuZCgiIF1cbnBlbmRpbmcgWyAiKQorICAgICAgICAgICAgLmFwcGVuZChyZXF1ZXN0c1RvU3RyaW5nKHBlbmRpbmdSZXF1ZXN0cykpCisgICAgICAgICAgICAuYXBwZW5kKCIgXVxucmV0aXJlZCBbICIpCisgICAgICAgICAgICAuYXBwZW5kKHJlcXVlc3RzVG9TdHJpbmcocmV0aXJlZFJlcXVlc3RzKSkKKyAgICAgICAgICAgIC5hcHBlbmQoIiBdIikKKyAgICAgICAgICAgIC5hcHBlbmQodGltZW91dFN0YWNrKQorICAgICAgICAgICAgLmFwcGVuZChibG9ja2VkU3RhY2spOworfQorCisvLyBBIEhBTCBtZXRob2QgaXMgd2hlcmUgdGhlIHN1YnN0cmluZyAiSGlkbCIgaXMgaW4gdGhlIGNsYXNzIG5hbWUuCisvLyBUaGUgdGFnIHNob3VsZCBsb29rIGxpa2U6IC4uLiBIaWRsIC4uLiA6OiAuLi4KKy8vIFdoZW4gdGhlIGF1ZGlvIEhBTCBpcyB1cGRhdGVkIHRvIEFJREwgcGVyaGFwcyB3ZSB3aWxsIHVzZSBpbnN0ZWFkCisvLyBhIGdsb2JhbCBkaXJlY3Rvcnkgb2YgSEFMIGNsYXNzZXMuCisvLworLy8gU2VlIE1ldGhvZFN0YXRpc3RpY3MuY3BwOgorLy8gbWVkaWF1dGlsczo6Z2V0U3RhdGlzdGljc0NsYXNzZXNGb3JNb2R1bGUoTUVUSE9EX1NUQVRJU1RJQ1NfTU9EVUxFX05BTUVfQVVESU9fSElETCkKKy8vCisvKiBzdGF0aWMgKi8KK2Jvb2wgVGltZXJUaHJlYWQ6OmlzUmVxdWVzdEZyb21IYWwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+JiByZXF1ZXN0KSB7CisgICAgY29uc3Qgc2l6ZV90IGhpZGxQb3MgPSByZXF1ZXN0LT50YWcuZmluZCgiSGlkbCIpOworICAgIGlmIChoaWRsUG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSByZXR1cm4gZmFsc2U7CisgICAgLy8gc2hvdWxkIGJlIGEgc2VwYXJhdG9yIGFmdGVyd2FyZHMgSGlkbCB3aGljaCBpbmRpY2F0ZXMgdGhlIHN0cmluZyB3YXMgaW4gdGhlIGNsYXNzLgorICAgIGNvbnN0IHNpemVfdCBzZXBhcmF0b3JQb3MgPSByZXF1ZXN0LT50YWcuZmluZCgiOjoiLCBoaWRsUG9zKTsKKyAgICByZXR1cm4gc2VwYXJhdG9yUG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zOworfQorCisvKiBzdGF0aWMgKi8KK3N0cnVjdCBUaW1lclRocmVhZDo6QW5hbHlzaXMgVGltZXJUaHJlYWQ6OmFuYWx5emVUaW1lb3V0KAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4mIHRpbWVvdXRSZXF1ZXN0cywKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+JiBwZW5kaW5nUmVxdWVzdHMpIHsKKworICAgIGlmICh0aW1lb3V0UmVxdWVzdHMuZW1wdHkoKSB8fCBwZW5kaW5nUmVxdWVzdHMuZW1wdHkoKSkgcmV0dXJuIHt9OyAvLyBub3RoaW5nIHRvIHNheS4KKworICAgIC8vIGZvciBub3cgbG9vayBhdCBsYXN0IHRpbWVvdXQgKGluIG91ciBjYXNlLCB0aGUgb25seSB0aW1lb3V0KQorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiB0aW1lb3V0ID0gdGltZW91dFJlcXVlc3RzLmJhY2soKTsKKworICAgIC8vIHBlbmRpbmcgUmVxdWVzdHMgdGhhdCBhcmUgcHJvYmxlbWF0aWMuCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiBwZW5kaW5nRXhhY3Q7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiBwZW5kaW5nUG9zc2libGU7CisKKyAgICAvLyBXZSBsb29rIGF0IHBlbmRpbmcgcmVxdWVzdHMgdGhhdCB3ZXJlIHNjaGVkdWxlZCBubyBsYXRlciB0aGFuIGtEdXJhdGlvbgorICAgIC8vIGFmdGVyIHRoZSB0aW1lb3V0IHJlcXVlc3QuIFRoaXMgcHJldmVudHMgZmFsc2UgbWF0Y2hlcyB3aXRoIGNhbGxzCisgICAgLy8gdGhhdCBuYXR1cmFsbHkgYmxvY2sgZm9yIGEgc2hvcnQgcGVyaW9kIG9mIHRpbWUKKyAgICAvLyBzdWNoIGFzIEhBTCB3cml0ZSgpIGFuZCByZWFkKCkuCisgICAgLy8KKyAgICBhdXRvIGNvbnN0ZXhwciBrRHVyYXRpb24gPSBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMDApOworICAgIGZvciAoY29uc3QgYXV0byYgcGVuZGluZyA6IHBlbmRpbmdSZXF1ZXN0cykgeworICAgICAgICAvLyBJZiB0aGUgcGVuZGluZyB0aWQgaXMgdGhlIHNhbWUgYXMgdGltZW91dCB0aWQsIHByb2JsZW0gaWRlbnRpZmllZC4KKyAgICAgICAgaWYgKHBlbmRpbmctPnRpZCA9PSB0aW1lb3V0LT50aWQpIHsKKyAgICAgICAgICAgIHBlbmRpbmdFeGFjdC5lbXBsYWNlX2JhY2socGVuZGluZyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoZSBwZW5kaW5nIHRpZCBpcyBzY2hlZHVsZWQgd2l0aGluIHRpbWUgbGltaXQKKyAgICAgICAgaWYgKHBlbmRpbmctPnNjaGVkdWxlZCAtIHRpbWVvdXQtPnNjaGVkdWxlZCA8IGtEdXJhdGlvbikgeworICAgICAgICAgICAgcGVuZGluZ1Bvc3NpYmxlLmVtcGxhY2VfYmFjayhwZW5kaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0cnVjdCBBbmFseXNpcyBhbmFseXNpc3t9OworCisgICAgYW5hbHlzaXMudGltZW91dFRpZCA9IHRpbWVvdXQtPnRpZDsKKyAgICBzdGQ6OnN0cmluZyYgc3VtbWFyeSA9IGFuYWx5c2lzLnN1bW1hcnk7CisgICAgaWYgKCFwZW5kaW5nRXhhY3QuZW1wdHkoKSkgeworICAgICAgICBjb25zdCBhdXRvJiByZXF1ZXN0ID0gcGVuZGluZ0V4YWN0LmZyb250KCk7CisgICAgICAgIGNvbnN0IGJvb2wgaGFsID0gaXNSZXF1ZXN0RnJvbUhhbChyZXF1ZXN0KTsKKworICAgICAgICBpZiAoaGFsKSB7CisgICAgICAgICAgICBzdW1tYXJ5ID0gc3RkOjpzdHJpbmcoIkJsb2NrZWQgZGlyZWN0bHkgZHVlIHRvIEhBTCBjYWxsOiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQocmVxdWVzdC0+dG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN1bW1hcnkuZW1wdHkoKSAmJiAhcGVuZGluZ1Bvc3NpYmxlLmVtcHR5KCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiByZXF1ZXN0IDogcGVuZGluZ1Bvc3NpYmxlKSB7CisgICAgICAgICAgICBjb25zdCBib29sIGhhbCA9IGlzUmVxdWVzdEZyb21IYWwocmVxdWVzdCk7CisgICAgICAgICAgICBpZiAoaGFsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGJsb2NrZWQgY2FsbCBpcyB0aGUgbW9zdCBsaWtlbHkgb25lLgorICAgICAgICAgICAgICAgIC8vIFJlY2VudCBjYWxscyBtaWdodCBiZSB0ZW1wb3JhcmlseSBibG9ja2VkCisgICAgICAgICAgICAgICAgLy8gY2FsbHMgc3VjaCBhcyB3cml0ZSgpIG9yIHJlYWQoKSBkZXBlbmRpbmcgb24ga0R1cmF0aW9uLgorICAgICAgICAgICAgICAgIHN1bW1hcnkgPSBzdGQ6OnN0cmluZygiQmxvY2tlZCBwb3NzaWJseSBkdWUgdG8gSEFMIGNhbGw6ICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocmVxdWVzdC0+dG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgYW5hbHlzaXMuSEFMQmxvY2tlZFRpZCA9IHJlcXVlc3QtPnRpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhbmFseXNpczsKK30KKworc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRpbWVyVGhyZWFkOjpSZXF1ZXN0Pj4gVGltZXJUaHJlYWQ6OmdldFBlbmRpbmdSZXF1ZXN0cygpIGNvbnN0IHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtFc3RpbWF0ZWRQZW5kaW5nUmVxdWVzdHMgPSA4OyAgLy8gYXBwcm94IDEyOCBieXRlIGFsbG9jLgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4gcGVuZGluZ1JlcXVlc3RzOworICAgIHBlbmRpbmdSZXF1ZXN0cy5yZXNlcnZlKGtFc3RpbWF0ZWRQZW5kaW5nUmVxdWVzdHMpOyAvLyBwcmVhbGxvY2F0ZSB2ZWN0b3Igb3V0IG9mIGxvY2suCisKKyAgICAvLyBmb2xsb3dpbmcgYXJlIGludGVybmFsbHkgbG9ja2VkIGNhbGxzLCB3aGljaCBhZGQgdG8gb3VyIGxvY2FsIHBlbmRpbmdSZXF1ZXN0cy4KKyAgICBtTW9uaXRvclRocmVhZC5jb3B5UmVxdWVzdHMocGVuZGluZ1JlcXVlc3RzKTsKKyAgICBtTm9UaW1lb3V0TWFwLmNvcHlSZXF1ZXN0cyhwZW5kaW5nUmVxdWVzdHMpOworCisgICAgLy8gU29ydCBpbiBvcmRlciBvZiBzY2hlZHVsZWQgdGltZS4KKyAgICBzdGQ6OnNvcnQocGVuZGluZ1JlcXVlc3RzLmJlZ2luKCksIHBlbmRpbmdSZXF1ZXN0cy5lbmQoKSwKKyAgICAgICAgW10oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+JiByMSwKKyAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+JiByMikgeworICAgICAgICAgICAgICAgcmV0dXJuIHIxLT5zY2hlZHVsZWQgPCByMi0+c2NoZWR1bGVkOworICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcGVuZGluZ1JlcXVlc3RzOworfQorCitzdGQ6OnN0cmluZyBUaW1lclRocmVhZDo6cGVuZGluZ1RvU3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiByZXF1ZXN0c1RvU3RyaW5nKGdldFBlbmRpbmdSZXF1ZXN0cygpKTsKK30KKworc3RkOjpzdHJpbmcgVGltZXJUaHJlYWQ6OnJldGlyZWRUb1N0cmluZyhzaXplX3QgbikgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4gcmV0aXJlZFJlcXVlc3RzOworICAgIG1SZXRpcmVkUXVldWUuY29weVJlcXVlc3RzKHJldGlyZWRSZXF1ZXN0cywgbik7CisKKyAgICAvLyBEdW1wIHRvIHN0cmluZworICAgIHJldHVybiByZXF1ZXN0c1RvU3RyaW5nKHJldGlyZWRSZXF1ZXN0cyk7Cit9CisKK3N0ZDo6c3RyaW5nIFRpbWVyVGhyZWFkOjp0aW1lb3V0VG9TdHJpbmcoc2l6ZV90IG4pIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+IHRpbWVvdXRSZXF1ZXN0czsKKyAgICBtVGltZW91dFF1ZXVlLmNvcHlSZXF1ZXN0cyh0aW1lb3V0UmVxdWVzdHMsIG4pOworCisgICAgLy8gRHVtcCB0byBzdHJpbmcKKyAgICByZXR1cm4gcmVxdWVzdHNUb1N0cmluZyh0aW1lb3V0UmVxdWVzdHMpOworfQorCitzdGQ6OnN0cmluZyBUaW1lclRocmVhZDo6UmVxdWVzdDo6dG9TdHJpbmcoKSBjb25zdCB7CisgICAgY29uc3QgYXV0byBzY2hlZHVsZWRTdHJpbmcgPSBmb3JtYXRUaW1lKHNjaGVkdWxlZCk7CisgICAgY29uc3QgYXV0byBkZWFkbGluZVN0cmluZyA9IGZvcm1hdFRpbWUoZGVhZGxpbmUpOworICAgIHJldHVybiBzdGQ6OnN0cmluZyh0YWcpCisgICAgICAgIC5hcHBlbmQoIiBzY2hlZHVsZWQgIikuYXBwZW5kKHNjaGVkdWxlZFN0cmluZykKKyAgICAgICAgLmFwcGVuZCgiIGRlYWRsaW5lICIpLmFwcGVuZCh0aW1lU3VmZml4KHNjaGVkdWxlZFN0cmluZywgZGVhZGxpbmVTdHJpbmcpKQorICAgICAgICAuYXBwZW5kKCIgdGlkICIpLmFwcGVuZChzdGQ6OnRvX3N0cmluZyh0aWQpKTsKK30KKwordm9pZCBUaW1lclRocmVhZDo6UmVxdWVzdFF1ZXVlOjphZGQoc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+IHJlcXVlc3QpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobVJRTXV0ZXgpOworICAgIG1SZXF1ZXN0UXVldWUuZW1wbGFjZV9iYWNrKHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpLCBzdGQ6Om1vdmUocmVxdWVzdCkpOworICAgIGlmIChtUmVxdWVzdFF1ZXVlLnNpemUoKSA+IG1SZXF1ZXN0UXVldWVNYXgpIHsKKyAgICAgICAgbVJlcXVlc3RRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgVGltZXJUaHJlYWQ6OlJlcXVlc3RRdWV1ZTo6Y29weVJlcXVlc3RzKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+JiByZXF1ZXN0cywgc2l6ZV90IG4pIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobVJRTXV0ZXgpOworICAgIGNvbnN0IHNpemVfdCBzaXplID0gbVJlcXVlc3RRdWV1ZS5zaXplKCk7CisgICAgc2l6ZV90IGkgPSBuID49ICBzaXplID8gMCA6IHNpemUgLSBuOworICAgIGZvciAoOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJlt0aW1lLCByZXF1ZXN0XSA9IG1SZXF1ZXN0UXVldWVbaV07CisgICAgICAgIHJlcXVlc3RzLmVtcGxhY2VfYmFjayhyZXF1ZXN0KTsKKyAgICB9Cit9CisKK2Jvb2wgVGltZXJUaHJlYWQ6Ok5vVGltZW91dE1hcDo6aXNWYWxpZEhhbmRsZShIYW5kbGUgaGFuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhbmRsZSA+IGdldEluZGV4ZWRIYW5kbGUobU5vVGltZW91dFJlcXVlc3RzKTsKK30KKworVGltZXJUaHJlYWQ6OkhhbmRsZSBUaW1lclRocmVhZDo6Tm9UaW1lb3V0TWFwOjphZGQoc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+IHJlcXVlc3QpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobU5UTXV0ZXgpOworICAgIC8vIEEgdW5pcXVlIGhhbmRsZSBpcyBvYnRhaW5lZCBieSBtTm9UaW1lb3V0UmVxdWVzdHMuZmV0Y2hfYWRkKDEpLAorICAgIC8vIFRoaXMgbmVlZCBub3QgYmUgdW5kZXIgYSBsb2NrLCBidXQgd2UgZG8gc28gYW55aG93LgorICAgIGNvbnN0IEhhbmRsZSBoYW5kbGUgPSBnZXRJbmRleGVkSGFuZGxlKG1Ob1RpbWVvdXRSZXF1ZXN0cysrKTsKKyAgICBtTWFwW2hhbmRsZV0gPSByZXF1ZXN0OworICAgIHJldHVybiBoYW5kbGU7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBUaW1lclRocmVhZDo6UmVxdWVzdD4gVGltZXJUaHJlYWQ6Ok5vVGltZW91dE1hcDo6cmVtb3ZlKEhhbmRsZSBoYW5kbGUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobU5UTXV0ZXgpOworICAgIGF1dG8gaXQgPSBtTWFwLmZpbmQoaGFuZGxlKTsKKyAgICBpZiAoaXQgPT0gbU1hcC5lbmQoKSkgcmV0dXJuIHt9OworICAgIGF1dG8gcmVxdWVzdCA9IGl0LT5zZWNvbmQ7CisgICAgbU1hcC5lcmFzZShpdCk7CisgICAgcmV0dXJuIHJlcXVlc3Q7Cit9CisKK3ZvaWQgVGltZXJUaHJlYWQ6Ok5vVGltZW91dE1hcDo6Y29weVJlcXVlc3RzKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+JiByZXF1ZXN0cykgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTlRNdXRleCk7CisgICAgZm9yIChjb25zdCBhdXRvICZbaGFuZGxlLCByZXF1ZXN0XSA6IG1NYXApIHsKKyAgICAgICAgcmVxdWVzdHMuZW1wbGFjZV9iYWNrKHJlcXVlc3QpOworICAgIH0KK30KKworVGltZXJUaHJlYWQ6OkhhbmRsZSBUaW1lclRocmVhZDo6TW9uaXRvclRocmVhZDo6Z2V0VW5pcXVlSGFuZGxlX2woCisgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dCkgeworICAgIC8vIFRvIGF2b2lkIGtleSBjb2xsaXNpb25zLCBhZHZhbmNlIGJ5IDEgdGljayB1bnRpbCB0aGUga2V5IGlzIHVuaXF1ZS4KKyAgICBhdXRvIGRlYWRsaW5lID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKyB0aW1lb3V0OworICAgIGZvciAoOyBtTW9uaXRvclJlcXVlc3RzLmZpbmQoZGVhZGxpbmUpICE9IG1Nb25pdG9yUmVxdWVzdHMuZW5kKCk7CisgICAgICAgICBkZWFkbGluZSArPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbigxKSkKKyAgICAgICAgOworICAgIHJldHVybiBkZWFkbGluZTsKK30KKworVGltZXJUaHJlYWQ6Ok1vbml0b3JUaHJlYWQ6Ok1vbml0b3JUaHJlYWQoUmVxdWVzdFF1ZXVlJiB0aW1lb3V0UXVldWUpCisgICAgICAgIDogbVRpbWVvdXRRdWV1ZSh0aW1lb3V0UXVldWUpCisgICAgICAgICwgbVRocmVhZChbdGhpc10geyB0aHJlYWRGdW5jKCk7IH0pIHsKKyAgICAgcHRocmVhZF9zZXRuYW1lX25wKG1UaHJlYWQubmF0aXZlX2hhbmRsZSgpLCAiVGltZXJUaHJlYWQiKTsKKyAgICAgcHRocmVhZF9zZXRzY2hlZHByaW8obVRocmVhZC5uYXRpdmVfaGFuZGxlKCksIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7Cit9CisKK1RpbWVyVGhyZWFkOjpNb25pdG9yVGhyZWFkOjp+TW9uaXRvclRocmVhZCgpIHsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBfbChtTXV0ZXgpOworICAgICAgICBtU2hvdWxkRXhpdCA9IHRydWU7CisgICAgICAgIG1Db25kLm5vdGlmeV9hbGwoKTsKKyAgICB9CisgICAgbVRocmVhZC5qb2luKCk7Cit9CisKK3ZvaWQgVGltZXJUaHJlYWQ6Ok1vbml0b3JUaHJlYWQ6OnRocmVhZEZ1bmMoKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jayBfbChtTXV0ZXgpOworICAgIHdoaWxlICghbVNob3VsZEV4aXQpIHsKKyAgICAgICAgaWYgKCFtTW9uaXRvclJlcXVlc3RzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEhhbmRsZSBuZXh0RGVhZGxpbmUgPSBtTW9uaXRvclJlcXVlc3RzLmJlZ2luKCktPmZpcnN0OworICAgICAgICAgICAgaWYgKG5leHREZWFkbGluZSA8IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpKSB7CisgICAgICAgICAgICAgICAgLy8gRGVhZGxpbmUgaGFzIGV4cGlyZWQsIGhhbmRsZSB0aGUgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gbm9kZSA9IG1Nb25pdG9yUmVxdWVzdHMuZXh0cmFjdChtTW9uaXRvclJlcXVlc3RzLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICBfbC51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgYWRkIFJlcXVlc3QgdG8gcmV0aXJlZCBxdWV1ZSBlYXJseSBzbyB0aGF0IGl0IGNhbiBiZSBkdW1wZWQgb3V0LgorICAgICAgICAgICAgICAgICAgICBtVGltZW91dFF1ZXVlLmFkZChzdGQ6Om1vdmUobm9kZS5tYXBwZWQoKS5maXJzdCkpOworICAgICAgICAgICAgICAgICAgICBub2RlLm1hcHBlZCgpLnNlY29uZCgpOyAvLyBDYXV0aW9uOiB3ZSBkb24ndCBob2xkIGxvY2sgaGVyZSAtIGJ1dCBkbyB3ZSBjYXJlPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSB0aW1lb3V0IGNhc2UhICBXZSB3aWxsIGNyYXNoIHNvb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heWJlIGJlZm9yZSByZXR1cm5pbmcuCisgICAgICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nIGxlZnQgb3ZlciBpcyByZWxlYXNlZCBoZXJlIG91dHNpZGUgbG9jay4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gcmVhY3F1aXJlIHRoZSBsb2NrIC0gaWYgc29tZXRoaW5nIHdhcyBhZGRlZCwgd2UgbG9vcCBpbW1lZGlhdGVseSB0byBjaGVjay4KKyAgICAgICAgICAgICAgICBfbC5sb2NrKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZC53YWl0X3VudGlsKF9sLCBuZXh0RGVhZGxpbmUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUNvbmQud2FpdChfbCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RpbWVyVGhyZWFkOjpIYW5kbGUgVGltZXJUaHJlYWQ6Ok1vbml0b3JUaHJlYWQ6OmFkZCgKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+IHJlcXVlc3QsIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiYmIGZ1bmMsCisgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dCkgeworICAgIHN0ZDo6bG9ja19ndWFyZCBfbChtTXV0ZXgpOworICAgIGNvbnN0IEhhbmRsZSBoYW5kbGUgPSBnZXRVbmlxdWVIYW5kbGVfbCh0aW1lb3V0KTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLmVtcGxhY2UoaGFuZGxlLCBzdGQ6Om1ha2VfcGFpcihzdGQ6Om1vdmUocmVxdWVzdCksIHN0ZDo6bW92ZShmdW5jKSkpOworICAgIG1Db25kLm5vdGlmeV9hbGwoKTsKKyAgICByZXR1cm4gaGFuZGxlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVGltZXJUaHJlYWQ6OlJlcXVlc3Q+IFRpbWVyVGhyZWFkOjpNb25pdG9yVGhyZWFkOjpyZW1vdmUoSGFuZGxlIGhhbmRsZSkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2sgdWwobU11dGV4KTsKKyAgICBjb25zdCBhdXRvIGl0ID0gbU1vbml0b3JSZXF1ZXN0cy5maW5kKGhhbmRsZSk7CisgICAgaWYgKGl0ID09IG1Nb25pdG9yUmVxdWVzdHMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVGltZXJUaHJlYWQ6OlJlcXVlc3Q+IHJlcXVlc3QgPSBzdGQ6Om1vdmUoaXQtPnNlY29uZC5maXJzdCk7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGZ1bmMgPSBzdGQ6Om1vdmUoaXQtPnNlY29uZC5zZWNvbmQpOworICAgIG1Nb25pdG9yUmVxdWVzdHMuZXJhc2UoaXQpOworICAgIHVsLnVubG9jaygpOyAgLy8gbWFudWFsbHkgcmVsZWFzZSBsb2NrIGhlcmUgc28gZnVuYyBpcyByZWxlYXNlZCBvdXRzaWRlIG9mIGxvY2suCisgICAgcmV0dXJuIHJlcXVlc3Q7Cit9CisKK3ZvaWQgVGltZXJUaHJlYWQ6Ok1vbml0b3JUaHJlYWQ6OmNvcHlSZXF1ZXN0cygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiYgcmVxdWVzdHMpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobU11dGV4KTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJltkZWFkbGluZSwgbW9uaXRvcnBhaXJdIDogbU1vbml0b3JSZXF1ZXN0cykgeworICAgICAgICByZXF1ZXN0cy5lbXBsYWNlX2JhY2sobW9uaXRvcnBhaXIuZmlyc3QpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2Z1enplcnMvQW5kcm9pZC5icCBiL21lZGlhL3V0aWxzL2Z1enplcnMvQW5kcm9pZC5icAppbmRleCBjMTY5OGRjLi5kMjZlNmMyIDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9mdXp6ZXJzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdXRpbHMvZnV6emVycy9BbmRyb2lkLmJwCkBAIC0xOCw2ICsxOCw3IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgICAgICAicGFja2FnZW1hbmFnZXJfYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTMxLDExICszMiw2IEBACiAgICAgICAgICJiaW9uaWNfbGliY19wbGF0Zm9ybV9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIF0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgLy8gRm9yIERFQlVHR0VSX1NJR05BTAotICAgICAgICAic3lzdGVtL2NvcmUvZGVidWdnZXJkL2luY2x1ZGUiLAotICAgIF0sCiB9CiAKIGNjX2Z1enogewpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvZnV6emVycy9TZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAgYi9tZWRpYS91dGlscy9mdXp6ZXJzL1NlcnZpY2VVdGlsaXRpZXNGdXp6LmNwcAppbmRleCA2ZTUyNTEyLi41MWU4ZDdhIDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9mdXp6ZXJzL1NlcnZpY2VVdGlsaXRpZXNGdXp6LmNwcAorKysgYi9tZWRpYS91dGlscy9mdXp6ZXJzL1NlcnZpY2VVdGlsaXRpZXNGdXp6LmNwcApAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgPGZjbnRsLmg+CiAKICNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgIDx0eXBlX3RyYWl0cz4KIAogI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CiAjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvZnV6emVycy9UaW1lQ2hlY2tGdXp6LmNwcCBiL21lZGlhL3V0aWxzL2Z1enplcnMvVGltZUNoZWNrRnV6ei5jcHAKaW5kZXggZWViNmJhNi4uNzk2NjQ2OSAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvZnV6emVycy9UaW1lQ2hlY2tGdXp6LmNwcAorKysgYi9tZWRpYS91dGlscy9mdXp6ZXJzL1RpbWVDaGVja0Z1enouY3BwCkBAIC00NCwxMSArNDQsMTEgQEAKIAogICAgIC8vIDIuIFdlIGFsc28gaGF2ZSBzZXRBdWRpb0hhbFBpZHMsIHdoaWNoIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBwaWRzIHNldAogICAgIC8vIGFib3ZlLgotICAgIGFuZHJvaWQ6OlRpbWVDaGVjazo6c2V0QXVkaW9IYWxQaWRzKHBpZHMpOworICAgIGFuZHJvaWQ6Om1lZGlhdXRpbHM6OlRpbWVDaGVjazo6c2V0QXVkaW9IYWxQaWRzKHBpZHMpOwogICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heFN0cmluZ0xlbik7CiAKICAgICAvLyAzLiBUaGUgY29uc3RydWN0b3IsIHdoaWNoIGlzIGZ1enplZCBoZXJlOgotICAgIGFuZHJvaWQ6OlRpbWVDaGVjayB0aW1lQ2hlY2sobmFtZS5jX3N0cigpLCB0aW1lb3V0TXMpOworICAgIGFuZHJvaWQ6Om1lZGlhdXRpbHM6OlRpbWVDaGVjayB0aW1lQ2hlY2sobmFtZS5jX3N0cigpLCB7fSAvKiBvblRpbWVyICovLCB0aW1lb3V0TXMpOwogICAgIC8vIFdlIHdpbGwgbGVhdmUgc29tZSBidWZmZXIgdG8gYXZvaWQgc2xlZXBpbmcgdG9vIGxvbmcKICAgICB1aW50OF90IHNsZWVwX2Ftb3VudF9tcyA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCB0aW1lb3V0TXMgLyAyKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0xpYnJhcnkuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9MaWJyYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljZmMxMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9MaWJyYXJ5LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscyB7CisKKy8qKgorICogUmV0dXJucyBhIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBsaWJyYXJ5IGluc3RhbmNlLgorICoKKyAqIFdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoZSBsaWJyYXJ5IGlzIHJlbW92ZWQsIHRoZSBsaWJyYXJ5IHdpbGwgYmUgZGxjbG9zZSgpLgorICoKKyAqIE5vdGVzOgorICogMSkgVGhlIEFuZHJvaWQgYmlvbmljIGxpbmtlciBhbHdheXMgdXNlcyBSVExEX0dMT0JBTCBmb3IgZXhlY3V0YWJsZSBsaW5raW5nCisgKiB3aGljaCBwcm92aWRlcyB0aGUgc3ltYm9scyBmb3Igb3RoZXIgc3Vic2VxdWVudCBsaWJyYXJpZXMuCisgKgorICogMikgUlRMRF9HTE9CQUwgbGlrZSBSVExEX05PREVMRVRFIGRpc2FibGVzIHVubG9hZGluZyBvZiB0aGUgbGlicmFyeQorICogd2hlbiB0aGUgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIHplcm8uCisgKgorICogMykgUlRMRF9MT0NBTCBpcyB0aGUgZGVmYXVsdCBpbiB0aGUgYWJzZW5jZSBvZiBSVExEX0dMT0JBTC4KKyAqIFJUTERfTE9DQUwgbWF5IGJlIGlnbm9yZWQgaW4gc29tZSBzaXR1YXRpb25zLCBmb3IgZXhhbXBsZToKKyAqIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU2ODA4ODg5L3N0YXRpYy1vYmplY3RzLWRlc3RydWN0ZWQtYmVmb3JlLWRsY2xvc2UKKyAqCisgKiA0KSBXZSBkZWZhdWx0IHRvIHVzZSBSVExEX0xBWlkgdG8gZGVsYXkgc3ltYm9sIHJlbG9jYXRpb25zIHVudGlsIG5lZWRlZC4KKyAqIFRoaXMgZmxhZyBtYXkgYmUgaWdub3JlZCBieSBBbmRyb2lkLiAgUlRMRF9MQVpZIG1heSBhbGxvdworICogdW5yZXNvbHZlZCBzeW1ib2xzIGlmIG5vdCBhY2Nlc3NlZCwgb3Igc3ltYm9scyBhZGRlZCBsYXRlciB3aXRoIGFub3RoZXIgbGlicmFyeQorICogbG9hZGVkIHdpdGggUlRMRF9HTE9CQUwuIFNlZSBSVExEX05PVyBmb3IgY29tcGFyaXNvbi4KKyAqCisgKiA1KSBBdm9pZCBib3RoIHN0YXRpY2x5IGxvYWRpbmcgYW5kIGR5bmFtaWNhbGx5IGxvYWRpbmcgdGhlIHNhbWUgbGlicmFyeS4KKyAqIFRoaXMgaXMga25vd24gdG8gY2F1c2UgZG91YmxlIGZyZWUgaXNzdWVzIGFzIGxpYnJhcnkgc3ltYm9scyBtYXkgbWFwIHRvCisgKiB0aGUgc2FtZSBsb2NhdGlvbi4gIFJUTERfREVFUEJJTkQgZG9lcyBub3QgYXBwZWFyIHN1cHBvcnRlZCBhcyBvZiBULgorICogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQwNzMwNTEvd2hlbi13ZS1hcmUtc3VwcG9zZWQtdG8tdXNlLXJ0bGQtZGVlcGJpbmQKKyAqIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMxMjA5NjkzL3N0YXRpYy1saWJyYXJ5LWxpbmtlZC10d28tdGltZXMKKyAqCisgKiBEZXRhaWxzIG9uIEFuZHJvaWQgbGlua2VyIGFuZCBkZWJ1Z2dpbmcgaGVyZToKKyAqIFNlZTogYWRiIHNoZWxsIHNldHByb3AgZGVidWcubGQuYWxsIGRsZXJyb3IsZGxvcGVuLGRsc3ltCisgKiBTZWU6IGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2Jpb25pYy8rL21hc3Rlci9hbmRyb2lkLWNoYW5nZXMtZm9yLW5kay1kZXZlbG9wZXJzLm1kCisgKgorICogU29tZSBvdGhlciByZWxldmFudCBpbmZvOgorICogU2VlOiBTb29uZyBkb3VibGVfbG9hZGFibGU6dHJ1ZSBnby9kb3VibGVfbG9hZGFibGUKKyAqIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT25lX0RlZmluaXRpb25fUnVsZSNTdW1tYXJ5CisgKgorICogVE9ETyhiLzIyODA5MzE1MSk6IENvbnNpZGVyIG1vdmluZyB0byBwbGF0Zm9ybS9zeXN0ZW0uCisgKgorICogXHBhcmFtIGxpYnJhcnlOYW1lCisgKiBccGFyYW0gZmxhZ3Mgb25lIG9mIHRoZSBkbG9wZW4gUlRMRF8qIGZsYWdzLiBodHRwczovL2xpbnV4LmRpZS5uZXQvbWFuLzMvZGxvcGVuCisgKiBccmV0dXJuIHNoYXJlZF9wdHIgdG8gdGhlIGxpYnJhcnkuIFRoaXMgd2lsbCBiZSBudWxscHRyIGlmIGl0IGlzbid0IGZvdW5kLgorICovCitzdGQ6OnNoYXJlZF9wdHI8dm9pZD4gbG9hZExpYnJhcnkoY29uc3QgY2hhciAqbGlicmFyeU5hbWUsIGludCBmbGFncyA9IFJUTERfTEFaWSk7CisKKy8qKgorICogUmV0dXJucyBhIHNoYXJlZCBwb2ludGVyIHRvIGFuIG9iamVjdCBpbiB0aGUgbGlicmFyeQorICoKKyAqIFRoZSBvYmplY3Qgd2lsbCBiZSBhIGdsb2JhbCB2YXJpYWJsZSBvciBtZXRob2QgaW4gdGhlIGxpYnJhcnkuCisgKiBUaGUgb2JqZWN0IHJlZmVyZW5jZSBjb3VudGluZyBpcyBhbGlhc2VkIHRvIHRoZSBsaWJyYXJ5IHNoYXJlZCBwdHIuCisgKgorICogTm90ZTogSWYgYW55IGludGVybmFscyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgYXJlIGV4cG9zZWQsIGZvciBleGFtcGxlIGJ5CisgKiBhIG1ldGhvZCByZXR1cm5pbmcgYSBwb2ludGVyIHRvIGxpYnJhcnkgZ2xvYmFscywKKyAqIG9yIHJldHVybmluZyBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGVmaW5pdGlvbiBpcyBmcm9tIHRoZSBsaWJyYXJ5LAorICogdGhlbiB0aGUgc2hhcmVkX3B0ciBtdXN0IGJlIGtlcHQgYWxpdmUgd2hpbGUgc3VjaCByZWZlcmVuY2VzIHRvCisgKiBsaWJyYXJ5IGludGVybmFscyBleGlzdCB0byBwcmV2ZW50IGxpYnJhcnkgdW5sb2FkaW5nLgorICoKKyAqIFNlZSB1c2FnZSBvZiBSVExEX05PREVMRVRFIGFzIGEgZmxhZyB0byBwcmV2ZW50IHVubG9hZGluZy4KKyAqCisgKiBccGFyYW0gb2JqZWN0TmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCisgKiBccGFyYW0gbGlicmFyeSBhIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBsaWJyYXJ5IHJldHVybmVkIGJ5IGxvYWRMaWJyYXJ5KCkuCisgKiBccmV0dXJuIHNoYXJlZF9wdHIgdG8gdGhlIG9iamVjdCwgYnV0IHdob3NlIHJlZmNvdW50IGlzCisgKiAgICAgICAgIGFsaWFzZWQgdG8gdGhlIGxpYnJhcnkgc2hhcmVkIHB0ci4KKyAqLworc3RkOjpzaGFyZWRfcHRyPHZvaWQ+IGdldFVudHlwZWRPYmplY3RGcm9tTGlicmFyeSgKKyAgICAgICAgY29uc3QgY2hhciAqb2JqZWN0TmFtZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPHZvaWQ+JiBsaWJyYXJ5KTsKKworLyoqCisgKiBSZXR1cm5zIGEgc2hhcmVkIHBvaW50ZXIgdG8gYW4gb2JqZWN0IGluIHRoZSBsaWJyYXJ5CisgKgorICogVGhpcyBpcyB0aGUgdGVtcGxhdGUgdHlwZWQgdmVyc2lvbiBvZiBnZXRVbnR5cGVkT2JqZWN0RnJvbUxpYnJhcnkoKS4KKyAqCisgKiBccGFyYW0gb2JqZWN0TmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCisgKiBccGFyYW0gbGlicmFyeSBhIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBsaWJyYXJ5CisgKiBccmV0dXJuIHNoYXJlZF9wdHIgdG8gdGhlIG9iamVjdCwgYnV0IHdob3NlIHJlZmNvdW50IGlzCisgKiAgICAgICAgIGFsaWFzZWQgdG8gdGhlIGxpYnJhcnkgc2hhcmVkIHB0ci4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnNoYXJlZF9wdHI8VD4gZ2V0T2JqZWN0RnJvbUxpYnJhcnkoCisgICAgICAgIGNvbnN0IGNoYXIgKm9iamVjdE5hbWUsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjx2b2lkPiYgbGlicmFyeSkgeworICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8VD4oZ2V0VW50eXBlZE9iamVjdEZyb21MaWJyYXJ5KG9iamVjdE5hbWUsIGxpYnJhcnkpKTsKK30KKworfSAvLyBhbmRyb2lkOjptZWRpYXV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL01lZGlhVXRpbHNEZWxheWVkLmgKc2ltaWxhcml0eSBpbmRleCA2NCUKY29weSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwKY29weSB0byBtZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvTWVkaWFVdGlsc0RlbGF5ZWQuaAppbmRleCA5ZTA0ZTgyLi4xNTgzZTYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9NZWRpYVV0aWxzRGVsYXllZC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTMsMTQgKzEzLDE5IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMgeworCisvLyBUaGVzZSBtZXRob2RzIHVzZSBsYXp5IGxpYnJhcnkgbG9hZGluZy4KIAogLyoqCi0gKiB7QGhpZGV9CisgKiBSZXR1cm5zIGEgc3RyaW5nIGNhbGxzdGFjayBmcm9tIHRoZSB0aHJlYWQgaWQgdGlkLgogICovCi1AQmFja2luZyh0eXBlPSJpbnQiKQotZW51bSBBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlIHsKLSAgICAgTk9ORSA9IDAsCi0gICAgIEVMRU1FTlRBUllfU1RSRUFNID0gMSwKLSAgICAgSEFORExFID0gMiwKLX0KK3N0ZDo6c3RyaW5nIGdldENhbGxTdGFja1N0cmluZ0ZvclRpZChwaWRfdCB0aWQpOworCit9IC8vIGFuZHJvaWQ6Om1lZGlhdXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9NZXRob2RTdGF0aXN0aWNzLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvTWV0aG9kU3RhdGlzdGljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMGZiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvTWV0aG9kU3RhdGlzdGljcy5oCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9TdGF0aXN0aWNzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzIHsKKworLyoqCisgKiBNZXRob2RTdGF0aXN0aWNzIGlzIHVzZWQgdG8gYXNzb2NpYXRlIEJpbmRlciBjb2RlcworICogd2l0aCBhIG1ldGhvZCBuYW1lIGFuZCBleGVjdXRpb24gdGltZSBzdGF0aXN0aWNzLgorICoKKyAqIFRoaXMgaXMgdXNlZCB0byB0cmFjayBiaW5kZXIgdHJhbnNhY3Rpb24gdGltZXMgZm9yCisgKiBBdWRpb0ZsaW5nZXIgYW5kIEF1ZGlvUG9saWN5IHNlcnZpY2VzLgorICoKKyAqIEhlcmUsIENvZGUgaXMgdGhlIGVudW1lcmF0aW9uIHR5cGUgZm9yIHRoZSBtZXRob2QKKyAqIGxvb2t1cC4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIENvZGU+CitjbGFzcyBNZXRob2RTdGF0aXN0aWNzIHsKK3B1YmxpYzoKKyAgICB1c2luZyBGbG9hdFR5cGUgPSBmbG9hdDsKKyAgICB1c2luZyBTdGF0c1R5cGUgPSBhdWRpb191dGlsczo6U3RhdGlzdGljczxGbG9hdFR5cGU+OworCisgICAgLyoqCisgICAgICogTWV0aG9kIHN0YXRpc3RpY3MuCisgICAgICoKKyAgICAgKiBJbml0aWFsaXplZCB3aXRoIHRoZSBCaW5kZXIgdHJhbnNhY3Rpb24gbGlzdCBmb3IgdHJhY2tpbmcgQXVkaW9GbGluZ2VyCisgICAgICogYW5kIEF1ZGlvUG9saWN5TWFuYWdlciBleGVjdXRpb24gc3RhdGlzdGljcy4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBNZXRob2RTdGF0aXN0aWNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PHN0ZDo6cGFpcjxjb25zdCBDb2RlLCBzdGQ6OnN0cmluZz4+JiBtZXRob2RNYXAgPSB7fSkKKyAgICAgICAgOiBtTWV0aG9kTWFwe21ldGhvZE1hcH0ge30KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBtZXRob2QgZXZlbnQsIHR5cGljYWxseSBleGVjdXRpb24gdGltZSBpbiBtcy4KKyAgICAgKi8KKyAgICB2b2lkIGV2ZW50KENvZGUgY29kZSwgRmxvYXRUeXBlIGV4ZWN1dGVNcykgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobUxvY2spOworICAgICAgICBtU3RhdGlzdGljc01hcFtjb2RlXS5hZGQoZXhlY3V0ZU1zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIGZvciB0aGUgbWV0aG9kIGNvZGUuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgZ2V0TWV0aG9kRm9yQ29kZShDb2RlIGNvZGUpIGNvbnN0IHsKKyAgICAgICAgYXV0byBpdCA9IG1NZXRob2RNYXAuZmluZChjb2RlKTsKKyAgICAgICAgcmV0dXJuIGl0ID09IG1NZXRob2RNYXAuZW5kKCkgPyBzdGQ6OnRvX3N0cmluZygoaW50KWNvZGUpIDogaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIG1ldGhvZCB3YXMgaW52b2tlZCBieSBldmVudCgpLgorICAgICAqLworICAgIHNpemVfdCBnZXRNZXRob2RDb3VudChDb2RlIGNvZGUpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1Mb2NrKTsKKyAgICAgICAgYXV0byBpdCA9IG1TdGF0aXN0aWNzTWFwLmZpbmQoY29kZSk7CisgICAgICAgIHJldHVybiBpdCA9PSBtU3RhdGlzdGljc01hcC5lbmQoKSA/IDAgOiBpdC0+c2Vjb25kLmdldE4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGF0aXN0aWNzIG9iamVjdCBmb3IgdGhlIG1ldGhvZC4KKyAgICAgKi8KKyAgICBTdGF0c1R5cGUgZ2V0U3RhdGlzdGljcyhDb2RlIGNvZGUpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1Mb2NrKTsKKyAgICAgICAgYXV0byBpdCA9IG1TdGF0aXN0aWNzTWFwLmZpbmQoY29kZSk7CisgICAgICAgIHJldHVybiBpdCA9PSBtU3RhdGlzdGljc01hcC5lbmQoKSA/IFN0YXRzVHlwZXt9IDogaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEdW1wcyB0aGUgY3VycmVudCBtZXRob2Qgc3RhdGlzdGljcy4KKyAgICAgKi8KKyAgICBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3QgeworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxnKG1Mb2NrKTsKKyAgICAgICAgaWYgY29uc3RleHByIChzdGQ6OmlzX3NhbWVfdjxDb2RlLCBzdGQ6OnN0cmluZz4pIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmW2NvZGUsIHN0YXRzXSA6IG1TdGF0aXN0aWNzTWFwKSB7CisgICAgICAgICAgICAgICAgc3MgPDwgY29kZSA8PAorICAgICAgICAgICAgICAgICAgICAgICAgIiBuPSIgPDwgc3RhdHMuZ2V0TigpIDw8ICIgIiA8PCBzdGF0cy50b1N0cmluZygpIDw8ICJcbiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSAvKiBjb25zdGV4cHIgKi8geworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZbY29kZSwgc3RhdHNdIDogbVN0YXRpc3RpY3NNYXApIHsKKyAgICAgICAgICAgICAgICBzcyA8PCBpbnQoY29kZSkgPDwgIiAiIDw8IGdldE1ldGhvZEZvckNvZGUoY29kZSkgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbj0iIDw8IHN0YXRzLmdldE4oKSA8PCAiICIgPDwgc3RhdHMudG9TdHJpbmcoKSA8PCAiXG4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzcy5zdHIoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjptYXA8Q29kZSwgc3RkOjpzdHJpbmc+IG1NZXRob2RNYXA7CisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bWFwPENvZGUsIFN0YXRzVHlwZT4gbVN0YXRpc3RpY3NNYXAgR1VBUkRFRF9CWShtTG9jayk7Cit9OworCisvLyBNYW5hZ2VkIFN0YXRpc3RpY3Mgc3VwcG9ydC4KKy8vIFN1cHBvcnRlZCBNb2R1bGVzCisjZGVmaW5lIE1FVEhPRF9TVEFUSVNUSUNTX01PRFVMRV9OQU1FX0FVRElPX0hJREwgIkF1ZGlvSGlkbCIKKworLy8gUmV0dXJucyBhIHZlY3RvciBvZiBjbGFzcyBuYW1lcyBmb3IgdGhlIG1vZHVsZSwgb3IgYSBudWxscHRyIGlmIG1vZHVsZSBub3QgZm91bmQuCitzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PgorZ2V0U3RhdGlzdGljc0NsYXNzZXNGb3JNb2R1bGUoc3RkOjpzdHJpbmdfdmlldyBtb2R1bGVOYW1lKTsKKworLy8gUmV0dXJucyBhIHN0YXRpc3RpY3Mgb2JqZWN0IGZvciB0aGF0IGNsYXNzLCBvciBhIG51bGxwdHIgaWYgY2xhc3Mgbm90IGZvdW5kLgorc3RkOjpzaGFyZWRfcHRyPE1ldGhvZFN0YXRpc3RpY3M8c3RkOjpzdHJpbmc+PgorZ2V0U3RhdGlzdGljc0ZvckNsYXNzKHN0ZDo6c3RyaW5nX3ZpZXcgY2xhc3NOYW1lKTsKKworLy8gT25seSBpZiB1c2VkLCByZXF1aXJlcyBJQmluZGVyLmggdG8gYmUgaW5jbHVkZWQgYXQgdGhlIGxvY2F0aW9uIG9mIGludm9jYXRpb24uCisjZGVmaW5lIE1FVEhPRF9TVEFUSVNUSUNTX0JJTkRFUl9DT0RFX05BTUVTKENPREVfVFlQRSkgXAorICAgIHsoQ09ERV9UWVBFKUlCaW5kZXI6OlBJTkdfVFJBTlNBQ1RJT04gLCAicGluZyJ9LCBcCisgICAgeyhDT0RFX1RZUEUpSUJpbmRlcjo6RFVNUF9UUkFOU0FDVElPTiAsICJkdW1wIn0sIFwKKyAgICB7KENPREVfVFlQRSlJQmluZGVyOjpTSEVMTF9DT01NQU5EX1RSQU5TQUNUSU9OICwgInNoZWxsQ29tbWFuZCJ9LCBcCisgICAgeyhDT0RFX1RZUEUpSUJpbmRlcjo6SU5URVJGQUNFX1RSQU5TQUNUSU9OICwgImdldEludGVyZmFjZURlc2NyaXB0b3IifSwgXAorICAgIHsoQ09ERV9UWVBFKUlCaW5kZXI6OlNZU1BST1BTX1RSQU5TQUNUSU9OICwgIlNZU1BST1BTX1RSQU5TQUNUSU9OIn0sIFwKKyAgICB7KENPREVfVFlQRSlJQmluZGVyOjpFWFRFTlNJT05fVFJBTlNBQ1RJT04gLCAiRVhURU5TSU9OX1RSQU5TQUNUSU9OIn0sIFwKKyAgICB7KENPREVfVFlQRSlJQmluZGVyOjpERUJVR19QSURfVFJBTlNBQ1RJT04gLCAiREVCVUdfUElEX1RSQU5TQUNUSU9OIn0sIFwKKworfSAvLyBhbmRyb2lkOjptZWRpYXV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvUHJvY2Vzcy5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1Byb2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjQ5YzNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1Byb2Nlc3MuaApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyoKKyAqIFRoaXMgaGVhZGVyIGNvbnRhaW5zIHV0aWxpdGllcyB0byByZWFkIHRoZSBsaW51eCBzeXN0ZW0gL3Byb2MvcGlkIGZpbGVzCisgKgorICogVGhlIGZvcm1hdCBvZiB0aGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZSwgc28gdXNlIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzIG9ubHkuCisgKgorICogVGhlIGxpbnV4ICJwcm9jIiBkaXJlY3RvcnkgZG9jdW1lbnRhdGlvbjoKKyAqIGh0dHBzOi8va2VybmVsLm9yZy9kb2MvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAorICogaHR0cHM6Ly93d3cua2VybmVsLm9yZy9kb2MvaHRtbC9sYXRlc3QvZmlsZXN5c3RlbXMvcHJvYy5odG1sP2hpZ2hsaWdodD1wcm9jJTIwcGlkI2NoYXB0ZXItMy1wZXItcHJvY2Vzcy1wYXJhbWV0ZXJzCisgKi8KKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMgeworCisvKioKKyAqIFJldHVybiB0aGUgdGhyZWFkIHNjaGVkdWxlIGluZm9ybWF0aW9uIGZvciB0aWQuCisgKgorICogU3RyaW5nIHdpbGwgYmUgZW1wdHkgaWYgdGhlIHByb2Nlc3MgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvCisgKiBhY2Nlc3MgdGhlIC9wcm9jL3BpZCB0YWJsZXMsIG9yIGlmIG5vdCBvbiBhIExpbnV4IGRldmljZS4KKyAqCisgKiBMaW51eCBzY2hlZHVsZXIgZG9jdW1lbnRhdGlvbjoKKyAqIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL2h0bWwvbGF0ZXN0L3NjaGVkdWxlci9pbmRleC5odG1sCisgKiBodHRwczovL21hbjcub3JnL2xpbnV4L21hbi1wYWdlcy9tYW43L3NjaGVkLjcuaHRtbAorICoKKyAqIFNhbXBsZSBhcyBmb2xsb3dzOgorCitBdWRpb091dF84RCAoMTA4MDAsICN0aHJlYWRzOiAzNikKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NlLmV4ZWNfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgODEzMjA3Ny41OTgwMjYKK3NlLnZydW50aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgIDc5ODY4OS44NzIwODcKK3NlLnN1bV9leGVjX3J1bnRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgIDEzNjQ2Ni45NTc4MzgKK3NlLm5yX21pZ3JhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAxMzI0ODcKK3NlLnN0YXRpc3RpY3Muc3VtX3NsZWVwX3J1bnRpbWUgICAgICAgICAgICAgIDogICAgICAgNTYyOTc5NC41NjU5NDUKK3NlLnN0YXRpc3RpY3Mud2FpdF9zdGFydCAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMC4wMDAwMDAKK3NlLnN0YXRpc3RpY3Muc2xlZXBfc3RhcnQgICAgICAgICAgICAgICAgICAgIDogICAgICAgODE5NTcyNy41ODYzOTIKK3NlLnN0YXRpc3RpY3MuYmxvY2tfc3RhcnQgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMC4wMDAwMDAKK3NlLnN0YXRpc3RpY3Muc2xlZXBfbWF4ICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgMTk5NTY2NS44Njk4MDgKK3NlLnN0YXRpc3RpY3MuYmxvY2tfbWF4ICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMC41OTE2NzUKK3NlLnN0YXRpc3RpY3MuZXhlY19tYXggICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMi40Nzc1ODAKK3NlLnN0YXRpc3RpY3Muc2xpY2VfbWF4ICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMC4wMDAwMDAKK3NlLnN0YXRpc3RpY3Mud2FpdF9tYXggICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgOC42MDg2NDIKK3NlLnN0YXRpc3RpY3Mud2FpdF9zdW0gICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgNDY4My4yNjY4MzUKK3NlLnN0YXRpc3RpY3Mud2FpdF9jb3VudCAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAzMDA5NjQKK3NlLnN0YXRpc3RpY3MuaW93YWl0X3N1bSAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMC4wMDAwMDAKK3NlLnN0YXRpc3RpY3MuaW93YWl0X2NvdW50ICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDAKK3NlLnN0YXRpc3RpY3MubnJfbWlncmF0aW9uc19jb2xkICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDAKK3NlLnN0YXRpc3RpY3MubnJfZmFpbGVkX21pZ3JhdGlvbnNfYWZmaW5lICAgIDogICAgICAgICAgICAgICAgICAyOTcKK3NlLnN0YXRpc3RpY3MubnJfZmFpbGVkX21pZ3JhdGlvbnNfcnVubmluZyAgIDogICAgICAgICAgICAgICAgIDE0MTIKK3NlLnN0YXRpc3RpY3MubnJfZmFpbGVkX21pZ3JhdGlvbnNfaG90ICAgICAgIDogICAgICAgICAgICAgICAgICAgOTYKK3NlLnN0YXRpc3RpY3MubnJfZm9yY2VkX21pZ3JhdGlvbnMgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgMjYKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwcyAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAyODEyNjMKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19zeW5jICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgODQKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19taWdyYXRlICAgICAgICAgICAgIDogICAgICAgICAgICAgICAxMzIzMjIKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19sb2NhbCAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgIDIxNjUKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19yZW1vdGUgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAyNzkwOTgKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19hZmZpbmUgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDAKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19hZmZpbmVfYXR0ZW1wdHMgICAgIDogICAgICAgICAgICAgICAgICAgIDAKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19wYXNzaXZlICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDAKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19pZGxlICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDAKK2F2Z19hdG9tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMC40NTM0MzQKK2F2Z19wZXJfY3B1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMS4wMzAwNDAKK25yX3N3aXRjaGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAzMDA5NjMKK25yX3ZvbHVudGFyeV9zd2l0Y2hlcyAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAyODEyNTIKK25yX2ludm9sdW50YXJ5X3N3aXRjaGVzICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgMTk3MTEKK3NlLmxvYWQud2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgNzM0NzcxMjAKK3NlLmF2Zy5sb2FkX3N1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgNTgKK3NlLmF2Zy5ydW5uYWJsZV9zdW0gICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgMjc2NDgKK3NlLmF2Zy51dGlsX3N1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgMjE1MDQKK3NlLmF2Zy5sb2FkX2F2ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgNDgKK3NlLmF2Zy5ydW5uYWJsZV9hdmcgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDAKK3NlLmF2Zy51dGlsX2F2ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDAKK3NlLmF2Zy5sYXN0X3VwZGF0ZV90aW1lICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgIDgxMzIwNzU4MjQxMjgKK3NlLmF2Zy51dGlsX2VzdC5ld21hICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDgKK3NlLmF2Zy51dGlsX2VzdC5lbnF1ZXVlZCAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDEKK3VjbGFtcC5taW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDAKK3VjbGFtcC5tYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgIDEwMjQKK2VmZmVjdGl2ZSB1Y2xhbXAubWluICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDAKK2VmZmVjdGl2ZSB1Y2xhbXAubWF4ICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgIDEwMjQKK3BvbGljeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDAKK3ByaW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAxMDEKK2Nsb2NrLWRlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAxNjMKKyovCitzdGQ6OnN0cmluZyBnZXRUaHJlYWRTY2hlZEFzU3RyaW5nKHBpZF90IHRpZCk7CisKKy8qKgorICogUmV0dXJucyBtYXAgZm9yIHRoZSByYXcgdGhyZWFkIHNjaGVkdWxlIHN0cmluZy4KKyAqLworc3RkOjptYXA8c3RkOjpzdHJpbmcsIGRvdWJsZT4gcGFyc2VUaHJlYWRTY2hlZFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc2NoZWRTdHJpbmcpOworCisvKioKKyAqIFJldHVybnMgbWFwIGZvciAvcHJvYy9waWQvdGFzay90aWQvc2NoZWQKKyAqLworaW5saW5lIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBkb3VibGU+IGdldFRocmVhZFNjaGVkQXNNYXAocGlkX3QgdGlkKSB7CisgICAgcmV0dXJuIHBhcnNlVGhyZWFkU2NoZWRTdHJpbmcoZ2V0VGhyZWFkU2NoZWRBc1N0cmluZyh0aWQpKTsKK30KKworLy8gVE9ETzogRXh0ZW5kIHRvIG90aGVyIC9wcm9jL3BpZCBmaWxlIGluZm9ybWF0aW9uLgorLy8KKy8vIFNlZSAicHMiIGNvbW1hbmQgZ2V0X3BzKCkuCisvLyBodHRwczovL2NzLmFuZHJvaWQuY29tL2FuZHJvaWQvcGxhdGZvcm0vc3VwZXJwcm9qZWN0LysvbWFzdGVyOmV4dGVybmFsL3RveWJveC90b3lzL3Bvc2l4L3BzLmM7bD03MDcKKworfSAvLyBhbmRyb2lkOjptZWRpYXV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2NvcGVkU3RhdGlzdGljcy5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1Njb3BlZFN0YXRpc3RpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWZjMWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1Njb3BlZFN0YXRpc3RpY3MuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJNZXRob2RTdGF0aXN0aWNzLmgiCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMgeworCitjbGFzcyBTY29wZWRTdGF0aXN0aWNzIHsKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIFNjb3BlZFN0YXRpc3RpY3MgaXMgYSBSQUlJIHdheSBvZiBvYnRhaW5pbmcKKyAgICAgKiBleGVjdXRpb24gdGltZSBzdGF0aXN0aWNzIGZvciBhIHNjb3BlZCBDKysgYmxvY2suCisgICAgICoKKyAgICAgKiBJdCB1cGRhdGVzIHRoZSBNZXRob2RTdGF0aXN0aWNzIHNoYXJlZCBwb2ludGVyIHBhcmFtZXRlcgorICAgICAqIHdpdGggdGhlIG1ldGhvZE5hbWUgcGFyYW1ldGVyIGFuZCB0aGUgZHVyYXRpb24vbGlmZXRpbWUgb2YgdGhlCisgICAgICogU2NvcGVkU3RhdGlzdGljcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBOb3QgdGhyZWFkLXNhZmUsIGJ1dCBleHBlY3RlZCB0byBydW4gaW4gYSBzaW5nbGUgZXhlY3V0aW9uCisgICAgICogdGhyZWFkLCBhbmQgdGhlcmUgYXJlIG5vIHVzZXIgc2VydmljZWFibGUgcGFydHMgZXhwb3NlZC4KKyAgICAgKgorICAgICAqIEV4YW1wbGU6CisgICAgICoKKyAgICAgKiBzdGQ6OnNoYXJlZF9wdHI8bWVkaWF1dGlsczo6TWV0aG9kU3RhdGlzdGljczxzdGQ6OnN0cmluZz4+IHN0YXRzID0KKyAgICAgKiAgICAgc3RkOjptYWtlX3NoYXJlZDxtZWRpYXV0aWxzOjpNZXRob2RTdGF0aXN0aWNzPHN0ZDo6c3RyaW5nPj4oKTsKKyAgICAgKgorICAgICAqIC8vIC4uLgorICAgICAqIHsKKyAgICAgKiAgICBtZWRpYXV0aWxzOjpTY29wZWRTdGF0aXN0aWNzIHNjb3BlZFN0YXRpc3RpY3MoIk15Q2xhc3M6bXlNZXRob2QiLCBzdGF0cyk7CisgICAgICoKKyAgICAgKiAgICAvLyBzb21lIHdvcmsgdG8gYmUgdGltZWQgaGVyZSAtIHVwIHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrLgorICAgICAqIH0KKyAgICAgKgorICAgICAqIFxwYXJhbSBtZXRob2ROYW1lIHRoZSBtZXRob2RuYW1lIHRvIHVzZSAiQ2xhc3NOYW1lOjptZXRob2ROYW1lIgorICAgICAqIFxwYXJhbSBzdGF0aXN0aWNzIGEgc2hhcmVkIHB0ciB0byB0aGUgTWV0aG9kU3RhdGlzdGljcyBvYmplY3QgdG8gdXNlLgorICAgICAqLworICAgIFNjb3BlZFN0YXRpc3RpY3Moc3RkOjpzdHJpbmcgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxtZWRpYXV0aWxzOjpNZXRob2RTdGF0aXN0aWNzPHN0ZDo6c3RyaW5nPj4gc3RhdGlzdGljcykKKyAgICAgICAgOiBtTWV0aG9kTmFtZXtzdGQ6Om1vdmUobWV0aG9kTmFtZSl9CisgICAgICAgICwgbVN0YXRpc3RpY3N7c3RkOjptb3ZlKHN0YXRpc3RpY3MpfQorICAgICAgICAsIG1CZWdpbntzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKX0ge30KKworICAgIC8vIE5vIGNvcHkgY29uc3RydWN0b3IuCisgICAgU2NvcGVkU3RhdGlzdGljcyhjb25zdCBTY29wZWRTdGF0aXN0aWNzJiBzY29wZWRTdGF0aXN0aWNzKSA9IGRlbGV0ZTsKKyAgICBTY29wZWRTdGF0aXN0aWNzJiBvcGVyYXRvcj0oY29uc3QgU2NvcGVkU3RhdGlzdGljcyYgc2NvcGVkU3RhdGlzdGljcykgPSBkZWxldGU7CisKKyAgICB+U2NvcGVkU3RhdGlzdGljcygpIHsKKyAgICAgICAgaWYgKG1TdGF0aXN0aWNzKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBlbGFwc2VkTXMgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bmFub3NlY29uZHM+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSAtIG1CZWdpbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvdW50KCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMWUtNjsgLy8gbnMgdG8gbXMuCisgICAgICAgICAgICBtU3RhdGlzdGljcy0+ZXZlbnQobU1ldGhvZE5hbWUsIGVsYXBzZWRNcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtTWV0aG9kTmFtZTsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8bWVkaWF1dGlsczo6TWV0aG9kU3RhdGlzdGljczxzdGQ6OnN0cmluZz4+IG1TdGF0aXN0aWNzOworICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgbUJlZ2luOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgKaW5kZXggNzM0MzEzYy4uZGUyMGQ1NSAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oCkBAIC02MSw2ICs2MSw3IEBACiAKIC8vIFVzZWQgZm9yIGNhbGxzIHRoYXQgc2hvdWxkIGNvbWUgZnJvbSBzeXN0ZW0gc2VydmVyIG9yIGludGVybmFsLgogLy8gTm90ZTogc3lzdGVtIHNlcnZlciBpcyBtdWx0aXByb2Nlc3MgZm9yIG11bHRpcGxlIHVzZXJzLiAgYXVkaW9zZXJ2ZXIgaXMgbm90LgorLy8gTm90ZTogaWYgdGhpcyBtZXRob2QgaXMgbW9kaWZpZWQsIGFsc28gdXBkYXRlIHRoZSBzYW1lIG1ldGhvZCBpbiBTZW5zb3JTZXJ2aWNlLmguCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlck9yU3lzdGVtU2VydmVyVWlkKHVpZF90IHVpZCkgewogICAgIHJldHVybiBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpID09IEFJRF9TWVNURU0gfHwgdWlkID09IEFJRF9BVURJT1NFUlZFUjsKIH0KQEAgLTk1LDYgKzk2LDcgQEAKIGJvb2wgY2FwdHVyZU1lZGlhT3V0cHV0QWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSk7CiBib29sIGNhcHR1cmVUdW5lckF1ZGlvSW5wdXRBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKTsKIGJvb2wgY2FwdHVyZVZvaWNlQ29tbXVuaWNhdGlvbk91dHB1dEFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOworYm9vbCBhY2Nlc3NVbHRyYXNvdW5kQWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSk7CiBib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSk7CiBib29sIHNldHRpbmdzQWxsb3dlZCgpOwogYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCk7CkBAIC0xMDQsNiArMTA2LDcgQEAKIGJvb2wgZHVtcEFsbG93ZWQoKTsKIGJvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOwogYm9vbCBieXBhc3NJbnRlcnJ1cHRpb25Qb2xpY3lBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKTsKK2Jvb2wgY2FsbEF1ZGlvSW50ZXJjZXB0aW9uQWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSk7CiB2b2lkIHB1cmdlUGVybWlzc2lvbkNhY2hlKCk7CiBpbnQzMl90IGdldE9wRm9yU291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaHJlYWRTbmFwc2hvdC5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RocmVhZFNuYXBzaG90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3MDgyMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaHJlYWRTbmFwc2hvdC5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMgeworCisvKioKKyAqIENvbGxlY3QgVGhyZWFkIHBlcmZvcm1hbmNlIHN0YXRpc3RpY3MuCisgKgorICogQW4gb25CZWdpbigpIGFuZCBvbkVuZCgpIHNpZ25hbCBhIGNvbnRpbnVvdXMgInJ1biIuCisgKiBTdGF0aXN0aWNzIGFyZSByZXR1cm5lZCBieSB0b1N0cmluZygpLgorICovCitjbGFzcyBUaHJlYWRTbmFwc2hvdCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgVGhyZWFkU25hcHNob3QocGlkX3QgdGlkID0gLTEpIHsgbVN0YXRlLnJlc2V0KHRpZCk7IH07CisKKyAgICAvLyBSZXR1cm5zIGN1cnJlbnQgdGlkCisgICAgcGlkX3QgZ2V0VGlkKCkgY29uc3Q7CisKKyAgICAvLyBTZXRzIHRoZSB0aWQKKyAgICB2b2lkIHNldFRpZChwaWRfdCB0aWQpOworCisgICAgLy8gUmVzZXQgc3RhdGlzdGljcywga2VlcCBzYW1lIHRpZC4KKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBTaWduYWwgYSB0aW1pbmcgcnVuIGlzIGJlZ2lubmluZworICAgIHZvaWQgb25CZWdpbigpOworCisgICAgLy8gU2lnbmFsIGEgdGltaW5nIHJ1biBpcyBlbmRpbmcKKyAgICB2b2lkIG9uRW5kKCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIHRocmVhZCBzbmFwc2hvdCBzdGF0aXN0aWNzIGluIGEgc3RyaW5nCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7CisKKyAgICAvLyBTdGF0ZSByZXByZXNlbnRzIG91ciBzdGF0aXN0aWNzIGF0IGEgZ2l2ZW4gcG9pbnQgaW4gdGltZS4KKyAgICAvLyBJdCBpcyBub3QgdGhyZWFkLXNhZmUsIHNvIGFueSBsb2NraW5nIG11c3Qgb2NjdXIgYXQgdGhlIGNhbGxlci4KKyAgICBzdHJ1Y3QgU3RhdGUgeworICAgICAgICBwaWRfdCBtVGlkOworICAgICAgICBpbnQ2NF90IG1CZWdpblRpbWVOczsgIC8vIHdoZW4gbGFzdCBydW4gYmVnYW4KKyAgICAgICAgaW50NjRfdCBtRW5kVGltZU5zOyAgICAvLyB3aGVuIGxhc3QgcnVuIGVuZHMgKGlmIGxlc3MgdGhhbiBiZWdpbiB0aW1lLCBub3Qgc3RhcnRlZCkKKyAgICAgICAgaW50NjRfdCBtQ3VtdWxhdGl2ZVRpbWVOczsKKworICAgICAgICAvLyBTY2hlZCBpcyB0aGUgc2NoZWR1bGVyIHN0YXRpc3RpY3Mgb2J0YWluZWQgYXMgYSBzdHJpbmcuCisgICAgICAgIC8vIFRoaXMgaXMgcGFyc2VkIG9ubHkgd2hlbiB0b1N0cmluZygpIGlzIGNhbGxlZC4KKyAgICAgICAgc3RkOjpzdHJpbmcgbUJlZ2luU2NoZWQ7CisKKyAgICAgICAgLy8gQ2xlYXJzIGV4aXN0aW5nIHN0YXRlLgorICAgICAgICB2b2lkIHJlc2V0KHBpZF90IHRpZCk7CisKKyAgICAgICAgLy8gb25CZWdpbigpIHRha2VzIGEgc3RkOjpzdHJpbmcgc2NoZWQgc2hvdWxkIGNhbiBiZSBjYXB0dXJlZCBvdXRzaWRlCisgICAgICAgIC8vIG9mIGxvY2tpbmcuCisgICAgICAgIHZvaWQgb25CZWdpbihzdGQ6OnN0cmluZyBzY2hlZCk7CisgICAgICAgIHZvaWQgb25FbmQoKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKyAgICB9OworCisgICAgLy8gT3VyIGN1cnJlbnQgc3RhdGUuIFdlIG9ubHkga2VlcCB0aGUgY3VycmVudCBydW5uaW5nIHN0YXRlLgorICAgIFN0YXRlIG1TdGF0ZSBHVUFSREVEX0JZKG1Mb2NrKTsKK307CisKK30gLy8gYW5kcm9pZDo6bWVkaWF1dGlscwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVDaGVjay5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVDaGVjay5oCmluZGV4IDViYTZkN2MuLmVmMDNhZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaW1lQ2hlY2suaAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZUNoZWNrLmgKQEAgLTE0LDYyICsxNCw5NCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI3ByYWdtYSBvbmNlCiAKLSNpZm5kZWYgQU5EUk9JRF9USU1FX0NIRUNLX0gKLSNkZWZpbmUgQU5EUk9JRF9USU1FX0NIRUNLX0gKLQotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi1uYW1lc3BhY2UgYW5kcm9pZCB7CisjaW5jbHVkZSA8bWVkaWF1dGlscy9UaW1lclRocmVhZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscyB7CiAKIC8vIEEgY2xhc3MgbW9uaXRvcmluZyBleGVjdXRpb24gdGltZSBmb3IgYSBjb2RlIGJsb2NrIChzY29wZWQgdmFyaWFibGUpIGFuZCBjYXVzaW5nIGFuIGFzc2VydAogLy8gaWYgaXQgZXhjZWVkcyBhIGNlcnRhaW4gdGltZQogCiBjbGFzcyBUaW1lQ2hlY2sgewotcHVibGljOgorICBwdWJsaWM6CisgICAgdXNpbmcgT25UaW1lckZ1bmMgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCAvKiB0aW1lb3V0ICovLCBmbG9hdCAvKiBlbGFwc2VkTXMgKi8gKT47CiAKICAgICAvLyBUaGUgZGVmYXVsdCB0aW1lb3V0IGlzIGNob3NlbiB0byBiZSBsZXNzIHRoYW4gc3lzdGVtIHNlcnZlciB3YXRjaGRvZyB0aW1lb3V0CiAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrRGVmYXVsdFRpbWVPdXRNcyA9IDUwMDA7CiAKLSAgICAgICAgICAgIFRpbWVDaGVjayhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcyA9IGtEZWZhdWx0VGltZU91dE1zKTsKLSAgICAgICAgICAgIH5UaW1lQ2hlY2soKTsKLSAgICBzdGF0aWMgIHZvaWQgc2V0QXVkaW9IYWxQaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcyk7Ci0gICAgc3RhdGljICBzdGQ6OnZlY3RvcjxwaWRfdD4gZ2V0QXVkaW9IYWxQaWRzKCk7CisgICAgLyoqCisgICAgICogVGltZUNoZWNrIGlzIGEgUkFJSSBvYmplY3Qgd2hpY2ggd2lsbCBub3RpZnkgYSBjYWxsYmFjaworICAgICAqIG9uIHRpbWVyIGV4cGlyYXRpb24gb3Igd2hlbiB0aGUgb2JqZWN0IGlzIGRlYWxsb2NhdGVkLgorICAgICAqCisgICAgICogVGltZUNoZWNrIGlzIHVzZWQgYXMgYSB3YXRjaGRvZyBhbmQgYWJvcnRzIGJ5IGRlZmF1bHQgb24gdGltZXIgZXhwaXJhdGlvbi4KKyAgICAgKiBXaGVuIGl0IGFib3J0cywgaXQgd2lsbCBhbHNvIHNlbmQgYSBkZWJ1Z2dlciBzaWduYWwgdG8gcGlkcyBwYXNzZWQgaW4gdGhyb3VnaAorICAgICAqIHNldEF1ZGlvSGFsUGlkcygpLgorICAgICAqCisgICAgICogSWYgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHJldHVybnMgZm9yIHRpbWVvdXQgaXQgd2lsbCBub3QgYmUgY2FsbGVkIGFnYWluIGZvcgorICAgICAqIHRoZSBkZWFsbG9jYXRpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gdGFnICAgICAgIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIFRpbWVDaGVjayBvYmplY3QuCisgICAgICogXHBhcmFtIG9uVGltZXIgICBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIDIgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGltZW91dCAgKHdoaWNoIGlzIHRydWUgd2hlbiB0aGUgVGltZUNoZWNrIG9iamVjdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgb3V0LCBmYWxzZSB3aGVuIHRoZSBUaW1lQ2hlY2sgb2JqZWN0IGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95ZWQgb3IgbGVhdmVzIHNjb3BlIGJlZm9yZSB0aGUgdGltZXIgZXhwaXJlcy4pCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZWxhcHNlZE1zICh0aGUgZWxhcHNlZCB0aW1lIHRvIHRoaXMgZXZlbnQpLgorICAgICAqICAgICAgICAgICAgICAgICAgVGhlIGNhbGxiYWNrIHdoZW4gdGltZW91dCBpcyB0cnVlIHdpbGwgYmUgY2FsbGVkIG9uIGEgZGlmZmVyZW50IHRocmVhZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIFRoaXMgd2lsbCBjYW5jZWwgdGhlIGNhbGxiYWNrIG9uIHRoZSBkZXN0cnVjdG9yIGJ1dCBpcyBub3QgZ3VhcmFudGVlZAorICAgICAqICAgICAgICAgICAgICAgICAgdG8gYmxvY2sgZm9yIGNhbGxiYWNrIGNvbXBsZXRpb24gaWYgaXQgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcworICAgICAqICAgICAgICAgICAgICAgICAgKGZvciBtYXhpbXVtIGNvbmN1cnJlbmN5IGFuZCByZWR1Y2VkIGRlYWRsb2NrIHBvdGVudGlhbCksIHNvIHVzZSBwcm9wZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgIGxpZmV0aW1lIGFuYWx5c2lzIChlLmcuIHNoYXJlZCBvciB3ZWFrIHBvaW50ZXJzKS4KKyAgICAgKiBccGFyYW0gdGltZW91dE1zIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqICAgICAgICAgICAgICAgICAgQSB6ZXJvIHRpbWVvdXQgbWVhbnMgbm8gdGltZW91dCBpcyBzZXQgLQorICAgICAqICAgICAgICAgICAgICAgICAgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCBvbmx5IHdoZW4KKyAgICAgKiAgICAgICAgICAgICAgICAgIHRoZSBUaW1lQ2hlY2sgb2JqZWN0IGlzIGRlc3Ryb3llZCBvciBsZWF2ZXMgc2NvcGUuCisgICAgICogXHBhcmFtIGNyYXNoT25UaW1lb3V0IHRydWUgaWYgdGhlIG9iamVjdCBpc3N1ZXMgYW4gYWJvcnQgb24gdGltZW91dC4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBUaW1lQ2hlY2soc3RkOjpzdHJpbmcgdGFnLCBPblRpbWVyRnVuYyYmIG9uVGltZXIgPSB7fSwKKyAgICAgICAgICAgIHVpbnQzMl90IHRpbWVvdXRNcyA9IGtEZWZhdWx0VGltZU91dE1zLCBib29sIGNyYXNoT25UaW1lb3V0ID0gdHJ1ZSk7CiAKLXByaXZhdGU6CisgICAgVGltZUNoZWNrKCkgPSBkZWZhdWx0OworICAgIC8vIFJlbW92ZSBjb3B5IGNvbnN0cnVjdG9ycyBhcyB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgY2FsbCB0byB0aGUgZGVzdHJ1Y3Rvci4KKyAgICAvLyBNb3ZlIGlzIGtlcHQgaW1wbGljaXRseSBkaXNhYmxlZCwgYnV0IHdvdWxkIGJlIGxvZ2ljYWxseSBjb25zaXN0ZW50IGlmIGVuYWJsZWQuCisgICAgVGltZUNoZWNrKGNvbnN0IFRpbWVDaGVjayYgb3RoZXIpID0gZGVsZXRlOworICAgIFRpbWVDaGVjayYgb3BlcmF0b3I9KGNvbnN0IFRpbWVDaGVjayYpID0gZGVsZXRlOwogCi0gICAgY2xhc3MgVGltZUNoZWNrVGhyZWFkIDogcHVibGljIFRocmVhZCB7CisgICAgflRpbWVDaGVjaygpOworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyB0b1N0cmluZygpOworICAgIHN0YXRpYyB2b2lkIHNldEF1ZGlvSGFsUGlkcyhjb25zdCBzdGQ6OnZlY3RvcjxwaWRfdD4mIHBpZHMpOworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxwaWRfdD4gZ2V0QXVkaW9IYWxQaWRzKCk7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBIZWxwZXIgY2xhc3MgZm9yIGhhbmRsaW5nIGV2ZW50cy4KKyAgICAvLyBUaGUgdXNhZ2UgaGVyZSBpcyBjb25zdCBzYWZlLgorICAgIGNsYXNzIFRpbWVDaGVja0hhbmRsZXIgewogICAgIHB1YmxpYzoKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgdGFnOworICAgICAgICBjb25zdCBPblRpbWVyRnVuYyBvblRpbWVyOworICAgICAgICBjb25zdCBib29sIGNyYXNoT25UaW1lb3V0OworICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IHN0YXJ0VGltZTsKKyAgICAgICAgY29uc3QgcGlkX3QgdGlkOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUNoZWNrVGhyZWFkKCkge30KLSAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+VGltZUNoZWNrVGhyZWFkKCkgb3ZlcnJpZGU7Ci0KLSAgICAgICAgICAgICAgICBuc2Vjc190ICAgICBzdGFydE1vbml0b3JpbmcoY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpOwotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BNb25pdG9yaW5nKG5zZWNzX3QgZW5kVGltZU5zKTsKLQotICAgIHByaXZhdGU6Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWZCYXNlCi0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25GaXJzdFJlZigpIG92ZXJyaWRlIHsgcnVuKCJUaW1lQ2hlY2tUaHJlYWQiLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOyB9Ci0KLSAgICAgICAgICAgICAgICAvLyBUaHJlYWQKLSAgICAgICAgdmlydHVhbCBib29sICAgICAgICB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7Ci0KLSAgICAgICAgICAgICAgICBDb25kaXRpb24gICAgICAgICAgIG1Db25kOwotICAgICAgICAgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgbU11dGV4OwotICAgICAgICAgICAgICAgIC8vIHVzaW5nIHRoZSBlbmQgdGltZSBpbiBucyBhcyBrZXkgaXMgT0sgZ2l2ZW4gdGhlIHJpc2sgaXMgbG93IHRoYXQgdHdvIGVudHJpZXMKLSAgICAgICAgICAgICAgICAvLyBhcmUgYWRkZWQgaW4gc3VjaCBhIHdheSB0aGF0IDxhZGQgdGltZT4gKyA8dGltZW91dD4gYXJlIHRoZSBzYW1lIGZvciBib3RoLgotICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPCBuc2Vjc190LCBjb25zdCBjaGFyKj4gIG1Nb25pdG9yUmVxdWVzdHM7CisgICAgICAgIHZvaWQgb25DYW5jZWwoVGltZXJUaHJlYWQ6OkhhbmRsZSBoYW5kbGUpIGNvbnN0OworICAgICAgICB2b2lkIG9uVGltZW91dCgpIGNvbnN0OwogICAgIH07CiAKLSAgICBzdGF0aWMgc3A8VGltZUNoZWNrVGhyZWFkPiBnZXRUaW1lQ2hlY2tUaHJlYWQoKTsKKyAgICBzdGF0aWMgVGltZXJUaHJlYWQmIGdldFRpbWVDaGVja1RocmVhZCgpOwogICAgIHN0YXRpYyB2b2lkIGFjY2Vzc0F1ZGlvSGFsUGlkcyhzdGQ6OnZlY3RvcjxwaWRfdD4qIHBpZHMsIGJvb2wgdXBkYXRlKTsKIAotICAgIGNvbnN0ICAgICAgICAgICBuc2Vjc190IG1FbmRUaW1lTnM7CisgICAgLy8gbVRpbWVDaGVja0hhbmRsZXIgaXMgaW1tdXRhYmxlLCBwcmVmZXIgdG8gYmUgZmlyc3QgaW5pdGlhbGl6ZWQsIGxhc3QgZGVzdHJveWVkLgorICAgIC8vIFRlY2huaWNhbGx5IHNwZWFraW5nLCB3ZSBkbyBub3QgbmVlZCBhIHNoYXJlZF9wdHIgaGVyZSBiZWNhdXNlIFRpbWVyVGhyZWFkOjpjYW5jZWxUYXNrKCkKKyAgICAvLyBpcyBtdXR1YWxseSBleGNsdXNpdmUgb2YgdGhlIGNhbGxiYWNrLCBidXQgdGhlIHByaWNlIHBhaWQgZm9yIGxpZmV0aW1lIHNhZmV0eSBpcyBtaW5pbWFsLgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUaW1lQ2hlY2tIYW5kbGVyPiBtVGltZUNoZWNrSGFuZGxlcjsKKyAgICBjb25zdCBUaW1lclRocmVhZDo6SGFuZGxlIG1UaW1lckhhbmRsZSA9IFRpbWVyVGhyZWFkOjpJTlZBTElEX0hBTkRMRTsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisvLyBSZXR1cm5zIGEgVGltZUNoZWNrIG9iamVjdCB0aGF0IHNlbmRzIGluZm8gdG8gTWV0aG9kU3RhdGlzdGljcworLy8gb2J0YWluZWQgZnJvbSBnZXRTdGF0aXN0aWNzRm9yQ2xhc3MoY2xhc3NOYW1lKS4KK1RpbWVDaGVjayBtYWtlVGltZUNoZWNrU3RhdHNGb3JDbGFzc01ldGhvZCgKKyAgICAgICAgc3RkOjpzdHJpbmdfdmlldyBjbGFzc05hbWUsIHN0ZDo6c3RyaW5nX3ZpZXcgbWV0aG9kTmFtZSk7CiAKLSNlbmRpZiAgLy8gQU5EUk9JRF9USU1FX0NIRUNLX0gKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZXJUaHJlYWQuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaW1lclRocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZWU2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZXJUaHJlYWQuaApAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZF9hbm5vdGF0aW9ucy5oPgorCituYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscyB7CisKKy8qKgorICogQSB0aHJlYWQgZm9yIGRlZmVycmVkIGV4ZWN1dGlvbiBvZiB0YXNrcywgd2l0aCBjYW5jZWxsYXRpb24uCisgKi8KK2NsYXNzIFRpbWVyVGhyZWFkIHsKKyAgcHVibGljOgorICAgIC8vIEEgSGFuZGxlIGlzIGEgdGltZV9wb2ludCB0aGF0IHNlcnZlcyBhcyBhIHVuaXF1ZSBrZXkuICBJdCBpcyBvcmRlcmVkLgorICAgIHVzaW5nIEhhbmRsZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQ7CisKKyAgICBzdGF0aWMgaW5saW5lIGNvbnN0ZXhwciBIYW5kbGUgSU5WQUxJRF9IQU5ETEUgPQorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludDo6bWluKCk7CisKKyAgICAvKioKKyAgICAgKiBTY2hlZHVsZXMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGluIHRoZSBmdXR1cmUgKGB0aW1lb3V0YCBkdXJhdGlvbiBmcm9tIG5vdykuCisgICAgICoKKyAgICAgKiBccGFyYW0gdGFnICAgICBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiAgVGhpcyBuZWVkIG5vdCBiZSB1bmlxdWUsCisgICAgICogICAgICAgICAgICAgICAgYXMgdGhlIEhhbmRsZSByZXR1cm5lZCBpcyB1c2VkIGZvciBjYW5jZWxsaW5nLgorICAgICAqIFxwYXJhbSBmdW5jICAgIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCBhdCB0aGUgdGltZW91dC4KKyAgICAgKiBccGFyYW0gdGltZW91dCB0aW1lb3V0IGR1cmF0aW9uIHdoaWNoIGlzIGNvbnZlcnRlZCB0byBtaWxsaXNlY29uZHMgd2l0aCBhdAorICAgICAqICAgICAgICAgICAgICAgIGxlYXN0IDQ1IGludGVnZXIgYml0cy4KKyAgICAgKiAgICAgICAgICAgICAgICBBIHRpbWVvdXQgb2YgMCAob3IgbmVnYXRpdmUpIG1lYW5zIHRoZSB0aW1lciBuZXZlciBleHBpcmVzCisgICAgICogICAgICAgICAgICAgICAgc28gZnVuYygpIGlzIG5ldmVyIGNhbGxlZC4gVGhlc2UgdGFza3MgYXJlIHN0b3JlZCBpbnRlcm5hbGx5CisgICAgICogICAgICAgICAgICAgICAgYW5kIHJlcG9ydGVkIGluIHRoZSB0b1N0cmluZygpIHVudGlsIG1hbnVhbGx5IGNhbmNlbGxlZC4KKyAgICAgKiBccmV0dXJucyAgICAgICBhIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBjYW5jZWxsYXRpb24uCisgICAgICovCisgICAgSGFuZGxlIHNjaGVkdWxlVGFzaygKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRhZywgc3RkOjpmdW5jdGlvbjx2b2lkKCk+JiYgZnVuYywgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lb3V0KTsKKworICAgIC8qKgorICAgICAqIFRyYWNrcyBhIHRhc2sgdGhhdCBzaG93cyB1cCBvbiB0b1N0cmluZygpIHVudGlsIGNhbmNlbGxlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSB0YWcgICAgIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suCisgICAgICogXHJldHVybnMgICAgICAgYSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgY2FuY2VsbGF0aW9uLgorICAgICAqLworICAgIEhhbmRsZSB0cmFja1Rhc2soc3RkOjpzdHJpbmcgdGFnKTsKKworICAgIC8qKgorICAgICAqIENhbmNlbHMgYSB0YXNrIHByZXZpb3VzbHkgc2NoZWR1bGVkIHdpdGggc2NoZWR1bGVUYXNrKCkKKyAgICAgKiBvciB0cmFja1Rhc2soKS4KKyAgICAgKgorICAgICAqIFxyZXR1cm5zIHRydWUgaWYgY2FuY2VsbGVkLiBJZiB0aGUgdGFzayBoYXMgYWxyZWFkeSBleGVjdXRlZAorICAgICAqICAgICAgICAgIG9yIGlmIHRoZSBoYW5kbGUgZG9lc24ndCBleGlzdCwgdGhpcyBpcyBhIG5vLW9wCisgICAgICogICAgICAgICAgYW5kIHJldHVybnMgZmFsc2UuCisgICAgICovCisgICAgYm9vbCBjYW5jZWxUYXNrKEhhbmRsZSBoYW5kbGUpOworCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoc2l6ZV90IHJldGlyZWRDb3VudCA9IFNJWkVfTUFYKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFRpbWVyVGhyZWFkIHF1ZXVlLgorICAgICAqCisgICAgICogVGhlIHF1ZXVlIGlzIGR1bXBlZCBpbiBvcmRlciBvZiBzY2hlZHVsaW5nIChub3QgZGVhZGxpbmUpLgorICAgICAqLworICAgIHN0ZDo6c3RyaW5nIHBlbmRpbmdUb1N0cmluZygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGFzdCByZXRpcmVkIHRhc2tzLgorICAgICAqCisgICAgICogVGhlc2UgdGFza3MgZnJvbSB0cmFja1Rhc2soKSBvciBzY2hlZHVsZVRhc2soKSBhcmUKKyAgICAgKiBjYW5jZWxsZWQuCisgICAgICoKKyAgICAgKiBUaGVzZSBhcmUgb3JkZXJlZCB3aGVuIHRoZSB0YXNrIHdhcyByZXRpcmVkLgorICAgICAqCisgICAgICogXHBhcmFtIG4gaXMgbWF4aW11bSBudW1iZXIgb2YgdGFza3MgdG8gZHVtcC4KKyAgICAgKi8KKyAgICBzdGQ6OnN0cmluZyByZXRpcmVkVG9TdHJpbmcoc2l6ZV90IG4gPSBTSVpFX01BWCkgY29uc3Q7CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxhc3QgdGltZW91dCB0YXNrcy4KKyAgICAgKgorICAgICAqIFRoZXNlIHRhc2tzIGZyb20gc2NoZWR1bGVUYXNrKCkgd2hpY2ggaGF2ZSAgdGltZWQtb3V0LgorICAgICAqCisgICAgICogVGhlc2UgYXJlIG9yZGVyZWQgd2hlbiB0aGUgdGFzayBoYWQgdGltZWQtb3V0LgorICAgICAqCisgICAgICogXHBhcmFtIG4gaXMgbWF4aW11bSBudW1iZXIgb2YgdGFza3MgdG8gZHVtcC4KKyAgICAgKi8KKyAgICBzdGQ6OnN0cmluZyB0aW1lb3V0VG9TdHJpbmcoc2l6ZV90IG4gPSBTSVpFX01BWCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBEdW1wcyBhIGNvbnRhaW5lciB3aXRoIFNtYXJ0UG9pbnRlcjxSZXF1ZXN0PiB0byBhIHN0cmluZy4KKyAgICAgKgorICAgICAqICJ7IFJlcXVlc3QxIH0geyBSZXF1ZXN0Mn0gLi4ueyBSZXF1ZXN0TiB9IgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyByZXF1ZXN0c1RvU3RyaW5nKGNvbnN0IFQmIGNvbnRhaW5lclJlcXVlc3RzKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgICAgIC8vIGFwcGVuZCBzZWVtcyB0byBiZSBmYXN0ZXIgdGhhbiBzdHJpbmdzdHJlYW0uCisgICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE4ODkyMjgxL21vc3Qtb3B0aW1pemVkLXdheS1vZi1jb25jYXRlbmF0aW9uLWluLXN0cmluZ3MKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiByZXF1ZXN0IDogY29udGFpbmVyUmVxdWVzdHMpIHsKKyAgICAgICAgICAgIHMuYXBwZW5kKCJ7ICIpLmFwcGVuZChyZXF1ZXN0LT50b1N0cmluZygpKS5hcHBlbmQoIiB9ICIpOworICAgICAgICB9CisgICAgICAgIC8vIElmIG5vdCBlbXB0eSwgdGhlcmUncyBhbiBleHRyYSBzcGFjZSBhdCB0aGUgZW5kLCBzbyB3ZSB0cmltIGl0IG9mZi4KKyAgICAgICAgaWYgKCFzLmVtcHR5KCkpIHMucG9wX2JhY2soKTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgLy8gVG8gbWluaW1pemUgbW92ZW1lbnQgb2YgZGF0YSwgd2UgcGFzcyBhcm91bmQgc2hhcmVkX3B0cnMgdG8gUmVxdWVzdHMuCisgICAgLy8gVGhlc2UgYXJlIGFsbG9jYXRlZCBhbmQgZGVhbGxvY2F0ZWQgb3V0c2lkZSBvZiB0aGUgbG9jay4KKyAgICBzdHJ1Y3QgUmVxdWVzdCB7CisgICAgICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgc2NoZWR1bGVkOworICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IGRlYWRsaW5lOyAvLyBkZWFkbGluZSA6PSBzY2hlZHVsZWQgKyB0aW1lb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGRlYWRsaW5lID09IHNjaGVkdWxlZCwgbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGltZW91dCwgdGFzayBub3QgZXhlY3V0ZWQuCisgICAgICAgIGNvbnN0IHBpZF90IHRpZDsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgdGFnOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisgICAgfTsKKworICAgIC8vIERlcXVlIG9mIHJlcXVlc3RzLCBpbiBvcmRlciBvZiBhZGQoKS4KKyAgICAvLyBUaGlzIGNsYXNzIGlzIHRocmVhZC1zYWZlLgorICAgIGNsYXNzIFJlcXVlc3RRdWV1ZSB7CisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFJlcXVlc3RRdWV1ZShzaXplX3QgbWF4U2l6ZSkKKyAgICAgICAgICAgIDogbVJlcXVlc3RRdWV1ZU1heChtYXhTaXplKSB7fQorCisgICAgICAgIHZvaWQgYWRkKHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pik7CisKKyAgICAgICAgLy8gcmV0dXJuIHVwIHRvIHRoZSBsYXN0ICJuIiByZXF1ZXN0cyByZXRpcmVkLgorICAgICAgICB2b2lkIGNvcHlSZXF1ZXN0cyhzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+JiByZXF1ZXN0cywKKyAgICAgICAgICAgIHNpemVfdCBuID0gU0laRV9NQVgpIGNvbnN0OworCisgICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBzaXplX3QgbVJlcXVlc3RRdWV1ZU1heDsKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1SUU11dGV4OworICAgICAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+PgorICAgICAgICAgICAgICAgIG1SZXF1ZXN0UXVldWUgR1VBUkRFRF9CWShtUlFNdXRleCk7CisgICAgfTsKKworICAgIC8vIEEgc3RvcmFnZSBtYXAgb2YgdGFza3Mgd2l0aG91dCB0aW1lb3V0cy4gIFRoZXJlIGlzIG5vIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPgorICAgIC8vIHJlcXVpcmVkLCBpdCBqdXN0IHRyYWNrcyB0aGUgdGFza3Mgd2l0aCB0aGUgdGFnLCBzY2hlZHVsZWQgdGltZSBhbmQgdGhlIHRpZC4KKyAgICAvLyBUaGVzZSB0YXNrcyBzaG93IHVwIG9uIGEgcGVuZGluZ1RvU3RyaW5nKCkgdW50aWwgbWFudWFsbHkgY2FuY2VsbGVkLgorICAgIGNsYXNzIE5vVGltZW91dE1hcCB7CisgICAgICAgIC8vIFRoaXMgYSBjb3VudGVyIG9mIHRoZSByZXF1ZXN0cyB0aGF0IGhhdmUgbm8gdGltZW91dCAodGltZW91dCA9PSAwKS4KKyAgICAgICAgc3RkOjphdG9taWM8c2l6ZV90PiBtTm9UaW1lb3V0UmVxdWVzdHN7fTsKKworICAgICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbU5UTXV0ZXg7CisgICAgICAgIHN0ZDo6bWFwPEhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiBtTWFwIEdVQVJERURfQlkobU5UTXV0ZXgpOworCisgICAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaXNWYWxpZEhhbmRsZShIYW5kbGUgaGFuZGxlKSBjb25zdDsgLy8gbG9jayBmcmVlCisgICAgICAgIEhhbmRsZSBhZGQoc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+IHJlcXVlc3QpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4gcmVtb3ZlKEhhbmRsZSBoYW5kbGUpOworICAgICAgICB2b2lkIGNvcHlSZXF1ZXN0cyhzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4+JiByZXF1ZXN0cykgY29uc3Q7CisgICAgfTsKKworICAgIC8vIE1vbml0b3IgdGhyZWFkLgorICAgIC8vIFRoaXMgdGhyZWFkIG1hbmFnZXMgc2hhcmVkIHBvaW50ZXJzIHRvIFJlcXVlc3RzIGFuZCBhIGZ1bmN0aW9uIHRvCisgICAgLy8gY2FsbCBvbiB0aW1lb3V0LgorICAgIC8vIFRoaXMgY2xhc3MgaXMgdGhyZWFkLXNhZmUuCisgICAgY2xhc3MgTW9uaXRvclRocmVhZCB7CisgICAgICAgIG11dGFibGUgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIG11dGFibGUgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbmQ7CisKKyAgICAgICAgLy8gT3JkZXJlZCBtYXAgb2YgcmVxdWVzdHMgYmFzZWQgb24gdGltZSBvZiBkZWFkbGluZS4KKyAgICAgICAgLy8KKyAgICAgICAgc3RkOjptYXA8SGFuZGxlLCBzdGQ6OnBhaXI8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+LCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4+PgorICAgICAgICAgICAgICAgIG1Nb25pdG9yUmVxdWVzdHMgR1VBUkRFRF9CWShtTXV0ZXgpOworCisgICAgICAgIFJlcXVlc3RRdWV1ZSYgbVRpbWVvdXRRdWV1ZTsgLy8gbG9ja2VkIGludGVybmFsbHksIGFkZGVkIHRvIHdoZW4gcmVxdWVzdCB0aW1lcyBvdXQuCisKKyAgICAgICAgLy8gV29ya2VyIHRocmVhZCB2YXJpYWJsZXMKKyAgICAgICAgYm9vbCBtU2hvdWxkRXhpdCBHVUFSREVEX0JZKG1NdXRleCkgPSBmYWxzZTsKKworICAgICAgICAvLyBUbyBhdm9pZCByYWNlIHdpdGggaW5pdGlhbGl6YXRpb24sCisgICAgICAgIC8vIG1UaHJlYWQgc2hvdWxkIGJlIGluaXRpYWxpemVkIGxhc3QgYXMgdGhlIHRocmVhZCBpcyBsYXVuY2hlZCBpbW1lZGlhdGVseS4KKyAgICAgICAgc3RkOjp0aHJlYWQgbVRocmVhZDsKKworICAgICAgICB2b2lkIHRocmVhZEZ1bmMoKTsKKyAgICAgICAgSGFuZGxlIGdldFVuaXF1ZUhhbmRsZV9sKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dCkgUkVRVUlSRVMobU11dGV4KTsKKworICAgICAgcHVibGljOgorICAgICAgICBNb25pdG9yVGhyZWFkKFJlcXVlc3RRdWV1ZSAmdGltZW91dFF1ZXVlKTsKKyAgICAgICAgfk1vbml0b3JUaHJlYWQoKTsKKworICAgICAgICBIYW5kbGUgYWRkKHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiByZXF1ZXN0LCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4mJiBmdW5jLAorICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0PiByZW1vdmUoSGFuZGxlIGhhbmRsZSk7CisgICAgICAgIHZvaWQgY29weVJlcXVlc3RzKHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4mIHJlcXVlc3RzKSBjb25zdDsKKyAgICB9OworCisgICAgLy8gQW5hbHlzaXMgY29udGFpbnMgaW5mbyBkZWR1Y2VkIGJ5IGFuYWx5c2lzVGltZW91dCgpLgorICAgIC8vCisgICAgLy8gU3VtbWFyeSBpcyB0aGUgcmVzdWx0IHN0cmluZyBmcm9tIGNoZWNraW5nIHRpbWVvdXRSZXF1ZXN0cyB0byBzZWUgaWYKKyAgICAvLyBhbnkgbWlnaHQgYmUgY2F1c2VkIGJ5IGJsb2NrZWQgY2FsbHMgaW4gcGVuZGluZ1JlcXVlc3RzLgorICAgIC8vCisgICAgLy8gU3VtbWFyeSBzdHJpbmcgaXMgZW1wdHkgaWYgdGhlcmUgaXMgbm8gYXV0b21hdGljIGFjdGlvbmFibGUgaW5mby4KKyAgICAvLworICAgIC8vIHRpbWVvdXRUaWQgaXMgdGhlIHRpZCBzZWxlY3RlZCBmcm9tIHRpbWVvdXRSZXF1ZXN0cyAoaWYgYW55KS4KKyAgICAvLworICAgIC8vIEhBTEJsb2NrZWRUaWQgaXMgdGhlIHRpZCB0aGF0IGlzIGJsb2NrZWQgZnJvbSBwZW5kaW5nUmVxdWVzdHMgYmVsaWV2ZWQKKyAgICAvLyB0byBjYXVzZSB0aGUgdGltZW91dC4KKyAgICAvLyBIQUxCbG9ja2VkVGlkIG1heSBiZSBJTlZBTElEX1BJRCBpZiBubyBzdXNwZWN0ZWQgdGlkIGlzIGZvdW5kLAorICAgIC8vIGFuZCBpZiBIQUxCbG9ja2VkVGlkIGlzIHZhbGlkLCBpdCB3aWxsIG5vdCBiZSB0aGUgc2FtZSBhcyB0aW1lb3V0VGlkLgorICAgIC8vCisgICAgc3RhdGljIGNvbnN0ZXhwciBwaWRfdCBJTlZBTElEX1BJRCA9IC0xOworICAgIHN0cnVjdCBBbmFseXNpcyB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN1bW1hcnk7CisgICAgICAgIHBpZF90IHRpbWVvdXRUaWQgPSBJTlZBTElEX1BJRDsKKyAgICAgICAgcGlkX3QgSEFMQmxvY2tlZFRpZCA9IElOVkFMSURfUElEOworICAgIH07CisKKyAgICAvLyBBIEhBTCBtZXRob2QgaXMgd2hlcmUgdGhlIHN1YnN0cmluZyAiSGlkbCIgaXMgaW4gdGhlIGNsYXNzIG5hbWUuCisgICAgLy8gVGhlIHRhZyBzaG91bGQgbG9vayBsaWtlOiAuLi4gSGlkbCAuLi4gOjogLi4uCisgICAgc3RhdGljIGJvb2wgaXNSZXF1ZXN0RnJvbUhhbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgUmVxdWVzdD4mIHJlcXVlc3QpOworCisgICAgLy8gUmV0dXJucyBhbmFseXNpcyBmcm9tIHRoZSByZXF1ZXN0cy4KKyAgICBzdGF0aWMgQW5hbHlzaXMgYW5hbHl6ZVRpbWVvdXQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4mIHRpbWVvdXRSZXF1ZXN0cywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IFJlcXVlc3Q+PiYgcGVuZGluZ1JlcXVlc3RzKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBSZXF1ZXN0Pj4gZ2V0UGVuZGluZ1JlcXVlc3RzKCkgY29uc3Q7CisKKyAgICAvLyBBIG5vLXRpbWVvdXQgcmVxdWVzdCBpcyByZXByZXNlbnRlZCBieSBhIGhhbmRsZXMgYXQgdGhlIGVuZCBvZiBzdGVhZHlfY2xvY2sgdGltZSwKKyAgICAvLyBjb3VudGluZyBkb3duIGJ5IHRoZSBudW1iZXIgb2Ygbm8gdGltZW91dCByZXF1ZXN0cyBwcmV2aW91c2x5IHJlcXVlc3RlZC4KKyAgICAvLyBXZSBtYW5hZ2UgdGhlbSBvbiB0aGUgTm9UaW1lb3V0TWFwLCBidXQgY29uY2VwdHVhbGx5IHRoZXkgY291bGQgYmUgc2NoZWR1bGVkCisgICAgLy8gb24gdGhlIE1vbml0b3JUaHJlYWQgYmVjYXVzZSB0aG9zZSB0aW1lIGhhbmRsZXMgd29uJ3QgZXhwaXJlIGluCisgICAgLy8gdGhlIGxpZmV0aW1lIG9mIHRoZSBkZXZpY2UuCisgICAgc3RhdGljIGlubGluZSBIYW5kbGUgZ2V0SW5kZXhlZEhhbmRsZShzaXplX3QgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s+OjptYXgoKSAtCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s+OjpkdXJhdGlvbihpbmRleCk7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga1JldGlyZWRRdWV1ZU1heCA9IDE2OworICAgIFJlcXVlc3RRdWV1ZSBtUmV0aXJlZFF1ZXVle2tSZXRpcmVkUXVldWVNYXh9OyAgLy8gbG9ja2VkIGludGVybmFsbHkKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtUaW1lb3V0UXVldWVNYXggPSAxNjsKKyAgICBSZXF1ZXN0UXVldWUgbVRpbWVvdXRRdWV1ZXtrVGltZW91dFF1ZXVlTWF4fTsgIC8vIGxvY2tlZCBpbnRlcm5hbGx5CisKKyAgICBOb1RpbWVvdXRNYXAgbU5vVGltZW91dE1hcDsgIC8vIGxvY2tlZCBpbnRlcm5hbGx5CisKKyAgICBNb25pdG9yVGhyZWFkIG1Nb25pdG9yVGhyZWFke21UaW1lb3V0UXVldWV9OyAgLy8gVGhpcyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgbGFzdCBiZWNhdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aHJlYWQgaXMgbGF1bmNoZWQgaW1tZWRpYXRlbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvY2tlZCBpbnRlcm5hbGx5LgorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvbWVtb3J5LmgKc2ltaWxhcml0eSBpbmRleCA2MCUKY29weSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwKY29weSB0byBtZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvbWVtb3J5LmgKaW5kZXggOWUwNGU4Mi4uY2MwMGJiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvbWVtb3J5LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMywxNCArMTMsMjEgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7CisjcHJhZ21hIG9uY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2Ugeworc3RydWN0IEZyZWVEZWxldGVyIHsKKyAgICB2b2lkIG9wZXJhdG9yKCkodm9pZCogcCkgeyBmcmVlKHApOyB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKIAogLyoqCi0gKiB7QGhpZGV9CisgKiBVc2VkIHRvIHdyYXAgcG9pbnRlcnMgYWxsb2NhdGVkIGJ5IGxlZ2FjeSBjb2RlIHVzaW5nIG1hbGxvYyAvIGNhbGxvYyAvIGV0Yy4KICAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gQXVkaW9FbmNhcHN1bGF0aW9uTW9kZSB7Ci0gICAgIE5PTkUgPSAwLAotICAgICBFTEVNRU5UQVJZX1NUUkVBTSA9IDEsCi0gICAgIEhBTkRMRSA9IDIsCi19Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3VzaW5nIHVuaXF1ZV9tYWxsb2NlZF9wdHIgPSBzdGQ6OnVuaXF1ZV9wdHI8VCwgRnJlZURlbGV0ZXI+OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvbWVtb3J5LXRlc3QuY3BwIGIvbWVkaWEvdXRpbHMvbWVtb3J5LXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MDliYzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9tZW1vcnktdGVzdC5jcHAKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvbWVtb3J5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB7CisKK1RFU1QoVW5pcXVlTWFsbG9jZWRQdHIsIFZvaWQpIHsKKyAgICB1bmlxdWVfbWFsbG9jZWRfcHRyPHZvaWQ+IHAoc3RkOjptYWxsb2MoMTApKTsKK30KKworVEVTVChVbmlxdWVNYWxsb2NlZFB0ciwgQ2hhcikgeworICAgIHVuaXF1ZV9tYWxsb2NlZF9wdHI8Y2hhcj4gcChyZWludGVycHJldF9jYXN0PGNoYXIqPihzdGQ6Om1hbGxvYygxMCkpKTsKK30KKworVEVTVChVbmlxdWVNYWxsb2NlZFB0ciwgTnVsbCkgeworICAgIHVuaXF1ZV9tYWxsb2NlZF9wdHI8Y2hhcj4gcChudWxscHRyKTsKK30KKworVEVTVChVbmlxdWVNYWxsb2NlZFB0ciwgRGVmYXVsdCkgeworICAgIHVuaXF1ZV9tYWxsb2NlZF9wdHI8Y2hhcj4gcDsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL3V0aWxzL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNjU5M2Q1Ni4uMTAyNDAxOCAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS91dGlscy90ZXN0cy9BbmRyb2lkLmJwCkBAIC03LDYgKzcsODIgQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCiB9CiAKK2NjX3Rlc3RfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnNoYXJlZHRlc3QiLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6eworICAgICAgIGFkZHJlc3M6IHRydWUsCisgICAgICAgY2ZpOiB0cnVlLAorICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCisgICAgICAgbWVtdGFnX2hlYXA6IHRydWUsCisgICAgfSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJzaGFyZWR0ZXN0LmNwcCIsCisgICAgXQorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAibGlicmFyeV90ZXN0cyIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgXSwKKworICAgIHNhbml0aXplOnsKKyAgICAgICBhZGRyZXNzOiB0cnVlLAorICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAorICAgICAgIG1lbXRhZ19oZWFwOiB0cnVlLAorICAgIH0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGRhdGFfbGliczogWworICAgICAgICAibGlic2hhcmVkdGVzdCIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImxpYnJhcnlfdGVzdHMuY3BwIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAibWVkaWFfcHJvY2Vzc190ZXN0cyIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1lZGlhX3Byb2Nlc3NfdGVzdHMuY3BwIiwKKyAgICBdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAibWVkaWFfc3luY2hyb25pemF0aW9uX3Rlc3RzIiwKIApAQCAtMjYsMyArMTAyLDkyIEBACiAgICAgICAgICJtZWRpYV9zeW5jaHJvbml6YXRpb25fdGVzdHMuY3BwIiwKICAgICBdLAogfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAibWVkaWFfdGhyZWFkc25hcHNob3RfdGVzdHMiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtZWRpYV90aHJlYWRzbmFwc2hvdF90ZXN0cy5jcHAiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJtZWRpYXV0aWxzX3Njb3BlZHN0YXRpc3RpY3NfdGVzdHMiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1lZGlhdXRpbHNfc2NvcGVkc3RhdGlzdGljc190ZXN0cy5jcHAiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJtZXRob2RzdGF0aXN0aWNzX3Rlc3RzIiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtZXRob2RzdGF0aXN0aWNzX3Rlc3RzLmNwcCIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRpbWVjaGVja190ZXN0cyIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgXSwKKworICAgIHNhbml0aXplOnsKKyAgICAgICBhZGRyZXNzOiB0cnVlLAorICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAorICAgICAgIG1lbXRhZ19oZWFwOiB0cnVlLAorICAgIH0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJ0aW1lY2hlY2tfdGVzdHMuY3BwIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvdGVzdHMvbGlicmFyeV90ZXN0cy5jcHAgYi9tZWRpYS91dGlscy90ZXN0cy9saWJyYXJ5X3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWM1MDBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvdGVzdHMvbGlicmFyeV90ZXN0cy5jcHAKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAibGlicmFyeV90ZXN0cyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhdXRpbHMvTGlicmFyeS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlsczsKKworbmFtZXNwYWNlIHsKKworc3RhdGljIGludDMyX3QgaGVyZSA9IDA7ICAvLyBhY2Nlc3NlZCBvbiBzYW1lIHRocmVhZC4KKworVEVTVChsaWJyYXJ5X3Rlc3RzLCBiYXNpYykgeworICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCkgKyAiL2xpYnNoYXJlZHRlc3Quc28iOworICAgIC8vIFRoZSBmbGFncyB0byBsb2FkTGlicmFyeSBzaG91bGQgbm90IGluY2x1ZGUgIFJUTERfR0xPQkFMIG9yIFJUTERfTk9ERUxFVEUKKyAgICAvLyB3aGljaCBwcmV2ZW50IHVubG9hZGluZy4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8dm9pZD4gbGlicmFyeSA9IGxvYWRMaWJyYXJ5KHBhdGguY19zdHIoKSwgUlRMRF9MQVpZKTsKKyAgICBBU1NFUlRfVFJVRShsaWJyYXJ5KTsKKyAgICBBU1NFUlRfRVEoMSwgbGlicmFyeS51c2VfY291bnQoKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8aW50MzJfdCo+IHB0ciA9IGdldE9iamVjdEZyb21MaWJyYXJ5PGludDMyX3QqPigiZ1B0ciIsIGxpYnJhcnkpOworICAgIEFTU0VSVF9UUlVFKHB0cik7CisgICAgQVNTRVJUX0VRKDIsIGxpYnJhcnkudXNlX2NvdW50KCkpOworCisgICAgQVNTRVJUX0VRKG51bGxwdHIsICpwdHIpOyAvLyBvcmlnaW5hbCBjb250ZW50cyBhcmUgbnVsbHB0ci4KKworICAgIC8vIFRoZXJlIGlzIGEgc3RhdGljIG9iamVjdCBkZXN0cnVjdG9yIGluIGxpYnNoYXJlZHRlc3Quc28gdGhhdCB3aWxsIHNldCB0aGUKKyAgICAvLyBjb250ZW50cyBvZiB0aGUgaW50ZWdlciBwb2ludGVyIChpZiBub24tbnVsbCkgdG8gMSB3aGVuIGNhbGxlZC4KKyAgICAvLyBUaGlzIGlzIHVzZWQgdG8gZGV0ZWN0IHRoYXQgdGhlIGxpYnJhcnkgaXMgdW5sb2FkZWQuCisgICAgKnB0ciA9ICZoZXJlOworCisgICAgcHRyLnJlc2V0KCk7ICAvLyBOb3RlOiB0aGlzIHNoYXJlZCBwb2ludGVyIHVzZXMgbGlicmFyeSdzIHJlZmNvdW50LgorICAgIEFTU0VSVF9FUSgxLCBsaWJyYXJ5LnVzZV9jb3VudCgpKTsgIC8vIFZlcmlmeSBsaWJyYXJ5J3MgcmVmY291bnQgZ29lcyBkb3duIGJ5IDEuCisgICAgQVNTRVJUX0VRKDAsIGhlcmUpOyAgLy8gdGhlIHNoYXJlZCBsaWJyYXJ5J3Mgb2JqZWN0IGRlc3RydWN0b3IgaGFzbid0IGJlZW4gY2FsbGVkLgorCisgICAgLy8gdXNlIHdlYWtfcHRyIHRvIGludmVzdGlnYXRlIHdoZXRoZXIgdGhlIGxpYnJhcnkgaXMgZ29uZS4KKyAgICBzdGQ6OndlYWtfcHRyPHZvaWQ+IHdsaWJyYXJ5ID0gbGlicmFyeTsKKyAgICBBU1NFUlRfRVEoMSwgd2xpYnJhcnkudXNlX2NvdW50KCkpOworICAgIGxpYnJhcnkucmVzZXQoKTsKKworICAgIC8vIHdlIHNob3VsZCBoYXZlIHJlbGVhc2VkIHRoZSBsYXN0IHJlZmVyZW5jZS4KKyAgICBBU1NFUlRfRVEoMCwgd2xpYnJhcnkudXNlX2NvdW50KCkpOworCisgICAgLy8gVGhlIGxpYnJhcnkgc2hvdWxkIHVubG9hZCBhbmQgdGhlIGdsb2JhbCBvYmplY3QgZGVzdHJveWVkLgorICAgIC8vIE5vdGUgb24gQW5kcm9pZCwgc3BlY2lmeWluZyBSVExEX0dMT0JBTCBvciBSVExEX05PREVMRVRFIGluIHRoZSBmbGFncworICAgIC8vIHdpbGwgcHJldmVudCB1bmxvYWRpbmcgbGlicmFyaWVzLgorICAgIEFTU0VSVF9FUSgxLCBoZXJlKTsKK30KKworVEVTVChsaWJyYXJ5X3Rlc3RzLCBzYWRfbGlicmFyeSkgeworICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCkKKyAgICAgICAgICAgICsgIi9zb21ldGhpbmdfcmFuZG9tX2xpYnJhcnlfdGhhdF9kb2Vzbid0X2V4aXQuc28iOworCisgICAgc3RkOjpzaGFyZWRfcHRyPHZvaWQ+IGxpYnJhcnkgPSBsb2FkTGlicmFyeShwYXRoLmNfc3RyKCksIFJUTERfTEFaWSk7CisgICAgLy8gV2Ugc2hvdWxkbid0IGNyYXNoIG9uIGFuIGludmFsaWQgbGlicmFyeSBwYXRoLCBqdXN0IHJldHVybiBhbiBlbXB0eSBzaGFyZWQgcG9pbnRlci4KKyAgICAvLyBDaGVjayB0aGUgbG9nY2F0IGZvciBhbnkgZXJyb3IgZGV0YWlscy4KKyAgICBBU1NFUlRfRkFMU0UobGlicmFyeSk7Cit9CisKK30gLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy90ZXN0cy9tZWRpYV9wcm9jZXNzX3Rlc3RzLmNwcCBiL21lZGlhL3V0aWxzL3Rlc3RzL21lZGlhX3Byb2Nlc3NfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZTNmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy90ZXN0cy9tZWRpYV9wcm9jZXNzX3Rlc3RzLmNwcApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1Byb2Nlc3MuaD4KKworI2RlZmluZSBMT0dfVEFHICJtZWRpYV9wcm9jZXNzX3Rlc3RzIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlsczsKKworVEVTVChtZWRpYV9wcm9jZXNzX3Rlc3RzLCBiYXNpYykgeworICBjb25zdCBzdGQ6OnN0cmluZyBzY2hlZFN0cmluZyA9IGdldFRocmVhZFNjaGVkQXNTdHJpbmcoZ2V0dGlkKCkpOworCisgICh2b2lkKXNjaGVkU3RyaW5nOworICAvLyBXZSBkb24ndCB0ZXN0IHNjaGVkU3RyaW5nLCBvbmx5IHRoYXQgd2UgaGF2ZW4ndCBjcmFzaGVkLgorICAvLyBBU1NFUlRfRkFMU0Uoc2NoZWRTdHJpbmcuZW1wdHkoKSk7CisKKyAgLy8gc2NoZWRTdHJpbmcgaXMgbm90IG5vcm1hdGl2ZS4gIFNvIHdlIGNvbmp1cmUgdXAgb3VyIG93biBzdHJpbmcKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmFrZVN0cmluZyA9ICJcCitBdWRpb091dF84RCAoMTA4MDAsICN0aHJlYWRzOiAzNilcblwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblwKK3NlLmV4ZWNfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgODEzMjA3Ny41OTgwMjZcblwKK3NlLnZydW50aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgIDc5ODY4OS44NzIwODdcblwKK3NlLnN1bV9leGVjX3J1bnRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgIDEzNjQ2Ni45NTc4MzhcblwKK3NlLm5yX21pZ3JhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAxMzI0ODdcblwKK3NlLnN0YXRpc3RpY3Muc3VtX3NsZWVwX3J1bnRpbWUgICAgICAgICAgICAgIDogICAgICAgNTYyOTc5NC41NjU5NDVcblwKK3NlLnN0YXRpc3RpY3Mud2FpdF9zdGFydCAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMC4wMDAwMDBcblwKK3NlLnN0YXRpc3RpY3Muc2xlZXBfc3RhcnQgICAgICAgICAgICAgICAgICAgIDogICAgICAgODE5NTcyNy41ODYzOTJcblwKK3NlLnN0YXRpc3RpY3MuYmxvY2tfc3RhcnQgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMC4wMDAwMDBcblwKK3NlLnN0YXRpc3RpY3Muc2xlZXBfbWF4ICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgMTk5NTY2NS44Njk4MDhcblwKK3NlLnN0YXRpc3RpY3MuYmxvY2tfbWF4ICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMC41OTE2NzVcblwKK3NlLnN0YXRpc3RpY3MuZXhlY19tYXggICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMi40Nzc1ODBcblwKK3NlLnN0YXRpc3RpY3Muc2xpY2VfbWF4ICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMC4wMDAwMDBcblwKK3NlLnN0YXRpc3RpY3Mud2FpdF9tYXggICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgOC42MDg2NDJcblwKK3NlLnN0YXRpc3RpY3Mud2FpdF9zdW0gICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgNDY4My4yNjY4MzVcblwKK3NlLnN0YXRpc3RpY3Mud2FpdF9jb3VudCAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAzMDA5NjRcblwKK3NlLnN0YXRpc3RpY3MuaW93YWl0X3N1bSAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMC4wMDAwMDBcblwKK3NlLnN0YXRpc3RpY3MuaW93YWl0X2NvdW50ICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDBcblwKK3NlLnN0YXRpc3RpY3MubnJfbWlncmF0aW9uc19jb2xkICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDBcblwKK3NlLnN0YXRpc3RpY3MubnJfZmFpbGVkX21pZ3JhdGlvbnNfYWZmaW5lICAgIDogICAgICAgICAgICAgICAgICAyOTdcblwKK3NlLnN0YXRpc3RpY3MubnJfZmFpbGVkX21pZ3JhdGlvbnNfcnVubmluZyAgIDogICAgICAgICAgICAgICAgIDE0MTJcblwKK3NlLnN0YXRpc3RpY3MubnJfZmFpbGVkX21pZ3JhdGlvbnNfaG90ICAgICAgIDogICAgICAgICAgICAgICAgICAgOTZcblwKK3NlLnN0YXRpc3RpY3MubnJfZm9yY2VkX21pZ3JhdGlvbnMgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgMjZcblwKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwcyAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAyODEyNjNcblwKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19zeW5jICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgODRcblwKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19taWdyYXRlICAgICAgICAgICAgIDogICAgICAgICAgICAgICAxMzIzMjJcblwKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19sb2NhbCAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgIDIxNjVcblwKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19yZW1vdGUgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAyNzkwOThcblwKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19hZmZpbmUgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDBcblwKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19hZmZpbmVfYXR0ZW1wdHMgICAgIDogICAgICAgICAgICAgICAgICAgIDBcblwKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19wYXNzaXZlICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDBcblwKK3NlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19pZGxlICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDBcblwKK2F2Z19hdG9tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMC40NTM0MzRcblwKK2F2Z19wZXJfY3B1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgMS4wMzAwNDBcblwKK25yX3N3aXRjaGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAzMDA5NjNcblwKK25yX3ZvbHVudGFyeV9zd2l0Y2hlcyAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAyODEyNTJcblwKK25yX2ludm9sdW50YXJ5X3N3aXRjaGVzICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgMTk3MTFcblwKK3NlLmxvYWQud2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgNzM0NzcxMjBcblwKK3NlLmF2Zy5sb2FkX3N1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgNThcblwKK3NlLmF2Zy5ydW5uYWJsZV9zdW0gICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgMjc2NDhcblwKK3NlLmF2Zy51dGlsX3N1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgMjE1MDRcblwKK3NlLmF2Zy5sb2FkX2F2ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgNDhcblwKK3NlLmF2Zy5ydW5uYWJsZV9hdmcgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDBcblwKK3NlLmF2Zy51dGlsX2F2ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDBcblwKK3NlLmF2Zy5sYXN0X3VwZGF0ZV90aW1lICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgIDgxMzIwNzU4MjQxMjhcblwKK3NlLmF2Zy51dGlsX2VzdC5ld21hICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDhcblwKK3NlLmF2Zy51dGlsX2VzdC5lbnF1ZXVlZCAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDFcblwKK3VjbGFtcC5taW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDBcblwKK3VjbGFtcC5tYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgIDEwMjRcblwKK2VmZmVjdGl2ZSB1Y2xhbXAubWluICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDBcblwKK2VmZmVjdGl2ZSB1Y2xhbXAubWF4ICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgIDEwMjRcblwKK3BvbGljeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgIDBcblwKK3ByaW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAxMDFcblwKK2Nsb2NrLWRlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAxNjMiOworCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBkb3VibGU+IG0gPSBwYXJzZVRocmVhZFNjaGVkU3RyaW5nKGZha2VTdHJpbmcpOworCisgIGF1dG8gaXQgPSBtLmZpbmQoImNsb2NrLWRlbHRhIik7CisgIEFTU0VSVF9ORShpdCwgbS5lbmQoKSk7CisgIEFTU0VSVF9FUShpdC0+c2Vjb25kLCAxNjMpOworCisgIGl0ID0gbS5maW5kKCJzZS5hdmcubG9hZF9hdmciKTsKKyAgQVNTRVJUX05FKGl0LCBtLmVuZCgpKTsKKyAgQVNTRVJUX0VRKGl0LT5zZWNvbmQsIDQ4KTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL3Rlc3RzL21lZGlhX3RocmVhZHNuYXBzaG90X3Rlc3RzLmNwcCBiL21lZGlhL3V0aWxzL3Rlc3RzL21lZGlhX3RocmVhZHNuYXBzaG90X3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E0NWUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvdGVzdHMvbWVkaWFfdGhyZWFkc25hcHNob3RfdGVzdHMuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWF1dGlscy9UaHJlYWRTbmFwc2hvdC5oPgorCisjZGVmaW5lIExPR19UQUcgIm1lZGlhX3RocmVhZHNuYXBzaG90X3Rlc3RzIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHM7CisKK1RFU1QobWVkaWFfdGhyZWFkc25hcHNob3RfdGVzdHMsIGJhc2ljKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworICBUaHJlYWRTbmFwc2hvdCB0aHJlYWRTbmFwc2hvdChnZXR0aWQoKSk7CisKKyAgdGhyZWFkU25hcHNob3Qub25CZWdpbigpOworCisgIHN0ZDo6c3RyaW5nIHNuYXBzaG90MSA9IHRocmVhZFNuYXBzaG90LnRvU3RyaW5nKCk7CisKKyAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDEwMG1zKTsKKworICB0aHJlYWRTbmFwc2hvdC5vbkVuZCgpOworCisgIHN0ZDo6c3RyaW5nIHNuYXBzaG90MiA9IHRocmVhZFNuYXBzaG90LnRvU3RyaW5nKCk7CisKKyAgLy8gRWl0aGVyIHdlIGNhbid0IGdldCBhIHNuYXBzaG90LCBvciB0aGV5IG11c3QgYmUgZGlmZmVyZW50IHdoZW4gdGFrZW4gd2hlbiB0aHJlYWQgaXMgcnVubmluZy4KKyAgaWYgKHNuYXBzaG90MS5lbXB0eSgpKSB7CisgICAgQVNTRVJUX1RSVUUoc25hcHNob3QyLmVtcHR5KCkpOworICB9IGVsc2UgeworICAgIEFTU0VSVF9GQUxTRShzbmFwc2hvdDIuZW1wdHkoKSk7CisgICAgQVNTRVJUX05FKHNuYXBzaG90MSwgc25hcHNob3QyKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvdGVzdHMvbWVkaWF1dGlsc19zY29wZWRzdGF0aXN0aWNzX3Rlc3RzLmNwcCBiL21lZGlhL3V0aWxzL3Rlc3RzL21lZGlhdXRpbHNfc2NvcGVkc3RhdGlzdGljc190ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3Y2U2MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL3Rlc3RzL21lZGlhdXRpbHNfc2NvcGVkc3RhdGlzdGljc190ZXN0cy5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAibWVkaWF1dGlsc19zY29wZWRzdGF0aXN0aWNzX3Rlc3RzIgorCisjaW5jbHVkZSA8bWVkaWF1dGlscy9TY29wZWRTdGF0aXN0aWNzLmg+CisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlsczsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworVEVTVChtZWRpYXV0aWxzX3Njb3BlZHN0YXRpc3RpY3NfdGVzdHMsIGJhc2ljKSB7CisgICAgYXV0byBtZXRob2RTdGF0aXN0aWNzID0gc3RkOjptYWtlX3NoYXJlZDxNZXRob2RTdGF0aXN0aWNzPHN0ZDo6c3RyaW5nPj4oKTsKKyAgICBzdGQ6OnN0cmluZyBNRVRIT0RfTkFNRXsiTXlNZXRob2QifTsKKworICAgIC8vIG5vIHN0YXRzIGJlZm9yZQorICAgIGF1dG8gZW1wdHkgPSBtZXRob2RTdGF0aXN0aWNzLT5nZXRTdGF0aXN0aWNzKE1FVEhPRF9OQU1FKTsKKyAgICBBU1NFUlRfRVEoMCwgZW1wdHkuZ2V0TigpKTsKKworICAgIC8vIGNyZWF0ZSBhIHNjb3BlZCBzdGF0aXN0aWNzIG9iamVjdC4KKyAgICB7CisgICAgICAgIFNjb3BlZFN0YXRpc3RpY3Mgc2NvcGVkU3RhdGlzdGljcyhNRVRIT0RfTkFNRSwgbWV0aG9kU3RhdGlzdGljcyk7CisKKyAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDEwMG1zKTsKKyAgICB9CisKKyAgICAvLyBjaGVjayB0aGF0IHNvbWUgc3RhdHMgd2VyZSBsb2dnZWQuCisgICAgYXV0byBzdGF0cyA9IG1ldGhvZFN0YXRpc3RpY3MtPmdldFN0YXRpc3RpY3MoTUVUSE9EX05BTUUpOworICAgIEFTU0VSVF9FUSgxLCBzdGF0cy5nZXROKCkpOworICAgIGF1dG8gbWVhbiA9IHN0YXRzLmdldE1lYW4oKTsKKworICAgIC8vIG1lYW4gc2hvdWxkIGJlIGFib3V0IDEwMG1zLCBidXQgdG8gYXZvaWQgZmFsc2UgZmFpbHVyZXMsCisgICAgLy8gd2UgY2hlY2sgNTBtcyA8IG1lYW4gPCAzMDBtcy4KKyAgICBBU1NFUlRfR1QobWVhbiwgNTAuKTsgICAvLyB0b29rIG1vcmUgdGhhbiA1MG1zLgorICAgIEFTU0VSVF9MVChtZWFuLCAzMDAuKTsgIC8vIHRvb2sgbGVzcyB0aGFuIDMwMG1zLgorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvdGVzdHMvbWV0aG9kc3RhdGlzdGljc190ZXN0cy5jcHAgYi9tZWRpYS91dGlscy90ZXN0cy9tZXRob2RzdGF0aXN0aWNzX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWM0YWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvdGVzdHMvbWV0aG9kc3RhdGlzdGljc190ZXN0cy5jcHAKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAibWV0aG9kc3RhdGlzdGljc190ZXN0cyIKKworI2luY2x1ZGUgPG1lZGlhdXRpbHMvTWV0aG9kU3RhdGlzdGljcy5oPgorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYXV0aWxzOwordXNpbmcgQ29kZVR5cGUgPSBzaXplX3Q7CisKK2NvbnN0ZXhwciBDb2RlVHlwZSBIRUxMT19DT0RFID0gMTA7Citjb25zdGV4cHIgY29uc3QgY2hhciAqIEhFTExPX05BTUUgPSAiaGVsbG8iOworY29uc3RleHByIGZsb2F0IEhFTExPX0VWRU5UU1tdID0geyAxLmYsIDMuZiB9OyAvLyBuZWVkcyBsb3NzbGVzcyBhdmVyYWdlCisKK2NvbnN0ZXhwciBDb2RlVHlwZSBXT1JMRF9DT0RFID0gMjE7Citjb25zdGV4cHIgY29uc3QgY2hhciAqIFdPUkxEX05BTUUgPSAid29ybGQiOworCitjb25zdGV4cHIgQ29kZVR5cGUgVU5LTk9XTl9DT0RFID0gMTIzNDU7CisKK1RFU1QobWV0aG9kc3RhdGlzdGljc190ZXN0cywgbWV0aG9kX25hbWVzKSB7CisgICAgY29uc3QgTWV0aG9kU3RhdGlzdGljczxDb2RlVHlwZT4gbWV0aG9kU3RhdGlzdGljc3sKKyAgICAgICAgICAgIHtIRUxMT19DT0RFLCBIRUxMT19OQU1FfSwKKyAgICAgICAgICAgIHtXT1JMRF9DT0RFLCBXT1JMRF9OQU1FfSwKKyAgICB9OworCisgICAgQVNTRVJUX0VRKHN0ZDo6c3RyaW5nKEhFTExPX05BTUUpLCBtZXRob2RTdGF0aXN0aWNzLmdldE1ldGhvZEZvckNvZGUoSEVMTE9fQ09ERSkpOworICAgIEFTU0VSVF9FUShzdGQ6OnN0cmluZyhXT1JMRF9OQU1FKSwgbWV0aG9kU3RhdGlzdGljcy5nZXRNZXRob2RGb3JDb2RlKFdPUkxEX0NPREUpKTsKKyAgICAvLyBhbiB1bmtub3duIGNvZGUgcmV0dXJucyBpdHNlbGYgYXMgYSBudW1iZXIuCisgICAgQVNTRVJUX0VRKHN0ZDo6dG9fc3RyaW5nKFVOS05PV05fQ09ERSksIG1ldGhvZFN0YXRpc3RpY3MuZ2V0TWV0aG9kRm9yQ29kZShVTktOT1dOX0NPREUpKTsKK30KKworVEVTVChtZXRob2RzdGF0aXN0aWNzX3Rlc3RzLCBldmVudHMpIHsKKyAgICBNZXRob2RTdGF0aXN0aWNzPENvZGVUeXBlPiBtZXRob2RTdGF0aXN0aWNzeworICAgICAgICAgICAge0hFTExPX0NPREUsIEhFTExPX05BTUV9LAorICAgICAgICAgICAge1dPUkxEX0NPREUsIFdPUkxEX05BTUV9LAorICAgIH07CisKKyAgICBzaXplX3QgbiA9IDA7CisgICAgZmxvYXQgc3VtID0gMC5mOworICAgIGZvciAoY29uc3QgYXV0byBldmVudCA6IEhFTExPX0VWRU5UUykgeworICAgICAgICBtZXRob2RTdGF0aXN0aWNzLmV2ZW50KEhFTExPX0NPREUsIGV2ZW50KTsKKyAgICAgICAgc3VtICs9IGV2ZW50OworICAgICAgICArK247CisgICAgfQorCisgICAgY29uc3QgYXV0byBoZWxsb1N0YXRzID0gbWV0aG9kU3RhdGlzdGljcy5nZXRTdGF0aXN0aWNzKEhFTExPX0NPREUpOworICAgIEFTU0VSVF9FUSgoc2lnbmVkKW4sIGhlbGxvU3RhdHMuZ2V0TigpKTsKKyAgICBBU1NFUlRfRVEoc3VtIC8gbiwgaGVsbG9TdGF0cy5nZXRNZWFuKCkpOworICAgIEFTU0VSVF9FUShuLCBtZXRob2RTdGF0aXN0aWNzLmdldE1ldGhvZENvdW50KEhFTExPX0NPREUpKTsKKworICAgIGNvbnN0IGF1dG8gdW5zZXRTdGF0cyA9IG1ldGhvZFN0YXRpc3RpY3MuZ2V0U3RhdGlzdGljcyhVTktOT1dOX0NPREUpOworICAgIEFTU0VSVF9FUSgwLCB1bnNldFN0YXRzLmdldE4oKSk7CisgICAgQVNTRVJUX0VRKDAuZiwgdW5zZXRTdGF0cy5nZXRNZWFuKCkpOworICAgIEFTU0VSVF9FUSgwVSwgbWV0aG9kU3RhdGlzdGljcy5nZXRNZXRob2RDb3VudChVTktOT1dOX0NPREUpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL3Rlc3RzL3NoYXJlZHRlc3QuY3BwIGIvbWVkaWEvdXRpbHMvdGVzdHMvc2hhcmVkdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg4ODg3NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL3Rlc3RzL3NoYXJlZHRlc3QuY3BwCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNkZWZpbmUgTE9HX1RBRyAic2hhcmVkdGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworLy8gVGVzdCBsaWJyYXJ5IHdoaWNoIGlzIGR5bmFtaWNseSBsb2FkZWQgYnkgbGlicmFyeV90ZXN0cy4KKworLy8gU3RhdGljIHZhcmlhYmxlIGNvbnN0cnVjdGlvbi4KKy8vIENhbGxzIEEgY29uc3RydWN0b3Igb24gbGlicmFyeSBsb2FkLCBBIGRlc3RydWN0b3Igb24gbGlicmFyeSB1bmxvYWQuCisKK2ludDMyX3QgKmdQdHIgPSBudWxscHRyOyAgLy8gdGhpcyBwb2ludGVyIGlzIGZpbGxlZCB3aXRoIHRoZSBsb2NhdGlvbiB0byBzZXQgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gfkEoKSBpcyBjYWxsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCB1c2UgYW55dGhpbmcgaW50ZXJuYWwgdG8gdGhpcyBmaWxlIGFzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHNlZ21lbnQgbWF5IG5vIGxvbmdlciBleGlzdCBhZnRlciB1bmxvYWRpbmcgdGhlIGxpYnJhcnkuCitzdHJ1Y3QgQSB7CisgICAgQSgpIHsKKyAgICAgICAgQUxPR0QoIiVzOiBnUHRyOiVwIiwgX19mdW5jX18sIGdQdHIpOworICAgIH0KKworICAgIH5BKCkgeworICAgICAgICBBTE9HRCgiJXM6IGdQdHI6JXAiLCBfX2Z1bmNfXywgZ1B0cik7CisgICAgICAgIGlmIChnUHRyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICpnUHRyID0gMTsKKyAgICAgICAgfQorICAgIH0KK30gZ0E7CisKKy8vICBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIG1ldGhvZHMgb2NjdXIgYmVmb3JlIGFueSBzdGF0aWMgdmFyaWFibGUgY29uc3RydWN0aW9uLgorLy8gTGlicmFyaWVzIHRoYXQgdXNlIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgc2hvdWxkIG5vdCByZWx5IG9uIGdsb2JhbCBjb25zdHJ1Y3RvcnMKKy8vIGJlZm9yZSBtZXRob2QgY2FsbCBiZWNhdXNlIHRoZXkgd2lsbCBub3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4KKy8vIFNlZSBoZWFwcHJvZmRfY2xpZW50X2FwaS4KKy8vIE5PVEU6IGlzIHRoaXMgcmlnaHQ/IFNob3VsZG4ndCBpdCBvY2N1ciBhZnRlciBjb25zdHJ1Y3Rpb24/CisgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKQordm9pZCBvbkNvbnN0cnVjdGlvbigpIHsKKyAgICBBTE9HRCgiJXM6IGluIHByb2dyZXNzIiwgX19mdW5jX18pOyAgLy8gZm9yIGxvZ2NhdCBhbmFseXNpcworfQorCisvLyBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKSkgbWV0aG9kcyBvY2N1ciBiZWZvcmUgYW55IHN0YXRpYyB2YXJpYWJsZSBkZXN0cnVjdGlvbi4KKyBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKSkKK3ZvaWQgb25EZXN0cnVjdGlvbigpIHsKKyAgICBBTE9HRCgiJXM6IGluIHByb2dyZXNzIiwgX19mdW5jX18pOyAgLy8gZm9yIGxvZ2NhdCBhbmFseXNpcworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvdGVzdHMvdGltZWNoZWNrX3Rlc3RzLmNwcCBiL21lZGlhL3V0aWxzL3Rlc3RzL3RpbWVjaGVja190ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViZjQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL3Rlc3RzL3RpbWVjaGVja190ZXN0cy5jcHAKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAidGltZWNoZWNrX3Rlc3RzIgorCisjaW5jbHVkZSA8bWVkaWF1dGlscy9UaW1lQ2hlY2suaD4KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlsczsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworbmFtZXNwYWNlIHsKKworVEVTVCh0aW1lY2hlY2tfdGVzdHMsIHN1Y2Nlc3MpIHsKKyAgICBib29sIHRpbWVvdXRSZWdpc3RlcmVkID0gZmFsc2U7CisgICAgZmxvYXQgZWxhcHNlZE1zUmVnaXN0ZXJlZCA9IDAuZjsKKyAgICBib29sIGV2ZW50ID0gZmFsc2U7CisKKyAgICB7CisgICAgICAgIFRpbWVDaGVjayB0aW1lQ2hlY2soInN1Y2Nlc3MiLAorICAgICAgICAgICAgICAgIFsmZXZlbnQsICZ0aW1lb3V0UmVnaXN0ZXJlZCwgJmVsYXBzZWRNc1JlZ2lzdGVyZWRdCisgICAgICAgICAgICAgICAgICAgICAgICAoYm9vbCB0aW1lb3V0LCBmbG9hdCBlbGFwc2VkTXMpIHsKKyAgICAgICAgICAgIHRpbWVvdXRSZWdpc3RlcmVkID0gdGltZW91dDsKKyAgICAgICAgICAgIGVsYXBzZWRNc1JlZ2lzdGVyZWQgPSBlbGFwc2VkTXM7CisgICAgICAgICAgICBldmVudCA9IHRydWU7CisgICAgICAgIH0sIDEwMDAgLyogbXNlYyAqLywgZmFsc2UgLyogY3Jhc2ggKi8pOworICAgIH0KKyAgICBBU1NFUlRfVFJVRShldmVudCk7CisgICAgQVNTRVJUX0ZBTFNFKHRpbWVvdXRSZWdpc3RlcmVkKTsKKyAgICBBU1NFUlRfR1QoZWxhcHNlZE1zUmVnaXN0ZXJlZCwgMC5mKTsKK30KKworVEVTVCh0aW1lY2hlY2tfdGVzdHMsIHRpbWVvdXQpIHsKKyAgICBib29sIHRpbWVvdXRSZWdpc3RlcmVkID0gZmFsc2U7CisgICAgZmxvYXQgZWxhcHNlZE1zUmVnaXN0ZXJlZCA9IDAuZjsKKyAgICBzdGQ6OmF0b21pY19ib29sIGV2ZW50ID0gZmFsc2U7ICAvLyBzZXEtY3N0IGltcGxpZXMgYWNxdWlyZS1yZWxlYXNlCisKKyAgICB7CisgICAgICAgIFRpbWVDaGVjayB0aW1lQ2hlY2soInRpbWVvdXQiLAorICAgICAgICAgICAgICAgIFsmZXZlbnQsICZ0aW1lb3V0UmVnaXN0ZXJlZCwgJmVsYXBzZWRNc1JlZ2lzdGVyZWRdCisgICAgICAgICAgICAgICAgICAgICAgICAoYm9vbCB0aW1lb3V0LCBmbG9hdCBlbGFwc2VkTXMpIHsKKyAgICAgICAgICAgIHRpbWVvdXRSZWdpc3RlcmVkID0gdGltZW91dDsKKyAgICAgICAgICAgIGVsYXBzZWRNc1JlZ2lzdGVyZWQgPSBlbGFwc2VkTXM7CisgICAgICAgICAgICBldmVudCA9IHRydWU7IC8vIHN0b3JlLXJlbGVhc2UsIG11c3QgYmUgbGFzdC4KKyAgICAgICAgfSwgMSAvKiBtc2VjICovLCBmYWxzZSAvKiBjcmFzaCAqLyk7CisgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxMDBtcyk7CisgICAgfQorICAgIEFTU0VSVF9UUlVFKGV2ZW50KTsgLy8gbG9hZC1hY3F1aXJlLCBtdXN0IGJlIGZpcnN0LgorICAgIEFTU0VSVF9UUlVFKHRpbWVvdXRSZWdpc3RlcmVkKTsgLy8gb25seSBjYWxsZWQgb25jZSBvbiBmYWlsdXJlLCBub3Qgb24gZGVhbGxvYy4KKyAgICBBU1NFUlRfR1QoZWxhcHNlZE1zUmVnaXN0ZXJlZCwgMC5mKTsKK30KKworLy8gTm90ZTogV2UgZG8gbm90IHRlc3QgVGltZUNoZWNrIGNyYXNoIGJlY2F1c2UgVGltZUNoZWNrIGlzIG11bHRpdGhyZWFkZWQgYW5kIHRoZQorLy8gRVhQRUNUX0VYSVQoKSBzaWduYWwgY2F0Y2hpbmcgaXMgaW1wZXJmZWN0IGR1ZSB0byB0aGUgZ3Rlc3QgZm9yay4KKworfSAvLyBuYW1lc3BhY2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9BbmRyb2lkLm1rIGIvc2VydmljZXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODZhMjI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvQW5kcm9pZC5tawpAQCAtMCwwICsxIEBACiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5LCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9PV05FUlMgYi9zZXJ2aWNlcy9PV05FUlMKaW5kZXggZjBiNWUyZi4uMTdlNjA1ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvT1dORVJTCisrKyBiL3NlcnZpY2VzL09XTkVSUwpAQCAtMSw5ICsxLDYgQEAKLWNoekBnb29nbGUuY29tCiBlbGF1cmVudEBnb29nbGUuY29tCiBlc3NpY2tAZ29vZ2xlLmNvbQogZXRhbHZhbGFAZ29vZ2xlLmNvbQotZ2thc3RlbkBnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCi1tYXJjb25lQGdvb2dsZS5jb20KIG5jaGFsa29AZ29vZ2xlLmNvbQogcXV4aWFuZ2ZhbmdAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icAppbmRleCBiOTFmMzAyLi43NjNjMDcwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icApAQCAtNDEsNiArNDEsNyBAQAogICAgICAgICAiRmFzdFRocmVhZFN0YXRlLmNwcCIsCiAgICAgICAgICJOQkFJT19UZWUuY3BwIiwKICAgICAgICAgIlBhdGNoUGFuZWwuY3BwIiwKKyAgICAgICAgIlByb3BlcnR5VXRpbHMuY3BwIiwKICAgICAgICAgIlNwZGlmU3RyZWFtT3V0LmNwcCIsCiAgICAgICAgICJTdGF0ZVF1ZXVlLmNwcCIsCiAgICAgICAgICJUaHJlYWRzLmNwcCIsCkBAIC01NCw2ICs1NSw3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAogICAgICAgICAiYXVkaW9mbGluZ2VyLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKICAgICAgICAgImF2LXR5cGVzLWFpZGwtY3BwIiwKQEAgLTgxLDYgKzgzLDcgQEAKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJzaG1lbWNvbXBhdCIsCiAgICAgICAgICJsaWJ2aWJyYXRvciIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCkBAIC05MCw2ICs5Myw3IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW9faGVhZGVycyIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICAgICAgImxpYmF1ZGlvaGFsX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDY1YTE2M2YuLmY3NTc2ZjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAjaW5jbHVkZSA8dGhyZWFkPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvb3MvSUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CkBAIC01Nyw2ICs1OCw3IEBACiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKICNpbmNsdWRlICJOQkFJT19UZWUuaCIKKyNpbmNsdWRlICJQcm9wZXJ0eVV0aWxzLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogCkBAIC02NCw2ICs2Niw3IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X25zLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X2FlYy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9oYXB0aWNnZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3Rfc3BhdGlhbGl6ZXIuaD4KIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KIApAQCAtNzYsNiArNzksNyBAQAogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGVSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvTWVtb3J5TGVha1RyYWNrVXRpbC5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvTWV0aG9kU3RhdGlzdGljcy5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZUNoZWNrLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CkBAIC0xMDIsNyArMTA2LDEyIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorI2RlZmluZSBNQVhfQUFVRElPX1BST1BFUlRZX0RFVklDRV9IQUxfVkVSU0lPTiA3LjEKKwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CiB1c2luZyBtZWRpYTo6SUVmZmVjdENsaWVudDsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lJbmZvOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeVR5cGU7CiB1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCiBzdGF0aWMgY29uc3QgY2hhciBrRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvRmxpbmdlciBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKQEAgLTE1MCw2ICsxNTksOTIgQEAKICAgICByZXR1cm4gc0V4dGVybmFsVmlicmF0b3JTZXJ2aWNlOwogfQogCisvLyBDcmVhdGVzIGFzc29jaWF0aW9uIGJldHdlZW4gQmluZGVyIGNvZGUgdG8gbmFtZSBmb3IgSUF1ZGlvRmxpbmdlci4KKyNkZWZpbmUgSUFVRElPRkxJTkdFUl9CSU5ERVJfTUVUSE9EX01BQ1JPX0xJU1QgXAorQklOREVSX01FVEhPRF9FTlRSWShjcmVhdGVUcmFjaykgXAorQklOREVSX01FVEhPRF9FTlRSWShjcmVhdGVSZWNvcmQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2FtcGxlUmF0ZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShmb3JtYXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZnJhbWVDb3VudCkgXAorQklOREVSX01FVEhPRF9FTlRSWShsYXRlbmN5KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldE1hc3RlclZvbHVtZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRNYXN0ZXJNdXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKG1hc3RlclZvbHVtZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShtYXN0ZXJNdXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFN0cmVhbVZvbHVtZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRTdHJlYW1NdXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHN0cmVhbVZvbHVtZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzdHJlYW1NdXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldE1vZGUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0TWljTXV0ZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRNaWNNdXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFJlY29yZFNpbGVuY2VkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFBhcmFtZXRlcnMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0UGFyYW1ldGVycykgXAorQklOREVSX01FVEhPRF9FTlRSWShyZWdpc3RlckNsaWVudCkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRJbnB1dEJ1ZmZlclNpemUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkob3Blbk91dHB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShvcGVuRHVwbGljYXRlT3V0cHV0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGNsb3NlT3V0cHV0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHN1c3BlbmRPdXRwdXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVzdG9yZU91dHB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShvcGVuSW5wdXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoY2xvc2VJbnB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShpbnZhbGlkYXRlU3RyZWFtKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFZvaWNlVm9sdW1lKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldFJlbmRlclBvc2l0aW9uKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldElucHV0RnJhbWVzTG9zdCkgXAorQklOREVSX01FVEhPRF9FTlRSWShuZXdBdWRpb1VuaXF1ZUlkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGFjcXVpcmVBdWRpb1Nlc3Npb25JZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShyZWxlYXNlQXVkaW9TZXNzaW9uSWQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocXVlcnlOdW1iZXJFZmZlY3RzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHF1ZXJ5RWZmZWN0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldEVmZmVjdERlc2NyaXB0b3IpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoY3JlYXRlRWZmZWN0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKG1vdmVFZmZlY3RzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGxvYWRId01vZHVsZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldExvd1JhbURldmljZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRBdWRpb1BvcnQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoY3JlYXRlQXVkaW9QYXRjaCkgXAorQklOREVSX01FVEhPRF9FTlRSWShyZWxlYXNlQXVkaW9QYXRjaCkgXAorQklOREVSX01FVEhPRF9FTlRSWShsaXN0QXVkaW9QYXRjaGVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldEF1ZGlvUG9ydENvbmZpZykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24pIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc3lzdGVtUmVhZHkpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoYXVkaW9Qb2xpY3lSZWFkeSkgXAorQklOREVSX01FVEhPRF9FTlRSWShmcmFtZUNvdW50SEFMKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldE1pY3JvcGhvbmVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldE1hc3RlckJhbGFuY2UpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0TWFzdGVyQmFsYW5jZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRFZmZlY3RTdXNwZW5kZWQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0QXVkaW9IYWxQaWRzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFZpYnJhdG9ySW5mb3MpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkodXBkYXRlU2Vjb25kYXJ5T3V0cHV0cykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRNbWFwUG9saWN5SW5mb3MpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldERldmljZUNvbm5lY3RlZFN0YXRlKSBcCisKKy8vIHNpbmdsZXRvbiBmb3IgQmluZGVyIE1ldGhvZCBTdGF0aXN0aWNzIGZvciBJQXVkaW9GbGluZ2VyCitzdGF0aWMgYXV0byYgZ2V0SUF1ZGlvRmxpbmdlclN0YXRpc3RpY3MoKSB7CisgICAgdXNpbmcgQ29kZSA9IGFuZHJvaWQ6OkF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OkRlbGVnYXRlOjpUcmFuc2FjdGlvbkNvZGU7CisKKyNwcmFnbWEgcHVzaF9tYWNybygiQklOREVSX01FVEhPRF9FTlRSWSIpCisjdW5kZWYgQklOREVSX01FVEhPRF9FTlRSWQorI2RlZmluZSBCSU5ERVJfTUVUSE9EX0VOVFJZKEVOVFJZKSBcCisgICAgeyhDb2RlKW1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OXyMjRU5UUlksICNFTlRSWX0sCisKKyAgICBzdGF0aWMgbWVkaWF1dGlsczo6TWV0aG9kU3RhdGlzdGljczxDb2RlPiBtZXRob2RTdGF0aXN0aWNzeworICAgICAgICBJQVVESU9GTElOR0VSX0JJTkRFUl9NRVRIT0RfTUFDUk9fTElTVAorICAgICAgICBNRVRIT0RfU1RBVElTVElDU19CSU5ERVJfQ09ERV9OQU1FUyhDb2RlKQorICAgIH07CisjcHJhZ21hIHBvcF9tYWNybygiQklOREVSX01FVEhPRF9FTlRSWSIpCisKKyAgICByZXR1cm4gbWV0aG9kU3RhdGlzdGljczsKK30KKwogY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxDYWxsYmFja0ltcGwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxDYWxsYmFjayB7CiAgIHB1YmxpYzoKICAgICB2b2lkIG9uTmV3RGV2aWNlc0F2YWlsYWJsZSgpIG92ZXJyaWRlIHsKQEAgLTI2OCw3ICszNjMsNyBAQAogICAgIG1NZWRpYUxvZ05vdGlmaWVyLT5ydW4oIk1lZGlhTG9nTm90aWZpZXIiKTsKICAgICBzdGQ6OnZlY3RvcjxwaWRfdD4gaGFsUGlkczsKICAgICBtRGV2aWNlc0ZhY3RvcnlIYWwtPmdldEhhbFBpZHMoJmhhbFBpZHMpOwotICAgIFRpbWVDaGVjazo6c2V0QXVkaW9IYWxQaWRzKGhhbFBpZHMpOworICAgIG1lZGlhdXRpbHM6OlRpbWVDaGVjazo6c2V0QXVkaW9IYWxQaWRzKGhhbFBpZHMpOwogCiAgICAgLy8gTm90aWZ5IHRoYXQgd2UgaGF2ZSBzdGFydGVkIChhbHNvIGNhbGxlZCB3aGVuIGF1ZGlvc2VydmVyIHNlcnZpY2UgcmVzdGFydHMpCiAgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKG1NZXRyaWNzSWQpCkBAIC0zMDAsMTAgKzM5NSwxNSBAQAogCiAgICAgbURldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2sgPSBuZXcgRGV2aWNlc0ZhY3RvcnlIYWxDYWxsYmFja0ltcGw7CiAgICAgbURldmljZXNGYWN0b3J5SGFsLT5zZXRDYWxsYmFja09uY2UobURldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2spOworCisgICAgaWYgKG1EZXZpY2VzRmFjdG9yeUhhbC0+Z2V0SGFsVmVyc2lvbigpIDw9IE1BWF9BQVVESU9fUFJPUEVSVFlfREVWSUNFX0hBTF9WRVJTSU9OKSB7CisgICAgICAgIG1BQXVkaW9CdXJzdHNQZXJCdWZmZXIgPSBnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnRGcm9tU3lzdGVtUHJvcGVydHkoKTsKKyAgICAgICAgbUFBdWRpb0h3QnVyc3RNaW5NaWNyb3MgPSBnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlY0Zyb21TeXN0ZW1Qcm9wZXJ0eSgpOworICAgIH0KIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRBdWRpb0hhbFBpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8cGlkX3Q+JiBwaWRzKSB7Ci0gIFRpbWVDaGVjazo6c2V0QXVkaW9IYWxQaWRzKHBpZHMpOworICBtZWRpYXV0aWxzOjpUaW1lQ2hlY2s6OnNldEF1ZGlvSGFsUGlkcyhwaWRzKTsKICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC0zMzUsMTIgKzQzNSw2OCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotLy8gZ2V0RGVmYXVsdFZpYnJhdG9ySW5mb19sIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyIGxvY2sgaGVsZC4KLWNvbnN0IG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbyogQXVkaW9GbGluZ2VyOjpnZXREZWZhdWx0VmlicmF0b3JJbmZvX2woKSB7Ci0gICAgaWYgKG1BdWRpb1ZpYnJhdG9ySW5mb3MuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gbnVsbHB0cjsKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0TW1hcFBvbGljeUluZm9zKAorICAgICAgICAgICAgQXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLCBzdGQ6OnZlY3RvcjxBdWRpb01NYXBQb2xpY3lJbmZvPiAqcG9saWN5SW5mb3MpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChjb25zdCBhdXRvIGl0ID0gbVBvbGljeUluZm9zLmZpbmQocG9saWN5VHlwZSk7IGl0ICE9IG1Qb2xpY3lJbmZvcy5lbmQoKSkgeworICAgICAgICAqcG9saWN5SW5mb3MgPSBpdC0+c2Vjb25kOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQotICAgIHJldHVybiAmbUF1ZGlvVmlicmF0b3JJbmZvcy5mcm9udCgpOworICAgIGlmIChtRGV2aWNlc0ZhY3RvcnlIYWwtPmdldEhhbFZlcnNpb24oKSA+IE1BWF9BQVVESU9fUFJPUEVSVFlfREVWSUNFX0hBTF9WRVJTSU9OKSB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYXJkd2FyZUxvY2spOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqZGV2ID0gbUF1ZGlvSHdEZXZzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb01NYXBQb2xpY3lJbmZvPiBpbmZvczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRldi0+Z2V0TW1hcFBvbGljeUluZm9zKHBvbGljeVR5cGUsICZpbmZvcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBtbWFwIHBvbGljeSBpbmZvIG9mICVkLCBlcnJvciAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvSHdEZXZzLmtleUF0KGkpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9saWN5SW5mb3MtPmluc2VydChwb2xpY3lJbmZvcy0+ZW5kKCksIGluZm9zLmJlZ2luKCksIGluZm9zLmVuZCgpKTsKKyAgICAgICAgfQorICAgICAgICBtUG9saWN5SW5mb3NbcG9saWN5VHlwZV0gPSAqcG9saWN5SW5mb3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2V0TW1hcFBvbGljeUluZm9zRnJvbVN5c3RlbVByb3BlcnR5KHBvbGljeVR5cGUsIHBvbGljeUluZm9zKTsKKyAgICAgICAgbVBvbGljeUluZm9zW3BvbGljeVR5cGVdID0gKnBvbGljeUluZm9zOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2ludDMyX3QgQXVkaW9GbGluZ2VyOjpnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUFBdWRpb0J1cnN0c1BlckJ1ZmZlcjsKK30KKworaW50MzJfdCBBdWRpb0ZsaW5nZXI6OmdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BQXVkaW9Id0J1cnN0TWluTWljcm9zOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldERldmljZUNvbm5lY3RlZFN0YXRlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0LCBib29sIGNvbm5lY3RlZCkgeworICAgIHN0YXR1c190IGZpbmFsX3Jlc3VsdCA9IE5PX0lOSVQ7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKKyAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19TRVRfQ09OTkVDVEVEX1NUQVRFOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvSHdEZXZzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gZGV2ID0gbUF1ZGlvSHdEZXZzLnZhbHVlQXQoaSktPmh3RGV2aWNlKCk7CisgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGRldi0+c2V0Q29ubmVjdGVkU3RhdGUocG9ydCwgY29ubmVjdGVkKTsKKyAgICAgICAgLy8gU2FtZSBsb2dpYyBhcyB3aXRoIHNldFBhcmFtZXRlcjogaXQncyBhIHN1Y2Nlc3MgaWYgYXQgbGVhc3Qgb25lCisgICAgICAgIC8vIEhBTCBtb2R1bGUgYWNjZXB0cyB0aGUgdXBkYXRlLgorICAgICAgICBpZiAoZmluYWxfcmVzdWx0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBmaW5hbF9yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKKyAgICByZXR1cm4gZmluYWxfcmVzdWx0OworfQorCisvLyBnZXREZWZhdWx0VmlicmF0b3JJbmZvX2wgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXIgbG9jayBoZWxkLgorc3RkOjpvcHRpb25hbDxtZWRpYTo6QXVkaW9WaWJyYXRvckluZm8+IEF1ZGlvRmxpbmdlcjo6Z2V0RGVmYXVsdFZpYnJhdG9ySW5mb19sKCkgeworICAgIGlmIChtQXVkaW9WaWJyYXRvckluZm9zLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvVmlicmF0b3JJbmZvcy5mcm9udCgpOwogfQogCiBBdWRpb0ZsaW5nZXI6On5BdWRpb0ZsaW5nZXIoKQpAQCAtNDI5LDE0ICs1ODUsMTQgQEAKICAgICAgICAgZnVsbENvbmZpZy5jaGFubmVsX21hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzazsKICAgICAgICAgZnVsbENvbmZpZy5mb3JtYXQgPSBjb25maWctPmZvcm1hdDsKICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dHM7Ci0KKyAgICAgICAgYm9vbCBpc1NwYXRpYWxpemVkOwogICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigmbG9jYWxBdHRyLCAmaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbVR5cGUsIGNsaWVudC5hdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQsICZwb3J0SWQsICZzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQsICZwb3J0SWQsICZzZWNvbmRhcnlPdXRwdXRzLCAmaXNTcGF0aWFsaXplZCk7CiAgICAgICAgIEFMT0dXX0lGKCFzZWNvbmRhcnlPdXRwdXRzLmVtcHR5KCksCiAgICAgICAgICAgICAgICAgICIlcyBkb2VzIG5vdCBzdXBwb3J0IHNlY29uZGFyeSBvdXRwdXRzLCBpZ25vcmluZyB0aGVtIiwgX19mdW5jX18pOwogICAgIH0gZWxzZSB7CkBAIC01NjYsMTAgKzcyMiwxMiBAQAogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgcmVzdWx0LmFwcGVuZCgiQ2xpZW50czpcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIiAgIHBpZCAgICBoZWFwX3NpemVcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNsaWVudHMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBtQ2xpZW50cy52YWx1ZUF0KGkpLnByb21vdGUoKTsKICAgICAgICAgaWYgKGNsaWVudCAhPSAwKSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHBpZDogJWRcbiIsIGNsaWVudC0+cGlkKCkpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTZkICUxMnp1XG4iLCBjbGllbnQtPnBpZCgpLAorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmhlYXAoKS0+Z2V0TWVtb3J5SGVhcCgpLT5nZXRTaXplKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC02OTUsNyArODUzLDcgQEAKICAgICAgICAgLy8gZHVtcCBhbGwgaGFyZHdhcmUgZGV2cwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBkZXYgPSBtQXVkaW9Id0RldnMudmFsdWVBdChpKS0+aHdEZXZpY2UoKTsKLSAgICAgICAgICAgIGRldi0+ZHVtcChmZCk7CisgICAgICAgICAgICBkZXYtPmR1bXAoZmQsIGFyZ3MpOwogICAgICAgICB9CiAKICAgICAgICAgbVBhdGNoUGFuZWwuZHVtcChmZCk7CkBAIC03NTcsNiArOTE1LDM2IEBACiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzID0gR2V0VW5yZWFjaGFibGVNZW1vcnlTdHJpbmcodHJ1ZSAvKiBjb250ZW50cyAqLywgMTAwIC8qIGxpbWl0ICovKTsKICAgICAgICAgICAgIHdyaXRlKGZkLCBzLmNfc3RyKCksIHMuc2l6ZSgpKTsKICAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0aW1lQ2hlY2tTdGF0cyA9IGdldElBdWRpb0ZsaW5nZXJTdGF0aXN0aWNzKCkuZHVtcCgpOworICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuSUF1ZGlvRmxpbmdlciBiaW5kZXIgY2FsbCBwcm9maWxlOlxuIik7CisgICAgICAgICAgICB3cml0ZShmZCwgdGltZUNoZWNrU3RhdHMuY19zdHIoKSwgdGltZUNoZWNrU3RhdHMuc2l6ZSgpKTsKKworICAgICAgICAgICAgZXh0ZXJuIG1lZGlhdXRpbHM6Ok1ldGhvZFN0YXRpc3RpY3M8aW50PiYgZ2V0SUVmZmVjdFN0YXRpc3RpY3MoKTsKKyAgICAgICAgICAgIHRpbWVDaGVja1N0YXRzID0gZ2V0SUVmZmVjdFN0YXRpc3RpY3MoKS5kdW1wKCk7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG5JRWZmZWN0IGJpbmRlciBjYWxsIHByb2ZpbGU6XG4iKTsKKyAgICAgICAgICAgIHdyaXRlKGZkLCB0aW1lQ2hlY2tTdGF0cy5jX3N0cigpLCB0aW1lQ2hlY2tTdGF0cy5zaXplKCkpOworCisgICAgICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGZldGNoIEhJREwgc3RhdGlzdGljcy4KKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+IGhpZGxDbGFzc05hbWVzID0KKyAgICAgICAgICAgICAgICAgICAgbWVkaWF1dGlsczo6Z2V0U3RhdGlzdGljc0NsYXNzZXNGb3JNb2R1bGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUSE9EX1NUQVRJU1RJQ1NfTU9EVUxFX05BTUVfQVVESU9fSElETCk7CisgICAgICAgICAgICBpZiAoaGlkbENsYXNzTmFtZXMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsYXNzTmFtZSA6ICpoaWRsQ2xhc3NOYW1lcykgeworICAgICAgICAgICAgICAgICAgICBhdXRvIHN0YXRzID0gbWVkaWF1dGlsczo6Z2V0U3RhdGlzdGljc0ZvckNsYXNzKGNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGltZUNoZWNrU3RhdHMgPSBzdGF0cy0+ZHVtcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuJXMgYmluZGVyIGNhbGwgcHJvZmlsZTpcbiIsIGNsYXNzTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlKGZkLCB0aW1lQ2hlY2tTdGF0cy5jX3N0cigpLCB0aW1lQ2hlY2tTdGF0cy5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aW1lQ2hlY2tTdGF0cyA9IG1lZGlhdXRpbHM6OlRpbWVDaGVjazo6dG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICJcblRpbWVDaGVjazpcbiIpOworICAgICAgICAgICAgd3JpdGUoZmQsIHRpbWVDaGVja1N0YXRzLmNfc3RyKCksIHRpbWVDaGVja1N0YXRzLnNpemUoKSk7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG4iKTsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC04NDYsNiArMTAzNCw3IEBACiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc2Vjb25kYXJ5T3V0cHV0czsKKyAgICBib29sIGlzU3BhdGlhbGl6ZWQgPSBmYWxzZTs7CiAKICAgICAvLyBUT0RPIGIvMTgyMzkyNTUzOiByZWZhY3RvciBvciBtYWtlIGNsZWFyZXIKICAgICBwaWRfdCBjbGllbnRQaWQgPQpAQCAtODg5LDcgKzEwNzgsOCBAQAogICAgIG91dHB1dC5zZWxlY3RlZERldmljZUlkID0gaW5wdXQuc2VsZWN0ZWREZXZpY2VJZDsKICAgICBsU3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJmxvY2FsQXR0ciwgJm91dHB1dC5vdXRwdXRJZCwgc2Vzc2lvbklkLCAmc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqQXR0cmlidXRpb25Tb3VyY2UsICZpbnB1dC5jb25maWcsIGlucHV0LmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQsICZzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC5zZWxlY3RlZERldmljZUlkLCAmcG9ydElkLCAmc2Vjb25kYXJ5T3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzU3BhdGlhbGl6ZWQpOwogCiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgfHwgb3V0cHV0Lm91dHB1dElkID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjaygpIGdldE91dHB1dEZvckF0dHIoKSByZXR1cm4gZXJyb3IgJWQgb3IgaW52YWxpZCBvdXRwdXQgaGFuZGxlIiwgbFN0YXR1cyk7CkBAIC05NTUsNyArMTE0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Lm5vdGlmaWNhdGlvbnNQZXJCdWZmZXIsIGlucHV0LnNwZWVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zaGFyZWRCdWZmZXIsIHNlc3Npb25JZCwgJm91dHB1dC5mbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwgYWRqQXR0cmlidXRpb25Tb3VyY2UsIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbFN0YXR1cywgcG9ydElkLCBpbnB1dC5hdWRpb1RyYWNrQ2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbFN0YXR1cywgcG9ydElkLCBpbnB1dC5hdWRpb1RyYWNrQ2FsbGJhY2ssIGlzU3BhdGlhbGl6ZWQpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChsU3RhdHVzID09IE5PX0VSUk9SKSAmJiAodHJhY2sgPT0gMCkpOwogICAgICAgICAvLyB3ZSBkb24ndCBhYm9ydCB5ZXQgaWYgbFN0YXR1cyAhPSBOT19FUlJPUjsgdGhlcmUgaXMgc3RpbGwgd29yayB0byBiZSBkb25lIHJlZ2FyZGxlc3MKIApAQCAtOTk3LDggKzExODcsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIHNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sKHRocmVhZCwgc2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKChvdXRwdXQuZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSA9PSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSB7CisgICAgICAgICAgICBzZXRBdWRpb0h3U3luY0ZvclNlc3Npb25fbCh0aHJlYWQsIHNlc3Npb25JZCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtMTg3MywxMyArMjA2NCwxMyBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsCit2b2lkIEF1ZGlvRmxpbmdlcjo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4mIGlvRGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkKSB7CisgICAgbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudCBldmVudEFpZGwgPSBWQUxVRV9PUl9GQVRBTCgKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2NvbmZpZ19ldmVudF90X0F1ZGlvSW9Db25maWdFdmVudChldmVudCkpOwogICAgIG1lZGlhOjpBdWRpb0lvRGVzY3JpcHRvciBkZXNjQWlkbCA9IFZBTFVFX09SX0ZBVEFMKAogICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9Jb0Rlc2NyaXB0b3JfQXVkaW9Jb0Rlc2NyaXB0b3IoaW9EZXNjKSk7Ci0gICAgbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudCBldmVudEFpZGwgPSBWQUxVRV9PUl9GQVRBTCgKLSAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2NvbmZpZ19ldmVudF9BdWRpb0lvQ29uZmlnRXZlbnQoZXZlbnQpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2xpZW50TG9jayk7CiAgICAgc2l6ZV90IHNpemUgPSBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7CkBAIC0yMTQyLDYgKzIzMzMsMjAgQEAKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQogCisgICAgICAgIGlmIChyZWNvcmRUcmFjay0+aXNGYXN0VHJhY2soKSkgeworICAgICAgICAgICAgb3V0cHV0LnNlcnZlckNvbmZpZyA9IHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkLT5zYW1wbGVSYXRlKCksCisgICAgICAgICAgICAgICAgICAgIHRocmVhZC0+Y2hhbm5lbE1hc2soKSwKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkLT5mb3JtYXQoKQorICAgICAgICAgICAgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dHB1dC5zZXJ2ZXJDb25maWcgPSB7CisgICAgICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5zYW1wbGVSYXRlKCksCisgICAgICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jaGFubmVsTWFzaygpLAorICAgICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Zm9ybWF0KCkKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKwogICAgICAgICAvLyBDaGVjayBpZiBvbmUgZWZmZWN0IGNoYWluIHdhcyBhd2FpdGluZyBmb3IgYW4gQXVkaW9SZWNvcmQgdG8gYmUgY3JlYXRlZCBvbiB0aGlzCiAgICAgICAgIC8vIHNlc3Npb24gYW5kIG1vdmUgaXQgdG8gdGhpcyB0aHJlYWQuCiAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldE9ycGhhbkVmZmVjdENoYWluX2woc2Vzc2lvbklkKTsKQEAgLTIyNzIsNiArMjQ3NywxOCBAQAogICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwogICAgIH0KIAorICAgIGlmIChtRGV2aWNlc0ZhY3RvcnlIYWwtPmdldEhhbFZlcnNpb24oKSA+IE1BWF9BQVVESU9fUFJPUEVSVFlfREVWSUNFX0hBTF9WRVJTSU9OKSB7CisgICAgICAgIGlmIChpbnQzMl90IG1peGVyQnVyc3RzID0gZGV2LT5nZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKTsKKyAgICAgICAgICAgIG1peGVyQnVyc3RzID4gMCAmJiBtaXhlckJ1cnN0cyA+IG1BQXVkaW9CdXJzdHNQZXJCdWZmZXIpIHsKKyAgICAgICAgICAgIG1BQXVkaW9CdXJzdHNQZXJCdWZmZXIgPSBtaXhlckJ1cnN0czsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50MzJfdCBod0J1cnN0TWluTWljcm9zID0gZGV2LT5nZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpOworICAgICAgICAgICAgaHdCdXJzdE1pbk1pY3JvcyA+IDAKKyAgICAgICAgICAgICYmIChod0J1cnN0TWluTWljcm9zIDwgbUFBdWRpb0h3QnVyc3RNaW5NaWNyb3MgfHwgbUFBdWRpb0h3QnVyc3RNaW5NaWNyb3MgPT0gMCkpIHsKKyAgICAgICAgICAgIG1BQXVkaW9Id0J1cnN0TWluTWljcm9zID0gaHdCdXJzdE1pbk1pY3JvczsKKyAgICAgICAgfQorICAgIH0KKwogICAgIG1BdWRpb0h3RGV2cy5hZGQoaGFuZGxlLCBhdWRpb0RldmljZSk7CiAKICAgICBBTE9HSSgibG9hZEh3TW9kdWxlKCkgTG9hZGVkICVzIGF1ZGlvIGludGVyZmFjZSwgaGFuZGxlICVkIiwgbmFtZSwgaGFuZGxlKTsKQEAgLTIzOTYsMjEgKzI2MTMsMTcgQEAKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIEFVRElPX0hXX1NZTkNfSU5WQUxJRDsKICAgICB9Ci0gICAgU3RyaW5nOCByZXBseTsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKLSAgICBpZiAoZGV2LT5nZXRQYXJhbWV0ZXJzKFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUh3QXZTeW5jKSwgJnJlcGx5KSA9PSBPSykgewotICAgICAgICBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKHJlcGx5KTsKLSAgICB9CiAKLSAgICBpbnQgdmFsdWU7Ci0gICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlId0F2U3luYyksIHZhbHVlKSAhPSBOT19FUlJPUikgeworICAgIGVycm9yOjpSZXN1bHQ8YXVkaW9faHdfc3luY190PiByZXN1bHQgPSBkZXYtPmdldEh3QXZTeW5jKCk7CisgICAgaWYgKCFyZXN1bHQub2soKSkgewogICAgICAgICBBTE9HVygiZ2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uIGVycm9yIGdldHRpbmcgc3luYyBmb3Igc2Vzc2lvbiAlZCIsIHNlc3Npb25JZCk7CiAgICAgICAgIHJldHVybiBBVURJT19IV19TWU5DX0lOVkFMSUQ7CiAgICAgfQorICAgIGF1ZGlvX2h3X3N5bmNfdCB2YWx1ZSA9IFZBTFVFX09SX0ZBVEFMKHJlc3VsdCk7CiAKICAgICAvLyBhbGxvdyBvbmx5IG9uZSBzZXNzaW9uIGZvciBhIGdpdmVuIEhXIEEvViBzeW5jIElELgogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3QXZTeW5jSWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtSHdBdlN5bmNJZHMudmFsdWVBdChpKSA9PSAoYXVkaW9faHdfc3luY190KXZhbHVlKSB7CisgICAgICAgIGlmIChtSHdBdlN5bmNJZHMudmFsdWVBdChpKSA9PSB2YWx1ZSkgewogICAgICAgICAgICAgQUxPR1YoImdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbiByZW1vdmluZyBJRCAlZCBmb3Igc2Vzc2lvbiAlZCIsCiAgICAgICAgICAgICAgICAgICB2YWx1ZSwgbUh3QXZTeW5jSWRzLmtleUF0KGkpKTsKICAgICAgICAgICAgIG1Id0F2U3luY0lkcy5yZW1vdmVJdGVtc0F0KGkpOwpAQCAtMjQ1NSw2ICsyNjY4LDEwIEBACiAgICAgICAgIFRocmVhZEJhc2UgKnRocmVhZCA9IChUaHJlYWRCYXNlICopbVJlY29yZFRocmVhZHMudmFsdWVBdChpKS5nZXQoKTsKICAgICAgICAgdGhyZWFkLT5zeXN0ZW1SZWFkeSgpOwogICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NbWFwVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICBUaHJlYWRCYXNlICp0aHJlYWQgPSAoVGhyZWFkQmFzZSAqKW1NbWFwVGhyZWFkcy52YWx1ZUF0KGkpLmdldCgpOworICAgICAgICB0aHJlYWQtPnN5c3RlbVJlYWR5KCk7CisgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMjUwMSwxNCArMjcxOCwxNSBAQAogCiBzcDxBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U+IEF1ZGlvRmxpbmdlcjo6b3Blbk91dHB1dF9sKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpoYWxDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKm1peGVyQ29uZmlnIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCiB7CiAgICAgQXVkaW9Id0RldmljZSAqb3V0SHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKG1vZHVsZSwgZGV2aWNlVHlwZSk7CiAgICAgaWYgKG91dEh3RGV2ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KIAogICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CkBAIC0yNTE3LDkgKzI3MzUsMTcgQEAKICAgICAgICAgLy8gQXVkaW8gUG9saWN5IGRvZXMgbm90IGN1cnJlbnRseSByZXF1ZXN0IGEgc3BlY2lmaWMgb3V0cHV0IGhhbmRsZS4KICAgICAgICAgLy8gSWYgdGhpcyBpcyBldmVyIG5lZWRlZCwgc2VlIG9wZW5JbnB1dF9sKCkgZm9yIGV4YW1wbGUgY29kZS4KICAgICAgICAgQUxPR0UoIm9wZW5PdXRwdXRfbCByZXF1ZXN0ZWQgb3V0cHV0IGhhbmRsZSAlZCBpcyBub3QgQVVESU9fSU9fSEFORExFX05PTkUiLCAqb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KIAorI2lmbmRlZiBNVUxUSUNIQU5ORUxfRUZGRUNUX0NIQUlOCisgICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfU1BBVElBTElaRVIpIHsKKyAgICAgICAgQUxPR0UoIm9wZW5PdXRwdXRfbCgpIGNhbm5vdCBjcmVhdGUgc3BhdGlhbGl6ZXIgdGhyZWFkICIKKyAgICAgICAgICAgICAgICAid2l0aG91dCAjZGVmaW5lIE1VTFRJQ0hBTk5FTF9FRkZFQ1RfQ0hBSU4iKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorI2VuZGlmCisKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19PVVRQVVRfT1BFTjsKIAogICAgIC8vIEZPUiBURVNUSU5HIE9OTFk6CkBAIC0yNTI5LDE2ICsyNzU1LDE2IEBACiAgICAgICAgIC8vIENoZWNrIG9ubHkgZm9yIE5vcm1hbCBNaXhpbmcgbW9kZQogICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkUHJlY2lzaW9uKSB7CiAgICAgICAgICAgICAvLyBTcGVjaWZ5IGZvcm1hdCAodW5jb21tZW50IG9uZSBiZWxvdyB0byBjaG9vc2UpCi0gICAgICAgICAgICAvL2NvbmZpZy0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKLSAgICAgICAgICAgIC8vY29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ7Ci0gICAgICAgICAgICAvL2NvbmZpZy0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ7Ci0gICAgICAgICAgICAvL2NvbmZpZy0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVDsKLSAgICAgICAgICAgIC8vIEFMT0dWKCJvcGVuT3V0cHV0X2woKSB1cGdyYWRpbmcgZm9ybWF0IHRvICUjMDh4IiwgY29uZmlnLT5mb3JtYXQpOworICAgICAgICAgICAgLy9oYWxDb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgICAgICAgICAvL2hhbENvbmZpZy0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOworICAgICAgICAgICAgLy9oYWxDb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOworICAgICAgICAgICAgLy9oYWxDb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQ7CisgICAgICAgICAgICAvLyBBTE9HVigib3Blbk91dHB1dF9sKCkgdXBncmFkaW5nIGZvcm1hdCB0byAlIzA4eCIsIGhhbENvbmZpZy0+Zm9ybWF0KTsKICAgICAgICAgfQogICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMpIHsKICAgICAgICAgICAgIC8vIFNwZWNpZnkgY2hhbm5lbCBtYXNrICh1bmNvbW1lbnQgb25lIGJlbG93IHRvIGNob29zZSkKLSAgICAgICAgICAgIC8vY29uZmlnLT5jaGFubmVsX21hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoNCk7ICAvLyBmb3IgVVNCIDRjaAotICAgICAgICAgICAgLy9jb25maWctPmNoYW5uZWxfbWFzayA9IGF1ZGlvX2NoYW5uZWxfbWFza19mcm9tX3JlcHJlc2VudGF0aW9uX2FuZF9iaXRzKAorICAgICAgICAgICAgLy9oYWxDb25maWctPmNoYW5uZWxfbWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudCg0KTsgIC8vIGZvciBVU0IgNGNoCisgICAgICAgICAgICAvL2hhbENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gYXVkaW9fY2hhbm5lbF9tYXNrX2Zyb21fcmVwcmVzZW50YXRpb25fYW5kX2JpdHMoCiAgICAgICAgICAgICAvLyAgICAgICAgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWCwgKDEgPDwgNCkgLSAxKTsgIC8vIGFub3RoZXIgNGNoIGV4YW1wbGUKICAgICAgICAgfQogICAgIH0KQEAgLTI1NDksNyArMjc3NSw3IEBACiAgICAgICAgICAgICAqb3V0cHV0LAogICAgICAgICAgICAgZGV2aWNlVHlwZSwKICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLAorICAgICAgICAgICAgaGFsQ29uZmlnLAogICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7CiAKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwpAQCAtMjU2NCwxMyArMjc5MCwxOCBAQAogICAgICAgICAgICAgcmV0dXJuIHRocmVhZDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiB0aHJlYWQ7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19TUEFUSUFMSVpFUikgeworICAgICAgICAgICAgICAgIHRocmVhZCA9IG5ldyBTcGF0aWFsaXplclRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVJlYWR5LCBtaXhlckNvbmZpZyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXRfbCgpIGNyZWF0ZWQgc3BhdGlhbGl6ZXIgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLAorICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQsIHRocmVhZC5nZXQoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgewogICAgICAgICAgICAgICAgIHRocmVhZCA9IG5ldyBPZmZsb2FkVGhyZWFkKHRoaXMsIG91dHB1dFN0cmVhbSwgKm91dHB1dCwgbVN5c3RlbVJlYWR5KTsKICAgICAgICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dF9sKCkgY3JlYXRlZCBvZmZsb2FkIG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwKICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LCB0aHJlYWQuZ2V0KCkpOwogICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpCi0gICAgICAgICAgICAgICAgICAgIHx8ICFpc1ZhbGlkUGNtU2lua0Zvcm1hdChjb25maWctPmZvcm1hdCkKLSAgICAgICAgICAgICAgICAgICAgfHwgIWlzVmFsaWRQY21TaW5rQ2hhbm5lbE1hc2soY29uZmlnLT5jaGFubmVsX21hc2spKSB7CisgICAgICAgICAgICAgICAgICAgIHx8ICFpc1ZhbGlkUGNtU2lua0Zvcm1hdChoYWxDb25maWctPmZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgfHwgIWlzVmFsaWRQY21TaW5rQ2hhbm5lbE1hc2soaGFsQ29uZmlnLT5jaGFubmVsX21hc2spKSB7CiAgICAgICAgICAgICAgICAgdGhyZWFkID0gbmV3IERpcmVjdE91dHB1dFRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsIG1TeXN0ZW1SZWFkeSk7CiAgICAgICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXRfbCgpIGNyZWF0ZWQgZGlyZWN0IG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwKICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LCB0aHJlYWQuZ2V0KCkpOwpAQCAtMjU4OSw3ICsyODIwLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiAwOworICAgIHJldHVybiBudWxscHRyOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om9wZW5PdXRwdXQoY29uc3QgbWVkaWE6Ok9wZW5PdXRwdXRSZXF1ZXN0JiByZXF1ZXN0LApAQCAtMjU5Nyw4ICsyODI4LDEwIEBACiB7CiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChyZXF1ZXN0Lm1vZHVsZSkpOwotICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChyZXF1ZXN0LmNvbmZpZykpOworICAgIGF1ZGlvX2NvbmZpZ190IGhhbENvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChyZXF1ZXN0LmhhbENvbmZpZywgZmFsc2UgLyppc0lucHV0Ki8pKTsKKyAgICBhdWRpb19jb25maWdfYmFzZV90IG1peGVyQ29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KHJlcXVlc3QubWl4ZXJDb25maWcsIGZhbHNlLyppc0lucHV0Ki8pKTsKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4gZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0RldmljZURlc2NyaXB0b3JCYXNlKHJlcXVlc3QuZGV2aWNlKSk7CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKApAQCAtMjYxMSw5ICsyODQ0LDkgQEAKICAgICAgICAgICAgICAgIkNoYW5uZWxzICUjeCwgZmxhZ3MgJSN4IiwKICAgICAgICAgICAgICAgdGhpcywgbW9kdWxlLAogICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICBjb25maWcuZm9ybWF0LAotICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICBoYWxDb25maWcuc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgIGhhbENvbmZpZy5mb3JtYXQsCisgICAgICAgICAgICAgIGhhbENvbmZpZy5jaGFubmVsX21hc2ssCiAgICAgICAgICAgICAgIGZsYWdzKTsKIAogICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gZGV2aWNlLT50eXBlKCk7CkBAIC0yNjI1LDcgKzI4NTgsOCBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG9wZW5PdXRwdXRfbChtb2R1bGUsICZvdXRwdXQsICZjb25maWcsIGRldmljZVR5cGUsIGFkZHJlc3MsIGZsYWdzKTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBvcGVuT3V0cHV0X2wobW9kdWxlLCAmb3V0cHV0LCAmaGFsQ29uZmlnLAorICAgICAgICAgICAgJm1peGVyQ29uZmlnLCBkZXZpY2VUeXBlLCBhZGRyZXNzLCBmbGFncyk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRKSA9PSAwKSB7CiAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CkBAIC0yNjUwLDcgKzI4ODQsOCBAQAogICAgICAgICAgICAgbW1hcFRocmVhZC0+aW9Db25maWdDaGFuZ2VkKEFVRElPX09VVFBVVF9PUEVORUQpOwogICAgICAgICB9CiAgICAgICAgIHJlc3BvbnNlLT5vdXRwdXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3Qob3V0cHV0KSk7Ci0gICAgICAgIHJlc3BvbnNlLT5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbmZpZykpOworICAgICAgICByZXNwb25zZS0+Y29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhoYWxDb25maWcsIGZhbHNlIC8qaXNJbnB1dCovKSk7CiAgICAgICAgIHJlc3BvbnNlLT5sYXRlbmN5TXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsYXRlbmN5TXMpKTsKICAgICAgICAgcmVzcG9uc2UtPmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soZmxhZ3MpKTsKQEAgLTI3MzYsOSArMjk3MSw3IEBACiAgICAgICAgICAgICBtTW1hcFRocmVhZHMucmVtb3ZlSXRlbShvdXRwdXQpOwogICAgICAgICAgICAgQUxPR0QoImNsb3NpbmcgbW1hcFRocmVhZCAlcCIsIG1tYXBUaHJlYWQuZ2V0KCkpOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBpb0Rlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKLSAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUgPSBvdXRwdXQ7Ci0gICAgICAgIGlvQ29uZmlnQ2hhbmdlZChBVURJT19PVVRQVVRfQ0xPU0VELCBpb0Rlc2MpOworICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoQVVESU9fT1VUUFVUX0NMT1NFRCwgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+OjptYWtlKG91dHB1dCkpOwogICAgICAgICBtUGF0Y2hQYW5lbC5ub3RpZnlTdHJlYW1DbG9zZWQob3V0cHV0KTsKICAgICB9CiAgICAgLy8gVGhlIHRocmVhZCBlbnRpdHkgKGFjdGl2ZSB1bml0IG9mIGV4ZWN1dGlvbikgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcgaGVyZSwKQEAgLTI4MTEsMTYgKzMwNDQsMTYgQEAKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgaWYgKHJlcXVlc3QuZGV2aWNlLnR5cGUgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKHJlcXVlc3QuZGV2aWNlKSk7CisgICAgaWYgKGRldmljZS5tVHlwZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QocmVxdWVzdC5pbnB1dCkpOwogICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChyZXF1ZXN0LmNvbmZpZykpOwotICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MocmVxdWVzdC5kZXZpY2UpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KHJlcXVlc3QuY29uZmlnLCB0cnVlIC8qaXNJbnB1dCovKSk7CiAKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBvcGVuSW5wdXRfbCgKICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QocmVxdWVzdC5tb2R1bGUpKSwKQEAgLTI4MjgsMTMgKzMwNjEsMTQgQEAKICAgICAgICAgICAgICZjb25maWcsCiAgICAgICAgICAgICBkZXZpY2UubVR5cGUsCiAgICAgICAgICAgICBkZXZpY2UuYWRkcmVzcygpLmNfc3RyKCksCi0gICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChyZXF1ZXN0LnNvdXJjZSkpLAorICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdChyZXF1ZXN0LnNvdXJjZSkpLAogICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lucHV0X2ZsYWdzX3RfbWFzayhyZXF1ZXN0LmZsYWdzKSksCiAgICAgICAgICAgICBBVURJT19ERVZJQ0VfTk9ORSwKICAgICAgICAgICAgIFN0cmluZzh7fSk7CiAKICAgICByZXNwb25zZS0+aW5wdXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoaW5wdXQpKTsKLSAgICByZXNwb25zZS0+Y29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25maWcpKTsKKyAgICByZXNwb25zZS0+Y29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbmZpZywgdHJ1ZSAvKmlzSW5wdXQqLykpOwogICAgIHJlc3BvbnNlLT5kZXZpY2UgPSByZXF1ZXN0LmRldmljZTsKIAogICAgIGlmICh0aHJlYWQgIT0gMCkgewpAQCAtMjk5Niw5ICszMjMwLDcgQEAKICAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKG1tYXBUaHJlYWQpOwogICAgICAgICAgICAgbU1tYXBUaHJlYWRzLnJlbW92ZUl0ZW0oaW5wdXQpOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBpb0Rlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKLSAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUgPSBpbnB1dDsKLSAgICAgICAgaW9Db25maWdDaGFuZ2VkKEFVRElPX0lOUFVUX0NMT1NFRCwgaW9EZXNjKTsKKyAgICAgICAgaW9Db25maWdDaGFuZ2VkKEFVRElPX0lOUFVUX0NMT1NFRCwgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+OjptYWtlKGlucHV0KSk7CiAgICAgfQogICAgIC8vIEZJWE1FOiBjYWxsaW5nIHRocmVhZC0+ZXhpdCgpIHdpdGhvdXQgbUxvY2sgaGVsZCBzaG91bGQgbm90IGJlIG5lZWRlZCBhbnltb3JlIG5vdyB0aGF0CiAgICAgLy8gd2UgaGF2ZSBhIGRpZmZlcmVudCBsb2NrIGZvciBub3RpZmljYXRpb24gY2xpZW50CkBAIC0zNjU3LDE3ICszODg5LDI0IEBACiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSkgewotICAgICAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogb25seSBBUE0gY2FuIGNyZWF0ZSB1c2luZyBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotCiAgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBBUE0gbXVzdCBzcGVjaWZ5IG91dHB1dCB3aGVuIHVzaW5nIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFIiwgX19mdW5jX18pOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQorICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKGlvKTsKKyAgICAgICAgaWYgKHRocmVhZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgb3V0cHV0ICVkIHNwZWNpZmllZCBmb3IgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UiLCBfX2Z1bmNfXywgaW8pOworICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKGFkakF0dHJpYnV0aW9uU291cmNlKQorICAgICAgICAgICAgICAgICYmICFpc0F1ZGlvU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGVmZmVjdCBvbiBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSBub3QgZ3JhbnRlZCBmb3IgdWlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxpbmdVaWQpOworICAgICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9ERVZJQ0UpIHsKICAgICAgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSkpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogZGV2aWNlIGVmZmVjdCBwZXJtaXNzaW9uIGRlbmllZCBmb3IgdWlkICVkIiwgX19mdW5jX18sIGNhbGxpbmdVaWQpOwpAQCAtMzcyOSw2ICszOTY4LDE1IEBACiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBPbmx5IGF1ZGlvIHBvbGljeSBzZXJ2aWNlIGNhbiBjcmVhdGUgYSBzcGF0aWFsaXplciBlZmZlY3QKKyAgICAgICAgaWYgKChtZW1jbXAoJmRlc2NPdXQudHlwZSwgRlhfSUlEX1NQQVRJQUxJWkVSLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApICYmCisgICAgICAgICAgICAoY2FsbGluZ1VpZCAhPSBBSURfQVVESU9TRVJWRVIgfHwgY3VycmVudFBpZCAhPSBnZXRwaWQoKSkpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogYXR0ZW1wdCB0byBjcmVhdGUgYSBzcGF0aWFsaXplciBlZmZlY3QgZnJvbSB1aWQvcGlkICVkLyVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxpbmdVaWQsIGN1cnJlbnRQaWQpOworICAgICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisKICAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FICYmIHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKICAgICAgICAgICAgIC8vIGlmIHRoZSBvdXRwdXQgcmV0dXJuZWQgYnkgZ2V0T3V0cHV0Rm9yRWZmZWN0KCkgaXMgcmVtb3ZlZCBiZWZvcmUgd2UgbG9jayB0aGUKICAgICAgICAgICAgIC8vIG11dGV4IGJlbG93LCB0aGUgY2FsbCB0byBjaGVja1BsYXliYWNrVGhyZWFkX2woaW8pIGJlbG93IHdpbGwgZGV0ZWN0IGl0CkBAIC0zNzQ0LDcgKzM5OTIsNyBAQAogICAgICAgICAgICAgQUxPR1YoIiVzIGRldmljZSB0eXBlICUjeCBhZGRyZXNzICVzIiwgX19mdW5jX18sIGRldmljZS5tVHlwZSwgZGV2aWNlLmdldEFkZHJlc3MoKSk7CiAgICAgICAgICAgICBoYW5kbGUgPSBtRGV2aWNlRWZmZWN0TWFuYWdlci5jcmVhdGVFZmZlY3RfbCgKICAgICAgICAgICAgICAgICAgICAgJmRlc2NPdXQsIGRldmljZSwgY2xpZW50LCBlZmZlY3RDbGllbnQsIG1QYXRjaFBhbmVsLnBhdGNoZXNfbCgpLAotICAgICAgICAgICAgICAgICAgICAmZW5hYmxlZE91dCwgJmxTdGF0dXMsIHByb2JlKTsKKyAgICAgICAgICAgICAgICAgICAgJmVuYWJsZWRPdXQsICZsU3RhdHVzLCBwcm9iZSwgcmVxdWVzdC5ub3RpZnlGcmFtZXNQcm9jZXNzZWQpOwogICAgICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgbFN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewogICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCB3aXRoIG1DbGllbnRMb2NrIGhlbGQKICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKQEAgLTM3OTcsNyArNDA0NSw4IEBACiAgICAgICAgICAgICAgICAgaW8gPSBtUGxheWJhY2tUaHJlYWRzLmtleUF0KDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUVmZmVjdCgpIGdvdCBpbyAlZCBmb3IgZWZmZWN0ICVzIiwgaW8sIGRlc2NPdXQubmFtZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2hlY2tQbGF5YmFja1RocmVhZF9sKGlvKSAhPSBudWxscHRyKSB7CisgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tQbGF5YmFja1RocmVhZF9sKGlvKSAhPSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UpIHsKICAgICAgICAgICAgIC8vIGFsbG93IG9ubHkgb25lIGVmZmVjdCBjaGFpbiBwZXIgc2Vzc2lvbklkIG9uIG1QbGF5YmFja1RocmVhZHMuCiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBjaGVja0lvID0gbVBsYXliYWNrVGhyZWFkcy5rZXlBdChpKTsKQEAgLTM4NjMsNyArNDExMiw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaGFuZGxlID0gdGhyZWFkLT5jcmVhdGVFZmZlY3RfbChjbGllbnQsIGVmZmVjdENsaWVudCwgcHJpb3JpdHksIHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY091dCwgJmVuYWJsZWRPdXQsICZsU3RhdHVzLCBwaW5uZWQsIHByb2JlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY091dCwgJmVuYWJsZWRPdXQsICZsU3RhdHVzLCBwaW5uZWQsIHByb2JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Qubm90aWZ5RnJhbWVzUHJvY2Vzc2VkKTsKICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgbFN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewogICAgICAgICAgICAgLy8gcmVtb3ZlIGxvY2FsIHN0cm9uZyByZWZlcmVuY2UgdG8gQ2xpZW50IHdpdGggbUNsaWVudExvY2sgaGVsZAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9jbChtQ2xpZW50TG9jayk7CkBAIC0zODgxLDYgKzQxMzEsMTIgQEAKIAogUmVnaXN0ZXI6CiAgICAgaWYgKCFwcm9iZSAmJiAobFN0YXR1cyA9PSBOT19FUlJPUiB8fCBsU3RhdHVzID09IEFMUkVBRFlfRVhJU1RTKSkgeworICAgICAgICBpZiAobFN0YXR1cyA9PSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgcmVzcG9uc2UtPmFscmVhZHlFeGlzdHMgPSB0cnVlOworICAgICAgICAgICAgbFN0YXR1cyA9IE5PX0VSUk9SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzcG9uc2UtPmFscmVhZHlFeGlzdHMgPSBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICAvLyBDaGVjayBDUFUgYW5kIG1lbW9yeSB1c2FnZQogICAgICAgICBzcDxFZmZlY3RCYXNlPiBlZmZlY3QgPSBoYW5kbGUtPmVmZmVjdCgpLnByb21vdGUoKTsKICAgICAgICAgaWYgKGVmZmVjdCAhPSBudWxscHRyKSB7CkBAIC0zOTczLDQ3ICs0MjI5LDg3IEBACiAgICAgLy8gc28gdGhhdCBhIG5ldyBjaGFpbiBpcyBjcmVhdGVkIHdpdGggY29ycmVjdCBwYXJhbWV0ZXJzIHdoZW4gZmlyc3QgZWZmZWN0IGlzIGFkZGVkLiBUaGlzIGlzCiAgICAgLy8gb3RoZXJ3aXNlIHVubmVjZXNzYXJ5IGFzIHJlbW92ZUVmZmVjdF9sKCkgd2lsbCByZW1vdmUgdGhlIGNoYWluIHdoZW4gbGFzdCBlZmZlY3QgaXMKICAgICAvLyByZW1vdmVkLgorICAgIC8vIFRPRE8oYi8yMTY4NzUwMTYpOiBjb25zaWRlciBob2xkaW5nIHRoZSBlZmZlY3QgY2hhaW4gbG9ja3MgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgbW92ZS4KICAgICBzcmNUaHJlYWQtPnJlbW92ZUVmZmVjdENoYWluX2woY2hhaW4pOwogCiAgICAgLy8gdHJhbnNmZXIgYWxsIGVmZmVjdHMgb25lIGJ5IG9uZSBzbyB0aGF0IG5ldyBlZmZlY3QgY2hhaW4gaXMgY3JlYXRlZCBvbiBuZXcgdGhyZWFkIHdpdGgKICAgICAvLyBjb3JyZWN0IGJ1ZmZlciBzaXplcyBhbmQgYXVkaW8gcGFyYW1ldGVycyBhbmQgZWZmZWN0IGVuZ2luZXMgcmVjb25maWd1cmVkIGFjY29yZGluZ2x5CiAgICAgc3A8RWZmZWN0Q2hhaW4+IGRzdENoYWluOwotICAgIHVpbnQzMl90IHN0cmF0ZWd5ID0gMDsgLy8gcHJldmVudCBjb21waWxlciB3YXJuaW5nCiAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBjaGFpbi0+Z2V0RWZmZWN0RnJvbUlkX2woMCk7CiAgICAgVmVjdG9yPCBzcDxFZmZlY3RNb2R1bGU+ID4gcmVtb3ZlZDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICB3aGlsZSAoZWZmZWN0ICE9IDApIHsKKyAgICBzdGQ6OnN0cmluZyBlcnJvclN0cmluZzsKKyAgICB3aGlsZSAoZWZmZWN0ICE9IG51bGxwdHIpIHsKICAgICAgICAgc3JjVGhyZWFkLT5yZW1vdmVFZmZlY3RfbChlZmZlY3QpOwogICAgICAgICByZW1vdmVkLmFkZChlZmZlY3QpOwogICAgICAgICBzdGF0dXMgPSBkc3RUaHJlYWQtPmFkZEVmZmVjdF9sKGVmZmVjdCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGVycm9yU3RyaW5nID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGFkZCBlZmZlY3QgJXAgdG8gZGVzdGluYXRpb24gdGhyZWFkIiwgZWZmZWN0LmdldCgpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIC8vIHJlbW92ZUVmZmVjdF9sKCkgaGFzIHN0b3BwZWQgdGhlIGVmZmVjdCBpZiBpdCB3YXMgYWN0aXZlIHNvIGl0IG11c3QgYmUgcmVzdGFydGVkCi0gICAgICAgIGlmIChlZmZlY3QtPnN0YXRlKCkgPT0gRWZmZWN0TW9kdWxlOjpBQ1RJVkUgfHwKLSAgICAgICAgICAgICAgICBlZmZlY3QtPnN0YXRlKCkgPT0gRWZmZWN0TW9kdWxlOjpTVE9QUElORykgewotICAgICAgICAgICAgZWZmZWN0LT5zdGFydCgpOwotICAgICAgICB9CiAgICAgICAgIC8vIGlmIHRoZSBtb3ZlIHJlcXVlc3QgaXMgbm90IHJlY2VpdmVkIGZyb20gYXVkaW8gcG9saWN5IG1hbmFnZXIsIHRoZSBlZmZlY3QgbXVzdCBiZQotICAgICAgICAvLyByZS1yZWdpc3RlcmVkIHdpdGggdGhlIG5ldyBzdHJhdGVneSBhbmQgb3V0cHV0Ci0gICAgICAgIGlmIChkc3RDaGFpbiA9PSAwKSB7CisgICAgICAgIC8vIHJlLXJlZ2lzdGVyZWQgd2l0aCB0aGUgbmV3IHN0cmF0ZWd5IGFuZCBvdXRwdXQuCisKKyAgICAgICAgLy8gV2Ugb2J0YWluIHRoZSBkc3RDaGFpbiBvbmNlIHRoZSBlZmZlY3QgaXMgb24gdGhlIG5ldyB0aHJlYWQuCisgICAgICAgIGlmIChkc3RDaGFpbiA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBkc3RDaGFpbiA9IGVmZmVjdC0+Z2V0Q2FsbGJhY2soKS0+Y2hhaW4oKS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoZHN0Q2hhaW4gPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJtb3ZlRWZmZWN0Q2hhaW5fbCgpIGNhbm5vdCBnZXQgY2hhaW4gZnJvbSBlZmZlY3QgJXAiLCBlZmZlY3QuZ2V0KCkpOworICAgICAgICAgICAgaWYgKGRzdENoYWluID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBlcnJvclN0cmluZyA9IFN0cmluZ1ByaW50ZigiY2Fubm90IGdldCBjaGFpbiBmcm9tIGVmZmVjdCAlcCIsIGVmZmVjdC5nZXQoKSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cmF0ZWd5ID0gZHN0Q2hhaW4tPnN0cmF0ZWd5KCk7CiAgICAgICAgIH0KICAgICAgICAgZWZmZWN0ID0gY2hhaW4tPmdldEVmZmVjdEZyb21JZF9sKDApOwogICAgIH0KIAorICAgIHNpemVfdCByZXN0b3JlZCA9IDA7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlbW92ZWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNyY1RocmVhZC0+YWRkRWZmZWN0X2wocmVtb3ZlZFtpXSk7CisgICAgICAgIGRzdENoYWluLmNsZWFyKCk7IC8vIGRzdENoYWluIGlzIG5vdyBmcm9tIHRoZSBzcmNUaHJlYWQgKGNvdWxkIGJlIHJlY3JlYXRlZCkuCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWZmZWN0IDogcmVtb3ZlZCkgeworICAgICAgICAgICAgZHN0VGhyZWFkLT5yZW1vdmVFZmZlY3RfbChlZmZlY3QpOyAvLyBOb3RlOiBEZXBlbmRpbmcgb24gZXJyb3IgbG9jYXRpb24sIHRoZSBsYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVmZmVjdCBtYXkgbm90IGhhdmUgYmVlbiBwbGFjZWQgb24gZHN0VGhyZWFkLgorICAgICAgICAgICAgaWYgKHNyY1RocmVhZC0+YWRkRWZmZWN0X2woZWZmZWN0KSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICsrcmVzdG9yZWQ7CisgICAgICAgICAgICAgICAgaWYgKGRzdENoYWluID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0Q2hhaW4gPSBlZmZlY3QtPmdldENhbGxiYWNrKCktPmNoYWluKCkucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIEFmdGVyIGFsbCB0aGUgZWZmZWN0cyBoYXZlIGJlZW4gbW92ZWQgdG8gbmV3IHRocmVhZCAob3IgcHV0IGJhY2spIHdlIHJlc3RhcnQgdGhlIGVmZmVjdHMKKyAgICAvLyBiZWNhdXNlIHJlbW92ZUVmZmVjdF9sKCkgaGFzIHN0b3BwZWQgdGhlIGVmZmVjdCBpZiBpdCBpcyBjdXJyZW50bHkgYWN0aXZlLgorICAgIHNpemVfdCBzdGFydGVkID0gMDsKKyAgICBpZiAoZHN0Q2hhaW4gIT0gbnVsbHB0ciAmJiAhcmVtb3ZlZC5lbXB0eSgpKSB7CisgICAgICAgIC8vIElmIHdlIGRvIG5vdCB0YWtlIHRoZSBkc3RDaGFpbiBsb2NrLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHByb2Nlc3NpbmcgaXMgb25nb2luZworICAgICAgICAvLyB3aGlsZSB3ZSBhcmUgc3RhcnRpbmcgdGhlIGVmZmVjdC4gIFRoaXMgY2FuIGNhdXNlIGdsaXRjaGVzIHdpdGggdm9sdW1lLAorICAgICAgICAvLyBzZWUgYi8yMDIzNjAxMzcuCisgICAgICAgIGRzdENoYWluLT5sb2NrKCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWZmZWN0IDogcmVtb3ZlZCkgeworICAgICAgICAgICAgaWYgKGVmZmVjdC0+c3RhdGUoKSA9PSBFZmZlY3RNb2R1bGU6OkFDVElWRSB8fAorICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPnN0YXRlKCkgPT0gRWZmZWN0TW9kdWxlOjpTVE9QUElORykgeworICAgICAgICAgICAgICAgICsrc3RhcnRlZDsKKyAgICAgICAgICAgICAgICBlZmZlY3QtPnN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZHN0Q2hhaW4tPnVubG9jaygpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKGVycm9yU3RyaW5nLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGVycm9yU3RyaW5nID0gU3RyaW5nUHJpbnRmKCIlczogZmFpbGVkIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgICAgICB9CisgICAgICAgIEFMT0dXKCIlczogJXMgdW5zdWNjZXNzZnVsIG1vdmUgb2Ygc2Vzc2lvbiAlZCBmcm9tIHNyY1RocmVhZCAlcCB0byBkc3RUaHJlYWQgJXAgIgorICAgICAgICAgICAgICAgICIoJXp1IGVmZmVjdHMgcmVtb3ZlZCBmcm9tIHNyY1RocmVhZCwgJXp1IGVmZmVjdHMgcmVzdG9yZWQgdG8gc3JjVGhyZWFkLCAiCisgICAgICAgICAgICAgICAgIiV6dSBlZmZlY3RzIHN0YXJ0ZWQpIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZXJyb3JTdHJpbmcuY19zdHIoKSwgc2Vzc2lvbklkLCBzcmNUaHJlYWQsIGRzdFRocmVhZCwKKyAgICAgICAgICAgICAgICByZW1vdmVkLnNpemUoKSwgcmVzdG9yZWQsIHN0YXJ0ZWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCIlczogc3VjY2Vzc2Z1bCBtb3ZlIG9mIHNlc3Npb24gJWQgZnJvbSBzcmNUaHJlYWQgJXAgdG8gZHN0VGhyZWFkICVwICIKKyAgICAgICAgICAgICAgICAiKCV6dSBlZmZlY3RzIG1vdmVkLCAlenUgZWZmZWN0cyBzdGFydGVkKSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHNlc3Npb25JZCwgc3JjVGhyZWFkLCBkc3RUaHJlYWQsIHJlbW92ZWQuc2l6ZSgpLCBzdGFydGVkKTsKKyAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDE3OCw2ICs0NDc0LDggQEAKICAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OkxJU1RfQVVESU9fUEFUQ0hFUzoKICAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OlNFVF9BVURJT19QT1JUX0NPTkZJRzoKICAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OlNFVF9SRUNPUkRfU0lMRU5DRUQ6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpBVURJT19QT0xJQ1lfUkVBRFk6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfREVWSUNFX0NPTk5FQ1RFRF9TVEFURToKICAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQiLAogICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CiAgICAgICAgICAgICAvLyByZXR1cm4gc3RhdHVzIG9ubHkgZm9yIG5vbiB2b2lkIG1ldGhvZHMKQEAgLTQyNDUsOSArNDU0MywyMCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgc3RkOjpzdHJpbmcgdGFnKCJJQXVkaW9GbGluZ2VyIGNvbW1hbmQgIiArCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PHN0ZDo6dW5kZXJseWluZ190eXBlX3Q8VHJhbnNhY3Rpb25Db2RlPj4oY29kZSkpKTsKLSAgICBUaW1lQ2hlY2sgY2hlY2sodGFnLmNfc3RyKCkpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1ldGhvZE5hbWUgPSBnZXRJQXVkaW9GbGluZ2VyU3RhdGlzdGljcygpLmdldE1ldGhvZEZvckNvZGUoY29kZSk7CisgICAgbWVkaWF1dGlsczo6VGltZUNoZWNrIGNoZWNrKAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoIklBdWRpb0ZsaW5nZXI6OiIpLmFwcGVuZChtZXRob2ROYW1lKSwKKyAgICAgICAgICAgIFtjb2RlLCBtZXRob2ROYW1lXShib29sIHRpbWVvdXQsIGZsb2F0IGVsYXBzZWRNcykgeyAvLyBkb24ndCBtb3ZlIG1ldGhvZE5hbWUuCisgICAgICAgIGlmICh0aW1lb3V0KSB7CisgICAgICAgICAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0obU1ldHJpY3NJZCkKKyAgICAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1RJTUVPVVQpCisgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfTUVUSE9EQ09ERSwgaW50NjRfdChjb2RlKSkKKyAgICAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9NRVRIT0ROQU1FLCBtZXRob2ROYW1lLmNfc3RyKCkpCisgICAgICAgICAgICAgICAgLnJlY29yZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0SUF1ZGlvRmxpbmdlclN0YXRpc3RpY3MoKS5ldmVudChjb2RlLCBlbGFwc2VkTXMpOworICAgICAgICB9CisgICAgfSk7CiAKICAgICAvLyBNYWtlIHN1cmUgd2UgY29ubmVjdCB0byBBdWRpbyBQb2xpY3kgU2VydmljZSBiZWZvcmUgY2FsbGluZyBpbnRvIEF1ZGlvRmxpbmdlcjoKICAgICAvLyAgLSBBdWRpb0ZsaW5nZXIgY2FuIGNhbGwgaW50byBBdWRpbyBQb2xpY3kgU2VydmljZSB3aXRoIGl0cyBnbG9iYWwgbXV0ZXggaGVsZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCmluZGV4IGZmZjYxZjguLjhlNDM4M2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKQEAgLTc2LDYgKzc2LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9Wb2x1bWVTaGFwZXIuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1N5bmNocm9uaXphdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGhyZWFkU25hcHNob3QuaD4KIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvRmRUb1N0cmluZy5oPgpAQCAtMjY5LDYgKzI3MCw5IEBACiAKICAgICAvKiBJbmRpY2F0ZSBKQVZBIHNlcnZpY2VzIGFyZSByZWFkeSAoc2NoZWR1bGluZywgcG93ZXIgbWFuYWdlbWVudCAuLi4pICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzeXN0ZW1SZWFkeSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYXVkaW9Qb2xpY3lSZWFkeSgpIHsgbUF1ZGlvUG9saWN5UmVhZHkuc3RvcmUodHJ1ZSk7IHJldHVybiBOT19FUlJPUjsgfQorICAgICAgICAgICAgYm9vbCBpc0F1ZGlvUG9saWN5UmVhZHkoKSBjb25zdCB7IHJldHVybiBtQXVkaW9Qb2xpY3lSZWFkeS5sb2FkKCk7IH0KKwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CiAKQEAgLTI3OSw2ICsyODMsMTYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVNlY29uZGFyeU91dHB1dHMoCiAgICAgICAgICAgICBjb25zdCBUcmFja1NlY29uZGFyeU91dHB1dHNNYXAmIHRyYWNrU2Vjb25kYXJ5T3V0cHV0cyk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zKTsKKworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKTsKKworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCwgYm9vbCBjb25uZWN0ZWQpOworCiAgICAgc3RhdHVzX3Qgb25UcmFuc2FjdFdyYXBwZXIoVHJhbnNhY3Rpb25Db2RlIGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4mIGRlbGVnYXRlKSBvdmVycmlkZTsKIApAQCAtMzA5LDcgKzMyMyw3IEBACiAgICAgdm9pZCB1cGRhdGVEb3duU3RyZWFtUGF0Y2hlc19sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PGF1ZGlvX2lvX2hhbmRsZV90PiBzdHJlYW1zKTsKIAotICAgIGNvbnN0IG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbyogZ2V0RGVmYXVsdFZpYnJhdG9ySW5mb19sKCk7CisgICAgc3RkOjpvcHRpb25hbDxtZWRpYTo6QXVkaW9WaWJyYXRvckluZm8+IGdldERlZmF1bHRWaWJyYXRvckluZm9fbCgpOwogCiBwcml2YXRlOgogICAgIC8vIEZJWE1FIFRoZSA0MDAgaXMgdGVtcG9yYXJpbHkgdG9vIGhpZ2ggdW50aWwgYSBsZWFrIG9mIHdyaXRlcnMgaW4gbWVkaWEubG9nIGlzIGZpeGVkLgpAQCAtNzM1LDcgKzc0OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgb3V0cHV0RGV2aWNlQWRkcmVzcyk7CiAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IG9wZW5PdXRwdXRfbChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqaGFsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCAqbWl4ZXJDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CkBAIC03NDYsNyArNzYxLDcgQEAKICAgICAgICAgICAgICAgLy8gbm8gcmFuZ2UgY2hlY2ssIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAogICAgICAgICAgICAgICBib29sIHN0cmVhbU11dGVfbChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbVN0cmVhbVR5cGVzW3N0cmVhbV0ubXV0ZTsgfQotICAgICAgICAgICAgICB2b2lkIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsCisgICAgICAgICAgICAgIHZvaWQgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4mIGlvRGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gMCk7CiAKQEAgLTkwMCw2ICs5MTUsNyBAQAogICAgICAgICBBVURJT19IV19TRVRfTUFTVEVSX01VVEUsICAgICAgIC8vIHNldF9tYXN0ZXJfbXV0ZQogICAgICAgICBBVURJT19IV19HRVRfTUFTVEVSX01VVEUsICAgICAgIC8vIGdldF9tYXN0ZXJfbXV0ZQogICAgICAgICBBVURJT19IV19HRVRfTUlDUk9QSE9ORVMsICAgICAgIC8vIGdldE1pY3JvcGhvbmVzCisgICAgICAgIEFVRElPX0hXX1NFVF9DT05ORUNURURfU1RBVEUsICAgLy8gc2V0Q29ubmVjdGVkU3RhdGUKICAgICB9OwogCiAgICAgbXV0YWJsZSAgICAgaGFyZHdhcmVfY2FsbF9zdGF0ZSAgICAgICAgICAgICAgICAgbUhhcmR3YXJlU3RhdHVzOyAgICAvLyBmb3IgZHVtcCBvbmx5CkBAIC05ODYsNiArMTAwMiw3IEBACiAgICAgRGV2aWNlRWZmZWN0TWFuYWdlciBtRGV2aWNlRWZmZWN0TWFuYWdlcjsKIAogICAgIGJvb2wgICAgICAgbVN5c3RlbVJlYWR5OworICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUF1ZGlvUG9saWN5UmVhZHl7fTsKIAogICAgIG1lZGlhdXRpbHM6OlVpZEluZm8gbVVpZEluZm87CiAKQEAgLTk5OSw2ICsxMDE2LDExIEBACiAKICAgICAvLyBLZWVwIGluIHN5bmMgd2l0aCBqYXZhIGRlZmluaXRpb24gaW4gbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEKICAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3Qga01heFNoYXJlZEF1ZGlvSGlzdG9yeU1zID0gNTAwMDsKKworICAgIHN0ZDo6bWFwPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlLAorICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lJbmZvPj4gbVBvbGljeUluZm9zOworICAgIGludDMyX3QgbUFBdWRpb0J1cnN0c1BlckJ1ZmZlciA9IDA7CisgICAgaW50MzJfdCBtQUF1ZGlvSHdCdXJzdE1pbk1pY3JvcyA9IDA7CiB9OwogCiAjdW5kZWYgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmNwcAppbmRleCAxNmIyNWY2Li5kZWU2MTYxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuY3BwCkBAIC0yOSw2ICsyOSw5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm87Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5VHlwZTsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0dXNfdCBBdWRpb0h3RGV2aWNlOjpvcGVuT3V0cHV0U3RyZWFtKApAQCAtMTAyLDUgKzEwNSwxOCBAQAogICAgIHJldHVybiBtSHdEZXZpY2UtPmdldEF1ZGlvUG9ydChwb3J0KTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Id0RldmljZTo6Z2V0TW1hcFBvbGljeUluZm9zKAorICAgICAgICAgICAgQXVkaW9NTWFwUG9saWN5VHlwZSBwb2xpY3lUeXBlLCBzdGQ6OnZlY3RvcjxBdWRpb01NYXBQb2xpY3lJbmZvPiAqcG9saWN5SW5mb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gbUh3RGV2aWNlLT5nZXRNbWFwUG9saWN5SW5mb3MocG9saWN5VHlwZSwgcG9saWN5SW5mb3MpOworfQorCitpbnQzMl90IEF1ZGlvSHdEZXZpY2U6OmdldEFBdWRpb01peGVyQnVyc3RDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUh3RGV2aWNlLT5nZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKTsKK30KKworaW50MzJfdCBBdWRpb0h3RGV2aWNlOjpnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUh3RGV2aWNlLT5nZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlYygpOworfQorCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaAppbmRleCBmYzJjNjkzLi44YzVkMjM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeUluZm8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL2F1ZGlvL2NvbW1vbi9BdWRpb01NYXBQb2xpY3lUeXBlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC04NSw2ICs4NywxNCBAQAogCiAgICAgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSBjb25zdDsKIAorICAgIHN0YXR1c190IGdldE1tYXBQb2xpY3lJbmZvcygKKyAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zKSBjb25zdDsKKworICAgIGludDMyX3QgZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50KCkgY29uc3Q7CisKKyAgICBpbnQzMl90IGdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjKCkgY29uc3Q7CisKIHByaXZhdGU6CiAgICAgY29uc3QgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1IYW5kbGU7CiAgICAgY29uc3QgY2hhciAqIGNvbnN0ICAgICAgICAgIG1Nb2R1bGVOYW1lOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAKaW5kZXggZDg1NjViZC4uNjVlYzBlOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuY3BwCkBAIC0zOSw2ICszOSw3IEBACiAgICAgICAgICwgbVJhdGVNdWx0aXBsaWVyKDEpCiAgICAgICAgICwgbUhhbEZvcm1hdEhhc1Byb3BvcnRpb25hbEZyYW1lcyhmYWxzZSkKICAgICAgICAgLCBtSGFsRnJhbWVTaXplKDApCisgICAgICAgICwgbUV4cGVjdFJldHJvZ3JhZGUoZmFsc2UpCiB7CiB9CiAKQEAgLTY5LDggKzcwLDEyIEBACiAgICAgY29uc3QgdWludDMyX3QgdHJ1bmNhdGVkUG9zaXRpb24gPSAodWludDMyX3QpbVJlbmRlclBvc2l0aW9uOwogICAgIGludDMyX3QgZGVsdGFIYWxQb3NpdGlvbjsgLy8gaW5pdGlhbGl6YXRpb24gbm90IG5lZWRlZCwgb3ZlcndpdHRlbiBieSBfX2J1aWx0aW5fc3ViX292ZXJmbG93KCkKICAgICAodm9pZCkgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhoYWxQb3NpdGlvbiwgdHJ1bmNhdGVkUG9zaXRpb24sICZkZWx0YUhhbFBvc2l0aW9uKTsKKwogICAgIGlmIChkZWx0YUhhbFBvc2l0aW9uID4gMCkgewogICAgICAgICBtUmVuZGVyUG9zaXRpb24gKz0gZGVsdGFIYWxQb3NpdGlvbjsKKyAgICB9IGVsc2UgaWYgKG1FeHBlY3RSZXRyb2dyYWRlKSB7CisgICAgICAgIG1FeHBlY3RSZXRyb2dyYWRlID0gZmFsc2U7CisgICAgICAgIG1SZW5kZXJQb3NpdGlvbiAtPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oLWRlbHRhSGFsUG9zaXRpb24pOwogICAgIH0KICAgICAvLyBTY2FsZSBmcm9tIEhBTCBzYW1wbGUgcmF0ZSB0byBhcHBsaWNhdGlvbiByYXRlLgogICAgICpmcmFtZXMgPSBtUmVuZGVyUG9zaXRpb24gLyBtUmF0ZU11bHRpcGxpZXI7CkBAIC0xODcsNiArMTkyLDcgQEAKIGludCBBdWRpb1N0cmVhbU91dDo6Zmx1c2goKQogewogICAgIG1SZW5kZXJQb3NpdGlvbiA9IDA7CisgICAgbUV4cGVjdFJldHJvZ3JhZGUgPSBmYWxzZTsKICAgICBtRnJhbWVzV3JpdHRlbiA9IDA7CiAgICAgbUZyYW1lc1dyaXR0ZW5BdFN0YW5kYnkgPSAwOwogICAgIHN0YXR1c190IHJlc3VsdCA9IHN0cmVhbS0+Zmx1c2goKTsKQEAgLTE5Niw2ICsyMDIsNyBAQAogaW50IEF1ZGlvU3RyZWFtT3V0OjpzdGFuZGJ5KCkKIHsKICAgICBtUmVuZGVyUG9zaXRpb24gPSAwOworICAgIG1FeHBlY3RSZXRyb2dyYWRlID0gZmFsc2U7CiAgICAgbUZyYW1lc1dyaXR0ZW5BdFN0YW5kYnkgPSBtRnJhbWVzV3JpdHRlbjsKICAgICByZXR1cm4gc3RyZWFtLT5zdGFuZGJ5KCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5oCmluZGV4IDU2NWY0M2EuLjgyZmUyMzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5oCkBAIC05MywxMyArOTMsMjEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CiAKKyAgICAvLyBBdm9pZCBzdXBwcmVzc2luZyByZXRyb2dyYWRlIG1vdGlvbiBpbiBtUmVuZGVyUG9zaXRpb24gZm9yIGdhcGxlc3Mgb2ZmbG9hZC9kaXJlY3Qgd2hlbgorICAgIC8vIHRyYW5zaXRpb25pbmcgYmV0d2VlbiB0cmFja3MuCisgICAgLy8gVGhlIEhBTCByZXNldHMgdGhlIGZyYW1lIHBvc2l0aW9uIHdpdGhvdXQgZmx1c2gvc3RvcCBiZWluZyBjYWxsZWQsIGJ1dCBjYWxscyBiYWNrIHByaW9yIHRvCisgICAgLy8gdGhpcyBldmVudC4gU28sIG9uIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgcmV0cm9ncmFkZSBtb3Rpb24sIHdlIHBlcm1pdCBiYWNrd2FyZHMgbW92ZW1lbnQgb2YKKyAgICAvLyBtUmVuZGVyUG9zaXRpb24uCisgICAgdmlydHVhbCB2b2lkIHByZXNlbnRhdGlvbkNvbXBsZXRlKCkgeyBtRXhwZWN0UmV0cm9ncmFkZSA9IHRydWU7IH0KKwogcHJvdGVjdGVkOgogICAgIHVpbnQ2NF90ICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuOyAvLyByZXNldCBieSBmbHVzaAogICAgIHVpbnQ2NF90ICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuQXRTdGFuZGJ5OwotICAgIHVpbnQ2NF90ICAgICAgICAgICAgIG1SZW5kZXJQb3NpdGlvbjsgLy8gcmVzZXQgYnkgZmx1c2ggb3Igc3RhbmRieQorICAgIHVpbnQ2NF90ICAgICAgICAgICAgIG1SZW5kZXJQb3NpdGlvbjsgLy8gcmVzZXQgYnkgZmx1c2gsIHN0YW5kYnksIG9yIHByZXNlbnRhdGlvbiBjb21wbGV0ZQogICAgIGludCAgICAgICAgICAgICAgICAgIG1SYXRlTXVsdGlwbGllcjsKICAgICBib29sICAgICAgICAgICAgICAgICBtSGFsRm9ybWF0SGFzUHJvcG9ydGlvbmFsRnJhbWVzOwogICAgIHNpemVfdCAgICAgICAgICAgICAgIG1IYWxGcmFtZVNpemU7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgbUV4cGVjdFJldHJvZ3JhZGU7IC8vIHNlZSBwcmVzZW50YXRpb25Db21wbGV0ZQogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuY3BwCmluZGV4IGNlY2Q1MmIuLjUzYWM1Y2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9EZXZpY2VFZmZlY3RNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRGV2aWNlRWZmZWN0TWFuYWdlci5jcHAKQEAgLTc3LDcgKzc3LDggQEAKICAgICAgICAgY29uc3Qgc3RkOjptYXA8YXVkaW9fcGF0Y2hfaGFuZGxlX3QsIFBhdGNoUGFuZWw6OlBhdGNoPiYgcGF0Y2hlcywKICAgICAgICAgaW50ICplbmFibGVkLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAotICAgICAgICBib29sIHByb2JlKSB7CisgICAgICAgIGJvb2wgcHJvYmUsCisgICAgICAgIGJvb2wgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKSB7CiAgICAgc3A8RGV2aWNlRWZmZWN0UHJveHk+IGVmZmVjdDsKICAgICBzcDxFZmZlY3RIYW5kbGU+IGhhbmRsZTsKICAgICBzdGF0dXNfdCBsU3RhdHVzOwpAQCAtOTUsMTAgKzk2LDEyIEBACiAgICAgICAgICAgICBlZmZlY3QgPSBpdGVyLT5zZWNvbmQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBlZmZlY3QgPSBuZXcgRGV2aWNlRWZmZWN0UHJveHkoZGV2aWNlLCBtTXlDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciwgbUF1ZGlvRmxpbmdlci5uZXh0VW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9FRkZFQ1QpKTsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciwgbUF1ZGlvRmxpbmdlci5uZXh0VW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9FRkZFQ1QpLAorICAgICAgICAgICAgICAgICAgICBub3RpZnlGcmFtZXNQcm9jZXNzZWQpOwogICAgICAgICB9CiAgICAgICAgIC8vIGNyZWF0ZSBlZmZlY3QgaGFuZGxlIGFuZCBjb25uZWN0IGl0IHRvIGVmZmVjdCBtb2R1bGUKLSAgICAgICAgaGFuZGxlID0gbmV3IEVmZmVjdEhhbmRsZShlZmZlY3QsIGNsaWVudCwgZWZmZWN0Q2xpZW50LCAwIC8qcHJpb3JpdHkqLyk7CisgICAgICAgIGhhbmRsZSA9IG5ldyBFZmZlY3RIYW5kbGUoZWZmZWN0LCBjbGllbnQsIGVmZmVjdENsaWVudCwgMCAvKnByaW9yaXR5Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKTsKICAgICAgICAgbFN0YXR1cyA9IGhhbmRsZS0+aW5pdENoZWNrKCk7CiAgICAgICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBsU3RhdHVzID0gZWZmZWN0LT5hZGRIYW5kbGUoaGFuZGxlLmdldCgpKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9EZXZpY2VFZmZlY3RNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRGV2aWNlRWZmZWN0TWFuYWdlci5oCmluZGV4IGEwNWY1ZmUuLmQyZmFhNzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9EZXZpY2VFZmZlY3RNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuaApAQCAtMzcsNyArMzcsOCBAQAogICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBQYXRjaFBhbmVsOjpQYXRjaD4mIHBhdGNoZXMsCiAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkLAogICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCi0gICAgICAgICAgICAgICAgYm9vbCBwcm9iZSk7CisgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSwKKyAgICAgICAgICAgICAgICBib29sIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCk7CiAgICAgdm9pZCBjcmVhdGVBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwgY29uc3QgUGF0Y2hQYW5lbDo6UGF0Y2gmIHBhdGNoKTsKICAgICB2b2lkIHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CiAKQEAgLTE2MSwxMCArMTYyLDE2IEBACiAgICAgYm9vbCBpc09mZmxvYWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogICAgIGJvb2wgaXNPZmZsb2FkT3JEaXJlY3QoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogICAgIGJvb2wgaXNPZmZsb2FkT3JNbWFwKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGlzU3BhdGlhbGl6ZXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogCiAgICAgdWludDMyX3QgIHNhbXBsZVJhdGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAwOyB9Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7IH0KLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAwOyB9CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5DaGFubmVsTWFzayhpbnQgaWQgX191bnVzZWQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICB9CisgICAgdWludDMyX3QgaW5DaGFubmVsQ291bnQoaW50IGlkIF9fdW51c2VkKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAwOyB9CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0Q2hhbm5lbE1hc2soKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7IH0KKyAgICB1aW50MzJfdCBvdXRDaGFubmVsQ291bnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAwOyB9CisKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBoYXB0aWNDaGFubmVsTWFzaygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEFVRElPX0NIQU5ORUxfTk9ORTsgfQogICAgIHNpemVfdCAgICBmcmFtZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGUgIHsgcmV0dXJuIDA7IH0KICAgICB1aW50MzJfdCAgbGF0ZW5jeSgpIGNvbnN0IG92ZXJyaWRlICB7IHJldHVybiAwOyB9CkBAIC0xOTAsNiArMTk3LDEwIEBACiAKICAgICB3cDxFZmZlY3RDaGFpbj4gY2hhaW4oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9CiAKKyAgICBib29sIGlzQXVkaW9Qb2xpY3lSZWFkeSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1NYW5hZ2VyLmF1ZGlvRmxpbmdlcigpLmlzQXVkaW9Qb2xpY3lSZWFkeSgpOworICAgIH0KKwogICAgIGludCBuZXdFZmZlY3RJZCgpIHsgcmV0dXJuIG1NYW5hZ2VyLmF1ZGlvRmxpbmdlcigpLm5leHRVbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX0VGRkVDVCk7IH0KIAogICAgIHN0YXR1c190IGFkZEVmZmVjdFRvSGFsKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKaW5kZXggYjI2N2Q4OC4uZTZkN2NmNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcApAQCAtMjQsOSArMjQsMTEgQEAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X2FlYy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9kb3dubWl4Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X2R5bmFtaWNzcHJvY2Vzc2luZy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9oYXB0aWNnZW5lcmF0b3IuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3Rfc3BhdGlhbGl6ZXIuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlzdWFsaXplci5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgpAQCAtMzcsNyArMzksOSBAQAogI2luY2x1ZGUgPG1lZGlhL1NobWVtQ29tcGF0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL01ldGhvZFN0YXRpc3RpY3MuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1RpbWVDaGVjay5oPgogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCiAKQEAgLTI0Miw2ICsyNDYsMTIgQEAKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgICAgICBpZiAoKGlzSW50ZXJuYWxfbCgpICYmICFtUG9saWN5UmVnaXN0ZXJlZCkKKyAgICAgICAgICAgICAgICB8fCAhZ2V0Q2FsbGJhY2soKS0+aXNBdWRpb1BvbGljeVJlYWR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIHJlZ2lzdGVyIGVmZmVjdCB3aGVuIGZpcnN0IGhhbmRsZSBpcyBhdHRhY2hlZCBhbmQgdW5yZWdpc3RlciB3aGVuIGxhc3QgaGFuZGxlIGlzIHJlbW92ZWQKICAgICAgICAgaWYgKG1Qb2xpY3lSZWdpc3RlcmVkICE9IG1IYW5kbGVzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgIGRvUmVnaXN0ZXIgPSB0cnVlOwpAQCAtNjQyLDYgKzY1MiwxMyBAQAogICAgICAgICAgICAgbVN0YXRlID0gSURMRTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFDVElWRToKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGFuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKCFtSGFuZGxlc1tpXS0+ZGlzY29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlc1tpXS0+ZnJhbWVzUHJvY2Vzc2VkKG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6IC8vSURMRSAsIEFDVElWRSwgREVTVFJPWUVECiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTg3NSw5ICs4OTIsOSBAQAogICAgIC8vIHNpbWlsYXIgdG8gb3V0cHV0IEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUL1JFUExBQ0UsCiAgICAgLy8gaW4gd2hpY2ggY2FzZSBpbnB1dCBjaGFubmVsIG1hc2tzIHNob3VsZCBiZSB1c2VkIGhlcmUuCiAgICAgY2FsbGJhY2sgPSBnZXRDYWxsYmFjaygpOwotICAgIGNoYW5uZWxNYXNrID0gY2FsbGJhY2stPmNoYW5uZWxNYXNrKCk7CisgICAgY2hhbm5lbE1hc2sgPSBjYWxsYmFjay0+aW5DaGFubmVsTWFzayhtSWQpOwogICAgIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBjaGFubmVsTWFzazsKLSAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IGNoYW5uZWxNYXNrOworICAgIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gY2FsbGJhY2stPm91dENoYW5uZWxNYXNrKCk7CiAKICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewogICAgICAgICBpZiAobUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9NT05PKSB7CkBAIC05NDAsMTEgKzk1Nyw3IEBACiAgICAgLy8gQXV4aWxpYXJ5IGVmZmVjdDoKICAgICAvLyAgICAgIGFjY3VtdWxhdGVzIGluIG91dHB1dCBidWZmZXI6IGlucHV0IGJ1ZmZlciAhPSBvdXRwdXQgYnVmZmVyCiAgICAgLy8gVGhlcmVmb3JlOiBhY2N1bXVsYXRlIDw9PiBpbnB1dCBidWZmZXIgIT0gb3V0cHV0IGJ1ZmZlcgotICAgIGlmIChtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgIT0gbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdykgewotICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7Ci0gICAgfQorICAgIG1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSByZXF1aXJlZEVmZmVjdEJ1ZmZlckFjY2Vzc01vZGUoKTsKICAgICBtQ29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBtQ29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCA9IGNhbGxiYWNrLT5mcmFtZUNvdW50KCk7CkBAIC0xNjAwLDcgKzE2MTMsNyBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzZXRWaWJyYXRvckluZm8oY29uc3QgbWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvKiB2aWJyYXRvckluZm8pCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0VmlicmF0b3JJbmZvKGNvbnN0IG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbyYgdmlicmF0b3JJbmZvKQogewogICAgIGlmIChtU3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBtU3RhdHVzOwpAQCAtMTYxMCwxNSArMTYyMywxNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgY29uc3Qgc2l6ZV90IHBhcmFtQ291bnQgPSAzOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3QoCi0gICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpICsgMiAqIHNpemVvZihmbG9hdCkpOworICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSArIHBhcmFtQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKICAgICBlZmZlY3RfcGFyYW1fdCAqcGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QqKSByZXF1ZXN0LmRhdGEoKTsKICAgICBwYXJhbS0+cHNpemUgPSBzaXplb2YoaW50MzJfdCk7Ci0gICAgcGFyYW0tPnZzaXplID0gMiAqIHNpemVvZihmbG9hdCk7CisgICAgcGFyYW0tPnZzaXplID0gcGFyYW1Db3VudCAqIHNpemVvZihmbG9hdCk7CiAgICAgKihpbnQzMl90KilwYXJhbS0+ZGF0YSA9IEhHX1BBUkFNX1ZJQlJBVE9SX0lORk87CiAgICAgZmxvYXQqIHZpYnJhdG9ySW5mb1B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihwYXJhbS0+ZGF0YSArIHNpemVvZihpbnQzMl90KSk7Ci0gICAgdmlicmF0b3JJbmZvUHRyWzBdID0gdmlicmF0b3JJbmZvLT5yZXNvbmFudEZyZXF1ZW5jeTsKLSAgICB2aWJyYXRvckluZm9QdHJbMV0gPSB2aWJyYXRvckluZm8tPnFGYWN0b3I7CisgICAgdmlicmF0b3JJbmZvUHRyWzBdID0gdmlicmF0b3JJbmZvLnJlc29uYW50RnJlcXVlbmN5OworICAgIHZpYnJhdG9ySW5mb1B0clsxXSA9IHZpYnJhdG9ySW5mby5xRmFjdG9yOworICAgIHZpYnJhdG9ySW5mb1B0clsyXSA9IHZpYnJhdG9ySW5mby5tYXhBbXBsaXR1ZGU7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzcG9uc2U7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29tbWFuZChFRkZFQ1RfQ01EX1NFVF9QQVJBTSwgcmVxdWVzdCwgc2l6ZW9mKGludDMyX3QpLCAmcmVzcG9uc2UpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTE3MDgsMTAgKzE3MjMsMTEgQEAKIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpFZmZlY3RIYW5kbGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LCBib29sIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCkKICAgICA6IEJuRWZmZWN0KCksCiAgICAgbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0Q2xpZW50KGVmZmVjdENsaWVudCksIG1DbGllbnQoY2xpZW50KSwgbUNibGsoTlVMTCksCi0gICAgbVByaW9yaXR5KHByaW9yaXR5KSwgbUhhc0NvbnRyb2woZmFsc2UpLCBtRW5hYmxlZChmYWxzZSksIG1EaXNjb25uZWN0ZWQoZmFsc2UpCisgICAgbVByaW9yaXR5KHByaW9yaXR5KSwgbUhhc0NvbnRyb2woZmFsc2UpLCBtRW5hYmxlZChmYWxzZSksIG1EaXNjb25uZWN0ZWQoZmFsc2UpLAorICAgIG1Ob3RpZnlGcmFtZXNQcm9jZXNzZWQobm90aWZ5RnJhbWVzUHJvY2Vzc2VkKQogewogICAgIEFMT0dWKCJjb25zdHJ1Y3RvciAlcCBjbGllbnQgJXAiLCB0aGlzLCBjbGllbnQuZ2V0KCkpOwogCkBAIC0xNzM3LDYgKzE3NTMsNDcgQEAKICAgICBkaXNjb25uZWN0KGZhbHNlKTsKIH0KIAorLy8gQ3JlYXRlcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIEJpbmRlciBjb2RlIHRvIG5hbWUgZm9yIElFZmZlY3QuCisjZGVmaW5lIElFRkZFQ1RfQklOREVSX01FVEhPRF9NQUNST19MSVNUIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZW5hYmxlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGRpc2FibGUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoY29tbWFuZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShkaXNjb25uZWN0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldENibGspIFwKKworLy8gc2luZ2xldG9uIGZvciBCaW5kZXIgTWV0aG9kIFN0YXRpc3RpY3MgZm9yIElFZmZlY3QKK21lZGlhdXRpbHM6Ok1ldGhvZFN0YXRpc3RpY3M8aW50PiYgZ2V0SUVmZmVjdFN0YXRpc3RpY3MoKSB7CisgICAgdXNpbmcgQ29kZSA9IGludDsKKworI3ByYWdtYSBwdXNoX21hY3JvKCJCSU5ERVJfTUVUSE9EX0VOVFJZIikKKyN1bmRlZiBCSU5ERVJfTUVUSE9EX0VOVFJZCisjZGVmaW5lIEJJTkRFUl9NRVRIT0RfRU5UUlkoRU5UUlkpIFwKKyAgICAgICAgeyhDb2RlKW1lZGlhOjpCbkVmZmVjdDo6VFJBTlNBQ1RJT05fIyNFTlRSWSwgI0VOVFJZfSwKKworICAgIHN0YXRpYyBtZWRpYXV0aWxzOjpNZXRob2RTdGF0aXN0aWNzPENvZGU+IG1ldGhvZFN0YXRpc3RpY3N7CisgICAgICAgIElFRkZFQ1RfQklOREVSX01FVEhPRF9NQUNST19MSVNUCisgICAgICAgIE1FVEhPRF9TVEFUSVNUSUNTX0JJTkRFUl9DT0RFX05BTUVTKENvZGUpCisgICAgfTsKKyNwcmFnbWEgcG9wX21hY3JvKCJCSU5ERVJfTUVUSE9EX0VOVFJZIikKKworICAgIHJldHVybiBtZXRob2RTdGF0aXN0aWNzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6b25UcmFuc2FjdCgKKyAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1ldGhvZE5hbWUgPSBnZXRJRWZmZWN0U3RhdGlzdGljcygpLmdldE1ldGhvZEZvckNvZGUoY29kZSk7CisgICAgbWVkaWF1dGlsczo6VGltZUNoZWNrIGNoZWNrKAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoIklFZmZlY3Q6OiIpLmFwcGVuZChtZXRob2ROYW1lKSwKKyAgICAgICAgICAgIFtjb2RlXShib29sIHRpbWVvdXQsIGZsb2F0IGVsYXBzZWRNcykgeworICAgICAgICBpZiAodGltZW91dCkgeworICAgICAgICAgICAgOyAvLyB3ZSBkb24ndCB0aW1lb3V0IHJpZ2h0IG5vdyBvbiB0aGUgZWZmZWN0IGludGVyZmFjZS4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldElFZmZlY3RTdGF0aXN0aWNzKCkuZXZlbnQoY29kZSwgZWxhcHNlZE1zKTsKKyAgICAgICAgfQorICAgIH0sIDAgLyogdGltZW91dE1zICovKTsKKyAgICByZXR1cm4gQm5FZmZlY3Q6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmluaXRDaGVjaygpCiB7CiAgICAgcmV0dXJuIG1DbGllbnQgPT0gMCB8fCBtQ2Jsa01lbW9yeSAhPSAwID8gT0sgOiBOT19NRU1PUlk7CkBAIC0yMDIwLDYgKzIwNzcsMTMgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmZyYW1lc1Byb2Nlc3NlZChpbnQzMl90IGZyYW1lcykgY29uc3QKK3sKKyAgICBpZiAobUVmZmVjdENsaWVudCAhPSAwICYmIG1Ob3RpZnlGcmFtZXNQcm9jZXNzZWQpIHsKKyAgICAgICAgbUVmZmVjdENsaWVudC0+ZnJhbWVzUHJvY2Vzc2VkKGZyYW1lcyk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpkdW1wVG9CdWZmZXIoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKICAgICBib29sIGxvY2tlZCA9IG1DYmxrICE9IE5VTEwgJiYgQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtQ2Jsay0+bG9jayk7CkBAIC0yMDQ4LDExICsyMTEyLDExIEBACiAgICAgICBtTmV3TGVmdFZvbHVtZShVSU5UX01BWCksIG1OZXdSaWdodFZvbHVtZShVSU5UX01BWCksCiAgICAgICBtRWZmZWN0Q2FsbGJhY2sobmV3IEVmZmVjdENhbGxiYWNrKHdwPEVmZmVjdENoYWluPih0aGlzKSwgdGhyZWFkKSkKIHsKLSAgICBtU3RyYXRlZ3kgPSBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX01VU0lDKTsKICAgICBzcDxUaHJlYWRCYXNlPiBwID0gdGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAocCA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgbVN0cmF0ZWd5ID0gcC0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX01VU0lDKTsKICAgICBtTWF4VGFpbEJ1ZmZlcnMgPSAoKGtQcm9jZXNzVGFpbER1cmF0aW9uTXMgKiBwLT5zYW1wbGVSYXRlKCkpIC8gMTAwMCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZnJhbWVDb3VudCgpOwogfQpAQCAtMjEyNSw4ICsyMTg5LDggQEAKICAgICBpZiAobUluQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBjb25zdCBzaXplX3QgZnJhbWVTaXplID0KLSAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoRUZGRUNUX0JVRkZFUl9GT1JNQVQpICogbUVmZmVjdENhbGxiYWNrLT5jaGFubmVsQ291bnQoKTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVTaXplID0gYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShFRkZFQ1RfQlVGRkVSX0ZPUk1BVCkKKyAgICAgICAgICAgICogbUVmZmVjdENhbGxiYWNrLT5pbkNoYW5uZWxDb3VudChtRWZmZWN0c1swXS0+aWQoKSk7CiAKICAgICBtZW1zZXQobUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5yYXcsIDAsIG1FZmZlY3RDYWxsYmFjay0+ZnJhbWVDb3VudCgpICogZnJhbWVTaXplKTsKICAgICBtSW5CdWZmZXItPmNvbW1pdCgpOwpAQCAtMjIxMiwxMSArMjI3Niw5IEBACiAvLyBhZGRFZmZlY3RfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgYW5kIEVmZmVjdENoYWluOjptTG9jayBoZWxkCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjphZGRFZmZlY3RfbGwoY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0KQogewotICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYyA9IGVmZmVjdC0+ZGVzYygpOwotICAgIHVpbnQzMl90IGluc2VydFByZWYgPSBkZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfSU5TRVJUX01BU0s7Ci0KICAgICBlZmZlY3QtPnNldENhbGxiYWNrKG1FZmZlY3RDYWxsYmFjayk7CiAKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSBlZmZlY3QtPmRlc2MoKTsKICAgICBpZiAoKGRlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CiAgICAgICAgIC8vIEF1eGlsaWFyeSBlZmZlY3RzIGFyZSBpbnNlcnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIG1FZmZlY3RzIHZlY3RvciBhcwogICAgICAgICAvLyB0aGV5IGFyZSBwcm9jZXNzZWQgZmlyc3QgYW5kIGFjY3VtdWxhdGVkIGluIGNoYWluIGlucHV0IGJ1ZmZlcgpAQCAtMjIzNiw5NyArMjI5OCwxMzkgQEAKICAgICAgICAgICAgICAgICBudW1TYW1wbGVzICogc2l6ZW9mKGludDMyX3QpLCAmaGFsQnVmZmVyKTsKICNlbmRpZgogICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSByZXR1cm4gcmVzdWx0OworCisgICAgICAgIGVmZmVjdC0+Y29uZmlndXJlKCk7CisKICAgICAgICAgZWZmZWN0LT5zZXRJbkJ1ZmZlcihoYWxCdWZmZXIpOwogICAgICAgICAvLyBhdXhpbGlhcnkgZWZmZWN0cyBvdXRwdXQgc2FtcGxlcyB0byBjaGFpbiBpbnB1dCBidWZmZXIgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZwogICAgICAgICAvLyBieSBpbnNlcnQgZWZmZWN0cwogICAgICAgICBlZmZlY3QtPnNldE91dEJ1ZmZlcihtSW5CdWZmZXIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEluc2VydCBlZmZlY3RzIGFyZSBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIG1FZmZlY3RzIHZlY3RvciBhcyB0aGV5IGFyZSBwcm9jZXNzZWQKLSAgICAgICAgLy8gIGFmdGVyIHRyYWNrIGFuZCBhdXhpbGlhcnkgZWZmZWN0cy4KLSAgICAgICAgLy8gSW5zZXJ0IGVmZmVjdCBvcmRlciBhcyBhIGZ1bmN0aW9uIG9mIGluZGljYXRlZCBwcmVmZXJlbmNlOgotICAgICAgICAvLyAgaWYgRUZGRUNUX0ZMQUdfSU5TRVJUX0VYQ0xVU0lWRSwgaW5zZXJ0IGluIGZpcnN0IHBvc2l0aW9uIG9yIHJlamVjdCBpZgotICAgICAgICAvLyAgYW5vdGhlciBlZmZlY3QgaXMgcHJlc2VudAotICAgICAgICAvLyAgZWxzZSBpZiBFRkZFQ1RfRkxBR19JTlNFUlRfRklSU1QsIGluc2VydCBpbiBmaXJzdCBwb3NpdGlvbiBvciBhZnRlciB0aGUKLSAgICAgICAgLy8gIGxhc3QgZWZmZWN0IGNsYWltaW5nIGZpcnN0IHBvc2l0aW9uCi0gICAgICAgIC8vICBlbHNlIGlmIEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNULCBpbnNlcnQgaW4gbGFzdCBwb3NpdGlvbiBvciBiZWZvcmUgdGhlCi0gICAgICAgIC8vICBmaXJzdCBlZmZlY3QgY2xhaW1pbmcgbGFzdCBwb3NpdGlvbgotICAgICAgICAvLyAgZWxzZSBpZiBFRkZFQ1RfRkxBR19JTlNFUlRfQU5ZIGluc2VydCBhZnRlciBmaXJzdCBvciBiZWZvcmUgbGFzdAotICAgICAgICAvLyBSZWplY3QgaW5zZXJ0aW9uIGlmIGFuIGVmZmVjdCB3aXRoIEVGRkVDVF9GTEFHX0lOU0VSVF9FWENMVVNJVkUgaXMKLSAgICAgICAgLy8gYWxyZWFkeSBwcmVzZW50Ci0KLSAgICAgICAgc2l6ZV90IHNpemUgPSBtRWZmZWN0cy5zaXplKCk7Ci0gICAgICAgIHNpemVfdCBpZHhfaW5zZXJ0ID0gc2l6ZTsKLSAgICAgICAgc3NpemVfdCBpZHhfaW5zZXJ0X2ZpcnN0ID0gLTE7Ci0gICAgICAgIHNzaXplX3QgaWR4X2luc2VydF9sYXN0ID0gLTE7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZCA9IG1FZmZlY3RzW2ldLT5kZXNjKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBpTW9kZSA9IGQuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0s7Ci0gICAgICAgICAgICB1aW50MzJfdCBpUHJlZiA9IGQuZmxhZ3MgJiBFRkZFQ1RfRkxBR19JTlNFUlRfTUFTSzsKLSAgICAgICAgICAgIGlmIChpTW9kZSA9PSBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCkgewotICAgICAgICAgICAgICAgIC8vIGNoZWNrIGludmFsaWQgZWZmZWN0IGNoYWluaW5nIGNvbWJpbmF0aW9ucwotICAgICAgICAgICAgICAgIGlmIChpbnNlcnRQcmVmID09IEVGRkVDVF9GTEFHX0lOU0VSVF9FWENMVVNJVkUgfHwKLSAgICAgICAgICAgICAgICAgICAgaVByZWYgPT0gRUZGRUNUX0ZMQUdfSU5TRVJUX0VYQ0xVU0lWRSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiYWRkRWZmZWN0X2woKSBjb3VsZCBub3QgaW5zZXJ0IGVmZmVjdCAlczogZXhjbHVzaXZlIGNvbmZsaWN0IHdpdGggJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MubmFtZSwgZC5uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyByZW1lbWJlciBwb3NpdGlvbiBvZiBmaXJzdCBpbnNlcnQgZWZmZWN0IGFuZCBieSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgLy8gc2VsZWN0IHRoaXMgYXMgaW5zZXJ0IHBvc2l0aW9uIGZvciBuZXcgZWZmZWN0Ci0gICAgICAgICAgICAgICAgaWYgKGlkeF9pbnNlcnQgPT0gc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpZHhfaW5zZXJ0ID0gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgcG9zaXRpb24gb2YgbGFzdCBpbnNlcnQgZWZmZWN0IGNsYWltaW5nCi0gICAgICAgICAgICAgICAgLy8gZmlyc3QgcG9zaXRpb24KLSAgICAgICAgICAgICAgICBpZiAoaVByZWYgPT0gRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlkeF9pbnNlcnRfZmlyc3QgPSBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyByZW1lbWJlciBwb3NpdGlvbiBvZiBmaXJzdCBpbnNlcnQgZWZmZWN0IGNsYWltaW5nCi0gICAgICAgICAgICAgICAgLy8gbGFzdCBwb3NpdGlvbgotICAgICAgICAgICAgICAgIGlmIChpUHJlZiA9PSBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCAmJgotICAgICAgICAgICAgICAgICAgICBpZHhfaW5zZXJ0X2xhc3QgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWR4X2luc2VydF9sYXN0ID0gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIHNzaXplX3QgaWR4X2luc2VydCA9IGdldEluc2VydEluZGV4KGRlc2MpOworICAgICAgICBpZiAoaWR4X2luc2VydCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogCi0gICAgICAgIC8vIG1vZGlmeSBpZHhfaW5zZXJ0IGZyb20gZmlyc3QgcG9zaXRpb24gaWYgbmVlZGVkCi0gICAgICAgIGlmIChpbnNlcnRQcmVmID09IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUKSB7Ci0gICAgICAgICAgICBpZiAoaWR4X2luc2VydF9sYXN0ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgaWR4X2luc2VydCA9IGlkeF9pbnNlcnRfbGFzdDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWR4X2luc2VydCA9IHNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaWR4X2luc2VydF9maXJzdCAhPSAtMSkgewotICAgICAgICAgICAgICAgIGlkeF9pbnNlcnQgPSBpZHhfaW5zZXJ0X2ZpcnN0ICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFsd2F5cyByZWFkIHNhbXBsZXMgZnJvbSBjaGFpbiBpbnB1dCBidWZmZXIKLSAgICAgICAgZWZmZWN0LT5zZXRJbkJ1ZmZlcihtSW5CdWZmZXIpOwotCi0gICAgICAgIC8vIGlmIGxhc3QgZWZmZWN0IGluIHRoZSBjaGFpbiwgb3V0cHV0IHNhbXBsZXMgdG8gY2hhaW4KLSAgICAgICAgLy8gb3V0cHV0IGJ1ZmZlciwgb3RoZXJ3aXNlIHRvIGNoYWluIGlucHV0IGJ1ZmZlcgotICAgICAgICBpZiAoaWR4X2luc2VydCA9PSBzaXplKSB7Ci0gICAgICAgICAgICBpZiAoaWR4X2luc2VydCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbUVmZmVjdHNbaWR4X2luc2VydC0xXS0+c2V0T3V0QnVmZmVyKG1JbkJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgbUVmZmVjdHNbaWR4X2luc2VydC0xXS0+Y29uZmlndXJlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlZmZlY3QtPnNldE91dEJ1ZmZlcihtT3V0QnVmZmVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVmZmVjdC0+c2V0T3V0QnVmZmVyKG1JbkJ1ZmZlcik7Ci0gICAgICAgIH0KKyAgICAgICAgc2l6ZV90IHByZXZpb3VzU2l6ZSA9IG1FZmZlY3RzLnNpemUoKTsKICAgICAgICAgbUVmZmVjdHMuaW5zZXJ0QXQoZWZmZWN0LCBpZHhfaW5zZXJ0KTsKIAotICAgICAgICBBTE9HVigiYWRkRWZmZWN0X2woKSBlZmZlY3QgJXAsIGFkZGVkIGluIGNoYWluICVwIGF0IHJhbmsgJXp1IiwgZWZmZWN0LmdldCgpLCB0aGlzLAotICAgICAgICAgICAgICAgIGlkeF9pbnNlcnQpOworICAgICAgICBlZmZlY3QtPmNvbmZpZ3VyZSgpOworCisgICAgICAgIC8vIC0gQnkgZGVmYXVsdDoKKyAgICAgICAgLy8gICBBbGwgZWZmZWN0cyByZWFkIHNhbXBsZXMgZnJvbSBjaGFpbiBpbnB1dCBidWZmZXIuCisgICAgICAgIC8vICAgVGhlIGxhc3QgZWZmZWN0IGluIHRoZSBjaGFpbiwgd3JpdGVzIHNhbXBsZXMgdG8gY2hhaW4gb3V0cHV0IGJ1ZmZlciwKKyAgICAgICAgLy8gICBvdGhlcndpc2UgdG8gY2hhaW4gaW5wdXQgYnVmZmVyCisgICAgICAgIC8vIC0gSW4gdGhlIE9VVFBVVF9TVEFHRSBjaGFpbiBvZiBhIHNwYXRpYWxpemVyIG1peGVyIHRocmVhZDoKKyAgICAgICAgLy8gICBUaGUgc3BhdGlhbGl6ZXIgZWZmZWN0IChmaXJzdCBlZmZlY3QpIHJlYWRzIHNhbXBsZXMgZnJvbSB0aGUgaW5wdXQgYnVmZmVyCisgICAgICAgIC8vICAgYW5kIHdyaXRlcyBzYW1wbGVzIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAgICAvLyAgIEFsbCBvdGhlciBlZmZlY3RzIHJlYWQgYW5kIHdyaXRlcyBzYW1wbGVzIHRvIHRoZSBvdXRwdXQgYnVmZmVyCisgICAgICAgIGlmIChtRWZmZWN0Q2FsbGJhY2stPmlzU3BhdGlhbGl6ZXIoKQorICAgICAgICAgICAgICAgICYmIG1TZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UpIHsKKyAgICAgICAgICAgIGVmZmVjdC0+c2V0T3V0QnVmZmVyKG1PdXRCdWZmZXIpOworICAgICAgICAgICAgaWYgKGlkeF9pbnNlcnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1NpemUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1sxXS0+Y29uZmlndXJlKCk7CisgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzWzFdLT5zZXRJbkJ1ZmZlcihtT3V0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNbMV0tPnVwZGF0ZUFjY2Vzc01vZGUoKTsgICAgICAvLyByZWNvbmZpZyBpZiBuZWVlZGVkLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlZmZlY3QtPnNldEluQnVmZmVyKG1JbkJ1ZmZlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVmZmVjdC0+c2V0SW5CdWZmZXIobU91dEJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlZmZlY3QtPnNldEluQnVmZmVyKG1JbkJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoaWR4X2luc2VydCA9PSBwcmV2aW91c1NpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAoaWR4X2luc2VydCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzW2lkeF9pbnNlcnQtMV0tPmNvbmZpZ3VyZSgpOworICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1tpZHhfaW5zZXJ0LTFdLT5zZXRPdXRCdWZmZXIobUluQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNbaWR4X2luc2VydCAtIDFdLT51cGRhdGVBY2Nlc3NNb2RlKCk7ICAgICAgLy8gcmVjb25maWcgaWYgbmVlZWRlZC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWZmZWN0LT5zZXRPdXRCdWZmZXIobU91dEJ1ZmZlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVmZmVjdC0+c2V0T3V0QnVmZmVyKG1JbkJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVzIGVmZmVjdCAlcCwgYWRkZWQgaW4gY2hhaW4gJXAgYXQgcmFuayAlenUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBlZmZlY3QuZ2V0KCksIHRoaXMsIGlkeF9pbnNlcnQpOwogICAgIH0KICAgICBlZmZlY3QtPmNvbmZpZ3VyZSgpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmdldEluc2VydEluZGV4KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QmIGRlc2MpIHsKKyAgICAvLyBJbnNlcnQgZWZmZWN0cyBhcmUgaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiBtRWZmZWN0cyB2ZWN0b3IgYXMgdGhleSBhcmUgcHJvY2Vzc2VkCisgICAgLy8gIGFmdGVyIHRyYWNrIGFuZCBhdXhpbGlhcnkgZWZmZWN0cy4KKyAgICAvLyBJbnNlcnQgZWZmZWN0IG9yZGVyIGFzIGEgZnVuY3Rpb24gb2YgaW5kaWNhdGVkIHByZWZlcmVuY2U6CisgICAgLy8gIGlmIEVGRkVDVF9GTEFHX0lOU0VSVF9FWENMVVNJVkUsIGluc2VydCBpbiBmaXJzdCBwb3NpdGlvbiBvciByZWplY3QgaWYKKyAgICAvLyAgYW5vdGhlciBlZmZlY3QgaXMgcHJlc2VudAorICAgIC8vICBlbHNlIGlmIEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCwgaW5zZXJ0IGluIGZpcnN0IHBvc2l0aW9uIG9yIGFmdGVyIHRoZQorICAgIC8vICBsYXN0IGVmZmVjdCBjbGFpbWluZyBmaXJzdCBwb3NpdGlvbgorICAgIC8vICBlbHNlIGlmIEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNULCBpbnNlcnQgaW4gbGFzdCBwb3NpdGlvbiBvciBiZWZvcmUgdGhlCisgICAgLy8gIGZpcnN0IGVmZmVjdCBjbGFpbWluZyBsYXN0IHBvc2l0aW9uCisgICAgLy8gIGVsc2UgaWYgRUZGRUNUX0ZMQUdfSU5TRVJUX0FOWSBpbnNlcnQgYWZ0ZXIgZmlyc3Qgb3IgYmVmb3JlIGxhc3QKKyAgICAvLyBSZWplY3QgaW5zZXJ0aW9uIGlmIGFuIGVmZmVjdCB3aXRoIEVGRkVDVF9GTEFHX0lOU0VSVF9FWENMVVNJVkUgaXMKKyAgICAvLyBhbHJlYWR5IHByZXNlbnQKKyAgICAvLyBTcGF0aWFsaXplciBvciBEb3dubWl4ZXIgZWZmZWN0cyBhcmUgaW5zZXJ0ZWQgaW4gZmlyc3QgcG9zaXRpb24gYmVjYXVzZQorICAgIC8vIHRoZXkgYWRhcHQgdGhlIGNoYW5uZWwgY291bnQgZm9yIGFsbCBvdGhlciBlZmZlY3RzIGluIHRoZSBjaGFpbgorICAgIGlmICgobWVtY21wKCZkZXNjLnR5cGUsIEZYX0lJRF9TUEFUSUFMSVpFUiwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKQorICAgICAgICAgICAgfHwgKG1lbWNtcCgmZGVzYy50eXBlLCBFRkZFQ1RfVUlJRF9ET1dOTUlYLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHNpemVfdCBzaXplID0gbUVmZmVjdHMuc2l6ZSgpOworICAgIHVpbnQzMl90IGluc2VydFByZWYgPSBkZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfSU5TRVJUX01BU0s7CisgICAgc3NpemVfdCBpZHhfaW5zZXJ0OworICAgIHNzaXplX3QgaWR4X2luc2VydF9maXJzdCA9IC0xOworICAgIHNzaXplX3QgaWR4X2luc2VydF9sYXN0ID0gLTE7CisKKyAgICBpZHhfaW5zZXJ0ID0gc2l6ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGQgPSBtRWZmZWN0c1tpXS0+ZGVzYygpOworICAgICAgICB1aW50MzJfdCBpTW9kZSA9IGQuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0s7CisgICAgICAgIHVpbnQzMl90IGlQcmVmID0gZC5mbGFncyAmIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLOworICAgICAgICBpZiAoaU1vZGUgPT0gRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQpIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIGludmFsaWQgZWZmZWN0IGNoYWluaW5nIGNvbWJpbmF0aW9ucworICAgICAgICAgICAgaWYgKGluc2VydFByZWYgPT0gRUZGRUNUX0ZMQUdfSU5TRVJUX0VYQ0xVU0lWRSB8fAorICAgICAgICAgICAgICAgIGlQcmVmID09IEVGRkVDVF9GTEFHX0lOU0VSVF9FWENMVVNJVkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMgY291bGQgbm90IGluc2VydCBlZmZlY3QgJXM6IGV4Y2x1c2l2ZSBjb25mbGljdCB3aXRoICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjLm5hbWUsIGQubmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcmVtZW1iZXIgcG9zaXRpb24gb2YgZmlyc3QgaW5zZXJ0IGVmZmVjdCBhbmQgYnkgZGVmYXVsdAorICAgICAgICAgICAgLy8gc2VsZWN0IHRoaXMgYXMgaW5zZXJ0IHBvc2l0aW9uIGZvciBuZXcgZWZmZWN0CisgICAgICAgICAgICBpZiAoaWR4X2luc2VydCA9PSBzaXplKSB7CisgICAgICAgICAgICAgICAgaWR4X2luc2VydCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZW1lbWJlciBwb3NpdGlvbiBvZiBsYXN0IGluc2VydCBlZmZlY3QgY2xhaW1pbmcKKyAgICAgICAgICAgIC8vIGZpcnN0IHBvc2l0aW9uCisgICAgICAgICAgICBpZiAoaVByZWYgPT0gRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUKSB7CisgICAgICAgICAgICAgICAgaWR4X2luc2VydF9maXJzdCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZW1lbWJlciBwb3NpdGlvbiBvZiBmaXJzdCBpbnNlcnQgZWZmZWN0IGNsYWltaW5nCisgICAgICAgICAgICAvLyBsYXN0IHBvc2l0aW9uCisgICAgICAgICAgICBpZiAoaVByZWYgPT0gRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QgJiYKKyAgICAgICAgICAgICAgICBpZHhfaW5zZXJ0X2xhc3QgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpZHhfaW5zZXJ0X2xhc3QgPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gbW9kaWZ5IGlkeF9pbnNlcnQgZnJvbSBmaXJzdCBwb3NpdGlvbiBpZiBuZWVkZWQKKyAgICBpZiAoaW5zZXJ0UHJlZiA9PSBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCkgeworICAgICAgICBpZiAoaWR4X2luc2VydF9sYXN0ICE9IC0xKSB7CisgICAgICAgICAgICBpZHhfaW5zZXJ0ID0gaWR4X2luc2VydF9sYXN0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWR4X2luc2VydCA9IHNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaWR4X2luc2VydF9maXJzdCAhPSAtMSkgeworICAgICAgICAgICAgaWR4X2luc2VydCA9IGlkeF9pbnNlcnRfZmlyc3QgKyAxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpZHhfaW5zZXJ0OworfQorCiAvLyByZW1vdmVFZmZlY3RfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OnJlbW92ZUVmZmVjdF9sKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlbGVhc2UpCkBAIC0yMzUwLDE0ICsyNDU0LDIzIEBACiAKICAgICAgICAgICAgIGlmICh0eXBlICE9IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CiAgICAgICAgICAgICAgICAgaWYgKGkgPT0gc2l6ZSAtIDEgJiYgaSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzW2kgLSAxXS0+c2V0T3V0QnVmZmVyKG1PdXRCdWZmZXIpOwogICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1tpIC0gMV0tPmNvbmZpZ3VyZSgpOworICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1tpIC0gMV0tPnNldE91dEJ1ZmZlcihtT3V0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNbaSAtIDFdLT51cGRhdGVBY2Nlc3NNb2RlKCk7ICAgICAgLy8gcmVjb25maWcgaWYgbmVlZWRlZC4KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtRWZmZWN0cy5yZW1vdmVBdChpKTsKKworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBpbnB1dCBidWZmZXIgY29uZmlndXJhdGlvbiBmb3IgdGhlIG5ldyBmaXJzdCBlZmZlY3QgaW4gdGhlIGNoYWluCisgICAgICAgICAgICAvLyBpcyB1cGRhdGVkIGlmIG5lZWRlZCAoY2FuIHN3aXRjaCBmcm9tIEhBTCBjaGFubmVsIG1hc2sgdG8gbWl4ZXIgY2hhbm5lbCBtYXNrKQorICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBzaXplID4gMSkgeworICAgICAgICAgICAgICAgIG1FZmZlY3RzWzBdLT5jb25maWd1cmUoKTsKKyAgICAgICAgICAgICAgICBtRWZmZWN0c1swXS0+c2V0SW5CdWZmZXIobUluQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBtRWZmZWN0c1swXS0+dXBkYXRlQWNjZXNzTW9kZSgpOyAgICAgIC8vIHJlY29uZmlnIGlmIG5lZWVkZWQuCisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIEFMT0dWKCJyZW1vdmVFZmZlY3RfbCgpIGVmZmVjdCAlcCwgcmVtb3ZlZCBmcm9tIGNoYWluICVwIGF0IHJhbmsgJXp1IiwgZWZmZWN0LmdldCgpLAogICAgICAgICAgICAgICAgICAgICB0aGlzLCBpKTsKLQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0yOTAxLDI3ICszMDE0LDI2IEBACiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmlzT2ZmbG9hZCgpIGNvbnN0IHsKLSAgICBzcDxUaHJlYWRCYXNlPiB0ID0gdGhyZWFkKCkucHJvbW90ZSgpOwotICAgIGlmICh0ID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok9GRkxPQUQ7CisgICAgcmV0dXJuIG1UaHJlYWRUeXBlID09IFRocmVhZEJhc2U6Ok9GRkxPQUQ7CiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmlzT2ZmbG9hZE9yRGlyZWN0KCkgY29uc3QgewotICAgIHNwPFRocmVhZEJhc2U+IHQgPSB0aHJlYWQoKS5wcm9tb3RlKCk7Ci0gICAgaWYgKHQgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0LT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6T0ZGTE9BRCB8fCB0LT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RElSRUNUOworICAgIHJldHVybiBtVGhyZWFkVHlwZSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEIHx8IG1UaHJlYWRUeXBlID09IFRocmVhZEJhc2U6OkRJUkVDVDsKIH0KIAogYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6aXNPZmZsb2FkT3JNbWFwKCkgY29uc3QgewotICAgIHNwPFRocmVhZEJhc2U+IHQgPSB0aHJlYWQoKS5wcm9tb3RlKCk7Ci0gICAgaWYgKHQgPT0gbnVsbHB0cikgeworICAgIHN3aXRjaCAobVRocmVhZFR5cGUpIHsKKyAgICBjYXNlIFRocmVhZEJhc2U6Ok9GRkxPQUQ6CisgICAgY2FzZSBUaHJlYWRCYXNlOjpNTUFQX1BMQVlCQUNLOgorICAgIGNhc2UgVGhyZWFkQmFzZTo6TU1BUF9DQVBUVVJFOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiB0LT5pc09mZmxvYWRPck1tYXAoKTsKK30KKworYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6aXNTcGF0aWFsaXplcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRocmVhZFR5cGUgPT0gVGhyZWFkQmFzZTo6U1BBVElBTElaRVI7CiB9CiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjpzYW1wbGVSYXRlKCkgY29uc3QgewpAQCAtMjkzMiwyMCArMzA0NCw2OCBAQAogICAgIHJldHVybiB0LT5zYW1wbGVSYXRlKCk7CiB9CiAKLWF1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjpjaGFubmVsTWFzaygpIGNvbnN0IHsKK2F1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjppbkNoYW5uZWxNYXNrKGludCBpZCkgY29uc3QgewogICAgIHNwPFRocmVhZEJhc2U+IHQgPSB0aHJlYWQoKS5wcm9tb3RlKCk7CiAgICAgaWYgKHQgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOwogICAgIH0KLSAgICByZXR1cm4gdC0+Y2hhbm5lbE1hc2soKTsKKyAgICBzcDxFZmZlY3RDaGFpbj4gYyA9IGNoYWluKCkucHJvbW90ZSgpOworICAgIGlmIChjID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICB9CisKKyAgICBpZiAobVRocmVhZFR5cGUgPT0gVGhyZWFkQmFzZTo6U1BBVElBTElaRVIpIHsKKyAgICAgICAgaWYgKGMtPnNlc3Npb25JZCgpID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKSB7CisgICAgICAgICAgICBpZiAoYy0+aXNGaXJzdEVmZmVjdChpZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdC0+bWl4ZXJDaGFubmVsTWFzaygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdC0+Y2hhbm5lbE1hc2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghYXVkaW9faXNfZ2xvYmFsX3Nlc3Npb24oYy0+c2Vzc2lvbklkKCkpKSB7CisgICAgICAgICAgICBpZiAoKHQtPmhhc0F1ZGlvU2Vzc2lvbl9sKGMtPnNlc3Npb25JZCgpKSAmIFRocmVhZEJhc2U6OlNQQVRJQUxJWkVEX1NFU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdC0+bWl4ZXJDaGFubmVsTWFzaygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdC0+Y2hhbm5lbE1hc2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0LT5jaGFubmVsTWFzaygpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHQtPmNoYW5uZWxNYXNrKCk7CisgICAgfQogfQogCi11aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6Y2hhbm5lbENvdW50KCkgY29uc3QgewordWludDMyX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmluQ2hhbm5lbENvdW50KGludCBpZCkgY29uc3QgeworICAgIHJldHVybiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soaW5DaGFubmVsTWFzayhpZCkpOworfQorCithdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6b3V0Q2hhbm5lbE1hc2soKSBjb25zdCB7CiAgICAgc3A8VGhyZWFkQmFzZT4gdCA9IHRocmVhZCgpLnByb21vdGUoKTsKICAgICBpZiAodCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOwogICAgIH0KLSAgICByZXR1cm4gdC0+Y2hhbm5lbENvdW50KCk7CisgICAgc3A8RWZmZWN0Q2hhaW4+IGMgPSBjaGFpbigpLnByb21vdGUoKTsKKyAgICBpZiAoYyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7CisgICAgfQorCisgICAgaWYgKG1UaHJlYWRUeXBlID09IFRocmVhZEJhc2U6OlNQQVRJQUxJWkVSKSB7CisgICAgICAgIGlmICghYXVkaW9faXNfZ2xvYmFsX3Nlc3Npb24oYy0+c2Vzc2lvbklkKCkpKSB7CisgICAgICAgICAgICBpZiAoKHQtPmhhc0F1ZGlvU2Vzc2lvbl9sKGMtPnNlc3Npb25JZCgpKSAmIFRocmVhZEJhc2U6OlNQQVRJQUxJWkVEX1NFU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdC0+bWl4ZXJDaGFubmVsTWFzaygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdC0+Y2hhbm5lbE1hc2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0LT5jaGFubmVsTWFzaygpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHQtPmNoYW5uZWxNYXNrKCk7CisgICAgfQorfQorCit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6b3V0Q2hhbm5lbENvdW50KCkgY29uc3QgeworICAgIHJldHVybiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0Q2hhbm5lbE1hc2soKSk7CiB9CiAKIGF1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjpoYXB0aWNDaGFubmVsTWFzaygpIGNvbnN0IHsKQEAgLTMxNDMsNyArMzMwMywxMCBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUhhbEVmZmVjdC0+c2V0RGV2aWNlcyh7bURldmljZX0pOwogICAgICAgICB9Ci0gICAgICAgICpoYW5kbGUgPSBuZXcgRWZmZWN0SGFuZGxlKG1IYWxFZmZlY3QsIG51bGxwdHIsIG51bGxwdHIsIDAgLypwcmlvcml0eSovKTsKKyAgICAgICAgbUhhbEVmZmVjdC0+Y29uZmlndXJlKCk7CisKKyAgICAgICAgKmhhbmRsZSA9IG5ldyBFZmZlY3RIYW5kbGUobUhhbEVmZmVjdCwgbnVsbHB0ciwgbnVsbHB0ciwgMCAvKnByaW9yaXR5Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZnlGcmFtZXNQcm9jZXNzZWQpOwogICAgICAgICBzdGF0dXMgPSAoKmhhbmRsZSktPmluaXRDaGVjaygpOwogICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CiAgICAgICAgICAgICBzdGF0dXMgPSBtSGFsRWZmZWN0LT5hZGRIYW5kbGUoKCpoYW5kbGUpLmdldCgpKTsKQEAgLTMxNjksNyArMzMzMiw4IEBACiAgICAgICAgIGludCBlbmFibGVkOwogICAgICAgICAqaGFuZGxlID0gdGhyZWFkLT5jcmVhdGVFZmZlY3RfbChudWxscHRyLCBudWxscHRyLCAwLCBBVURJT19TRVNTSU9OX0RFVklDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxlZmZlY3RfZGVzY3JpcHRvcl90ICo+KCZtRGVzY3JpcHRvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVkLCAmc3RhdHVzLCBmYWxzZSwgZmFsc2UgLypwcm9iZSovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZWQsICZzdGF0dXMsIGZhbHNlLCBmYWxzZSAvKnByb2JlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZnlGcmFtZXNQcm9jZXNzZWQpOwogICAgICAgICBBTE9HVigiJXMgdGhyZWFkLT5jcmVhdGVFZmZlY3RfbCBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICB9IGVsc2UgewogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CkBAIC0zMTg5LDggKzMzNTMsMTQgQEAKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpvblJlbGVhc2VQYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtUHJveHlMb2NrKTsKLSAgICBtRWZmZWN0SGFuZGxlcy5lcmFzZShwYXRjaEhhbmRsZSk7CisgICAgc3A8RWZmZWN0SGFuZGxlPiBlZmZlY3Q7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVByb3h5TG9jayk7CisgICAgICAgIGlmIChtRWZmZWN0SGFuZGxlcy5maW5kKHBhdGNoSGFuZGxlKSAhPSBtRWZmZWN0SGFuZGxlcy5lbmQoKSkgeworICAgICAgICAgICAgZWZmZWN0ID0gbUVmZmVjdEhhbmRsZXMuYXQocGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgbUVmZmVjdEhhbmRsZXMuZXJhc2UocGF0Y2hIYW5kbGUpOworICAgICAgICB9CisgICAgfQogfQogCiAKQEAgLTMxOTgsNiArMzM2OCw3IEBACiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Qcm94eUxvY2spOwogICAgIGlmIChlZmZlY3QgPT0gbUhhbEVmZmVjdCkgeworICAgICAgICBtSGFsRWZmZWN0LT5yZWxlYXNlX2woKTsKICAgICAgICAgbUhhbEVmZmVjdC5jbGVhcigpOwogICAgICAgICBtRGV2aWNlUG9ydC5pZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgfQpAQCAtMzM0NSw3ICszNTE2LDcgQEAKICAgICBpZiAocHJveHkgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIHByb3h5LT5hZGRFZmZlY3RUb0hhbChlZmZlY3QpOworICAgIHJldHVybiBwcm94eS0+cmVtb3ZlRWZmZWN0RnJvbUhhbChlZmZlY3QpOwogfQogCiBib29sIEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0UHJveHk6OlByb3h5Q2FsbGJhY2s6OmlzT3V0cHV0KCkgY29uc3QgewpAQCAtMzM2NCw3ICszNTM1LDggQEAKICAgICByZXR1cm4gcHJveHktPnNhbXBsZVJhdGUoKTsKIH0KIAotYXVkaW9fY2hhbm5lbF9tYXNrX3QgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RQcm94eTo6UHJveHlDYWxsYmFjazo6Y2hhbm5lbE1hc2soKSBjb25zdCB7CithdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpQcm94eUNhbGxiYWNrOjppbkNoYW5uZWxNYXNrKAorICAgICAgICBpbnQgaWQgX191bnVzZWQpIGNvbnN0IHsKICAgICBzcDxEZXZpY2VFZmZlY3RQcm94eT4gcHJveHkgPSBtUHJveHkucHJvbW90ZSgpOwogICAgIGlmIChwcm94eSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CkBAIC0zMzcyLDcgKzM1NDQsNyBAQAogICAgIHJldHVybiBwcm94eS0+Y2hhbm5lbE1hc2soKTsKIH0KIAotdWludDMyX3QgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RQcm94eTo6UHJveHlDYWxsYmFjazo6Y2hhbm5lbENvdW50KCkgY29uc3QgewordWludDMyX3QgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RQcm94eTo6UHJveHlDYWxsYmFjazo6aW5DaGFubmVsQ291bnQoaW50IGlkIF9fdW51c2VkKSBjb25zdCB7CiAgICAgc3A8RGV2aWNlRWZmZWN0UHJveHk+IHByb3h5ID0gbVByb3h5LnByb21vdGUoKTsKICAgICBpZiAocHJveHkgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gMjsKQEAgLTMzODAsNCArMzU1MiwzOCBAQAogICAgIHJldHVybiBwcm94eS0+Y2hhbm5lbENvdW50KCk7CiB9CiAKK2F1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0UHJveHk6OlByb3h5Q2FsbGJhY2s6Om91dENoYW5uZWxNYXNrKCkgY29uc3QgeworICAgIHNwPERldmljZUVmZmVjdFByb3h5PiBwcm94eSA9IG1Qcm94eS5wcm9tb3RlKCk7CisgICAgaWYgKHByb3h5ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICB9CisgICAgcmV0dXJuIHByb3h5LT5jaGFubmVsTWFzaygpOworfQorCit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpQcm94eUNhbGxiYWNrOjpvdXRDaGFubmVsQ291bnQoKSBjb25zdCB7CisgICAgc3A8RGV2aWNlRWZmZWN0UHJveHk+IHByb3h5ID0gbVByb3h5LnByb21vdGUoKTsKKyAgICBpZiAocHJveHkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIHByb3h5LT5jaGFubmVsQ291bnQoKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpQcm94eUNhbGxiYWNrOjpvbkVmZmVjdEVuYWJsZSgKKyAgICAgICAgY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdEJhc2UpIHsKKyAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IGVmZmVjdEJhc2UtPmFzRWZmZWN0TW9kdWxlKCk7CisgICAgaWYgKGVmZmVjdCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWZmZWN0LT5zdGFydCgpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0UHJveHk6OlByb3h5Q2FsbGJhY2s6Om9uRWZmZWN0RGlzYWJsZSgKKyAgICAgICAgY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdEJhc2UpIHsKKyAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IGVmZmVjdEJhc2UtPmFzRWZmZWN0TW9kdWxlKCk7CisgICAgaWYgKGVmZmVjdCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWZmZWN0LT5zdG9wKCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCmluZGV4IGE3MjdlMDQuLjQyNjE0Y2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaApAQCAtMzMsOSArMzMsMTIgQEAKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkKCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRPckRpcmVjdCgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkT3JNbWFwKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc1NwYXRpYWxpemVyKCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgdWludDMyX3Qgc2FtcGxlUmF0ZSgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgdWludDMyX3QgY2hhbm5lbENvdW50KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5DaGFubmVsTWFzayhpbnQgaWQpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGluQ2hhbm5lbENvdW50KGludCBpZCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0Q2hhbm5lbE1hc2soKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB1aW50MzJfdCBvdXRDaGFubmVsQ291bnQoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBhdWRpb19jaGFubmVsX21hc2tfdCBoYXB0aWNDaGFubmVsTWFzaygpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHNpemVfdCBmcmFtZUNvdW50KCkgY29uc3QgPSAwOwogCkBAIC02NCw2ICs2Nyw4IEBACiAgICAgdmlydHVhbCB2b2lkIHJlc2V0Vm9sdW1lKCkgPSAwOwogCiAgICAgdmlydHVhbCB3cDxFZmZlY3RDaGFpbj4gY2hhaW4oKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNBdWRpb1BvbGljeVJlYWR5KCkgY29uc3QgPSAwOwogfTsKIAogLy8gRWZmZWN0QmFzZShFZmZlY3RNb2R1bGUpIGFuZCBFZmZlY3RDaGFpbiBjbGFzc2VzIGJvdGggaGF2ZSB0aGVpciBvd24gbXV0ZXggdG8gcHJvdGVjdApAQCAtMTY0LDYgKzE2OSwxNiBAQAogCiAgICAgdm9pZCAgICAgICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKK3Byb3RlY3RlZDoKKyAgICBib29sICAgICAgICAgICAgIGlzSW50ZXJuYWxfbCgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaGFuZGxlIDogbUhhbmRsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT5jbGllbnQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgfQorCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAgICAgLy8gZm9yIG1IYW5kbGVzCiAgICAgYm9vbCAgICAgICAgICAgICBtUGlubmVkID0gZmFsc2U7CkBAIC0yNDAsNiArMjU1LDEzIEBACiAgICAgICAgIHJldHVybiBtT3V0QnVmZmVyICE9IDAgPyByZWludGVycHJldF9jYXN0PGludDE2X3QqPihtT3V0QnVmZmVyLT5wdHIoKSkgOiBOVUxMOwogICAgIH0KIAorICAgIC8vIFVwZGF0ZXMgdGhlIGFjY2VzcyBtb2RlIGlmIGl0IGlzIG91dCBvZiBkYXRlLiAgTWF5IGlzc3VlIGEgbmV3IGVmZmVjdCBjb25maWd1cmUuCisgICAgdm9pZCAgICAgICAgdXBkYXRlQWNjZXNzTW9kZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkRWZmZWN0QnVmZmVyQWNjZXNzTW9kZSgpICE9IG1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCiAgICAgc3RhdHVzX3QgICAgICAgICBzZXREZXZpY2VzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOwogICAgIHN0YXR1c190ICAgICAgICAgc2V0SW5wdXREZXZpY2UoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKICAgICBzdGF0dXNfdCAgICAgICAgIHNldFZvbHVtZSh1aW50MzJfdCAqbGVmdCwgdWludDMyX3QgKnJpZ2h0LCBib29sIGNvbnRyb2xsZXIpOwpAQCAtMjU5LDcgKzI4MSw3IEBACiAgICAgYm9vbCAgICAgICAgICAgICBpc0hhcHRpY0dlbmVyYXRvcigpIGNvbnN0OwogCiAgICAgc3RhdHVzX3QgICAgICAgICBzZXRIYXB0aWNJbnRlbnNpdHkoaW50IGlkLCBpbnQgaW50ZW5zaXR5KTsKLSAgICBzdGF0dXNfdCAgICAgICAgIHNldFZpYnJhdG9ySW5mbyhjb25zdCBtZWRpYTo6QXVkaW9WaWJyYXRvckluZm8qIHZpYnJhdG9ySW5mbyk7CisgICAgc3RhdHVzX3QgICAgICAgICBzZXRWaWJyYXRvckluZm8oY29uc3QgbWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvJiB2aWJyYXRvckluZm8pOwogCiAgICAgdm9pZCAgICAgICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKQEAgLTI3NSw2ICsyOTcsMTEgQEAKICAgICBzdGF0dXNfdCBzdG9wX2woKTsKICAgICBzdGF0dXNfdCByZW1vdmVFZmZlY3RGcm9tSGFsX2woKTsKICAgICBzdGF0dXNfdCBzZW5kU2V0QXVkaW9EZXZpY2VzQ29tbWFuZChjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzLCB1aW50MzJfdCBjbWRDb2RlKTsKKyAgICBlZmZlY3RfYnVmZmVyX2FjY2Vzc19lIHJlcXVpcmVkRWZmZWN0QnVmZmVyQWNjZXNzTW9kZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdyA9PSBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3CisgICAgICAgICAgICAgICAgPyBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSA6IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CisgICAgfQorCiAKICAgICBlZmZlY3RfY29uZmlnX3QgICAgIG1Db25maWc7ICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gY29uZmlndXJhdGlvbgogICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gbUVmZmVjdEludGVyZmFjZTsgLy8gRWZmZWN0IG1vZHVsZSBIQUwKQEAgLTMyNyw4ICszNTQsMTAgQEAKICAgICBFZmZlY3RIYW5kbGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCwKICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCi0gICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5KTsKKyAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksIGJvb2wgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKTsKICAgICB2aXJ0dWFsIH5FZmZlY3RIYW5kbGUoKTsKKyAgICBzdGF0dXNfdCBvblRyYW5zYWN0KAorICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKIAogICAgIC8vIElFZmZlY3QKQEAgLTM0Miw2ICszNzEsOCBAQAogICAgIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGRpc2Nvbm5lY3QoKSBvdmVycmlkZTsKICAgICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBnZXRDYmxrKG1lZGlhOjpTaGFyZWRGaWxlUmVnaW9uKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogCisgICAgc3A8Q2xpZW50PiBjbGllbnQoKSBjb25zdCB7IHJldHVybiBtQ2xpZW50OyB9CisKIHByaXZhdGU6CiAgICAgdm9pZCBkaXNjb25uZWN0KGJvb2wgdW5waW5JZkxhc3QpOwogCkBAIC0zNTYsNiArMzg3LDggQEAKICAgICB2b2lkIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKICAgICBib29sIGVuYWJsZWQoKSBjb25zdCB7IHJldHVybiBtRW5hYmxlZDsgfQogCisgICAgdm9pZCBmcmFtZXNQcm9jZXNzZWQoaW50MzJfdCBmcmFtZXMpIGNvbnN0OworCiAgICAgLy8gR2V0dGVycwogICAgIHdwPEVmZmVjdEJhc2U+IGVmZmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3Q7IH0KICAgICBpbnQgaWQoKSBjb25zdCB7CkBAIC0zODksNiArNDIyLDggQEAKICAgICBib29sIG1FbmFibGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlZCBlbmFibGUgc3RhdGU6IG5lZWRlZCB3aGVuIHRoZSBlZmZlY3QgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmVkIGFmdGVyIGJlaW5nIHN1c3BlbmRlZAogICAgIGJvb2wgbURpc2Nvbm5lY3RlZDsgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRvIHRydWUgYnkgZGlzY29ubmVjdCgpCisgICAgY29uc3QgYm9vbCBtTm90aWZ5RnJhbWVzUHJvY2Vzc2VkOyAgICAgICAvLyB0cnVlIGlmIHRoZSBjbGllbnQgY2FsbGJhY2sgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVWRU5UX0ZSQU1FU19QUk9DRVNTRUQgbXVzdCBiZSBnZW5lcmF0ZWQKIH07CiAKIC8vIHRoZSBFZmZlY3RDaGFpbiBjbGFzcyByZXByZXNlbnRzIGEgZ3JvdXAgb2YgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIG9uZSBhdWRpbyBzZXNzaW9uLgpAQCAtNTExLDYgKzU0Niw4IEBACiAgICAgc3A8RWZmZWN0Q2FsbGJhY2tJbnRlcmZhY2U+IGVmZmVjdENhbGxiYWNrKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdENhbGxiYWNrOyB9CiAgICAgd3A8VGhyZWFkQmFzZT4gdGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdENhbGxiYWNrLT50aHJlYWQoKTsgfQogCisgICAgYm9vbCBpc0ZpcnN0RWZmZWN0KGludCBpZCkgY29uc3QgeyByZXR1cm4gIW1FZmZlY3RzLmlzRW1wdHkoKSAmJiBpZCA9PSBtRWZmZWN0c1swXS0+aWQoKTsgfQorCiAgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKIHByaXZhdGU6CkBAIC01MzAsNiArNTY3LDEyIEBACiAgICAgICAgICAgICA6IG1DaGFpbihvd25lcikKICAgICAgICAgICAgICwgbVRocmVhZCh0aHJlYWQpCiAgICAgICAgICAgICAsIG1BdWRpb0ZsaW5nZXIoKmdBdWRpb0ZsaW5nZXIpIHsKKyAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IGJhc2UgPSB0aHJlYWQucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKGJhc2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1UaHJlYWRUeXBlID0gYmFzZS0+dHlwZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVGhyZWFkVHlwZSA9IFRocmVhZEJhc2U6Ok1JWEVSOyAgLy8gYXNzdXJlIGEgY29uc2lzdGVudCB2YWx1ZS4KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHN0YXR1c190IGNyZWF0ZUVmZmVjdEhhbChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKQEAgLTU0MiwxMCArNTg1LDEzIEBACiAgICAgICAgIGJvb2wgaXNPZmZsb2FkKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgIGJvb2wgaXNPZmZsb2FkT3JEaXJlY3QoKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgYm9vbCBpc09mZmxvYWRPck1tYXAoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgYm9vbCBpc1NwYXRpYWxpemVyKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSgpIGNvbnN0IG92ZXJyaWRlOwotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IG92ZXJyaWRlOwotICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5DaGFubmVsTWFzayhpbnQgaWQpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICB1aW50MzJfdCBpbkNoYW5uZWxDb3VudChpbnQgaWQpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRDaGFubmVsTWFzaygpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICB1aW50MzJfdCBvdXRDaGFubmVsQ291bnQoKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaGFwdGljQ2hhbm5lbE1hc2soKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQoKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSgpIGNvbnN0IG92ZXJyaWRlOwpAQCAtNTY2LDE2ICs2MTIsMjIgQEAKIAogICAgICAgICB3cDxFZmZlY3RDaGFpbj4gY2hhaW4oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtQ2hhaW47IH0KIAorICAgICAgICBib29sIGlzQXVkaW9Qb2xpY3lSZWFkeSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBtQXVkaW9GbGluZ2VyLmlzQXVkaW9Qb2xpY3lSZWFkeSgpOworICAgICAgICB9CisKICAgICAgICAgd3A8VGhyZWFkQmFzZT4gdGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbVRocmVhZC5sb2FkKCk7IH0KIAotICAgICAgICB2b2lkIHNldFRocmVhZChjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkKSB7CisgICAgICAgIHZvaWQgc2V0VGhyZWFkKGNvbnN0IHNwPFRocmVhZEJhc2U+JiB0aHJlYWQpIHsKICAgICAgICAgICAgIG1UaHJlYWQgPSB0aHJlYWQ7CisgICAgICAgICAgICBtVGhyZWFkVHlwZSA9IHRocmVhZC0+dHlwZSgpOwogICAgICAgICB9CiAKICAgICBwcml2YXRlOgogICAgICAgICBjb25zdCB3cDxFZmZlY3RDaGFpbj4gbUNoYWluOwogICAgICAgICBtZWRpYXV0aWxzOjphdG9taWNfd3A8VGhyZWFkQmFzZT4gbVRocmVhZDsKICAgICAgICAgQXVkaW9GbGluZ2VyICZtQXVkaW9GbGluZ2VyOyAgLy8gaW1wbGVtZW50YXRpb24gZGV0YWlsOiBvdXRlciBpbnN0YW5jZSBhbHdheXMgZXhpc3RzLgorICAgICAgICBUaHJlYWRCYXNlOjp0eXBlX3QgbVRocmVhZFR5cGU7CiAgICAgfTsKIAogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAvLyBmb3IgbVRocmVhZCwgbUVmZmVjdHMKQEAgLTYxMiw2ICs2NjQsOCBAQAogCiAgICAgdm9pZCBzZXRWb2x1bWVGb3JPdXRwdXRfbCh1aW50MzJfdCBsZWZ0LCB1aW50MzJfdCByaWdodCk7CiAKKyAgICBzc2l6ZV90IGdldEluc2VydEluZGV4KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QmIGRlc2MpOworCiAgICAgbXV0YWJsZSAgTXV0ZXggbUxvY2s7ICAgICAgICAvLyBtdXRleCBwcm90ZWN0aW5nIGVmZmVjdCBsaXN0CiAgICAgICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RNb2R1bGU+ID4gbUVmZmVjdHM7IC8vIGxpc3Qgb2YgZWZmZWN0IG1vZHVsZXMKICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb25JZDsgLy8gYXVkaW8gc2Vzc2lvbiBJRApAQCAtNjQzLDExICs2OTcsMTEgQEAKIHB1YmxpYzoKICAgICAgICAgRGV2aWNlRWZmZWN0UHJveHkgKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VFZmZlY3RNYW5hZ2VyQ2FsbGJhY2s+JiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBpbnQgaWQpCisgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgaW50IGlkLCBib29sIG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCkKICAgICAgICAgICAgIDogRWZmZWN0QmFzZShjYWxsYmFjaywgZGVzYywgaWQsIEFVRElPX1NFU1NJT05fREVWSUNFLCBmYWxzZSksCiAgICAgICAgICAgICAgICAgbURldmljZShkZXZpY2UpLCBtTWFuYWdlckNhbGxiYWNrKGNhbGxiYWNrKSwKLSAgICAgICAgICAgICAgICBtTXlDYWxsYmFjayhuZXcgUHJveHlDYWxsYmFjayh3cDxEZXZpY2VFZmZlY3RQcm94eT4odGhpcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2spKSB7fQorICAgICAgICAgICAgICAgIG1NeUNhbGxiYWNrKG5ldyBQcm94eUNhbGxiYWNrKHdwPERldmljZUVmZmVjdFByb3h5Pih0aGlzKSwgY2FsbGJhY2spKSwKKyAgICAgICAgICAgICAgICBtTm90aWZ5RnJhbWVzUHJvY2Vzc2VkKG5vdGlmeUZyYW1lc1Byb2Nlc3NlZCkge30KIAogICAgIHN0YXR1c190IHNldEVuYWJsZWQoYm9vbCBlbmFibGVkLCBib29sIGZyb21IYW5kbGUpIG92ZXJyaWRlOwogICAgIHNwPERldmljZUVmZmVjdFByb3h5PiBhc0RldmljZUVmZmVjdFByb3h5KCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQpAQCAtNjkyLDEwICs3NDYsMTMgQEAKICAgICAgICAgYm9vbCBpc09mZmxvYWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgICBib29sIGlzT2ZmbG9hZE9yRGlyZWN0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICAgYm9vbCBpc09mZmxvYWRPck1tYXAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICBib29sIGlzU3BhdGlhbGl6ZXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUoKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGluQ2hhbm5lbE1hc2soaW50IGlkKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgdWludDMyX3QgaW5DaGFubmVsQ291bnQoaW50IGlkKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0Q2hhbm5lbE1hc2soKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgdWludDMyX3Qgb3V0Q2hhbm5lbENvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOyB9CiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGUgIHsgcmV0dXJuIDA7IH0KICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSgpIGNvbnN0IG92ZXJyaWRlICB7IHJldHVybiAwOyB9CkBAIC03MTEsMTEgKzc2OCwxNSBAQAogICAgICAgICB2b2lkIHJlc2V0Vm9sdW1lKCkgb3ZlcnJpZGUge30KICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KCkgY29uc3Qgb3ZlcnJpZGUgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHByb2R1Y3Rfc3RyYXRlZ3lfdD4oMCk7IH0KICAgICAgICAgaW50MzJfdCBhY3RpdmVUcmFja0NudCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KLSAgICAgICAgdm9pZCBvbkVmZmVjdEVuYWJsZShjb25zdCBzcDxFZmZlY3RCYXNlPiYgZWZmZWN0IF9fdW51c2VkKSBvdmVycmlkZSB7fQotICAgICAgICB2b2lkIG9uRWZmZWN0RGlzYWJsZShjb25zdCBzcDxFZmZlY3RCYXNlPiYgZWZmZWN0IF9fdW51c2VkKSBvdmVycmlkZSB7fQorICAgICAgICB2b2lkIG9uRWZmZWN0RW5hYmxlKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QgX191bnVzZWQpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uRWZmZWN0RGlzYWJsZShjb25zdCBzcDxFZmZlY3RCYXNlPiYgZWZmZWN0IF9fdW51c2VkKSBvdmVycmlkZTsKIAogICAgICAgICB3cDxFZmZlY3RDaGFpbj4gY2hhaW4oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9CiAKKyAgICAgICAgYm9vbCBpc0F1ZGlvUG9saWN5UmVhZHkoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICByZXR1cm4gbU1hbmFnZXJDYWxsYmFjay0+aXNBdWRpb1BvbGljeVJlYWR5KCk7CisgICAgICAgIH0KKwogICAgICAgICBpbnQgbmV3RWZmZWN0SWQoKTsKIAogICAgIHByaXZhdGU6CkBAIC03MzQsNCArNzk1LDUgQEAKICAgICBzdGQ6Om1hcDxhdWRpb19wYXRjaF9oYW5kbGVfdCwgc3A8RWZmZWN0SGFuZGxlPj4gbUVmZmVjdEhhbmRsZXM7IC8vIHByb3RlY3RlZCBieSBtUHJveHlMb2NrCiAgICAgc3A8RWZmZWN0TW9kdWxlPiBtSGFsRWZmZWN0OyAvLyBwcm90ZWN0ZWQgYnkgbVByb3h5TG9jawogICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBtRGV2aWNlUG9ydCA9IHsgLmlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSB9OworICAgIGNvbnN0IGJvb2wgbU5vdGlmeUZyYW1lc1Byb2Nlc3NlZDsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCmluZGV4IDg4ZDRlYWYuLjI2YmQ5MmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCkBAIC04OSw2ICs4OSw3IEBACiAgICAgLy8gVE9ETzogQWRkIGNoYW5uZWwgbWFzayB0byBOQkFJT19Gb3JtYXQuCiAgICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIGNoYW5uZWwgbWFzayBtdXN0IGJlIGEgdmFsaWQgcG9zaXRpb25hbCBjaGFubmVsIG1hc2suCiAgICAgbVNpbmtDaGFubmVsTWFzayA9IGdldENoYW5uZWxNYXNrRnJvbUNvdW50KG1TaW5rQ2hhbm5lbENvdW50KTsKKyAgICBtQmFsYW5jZS5zZXRDaGFubmVsTWFzayhtU2lua0NoYW5uZWxNYXNrKTsKIAogICAgIHVuc2lnbmVkIGk7CiAgICAgZm9yIChpID0gMDsgaSA8IEZhc3RNaXhlclN0YXRlOjpzTWF4RmFzdFRyYWNrczsgKytpKSB7CkBAIC0yMDQsNiArMjA1LDggQEAKICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkKTsKICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpIQVBUSUNfSU5URU5TSVRZLAogICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1IYXB0aWNJbnRlbnNpdHkpOworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkhBUFRJQ19NQVhfQU1QTElUVURFLAorICAgICAgICAgICAgICAgICh2b2lkICopKCYoZmFzdFRyYWNrLT5tSGFwdGljTWF4QW1wbGl0dWRlKSkpOwogCiAgICAgICAgIG1NaXhlci0+ZW5hYmxlKGluZGV4KTsKICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCmluZGV4IDg1N2QzZGUuLmNlM2NjMTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9TVEFURV9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9TVEFURV9ICiAKKyNpbmNsdWRlIDxtYXRoLmg+CisKICNpbmNsdWRlIDxhdWRpb191dGlscy9taW5pZmxvYXQuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb01peGVyLmg+CkBAIC01MSw2ICs1Myw3IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUdlbmVyYXRpb247ICAgICAvLyBpbmNyZW1lbnQgd2hlbiBhbnkgZmllbGQgaXMgYXNzaWduZWQKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkID0gZmFsc2U7IC8vIGhhcHRpYyBwbGF5YmFjayBpcyBlbmFibGVkIG9yIG5vdAogICAgIG9zOjpIYXB0aWNTY2FsZSAgICAgICAgIG1IYXB0aWNJbnRlbnNpdHkgPSBvczo6SGFwdGljU2NhbGU6Ok1VVEU7IC8vIGludGVuc2l0eSBvZiBoYXB0aWMgZGF0YQorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1IYXB0aWNNYXhBbXBsaXR1ZGUgPSBOQU47IC8vIG1heCBhbXBsaXR1ZGUgYWxsb3dlZCBmb3IgaGFwdGljIGRhdGEKIH07CiAKIC8vIFJlcHJlc2VudHMgYSBzaW5nbGUgc3RhdGUgb2YgdGhlIGZhc3QgbWl4ZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTCmluZGV4IDAzNGQxNjEuLjE3ZDRjMzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUwpAQCAtMSw0ICsxLDQgQEAKLWdrYXN0ZW5AZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQogam10cml2aUBnb29nbGUuY29tCiBtbmFnYW5vdkBnb29nbGUuY29tCitwaGlsYnVya0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKaW5kZXggYTM4MWM3ZC4uNDVkZDI1OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcApAQCAtMjU4LDYgKzI1OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQbGF5YmFja1RocmVhZCo+KHRocmVhZC5nZXQoKSksIGZhbHNlIC8qY2xvc2VUaHJlYWQqLyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IG1peGVyQ29uZmlnID0gQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgewpAQCAtMjc2LDYgKzI3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaXhlckNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZUFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CkBAIC01NzMsNiArNTc1LDEyIEBACiAKICAgICAvLyBjcmVhdGUgYSBzcGVjaWFsIHBsYXliYWNrIHRyYWNrIHRvIHJlbmRlciB0byBwbGF5YmFjayB0aHJlYWQuCiAgICAgLy8gdGhpcyB0cmFjayBpcyBnaXZlbiB0aGUgc2FtZSBidWZmZXIgYXMgdGhlIFBhdGNoUmVjb3JkIGJ1ZmZlcgorCisgICAgLy8gRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gc3RhcnQgYXMgc29vbiBhcyBwb3NzaWJsZSB0byBoYXZlIHRoZSBsb3dlc3QgcG9zc2libGUgbGF0ZW5jeSBldmVuIGlmCisgICAgLy8gaXQgbWlnaHQgZ2xpdGNoLgorICAgIC8vIERpc2FibGUgdGhpcyBiZWhhdmlvciBmb3IgRk0gVHVuZXIgc291cmNlIGlmIG5vIGZhc3QgY2FwdHVyZS9taXhlciBhdmFpbGFibGUuCisgICAgY29uc3QgYm9vbCBpc0ZtQnJpZGdlID0gbUF1ZGlvUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLnR5cGUgPT0gQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSOworICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50VG9CZVJlYWR5ID0gaXNGbUJyaWRnZSAmJiAhdXNlUGFzc3RocnVQYXRjaFJlY29yZCA/IGZyYW1lQ291bnQgLyA0IDogMTsKICAgICBzcDxQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaz4gdGVtcFBhdGNoVHJhY2sgPSBuZXcgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrLnRocmVhZCgpLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsCkBAIC01ODIsNyArNTkwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBSZWNvcmRUcmFjay0+YnVmZmVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFJlY29yZFRyYWNrLT5idWZmZXJTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9IC8qdGltZW91dCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnRUb0JlUmVhZHkpOwogICAgIHN0YXR1cyA9IG1QbGF5YmFjay5jaGVja1RyYWNrKHRlbXBQYXRjaFRyYWNrLmdldCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCmluZGV4IDA5MjkwNTUuLjZhMTM4YmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCkBAIC0xOSw2ICsxOSw4IEBACiAgICAgI2Vycm9yIFRoaXMgaGVhZGVyIGZpbGUgc2hvdWxkIG9ubHkgYmUgaW5jbHVkZWQgZnJvbSBBdWRpb0ZsaW5nZXIuaAogI2VuZGlmCiAKKyNpbmNsdWRlIDxtYXRoLmg+CisKIC8vIENoZWNrcyBhbmQgbW9uaXRvcnMgT1BfUExBWV9BVURJTwogY2xhc3MgT3BQbGF5QXVkaW9Nb25pdG9yIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgpAQCAtODAsNyArODIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gc3RhcnQgd2hlbiB0aGVyZSBhcmUgYXMgbWFueSBmcmFtZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlYWR5IGFzIHBvc3NpYmxlIChha2EuIEJ1ZmZlciBpcyBmdWxsKS4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnRUb0JlUmVhZHkgPSBTSVpFX01BWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3BlZWQgPSAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3BlZWQgPSAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3BhdGlhbGl6ZWQgPSBmYWxzZSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+VHJhY2soKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0OwogCkBAIC0xNjEsNiArMTY0LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8qKiBSZXR1cm4gYXQgd2hhdCBpbnRlbnNpdHkgdG8gcGxheSBoYXB0aWNzLCB1c2VkIGluIG1peGVyLiAqLwogICAgICAgICAgICAgb3M6OkhhcHRpY1NjYWxlIGdldEhhcHRpY0ludGVuc2l0eSgpIGNvbnN0IHsgcmV0dXJuIG1IYXB0aWNJbnRlbnNpdHk7IH0KKyAgICAgICAgICAgIC8qKiBSZXR1cm4gdGhlIG1heGltdW0gYW1wbGl0dWRlIGFsbG93ZWQgZm9yIGhhcHRpY3MgZGF0YSwgdXNlZCBpbiBtaXhlci4gKi8KKyAgICAgICAgICAgIGZsb2F0IGdldEhhcHRpY01heEFtcGxpdHVkZSgpIGNvbnN0IHsgcmV0dXJuIG1IYXB0aWNNYXhBbXBsaXR1ZGU7IH0KICAgICAgICAgICAgIC8qKiBTZXQgaW50ZW5zaXR5IG9mIGhhcHRpYyBwbGF5YmFjaywgc2hvdWxkIGJlIHNldCBhZnRlciBxdWVyeWluZyB2aWJyYXRvciBzZXJ2aWNlLiAqLwogICAgICAgICAgICAgdm9pZCAgICBzZXRIYXB0aWNJbnRlbnNpdHkob3M6OkhhcHRpY1NjYWxlIGhhcHRpY0ludGVuc2l0eSkgewogICAgICAgICAgICAgICAgIGlmIChvczo6aXNWYWxpZEhhcHRpY1NjYWxlKGhhcHRpY0ludGVuc2l0eSkpIHsKQEAgLTE2OCw2ICsxNzMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgc2V0SGFwdGljUGxheWJhY2tFbmFibGVkKG1IYXB0aWNJbnRlbnNpdHkgIT0gb3M6OkhhcHRpY1NjYWxlOjpNVVRFKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiogU2V0IG1heGltdW0gYW1wbGl0dWRlIGFsbG93ZWQgZm9yIGhhcHRpYyBkYXRhLCBzaG91bGQgYmUgc2V0IGFmdGVyIHF1ZXJ5aW5nCisgICAgICAgICAgICAgKiAgdmlicmF0b3Igc2VydmljZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdm9pZCAgICBzZXRIYXB0aWNNYXhBbXBsaXR1ZGUoZmxvYXQgbWF4QW1wbGl0dWRlKSB7CisgICAgICAgICAgICAgICAgbUhhcHRpY01heEFtcGxpdHVkZSA9IG1heEFtcGxpdHVkZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4gZ2V0RXh0ZXJuYWxWaWJyYXRpb24oKSBjb25zdCB7IHJldHVybiBtRXh0ZXJuYWxWaWJyYXRpb247IH0KIAogICAgICAgICAgICAgdm9pZCAgICBzZXRUZWVQYXRjaGVzKFRlZVBhdGNoZXMgdGVlUGF0Y2hlcyk7CkBAIC0xODMsOCArMTk0LDE2IEBACiAgICAgICAgfQogICAgIH0KIAorICAgIHN0YXRpYyBib29sIGNoZWNrU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KQorICAgICAgICAgICAgICAgICYmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpID09IDA7CisgICAgfQorCiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZ2V0T3V0cHV0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KICAgICBmbG9hdCBnZXRTcGVlZCgpIGNvbnN0IHsgcmV0dXJuIG1TcGVlZDsgfQorICAgIGJvb2wgaXNTcGF0aWFsaXplZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1Jc1NwYXRpYWxpemVkOyB9CisKIHByb3RlY3RlZDoKICAgICAvLyBmb3IgbnVtZXJvdXMKICAgICBmcmllbmQgY2xhc3MgUGxheWJhY2tUaHJlYWQ7CkBAIC0yODIsNiArMzAxLDggQEAKICAgICBib29sICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBmYWxzZTsgLy8gaW5kaWNhdGVzIGhhcHRpYyBwbGF5YmFjayBlbmFibGVkIG9yIG5vdAogICAgIC8vIGludGVuc2l0eSB0byBwbGF5IGhhcHRpYyBkYXRhCiAgICAgb3M6OkhhcHRpY1NjYWxlIG1IYXB0aWNJbnRlbnNpdHkgPSBvczo6SGFwdGljU2NhbGU6Ok1VVEU7CisgICAgLy8gbWF4IGFtcGxpdHVkZSBhbGxvd2VkIGZvciBoYXB0aWMgZGF0YQorICAgIGZsb2F0IG1IYXB0aWNNYXhBbXBsaXR1ZGUgPSBOQU47CiAgICAgY2xhc3MgQXVkaW9WaWJyYXRpb25Db250cm9sbGVyIDogcHVibGljIG9zOjpCbkV4dGVybmFsVmlicmF0aW9uQ29udHJvbGxlciB7CiAgICAgcHVibGljOgogICAgICAgICBleHBsaWNpdCBBdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIoVHJhY2sqIHRyYWNrKSA6IG1UcmFjayh0cmFjaykge30KQEAgLTMzMiw2ICszNTMsNyBAQAogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsKICAgICBUZWVQYXRjaGVzICBtVGVlUGF0Y2hlczsKICAgICBjb25zdCBmbG9hdCAgICAgICAgIG1TcGVlZDsKKyAgICBjb25zdCBib29sICAgICAgICAgIG1Jc1NwYXRpYWxpemVkOwogfTsgIC8vIGVuZCBvZiBUcmFjawogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Qcm9wZXJ0eVV0aWxzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Qcm9wZXJ0eVV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWUyNTMzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1Byb3BlcnR5VXRpbHMuY3BwCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvVGVzdGluZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeS5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlICJQcm9wZXJ0eVV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeTsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvTU1hcFBvbGljeUluZm87CisKK3N0ZDo6c3RyaW5nIGdldE1tYXBQb2xpY3lQcm9wZXJ0eShBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUpIHsKKyAgICBzd2l0Y2ggKHBvbGljeVR5cGUpIHsKKyAgICAgICAgY2FzZSBBdWRpb01NYXBQb2xpY3lUeXBlOjpERUZBVUxUOgorICAgICAgICAgICAgcmV0dXJuICJhYXVkaW8ubW1hcF9wb2xpY3kiOworICAgICAgICBjYXNlIEF1ZGlvTU1hcFBvbGljeVR5cGU6OkVYQ0xVU0lWRToKKyAgICAgICAgICAgIHJldHVybiAiYWF1ZGlvLm1tYXBfZXhjbHVzaXZlX3BvbGljeSI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgfQorfQorCitpbnQgZ2V0RGVmYXVsdFBvbGljeUZyb21UeXBlKEF1ZGlvTU1hcFBvbGljeVR5cGUgcG9saWN5VHlwZSkgeworICAgIHN3aXRjaCAocG9saWN5VHlwZSkgeworICAgICAgICBjYXNlIEF1ZGlvTU1hcFBvbGljeVR5cGU6OkVYQ0xVU0lWRToKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgICAgIGNhc2UgQXVkaW9NTWFwUG9saWN5VHlwZTo6REVGQVVMVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fUE9MSUNZX05FVkVSOworICAgIH0KK30KKworQXVkaW9NTWFwUG9saWN5IGxlZ2FjeTJhaWRsX2FhdWRpb19wb2xpY3lfdF9BdWRpb01NYXBQb2xpY3koYWF1ZGlvX3BvbGljeV90IGxlZ2FjeSkgeworICAgIHN3aXRjaCAobGVnYWN5KSB7CisgICAgICAgIGNhc2UgQUFVRElPX1BPTElDWV9ORVZFUjoKKyAgICAgICAgICAgIHJldHVybiBBdWRpb01NYXBQb2xpY3k6Ok5FVkVSOworICAgICAgICBjYXNlIEFBVURJT19QT0xJQ1lfQVVUTzoKKyAgICAgICAgICAgIHJldHVybiBBdWRpb01NYXBQb2xpY3k6OkFVVE87CisgICAgICAgIGNhc2UgQUFVRElPX1BPTElDWV9BTFdBWVM6CisgICAgICAgICAgICByZXR1cm4gQXVkaW9NTWFwUG9saWN5OjpBTFdBWVM7CisgICAgICAgIGNhc2UgQUFVRElPX1VOU1BFQ0lGSUVEOgorICAgICAgICAgICAgcmV0dXJuIEF1ZGlvTU1hcFBvbGljeTo6VU5TUEVDSUZJRUQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXMgdW5rbm93biBhYXVkaW8gcG9saWN5OiAlZCIsIF9fZnVuY19fLCBsZWdhY3kpOworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvTU1hcFBvbGljeTo6VU5TUEVDSUZJRUQ7CisgICAgfQorfQorCitzdGF0dXNfdCBnZXRNbWFwUG9saWN5SW5mb3NGcm9tU3lzdGVtUHJvcGVydHkoCisgICAgICAgIEF1ZGlvTU1hcFBvbGljeVR5cGUgcG9saWN5VHlwZSwgc3RkOjp2ZWN0b3I8QXVkaW9NTWFwUG9saWN5SW5mbz4gKnBvbGljeUluZm9zKSB7CisgICAgQXVkaW9NTWFwUG9saWN5SW5mbyBwb2xpY3lJbmZvOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHByb3BlcnR5U3RyID0gZ2V0TW1hcFBvbGljeVByb3BlcnR5KHBvbGljeVR5cGUpOworICAgIGlmIChwcm9wZXJ0eVN0ci5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHBvbGljeUluZm8ubW1hcFBvbGljeSA9IGxlZ2FjeTJhaWRsX2FhdWRpb19wb2xpY3lfdF9BdWRpb01NYXBQb2xpY3koCisgICAgICAgICAgICBwcm9wZXJ0eV9nZXRfaW50MzIocHJvcGVydHlTdHIuY19zdHIoKSwgZ2V0RGVmYXVsdFBvbGljeUZyb21UeXBlKHBvbGljeVR5cGUpKSk7CisgICAgcG9saWN5SW5mb3MtPnB1c2hfYmFjayhwb2xpY3lJbmZvKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2ludDMyX3QgZ2V0QUF1ZGlvTWl4ZXJCdXJzdENvdW50RnJvbVN5c3RlbVByb3BlcnR5KCkgeworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IHNEZWZhdWx0QnVyc3RzID0gMjsgLy8gYXJiaXRyYXJ5LCB1c2UgMiBmb3IgZG91YmxlIGJ1ZmZlcmVkCisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qgc01heEJ1cnN0cyA9IDEwMjQ7IC8vIGFyYml0cmFyeQorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBzUHJvcE1peGVyQnVyc3RzID0gImFhdWRpby5taXhlcl9idXJzdHMiOworICAgIGludDMyX3QgcHJvcCA9IHByb3BlcnR5X2dldF9pbnQzMihzUHJvcE1peGVyQnVyc3RzLCBzRGVmYXVsdEJ1cnN0cyk7CisgICAgaWYgKHByb3AgPD0gMCB8fCBwcm9wID4gc01heEJ1cnN0cykgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgdmFsdWUgJWQsIHVzZSBkZWZhdWx0ICVkIiwgX19mdW5jX18sIHByb3AsIHNEZWZhdWx0QnVyc3RzKTsKKyAgICAgICAgcHJvcCA9IHNEZWZhdWx0QnVyc3RzOworICAgIH0KKyAgICByZXR1cm4gcHJvcDsKK30KKworaW50MzJfdCBnZXRBQXVkaW9IYXJkd2FyZUJ1cnN0TWluVXNlY0Zyb21TeXN0ZW1Qcm9wZXJ0eSgpIHsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBzRGVmYXVsdE1pY3JvcyA9IDEwMDA7IC8vIGFyYml0cmFyeQorICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IHNNYXhNaWNyb3MgPSAxMDAwICogMTAwMDsgLy8gYXJiaXRyYXJ5CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIHNQcm9wSHdCdXJzdE1pblVzZWMgPSAiYWF1ZGlvLmh3X2J1cnN0X21pbl91c2VjIjsKKyAgICBpbnQzMl90IHByb3AgPSBwcm9wZXJ0eV9nZXRfaW50MzIoc1Byb3BId0J1cnN0TWluVXNlYywgc0RlZmF1bHRNaWNyb3MpOworICAgIGlmIChwcm9wIDw9IDAgfHwgcHJvcCA+IHNNYXhNaWNyb3MpIHsKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgdmFsdWUgJWQsIHVzZSBkZWZhdWx0ICVkIiwgX19mdW5jX18sIHByb3AsIHNEZWZhdWx0TWljcm9zKTsKKyAgICAgICAgcHJvcCA9IHNEZWZhdWx0TWljcm9zOworICAgIH0KKyAgICByZXR1cm4gcHJvcDsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1Byb3BlcnR5VXRpbHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Qcm9wZXJ0eVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmNjUxYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Qcm9wZXJ0eVV0aWxzLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9NTWFwUG9saWN5VHlwZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvTU1hcFBvbGljeUluZm8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBnZXRNbWFwUG9saWN5SW5mb3NGcm9tU3lzdGVtUHJvcGVydHkoCisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lUeXBlIHBvbGljeVR5cGUsCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01NYXBQb2xpY3lJbmZvPiAqcG9saWN5SW5mb3MpOworCitpbnQzMl90IGdldEFBdWRpb01peGVyQnVyc3RDb3VudEZyb21TeXN0ZW1Qcm9wZXJ0eSgpOworCitpbnQzMl90IGdldEFBdWRpb0hhcmR3YXJlQnVyc3RNaW5Vc2VjRnJvbVN5c3RlbVByb3BlcnR5KCk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9URVNUX01BUFBJTkcgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTVhOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMTIgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNOYXRpdmVNZWRpYUFBdWRpb1Rlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyIgOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5uYXRpdmVtZWRpYS5hYXVkaW8uQUF1ZGlvVGVzdHMjQUF1ZGlvQmFzaWMuKiIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCmluZGV4IDYyMzVkYjkuLjA3ZTgyYTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKQEAgLTUwLDggKzUwLDEwIEBACiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc2FmZV9tYXRoLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X25zLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X2FlYy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9kb3dubWl4Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X25zLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X3NwYXRpYWxpemVyLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIC8vIE5CQUlPIGltcGxlbWVudGF0aW9ucwpAQCAtNjMsNiArNjUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGVSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1Byb2Nlc3MuaD4KIAogI2luY2x1ZGUgPGF1ZGlvbWFuYWdlci9BdWRpb01hbmFnZXIuaD4KICNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvUG93ZXJNYW5hZ2VyLmg+CkBAIC01MDcsNiArNTEwLDggQEAKICAgICAgICAgcmV0dXJuICJNTUFQX1BMQVlCQUNLIjsKICAgICBjYXNlIE1NQVBfQ0FQVFVSRToKICAgICAgICAgcmV0dXJuICJNTUFQX0NBUFRVUkUiOworICAgIGNhc2UgU1BBVElBTElaRVI6CisgICAgICAgIHJldHVybiAiU1BBVElBTElaRVIiOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiAidW5rbm93biI7CiAgICAgfQpAQCAtNjIyLDcgKzYyNyw3IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkLAordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LCBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTYzMCw3ICs2MzUsNyBAQAogfQogCiAvLyBzZW5kSW9Db25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZElvQ29uZmlnRXZlbnRfbChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCwKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudF9sKGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LCBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICAvLyBUaGUgYXVkaW8gc3RhdGlzdGljcyBoaXN0b3J5IGlzIGV4cG9uZW50aWFsbHkgd2VpZ2h0ZWQgdG8gZm9yZ2V0IGV2ZW50cwpAQCAtNjQwLDYgKzY0NSw3IEBACiAgICAgbUlvSml0dGVyTXMucmVzZXQoKTsKICAgICBtTGF0ZW5jeU1zLnJlc2V0KCk7CiAgICAgbVByb2Nlc3NUaW1lTXMucmVzZXQoKTsKKyAgICBtTW9ub3BpcGVQaXBlRGVwdGhTdGF0cy5yZXNldCgpOwogICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KG1UaW1lc3RhbXBWZXJpZmllci5ESVNDT05USU5VSVRZX01PREVfQ09OVElOVU9VUyk7CiAKICAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPSAoQ29uZmlnRXZlbnQgKiluZXcgSW9Db25maWdFdmVudChldmVudCwgcGlkLCBwb3J0SWQpOwpAQCAtNzIyLDYgKzcyOCwxOSBAQAogICAgIHNlbmRDb25maWdFdmVudF9sKGNvbmZpZ0V2ZW50KTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRDaGVja091dHB1dFN0YWdlRWZmZWN0c0V2ZW50KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNlbmRDaGVja091dHB1dFN0YWdlRWZmZWN0c0V2ZW50X2woKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRDaGVja091dHB1dFN0YWdlRWZmZWN0c0V2ZW50X2woKQoreworICAgIHNwPENvbmZpZ0V2ZW50PiBjb25maWdFdmVudCA9CisgICAgICAgICAgICAoQ29uZmlnRXZlbnQgKiluZXcgQ2hlY2tPdXRwdXRTdGFnZUVmZmVjdHNFdmVudCgpOworICAgIHNlbmRDb25maWdFdmVudF9sKGNvbmZpZ0V2ZW50KTsKK30KKwogLy8gcG9zdCBjb25kaXRpb246IG1Db25maWdFdmVudHMuaXNFbXB0eSgpCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6cHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkKIHsKQEAgLTc4NCw2ICs4MDMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgKFJlc2l6ZUJ1ZmZlckNvbmZpZ0V2ZW50RGF0YSAqKWV2ZW50LT5tRGF0YS5nZXQoKTsKICAgICAgICAgICAgIHJlc2l6ZUlucHV0QnVmZmVyX2woZGF0YS0+bU1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKTsKICAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIENGR19FVkVOVF9DSEVDS19PVVRQVVRfU1RBR0VfRUZGRUNUUzogeworICAgICAgICAgICAgc2V0Q2hlY2tPdXRwdXRTdGFnZUVmZmVjdHMoKTsKKyAgICAgICAgfSBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJwcm9jZXNzQ29uZmlnRXZlbnRzX2woKSB1bmtub3duIGV2ZW50IHR5cGUgJWQiLCBldmVudC0+bVR5cGUpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC05MDAsNiArOTI0LDIwIEBACiAKICAgICBkcHJpbnRmKGZkLCAiICBMb2NhbCBsb2c6XG4iKTsKICAgICBtTG9jYWxMb2cuZHVtcChmZCwgIiAgICIgLyogcHJlZml4ICovLCA0MCAvKiBsaW5lcyAqLyk7CisKKyAgICAvLyAtLWFsbCBkb2VzIHRoZSBzdGF0aXN0aWNzCisgICAgYm9vbCBkdW1wQWxsID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvICZhcmcgOiBhcmdzKSB7CisgICAgICAgIGlmIChhcmcgPT0gU3RyaW5nMTYoIi0tYWxsIikpIHsKKyAgICAgICAgICAgIGR1bXBBbGwgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChkdW1wQWxsIHx8IHR5cGUoKSA9PSBTUEFUSUFMSVpFUikgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBzY2hlZCA9IG1UaHJlYWRTbmFwc2hvdC50b1N0cmluZygpOworICAgICAgICBpZiAoIXNjaGVkLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICh2b2lkKXdyaXRlKGZkLCBzY2hlZC5jX3N0cigpLCBzY2hlZC5zaXplKCkpOworICAgICAgICB9CisgICAgfQogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6ZHVtcEJhc2VfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCkBAIC05NDAsNyArOTc4LDggQEAKICAgICAgICAgICAgIHx8IG1UeXBlID09IE1JWEVSCiAgICAgICAgICAgICB8fCBtVHlwZSA9PSBEVVBMSUNBVElORwogICAgICAgICAgICAgfHwgbVR5cGUgPT0gRElSRUNUCi0gICAgICAgICAgICB8fCBtVHlwZSA9PSBPRkZMT0FEKSB7CisgICAgICAgICAgICB8fCBtVHlwZSA9PSBPRkZMT0FECisgICAgICAgICAgICB8fCBtVHlwZSA9PSBTUEFUSUFMSVpFUikgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBUaW1lc3RhbXAgc3RhdHM6ICVzXG4iLCBtVGltZXN0YW1wVmVyaWZpZXIudG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgZHByaW50ZihmZCwgIiAgVGltZXN0YW1wIGNvcnJlY3RlZDogJXNcbiIsIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSA/ICJ5ZXMiIDogIm5vIik7CiAgICAgfQpAQCAtOTY2LDYgKzEwMDUsMTIgQEAKICAgICAgICAgICAgICAgICBpc091dHB1dCgpID8gIndyaXRlIiA6ICJyZWFkIiwKICAgICAgICAgICAgICAgICBtTGF0ZW5jeU1zLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgfQorCisgICAgaWYgKG1Nb25vcGlwZVBpcGVEZXB0aFN0YXRzLmdldE4oKSA+IDApIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTW9ub3BpcGUgJXMgcGlwZSBkZXB0aCBzdGF0czogJXNcbiIsCisgICAgICAgICAgICBpc091dHB1dCgpID8gIndyaXRlIiA6ICJyZWFkIiwKKyAgICAgICAgICAgIG1Nb25vcGlwZVBpcGVEZXB0aFN0YXRzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6ZHVtcEVmZmVjdENoYWluc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKQEAgLTEwMDgsNiArMTA1Myw4IEBACiAgICAgICAgIHJldHVybiBTdHJpbmcxNigiTW1hcFBsYXliYWNrIik7CiAgICAgY2FzZSBNTUFQX0NBUFRVUkU6CiAgICAgICAgIHJldHVybiBTdHJpbmcxNigiTW1hcENhcHR1cmUiKTsKKyAgICBjYXNlIFNQQVRJQUxJWkVSOgorICAgICAgICByZXR1cm4gU3RyaW5nMTYoIkF1ZGlvU3BhdGlhbCIpOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIEFMT0dfQVNTRVJUKGZhbHNlKTsKICAgICAgICAgcmV0dXJuIFN0cmluZzE2KCJBdWRpb1Vua25vd24iKTsKQEAgLTEyOTYsOCArMTM0Myw4IEBACiB7CiAgICAgLy8gbm8gcHJlcHJvY2Vzc2luZyBvbiBwbGF5YmFjayB0aHJlYWRzCiAgICAgaWYgKChkZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQykgewotICAgICAgICBBTE9HVygiY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woKTogcHJlIHByb2Nlc3NpbmcgZWZmZWN0ICVzIGNyZWF0ZWQgb24gcGxheWJhY2siCi0gICAgICAgICAgICAgICAgIiB0aHJlYWQgJXMiLCBkZXNjLT5uYW1lLCBtVGhyZWFkTmFtZSk7CisgICAgICAgIEFMT0dXKCIlczogcHJlIHByb2Nlc3NpbmcgZWZmZWN0ICVzIGNyZWF0ZWQgb24gcGxheWJhY2siCisgICAgICAgICAgICAgICAgIiB0aHJlYWQgJXMiLCBfX2Z1bmNfXywgZGVzYy0+bmFtZSwgbVRocmVhZE5hbWUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMTMxMiwxNCArMTM1OSwyMSBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAorICAgIGlmIChtZW1jbXAoJmRlc2MtPnR5cGUsIEZYX0lJRF9TUEFUSUFMSVpFUiwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwCisgICAgICAgICAgICAmJiBtVHlwZSAhPSBTUEFUSUFMSVpFUikgeworICAgICAgICBBTE9HVygiJXM6IGF0dGVtcHQgdG8gY3JlYXRlIGEgc3BhdGlhbGl6ZXIgZWZmZWN0IG9uIGEgdGhyZWFkIG9mIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtVHlwZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgc3dpdGNoIChtVHlwZSkgewogICAgIGNhc2UgTUlYRVI6IHsKICNpZm5kZWYgTVVMVElDSEFOTkVMX0VGRkVDVF9DSEFJTgogICAgICAgICAvLyBSZWplY3QgYW55IGVmZmVjdCBvbiBtaXhlciBtdWx0aWNoYW5uZWwgc2lua3MuCiAgICAgICAgIC8vIFRPRE86IGZpeCBib3RoIGZvcm1hdCBhbmQgbXVsdGljaGFubmVsIGlzc3VlcyB3aXRoIGVmZmVjdHMuCiAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ICE9IEZDQ18yKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woKTogZWZmZWN0ICVzIGZvciBtdWx0aWNoYW5uZWwoJWQpIG9uIE1JWEVSIgotICAgICAgICAgICAgICAgICAgICAiIHRocmVhZCAlcyIsIGRlc2MtPm5hbWUsIG1DaGFubmVsQ291bnQsIG1UaHJlYWROYW1lKTsKKyAgICAgICAgICAgIEFMT0dXKCIlczogZWZmZWN0ICVzIGZvciBtdWx0aWNoYW5uZWwoJWQpIG9uIE1JWEVSIHRocmVhZCAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjLT5uYW1lLCBtQ2hhbm5lbENvdW50LCBtVGhyZWFkTmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAjZW5kaWYKQEAgLTEzMzMsMTUgKzEzODcsMTUgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKSB7CiAgICAgICAgICAgICAgICAgLy8gb25seSBwb3N0IHByb2Nlc3Npbmcgb24gb3V0cHV0IHN0YWdlIHNlc3Npb24KICAgICAgICAgICAgICAgICBpZiAoKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQykgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woKTogbm9uIHBvc3QgcHJvY2Vzc2luZyBlZmZlY3QgJXMgbm90IGFsbG93ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvbiBvdXRwdXQgc3RhZ2Ugc2Vzc2lvbiIsIGRlc2MtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IG5vbiBwb3N0IHByb2Nlc3NpbmcgZWZmZWN0ICVzIG5vdCBhbGxvd2VkIG9uIG91dHB1dCBzdGFnZSBzZXNzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGVzYy0+bmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9ERVZJQ0UpIHsKICAgICAgICAgICAgICAgICAvLyBvbmx5IHBvc3QgcHJvY2Vzc2luZyBvbiBvdXRwdXQgc3RhZ2Ugc2Vzc2lvbgogICAgICAgICAgICAgICAgIGlmICgoZGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfUE9TVF9QUk9DKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja0VmZmVjdENvbXBhdGliaWxpdHlfbCgpOiBub24gcG9zdCBwcm9jZXNzaW5nIGVmZmVjdCAlcyBub3QgYWxsb3dlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9uIGRldmljZSBzZXNzaW9uIiwgZGVzYy0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogbm9uIHBvc3QgcHJvY2Vzc2luZyBlZmZlY3QgJXMgbm90IGFsbG93ZWQgb24gZGV2aWNlIHNlc3Npb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjLT5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTM1MiwxMyArMTQwNiwxMiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19SQVcpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woKTogZWZmZWN0ICVzIG9uIHBsYXliYWNrIHRocmVhZCBpbiByYXcgbW9kZSIsCi0gICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bmFtZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBlZmZlY3QgJXMgb24gcGxheWJhY2sgdGhyZWFkIGluIHJhdyBtb2RlIiwgX19mdW5jX18sIGRlc2MtPm5hbWUpOwogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfSFdfQUNDX1RVTk5FTCkgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja0VmZmVjdENvbXBhdGliaWxpdHlfbCgpOiBub24gSFcgZWZmZWN0ICVzIG9uIHBsYXliYWNrIHRocmVhZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gZmFzdCBtb2RlIiwgZGVzYy0+bmFtZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBub24gSFcgZWZmZWN0ICVzIG9uIHBsYXliYWNrIHRocmVhZCBpbiBmYXN0IG1vZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGRlc2MtPm5hbWUpOwogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEzNzIsMzUgKzE0MjUsNjQgQEAKICAgICBjYXNlIERJUkVDVDoKICAgICAgICAgLy8gUmVqZWN0IGFueSBlZmZlY3Qgb24gRGlyZWN0IG91dHB1dCB0aHJlYWRzIGZvciBub3csIHNpbmNlIHRoZSBmb3JtYXQgb2YKICAgICAgICAgLy8gbVNpbmtCdWZmZXIgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGVmZmVjdCBwcm9jZXNzaW5nIChQQ00gMTYgc3RlcmVvKS4KLSAgICAgICAgQUxPR1coImNoZWNrRWZmZWN0Q29tcGF0aWJpbGl0eV9sKCk6IGVmZmVjdCAlcyBvbiBESVJFQ1Qgb3V0cHV0IHRocmVhZCAlcyIsCi0gICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgbVRocmVhZE5hbWUpOworICAgICAgICBBTE9HVygiJXM6IGVmZmVjdCAlcyBvbiBESVJFQ1Qgb3V0cHV0IHRocmVhZCAlcyIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGRlc2MtPm5hbWUsIG1UaHJlYWROYW1lKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICBjYXNlIERVUExJQ0FUSU5HOgogI2lmbmRlZiBNVUxUSUNIQU5ORUxfRUZGRUNUX0NIQUlOCiAgICAgICAgIC8vIFJlamVjdCBhbnkgZWZmZWN0IG9uIG1peGVyIG11bHRpY2hhbm5lbCBzaW5rcy4KICAgICAgICAgLy8gVE9ETzogZml4IGJvdGggZm9ybWF0IGFuZCBtdWx0aWNoYW5uZWwgaXNzdWVzIHdpdGggZWZmZWN0cy4KICAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgIT0gRkNDXzIpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja0VmZmVjdENvbXBhdGliaWxpdHlfbCgpOiBlZmZlY3QgJXMgZm9yIG11bHRpY2hhbm5lbCglZCkiCi0gICAgICAgICAgICAgICAgICAgICIgb24gRFVQTElDQVRJTkcgdGhyZWFkICVzIiwgZGVzYy0+bmFtZSwgbUNoYW5uZWxDb3VudCwgbVRocmVhZE5hbWUpOworICAgICAgICAgICAgQUxPR1coIiVzOiBlZmZlY3QgJXMgZm9yIG11bHRpY2hhbm5lbCglZCkgb24gRFVQTElDQVRJTkcgdGhyZWFkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGRlc2MtPm5hbWUsIG1DaGFubmVsQ291bnQsIG1UaHJlYWROYW1lKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICNlbmRpZgogICAgICAgICBpZiAoYXVkaW9faXNfZ2xvYmFsX3Nlc3Npb24oc2Vzc2lvbklkKSkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrRWZmZWN0Q29tcGF0aWJpbGl0eV9sKCk6IGdsb2JhbCBlZmZlY3QgJXMgb24gRFVQTElDQVRJTkciCi0gICAgICAgICAgICAgICAgICAgICIgdGhyZWFkICVzIiwgZGVzYy0+bmFtZSwgbVRocmVhZE5hbWUpOworICAgICAgICAgICAgQUxPR1coIiVzOiBnbG9iYWwgZWZmZWN0ICVzIG9uIERVUExJQ0FUSU5HIHRocmVhZCAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjLT5uYW1lLCBtVGhyZWFkTmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIGlmICgoZGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfUE9TVF9QUk9DKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woKTogcG9zdCBwcm9jZXNzaW5nIGVmZmVjdCAlcyBvbiIKLSAgICAgICAgICAgICAgICAgICAgIiBEVVBMSUNBVElORyB0aHJlYWQgJXMiLCBkZXNjLT5uYW1lLCBtVGhyZWFkTmFtZSk7CisgICAgICAgICAgICBBTE9HVygiJXM6IHBvc3QgcHJvY2Vzc2luZyBlZmZlY3QgJXMgb24gRFVQTElDQVRJTkcgdGhyZWFkICVzIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGVzYy0+bmFtZSwgbVRocmVhZE5hbWUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBpZiAoKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfSFdfQUNDX1RVTk5FTCkgIT0gMCkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrRWZmZWN0Q29tcGF0aWJpbGl0eV9sKCk6IEhXIHR1bm5lbGVkIGVmZmVjdCAlcyBvbiIKLSAgICAgICAgICAgICAgICAgICAgIiBEVVBMSUNBVElORyB0aHJlYWQgJXMiLCBkZXNjLT5uYW1lLCBtVGhyZWFkTmFtZSk7CisgICAgICAgICAgICBBTE9HVygiJXM6IEhXIHR1bm5lbGVkIGVmZmVjdCAlcyBvbiBEVVBMSUNBVElORyB0aHJlYWQgJXMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGVzYy0+bmFtZSwgbVRocmVhZE5hbWUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKKyAgICBjYXNlIFNQQVRJQUxJWkVSOgorICAgICAgICAvLyBHbG9iYWwgZWZmZWN0cyAoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSBhcmUgbm90IHN1cHBvcnRlZCBvbiBzcGF0aWFsaXplciBtaXhlcgorICAgICAgICAvLyBhcyB0aGVyZSBpcyBubyBjb21tb24gYWNjdW11bGF0aW9uIGJ1ZmZlciBmb3Igc3B0aWFsaXplZCBhbmQgbm9uIHNwdGlhbGl6ZWQgdHJhY2tzLgorICAgICAgICAvLyBQb3N0IHByb2Nlc3NpbmcgZWZmZWN0cyAoQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0Ugb3IgQVVESU9fU0VTU0lPTl9ERVZJQ0UpCisgICAgICAgIC8vIGFyZSBzdXBwb3J0ZWQgYW5kIGFkZGVkIGFmdGVyIHRoZSBzcGF0aWFsaXplci4KKyAgICAgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogZ2xvYmFsIGVmZmVjdCAlcyBub3Qgc3VwcG9ydGVkIG9uIHNwYXRpYWxpemVyIHRocmVhZCAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjLT5uYW1lLCBtVGhyZWFkTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSkgeworICAgICAgICAgICAgLy8gb25seSBwb3N0IHByb2Nlc3NpbmcgLCBkb3dubWl4ZXIgb3Igc3BhdGlhbGl6ZXIgZWZmZWN0cyBvbiBvdXRwdXQgc3RhZ2Ugc2Vzc2lvbgorICAgICAgICAgICAgaWYgKG1lbWNtcCgmZGVzYy0+dHlwZSwgRlhfSUlEX1NQQVRJQUxJWkVSLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgbWVtY21wKCZkZXNjLT50eXBlLCBFRkZFQ1RfVUlJRF9ET1dOTUlYLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoZGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfUE9TVF9QUk9DKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBub24gcG9zdCBwcm9jZXNzaW5nIGVmZmVjdCAlcyBub3QgYWxsb3dlZCBvbiBvdXRwdXQgc3RhZ2Ugc2Vzc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGVzYy0+bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9ERVZJQ0UpIHsKKyAgICAgICAgICAgIC8vIG9ubHkgcG9zdCBwcm9jZXNzaW5nIG9uIG91dHB1dCBzdGFnZSBzZXNzaW9uCisgICAgICAgICAgICBpZiAoKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQykgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogbm9uIHBvc3QgcHJvY2Vzc2luZyBlZmZlY3QgJXMgbm90IGFsbG93ZWQgb24gZGV2aWNlIHNlc3Npb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGRlc2MtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woKTogd3JvbmcgdGhyZWFkIHR5cGUgJWQiLCBtVHlwZSk7CiAgICAgfQpAQCAtMTQxOCw3ICsxNTAwLDggQEAKICAgICAgICAgaW50ICplbmFibGVkLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAogICAgICAgICBib29sIHBpbm5lZCwKLSAgICAgICAgYm9vbCBwcm9iZSkKKyAgICAgICAgYm9vbCBwcm9iZSwKKyAgICAgICAgYm9vbCBub3RpZnlGcmFtZXNQcm9jZXNzZWQpCiB7CiAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3Q7CiAgICAgc3A8RWZmZWN0SGFuZGxlPiBoYW5kbGU7CkBAIC0xNDc3LDE4ICsxNTYwLDE5IEBACiAgICAgICAgIGlmIChlZmZlY3QtPmlzSGFwdGljR2VuZXJhdG9yKCkpIHsKICAgICAgICAgICAgIC8vIFRPRE8oYi8xODQxOTQwNTcpOiBVc2UgdGhlIHZpYnJhdG9yIGluZm9ybWF0aW9uIGZyb20gdGhlIHZpYnJhdG9yIHRoYXQgd2lsbCBiZSB1c2VkCiAgICAgICAgICAgICAvLyBmb3IgdGhlIEhhcHRpY0dlbmVyYXRvci4KLSAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbyogZGVmYXVsdFZpYnJhdG9ySW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXItPmdldERlZmF1bHRWaWJyYXRvckluZm9fbCgpOwotICAgICAgICAgICAgaWYgKGRlZmF1bHRWaWJyYXRvckluZm8gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxtZWRpYTo6QXVkaW9WaWJyYXRvckluZm8+IGRlZmF1bHRWaWJyYXRvckluZm8gPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUobUF1ZGlvRmxpbmdlci0+Z2V0RGVmYXVsdFZpYnJhdG9ySW5mb19sKCkpOworICAgICAgICAgICAgaWYgKGRlZmF1bHRWaWJyYXRvckluZm8pIHsKICAgICAgICAgICAgICAgICAvLyBPbmx5IHNldCB0aGUgdmlicmF0b3IgaW5mbyB3aGVuIGl0IGlzIGEgdmFsaWQgb25lLgotICAgICAgICAgICAgICAgIGVmZmVjdC0+c2V0VmlicmF0b3JJbmZvKGRlZmF1bHRWaWJyYXRvckluZm8pOworICAgICAgICAgICAgICAgIGVmZmVjdC0+c2V0VmlicmF0b3JJbmZvKCpkZWZhdWx0VmlicmF0b3JJbmZvKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBjcmVhdGUgZWZmZWN0IGhhbmRsZSBhbmQgY29ubmVjdCBpdCB0byBlZmZlY3QgbW9kdWxlCi0gICAgICAgIGhhbmRsZSA9IG5ldyBFZmZlY3RIYW5kbGUoZWZmZWN0LCBjbGllbnQsIGVmZmVjdENsaWVudCwgcHJpb3JpdHkpOworICAgICAgICBoYW5kbGUgPSBuZXcgRWZmZWN0SGFuZGxlKGVmZmVjdCwgY2xpZW50LCBlZmZlY3RDbGllbnQsIHByaW9yaXR5LCBub3RpZnlGcmFtZXNQcm9jZXNzZWQpOwogICAgICAgICBsU3RhdHVzID0gaGFuZGxlLT5pbml0Q2hlY2soKTsKICAgICAgICAgaWYgKGxTdGF0dXMgPT0gT0spIHsKICAgICAgICAgICAgIGxTdGF0dXMgPSBlZmZlY3QtPmFkZEhhbmRsZShoYW5kbGUuZ2V0KCkpOworICAgICAgICAgICAgc2VuZENoZWNrT3V0cHV0U3RhZ2VFZmZlY3RzRXZlbnRfbCgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChlbmFibGVkICE9IE5VTEwpIHsKICAgICAgICAgICAgICplbmFibGVkID0gKGludCllZmZlY3QtPmlzRW5hYmxlZCgpOwpAQCAtMTUzMSw2ICsxNjE1LDcgQEAKICAgICAgICAgaWYgKHJlbW92ZSkgewogICAgICAgICAgICAgcmVtb3ZlRWZmZWN0X2woZWZmZWN0LCB0cnVlKTsKICAgICAgICAgfQorICAgICAgICBzZW5kQ2hlY2tPdXRwdXRTdGFnZUVmZmVjdHNFdmVudF9sKCk7CiAgICAgfQogICAgIGlmIChyZW1vdmUpIHsKICAgICAgICAgbUF1ZGlvRmxpbmdlci0+dXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zKGVmZmVjdCk7CkBAIC0xODg0LDEwICsxOTY5LDI0IEBACiAgICAgICAgIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggImxhdGVuY3lNcy5tZWFuIiwgbUxhdGVuY3lNcy5nZXRNZWFuKCkpOwogICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJsYXRlbmN5TXMuc3RkIiwgbUxhdGVuY3lNcy5nZXRTdGREZXYoKSk7CiAgICAgfQorICAgIGlmIChtTW9ub3BpcGVQaXBlRGVwdGhTdGF0cy5nZXROKCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggIm1vbm9waXBlUGlwZURlcHRoU3RhdHMubWVhbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTW9ub3BpcGVQaXBlRGVwdGhTdGF0cy5nZXRNZWFuKCkpOworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJtb25vcGlwZVBpcGVEZXB0aFN0YXRzLnN0ZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTW9ub3BpcGVQaXBlRGVwdGhTdGF0cy5nZXRTdGREZXYoKSk7CisgICAgfQogCiAgICAgaXRlbS0+c2VsZnJlY29yZCgpOwogfQogCitwcm9kdWN0X3N0cmF0ZWd5X3QgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKK3sKKyAgICBpZiAoIW1BdWRpb0ZsaW5nZXItPmlzQXVkaW9Qb2xpY3lSZWFkeSgpKSB7CisgICAgICAgIHJldHVybiBQUk9EVUNUX1NUUkFURUdZX05PTkU7CisgICAgfQorICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBQbGF5YmFjawogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTg5NiwxNSArMTk5NSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKm1peGVyQ29uZmlnKQogICAgIDogICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIHR5cGUsIHN5c3RlbVJlYWR5LCB0cnVlIC8qIGlzT3V0ICovKSwKICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQoMCksIG1TaW5rQnVmZmVyKE5VTEwpLAotICAgICAgICBtTWl4ZXJCdWZmZXJFbmFibGVkKEF1ZGlvRmxpbmdlcjo6a0VuYWJsZUV4dGVuZGVkUHJlY2lzaW9uKSwKKyAgICAgICAgbU1peGVyQnVmZmVyRW5hYmxlZChBdWRpb0ZsaW5nZXI6OmtFbmFibGVFeHRlbmRlZFByZWNpc2lvbiB8fCB0eXBlID09IFNQQVRJQUxJWkVSKSwKICAgICAgICAgbU1peGVyQnVmZmVyKE5VTEwpLAogICAgICAgICBtTWl4ZXJCdWZmZXJTaXplKDApLAogICAgICAgICBtTWl4ZXJCdWZmZXJGb3JtYXQoQVVESU9fRk9STUFUX0lOVkFMSUQpLAogICAgICAgICBtTWl4ZXJCdWZmZXJWYWxpZChmYWxzZSksCi0gICAgICAgIG1FZmZlY3RCdWZmZXJFbmFibGVkKEF1ZGlvRmxpbmdlcjo6a0VuYWJsZUV4dGVuZGVkUHJlY2lzaW9uKSwKKyAgICAgICAgbUVmZmVjdEJ1ZmZlckVuYWJsZWQoQXVkaW9GbGluZ2VyOjprRW5hYmxlRXh0ZW5kZWRQcmVjaXNpb24gfHwgdHlwZSA9PSBTUEFUSUFMSVpFUiksCiAgICAgICAgIG1FZmZlY3RCdWZmZXIoTlVMTCksCiAgICAgICAgIG1FZmZlY3RCdWZmZXJTaXplKDApLAogICAgICAgICBtRWZmZWN0QnVmZmVyRm9ybWF0KEFVRElPX0ZPUk1BVF9JTlZBTElEKSwKQEAgLTE5NTYsOCArMjA1NiwxOCBAQAogICAgICAgICAgICAgICAgIG1PdXRwdXQtPmF1ZGlvSHdEZXYtPm1vZHVsZU5hbWUoKSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMDsKICAgICB9CiAKKyAgICBpZiAobWl4ZXJDb25maWcgIT0gbnVsbHB0ciAmJiBtaXhlckNvbmZpZy0+Y2hhbm5lbF9tYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICBtTWl4ZXJDaGFubmVsTWFzayA9IG1peGVyQ29uZmlnLT5jaGFubmVsX21hc2s7CisgICAgfQorCiAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpOwogCisgICAgaWYgKG1UeXBlICE9IFNQQVRJQUxJWkVSCisgICAgICAgICAgICAmJiBtTWl4ZXJDaGFubmVsTWFzayAhPSBtQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSEFMIGNoYW5uZWwgbWFzayAlI3ggZG9lcyBub3QgbWF0Y2ggbWl4ZXIgY2hhbm5lbCBtYXNrICUjeCIsCisgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLCBtTWl4ZXJDaGFubmVsTWFzayk7CisgICAgfQorCiAgICAgLy8gVE9ETzogV2UgbWF5IGFsc28gbWF0Y2ggb24gYWRkcmVzcyBhcyB3ZWxsIGFzIGRldmljZSB0eXBlIGZvcgogICAgIC8vIEFVRElPX0RFVklDRV9PVVRfQlVTLCBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQLCBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKICAgICBpZiAodHlwZSA9PSBNSVhFUiB8fCB0eXBlID09IERJUkVDVCB8fCB0eXBlID09IE9GRkxPQUQpIHsKQEAgLTE5ODYsNiArMjA5Niw3IEBACiAgICAgZnJlZShtU2lua0J1ZmZlcik7CiAgICAgZnJlZShtTWl4ZXJCdWZmZXIpOwogICAgIGZyZWUobUVmZmVjdEJ1ZmZlcik7CisgICAgZnJlZShtUG9zdFNwYXRpYWxpemVyQnVmZmVyKTsKIH0KIAogLy8gVGhyZWFkIHZpcnR1YWxzCkBAIC0yMDAzLDE2ICsyMTE0LDE1IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgcnVuKG1UaHJlYWROYW1lLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7CisgICAgbVRocmVhZFNuYXBzaG90LnNldFRpZChnZXRUaWQoKSk7CiB9CiAKIC8vIFRocmVhZEJhc2UgdmlydHVhbHMKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cHJlRXhpdCgpCiB7CiAgICAgQUxPR1YoIiAgcHJlRXhpdCgpIik7Ci0gICAgLy8gRklYTUUgdGhpcyBpcyB1c2luZyBoYXJkLWNvZGVkIHN0cmluZ3MgYnV0IGluIHRoZSBmdXR1cmUsIHRoaXMgZnVuY3Rpb25hbGl0eSB3aWxsIGJlCi0gICAgLy8gICAgICAgY29udmVydGVkIHRvIHVzZSBhdWRpbyBIQUwgZXh0ZW5zaW9ucyByZXF1aXJlZCB0byBzdXBwb3J0IHR1bm5lbGluZwotICAgIHN0YXR1c190IHJlc3VsdCA9IG1PdXRwdXQtPnN0cmVhbS0+c2V0UGFyYW1ldGVycyhTdHJpbmc4KCJleGl0aW5nPTEiKSk7Ci0gICAgQUxPR0VfSUYocmVzdWx0ICE9IE9LLCAiRXJyb3Igd2hlbiBzZXR0aW5nIHBhcmFtZXRlcnMgb24gZXhpdDogJWQiLCByZXN1bHQpOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1PdXRwdXQtPnN0cmVhbS0+ZXhpdCgpOworICAgIEFMT0dFX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHdoZW4gY2FsbGluZyBleGl0KCk6ICVkIiwgcmVzdWx0KTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wVHJhY2tzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQpAQCAtMjA4MCwxMCArMjE5MCwxMiBAQAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgZHByaW50ZihmZCwgIiAgTWFzdGVyIHZvbHVtZTogJWZcbiIsIG1NYXN0ZXJWb2x1bWUpOwogICAgIGRwcmludGYoZmQsICIgIE1hc3RlciBtdXRlOiAlc1xuIiwgbU1hc3Rlck11dGUgPyAib24iIDogIm9mZiIpOworICAgIGRwcmludGYoZmQsICIgIE1peGVyIGNoYW5uZWwgTWFzazogJSN4ICglcylcbiIsCisgICAgICAgICAgICBtTWl4ZXJDaGFubmVsTWFzaywgY2hhbm5lbE1hc2tUb1N0cmluZyhtTWl4ZXJDaGFubmVsTWFzaywgdHJ1ZSAvKiBvdXRwdXQgKi8pLmNfc3RyKCkpOwogICAgIGlmIChtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIEhhcHRpYyBjaGFubmVsIG1hc2s6ICUjeCAoJXMpXG4iLCBtSGFwdGljQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tUb1N0cmluZyhtSGFwdGljQ2hhbm5lbE1hc2ssIHRydWUgLyogb3V0cHV0ICovKS5jX3N0cigpKTsKQEAgLTIxMDksNyArMjIyMSw3IEBACiAgICAgfQogICAgIGlmIChvdXRwdXQgIT0gbnVsbHB0cikgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBIYWwgc3RyZWFtIGR1bXA6XG4iKTsKLSAgICAgICAgKHZvaWQpb3V0cHV0LT5zdHJlYW0tPmR1bXAoZmQpOworICAgICAgICAodm9pZClvdXRwdXQtPnN0cmVhbS0+ZHVtcChmZCwgYXJncyk7CiAgICAgfQogfQogCkBAIC0yMTMzLDcgKzIyNDUsOCBAQAogICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrKQorICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICBib29sIGlzU3BhdGlhbGl6ZWQpCiB7CiAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAqcEZyYW1lQ291bnQ7CiAgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSAqcE5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CkBAIC0yMjE5LDcgKzIzMzIsNyBAQAogICAgICAgICAgICAgICAgICAiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBhY2NlcHRlZDogZnJhbWVDb3VudD0lenUgbUZyYW1lQ291bnQ9JXp1IiwKICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkOiBzaGFyZWRCdWZmZXI9JXAgZnJhbWVDb3VudD0lenUgIgorICAgICAgICBBTE9HRCgiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQ6IHNoYXJlZEJ1ZmZlcj0lcCBmcmFtZUNvdW50PSV6dSAiCiAgICAgICAgICAgICAgICAgIm1GcmFtZUNvdW50PSV6dSBmb3JtYXQ9JSN4IG1Gb3JtYXQ9JSN4IGlzTGluZWFyPSVkIGNoYW5uZWxNYXNrPSUjeCAiCiAgICAgICAgICAgICAgICAgInNhbXBsZVJhdGU9JXUgbVNhbXBsZVJhdGU9JXUgIgogICAgICAgICAgICAgICAgICJoYXNGYXN0TWl4ZXI9JWQgdGlkPSVkIGZhc3RUcmFja0F2YWlsTWFzaz0lI3giLApAQCAtMjM5NywxMSArMjUxMCwxMSBAQAogICAgICAgICAvLyBhbGwgdHJhY2tzIGluIHNhbWUgYXVkaW8gc2Vzc2lvbiBtdXN0IHNoYXJlIHRoZSBzYW1lIHJvdXRpbmcgc3RyYXRlZ3kgb3RoZXJ3aXNlCiAgICAgICAgIC8vIGNvbmZsaWN0cyB3aWxsIGhhcHBlbiB3aGVuIHRyYWNrcyBhcmUgbW92ZWQgZnJvbSBvbmUgb3V0cHV0IHRvIGFub3RoZXIgYnkgYXVkaW8gcG9saWN5CiAgICAgICAgIC8vIG1hbmFnZXIKLSAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5ID0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbVR5cGUpOworICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW1UeXBlKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdCA9IG1UcmFja3NbaV07CiAgICAgICAgICAgICBpZiAodCAhPSAwICYmIHQtPmlzRXh0ZXJuYWxUcmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IGFjdHVhbCA9IEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbSh0LT5zdHJlYW1UeXBlKCkpOworICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBhY3R1YWwgPSBnZXRTdHJhdGVneUZvclN0cmVhbSh0LT5zdHJlYW1UeXBlKCkpOwogICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdC0+c2Vzc2lvbklkKCkgJiYgc3RyYXRlZ3kgIT0gYWN0dWFsKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgbWlzbWF0Y2hlZCBzdHJhdGVneTsgZXhwZWN0ZWQgJXUgYnV0IGZvdW5kICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSwgYWN0dWFsKTsKQEAgLTI0MjUsNyArMjUzOCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBjcmVhdG9yUGlkLCBhdHRyaWJ1dGlvblNvdXJjZSwgdHJhY2tGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlOjpUWVBFX0RFRkFVTFQsIHBvcnRJZCwgU0laRV9NQVggLypmcmFtZUNvdW50VG9CZVJlYWR5Ki8sIHNwZWVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlOjpUWVBFX0RFRkFVTFQsIHBvcnRJZCwgU0laRV9NQVggLypmcmFtZUNvdW50VG9CZVJlYWR5Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkLCBpc1NwYXRpYWxpemVkKTsKIAogICAgICAgICBsU3RhdHVzID0gdHJhY2sgIT0gMCA/IHRyYWNrLT5pbml0Q2hlY2soKSA6IChzdGF0dXNfdCkgTk9fTUVNT1JZOwogICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtMjQ0NSw3ICsyNTU5LDcgQEAKICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVUcmFja19sKCkgc2V0dGluZyBtYWluIGJ1ZmZlciAlcCIsIGNoYWluLT5pbkJ1ZmZlcigpKTsKICAgICAgICAgICAgIHRyYWNrLT5zZXRNYWluQnVmZmVyKGNoYWluLT5pbkJ1ZmZlcigpKTsKLSAgICAgICAgICAgIGNoYWluLT5zZXRTdHJhdGVneShBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0odHJhY2stPnN0cmVhbVR5cGUoKSkpOworICAgICAgICAgICAgY2hhaW4tPnNldFN0cmF0ZWd5KGdldFN0cmF0ZWd5Rm9yU3RyZWFtKHRyYWNrLT5zdHJlYW1UeXBlKCkpKTsKICAgICAgICAgICAgIGNoYWluLT5pbmNUcmFja0NudCgpOwogICAgICAgICB9CiAKQEAgLTI2MTMsOCArMjcyNywxOSBAQAogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICBjb25zdCBpbnQgaW50ZW5zaXR5ID0gQXVkaW9GbGluZ2VyOjpvbkV4dGVybmFsVmlicmF0aW9uU3RhcnQoCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5nZXRFeHRlcm5hbFZpYnJhdGlvbigpKTsKKyAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8bWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvPiB2aWJyYXRvckluZm87CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzE4NDE5NDc4MCk6IFVzZSB0aGUgdmlicmF0b3IgaW5mb3JtYXRpb24gZnJvbSB0aGUgdmlicmF0b3IgdGhhdCB3aWxsIGJlCisgICAgICAgICAgICAgICAgLy8gdXNlZCB0byBwbGF5IHRoaXMgdHJhY2suCisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1BdWRpb0ZsaW5nZXItPm1Mb2NrKTsKKyAgICAgICAgICAgICAgICB2aWJyYXRvckluZm8gPSBzdGQ6Om1vdmUobUF1ZGlvRmxpbmdlci0+Z2V0RGVmYXVsdFZpYnJhdG9ySW5mb19sKCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgdHJhY2stPnNldEhhcHRpY0ludGVuc2l0eShzdGF0aWNfY2FzdDxvczo6SGFwdGljU2NhbGU+KGludGVuc2l0eSkpOworICAgICAgICAgICAgaWYgKHZpYnJhdG9ySW5mbykgeworICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRIYXB0aWNNYXhBbXBsaXR1ZGUodmlicmF0b3JJbmZvLT5tYXhBbXBsaXR1ZGUpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBIYXB0aWMgcGxheWJhY2sgc2hvdWxkIGJlIGVuYWJsZWQgYnkgdmlicmF0b3Igc2VydmljZS4KICAgICAgICAgICAgIGlmICh0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIGhhcHRpYyBwbGF5YmFjayBvZiBhbGwgYWN0aXZlIHRyYWNrIHRvIGVuc3VyZSBvbmx5CkBAIC0yNzA3LDM2ICsyODMyLDI2IEBACiAgICAgcmV0dXJuIG1PdXRwdXQtPnN0cmVhbS0+c2VsZWN0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCwKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LCBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgewotICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CiAgICAgQUxPR1YoIlBsYXliYWNrVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQsIHRocmVhZCAlcCwgZXZlbnQgJWQiLCB0aGlzLCBldmVudCk7Ci0KLSAgICBkZXNjLT5tSW9IYW5kbGUgPSBtSWQ7Ci0gICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoID0gbVBhdGNoOwotICAgIGlmIChpc01zZERldmljZSgpKSB7Ci0gICAgICAgIHBhdGNoID0gbURvd25TdHJlYW1QYXRjaDsKLSAgICB9Ci0KKyAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZGVzYzsKKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2ggPSBpc01zZERldmljZSgpID8gbURvd25TdHJlYW1QYXRjaCA6IG1QYXRjaDsKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgY2FzZSBBVURJT19PVVRQVVRfT1BFTkVEOgogICAgIGNhc2UgQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQ6CiAgICAgY2FzZSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgIGRlc2MtPm1QYXRjaCA9IHBhdGNoOwotICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7Ci0gICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKLSAgICAgICAgZGVzYy0+bUZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgICAgIGRlc2MtPm1GcmFtZUNvdW50ID0gbU5vcm1hbEZyYW1lQ291bnQ7IC8vIEZJWE1FIHNlZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9GbGluZ2VyOjpmcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90KQotICAgICAgICBkZXNjLT5tRnJhbWVDb3VudEhBTCA9IG1GcmFtZUNvdW50OwotICAgICAgICBkZXNjLT5tTGF0ZW5jeSA9IGxhdGVuY3lfbCgpOworICAgICAgICBkZXNjID0gc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+OjptYWtlKG1JZCwgcGF0Y2gsIGZhbHNlIC8qaXNJbnB1dCovLAorICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgLy8gRklYTUUgQXVkaW9GbGluZ2VyOjpmcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90KSBpbnN0ZWFkIG9mIG1Ob3JtYWxGcmFtZUNvdW50PworICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50LCBtRnJhbWVDb3VudCwgbGF0ZW5jeV9sKCkpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX0NMSUVOVF9TVEFSVEVEOgotICAgICAgICBkZXNjLT5tUGF0Y2ggPSBwYXRjaDsKLSAgICAgICAgZGVzYy0+bVBvcnRJZCA9IHBvcnRJZDsKKyAgICAgICAgZGVzYyA9IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPjo6bWFrZShtSWQsIHBhdGNoLCBwb3J0SWQpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX09VVFBVVF9DTE9TRUQ6CiAgICAgZGVmYXVsdDoKKyAgICAgICAgZGVzYyA9IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPjo6bWFrZShtSWQpOwogICAgICAgICBicmVhazsKICAgICB9CiAgICAgbUF1ZGlvRmxpbmdlci0+aW9Db25maWdDaGFuZ2VkKGV2ZW50LCBkZXNjLCBwaWQpOwpAQCAtMjgxNCwxNCArMjkyOSwyMCBAQAogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwobUNoYW5uZWxNYXNrKSkgewogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJIQUwgY2hhbm5lbCBtYXNrICUjeCBub3QgdmFsaWQgZm9yIG91dHB1dCIsIG1DaGFubmVsTWFzayk7CiAgICAgfQotICAgIGlmICgobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcpCi0gICAgICAgICAgICAmJiAhaXNWYWxpZFBjbVNpbmtDaGFubmVsTWFzayhtQ2hhbm5lbE1hc2spKSB7CisgICAgaWYgKGhhc01peGVyKCkgJiYgIWlzVmFsaWRQY21TaW5rQ2hhbm5lbE1hc2sobUNoYW5uZWxNYXNrKSkgewogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJIQUwgY2hhbm5lbCBtYXNrICUjeCBub3Qgc3VwcG9ydGVkIGZvciBtaXhlZCBvdXRwdXQiLAogICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayk7CiAgICAgfQorCisgICAgaWYgKG1NaXhlckNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICBtTWl4ZXJDaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsKKyAgICB9CisKICAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1DaGFubmVsTWFzayk7CiAgICAgbUJhbGFuY2Uuc2V0Q2hhbm5lbE1hc2sobUNoYW5uZWxNYXNrKTsKIAorICAgIHVpbnQzMl90IG1peGVyQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1NaXhlckNoYW5uZWxNYXNrKTsKKwogICAgIC8vIEdldCBhY3R1YWwgSEFMIGZvcm1hdC4KICAgICBzdGF0dXNfdCByZXN1bHQgPSBtT3V0cHV0LT5zdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcyhudWxscHRyLCBudWxscHRyLCAmbUhBTEZvcm1hdCk7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXN1bHQgIT0gT0ssICJFcnJvciB3aGVuIHJldHJpZXZpbmcgb3V0cHV0IHN0cmVhbSBmb3JtYXQ6ICVkIiwgcmVzdWx0KTsKQEAgLTI4MzEsOCArMjk1Miw3IEBACiAgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQobUZvcm1hdCkpIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSEFMIGZvcm1hdCAlI3ggbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtRm9ybWF0KTsKICAgICB9Ci0gICAgaWYgKChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBEVVBMSUNBVElORykKLSAgICAgICAgICAgICYmICFpc1ZhbGlkUGNtU2lua0Zvcm1hdChtRm9ybWF0KSkgeworICAgIGlmIChoYXNNaXhlcigpICYmICFpc1ZhbGlkUGNtU2lua0Zvcm1hdChtRm9ybWF0KSkgewogICAgICAgICBMT0dfRkFUQUwoIkhBTCBmb3JtYXQgJSN4IG5vdCBzdXBwb3J0ZWQgZm9yIG1peGVkIG91dHB1dCIsCiAgICAgICAgICAgICAgICAgbUZvcm1hdCk7CiAgICAgfQpAQCAtMjg0MSw3ICsyOTYxLDcgQEAKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSBPSywKICAgICAgICAgICAgICJFcnJvciB3aGVuIHJldHJpZXZpbmcgb3V0cHV0IHN0cmVhbSBidWZmZXIgc2l6ZTogJWQiLCByZXN1bHQpOwogICAgIG1GcmFtZUNvdW50ID0gbUJ1ZmZlclNpemUgLyBtRnJhbWVTaXplOwotICAgIGlmICgobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcpICYmIChtRnJhbWVDb3VudCAmIDE1KSkgeworICAgIGlmIChoYXNNaXhlcigpICYmIChtRnJhbWVDb3VudCAmIDE1KSkgewogICAgICAgICBBTE9HVygiSEFMIG91dHB1dCBidWZmZXIgc2l6ZSBpcyAlenUgZnJhbWVzIGJ1dCBBdWRpb01peGVyIHJlcXVpcmVzIG11bHRpcGxlcyBvZiAxNiBmcmFtZXMiLAogICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50KTsKICAgICB9CkBAIC0yODg4LDYgKzMwMDgsNyBAQAogCiAgICAgLy8gQ2FsY3VsYXRlIHNpemUgb2Ygbm9ybWFsIHNpbmsgYnVmZmVyIHJlbGF0aXZlIHRvIHRoZSBIQUwgb3V0cHV0IGJ1ZmZlciBzaXplCiAgICAgZG91YmxlIG11bHRpcGxpZXIgPSAxLjA7CisgICAgLy8gTm90ZTogbVR5cGUgPT0gU1BBVElBTElaRVIgZG9lcyBub3Qgc3VwcG9ydCBGYXN0TWl4ZXIuCiAgICAgaWYgKG1UeXBlID09IE1JWEVSICYmIChrVXNlRmFzdE1peGVyID09IEZhc3RNaXhlcl9TdGF0aWMgfHwKICAgICAgICAgICAgIGtVc2VGYXN0TWl4ZXIgPT0gRmFzdE1peGVyX0R5bmFtaWMpKSB7CiAgICAgICAgIHNpemVfdCBtaW5Ob3JtYWxGcmFtZUNvdW50ID0gKGtNaW5Ob3JtYWxTaW5rQnVmZmVyU2l6ZU1zICogbVNhbXBsZVJhdGUpIC8gMTAwMDsKQEAgLTI5MTQsNyArMzAzNSw3IEBACiAgICAgfQogICAgIG1Ob3JtYWxGcmFtZUNvdW50ID0gbXVsdGlwbGllciAqIG1GcmFtZUNvdW50OwogICAgIC8vIHJvdW5kIHVwIHRvIG5lYXJlc3QgMTYgZnJhbWVzIHRvIHNhdGlzZnkgQXVkaW9NaXhlcgotICAgIGlmIChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBEVVBMSUNBVElORykgeworICAgIGlmIChoYXNNaXhlcigpKSB7CiAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ID0gKG1Ob3JtYWxGcmFtZUNvdW50ICsgMTUpICYgfjE1OwogICAgIH0KICAgICBBTE9HSSgiSEFMIG91dHB1dCBidWZmZXIgc2l6ZSAlenUgZnJhbWVzLCBub3JtYWwgc2luayBidWZmZXIgc2l6ZSAlenUgZnJhbWVzIiwgbUZyYW1lQ291bnQsCkBAIC0yOTMwLDYgKzMwNTEsNyBAQAogICAgIC8vIE9yaWdpbmFsbHkgdGhpcyB3YXMgaW50MTZfdFtdIGFycmF5LCBuZWVkIHRvIHJlbW92ZSBsZWdhY3kgaW1wbGljYXRpb25zLgogICAgIGZyZWUobVNpbmtCdWZmZXIpOwogICAgIG1TaW5rQnVmZmVyID0gTlVMTDsKKwogICAgIC8vIEZvciBzaW5rIGJ1ZmZlciBzaXplLCB3ZSB1c2UgdGhlIGZyYW1lIHNpemUgZnJvbSB0aGUgZG93bnN0cmVhbSBzaW5rIHRvIGF2b2lkIHByb2JsZW1zCiAgICAgLy8gd2l0aCBub24gUENNIGZvcm1hdHMgZm9yIGNvbXByZXNzZWQgbXVzaWMsIGUuZy4gQUFDLCBhbmQgT2ZmbG9hZCB0aHJlYWRzLgogICAgIGNvbnN0IHNpemVfdCBzaW5rQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKQEAgLTI5NDEsNyArMzA2Myw3IEBACiAgICAgbU1peGVyQnVmZmVyID0gTlVMTDsKICAgICBpZiAobU1peGVyQnVmZmVyRW5hYmxlZCkgewogICAgICAgICBtTWl4ZXJCdWZmZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOyAvLyBubyBsb25nZXIgdmFsaWQ6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgotICAgICAgICBtTWl4ZXJCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50CisgICAgICAgIG1NaXhlckJ1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1peGVyQ2hhbm5lbENvdW50CiAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1NaXhlckJ1ZmZlckZvcm1hdCk7CiAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtTWl4ZXJCdWZmZXIsIDMyLCBtTWl4ZXJCdWZmZXJTaXplKTsKICAgICB9CkBAIC0yOTQ5LDE1ICszMDcxLDI0IEBACiAgICAgbUVmZmVjdEJ1ZmZlciA9IE5VTEw7CiAgICAgaWYgKG1FZmZlY3RCdWZmZXJFbmFibGVkKSB7CiAgICAgICAgIG1FZmZlY3RCdWZmZXJGb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKLSAgICAgICAgbUVmZmVjdEJ1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQKKyAgICAgICAgbUVmZmVjdEJ1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1peGVyQ2hhbm5lbENvdW50CiAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1FZmZlY3RCdWZmZXJGb3JtYXQpOwogICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbUVmZmVjdEJ1ZmZlciwgMzIsIG1FZmZlY3RCdWZmZXJTaXplKTsKICAgICB9CiAKKyAgICBpZiAobVR5cGUgPT0gU1BBVElBTElaRVIpIHsKKyAgICAgICAgZnJlZShtUG9zdFNwYXRpYWxpemVyQnVmZmVyKTsKKyAgICAgICAgbVBvc3RTcGF0aWFsaXplckJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIG1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1FZmZlY3RCdWZmZXJGb3JtYXQpOworICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbVBvc3RTcGF0aWFsaXplckJ1ZmZlciwgMzIsIG1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXJTaXplKTsKKyAgICB9CisKICAgICBtSGFwdGljQ2hhbm5lbE1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obUNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKICAgICBtQ2hhbm5lbE1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obUNoYW5uZWxNYXNrICYgfm1IYXB0aWNDaGFubmVsTWFzayk7CiAgICAgbUhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtSGFwdGljQ2hhbm5lbE1hc2spOwogICAgIG1DaGFubmVsQ291bnQgLT0gbUhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICBtTWl4ZXJDaGFubmVsTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtTWl4ZXJDaGFubmVsTWFzayAmIH5tSGFwdGljQ2hhbm5lbE1hc2spOwogCiAgICAgLy8gZm9yY2UgcmVjb25maWd1cmF0aW9uIG9mIGVmZmVjdCBjaGFpbnMgYW5kIGVuZ2luZXMgdG8gdGFrZSBuZXcgYnVmZmVyIHNpemUgYW5kIGF1ZGlvCiAgICAgLy8gcGFyYW1ldGVycyBpbnRvIGFjY291bnQKQEAgLTMwNTEsMTUgKzMxODIsMTUgQEAKICAgICAvLyBzZXNzaW9uIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCBpcyBwbGFjZWQgaW4gc2FtZSBzdHJhdGVneSBhcyBNVVNJQyBzdHJlYW0gc28gdGhhdAogICAgIC8vIGl0IGlzIG1vdmVkIHRvIGNvcnJlY3Qgb3V0cHV0IGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHdoZW4gQTJEUCBpcyBjb25uZWN0ZWQgb3IgZGlzY29ubmVjdGVkCiAgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKLSAgICAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShBVURJT19TVFJFQU1fTVVTSUMpOworICAgICAgICByZXR1cm4gZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX01VU0lDKTsKICAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdHJhY2stPnNlc3Npb25JZCgpICYmICF0cmFjay0+aXNJbnZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0odHJhY2stPnN0cmVhbVR5cGUoKSk7CisgICAgICAgICAgICByZXR1cm4gZ2V0U3RyYXRlZ3lGb3JTdHJlYW0odHJhY2stPnN0cmVhbVR5cGUoKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShBVURJT19TVFJFQU1fTVVTSUMpOworICAgIHJldHVybiBnZXRTdHJhdGVneUZvclN0cmVhbShBVURJT19TVFJFQU1fTVVTSUMpOwogfQogCiAKQEAgLTMyMjYsNiArMzM1Nyw3IEBACiAgICAgbUluV3JpdGUgPSBmYWxzZTsKICAgICBpZiAobVN0YW5kYnkpIHsKICAgICAgICAgbVRocmVhZE1ldHJpY3MubG9nQmVnaW5JbnRlcnZhbCgpOworICAgICAgICBtVGhyZWFkU25hcHNob3Qub25CZWdpbigpOwogICAgICAgICBtU3RhbmRieSA9IGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gYnl0ZXNXcml0dGVuOwpAQCAtMzMzNiwyMyArMzQ2OCwzNCBAQAogewogICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gY2hhaW4tPnNlc3Npb25JZCgpOwogICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gaGFsSW5CdWZmZXIsIGhhbE91dEJ1ZmZlcjsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtQXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPm1pcnJvckJ1ZmZlcigKLSAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJFbmFibGVkID8gbUVmZmVjdEJ1ZmZlciA6IG1TaW5rQnVmZmVyLAotICAgICAgICAgICAgbUVmZmVjdEJ1ZmZlckVuYWJsZWQgPyBtRWZmZWN0QnVmZmVyU2l6ZSA6IG1TaW5rQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICZoYWxJbkJ1ZmZlcik7Ci0gICAgaWYgKHJlc3VsdCAhPSBPSykgcmV0dXJuIHJlc3VsdDsKLSAgICBoYWxPdXRCdWZmZXIgPSBoYWxJbkJ1ZmZlcjsKLSAgICBlZmZlY3RfYnVmZmVyX3QgKmJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZWZmZWN0X2J1ZmZlcl90Kj4oaGFsSW5CdWZmZXItPmV4dGVybmFsRGF0YSgpKTsKLSAgICBBTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpICVwIG9uIHRocmVhZCAlcCBmb3Igc2Vzc2lvbiAlZCIsIGNoYWluLmdldCgpLCB0aGlzLCBzZXNzaW9uKTsKLSAgICBpZiAoIWF1ZGlvX2lzX2dsb2JhbF9zZXNzaW9uKHNlc3Npb24pKSB7Ci0gICAgICAgIC8vIE9ubHkgb25lIGVmZmVjdCBjaGFpbiBjYW4gYmUgcHJlc2VudCBpbiBkaXJlY3Qgb3V0cHV0IHRocmVhZCBhbmQgaXQgdXNlcwotICAgICAgICAvLyB0aGUgc2luayBidWZmZXIgYXMgaW5wdXQKLSAgICAgICAgaWYgKG1UeXBlICE9IERJUkVDVCkgewotICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBtTm9ybWFsRnJhbWVDb3VudCAqIChtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCk7CisgICAgZWZmZWN0X2J1ZmZlcl90ICpidWZmZXIgPSBudWxscHRyOyAvLyBvbmx5IHVzZWQgZm9yIG5vbiBnbG9iYWwgc2Vzc2lvbnMKKworICAgIGlmIChtVHlwZSA9PSBTUEFUSUFMSVpFUikgeworICAgICAgICBpZiAoIWF1ZGlvX2lzX2dsb2JhbF9zZXNzaW9uKHNlc3Npb24pKSB7CisgICAgICAgICAgICAvLyBwbGF5ZXIgc2Vzc2lvbnMgb24gYSBzcGF0aWFsaXplciBvdXRwdXQgd2lsbCB1c2UgYSBkZWRpY2F0ZWQgaW5wdXQgYnVmZmVyIGFuZAorICAgICAgICAgICAgLy8gd2lsbCBlaXRoZXIgb3V0cHV0IG11bHRpIGNoYW5uZWwgdG8gbUVmZmVjdEJ1ZmZlciBpZiB0aGUgdHJhY2sgaXMgc3BhdGlsYWl6ZWQKKyAgICAgICAgICAgIC8vIG9yIHN0ZXJlbyB0byBtUG9zdFNwYXRpYWxpemVyQnVmZmVyIGlmIG5vdCBzcGF0aWFsaXplZC4KKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrOworICAgICAgICAgICAgYm9vbCBpc1Nlc3Npb25TcGF0aWFsaXplZCA9CisgICAgICAgICAgICAgICAgKGhhc0F1ZGlvU2Vzc2lvbl9sKHNlc3Npb24pICYgVGhyZWFkQmFzZTo6U1BBVElBTElaRURfU0VTU0lPTikgIT0gMDsKKyAgICAgICAgICAgIGlmIChpc1Nlc3Npb25TcGF0aWFsaXplZCkgeworICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gbU1peGVyQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBtTm9ybWFsRnJhbWVDb3VudAorICAgICAgICAgICAgICAgICAgICAqIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spICsgbUhhcHRpY0NoYW5uZWxDb3VudCk7CiAgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtQXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPmFsbG9jYXRlQnVmZmVyKAogICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzICogc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCksCiAgICAgICAgICAgICAgICAgICAgICZoYWxJbkJ1ZmZlcik7CiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSByZXR1cm4gcmVzdWx0OworCisgICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPm1pcnJvckJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgaXNTZXNzaW9uU3BhdGlhbGl6ZWQgPyBtRWZmZWN0QnVmZmVyIDogbVBvc3RTcGF0aWFsaXplckJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgaXNTZXNzaW9uU3BhdGlhbGl6ZWQgPyBtRWZmZWN0QnVmZmVyU2l6ZSA6IG1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAmaGFsT3V0QnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHJldHVybiByZXN1bHQ7CisKICNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KICAgICAgICAgICAgIGJ1ZmZlciA9IGhhbEluQnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5mMzI7CiAjZWxzZQpAQCAtMzM2MCwxNCArMzUwMyw2MCBAQAogI2VuZGlmCiAgICAgICAgICAgICBBTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpIGNyZWF0aW5nIG5ldyBpbnB1dCBidWZmZXIgJXAgc2Vzc2lvbiAlZCIsCiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2Vzc2lvbik7Ci0gICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEEgZ2xvYmFsIHNlc3Npb24gb24gYSBTUEFUSUFMSVpFUiB0aHJlYWQgaXMgZWl0aGVyIE9VVFBVVF9TVEFHRSBvciBERVZJQ0UKKyAgICAgICAgICAgIC8vIC0gT1VUUFVUX1NUQUdFIHNlc3Npb24gdXNlcyB0aGUgbUVmZmVjdEJ1ZmZlciBhcyBpbnB1dCBidWZmZXIgYW5kCisgICAgICAgICAgICAvLyBtUG9zdFNwYXRpYWxpemVyQnVmZmVyIGFzIG91dHB1dCBidWZmZXIKKyAgICAgICAgICAgIC8vIC0gREVWSUNFIHNlc3Npb24gdXNlcyB0aGUgbVBvc3RTcGF0aWFsaXplckJ1ZmZlciBhcyBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1BdWRpb0ZsaW5nZXItPm1FZmZlY3RzRmFjdG9yeUhhbC0+bWlycm9yQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyLCBtRWZmZWN0QnVmZmVyU2l6ZSwgJmhhbEluQnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPm1pcnJvckJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgbVBvc3RTcGF0aWFsaXplckJ1ZmZlciwgbVBvc3RTcGF0aWFsaXplckJ1ZmZlclNpemUsICZoYWxPdXRCdWZmZXIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgcmV0dXJuIHJlc3VsdDsKIAorICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gQVVESU9fU0VTU0lPTl9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICBoYWxJbkJ1ZmZlciA9IGhhbE91dEJ1ZmZlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1BdWRpb0ZsaW5nZXItPm1FZmZlY3RzRmFjdG9yeUhhbC0+bWlycm9yQnVmZmVyKAorICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJFbmFibGVkID8gbUVmZmVjdEJ1ZmZlciA6IG1TaW5rQnVmZmVyLAorICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJFbmFibGVkID8gbUVmZmVjdEJ1ZmZlclNpemUgOiBtU2lua0J1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgJmhhbEluQnVmZmVyKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgaGFsT3V0QnVmZmVyID0gaGFsSW5CdWZmZXI7CisgICAgICAgIEFMT0dWKCJhZGRFZmZlY3RDaGFpbl9sKCkgJXAgb24gdGhyZWFkICVwIGZvciBzZXNzaW9uICVkIiwgY2hhaW4uZ2V0KCksIHRoaXMsIHNlc3Npb24pOworICAgICAgICBpZiAoIWF1ZGlvX2lzX2dsb2JhbF9zZXNzaW9uKHNlc3Npb24pKSB7CisgICAgICAgICAgICBidWZmZXIgPSByZWludGVycHJldF9jYXN0PGVmZmVjdF9idWZmZXJfdCo+KGhhbEluQnVmZmVyLT5leHRlcm5hbERhdGEoKSk7CisgICAgICAgICAgICAvLyBPbmx5IG9uZSBlZmZlY3QgY2hhaW4gY2FuIGJlIHByZXNlbnQgaW4gZGlyZWN0IG91dHB1dCB0aHJlYWQgYW5kIGl0IHVzZXMKKyAgICAgICAgICAgIC8vIHRoZSBzaW5rIGJ1ZmZlciBhcyBpbnB1dAorICAgICAgICAgICAgaWYgKG1UeXBlICE9IERJUkVDVCkgeworICAgICAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gbU5vcm1hbEZyYW1lQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICogKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtTWl4ZXJDaGFubmVsTWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1IYXB0aWNDaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1BdWRpb0ZsaW5nZXItPm1FZmZlY3RzRmFjdG9yeUhhbC0+YWxsb2NhdGVCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzICogc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAmaGFsSW5CdWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHJldHVybiByZXN1bHQ7CisjaWZkZWYgRkxPQVRfRUZGRUNUX0NIQUlOCisgICAgICAgICAgICAgICAgYnVmZmVyID0gaGFsSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCktPmYzMjsKKyNlbHNlCisgICAgICAgICAgICAgICAgYnVmZmVyID0gaGFsSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCktPnMxNjsKKyNlbmRpZgorICAgICAgICAgICAgICAgIEFMT0dWKCJhZGRFZmZlY3RDaGFpbl9sKCkgY3JlYXRpbmcgbmV3IGlucHV0IGJ1ZmZlciAlcCBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2Vzc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWF1ZGlvX2lzX2dsb2JhbF9zZXNzaW9uKHNlc3Npb24pKSB7CiAgICAgICAgIC8vIEF0dGFjaCBhbGwgdHJhY2tzIHdpdGggc2FtZSBzZXNzaW9uIElEIHRvIHRoaXMgY2hhaW4uCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmIChzZXNzaW9uID09IHRyYWNrLT5zZXNzaW9uSWQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJhZGRFZmZlY3RDaGFpbl9sKCkgdHJhY2stPnNldE1haW5CdWZmZXIgdHJhY2sgJXAgYnVmZmVyICVwIiwgdHJhY2suZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOworICAgICAgICAgICAgICAgIEFMT0dWKCJhZGRFZmZlY3RDaGFpbl9sKCkgdHJhY2stPnNldE1haW5CdWZmZXIgdHJhY2sgJXAgYnVmZmVyICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLmdldCgpLCBidWZmZXIpOwogICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRNYWluQnVmZmVyKGJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgY2hhaW4tPmluY1RyYWNrQ250KCk7CiAgICAgICAgICAgICB9CkBAIC0zMzc2LDExICszNTY1LDEzIEBACiAgICAgICAgIC8vIGluZGljYXRlIGFsbCBhY3RpdmUgdHJhY2tzIGluIHRoZSBjaGFpbgogICAgICAgICBmb3IgKGNvbnN0IHNwPFRyYWNrPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSB0cmFjay0+c2Vzc2lvbklkKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpIGFjdGl2YXRpbmcgdHJhY2sgJXAgb24gc2Vzc2lvbiAlZCIsIHRyYWNrLmdldCgpLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpIGFjdGl2YXRpbmcgdHJhY2sgJXAgb24gc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay5nZXQoKSwgc2Vzc2lvbik7CiAgICAgICAgICAgICAgICAgY2hhaW4tPmluY0FjdGl2ZVRyYWNrQ250KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisKICAgICBjaGFpbi0+c2V0VGhyZWFkKHRoaXMpOwogICAgIGNoYWluLT5zZXRJbkJ1ZmZlcihoYWxJbkJ1ZmZlcik7CiAgICAgY2hhaW4tPnNldE91dEJ1ZmZlcihoYWxPdXRCdWZmZXIpOwpAQCAtMzUwNSw3ICszNjk2LDcgQEAKICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpOwogICAgIG1TbGVlcFRpbWVVcyA9IG1JZGxlU2xlZXBUaW1lVXM7CiAKLSAgICBpZiAobVR5cGUgPT0gTUlYRVIpIHsKKyAgICBpZiAobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gU1BBVElBTElaRVIpIHsKICAgICAgICAgc2xlZXBUaW1lU2hpZnQgPSAwOwogICAgIH0KIApAQCAtMzUzMSw2ICszNzIyLDggQEAKIAogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKIAorICAgIHNlbmRDaGVja091dHB1dFN0YWdlRWZmZWN0c0V2ZW50KCk7CisKICAgICAvLyBsb29wQ291bnQgaXMgdXNlZCBmb3Igc3RhdGlzdGljcyBhbmQgZGlhZ25vc3RpY3MuCiAgICAgZm9yIChpbnQ2NF90IGxvb3BDb3VudCA9IDA7ICFleGl0UGVuZGluZygpOyArK2xvb3BDb3VudCkKICAgICB7CkBAIC0zNTQyLDYgKzM3MzUsNyBAQAogCiAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwogICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlSGFwdGljU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9OT05FOworICAgICAgICBib29sIGlzSGFwdGljU2Vzc2lvblNwYXRpYWxpemVkID0gZmFsc2U7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFRyYWNrPj4gYWN0aXZlVHJhY2tzOwogCiAgICAgICAgIC8vIElmIHRoZSBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9CVVMsIGNoZWNrIGZvciBkb3duc3RyZWFtIGxhdGVuY3kuCkBAIC0zNTg3LDExICszNzgxLDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobUNoZWNrT3V0cHV0U3RhZ2VFZmZlY3RzLmV4Y2hhbmdlKGZhbHNlKSkgeworICAgICAgICAgICAgY2hlY2tPdXRwdXRTdGFnZUVmZmVjdHMoKTsKKyAgICAgICAgfQorCiAgICAgICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCiAKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKICAgICAgICAgICAgIHByb2Nlc3NDb25maWdFdmVudHNfbCgpOworICAgICAgICAgICAgaWYgKG1DaGVja091dHB1dFN0YWdlRWZmZWN0cy5sb2FkKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gU2VlIGNvbW1lbnQgYXQgZGVjbGFyYXRpb24gb2YgbG9nU3RyaW5nIGZvciB3aHkgdGhpcyBpcyBkb25lIHVuZGVyIG1Mb2NrCiAgICAgICAgICAgICBpZiAobG9nU3RyaW5nICE9IE5VTEwpIHsKQEAgLTM2NDIsNiArMzg0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmICghbVN0YW5kYnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIExPR19BVURJT19TVEFURSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZE1ldHJpY3MubG9nRW5kSW50ZXJ2YWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRTbmFwc2hvdC5vbkVuZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNlbmRTdGF0aXN0aWNzKGZhbHNlIC8qIGZvcmNlICovKTsKQEAgLTM2NzIsNyArMzg3NCw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnlUaW1lTnMgPSBzeXN0ZW1UaW1lKCkgKyBtU3RhbmRieURlbGF5TnM7CiAgICAgICAgICAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IG1JZGxlU2xlZXBUaW1lVXM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUikgeworICAgICAgICAgICAgICAgICAgICBpZiAobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gU1BBVElBTElaRVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwVGltZVNoaWZ0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0zNjk1LDE2ICszODk3LDIxIEBACiAgICAgICAgICAgICAvLyBUaGlzIG11c3QgYmUgZG9uZSB1bmRlciB0aGUgc2FtZSBsb2NrIGFzIHByZXBhcmVUcmFja3NfbCgpLgogICAgICAgICAgICAgLy8gVGhlIGhhcHRpYyBkYXRhIGZyb20gdGhlIGVmZmVjdCBpcyBhdCBhIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBvbmUgZnJvbSB0cmFjay4KICAgICAgICAgICAgIC8vIFRPRE86IFdyaXRlIGhhcHRpYyBkYXRhIGRpcmVjdGx5IHRvIHNpbmsgYnVmZmVyIHdoZW4gbWl4aW5nLgotICAgICAgICAgICAgaWYgKG1IYXB0aWNDaGFubmVsQ291bnQgPiAwICYmIGVmZmVjdENoYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBpZiAobUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRyYWNrIDogbUFjdGl2ZVRyYWNrcykgewogICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gZWZmZWN0Q2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlZmZlY3RDaGFpbiAhPSBudWxscHRyICYmIGVmZmVjdENoYWluLT5jb250YWluc0hhcHRpY0dlbmVyYXRpbmdFZmZlY3RfbCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlZmZlY3RDaGFpbiAhPSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZWZmZWN0Q2hhaW4tPmNvbnRhaW5zSGFwdGljR2VuZXJhdGluZ0VmZmVjdF9sKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUhhcHRpY1Nlc3Npb25JZCA9IHRyYWNrLT5zZXNzaW9uSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzSGFwdGljU2Vzc2lvblNwYXRpYWxpemVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGUgPT0gU1BBVElBTElaRVIgJiYgdHJhY2stPmlzU3BhdGlhbGl6ZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUhhcHRpY1Nlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUhhcHRpY1Nlc3Npb25JZCA9IHRyYWNrLT5zZXNzaW9uSWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgaXNIYXB0aWNTZXNzaW9uU3BhdGlhbGl6ZWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHlwZSA9PSBTUEFUSUFMSVpFUiAmJiB0cmFjay0+aXNTcGF0aWFsaXplZCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMzc1NCw2ICszOTYxLDggQEAKICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAvLyBtTWl4ZXJCdWZmZXJWYWxpZCBpcyBvbmx5IHNldCB0cnVlIGJ5IE1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woKS4KICAgICAgICAgICAgIC8vIFRPRE8gdXNlIG1TbGVlcFRpbWVVcyA9PSAwIGFzIGFuIGFkZGl0aW9uYWwgY29uZGl0aW9uLgorICAgICAgICAgICAgdWludDMyX3QgbWl4ZXJDaGFubmVsQ291bnQgPSBtRWZmZWN0QnVmZmVyVmFsaWQgPworICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1NaXhlckNoYW5uZWxNYXNrKSA6IG1DaGFubmVsQ291bnQ7CiAgICAgICAgICAgICBpZiAobU1peGVyQnVmZmVyVmFsaWQpIHsKICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIgPSBtRWZmZWN0QnVmZmVyVmFsaWQgPyBtRWZmZWN0QnVmZmVyIDogbVNpbmtCdWZmZXI7CiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gbUVmZmVjdEJ1ZmZlclZhbGlkID8gbUVmZmVjdEJ1ZmZlckZvcm1hdCA6IG1Gb3JtYXQ7CkBAIC0zNzc0LDcgKzM5ODMsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoYnVmZmVyLCBmb3JtYXQsIG1NaXhlckJ1ZmZlciwgbU1peGVyQnVmZmVyRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQgKiAobUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogKG1peGVyQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCkpOwogCiAgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgZ29pbmcgZGlyZWN0bHkgdG8gdGhlIHNpbmsgYW5kIHRoZXJlIGFyZSBoYXB0aWMgY2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGFkanVzdCBjaGFubmVscyBhcyB0aGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkCkBAIC0zODA3LDggKzQwMTYsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhY3RpdmVIYXB0aWNTZXNzaW9uSWQgPT0gZWZmZWN0Q2hhaW5zW2ldLT5zZXNzaW9uSWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGFwdGljIGRhdGEgaXMgYWN0aXZlIGluIHRoaXMgY2FzZSwgY29weSBpdCBkaXJlY3RseSBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBidWZmZXIgdG8gb3V0IGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhhcHRpY1Nlc3Npb25DaGFubmVsQ291bnQgPSBtRWZmZWN0QnVmZmVyVmFsaWQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobU1peGVyQ2hhbm5lbE1hc2spIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHlwZSA9PSBTUEFUSUFMSVpFUiAmJiAhaXNIYXB0aWNTZXNzaW9uU3BhdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXB0aWNTZXNzaW9uQ2hhbm5lbENvdW50ID0gbUNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGF1ZGlvQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1DaGFubmVsQ291bnQsIEVGRkVDVF9CVUZGRVJfRk9STUFUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShoYXB0aWNTZXNzaW9uQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9CVUZGRVJfRk9STUFUKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KillZmZlY3RDaGFpbnNbaV0tPm91dEJ1ZmZlcigpICsgYXVkaW9CdWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCwKQEAgLTM4MzQsOSArNDA1MSw5IEBACiAgICAgICAgIC8vIFRPRE8gdXNlIG1TbGVlcFRpbWVVcyA9PSAwIGFzIGFuIGFkZGl0aW9uYWwgY29uZGl0aW9uLgogICAgICAgICBpZiAobUVmZmVjdEJ1ZmZlclZhbGlkKSB7CiAgICAgICAgICAgICAvL0FMT0dWKCJ3cml0aW5nIGVmZmVjdCBidWZmZXIgdG8gc2luayBidWZmZXIgZm9ybWF0ICUjeCIsIG1Gb3JtYXQpOwotCisgICAgICAgICAgICB2b2lkICplZmZlY3RCdWZmZXIgPSAobVR5cGUgPT0gU1BBVElBTElaRVIpID8gbVBvc3RTcGF0aWFsaXplckJ1ZmZlciA6IG1FZmZlY3RCdWZmZXI7CiAgICAgICAgICAgICBpZiAocmVxdWlyZU1vbm9CbGVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgbW9ub19ibGVuZChtRWZmZWN0QnVmZmVyLCBtRWZmZWN0QnVmZmVyRm9ybWF0LCBtQ2hhbm5lbENvdW50LCBtTm9ybWFsRnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICBtb25vX2JsZW5kKGVmZmVjdEJ1ZmZlciwgbUVmZmVjdEJ1ZmZlckZvcm1hdCwgbUNoYW5uZWxDb3VudCwgbU5vcm1hbEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qbGltaXQqLyk7CiAgICAgICAgICAgICB9CiAKQEAgLTM4NDUsMTEgKzQwNjIsMzAgQEAKICAgICAgICAgICAgICAgICAvLyBXZSBkbyBpdCBoZXJlIGlmIHRoZXJlIGlzIG5vIEZhc3RNaXhlci4KICAgICAgICAgICAgICAgICAvLyBtQmFsYW5jZSBkZXRlY3RzIHplcm8gYmFsYW5jZSB3aXRoaW4gdGhlIGNsYXNzIGZvciBzcGVlZCAobm90IG5lZWRlZCBoZXJlKS4KICAgICAgICAgICAgICAgICBtQmFsYW5jZS5zZXRCYWxhbmNlKG1NYXN0ZXJCYWxhbmNlLmxvYWQoKSk7Ci0gICAgICAgICAgICAgICAgbUJhbGFuY2UucHJvY2VzcygoZmxvYXQgKiltRWZmZWN0QnVmZmVyLCBtTm9ybWFsRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgbUJhbGFuY2UucHJvY2VzcygoZmxvYXQgKillZmZlY3RCdWZmZXIsIG1Ob3JtYWxGcmFtZUNvdW50KTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChtU2lua0J1ZmZlciwgbUZvcm1hdCwgbUVmZmVjdEJ1ZmZlciwgbUVmZmVjdEJ1ZmZlckZvcm1hdCwKKyAgICAgICAgICAgIC8vIGZvciBTUEFUSUFMSVpFUiB0aHJlYWQsIE1vdmUgaGFwdGljcyBjaGFubmVscyBmcm9tIG1FZmZlY3RCdWZmZXIgdG8KKyAgICAgICAgICAgIC8vIG1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXIgaWYgdGhlIGhhcHRpY3MgdHJhY2sgaXMgc3BhdGlhbGl6ZWQuCisgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBoYXB0aWNzIGNoYW5uZWxzIGFyZSBhbHJlYWR5IGluIG1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXIuCisgICAgICAgICAgICAvLyBGb3Igb3RoZXIgdGhyZWFkIHR5cGVzLCB0aGUgaGFwdGljcyBjaGFubmVscyBhcmUgYWxyZWFkeSBpbiBtRWZmZWN0QnVmZmVyLgorICAgICAgICAgICAgaWYgKG1UeXBlID09IFNQQVRJQUxJWkVSICYmIGlzSGFwdGljU2Vzc2lvblNwYXRpYWxpemVkKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNyY0J1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1NaXhlckNoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgZHN0QnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQ2hhbm5lbENvdW50LCBtRWZmZWN0QnVmZmVyRm9ybWF0KTsKKworICAgICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoKHVpbnQ4X3QqKW1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXIgKyBkc3RCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdEJ1ZmZlckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KiltRWZmZWN0QnVmZmVyICsgc3JjQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIG1IYXB0aWNDaGFubmVsQ291bnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KG1TaW5rQnVmZmVyLCBtRm9ybWF0LCBlZmZlY3RCdWZmZXIsIG1FZmZlY3RCdWZmZXJGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50KSk7CisKICAgICAgICAgICAgIC8vIFRoZSBzYW1wbGUgZGF0YSBpcyBwYXJ0aWFsbHkgaW50ZXJsZWF2ZWQgd2hlbiBoYXB0aWMgY2hhbm5lbHMgZXhpc3QsCiAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGFkanVzdCBjaGFubmVscyBoZXJlLgogICAgICAgICAgICAgaWYgKG1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CkBAIC0zODk5LDExICs0MTM1LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jb0ppdHRlck1zLmFkZChqaXR0ZXJNcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9jZXNzVGltZU1zLmFkZChwcm9jZXNzTXMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUGlwZVNpbmsuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNpbmcgdGhlIE1vbm9waXBlIGF2YWlsYWJsZVRvV3JpdGUsIHdlIGVzdGltYXRlIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vbm9QaXBlKiBtb25vUGlwZSA9IHN0YXRpY19jYXN0PE1vbm9QaXBlKj4obVBpcGVTaW5rLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNzaXplX3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlVG9Xcml0ZSA9IG1QaXBlU2luay0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHBpcGVGcmFtZXMgPSBtb25vUGlwZS0+bWF4RnJhbWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nRnJhbWVzID0gcGlwZUZyYW1lcyAtIG1heChhdmFpbGFibGVUb1dyaXRlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb25vcGlwZVBpcGVEZXB0aFN0YXRzLmFkZChyZW1haW5pbmdGcmFtZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgYmxvY2tlZCBkZXRlY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhV3JpdGVOcyA9IGxhc3RJb0VuZE5zIC0gbGFzdElvQmVnaW5OczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVR5cGUgPT0gTUlYRVIgJiYgZGVsdGFXcml0ZU5zID4gbWF4UGVyaW9kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBTUEFUSUFMSVpFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRlbHRhV3JpdGVOcyA+IG1heFBlcmlvZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlcysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxhc3RJb0VuZE5zIC0gbGFzdFdhcm5pbmcpID4ga1dhcm5pbmdUaHJvdHRsZU5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgidW5kZXJydW4iKTsKQEAgLTM5MjQsNyArNDE3Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAobU1peGVyU3RhdHVzID09IE1JWEVSX0RSQUlOX0FMTCkpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyZWFkTG9vcF9kcmFpbigpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVR5cGUgPT0gTUlYRVIgJiYgIW1TdGFuZGJ5KSB7CisgICAgICAgICAgICAgICAgaWYgKChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBTUEFUSUFMSVpFUikgJiYgIW1TdGFuZGJ5KSB7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1UaHJlYWRUaHJvdHRsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfUkVBRFkgLy8gd2UgYXJlIG1peGluZyAoYWN0aXZlIHRyYWNrcykKQEAgLTQwNDksMTMgKzQyOTgsNiBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmNvbGxlY3RUaW1lc3RhbXBzX2woKQogewotICAgIC8vIENvbGxlY3QgdGltZXN0YW1wIHN0YXRpc3RpY3MgZm9yIHRoZSBQbGF5YmFjayBUaHJlYWQgdHlwZXMgdGhhdCBzdXBwb3J0IGl0LgotICAgIGlmIChtVHlwZSAhPSBNSVhFUgotICAgICAgICAgICAgJiYgbVR5cGUgIT0gRFVQTElDQVRJTkcKLSAgICAgICAgICAgICYmIG1UeXBlICE9IERJUkVDVAotICAgICAgICAgICAgJiYgbVR5cGUgIT0gT0ZGTE9BRCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQogICAgIGlmIChtU3RhbmRieSkgewogICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eShkaXNjb250aW51aXR5Rm9yU3RhbmRieU9yRmx1c2goKSk7CiAgICAgICAgIHJldHVybjsKQEAgLTQzNTcsMTkgKzQ1OTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY2hhciAqYWRkcmVzczsKLSAgICAgICAgaWYgKHN0cmNtcChwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzLCAiIikgIT0gMCkgewotICAgICAgICAgICAgLy9GSVhNRTogd2Ugb25seSBzdXBwb3J0IGFkZHJlc3Mgb24gZmlyc3Qgc2luayB3aXRoIEhBTCB2ZXJzaW9uIDwgMy4wCi0gICAgICAgICAgICBhZGRyZXNzID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZHJlc3MgPSAoY2hhciAqKWNhbGxvYygxLCAxKTsKLSAgICAgICAgfQotICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKFN0cmluZzgoYWRkcmVzcykpOwotICAgICAgICBmcmVlKGFkZHJlc3MpOwotICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIChpbnQpdHlwZSk7Ci0gICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5sZWdhY3lDcmVhdGVBdWRpb1BhdGNoKHBhdGNoLT5zaW5rc1swXSwgc3RkOjpudWxsb3B0LCB0eXBlKTsKICAgICAgICAgKmhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIH0KICAgICBjb25zdCBzdGQ6OnN0cmluZyBwYXRjaFNpbmtzQXNTdHJpbmcgPSBwYXRjaFNpbmtzVG9TdHJpbmcocGF0Y2gpOwpAQCAtNDQxNCw5ICs0NjQ0LDcgQEAKICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9IG1PdXRwdXQtPmF1ZGlvSHdEZXYtPmh3RGV2aWNlKCk7CiAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwotICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIDApOwotICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+bGVnYWN5UmVsZWFzZUF1ZGlvUGF0Y2goKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTQ0NDgsOCArNDY3Niw4IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6Ok1peGVyVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIGJvb2wgc3lzdGVtUmVhZHksIHR5cGVfdCB0eXBlKQotICAgIDogICBQbGF5YmFja1RocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIHR5cGUsIHN5c3RlbVJlYWR5KSwKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIGJvb2wgc3lzdGVtUmVhZHksIHR5cGVfdCB0eXBlLCBhdWRpb19jb25maWdfYmFzZV90ICptaXhlckNvbmZpZykKKyAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCB0eXBlLCBzeXN0ZW1SZWFkeSwgbWl4ZXJDb25maWcpLAogICAgICAgICAvLyBtQXVkaW9NaXhlciBiZWxvdwogICAgICAgICAvLyBtRmFzdE1peGVyIGJlbG93CiAgICAgICAgIG1GYXN0TWl4ZXJGdXRleCgwKSwKQEAgLTQ0ODcsMjYgKzQ3MTUsMjUgQEAKIAogICAgIC8vIGluaXRpYWxpemUgZmFzdCBtaXhlciBkZXBlbmRpbmcgb24gY29uZmlndXJhdGlvbgogICAgIGJvb2wgaW5pdEZhc3RNaXhlcjsKLSAgICBzd2l0Y2ggKGtVc2VGYXN0TWl4ZXIpIHsKLSAgICBjYXNlIEZhc3RNaXhlcl9OZXZlcjoKKyAgICBpZiAobVR5cGUgPT0gU1BBVElBTElaRVIpIHsKICAgICAgICAgaW5pdEZhc3RNaXhlciA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZhc3RNaXhlcl9BbHdheXM6Ci0gICAgICAgIGluaXRGYXN0TWl4ZXIgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZhc3RNaXhlcl9TdGF0aWM6Ci0gICAgY2FzZSBGYXN0TWl4ZXJfRHluYW1pYzoKLSAgICAgICAgLy8gRmFzdE1peGVyIHdhcyBkZXNpZ25lZCB0byBvcGVyYXRlIHdpdGggYSBIQUwgdGhhdCBwdWxscyBhdCBhIHJlZ3VsYXIgcmF0ZSwKLSAgICAgICAgLy8gd2hlcmUgdGhlIHBlcmlvZCBpcyBsZXNzIHRoYW4gYW4gZXhwZXJpbWVudGFsbHkgZGV0ZXJtaW5lZCB0aHJlc2hvbGQgdGhhdCBjYW4gYmUKLSAgICAgICAgLy8gc2NoZWR1bGVkIHJlbGlhYmx5IHdpdGggQ0ZTLiBIb3dldmVyLCB0aGUgQlQgQTJEUCBIQUwgaXMKLSAgICAgICAgLy8gYnVyc3R5IChkb2VzIG5vdCBwdWxsIGF0IGEgcmVndWxhciByYXRlKSBhbmQgc28gY2Fubm90IG9wZXJhdGUgd2l0aCBGYXN0TWl4ZXIuCi0gICAgICAgIGluaXRGYXN0TWl4ZXIgPSBtRnJhbWVDb3VudCA8IG1Ob3JtYWxGcmFtZUNvdW50Ci0gICAgICAgICAgICAgICAgJiYgSW50ZXJzZWN0aW9uKG91dERldmljZVR5cGVzKCksIGdldEF1ZGlvRGV2aWNlT3V0QWxsQTJkcFNldCgpKS5lbXB0eSgpOwotICAgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKGtVc2VGYXN0TWl4ZXIpIHsKKyAgICAgICAgY2FzZSBGYXN0TWl4ZXJfTmV2ZXI6CisgICAgICAgICAgICBpbml0RmFzdE1peGVyID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGYXN0TWl4ZXJfQWx3YXlzOgorICAgICAgICAgICAgaW5pdEZhc3RNaXhlciA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGYXN0TWl4ZXJfU3RhdGljOgorICAgICAgICBjYXNlIEZhc3RNaXhlcl9EeW5hbWljOgorICAgICAgICAgICAgaW5pdEZhc3RNaXhlciA9IG1GcmFtZUNvdW50IDwgbU5vcm1hbEZyYW1lQ291bnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBBTE9HV19JRihpbml0RmFzdE1peGVyID09IGZhbHNlICYmIG1GcmFtZUNvdW50IDwgbU5vcm1hbEZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgIkZhc3RNaXhlciBpcyBwcmVmZXJyZWQgZm9yIHRoaXMgc2luayBhcyBmcmFtZUNvdW50ICV6dSBpcyBsZXNzIHRoYW4gdGhyZXNob2xkICV6dSIsCisgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1Ob3JtYWxGcmFtZUNvdW50KTsKICAgICB9Ci0gICAgQUxPR1dfSUYoaW5pdEZhc3RNaXhlciA9PSBmYWxzZSAmJiBtRnJhbWVDb3VudCA8IG1Ob3JtYWxGcmFtZUNvdW50LAotICAgICAgICAgICAgIkZhc3RNaXhlciBpcyBwcmVmZXJyZWQgZm9yIHRoaXMgc2luayBhcyBmcmFtZUNvdW50ICV6dSBpcyBsZXNzIHRoYW4gdGhyZXNob2xkICV6dSIsCi0gICAgICAgICAgICBtRnJhbWVDb3VudCwgbU5vcm1hbEZyYW1lQ291bnQpOwogICAgIGlmIChpbml0RmFzdE1peGVyKSB7CiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZhc3RNaXhlckZvcm1hdDsKICAgICAgICAgaWYgKG1NaXhlckJ1ZmZlckVuYWJsZWQgJiYgbUVmZmVjdEJ1ZmZlckVuYWJsZWQpIHsKQEAgLTQ1NjYsNiArNDc5Myw3IEBACiAgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCA9IG1Gb3JtYXQ7IC8vIG1QaXBlU2luayBmb3JtYXQgZm9yIGF1ZGlvIHRvIEZhc3RNaXhlcgogICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FOwogICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNJbnRlbnNpdHkgPSBvczo6SGFwdGljU2NhbGU6Ok5PTkU7CisgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY01heEFtcGxpdHVkZSA9IE5BTjsKICAgICAgICAgZmFzdFRyYWNrLT5tR2VuZXJhdGlvbisrOwogICAgICAgICBzdGF0ZS0+bUZhc3RUcmFja3NHZW4rKzsKICAgICAgICAgc3RhdGUtPm1UcmFja01hc2sgPSAxOwpAQCAtNDg2MSw2ICs1MDg5LDkgQEAKICAgICAgICAgLy8gYmVmb3JlIGVmZmVjdHMgcHJvY2Vzc2luZyBvciBvdXRwdXQuCiAgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJWYWxpZCkgewogICAgICAgICAgICAgbWVtc2V0KG1NaXhlckJ1ZmZlciwgMCwgbU1peGVyQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBpZiAobVR5cGUgPT0gU1BBVElBTElaRVIpIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1TaW5rQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1TaW5rQnVmZmVyU2l6ZSk7CiAgICAgICAgIH0KQEAgLTUwODksNyArNTMyMCw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6SURMRToKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgidW5leHBlY3RlZCB0cmFjayBzdGF0ZSAlZCIsIHRyYWNrLT5tU3RhdGUpOworICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInVuZXhwZWN0ZWQgdHJhY2sgc3RhdGUgJWQiLCAoaW50KXRyYWNrLT5tU3RhdGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoaXNBY3RpdmUpIHsKQEAgLTUxMDMsNiArNTMzNCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCA9IHRyYWNrLT5tRm9ybWF0OwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSB0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCk7CiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY0ludGVuc2l0eSA9IHRyYWNrLT5nZXRIYXB0aWNJbnRlbnNpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljTWF4QW1wbGl0dWRlID0gdHJhY2stPmdldEhhcHRpY01heEFtcGxpdHVkZSgpOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1HZW5lcmF0aW9uKys7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tVHJhY2tNYXNrIHw9IDEgPDwgajsKICAgICAgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKQEAgLTUxNDgsNyArNTM4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gUmVtb3ZlIHRoZSBBTE9HVyB3aGVuIHRoaXMgdGhlb3J5IGlzIGNvbmZpcm1lZC4KICAgICAgICAgICAgICAgICAgICAgQUxPR1coImZhc3QgdHJhY2sgJWQgc2hvdWxkIGhhdmUgYmVlbiBhY3RpdmU7ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibVN0YXRlPSVkLCBtVHJhY2tNYXNrPSUjeCwgcmVjZW50VW5kZXJydW5zPSV1LCBpc1NoYXJlZD0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgdHJhY2stPm1TdGF0ZSwgc3RhdGUtPm1UcmFja01hc2ssIHJlY2VudFVuZGVycnVucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCAoaW50KXRyYWNrLT5tU3RhdGUsIHN0YXRlLT5tVHJhY2tNYXNrLCByZWNlbnRVbmRlcnJ1bnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNoYXJlZEJ1ZmZlcigpICE9IDApOwogICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgRmFzdE1peGVyIHN0YXRlIGFscmVhZHkgaGFzIHRoZSB0cmFjayBpbmFjdGl2ZSwgZG8gbm90aGluZyBoZXJlLgogICAgICAgICAgICAgICAgIH0KQEAgLTUzNTIsMTEgKzU1ODQsMjEgQEAKICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywgKHZvaWQgKikodWludHB0cl90KXRyYWNrLT5jaGFubmVsTWFzaygpKTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgdHJhY2tJZCwKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCi0gICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KShtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2spKTsKKworICAgICAgICAgICAgaWYgKG1UeXBlID09IFNQQVRJQUxJWkVSICYmICF0cmFjay0+aXNTcGF0aWFsaXplZCgpKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KShtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2spKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KShtTWl4ZXJDaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzaykpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBsaW1pdCB0cmFjayBzYW1wbGUgcmF0ZSB0byAyIHggb3V0cHV0IHNhbXBsZSByYXRlLCB3aGljaCBjaGFuZ2VzIGF0IHJlLWNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgIHVpbnQzMl90IG1heFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZSAqIEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWDsKICAgICAgICAgICAgIHVpbnQzMl90IHJlcVNhbXBsZVJhdGUgPSBwcm94eS0+Z2V0U2FtcGxlUmF0ZSgpOwpAQCAtNTM5MywxNiArNTYzNSwyNyBAQAogICAgICAgICAgICAgaWYgKG1NaXhlckJ1ZmZlckVuYWJsZWQKICAgICAgICAgICAgICAgICAgICAgJiYgKHRyYWNrLT5tYWluQnVmZmVyKCkgPT0gbVNpbmtCdWZmZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0cmFjay0+bWFpbkJ1ZmZlcigpID09IG1NaXhlckJ1ZmZlcikpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLCAodm9pZCAqKW1NaXhlckJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogb3ZlcnJpZGUgdHJhY2stPm1haW5CdWZmZXIoKT8KLSAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJWYWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IFNQQVRJQUxJWkVSICYmICF0cmFjay0+aXNTcGF0aWFsaXplZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopbUVmZmVjdEJ1ZmZlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKiltUG9zdFNwYXRpYWxpemVyQnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKiltTWl4ZXJCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBvdmVycmlkZSB0cmFjay0+bWFpbkJ1ZmZlcigpPworICAgICAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJWYWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKQEAgLTU0MjUsNiArNTY3OCwxMCBAQAogICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6SEFQVElDX0lOVEVOU0lUWSwgKHZvaWQgKikodWludHB0cl90KXRyYWNrLT5nZXRIYXB0aWNJbnRlbnNpdHkoKSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6SEFQVElDX01BWF9BTVBMSVRVREUsICh2b2lkICopKCYodHJhY2stPm1IYXB0aWNNYXhBbXBsaXR1ZGUpKSk7CiAKICAgICAgICAgICAgIC8vIHJlc2V0IHJldHJ5IGNvdW50CiAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzOwpAQCAtNTU3NSw3ICs1ODMyLDggQEAKICAgICAvLyByZW1vdmUgYWxsIHRoZSB0cmFja3MgdGhhdCBuZWVkIHRvIGJlLi4uCiAgICAgcmVtb3ZlVHJhY2tzX2woKnRyYWNrc1RvUmVtb3ZlKTsKIAotICAgIGlmIChnZXRFZmZlY3RDaGFpbl9sKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgIT0gMCkgeworICAgIGlmIChnZXRFZmZlY3RDaGFpbl9sKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgIT0gMCB8fAorICAgICAgICAgICAgZ2V0RWZmZWN0Q2hhaW5fbChBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSkgIT0gMCkgewogICAgICAgICBtRWZmZWN0QnVmZmVyVmFsaWQgPSB0cnVlOwogICAgIH0KIApAQCAtNTU4MywxMiArNTg0MSwxNyBAQAogICAgICAgICAvLyBhcyBsb25nIGFzIHRoZXJlIGFyZSBlZmZlY3RzIHdlIHNob3VsZCBjbGVhciB0aGUgZWZmZWN0cyBidWZmZXIsIHRvIGF2b2lkCiAgICAgICAgIC8vIHBhc3NpbmcgYSBub24tY2xlYW4gYnVmZmVyIHRvIHRoZSBlZmZlY3QgY2hhaW4KICAgICAgICAgbWVtc2V0KG1FZmZlY3RCdWZmZXIsIDAsIG1FZmZlY3RCdWZmZXJTaXplKTsKKyAgICAgICAgaWYgKG1UeXBlID09IFNQQVRJQUxJWkVSKSB7CisgICAgICAgICAgICBtZW1zZXQobVBvc3RTcGF0aWFsaXplckJ1ZmZlciwgMCwgbVBvc3RTcGF0aWFsaXplckJ1ZmZlclNpemUpOworICAgICAgICB9CiAgICAgfQogICAgIC8vIHNpbmsgb3IgbWl4IGJ1ZmZlciBtdXN0IGJlIGNsZWFyZWQgaWYgYWxsIHRyYWNrcyBhcmUgY29ubmVjdGVkIHRvIGFuCiAgICAgLy8gZWZmZWN0IGNoYWluIGFzIGluIHRoaXMgY2FzZSB0aGUgbWl4ZXIgd2lsbCBub3Qgd3JpdGUgdG8gdGhlIHNpbmsgb3IgbWl4IGJ1ZmZlcgogICAgIC8vIGFuZCB0cmFjayBlZmZlY3RzIHdpbGwgYWNjdW11bGF0ZSBpbnRvIGl0Ci0gICAgaWYgKChtQnl0ZXNSZW1haW5pbmcgPT0gMCkgJiYgKChtaXhlZFRyYWNrcyAhPSAwICYmIG1peGVkVHJhY2tzID09IHRyYWNrc1dpdGhFZmZlY3QpIHx8Ci0gICAgICAgICAgICAobWl4ZWRUcmFja3MgPT0gMCAmJiBmYXN0VHJhY2tzID4gMCkpKSB7CisgICAgLy8gYWx3YXlzIGNsZWFyIHNpbmsgYnVmZmVyIGZvciBzcGF0aWFsaXplciBvdXRwdXQgYXMgdGhlIG91dHB1dCBvZiB0aGUgc3BhdGlhbGl6ZXIKKyAgICAvLyBlZmZlY3Qgd2lsbCBiZSBhY2N1bXVsYXRlZCBpbnRvIGl0CisgICAgaWYgKChtQnl0ZXNSZW1haW5pbmcgPT0gMCkgJiYgKCgobWl4ZWRUcmFja3MgIT0gMCAmJiBtaXhlZFRyYWNrcyA9PSB0cmFja3NXaXRoRWZmZWN0KSB8fAorICAgICAgICAgICAgKG1peGVkVHJhY2tzID09IDAgJiYgZmFzdFRyYWNrcyA+IDApKSB8fCAobVR5cGUgPT0gU1BBVElBTElaRVIpKSkgewogICAgICAgICAvLyBGSVhNRSBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiwgc2hvdWxkIHJlbWVtYmVyIHByZXZpb3VzIHplcm8gc3RhdHVzCiAgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJWYWxpZCkgewogICAgICAgICAgICAgbWVtc2V0KG1NaXhlckJ1ZmZlciwgMCwgbU1peGVyQnVmZmVyU2l6ZSk7CkBAIC01NjI2LDYgKzU4ODksMjAgQEAKICAgICByZXR1cm4gdHJhY2tDb3VudDsKIH0KIAorYm9vbCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjaGVja1J1bm5pbmdUaW1lc3RhbXAoKQoreworICAgIHVpbnQ2NF90IHBvc2l0aW9uID0gMDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdW51c2VkOworICAgIGNvbnN0IHN0YXR1c190IHJldCA9IG1PdXRwdXQtPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKCZwb3NpdGlvbiwgJnVudXNlZCk7CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBpZiAocG9zaXRpb24gIT0gbUxhc3RDaGVja2VkVGltZXN0YW1wUG9zaXRpb24pIHsKKyAgICAgICAgICAgIG1MYXN0Q2hlY2tlZFRpbWVzdGFtcFBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIC8vIGlzVHJhY2tBbGxvd2VkX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIGJvb2wgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6aXNUcmFja0FsbG93ZWRfbCgKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKQEAgLTU2OTYsNiArNTk3Myw3IEBACiAgICAgICAgICAgICBtT3V0cHV0LT5zdGFuZGJ5KCk7CiAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5KSB7CiAgICAgICAgICAgICAgICAgbVRocmVhZE1ldHJpY3MubG9nRW5kSW50ZXJ2YWwoKTsKKyAgICAgICAgICAgICAgICBtVGhyZWFkU25hcHNob3Qub25FbmQoKTsKICAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuID0gMDsKQEAgLTYwMzgsOSArNjMxNiwxMyBAQAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+aXNTdG9wcGluZ18yKCkgfHwgdHJhY2stPmlzUGF1c2VkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbnN1bWVkIGFsbCB0aGUgYnVmZmVycyBvZiB0aGlzIHRyYWNrLgogICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSB0cmFja3MuCisgICAgICAgICAgICAgICAgYm9vbCBwcmVzQ29tcGxldGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBpZiAobVN0YW5kYnkgfHwgIWxhc3QgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShsYXRlbmN5X2woKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwcmVzQ29tcGxldGUgPSB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUobGF0ZW5jeV9sKCkpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmlzUGF1c2VkKCkgfHwgbUh3UGF1c2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzQ29tcGxldGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXQtPnByZXNlbnRhdGlvbkNvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwaW5nXzIoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBFRDsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjA1NCwxOSArNjMzNiwyNCBAQAogICAgICAgICAgICAgICAgIC8vIGZpbGwgYSBidWZmZXIsIHRoZW4gcmVtb3ZlIGl0IGZyb20gYWN0aXZlIGxpc3QuCiAgICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciBsYXN0IHRyYWNrIHN0YXJ0ZWQgZm9yIG1peGVyIHN0YXRlIGNvbnRyb2wKICAgICAgICAgICAgICAgICBpZiAoLS0odHJhY2stPm1SZXRyeUNvdW50KSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlIHRyYWNrKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwgdHJhY2tJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwotICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0byBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKLSAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPmRpc2FibGUoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkbyBodyBwYXVzZSB3aGVuIHRyYWNrIGlzIGdvaW5nIHRvIGJlIHJlbW92ZWQgZHVlIHRvIEJVRkZFUiBUSU1FT1VULgotICAgICAgICAgICAgICAgICAgICAvLyB1bmxpa2UgbWl4ZXJ0aHJlYWQsIEhBTCBjYW4gYmUgcGF1c2VkIGZvciBkaXJlY3Qgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJwYXVzZSBiZWNhdXNlIG9mIFVOREVSUlVOLCBmcmFtZXNSZWFkeSA9ICV6dSwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbkZyYW1lcyA9ICV1LCBtRm9ybWF0ID0gJSN4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNSZWFkeSwgbWluRnJhbWVzLCBtRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgJiYgbUh3U3VwcG9ydHNQYXVzZSAmJiAhbUh3UGF1c2VkICYmICFtU3RhbmRieSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZG9Id1BhdXNlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgcnVubmluZyA9IGNoZWNrUnVubmluZ1RpbWVzdGFtcCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocnVubmluZykgeyAvLyBzdGlsbCBydW5uaW5nLCBnaXZlIHVzIG1vcmUgdGltZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tUmV0cnlDb3VudCA9IGtNYXhUcmFja1JldHJpZXNPZmZsb2FkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUgdHJhY2soJWQpIGZyb20gYWN0aXZlIGxpc3QiLCB0cmFja0lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdG8gY2xpZW50IHByb2Nlc3MgdGhhdCB0aGUgdHJhY2sgd2FzIGRpc2FibGVkIGJlY2F1c2Ugb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVycnVuOyBpdCB3aWxsIHRoZW4gYXV0b21hdGljYWxseSBjYWxsIHN0YXJ0KCkgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmRpc2FibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZG8gaHcgcGF1c2Ugd2hlbiB0cmFjayBpcyBnb2luZyB0byBiZSByZW1vdmVkIGR1ZSB0byBCVUZGRVIgVElNRU9VVC4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubGlrZSBtaXhlcnRocmVhZCwgSEFMIGNhbiBiZSBwYXVzZWQgZm9yIGRpcmVjdCBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJwYXVzZSBiZWNhdXNlIG9mIFVOREVSUlVOLCBmcmFtZXNSZWFkeSA9ICV6dSwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW5GcmFtZXMgPSAldSwgbUZvcm1hdCA9ICUjeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1JlYWR5LCBtaW5GcmFtZXMsIG1Gb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgJiYgbUh3U3VwcG9ydHNQYXVzZSAmJiAhbUh3UGF1c2VkICYmICFtU3RhbmRieSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvSHdQYXVzZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdCkgewogICAgICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19FTkFCTEVEOwpAQCAtNjIxMiw2ICs2NDk5LDcgQEAKICAgICAgICAgICAgIG1PdXRwdXQtPnN0YW5kYnkoKTsKICAgICAgICAgICAgIGlmICghbVN0YW5kYnkpIHsKICAgICAgICAgICAgICAgICBtVGhyZWFkTWV0cmljcy5sb2dFbmRJbnRlcnZhbCgpOworICAgICAgICAgICAgICAgIG1UaHJlYWRTbmFwc2hvdC5vbkVuZCgpOwogICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gPSAwOwpAQCAtNjI3Nyw2ICs2NTY1LDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Zmx1c2hId19sKCkKIHsKKyAgICBQbGF5YmFja1RocmVhZDo6Zmx1c2hId19sKCk7CiAgICAgbU91dHB1dC0+Zmx1c2goKTsKICAgICBtSHdQYXVzZWQgPSBmYWxzZTsKICAgICBtRmx1c2hQZW5kaW5nID0gZmFsc2U7CkBAIC02NDEyLDggKzY3MDEsNyBAQAogQXVkaW9GbGluZ2VyOjpPZmZsb2FkVGhyZWFkOjpPZmZsb2FkVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGJvb2wgc3lzdGVtUmVhZHkpCiAgICAgOiAgIERpcmVjdE91dHB1dFRocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIE9GRkxPQUQsIHN5c3RlbVJlYWR5KSwKLSAgICAgICAgbVBhdXNlZFdyaXRlTGVuZ3RoKDApLCBtUGF1c2VkQnl0ZXNSZW1haW5pbmcoMCksIG1LZWVwV2FrZUxvY2sodHJ1ZSksCi0gICAgICAgIG1PZmZsb2FkVW5kZXJydW5Qb3NpdGlvbih+MExMKQorICAgICAgICBtUGF1c2VkV3JpdGVMZW5ndGgoMCksIG1QYXVzZWRCeXRlc1JlbWFpbmluZygwKSwgbUtlZXBXYWtlTG9jayh0cnVlKQogewogICAgIC8vRklYTUU6IG1TdGFuZGJ5IHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBieSBUaHJlYWRCYXNlIGNvbnN0cnVjdG8KICAgICBtU3RhbmRieSA9IHRydWU7CkBAIC02NjEzLDcgKzY5MDEsOCBAQAogICAgICAgICAgICAgICAgIC8vIERyYWluIGhhcyBjb21wbGV0ZWQgb3Igd2UgYXJlIGluIHN0YW5kYnksIHNpZ25hbCBwcmVzZW50YXRpb24gY29tcGxldGUKICAgICAgICAgICAgICAgICBpZiAoIShtRHJhaW5TZXF1ZW5jZSAmIDEpIHx8ICFsYXN0IHx8IG1TdGFuZGJ5KSB7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQRUQ7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShsYXRlbmN5X2woKSk7CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXQtPnByZXNlbnRhdGlvbkNvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShsYXRlbmN5X2woKSk7IC8vIGFsd2F5cyByZXR1cm5zIHRydWUKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgICAgICAvLyBPRkZMT0FERUQgc3RvcCByZXNldHMgZnJhbWUgY291bnRzLgpAQCAtNjYzMCwxOSArNjkxOSw3IEBACiAgICAgICAgICAgICAgICAgLy8gTm8gYnVmZmVycyBmb3IgdGhpcyB0cmFjay4gR2l2ZSBpdCBhIGZldyBjaGFuY2VzIHRvCiAgICAgICAgICAgICAgICAgLy8gZmlsbCBhIGJ1ZmZlciwgdGhlbiByZW1vdmUgaXQgZnJvbSBhY3RpdmUgbGlzdC4KICAgICAgICAgICAgICAgICBpZiAoLS0odHJhY2stPm1SZXRyeUNvdW50KSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2wgcnVubmluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBwb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB1bnVzZWQ7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBydW5uaW5nIGNoZWNrIHJlc3RhcnRzIHRoZSByZXRyeSBjb3VudGVyIGF0IGxlYXN0IG9uY2UuCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHJldCA9IG1PdXRwdXQtPnN0cmVhbS0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oJnBvc2l0aW9uLCAmdW51c2VkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUiAmJiBwb3NpdGlvbiAhPSBtT2ZmbG9hZFVuZGVycnVuUG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbU9mZmxvYWRVbmRlcnJ1blBvc2l0aW9uID0gcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1ZWKCJ1bmRlcnJ1biBjb3VudGVyLCBydW5uaW5nKCVkKTogJWxsZCB2cyAlbGxkIiwgcnVubmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylwb3NpdGlvbiwgKGxvbmcgbG9uZyltT2ZmbG9hZFVuZGVycnVuUG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgcnVubmluZyA9IGNoZWNrUnVubmluZ1RpbWVzdGFtcCgpOwogICAgICAgICAgICAgICAgICAgICBpZiAocnVubmluZykgeyAvLyBzdGlsbCBydW5uaW5nLCBnaXZlIHVzIG1vcmUgdGltZS4KICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tUmV0cnlDb3VudCA9IGtNYXhUcmFja1JldHJpZXNPZmZsb2FkOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjcxMyw3ICs2OTkwLDYgQEAKICAgICBtUGF1c2VkQnl0ZXNSZW1haW5pbmcgPSAwOwogICAgIC8vIHJlc2V0IGJ5dGVzIHdyaXR0ZW4gY291bnQgdG8gcmVmbGVjdCB0aGF0IERTUCBidWZmZXJzIGFyZSBlbXB0eSBhZnRlciBmbHVzaC4KICAgICBtQnl0ZXNXcml0dGVuID0gMDsKLSAgICBtT2ZmbG9hZFVuZGVycnVuUG9zaXRpb24gPSB+MExMOwogCiAgICAgaWYgKG1Vc2VBc3luY1dyaXRlKSB7CiAgICAgICAgIC8vIGRpc2NhcmQgYW55IHBlbmRpbmcgZHJhaW4gb3Igd3JpdGUgYWNrIGJ5IGluY3JlbWVudGluZyBzZXF1ZW5jZQpAQCAtNjgxMSw2ICs3MDg3LDcgQEAKICAgICB9CiAgICAgaWYgKG1TdGFuZGJ5KSB7CiAgICAgICAgIG1UaHJlYWRNZXRyaWNzLmxvZ0JlZ2luSW50ZXJ2YWwoKTsKKyAgICAgICAgbVRocmVhZFNuYXBzaG90Lm9uQmVnaW4oKTsKICAgICAgICAgbVN0YW5kYnkgPSBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIChzc2l6ZV90KW1TaW5rQnVmZmVyU2l6ZTsKQEAgLTY5NzEsNiArNzI0OCw2OSBAQAogICAgIE1peGVyVGhyZWFkOjpjYWNoZVBhcmFtZXRlcnNfbCgpOwogfQogCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0F1ZGlvRmxpbmdlcjo6U3BhdGlhbGl6ZXJUaHJlYWQ6OlNwYXRpYWxpemVyVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCAqbWl4ZXJDb25maWcpCisgICAgOiBNaXhlclRocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIHN5c3RlbVJlYWR5LCBTUEFUSUFMSVpFUiwgbWl4ZXJDb25maWcpCit7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpTcGF0aWFsaXplclRocmVhZDo6Y2hlY2tPdXRwdXRTdGFnZUVmZmVjdHMoKQoreworICAgIGJvb2wgaGFzVmlydHVhbGl6ZXIgPSBmYWxzZTsKKyAgICBib29sIGhhc0Rvd25NaXhlciA9IGZhbHNlOworICAgIHNwPEVmZmVjdEhhbmRsZT4gZmluYWxEb3duTWl4ZXI7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKTsKKyAgICAgICAgaWYgKGNoYWluICE9IDApIHsKKyAgICAgICAgICAgIGhhc1ZpcnR1YWxpemVyID0gY2hhaW4tPmdldEVmZmVjdEZyb21UeXBlX2woRlhfSUlEX1NQQVRJQUxJWkVSKSAhPSBudWxscHRyOworICAgICAgICAgICAgaGFzRG93bk1peGVyID0gY2hhaW4tPmdldEVmZmVjdEZyb21UeXBlX2woRUZGRUNUX1VJSURfRE9XTk1JWCkgIT0gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsRG93bk1peGVyID0gbUZpbmFsRG93bk1peGVyOworICAgICAgICBtRmluYWxEb3duTWl4ZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAoaGFzVmlydHVhbGl6ZXIpIHsKKyAgICAgICAgaWYgKGZpbmFsRG93bk1peGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGludDMyX3QgcmV0OworICAgICAgICAgICAgZmluYWxEb3duTWl4ZXItPmRpc2FibGUoJnJldCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxEb3duTWl4ZXIuY2xlYXIoKTsKKyAgICB9IGVsc2UgaWYgKCFoYXNEb3duTWl4ZXIpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZGVzY3JpcHRvcnM7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb0ZsaW5nZXItPm1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9VSUlEX0RPV05NSVgsICZkZXNjcmlwdG9ycyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBBTE9HX0FTU0VSVCghZGVzY3JpcHRvcnMuZW1wdHkoKSwKKyAgICAgICAgICAgICAgICAiJXMgZ2V0RGVzY3JpcHRvcnMoKSByZXR1cm5lZCBubyBlcnJvciBidXQgZW1wdHkgbGlzdCIsIF9fZnVuY19fKTsKKworICAgICAgICBmaW5hbERvd25NaXhlciA9IGNyZWF0ZUVmZmVjdF9sKG51bGxwdHIgLypjbGllbnQqLywgbnVsbHB0ciAvKmVmZmVjdENsaWVudCovLAorICAgICAgICAgICAgICAgIDAgLypwcmlvcml0eSovLCBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSwgJmRlc2NyaXB0b3JzWzBdLCBudWxscHRyIC8qZW5hYmxlZCovLAorICAgICAgICAgICAgICAgICZzdGF0dXMsIGZhbHNlIC8qcGlubmVkKi8sIGZhbHNlIC8qcHJvYmUqLywgZmFsc2UgLypub3RpZnlGcmFtZXNQcm9jZXNzZWQqLyk7CisKKyAgICAgICAgaWYgKGZpbmFsRG93bk1peGVyID09IG51bGxwdHIgfHwgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpKSB7CisgICAgICAgICAgICBBTE9HVygiJXMgZXJyb3IgY3JlYXRpbmcgZG93bm1peGVyICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgICAgICAgICBmaW5hbERvd25NaXhlci5jbGVhcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50MzJfdCByZXQ7CisgICAgICAgICAgICBmaW5hbERvd25NaXhlci0+ZW5hYmxlKCZyZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBtRmluYWxEb3duTWl4ZXIgPSBmaW5hbERvd25NaXhlcjsKKyAgICB9Cit9CisKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBSZWNvcmQKQEAgLTcyNzMsNiArNzYxMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGRvQnJvYWRjYXN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGFuZGJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkTWV0cmljcy5sb2dCZWdpbkludGVydmFsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkU25hcHNob3Qub25CZWdpbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnkgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7CkBAIC03NDQ1LDYgKzc3ODYsNyBAQAogCiAgICAgICAgICAgICBjb25zdCBzc2l6ZV90IGF2YWlsYWJsZVRvUmVhZCA9IG1QaXBlU291cmNlLT5hdmFpbGFibGVUb1JlYWQoKTsKICAgICAgICAgICAgIGlmIChhdmFpbGFibGVUb1JlYWQgPj0gMCkgeworICAgICAgICAgICAgICAgIG1Nb25vcGlwZVBpcGVEZXB0aFN0YXRzLmFkZChhdmFpbGFibGVUb1JlYWQpOwogICAgICAgICAgICAgICAgIC8vIFBpcGVTb3VyY2UgaXMgdGhlIHByaW1hcnkgY2xvY2suICBJdCBpcyB1cCB0byB0aGUgQXVkaW9SZWNvcmQgY2xpZW50IHRvIGtlZXAgdXAuCiAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoc2l6ZV90KWF2YWlsYWJsZVRvUmVhZCA+IG1QaXBlRnJhbWVzUDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAibW9yZSBmcmFtZXMgdG8gcmVhZCB0aGFuIGZpZm8gc2l6ZSwgJXpkID4gJXp1IiwKQEAgLTc3NTMsNiArODA5NSw3IEBACiAgICAgaWYgKCFtU3RhbmRieSkgewogICAgICAgICBpbnB1dFN0YW5kQnkoKTsKICAgICAgICAgbVRocmVhZE1ldHJpY3MubG9nRW5kSW50ZXJ2YWwoKTsKKyAgICAgICAgbVRocmVhZFNuYXBzaG90Lm9uRW5kKCk7CiAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKICAgICB9CiB9CkBAIC03ODczLDYgKzgyMTYsNyBAQAogICAgICAgaWYgKAogICAgICAgICAgICAgLy8gd2UgZm9ybWVybHkgY2hlY2tlZCBmb3IgYSBjYWxsYmFjayBoYW5kbGVyIChub24tMCB0aWQpLAogICAgICAgICAgICAgLy8gYnV0IHRoYXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGZvciBUUkFOU0ZFUl9PQlRBSU4gbW9kZQorICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBtYXRjaCBoYXJkd2FyZSBmb3JtYXQsIGZvcm1hdCBjb252ZXJzaW9uIHdpbGwgYmUgZG9uZSBpbiBjbGllbnQgc2lkZS4KICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAvLyBGcmFtZSBjb3VudCBpcyBub3Qgc3BlY2lmaWVkICgwKSwgb3IgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRoZSBwaXBlIGRlcHRoLgogICAgICAgICAgICAgLy8gSXQgaXMgT0sgdG8gcHJvdmlkZSBhIGhpZ2hlciBjYXBhY2l0eSB0aGFuIHJlcXVlc3RlZC4KQEAgLTc4ODAsOCArODIyNCw2IEBACiAgICAgICAgICAgICAoZnJhbWVDb3VudCA8PSBtUGlwZUZyYW1lc1AyKSAmJgogICAgICAgICAgICAgLy8gUENNIGRhdGEKICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJgotICAgICAgICAgICAgLy8gaGFyZHdhcmUgZm9ybWF0Ci0gICAgICAgICAgICAoZm9ybWF0ID09IG1Gb3JtYXQpICYmCiAgICAgICAgICAgICAvLyBoYXJkd2FyZSBjaGFubmVsIG1hc2sKICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBtQ2hhbm5lbE1hc2spICYmCiAgICAgICAgICAgICAvLyBoYXJkd2FyZSBzYW1wbGUgcmF0ZQpAQCAtODA0MSw3ICs4MzgzLDcgQEAKICAgICAgICAgICAgICAgICBBTE9HVigiYWN0aXZlIHJlY29yZCB0cmFjayBQQVVTSU5HIC0+IEFDVElWRSIpOwogICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImFjdGl2ZSByZWNvcmQgdHJhY2sgc3RhdGUgJWQiLCByZWNvcmRUcmFjay0+bVN0YXRlKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWN0aXZlIHJlY29yZCB0cmFjayBzdGF0ZSAlZCIsIChpbnQpcmVjb3JkVHJhY2stPm1TdGF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CkBAIC04MDY3LDcgKzg0MDksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgIT0gVHJhY2tCYXNlOjpTVEFSVElOR18xKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogdW5zeW5jaHJvbml6ZWQgbVN0YXRlOiVkIGNoYW5nZSIsCi0gICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZWNvcmRUcmFjay0+aWQoKSwgcmVjb3JkVHJhY2stPm1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZWNvcmRUcmFjay0+aWQoKSwgKGludClyZWNvcmRUcmFjay0+bVN0YXRlKTsKICAgICAgICAgICAgICAgICAvLyBTb21lb25lIGVsc2UgaGFzIGNoYW5nZWQgc3RhdGUsIGxldCB0aGVtIHRha2Ugb3ZlciwKICAgICAgICAgICAgICAgICAvLyBsZWF2ZSBtU3RhdGUgaW4gdGhlIG5ldyBzdGF0ZS4KICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwpAQCAtODYzMSwzMCArODk3MywyMiBAQAogICAgIHJldHVybiBTdHJpbmc4KCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCwKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSB7Ci0gICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKLQotICAgIGRlc2MtPm1Jb0hhbmRsZSA9IG1JZDsKLQorICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjOwogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEFVRElPX0lOUFVUX09QRU5FRDoKICAgICBjYXNlIEFVRElPX0lOUFVUX1JFR0lTVEVSRUQ6CiAgICAgY2FzZSBBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgZGVzYy0+bVBhdGNoID0gbVBhdGNoOwotICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7Ci0gICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKLSAgICAgICAgZGVzYy0+bUZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgICAgIGRlc2MtPm1GcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7Ci0gICAgICAgIGRlc2MtPm1GcmFtZUNvdW50SEFMID0gbUZyYW1lQ291bnQ7Ci0gICAgICAgIGRlc2MtPm1MYXRlbmN5ID0gMDsKKyAgICAgICAgZGVzYyA9IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPjo6bWFrZShtSWQsIG1QYXRjaCwgdHJ1ZSAvKmlzSW5wdXQqLywKKyAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX0NMSUVOVF9TVEFSVEVEOgotICAgICAgICBkZXNjLT5tUGF0Y2ggPSBtUGF0Y2g7Ci0gICAgICAgIGRlc2MtPm1Qb3J0SWQgPSBwb3J0SWQ7CisgICAgICAgIGRlc2MgPSBzcDxBdWRpb0lvRGVzY3JpcHRvcj46Om1ha2UobUlkLCBtUGF0Y2gsIHBvcnRJZCk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fSU5QVVRfQ0xPU0VEOgogICAgIGRlZmF1bHQ6CisgICAgICAgIGRlc2MgPSBzcDxBdWRpb0lvRGVzY3JpcHRvcj46Om1ha2UobUlkKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIG1BdWRpb0ZsaW5nZXItPmlvQ29uZmlnQ2hhbmdlZChldmVudCwgZGVzYywgcGlkKTsKQEAgLTg4MDYsMjEgKzkxNDAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY2hhciAqYWRkcmVzczsKLSAgICAgICAgaWYgKHN0cmNtcChwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3MsICIiKSAhPSAwKSB7Ci0gICAgICAgICAgICBhZGRyZXNzID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZHJlc3MgPSAoY2hhciAqKWNhbGxvYygxLCAxKTsKLSAgICAgICAgfQotICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKFN0cmluZzgoYWRkcmVzcykpOwotICAgICAgICBmcmVlKGFkZHJlc3MpOwotICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksCi0gICAgICAgICAgICAgICAgICAgICAoaW50KXBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZSk7Ci0gICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlJbnB1dFNvdXJjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UpOwotICAgICAgICBzdGF0dXMgPSBtSW5wdXQtPnN0cmVhbS0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmxlZ2FjeUNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gtPnNvdXJjZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGUpOwogICAgICAgICAqaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgfQogCkBAIC04ODUyLDkgKzkxNzQsNyBAQAogICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0gbUlucHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOwogICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlKTsKICAgICB9IGVsc2UgewotICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKLSAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCAwKTsKLSAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgIHN0YXR1cyA9IG1JbnB1dC0+c3RyZWFtLT5sZWdhY3lSZWxlYXNlQXVkaW9QYXRjaCgpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtOTE2MSw2ICs5NDgxLDcgQEAKICAgICB9CiAgICAgaWYgKG1TdGFuZGJ5KSB7CiAgICAgICAgIG1UaHJlYWRNZXRyaWNzLmxvZ0JlZ2luSW50ZXJ2YWwoKTsKKyAgICAgICAgbVRocmVhZFNuYXBzaG90Lm9uQmVnaW4oKTsKICAgICAgICAgbVN0YW5kYnkgPSBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtOTIwMCw2ICs5NTIxLDcgQEAKICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gbURldmljZUlkOwogICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc2Vjb25kYXJ5T3V0cHV0czsKKyAgICAgICAgYm9vbCBpc1NwYXRpYWxpemVkOwogICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigmbUF0dHIsICZpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbSwKQEAgLTkyMDgsNyArOTUzMCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlY29uZGFyeU91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1NwYXRpYWxpemVkKTsKICAgICAgICAgQUxPR0RfSUYoIXNlY29uZGFyeU91dHB1dHMuZW1wdHkoKSwKICAgICAgICAgICAgICAgICAgIk1tYXBUaHJlYWQ6OnN0YXJ0IGRvZXMgbm90IHN1cHBvcnQgc2Vjb25kYXJ5IG91dHB1dHMsIGlnbm9yaW5nIHRoZW0iKTsKICAgICB9IGVsc2UgewpAQCAtOTI4OCw3ICs5NjExLDcgQEAKICAgICBtQWN0aXZlVHJhY2tzLmFkZCh0cmFjayk7CiAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChtU2Vzc2lvbklkKTsKICAgICBpZiAoY2hhaW4gIT0gMCkgewotICAgICAgICBjaGFpbi0+c2V0U3RyYXRlZ3koQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbVR5cGUoKSkpOworICAgICAgICBjaGFpbi0+c2V0U3RyYXRlZ3koZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtVHlwZSgpKSk7CiAgICAgICAgIGNoYWluLT5pbmNUcmFja0NudCgpOwogICAgICAgICBjaGFpbi0+aW5jQWN0aXZlVHJhY2tDbnQoKTsKICAgICB9CkBAIC05MzY2LDYgKzk2ODksNyBAQAogICAgIG1IYWxTdHJlYW0tPnN0YW5kYnkoKTsKICAgICBpZiAoIW1TdGFuZGJ5KSB7CiAgICAgICAgIG1UaHJlYWRNZXRyaWNzLmxvZ0VuZEludGVydmFsKCk7CisgICAgICAgIG1UaHJlYWRTbmFwc2hvdC5vbkVuZCgpOwogICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgfQogICAgIHJlbGVhc2VXYWtlTG9jaygpOwpAQCAtOTUwOCwzMSArOTgzMiwyNiBAQAogICAgIHJldHVybiBTdHJpbmc4KCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LCBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkIF9fdW51c2VkKSB7Ci0gICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKLQotICAgIGRlc2MtPm1Jb0hhbmRsZSA9IG1JZDsKLQorICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjOworICAgIGJvb2wgaXNJbnB1dCA9IGZhbHNlOwogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEFVRElPX0lOUFVUX09QRU5FRDoKICAgICBjYXNlIEFVRElPX0lOUFVUX1JFR0lTVEVSRUQ6CiAgICAgY2FzZSBBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRDoKKyAgICAgICAgaXNJbnB1dCA9IHRydWU7CisgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgIGNhc2UgQVVESU9fT1VUUFVUX09QRU5FRDoKICAgICBjYXNlIEFVRElPX09VVFBVVF9SRUdJU1RFUkVEOgogICAgIGNhc2UgQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEOgotICAgICAgICBkZXNjLT5tUGF0Y2ggPSBtUGF0Y2g7Ci0gICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsKLSAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOwotICAgICAgICBkZXNjLT5tRm9ybWF0ID0gbUZvcm1hdDsKLSAgICAgICAgZGVzYy0+bUZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKLSAgICAgICAgZGVzYy0+bUZyYW1lQ291bnRIQUwgPSBtRnJhbWVDb3VudDsKLSAgICAgICAgZGVzYy0+bUxhdGVuY3kgPSAwOworICAgICAgICBkZXNjID0gc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+OjptYWtlKG1JZCwgbVBhdGNoLCBpc0lucHV0LAorICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1GcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CiAgICAgICAgIGJyZWFrOwotCiAgICAgY2FzZSBBVURJT19JTlBVVF9DTE9TRUQ6CiAgICAgY2FzZSBBVURJT19PVVRQVVRfQ0xPU0VEOgogICAgIGRlZmF1bHQ6CisgICAgICAgIGRlc2MgPSBzcDxBdWRpb0lvRGVzY3JpcHRvcj46Om1ha2UobUlkKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIG1BdWRpb0ZsaW5nZXItPmlvQ29uZmlnQ2hhbmdlZChldmVudCwgZGVzYywgcGlkKTsKQEAgLTk1ODksMjkgKzk5MDgsMTggQEAKICAgICB9CiAKICAgICBpZiAobUF1ZGlvSHdEZXYtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCkpIHsKLSAgICAgICAgc3RhdHVzID0gbUhhbERldmljZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaC0+bnVtX3NvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CisgICAgICAgIHN0YXR1cyA9IG1IYWxEZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+c291cmNlcywgcGF0Y2gtPm51bV9zaW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsIGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY2hhciAqYWRkcmVzczsKLSAgICAgICAgaWYgKHN0cmNtcChwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzLCAiIikgIT0gMCkgewotICAgICAgICAgICAgLy9GSVhNRTogd2Ugb25seSBzdXBwb3J0IGFkZHJlc3Mgb24gZmlyc3Qgc2luayB3aXRoIEhBTCB2ZXJzaW9uIDwgMy4wCi0gICAgICAgICAgICBhZGRyZXNzID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKKyAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgcG9ydDsKKyAgICAgICAgc3RkOjpvcHRpb25hbDxhdWRpb19zb3VyY2VfdD4gc291cmNlOworICAgICAgICBpZiAoaXNPdXRwdXQoKSkgeworICAgICAgICAgICAgcG9ydCA9IHBhdGNoLT5zaW5rc1swXTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZHJlc3MgPSAoY2hhciAqKWNhbGxvYygxLCAxKTsKKyAgICAgICAgICAgIHBvcnQgPSBwYXRjaC0+c291cmNlc1swXTsKKyAgICAgICAgICAgIHNvdXJjZSA9IHBhdGNoLT5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlOwogICAgICAgICB9Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoU3RyaW5nOChhZGRyZXNzKSk7Ci0gICAgICAgIGZyZWUoYWRkcmVzcyk7Ci0gICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgKGludCl0eXBlKTsKLSAgICAgICAgaWYgKCFpc091dHB1dCgpKSB7Ci0gICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBhdGNoLT5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlKTsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBtSGFsU3RyZWFtLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICBzdGF0dXMgPSBtSGFsU3RyZWFtLT5sZWdhY3lDcmVhdGVBdWRpb1BhdGNoKHBvcnQsIHNvdXJjZSwgdHlwZSk7CiAgICAgICAgICpoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB9CiAKQEAgLTk2NTAsOSArOTk1OCw3IEBACiAgICAgaWYgKHN1cHBvcnRzQXVkaW9QYXRjaGVzKSB7CiAgICAgICAgIHN0YXR1cyA9IG1IYWxEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07Ci0gICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgMCk7Ci0gICAgICAgIHN0YXR1cyA9IG1IYWxTdHJlYW0tPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgIHN0YXR1cyA9IG1IYWxTdHJlYW0tPmxlZ2FjeVJlbGVhc2VBdWRpb1BhdGNoKCk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAppbmRleCA4NTk2YzRkLi4wNzRhZThmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKQEAgLTMyLDYgKzMyLDcgQEAKICAgICAgICAgT0ZGTE9BRCwgICAgICAgICAgICAvLyBUaHJlYWQgY2xhc3MgaXMgT2ZmbG9hZFRocmVhZAogICAgICAgICBNTUFQX1BMQVlCQUNLLCAgICAgIC8vIFRocmVhZCBjbGFzcyBmb3IgTU1BUCBwbGF5YmFjayBzdHJlYW0KICAgICAgICAgTU1BUF9DQVBUVVJFLCAgICAgICAvLyBUaHJlYWQgY2xhc3MgZm9yIE1NQVAgY2FwdHVyZSBzdHJlYW0KKyAgICAgICAgU1BBVElBTElaRVIsICAvLwogICAgICAgICAvLyBJZiB5b3UgYWRkIGFueSB2YWx1ZXMgaGVyZSwgYWxzbyB1cGRhdGUgVGhyZWFkQmFzZTo6dGhyZWFkVHlwZVRvU3RyaW5nKCkKICAgICB9OwogCkBAIC01Myw3ICs1NCw4IEBACiAgICAgICAgIENGR19FVkVOVF9DUkVBVEVfQVVESU9fUEFUQ0gsCiAgICAgICAgIENGR19FVkVOVF9SRUxFQVNFX0FVRElPX1BBVENILAogICAgICAgICBDRkdfRVZFTlRfVVBEQVRFX09VVF9ERVZJQ0UsCi0gICAgICAgIENGR19FVkVOVF9SRVNJWkVfQlVGRkVSCisgICAgICAgIENGR19FVkVOVF9SRVNJWkVfQlVGRkVSLAorICAgICAgICBDRkdfRVZFTlRfQ0hFQ0tfT1VUUFVUX1NUQUdFX0VGRkVDVFMKICAgICB9OwogCiAgICAgY2xhc3MgQ29uZmlnRXZlbnREYXRhOiBwdWJsaWMgUmVmQmFzZSB7CkBAIC04Nyw3ICs4OSwxMyBAQAogICAgIHB1YmxpYzoKICAgICAgICAgdmlydHVhbCB+Q29uZmlnRXZlbnQoKSB7fQogCi0gICAgICAgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7IG1EYXRhLT5kdW1wKGJ1ZmZlciwgc2l6ZSk7IH0KKyAgICAgICAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIkV2ZW50IHR5cGU6ICVkXG4iLCBtVHlwZSk7CisgICAgICAgICAgICBpZiAobURhdGEgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIkRhdGE6XG4iKTsKKyAgICAgICAgICAgICAgICBtRGF0YS0+ZHVtcChidWZmZXIsIHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgY29uc3QgaW50IG1UeXBlOyAvLyBldmVudCB0eXBlIGUuZy4gQ0ZHX0VWRU5UX0lPCiAgICAgICAgIE11dGV4IG1Mb2NrOyAgICAgLy8gbXV0ZXggYXNzb2NpYXRlZCB3aXRoIG1Db25kCkBAIC0xMDUsMjIgKzExMywyMiBAQAogCiAgICAgY2xhc3MgSW9Db25maWdFdmVudERhdGEgOiBwdWJsaWMgQ29uZmlnRXZlbnREYXRhIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIElvQ29uZmlnRXZlbnREYXRhKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkLAorICAgICAgICBJb0NvbmZpZ0V2ZW50RGF0YShhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgOgogICAgICAgICAgICAgbUV2ZW50KGV2ZW50KSwgbVBpZChwaWQpLCBtUG9ydElkKHBvcnRJZCkge30KIAogICAgICAgICB2aXJ0dWFsICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiSU8gZXZlbnQ6IGV2ZW50ICVkXG4iLCBtRXZlbnQpOworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiLSBJTyBldmVudDogZXZlbnQgJWRcbiIsIG1FdmVudCk7CiAgICAgICAgIH0KIAotICAgICAgICBjb25zdCBhdWRpb19pb19jb25maWdfZXZlbnQgbUV2ZW50OworICAgICAgICBjb25zdCBhdWRpb19pb19jb25maWdfZXZlbnRfdCBtRXZlbnQ7CiAgICAgICAgIGNvbnN0IHBpZF90ICAgICAgICAgICAgICAgICBtUGlkOwogICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90ICAgbVBvcnRJZDsKICAgICB9OwogCiAgICAgY2xhc3MgSW9Db25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CiAgICAgcHVibGljOgotICAgICAgICBJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkLCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgOgorICAgICAgICBJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LCBwaWRfdCBwaWQsIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA6CiAgICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfSU8pIHsKICAgICAgICAgICAgIG1EYXRhID0gbmV3IElvQ29uZmlnRXZlbnREYXRhKGV2ZW50LCBwaWQsIHBvcnRJZCk7CiAgICAgICAgIH0KQEAgLTEzMyw3ICsxNDEsNyBAQAogICAgICAgICAgICAgbVBpZChwaWQpLCBtVGlkKHRpZCksIG1QcmlvKHByaW8pLCBtRm9yQXBwKGZvckFwcCkge30KIAogICAgICAgICB2aXJ0dWFsICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiUHJpbyBldmVudDogcGlkICVkLCB0aWQgJWQsIHByaW8gJWQsIGZvciBhcHA/ICVkXG4iLAorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiLSBQcmlvIGV2ZW50OiBwaWQgJWQsIHRpZCAlZCwgcHJpbyAlZCwgZm9yIGFwcD8gJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIG1QaWQsIG1UaWQsIG1QcmlvLCBtRm9yQXBwKTsKICAgICAgICAgfQogCkBAIC0xNTgsNyArMTY2LDcgQEAKICAgICAgICAgICAgIG1LZXlWYWx1ZVBhaXJzKGtleVZhbHVlUGFpcnMpIHt9CiAKICAgICAgICAgdmlydHVhbCAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIktleVZhbHVlOiAlc1xuIiwgbUtleVZhbHVlUGFpcnMuc3RyaW5nKCkpOworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiLSBLZXlWYWx1ZTogJXNcbiIsIG1LZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IFN0cmluZzggbUtleVZhbHVlUGFpcnM7CkBAIC0xODEsNyArMTg5LDcgQEAKICAgICAgICAgICAgIG1QYXRjaChwYXRjaCksIG1IYW5kbGUoaGFuZGxlKSB7fQogCiAgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJQYXRjaCBoYW5kbGU6ICV1XG4iLCBtSGFuZGxlKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIi0gUGF0Y2ggaGFuZGxlOiAldVxuIiwgbUhhbmRsZSk7CiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoOwpAQCAtMjA1LDcgKzIxMyw3IEBACiAgICAgICAgICAgICBtSGFuZGxlKGhhbmRsZSkge30KIAogICAgICAgICB2aXJ0dWFsICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiUGF0Y2ggaGFuZGxlOiAldVxuIiwgbUhhbmRsZSk7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICItIFBhdGNoIGhhbmRsZTogJXVcbiIsIG1IYW5kbGUpOwogICAgICAgICB9CiAKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZTsKQEAgLTIyNyw3ICsyMzUsNyBAQAogICAgICAgICAgICAgbU91dERldmljZXMob3V0RGV2aWNlcykge30KIAogICAgICAgICB2aXJ0dWFsIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJEZXZpY2VzOiAlcyIsIGFuZHJvaWQ6OnRvU3RyaW5nKG1PdXREZXZpY2VzKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIi0gRGV2aWNlczogJXMiLCBhbmRyb2lkOjp0b1N0cmluZyhtT3V0RGV2aWNlcykuY19zdHIoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciBtT3V0RGV2aWNlczsKQEAgLTI0OSw3ICsyNTcsNyBAQAogICAgICAgICAgICAgbU1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKSB7fQogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIm1NYXhTaGFyZWRBdWRpb0hpc3RvcnlNczogJWQiLCBtTWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMpOworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiLSBtTWF4U2hhcmVkQXVkaW9IaXN0b3J5TXM6ICVkIiwgbU1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKTsKICAgICAgICAgfQogCiAgICAgICAgIGludDMyX3QgbU1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zOwpAQCAtMjY1LDYgKzI3MywxNiBAQAogICAgICAgICB2aXJ0dWFsIH5SZXNpemVCdWZmZXJDb25maWdFdmVudCgpIHt9CiAgICAgfTsKIAorICAgIGNsYXNzIENoZWNrT3V0cHV0U3RhZ2VFZmZlY3RzRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgQ2hlY2tPdXRwdXRTdGFnZUVmZmVjdHNFdmVudCgpIDoKKyAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9DSEVDS19PVVRQVVRfU1RBR0VfRUZGRUNUUykgeworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+Q2hlY2tPdXRwdXRTdGFnZUVmZmVjdHNFdmVudCgpIHt9CisgICAgfTsKKworCiAgICAgY2xhc3MgUE1EZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiAgICAgcHVibGljOgogICAgICAgICBleHBsaWNpdCAgICBQTURlYXRoUmVjaXBpZW50KGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQpIDogbVRocmVhZCh0aHJlYWQpIHt9CkBAIC0yOTAsOCArMzA4LDExIEBACiAgICAgICAgICAgICAgICAgLy8gZHluYW1pYyBleHRlcm5hbGx5LXZpc2libGUKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGU7IH0KICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFzazsgfQorICAgIHZpcnR1YWwgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVyQ2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbE1hc2s7IH0KKwogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1IQUxGb3JtYXQ7IH0KICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50OyB9CisKICAgICAgICAgICAgICAgICAvLyBDYWxsZWQgYnkgQXVkaW9GbGluZ2VyOjpmcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgYW5kIGVmZmVjdHMsCiAgICAgICAgICAgICAgICAgLy8gYW5kIHJldHVybnMgdGhlIFtub3JtYWwgbWl4XSBidWZmZXIncyBmcmFtZSBjb3VudC4KICAgICB2aXJ0dWFsICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3QgPSAwOwpAQCAtMzExLDE1ICszMzIsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKSA9IDA7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKICAgICB2aXJ0dWFsICAgICBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpID0gMDsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwgcGlkX3QgcGlkID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpID0gMDsKICAgICAgICAgICAgICAgICAvLyBzZW5kQ29uZmlnRXZlbnRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogICAgICAgICAgICAgICAgIC8vIENhbiB0ZW1wb3JhcmlseSByZWxlYXNlIHRoZSBsb2NrIGlmIHdhaXRpbmcgZm9yIGEgcmVwbHkgZnJvbQogICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NDb25maWdFdmVudHNfbCgpLgogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRDb25maWdFdmVudF9sKHNwPENvbmZpZ0V2ZW50PiYgZXZlbnQpOwotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCwKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kSW9Db25maWdFdmVudChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwgcGlkX3QgcGlkID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woYXVkaW9faW9fY29uZmlnX2V2ZW50X3QgZXZlbnQsIHBpZF90IHBpZCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvLCBib29sIGZvckFwcCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZFByaW9Db25maWdFdmVudF9sKHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8sIGJvb2wgZm9yQXBwKTsKQEAgLTMzMCw3ICszNTEsMTEgQEAKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kVXBkYXRlT3V0RGV2aWNlQ29uZmlnRXZlbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciYgb3V0RGV2aWNlcyk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZFJlc2l6ZUJ1ZmZlckNvbmZpZ0V2ZW50X2woaW50MzJfdCBtYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZENoZWNrT3V0cHV0U3RhZ2VFZmZlY3RzRXZlbnQoKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kQ2hlY2tPdXRwdXRTdGFnZUVmZmVjdHNFdmVudF9sKCk7CisKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBwcm9jZXNzQ29uZmlnRXZlbnRzX2woKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRDaGVja091dHB1dFN0YWdlRWZmZWN0cygpIHt9CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKSA9IDA7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKQEAgLTM4Myw3ICs0MDgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBpbm5lZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbm90aWZ5RnJhbWVzUHJvY2Vzc2VkKTsKIAogICAgICAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZXMgZm9yIGhhc0F1ZGlvU2Vzc2lvbiAoYml0IGZpZWxkKQogICAgICAgICAgICAgICAgIGVudW0gZWZmZWN0X3N0YXRlIHsKQEAgLTM5MSw4ICs0MTcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWZmZWN0CiAgICAgICAgICAgICAgICAgICAgIFRSQUNLX1NFU1NJT04gPSAweDIsICAgIC8vIHRoZSBhdWRpbyBzZXNzaW9uIGNvcnJlc3BvbmRzIHRvIGF0IGxlYXN0IG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFjawotICAgICAgICAgICAgICAgICAgICBGQVNUX1NFU1NJT04gPSAweDQgICAgICAvLyB0aGUgYXVkaW8gc2Vzc2lvbiBjb3JyZXNwb25kcyB0byBhdCBsZWFzdCBvbmUKKyAgICAgICAgICAgICAgICAgICAgRkFTVF9TRVNTSU9OID0gMHg0LCAgICAgLy8gdGhlIGF1ZGlvIHNlc3Npb24gY29ycmVzcG9uZHMgdG8gYXQgbGVhc3Qgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhc3QgdHJhY2sKKyAgICAgICAgICAgICAgICAgICAgU1BBVElBTElaRURfU0VTU0lPTiA9IDB4OCAvLyB0aGUgYXVkaW8gc2Vzc2lvbiBjb3JyZXNwb25kcyB0byBhdCBsZWFzdCBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGF0aWFsaXplZCB0cmFjawogICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgICAvLyBnZXQgZWZmZWN0IGNoYWluIGNvcnJlc3BvbmRpbmcgdG8gc2Vzc2lvbiBJZC4KQEAgLTQzMyw2ICs0NjEsNyBAQAogICAgICAgICAgICAgICAgIC8vIC0gRUZGRUNUX1NFU1NJT04gaWYgZWZmZWN0cyBvbiB0aGlzIGF1ZGlvIHNlc3Npb24gZXhpc3QgaW4gb25lIGNoYWluCiAgICAgICAgICAgICAgICAgLy8gLSBUUkFDS19TRVNTSU9OIGlmIHRyYWNrcyBvbiB0aGlzIGF1ZGlvIHNlc3Npb24gZXhpc3QKICAgICAgICAgICAgICAgICAvLyAtIEZBU1RfU0VTU0lPTiBpZiBmYXN0IHRyYWNrcyBvbiB0aGlzIGF1ZGlvIHNlc3Npb24gZXhpc3QKKyAgICAgICAgICAgICAgICAvLyAtIFNQQVRJQUxJWkVEX1NFU1NJT04gaWYgc3BhdGlhbGl6ZWQgdHJhY2tzIG9uIHRoaXMgYXVkaW8gc2Vzc2lvbiBleGlzdAogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90IGhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIGNvbnN0ID0gMDsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBoYXNBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3QgewogICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtNDU0LDYgKzQ4Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBGQVNUX1NFU1NJT047ICAvLyBjYXV0aW9uLCBvbmx5IHJlcHJlc2VudHMgZmlyc3QgdHJhY2suCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNTcGF0aWFsaXplZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBTUEFUSUFMSVpFRF9TRVNTSU9OOyAgLy8gY2F1dGlvbiwgb25seSBmaXJzdCB0cmFjay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU3NCw2ICs2MDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQgX191bnVzZWQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB9CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrc19sKGludCBmZCBfX3VudXNlZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgeyB9CkBAIC02NTMsMTAgKzY4NywxNCBAQAogICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0SW9CZWdpbk5zID0gLTE7CiAgICAgICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgbUxhc3RJb0VuZE5zID0gLTE7CiAKKyAgICAgICAgICAgICAgICAvLyBUaHJlYWRTbmFwc2hvdCBpcyB0aHJlYWQtc2FmZSAoaW50ZXJuYWxseSBsb2NrZWQpCisgICAgICAgICAgICAgICAgbWVkaWF1dGlsczo6VGhyZWFkU25hcHNob3QgbVRocmVhZFNuYXBzaG90OworCiAgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgcmVhZCB1bmRlciBUaHJlYWRCYXNlIGxvY2sgKGlmIG5vdCBvbiB0aGUgdGhyZWFkTG9vcCB0aHJlYWQpLgogICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUlvSml0dGVyTXN7MC45OTUgLyogYWxwaGEgKi99OwogICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbVByb2Nlc3NUaW1lTXN7MC45OTUgLyogYWxwaGEgKi99OwogICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUxhdGVuY3lNc3swLjk5NSAvKiBhbHBoYSAqL307CisgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtTW9ub3BpcGVQaXBlRGVwdGhTdGF0c3swLjk5OSAvKiBhbHBoYSAqL307CiAKICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBsYXN0IGNvdW50IHdoZW4gd2UgZGVsaXZlcmVkIHN0YXRpc3RpY3MgdG8gbWVkaWFtZXRyaWNzLgogICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0UmVjb3JkZWRUaW1lc3RhbXBWZXJpZmllck4gPSAwOwpAQCAtODI0LDcgKzg2Miw4IEBACiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga01heE5leHRCdWZmZXJEZWxheU5zID0gMTAwMDAwMDAwOwogCiAgICAgUGxheWJhY2tUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CisgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIHR5cGVfdCB0eXBlLCBib29sIHN5c3RlbVJlYWR5LAorICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKm1peGVyQ29uZmlnID0gbnVsbHB0cik7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UGxheWJhY2tUaHJlYWQoKTsKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwpAQCAtODgxLDYgKzkyMCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MudXBkYXRlUG93ZXJTdGF0ZSh0aGlzLCB0cnVlIC8qIGZvcmNlICovKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBjaGVja091dHB1dFN0YWdlRWZmZWN0cygpIHt9CisKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wSW50ZXJuYWxzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wVHJhY2tzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKIApAQCAtOTIyLDcgKzk2Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklBdWRpb1RyYWNrQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NwYXRpYWxpemVkKTsKIAogICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBnZXRPdXRwdXQoKSBjb25zdDsKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogY2xlYXJPdXRwdXQoKTsKQEAgLTk0Miw3ICs5ODQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1TdXNwZW5kZWQpID4gMDsgfQogCiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwgcGlkX3QgcGlkID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzKTsKICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBhbHNvIHJlbW92aW5nIGFuZCBwYXNzaW5nIGFuIGV4cGxpY2l0IG1NYWluQnVmZmVyIGluaXRpYWxpemF0aW9uCkBAIC05NzMsNiArMTAxNSwxMCBAQAogCiAgICAgdmlydHVhbCAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1Ob3JtYWxGcmFtZUNvdW50OyB9CiAKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU1peGVyQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wX2woQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCk7CiAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoVHJhY2s+JiB0cmFjayk7CkBAIC0xMDE1LDYgKzEwNjEsOSBAQAogCiAgICAgICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQ6OlRyYWNrKiBnZXRUcmFja0J5SWRfbChhdWRpb19wb3J0X2hhbmRsZV90IHRyYWNrSWQpOwogCisgICAgICAgICAgICAgICAgYm9vbCBoYXNNaXhlcigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HIHx8IG1UeXBlID09IFNQQVRJQUxJWkVSOworICAgICAgICAgICAgICAgIH0KIHByb3RlY3RlZDoKICAgICAvLyB1cGRhdGVkIGJ5IHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKQogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQ7ICAvLyBub3JtYWwgbWl4ZXIgYW5kIGVmZmVjdHMKQEAgLTEwODQsNiArMTEzMywxNSBAQAogICAgIC8vIGZvciBhbnkgcHJvY2Vzc2luZyAoaW5jbHVkaW5nIG91dHB1dCBwcm9jZXNzaW5nKS4KICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJWYWxpZDsKIAorICAgIC8vIEZyYW1lIHNpemUgYWxpZ25lZCBidWZmZXIgdXNlZCBhcyBpbnB1dCBhbmQgb3V0cHV0IHRvIGFsbCBwb3N0IHByb2Nlc3NpbmcgZWZmZWN0cworICAgIC8vIGV4Y2VwdCB0aGUgU3BhdGlhbGl6ZXIgaW4gYSBTUEFUSUFMSVpFUiB0aHJlYWQuIE5vbiBzcGF0aWFsaXplZCB0cmFja3MgYXJlIG1peGVkIGludG8KKyAgICAvLyB0aGlzIGJ1ZmZlciBzbyB0aGF0IHBvc3QgcHJvY2Vzc2luZyBlZmZlY3RzIGNhbiBiZSBhcHBsaWVkLgorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvc3RTcGF0aWFsaXplckJ1ZmZlciA9IG51bGxwdHI7CisKKyAgICAvLyBTaXplIG9mIG1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXIgaW4gYnl0ZXMKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3N0U3BhdGlhbGl6ZXJCdWZmZXJTaXplOworCisKICAgICAvLyBzdXNwZW5kIGNvdW50LCA+IDAgbWVhbnMgc3VzcGVuZGVkLiAgV2hpbGUgc3VzcGVuZGVkLCB0aGUgdGhyZWFkIGNvbnRpbnVlcyB0byBwdWxsIGZyb20KICAgICAvLyB0cmFja3MgYW5kIG1peCwgYnV0IGRvZXNuJ3Qgd3JpdGUgdG8gSEFMLiAgQTJEUCBhbmQgU0NPIEhBTCBpbXBsZW1lbnRhdGlvbnMgY2FuJ3QgaGFuZGxlCiAgICAgLy8gY29uY3VycmVudCB1c2Ugb2YgYm90aCBvZiB0aGVtLCBzbyBBdWRpbyBQb2xpY3kgU2VydmljZSBzdXNwZW5kcyBvbmUgb2YgdGhlIHRocmVhZHMgdG8KQEAgLTExMDEsNiArMTE1OSw5IEBACiAgICAgLy8gaGFwdGljIHBsYXliYWNrLgogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgICAgICAgICAgbUhhcHRpY0NoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbUhhcHRpY0NoYW5uZWxDb3VudCA9IDA7CisKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCAgICAgICAgICAgIG1NaXhlckNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworCiBwcml2YXRlOgogICAgIC8vIG1NYXN0ZXJNdXRlIGlzIGluIGJvdGggUGxheWJhY2tUaHJlYWQgYW5kIGluIEF1ZGlvRmxpbmdlci4gIFdoZW4gYQogICAgIC8vIFBsYXliYWNrVGhyZWFkIG5lZWRzIHRvIGZpbmQgb3V0IGlmIG1hc3Rlci1tdXRlZCwgaXQgY2hlY2tzIGl0J3MgbG9jYWwKQEAgLTExMzQsNiArMTE5NSw5IEBACiAKICAgICAvLyBDYWNoZSB2YXJpb3VzIGNhbGN1bGF0ZWQgdmFsdWVzLCBhdCB0aHJlYWRMb29wKCkgZW50cnkgYW5kIGFmdGVyIGEgcGFyYW1ldGVyIGNoYW5nZQogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGNhY2hlUGFyYW1ldGVyc19sKCk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0Q2hlY2tPdXRwdXRTdGFnZUVmZmVjdHMoKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja091dHB1dFN0YWdlRWZmZWN0cy5zdG9yZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBjb3JyZWN0TGF0ZW5jeV9sKHVpbnQzMl90IGxhdGVuY3kpIGNvbnN0OwogCkBAIC0xMzE0LDYgKzEzNzgsMTYgQEAKICAgICAgICAgICAgICAgICAvLyBhdWRpbyBwYXRjaCB1c2VkIGJ5IHRoZSBkb3duc3RyZWFtIHNvZnR3YXJlIHBhdGNoLgogICAgICAgICAgICAgICAgIC8vIE9ubHkgdXNlZCBpZiBUaHJlYWRCYXNlOjptSXNNc2REZXZpY2UgaXMgdHJ1ZS4KICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbURvd25TdHJlYW1QYXRjaDsKKworICAgICAgICAgICAgICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUNoZWNrT3V0cHV0U3RhZ2VFZmZlY3Rze307CisKKyAgICAgICAgICAgICAgICAvLyBBIGRpZmZlcmVudGlhbCBjaGVjayBvbiB0aGUgdGltZXN0YW1wcyB0byBzZWUgaWYgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlCisgICAgICAgICAgICAgICAgLy8gdGltZXN0YW1wIGZyYW1lIHBvc2l0aW9uIGJldHdlZW4gdGhlIGxhc3QgY2FsbCB0byBjaGVja1J1bm5pbmdUaW1lc3RhbXAuCisgICAgICAgICAgICAgICAgdWludDY0X3QgbUxhc3RDaGVja2VkVGltZXN0YW1wUG9zaXRpb24gPSB+MExMOworCisgICAgICAgICAgICAgICAgYm9vbCBjaGVja1J1bm5pbmdUaW1lc3RhbXAoKTsKKworICAgIHZpcnR1YWwgICAgIHZvaWQgZmx1c2hId19sKCkgeyBtTGFzdENoZWNrZWRUaW1lc3RhbXBQb3NpdGlvbiA9IH4wTEw7IH0KIH07CiAKIGNsYXNzIE1peGVyVGhyZWFkIDogcHVibGljIFBsYXliYWNrVGhyZWFkIHsKQEAgLTEzMjIsNyArMTM5Niw4IEBACiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwKICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5LAotICAgICAgICAgICAgICAgIHR5cGVfdCB0eXBlID0gTUlYRVIpOworICAgICAgICAgICAgICAgIHR5cGVfdCB0eXBlID0gTUlYRVIsCisgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCAqbWl4ZXJDb25maWcgPSBudWxscHRyKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NaXhlclRocmVhZCgpOwogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCkBAIC0xNDMwLDcgKzE1MDUsNyBAQAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cyk7CiAKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBmbHVzaEh3X2woKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBmbHVzaEh3X2woKSBvdmVycmlkZTsKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkgb3ZlcnJpZGU7CiAKQEAgLTE0OTUsNyArMTU3MCw3IEBACiAgICAgT2ZmbG9hZFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfk9mZmxvYWRUaHJlYWQoKSB7fTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBmbHVzaEh3X2woKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBmbHVzaEh3X2woKSBvdmVycmlkZTsKIAogcHJvdGVjdGVkOgogICAgIC8vIHRocmVhZExvb3Agc25pcHBldHMKQEAgLTE1MTIsMTAgKzE1ODcsNiBAQAogICAgIHNpemVfdCAgICAgIG1QYXVzZWRXcml0ZUxlbmd0aDsgICAgIC8vIGxlbmd0aCBpbiBieXRlcyBvZiB3cml0ZSBpbnRlcnJ1cHRlZCBieSBwYXVzZQogICAgIHNpemVfdCAgICAgIG1QYXVzZWRCeXRlc1JlbWFpbmluZzsgIC8vIGJ5dGVzIHN0aWxsIHdhaXRpbmcgaW4gbWl4YnVmZmVyIGFmdGVyIHJlc3VtZQogICAgIGJvb2wgICAgICAgIG1LZWVwV2FrZUxvY2s7ICAgICAgICAgIC8vIGtlZXAgd2FrZSBsb2NrIHdoaWxlIHdhaXRpbmcgZm9yIHdyaXRlIGNhbGxiYWNrCi0gICAgdWludDY0X3QgICAgbU9mZmxvYWRVbmRlcnJ1blBvc2l0aW9uOyAvLyBDdXJyZW50IGZyYW1lIHBvc2l0aW9uIGZvciBvZmZsb2FkZWQgcGxheWJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgYW5kIHZhbGlkIG9ubHkgZHVyaW5nIHVuZGVycnVuLiAgfjAgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHVuZGVycnVuIGhhcyBvY2N1cnJlZCBkdXJpbmcgcGxheWJhY2sgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3QgcmVzZXQgb24gc3RhbmRieS4KIH07CiAKIGNsYXNzIEFzeW5jQ2FsbGJhY2tUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKQEAgLTE2MTEsNiArMTY4MiwyNCBAQAogICAgIH0KIH07CiAKK2NsYXNzIFNwYXRpYWxpemVyVGhyZWFkIDogcHVibGljIE1peGVyVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBTcGF0aWFsaXplclRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCAqbWl4ZXJDb25maWcpOworICAgICAgICAgICAgflNwYXRpYWxpemVyVGhyZWFkKCkgb3ZlcnJpZGUge30KKworICAgICAgICAgICAgYm9vbCBoYXNGYXN0TWl4ZXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgICAgICAgICB2b2lkIGNoZWNrT3V0cHV0U3RhZ2VFZmZlY3RzKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgICAgICAgICBzcDxFZmZlY3RIYW5kbGU+IG1GaW5hbERvd25NaXhlcjsKK307CisKIC8vIHJlY29yZCB0aHJlYWQKIGNsYXNzIFJlY29yZFRocmVhZCA6IHB1YmxpYyBUaHJlYWRCYXNlCiB7CkBAIC0xNzIxLDcgKzE4MTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGNhY2hlUGFyYW1ldGVyc19sKCkge30KICAgICB2aXJ0dWFsIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudF90IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKQEAgLTE3NzksNiArMTg2OCw4IEBACiAKICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2tzIHBvcGNvdW50IGZvciBleGFjdGx5IG9uZSBkZXZpY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgY3VycmVudGx5IGRpc2FibGVkLiBCZWZvcmUgZW5hYmxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGNvbXByZXNzZWQgcmVjb3JkIHRpbWVzdGFtcHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2lzX2lucHV0X2RldmljZShtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5EZXZpY2VUeXBlKCkgPT0gbVRpbWVzdGFtcENvcnJlY3RlZERldmljZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTE5MzAsNyArMjAyMSw3IEBACiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cyk7CiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnRfdCBldmVudCwgcGlkX3QgcGlkID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWFkSGFsUGFyYW1ldGVyc19sKCk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKSB7fQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCmluZGV4IDkyZjEyOWMuLjI2NzdhYjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKQEAgLTIzLDcgKzIzLDcgQEAKIGNsYXNzIFRyYWNrQmFzZSA6IHB1YmxpYyBFeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIsIHB1YmxpYyBSZWZCYXNlIHsKIAogcHVibGljOgotICAgIGVudW0gdHJhY2tfc3RhdGUgeworICAgIGVudW0gdHJhY2tfc3RhdGUgOiBpbnQzMl90IHsKICAgICAgICAgSURMRSwKICAgICAgICAgRkxVU0hFRCwgICAgICAgIC8vIGZvciBQbGF5YmFja1RyYWNrcyBvbmx5CiAgICAgICAgIFNUT1BQRUQsCkBAIC0xMDcsNiArMTA3LDggQEAKIAogICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgYXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyOyB9CiAKKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzU3BhdGlhbGl6ZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCiAjaWZkZWYgVEVFX1NJTksKICAgICAgICAgICAgdm9pZCAgICAgICAgIGR1bXBUZWUoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZWUuZHVtcChmZCwgcmVhc29uKTsKQEAgLTI3MSw2ICsyNzMsNyBAQAogCiAgICAgdm9pZCByZWxlYXNlQ2JsaygpIHsKICAgICAgICAgaWYgKG1DYmxrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1TdGF0ZS5jbGVhcigpOwogICAgICAgICAgICAgbUNibGstPn5hdWRpb190cmFja19jYmxrX3QoKTsgICAvLyBkZXN0cm95IG91ciBzaGFyZWQtc3RydWN0dXJlLgogICAgICAgICAgICAgaWYgKG1DbGllbnQgPT0gMCkgewogICAgICAgICAgICAgICAgIGZyZWUobUNibGspOwpAQCAtMzU1LDcgKzM1OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGNlcHQgZm9yIE91dHB1dFRyYWNrIHdoZW4gaXQgaXMgaW4gbG9jYWwgbWVtb3J5CiAgICAgc2l6ZV90ICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsgLy8gc2l6ZSBvZiBtQnVmZmVyIGluIGJ5dGVzCiAgICAgLy8gd2UgZG9uJ3QgcmVhbGx5IG5lZWQgYSBsb2NrIGZvciB0aGVzZQotICAgIHRyYWNrX3N0YXRlICAgICAgICAgbVN0YXRlOworICAgIE1pcnJvcmVkVmFyaWFibGU8dHJhY2tfc3RhdGU+ICBtU3RhdGU7CiAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyOwogICAgIGNvbnN0IHVpbnQzMl90ICAgICAgbVNhbXBsZVJhdGU7ICAgIC8vIGluaXRpYWwgc2FtcGxlIHJhdGUgb25seTsgZm9yIHRyYWNrcyB3aGljaAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBkeW5hbWljIHJhdGVzLCB0aGUgY3VycmVudCB2YWx1ZSBpcyBpbiBjb250cm9sIGJsb2NrCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tNZXRyaWNzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tNZXRyaWNzLmgKaW5kZXggN2ZiNjliZS4uMzBkNjlhYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrTWV0cmljcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja01ldHJpY3MuaApAQCAtMTE2LDYgKzExNiwyMSBAQAogICAgICAgICBtRGV2aWNlU3RhcnR1cE1zLmFkZChzdGFydHVwTXMpOwogICAgIH0KIAorICAgIHZvaWQgdXBkYXRlTWluTWF4Vm9sdW1lKGludDY0X3QgZHVyYXRpb25OcywgZG91YmxlIGRldmljZVZvbHVtZSkgeworICAgICAgICBpZiAoZGV2aWNlVm9sdW1lID4gbU1heFZvbHVtZSkgeworICAgICAgICAgICAgbU1heFZvbHVtZSA9IGRldmljZVZvbHVtZTsKKyAgICAgICAgICAgIG1NYXhWb2x1bWVEdXJhdGlvbk5zID0gZHVyYXRpb25OczsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2VWb2x1bWUgPT0gbU1heFZvbHVtZSkgeworICAgICAgICAgICAgbU1heFZvbHVtZUR1cmF0aW9uTnMgKz0gZHVyYXRpb25OczsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlVm9sdW1lIDwgbU1pblZvbHVtZSkgeworICAgICAgICAgICAgbU1pblZvbHVtZSA9IGRldmljZVZvbHVtZTsKKyAgICAgICAgICAgIG1NaW5Wb2x1bWVEdXJhdGlvbk5zID0gZHVyYXRpb25OczsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2VWb2x1bWUgPT0gbU1pblZvbHVtZSkgeworICAgICAgICAgICAgbU1pblZvbHVtZUR1cmF0aW9uTnMgKz0gZHVyYXRpb25OczsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZHVyaW5nIGFuIGludGVydmFsCiAgICAgdm9pZCBsb2dWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CiAgICAgICAgIGNvbnN0IGludDY0X3QgdGltZU5zID0gc3lzdGVtVGltZSgpOwpAQCAtMTIzLDEwICsxMzgsMTMgQEAKICAgICAgICAgaWYgKG1TdGFydFZvbHVtZVRpbWVOcyA9PSAwKSB7CiAgICAgICAgICAgICBtRGV2aWNlVm9sdW1lID0gbVZvbHVtZSA9IHZvbHVtZTsKICAgICAgICAgICAgIG1MYXN0Vm9sdW1lQ2hhbmdlVGltZU5zID0gbVN0YXJ0Vm9sdW1lVGltZU5zID0gdGltZU5zOworICAgICAgICAgICAgdXBkYXRlTWluTWF4Vm9sdW1lKDAsIG1Wb2x1bWUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIGNvbnN0IGludDY0X3QgZHVyYXRpb25OcyA9IHRpbWVOcyAtIG1MYXN0Vm9sdW1lQ2hhbmdlVGltZU5zOworICAgICAgICB1cGRhdGVNaW5NYXhWb2x1bWUoZHVyYXRpb25OcywgbVZvbHVtZSk7CiAgICAgICAgIG1EZXZpY2VWb2x1bWUgPSAobURldmljZVZvbHVtZSAqIChtTGFzdFZvbHVtZUNoYW5nZVRpbWVOcyAtIG1TdGFydFZvbHVtZVRpbWVOcykgKwotICAgICAgICAgICAgbVZvbHVtZSAqICh0aW1lTnMgLSBtTGFzdFZvbHVtZUNoYW5nZVRpbWVOcykpIC8gKHRpbWVOcyAtIG1TdGFydFZvbHVtZVRpbWVOcyk7CisgICAgICAgICAgICBtVm9sdW1lICogZHVyYXRpb25OcykgLyAodGltZU5zIC0gbVN0YXJ0Vm9sdW1lVGltZU5zKTsKICAgICAgICAgbVZvbHVtZSA9IHZvbHVtZTsKICAgICAgICAgbUxhc3RWb2x1bWVDaGFuZ2VUaW1lTnMgPSB0aW1lTnM7CiAgICAgfQpAQCAtMTU3LDcgKzE3NSwxMSBAQAogICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBldmVudE5hbWUpCiAgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfSU5URVJWQUxDT1VOVCwgKGludDMyX3QpbUludGVydmFsQ291bnQpOwogICAgICAgICAgICAgaWYgKG1Jc091dCkgewotICAgICAgICAgICAgICAgIGl0ZW0uc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VWT0xVTUUsIG1EZXZpY2VWb2x1bWUpOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VWT0xVTUUsIG1EZXZpY2VWb2x1bWUpCisgICAgICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRU1BWFZPTFVNRURVUkFUSU9OTlMsIG1NYXhWb2x1bWVEdXJhdGlvbk5zKQorICAgICAgICAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VNQVhWT0xVTUUsIG1NYXhWb2x1bWUpCisgICAgICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRU1JTlZPTFVNRURVUkFUSU9OTlMsIG1NaW5Wb2x1bWVEdXJhdGlvbk5zKQorICAgICAgICAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VNSU5WT0xVTUUsIG1NaW5Wb2x1bWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1EZXZpY2VMYXRlbmN5TXMuZ2V0TigpID4gMCkgewogICAgICAgICAgICAgICAgIGl0ZW0uc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VMQVRFTkNZTVMsIG1EZXZpY2VMYXRlbmN5TXMuZ2V0TWVhbigpKQpAQCAtMTg1LDYgKzIwNywxMCBAQAogICAgICAgICBtRGV2aWNlVm9sdW1lID0gMC5mOwogICAgICAgICBtU3RhcnRWb2x1bWVUaW1lTnMgPSAwOwogICAgICAgICBtTGFzdFZvbHVtZUNoYW5nZVRpbWVOcyA9IDA7CisgICAgICAgIG1NaW5Wb2x1bWUgPSBBTUVESUFNRVRSSUNTX0lOSVRJQUxfTUlOX1ZPTFVNRTsKKyAgICAgICAgbU1heFZvbHVtZSA9IEFNRURJQU1FVFJJQ1NfSU5JVElBTF9NQVhfVk9MVU1FOworICAgICAgICBtTWluVm9sdW1lRHVyYXRpb25OcyA9IDA7CisgICAgICAgIG1NYXhWb2x1bWVEdXJhdGlvbk5zID0gMDsKIAogICAgICAgICBtRGV2aWNlTGF0ZW5jeU1zLnJlc2V0KCk7CiAgICAgICAgIG1EZXZpY2VTdGFydHVwTXMucmVzZXQoKTsKQEAgLTIxNCw2ICsyNDAsMTIgQEAKICAgICBpbnQ2NF90ICAgICAgICAgICBtU3RhcnRWb2x1bWVUaW1lTnMgR1VBUkRFRF9CWShtTG9jaykgPSAwOwogICAgIGludDY0X3QgICAgICAgICAgIG1MYXN0Vm9sdW1lQ2hhbmdlVGltZU5zIEdVQVJERURfQlkobUxvY2spID0gMDsKIAorICAgIC8vIE1pbi9NYXggdm9sdW1lCisgICAgZG91YmxlICAgICAgICAgICAgbU1pblZvbHVtZSBHVUFSREVEX0JZKG1Mb2NrKSA9IEFNRURJQU1FVFJJQ1NfSU5JVElBTF9NSU5fVk9MVU1FOworICAgIGRvdWJsZSAgICAgICAgICAgIG1NYXhWb2x1bWUgR1VBUkRFRF9CWShtTG9jaykgPSBBTUVESUFNRVRSSUNTX0lOSVRJQUxfTUFYX1ZPTFVNRTsKKyAgICBpbnQ2NF90ICAgICAgICAgICBtTWluVm9sdW1lRHVyYXRpb25OcyBHVUFSREVEX0JZKG1Mb2NrKSA9IDA7CisgICAgaW50NjRfdCAgICAgICAgICAgbU1heFZvbHVtZUR1cmF0aW9uTnMgR1VBUkRFRF9CWShtTG9jaykgPSAwOworCiAgICAgLy8gbGF0ZW5jeSBhbmQgc3RhcnR1cCBmb3IgZWFjaCBpbnRlcnZhbC4KICAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IG1EZXZpY2VMYXRlbmN5TXMgR1VBUkRFRF9CWShtTG9jayk7CiAgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtRGV2aWNlU3RhcnR1cE1zIEdVQVJERURfQlkobUxvY2spOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAppbmRleCBkMmEzMGIxLi42MTM1MDIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcApAQCAtMjM0LDcgKzIzNCwxMSBAQAogI2lmZGVmIFRFRV9TSU5LCiAgICAgICAgIG1UZWUuc2V0KHNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsIGZvcm1hdCwgTkJBSU9fVGVlOjpURUVfRkxBR19UUkFDSyk7CiAjZW5kaWYKLQorICAgICAgICAvLyBtU3RhdGUgaXMgbWlycm9yZWQgZm9yIHRoZSBjbGllbnQgdG8gcmVhZC4KKyAgICAgICAgbVN0YXRlLnNldE1pcnJvcigmbUNibGstPm1TdGF0ZSk7CisgICAgICAgIC8vIGVuc3VyZSBvdXIgc3RhdGUgbWF0Y2hlcyB1cCB1bnRpbCB3ZSBjb25zb2xpZGF0ZSB0aGUgZW51bWVyYXRpb24uCisgICAgICAgIHN0YXRpY19hc3NlcnQoQ0JMS19TVEFURV9JRExFID09IElETEUpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KENCTEtfU1RBVEVfUEFVU0lORyA9PSBQQVVTSU5HKTsKICAgICB9CiB9CiAKQEAgLTYyOSw3ICs2MzMsOCBAQAogICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlLAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudFRvQmVSZWFkeSwKLSAgICAgICAgICAgIGZsb2F0IHNwZWVkKQorICAgICAgICAgICAgZmxvYXQgc3BlZWQsCisgICAgICAgICAgICBib29sIGlzU3BhdGlhbGl6ZWQpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgYXR0ciwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFVzaW5nIHVuc2VjdXJlUG9pbnRlcigpIGhhcyBzb21lIGFzc29jaWF0ZWQgc2VjdXJpdHkgcGl0ZmFsbHMKICAgICAgICAgICAgICAgICAgIC8vICAgICAgIChzZWUgZGVjbGFyYXRpb24gZm9yIGRldGFpbHMpLgpAQCAtNjYzLDcgKzY2OCw4IEBACiAgICAgbVJlc3VtZVRvU3RvcHBpbmcoZmFsc2UpLAogICAgIG1GbHVzaEh3UGVuZGluZyhmYWxzZSksCiAgICAgbUZsYWdzKGZsYWdzKSwKLSAgICBtU3BlZWQoc3BlZWQpCisgICAgbVNwZWVkKHNwZWVkKSwKKyAgICBtSXNTcGF0aWFsaXplZChpc1NwYXRpYWxpemVkKQogewogICAgIC8vIGNsaWVudCA9PSAwIGltcGxpZXMgc2hhcmVkQnVmZmVyID09IDAKICAgICBBTE9HX0FTU0VSVCghKGNsaWVudCA9PSAwICYmIHNoYXJlZEJ1ZmZlciAhPSAwKSk7CkBAIC03MDksOCArNzE1LDcgQEAKICAgICAgICAgdGhyZWFkLT5tRmFzdFRyYWNrQXZhaWxNYXNrICY9IH4oMSA8PCBpKTsKICAgICB9CiAKLSAgICBtU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCA9IHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok1JWEVSCi0gICAgICAgICAgICB8fCB0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpEVVBMSUNBVElORzsKKyAgICBtU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCA9IGNoZWNrU2VydmVyTGF0ZW5jeVN1cHBvcnRlZChmb3JtYXQsIGZsYWdzKTsKICNpZmRlZiBURUVfU0lOSwogICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1UaHJlYWRJb0hhbmRsZSkKICAgICAgICAgICAgICsgIl8iICsgc3RkOjp0b19zdHJpbmcobUlkKSArICJfVCIpOwpAQCAtOTMzLDcgKzkzOCw3IEBACiAgICAgYnVmZmVyLT5yYXcgPSBidWYubVJhdzsKICAgICBpZiAoYnVmLm1GcmFtZUNvdW50ID09IDAgJiYgIWlzU3RvcHBpbmcoKSAmJiAhaXNTdG9wcGVkKCkgJiYgIWlzUGF1c2VkKCkgJiYgIWlzT2ZmbG9hZGVkKCkpIHsKICAgICAgICAgQUxPR1YoIiVzKCVkKTogdW5kZXJydW4sICBmcmFtZXNSZWFkeSglenUpIDwgZnJhbWVzRGVzaXJlZCglemQpLCBzdGF0ZTogJWQiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIGJ1Zi5tRnJhbWVDb3VudCwgZGVzaXJlZEZyYW1lcywgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBidWYubUZyYW1lQ291bnQsIGRlc2lyZWRGcmFtZXMsIChpbnQpbVN0YXRlKTsKICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhkZXNpcmVkRnJhbWVzKTsKICAgICB9IGVsc2UgewogICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKDApOwpAQCAtMTQwMSw2ICsxNDA2LDYwIEBACiAgICAgICAgICAgICAuY29udGVudF90eXBlID0gbUF0dHIuY29udGVudF90eXBlLAogICAgICAgICAgICAgLmdhaW4gPSBtRmluYWxWb2x1bWUsCiAgICAgfTsKKworICAgIC8vIFdoZW4gYXR0cmlidXRlcyBhcmUgdW5kZWZpbmVkLCBkZXJpdmUgZGVmYXVsdCB2YWx1ZXMgZnJvbSBzdHJlYW0gdHlwZS4KKyAgICAvLyBTZWUgQXVkaW9BdHRyaWJ1dGVzLmphdmEsIHVzYWdlRm9yU3RyZWFtVHlwZSgpIGFuZCBCdWlsZGVyLnNldEludGVybmFsTGVnYWN5U3RyZWFtVHlwZSgpCisgICAgaWYgKG1BdHRyLnVzYWdlID09IEFVRElPX1VTQUdFX1VOS05PV04pIHsKKyAgICAgICAgc3dpdGNoIChtU3RyZWFtVHlwZSkgeworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOgorICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS51c2FnZSA9IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT047CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgorICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS51c2FnZSA9IEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOworICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORTsKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UudXNhZ2UgPSBBVURJT19VU0FHRV9NRURJQTsKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgorICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS51c2FnZSA9IEFVRElPX1VTQUdFX0FMQVJNOworICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjoKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UudXNhZ2UgPSBBVURJT19VU0FHRV9OT1RJRklDQVRJT047CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UudXNhZ2UgPSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc7CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWToKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UudXNhZ2UgPSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk7CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQVNTSVNUQU5UOgorICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS51c2FnZSA9IEFVRElPX1VTQUdFX0FTU0lTVEFOVDsKKyAgICAgICAgICAgIG1ldGFkYXRhLmJhc2UuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9SRVJPVVRJTkc6CisgICAgICAgICAgICBtZXRhZGF0YS5iYXNlLnVzYWdlID0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0U7CisgICAgICAgICAgICAvLyB1bmtub3duIGNvbnRlbnQgdHlwZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0NBTExfQVNTSVNUQU5UOgorICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS51c2FnZSA9IEFVRElPX1VTQUdFX0NBTExfQVNTSVNUQU5UOworICAgICAgICAgICAgbWV0YWRhdGEuYmFzZS5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwogICAgIG1ldGFkYXRhLmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzaywKICAgICBzdHJuY3B5KG1ldGFkYXRhLnRhZ3MsIG1BdHRyLnRhZ3MsIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSk7CiAgICAgKmJhY2tJbnNlcnRlcisrID0gbWV0YWRhdGE7CkBAIC0xNTkwLDcgKzE2NDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVN0YXRlID09IFNUT1BQRUQpKSkpIHsKICAgICAgICAgQUxPR1coIiVzKCVkKTogaW4gaW52YWxpZCBzdGF0ZSAlZCBvbiBzZXNzaW9uICVkICVzIG1vZGUsIGZyYW1lc1JlYWR5ICV6dSIsCiAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCi0gICAgICAgICAgICAgIG1TdGF0ZSwgbVNlc3Npb25JZCwgKG1TaGFyZWRCdWZmZXIgIT0gMCkgPyAic3RhdGljIiA6ICJzdHJlYW0iLCBmcmFtZXNSZWFkeSgpKTsKKyAgICAgICAgICAgICAgKGludCltU3RhdGUsIG1TZXNzaW9uSWQsIChtU2hhcmVkQnVmZmVyICE9IDApID8gInN0YXRpYyIgOiAic3RyZWFtIiwgZnJhbWVzUmVhZHkoKSk7CiAgICAgICAgIGV2ZW50LT5jYW5jZWwoKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTI1NzgsNiArMjYzNyw4IEBACiAgICAgLy8gQUxPR0QoIkZyYW1lVGltZTogJWxsZCAlbGxkIiwgKGxvbmcgbG9uZylmdC5mcmFtZXMsIChsb25nIGxvbmcpZnQudGltZU5zKTsKICAgICBtS2VybmVsRnJhbWVUaW1lLnN0b3JlKGZ0KTsKICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgLy8gU3RyZWFtIGlzIGRpcmVjdCwgcmV0dXJuIHByb3ZpZGVkIHRpbWVzdGFtcCB3aXRoIG5vIGNvbnZlcnNpb24KKyAgICAgICAgbVNlcnZlclByb3h5LT5zZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKaW5kZXggMmU0OWU3MS4uNDk2NTkxYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9QT0xJQ1lfSU5URVJGQUNFX0gKIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbnRhaW5lcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgpAQCAtMzEsMzAgKzMyLDQyIEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gVGhlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGFuZCBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSBjbGFzc2VzIGRlZmluZSB0aGUgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2VzCi0vLyBiZXR3ZWVuIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBhdWRpbyBwb2xpY3kgbWFuYWdlciBhbmQgQW5kcm9pZCBnZW5lcmljIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgotLy8gVGhlIHBsYXRmb3JtIHNwZWNpZmljIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIG11c3QgaW1wbGVtZW50IG1ldGhvZHMgb2YgdGhlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGNsYXNzLgorLy8gVGhlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGFuZCBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSBjbGFzc2VzIGRlZmluZSB0aGUgY29tbXVuaWNhdGlvbgorLy8gaW50ZXJmYWNlcyBiZXR3ZWVuIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBhdWRpbyBwb2xpY3kgbWFuYWdlciBhbmQgQW5kcm9pZCBnZW5lcmljIGF1ZGlvIHBvbGljeQorLy8gbWFuYWdlci4KKy8vIFRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBhdWRpbyBwb2xpY3kgbWFuYWdlciBtdXN0IGltcGxlbWVudCBtZXRob2RzIG9mIHRoZSBBdWRpb1BvbGljeUludGVyZmFjZQorLy8gY2xhc3MuCiAvLyBUaGlzIGltcGxlbWVudGF0aW9uIG1ha2VzIHVzZSBvZiB0aGUgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgdG8gY29udHJvbCB0aGUgYWN0aXZpdHkgYW5kCiAvLyBjb25maWd1cmF0aW9uIG9mIGF1ZGlvIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4KIC8vCiAvLyBUaGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIgaXMgaW4gY2hhcmdlIG9mIHRoZSBhdWRpbyByb3V0aW5nIGFuZCB2b2x1bWUgY29udHJvbAogLy8gcG9saWNpZXMgZm9yIGEgZ2l2ZW4gcGxhdGZvcm0uCiAvLyBUaGUgbWFpbiByb2xlcyBvZiB0aGlzIG1vZHVsZSBhcmU6Ci0vLyAgIC0ga2VlcCB0cmFjayBvZiBjdXJyZW50IHN5c3RlbSBzdGF0ZSAocmVtb3ZhYmxlIGRldmljZSBjb25uZWN0aW9ucywgcGhvbmUgc3RhdGUsIHVzZXIgcmVxdWVzdHMuLi4pLgotLy8gICBTeXN0ZW0gc3RhdGUgY2hhbmdlcyBhbmQgdXNlciBhY3Rpb25zIGFyZSBub3RpZmllZCB0byBhdWRpbyBwb2xpY3kgbWFuYWdlciB3aXRoIG1ldGhvZHMgb2YgdGhlIEF1ZGlvUG9saWN5SW50ZXJmYWNlLgorLy8gICAtIGtlZXAgdHJhY2sgb2YgY3VycmVudCBzeXN0ZW0gc3RhdGUgKHJlbW92YWJsZSBkZXZpY2UgY29ubmVjdGlvbnMsIHBob25lIHN0YXRlLAorLy8gICB1c2VyIHJlcXVlc3RzLi4uKS4KKy8vICAgU3lzdGVtIHN0YXRlIGNoYW5nZXMgYW5kIHVzZXIgYWN0aW9ucyBhcmUgbm90aWZpZWQgdG8gYXVkaW8gcG9saWN5IG1hbmFnZXIgd2l0aCBtZXRob2RzIG9mIHRoZQorLy8gICBBdWRpb1BvbGljeUludGVyZmFjZS4KIC8vICAgLSBwcm9jZXNzIGdldE91dHB1dCgpIHF1ZXJpZXMgcmVjZWl2ZWQgd2hlbiBBdWRpb1RyYWNrIG9iamVjdHMgYXJlIGNyZWF0ZWQ6IFRob3NlIHF1ZXJpZXMKLS8vICAgcmV0dXJuIGEgaGFuZGxlciBvbiBhbiBvdXRwdXQgdGhhdCBoYXMgYmVlbiBzZWxlY3RlZCwgY29uZmlndXJlZCBhbmQgb3BlbmVkIGJ5IHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBhbmQgdGhhdAotLy8gICBtdXN0IGJlIHVzZWQgYnkgdGhlIEF1ZGlvVHJhY2sgd2hlbiByZWdpc3RlcmluZyB0byB0aGUgQXVkaW9GbGluZ2VyIHdpdGggdGhlIGNyZWF0ZVRyYWNrKCkgbWV0aG9kLgotLy8gICBXaGVuIHRoZSBBdWRpb1RyYWNrIG9iamVjdCBpcyByZWxlYXNlZCwgYSBwdXRPdXRwdXQoKSBxdWVyeSBpcyByZWNlaXZlZCBhbmQgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGNhbiBkZWNpZGUKLS8vICAgdG8gY2xvc2Ugb3IgcmVjb25maWd1cmUgdGhlIG91dHB1dCBkZXBlbmRpbmcgb24gb3RoZXIgc3RyZWFtcyB1c2luZyB0aGlzIG91dHB1dCBhbmQgY3VycmVudCBzeXN0ZW0gc3RhdGUuCi0vLyAgIC0gc2ltaWxhcmx5IHByb2Nlc3MgZ2V0SW5wdXQoKSBhbmQgcHV0SW5wdXQoKSBxdWVyaWVzIHJlY2VpdmVkIGZyb20gQXVkaW9SZWNvcmQgb2JqZWN0cyBhbmQgY29uZmlndXJlIGF1ZGlvIGlucHV0cy4KLS8vICAgLSBwcm9jZXNzIHZvbHVtZSBjb250cm9sIHJlcXVlc3RzOiB0aGUgc3RyZWFtIHZvbHVtZSBpcyBjb252ZXJ0ZWQgZnJvbSBhbiBpbmRleCB2YWx1ZSAocmVjZWl2ZWQgZnJvbSBVSSkgdG8gYSBmbG9hdCB2YWx1ZQotLy8gICBhcHBsaWNhYmxlIHRvIGVhY2ggb3V0cHV0IGFzIGEgZnVuY3Rpb24gb2YgcGxhdGZvcm0gc3BlY2lmaWMgc2V0dGluZ3MgYW5kIGN1cnJlbnQgb3V0cHV0IHJvdXRlIChkZXN0aW5hdGlvbiBkZXZpY2UpLiBJdAotLy8gICBhbHNvIG1ha2Ugc3VyZSB0aGF0IHN0cmVhbXMgYXJlIG5vdCBtdXRlZCBpZiBub3QgYWxsb3dlZCAoZS5nLiBjYW1lcmEgc2h1dHRlciBzb3VuZCBpbiBzb21lIGNvdW50cmllcykuCisvLyAgIHJldHVybiBhIGhhbmRsZXIgb24gYW4gb3V0cHV0IHRoYXQgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbmZpZ3VyZWQgYW5kIG9wZW5lZCBieSB0aGUgYXVkaW8KKy8vICAgcG9saWN5IG1hbmFnZXIgYW5kIHRoYXQgbXVzdCBiZSB1c2VkIGJ5IHRoZSBBdWRpb1RyYWNrIHdoZW4gcmVnaXN0ZXJpbmcgdG8gdGhlIEF1ZGlvRmxpbmdlcgorLy8gICB3aXRoIHRoZSBjcmVhdGVUcmFjaygpIG1ldGhvZC4KKy8vICAgV2hlbiB0aGUgQXVkaW9UcmFjayBvYmplY3QgaXMgcmVsZWFzZWQsIGEgcHV0T3V0cHV0KCkgcXVlcnkgaXMgcmVjZWl2ZWQgYW5kIHRoZSBhdWRpbyBwb2xpY3kKKy8vICAgbWFuYWdlciBjYW4gZGVjaWRlIHRvIGNsb3NlIG9yIHJlY29uZmlndXJlIHRoZSBvdXRwdXQgZGVwZW5kaW5nIG9uIG90aGVyIHN0cmVhbXMgdXNpbmcgdGhpcworLy8gICBvdXRwdXQgYW5kIGN1cnJlbnQgc3lzdGVtIHN0YXRlLgorLy8gICAtIHNpbWlsYXJseSBwcm9jZXNzIGdldElucHV0KCkgYW5kIHB1dElucHV0KCkgcXVlcmllcyByZWNlaXZlZCBmcm9tIEF1ZGlvUmVjb3JkIG9iamVjdHMgYW5kCisvLyAgIGNvbmZpZ3VyZSBhdWRpbyBpbnB1dHMuCisvLyAgIC0gcHJvY2VzcyB2b2x1bWUgY29udHJvbCByZXF1ZXN0czogdGhlIHN0cmVhbSB2b2x1bWUgaXMgY29udmVydGVkIGZyb20gYW4gaW5kZXggdmFsdWUKKy8vICAgKHJlY2VpdmVkIGZyb20gVUkpIHRvIGEgZmxvYXQgdmFsdWUgYXBwbGljYWJsZSB0byBlYWNoIG91dHB1dCBhcyBhIGZ1bmN0aW9uIG9mIHBsYXRmb3JtCisvLyAgIHNwZWNpZmljc2V0dGluZ3MgYW5kIGN1cnJlbnQgb3V0cHV0IHJvdXRlIChkZXN0aW5hdGlvbiBkZXZpY2UpLiBJdCBhbHNvIG1ha2Ugc3VyZSB0aGF0IHN0cmVhbXMKKy8vICAgYXJlIG5vdCBtdXRlZCBpZiBub3QgYWxsb3dlZCAoZS5nLiBjYW1lcmEgc2h1dHRlciBzb3VuZCBpbiBzb21lIGNvdW50cmllcykuCiAvLwotLy8gVGhlIHBsYXRmb3JtIHNwZWNpZmljIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGlzIHByb3ZpZGVkIGFzIGEgc2hhcmVkIGxpYnJhcnkgYnkgcGxhdGZvcm0gdmVuZG9ycyAoYXMgZm9yIGxpYmF1ZGlvLnNvKQotLy8gYW5kIGlzIGxpbmtlZCB3aXRoIGxpYmF1ZGlvZmxpbmdlci5zbwotCisvLyBUaGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIgaXMgcHJvdmlkZWQgYXMgYSBzaGFyZWQgbGlicmFyeSBieSBwbGF0Zm9ybSB2ZW5kb3JzCisvLyAoYXMgZm9yIGxpYmF1ZGlvLnNvKSBhbmQgaXMgbGlua2VkIHdpdGggbGliYXVkaW9mbGluZ2VyLnNvCisvLworLy8gTk9URTogYnkgY29udmVudGlvbiwgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBdWRpb1BvbGljeUludGVyZmFjZSBpbiBBdWRpb1BvbGljeU1hbmFnZXIgZG9lcworLy8gbm90IGhhdmUgdG8gcGVyZm9ybSBhbnkgbnVsbHB0ciBjaGVjayBvbiBpbnB1dCBhcmd1bWVudHM6IFRoZSBjYWxsZXIgb2YgdGhpcyBBUEkgaXMKKy8vIEF1ZGlvUG9saWN5U2VydmljZSBydW5uaW5nIGluIHRoZSBzYW1lIHByb2Nlc3MgYW5kIGluIGNoYXJnZSBvZiB2YWxpZGF0aW5nIGFyZ3VtZW50cyByZWNlaXZlZAorLy8gZnJvbSBpbmNvbWluZyBiaW5kZXIgY2FsbHMgYmVmb3JlIGNhbGxpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyLgogCiAvLyAgICBBdWRpbyBQb2xpY3kgTWFuYWdlciBJbnRlcmZhY2UKIGNsYXNzIEF1ZGlvUG9saWN5SW50ZXJmYWNlCkBAIC05MiwxNCArMTA1LDEyIEBACiAgICAgdmlydHVhbCB2b2lkIG9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCkgPSAwOwogCiAgICAgLy8gaW5kaWNhdGUgYSBjaGFuZ2UgaW4gZGV2aWNlIGNvbm5lY3Rpb24gc3RhdHVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnQmIHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgPSAwOwogICAgIC8vIHJldHJpZXZlIGEgZGV2aWNlIGNvbm5lY3Rpb24gc3RhdHVzCiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKSA9IDA7CiAgICAgLy8gaW5kaWNhdGUgYSBjaGFuZ2UgaW4gZGV2aWNlIGNvbmZpZ3VyYXRpb24KICAgICB2aXJ0dWFsIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLApAQCAtMTMyLDEwICsxNDMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3R5cGVfdCAqb3V0cHV0VHlwZSkgPSAwOwotICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgb3V0cHV0IHN0YXJ0cyBiZWluZyB1c2VkIGJ5IGNvcnJlc3BvbmRpbmcgc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlX3QgKm91dHB1dFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTcGF0aWFsaXplZCkgPSAwOworICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgb3V0cHV0IHN0YXJ0cyBiZWluZyB1c2VkIGJ5IGNvcnJlc3BvbmRpbmcKKyAgICAvLyBzdHJlYW0uCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwotICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgb3V0cHV0IHN0b3BzIGJlaW5nIHVzZWQgYnkgY29ycmVzcG9uZGluZyBzdHJlYW0uCisgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RvcHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nCisgICAgLy8gc3RyZWFtLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIC8vIHJlbGVhc2VzIHRoZSBvdXRwdXQsIHJldHVybiB0cnVlIGlmIHRoZSBvdXRwdXQgZGVzY3JpcHRvciBpcyByZW9wZW5lZC4KICAgICB2aXJ0dWFsIGJvb2wgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwpAQCAtMTk3LDEyICsyMTEsMTAgQEAKICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQogICAgIHZpcnR1YWwgcHJvZHVjdF9zdHJhdGVneV90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CiAKLSAgICAvLyByZXR1cm4gdGhlIGVuYWJsZWQgb3V0cHV0IGRldmljZXMgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZQotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLQogICAgIC8vIHJldHJpZXZlcyB0aGUgbGlzdCBvZiBlbmFibGVkIG91dHB1dCBkZXZpY2VzIGZvciB0aGUgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAqZGV2aWNlcykgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yVm9sdW1lKSA9IDA7CiAKICAgICAvLyBBdWRpbyBlZmZlY3QgbWFuYWdlbWVudAogICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpID0gMDsKQEAgLTI4NSw4ICsyOTcsMTAgQEAKIAogICAgIHZpcnR1YWwgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgICAgIGlzVWx0cmFzb3VuZFN1cHBvcnRlZCgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKAorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkICAgICBzZXRBcHBTdGF0ZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgYXBwX3N0YXRlX3Qgc3RhdGUpID0gMDsKIApAQCAtMzMzLDggKzM0Nyw2NyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSA9IDA7Ci19OwogCisgICAgLyoqCisgICAgICogUXVlcmllcyBpZiBzb21lIGtpbmQgb2Ygc3BhdGlhbGl6YXRpb24gd2lsbCBiZSBwZXJmb3JtZWQgaWYgdGhlIGF1ZGlvIHBsYXliYWNrIGNvbnRleHQKKyAgICAgKiBkZXNjcmliZWQgYnkgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBpcyBwcmVzZW50LgorICAgICAqIFRoZSBjb250ZXh0IGlzIG1hZGUgb2Y6CisgICAgICogLSBUaGUgYXVkaW8gYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBwbGF5YmFjayB1c2UgY2FzZS4KKyAgICAgKiAtIFRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGRlc2NyaWJpbmcgdGhlIGF1ZGlvIGZvcm1hdCwgY2hhbm5lbHMsIHNhbXBsaW5nIHJhdGUgLi4uCisgICAgICogLSBUaGUgZGV2aWNlcyBkZXNjcmliaW5nIHRoZSBzaW5rIGF1ZGlvIGRldmljZSBzZWxlY3RlZCBmb3IgcGxheWJhY2suCisgICAgICogQWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwgYW5kIG9ubHkgdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYXJlIHVzZWQgdG8gbWF0Y2ggYWdhaW5zdAorICAgICAqIHN1cHBvcnRlZCBjcml0ZXJpYS4gRm9yIGluc3RhbmNlLCBzdXBwbHlpbmcgbm8gYXJndW1lbnQgd2lsbCB0ZWxsIGlmIHNwYXRpYWxpemF0aW9uIGlzCisgICAgICogc3VwcG9ydGVkIG9yIG5vdCBpbiBnZW5lcmFsLgorICAgICAqIEBwYXJhbSBhdHRyIGF1ZGlvIGF0dHJpYnV0ZXMgZGVzY3JpYmluZyB0aGUgcGxheWJhY2sgdXNlIGNhc2UKKyAgICAgKiBAcGFyYW0gY29uZmlnIGF1ZGlvIGNvbmZpZ3VyYXRpb24gZGVzY3JpYmluZyB0aGUgYXVkaW8gZm9ybWF0LCBjaGFubmVscywgc2FtcGxpbmcgcmF0ZS4uLgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHRoZSBzaW5rIGF1ZGlvIGRldmljZSBzZWxlY3RlZCBmb3IgcGxheWJhY2sKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3BhdGlhbGl6YXRpb24gaXMgZW5hYmxlZCBmb3IgdGhpcyBjb250ZXh0LAorICAgICAqICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICAgdmlydHVhbCBib29sIGNhbkJlU3BhdGlhbGl6ZWQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogT3BlbnMgYSBzcGVjaWFsaXplZCBzcGF0aWFsaXplciBvdXRwdXQgaWYgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybS4KKyAgICAgKiBJZiBzZXZlcmFsIHNwYXRpYWxpemVyIG91dHB1dCBwcm9maWxlcyBleGlzdCwgdGhlIG9uZSBzdXBwb3J0aW5nIHRoZSBzaW5rIGRldmljZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3ZpZGVkIGF1ZGlvIGF0dHJpYnV0ZXMgd2lsbCBiZSBzZWxlY3RlZC4KKyAgICAgKiBPbmx5IG9uZSBzcGF0aWFsaXplciBvdXRwdXQgc3RyZWFtIGNhbiBiZSBvcGVuZWQgYXQgYSB0aW1lIGFuZCBhbiBlcnJvciBpcyByZXR1cm5lZAorICAgICAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKyAgICAgKiBAcGFyYW0gY29uZmlnIGF1ZGlvIGZvcm1hdCwgY2hhbm5lbCBtYXNrIGFuZCBzYW1wbGluZyByYXRlIHRvIGJlIHVzZWQgYXMgdGhlIG1peGVyCisgICAgICogICAgICAgIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzcGF0aWFsaXplciBtaXhlciBjcmVhdGVkLgorICAgICAqIEBwYXJhbSBhdHRyIGF1ZGlvIGF0dHJpYnV0ZXMgZGVzY3JpYmluZyB0aGUgcGxheWJhY2sgdXNlIGNhc2UgdGhhdCB3aWxsIGRyaXZlIHRoZQorICAgICAqICAgICAgICBzaW5rIGRldmljZSBzZWxlY3Rpb24KKyAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBJTyBoYW5kbGUgb2YgdGhlIG91dHB1dCBvcGVuZWQKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGFuIG91dHB1dCB3YXMgb3BlbmVkLCBJTlZBTElEX09QRVJBVElPTiBvciBCQURfVkFMVUUgb3RoZXJ3aXNlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTcGF0aWFsaXplck91dHB1dChjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCkgPSAwOworCisgICAgLyoqCisgICAgICogQ2xvc2VzIGEgcHJldmlvdXNseSBvcGVuZWQgc3BlY2lhbGl6ZWQgc3BhdGlhbGl6ZXIgb3V0cHV0LgorICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIElPIGhhbmRsZSBvZiB0aGUgb3V0cHV0IHRvIGNsb3NlLgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgYW4gb3V0cHV0IHdhcyBjbG9zZWQsIElOVkFMSURfT1BFUkFUSU9OIG9yIEJBRF9WQUxVRSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTcGF0aWFsaXplck91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKKworICAgIC8qKgorICAgICAqIFF1ZXJ5IGhvdyB0aGUgZGlyZWN0IHBsYXliYWNrIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb24gdGhlIGRldmljZS4KKyAgICAgKiBAcGFyYW0gYXR0ciBhdWRpbyBhdHRyaWJ1dGVzIGRlc2NyaWJpbmcgdGhlIHBsYXliYWNrIHVzZSBjYXNlCisgICAgICogQHBhcmFtIGNvbmZpZyBhdWRpbyBjb25maWd1cmF0aW9uIGZvciB0aGUgcGxheWJhY2sKKyAgICAgKiBAcGFyYW0gZGlyZWN0TW9kZSBvdXQ6IGEgc2V0IG9mIGZsYWdzIGRlc2NyaWJpbmcgaG93IHRoZSBkaXJlY3QgcGxheWJhY2sgaXMgY3VycmVudGx5CisgICAgICogICAgICAgIHN1cHBvcnRlZCBvbiB0aGUgZGV2aWNlCisgICAgICogQHJldHVybiBOT19FUlJPUiBpbiBjYXNlIG9mIHN1Y2Nlc3MsIERFQURfT0JKRUNULCBOT19JTklULCBCQURfVkFMVUUsIFBFUk1JU1NJT05fREVOSUVECisgICAgICogICAgICAgICBpbiBjYXNlIG9mIGVycm9yLgorICAgICAqLworICAgIHZpcnR1YWwgYXVkaW9fZGlyZWN0X21vZGVfdCBnZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZykgPSAwOworCisgICAgLy8gcmV0cmlldmVzIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBkaXJlY3QgYXVkaW8gcHJvZmlsZXMgZm9yIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciYgYXVkaW9Qcm9maWxlcykgPSAwOworfTsKIAogLy8gQXVkaW8gUG9saWN5IGNsaWVudCBJbnRlcmZhY2UKIGNsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlCkBAIC0zNTMsMjMgKzQyNiwyOSBAQAogICAgIC8vIEF1ZGlvIG91dHB1dCBDb250cm9sIGZ1bmN0aW9ucwogICAgIC8vCiAKLSAgICAvLyBvcGVucyBhbiBhdWRpbyBvdXRwdXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMuIFRoZSBwYXJhbWV0ZXIgdmFsdWVzIGNhbiBpbmRpY2F0ZSB0byB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzCi0gICAgLy8gaW4gY2FzZSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgaGFzIG5vIHNwZWNpZmljIHJlcXVpcmVtZW50cyBmb3IgdGhlIG91dHB1dCBiZWluZyBvcGVuZWQuCi0gICAgLy8gV2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucywgdGhlIHBhcmFtZXRlciB2YWx1ZXMgcmVmbGVjdCB0aGUgYWN0dWFsIHZhbHVlcyB1c2VkIGJ5IHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLgotICAgIC8vIFRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBjYW4gY2hlY2sgaWYgdGhlIHByb3Bvc2VkIHBhcmFtZXRlcnMgYXJlIHN1aXRhYmxlIG9yIG5vdCBhbmQgYWN0IGFjY29yZGluZ2x5LgorICAgIC8vIG9wZW5zIGFuIGF1ZGlvIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycy4gVGhlIHBhcmFtZXRlciB2YWx1ZXMgY2FuIGluZGljYXRlIHRvCisgICAgLy8gdXNlIHRoZSBkZWZhdWx0IHZhbHVlcyBpbiBjYXNlIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBoYXMgbm8gc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGZvciB0aGUKKyAgICAvLyBvdXRwdXQgYmVpbmcgb3BlbmVkLgorICAgIC8vIFdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMsIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIHJlZmxlY3QgdGhlIGFjdHVhbCB2YWx1ZXMgdXNlZCBieSB0aGUgYXVkaW8KKyAgICAvLyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLgorICAgIC8vIFRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBjYW4gY2hlY2sgaWYgdGhlIHByb3Bvc2VkIHBhcmFtZXRlcnMgYXJlIHN1aXRhYmxlIG9yIG5vdCBhbmQgYWN0CisgICAgLy8gYWNjb3JkaW5nbHkuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpoYWxDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKm1peGVyQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpID0gMDsKLSAgICAvLyBjcmVhdGVzIGEgc3BlY2lhbCBvdXRwdXQgdGhhdCBpcyBkdXBsaWNhdGVkIHRvIHRoZSB0d28gb3V0cHV0cyBwYXNzZWQgYXMgYXJndW1lbnRzLiBUaGUgZHVwbGljYXRpb24gaXMgcGVyZm9ybWVkIGJ5Ci0gICAgLy8gYSBzcGVjaWFsIG1peGVyIHRocmVhZCBpbiB0aGUgQXVkaW9GbGluZ2VyLgotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKSA9IDA7CisgICAgLy8gY3JlYXRlcyBhIHNwZWNpYWwgb3V0cHV0IHRoYXQgaXMgZHVwbGljYXRlZCB0byB0aGUgdHdvIG91dHB1dHMgcGFzc2VkIGFzIGFyZ3VtZW50cy4KKyAgICAvLyBUaGUgZHVwbGljYXRpb24gaXMgcGVyZm9ybWVkIGJ5IGEgc3BlY2lhbCBtaXhlciB0aHJlYWQgaW4gdGhlIEF1ZGlvRmxpbmdlci4KKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikgPSAwOwogICAgIC8vIGNsb3NlcyB0aGUgb3V0cHV0IHN0cmVhbQogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7Ci0gICAgLy8gc3VzcGVuZHMgdGhlIG91dHB1dC4gV2hlbiBhbiBvdXRwdXQgaXMgc3VzcGVuZGVkLCB0aGUgY29ycmVzcG9uZGluZyBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtIGlzIHBsYWNlZCBpbgotICAgIC8vIHN0YW5kYnkgYW5kIHRoZSBBdWRpb1RyYWNrcyBhdHRhY2hlZCB0byB0aGUgbWl4ZXIgdGhyZWFkIGFyZSBzdGlsbCBwcm9jZXNzZWQgYnV0IHRoZSBvdXRwdXQgbWl4IGlzIGRpc2NhcmRlZC4KKyAgICAvLyBzdXNwZW5kcyB0aGUgb3V0cHV0LiBXaGVuIGFuIG91dHB1dCBpcyBzdXNwZW5kZWQsIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvIGhhcmR3YXJlIG91dHB1dAorICAgIC8vIHN0cmVhbSBpcyBwbGFjZWQgaW4gc3RhbmRieSBhbmQgdGhlIEF1ZGlvVHJhY2tzIGF0dGFjaGVkIHRvIHRoZSBtaXhlciB0aHJlYWQgYXJlIHN0aWxsCisgICAgLy8gcHJvY2Vzc2VkIGJ1dCB0aGUgb3V0cHV0IG1peCBpcyBkaXNjYXJkZWQuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOwogICAgIC8vIHJlc3RvcmVzIGEgc3VzcGVuZGVkIG91dHB1dC4KICAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CkBAIC0zOTIsMTYgKzQ3MSwyMSBAQAogICAgIC8vIG1pc2MgY29udHJvbCBmdW5jdGlvbnMKICAgICAvLwogCi0gICAgLy8gc2V0IGEgc3RyZWFtIHZvbHVtZSBmb3IgYSBwYXJ0aWN1bGFyIG91dHB1dC4gRm9yIHRoZSBzYW1lIHVzZXIgc2V0dGluZywgYSBnaXZlbiBzdHJlYW0gdHlwZSBjYW4gaGF2ZSBkaWZmZXJlbnQgdm9sdW1lcworICAgIC8vIHNldCBhIHN0cmVhbSB2b2x1bWUgZm9yIGEgcGFydGljdWxhciBvdXRwdXQuIEZvciB0aGUgc2FtZSB1c2VyIHNldHRpbmcsIGEgZ2l2ZW4gc3RyZWFtIHR5cGUKKyAgICAvLyBjYW4gaGF2ZSBkaWZmZXJlbnQgdm9sdW1lcwogICAgIC8vIGZvciBlYWNoIG91dHB1dCAoZGVzdGluYXRpb24gZGV2aWNlKSBpdCBpcyBhdHRhY2hlZCB0by4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdm9sdW1lLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zID0gMCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBpbnQgZGVsYXlNcyA9IDApID0gMDsKIAogICAgIC8vIGludmFsaWRhdGUgYSBzdHJlYW0gdHlwZSwgY2F1c2luZyBhIHJlcm91dGUgdG8gYW4gdW5zcGVjaWZpZWQgbmV3IG91dHB1dAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwogCi0gICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gc2VuZCBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0byBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UuCi0gICAgdmlydHVhbCB2b2lkIHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsIGludCBkZWxheU1zID0gMCkgPSAwOwotICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHJlY2VpdmUgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgorICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHNlbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gcG9saWN5IG1hbmFnZXIgdG8KKyAgICAvLyBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UuCisgICAgdmlydHVhbCB2b2lkIHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwKSA9IDA7CisgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gcmVjZWl2ZSBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UKKyAgICAvLyB0byBhdWRpbyBwb2xpY3kgbWFuYWdlci4KICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykgPSAwOwogCiAgICAgLy8gc2V0IGRvd24gbGluayBhdWRpbyB2b2x1bWUuCkBAIC00NDksNiArNTMzLDEwIEBACiAKICAgICB2aXJ0dWFsIHZvaWQgb25Sb3V0aW5nVXBkYXRlZCgpID0gMDsKIAorICAgIC8vIFVzZWQgdG8gbm90aWZ5IEF1ZGlvU2VydmljZSB0aGF0IGFuIGVycm9yIHdhcyBlbmNvdW50ZXJpbmcgd2hlbiByZWFkaW5nCisgICAgLy8gdGhlIHZvbHVtZSByYW5nZXMsIGFuZCB0aGF0IHRoZXkgc2hvdWxkIGJlIHJlLWluaXRpYWxpemVkCisgICAgdmlydHVhbCB2b2lkIG9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpID0gMDsKKwogICAgIC8vIFVzZWQgdG8gbm90aWZ5IHRoZSBzb3VuZCB0cmlnZ2VyIG1vZHVsZSB0aGF0IGFuIGF1ZGlvIGNhcHR1cmUgaXMgYWJvdXQgdG8KICAgICAvLyB0YWtlIHBsYWNlLiBUaGlzIHNob3VsZCB0eXBpY2FsbHkgcmVzdWx0IGluIGFueSBhY3RpdmUgcmVjb2duaXRpb24KICAgICAvLyBzZXNzaW9ucyB0byBiZSBwcmVlbXB0ZWQgb24gbW9kdWxlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHNvdW5kIHRyaWdnZXIKQEAgLTQ1OSwxMiArNTQ3LDE1IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVNlY29uZGFyeU91dHB1dHMoCiAgICAgICAgICAgICBjb25zdCBUcmFja1NlY29uZGFyeU91dHB1dHNNYXAmIHRyYWNrU2Vjb25kYXJ5T3V0cHV0cykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCwgYm9vbCBjb25uZWN0ZWQpID0gMDsKIH07CiAKICAgICAvLyBUaGVzZSBhcmUgdGhlIHNpZ25hdHVyZXMgb2YgY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyL2Rlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIKICAgICAvLyBtZXRob2RzIHJlc3BlY3RpdmVseSwgZXhwZWN0ZWQgYnkgQXVkaW9Qb2xpY3lTZXJ2aWNlLCBuZWVkcyB0byBiZSBleHBvc2VkIGJ5CiAgICAgLy8gbGliYXVkaW9wb2xpY3ltYW5hZ2VyY3VzdG9tLgotICAgIHVzaW5nIENyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlckluc3RhbmNlID0gQXVkaW9Qb2xpY3lJbnRlcmZhY2UqICgqKShBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSopOworICAgIHVzaW5nIENyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlckluc3RhbmNlID0KKyAgICAgICAgICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlKiAoKikoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UqKTsKICAgICB1c2luZyBEZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VySW5zdGFuY2UgPSB2b2lkICgqKShBdWRpb1BvbGljeUludGVyZmFjZSopOwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9URVNUX01BUFBJTkcgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9URVNUX01BUFBJTkcKaW5kZXggZWI2YzE5ZS4uZjEzMGY3YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvVEVTVF9NQVBQSU5HCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L1RFU1RfTUFQUElORwpAQCAtMiw2ICsyLDIzIEBACiAgICJwcmVzdWJtaXQiOiBbCiAgICAgewogICAgICAgICJuYW1lIjogImF1ZGlvcG9saWN5X3Rlc3RzIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiR3RzR21zY29yZUhvc3RUZXN0Q2FzZXMiLAorICAgICAgImtleXdvcmRzIjogWyJwcmltYXJ5LWRldmljZSJdLAorICAgICAgIm9wdGlvbnMiIDogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImNvbS5nb29nbGUuYW5kcm9pZC5ndHMuYXVkaW8uQXVkaW9Ib3N0VGVzdCN0ZXN0VHdvQ2hhbm5lbENhcHR1cmluZyIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzTmF0aXZlTWVkaWFBQXVkaW9UZXN0Q2FzZXMiLAorICAgICAgIm9wdGlvbnMiIDogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubmF0aXZlbWVkaWEuYWF1ZGlvLkFBdWRpb1Rlc3RzI0FBdWRpb0Jhc2ljLioiCisgICAgICAgIH0KKyAgICAgIF0KICAgICB9CiAgIF0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKaW5kZXggNzM2ZjhiMi4uZjA2MzZhMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKQEAgLTEyNyw2ICsxMjcsNyBAQAogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQ6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfQlJPQURDQVNUOgogICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9IRUFEU0VUOwogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQ6CiAgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaAppbmRleCA1NzdmNjQxLi4zZDNlMGNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaApAQCAtMTMzLDYgKzEzMyw3IEBACiAgKiAtIEFVRElPX1NPVVJDRV9GTV9UVU5FUgogICogLSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04KICAqIC0gQVVESU9fU09VUkNFX0hPVFdPUkQKKyAqIC0gQVVESU9fU09VUkNFX1VMVFJBU09VTkQKICAqCiAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IHNvdXJjZSBwcmlvcml0eSBvciAwIGlmIHByaW9yaXR5IGlzIGlycmVsZXZhbnQgZm9yIHRoaXMgc291cmNlLgogICogICAgICBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgc3BlY2lmaWVkIHNvdXJjZSBjYW5ub3Qgc2hhcmUgYSBnaXZlbiBpbnB1dCBzdHJlYW0gKGUuZyByZW1vdGUgc3VibWl4KQpAQCAtMTQyLDIyICsxNDMsMjQgQEAKIHsKICAgICBzd2l0Y2ggKGlucHV0U291cmNlKSB7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIDk7CisgICAgICAgIHJldHVybiAxMDsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6Ci0gICAgICAgIHJldHVybiA4OworICAgICAgICByZXR1cm4gOTsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRToKLSAgICAgICAgcmV0dXJuIDc7CisgICAgICAgIHJldHVybiA4OwogICAgIGNhc2UgQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEOgotICAgICAgICByZXR1cm4gNjsKKyAgICAgICAgcmV0dXJuIDc7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfTUlDOgotICAgICAgICByZXR1cm4gNTsKKyAgICAgICAgcmV0dXJuIDY7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0U6Ci0gICAgICAgIHJldHVybiA0OworICAgICAgICByZXR1cm4gNTsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9GTV9UVU5FUjoKLSAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIHJldHVybiA0OwogICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOgotICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgcmV0dXJuIDM7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfSE9UV09SRDoKKyAgICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVUxUUkFTT1VORDoKICAgICAgICAgcmV0dXJuIDE7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAKaW5kZXggMjI3YzJkOC4uMWYyM2FlMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icApAQCAtMzAsNiArMzAsNyBAQAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJsb2ciLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaAppbmRleCBhNDBmNmFhLi5jMjZlYTEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaApAQCAtNTQsNyArNTQsNyBAQAogICAgIERldmljZVZlY3RvciBzdXBwb3J0ZWREZXZpY2VzKCkgY29uc3QgIHsKICAgICAgICAgcmV0dXJuIG1Qcm9maWxlICE9IG51bGxwdHIgPyBtUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpIDogIERldmljZVZlY3RvcigpOyB9CiAKLSAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyKiBleHRyYUluZm8pIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgYXVkaW9faW9faGFuZGxlX3QgICBtSW9IYW5kbGUgPSBBVURJT19JT19IQU5ETEVfTk9ORTsgLy8gaW5wdXQgaGFuZGxlCiAgICAgd3A8QXVkaW9Qb2xpY3lNaXg+ICBtUG9saWN5TWl4OyAgICAgICAgICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQpAQCAtOTMsOCArOTMsMTAgQEAKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSBvdmVycmlkZTsKICAgICBib29sIGlzTW1hcCgpIG92ZXJyaWRlIHsKLSAgICAgICAgaWYgKGdldFBvbGljeUF1ZGlvUG9ydCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRQb2xpY3lBdWRpb1BvcnQoKS0+aXNNbWFwKCk7CisgICAgICAgIGlmIChjb25zdCBhdXRvIHBvbGljeVBvcnQgPSBnZXRQb2xpY3lBdWRpb1BvcnQoKTsgcG9saWN5UG9ydCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoY29uc3QgYXV0byBwb3J0ID0gcG9saWN5UG9ydC0+YXNBdWRpb1BvcnQoKTsgcG9ydCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvcnQtPmlzTW1hcCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0xNDIsNiArMTQ0LDcgQEAKICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqIGNvbnN0IG1DbGllbnRJbnRlcmZhY2U7CiAgICAgaW50MzJfdCBtR2xvYmFsQWN0aXZlQ291bnQgPSAwOyAgLy8gbm9uLWNsaWVudC1zcGVjaWZpYyBhY3Rpdml0eSByZWYgY291bnQKICAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBtRW5hYmxlZEVmZmVjdHM7CisgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCYgbUZsYWdzID0gQXVkaW9Qb3J0Q29uZmlnOjptRmxhZ3MuaW5wdXQ7CiB9OwogCiBjbGFzcyBBdWRpb0lucHV0Q29sbGVjdGlvbiA6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKaW5kZXggMWY5YjUzNS4uNzVmYTU5NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaApAQCAtMTQ5LDcgKzE0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIHZpcnR1YWwgfkF1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyKiBleHRyYUluZm8gPSBudWxscHRyKSBjb25zdCBvdmVycmlkZTsKICAgICB2b2lkICAgICAgICBsb2coY29uc3QgY2hhciogaW5kZW50KTsKIAogICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIGRldmljZXMoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlczsgfQpAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAgdmlydHVhbCBib29sIGlzRHVwbGljYXRlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCB1aW50MzJfdCBsYXRlbmN5KCkgeyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgYm9vbCBpc0ZpeGVkVm9sdW1lKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKTsKLSAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsIGJvb2wgbXV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLApAQCAtMjcwLDggKzI3MCwxMCBAQAogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdm9pZCBzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIG92ZXJyaWRlOwogICAgIGJvb2wgaXNNbWFwKCkgb3ZlcnJpZGUgewotICAgICAgICBpZiAoZ2V0UG9saWN5QXVkaW9Qb3J0KCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIGdldFBvbGljeUF1ZGlvUG9ydCgpLT5pc01tYXAoKTsKKyAgICAgICAgaWYgKGNvbnN0IGF1dG8gcG9saWN5UG9ydCA9IGdldFBvbGljeUF1ZGlvUG9ydCgpOyBwb2xpY3lQb3J0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmIChjb25zdCBhdXRvIHBvcnQgPSBwb2xpY3lQb3J0LT5hc0F1ZGlvUG9ydCgpOyBwb3J0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9ydC0+aXNNbWFwKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTMwMywxNSArMzA1LDE5IEBACiAgICAgewogICAgICAgICByZXR1cm4gIWRldmljZXMoKS5pc0VtcHR5KCkgPyBkZXZpY2VzKCkuaXRlbUF0KDApLT5oYXNHYWluQ29udHJvbGxlcigpIDogZmFsc2U7CiAgICAgfQorICAgIGJvb2wgaXNSb3V0ZWQoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7IH0KIAogICAgIERldmljZVZlY3RvciBtRGV2aWNlczsgLyoqPCBjdXJyZW50IGRldmljZXMgdGhpcyBvdXRwdXQgaXMgcm91dGVkIHRvICovCiAgICAgd3A8QXVkaW9Qb2xpY3lNaXg+IG1Qb2xpY3lNaXg7ICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQogCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRSZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCiBwcm90ZWN0ZWQ6CiAgICAgY29uc3Qgc3A8UG9saWN5QXVkaW9Qb3J0PiBtUG9saWN5QXVkaW9Qb3J0OwogICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICogY29uc3QgbUNsaWVudEludGVyZmFjZTsKICAgICB1aW50MzJfdCBtR2xvYmFsQWN0aXZlQ291bnQgPSAwOyAgLy8gbm9uLWNsaWVudC1zcGVjaWZpYyBhY3RpdmUgY291bnQKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCYgbUZsYWdzID0gQXVkaW9Qb3J0Q29uZmlnOjptRmxhZ3Mub3V0cHV0OwogCiAgICAgLy8gVGhlIEFjdGl2ZUNsaWVudHMgc2hvd3MgdGhlIGNsaWVudHMgdGhhdCBjb250cmlidXRlIHRvIHRoZSBAVm9sdW1lU291cmNlIGNvdW50cwogICAgIC8vIGFuZCBtYXkgaW5jbHVkZSB1cHN0cmVhbSBjbGllbnRzIGZyb20gYSBkdXBsaWNhdGluZyB0aHJlYWQuCkBAIC0zMzIsNyArMzM4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5Td0F1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICAgICAgICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGNvbnN0IGNoYXIqIGV4dHJhSW5mbyA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIGRldmljZXMoKSBjb25zdDsKICAgICB2b2lkIHNldERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSB7IG1EZXZpY2VzID0gZGV2aWNlczsgfQogICAgIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYyk7CkBAIC0zNTIsNyArMzU4LDIyIEBACiAgICAgICAgICAgICBzZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwKKworICAgIC8qKgorICAgICAqIEBicmllZiBzZXRTd011dGUgZm9yIFN3T3V0cHV0IHJvdXRlZCBvbiBhIGRldmljZSB0aGF0IHN1cHBvcnRzIEh3IEdhaW4sIHRoaXMgZnVuY3Rpb24gYWxsb3dzCisgICAgICogdG8gbXV0ZSB0aGUgdHJhY2tzIGFzc29jaWF0ZWQgdG8gYSBnaXZlbiB2b2x1bWUgc291cmNlIG9ubHkuCisgICAgICogQXMgYW4gb3V0cHV0IG1heSBob3N0IG9uZSBvciBtb3JlIHNvdXJjZShzKSwgYW5kIGFzIEF1ZGlvUG9saWN5TWFuYWdlciBtYXkgZGlzcGF0Y2ggb3Igbm90CisgICAgICogdGhlIHZvbHVtZSBjaGFuZ2UgcmVxdWVzdCBhY2NvcmRpbmcgdG8gdGhlIHByaW9yaXR5IG9mIHRoZSB2b2x1bWUgc291cmNlIHRvIGNvbnRyb2wgdGhlCisgICAgICogdW5pcXVlIGh3IGdhaW4gY29udHJvbGxlciwgYSBzZXBhcmF0ZWQgQVBJIGFsbG93cyB0byBmb3JjZSBhIG11dGUvdW5tdXRlIG9mIGEgdm9sdW1lIHNvdXJjZS4KKyAgICAgKiBAcGFyYW0gbXV0ZWQgdHJ1ZSB0byBtdXRlLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAcGFyYW0gdnMgdm9sdW1lIHNvdXJjZSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHBhcmFtIGRldmljZSBzY29wZWQgZm9yIHRoZSBjaGFuZ2UKKyAgICAgKiBAcGFyYW0gZGVsYXlNcyBwb3RlbnRpYWxseSBhcHBseWVkIHRvIHByZXZlbnQgY3V0IHNvdW5kcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldFN3TXV0ZShib29sIG11dGVkLCBWb2x1bWVTb3VyY2UgdnMsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKTsKKworICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsIGJvb2wgbXV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKQEAgLTM2Miw3ICszODMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpIGNvbnN0OwogCi0gICAgICAgIHN0YXR1c190IG9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgc3RhdHVzX3Qgb3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqaGFsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKm1peGVyQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKQEAgLTQxNCwxNSArNDM2LDIwIEBACiAgICAgICovCiAgICAgRGV2aWNlVmVjdG9yIGZpbHRlclN1cHBvcnRlZERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKIAorICAgIHVpbnQzMl90IGdldFJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXMoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0VHJhY2tzSW52YWxpZGF0ZWRTdGF0dXNCeVN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSk7CisKICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG1Qcm9maWxlOyAgICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KICAgICBhdWRpb19pb19oYW5kbGVfdCBtSW9IYW5kbGU7ICAgICAgICAgICAvLyBvdXRwdXQgaGFuZGxlCiAgICAgdWludDMyX3QgbUxhdGVuY3k7ICAgICAgICAgICAgICAgICAgLy8KLSAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7ICAgLy8KKyAgICB1c2luZyBBdWRpb091dHB1dERlc2NyaXB0b3I6Om1GbGFnczsKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDE7ICAgIC8vIHVzZWQgYnkgZHVwbGljYXRlZCBvdXRwdXRzOiBmaXJzdCBvdXRwdXQKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDI7ICAgIC8vIHVzZWQgYnkgZHVwbGljYXRlZCBvdXRwdXRzOiBzZWNvbmQgb3V0cHV0CiAgICAgdWludDMyX3QgbURpcmVjdE9wZW5Db3VudDsgLy8gbnVtYmVyIG9mIGNsaWVudHMgdXNpbmcgdGhpcyBvdXRwdXQgKGRpcmVjdCBvdXRwdXRzIG9ubHkpCiAgICAgYXVkaW9fc2Vzc2lvbl90IG1EaXJlY3RDbGllbnRTZXNzaW9uOyAvLyBzZXNzaW9uIGlkIG9mIHRoZSBkaXJlY3Qgb3V0cHV0IGNsaWVudAogICAgIGJvb2wgbVBlbmRpbmdSZW9wZW5Ub1F1ZXJ5UHJvZmlsZXMgPSBmYWxzZTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtTWl4ZXJDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKIH07CiAKIC8vIEF1ZGlvIG91dHB1dCBkcml2ZW4gYnkgYW4gaW5wdXQgZGV2aWNlIGRpcmVjdGx5LgpAQCAtNDMzLDkgKzQ2MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAgICAgdmlydHVhbCB+SHdBdWRpb091dHB1dERlc2NyaXB0b3IoKSB7fQogCi0gICAgICAgICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyKiBleHRyYUluZm8pIGNvbnN0IG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwKKyAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLCBib29sIG11dGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKQEAgLTQ5MSw2ICs1MTgsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwLCBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKIAogICAgIC8qKgorICAgICAqIEBicmllZiBpc1N0cmF0ZWd5QWN0aXZlIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gc3RyYXRlZ3kgaXMgYWN0aXZlCisgICAgICogb24gdGhlIGdpdmVuIG91dHB1dAorICAgICAqIEBwYXJhbSBwcyBwcm9kdWN0IHN0cmF0ZWd5IHRvIGJlIGNoZWNrZWQgdXBvbiBhY3Rpdml0eSBzdGF0dXMKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW4gb3V0cHV0IGZvbGxvd2luZyB0aGUgc3RyYXRlZ3kgaXMgYWN0aXZlLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIGlzU3RyYXRlZ3lBY3RpdmUocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdDsKKworICAgIC8qKgogICAgICAqIEBicmllZiBjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2U6IHdoZW4gYSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkLCBhbmQgaWYgdGhpcyBkZXZpY2UgaGFzCiAgICAgICogYmVlbiBjaG9zZW4gYXMgdGhlIHByZWZlcnJlZCBkZXZpY2UgYnkgYW55IGNsaWVudCwgdGhlIHBvbGljeSBtYW5hZ2VyIHNoYWxsCiAgICAgICogcHJldmVudCBmcm9tIHVzaW5nIHRoaXMgZGV2aWNlIGFueSBtb3JlIGJ5IGNsZWFyaW5nIGFsbCB0aGUgc2Vzc2lvbiByb3V0ZXMgaW52b2x2aW5nIHRoaXMKQEAgLTUzNSw2ICs1NzAsMTEgQEAKIAogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBnZXRPdXRwdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCisgICAgLyoqCisgICAgICogcmV0dXJuIHdoZXRoZXIgYW55IG91dHB1dCBpcyBhY3RpdmUgYW5kIHJvdXRlZCB0byBhbnkgb2YgdGhlIHNwZWNpZmllZCBkZXZpY2VzCisgICAgICovCisgICAgYm9vbCBpc0FueURldmljZVR5cGVBY3RpdmUoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpIGNvbnN0OworCiAgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaAppbmRleCBhNWRlNjU1Li45NTViMGNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKQEAgLTQxLDcgKzQxLDcgQEAKIAogICAgIHZvaWQgc2V0VWlkKHVpZF90IHVpZCkgeyBtVWlkID0gdWlkOyB9CiAKLSAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogCiAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG1QYXRjaDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmgKaW5kZXggNzRiMzQwNS4uMDQzMTYxOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oCkBAIC0xNiwxOSArMTYsMjEgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhdWRpb21hbmFnZXIvQXVkaW9NYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8cG9saWN5Lmg+CiAjaW5jbHVkZSA8Vm9sdW1lLmg+CiAjaW5jbHVkZSAiQXVkaW9QYXRjaC5oIgogI2luY2x1ZGUgIkVmZmVjdERlc2NyaXB0b3IuaCIKQEAgLTUyLDkgKzU0LDE1IEBACiAgICAgICAgIG1QcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UoaXNQcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2Upe30KICAgICB+Q2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdG9TaG9ydFN0cmluZygpIGNvbnN0OwotCisgICAgLyoqCisgICAgICogQGJyaWVmIGlzSW50ZXJuYWwKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNsaWVudCBjb3JyZXNwb25kcyB0byBhbiBhdWRpbyBwYXRjaCBjcmVhdGVkIGZyb20gY3JlYXRlQXVkaW9QYXRjaCBBUEkgb3IKKyAgICAgKiBmb3IgY2FsbCBhdWRpbyByb3V0aW5nLCBvciBmYWxzZSBpZiB0aGUgY2xpZW50IGNvcnJlc3BvbmRzIHRvIGFuIEF1ZGlvVHJhY2ssIEF1ZGlvUmVjb3JkIG9yCisgICAgICogSFcgQXVkaW8gU291cmNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBpc0ludGVybmFsKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCgpIGNvbnN0IHsgcmV0dXJuIG1Qb3J0SWQ7IH0KICAgICB1aWRfdCB1aWQoKSBjb25zdCB7IHJldHVybiBtVWlkOyB9CiAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24oKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbklkOyB9OwpAQCAtNjcsOCArNzUsMTYgQEAKICAgICBib29sIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlKCkgY29uc3QgeyByZXR1cm4gbVByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZTsgfQogICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmUoYm9vbCBhY3RpdmUpIHsgbUFjdGl2ZSA9IGFjdGl2ZTsgfQogICAgIGJvb2wgYWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZTsgfQorICAgIC8qKgorICAgICAqIEBicmllZiBoYXNQcmVmZXJyZWREZXZpY2UgTm90ZSB0aGF0IGFzIGludGVybmFsIGNsaWVudHMgdXNlIHByZWZlcnJlZCBkZXZpY2UgZm9yIGNvbnZlbmllbmNlLAorICAgICAqIHdlIGRvIGhpZGUgdGhpcyBpbnRlcm5hbCBiZWhhdmlvciB0byBwcmV2ZW50IGZyb20gcmVncmVzc2lvbiAobGlrZSBpbnZhbGlkYXRpbmcgdHJhY2sgZm9yCisgICAgICogY2xpZW50cyBmb2xsb3dpbmcgc2FtZSBzdHJhdGVnaWVzLi4uKQorICAgICAqIEBwYXJhbSBhY3RpdmVPbmx5CisgICAgICogQHJldHVybgorICAgICAqLwogICAgIGJvb2wgaGFzUHJlZmVycmVkRGV2aWNlKGJvb2wgYWN0aXZlT25seSA9IGZhbHNlKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtUHJlZmVycmVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSAmJiAoIWFjdGl2ZU9ubHkgfHwgbUFjdGl2ZSk7CisgICAgICAgIHJldHVybiAhaXNJbnRlcm5hbCgpICYmCisgICAgICAgICAgICAgICAgbVByZWZlcnJlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUgJiYgKCFhY3RpdmVPbmx5IHx8IG1BY3RpdmUpOwogICAgIH0KIAogcHJpdmF0ZToKQEAgLTEwMCw3ICsxMTYsNyBAQAogICAgIH5UcmFja0NsaWVudERlc2NyaXB0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKICAgICB1c2luZyBDbGllbnREZXNjcmlwdG9yOjpkdW1wOwotICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Qgb3ZlcnJpZGU7CiAgICAgc3RkOjpzdHJpbmcgdG9TaG9ydFN0cmluZygpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KQEAgLTE0MSw2ICsxNTcsMTQgQEAKICAgICB9CiAgICAgdWludDMyX3QgZ2V0QWN0aXZpdHlDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1BY3Rpdml0eUNvdW50OyB9CiAKKyAgICBib29sIGlzSW52YWxpZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jc0ludmFsaWQ7CisgICAgfQorCisgICAgdm9pZCBzZXRJc0ludmFsaWQoKSB7CisgICAgICAgIG1Jc0ludmFsaWQgPSB0cnVlOworICAgIH0KKwogcHJpdmF0ZToKICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07CiAgICAgY29uc3QgcHJvZHVjdF9zdHJhdGVneV90IG1TdHJhdGVneTsKQEAgLTE1Myw2ICsxNzcsNyBAQAogICAgICAqIGludm9sdmVkIGluIGEgZHVwbGljYXRpb24uCiAgICAgICovCiAgICAgdWludDMyX3QgbUFjdGl2aXR5Q291bnQgPSAwOworICAgIGJvb2wgbUlzSW52YWxpZCA9IGZhbHNlOwogfTsKIAogY2xhc3MgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIENsaWVudERlc2NyaXB0b3IKQEAgLTE2OCw3ICsxOTMsNyBAQAogICAgIH5SZWNvcmRDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiAgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKLSAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCgpIGNvbnN0IHsgcmV0dXJuIG1SSUlkOyB9CiAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKCkgY29uc3QgeyByZXR1cm4gbVNvdXJjZTsgfQpAQCAtMjA5LDYgKzIzNCwxMSBAQAogICAgICAgICBtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgbVNpbmtEZXZpY2UgPSBudWxscHRyOwogICAgIH0KKyAgICBib29sIGJlbG9uZ3NUb091dHB1dChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJnN3T3V0cHV0KSBjb25zdCB7CisgICAgICAgIHJldHVybiBzd091dHB1dCAhPSBudWxscHRyICYmIG1Td091dHB1dC5wcm9tb3RlKCkgPT0gc3dPdXRwdXQ7CisgICAgfQorICAgIHZvaWQgc2V0VXNlU3dCcmlkZ2UoKSB7IG1Vc2VTd0JyaWRnZSA9IHRydWU7IH0KKyAgICBib29sIHVzZVN3QnJpZGdlKCkgY29uc3QgeyByZXR1cm4gbVVzZVN3QnJpZGdlOyB9CiAgICAgYm9vbCBpc0Nvbm5lY3RlZCgpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsgfQogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoSGFuZGxlOyB9CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbVNyY0RldmljZTsgfQpAQCAtMjE5LDcgKzI0OSw3IEBACiAgICAgdm9pZCBzZXRId091dHB1dChjb25zdCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGh3T3V0cHV0KTsKIAogICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7Ci0gICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdCBvdmVycmlkZTsKIAogIHByaXZhdGU6CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CkBAIC0yMjcsNiArMjU3LDM1IEBACiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbVNpbmtEZXZpY2U7CiAgICAgd3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Td091dHB1dDsKICAgICB3cDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbUh3T3V0cHV0OworICAgIGJvb2wgbVVzZVN3QnJpZGdlID0gZmFsc2U7Cit9OworCisvKioKKyAqIEBicmllZiBUaGUgSW50ZXJuYWxTb3VyY2VDbGllbnREZXNjcmlwdG9yIGNsYXNzCisgKiBTcGVjaWFsaXplZCBDbGllbnQgRGVzY3JpcHRvciBmb3IgZWl0aGVyIGEgcmF3IHBhdGNoIGNyZWF0ZWQgZnJvbSBAc2VlIGNyZWF0ZUF1ZGlvUGF0Y2ggQVBJCisgKiBvciBmb3IgaW50ZXJuYWwgYXVkaW8gcGF0Y2hlcyBtYW5hZ2VkIGJ5IEFQTSAoZS5nLiBwaG9uZSBjYWxsIHBhdGNoZXMpLgorICogV2hhdGV2ZXIgdGhlIGJyaWRnZSBjcmVhdGVkIChzb2Z0d2FyZSBvciBoYXJkd2FyZSksIHdlIG5lZWQgYSBjbGllbnQgdG8gdHJhY2sgdGhlIGFjdGl2aXR5CisgKiBhbmQgbWFuYWdlIHZvbHVtZXMuCisgKiBUaGUgQXVkaW8gUGF0Y2ggcmVxdWVzdGVkIHNpbmsgaXMgZXhwcmVzc2VkIGFzIGEgcHJlZmVycmVkIGRldmljZSB3aGljaCBhbGxvd3MgdG8gcm91dGUKKyAqIHRoZSBTd091dHB1dC4gVGhlbiBBUE0gd2lsbCBwZXJmb3JtcyBjaGVja3Mgb24gdGhlIFVJRCAoYWdhaW5zdCBVSUQgb2YgQXVkaW9zZXJ2ZXIpIG9mIHRoZQorICogcmVxdWVzdGVyIHRvIHByZXZlbnQgcmVyb3V0aW5nIFN3T3V0cHV0IGludm9sdmVkIGluIHJhdyBwYXRjaGVzLgorICovCitjbGFzcyBJbnRlcm5hbFNvdXJjZUNsaWVudERlc2NyaXB0b3I6IHB1YmxpYyBTb3VyY2VDbGllbnREZXNjcmlwdG9yCit7CitwdWJsaWM6CisgICAgSW50ZXJuYWxTb3VyY2VDbGllbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgJmNvbmZpZywgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIHNyY0RldmljZSwKKyAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgc2lua0RldmljZSwKKyAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSkgOgorICAgICAgICBTb3VyY2VDbGllbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgcG9ydElkLCB1aWQsIGF0dHJpYnV0ZXMsIGNvbmZpZywgc3JjRGV2aWNlLCBBVURJT19TVFJFQU1fUEFUQ0gsIHN0cmF0ZWd5LAorICAgICAgICAgICAgdm9sdW1lU291cmNlKQorICAgIHsKKyAgICAgICAgc2V0UHJlZmVycmVkRGV2aWNlSWQoc2lua0RldmljZS0+Z2V0SWQoKSk7CisgICAgfQorICAgIGJvb2wgaXNJbnRlcm5hbCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgICB+SW50ZXJuYWxTb3VyY2VDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogfTsKIAogY2xhc3MgU291cmNlQ2xpZW50Q29sbGVjdGlvbiA6CkBAIC0yNjksMTAgKzMyOCwxMyBAQAogICAgIHNpemVfdCBnZXRDbGllbnRDb3VudCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1DbGllbnRzLnNpemUoKTsKICAgICB9Ci0gICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCB7CisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyKiBleHRyYUluZm8gPSBudWxscHRyKSBjb25zdCB7CisgICAgICAgICh2b2lkKWV4dHJhSW5mbzsKICAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQ6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKLSAgICAgICAgICAgIGNsaWVudC0+ZHVtcChkc3QsIDIsIGluZGV4KyspOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMgJXp1LiAiLCBzcGFjZXMsICIiLCArK2luZGV4KTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyIsIHByZWZpeC5jX3N0cigpKTsKKyAgICAgICAgICAgIGNsaWVudC0+ZHVtcChkc3QsIHByZWZpeC5zaXplKCkpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaAppbmRleCAyMGI0MDQ0Li40YWRjOTIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKQEAgLTQzLDcgKzQzLDcgQEAKICAgICBEZXZpY2VEZXNjcmlwdG9yKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZVR5cGVBZGRyLCBjb25zdCBzdGQ6OnN0cmluZyAmdGFnTmFtZSA9ICIiLAogICAgICAgICAgICAgY29uc3QgRm9ybWF0VmVjdG9yICZlbmNvZGVkRm9ybWF0cyA9IEZvcm1hdFZlY3Rvcnt9KTsKIAotICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3IoKSB7fQorICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3IoKSA9IGRlZmF1bHQ7CiAKICAgICB2aXJ0dWFsIHZvaWQgYWRkQXVkaW9Qcm9maWxlKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpIHsKICAgICAgICAgYWRkQXVkaW9Qcm9maWxlQW5kU29ydChtUHJvZmlsZXMsIHByb2ZpbGUpOwpAQCAtNTEsOCArNTEsNiBAQAogCiAgICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRUYWdOYW1lKCkgY29uc3QgeyByZXR1cm4gbVRhZ05hbWU7IH0KIAotICAgIGNvbnN0IEZvcm1hdFZlY3RvciYgZW5jb2RlZEZvcm1hdHMoKSBjb25zdCB7IHJldHVybiBtRW5jb2RlZEZvcm1hdHM7IH0KLQogICAgIGF1ZGlvX2Zvcm1hdF90IGdldEVuY29kZWRGb3JtYXQoKSB7IHJldHVybiBtQ3VycmVudEVuY29kZWRGb3JtYXQ7IH0KIAogICAgIHZvaWQgc2V0RW5jb2RlZEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKQEAgLTYzLDggKzYxLDYgQEAKIAogICAgIGJvb2wgaGFzQ3VycmVudEVuY29kZWRGb3JtYXQoKSBjb25zdDsKIAotICAgIGJvb2wgc3VwcG9ydHNGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKLQogICAgIHZvaWQgc2V0RHluYW1pYygpIHsgbUlzRHluYW1pYyA9IHRydWU7IH0KICAgICBib29sIGlzRHluYW1pYygpIGNvbnN0IHsgcmV0dXJuIG1Jc0R5bmFtaWM7IH0KIApAQCAtOTUsNyArOTEsNyBAQAogCiAgICAgdm9pZCBzZXRFbmNhcHN1bGF0aW9uSW5mb0Zyb21IYWwoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAKLSAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTxULCBzdHJ1Y3QgYXVkaW9fcG9ydD46OnZhbHVlCkBAIC0xMDYsNyArMTAyLDYgQEAKICAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBtVGFnTmFtZTsgLy8gVW5pcXVlIGh1bWFuIHJlYWRhYmxlIGlkZW50aWZpZXIgZm9yIGEgZGV2aWNlIHBvcnQgZm91bmQgaW4gY29uZiBmaWxlLgotICAgIEZvcm1hdFZlY3RvciAgICAgICAgbUVuY29kZWRGb3JtYXRzOwogICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgbUN1cnJlbnRFbmNvZGVkRm9ybWF0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgbUlzRHluYW1pYyA9IGZhbHNlOwogICAgIGNvbnN0IHN0ZDo6c3RyaW5nICAgbURlY2xhcmVkQWRkcmVzczsgLy8gT3JpZ2luYWwgZGV2aWNlIGFkZHJlc3MKQEAgLTE2OCw2ICsxNjMsMTAgQEAKICAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21EZXZpY2VUeXBlQWRkclZlYygKICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZVR5cGVBZGRyVmVjdG9yKSBjb25zdDsKIAorICAgIC8vIFJldHVybiB0aGUgZGV2aWNlIHZlY3RvciB0aGF0IGNvbnRhaW5zIGRldmljZSBkZXNjcmlwdG9yIHdob3NlIEF1ZGlvRGV2aWNlVHlwZUFkZHIgYXBwZWFycworICAgIC8vIGluIHRoZSBnaXZlbiBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yCisgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciB0b1R5cGVBZGRyVmVjdG9yKCkgY29uc3Q7CisKICAgICAvLyBJZiB0aGVyZSBhcmUgZGV2aWNlcyB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCB0aGUgZGV2aWNlcyB0byBhZGQgaXMgbm90IGVtcHR5LAogICAgIC8vIHJlbW92ZSBhbGwgdGhlIGRldmljZXMgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBhbmQgYWRkIGFsbCB0aGUgZGV2aWNlcyB0byBhZGQuCiAgICAgdm9pZCByZXBsYWNlRGV2aWNlc0J5VHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZVRvUmVtb3ZlLCBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXNUb0FkZCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCmluZGV4IDliYTc0NWEuLjQzNmZjYzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCkBAIC04MCw2ICs4MCw3IEBACiAKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRSb3V0ZVNpbmtEZXZpY2UoY29uc3Qgc3A8QXVkaW9Sb3V0ZT4gJnJvdXRlKSBjb25zdDsKICAgICBEZXZpY2VWZWN0b3IgZ2V0Um91dGVTb3VyY2VEZXZpY2VzKGNvbnN0IHNwPEF1ZGlvUm91dGU+ICZyb3V0ZSkgY29uc3Q7CisgICAgY29uc3QgQXVkaW9Sb3V0ZVZlY3RvciYgZ2V0Um91dGVzKCkgY29uc3QgeyByZXR1cm4gbVJvdXRlczsgfQogICAgIHZvaWQgc2V0Um91dGVzKGNvbnN0IEF1ZGlvUm91dGVWZWN0b3IgJnJvdXRlcyk7CiAKICAgICBzdGF0dXNfdCBhZGRPdXRwdXRQcm9maWxlKGNvbnN0IHNwPElPUHJvZmlsZT4gJnByb2ZpbGUpOwpAQCAtMTE0LDcgKzExNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFBvbGljeUF1ZGlvUG9ydD4gJmRzdFBvcnQpIGNvbnN0OwogCiAgICAgLy8gVE9ETyByZW1vdmUgZnJvbSBoZXJlIChzcGxpdCBzZXJpYWxpemF0aW9uKQotICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHZvaWQgcmVmcmVzaFN1cHBvcnRlZERldmljZXMoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaAppbmRleCBhNzRjZWZhLi45MGI4MTJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCkBAIC0zNyw5ICszNyw3IEBACiBwdWJsaWM6CiAgICAgSU9Qcm9maWxlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKQogICAgICAgICA6IEF1ZGlvUG9ydChuYW1lLCBBVURJT19QT1JUX1RZUEVfTUlYLCByb2xlKSwKLSAgICAgICAgICBtYXhPcGVuQ291bnQoMSksCiAgICAgICAgICAgY3VyT3BlbkNvdW50KDApLAotICAgICAgICAgIG1heEFjdGl2ZUNvdW50KDEpLAogICAgICAgICAgIGN1ckFjdGl2ZUNvdW50KDApIHt9CiAKICAgICB2aXJ0dWFsIH5JT1Byb2ZpbGUoKSA9IGRlZmF1bHQ7CkBAIC01OSwxMSArNTcsMTIgQEAKICAgICAvLyBPbmNlIGNhcHR1cmUgY2xpZW50cyBhcmUgdHJhY2tlZCBpbmRpdmlkdWFsbHkgYW5kIG5vdCBwZXIgc2Vzc2lvbiB0aGlzIGNhbiBiZSByZW1vdmVkCiAgICAgLy8gTU1BUCBubyBJUlEgaW5wdXQgc3RyZWFtcyBkbyBub3QgaGF2ZSB0aGUgZGVmYXVsdCBsaW1pdGF0aW9uIG9mIG9uZSBhY3RpdmUgY2xpZW50CiAgICAgLy8gbWF4IGFzIHRoZXkgY2FuIGJlIHVzZWQgaW4gc2hhcmVkIG1vZGUgYnkgdGhlIHNhbWUgYXBwbGljYXRpb24uCisgICAgLy8gTk9URTogUGxlYXNlIGNvbnNpZGVyIG1vdmluZyB0byBBdWRpb1BvcnQgd2hlbiBhZGRyZXNzaW5nIHRoZSBGSVhNRQogICAgIC8vIE5PVEU6IHRoaXMgd29ya3MgZm9yIGV4cGxpY2l0IHZhbHVlcyBzZXQgaW4gYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGJlY2F1c2UKICAgICAvLyBmbGFncyBhcmUgcGFyc2VkIGJlZm9yZSBtYXhBY3RpdmVDb3VudCBieSB0aGUgc2VyaWFsaXplci4KICAgICB2b2lkIHNldEZsYWdzKHVpbnQzMl90IGZsYWdzKSBvdmVycmlkZQogICAgIHsKLSAgICAgICAgUG9saWN5QXVkaW9Qb3J0OjpzZXRGbGFncyhmbGFncyk7CisgICAgICAgIEF1ZGlvUG9ydDo6c2V0RmxhZ3MoZmxhZ3MpOwogICAgICAgICBpZiAoZ2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TSU5LICYmIChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCkgewogICAgICAgICAgICAgbWF4QWN0aXZlQ291bnQgPSAwOwogICAgICAgICB9CkBAIC05OCw3ICs5Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4YWN0TWF0Y2hSZXF1aXJlZEZvcklucHV0RmxhZ3MgPSBmYWxzZSkgY29uc3Q7CiAKLSAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKICAgICB2b2lkIGxvZygpOwogCiAgICAgYm9vbCBoYXNTdXBwb3J0ZWREZXZpY2VzKCkgY29uc3QgeyByZXR1cm4gIW1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKTsgfQpAQCAtMTk0LDE2ICsxOTMsOCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLy8gTWF4aW11bSBudW1iZXIgb2YgaW5wdXQgb3Igb3V0cHV0IHN0cmVhbXMgdGhhdCBjYW4gYmUgc2ltdWx0YW5lb3VzbHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUuCi0gICAgLy8gQnkgY29udmVudGlvbiAwIG1lYW5zIG5vIGxpbWl0LiBUbyByZXNwZWN0IGxlZ2FjeSBiZWhhdmlvciwgaW5pdGlhbGl6ZWQgdG8gMSBmb3Igb3V0cHV0Ci0gICAgLy8gcHJvZmlsZXMgYW5kIDAgZm9yIGlucHV0IHByb2ZpbGVzCi0gICAgdWludDMyX3QgICAgIG1heE9wZW5Db3VudDsKICAgICAvLyBOdW1iZXIgb2Ygc3RyZWFtcyBjdXJyZW50bHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUuCiAgICAgdWludDMyX3QgICAgIGN1ck9wZW5Db3VudDsKLSAgICAvLyBNYXhpbXVtIG51bWJlciBvZiBpbnB1dCBvciBvdXRwdXQgc3RyZWFtcyB0aGF0IGNhbiBiZSBzaW11bHRhbmVvdXNseSBhY3RpdmUgZm9yIHRoaXMgcHJvZmlsZS4KLSAgICAvLyBCeSBjb252ZW50aW9uIDAgbWVhbnMgbm8gbGltaXQuIFRvIHJlc3BlY3QgbGVnYWN5IGJlaGF2aW9yLCBpbml0aWFsaXplZCB0byAwIGZvciBvdXRwdXQKLSAgICAvLyBwcm9maWxlcyBhbmQgMSBmb3IgaW5wdXQgcHJvZmlsZXMKLSAgICB1aW50MzJfdCAgICAgbWF4QWN0aXZlQ291bnQ7CiAgICAgLy8gTnVtYmVyIG9mIHN0cmVhbXMgY3VycmVudGx5IGFjdGl2ZSBmb3IgdGhpcyBwcm9maWxlLiBUaGlzIGlzIG5vdCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBjbGllbnRzCiAgICAgLy8gKEF1ZGlvVHJhY2sgb3IgQXVkaW9SZWNvcmQpIGJ1dCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBIQUwgc3RyZWFtcy4KICAgICB1aW50MzJfdCAgICAgY3VyQWN0aXZlQ291bnQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvUG9saWN5QXVkaW9Qb3J0LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvUG9saWN5QXVkaW9Qb3J0LmgKaW5kZXggYWIzM2IzOC4uYWNmNzg3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1BvbGljeUF1ZGlvUG9ydC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Qb2xpY3lBdWRpb1BvcnQuaApAQCAtMzYsNyArMzYsNyBAQAogY2xhc3MgUG9saWN5QXVkaW9Qb3J0IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSwgcHJpdmF0ZSBIYW5kbGVHZW5lcmF0b3I8YXVkaW9fcG9ydF9oYW5kbGVfdD4KIHsKIHB1YmxpYzoKLSAgICBQb2xpY3lBdWRpb1BvcnQoKSA6IG1GbGFncyhBVURJT19PVVRQVVRfRkxBR19OT05FKSB7fQorICAgIFBvbGljeUF1ZGlvUG9ydCgpID0gZGVmYXVsdDsKIAogICAgIHZpcnR1YWwgflBvbGljeUF1ZGlvUG9ydCgpID0gZGVmYXVsdDsKIApAQCAtNDksMTkgKzQ5LDYgQEAKIAogICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBhc0F1ZGlvUG9ydCgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCBzZXRGbGFncyh1aW50MzJfdCBmbGFncykKLSAgICB7Ci0gICAgICAgIC8vZm9yY2UgZGlyZWN0IGZsYWcgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldDogb2ZmbG9hZGluZyBpbXBsaWVzIGEgZGlyZWN0IG91dHB1dCBzdHJlYW0KLSAgICAgICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKLSAgICAgICAgLy8gdGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgc2V0IGFwcHJvcHJpYXRlbHkgaW4gdGhlIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgICAgaWYgKGFzQXVkaW9Qb3J0KCktPmdldFJvbGUoKSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFICYmCi0gICAgICAgICAgICAgICAgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgewotICAgICAgICAgICAgZmxhZ3MgfD0gQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUOwotICAgICAgICB9Ci0gICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgIH0KLSAgICB1aW50MzJfdCBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQotCiAgICAgdmlydHVhbCB2b2lkIGF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSk7CiAgICAgdmlydHVhbCB2b2lkIGRldGFjaCgpOwogICAgIGJvb2wgaXNBdHRhY2hlZCgpIHsgcmV0dXJuIG1Nb2R1bGUgIT0gMDsgfQpAQCAtMTA1LDIyICs5Miw2IEBACiAgICAgY29uc3QgY2hhciAqZ2V0TW9kdWxlTmFtZSgpIGNvbnN0OwogICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtTW9kdWxlOyB9CiAKLSAgICBpbmxpbmUgYm9vbCBpc0RpcmVjdE91dHB1dCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKGFzQXVkaW9Qb3J0KCktPmdldFR5cGUoKSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSAmJgotICAgICAgICAgICAgICAgIChhc0F1ZGlvUG9ydCgpLT5nZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgJiYKLSAgICAgICAgICAgICAgICAobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBpc01tYXAoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIChhc0F1ZGlvUG9ydCgpLT5nZXRUeXBlKCkgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkKLSAgICAgICAgICAgICAgICAmJiAoKChhc0F1ZGlvUG9ydCgpLT5nZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICgobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCkpCi0gICAgICAgICAgICAgICAgICAgIHx8ICgoYXNBdWRpb1BvcnQoKS0+Z2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDApKSk7Ci0gICAgfQotCiAgICAgdm9pZCBhZGRSb3V0ZShjb25zdCBzcDxBdWRpb1JvdXRlPiAmcm91dGUpIHsgbVJvdXRlcy5hZGQocm91dGUpOyB9CiAgICAgY29uc3QgQXVkaW9Sb3V0ZVZlY3RvciAmZ2V0Um91dGVzKCkgY29uc3QgeyByZXR1cm4gbVJvdXRlczsgfQogCkBAIC0xMjksNyArMTAwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDaGFubmVsTWFza1NldCAmY2hhbm5lbE1hc2tzKSBjb25zdDsKICAgICB2b2lkIHBpY2tTYW1wbGluZ1JhdGUodWludDMyX3QgJnJhdGUsIGNvbnN0IFNhbXBsZVJhdGVTZXQgJnNhbXBsaW5nUmF0ZXMpIGNvbnN0OwogCi0gICAgdWludDMyX3QgbUZsYWdzOyAvLyBhdHRyaWJ1dGUgZmxhZ3MgbWFzayAoZS5nIHByaW1hcnkgb3V0cHV0LCBkaXJlY3Qgb3V0cHV0Li4uKS4KICAgICBzcDxId01vZHVsZT4gbU1vZHVsZTsgICAgIC8vIGF1ZGlvIEhXIG1vZHVsZSBleHBvc2luZyB0aGlzIEkvTyBzdHJlYW0KICAgICBBdWRpb1JvdXRlVmVjdG9yIG1Sb3V0ZXM7IC8vIFJvdXRlcyBpbnZvbHZpbmcgdGhpcyBwb3J0CiB9OwpAQCAtMTQxLDI3ICsxMTEsMTggQEAKIAogICAgIHZpcnR1YWwgc3A8UG9saWN5QXVkaW9Qb3J0PiBnZXRQb2xpY3lBdWRpb1BvcnQoKSBjb25zdCA9IDA7CiAKLSAgICBzdGF0dXNfdCB2YWxpZGF0aW9uQmVmb3JlQXBwbHlDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIGNvbnN0OwotCi0gICAgdm9pZCBhcHBseVBvbGljeUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgewotICAgICAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTKSB7Ci0gICAgICAgICAgICBtRmxhZ3MgPSBjb25maWctPmZsYWdzOwotICAgICAgICB9CisgICAgc3RhdHVzX3QgdmFsaWRhdGlvbkJlZm9yZUFwcGx5Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSBjb25zdCB7CisgICAgICAgIHNwPFBvbGljeUF1ZGlvUG9ydD4gcG9saWN5QXVkaW9Qb3J0ID0gZ2V0UG9saWN5QXVkaW9Qb3J0KCk7CisgICAgICAgIHJldHVybiBwb2xpY3lBdWRpb1BvcnQgPyBwb2xpY3lBdWRpb1BvcnQtPmNoZWNrRXhhY3RBdWRpb1Byb2ZpbGUoY29uZmlnKSA6IE5PX0lOSVQ7CiAgICAgfQogCi0gICAgdm9pZCB0b1BvbGljeUF1ZGlvUG9ydENvbmZpZygKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKLQotCi0gICAgdmlydHVhbCBib29sIGhhc1NhbWVId01vZHVsZUFzKGNvbnN0IHNwPFBvbGljeUF1ZGlvUG9ydENvbmZpZz4mIG90aGVyKSBjb25zdCB7CisgICAgYm9vbCBoYXNTYW1lSHdNb2R1bGVBcyhjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnRDb25maWc+JiBvdGhlcikgY29uc3QgewogICAgICAgICByZXR1cm4gKG90aGVyLmdldCgpICE9IG51bGxwdHIpICYmIChvdGhlci0+Z2V0UG9saWN5QXVkaW9Qb3J0KCkuZ2V0KCkgIT0gbnVsbHB0cikgJiYKICAgICAgICAgICAgICAgICAoZ2V0UG9saWN5QXVkaW9Qb3J0KCkuZ2V0KCkgIT0gbnVsbHB0cikgJiYKICAgICAgICAgICAgICAgICAob3RoZXItPmdldFBvbGljeUF1ZGlvUG9ydCgpLT5nZXRNb2R1bGVIYW5kbGUoKSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9saWN5QXVkaW9Qb3J0KCktPmdldE1vZHVsZUhhbmRsZSgpKTsKICAgICB9CiAKLSAgICB1bmlvbiBhdWRpb19pb19mbGFncyBtRmxhZ3MgPSB7IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSB9OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcAppbmRleCBjZDEwMDEwLi41ODA5MzhlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcApAQCAtMTcsNiArMTcsOCBAQAogI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvQ29sbGVjdGlvbnMiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisKICNpbmNsdWRlICJBdWRpb0NvbGxlY3Rpb25zLmgiCiAjaW5jbHVkZSAiQXVkaW9Sb3V0ZS5oIgogI2luY2x1ZGUgIkh3TW9kdWxlLmgiCkBAIC00MCwxMCArNDIsMTEgQEAKICAgICBpZiAoYXVkaW9Sb3V0ZVZlY3Rvci5pc0VtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4lKnNBdWRpbyBSb3V0ZXMgKCV6dSk6XG4iLCBzcGFjZXMsICIiLCBhdWRpb1JvdXRlVmVjdG9yLnNpemUoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gQXVkaW8gUm91dGVzICglenUpOlxuIiwgc3BhY2VzIC0gMiwgIiIsIGF1ZGlvUm91dGVWZWN0b3Iuc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF1ZGlvUm91dGVWZWN0b3Iuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gUm91dGUgJXp1OlxuIiwgc3BhY2VzLCAiIiwgaSArIDEpOwotICAgICAgICBhdWRpb1JvdXRlVmVjdG9yLml0ZW1BdChpKS0+ZHVtcChkc3QsIDQpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBiYXNlOjpTdHJpbmdQcmludGYoIiUqcyAlenUuICIsIHNwYWNlcywgIiIsIGkgKyAxKTsKKyAgICAgICAgZHN0LT5hcHBlbmQocHJlZml4LmNfc3RyKCkpOworICAgICAgICBhdWRpb1JvdXRlVmVjdG9yLml0ZW1BdChpKS0+ZHVtcChkc3QsIHByZWZpeC5zaXplKCkpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCmluZGV4IDcwMTZhMDguLjZmNzFhYzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKQEAgLTE3LDYgKzE3LDggQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb0lucHV0RGVzY3JpcHRvciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKwogI2luY2x1ZGUgPGF1ZGlvbWFuYWdlci9BdWRpb01hbmFnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgogI2luY2x1ZGUgPHBvbGljeS5oPgpAQCAtMzcsNiArMzksNyBAQAogICAgICAgICBpZiAocHJvZmlsZS0+Z2V0R2FpbnMoKS5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICBwcm9maWxlLT5nZXRHYWlucygpWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZtR2Fpbik7CiAgICAgICAgIH0KKyAgICAgICAgbUZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpcHJvZmlsZS0+Z2V0RmxhZ3MoKTsKICAgICB9CiB9CiAKQEAgLTYyLDcgKzY1LDYgQEAKICAgICB0b0F1ZGlvUG9ydENvbmZpZygmbG9jYWxCYWNrdXBDb25maWcpOwogICAgIGlmICgoc3RhdHVzID0gdmFsaWRhdGlvbkJlZm9yZUFwcGx5Q29uZmlnKGNvbmZpZykpID09IE5PX0VSUk9SKSB7CiAgICAgICAgIEF1ZGlvUG9ydENvbmZpZzo6YXBwbHlBdWRpb1BvcnRDb25maWcoY29uZmlnLCBiYWNrdXBDb25maWcpOwotICAgICAgICBhcHBseVBvbGljeUF1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIH0KIAogICAgIGlmIChiYWNrdXBDb25maWcgIT0gTlVMTCkgewpAQCAtNzYsMTQgKzc4LDEyIEBACiB7CiAgICAgQUxPR19BU1NFUlQobVByb2ZpbGUgIT0gMCwKICAgICAgICAgICAgICAgICAidG9BdWRpb1BvcnRDb25maWcoKSBjYWxsZWQgb24gaW5wdXQgd2l0aCBudWxsIHByb2ZpbGUgJWQiLCBtSW9IYW5kbGUpOwotICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURXxBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUfEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX0FMTDsKICAgICBpZiAoc3JjQ29uZmlnICE9IE5VTEwpIHsKICAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBzcmNDb25maWctPmNvbmZpZ19tYXNrOwogICAgIH0KIAogICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwotICAgIHRvUG9saWN5QXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKIAogICAgIGRzdENvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LOwogICAgIGRzdENvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7CkBAIC01MTAsMTcgKzUxMCwyNSBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgY29uc3QgY2hhciogZXh0cmFJbmZvKSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgSUQ6ICVkXG4iLCBnZXRJZCgpKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzICVzXG4iLCBtRGV2aWNlLT50b1N0cmluZyh0cnVlIC8qaW5jbHVkZVNlbnNpdGl2ZUluZm8qLykuY19zdHIoKSk7Ci0gICAgbUVuYWJsZWRFZmZlY3RzLmR1bXAoZHN0LCAxIC8qc3BhY2VzKi8sIGZhbHNlIC8qdmVyYm9zZSovKTsKLSAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvUmVjb3JkIENsaWVudHM6XG4iKTsKLSAgICBDbGllbnRNYXBIYW5kbGVyPFJlY29yZENsaWVudERlc2NyaXB0b3I+OjpkdW1wKGRzdCk7Ci0gICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgc3RkOjpzdHJpbmcgZmxhZ3NMaXRlcmFsID0gdG9TdHJpbmcobUZsYWdzKTsKKyAgICBpZiAoIWZsYWdzTGl0ZXJhbC5lbXB0eSgpKSB7CisgICAgICAgIGZsYWdzTGl0ZXJhbCA9ICIgKCIgKyBmbGFnc0xpdGVyYWwgKyAiKSI7CisgICAgfQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJQb3J0IElEOiAlZDsgMHglMDR4JXMlcyVzXG4iLAorICAgICAgICAgICAgZ2V0SWQoKSwgbUZsYWdzLCBmbGFnc0xpdGVyYWwuY19zdHIoKSwKKyAgICAgICAgICAgIGV4dHJhSW5mbyAhPSBudWxscHRyID8gIjsgIiA6ICIiLCBleHRyYUluZm8gIT0gbnVsbHB0ciA/IGV4dHJhSW5mbyA6ICIiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXM7ICVkOyBDaGFubmVsIG1hc2s6IDB4JXhcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdG9fc3RyaW5nKG1Gb3JtYXQpLCBtU2FtcGxpbmdSYXRlLCBtQ2hhbm5lbE1hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNEZXZpY2VzOiAlc1xuIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgIG1EZXZpY2UtPnRvU3RyaW5nKHRydWUgLyppbmNsdWRlU2Vuc2l0aXZlSW5mbyovKS5jX3N0cigpKTsKKyAgICBtRW5hYmxlZEVmZmVjdHMuZHVtcChkc3QsIHNwYWNlcyAvKnNwYWNlcyovLCBmYWxzZSAvKnZlcmJvc2UqLyk7CisgICAgaWYgKGdldENsaWVudENvdW50KCkgIT0gMCkgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzQXVkaW9SZWNvcmQgQ2xpZW50cyAoJXp1KTpcbiIsIHNwYWNlcywgIiIsIGdldENsaWVudENvdW50KCkpOworICAgICAgICBDbGllbnRNYXBIYW5kbGVyPFJlY29yZENsaWVudERlc2NyaXB0b3I+OjpkdW1wKGRzdCwgc3BhY2VzKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgfQogfQogCiBib29sIEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0CkBAIC02MDgsMTAgKzYxNiwxMiBAQAogCiB2b2lkIEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZCgiXG5JbnB1dHMgZHVtcDpcbiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiBJbnB1dHMgKCV6dSk6XG4iLCBzaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gSW5wdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBiYXNlOjpTdHJpbmdQcmludGYoIiAgJXp1LiAiLCBpICsgMSk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4dHJhSW5mbyA9IGJhc2U6OlN0cmluZ1ByaW50ZigiSS9PIGhhbmRsZTogJWQiLCBrZXlBdChpKSk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyIsIHByZWZpeC5jX3N0cigpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIHByZWZpeC5zaXplKCksIGV4dHJhSW5mby5jX3N0cigpKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCmluZGV4IDZiMDhmN2MuLjhlZWZlNzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcApAQCAtMTcsNiArMTcsOCBAQAogI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvT3V0cHV0RGVzY3JpcHRvciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKwogI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CiAjaW5jbHVkZSAiQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNaXguaCIKQEAgLTE1NSw3ICsxNTcsNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwKK2Jvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsIGJvb2wgLyptdXRlZCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICYvKnN0cmVhbXMqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMsCkBAIC0xODgsNyArMTkwLDYgQEAKICAgICB0b0F1ZGlvUG9ydENvbmZpZygmbG9jYWxCYWNrdXBDb25maWcpOwogICAgIGlmICgoc3RhdHVzID0gdmFsaWRhdGlvbkJlZm9yZUFwcGx5Q29uZmlnKGNvbmZpZykpID09IE5PX0VSUk9SKSB7CiAgICAgICAgIEF1ZGlvUG9ydENvbmZpZzo6YXBwbHlBdWRpb1BvcnRDb25maWcoY29uZmlnLCBiYWNrdXBDb25maWcpOwotICAgICAgICBhcHBseVBvbGljeUF1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIH0KIAogICAgIGlmIChiYWNrdXBDb25maWcgIT0gTlVMTCkgewpAQCAtMjAxLDEzICsyMDIsMTEgQEAKIHZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKIHsKLSAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEV8QVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVHxBVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19BTEw7CiAgICAgaWYgKHNyY0NvbmZpZyAhPSBOVUxMKSB7CiAgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gc3JjQ29uZmlnLT5jb25maWdfbWFzazsKICAgICB9CiAgICAgQXVkaW9Qb3J0Q29uZmlnOjp0b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7Ci0gICAgdG9Qb2xpY3lBdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwogCiAgICAgZHN0Q29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKICAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOwpAQCAtMjQ1LDMyICsyNDQsNDUgQEAKICAgICAgICAgcmV0dXJuIGNsaWVudC0+dm9sdW1lU291cmNlKCkgIT0gdm9sdW1lU291cmNlVG9JZ25vcmU7IH0pICE9IGVuZChtQWN0aXZlQ2xpZW50cyk7CiB9CiAKLXZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgY29uc3QgY2hhciogZXh0cmFJbmZvKSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgSUQ6ICVkXG4iLCBtSWQpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRm9ybWF0OiAlMDh4XG4iLCBtRm9ybWF0KTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRGV2aWNlczogJXNcbiIsIGRldmljZXMoKS50b1N0cmluZyh0cnVlIC8qaW5jbHVkZVNlbnNpdGl2ZUluZm8qLykuY19zdHIoKSk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBHbG9iYWwgYWN0aXZlIGNvdW50OiAldVxuIiwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtUm91dGluZ0FjdGl2aXRpZXMpIHsKLSAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBQcm9kdWN0IFN0cmF0ZWd5IGlkOiAlZCIsIGl0ZXIuZmlyc3QpOwotICAgICAgICBpdGVyLnNlY29uZC5kdW1wKGRzdCwgNCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlBvcnQgSUQ6ICVkJXMlc1xuIiwKKyAgICAgICAgICAgIG1JZCwgZXh0cmFJbmZvICE9IG51bGxwdHIgPyAiOyAiIDogIiIsIGV4dHJhSW5mbyAhPSBudWxscHRyID8gZXh0cmFJbmZvIDogIiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMlczsgJWQ7IENoYW5uZWwgbWFzazogMHgleFxuIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90b19zdHJpbmcobUZvcm1hdCksIG1TYW1wbGluZ1JhdGUsIG1DaGFubmVsTWFzayk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0RldmljZXM6ICVzXG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgZGV2aWNlcygpLnRvU3RyaW5nKHRydWUgLyppbmNsdWRlU2Vuc2l0aXZlSW5mbyovKS5jX3N0cigpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzR2xvYmFsIGFjdGl2ZSBjb3VudDogJXVcbiIsIHNwYWNlcywgIiIsIG1HbG9iYWxBY3RpdmVDb3VudCk7CisgICAgaWYgKCFtUm91dGluZ0FjdGl2aXRpZXMuZW1wdHkoKSkgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBQcm9kdWN0IFN0cmF0ZWdpZXMgKCV6dSk6XG4iLCBzcGFjZXMgLSAyLCAiIiwKKyAgICAgICAgICAgICAgICBtUm91dGluZ0FjdGl2aXRpZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVJvdXRpbmdBY3Rpdml0aWVzKSB7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzaWQgJWQ6ICIsIHNwYWNlcyArIDEsICIiLCBpdGVyLmZpcnN0KTsKKyAgICAgICAgICAgIGl0ZXIuc2Vjb25kLmR1bXAoZHN0LCAwKTsKKyAgICAgICAgfQogICAgIH0KLSAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtVm9sdW1lQWN0aXZpdGllcykgewotICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFZvbHVtZSBBY3Rpdml0aWVzIGlkOiAlZCIsIGl0ZXIuZmlyc3QpOwotICAgICAgICBpdGVyLnNlY29uZC5kdW1wKGRzdCwgNCk7CisgICAgaWYgKCFtVm9sdW1lQWN0aXZpdGllcy5lbXB0eSgpKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFZvbHVtZSBBY3Rpdml0aWVzICglenUpOlxuIiwgc3BhY2VzIC0gMiwgIiIsCisgICAgICAgICAgICAgICAgbVZvbHVtZUFjdGl2aXRpZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUFjdGl2aXRpZXMpIHsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNpZCAlZDogIiwgc3BhY2VzICsgMSwgIiIsIGl0ZXIuZmlyc3QpOworICAgICAgICAgICAgaXRlci5zZWNvbmQuZHVtcChkc3QsIDApOworICAgICAgICB9CiAgICAgfQotICAgIGRzdC0+YXBwZW5kKCIgQXVkaW9UcmFjayBDbGllbnRzOlxuIik7Ci0gICAgQ2xpZW50TWFwSGFuZGxlcjxUcmFja0NsaWVudERlc2NyaXB0b3I+OjpkdW1wKGRzdCk7Ci0gICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgaWYgKGdldENsaWVudENvdW50KCkgIT0gMCkgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBBdWRpb1RyYWNrIGNsaWVudHMgKCV6dSk6XG4iLCBzcGFjZXMgLSAyLCAiIiwgZ2V0Q2xpZW50Q291bnQoKSk7CisgICAgICAgIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QsIHNwYWNlcyk7CisgICAgfQogICAgIGlmICghbUFjdGl2ZUNsaWVudHMuZW1wdHkoKSkgewotICAgICAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvVHJhY2sgYWN0aXZlIChzdHJlYW0pIGNsaWVudHM6XG4iKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gQXVkaW9UcmFjayBhY3RpdmUgKHN0cmVhbSkgY2xpZW50cyAoJXp1KTpcbiIsIHNwYWNlcyAtIDIsICIiLAorICAgICAgICAgICAgICAgIG1BY3RpdmVDbGllbnRzLnNpemUoKSk7CiAgICAgICAgIHNpemVfdCBpbmRleCA9IDA7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogbUFjdGl2ZUNsaWVudHMpIHsKLSAgICAgICAgICAgIGNsaWVudC0+ZHVtcChkc3QsIDIsIGluZGV4KyspOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAiJSpzaWQgJXp1OiAiLCBzcGFjZXMgKyAxLCAiIiwgaW5kZXggKyAxKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyIsIHByZWZpeC5jX3N0cigpKTsKKyAgICAgICAgICAgIGNsaWVudC0+ZHVtcChkc3QsIHByZWZpeC5zaXplKCkpOwogICAgICAgICB9Ci0gICAgICAgIGRzdC0+YXBwZW5kKCIgXG4iKTsKICAgICB9CiB9CiAKQEAgLTI4NSw3ICsyOTcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCiAgICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgY2xpZW50SW50ZXJmYWNlKSwKICAgICBtUHJvZmlsZShwcm9maWxlKSwgbUlvSGFuZGxlKEFVRElPX0lPX0hBTkRMRV9OT05FKSwgbUxhdGVuY3koMCksCi0gICAgbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwKICAgICBtT3V0cHV0MSgwKSwgbU91dHB1dDIoMCksIG1EaXJlY3RPcGVuQ291bnQoMCksCiAgICAgbURpcmVjdENsaWVudFNlc3Npb24oQVVESU9fU0VTU0lPTl9OT05FKQogewpAQCAtMjk0LDExICszMDUsMTggQEAKICAgICB9CiB9CiAKLXZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAordm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGNvbnN0IGNoYXIqIGV4dHJhSW5mbykgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIExhdGVuY3k6ICVkXG4iLCBtTGF0ZW5jeSk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGbGFncyAlMDh4XG4iLCBtRmxhZ3MpOwotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChkc3QpOworICAgIFN0cmluZzggYWxsRXh0cmFJbmZvOworICAgIGlmIChleHRyYUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICBhbGxFeHRyYUluZm8uYXBwZW5kRm9ybWF0KCIlczsgIiwgZXh0cmFJbmZvKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgZmxhZ3NMaXRlcmFsID0gdG9TdHJpbmcobUZsYWdzKTsKKyAgICBhbGxFeHRyYUluZm8uYXBwZW5kRm9ybWF0KCJMYXRlbmN5OiAlZDsgMHglMDR4IiwgbUxhdGVuY3ksIG1GbGFncyk7CisgICAgaWYgKCFmbGFnc0xpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBhbGxFeHRyYUluZm8uYXBwZW5kRm9ybWF0KCIgKCVzKSIsIGZsYWdzTGl0ZXJhbC5jX3N0cigpKTsKKyAgICB9CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGRzdCwgc3BhY2VzLCBhbGxFeHRyYUluZm8uY19zdHIoKSk7CiB9CiAKIERldmljZVZlY3RvciBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlcygpIGNvbnN0CkBAIC00MzUsMTQgKzQ1MywzNiBAQAogICAgICAgICAgICAgbUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCA/IEFVRElPX0xBVEVOQ1lfTE9XIDogQVVESU9fTEFURU5DWV9OT1JNQUw7CiB9CiAKLWJvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFN3TXV0ZSgKKyAgICAgICAgYm9vbCBtdXRlZCwgVm9sdW1lU291cmNlIHZzLCBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1UeXBlcywKKyAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMsIHVpbnQzMl90IGRlbGF5TXMpIHsKKyAgICAvLyB2b2x1bWUgc291cmNlIGFjdGl2ZSBhbmQgbW9yZSB0aGFuIG9uZSB2b2x1bWUgc291cmNlIGlzIGFjdGl2ZSwgb3RoZXJ3aXNlLCBuby1vcCBvciBsZXQKKyAgICAvLyBzZXRWb2x1bWUgY29udHJvbGxpbmcgU1cgYW5kL29yIEhXIEdhaW5zCisgICAgaWYgKCFzdHJlYW1UeXBlcy5lbXB0eSgpICYmIGlzQWN0aXZlKHZzKSAmJiAoZ2V0QWN0aXZlVm9sdW1lU291cmNlcygpLnNpemUoKSA+IDEpKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlUG9ydCA6IGRldmljZXMoKSkgeworICAgICAgICAgICAgaWYgKGlzU2luZ2xlRGV2aWNlVHlwZShkZXZpY2VUeXBlcywgZGV2aWNlUG9ydC0+dHlwZSgpKSAmJgorICAgICAgICAgICAgICAgICAgICBkZXZpY2VQb3J0LT5oYXNHYWluQ29udHJvbGxlcih0cnVlIC8qY2FuVXNlRm9yVm9sdW1lKi8pKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lQW1wbCA9IG11dGVkID8gMC4wZiA6IFZvbHVtZTo6RGJUb0FtcGwoMCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBvdXRwdXQ6ICVkLCB2czogJWQsIG11dGVkOiAlZCwgYWN0aXZlIHZzIGNvdW50OiAlenUiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICBtSW9IYW5kbGUsIHZzLCBtdXRlZCwgZ2V0QWN0aXZlVm9sdW1lU291cmNlcygpLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW0gOiBzdHJlYW1UeXBlcykgeworICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWVBbXBsLCBtSW9IYW5kbGUsIGRlbGF5TXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwgYm9vbCBtdXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2UgdnMsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbVR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKIHsKICAgICBTdHJlYW1UeXBlVmVjdG9yIHN0cmVhbXMgPSBzdHJlYW1UeXBlczsKLSAgICBpZiAoIUF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKHZvbHVtZURiLCB2cywgc3RyZWFtVHlwZXMsIGRldmljZVR5cGVzLCBkZWxheU1zLCBmb3JjZSkpIHsKKyAgICBpZiAoIUF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKAorICAgICAgICAgICAgdm9sdW1lRGIsIG11dGVkLCB2cywgc3RyZWFtVHlwZXMsIGRldmljZVR5cGVzLCBkZWxheU1zLCBmb3JjZSkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoc3RyZWFtcy5lbXB0eSgpKSB7CkBAIC00NTksMTEgKzQ5OSwxNyBAQAogICAgICAgICAgICAgLy8gZGlmZmVyZW50IFZvbHVtZSBTb3VyY2UgKG9yIGlmIHdlIGFsbG93IHNldmVyYWwgY3VydmVzIHdpdGhpbiBzYW1lIHZvbHVtZSBncm91cCkKICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAvLyBAdG9kbzogZGVmYXVsdCBzdHJlYW0gdm9sdW1lIHRvIG1heCAoMCkgd2hlbiB1c2luZyBIVyBQb3J0IGdhaW4/Ci0gICAgICAgICAgICBmbG9hdCB2b2x1bWVBbXBsID0gVm9sdW1lOjpEYlRvQW1wbCgwKTsKLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogc3RyZWFtcykgewotICAgICAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZUFtcGwsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgICAgICAgICAvLyBBbGxvd3MgdG8gc2V0IFNXIEdhaW4gb24gQXVkaW9GbGluZ2VyIGlmOgorICAgICAgICAgICAgLy8gICAgLXZvbHVtZSBncm91cCBoYXMgZXhwbGljaXQgc3RyZWFtKHMpIGFzc29jaWF0ZWQKKyAgICAgICAgICAgIC8vICAgIC12b2x1bWUgZ3JvdXAgd2l0aCBubyBleHBsaWNpdCBzdHJlYW0ocykgaXMgdGhlIG9ubHkgYWN0aXZlIHNvdXJjZSBvbiB0aGlzIG91dHB1dAorICAgICAgICAgICAgLy8gQWxsb3dzIHRvIG11dGUgU1cgR2FpbiBvbiBBdWRpb0ZsaW5nZXIgb25seSBmb3Igdm9sdW1lIGdyb3VwIHdpdGggZXhwbGljaXQgc3RyZWFtKHMpCisgICAgICAgICAgICBpZiAoIXN0cmVhbVR5cGVzLmVtcHR5KCkgfHwgKGdldEFjdGl2ZVZvbHVtZVNvdXJjZXMoKS5zaXplKCkgPT0gMSkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBib29sIGNhbk11dGUgPSBtdXRlZCAmJiAodm9sdW1lRGIgIT0gMC4wZikgJiYgIXN0cmVhbVR5cGVzLmVtcHR5KCk7CisgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lQW1wbCA9IGNhbk11dGUgPyAwLjBmIDogVm9sdW1lOjpEYlRvQW1wbCgwKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmVhbSA6IHN0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdm9sdW1lQW1wbCwgbUlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIEF1ZGlvR2FpbnMgZ2FpbnMgPSBkZXZpY2VQb3J0LT5nZXRHYWlucygpOwogICAgICAgICAgICAgaW50IGdhaW5NaW5WYWx1ZUluTWIgPSBnYWluc1swXS0+Z2V0TWluVmFsdWVJbk1iKCk7CiAgICAgICAgICAgICBpbnQgZ2Fpbk1heFZhbHVlSW5NYiA9IGdhaW5zWzBdLT5nZXRNYXhWYWx1ZUluTWIoKTsKQEAgLTQ5MSw3ICs1MzcsOCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0dXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6b3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorc3RhdHVzX3QgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6Om9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmhhbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKm1peGVyQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKQEAgLTUwNCw0MiArNTUxLDU0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCB0aGUgcmVxdWVzdGVkIGRldmljZXMsIGFsbCBkZXZpY2UgdHlwZXM6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkdW1wRGV2aWNlVHlwZXMoZGV2aWNlcy50eXBlcygpKS5jX3N0cigpKTsKIAotICAgIGF1ZGlvX2NvbmZpZ190IGxDb25maWc7Ci0gICAgaWYgKGNvbmZpZyA9PSBudWxscHRyKSB7Ci0gICAgICAgIGxDb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgIGxDb25maWcuc2FtcGxlX3JhdGUgPSBtU2FtcGxpbmdSYXRlOwotICAgICAgICBsQ29uZmlnLmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKLSAgICAgICAgbENvbmZpZy5mb3JtYXQgPSBtRm9ybWF0OworICAgIGF1ZGlvX2NvbmZpZ190IGxIYWxDb25maWc7CisgICAgaWYgKGhhbENvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIGxIYWxDb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgIGxIYWxDb25maWcuc2FtcGxlX3JhdGUgPSBtU2FtcGxpbmdSYXRlOworICAgICAgICBsSGFsQ29uZmlnLmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKKyAgICAgICAgbEhhbENvbmZpZy5mb3JtYXQgPSBtRm9ybWF0OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGxDb25maWcgPSAqY29uZmlnOworICAgICAgICBsSGFsQ29uZmlnID0gKmhhbENvbmZpZzsKICAgICB9CiAKICAgICAvLyBpZiB0aGUgc2VsZWN0ZWQgcHJvZmlsZSBpcyBvZmZsb2FkZWQgYW5kIG5vIG9mZmxvYWQgaW5mbyB3YXMgc3BlY2lmaWVkLAogICAgIC8vIGNyZWF0ZSBhIGRlZmF1bHQgb25lCiAgICAgaWYgKChtUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICYmCi0gICAgICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgIGxIYWxDb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgewogICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKTsKLSAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOwotICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5zYW1wbGVfcmF0ZSA9IGxDb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGxDb25maWcuY2hhbm5lbF9tYXNrOwotICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBsQ29uZmlnLmZvcm1hdDsKLSAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uc3RyZWFtX3R5cGUgPSBzdHJlYW07Ci0gICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLmR1cmF0aW9uX3VzID0gLTE7Ci0gICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLmhhc192aWRlbyA9IHRydWU7IC8vIGNvbnNlcnZhdGl2ZQotICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5pc19zdHJlYW1pbmcgPSB0cnVlOyAvLyBsaWtlbHkKLSAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uZW5jYXBzdWxhdGlvbl9tb2RlID0gbENvbmZpZy5vZmZsb2FkX2luZm8uZW5jYXBzdWxhdGlvbl9tb2RlOwotICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5jb250ZW50X2lkID0gbENvbmZpZy5vZmZsb2FkX2luZm8uY29udGVudF9pZDsKLSAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uc3luY19pZCA9IGxDb25maWcub2ZmbG9hZF9pbmZvLnN5bmNfaWQ7CisgICAgICAgIGxIYWxDb25maWcub2ZmbG9hZF9pbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAgICAgbEhhbENvbmZpZy5vZmZsb2FkX2luZm8uc2FtcGxlX3JhdGUgPSBsSGFsQ29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICBsSGFsQ29uZmlnLm9mZmxvYWRfaW5mby5jaGFubmVsX21hc2sgPSBsSGFsQ29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgbEhhbENvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gbEhhbENvbmZpZy5mb3JtYXQ7CisgICAgICAgIGxIYWxDb25maWcub2ZmbG9hZF9pbmZvLnN0cmVhbV90eXBlID0gc3RyZWFtOworICAgIH0KKworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgbE1peGVyQ29uZmlnOworICAgIGlmIChtaXhlckNvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIGxNaXhlckNvbmZpZyA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgICAgICBsTWl4ZXJDb25maWcuc2FtcGxlX3JhdGUgPSBsSGFsQ29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICBsTWl4ZXJDb25maWcuY2hhbm5lbF9tYXNrID0gbEhhbENvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgIGxNaXhlckNvbmZpZy5mb3JtYXQgPSBsSGFsQ29uZmlnLmZvcm1hdDsKKyAgICB9IGVsc2UgeworICAgICAgICBsTWl4ZXJDb25maWcgPSAqbWl4ZXJDb25maWc7CiAgICAgfQogCiAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShtRmxhZ3MgfCBmbGFncyk7CiAKKyAgICAvLyBJZiBubyBtaXhlciBjb25maWcgaXMgc3BlY2lmaWVkIGZvciBhIHNwYXRpYWxpemVyIG91dHB1dCwgZGVmYXVsdCB0byA1LjEgZm9yIHByb3BlcgorICAgIC8vIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGZpbmFsIGRvd25taXhlciBvciBzcGF0aWFsaXplcgorICAgIGlmICgobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfU1BBVElBTElaRVIpICE9IDAKKyAgICAgICAgICAgICYmIG1peGVyQ29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgbE1peGVyQ29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDE7CisgICAgfQorCiAgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKICAgICAgICAgICBtRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIG1Qcm9maWxlLmdldCgpLCBtUHJvZmlsZS0+Z2V0TmFtZSgpLmNfc3RyKCkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUNsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChtUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsSGFsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxNaXhlckNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGF0ZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyk7CkBAIC01NTAsOSArNjA5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdGVkIGRldmljZSAlcyBmb3Igb3BlbmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAqb3V0cHV0LCBkZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIG1TYW1wbGluZ1JhdGUgPSBsQ29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICBtQ2hhbm5lbE1hc2sgPSBsQ29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgbUZvcm1hdCA9IGxDb25maWcuZm9ybWF0OworICAgICAgICBtU2FtcGxpbmdSYXRlID0gbEhhbENvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgbUNoYW5uZWxNYXNrID0gbEhhbENvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgIG1Gb3JtYXQgPSBsSGFsQ29uZmlnLmZvcm1hdDsKKyAgICAgICAgbU1peGVyQ2hhbm5lbE1hc2sgPSBsTWl4ZXJDb25maWcuY2hhbm5lbF9tYXNrOwogICAgICAgICBtSWQgPSBQb2xpY3lBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOwogICAgICAgICBtSW9IYW5kbGUgPSAqb3V0cHV0OwogICAgICAgICBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50Kys7CkBAIC02NTEsNiArNzExLDIzIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit1aW50MzJfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Z2V0UmVjb21tZW5kZWRNdXRlRHVyYXRpb25NcygpIGNvbnN0Cit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1heChtT3V0cHV0MS0+Z2V0UmVjb21tZW5kZWRNdXRlRHVyYXRpb25NcygpLAorICAgICAgICAgICAgICAgIG1PdXRwdXQyLT5nZXRSZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zKCkpOworICAgIH0KKyAgICByZXR1cm4gbVByb2ZpbGUtPnJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXM7Cit9CisKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFRyYWNrc0ludmFsaWRhdGVkU3RhdHVzQnlTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgaWYgKHN0cmF0ZWd5ID09IGNsaWVudC0+c3RyYXRlZ3koKSkgeworICAgICAgICAgICAgY2xpZW50LT5zZXRJc0ludmFsaWQoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogLy8gSHdBdWRpb091dHB1dERlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24KIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCkBAIC02NTksMTEgKzczNiwxMSBAQAogewogfQogCi12b2lkIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3ZvaWQgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyKiBleHRyYUluZm8pIGNvbnN0CiB7Ci0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGRzdCk7Ci0gICAgZHN0LT5hcHBlbmQoIlNvdXJjZTpcbiIpOwotICAgIG1Tb3VyY2UtPmR1bXAoZHN0LCAwLCAwKTsKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMsIGV4dHJhSW5mbyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1NvdXJjZTpcbiIsIHNwYWNlcywgIiIpOworICAgIG1Tb3VyY2UtPmR1bXAoZHN0LCBzcGFjZXMpOwogfQogCiB2b2lkIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKQEAgLTY3OSwxNCArNzU2LDE0IEBACiB9CiAKIAotYm9vbCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorYm9vbCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLCBib29sIG11dGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQogewogICAgIGJvb2wgY2hhbmdlZCA9IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKAotICAgICAgICAgICAgdm9sdW1lRGIsIHZvbHVtZVNvdXJjZSwgc3RyZWFtcywgZGV2aWNlVHlwZXMsIGRlbGF5TXMsIGZvcmNlKTsKKyAgICAgICAgICAgIHZvbHVtZURiLCBtdXRlZCwgdm9sdW1lU291cmNlLCBzdHJlYW1zLCBkZXZpY2VUeXBlcywgZGVsYXlNcywgZm9yY2UpOwogCiAgICAgaWYgKGNoYW5nZWQpIHsKICAgICAgIC8vIFRPRE86IHVzZSBnYWluIGNvbnRyb2xsZXIgb24gc291cmNlIGRldmljZSBpZiBhbnkgdG8gYWRqdXN0IHZvbHVtZQpAQCAtNzU4LDYgKzgzNSwxNiBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNTdHJhdGVneUFjdGl2ZShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAodmFsdWVBdChpKS0+aXNTdHJhdGVneUFjdGl2ZShwcykpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogYXVkaW9faW9faGFuZGxlX3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmdldEEyZHBPdXRwdXQoKSBjb25zdAogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKQEAgLTgzMywxMyArOTIwLDI1IEBACiAgICAgICAgIH0KICAgICB9CiB9Citib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FueURldmljZVR5cGVBY3RpdmUoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkKKyAgICAgICAgICAgICAgICAmJiBvdXRwdXREZXNjLT5kZXZpY2VzKCkuY29udGFpbnNEZXZpY2VBbW9uZ1R5cGVzKGRldmljZVR5cGVzKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQogCiB2b2lkIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZCgiXG5PdXRwdXRzIGR1bXA6XG4iKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4gT3V0cHV0cyAoJXp1KTpcbiIsIHNpemUoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBiYXNlOjpTdHJpbmdQcmludGYoIiAgJXp1LiAiLCBpICsgMSk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4dHJhSW5mbyA9IGJhc2U6OlN0cmluZ1ByaW50ZigiSS9PIGhhbmRsZTogJWQiLCBrZXlBdChpKSk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyIsIHByZWZpeC5jX3N0cigpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIHByZWZpeC5zaXplKCksIGV4dHJhSW5mby5jX3N0cigpKTsKICAgICB9CiB9CiAKQEAgLTg1OCwxMCArOTU3LDEyIEBACiAKIHZvaWQgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kKCJcbk91dHB1dHMgZHVtcDpcbiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiBPdXRwdXRzICglenUpOlxuIiwgc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IGJhc2U6OlN0cmluZ1ByaW50ZigiICAlenUuICIsIGkgKyAxKTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZXh0cmFJbmZvID0gYmFzZTo6U3RyaW5nUHJpbnRmKCJJL08gaGFuZGxlOiAlZCIsIGtleUF0KGkpKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzIiwgcHJlZml4LmNfc3RyKCkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgcHJlZml4LnNpemUoKSwgZXh0cmFJbmZvLmNfc3RyKCkpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9QYXRjaC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcAppbmRleCBkNzkxMTBhLi40ZjAzZGI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcApAQCAtMjAsNyArMjAsOSBAQAogI2luY2x1ZGUgIkF1ZGlvUGF0Y2guaCIKICNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM3LDIwICszOSwyMSBAQAogewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZyAmY2ZnID0gY2Znc1tpXTsKLSAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyAgWyVzICVkXSAiLCBzcGFjZXMsICIiLCBwcmVmaXgsIGkgKyAxKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1slcyAlZF0gIiwgc3BhY2VzLCAiIiwgcHJlZml4LCBpICsgMSk7CiAgICAgICAgIGlmIChjZmcudHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiRGV2aWNlIElEICVkICVzIiwgY2ZnLmlkLCB0b1N0cmluZyhjZmcuZXh0LmRldmljZS50eXBlKS5jX3N0cigpKTsKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgZGV2aWNlKGNmZy5leHQuZGV2aWNlLnR5cGUsIGNmZy5leHQuZGV2aWNlLmFkZHJlc3MpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIkRldmljZSBQb3J0IElEOiAlZDsgeyVzfSIsCisgICAgICAgICAgICAgICAgICAgIGNmZy5pZCwgZGV2aWNlLnRvU3RyaW5nKHRydWUgLyppbmNsdWRlU2Vuc2l0aXZlSW5mbyovKS5jX3N0cigpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJNaXggSUQgJWQgSS9PIGhhbmRsZSAlZCIsIGNmZy5pZCwgY2ZnLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJNaXggUG9ydCBJRDogJWQ7IEkvTyBoYW5kbGU6ICVkOyIsIGNmZy5pZCwgY2ZnLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgfQogICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9QYXRjaDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3ZvaWQgQXVkaW9QYXRjaDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1BhdGNoICVkOiBvd25lciB1aWQgJTRkLCBoYW5kbGUgJTJkLCBhZiBoYW5kbGUgJTJkXG4iLAotICAgICAgICAgICAgc3BhY2VzLCAiIiwgaW5kZXggKyAxLCBtVWlkLCBtSGFuZGxlLCBtQWZQYXRjaEhhbmRsZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIm93bmVyIHVpZCAlNGQ7IGhhbmRsZSAlMmQ7IGFmIGhhbmRsZSAlMmRcbiIsIG1VaWQsIG1IYW5kbGUsIG1BZlBhdGNoSGFuZGxlKTsKICAgICBkdW1wUGF0Y2hFbmRwb2ludHMoZHN0LCBzcGFjZXMsICJzcmMgIiwgbVBhdGNoLm51bV9zb3VyY2VzLCBtUGF0Y2guc291cmNlcyk7CiAgICAgZHVtcFBhdGNoRW5kcG9pbnRzKGRzdCwgc3BhY2VzLCAic2luayIsIG1QYXRjaC5udW1fc2lua3MsIG1QYXRjaC5zaW5rcyk7CiB9CkBAIC0xMzUsOSArMTM4LDExIEBACiAKIHZvaWQgQXVkaW9QYXRjaENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kKCJcbkF1ZGlvIFBhdGNoZXM6XG4iKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4gQXVkaW8gUGF0Y2hlcyAoJXp1KTpcbiIsIHNpemUoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgMiwgaSk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCA9IGJhc2U6OlN0cmluZ1ByaW50ZigiICAlenUuICIsIGkgKyAxKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzIiwgcHJlZml4LmNfc3RyKCkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgcHJlZml4LnNpemUoKSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKaW5kZXggYjIwOWE4OC4uNTQ2ZjU2YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcApAQCAtNjc1LDcgKzY3NSw3IEBACiAKIHZvaWQgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBQb2xpY3kgTWl4OlxuIik7CisgICAgZHN0LT5hcHBlbmQoIlxuIEF1ZGlvIFBvbGljeSBNaXg6XG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QsIDIsIGkpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUm91dGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAKaW5kZXggODY2NDE3ZS4uNTNjYzQ3MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAKQEAgLTI1LDE1ICsyNSwxNiBAQAogCiB2b2lkIEF1ZGlvUm91dGU6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtVHlwZSA9PSBBVURJT19ST1VURV9NVVggPyAiTXV4IiA6ICJNaXgiKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTaW5rOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVNpbmstPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXM7IFNpbms6IFwiJXNcIlxuIiwKKyAgICAgICAgICAgIG1UeXBlID09IEFVRElPX1JPVVRFX01VWCA/ICJNdXgiIDogIk1peCIsIG1TaW5rLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7CiAgICAgaWYgKG1Tb3VyY2VzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNvdXJjZXM6IFxuIiwgc3BhY2VzLCAiIik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNTb3VyY2VzOiAiLCBzcGFjZXMsICIiKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyVzIFxuIiwgc3BhY2VzICsgNCwgIiIsIG1Tb3VyY2VzW2ldLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXCIlc1wiIiwgbVNvdXJjZXNbaV0tPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGlmIChpICsgMSA8IG1Tb3VyY2VzLnNpemUoKSkgZHN0LT5hcHBlbmQoIiwgIik7CiAgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQotICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogfQogCiBib29sIEF1ZGlvUm91dGU6OnN1cHBvcnRzUGF0Y2goY29uc3Qgc3A8UG9saWN5QXVkaW9Qb3J0PiAmc3JjUG9ydCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NsaWVudERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ2xpZW50RGVzY3JpcHRvci5jcHAKaW5kZXggYWZjNGQwMS4uNzEzYjBhYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ2xpZW50RGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ2xpZW50RGVzY3JpcHRvci5jcHAKQEAgLTE4LDkgKzE4LDEyIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPFR5cGVDb252ZXJ0ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8VHlwZUNvbnZlcnRlci5oPgorCiAjaW5jbHVkZSAiQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgiCiAjaW5jbHVkZSAiQXVkaW9QYXRjaC5oIgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWl4LmgiCkBAIC0zOSwzNSArNDIsMzYgQEAKICAgICByZXR1cm4gc3Muc3RyKCk7CiB9CiAKLXZvaWQgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3ZvaWQgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0NsaWVudCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFBvcnQgSWQ6ICVkIFNlc3Npb24gSWQ6ICVkIFVJRDogJWRcbiIsIHNwYWNlcywgIiIsCi0gICAgICAgICAgICAgbVBvcnRJZCwgbVNlc3Npb25JZCwgbVVpZCk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gRm9ybWF0OiAlMDh4IFNhbXBsaW5nIHJhdGU6ICVkIENoYW5uZWxzOiAlMDh4XG4iLCBzcGFjZXMsICIiLAotICAgICAgICAgICAgIG1Db25maWcuZm9ybWF0LCBtQ29uZmlnLnNhbXBsZV9yYXRlLCBtQ29uZmlnLmNoYW5uZWxfbWFzayk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gQXR0cmlidXRlczogJXNcbiIsIHNwYWNlcywgIiIsIHRvU3RyaW5nKG1BdHRyaWJ1dGVzKS5jX3N0cigpKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBQcmVmZXJyZWQgRGV2aWNlIElkOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtUHJlZmVycmVkRGV2aWNlSWQpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFN0YXRlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbUFjdGl2ZSA/ICJBY3RpdmUiIDogIkluYWN0aXZlIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlBvcnQgSUQ6ICVkOyBTZXNzaW9uIElEOiAlZDsgdWlkICVkOyBTdGF0ZTogJXNcbiIsCisgICAgICAgICAgICBtUG9ydElkLCBtU2Vzc2lvbklkLCBtVWlkLCBtQWN0aXZlID8gIkFjdGl2ZSIgOiAiSW5hY3RpdmUiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXM7ICVkOyBDaGFubmVsIG1hc2s6IDB4JXhcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdG9fc3RyaW5nKG1Db25maWcuZm9ybWF0KSwgbUNvbmZpZy5zYW1wbGVfcmF0ZSwgbUNvbmZpZy5jaGFubmVsX21hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNBdHRyaWJ1dGVzOiAlc1xuIiwgc3BhY2VzLCAiIiwgdG9TdHJpbmcobUF0dHJpYnV0ZXMpLmNfc3RyKCkpOworICAgIGlmIChtUHJlZmVycmVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzUHJlZmVycmVkIERldmljZSBQb3J0IElEOiAlZDtcbiIsIHNwYWNlcywgIiIsIG1QcmVmZXJyZWREZXZpY2VJZCk7CisgICAgfQogfQogCi12b2lkIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3ZvaWQgVHJhY2tDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBDbGllbnREZXNjcmlwdG9yOjpkdW1wKGRzdCwgc3BhY2VzLCBpbmRleCk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU3RyZWFtOiAlZCBmbGFnczogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbVN0cmVhbSwgbUZsYWdzKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBSZWZjb3VudDogJWRcbiIsIHNwYWNlcywgIiIsIG1BY3Rpdml0eUNvdW50KTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBEQVAgUHJpbWFyeSBNaXg6ICVwXG4iLCBzcGFjZXMsICIiLCBtUHJpbWFyeU1peC5wcm9tb3RlKCkuZ2V0KCkpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIERBUCBTZWNvbmRhcnkgT3V0cHV0czpcbiIsIHNwYWNlcywgIiIpOwotICAgIGZvciAoYXV0byBkZXNjIDogbVNlY29uZGFyeU91dHB1dHMpIHsKLSAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyAgLSAlZFxuIiwgc3BhY2VzLCAiIiwKLSAgICAgICAgICAgICAgICBkZXNjLnByb21vdGUoKSA9PSBudWxscHRyID8gMCA6IGRlc2MucHJvbW90ZSgpLT5tSW9IYW5kbGUpOworICAgIENsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNTdHJlYW06ICVkOyBGbGFnczogJTA4eDsgUmVmY291bnQ6ICVkXG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgbVN0cmVhbSwgbUZsYWdzLCBtQWN0aXZpdHlDb3VudCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0RBUCBQcmltYXJ5IE1peDogJXBcbiIsIHNwYWNlcywgIiIsIG1QcmltYXJ5TWl4LnByb21vdGUoKS5nZXQoKSk7CisgICAgaWYgKCFtU2Vjb25kYXJ5T3V0cHV0cy5lbXB0eSgpKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNEQVAgU2Vjb25kYXJ5IE91dHB1dHM6ICIsIHNwYWNlcyAtIDIsICIiKTsKKyAgICAgICAgZm9yIChhdXRvIGRlc2MgOiBtU2Vjb25kYXJ5T3V0cHV0cykgeworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVkLCAiLCBkZXNjLnByb21vdGUoKSA9PSBudWxscHRyID8gMCA6IGRlc2MucHJvbW90ZSgpLT5tSW9IYW5kbGUpOworICAgICAgICB9CisgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogICAgIH0KIH0KIAogc3RkOjpzdHJpbmcgVHJhY2tDbGllbnREZXNjcmlwdG9yOjp0b1Nob3J0U3RyaW5nKCkgY29uc3QKIHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLQogICAgIHNzIDw8IENsaWVudERlc2NyaXB0b3I6OnRvU2hvcnRTdHJpbmcoKSA8PCAiIFN0cmVhbTogIiA8PCBtU3RyZWFtOwogICAgIHJldHVybiBzcy5zdHIoKTsKIH0KQEAgLTgxLDEwICs4NSwxMSBAQAogICAgIH0KIH0KIAotdm9pZCBSZWNvcmRDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBSZWNvcmRDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBDbGllbnREZXNjcmlwdG9yOjpkdW1wKGRzdCwgc3BhY2VzLCBpbmRleCk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU291cmNlOiAlZCBmbGFnczogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbVNvdXJjZSwgbUZsYWdzKTsKKyAgICBDbGllbnREZXNjcmlwdG9yOjpkdW1wKGRzdCwgc3BhY2VzKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzU291cmNlOiAlZDsgRmxhZ3M6ICUwOHg7IGlzIHNvdW5kdHJpZ2dlcjogJWRcbiIsCisgICAgICAgICAgICBzcGFjZXMsICIiLCBtU291cmNlLCBtRmxhZ3MsIG1Jc1NvdW5kVHJpZ2dlcik7CiAgICAgbUVuYWJsZWRFZmZlY3RzLmR1bXAoZHN0LCBzcGFjZXMgKyAyIC8qc3BhY2VzKi8sIGZhbHNlIC8qdmVyYm9zZSovKTsKIH0KIApAQCAtOTUsNyArMTAwLDggQEAKICAgICBUcmFja0NsaWVudERlc2NyaXB0b3I6OlRyYWNrQ2xpZW50RGVzY3JpcHRvcihwb3J0SWQsIHVpZCwgQVVESU9fU0VTU0lPTl9OT05FLCBhdHRyaWJ1dGVzLAogICAgICAgICB7Y29uZmlnLnNhbXBsZV9yYXRlLCBjb25maWcuY2hhbm5lbF9tYXNrLCBjb25maWcuZm9ybWF0fSwgQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwKICAgICAgICAgc3RyZWFtLCBzdHJhdGVneSwgdm9sdW1lU291cmNlLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCBmYWxzZSwKLSAgICAgICAge30gLyogU291cmNlcyBkbyBub3Qgc3VwcG9ydCBzZWNvbmRhcnkgb3V0cHV0cyovLCBudWxscHRyKSwgbVNyY0RldmljZShzcmNEZXZpY2UpCisgICAgICAgIHt9IC8qIFNvdXJjZXMgZG8gbm90IHN1cHBvcnQgc2Vjb25kYXJ5IG91dHB1dHMqLywgbnVsbHB0ciksCisgICAgbVNyY0RldmljZShzcmNEZXZpY2UpCiB7CiB9CiAKQEAgLTEwOSwxOCArMTE1LDIxIEBACiAgICAgbUh3T3V0cHV0ID0gaHdPdXRwdXQ7CiB9CiAKLXZvaWQgU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3ZvaWQgU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgVHJhY2tDbGllbnREZXNjcmlwdG9yOjpkdW1wKGRzdCwgc3BhY2VzLCBpbmRleCk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gRGV2aWNlOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgbVNyY0RldmljZS0+ZHVtcChkc3QsIDIsIDApOworICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcyk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnNEZXZpY2U6ICIsIHNwYWNlcywgIiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyIsIHByZWZpeC5jX3N0cigpKTsKKyAgICBtU3JjRGV2aWNlLT5kdW1wKGRzdCwgcHJlZml4LnNpemUoKSk7CiB9CiAKIHZvaWQgU291cmNlQ2xpZW50Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgZHN0LT5hcHBlbmQoIlxuQXVkaW8gc291cmNlczpcbiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiBBdWRpbyBzb3VyY2VzICglenUpOlxuIiwgc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCAyLCBpKTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIgICV6dS4gIiwgaSArIDEpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXMiLCBwcmVmaXguY19zdHIoKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCBwcmVmaXguc2l6ZSgpKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKaW5kZXggYTkyZDMxZS4uYTkwOTMzMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKQEAgLTE5LDEwICsxOSwxMSBAQAogCiAjaW5jbHVkZSA8c2V0PgogCi0jaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KICNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogI2luY2x1ZGUgIkh3TW9kdWxlLmgiCkBAIC01NCwxOSArNTUsMTAgQEAKIERldmljZURlc2NyaXB0b3I6OkRldmljZURlc2NyaXB0b3IoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlVHlwZUFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0YWdOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzKSA6Ci0gICAgICAgIERldmljZURlc2NyaXB0b3JCYXNlKGRldmljZVR5cGVBZGRyKSwgbVRhZ05hbWUodGFnTmFtZSksIG1FbmNvZGVkRm9ybWF0cyhlbmNvZGVkRm9ybWF0cyksCisgICAgICAgIERldmljZURlc2NyaXB0b3JCYXNlKGRldmljZVR5cGVBZGRyLCBlbmNvZGVkRm9ybWF0cyksIG1UYWdOYW1lKHRhZ05hbWUpLAogICAgICAgICBtRGVjbGFyZWRBZGRyZXNzKERldmljZURlc2NyaXB0b3JCYXNlOjphZGRyZXNzKCkpCiB7CiAgICAgbUN1cnJlbnRFbmNvZGVkRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7Ci0gICAgLyogSWYgZnJhbWV3b3JrIHJ1bnMgYWdhaW5zdCBhIHByZSA1LjAgQXVkaW8gSEFMLCBlbmNvZGVkIGZvcm1hdHMgYXJlIGFic2VudCBmcm9tIHRoZSBjb25maWcuCi0gICAgICogRklYTUU6IEFQTSBzaG91bGQga25vdyB0aGUgdmVyc2lvbiBvZiB0aGUgSEFMIGFuZCBkb24ndCBhZGQgdGhlIGZvcm1hdHMgZm9yIFY1LjAuCi0gICAgICogRm9yIG5vdywgdGhlIHdvcmthcm91bmQgdG8gcmVtb3ZlIEFDMyBhbmQgSUVDNjE5Mzcgc3VwcG9ydCBvbiBIRE1JIGlzIHRvIGRlY2xhcmUKLSAgICAgKiBzb21ldGhpbmcgbGlrZSAnZW5jb2RlZEZvcm1hdHM9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIicgb24gdGhlIEhETUkgZGV2aWNlUG9ydC4KLSAgICAgKi8KLSAgICBpZiAobURldmljZVR5cGVBZGRyLm1UeXBlID09IEFVRElPX0RFVklDRV9PVVRfSERNSSAmJiBtRW5jb2RlZEZvcm1hdHMuZW1wdHkoKSkgewotICAgICAgICBtRW5jb2RlZEZvcm1hdHMucHVzaF9iYWNrKEFVRElPX0ZPUk1BVF9BQzMpOwotICAgICAgICBtRW5jb2RlZEZvcm1hdHMucHVzaF9iYWNrKEFVRElPX0ZPUk1BVF9JRUM2MTkzNyk7Ci0gICAgfQogfQogCiB2b2lkIERldmljZURlc2NyaXB0b3I6OmF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKQEAgLTExOCwyMCArMTEwLDYgQEAKICAgICByZXR1cm4gKG1DdXJyZW50RW5jb2RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCk7CiB9CiAKLWJvb2wgRGV2aWNlRGVzY3JpcHRvcjo6c3VwcG9ydHNGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQotewotICAgIGlmIChtRW5jb2RlZEZvcm1hdHMuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGRldkZvcm1hdCA6IG1FbmNvZGVkRm9ybWF0cykgewotICAgICAgICBpZiAoZGV2Rm9ybWF0ID09IGZvcm1hdCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiBzdGF0dXNfdCBEZXZpY2VEZXNjcmlwdG9yOjphcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpiYWNrdXBDb25maWcpCiB7CkBAIC0xNDEsNyArMTE5LDYgQEAKICAgICB0b0F1ZGlvUG9ydENvbmZpZygmbG9jYWxCYWNrdXBDb25maWcpOwogICAgIGlmICgoc3RhdHVzID0gdmFsaWRhdGlvbkJlZm9yZUFwcGx5Q29uZmlnKGNvbmZpZykpID09IE5PX0VSUk9SKSB7CiAgICAgICAgIEF1ZGlvUG9ydENvbmZpZzo6YXBwbHlBdWRpb1BvcnRDb25maWcoY29uZmlnLCBiYWNrdXBDb25maWcpOwotICAgICAgICBhcHBseVBvbGljeUF1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIH0KIAogICAgIGlmIChiYWNrdXBDb25maWcgIT0gTlVMTCkgewpAQCAtMTU0LDggKzEzMSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAogewogICAgIERldmljZURlc2NyaXB0b3JCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7Ci0gICAgdG9Qb2xpY3lBdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwotCiAgICAgZHN0Q29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IGdldE1vZHVsZUhhbmRsZSgpOwogfQogCkBAIC0yMDIsMTUgKzE3NywxNSBAQAogICAgIH0KIH0KIAotdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4LCBib29sIHZlcmJvc2UpIGNvbnN0Cit2b2lkIERldmljZURlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UpIGNvbnN0CiB7CiAgICAgU3RyaW5nOCBleHRyYUluZm87CiAgICAgaWYgKCFtVGFnTmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgIGV4dHJhSW5mby5hcHBlbmRGb3JtYXQoIiUqcy0gdGFnIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtVGFnTmFtZS5jX3N0cigpKTsKKyAgICAgICAgZXh0cmFJbmZvLmFwcGVuZEZvcm1hdCgiXCIlc1wiIiwgbVRhZ05hbWUuY19zdHIoKSk7CiAgICAgfQogCiAgICAgc3RkOjpzdHJpbmcgZGVzY0Jhc2VEdW1wU3RyOwotICAgIERldmljZURlc2NyaXB0b3JCYXNlOjpkdW1wKCZkZXNjQmFzZUR1bXBTdHIsIHNwYWNlcywgaW5kZXgsIGV4dHJhSW5mby5zdHJpbmcoKSwgdmVyYm9zZSk7CisgICAgRGV2aWNlRGVzY3JpcHRvckJhc2U6OmR1bXAoJmRlc2NCYXNlRHVtcFN0ciwgc3BhY2VzLCBleHRyYUluZm8uc3RyaW5nKCksIHZlcmJvc2UpOwogICAgIGRzdC0+YXBwZW5kKGRlc2NCYXNlRHVtcFN0ci5jX3N0cigpKTsKIH0KIApAQCAtNDUxLDYgKzQyNiwxNCBAQAogICAgIHJldHVybiBkZXZpY2VzOwogfQogCitBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIERldmljZVZlY3Rvcjo6dG9UeXBlQWRkclZlY3RvcigpIGNvbnN0IHsKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIHJlc3VsdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soQXVkaW9EZXZpY2VUeXBlQWRkcihkZXZpY2UtPnR5cGUoKSwgZGV2aWNlLT5hZGRyZXNzKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogdm9pZCBEZXZpY2VWZWN0b3I6OnJlcGxhY2VEZXZpY2VzQnlUeXBlKAogICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZVRvUmVtb3ZlLCBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXNUb0FkZCkgewogICAgIERldmljZVZlY3RvciBkZXZpY2VzVG9SZW1vdmUgPSBnZXREZXZpY2VzRnJvbVR5cGUodHlwZVRvUmVtb3ZlKTsKQEAgLTQ2NSw5ICs0NDgsMTEgQEAKICAgICBpZiAoaXNFbXB0eSgpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gJXMgZGV2aWNlczpcbiIsIHNwYWNlcywgIiIsIHRhZy5zdHJpbmcoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyVzIGRldmljZXMgKCV6dSk6XG4iLCBzcGFjZXMsICIiLCB0YWcuc3RyaW5nKCksIHNpemUoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0LCBzcGFjZXMgKyAyLCBpLCB2ZXJib3NlKTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMgJXp1LiAiLCBzcGFjZXMsICIiLCBpICsgMSk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyIsIHByZWZpeC5jX3N0cigpKTsKKyAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCwgcHJlZml4LnNpemUoKSwgdmVyYm9zZSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCmluZGV4IDg0M2Y1ZGEuLjNmOWM4YjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6RWZmZWN0RGVzY3JpcHRvciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlICJFZmZlY3REZXNjcmlwdG9yLmgiCiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCkBAIC0yNCwxMyArMjUsMTEgQEAKIAogdm9pZCBFZmZlY3REZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzSUQ6ICVkXG4iLCBzcGFjZXMsICIiLCBtSWQpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNJL086ICVkXG4iLCBzcGFjZXMsICIiLCBtSW8pOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNNdXNpYyBFZmZlY3Q6ICVzXG4iLCBzcGFjZXMsICIiLCBpc011c2ljRWZmZWN0KCk/ICJ5ZXMiIDogIm5vIik7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1Nlc3Npb246ICVkXG4iLCBzcGFjZXMsICIiLCBtU2Vzc2lvbik7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc05hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCAgbURlc2MubmFtZSk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyVzXG4iLCBzcGFjZXMsICIiLCAgbUVuYWJsZWQgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXNcbiIsIHNwYWNlcywgIiIsICBtU3VzcGVuZGVkID8gIlN1c3BlbmRlZCIgOiAiQWN0aXZlIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIkVmZmVjdCBJRDogJWQ7IEF0dGFjaGVkIHRvIEkvTyBoYW5kbGU6ICVkOyBTZXNzaW9uOiAlZDtcbiIsCisgICAgICAgICAgICBtSWQsIG1JbywgbVNlc3Npb24pOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNNdXNpYyBFZmZlY3Q/ICVzOyBcIiVzXCI7ICVzOyAlc1xuIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgIGlzTXVzaWNFZmZlY3QoKT8gInllcyIgOiAibm8iLCBtRGVzYy5uYW1lLAorICAgICAgICAgICAgbUVuYWJsZWQgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiLCBtU3VzcGVuZGVkID8gIlN1c3BlbmRlZCIgOiAiQWN0aXZlIik7CiB9CiAKIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbigpIDoKQEAgLTIzNywxMCArMjM2LDE0IEBACiAgICAgICAgICAgICBtVG90YWxFZmZlY3RzTWVtb3J5LAogICAgICAgICAgICAgbVRvdGFsRWZmZWN0c01lbW9yeU1heFVzZWQpOwogICAgIH0KLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzRWZmZWN0czpcbiIsIHNwYWNlcywgIiIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gRWZmZWN0ICVkOlxuIiwgc3BhY2VzLCAiIiwga2V5QXQoaSkpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgc3BhY2VzICsgMik7CisgICAgaWYgKHNpemUoKSA+IDApIHsKKyAgICAgICAgaWYgKHNwYWNlcyA+IDEpIHNwYWNlcyAtPSAyOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBFZmZlY3RzICglenUpOlxuIiwgc3BhY2VzLCAiIiwgc2l6ZSgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMgJXp1LiAiLCBzcGFjZXMsICIiLCBpICsgMSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXMiLCBwcmVmaXguY19zdHIoKSk7CisgICAgICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgcHJlZml4LnNpemUoKSk7CisgICAgICAgIH0KICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcAppbmRleCAzYTE0M2IwLi40MThiN2ViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCkBAIC0xNywxMSArMTcsMTMgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpId01vZHVsZSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiSU9Qcm9maWxlLmgiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPHBvbGljeS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBId01vZHVsZTo6SHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgaGFsVmVyc2lvbk1ham9yLCB1aW50MzJfdCBoYWxWZXJzaW9uTWlub3IpCkBAIC0yNDcsMjggKzI0OSwyOCBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBId01vZHVsZTo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit2b2lkIEh3TW9kdWxlOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAtIG5hbWU6ICVzXG4iLCBnZXROYW1lKCkpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgIC0gaGFuZGxlOiAlZFxuIiwgbUhhbmRsZSk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgLSB2ZXJzaW9uOiAldS4ldVxuIiwgZ2V0SGFsVmVyc2lvbk1ham9yKCksIGdldEhhbFZlcnNpb25NaW5vcigpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiSGFuZGxlOiAlZDsgXCIlc1wiXG4iLCBtSGFuZGxlLCBnZXROYW1lKCkpOwogICAgIGlmIChtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kKCIgIC0gb3V0cHV0czpcbiIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBPdXRwdXQgTWl4UG9ydHMgKCV6dSk6XG4iLCBzcGFjZXMgLSAyLCAiIiwgbU91dHB1dFByb2ZpbGVzLnNpemUoKSk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIG91dHB1dCAlenU6XG4iLCBpKTsKLSAgICAgICAgICAgIG1PdXRwdXRQcm9maWxlc1tpXS0+ZHVtcChkc3QpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMgJXp1LiAiLCBzcGFjZXMsICIiLCBpICsgMSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZChwcmVmaXguY19zdHIoKSk7CisgICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPmR1bXAoZHN0LCBwcmVmaXguc2l6ZSgpKTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobUlucHV0UHJvZmlsZXMuc2l6ZSgpKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kKCIgIC0gaW5wdXRzOlxuIik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIElucHV0IE1peFBvcnRzICglenUpOlxuIiwgc3BhY2VzIC0gMiwgIiIsIG1JbnB1dFByb2ZpbGVzLnNpemUoKSk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgaW5wdXQgJXp1OlxuIiwgaSk7Ci0gICAgICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+ZHVtcChkc3QpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJlZml4ID0gYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMgJXp1LiAiLCBzcGFjZXMsICIiLCBpICsgMSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZChwcmVmaXguY19zdHIoKSk7CisgICAgICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+ZHVtcChkc3QsIHByZWZpeC5zaXplKCkpOwogICAgICAgICB9CiAgICAgfQotICAgIG1EZWNsYXJlZERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkRlY2xhcmVkIiksIDIsIHRydWUpOwotICAgIG1EeW5hbWljRGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiRHluYW1pYyIpLCAgMiwgdHJ1ZSk7Ci0gICAgZHVtcEF1ZGlvUm91dGVWZWN0b3IobVJvdXRlcywgZHN0LCAyKTsKKyAgICBtRGVjbGFyZWREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCItIERlY2xhcmVkIiksIHNwYWNlcyAtIDIsIHRydWUpOworICAgIG1EeW5hbWljRGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiLSBEeW5hbWljIiksICBzcGFjZXMgLSAyLCB0cnVlKTsKKyAgICBkdW1wQXVkaW9Sb3V0ZVZlY3RvcihtUm91dGVzLCBkc3QsIHNwYWNlcyk7CiB9CiAKIHNwIDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGcm9tTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdApAQCAtNDYyLDEwICs0NjQsMTEgQEAKIAogdm9pZCBId01vZHVsZUNvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGRzdC0+YXBwZW5kKCJcbkhXIE1vZHVsZXMgZHVtcDpcbiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiBIYXJkd2FyZSBtb2R1bGVzICglenUpOlxuIiwgc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCItIEhXIE1vZHVsZSAlenU6XG4iLCBpICsgMSk7Ci0gICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXggPSBiYXNlOjpTdHJpbmdQcmludGYoIiAgJXp1LiAiLCBpICsgMSk7CisgICAgICAgIGRzdC0+YXBwZW5kKHByZWZpeC5jX3N0cigpKTsKKyAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCwgcHJlZml4LnNpemUoKSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcAppbmRleCAwOWI2MTRkLi4yMWYyMDE4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKQEAgLTExNiwyNyArMTE2LDMwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZSA9PSBkZXZpY2VEZXNjICYmIGRldmljZURlc2MtPmhhc0N1cnJlbnRFbmNvZGVkRm9ybWF0KCk7IH0pID09IDE7CiB9CiAKLXZvaWQgSU9Qcm9maWxlOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3ZvaWQgSU9Qcm9maWxlOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBzdGQ6OnN0cmluZyBwb3J0U3RyOwotICAgIEF1ZGlvUG9ydDo6ZHVtcCgmcG9ydFN0ciwgNCk7Ci0gICAgZHN0LT5hcHBlbmQocG9ydFN0ci5jX3N0cigpKTsKLQotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgLSBmbGFnczogMHglMDR4IiwgZ2V0RmxhZ3MoKSk7CisgICAgU3RyaW5nOCBleHRyYUluZm87CisgICAgZXh0cmFJbmZvLmFwcGVuZEZvcm1hdCgiMHglMDR4IiwgZ2V0RmxhZ3MoKSk7CiAgICAgc3RkOjpzdHJpbmcgZmxhZ3NMaXRlcmFsID0KICAgICAgICAgICAgIGdldFJvbGUoKSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyA/CiAgICAgICAgICAgICB0b1N0cmluZyhzdGF0aWNfY2FzdDxhdWRpb19pbnB1dF9mbGFnc190PihnZXRGbGFncygpKSkgOgogICAgICAgICAgICAgZ2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgPwogICAgICAgICAgICAgdG9TdHJpbmcoc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KGdldEZsYWdzKCkpKSA6ICIiOwogICAgIGlmICghZmxhZ3NMaXRlcmFsLmVtcHR5KCkpIHsKLSAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAoJXMpIiwgZmxhZ3NMaXRlcmFsLmNfc3RyKCkpOworICAgICAgICBleHRyYUluZm8uYXBwZW5kRm9ybWF0KCIgKCVzKSIsIGZsYWdzTGl0ZXJhbC5jX3N0cigpKTsKICAgICB9Ci0gICAgZHN0LT5hcHBlbmQoIlxuIik7Ci0gICAgbVN1cHBvcnRlZERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIlN1cHBvcnRlZCIpLCA0LCBmYWxzZSk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuICAgIC0gbWF4T3BlbkNvdW50OiAldSAtIGN1ck9wZW5Db3VudDogJXVcbiIsCi0gICAgICAgICAgICAgbWF4T3BlbkNvdW50LCBjdXJPcGVuQ291bnQpOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgLSBtYXhBY3RpdmVDb3VudDogJXUgLSBjdXJBY3RpdmVDb3VudDogJXVcbiIsCi0gICAgICAgICAgICAgbWF4QWN0aXZlQ291bnQsIGN1ckFjdGl2ZUNvdW50KTsKKworICAgIHN0ZDo6c3RyaW5nIHBvcnRTdHI7CisgICAgQXVkaW9Qb3J0OjpkdW1wKCZwb3J0U3RyLCBzcGFjZXMsIGV4dHJhSW5mby5jX3N0cigpKTsKKyAgICBkc3QtPmFwcGVuZChwb3J0U3RyLmNfc3RyKCkpOworCisgICAgbVN1cHBvcnRlZERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIi0gU3VwcG9ydGVkIiksIHNwYWNlcyAtIDIsIGZhbHNlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBtYXhPcGVuQ291bnQ6ICV1OyBjdXJPcGVuQ291bnQ6ICV1XG4iLAorICAgICAgICAgICAgc3BhY2VzIC0gMiwgIiIsIG1heE9wZW5Db3VudCwgY3VyT3BlbkNvdW50KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBtYXhBY3RpdmVDb3VudDogJXU7IGN1ckFjdGl2ZUNvdW50OiAldVxuIiwKKyAgICAgICAgICAgIHNwYWNlcyAtIDIsICIiLCBtYXhBY3RpdmVDb3VudCwgY3VyQWN0aXZlQ291bnQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIHJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXM6ICV1IG1zXG4iLAorICAgICAgICAgICAgc3BhY2VzIC0gMiwgIiIsIHJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXMpOwogfQogCiB2b2lkIElPUHJvZmlsZTo6bG9nKCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1BvbGljeUF1ZGlvUG9ydC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Qb2xpY3lBdWRpb1BvcnQuY3BwCmluZGV4IDhjNjFiOTAuLmNlODE3OGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1BvbGljeUF1ZGlvUG9ydC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvUG9saWN5QXVkaW9Qb3J0LmNwcApAQCAtMzAsOSArMzAsOSBAQAogLy8gLS0tIFBvbGljeUF1ZGlvUG9ydCBjbGFzcyBpbXBsZW1lbnRhdGlvbgogdm9pZCBQb2xpY3lBdWRpb1BvcnQ6OmF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKIHsKKyAgICBtTW9kdWxlID0gbW9kdWxlOwogICAgIEFMT0dWKCIlczogYXR0YWNoaW5nIG1vZHVsZSAlcyB0byBwb3J0ICVzIiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZ2V0TW9kdWxlTmFtZSgpLCBhc0F1ZGlvUG9ydCgpLT5nZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgbU1vZHVsZSA9IG1vZHVsZTsKIH0KIAogdm9pZCBQb2xpY3lBdWRpb1BvcnQ6OmRldGFjaCgpCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgLy8gRm9yIGRpcmVjdCBvdXRwdXRzLCBwaWNrIG1pbmltdW0gc2FtcGxpbmcgcmF0ZTogdGhpcyBoZWxwcyBlbnN1cmluZyB0aGF0IHRoZQogICAgIC8vIGNoYW5uZWwgY291bnQgLyBzYW1wbGluZyByYXRlIGNvbWJpbmF0aW9uIGNob3NlbiB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGUgY29ubmVjdGVkCiAgICAgLy8gc2luawotICAgIGlmIChpc0RpcmVjdE91dHB1dCgpKSB7CisgICAgaWYgKGFzQXVkaW9Qb3J0KCktPmlzRGlyZWN0T3V0cHV0KCkpIHsKICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gVUlOVF9NQVg7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byByYXRlIDogc2FtcGxpbmdSYXRlcykgewogICAgICAgICAgICAgaWYgKChyYXRlIDwgc2FtcGxpbmdSYXRlKSAmJiAocmF0ZSA+IDApKSB7CkBAIC0xMjIsNyArMTIyLDcgQEAKICAgICAvLyBGb3IgZGlyZWN0IG91dHB1dHMsIHBpY2sgbWluaW11bSBjaGFubmVsIGNvdW50OiB0aGlzIGhlbHBzIGVuc3VyaW5nIHRoYXQgdGhlCiAgICAgLy8gY2hhbm5lbCBjb3VudCAvIHNhbXBsaW5nIHJhdGUgY29tYmluYXRpb24gY2hvc2VuIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IHRoZSBjb25uZWN0ZWQKICAgICAvLyBzaW5rCi0gICAgaWYgKGlzRGlyZWN0T3V0cHV0KCkpIHsKKyAgICBpZiAoYXNBdWRpb1BvcnQoKS0+aXNEaXJlY3RPdXRwdXQoKSkgewogICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBVSU5UX01BWDsKICAgICAgICAgZm9yIChjb25zdCBhdXRvIGNoYW5uZWxNYXNrIDogY2hhbm5lbE1hc2tzKSB7CiAgICAgICAgICAgICB1aW50MzJfdCBjbmxDb3VudDsKQEAgLTIzNiw3ICsyMzYsNyBAQAogICAgIGF1ZGlvX2Zvcm1hdF90IGJlc3RGb3JtYXQgPSBzUGNtRm9ybWF0Q29tcGFyZVRhYmxlW0FSUkFZX1NJWkUoc1BjbUZvcm1hdENvbXBhcmVUYWJsZSkgLSAxXTsKICAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBiZXN0IG1peGVyIG91dHB1dCBmb3JtYXQuCiAgICAgLy8gRG8gbm90IGxpbWl0IGZvcm1hdCBvdGhlcndpc2UKLSAgICBpZiAoKGFzQXVkaW9Qb3J0KCktPmdldFR5cGUoKSAhPSBBVURJT19QT1JUX1RZUEVfTUlYKSB8fCBpc0RpcmVjdE91dHB1dCgpKSB7CisgICAgaWYgKChhc0F1ZGlvUG9ydCgpLT5nZXRUeXBlKCkgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkgfHwgYXNBdWRpb1BvcnQoKS0+aXNEaXJlY3RPdXRwdXQoKSkgewogICAgICAgICBiZXN0Rm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CiAgICAgfQogCkBAIC0yNjYsMjkgKzI2Niw0IEBACiAgICAgICAgICAgICBhc0F1ZGlvUG9ydCgpLT5nZXROYW1lKCkuY19zdHIoKSwgc2FtcGxpbmdSYXRlLCBjaGFubmVsTWFzaywgZm9ybWF0KTsKIH0KIAotLy8gLS0tIFBvbGljeUF1ZGlvUG9ydENvbmZpZyBjbGFzcyBpbXBsZW1lbnRhdGlvbgotCi1zdGF0dXNfdCBQb2xpY3lBdWRpb1BvcnRDb25maWc6OnZhbGlkYXRpb25CZWZvcmVBcHBseUNvbmZpZygKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIGNvbnN0Ci17Ci0gICAgc3A8UG9saWN5QXVkaW9Qb3J0PiBwb2xpY3lBdWRpb1BvcnQgPSBnZXRQb2xpY3lBdWRpb1BvcnQoKTsKLSAgICByZXR1cm4gcG9saWN5QXVkaW9Qb3J0ID8gcG9saWN5QXVkaW9Qb3J0LT5jaGVja0V4YWN0QXVkaW9Qcm9maWxlKGNvbmZpZykgOiBOT19JTklUOwotfQotCi12b2lkIFBvbGljeUF1ZGlvUG9ydENvbmZpZzo6dG9Qb2xpY3lBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Ci17Ci0gICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUykgewotICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBudWxscHRyKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTKSkgewotICAgICAgICAgICAgZHN0Q29uZmlnLT5mbGFncyA9IHNyY0NvbmZpZy0+ZmxhZ3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmZsYWdzID0gbUZsYWdzOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5mbGFncyA9IHsgQVVESU9fSU5QVVRfRkxBR19OT05FIH07Ci0gICAgfQotfQotCi0KLQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcAppbmRleCA4NGVkNjU2Li5kNDQ2ZTk2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcApAQCAtMTIzLDYgKzEyMyw3IEBACiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZmxhZ3MgPSAiZmxhZ3MiOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1heE9wZW5Db3VudCA9ICJtYXhPcGVuQ291bnQiOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1heEFjdGl2ZUNvdW50ID0gIm1heEFjdGl2ZUNvdW50IjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyZWNvbW1lbmRlZE11dGVEdXJhdGlvbk1zID0gInJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXMiOwogICAgIH07CiAKICAgICAvLyBDaGlsZHJlbjogR2FpblRyYWl0cwpAQCAtNDgyLDcgKzQ4MywxNCBAQAogICAgIGlmICghZmxhZ3MuZW1wdHkoKSkgewogICAgICAgICAvLyBTb3VyY2Ugcm9sZQogICAgICAgICBpZiAocG9ydFJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgewotICAgICAgICAgICAgbWl4UG9ydC0+c2V0RmxhZ3MoT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MsIG1GbGFnc1NlcGFyYXRvci5jX3N0cigpKSk7CisgICAgICAgICAgICAvL1RPRE86IGIvMTkzNDk2MTgwIHVzZSBzcGF0aWFsaXplciBmbGFnIGF0IGF1ZGlvIEhBTCB3aGVuIGF2YWlsYWJsZSB1bnRpbCB0aGVuLAorICAgICAgICAgICAgLy8gdXNlIERFRVBfQlVGRkVSK0ZBU1QgZmxhZyBjb21ibyB0byBpbmRpY2F0ZSB0aGUgc3BhdGlhbGl6ZXIgb3V0cHV0IHByb2ZpbGUKKyAgICAgICAgICAgIHVpbnQzMl90IGludEZsYWdzID0KKyAgICAgICAgICAgICAgICAgICAgT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MsIG1GbGFnc1NlcGFyYXRvci5jX3N0cigpKTsKKyAgICAgICAgICAgIGlmIChpbnRGbGFncyA9PSAoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCB8IEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKSkgeworICAgICAgICAgICAgICAgIGludEZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfU1BBVElBTElaRVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtaXhQb3J0LT5zZXRGbGFncyhpbnRGbGFncyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBTaW5rIHJvbGUKICAgICAgICAgICAgIG1peFBvcnQtPnNldEZsYWdzKElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MsIG1GbGFnc1NlcGFyYXRvci5jX3N0cigpKSk7CkBAIC00OTYsNiArNTA0LDEzIEBACiAgICAgaWYgKCFtYXhBY3RpdmVDb3VudC5lbXB0eSgpKSB7CiAgICAgICAgIGNvbnZlcnRUbyhtYXhBY3RpdmVDb3VudCwgbWl4UG9ydC0+bWF4QWN0aXZlQ291bnQpOwogICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHJlY29tbWVuZGVkbXV0ZUR1cmF0aW9uTXNMaXRlcmFsID0KKyAgICAgICAgICAgIGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6cmVjb21tZW5kZWRNdXRlRHVyYXRpb25Ncyk7CisgICAgaWYgKCFyZWNvbW1lbmRlZG11dGVEdXJhdGlvbk1zTGl0ZXJhbC5lbXB0eSgpKSB7CisgICAgICAgIGNvbnZlcnRUbyhyZWNvbW1lbmRlZG11dGVEdXJhdGlvbk1zTGl0ZXJhbCwgbWl4UG9ydC0+cmVjb21tZW5kZWRNdXRlRHVyYXRpb25Ncyk7CisgICAgfQorCiAgICAgLy8gRGVzZXJpYWxpemUgY2hpbGRyZW4KICAgICBBdWRpb0dhaW5UcmFpdHM6OkNvbGxlY3Rpb24gZ2FpbnM7CiAgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvR2FpblRyYWl0cz4oY2hpbGQsICZnYWlucywgTlVMTCk7CkBAIC04NjEsMTAgKzg3NiwxMCBAQAogICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQgaW4gcm9vdCBub2RlICVzIiwgX19mdW5jX18sIHJvb3ROYW1lKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgaWYgKHZlcnNpb24gPT0gIjcuMCIpIHsKKyAgICBpZiAodmVyc2lvbiA9PSAiNy4wIiB8fCB2ZXJzaW9uID09ICI3LjEiKSB7CiAgICAgICAgIG1DaGFubmVsTWFza3NTZXBhcmF0b3IgPSBtU2FtcGxpbmdSYXRlc1NlcGFyYXRvciA9IG1GbGFnc1NlcGFyYXRvciA9ICIgIjsKICAgICB9IGVsc2UgaWYgKHZlcnNpb24gIT0gIjEuMCIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBWZXJzaW9uIGRvZXMgbm90IG1hdGNoOyBleHBlY3RlZCBcIjEuMFwiIG9yIFwiNy4wXCIgZ290IFwiJXNcIiIsCisgICAgICAgIEFMT0dFKCIlczogVmVyc2lvbiBkb2VzIG5vdCBtYXRjaDsgZXhwZWN0ZWQgXCIxLjBcIiwgXCI3LjBcIiwgb3IgXCI3LjFcIiBnb3QgXCIlc1wiIiwKICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdmVyc2lvbi5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCmluZGV4IDk4NDE1YjcuLmNlNzhlYjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0xMCwxOCArMTAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMjQwMDAsMTYwMDAiCiAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgogICAgICAgICA8L21peFBvcnQ+Ci0gICAgICAgIDwhLS0gTGUgQXVkaW8gQXVkaW8gUG9ydHMgLS0+Ci0gICAgICAgIDxtaXhQb3J0IG5hbWU9ImxlIGF1ZGlvIG91dHB1dCIgcm9sZT0ic291cmNlIj4KLSAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKLSAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCi0gICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+Ci0gICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEIgotICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIKLSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KLSAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzMyX0JJVCIKLSAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCi0gICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+Ci0gICAgICAgIDwvbWl4UG9ydD4KICAgICA8L21peFBvcnRzPgogICAgIDxkZXZpY2VQb3J0cz4KICAgICAgICAgPCEtLSBBMkRQIEF1ZGlvIFBvcnRzIC0tPgpAQCAtNDIsMTMgKzMwLDYgQEAKICAgICAgICAgPC9kZXZpY2VQb3J0PgogICAgICAgICA8IS0tIEhlYXJpbmcgQUlEcyBBdWRpbyBQb3J0cyAtLT4KICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgSGVhcmluZyBBaWQgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEIiByb2xlPSJzaW5rIi8+Ci0gICAgICAgIDwhLS0gQkxFIEF1ZGlvIFBvcnRzIC0tPgotICAgICAgICA8IS0tIE5vdGUgdGhhdCB0aGVzZSBkZXZpY2UgdHlwZXMgYXJlIG5vdCB2YWxpZCBpbiBIQUwgdmVyc2lvbnMgPCA3LiBBbnkgZGV2aWNlCi0gICAgICAgICAgICAgcnVubmluZyBwcmUtVjcgSEFMIGFuZCB1c2luZyB0aGlzIGZpbGUgd2lsbCBub3QgcGFzcyBWVFMuIE5lZWQgdG8gdXNlCi0gICAgICAgICAgICAgYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwgaW5zdGVhZC4KLSAgICAgICAgLS0+Ci0gICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBIZWFkc2V0IE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVCIgcm9sZT0ic2luayIvPgotICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgU3BlYWtlciBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVIiIHJvbGU9InNpbmsiLz4KICAgICA8L2RldmljZVBvcnRzPgogICAgIDxyb3V0ZXM+CiAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgT3V0IgpAQCAtNTksOSArNDAsNSBAQAogICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgSGVhcmluZyBBaWQgT3V0IgogICAgICAgICAgICAgICAgc291cmNlcz0iaGVhcmluZyBhaWQgb3V0cHV0Ii8+Ci0gICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJMRSBIZWFkc2V0IE91dCIKLSAgICAgICAgICAgICAgIHNvdXJjZXM9ImxlIGF1ZGlvIG91dHB1dCIvPgotICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCTEUgU3BlYWtlciBPdXQiCi0gICAgICAgICAgICAgICBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KICAgICA8L3JvdXRlcz4KIDwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCmluZGV4IGZiZTc1NzEuLjJkZmZlMDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKQEAgLTEwLDE4ICsxMCw2IEBACiAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIyNDAwMCAxNjAwMCIKICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CiAgICAgICAgIDwvbWl4UG9ydD4KLSAgICAgICAgPCEtLSBMZSBBdWRpbyBBdWRpbyBQb3J0cyAtLT4KLSAgICAgICAgPG1peFBvcnQgbmFtZT0ibGUgYXVkaW8gb3V0cHV0IiByb2xlPSJzb3VyY2UiPgotICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgotICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAyNDAwMCAzMjAwMCA0NDEwMCA0ODAwMCIKLSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KLSAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQiCi0gICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIDI0MDAwIDMyMDAwIDQ0MTAwIDQ4MDAwIgotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgotICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMzJfQklUIgotICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAyNDAwMCAzMjAwMCA0NDEwMCA0ODAwMCIKLSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KLSAgICAgICAgPC9taXhQb3J0PgogICAgIDwvbWl4UG9ydHM+CiAgICAgPGRldmljZVBvcnRzPgogICAgICAgICA8IS0tIEEyRFAgQXVkaW8gUG9ydHMgLS0+CkBAIC00Miw5ICszMCw2IEBACiAgICAgICAgIDwvZGV2aWNlUG9ydD4KICAgICAgICAgPCEtLSBIZWFyaW5nIEFJRHMgQXVkaW8gUG9ydHMgLS0+CiAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEhlYXJpbmcgQWlkIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCIgcm9sZT0ic2luayIvPgotICAgICAgICA8IS0tIEJMRSBBdWRpbyBQb3J0cyAtLT4KLSAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIEhlYWRzZXQgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUIiByb2xlPSJzaW5rIi8+Ci0gICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBTcGVha2VyIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUiIgcm9sZT0ic2luayIvPgogICAgIDwvZGV2aWNlUG9ydHM+CiAgICAgPHJvdXRlcz4KICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBPdXQiCkBAIC01NSw5ICs0MCw1IEBACiAgICAgICAgICAgICAgICBzb3VyY2VzPSJhMmRwIG91dHB1dCIvPgogICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBIZWFyaW5nIEFpZCBPdXQiCiAgICAgICAgICAgICAgICBzb3VyY2VzPSJoZWFyaW5nIGFpZCBvdXRwdXQiLz4KLSAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIEhlYWRzZXQgT3V0IgotICAgICAgICAgICAgICAgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+Ci0gICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJMRSBTcGVha2VyIE91dCIKLSAgICAgICAgICAgICAgIHNvdXJjZXM9ImxlIGF1ZGlvIG91dHB1dCIvPgogICAgIDwvcm91dGVzPgogPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX3dpdGhfbGVfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF93aXRoX2xlX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzRjY2EwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF93aXRoX2xlX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMCwwICsxLDcxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBCbHVldG9vdGggQXVkaW8gSEFMIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8bW9kdWxlIG5hbWU9ImJsdWV0b290aCIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDwhLS0gQTJEUCBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0iYTJkcCBvdXRwdXQiIHJvbGU9InNvdXJjZSIvPgorICAgICAgICA8IS0tIEhlYXJpbmcgQUlEcyBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0iaGVhcmluZyBhaWQgb3V0cHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMjQwMDAsMTYwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgICAgIDwhLS0gTGUgQXVkaW8gQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImxlIGF1ZGlvIG91dHB1dCIgcm9sZT0ic291cmNlIi8+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImxlIGF1ZGlvIGlucHV0IiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyxBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyxBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMzJfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PLEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICA8L21peFBvcnRzPgorICAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgPCEtLSBBMkRQIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBBMkRQIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCw0ODAwMCw4ODIwMCw5NjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBIZWFkcGhvbmVzIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAsNDgwMDAsODgyMDAsOTYwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgU3BlYWtlciIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwLDQ4MDAwLDg4MjAwLDk2MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICA8IS0tIEhlYXJpbmcgQUlEcyBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgSGVhcmluZyBBaWQgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEIiByb2xlPSJzaW5rIi8+CisgICAgICAgIDwhLS0gQkxFIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8IS0tIE5vdGUgdGhhdCB0aGVzZSBkZXZpY2UgdHlwZXMgYXJlIG5vdCB2YWxpZCBpbiBIQUwgdmVyc2lvbnMgPCA3LiBBbnkgZGV2aWNlCisgICAgICAgICAgICAgcnVubmluZyBwcmUtVjcgSEFMIGFuZCB1c2luZyB0aGlzIGZpbGUgd2lsbCBub3QgcGFzcyBWVFMuIE5lZWQgdG8gdXNlCisgICAgICAgICAgICAgYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwgaW5zdGVhZC4KKyAgICAgICAgLS0+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBIZWFkc2V0IE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVCIgcm9sZT0ic2luayIvPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgU3BlYWtlciBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVIiIHJvbGU9InNpbmsiLz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIEhlYWRzZXQgSW4iIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVCIgcm9sZT0ic291cmNlIi8+CisgICAgPC9kZXZpY2VQb3J0cz4KKyAgICA8cm91dGVzPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBBMkRQIE91dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgSGVhZHBob25lcyIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgU3BlYWtlciIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEhlYXJpbmcgQWlkIE91dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImhlYXJpbmcgYWlkIG91dHB1dCIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCTEUgSGVhZHNldCBPdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0ibGUgYXVkaW8gaW5wdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJCTEUgSGVhZHNldCBJbiIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCTEUgU3BlYWtlciBPdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KKyAgICA8L3JvdXRlcz4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF93aXRoX2xlX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX3dpdGhfbGVfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzkwOGViCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF93aXRoX2xlX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKQEAgLTAsMCArMSw2NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQmx1ZXRvb3RoIEF1ZGlvIEhBTCBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPG1vZHVsZSBuYW1lPSJibHVldG9vdGgiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8IS0tIEEyRFAgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImEyZHAgb3V0cHV0IiByb2xlPSJzb3VyY2UiLz4KKyAgICAgICAgPCEtLSBIZWFyaW5nIEFJRHMgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImhlYXJpbmcgYWlkIG91dHB1dCIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjI0MDAwIDE2MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8IS0tIExlIEF1ZGlvIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJsZSBhdWRpbyBvdXRwdXQiIHJvbGU9InNvdXJjZSIgLz4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibGUgYXVkaW8gaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAyNDAwMCAzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAyNDAwMCAzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8zMl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIDI0MDAwIDMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgIDwvbWl4UG9ydHM+CisgICAgPGRldmljZVBvcnRzPgorICAgICAgICA8IS0tIEEyRFAgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwIDQ4MDAwIDg4MjAwIDk2MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBBMkRQIEhlYWRwaG9uZXMiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCA0ODAwMCA4ODIwMCA5NjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBTcGVha2VyIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAgNDgwMDAgODgyMDAgOTYwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgIDwhLS0gSGVhcmluZyBBSURzIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBIZWFyaW5nIEFpZCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQiIHJvbGU9InNpbmsiLz4KKyAgICAgICAgPCEtLSBCTEUgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBIZWFkc2V0IE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVCIgcm9sZT0ic2luayIvPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgU3BlYWtlciBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVIiIHJvbGU9InNpbmsiLz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIEhlYWRzZXQgSW4iIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVCIgcm9sZT0ic291cmNlIi8+CisgICAgPC9kZXZpY2VQb3J0cz4KKyAgICA8cm91dGVzPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBBMkRQIE91dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgSGVhZHBob25lcyIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgU3BlYWtlciIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEhlYXJpbmcgQWlkIE91dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImhlYXJpbmcgYWlkIG91dHB1dCIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCTEUgSGVhZHNldCBPdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0ibGUgYXVkaW8gaW5wdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJCTEUgSGVhZHNldCBJbiIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCTEUgU3BlYWtlciBPdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KKyAgICA8L3JvdXRlcz4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2xlX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9sZV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKaW5kZXggYTNkYzcyYi4uZGNkZDgwNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2xlX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbGVfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC03LDEzICs3LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDE2MDAwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIgogICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgogICAgICAgICA8L21peFBvcnQ+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImxlIGF1ZGlvIGlucHV0IiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCxBVURJT19GT1JNQVRfUENNXzI0X0JJVCxBVURJT19GT1JNQVRfUENNXzMyX0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyxBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CiAgICAgPC9taXhQb3J0cz4KICAgICA8ZGV2aWNlUG9ydHM+CiAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBIZWFkc2V0IE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVCIgcm9sZT0ic2luayIvPgogICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgU3BlYWtlciBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVIiIHJvbGU9InNpbmsiLz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIEhlYWRzZXQgSW4iIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVCIgcm9sZT0ic291cmNlIi8+CiAgICAgPC9kZXZpY2VQb3J0cz4KICAgICA8cm91dGVzPgogICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCTEUgSGVhZHNldCBPdXQiIHNvdXJjZXM9ImxlIGF1ZGlvIG91dHB1dCIvPgogICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCTEUgU3BlYWtlciBPdXQiIHNvdXJjZXM9ImxlIGF1ZGlvIG91dHB1dCIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJsZSBhdWRpbyBpbnB1dCIgc291cmNlcz0iQkxFIEhlYWRzZXQgSW4iLz4KICAgICA8L3JvdXRlcz4KIDwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0VuZ2luZUJhc2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmgKaW5kZXggMGY4YjBhNS4uN2QyMWFlMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0VuZ2luZUJhc2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvRW5naW5lQmFzZS5oCkBAIC04NywxMCArODcsMTcgQEAKIAogICAgIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpIGNvbnN0IG92ZXJyaWRlOwogCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0IG9mIGN1cnJlbnRseSBjb25uZWN0ZWQgcmVtb3ZhYmxlIGRldmljZSB0eXBlcyBvcmRlcmVkIGZyb20gbW9zdCByZWNlbnRseQorICAgICAqIGNvbm5lY3RlZCB0byBsZWFzdCByZWNlbnRseSBjb25uZWN0ZWQuCisgICAgICogQHBhcmFtIGdyb3VwIHRoZSBkZXZpY2UgZ3JvdXAgdG8gY29uc2lkZXI6IHdpcmVkLCBhMmRwLi4uIElmIG5vbmUsIGNvbnNpZGVyIGFsbCBncm91cHMuCisgICAgICogQHBhcmFtIGV4Y2x1ZGVkRGV2aWNlcyBsaXN0IG9mIGRldmljZSB0eXBlcyB0byBpZ25vcmUKKyAgICAgKiBAcmV0dXJuIGEgcG90ZW50aWFsbHkgZW1wdHkgb3JkZXJlZCBsaXN0IG9mIGNvbm5lY3RlZCByZW1vdmFibGUgZGV2aWNlcy4KKyAgICAgKi8KICAgICBzdGQ6OnZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+IGdldExhc3RSZW1vdmFibGVNZWRpYURldmljZXMoCi0gICAgICAgICAgICBkZXZpY2Vfb3V0X2dyb3VwX3QgZ3JvdXAgPSBHUk9VUF9OT05FKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmdldExhc3RSZW1vdmFibGVNZWRpYURldmljZXMoZ3JvdXApOworICAgICAgICAgICAgZGV2aWNlX291dF9ncm91cF90IGdyb3VwID0gR1JPVVBfTk9ORSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2RldmljZXNfdD4gZXhjbHVkZWREZXZpY2VzID0ge30pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmdldExhc3RSZW1vdmFibGVNZWRpYURldmljZXMoZ3JvdXAsIGV4Y2x1ZGVkRGV2aWNlcyk7CiAgICAgfQogCiAgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuaAppbmRleCBkN2Y4YjFlLi4yNjYyY2QzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmgKQEAgLTM1LDcgKzM1LDggQEAKIHB1YmxpYzoKICAgICB2b2lkIHNldFJlbW92YWJsZU1lZGlhRGV2aWNlcyhzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXNjLCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpOwogICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2RldmljZXNfdD4gZ2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcygKLSAgICAgICAgICAgIGRldmljZV9vdXRfZ3JvdXBfdCBncm91cCA9IEdST1VQX05PTkUpIGNvbnN0OworICAgICAgICAgICAgZGV2aWNlX291dF9ncm91cF90IGdyb3VwID0gR1JPVVBfTk9ORSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2RldmljZXNfdD4gZXhjbHVkZWREZXZpY2VzID0ge30pIGNvbnN0OwogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldExhc3RSZW1vdmFibGVNZWRpYURldmljZSgKICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZXhjbHVkZWREZXZpY2VzLCBkZXZpY2Vfb3V0X2dyb3VwX3QgZ3JvdXAgPSBHUk9VUF9OT05FKSBjb25zdDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcAppbmRleCAxNTBhOWE4Li45OTUwN2VlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcApAQCAtNzEsNyArNzEsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCiB7CiAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBkZXZEZXNjLT50eXBlKCk7Ci0gICAgaWYgKChkZXZpY2VUeXBlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJiBhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZVR5cGUpKSB7CisgICAgaWYgKChkZXZpY2VUeXBlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJiBhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZVR5cGUpCisgICAgICAgICAgICAmJiBkZXZpY2VUeXBlICE9IEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQKKyAgICAgICAgICAgICYmIGRldmljZVR5cGUgIT0gQVVESU9fREVWSUNFX09VVF9CTEVfQlJPQURDQVNUKSB7CisgICAgICAgIC8vIFVTQiBkb2NrIGRvZXMgbm90IGZvbGxvdyB0aGUgcnVsZSBvZiBsYXN0IHJlbW92YWJsZSBkZXZpY2UgY29ubmVjdGVkIHdpbnMuCisgICAgICAgIC8vIEl0IGlzIG9ubHkgdXNlZCBpZiBubyByZW1vdmFibGUgZGV2aWNlIGlzIGNvbm5lY3RlZCBvciBpZiBzZXQgYXMgcHJlZmVycmVkIGRldmljZQorICAgICAgICAvLyBMRSBhdWRpbyBicm9hZGNhc3QgZGV2aWNlIGhhcyBhIHNwZWNpZmljIHBvbGljeSBkZXBlbmRpbmcgb24gYWN0aXZlIHN0cmF0ZWdpZXMgYW5kCisgICAgICAgIC8vIGRldmljZXMgYW5kIGRvZXMgbm90IGZvbGxvdyB0aGUgcnVsZSBvZiBsYXN0IGNvbm5lY3RlZCByZW1vdmFibGUgZGV2aWNlLgogICAgICAgICBtTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5zZXRSZW1vdmFibGVNZWRpYURldmljZXMoZGV2RGVzYywgc3RhdGUpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lRGVmYXVsdENvbmZpZy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lRGVmYXVsdENvbmZpZy5oCmluZGV4IGQzOWVmZjYuLmIwMzZlMTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVEZWZhdWx0Q29uZmlnLmgKQEAgLTY5LDEyICs2OSw2IEBACiAgICAgICAgICAgewogICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsCiAgICAgICAgICAgICAgICBBVURJT19GTEFHX05PTkUsICIifSwKLSAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNULAotICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAotICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQsCi0gICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0sCi0gICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCwKLSAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQsCiAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0KICAgICAgICAgICB9CkBAIC0xMjgsOCArMTIyLDEyIEBACiAgICAgeyJTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIiLAogICAgICB7CiAgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9UVFMsICJBVURJT19TVFJFQU1fVFRTIiwKLSAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKLSAgICAgICAgICAgIEFVRElPX0ZMQUdfQkVBQ09OLCAiIn19CisgICAgICAgICAgeworICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgICAgIEFVRElPX0ZMQUdfQkVBQ09OLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVUxUUkFTT1VORCwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgQVVESU9fRkxBR19OT05FLCAiIn0KKyAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0sCiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmNwcAppbmRleCBiM2Y4OTQ3Li45MzEyMmUwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmNwcApAQCAtNDQsMTIgKzQ0LDE1IEBACiB9CiAKIHN0ZDo6dmVjdG9yPGF1ZGlvX2RldmljZXNfdD4gTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlczo6Z2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcygKLSAgICAgICAgZGV2aWNlX291dF9ncm91cF90IGdyb3VwKSBjb25zdAorICAgICAgICBkZXZpY2Vfb3V0X2dyb3VwX3QgZ3JvdXAsIHN0ZDo6dmVjdG9yPGF1ZGlvX2RldmljZXNfdD4gZXhjbHVkZWREZXZpY2VzKSBjb25zdAogewogICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2RldmljZXNfdD4gcmV0OwogICAgIGZvciAoYXV0byBpdGVyID0gbU1lZGlhRGV2aWNlcy5iZWdpbigpOyBpdGVyICE9IG1NZWRpYURldmljZXMuZW5kKCk7ICsraXRlcikgewotICAgICAgICBpZiAoKGdyb3VwID09IEdST1VQX05PTkUpIHx8IChncm91cCA9PSBnZXREZXZpY2VPdXRHcm91cCgoaXRlci0+ZGVzYyktPnR5cGUoKSkpKSB7Ci0gICAgICAgICAgICByZXQucHVzaF9iYWNrKChpdGVyLT5kZXNjKS0+dHlwZSgpKTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSAoaXRlci0+ZGVzYyktPnR5cGUoKTsKKyAgICAgICAgaWYgKChncm91cCA9PSBHUk9VUF9OT05FIHx8IGdyb3VwID09IGdldERldmljZU91dEdyb3VwKHR5cGUpKQorICAgICAgICAgICAgICAgICYmIHN0ZDo6ZmluZChleGNsdWRlZERldmljZXMuYmVnaW4oKSwgZXhjbHVkZWREZXZpY2VzLmVuZCgpLCB0eXBlKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWREZXZpY2VzLmVuZCgpKSB7CisgICAgICAgICAgICByZXQucHVzaF9iYWNrKHR5cGUpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiByZXQ7CkBAIC04NSw2ICs4OCw3IEBACiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEOgogICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVDoKICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVI6CisgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMRV9CUk9BRENBU1Q6CiAgICAgICAgIHJldHVybiBHUk9VUF9CVF9BMkRQOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBHUk9VUF9OT05FOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvUHJvZHVjdFN0cmF0ZWd5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAKaW5kZXggYjNkMTQ0Zi4uZmJmY2Y3MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvUHJvZHVjdFN0cmF0ZWd5LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwCkBAIC0xNTAsMTIgKzE1MCw4IEBACiB2b2lkIFByb2R1Y3RTdHJhdGVneTo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7CiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzLSVzIChpZDogJWQpXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5jX3N0cigpLCBtSWQpOwotICAgIHN0ZDo6c3RyaW5nIGRldmljZUxpdGVyYWw7Ci0gICAgaWYgKCFkZXZpY2VUeXBlc1RvU3RyaW5nKG1BcHBsaWNhYmxlRGV2aWNlcywgZGV2aWNlTGl0ZXJhbCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY29udmVydCBkZXZpY2UgJXMiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGR1bXBEZXZpY2VUeXBlcyhtQXBwbGljYWJsZURldmljZXMpLmNfc3RyKCkpOwotICAgIH0KLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzU2VsZWN0ZWQgRGV2aWNlOiB7dHlwZTolcywgQDolc31cbiIsIHNwYWNlcyArIDIsICIiLAorICAgIHN0ZDo6c3RyaW5nIGRldmljZUxpdGVyYWwgPSBkZXZpY2VUeXBlc1RvU3RyaW5nKG1BcHBsaWNhYmxlRGV2aWNlcyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1NlbGVjdGVkIERldmljZTogeyVzLCBAOiVzfVxuIiwgc3BhY2VzICsgMiwgIiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpdGVyYWwuY19zdHIoKSwgbURldmljZUFkZHJlc3MuY19zdHIoKSk7CiAKICAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHIgOiBtQXR0cmlidXRlc1ZlY3RvcikgewpAQCAtMzMzLDQgKzMyOSwzIEBACiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuIik7CiB9CiB9Ci0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvaW5jbHVkZS9FbmdpbmVDb25maWcuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvaW5jbHVkZS9FbmdpbmVDb25maWcuaAppbmRleCBjNTY1OTI2Li4yZWJiN2RmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL2luY2x1ZGUvRW5naW5lQ29uZmlnLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9pbmNsdWRlL0VuZ2luZUNvbmZpZy5oCkBAIC03MCw3ICs3MCw3IEBACiAKIHVzaW5nIFByb2R1Y3RTdHJhdGVnaWVzID0gc3RkOjp2ZWN0b3I8UHJvZHVjdFN0cmF0ZWd5PjsKIAotdXNpbmcgVmFsdWVQYWlyID0gc3RkOjpwYWlyPHVpbnQzMl90LCBzdGQ6OnN0cmluZz47Cit1c2luZyBWYWx1ZVBhaXIgPSBzdGQ6OnR1cGxlPHVpbnQ2NF90LCB1aW50MzJfdCwgc3RkOjpzdHJpbmc+OwogdXNpbmcgVmFsdWVQYWlycyA9IHN0ZDo6dmVjdG9yPFZhbHVlUGFpcj47CiAKIHN0cnVjdCBDcml0ZXJpb25UeXBlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3NyYy9FbmdpbmVDb25maWcuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcAppbmRleCA4MWU4MDNmLi42ZjU2MGQ1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3NyYy9FbmdpbmVDb25maWcuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvc3JjL0VuZ2luZUNvbmZpZy5jcHAKQEAgLTgwLDYgKzgwLDcgQEAKICAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbGl0ZXJhbCA9ICJsaXRlcmFsIjsKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpudW1lcmljYWwgPSAibnVtZXJpY2FsIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICphbmRyb2lkVHlwZSA9ICJhbmRyb2lkX3R5cGUiOwogICAgIH07CiAKICAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwKQEAgLTM0OSw3ICszNTAsMTYgQEAKICAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmxpdGVyYWwpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICB1aW50MzJfdCBudW1lcmljYWwgPSAwOworICAgIHVpbnQzMl90IGFuZHJvaWRUeXBlID0gMDsKKyAgICBzdGQ6OnN0cmluZyBhbmRyb2lkVHlwZWxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OmFuZHJvaWRUeXBlKTsKKyAgICBpZiAoIWFuZHJvaWRUeXBlbGl0ZXJhbC5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dWKCIlczogYW5kcm9pZFR5cGUgJXMiLCBfX0ZVTkNUSU9OX18sIGFuZHJvaWRUeXBlbGl0ZXJhbC5jX3N0cigpKTsKKyAgICAgICAgaWYgKCFjb252ZXJ0VG8oYW5kcm9pZFR5cGVsaXRlcmFsLCBhbmRyb2lkVHlwZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogOiBJbnZhbGlkIHR5cGVzZXQgdmFsdWUoJXMpIiwgX19GVU5DVElPTl9fLCBhbmRyb2lkVHlwZWxpdGVyYWwuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICAgIHVpbnQ2NF90IG51bWVyaWNhbCA9IDA7CiAgICAgc3RkOjpzdHJpbmcgbnVtZXJpY2FsVGFnID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpudW1lcmljYWwpOwogICAgIGlmIChudW1lcmljYWxUYWcuZW1wdHkoKSkgewogICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bGl0ZXJhbCk7CkBAIC0zNTksNyArMzY5LDcgQEAKICAgICAgICAgQUxPR0UoIiVzOiA6IEludmFsaWQgdmFsdWUoJXMpIiwgX19GVU5DVElPTl9fLCBudW1lcmljYWxUYWcuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHZhbHVlcy5wdXNoX2JhY2soe251bWVyaWNhbCwgbGl0ZXJhbH0pOworICAgIHZhbHVlcy5wdXNoX2JhY2soe251bWVyaWNhbCwgIGFuZHJvaWRUeXBlLCBsaXRlcmFsfSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLmJwCmluZGV4IGE3NDc4MjIuLmRjOGQ5Y2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLmJwCkBAIC00MSw4ICs0MSw5IEBACiAgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZV9wZnd3cmFwcGVyIiwKIAogICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKKyAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlidXRpbHMiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKaW5kZXggYmMzMjQxNi4uMGRkZjY2ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCkBAIC01Nyw5ICs1Nyw2IEBACiAgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCI+CiAgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIgdm9sdW1lR3JvdXA9Im5vdGlmaWNhdGlvbiI+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgotICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCIvPiA8L0F0dHJpYnV0ZXM+Ci0gICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UIi8+IDwvQXR0cmlidXRlcz4KLSAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQiLz4gPC9BdHRyaWJ1dGVzPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CiAgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmgKaW5kZXggMWZjMjI2NC4uOWZkOGI4ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZS9BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaApAQCAtNzcsMTIgKzc3LDEyIEBACiAgICAgICogU2V0IHRoZSBpbnB1dCBkZXZpY2UgdG8gYmUgdXNlZCBieSBhbiBpbnB1dCBzb3VyY2UuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIGlucHV0U291cmNlOiBuYW1lIG9mIHRoZSBpbnB1dCBzb3VyY2UgZm9yIHdoaWNoIHRoZSBkZXZpY2UgdG8gdXNlIGhhcyB0byBiZSBzZXQKLSAgICAgKiBAcGFyYW1baW5dIGRldmljZXM7IG1hc2sgb2YgZGV2aWNlcyB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gaW5wdXQgc291cmNlLgorICAgICAqIEBwYXJhbVtpbl0gZGV2aWNlczogbWFzayBvZiBkZXZpY2VzIHRvIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBpbnB1dCBzb3VyY2UuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZXMgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIGlucHV0IHNvdXJjZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHZpcnR1YWwgYm9vbCBzZXREZXZpY2VGb3JJbnB1dFNvdXJjZShjb25zdCBhdWRpb19zb3VyY2VfdCAmaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZGV2aWNlKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpID0gMDsKQEAgLTkxLDEyICs5MSwxMiBAQAogICAgICAqIFNldCB0aGUgZGV2aWNlIHRvIGJlIHVzZWQgYnkgYSBwcm9kdWN0IHN0cmF0ZWd5LgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSBzdHJhdGVneTogbmFtZSBvZiB0aGUgcHJvZHVjdCBzdHJhdGVneSBmb3Igd2hpY2ggdGhlIGRldmljZSB0byB1c2UgaGFzIHRvIGJlIHNldAotICAgICAqIEBwYXJhbVtpbl0gZGV2aWNlczsgbWFzayBvZiBkZXZpY2VzIHRvIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBzdHJhdGVneS4KKyAgICAgKiBAcGFyYW1baW5dIGRldmljZXM6IG1hc2sgb2YgZGV2aWNlcyB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZXMgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIHN0cmF0ZWd5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgdmlydHVhbCBib29sIHNldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZGV2aWNlcykgPSAwOwogCiAgICAgdmlydHVhbCBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5QnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSA9IDA7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbC5pbiBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbC5pbgppbmRleCAyZTlmMzdlLi4yYzRjN2I1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwuaW4KKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sLmluCkBAIC0xMCw4ICsxMCw4IEBACiAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KIAogICAgIDwhLS0gQXV0b21hdGljYWxseSBmaWxsZWQgZnJvbSBhdWRpby1iYXNlLmggZmlsZSAtLT4KLSAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJPdXRwdXREZXZpY2VzTWFzayIgRGVzY3JpcHRpb249IjMydGggYml0IGlzIG5vdCBhbGxvd2VkIGFzIGRlZGljYXRlZCBmb3IgaW5wdXQgZGV2aWNlcyBkZXRlY3Rpb24iPgotICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgorICAgIDxDb21wb25lbnRUeXBlIE5hbWU9Ik91dHB1dERldmljZXNNYXNrIiBEZXNjcmlwdGlvbj0iNjRiaXQgcmVwcmVzZW50YXRpb24gb2YgZGV2aWNlcyI+CisgICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSI2NCI+CiAgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CiAgICAgPC9Db21wb25lbnRUeXBlPgogCkBAIC0xOSw4ICsxOSw4IEBACiAgICAgcHJvZmlsZS4gSXQgbXVzdCBtYXRjaCB3aXRoIHRoZSBJbnB1dCBkZXZpY2UgZW51bSBwYXJhbWV0ZXIuCiAgICAgLS0+CiAgICAgPCEtLSBBdXRvbWF0aWNhbGx5IGZpbGxlZCBmcm9tIGF1ZGlvLWJhc2UuaCBmaWxlIC0tPgotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0RGV2aWNlc01hc2siPgotICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgorICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0RGV2aWNlc01hc2siIERlc2NyaXB0aW9uPSI2NGJpdCByZXByZXNlbnRhdGlvbiBvZiBkZXZpY2VzIj4KKyAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjY0Ij4KICAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KICAgICA8L0NvbXBvbmVudFR5cGU+CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwCmluZGV4IGY4YTZmYzAuLmRmNGUzZTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcApAQCAtNDUsNyArNDUsNyBAQAogCiBib29sIElucHV0U291cmNlOjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGFwcGxpY2FibGVJbnB1dERldmljZTsKKyAgICB1aW50NjRfdCBhcHBsaWNhYmxlSW5wdXREZXZpY2U7CiAgICAgYmxhY2tib2FyZFJlYWQoJmFwcGxpY2FibGVJbnB1dERldmljZSwgc2l6ZW9mKGFwcGxpY2FibGVJbnB1dERldmljZSkpOwogICAgIHJldHVybiBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXREZXZpY2VGb3JJbnB1dFNvdXJjZShtSWQsIGFwcGxpY2FibGVJbnB1dERldmljZSk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmgKaW5kZXggNmM4ZWI2NS4uZTY1OTQ2ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaApAQCAtMzIsNyArMzIsNyBAQAogCiAgICAgc3RydWN0IERldmljZQogICAgIHsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGFwcGxpY2FibGVEZXZpY2U7IC8qKjwgYXBwbGljYWJsZSBkZXZpY2UgZm9yIHRoaXMgc3RyYXRlZ3kuICovCisgICAgICAgIHVpbnQ2NF90IGFwcGxpY2FibGVEZXZpY2U7IC8qKjwgYXBwbGljYWJsZSBkZXZpY2UgZm9yIHRoaXMgc3RyYXRlZ3kuICovCiAgICAgICAgIGNoYXIgZGV2aWNlQWRkcmVzc1ttTWF4U3RyaW5nU2l6ZV07IC8qKjwgZGV2aWNlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RyYXRlZ3kuICovCiAgICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwCmluZGV4IGIwYzM3NmEuLjNkNzQ5MjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAKQEAgLTM2LDYgKzM2LDggQEAKIAogI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KIAorI2luY2x1ZGUgPGNpbnR0eXBlcz4KKwogdXNpbmcgc3RkOjpzdHJpbmc7CiB1c2luZyBzdGQ6Om1hcDsKIApAQCAtMTY2LDE2ICsxNjgsMTMgQEAKIHN0YXR1c190IEVuZ2luZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkKIHsKLSAgICBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgICAgICAgICAgZGV2aWNlLT50eXBlKCksIGRldmljZS0+YWRkcmVzcygpLmNfc3RyKCksIHN0YXRlKTsKKyAgICBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLT50eXBlKCksIGRldmljZS0+YWRkcmVzcygpLCBzdGF0ZSk7CiAgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlLT50eXBlKCkpKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBVc2UgRGV2aWNlVHlwZVNldCB3aGVuIHRoZSBpbnRlcmZhY2UgaXMgcmVhZHkKICAgICAgICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldEF2YWlsYWJsZU91dHB1dERldmljZXMoCi0gICAgICAgICAgICAgICAgICAgIGRldmljZVR5cGVzVG9CaXRNYXNrKGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKS50eXBlcygpKSk7CisgICAgICAgICAgICAgICAgICAgIGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKS50eXBlcygpKTsKICAgICB9IGVsc2UgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UtPnR5cGUoKSkpIHsKLSAgICAgICAgLy8gRklYTUU6IFVzZSBEZXZpY2VUeXBlU2V0IHdoZW4gdGhlIGludGVyZmFjZSBpcyByZWFkeQogICAgICAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKAotICAgICAgICAgICAgICAgICAgICBkZXZpY2VUeXBlc1RvQml0TWFzayhnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKS50eXBlcygpKSk7CisgICAgICAgICAgICAgICAgICAgIGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpLnR5cGVzKCkpOwogICAgIH0KICAgICByZXR1cm4gRW5naW5lQmFzZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUpOwogfQpAQCAtMjk5LDggKzI5OCwxMyBAQAogICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGRldmljZSk7CiAgICAgfQorICAgIHJldHVybiBmcm9tQ2FjaGU/IGdldENhY2hlZERldmljZXMoc3RyYXRlZ3kpIDogZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSk7Cit9CiAKLSAgICByZXR1cm4gZnJvbUNhY2hlPyBtRGV2aWNlc0ZvclN0cmF0ZWdpZXMuYXQoc3RyYXRlZ3kpIDogZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSk7CitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXRDYWNoZWREZXZpY2VzKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3QKK3sKKyAgICByZXR1cm4gbURldmljZXNGb3JTdHJhdGVnaWVzLmZpbmQocHMpICE9IG1EZXZpY2VzRm9yU3RyYXRlZ2llcy5lbmQoKSA/CisgICAgICAgICAgICAgICAgbURldmljZXNGb3JTdHJhdGVnaWVzLmF0KHBzKSA6IERldmljZVZlY3Rvcnt9OwogfQogCiBEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIGZyb21DYWNoZSkgY29uc3QKQEAgLTM2OSwxNyArMzczLDI4IEBACiAgICAgZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5hdChzdHJhdGVneSktPnNldERldmljZUFkZHJlc3MoYWRkcmVzcyk7CiB9CiAKLWJvb2wgRW5naW5lOjpzZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQorYm9vbCBFbmdpbmU6OnNldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgdWludDY0X3QgZGV2aWNlcykKIHsKICAgICBpZiAoZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5maW5kKHN0cmF0ZWd5KSA9PSBnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogc2V0IGRldmljZSAlZCBvbiBpbnZhbGlkIHN0cmF0ZWd5ICVkIiwgX19GVU5DVElPTl9fLCBkZXZpY2VzLCBzdHJhdGVneSk7CisgICAgICAgIEFMT0dFKCIlczogc2V0IGRldmljZSAlIiBQUklkNjQgIiBvbiBpbnZhbGlkIHN0cmF0ZWd5ICVkIiwgX19GVU5DVElPTl9fLCBkZXZpY2VzLCBzdHJhdGVneSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgLy8gRklYTUU6IHN0b3AgdXNpbmcgZGV2aWNlVHlwZXNGcm9tQml0TWFzayB3aGVuIHRoZSBpbnRlcmZhY2UgaXMgcmVhZHkKLSAgICBnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmF0KHN0cmF0ZWd5KS0+c2V0RGV2aWNlVHlwZXMoZGV2aWNlVHlwZXNGcm9tQml0TWFzayhkZXZpY2VzKSk7CisgICAgLy8gSGVyZSBkZXZpY2UgbWF0Y2hlcyB0aGUgY3JpdGVyaW9uIHZhbHVlLCBuZWVkIHRvIHJlYnVpdGQgYW5kcm9pZCBkZXZpY2UgdHlwZXM7CisgICAgRGV2aWNlVHlwZVNldCB0eXBlcyA9CisgICAgICAgICAgICBtUG9saWN5UGFyYW1ldGVyTWdyLT5jb252ZXJ0RGV2aWNlQ3JpdGVyaW9uVmFsdWVUb0RldmljZVR5cGVzKGRldmljZXMsIHRydWUgLyppc091dCovKTsKKyAgICBnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmF0KHN0cmF0ZWd5KS0+c2V0RGV2aWNlVHlwZXModHlwZXMpOwogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIEVuZ2luZTo6c2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoY29uc3QgYXVkaW9fc291cmNlX3QgJmlucHV0U291cmNlLCB1aW50NjRfdCBkZXZpY2UpCit7CisgICAgRGV2aWNlVHlwZVNldCB0eXBlcyA9IG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPmNvbnZlcnREZXZpY2VDcml0ZXJpb25WYWx1ZVRvRGV2aWNlVHlwZXMoCisgICAgICAgICAgICAgICAgZGV2aWNlLCBmYWxzZSAvKmlzT3V0Ki8pOworICAgIEFMT0dfQVNTRVJUKHR5cGVzLnNpemUoKSA8PSAxLCAib25lIGlucHV0IGRldmljZSBleHBlY3RlZCBhdCBtb3N0Iik7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSB0eXBlcy5lbXB0eSgpID8gQVVESU9fREVWSUNFX0lOX0RFRkFVTFQgOiAqdHlwZXMuYmVnaW4oKTsKKyAgICByZXR1cm4gc2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCBhdWRpb19zb3VyY2VfdD4oZGV2aWNlVHlwZSwgaW5wdXRTb3VyY2UpOworfQorCiB0ZW1wbGF0ZSA8PgogRW5naW5lSW50ZXJmYWNlICpFbmdpbmU6OnF1ZXJ5SW50ZXJmYWNlKCkKIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCmluZGV4IGQ4ZTI3NDIuLjRiNTU5ZjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaApAQCAtODIsMTUgKzgyLDEyIEBACiAgICAgYm9vbCBzZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmdm9sdW1lUHJvZmlsZSkgb3ZlcnJpZGU7CiAKLSAgICBib29sIHNldERldmljZUZvcklucHV0U291cmNlKGNvbnN0IGF1ZGlvX3NvdXJjZV90ICZpbnB1dFNvdXJjZSwgYXVkaW9fZGV2aWNlc190IGRldmljZSkgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIHJldHVybiBzZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIGF1ZGlvX3NvdXJjZV90PihkZXZpY2UsIGlucHV0U291cmNlKTsKLSAgICB9CisgICAgYm9vbCBzZXREZXZpY2VGb3JJbnB1dFNvdXJjZShjb25zdCBhdWRpb19zb3VyY2VfdCAmaW5wdXRTb3VyY2UsIHVpbnQ2NF90IGRldmljZSkgb3ZlcnJpZGU7CisKICAgICB2b2lkIHNldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSBvdmVycmlkZTsKIAotICAgIGJvb2wgc2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykgb3ZlcnJpZGU7CisgICAgYm9vbCBzZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIHVpbnQ2NF90IGRldmljZXMpIG92ZXJyaWRlOwogCiAgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgb3ZlcnJpZGUKICAgICB7CkBAIC0xMjYsNiArMTIzLDcgQEAKICAgICBzdGF0dXNfdCBsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKTsKIAogICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3Q7CisgICAgRGV2aWNlVmVjdG9yIGdldENhY2hlZERldmljZXMocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIFBvbGljeSBQYXJhbWV0ZXIgTWFuYWdlciBoaWRkZW4gdGhyb3VnaCBhIHdyYXBwZXIuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwCmluZGV4IGY0NjQ1ZTYuLjZmZDJiNzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwCkBAIC0yNiw3ICsyNiw4IEBACiBzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3NvdXJjZV90Pjo6c2V0SWRlbnRpZmllcihhdWRpb19zb3VyY2VfdCBpZGVudGlmaWVyKQogewogICAgIGlmIChpZGVudGlmaWVyID4gQVVESU9fU09VUkNFX01BWCAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9IT1RXT1JECi0gICAgICAgICYmIGlkZW50aWZpZXIgIT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSICYmIGlkZW50aWZpZXIgIT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSB7CisgICAgICAgICYmIGlkZW50aWZpZXIgIT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSICYmIGlkZW50aWZpZXIgIT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFCisgICAgICAgICYmIGlkZW50aWZpZXIgIT0gQVVESU9fU09VUkNFX1VMVFJBU09VTkQpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgbUlkZW50aWZpZXIgPSBpZGVudGlmaWVyOwpAQCAtNDYsMTIgKzQ3LDYgQEAKIHRlbXBsYXRlIDw+CiBzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3NvdXJjZV90Pjo6c2V0KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQogewotICAgIGlmIChkZXZpY2VzID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIC8vIFJlc2V0Ci0gICAgICAgIG1BcHBsaWNhYmxlRGV2aWNlcyA9IGRldmljZXM7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgZGV2aWNlcyA9IHN0YXRpY19jYXN0PGF1ZGlvX2RldmljZXNfdD4oZGV2aWNlcyB8IEFVRElPX0RFVklDRV9CSVRfSU4pOwogICAgIGlmICghYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZXMpKSB7CiAgICAgICAgIEFMT0dFKCIlczogdHJ5aW5nIHRvIHNldCBhbiBpbnZhbGlkIGRldmljZSAweCVYIGZvciBpbnB1dCBzb3VyY2UgJXMiLAogICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZXMsIGdldE5hbWUoKS5jX3N0cigpKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZENvbW1vblR5cGVzU3RydWN0dXJlRmlsZS5weSBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZENvbW1vblR5cGVzU3RydWN0dXJlRmlsZS5weQppbmRleCA0M2IzZGQyLi44NmFjNzZmIDEwMDc1NQotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRDb21tb25UeXBlc1N0cnVjdHVyZUZpbGUucHkKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkQ29tbW9uVHlwZXNTdHJ1Y3R1cmVGaWxlLnB5CkBAIC01NSw3ICs1NSw3IEBACiAgICAgd2hpbGUgaSA8IGRlY2ltYWw6CiAgICAgICAgIGkgPSBpIDw8IDEKICAgICAgICAgcG9zID0gcG9zICsgMQotICAgICAgICBpZiBwb3MgPT0gMzI6CisgICAgICAgIGlmIHBvcyA9PSA2NDoKICAgICAgICAgICAgIHJldHVybiAtMQogCiAgICAgIyBUT0RPOiBiLzE2ODA2NTcwNi4gVGhpcyBpcyBqdXN0IHRvIGZpeCB0aGUgYnVpbGQuIFRoYXQgdGhlIHByb2JsZW0gb2YgZGV2aWNlcyB3aXRoCkBAIC0xMzIsNiArMTMyLDkgQEAKIAogICAgIGxvZ2dpbmcuaW5mbygiQ2hlY2tpbmcgQW5kcm9pZCBIZWFkZXIgZmlsZSB7fSIuZm9ybWF0KGFuZHJvaWRhdWRpb2Jhc2VoZWFkZXJGaWxlKSkKIAorICAgIG11bHRpX2JpdF9vdXRwdXRfZGV2aWNlX3NoaWZ0ID0gMzIKKyAgICBtdWx0aV9iaXRfaW5wdXRfZGV2aWNlX3NoaWZ0ID0gMzIKKwogICAgIGZvciBsaW5lX251bWJlciwgbGluZSBpbiBlbnVtZXJhdGUoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUpOgogICAgICAgICBtYXRjaCA9IGNyaXRlcmlhX3BhdHRlcm4ubWF0Y2gobGluZSkKICAgICAgICAgaWYgbWF0Y2g6CkBAIC0xNDMsMTYgKzE0NiwzNiBAQAogCiAgICAgICAgICAgICBjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUgPSBtYXRjaC5ncm91cGRpY3QoKVsndmFsdWVzJ10KIAotICAgICAgICAgICAgIyBmb3IgQVVESU9fREVWSUNFX0lOOiBuZWVkIHRvIHJlbW92ZSBzaWduIGJpdCAvIHJlbmFtZSBkZWZhdWx0IHRvIHN0dWIKKyAgICAgICAgICAgICMgZm9yIEFVRElPX0RFVklDRV9JTjogcmVuYW1lIGRlZmF1bHQgdG8gc3R1YgogICAgICAgICAgICAgaWYgY29tcG9uZW50X3R5cGVfbmFtZSA9PSAiSW5wdXREZXZpY2VzTWFzayI6Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlID0gc3RyKGludChjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUsIDApICYgfjIxNDc0ODM2NDgpCisgICAgICAgICAgICAgICAgY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlID0gc3RyKGludChjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUsIDApKQogICAgICAgICAgICAgICAgIGlmIGNvbXBvbmVudF90eXBlX2xpdGVyYWwgPT0gImRlZmF1bHQiOgogICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfdHlwZV9saXRlcmFsID0gInN0dWIiCiAKKyAgICAgICAgICAgICAgICBzdHJpbmdfaW50ID0gaW50KGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSwgMCkKKyAgICAgICAgICAgICAgICBudW1fYml0cyA9IGJpbihzdHJpbmdfaW50KS5jb3VudCgiMSIpCisgICAgICAgICAgICAgICAgaWYgbnVtX2JpdHMgPiAxOgorICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIlRoZSB2YWx1ZSB7fSBpcyBmb3IgY3JpdGVyaW9uIHt9IGJpbmFyeSByZXAge30gaGFzIHt9IGJpdHMgc2V0cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlLCBjb21wb25lbnRfdHlwZV9uYW1lLCBiaW4oc3RyaW5nX2ludCksIG51bV9iaXRzKSkKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2ludCA9IDIqKm11bHRpX2JpdF9pbnB1dF9kZXZpY2Vfc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJuZXcgdmFsIGFzc2lnbmVkIGlzIHt9IHt9IiAuZm9ybWF0KHN0cmluZ19pbnQsIGJpbihzdHJpbmdfaW50KSkpCisgICAgICAgICAgICAgICAgICAgIG11bHRpX2JpdF9pbnB1dF9kZXZpY2Vfc2hpZnQgKz0gMQorICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUgPSBzdHIoc3RyaW5nX2ludCkKKwogICAgICAgICAgICAgaWYgY29tcG9uZW50X3R5cGVfbmFtZSA9PSAiT3V0cHV0RGV2aWNlc01hc2siOgogICAgICAgICAgICAgICAgIGlmIGNvbXBvbmVudF90eXBlX2xpdGVyYWwgPT0gImRlZmF1bHQiOgogICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfdHlwZV9saXRlcmFsID0gInN0dWIiCiAKKyAgICAgICAgICAgICAgICBzdHJpbmdfaW50ID0gaW50KGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSwgMCkKKyAgICAgICAgICAgICAgICBudW1fYml0cyA9IGJpbihzdHJpbmdfaW50KS5jb3VudCgiMSIpCisgICAgICAgICAgICAgICAgaWYgbnVtX2JpdHMgPiAxOgorICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIlRoZSB2YWx1ZSB7fSBpcyBmb3IgY3JpdGVyaW9uIHt9IGJpbmFyeSByZXAge30gaGFzIHt9IGJpdHMgc2V0cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlLCBjb21wb25lbnRfdHlwZV9uYW1lLCBiaW4oc3RyaW5nX2ludCksIG51bV9iaXRzKSkKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2ludCA9IDIqKm11bHRpX2JpdF9vdXRwdXRfZGV2aWNlX3NoaWZ0CisgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygibmV3IHZhbCBhc3NpZ25lZCBpcyB7fSB7fSIgLmZvcm1hdChzdHJpbmdfaW50LCBiaW4oc3RyaW5nX2ludCkpKQorICAgICAgICAgICAgICAgICAgICBtdWx0aV9iaXRfb3V0cHV0X2RldmljZV9zaGlmdCArPSAxCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSA9IHN0cihzdHJpbmdfaW50KQorCiAgICAgICAgICAgICAjIFJlbW92ZSBkdXBsaWNhdGVkIG51bWVyaWNhbCB2YWx1ZXMKICAgICAgICAgICAgIGlmIGludChjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUsIDApIGluIGFsbF9jb21wb25lbnRfdHlwZXNbY29tcG9uZW50X3R5cGVfbmFtZV0udmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJUaGUgdmFsdWUge306e30gaXMgZHVwbGljYXRlZCBmb3IgY3JpdGVyaW9uIHt9LCBLRUVQSU5HIExBVEVTVCIuZm9ybWF0KGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSwgY29tcG9uZW50X3R5cGVfbGl0ZXJhbCwgY29tcG9uZW50X3R5cGVfbmFtZSkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weSBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5CmluZGV4IDc2YzM1YzEuLmExNWE2YmEgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5CisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5CkBAIC04NSw2ICs4NSw5IEBACiAgICAgcmV0dXJuIGFyZ3BhcnNlci5wYXJzZV9hcmdzKCkKIAogCitvdXRwdXRfZGV2aWNlc190eXBlX3ZhbHVlID0ge30KK2lucHV0X2RldmljZXNfdHlwZV92YWx1ZSA9IHt9CisKIGRlZiBnZW5lcmF0ZVhtbENyaXRlcmlvblR5cGVzRmlsZShjcml0ZXJpb25UeXBlcywgYWRkcmVzc0NyaXRlcmlhLCBjcml0ZXJpb25UeXBlc0ZpbGUsIG91dHB1dEZpbGUpOgogCiAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uVHlwZXNGaWxlIHt9Ii5mb3JtYXQoY3JpdGVyaW9uVHlwZXNGaWxlKSkKQEAgLTEwMiw2ICsxMDUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ251bWVyaWNhbCcsIHN0cih2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdsaXRlcmFsJywga2V5KQogCisgICAgICAgICAgICAgICAgICAgIGlmIGNyaXRlcmlvbl90eXBlLmdldCgnbmFtZScpID09ICJPdXRwdXREZXZpY2VzTWFza1R5cGUiOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ2FuZHJvaWRfdHlwZScsIG91dHB1dF9kZXZpY2VzX3R5cGVfdmFsdWVba2V5XSkKKyAgICAgICAgICAgICAgICAgICAgaWYgY3JpdGVyaW9uX3R5cGUuZ2V0KCduYW1lJykgPT0gIklucHV0RGV2aWNlc01hc2tUeXBlIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdhbmRyb2lkX3R5cGUnLCBpbnB1dF9kZXZpY2VzX3R5cGVfdmFsdWVba2V5XSkKKwogICAgIGlmIGFkZHJlc3NDcml0ZXJpYToKICAgICAgICAgZm9yIGNyaXRlcmlvbl9uYW1lLCB2YWx1ZXNfbGlzdCBpbiBhZGRyZXNzQ3JpdGVyaWEuaXRlbXMoKToKICAgICAgICAgICAgIGZvciBjcml0ZXJpb25fdHlwZSBpbiBjcml0ZXJpb25fdHlwZXNfcm9vdC5maW5kYWxsKCdjcml0ZXJpb25fdHlwZScpOgpAQCAtMjAwLDEwICsyMDgsOCBAQAogICAgICMKICAgICBpZ25vcmVkX3ZhbHVlcyA9IFsnQ05UJywgJ01BWCcsICdBTEwnLCAnTk9ORSddCiAKLSAgICAjCi0gICAgIyBSZWFjaGluZyAzMiBiaXQgbGltaXQgZm9yIGluY2x1c2l2ZSBjcml0ZXJpb24gb3V0IGRldmljZXM6IHJlbW92aW5nCi0gICAgIwotICAgIGlnbm9yZWRfb3V0cHV0X2RldmljZV92YWx1ZXMgPSBbJ0JsZVNwZWFrZXInLCAnQmxlSGVhZHNldCddCisgICAgbXVsdGlfYml0X291dHB1dGRldmljZV9zaGlmdCA9IDMyCisgICAgbXVsdGlfYml0X2lucHV0ZGV2aWNlX3NoaWZ0ID0gMzIKIAogICAgIGNyaXRlcmlhX3BhdHRlcm4gPSByZS5jb21waWxlKAogICAgICAgICByIlxzKlZcKCg/UDx0eXBlPig/OiIrJ3wnLmpvaW4oY3JpdGVyaW9uX21hcHBpbmdfdGFibGUua2V5cygpKSArICIpKV8iIFwKQEAgLTIyMywyOCArMjI5LDU5IEBACiAgICAgICAgICAgICAgICAgJycuam9pbigody5jYXBpdGFsaXplKCkgZm9yIHcgaW4gbWF0Y2guZ3JvdXBkaWN0KClbJ2xpdGVyYWwnXS5zcGxpdCgnXycpKSkKICAgICAgICAgICAgIGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUgPSBtYXRjaC5ncm91cGRpY3QoKVsndmFsdWVzJ10KIAotICAgICAgICAgICAgIyBmb3IgQVVESU9fREVWSUNFX0lOOiBuZWVkIHRvIHJlbW92ZSBzaWduIGJpdCAvIHJlbmFtZSBkZWZhdWx0IHRvIHN0dWIKKyAgICAgICAgICAgICMgZm9yIEFVRElPX0RFVklDRV9JTjogcmVuYW1lIGRlZmF1bHQgdG8gc3R1YgogICAgICAgICAgICAgaWYgY3JpdGVyaW9uX25hbWUgPT0gIklucHV0RGV2aWNlc01hc2tUeXBlIjoKICAgICAgICAgICAgICAgICBpZiBjcml0ZXJpb25fbGl0ZXJhbCA9PSAiRGVmYXVsdCI6CiAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUgPSBzdHIoaW50KCIweDQwMDAwMDAwIiwgMCkpCisgICAgICAgICAgICAgICAgICAgIGlucHV0X2RldmljZXNfdHlwZV92YWx1ZVtjcml0ZXJpb25fbGl0ZXJhbF0gPSAiMHhDMDAwMDAwMCIKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfaW50ID0gaW50KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIDApCisgICAgICAgICAgICAgICAgICAgICAgICAjIEFwcGVuZCBBVURJT19ERVZJQ0VfSU4gZm9yIGFuZHJvaWQgdHlwZSB0YWcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2RldmljZXNfdHlwZV92YWx1ZVtjcml0ZXJpb25fbGl0ZXJhbF0gPSBoZXgoc3RyaW5nX2ludCB8IDIxNDc0ODM2NDgpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bV9iaXRzID0gYmluKHN0cmluZ19pbnQpLmNvdW50KCIxIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG51bV9iaXRzID4gMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIlRoZSB2YWx1ZSB7fTp7fSBpcyBmb3IgY3JpdGVyaW9uIHt9IGJpbmFyeSByZXAge30gaGFzIHt9IGJpdHMgc2V0cyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCBjcml0ZXJpb25fbGl0ZXJhbCwgY3JpdGVyaW9uX25hbWUsIGJpbihzdHJpbmdfaW50KSwgbnVtX2JpdHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19pbnQgPSAyKiptdWx0aV9iaXRfaW5wdXRkZXZpY2Vfc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIm5ldyB2YWwgYXNzaWduZWQgaXMge30ge30iIC5mb3JtYXQoc3RyaW5nX2ludCwgYmluKHN0cmluZ19pbnQpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aV9iaXRfaW5wdXRkZXZpY2Vfc2hpZnQgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUgPSBzdHIoc3RyaW5nX2ludCkKKwogICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIHRoZSBleGNlcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygidmFsdWUge306e30gZm9yIGNyaXRlcmlvbiB7fSBpcyBub3QgYSBudW1iZXIsIGlnbm9yaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgY3JpdGVyaW9uX2xpdGVyYWwsIGNyaXRlcmlvbl9uYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUgPSBzdHIoaW50KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIDApICYgfjIxNDc0ODM2NDgpCiAKICAgICAgICAgICAgIGlmIGNyaXRlcmlvbl9uYW1lID09ICJPdXRwdXREZXZpY2VzTWFza1R5cGUiOgogICAgICAgICAgICAgICAgIGlmIGNyaXRlcmlvbl9saXRlcmFsID09ICJEZWZhdWx0IjoKICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSA9IHN0cihpbnQoIjB4NDAwMDAwMDAiLCAwKSkKLSAgICAgICAgICAgICAgICBpZiBjcml0ZXJpb25fbGl0ZXJhbCBpbiBpZ25vcmVkX291dHB1dF9kZXZpY2VfdmFsdWVzOgotICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIk91dHB1dERldmljZXNNYXNrVHlwZSBza2lwcGluZyB7fSIuZm9ybWF0KGNyaXRlcmlvbl9saXRlcmFsKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RldmljZXNfdHlwZV92YWx1ZVtjcml0ZXJpb25fbGl0ZXJhbF0gPSAiMHg0MDAwMDAwMCIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfaW50ID0gaW50KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIDApCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGV2aWNlc190eXBlX3ZhbHVlW2NyaXRlcmlvbl9saXRlcmFsXSA9IGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUKKworICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2JpdHMgPSBiaW4oc3RyaW5nX2ludCkuY291bnQoIjEiKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnVtX2JpdHMgPiAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiVGhlIHZhbHVlIHt9Ont9IGlzIGZvciBjcml0ZXJpb24ge30gYmluYXJ5IHJlcCB7fSBoYXMge30gYml0cyBzZXRzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIGNyaXRlcmlvbl9saXRlcmFsLCBjcml0ZXJpb25fbmFtZSwgYmluKHN0cmluZ19pbnQpLCBudW1fYml0cykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2ludCA9IDIqKm11bHRpX2JpdF9vdXRwdXRkZXZpY2Vfc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIm5ldyB2YWwgYXNzaWduZWQgaXMge30ge30iIC5mb3JtYXQoc3RyaW5nX2ludCwgYmluKHN0cmluZ19pbnQpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aV9iaXRfb3V0cHV0ZGV2aWNlX3NoaWZ0ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlID0gc3RyKHN0cmluZ19pbnQpCisKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAjIEhhbmRsZSB0aGUgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIlRoZSB2YWx1ZSB7fTp7fSBpcyBmb3IgY3JpdGVyaW9uIHt9IGlzIG5vdCBhIG51bWJlciwgaWdub3JpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCBjcml0ZXJpb25fbGl0ZXJhbCwgY3JpdGVyaW9uX25hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKwogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHN0cmluZ19pbnQgPSBpbnQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgMCkKKwogICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgIyBIYW5kbGUgdGhlIGV4Y2VwdGlvbgogICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiVGhlIHZhbHVlIHt9Ont9IGlzIGZvciBjcml0ZXJpb24ge30gaXMgbm90IGEgbnVtYmVyLCBpZ25vcmluZyIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLmJwCmluZGV4IDNlMDRiNjguLjBlZjBiODIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5icApAQCAtMTksNiArMTksNyBAQAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAogICAgICAgICAibGliYXVkaW9wb2xpY3ljb21tb24iLAorICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uX2hlYWRlcnMiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKaW5kZXggNjM5OTBhYy4uMDk5ZDU1ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPFNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2NvbnZlcnQuaD4KICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KICNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPGZzdHJlYW0+CkBAIC0zMSw2ICszMiw3IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxjaW50dHlwZXM+CiAjaW5jbHVkZSA8Y21hdGg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTEyNCw5ICsxMjYsMjIgQEAKIAogICAgIGZvciAoYXV0byBwYWlyIDogcGFpcnMpIHsKICAgICAgICAgc3RkOjpzdHJpbmcgZXJyb3I7Ci0gICAgICAgIEFMT0dWKCIlczogQWRkaW5nIHBhaXIgJWQsJXMgZm9yIGNyaXRlcmlvblR5cGUgJXMiLCBfX0ZVTkNUSU9OX18sIHBhaXIuZmlyc3QsCi0gICAgICAgICAgICAgIHBhaXIuc2Vjb25kLmNfc3RyKCksIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgIGNyaXRlcmlvblR5cGUtPmFkZFZhbHVlUGFpcihwYWlyLmZpcnN0LCBwYWlyLnNlY29uZCwgZXJyb3IpOworICAgICAgICBBTE9HVigiJXM6IEFkZGluZyBwYWlyICUiIFBSSXU2NCIsICVzIGZvciBjcml0ZXJpb25UeXBlICVzIiwgX19mdW5jX18sIHN0ZDo6Z2V0PDA+KHBhaXIpLAorICAgICAgICAgICAgICBzdGQ6OmdldDwyPihwYWlyKS5jX3N0cigpLCBuYW1lLmNfc3RyKCkpOworICAgICAgICBjcml0ZXJpb25UeXBlLT5hZGRWYWx1ZVBhaXIoc3RkOjpnZXQ8MD4ocGFpciksIHN0ZDo6Z2V0PDI+KHBhaXIpLCBlcnJvcik7CisKKyAgICAgICAgaWYgKG5hbWUgPT0gZ091dHB1dERldmljZUNyaXRlcmlvbk5hbWUpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQWRkaW5nIG1PdXRwdXREZXZpY2VUb0NyaXRlcmlvblR5cGVNYXAgJWQgJSIgUFJJdTY0IiBmb3IgY3JpdGVyaW9uVHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RkOjpnZXQ8MT4ocGFpciksIHN0ZDo6Z2V0PDA+KHBhaXIpLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGFuZHJvaWRUeXBlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihzdGQ6OmdldDwxPihwYWlyKSk7CisgICAgICAgICAgICBtT3V0cHV0RGV2aWNlVG9Dcml0ZXJpb25UeXBlTWFwW2FuZHJvaWRUeXBlXSA9IHN0ZDo6Z2V0PDA+KHBhaXIpOworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lID09IGdJbnB1dERldmljZUNyaXRlcmlvbk5hbWUpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQWRkaW5nIG1JbnB1dERldmljZVRvQ3JpdGVyaW9uVHlwZU1hcCAlZCAlIiBQUkl1NjQiIGZvciBjcml0ZXJpb25UeXBlICVzIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdGQ6OmdldDwxPihwYWlyKSwgc3RkOjpnZXQ8MD4ocGFpciksIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYW5kcm9pZFR5cGUgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHN0ZDo6Z2V0PDE+KHBhaXIpKTsKKyAgICAgICAgICAgIG1JbnB1dERldmljZVRvQ3JpdGVyaW9uVHlwZU1hcFthbmRyb2lkVHlwZV0gPSBzdGQ6OmdldDwwPihwYWlyKTsKKyAgICAgICAgfQogICAgIH0KICAgICBBTE9HX0FTU0VSVChtUG9saWN5Q3JpdGVyaWEuZmluZChuYW1lKSA9PSBtUG9saWN5Q3JpdGVyaWEuZW5kKCksCiAgICAgICAgICAgICAgICAgIiVzOiBDcml0ZXJpb24gJXMgYWxyZWFkeSBhZGRlZCIsIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpKTsKQEAgLTEzNSw3ICsxNTAsNyBAQAogICAgIG1Qb2xpY3lDcml0ZXJpYVtuYW1lXSA9IGNyaXRlcmlvbjsKIAogICAgIGlmIChub3QgZGVmYXVsdFZhbHVlLmVtcHR5KCkpIHsKLSAgICAgICAgaW50IG51bWVyaWNhbFZhbHVlID0gMDsKKyAgICAgICAgdWludDY0X3QgbnVtZXJpY2FsVmFsdWUgPSAwOwogICAgICAgICBpZiAobm90IGNyaXRlcmlvblR5cGUtPmdldE51bWVyaWNhbFZhbHVlKGRlZmF1bHRWYWx1ZS5jX3N0cigpLCBudW1lcmljYWxWYWx1ZSkpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczsgdHJ5aW5nIHRvIGFwcGx5IGludmFsaWQgZGVmYXVsdCBsaXRlcmFsIHZhbHVlICglcykiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUuY19zdHIoKSk7CkBAIC0yNjMsNyArMjc4LDcgQEAKIH0KIAogc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nIGFkZHJlc3MsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzLCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCiB7CiAgICAgc3RkOjpzdHJpbmcgY3JpdGVyaW9uTmFtZSA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkgPwogICAgICAgICAgICAgICAgIGdPdXRwdXREZXZpY2VBZGRyZXNzQ3JpdGVyaW9uTmFtZSA6IGdJbnB1dERldmljZUFkZHJlc3NDcml0ZXJpb25OYW1lOwpAQCAtMjc5LDcgKzI5NCw3IEBACiAgICAgfQogCiAgICAgYXV0byBjcml0ZXJpb25UeXBlID0gY3JpdGVyaW9uLT5nZXRDcml0ZXJpb25UeXBlKCk7Ci0gICAgaW50IGRldmljZUFkZHJlc3NJZDsKKyAgICB1aW50NjRfdCBkZXZpY2VBZGRyZXNzSWQ7CiAgICAgaWYgKG5vdCBjcml0ZXJpb25UeXBlLT5nZXROdW1lcmljYWxWYWx1ZShhZGRyZXNzLmNfc3RyKCksIGRldmljZUFkZHJlc3NJZCkpIHsKICAgICAgICAgQUxPR1coIiVzOiB1bmtub3duIGRldmljZSBhZGRyZXNzIHJlcG9ydGVkICglcykgZm9yIGNyaXRlcmlvbiAlcyIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgYWRkcmVzcy5jX3N0cigpLCBjcml0ZXJpb25OYW1lLmNfc3RyKCkpOwpAQCAtMjk2LDI4ICszMTEsMjggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzZXRBdmFpbGFibGVJbnB1dERldmljZXMoYXVkaW9fZGV2aWNlc190IGlucHV0RGV2aWNlcykKK3N0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzZXRBdmFpbGFibGVJbnB1dERldmljZXMoY29uc3QgRGV2aWNlVHlwZVNldCAmdHlwZXMpCiB7CiAgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KICAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ0lucHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSwgbVBvbGljeUNyaXRlcmlhKTsKICAgICBpZiAoY3JpdGVyaW9uID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnSW5wdXREZXZpY2VDcml0ZXJpb25OYW1lKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19mdW5jX18sIGdJbnB1dERldmljZUNyaXRlcmlvbk5hbWUpOwogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQotICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUoaW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pOworICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUoY29udmVydERldmljZVR5cGVzVG9Dcml0ZXJpb25WYWx1ZSh0eXBlcykpOwogICAgIGFwcGx5UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlcykKK3N0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKGNvbnN0IERldmljZVR5cGVTZXQgJnR5cGVzKQogewogICAgIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9CiAgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdPdXRwdXREZXZpY2VDcml0ZXJpb25OYW1lLCBtUG9saWN5Q3JpdGVyaWEpOwogICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdPdXRwdXREZXZpY2VDcml0ZXJpb25OYW1lKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19mdW5jX18sIGdPdXRwdXREZXZpY2VDcml0ZXJpb25OYW1lKTsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KLSAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKG91dHB1dERldmljZXMpOworICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUoY29udmVydERldmljZVR5cGVzVG9Dcml0ZXJpb25WYWx1ZSh0eXBlcykpOwogICAgIGFwcGx5UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMzI3LDUgKzM0Miw0NSBAQAogICAgIG1QZndDb25uZWN0b3ItPmFwcGx5Q29uZmlndXJhdGlvbnMoKTsKIH0KIAordWludDY0X3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmNvbnZlcnREZXZpY2VUeXBlVG9Dcml0ZXJpb25WYWx1ZShhdWRpb19kZXZpY2VzX3QgdHlwZSkgY29uc3QgeworICAgIGJvb2wgaXNPdXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh0eXBlKTsKKyAgICB1aW50MzJfdCB0eXBlTWFzayA9IGlzT3V0ID8gdHlwZSA6ICh0eXBlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pOworCisgICAgY29uc3QgYXV0byAmYWRhcHRlcnMgPSBpc091dCA/IG1PdXRwdXREZXZpY2VUb0NyaXRlcmlvblR5cGVNYXAgOiBtSW5wdXREZXZpY2VUb0NyaXRlcmlvblR5cGVNYXA7CisgICAgLy8gT25seSBtdWx0aWJpdCBkZXZpY2VzIG5lZWQgYWRhcHRhdGlvbi4KKyAgICBpZiAocG9wY291bnQodHlwZU1hc2spID4gMSkgeworICAgICAgICBjb25zdCBhdXRvICZhZGFwdGVyID0gYWRhcHRlcnMuZmluZCh0eXBlKTsKKyAgICAgICAgaWYgKGFkYXB0ZXIgIT0gYWRhcHRlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogbXVsdGliaXQgZGV2aWNlICVkIGNvbnZlcnRlZCB0byBjcml0ZXJpb24gJSIgUFJJdTY0LCBfX2Z1bmNfXywgdHlwZSwKKyAgICAgICAgICAgICAgICAgIGFkYXB0ZXItPnNlY29uZCk7CisgICAgICAgICAgICByZXR1cm4gYWRhcHRlci0+c2Vjb25kOworICAgICAgICB9CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGZpbmQgbWFwIGZvciBtdWx0aWJpdCBkZXZpY2UgJWQiLCBfX2Z1bmNfXywgdHlwZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gdHlwZU1hc2s7Cit9CisKK3VpbnQ2NF90IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpjb252ZXJ0RGV2aWNlVHlwZXNUb0NyaXRlcmlvblZhbHVlKAorICAgICAgICBjb25zdCBEZXZpY2VUeXBlU2V0ICZ0eXBlcykgY29uc3QgeworICAgIHVpbnQ2NF90IGNyaXRlcmlvblZhbHVlID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnR5cGUgOiB0eXBlcykgeworICAgICAgICBjcml0ZXJpb25WYWx1ZSArPSBjb252ZXJ0RGV2aWNlVHlwZVRvQ3JpdGVyaW9uVmFsdWUodHlwZSk7CisgICAgfQorICAgIHJldHVybiBjcml0ZXJpb25WYWx1ZTsKK30KKworRGV2aWNlVHlwZVNldCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6Y29udmVydERldmljZUNyaXRlcmlvblZhbHVlVG9EZXZpY2VUeXBlcygKKyAgICAgICAgdWludDY0X3QgY3JpdGVyaW9uVmFsdWUsIGJvb2wgaXNPdXQpIGNvbnN0IHsKKyAgICBEZXZpY2VUeXBlU2V0IGRldmljZVR5cGVzOworICAgIGNvbnN0IGF1dG8gJmFkYXB0ZXJzID0gaXNPdXQgPyBtT3V0cHV0RGV2aWNlVG9Dcml0ZXJpb25UeXBlTWFwIDogbUlucHV0RGV2aWNlVG9Dcml0ZXJpb25UeXBlTWFwOworICAgIGZvciAoY29uc3QgYXV0byAmYWRhcHRlciA6IGFkYXB0ZXJzKSB7CisgICAgICAgIGlmICgoYWRhcHRlci5zZWNvbmQgJiBjcml0ZXJpb25WYWx1ZSkgPT0gYWRhcHRlci5zZWNvbmQpIHsKKyAgICAgICAgICAgIGRldmljZVR5cGVzLmluc2VydChhZGFwdGVyLmZpcnN0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlVHlwZXM7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oCmluZGV4IDYyYjEyOWEuLmZhNGFlMWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2luY2x1ZGUvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmgKQEAgLTE2LDYgKzE2LDcgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbnRhaW5lcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CkBAIC0zNSw3ICszNiw4IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKIAotdXNpbmcgVmFsdWVQYWlyID0gc3RkOjpwYWlyPHVpbnQzMl90LCBzdGQ6OnN0cmluZz47Cit1c2luZyBWYWx1ZVBhaXIgPSBzdGQ6OnR1cGxlPHVpbnQ2NF90LCB1aW50MzJfdCwgc3RkOjpzdHJpbmc+OwordXNpbmcgRGV2aWNlVG9Dcml0ZXJpb25UeXBlQWRhcHRlciA9IHN0ZDo6bWFwPGF1ZGlvX2RldmljZXNfdCwgdWludDY0X3Q+OwogdXNpbmcgVmFsdWVQYWlycyA9IHN0ZDo6dmVjdG9yPFZhbHVlUGFpcj47CiAKIGNsYXNzIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyCkBAIC0xMDUsNyArMTA3LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgZGV2aWNlcyBjcml0ZXJpb24gdXBkYXRlZCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgogICAgICAqLwotICAgIHN0YXR1c190IHNldEF2YWlsYWJsZUlucHV0RGV2aWNlcyhhdWRpb19kZXZpY2VzX3QgaW5wdXREZXZpY2VzKTsKKyAgICBzdGF0dXNfdCBzZXRBdmFpbGFibGVJbnB1dERldmljZXMoY29uc3QgRGV2aWNlVHlwZVNldCAmaW5wdXREZXZpY2VUeXBlcyk7CiAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcyBpLmUuIHNldCB0aGUgYXNzb2NpYXRlZCBwb2xpY3kgcGFyYW1ldGVyIGZyYW1ld29yayBjcml0ZXJpb24KQEAgLTExNCw3ICsxMTYsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBOT19FUlJPUiBpZiBkZXZpY2VzIGNyaXRlcmlvbiB1cGRhdGVkIGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgc3RhdHVzX3Qgc2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlcyk7CisgICAgc3RhdHVzX3Qgc2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhjb25zdCBEZXZpY2VUeXBlU2V0ICZvdXRwdXREZXZpY2VUeXBlcyk7CiAKICAgICAvKioKICAgICAgKiBAYnJpZWYgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlIHByb3BhZ2F0ZXMgYSBzdGF0ZSBldmVudCBvbiBhIGdpdmVuIGRldmljZShzKQpAQCAtMTI0LDcgKzEyNiw3IEBACiAgICAgICogQHJldHVybiBOT19FUlJPUiBpZiBuZXcgc3RhdGUgY29ycmV0bHkgcHJvcGFnYXRlZCB0byBFbmdpbmUgUGFyYW1ldGVyLUZyYW1ld29yaywgZXJyb3IKICAgICAgKiBjb2RlIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nIGFkZHJlc3MsCisgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKTsKIAogICAgIC8qKgpAQCAtMTM4LDYgKzE0MCwxMyBAQAogICAgIHN0YXR1c190IGFkZENyaXRlcmlvbihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYm9vbCBpc0luY2x1c2l2ZSwgVmFsdWVQYWlycyBwYWlycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmRlZmF1bHRWYWx1ZSk7CiAKKyAgICB1aW50NjRfdCBjb252ZXJ0RGV2aWNlVHlwZVRvQ3JpdGVyaW9uVmFsdWUoYXVkaW9fZGV2aWNlc190IHR5cGUpIGNvbnN0OworCisgICAgdWludDY0X3QgY29udmVydERldmljZVR5cGVzVG9Dcml0ZXJpb25WYWx1ZShjb25zdCBEZXZpY2VUeXBlU2V0ICZ0eXBlcykgY29uc3Q7CisKKyAgICBEZXZpY2VUeXBlU2V0IGNvbnZlcnREZXZpY2VDcml0ZXJpb25WYWx1ZVRvRGV2aWNlVHlwZXMoCisgICAgICAgICAgICB1aW50NjRfdCBjcml0ZXJpb25WYWx1ZSwgYm9vbCBpc091dCkgY29uc3Q7CisKIHByaXZhdGU6CiAgICAgLyoqCiAgICAgICogQXBwbHkgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBsYXRmb3JtIG9uIHRoZSBwb2xpY3kgcGFyYW1ldGVyIG1hbmFnZXIuCkBAIC0yMTEsNiArMjIwLDkgQEAKICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgICBzdHJ1Y3QgcGFyYW1ldGVyTWFuYWdlckVsZW1lbnRTdXBwb3J0ZWQ7CiAKKyAgICBEZXZpY2VUb0NyaXRlcmlvblR5cGVBZGFwdGVyIG1PdXRwdXREZXZpY2VUb0NyaXRlcmlvblR5cGVNYXA7CisgICAgRGV2aWNlVG9Dcml0ZXJpb25UeXBlQWRhcHRlciBtSW5wdXREZXZpY2VUb0NyaXRlcmlvblR5cGVNYXA7CisKICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVBvbGljeVBmd0RlZmF1bHRDb25mRmlsZU5hbWU7IC8qKjwgRGVmYXVsdCBQb2xpY3kgUEZXIHRvcCBmaWxlIG5hbWUuKi8KICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVBvbGljeVBmd1ZlbmRvckNvbmZGaWxlTmFtZTsgLyoqPCBWZW5kb3IgUG9saWN5IFBGVyB0b3AgZmlsZSBuYW1lLiovCiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLmJwCmluZGV4IDdmOWMwYWMuLjQ2NzFmZTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQuYnAKQEAgLTMxLDYgKzMxLDcgQEAKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAorICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYnV0aWxzIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKaW5kZXggYmMzMjQxNi4uMGRkZjY2ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKQEAgLTU3LDkgKzU3LDYgQEAKICAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMIj4KICAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIiB2b2x1bWVHcm91cD0ibm90aWZpY2F0aW9uIj4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+Ci0gICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUIi8+IDwvQXR0cmlidXRlcz4KLSAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQiLz4gPC9BdHRyaWJ1dGVzPgotICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCIvPiA8L0F0dHJpYnV0ZXM+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQiLz4gPC9BdHRyaWJ1dGVzPgogICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KICAgICA8L1Byb2R1Y3RTdHJhdGVneT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCmluZGV4IGM3M2MxN2QuLmQ0ZDUxNGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcApAQCAtMjcwLDkgKzI3MCwxMCBAQAogICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCk7CiAgICAgICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkpIGJyZWFrOwogICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXRGaXJzdERldmljZXNGcm9tVHlwZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcyhHUk9VUF9OT05FLCB7QVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVH0pKTsKICAgICAgICAgaWYgKCFkZXZpY2VzLmlzRW1wdHkoKSkgYnJlYWs7Ci0gICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKTsKKyAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0Rmlyc3REZXZpY2VzRnJvbVR5cGVzKHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFfSk7CiAgICAgfSBicmVhazsKIAogICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OOgpAQCAtMzQzLDYgKzM0NCwzMCBAQAogICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpID09IEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSKSkgewogICAgICAgICAgICAgZGV2aWNlczIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gTEUgYXVkaW8gYnJvYWRjYXN0IGRldmljZSBpcyBvbmx5IHVzZWQgaWY6CisgICAgICAgIC8vIC0gTm8gY2FsbCBpcyBhY3RpdmUKKyAgICAgICAgLy8gLSBlaXRoZXIgTUVESUEgb3IgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwgaXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgYWN0aXZlIHN0cmF0ZWd5CisgICAgICAgIC8vICAgT1IgdGhlIExFIGF1ZGlvIHVuaWNhc3QgZGV2aWNlIGlzIG5vdCBhY3RpdmUKKyAgICAgICAgaWYgKGRldmljZXMyLmlzRW1wdHkoKSAmJiAhaXNJbkNhbGwoKQorICAgICAgICAgICAgICAgICYmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSB8fCBzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpIHsKKyAgICAgICAgICAgIGxlZ2FjeV9zdHJhdGVneSB0b3BBY3RpdmVTdHJhdGVneSA9IFNUUkFURUdZX05PTkU7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnBzIDogZ2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0cy5pc1N0cmF0ZWd5QWN0aXZlKHBzKSkgeworICAgICAgICAgICAgICAgICAgICB0b3BBY3RpdmVTdHJhdGVneSA9ICBtTGVnYWN5U3RyYXRlZ3lNYXAuZmluZChwcykgIT0gZW5kKG1MZWdhY3lTdHJhdGVneU1hcCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MZWdhY3lTdHJhdGVneU1hcC5hdChwcykgOiBTVFJBVEVHWV9OT05FOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0b3BBY3RpdmVTdHJhdGVneSA9PSBTVFJBVEVHWV9OT05FIHx8IHRvcEFjdGl2ZVN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBCisgICAgICAgICAgICAgICAgICAgIHx8IHRvcEFjdGl2ZVN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMCisgICAgICAgICAgICAgICAgICAgIHx8ICFvdXRwdXRzLmlzQW55RGV2aWNlVHlwZUFjdGl2ZShnZXRBdWRpb0RldmljZU91dExlQXVkaW9VbmljYXN0U2V0KCkpKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlczIgPQorICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9CTEVfQlJPQURDQVNUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChkZXZpY2VzMi5pc0VtcHR5KCkgJiYgKGdldExhc3RSZW1vdmFibGVNZWRpYURldmljZXMoKS5zaXplKCkgPiAwKSkgewogICAgICAgICAgICAgaWYgKChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkpIHsKICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGxhc3QgY29ubmVjdGVkIGRldmljZSBvZiB3aXJlZCBhbmQgYmx1ZXRvb3RoIGEyZHAKQEAgLTM2NCw3ICszODksOCBAQAogICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZGV2aWNlczIuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBkZXZpY2VzMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUik7CisgICAgICAgICAgICBkZXZpY2VzMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0Rmlyc3REZXZpY2VzRnJvbVR5cGVzKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUn0pOwogICAgICAgICB9CiAgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzMzsKICAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSB7CkBAIC00NjAsNiArNDg2LDcgQEAKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfSE9UV09SRDoKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOgogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRToKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVUxUUkFTT1VORDoKICAgICAgICAgICAgIGlucHV0U291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT047CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKQEAgLTQ4Miw3ICs1MDksNyBAQAogICAgICAgICAgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldEZpcnN0RXhpc3RpbmdEZXZpY2UoewotICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsCiAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSwKICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0JMRSwgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CiAgICAgICAgIGJyZWFrOwpAQCAtNTM2LDcgKzU2Myw3IEBACiAgICAgICAgIC8vIGJlY2F1c2Ugc29tZXRpbWVzIHVzZXIgd2FudCB0byBkbyB2b2ljZSBzZWFyY2ggYnkgYnQgcmVtb3RlCiAgICAgICAgIC8vIGV2ZW4gaWYgQlVJTERJTl9NSUMgaXMgYXZhaWxhYmxlLgogICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldEZpcnN0RXhpc3RpbmdEZXZpY2UoewotICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsCiAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSwKICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0JMRSwgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CiAKQEAgLTU1Miw3ICs1NzksNyBAQAogICAgICAgICAgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldEZpcnN0RXhpc3RpbmdEZXZpY2UoewotICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsCiAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSwKICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUN9KTsKICAgICAgICAgYnJlYWs7CkBAIC01ODYsNiArNjEzLDEwIEBACiAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlKAogICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9FQ0hPX1JFRkVSRU5DRSwgU3RyaW5nOCgiIiksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVUxUUkFTT1VORDoKKyAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXRGaXJzdEV4aXN0aW5nRGV2aWNlKHsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMsIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQ30pOworICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBBTE9HVygiZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKSBpbnZhbGlkIGlucHV0IHNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKICAgICAgICAgYnJlYWs7CkBAIC02NDUsNyArNjc2LDcgQEAKICAgICAgICAgLy8gdGhlcmUgaXMgYSBwcmVmZXJyZWQgZGV2aWNlLCBpcyBpdCBhdmFpbGFibGU/CiAgICAgICAgIHByZWZlcnJlZEF2YWlsYWJsZURldlZlYyA9CiAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbURldmljZVR5cGVBZGRyVmVjKHByZWZlcnJlZFN0cmF0ZWd5RGV2aWNlcyk7Ci0gICAgICAgIGlmIChwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWMuc2l6ZSgpID09IHByZWZlcnJlZEF2YWlsYWJsZURldlZlYy5zaXplKCkpIHsKKyAgICAgICAgaWYgKHByZWZlcnJlZEF2YWlsYWJsZURldlZlYy5zaXplKCkgPT0gcHJlZmVycmVkU3RyYXRlZ3lEZXZpY2VzLnNpemUoKSkgewogICAgICAgICAgICAgQUxPR1ZWKCIlcyB1c2luZyBwcmVmIGRldmljZSAlcyBmb3Igc3RyYXRlZ3kgJXUiLAogICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWMudG9TdHJpbmcoKS5jX3N0cigpLCBzdHJhdGVneSk7CiAgICAgICAgICAgICByZXR1cm4gcHJlZmVycmVkQXZhaWxhYmxlRGV2VmVjOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZnV6emVyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9mdXp6ZXIvQW5kcm9pZC5icAppbmRleCBmYWYxNWQ2Li45ZjZiNzAzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9mdXp6ZXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9mdXp6ZXIvQW5kcm9pZC5icApAQCAtNjIsNCArNjIsNyBAQAogICAgICAgICAibGliYXVkaW9wb2xpY3ltYW5hZ2VyX2ludGVyZmFjZV9oZWFkZXJzIiwKICAgICBdLAogICAgIGRhdGE6IFsiOmF1ZGlvcG9saWN5ZnV6emVyX2NvbmZpZ3VyYXRpb25fZmlsZXMiXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgIGNjOiBbIm1uYWdhbm92QGdvb2dsZS5jb20iXSwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZnV6emVyL2F1ZGlvcG9saWN5X2Z1enplci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9mdXp6ZXIvYXVkaW9wb2xpY3lfZnV6emVyLmNwcAppbmRleCA3MDAwY2Q5Li40OGY3NDEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9mdXp6ZXIvYXVkaW9wb2xpY3lfZnV6emVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9mdXp6ZXIvYXVkaW9wb2xpY3lfZnV6emVyLmNwcApAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KICNpbmNsdWRlIDxsaWJ4bWwveGluY2x1ZGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZmlsZS5oPgogI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgogI2luY2x1ZGUgPG1lZGlhL1JlY29yZGluZ0FjdGl2aXR5VHJhY2tlci5oPgogCkBAIC0xMjYsMTMgKzEyNywyMCBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9KCk7CiAKKy8qKgorICogQXVkaW9Tb3VyY2UgLSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiBhbmQgQVVESU9fU09VUkNFX0hPVFdPUkQKKyAqIGFyZSBleGNsdWRlZCBmcm9tIGtBdWRpb1NvdXJjZXNbXSBpbiBvcmRlciB0byBhdm9pZCB0aGUgYWJvcnQgdHJpZ2dlcmVkCisgKiBmb3IgdGhlc2UgdHdvIHR5cGVzIG9mIEF1ZGlvU291cmNlIGluIEVuZ2luZTo6Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKQorICovCiBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fc291cmNlX3Q+IGtBdWRpb1NvdXJjZXMgPSBbXSB7CiAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fc291cmNlX3Q+IHJlc3VsdDsKICAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvU291cmNlPnt9KSB7CiAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlSGFsOwogICAgICAgICBzdGQ6OnN0cmluZyBhdWRpb1NvdXJjZSA9IHRvU3RyaW5nKGVudW1WYWwpOwotICAgICAgICBpZiAoYXVkaW9fc291cmNlX2Zyb21fc3RyaW5nKGF1ZGlvU291cmNlLmNfc3RyKCksICZhdWRpb1NvdXJjZUhhbCkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soYXVkaW9Tb3VyY2VIYWwpOworICAgICAgICBpZiAoZW51bVZhbCAhPSB4c2Q6OkF1ZGlvU291cmNlOjpBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiAmJgorICAgICAgICAgICAgZW51bVZhbCAhPSB4c2Q6OkF1ZGlvU291cmNlOjpBVURJT19TT1VSQ0VfSE9UV09SRCAmJgorICAgICAgICAgICAgYXVkaW9fc291cmNlX2Zyb21fc3RyaW5nKGF1ZGlvU291cmNlLmNfc3RyKCksICZhdWRpb1NvdXJjZUhhbCkpIHsKKyAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKGF1ZGlvU291cmNlSGFsKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTYzLDcgKzE3MSw5IEBACiAgICAgQVVESU9fRkxBR19CWVBBU1NfTVVURSwgICAgQVVESU9fRkxBR19MT1dfTEFURU5DWSwKICAgICBBVURJT19GTEFHX0RFRVBfQlVGRkVSLCAgICBBVURJT19GTEFHX05PX01FRElBX1BST0pFQ1RJT04sCiAgICAgQVVESU9fRkxBR19NVVRFX0hBUFRJQywgICAgQVVESU9fRkxBR19OT19TWVNURU1fQ0FQVFVSRSwKLSAgICBBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURX07CisgICAgQVVESU9fRkxBR19DQVBUVVJFX1BSSVZBVEUsIEFVRElPX0ZMQUdfQ09OVEVOVF9TUEFUSUFMSVpFRCwKKyAgICBBVURJT19GTEFHX05FVkVSX1NQQVRJQUxJWkUsCisgICAgfTsKIAogc3RkOjp2ZWN0b3I8YXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90PiBrQXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZXMgPSB7CiAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKQEAgLTI0OCwxMyArMjU4LDE0IEBACiAgICAgaWYgKCFwb3J0SWQpIHBvcnRJZCA9ICZsb2NhbFBvcnRJZDsKICAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBBdWRpb1BvbGljeUludGVyZmFjZTo6b3V0cHV0X3R5cGVfdCBvdXRwdXRUeXBlOworICAgIGJvb2wgaXNTcGF0aWFsaXplZDsKIAogICAgIC8vIFRPRE8gYi8xODIzOTI3Njk6IHVzZSBhdHRyaWJ1dGlvbiBzb3VyY2UgdXRpbAogICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2U7CiAgICAgYXR0cmlidXRpb25Tb3VyY2UudWlkID0gMDsKICAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CiAgICAgaWYgKG1NYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKCZhdHRyLCBvdXRwdXQsIEFVRElPX1NFU1NJT05fTk9ORSwgJnN0cmVhbSwgYXR0cmlidXRpb25Tb3VyY2UsCi0gICAgICAgICAgICAmY29uZmlnLCAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwge30sICZvdXRwdXRUeXBlKSAhPSBPSykgeworICAgICAgICAgICAgJmNvbmZpZywgJmZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQsIHt9LCAmb3V0cHV0VHlwZSwgJmlzU3BhdGlhbGl6ZWQpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgfHwgKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CkBAIC04MzksNiArODUwLDkgQEAKICAgICAgICAgOiBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJXaXRoQ29uZmlndXJhdGlvbkZpbGUoZmRwKXt9OwogICAgIHZvaWQgcHJvY2VzcygpIG92ZXJyaWRlOwogCisgICAgdm9pZCBmdXp6R2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCk7CisgICAgdm9pZCBmdXp6R2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKCk7CisKICAgIHByb3RlY3RlZDoKICAgICB2b2lkIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOwogICAgIHZvaWQgZXhwbGljaXRseVJvdXRpbmdBZnRlckNvbm5lY3Rpb24oKTsKQEAgLTg4OSwxMCArOTAzLDQxIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRldmljZUNvbm5lY3Rpb246OmZ1enpHZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoKSB7CisgICAgY29uc3QgdWludDMyX3QgbnVtVGVzdENhc2VzID0gbUZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oMSwgMTApOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVGVzdENhc2VzOyArK2kpIHsKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworICAgICAgICBhdHRyLmNvbnRlbnRfdHlwZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19jb250ZW50X3R5cGVfdD4obUZkcCwga0F1ZGlvQ29udGVudFR5cGVzKTsKKyAgICAgICAgYXR0ci51c2FnZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb191c2FnZV90PihtRmRwLCBrQXVkaW9Vc2FnZXMpOworICAgICAgICBhdHRyLnNvdXJjZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19zb3VyY2VfdD4obUZkcCwga0F1ZGlvU291cmNlcyk7CisgICAgICAgIGF0dHIuZmxhZ3MgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fZmxhZ3NfbWFza190PihtRmRwLCBrQXVkaW9GbGFnTWFza3MpOworICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG1GZHAsIGtBdWRpb0NoYW5uZWxPdXRNYXNrcyk7CisgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fZm9ybWF0X3Q+KG1GZHAsIGtBdWRpb0Zvcm1hdHMpOworICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBnZXRWYWx1ZUZyb21WZWN0b3I8dWludDMyX3Q+KG1GZHAsIGtTYW1wbGluZ1JhdGVzKTsKKyAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJmNvbmZpZyk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRldmljZUNvbm5lY3Rpb246OmZ1enpHZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoKSB7CisgICAgY29uc3QgdWludDMyX3QgbnVtVGVzdENhc2VzID0gbUZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oMSwgMTApOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVGVzdENhc2VzOyArK2kpIHsKKyAgICAgICAgQXVkaW9Qcm9maWxlVmVjdG9yIGF1ZGlvUHJvZmlsZXM7CisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKyAgICAgICAgYXR0ci5jb250ZW50X3R5cGUgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fY29udGVudF90eXBlX3Q+KG1GZHAsIGtBdWRpb0NvbnRlbnRUeXBlcyk7CisgICAgICAgIGF0dHIudXNhZ2UgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fdXNhZ2VfdD4obUZkcCwga0F1ZGlvVXNhZ2VzKTsKKyAgICAgICAgYXR0ci5zb3VyY2UgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fc291cmNlX3Q+KG1GZHAsIGtBdWRpb1NvdXJjZXMpOworICAgICAgICBhdHRyLmZsYWdzID0gZ2V0VmFsdWVGcm9tVmVjdG9yPGF1ZGlvX2ZsYWdzX21hc2tfdD4obUZkcCwga0F1ZGlvRmxhZ01hc2tzKTsKKyAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcygmYXR0ciwgYXVkaW9Qcm9maWxlcyk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRldmljZUNvbm5lY3Rpb246OnByb2Nlc3MoKSB7CiAgICAgaWYgKGluaXRpYWxpemUoKSkgewogICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKTsKICAgICAgICAgZXhwbGljaXRseVJvdXRpbmdBZnRlckNvbm5lY3Rpb24oKTsKKyAgICAgICAgZnV6ekdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgpOworICAgICAgICBmdXp6R2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKCk7CiAgICAgICAgIGZ1enpQYXRjaENyZWF0aW9uKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0FuZHJvaWQuYnAKaW5kZXggMDE2NWRjOC4uNGI0ODE3ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BbmRyb2lkLmJwCkBAIC0zNiw2ICszNiw4IEBACiAgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZWRlZmF1bHQiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKKyAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLnR5cGVzLVYxLWNwcCIsCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAppbmRleCBjYzJkOGU4Li43NDQ2MDlmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxTZXJpYWxpemVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9hdWRpby9jb21tb24vQXVkaW9Qb3J0Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KQEAgLTUzLDYgKzU0LDEwIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlOwordXNpbmcgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlQWRkcmVzczsKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnREZXZpY2VFeHQ7Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0RXh0OwogdXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKIAogLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgdHJ1bmNhdGVkIHRvdWNoIHNvdW5kcwpAQCAtOTcsNDQgKzEwMiw4MCBAQAogLy8gQXVkaW9Qb2xpY3lJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0JiBwb3J0LCBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KHN0YXRlLCBwb3J0LCBlbmNvZGVkRm9ybWF0KTsKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgeworICAgIG1lZGlhOjpBdWRpb1BvcnQgYWlkbFBvcnQ7CisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IGRldmljZVRvQXVkaW9Qb3J0KGRldmljZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCAmYWlkbFBvcnQpOworICAgICAgICBzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShzdGF0ZSwgYWlkbFBvcnQuaGFsLCBlbmNvZGVkRm9ybWF0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbnZlcnQgdG8gQXVkaW9Qb3J0IFBhcmNlbGFibGU6ICVzIiwgc3RhdHVzVG9TdHJpbmcoc3RhdHVzKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQogewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtKFN0cmluZzgoZGV2aWNlLT5hZGRyZXNzKCkuY19zdHIoKSkpOwotICAgIGNvbnN0IFN0cmluZzgga2V5KHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFID8KLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlcjo6a2V5RGV2aWNlQ29ubmVjdCA6IEF1ZGlvUGFyYW1ldGVyOjprZXlEZXZpY2VEaXNjb25uZWN0KTsKLSAgICBwYXJhbS5hZGRJbnQoa2V5LCBkZXZpY2UtPnR5cGUoKSk7Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOworICAgIGF1ZGlvX3BvcnRfdjcgZGV2aWNlUG9ydDsKKyAgICBkZXZpY2UtPnRvQXVkaW9Qb3J0KCZkZXZpY2VQb3J0KTsKKyAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnNldERldmljZUNvbm5lY3RlZFN0YXRlKAorICAgICAgICAgICAgICAgICAgICAmZGV2aWNlUG9ydCwgc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpOworICAgICAgICAgICAgc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciAlZCB3aGlsZSBzZXR0aW5nIGNvbm5lY3RlZCBzdGF0ZSBmb3IgZGV2aWNlICVzIiwgc3RhdHVzLAorICAgICAgICAgICAgICAgIGRldmljZS0+Z2V0RGV2aWNlVHlwZUFkZHIoKS50b1N0cmluZyhmYWxzZSkuY19zdHIoKSk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludCgKKyAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLCBjb25zdCBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qb3J0JiBwb3J0LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSB7CisgICAgLy8gVE9ETzogYi8yMTE2MDExNzggRm9yd2FyZCAncG9ydCcgdG8gQXVkaW8gSEFMIHZpYSBtSHdNb2R1bGVzLiBGb3Igbm93LCBvbmx5IGRldmljZV90eXBlLAorICAgIC8vIGRldmljZV9hZGRyZXNzIGFuZCBkZXZpY2VfbmFtZSBhcmUgZm9yd2FyZGVkLgorICAgIGlmIChwb3J0LmV4dC5nZXRUYWcoKSAhPSBBdWRpb1BvcnRFeHQ6OmRldmljZSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlX3R5cGU7CisgICAgc3RkOjpzdHJpbmcgZGV2aWNlX2FkZHJlc3M7CisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlX2F1ZGlvX2RldmljZSgKKyAgICAgICAgICAgICAgICBwb3J0LmV4dC5nZXQ8QXVkaW9Qb3J0RXh0OjpkZXZpY2U+KCkuZGV2aWNlLCAmZGV2aWNlX3R5cGUsICZkZXZpY2VfYWRkcmVzcyk7CisgICAgICAgIHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH07CisgICAgY29uc3QgY2hhciogZGV2aWNlX25hbWUgPSBwb3J0Lm5hbWUuY19zdHIoKTsKKyAgICAvLyBjb25uZWN0L2Rpc2Nvbm5lY3Qgb25seSAxIGRldmljZSBhdCBhIHRpbWUKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlX3R5cGUpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlX3R5cGUpKQorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKAorICAgICAgICAgICAgZGV2aWNlX3R5cGUsIGRldmljZV9hZGRyZXNzLmNfc3RyKCksIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0LAorICAgICAgICAgICAgc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpOworICAgIHJldHVybiBkZXZpY2UgPyBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoZGV2aWNlLCBzdGF0ZSkgOiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKLXsKLSAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KCkgZGV2aWNlOiAweCVYLCBzdGF0ZSAlZCwgYWRkcmVzcyAlcyBuYW1lICVzIGZvcm1hdCAweCVYIiwKLSAgICAgICAgICAgIGRldmljZVR5cGUsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwotCi0gICAgLy8gY29ubmVjdC9kaXNjb25uZWN0IG9ubHkgMSBkZXZpY2UgYXQgYSB0aW1lCi0gICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZVR5cGUpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlVHlwZSkpIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQotICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZVR5cGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSwgZW5jb2RlZEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSk7Ci0gICAgcmV0dXJuIGRldmljZSA/IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIHN0YXRlKSA6IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIHsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0IGFpZGxQb3J0OworICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VUb0F1ZGlvUG9ydChkZXZpY2VUeXBlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsICZhaWRsUG9ydCk7CisgICAgICAgIHN0YXR1cyA9PSBPSykgeworICAgICAgICByZXR1cm4gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KHN0YXRlLCBhaWRsUG9ydC5oYWwsIGVuY29kZWRGb3JtYXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29udmVydCB0byBBdWRpb1BvcnQgUGFyY2VsYWJsZTogJXMiLCBzdGF0dXNUb1N0cmluZyhzdGF0dXMpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKQEAgLTE0OSw2ICsxOTAsOSBAQAogICAgICAgICAvLyBzYXZlIGEgY29weSBvZiB0aGUgb3BlbmVkIG91dHB1dCBkZXNjcmlwdG9ycyBiZWZvcmUgYW55IG91dHB1dCBpcyBvcGVuZWQgb3IgY2xvc2VkCiAgICAgICAgIC8vIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpLiBUaGlzIHdpbGwgYmUgbmVlZGVkIGJ5IGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCiAgICAgICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKKworICAgICAgICBib29sIHdhc0xlVW5pY2FzdEFjdGl2ZSA9IGlzTGVVbmljYXN0QWN0aXZlKCk7CisKICAgICAgICAgc3dpdGNoIChzdGF0ZSkKICAgICAgICAgewogICAgICAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZSBjb25uZWN0aW9uCkBAIC0yNDYsOSArMjkwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgdW51c2VkIG91dHB1dHMgYWZ0ZXIgZGV2aWNlIGRpc2Nvbm5lY3Rpb24gb3IgZGlyZWN0IG91dHB1dHMgdGhhdCBoYXZlCiAgICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gb3BlbmVkIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gIm91dHB1dHMiIHZlY3RvciBuZXZlciBjb250YWlucyBkdXBsaWNhdGVkIG91dHB1dHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfU1BBVElBTElaRVIpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc091dHB1dE9ubHlBdmFpbGFibGVSb3V0ZVRvU29tZURldmljZShkZXNjKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyQXVkaW9Tb3VyY2VzRm9yT3V0cHV0KG91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zMTIsNiArMzU5LDggQEAKICAgICAgICAgICAgIGNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlKTsKICAgICAgICAgfQogCisgICAgICAgIGNoZWNrTGVCcm9hZGNhc3RSb3V0ZXMod2FzTGVVbmljYXN0QWN0aXZlLCBudWxscHRyLCAwKTsKKwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9ICAvLyBlbmQgaWYgaXMgb3V0cHV0IGRldmljZQpAQCAtMzk5LDYgKzQ0OCwxNCBAQAogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGV2aWNlVG9BdWRpb1BvcnQoYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgY2hhciogZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0KiBhaWRsUG9ydCkgeworICAgIERldmljZURlc2NyaXB0b3JCYXNlIGRldkRlc2NyKGRldmljZSwgZGV2aWNlX2FkZHJlc3MpOworICAgIGRldkRlc2NyLnNldE5hbWUoZGV2aWNlX25hbWUpOworICAgIHJldHVybiBkZXZEZXNjci53cml0ZVRvUGFyY2VsYWJsZShhaWRsUG9ydCk7Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRFbmdpbmVEZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpIHsKIApAQCAtNTI1LDEwICs1ODIsMTAgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKQogewotICAgIEFMT0dWKCJnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKCkiKTsKKyAgICBBTE9HVigiZ2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKCkiKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGZvcm1hdFNldDsKICAgICBzcDxId01vZHVsZT4gcHJpbWFyeU1vZHVsZSA9CkBAIC01MzcsOCArNTk0LDIzIEBACiAgICAgICAgIEFMT0dFKCIlcygpIHVuYWJsZSB0byBnZXQgcHJpbWFyeSBtb2R1bGUiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKworICAgIERldmljZVR5cGVTZXQgYXVkaW9EZXZpY2VTZXQ7CisKKyAgICBzd2l0Y2goZGV2aWNlKSB7CisgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOgorICAgICAgICBhdWRpb0RldmljZVNldCA9IGdldEF1ZGlvRGV2aWNlT3V0QWxsQTJkcFNldCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQ6CisgICAgICAgIGF1ZGlvRGV2aWNlU2V0ID0gZ2V0QXVkaW9EZXZpY2VPdXRBbGxCbGVTZXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzKCkgZGV2aWNlIHR5cGUgMHglMDh4IG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXywgZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBEZXZpY2VWZWN0b3IgZGVjbGFyZWREZXZpY2VzID0gcHJpbWFyeU1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuZ2V0RGV2aWNlc0Zyb21UeXBlcygKLSAgICAgICAgICAgIGdldEF1ZGlvRGV2aWNlT3V0QWxsQTJkcFNldCgpKTsKKyAgICAgICAgICAgIGF1ZGlvRGV2aWNlU2V0KTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGRlY2xhcmVkRGV2aWNlcykgewogICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KGRldmljZS0+ZW5jb2RlZEZvcm1hdHMoKS5iZWdpbigpLCBkZXZpY2UtPmVuY29kZWRGb3JtYXRzKCkuZW5kKCkpOwogICAgIH0KQEAgLTYwMCwxMiArNjcyLDggQEAKICAgICBBTE9HVigiJXMgZGV2aWNlIHJ4RGV2aWNlICVzIHR4RGV2aWNlICVzIiwgX19mdW5jX18sCiAgICAgICAgICAgcnhEZXZpY2VzLml0ZW1BdCgwKS0+dG9TdHJpbmcoKS5jX3N0cigpLCB0eFNvdXJjZURldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKIAotICAgIGRpc2Nvbm5lY3RUZWxlcGhvbnlSeEF1ZGlvU291cmNlKCk7Ci0gICAgLy8gcmVsZWFzZSBUWCBwYXRjaCBpZiBhbnkKLSAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKLSAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChtQ2FsbFR4UGF0Y2gtPmdldEhhbmRsZSgpKTsKLSAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7Ci0gICAgfQorICAgIGRpc2Nvbm5lY3RUZWxlcGhvbnlBdWRpb1NvdXJjZShtQ2FsbFJ4U291cmNlQ2xpZW50KTsKKyAgICBkaXNjb25uZWN0VGVsZXBob255QXVkaW9Tb3VyY2UobUNhbGxUeFNvdXJjZUNsaWVudCk7CiAKICAgICBhdXRvIHRlbGVwaG9ueVJ4TW9kdWxlID0KICAgICAgICAgbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2VUeXBlKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKQEAgLTY2Myw3ICs3MzEsNyBAQAogICAgICAgICAgICAgICAgIGNsb3NlQWN0aXZlQ2xpZW50cyhhY3RpdmVEZXNjKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtQ2FsbFR4UGF0Y2ggPSBjcmVhdGVUZWxlcGhvbnlQYXRjaChmYWxzZSAvKmlzUngqLywgdHhTb3VyY2VEZXZpY2UsIGRlbGF5TXMpOworICAgICAgICBjb25uZWN0VGVsZXBob255VHhBdWRpb1NvdXJjZSh0eFNvdXJjZURldmljZSwgdHhTaW5rRGV2aWNlLCBkZWxheU1zKTsKICAgICB9CiAgICAgaWYgKHdhaXRNcyAhPSBudWxscHRyKSB7CiAgICAgICAgICp3YWl0TXMgPSBtdXRlV2FpdE1zOwpAQCAtNjcxLDM2ICs3MzksNiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3A8QXVkaW9QYXRjaD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVUZWxlcGhvbnlQYXRjaCgKLSAgICAgICAgYm9vbCBpc1J4LCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKSB7Ci0gICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKLQotICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvLyBAVE9ETzogc3RpbGwgaWdub3JpbmcgdGhlIGFkZHJlc3MsIG9yIG5vdCBkZWFsaW5nIHBsYXRmb3JtIHdpdGggbXVsdGlwbGUgdGVsZXBob255IGRldmljZXMKLSAgICBpZiAoaXNSeCkgewotICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU2luayhkZXZpY2UpLgotICAgICAgICAgICAgICAgIGFkZFNvdXJjZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZSgKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgU3RyaW5nOCgpLCBBVURJT19GT1JNQVRfREVGQVVMVCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2UoZGV2aWNlKS4KLSAgICAgICAgICAgICAgICBhZGRTaW5rKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZSgKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsIFN0cmluZzgoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKLSAgICB9Ci0KLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIHN0YXR1c190IHN0YXR1cyA9Ci0gICAgICAgICAgICBjcmVhdGVBdWRpb1BhdGNoSW50ZXJuYWwocGF0Y2hCdWlsZGVyLnBhdGNoKCksICZwYXRjaEhhbmRsZSwgbVVpZENhY2hlZCwgZGVsYXlNcyk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShwYXRjaEhhbmRsZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coIiVzKCkgZXJyb3IgJWQgY3JlYXRpbmcgJXMgYXVkaW8gcGF0Y2giLCBfX2Z1bmNfXywgc3RhdHVzLCBpc1J4ID8gIlJYIiA6ICJUWCIpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcmV0dXJuIG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci19Ci0KIGJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0RldmljZU9mTW9kdWxlKAogICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywgY29uc3QgY2hhciAqbW9kdWxlSWQpIGNvbnN0IHsKICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShtb2R1bGVJZCk7CkBAIC03MTUsMjAgKzc1Myw1NSBAQAogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKQogewotICAgIGRpc2Nvbm5lY3RUZWxlcGhvbnlSeEF1ZGlvU291cmNlKCk7CisgICAgZGlzY29ubmVjdFRlbGVwaG9ueUF1ZGlvU291cmNlKG1DYWxsUnhTb3VyY2VDbGllbnQpOwogICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBzb3VyY2UgPSB7CiAgICAgICAgIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFLAogICAgICAgICAuZXh0LmRldmljZS50eXBlID0gQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgLmV4dC5kZXZpY2UuYWRkcmVzcyA9ICIiCiAgICAgfTsKICAgICBjb25zdCBhdXRvIGFhID0gbUVuZ2luZS0+Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0QXVkaW9Tb3VyY2UoJnNvdXJjZSwgJmFhLCAmbUNhbGxSeFNvdXJjZUNsaWVudFBvcnQsIDAvKnVpZCovKTsKLSAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICIlcyBmYWlsZWQgdG8gc3RhcnQgVGVsZXBob255IFJ4IEF1ZGlvU291cmNlIiwgX19mdW5jX18pOworICAgIG1DYWxsUnhTb3VyY2VDbGllbnQgPSBzdGFydEF1ZGlvU291cmNlSW50ZXJuYWwoJnNvdXJjZSwgJmFhLCAwLyp1aWQqLyk7CisgICAgQUxPR0VfSUYobUNhbGxSeFNvdXJjZUNsaWVudCA9PSBudWxscHRyLAorICAgICAgICAgICAgICIlcyBmYWlsZWQgdG8gc3RhcnQgVGVsZXBob255IFJ4IEF1ZGlvU291cmNlIiwgX19mdW5jX18pOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGlzY29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmRpc2Nvbm5lY3RUZWxlcGhvbnlBdWRpb1NvdXJjZShzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiAmY2xpZW50RGVzYykKIHsKLSAgICBzdG9wQXVkaW9Tb3VyY2UobUNhbGxSeFNvdXJjZUNsaWVudFBvcnQpOwotICAgIG1DYWxsUnhTb3VyY2VDbGllbnRQb3J0ID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBpZiAoY2xpZW50RGVzYyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1dfSUYoc3RvcEF1ZGlvU291cmNlKGNsaWVudERlc2MtPnBvcnRJZCgpKSAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICIlcyBlcnJvciBzdG9wcGluZyBhdWRpbyBzb3VyY2UiLCBfX2Z1bmNfXyk7CisgICAgY2xpZW50RGVzYy5jbGVhcigpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29ubmVjdFRlbGVwaG9ueVR4QXVkaW9Tb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZzcmNEZXZpY2UsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZzaW5rRGV2aWNlLAorICAgICAgICB1aW50MzJfdCBkZWxheU1zKQoreworICAgIGRpc2Nvbm5lY3RUZWxlcGhvbnlBdWRpb1NvdXJjZShtQ2FsbFR4U291cmNlQ2xpZW50KTsKKyAgICBpZiAoc3JjRGV2aWNlID09IG51bGxwdHIgfHwgc2lua0RldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcyBjb3VsZCBub3QgY3JlYXRlIHBhdGNoLCBpbnZhbGlkIHNpbmsgYW5kL29yIHNvdXJjZSBkZXZpY2UocykiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKHNyY0RldmljZSkuYWRkU2luayhzaW5rRGV2aWNlKTsKKyAgICBBTE9HVigiJXMgYmV0d2VlbiBzb3VyY2UgJXMgYW5kIHNpbmsgJXMiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgIHNyY0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBzaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgIGF1dG8gY2FsbFR4U291cmNlQ2xpZW50UG9ydElkID0gUG9saWN5QXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKyAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYWEgPSB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiB9OworICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBzb3VyY2UgPSB7fTsKKyAgICBzcmNEZXZpY2UtPnRvQXVkaW9Qb3J0Q29uZmlnKCZzb3VyY2UpOworICAgIG1DYWxsVHhTb3VyY2VDbGllbnQgPSBuZXcgSW50ZXJuYWxTb3VyY2VDbGllbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIGNhbGxUeFNvdXJjZUNsaWVudFBvcnRJZCwgbVVpZENhY2hlZCwgYWEsIHNvdXJjZSwgc3JjRGV2aWNlLCBzaW5rRGV2aWNlLAorICAgICAgICAgICAgICAgIG1Db21tdW5uaWNhdGlvblN0cmF0ZWd5LCB0b1ZvbHVtZVNvdXJjZShhYSkpOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29ubmVjdEF1ZGlvU291cmNlVG9TaW5rKAorICAgICAgICAgICAgICAgIG1DYWxsVHhTb3VyY2VDbGllbnQsIHNpbmtEZXZpY2UsIHBhdGNoQnVpbGRlci5wYXRjaCgpLCBwYXRjaEhhbmRsZSwgbVVpZENhY2hlZCwKKyAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICIlcygpIGVycm9yICVkIGNyZWF0aW5nIFRYIGF1ZGlvIHBhdGNoIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtQXVkaW9Tb3VyY2VzLmFkZChjYWxsVHhTb3VyY2VDbGllbnRQb3J0SWQsIG1DYWxsVHhTb3VyY2VDbGllbnQpOworICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQpAQCAtNzM2LDYgKzgwOSw3IEBACiAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBzdGF0ZSAlZCIsIHN0YXRlKTsKICAgICAvLyBzdG9yZSBwcmV2aW91cyBwaG9uZSBzdGF0ZSBmb3IgbWFuYWdlbWVudCBvZiBzb25pZmljYXRpb24gc3RyYXRlZ3kgYmVsb3cKICAgICBpbnQgb2xkU3RhdGUgPSBtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCk7CisgICAgYm9vbCB3YXNMZVVuaWNhc3RBY3RpdmUgPSBpc0xlVW5pY2FzdEFjdGl2ZSgpOwogCiAgICAgaWYgKG1FbmdpbmUtPnNldFBob25lU3RhdGUoc3RhdGUpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dXKCJzZXRQaG9uZVN0YXRlKCkgaW52YWxpZCBvciBzYW1lIHN0YXRlICVkIiwgc3RhdGUpOwpAQCAtNzk2LDExICs4NzAsOCBAQAogICAgICAgICAgICAgICAgIHJ4RGV2aWNlcyA9IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2VzKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAob2xkU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7Ci0gICAgICAgICAgICAgICAgZGlzY29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChtQ2FsbFR4UGF0Y2gtPmdldEhhbmRsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RUZWxlcGhvbnlBdWRpb1NvdXJjZShtQ2FsbFJ4U291cmNlQ2xpZW50KTsKKyAgICAgICAgICAgICAgICBkaXNjb25uZWN0VGVsZXBob255QXVkaW9Tb3VyY2UobUNhbGxUeFNvdXJjZUNsaWVudCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCByeERldmljZXMsIGZvcmNlLCAwKTsKICAgICAgICAgfQpAQCAtODEwLDExICs4ODEsMTUgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKGRlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwgfHwgZGVzYyAhPSBtUHJpbWFyeU91dHB1dCkgewotICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhkZXNjLCBuZXdEZXZpY2VzLCAhbmV3RGV2aWNlcy5pc0VtcHR5KCksIDAgLypkZWxheU1zKi8pOworICAgICAgICBpZiAoc3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMIHx8IChkZXNjICE9IG1QcmltYXJ5T3V0cHV0ICYmICFpc1RlbGVwaG9ueVJ4T3JUeChkZXNjKSkpIHsKKyAgICAgICAgICAgIGJvb2wgZm9yY2VSb3V0aW5nID0gIW5ld0RldmljZXMuaXNFbXB0eSgpOworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhkZXNjLCBuZXdEZXZpY2VzLCBmb3JjZVJvdXRpbmcsIDAgLypkZWxheU1zKi8sIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypyZXF1aXJlc011dGVDaGVjayovLCAhZm9yY2VSb3V0aW5nIC8qcmVxdWlyZXNWb2x1bWVDaGVjayovKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIGNoZWNrTGVCcm9hZGNhc3RSb3V0ZXMod2FzTGVVbmljYXN0QWN0aXZlLCBudWxscHRyLCBkZWxheU1zKTsKKwogICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgewogICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOwogICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gY2FsbCBzdGFydHMKQEAgLTg3MSw2ICs5NDYsMzIgQEAKICAgICBBTE9HVigic2V0U3lzdGVtUHJvcGVydHkoKSBwcm9wZXJ0eSAlcywgdmFsdWUgJXMiLCBwcm9wZXJ0eSwgdmFsdWUpOwogfQogCisvLyBGaW5kIGFuIE1TRCBvdXRwdXQgcHJvZmlsZSBjb21wYXRpYmxlIHdpdGggdGhlIHBhcmFtZXRlcnMgcGFzc2VkLgorLy8gV2hlbiAiZGlyZWN0T25seSIgaXMgc2V0LCByZXN0cmljdCBzZWFyY2ggdG8gcHJvZmlsZXMgZm9yIGRpcmVjdCBvdXRwdXRzLgorc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1zZFByb2ZpbGVGb3JPdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3RPbmx5KQoreworICAgIGZsYWdzID0gZ2V0UmVsZXZhbnRGbGFncyhmbGFncywgZGlyZWN0T25seSk7CisKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKKyAgICBpZiAobXNkTW9kdWxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gZm9yIHRoZSBtc2QgbW9kdWxlIGNoZWNrIGlmIHRoZXJlIGFyZSBwYXRjaGVzIHRvIHRoZSBvdXRwdXQgZGV2aWNlcworICAgICAgICBpZiAobXNkSGFzUGF0Y2hlc1RvQWxsRGV2aWNlcyhkZXZpY2VzLnRvVHlwZUFkZHJWZWN0b3IoKSkpIHsKKyAgICAgICAgICAgIEh3TW9kdWxlQ29sbGVjdGlvbiBtb2R1bGVzOworICAgICAgICAgICAgbW9kdWxlcy5hZGQobXNkTW9kdWxlKTsKKyAgICAgICAgICAgIHJldHVybiBzZWFyY2hDb21wYXRpYmxlUHJvZmlsZUh3TW9kdWxlcygKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlcywgZ2V0TXNkQXVkaW9PdXREZXZpY2VzKCksIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGRpcmVjdE9ubHkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCiAvLyBGaW5kIGFuIG91dHB1dCBwcm9maWxlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQuIFdoZW4gImRpcmVjdE9ubHkiIGlzIHNldCwgcmVzdHJpY3QKIC8vIHNlYXJjaCB0byBwcm9maWxlcyBmb3IgZGlyZWN0IG91dHB1dHMuCiBzcDxJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UHJvZmlsZUZvck91dHB1dCgKQEAgLTg4MSw1MCArOTgyLDk2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGlyZWN0T25seSkKIHsKKyAgICBmbGFncyA9IGdldFJlbGV2YW50RmxhZ3MoZmxhZ3MsIGRpcmVjdE9ubHkpOworCisgICAgcmV0dXJuIHNlYXJjaENvbXBhdGlibGVQcm9maWxlSHdNb2R1bGVzKAorICAgICAgICAgICAgbUh3TW9kdWxlcywgZGV2aWNlcywgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgZGlyZWN0T25seSk7Cit9CisKK2F1ZGlvX291dHB1dF9mbGFnc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UmVsZXZhbnRGbGFncyAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLCBib29sIGRpcmVjdE9ubHkpIHsKICAgICBpZiAoZGlyZWN0T25seSkgewotICAgICAgICAvLyBvbmx5IHJldGFpbiBmbGFncyB0aGF0IHdpbGwgZHJpdmUgdGhlIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSBzZWxlY3Rpb24KLSAgICAgICAgLy8gaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtSZWxldmFudEZsYWdzID0KKyAgICAgICAgIC8vIG9ubHkgcmV0YWluIGZsYWdzIHRoYXQgd2lsbCBkcml2ZSB0aGUgZGlyZWN0IG91dHB1dCBwcm9maWxlIHNlbGVjdGlvbgorICAgICAgICAgLy8gaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUmVsZXZhbnRGbGFncyA9CiAgICAgICAgICAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwKLSAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCB8IEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEpOwotICAgICAgICBmbGFncyA9Ci0gICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKChmbGFncyAmIGtSZWxldmFudEZsYWdzKSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCB8IEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEpOworICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKChmbGFncyAmIGtSZWxldmFudEZsYWdzKSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CiAgICAgfQorICAgIHJldHVybiBmbGFnczsKK30KIAorc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OnNlYXJjaENvbXBhdGlibGVQcm9maWxlSHdNb2R1bGVzICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBId01vZHVsZUNvbGxlY3Rpb24mIGh3TW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRpcmVjdE9ubHkpIHsKICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGU7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBod01vZHVsZXMpIHsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjdXJQcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKLSAgICAgICAgICAgIGlmICghY3VyUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIE5VTEwgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgTlVMTCAvKnVwZGF0ZWRGb3JtYXQqLywKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIE5VTEwgLyp1cGRhdGVkQ2hhbm5lbE1hc2sqLywKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MpKSB7CisgICAgICAgICAgICAgaWYgKCFjdXJQcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIE5VTEwgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCisgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIE5VTEwgLyp1cGRhdGVkRm9ybWF0Ki8sCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgTlVMTCAvKnVwZGF0ZWRDaGFubmVsTWFzayovLAorICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAvLyByZWplY3QgcHJvZmlsZXMgbm90IGNvcnJlc3BvbmRpbmcgdG8gYSBkZXZpY2UgY3VycmVudGx5IGF2YWlsYWJsZQorICAgICAgICAgICAgIGlmICghbUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnNBdExlYXN0T25lKGN1clByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKSkpIHsKKyAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIC8vIHJlamVjdCBwcm9maWxlcyBpZiBjb25uZWN0ZWQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgY29kZWMKKyAgICAgICAgICAgICBpZiAoIWN1clByb2ZpbGUtPmRldmljZXNTdXBwb3J0RW5jb2RlZEZvcm1hdHMoZGV2aWNlcy50eXBlcygpKSkgeworICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgaWYgKCFkaXJlY3RPbmx5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN1clByb2ZpbGU7CisgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgLy8gd2hlbiBzZWFyY2hpbmcgZm9yIGRpcmVjdCBvdXRwdXRzLCBpZiBzZXZlcmFsIHByb2ZpbGVzIGFyZSBjb21wYXRpYmxlLCBnaXZlIHByaW9yaXR5CisgICAgICAgICAgICAgLy8gdG8gb25lIHdpdGggb2ZmbG9hZCBjYXBhYmlsaXR5CisgICAgICAgICAgICAgaWYgKHByb2ZpbGUgIT0gMCAmJiAKKyAgICAgICAgICAgICAgICAgKChjdXJQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHJlamVjdCBwcm9maWxlcyBub3QgY29ycmVzcG9uZGluZyB0byBhIGRldmljZSBjdXJyZW50bHkgYXZhaWxhYmxlCi0gICAgICAgICAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zQXRMZWFzdE9uZShjdXJQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyByZWplY3QgcHJvZmlsZXMgaWYgY29ubmVjdGVkIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGNvZGVjCi0gICAgICAgICAgICBpZiAoIWN1clByb2ZpbGUtPmRldmljZXNTdXBwb3J0RW5jb2RlZEZvcm1hdHMoZGV2aWNlcy50eXBlcygpKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFkaXJlY3RPbmx5KSByZXR1cm4gY3VyUHJvZmlsZTsKLSAgICAgICAgICAgIC8vIHdoZW4gc2VhcmNoaW5nIGZvciBkaXJlY3Qgb3V0cHV0cywgaWYgc2V2ZXJhbCBwcm9maWxlcyBhcmUgY29tcGF0aWJsZSwgZ2l2ZSBwcmlvcml0eQotICAgICAgICAgICAgLy8gdG8gb25lIHdpdGggb2ZmbG9hZCBjYXBhYmlsaXR5Ci0gICAgICAgICAgICBpZiAocHJvZmlsZSAhPSAwICYmICgoY3VyUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9maWxlID0gY3VyUHJvZmlsZTsKLSAgICAgICAgICAgIGlmICgocHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgcHJvZmlsZSA9IGN1clByb2ZpbGU7CisgICAgICAgICAgICAgaWYgKChwcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgeworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHByb2ZpbGU7CiB9CiAKK3NwPElPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTcGF0aWFsaXplck91dHB1dFByb2ZpbGUoCisgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcgX191bnVzZWQsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjdXJQcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChjdXJQcm9maWxlLT5nZXRGbGFncygpICE9IEFVRElPX09VVFBVVF9GTEFHX1NQQVRJQUxJWkVSKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZWplY3QgcHJvZmlsZXMgbm90IGNvcnJlc3BvbmRpbmcgdG8gYSBkZXZpY2UgY3VycmVudGx5IGF2YWlsYWJsZQorICAgICAgICAgICAgRGV2aWNlVmVjdG9yIHN1cHBvcnRlZERldmljZXMgPSBjdXJQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgICAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zQXRMZWFzdE9uZShzdXBwb3J0ZWREZXZpY2VzKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkZXZpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbURldmljZVR5cGVBZGRyVmVjKGRldmljZXMpLnNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gZGV2aWNlcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIiVzIGZvdW5kIHByb2ZpbGUgJXMiLCBfX2Z1bmNfXywgY3VyUHJvZmlsZS0+Z2V0TmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIGN1clByb2ZpbGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKIGF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogewogICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0sIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwpAQCAtOTg2LDcgKzExMzMsOCBAQAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICBib29sICppc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8QXVkaW9Qb2xpY3lNaXg+PiAqc2Vjb25kYXJ5TWl4ZXMsCi0gICAgICAgIG91dHB1dF90eXBlX3QgKm91dHB1dFR5cGUpCisgICAgICAgIG91dHB1dF90eXBlX3QgKm91dHB1dFR5cGUsCisgICAgICAgIGJvb2wgKmlzU3BhdGlhbGl6ZWQpCiB7CiAgICAgRGV2aWNlVmVjdG9yIG91dHB1dERldmljZXM7CiAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCByZXF1ZXN0ZWRQb3J0SWQgPSAqc2VsZWN0ZWREZXZpY2VJZDsKQEAgLTk5NSw2ICsxMTQzLDggQEAKICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHJlcXVlc3RlZFBvcnRJZCk7CiAKICAgICAqb3V0cHV0VHlwZSA9IEFQSV9PVVRQVVRfSU5WQUxJRDsKKyAgICAqaXNTcGF0aWFsaXplZCA9IGZhbHNlOworCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9BdHRyaWJ1dGVzKHJlc3VsdEF0dHIsIGF0dHIsICpzdHJlYW0pOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTEwOTQsNyArMTI0NCw3IEBACiAKICAgICAqb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgaWYgKCFtc2REZXZpY2VzLmlzRW1wdHkoKSkgewotICAgICAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlcyhtc2REZXZpY2VzLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKKyAgICAgICAgKm91dHB1dCA9IGdldE91dHB1dEZvckRldmljZXMobXNkRGV2aWNlcywgc2Vzc2lvbiwgcmVzdWx0QXR0ciwgY29uZmlnLCBmbGFncywgaXNTcGF0aWFsaXplZCk7CiAgICAgICAgIGlmICgqb3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FICYmIHNldE1zZE91dHB1dFBhdGNoZXMoJm91dHB1dERldmljZXMpID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HVigiJXMoKSBVc2luZyBNU0QgZGV2aWNlcyAlcyBpbnN0ZWFkIG9mIGRldmljZXMgJXMiLAogICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1zZERldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLCBvdXRwdXREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CkBAIC0xMTAzLDggKzEyNTMsOCBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2VzKG91dHB1dERldmljZXMsIHNlc3Npb24sICpzdHJlYW0sIGNvbmZpZywKLSAgICAgICAgICAgICAgICBmbGFncywgcmVzdWx0QXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX01VVEVfSEFQVElDKTsKKyAgICAgICAgKm91dHB1dCA9IGdldE91dHB1dEZvckRldmljZXMob3V0cHV0RGV2aWNlcywgc2Vzc2lvbiwgcmVzdWx0QXR0ciwgY29uZmlnLAorICAgICAgICAgICAgICAgIGZsYWdzLCBpc1NwYXRpYWxpemVkLCByZXN1bHRBdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfTVVURV9IQVBUSUMpOwogICAgIH0KICAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMTM5LDcgKzEyODksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfdHlwZV90ICpvdXRwdXRUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlX3QgKm91dHB1dFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTcGF0aWFsaXplZCkKIHsKICAgICAvLyBUaGUgc3VwcGxpZWQgcG9ydElkIG11c3QgYmUgQVVESU9fUE9SVF9IQU5ETEVfTk9ORQogICAgIGlmICgqcG9ydElkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKQEAgLTExNjEsNyArMTMxMiw3IEBACiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRPdXRwdXRGb3JBdHRySW50KCZyZXN1bHRBdHRyLCBvdXRwdXQsIHNlc3Npb24sIGF0dHIsIHN0cmVhbSwgdWlkLAogICAgICAgICAgICAgY29uZmlnLCBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgJmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAotICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cyAhPSBudWxscHRyID8gJnNlY29uZGFyeU1peGVzIDogbnVsbHB0ciwgb3V0cHV0VHlwZSk7CisgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzICE9IG51bGxwdHIgPyAmc2Vjb25kYXJ5TWl4ZXMgOiBudWxscHRyLCBvdXRwdXRUeXBlLCBpc1NwYXRpYWxpemVkKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQpAQCAtMTI2NSw3ICsxNDE2LDggQEAKICAgICAvLyBhbGwgTVNEIHBhdGNoZXMgdG8gcHJpb3JpdGl6ZSB0aGlzIHJlcXVlc3Qgb3ZlciBhbnkgYWN0aXZlIG91dHB1dCBvbiBNU0QuCiAgICAgcmVsZWFzZU1zZE91dHB1dFBhdGNoZXMoZGV2aWNlcyk7CiAKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKGNvbmZpZywgZGV2aWNlcywgc3RyZWFtLCBmbGFncywgb3V0cHV0KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgb3V0cHV0RGVzYy0+b3Blbihjb25maWcsIG51bGxwdHIgLyogbWl4ZXJDb25maWcgKi8sIGRldmljZXMsIHN0cmVhbSwgZmxhZ3MsIG91dHB1dCk7CiAKICAgICAvLyBvbmx5IGFjY2VwdCBhbiBvdXRwdXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CkBAIC0xMzAwLDkgKzE0NTIsMTAgQEAKIGF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yRGV2aWNlcygKICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAorICAgICAgICBib29sICppc1NwYXRpYWxpemVkLAogICAgICAgICBib29sIGZvcmNlTXV0aW5nSGFwdGljKQogewogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwpAQCAtMTMyMiw2ICsxNDc1LDkgQEAKICAgICBpZiAoKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwogICAgIH0KKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoKmF0dHIpOworCiAgICAgLy8gb25seSBhbGxvdyBkZWVwIGJ1ZmZlcmluZyBmb3IgbXVzaWMgc3RyZWFtIHR5cGUKICAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9NVVNJQykgewogICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKCpmbGFncyAmfkFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKTsKQEAgLTEzNDEsNiArMTQ5NywxOCBAQAogICAgICAgICBBTE9HVigiU2V0IFZvSVAgYW5kIERpcmVjdCBvdXRwdXQgZmxhZ3MgZm9yIFBDTSBmb3JtYXQiKTsKICAgICB9CiAKKyAgICAvLyBBdHRhY2ggdGhlIFVsdHJhc291bmQgZmxhZyBmb3IgdGhlIEFVRElPX0NPTlRFTlRfVFlQRV9VTFRSQVNPVU5ECisgICAgaWYgKGF0dHItPmNvbnRlbnRfdHlwZSA9PSBBVURJT19DT05URU5UX1RZUEVfVUxUUkFTT1VORCkgeworICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKCpmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX1VMVFJBU09VTkQpOworICAgIH0KKworICAgICppc1NwYXRpYWxpemVkID0gZmFsc2U7CisgICAgaWYgKG1TcGF0aWFsaXplck91dHB1dCAhPSBudWxscHRyCisgICAgICAgICAgICAmJiBjYW5CZVNwYXRpYWxpemVkSW50KGF0dHIsIGNvbmZpZywgZGV2aWNlcy50b1R5cGVBZGRyVmVjdG9yKCkpKSB7CisgICAgICAgICppc1NwYXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIG1TcGF0aWFsaXplck91dHB1dC0+bUlvSGFuZGxlOworICAgIH0KKwogICAgIGF1ZGlvX2NvbmZpZ190IGRpcmVjdENvbmZpZyA9ICpjb25maWc7CiAgICAgZGlyZWN0Q29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG9wZW5EaXJlY3RPdXRwdXQoc3RyZWFtLCBzZXNzaW9uLCAmZGlyZWN0Q29uZmlnLCAqZmxhZ3MsIGRldmljZXMsICZvdXRwdXQpOwpAQCAtMTQwNSw2ICsxNTczLDI3IEBACiAgICAgcmV0dXJuIG1zZFBhdGNoZXM7CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc01zZFBhdGNoKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90ICZoYW5kbGUpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+IHBhdGNoID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKKyAgICBpZiAobXNkTW9kdWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmsgPSAmcGF0Y2gtPm1QYXRjaC5zaW5rc1swXTsKKyAgICBpZiAoZ2V0TXNkQXVkaW9PdXREZXZpY2VzKCkuY29udGFpbnMobUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHNpbmstPmlkKSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGluZGV4ID0gZ2V0TXNkT3V0cHV0UGF0Y2hlcygpLmluZGV4T2ZLZXkoaGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TXNkUHJvZmlsZXMoYm9vbCBod0F2U3luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRQcm9maWxlQ29sbGVjdGlvbiAmaW5wdXRQcm9maWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3V0cHV0UHJvZmlsZUNvbGxlY3Rpb24gJm91dHB1dFByb2ZpbGVzLApAQCAtMTYwNCw2ICsxNzkzLDI4IEBACiAgICAgfQogfQogCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6bXNkSGFzUGF0Y2hlc1RvQWxsRGV2aWNlcyhjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSB7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXNUb0NoZWNrID0gbU91dHB1dERldmljZXNBbGwuZ2V0RGV2aWNlc0Zyb21EZXZpY2VUeXBlQWRkclZlYyhkZXZpY2VzKTsKKyAgICBBdWRpb1BhdGNoQ29sbGVjdGlvbiBtc2RQYXRjaGVzID0gZ2V0TXNkT3V0cHV0UGF0Y2hlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbXNkUGF0Y2hlcy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBhdXRvJiBwYXRjaCA9IG1zZFBhdGNoZXNbaV07CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGF0Y2gtPm1QYXRjaC5udW1fc2lua3M7ICsraikgeworICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rID0gJnBhdGNoLT5tUGF0Y2guc2lua3Nbal07CisgICAgICAgICAgICBpZiAoc2luay0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byYgZm91bmREZXZpY2UgPSBkZXZpY2VzVG9DaGVjay5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIHNpbmstPmV4dC5kZXZpY2UudHlwZSwgU3RyaW5nOChzaW5rLT5leHQuZGV2aWNlLmFkZHJlc3MpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlc1RvQ2hlY2sucmVtb3ZlKGZvdW5kRGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZXNUb0NoZWNrLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCkBAIC0xNjMzLDcgKzE4NDQsOCBAQAogICAgIC8vIG90aGVyIGNyaXRlcmlhCiAgICAgc3RhdGljIGNvbnN0IGF1ZGlvX291dHB1dF9mbGFnc190IGtGdW5jdGlvbmFsRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpCiAgICAgICAgIChBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYIHwgQVVESU9fT1VUUFVUX0ZMQUdfSU5DQUxMX01VU0lDIHwKLSAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX1RUUyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVF9QQ00pOworICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVFRTIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUX1BDTSB8IEFVRElPX09VVFBVVF9GTEFHX1VMVFJBU09VTkQgfAorICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfU1BBVElBTElaRVIpOwogICAgIC8vIEZsYWdzIGV4cHJlc3NpbmcgYSBwZXJmb3JtYW5jZSByZXF1ZXN0OiBoYXZlIGxvd2VyIHByaW9yaXR5IHRoYW4gc2VydmluZwogICAgIC8vIHJlcXVlc3RlZCBzYW1wbGluZyByYXRlIG9yIGNoYW5uZWwgbWFzawogICAgIHN0YXRpYyBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBrUGVyZm9ybWFuY2VGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKQEAgLTE2NTIsNiArMTg2NCw4IEBACiAgICAgLy8gVGhlIHByaW9yaXR5IGlzIGFzIGZvbGxvd3M6CiAgICAgLy8gMTogdGhlIG91dHB1dCBzdXBwb3J0aW5nIGhhcHRpYyBwbGF5YmFjayB3aGVuIHJlcXVlc3RpbmcgaGFwdGljIHBsYXliYWNrCiAgICAgLy8gMjogdGhlIG91dHB1dCB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiByZXF1ZXN0ZWQgZnVuY3Rpb25hbCBmbGFncworICAgIC8vICAgIHdpdGggdGllYnJlYWsgcHJlZmVycmluZyB0aGUgbWluaW11bSBudW1iZXIgb2YgZXh0cmEgZnVuY3Rpb25hbCBmbGFncworICAgIC8vICAgIChzZWUgYi8yMDAyOTMxMjQsIHRoZSBpbmNvcnJlY3Qgc2VsZWN0aW9uIG9mIEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlgpLgogICAgIC8vIDM6IHRoZSBvdXRwdXQgc3VwcG9ydGluZyB0aGUgZXhhY3QgY2hhbm5lbCBtYXNrCiAgICAgLy8gNDogdGhlIG91dHB1dCB3aXRoIGEgaGlnaGVyIGNoYW5uZWwgY291bnQgdGhhbiByZXF1ZXN0ZWQKICAgICAvLyA1OiB0aGUgb3V0cHV0IHdpdGggYSBoaWdoZXIgc2FtcGxpbmcgcmF0ZSB0aGFuIHJlcXVlc3RlZApAQCAtMTY5Myw3ICsxOTA3LDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBmdW5jdGlvbmFsIGZsYWdzIG1hdGNoCi0gICAgICAgIGN1cnJlbnRNYXRjaENyaXRlcmlhWzFdID0gcG9wY291bnQob3V0cHV0RGVzYy0+bUZsYWdzICYgZnVuY3Rpb25hbEZsYWdzKTsKKyAgICAgICAgY29uc3QgaW50IG1hdGNoaW5nRnVuY3Rpb25hbEZsYWdzID0KKyAgICAgICAgICAgICAgICBfX2J1aWx0aW5fcG9wY291bnQob3V0cHV0RGVzYy0+bUZsYWdzICYgZnVuY3Rpb25hbEZsYWdzKTsKKyAgICAgICAgY29uc3QgaW50IHRvdGFsRnVuY3Rpb25hbEZsYWdzID0KKyAgICAgICAgICAgICAgICBfX2J1aWx0aW5fcG9wY291bnQob3V0cHV0RGVzYy0+bUZsYWdzICYga0Z1bmN0aW9uYWxGbGFncyk7CisgICAgICAgIC8vIFByZWZlciBtYXRjaGluZyBmdW5jdGlvbmFsIGZsYWdzLCBidXQgc3VidHJhY3QgdW5uZWNlc3NhcnkgZnVuY3Rpb25hbCBmbGFncy4KKyAgICAgICAgY3VycmVudE1hdGNoQ3JpdGVyaWFbMV0gPSAxMDAgKiAobWF0Y2hpbmdGdW5jdGlvbmFsRmxhZ3MgKyAxKSAtIHRvdGFsRnVuY3Rpb25hbEZsYWdzOwogCiAgICAgICAgIC8vIGNoYW5uZWwgbWFzayBhbmQgY2hhbm5lbCBjb3VudCBtYXRjaAogICAgICAgICB1aW50MzJfdCBvdXRwdXRDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCkBAIC0xNzc3LDYgKzE5OTYsMjIgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNMZVVuaWNhc3RBY3RpdmUoKSBjb25zdCB7CisgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBpc0FueURldmljZVR5cGVBY3RpdmUoZ2V0QXVkaW9EZXZpY2VPdXRMZUF1ZGlvVW5pY2FzdFNldCgpKTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzQW55RGV2aWNlVHlwZUFjdGl2ZShjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcykgY29uc3QgeworICAgIGlmIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVzKGRldmljZVR5cGVzKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBib29sIGFjdGl2ZSA9IG1PdXRwdXRzLmlzQW55RGV2aWNlVHlwZUFjdGl2ZShkZXZpY2VUeXBlcyk7CisgICAgQUxPR1YoIiVzIGFjdGl2ZSAlZCIsIF9fZnVuY19fLCBhY3RpdmUpOworICAgIHJldHVybiBhY3RpdmU7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkZWxheU1zKQpAQCAtMTc5Miw3ICsyMDI3LDcgQEAKICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMpIHsKICAgICAgICAgQUxPR1YoIlx0IGZvdW5kIEJFQUNPTiBzdHJlYW0iKTsKICAgICAgICAgaWYgKCFtVHRzT3V0cHV0QXZhaWxhYmxlICYmIG1PdXRwdXRzLmlzQW55T3V0cHV0QWN0aXZlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1RUUykgLypzb3VyY2VUb0lnbm9yZSovKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1RUUywgZmFsc2UpIC8qc291cmNlVG9JZ25vcmUqLykpIHsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJlYWNvbk11dGVMYXRlbmN5ID0gaGFuZGxlRXZlbnRGb3JCZWFjb24oU1RBUlRJTkdfQkVBQ09OKTsKQEAgLTE4MDQsOCArMjAzOSw3IEBACiAKICAgICAvLyBmb3JjZSBkZXZpY2UgY2hhbmdlIGlmIHRoZSBvdXRwdXQgaXMgaW5hY3RpdmUgYW5kIG5vIGF1ZGlvIHBhdGNoIGlzIGFscmVhZHkgcHJlc2VudC4KICAgICAvLyBjaGVjayBhY3RpdmUgYmVmb3JlIGluY3JlbWVudGluZyB1c2FnZSBjb3VudAotICAgIGJvb2wgZm9yY2UgPSAhb3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJgotICAgICAgICAgICAgKG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkgPT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpOworICAgIGJvb2wgZm9yY2UgPSAhb3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAhb3V0cHV0RGVzYy0+aXNSb3V0ZWQoKTsKIAogICAgIERldmljZVZlY3RvciBkZXZpY2VzOwogICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBvdXRwdXREZXNjLT5tUG9saWN5TWl4LnByb21vdGUoKTsKQEAgLTE4MjksNiArMjA2Myw3IEBACiAgICAgLy8gYW5kIG11dGluZyB3b3VsZCByZXN1bHQgaW4gdW5uZWNlc3NhcnkgZGVsYXkgYW5kIGRyb3BwZWQgYXVkaW8uCiAgICAgY29uc3QgdWludDMyX3Qgb3V0cHV0TGF0ZW5jeU1zID0gb3V0cHV0RGVzYy0+bGF0ZW5jeSgpOwogICAgIGJvb2wgcmVxdWlyZXNNdXRlQ2hlY2sgPSBvdXRwdXREZXNjLT5pc0FjdGl2ZShvdXRwdXRMYXRlbmN5TXMgKiAyKTsgIC8vIGFjY291bnQgZm9yIGRyYWluCisgICAgYm9vbCB3YXNMZVVuaWNhc3RBY3RpdmUgPSBpc0xlVW5pY2FzdEFjdGl2ZSgpOwogCiAgICAgLy8gaW5jcmVtZW50IHVzYWdlIGNvdW50IGZvciB0aGlzIHN0cmVhbSBvbiB0aGUgcmVxdWVzdGVkIG91dHB1dDoKICAgICAvLyBOT1RFIHRoYXQgdGhlIHVzYWdlIGNvdW50IGlzIHRoZSBzYW1lIGZvciBkdXBsaWNhdGVkIG91dHB1dCBhbmQgaGFyZHdhcmUgb3V0cHV0IHdoaWNoIGlzCkBAIC0xOTA3LDExICsyMTQyLDE1IEBACiAKICAgICAgICAgLy8gYXBwbHkgdm9sdW1lIHJ1bGVzIGZvciBjdXJyZW50IHN0cmVhbSBhbmQgZGV2aWNlIGlmIG5lY2Vzc2FyeQogICAgICAgICBhdXRvICZjdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoY2xpZW50LT5hdHRyaWJ1dGVzKCkpOwotICAgICAgICBjaGVja0FuZFNldFZvbHVtZShjdXJ2ZXMsIGNsaWVudC0+dm9sdW1lU291cmNlKCksCisgICAgICAgIGlmIChOT19FUlJPUiAhPSBjaGVja0FuZFNldFZvbHVtZShjdXJ2ZXMsIGNsaWVudC0+dm9sdW1lU291cmNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlcy5nZXRWb2x1bWVJbmRleChvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpLCAwIC8qZGVsYXkqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+dXNlSHdHYWluKCkgLypmb3JjZSovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+dXNlSHdHYWluKCkgLypmb3JjZSovKSkgeworICAgICAgICAgICAgLy8gcmVxdWVzdCBBdWRpb1NlcnZpY2UgdG8gcmVpbml0aWFsaXplIHRoZSB2b2x1bWUgY3VydmVzIGFzeW5jaHJvbm91c2x5CisgICAgICAgICAgICBBTE9HRSgiY2hlY2tBbmRTZXRWb2x1bWUgZmFpbGVkLCByZXF1ZXN0aW5nIHZvbHVtZSByYW5nZSBpbml0Iik7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCk7CisgICAgICAgIH07CiAKICAgICAgICAgLy8gdXBkYXRlIHRoZSBvdXRwdXRzIGlmIHN0YXJ0aW5nIGFuIG91dHB1dCB3aXRoIGEgc3RyZWFtIHRoYXQgY2FuIGFmZmVjdCBub3RpZmljYXRpb24KICAgICAgICAgLy8gcm91dGluZwpAQCAtMTk1Miw5ICsyMTkxLDM4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgfQogCisgICAgY2hlY2tMZUJyb2FkY2FzdFJvdXRlcyh3YXNMZVVuaWNhc3RBY3RpdmUsIG91dHB1dERlc2MsICpkZWxheU1zKTsKKwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrTGVCcm9hZGNhc3RSb3V0ZXMoYm9vbCB3YXNVbmljYXN0QWN0aXZlLAorICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaWdub3JlZE91dHB1dCwgdWludDMyX3QgZGVsYXlNcykgeworICAgIGJvb2wgaXNVbmljYXN0QWN0aXZlID0gaXNMZVVuaWNhc3RBY3RpdmUoKTsKKworICAgIGlmICh3YXNVbmljYXN0QWN0aXZlICE9IGlzVW5pY2FzdEFjdGl2ZSkgeworICAgICAgICAvL3Jlcm91dGUgYWxsIG91dHB1dHMgcm91dGVkIHRvIExFIGJyb2FkY2FzdCBpZiBMRSB1bmljYXN0IGFjdGl2eSBjaGFuZ2VkIG9uIGFueSBvdXRwdXQKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKGRlc2MgIT0gaWdub3JlZE91dHB1dCAmJiBkZXNjLT5pc0FjdGl2ZSgpCisgICAgICAgICAgICAgICAgICAgICYmICgoaXNVbmljYXN0QWN0aXZlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRlc2MtPmRldmljZXMoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX0JMRV9CUk9BRENBU1QpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh3YXNVbmljYXN0QWN0aXZlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRlc2MtPmRldmljZXMoKS5nZXREZXZpY2VzRnJvbVR5cGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QXVkaW9EZXZpY2VPdXRMZUF1ZGlvVW5pY2FzdFNldCgpKS5pc0VtcHR5KCkpKSkgeworICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhkZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZGVzYy0+ZGV2aWNlcygpICE9IG5ld0RldmljZXM7CisgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhkZXNjLCBuZXdEZXZpY2VzLCBmb3JjZSwgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgLy8gcmUtYXBwbHkgZGV2aWNlIHNwZWNpZmljIHZvbHVtZSBpZiBub3QgZG9uZSBieSBzZXRPdXRwdXREZXZpY2UoKQorICAgICAgICAgICAgICAgIGlmICghZm9yY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKGRlc2MsIG5ld0RldmljZXMudHlwZXMoKSwgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKQEAgLTE5ODMsNiArMjI1MSw3IEBACiAgICAgLy8gYWx3YXlzIGhhbmRsZSBzdHJlYW0gc3RvcCwgY2hlY2sgd2hpY2ggc3RyZWFtIHR5cGUgaXMgc3RvcHBpbmcKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IGNsaWVudC0+c3RyZWFtKCk7CiAgICAgYXV0byBjbGllbnRWb2xTcmMgPSBjbGllbnQtPnZvbHVtZVNvdXJjZSgpOworICAgIGJvb2wgd2FzTGVVbmljYXN0QWN0aXZlID0gaXNMZVVuaWNhc3RBY3RpdmUoKTsKIAogICAgIGhhbmRsZUV2ZW50Rm9yQmVhY29uKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVFRTID8gU1RPUFBJTkdfQkVBQ09OIDogU1RPUFBJTkdfT1VUUFVUKTsKIApAQCAtMjAxNCwxMiArMjI4MywyMCBAQAogICAgICAgICBpZiAob3V0cHV0RGVzYy0+Z2V0QWN0aXZpdHlDb3VudChjbGllbnRWb2xTcmMpID09IDAgfHwgZm9yY2VEZXZpY2VVcGRhdGUpIHsKICAgICAgICAgICAgIG91dHB1dERlc2MtPnNldFN0b3BUaW1lKGNsaWVudCwgc3lzdGVtVGltZSgpKTsKICAgICAgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIHJvdXRpbmcgZG9lcyBub3QgY2hhbmdlLCBpZiBhbiBvdXRwdXQgaXMgcm91dGVkIG9uIGEgZGV2aWNlIHVzaW5nIEh3R2FpbgorICAgICAgICAgICAgLy8gKGFrYSBzZXRBdWRpb1BvcnRDb25maWcpIGFuZCB0aGVyZSBhcmUgc3RpbGwgYWN0aXZlIGNsaWVudHMgZm9sbG93aW5nIGRpZmZlcmVudAorICAgICAgICAgICAgLy8gdm9sdW1lIGdyb3VwKHMpLCBmb3JjZSByZWFwcGx5IHZvbHVtZQorICAgICAgICAgICAgYm9vbCByZXF1aXJlc1ZvbHVtZUNoZWNrID0gb3V0cHV0RGVzYy0+Z2V0QWN0aXZpdHlDb3VudChjbGllbnRWb2xTcmMpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+dXNlSHdHYWluKCkgJiYgb3V0cHV0RGVzYy0+aXNBbnlBY3RpdmUoVk9MVU1FX1NPVVJDRV9OT05FKTsKKwogICAgICAgICAgICAgLy8gZGVsYXkgdGhlIGRldmljZSBzd2l0Y2ggYnkgdHdpY2UgdGhlIGxhdGVuY3kgYmVjYXVzZSBzdG9wT3V0cHV0KCkgaXMgZXhlY3V0ZWQgd2hlbgogICAgICAgICAgICAgLy8gdGhlIHRyYWNrIHN0b3AoKSBjb21tYW5kIGlzIHJlY2VpdmVkIGFuZCBhdCB0aGF0IHRpbWUgdGhlIGF1ZGlvIHRyYWNrIGJ1ZmZlciBjYW4KICAgICAgICAgICAgIC8vIHN0aWxsIGNvbnRhaW4gZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGRyYWluZWQuIFRoZSBsYXRlbmN5IG9ubHkgY292ZXJzIHRoZSBhdWRpbyBIQUwKICAgICAgICAgICAgIC8vIGFuZCBrZXJuZWwgYnVmZmVycy4gQWxzbyB0aGUgbGF0ZW5jeSBkb2VzIG5vdCBhbHdheXMgaW5jbHVkZSBhZGRpdGlvbmFsIGRlbGF5IGluIHRoZQogICAgICAgICAgICAgLy8gYXVkaW8gcGF0aCAoYXVkaW8gRFNQLCBDT0RFQyAuLi4pCi0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIG5ld0RldmljZXMsIGZhbHNlLCBvdXRwdXREZXNjLT5sYXRlbmN5KCkqMik7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIG5ld0RldmljZXMsIGZhbHNlLCBvdXRwdXREZXNjLT5sYXRlbmN5KCkqMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgdHJ1ZSAvKnJlcXVpcmVzTXV0ZUNoZWNrKi8sIHJlcXVpcmVzVm9sdW1lQ2hlY2spOwogCiAgICAgICAgICAgICAvLyBmb3JjZSByZXN0b3JpbmcgdGhlIGRldmljZSBzZWxlY3Rpb24gb24gb3RoZXIgYWN0aXZlIG91dHB1dHMgaWYgaXQgZGlmZmVycyBmcm9tIHRoZQogICAgICAgICAgICAgLy8gb25lIGJlaW5nIHNlbGVjdGVkIGZvciB0aGlzIG91dHB1dApAQCAtMjA1Myw2ICsyMzMwLDkgQEAKICAgICAgICAgaWYgKGZvbGxvd3NTYW1lUm91dGluZyhjbGllbnQtPmF0dHJpYnV0ZXMoKSwgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSkpKSB7CiAgICAgICAgICAgICBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKICAgICAgICAgfQorCisgICAgICAgIGNoZWNrTGVCcm9hZGNhc3RSb3V0ZXMod2FzTGVVbmljYXN0QWN0aXZlLCBvdXRwdXREZXNjLCBvdXRwdXREZXNjLT5sYXRlbmN5KCkqMik7CisKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dXKCJzdG9wT3V0cHV0KCkgcmVmY291bnQgaXMgYWxyZWFkeSAwIik7CkBAIC0yMTIzLDExICsyNDAzLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCiB7CiAgICAgQUxPR1YoIiVzKCkgc291cmNlICVkLCBzYW1wbGluZyByYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4LCBzZXNzaW9uICVkLCAiCi0gICAgICAgICAgImZsYWdzICUjeCBhdHRyaWJ1dGVzPSVzIiwgX19mdW5jX18sIGF0dHItPnNvdXJjZSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssIHNlc3Npb24sIGZsYWdzLCB0b1N0cmluZygqYXR0cikuY19zdHIoKSk7CisgICAgICAgICAgImZsYWdzICUjeCBhdHRyaWJ1dGVzPSVzIHJlcXVlc3RlZCBkZXZpY2UgSUQgJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBhdHRyLT5zb3VyY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKKyAgICAgICAgICBzZXNzaW9uLCBmbGFncywgdG9TdHJpbmcoKmF0dHIpLmNfc3RyKCksICpzZWxlY3RlZERldmljZUlkKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGF1ZGlvX3NvdXJjZV90IGhhbElucHV0U291cmNlOwogICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gKmF0dHI7CiAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peDsKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CkBAIC0yMTQ3LDcgKzI0MjcsNyBAQAogICAgIH0KIAogICAgIC8vIEV4cGxpY2l0IHJvdXRpbmc/Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZXhwbGljaXRSb3V0aW5nRGV2aWNlID0gCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZXhwbGljaXRSb3V0aW5nRGV2aWNlID0KICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKCpzZWxlY3RlZERldmljZUlkKTsKIAogICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgbW1hcCBjYXB0dXJlOiBpZiBhbiBpbnB1dCBJTyBoYW5kbGUgaXMgc3BlY2lmaWVkLCB3ZSByZXVzZSB0aGlzIGlucHV0IGlmCkBAIC0yMTk4LDggKzI0NzgsNiBAQAogICAgICppbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfSU5WQUxJRDsKIAotICAgIGhhbElucHV0U291cmNlID0gYXR0cmlidXRlcy5zb3VyY2U7Ci0KICAgICBpZiAoYXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVggJiYKICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDApIHsKICAgICAgICAgc3RhdHVzID0gbVBvbGljeU1peGVzLmdldElucHV0TWl4Rm9yQXR0cihhdHRyaWJ1dGVzLCAmcG9saWN5TWl4KTsKQEAgLTIzMTMsNiArMjU5MSwxMCBAQAogICAgICAgICBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX0lOUFVUX0ZMQUdfVk9JUF9UWCk7CiAgICAgfQogCisgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9VTFRSQVNPVU5EKSB7CisgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19VTFRSQVNPVU5EKTsKKyAgICB9CisKICAgICAvLyBmaW5kIGEgY29tcGF0aWJsZSBpbnB1dCBwcm9maWxlIChub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsIGluIHBhcmFtZXRlcnMpCiAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOwogICAgIC8vIHNhbXBsaW5nIHJhdGUgYW5kIGZsYWdzIG1heSBiZSB1cGRhdGVkIGJ5IGdldElucHV0UHJvZmlsZQpAQCAtMjMyOSwxMSArMjYxMSwxMSBAQAogICAgICAgICAgICAgYnJlYWs7IC8vIHN1Y2Nlc3MKICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX1JBVykgewogICAgICAgICAgICAgcHJvZmlsZUZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChwcm9maWxlRmxhZ3MgJiB+QVVESU9fSU5QVVRfRkxBR19SQVcpOyAvLyByZXRyeQotICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVGbGFncyAhPSBBVURJT19JTlBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlRmxhZ3MgIT0gQVVESU9fSU5QVVRfRkxBR19OT05FICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CiAgICAgICAgICAgICBwcm9maWxlRmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7IC8vIHJldHJ5CiAgICAgICAgIH0gZWxzZSB7IC8vIGZhaWwKICAgICAgICAgICAgIEFMT0dXKCIlcyBjb3VsZCBub3QgZmluZCBwcm9maWxlIGZvciBkZXZpY2UgJXMsIHNhbXBsaW5nIHJhdGUgJXUsIGZvcm1hdCAlI3gsICIKLSAgICAgICAgICAgICAgICAgICJjaGFubmVsIG1hc2sgMHglWCwgZmxhZ3MgJSN4IiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCAKKyAgICAgICAgICAgICAgICAgICJjaGFubmVsIG1hc2sgMHglWCwgZmxhZ3MgJSN4IiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBmbGFncyk7CiAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICAgICAgIH0KQEAgLTI3NzUsNiArMzA1Nyw4IEBACiAgICAgICAgIC8vIEhXIEdhaW4gbWFuYWdlbWVudCwgZG8gbm90IGNoYW5nZSB0aGUgdm9sdW1lCiAgICAgICAgIGlmIChkZXNjLT51c2VId0dhaW4oKSkgewogICAgICAgICAgICAgYXBwbHlWb2x1bWUgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vIElmIHRoZSB2b2x1bWUgc291cmNlIGlzIGFjdGl2ZSB3aXRoIGhpZ2hlciBwcmlvcml0eSBzb3VyY2UsIGVuc3VyZSBhdCBsZWFzdCBTdyBNdXRlZAorICAgICAgICAgICAgZGVzYy0+c2V0U3dNdXRlKChpbmRleCA9PSAwKSwgdnMsIGN1cnZlcy5nZXRTdHJlYW1UeXBlcygpLCBjdXJEZXZpY2VzLCAwIC8qZGVsYXlNcyovKTsKICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmcHJvZHVjdFN0cmF0ZWd5IDogbUVuZ2luZS0+Z2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCkpIHsKICAgICAgICAgICAgICAgICBhdXRvIGFjdGl2ZUNsaWVudHMgPSBkZXNjLT5jbGllbnRzTGlzdCh0cnVlIC8qYWN0aXZlT25seSovLCBwcm9kdWN0U3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLypwcmVmZXJyZWREZXZpY2UqLyk7CkBAIC0yODE0LDcgKzMwOTgsNyBAQAogICAgICAgICAvLyBoYW5kbGVkIGJ5IHN5c3RlbSBVSQogICAgICAgICBzdGF0dXNfdCB2b2xTdGF0dXMgPSBjaGVja0FuZFNldFZvbHVtZSgKICAgICAgICAgICAgICAgICAgICAgY3VydmVzLCB2cywgaW5kZXgsIGRlc2MsIGN1ckRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICgodnMgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSkpPworICAgICAgICAgICAgICAgICAgICAoKHZzID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9TWVNURU0sIGZhbHNlKSk/CiAgICAgICAgICAgICAgICAgICAgICAgICAgVE9VQ0hfU09VTkRfRklYRURfREVMQVlfTVMgOiAwKSk7CiAgICAgICAgIGlmICh2b2xTdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKQEAgLTI5NzYsOSArMzI2MCwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBtRWZmZWN0cy5yZWdpc3RlckVmZmVjdChkZXNjLCBpbywgc2Vzc2lvbiwgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJhdGVneSA9PSBzdHJlYW1Ub1N0cmF0ZWd5KEFVRElPX1NUUkVBTV9NVVNJQykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FKSk7CisgICAgYm9vbCBpc011c2ljRWZmZWN0ID0gKHNlc3Npb24gIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChzdHJhdGVneSA9PSBzdHJlYW1Ub1N0cmF0ZWd5KEFVRElPX1NUUkVBTV9NVVNJQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0cmF0ZWd5ID09IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSkpOworICAgIHJldHVybiBtRWZmZWN0cy5yZWdpc3RlckVmZmVjdChkZXNjLCBpbywgc2Vzc2lvbiwgaWQsIGlzTXVzaWNFZmZlY3QpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQpAQCAtMzAxNiwxMiArMzMwMSwxNCBAQAogCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewotICAgIHJldHVybiBtT3V0cHV0cy5pc0FjdGl2ZSh0b1ZvbHVtZVNvdXJjZShzdHJlYW0pLCBpblBhc3RNcyk7CisgICAgYXV0byB2cyA9IHRvVm9sdW1lU291cmNlKHN0cmVhbSwgZmFsc2UpOworICAgIHJldHVybiB2cyAhPSBWT0xVTUVfU09VUkNFX05PTkUgPyBtT3V0cHV0cy5pc0FjdGl2ZSh2cywgaW5QYXN0TXMpIDogZmFsc2U7CiB9CiAKIGJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKIHsKLSAgICByZXR1cm4gbU91dHB1dHMuaXNBY3RpdmVSZW1vdGVseSh0b1ZvbHVtZVNvdXJjZShzdHJlYW0pLCBpblBhc3RNcyk7CisgICAgYXV0byB2cyA9IHRvVm9sdW1lU291cmNlKHN0cmVhbSwgZmFsc2UpOworICAgIHJldHVybiB2cyAhPSBWT0xVTUVfU09VUkNFX05PTkUgPyBtT3V0cHV0cy5pc0FjdGl2ZVJlbW90ZWx5KHZzLCBpblBhc3RNcykgOiBmYWxzZTsKIH0KIAogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKQEAgLTMzNTIsNiArMzYzOSw3IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQ2FsbEFuZE91dHB1dFJvdXRpbmcoYm9vbCBmb3JjZVZvbHVtZVJlZXZhbCwgdWludDMyX3QgZGVsYXlNcykKIHsKICAgICB1aW50MzJfdCB3YWl0TXMgPSAwOworICAgIGJvb2wgd2FzTGVVbmljYXN0QWN0aXZlID0gaXNMZVVuaWNhc3RBY3RpdmUoKTsKICAgICBpZiAodXBkYXRlQ2FsbFJvdXRpbmcodHJ1ZSAvKmZyb21DYWNoZSovLCBkZWxheU1zLCAmd2FpdE1zKSA9PSBOT19FUlJPUikgewogICAgICAgICAvLyBPbmx5IGFwcGx5IHNwZWNpYWwgdG91Y2ggc291bmQgZGVsYXkgb25jZQogICAgICAgICBkZWxheU1zID0gMDsKQEAgLTMzNTksMTEgKzM2NDcsMTUgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGlmICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKG91dHB1dERlc2MgIT0gbVByaW1hcnlPdXRwdXQpKSB7CisgICAgICAgIGlmICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwKKyAgICAgICAgICAgICAgICAob3V0cHV0RGVzYyAhPSBtUHJpbWFyeU91dHB1dCAmJiAhaXNUZWxlcGhvbnlSeE9yVHgob3V0cHV0RGVzYykpKSB7CiAgICAgICAgICAgICAvLyBBcyBkb25lIGluIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSwgd2UgY291bGQgYWxzbyBmaXggZGVmYXVsdCBkZXZpY2UgaXNzdWUgYnkKICAgICAgICAgICAgIC8vIHByZXZlbnRpbmcgdGhlIGZvcmNlIHJlLXJvdXRpbmcgaW4gY2FzZSBvZiBkZWZhdWx0IGRldiB0aGF0IGRpc3Rpbmd1aXNoZXMgb24gYWRkcmVzcy4KICAgICAgICAgICAgIC8vIExldCdzIGdpdmUgYmFjayB0byBlbmdpbmUgZnVsbCBkZXZpY2UgY2hvaWNlIGRlY2lzaW9uIGhvd2V2ZXIuCi0gICAgICAgICAgICB3YWl0TXMgPSBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIG5ld0RldmljZXMsICFuZXdEZXZpY2VzLmlzRW1wdHkoKSwgZGVsYXlNcyk7CisgICAgICAgICAgICBib29sIGZvcmNlUm91dGluZyA9ICFuZXdEZXZpY2VzLmlzRW1wdHkoKTsKKyAgICAgICAgICAgIHdhaXRNcyA9IHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlcywgZm9yY2VSb3V0aW5nLCBkZWxheU1zLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qcmVxdWlyZXNNdXRlQ2hlY2sqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZvcmNlUm91dGluZyAvKnJlcXVpcmVzVm9sdW1lQ2hlY2sqLyk7CiAgICAgICAgICAgICAvLyBPbmx5IGFwcGx5IHNwZWNpYWwgdG91Y2ggc291bmQgZGVsYXkgb25jZQogICAgICAgICAgICAgZGVsYXlNcyA9IDA7CiAgICAgICAgIH0KQEAgLTMzNzEsNiArMzY2Myw3IEBACiAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlcy50eXBlcygpLCB3YWl0TXMsIHRydWUpOwogICAgICAgICB9CiAgICAgfQorICAgIGNoZWNrTGVCcm9hZGNhc3RSb3V0ZXMod2FzTGVVbmljYXN0QWN0aXZlLCBudWxscHRyLCBkZWxheU1zKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUlucHV0Um91dGluZygpIHsKQEAgLTM1MzIsNyArMzgyNSw3IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7CiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuQXVkaW9Qb2xpY3lNYW5hZ2VyIER1bXA6ICVwXG4iLCB0aGlzKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFByaW1hcnkgT3V0cHV0OiAlZFxuIiwKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFByaW1hcnkgT3V0cHV0IEkvTyBoYW5kbGU6ICVkXG4iLAogICAgICAgICAgICAgIGhhc1ByaW1hcnlPdXRwdXQoKSA/IG1QcmltYXJ5T3V0cHV0LT5tSW9IYW5kbGUgOiBBVURJT19JT19IQU5ETEVfTk9ORSk7CiAgICAgc3RkOjpzdHJpbmcgc3RhdGVMaXRlcmFsOwogICAgIEF1ZGlvTW9kZUNvbnZlcnRlcjo6dG9TdHJpbmcobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpLCBzdGF0ZUxpdGVyYWwpOwpAQCAtMzU1NCwxNSArMzg0NywxNyBAQAogICAgIH0KICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFRUUyBvdXRwdXQgJXNhdmFpbGFibGVcbiIsIG1UdHNPdXRwdXRBdmFpbGFibGUgPyAiIiA6ICJub3QgIik7CiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBNYXN0ZXIgbW9ubzogJXNcbiIsIG1NYXN0ZXJNb25vID8gIm9uIiA6ICJvZmYiKTsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENvbW11bm5pY2F0aW9uIFN0cmF0ZWd5OiAlZFxuIiwgbUNvbW11bm5pY2F0aW9uU3RyYXRlZ3kpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ29tbXVuaWNhdGlvbiBTdHJhdGVneSBpZDogJWRcbiIsIG1Db21tdW5uaWNhdGlvblN0cmF0ZWd5KTsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENvbmZpZyBzb3VyY2U6ICVzXG4iLCBtQ29uZmlnLmdldFNvdXJjZSgpLmNfc3RyKCkpOyAvLyBnZXRDb25maWcgbm90IGNvbnN0CiAKLSAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiQXZhaWxhYmxlIG91dHB1dCIpKTsKLSAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJBdmFpbGFibGUgaW5wdXQiKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkF2YWlsYWJsZSBvdXRwdXQiKSwgMSk7CisgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiQXZhaWxhYmxlIGlucHV0IiksIDEpOwogICAgIG1Id01vZHVsZXNBbGwuZHVtcChkc3QpOwogICAgIG1PdXRwdXRzLmR1bXAoZHN0KTsKICAgICBtSW5wdXRzLmR1bXAoZHN0KTsKLSAgICBtRWZmZWN0cy5kdW1wKGRzdCk7CisgICAgbUVmZmVjdHMuZHVtcChkc3QsIDEpOwogICAgIG1BdWRpb1BhdGNoZXMuZHVtcChkc3QpOwogICAgIG1Qb2xpY3lNaXhlcy5kdW1wKGRzdCk7CiAgICAgbUF1ZGlvU291cmNlcy5kdW1wKGRzdCk7CkBAIC0zNjAyLDUzICszODk3LDcgQEAKICAgICAgb2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUsIG9mZmxvYWRJbmZvLmJpdF9yYXRlLCBvZmZsb2FkSW5mby5kdXJhdGlvbl91cywKICAgICAgb2ZmbG9hZEluZm8uaGFzX3ZpZGVvKTsKIAotICAgIGlmIChtTWFzdGVyTW9ubykgewotICAgICAgICByZXR1cm4gQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEOyAvLyBubyBvZmZsb2FkaW5nIGlmIG1vbm8gaXMgc2V0LgotICAgIH0KLQotICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaGFzIGJlZW4gZGlzYWJsZWQKLSAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woImF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pKSB7Ci0gICAgICAgIEFMT0dWKCIlczogb2ZmbG9hZCBkaXNhYmxlZCBieSBhdWRpby5vZmZsb2FkLmRpc2FibGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBBVURJT19PRkZMT0FEX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHR5cGUgaXMgbXVzaWMsIHRoZW4gb25seSBhbGxvdyBvZmZsb2FkIGFzIG9mIG5vdy4KLSAgICBpZiAob2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUgIT0gQVVESU9fU1RSRUFNX01VU0lDKQotICAgIHsKLSAgICAgICAgQUxPR1YoIiVzOiBzdHJlYW1fdHlwZSAhPSBNVVNJQywgcmV0dXJuaW5nIGZhbHNlIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIC8vVE9ETzogZW5hYmxlIGF1ZGlvIG9mZmxvYWRpbmcgd2l0aCB2aWRlbyB3aGVuIHJlYWR5Ci0gICAgY29uc3QgYm9vbCBhbGxvd09mZmxvYWRXaXRoVmlkZW8gPQotICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woImF1ZGlvLm9mZmxvYWQudmlkZW8iLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKLSAgICBpZiAob2ZmbG9hZEluZm8uaGFzX3ZpZGVvICYmICFhbGxvd09mZmxvYWRXaXRoVmlkZW8pIHsKLSAgICAgICAgQUxPR1YoIiVzOiBoYXNfdmlkZW8gPT0gdHJ1ZSwgcmV0dXJuaW5nIGZhbHNlIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIC8vSWYgZHVyYXRpb24gaXMgbGVzcyB0aGFuIG1pbmltdW0gdmFsdWUgZGVmaW5lZCBpbiBwcm9wZXJ0eSwgcmV0dXJuIGZhbHNlCi0gICAgY29uc3QgaW50IG1pbl9kdXJhdGlvbl9zZWNzID0gcHJvcGVydHlfZ2V0X2ludDMyKAotICAgICAgICAgICAgImF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MiLCAtMSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKLSAgICBpZiAobWluX2R1cmF0aW9uX3NlY3MgPj0gMCkgewotICAgICAgICBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCBtaW5fZHVyYXRpb25fc2VjcyAqIDEwMDAwMDBMTCkgewotICAgICAgICAgICAgQUxPR1YoIiVzOiBPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtaW5fZHVyYXRpb25fc2Vjcyk7Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyAqIDEwMDAwMDApIHsKLSAgICAgICAgQUxPR1YoIiVzOiBPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGRlZmF1bHQgbWluKD0ldSkiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MpOwotICAgICAgICByZXR1cm4gQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIC8vIERvIG5vdCBhbGxvdyBvZmZsb2FkaW5nIGlmIG9uZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0IGlzIGVuYWJsZWQuIFRoaXMgcHJldmVudHMgZnJvbQotICAgIC8vIGNyZWF0aW5nIGFuIG9mZmxvYWRlZCB0cmFjayBhbmQgdGVhcmluZyBpdCBkb3duIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0IHdoZW4gYXVkaW9mbGluZ2VyCi0gICAgLy8gZGV0ZWN0cyB0aGVyZSBpcyBhbiBhY3RpdmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdC4KLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGNoZWNrIHRoZSBhdWRpbyBzZXNzaW9uIGhlcmUgYnV0IHdlIGRvIG5vdCBoYXZlIGl0IGluIHRoaXMgY29udGV4dC4KLSAgICAvLyBUaGlzIG1heSBwcmV2ZW50IG9mZmxvYWRpbmcgaW4gcmFyZSBzaXR1YXRpb25zIHdoZXJlIGVmZmVjdHMgYXJlIGxlZnQgYWN0aXZlIGJ5IGFwcHMKLSAgICAvLyBpbiB0aGUgYmFja2dyb3VuZC4KLSAgICBpZiAobUVmZmVjdHMuaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSkgeworICAgIGlmICghaXNPZmZsb2FkUG9zc2libGUob2ZmbG9hZEluZm8pKSB7CiAgICAgICAgIHJldHVybiBBVURJT19PRkZMT0FEX05PVF9TVVBQT1JURUQ7CiAgICAgfQogCkBAIC0zNjc2LDcgKzM5MjUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgewogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG91dHB1dF9mbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CiAgICAgYXVkaW9fZmxhZ3NfdG9fYXVkaW9fb3V0cHV0X2ZsYWdzKGF0dHJpYnV0ZXMuZmxhZ3MsICZvdXRwdXRfZmxhZ3MpOwotICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JPdXRwdXQoRGV2aWNlVmVjdG9yKCkgLyppZ25vcmUgZGV2aWNlICovLAorICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gZ2V0UHJvZmlsZUZvck91dHB1dChvdXRwdXREZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssCkBAIC0zNjg3LDcgKzM5MzcsMTk3IEBACiAgICAgICAgIF9fRlVOQ1RJT05fXywgcHJvZmlsZSAhPSAwID8gIiIgOiAiTk9UICIsCiAgICAgICAgIChwcm9maWxlICE9IDAgPyBwcm9maWxlLT5nZXRUYWdOYW1lKCkuY19zdHIoKSA6ICJudWxsIiksCiAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwgY29uZmlnLmZvcm1hdCwgY29uZmlnLmNoYW5uZWxfbWFzaywgb3V0cHV0X2ZsYWdzKTsKLSAgICByZXR1cm4gKHByb2ZpbGUgIT0gMCk7CisKKyAgICAvLyBhbHNvIHRyeSB0aGUgTVNEIG1vZHVsZSBpZiBjb21wYXRpYmxlIHByb2ZpbGUgbm90IGZvdW5kCisgICAgaWYgKHByb2ZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBwcm9maWxlID0gZ2V0TXNkUHJvZmlsZUZvck91dHB1dChvdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZGlyZWN0T25seSAqLyk7CisgICAgICAgIEFMT0dWKCIlcygpIE1TRCBwcm9maWxlICVzZm91bmQgd2l0aCBuYW1lOiAlcywgIgorICAgICAgICAgICAgInNhbXBsZSByYXRlOiAldSwgZm9ybWF0OiAweCV4LCBjaGFubmVsX21hc2s6IDB4JXgsIG91dHB1dCBmbGFnczogMHgleCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHByb2ZpbGUgIT0gMCA/ICIiIDogIk5PVCAiLAorICAgICAgICAgICAgKHByb2ZpbGUgIT0gMCA/IHByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpIDogIm51bGwiKSwKKyAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwgY29uZmlnLmZvcm1hdCwgY29uZmlnLmNoYW5uZWxfbWFzaywgb3V0cHV0X2ZsYWdzKTsKKyAgICB9CisgICAgcmV0dXJuIChwcm9maWxlICE9IG51bGxwdHIpOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNPZmZsb2FkUG9zc2libGUoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgJm9mZmxvYWRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZHVyYXRpb25JZ25vcmVkKSB7CisgICAgaWYgKG1NYXN0ZXJNb25vKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm8gb2ZmbG9hZGluZyBpZiBtb25vIGlzIHNldC4KKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGhhcyBiZWVuIGRpc2FibGVkCisgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJhdWRpby5vZmZsb2FkLmRpc2FibGUiLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKSkgeworICAgICAgICBBTE9HVigiJXM6IG9mZmxvYWQgZGlzYWJsZWQgYnkgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHR5cGUgaXMgbXVzaWMsIHRoZW4gb25seSBhbGxvdyBvZmZsb2FkIGFzIG9mIG5vdy4KKyAgICBpZiAob2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUgIT0gQVVESU9fU1RSRUFNX01VU0lDKQorICAgIHsKKyAgICAgICAgQUxPR1YoIiVzOiBzdHJlYW1fdHlwZSAhPSBNVVNJQywgcmV0dXJuaW5nIGZhbHNlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy9UT0RPOiBlbmFibGUgYXVkaW8gb2ZmbG9hZGluZyB3aXRoIHZpZGVvIHdoZW4gcmVhZHkKKyAgICBjb25zdCBib29sIGFsbG93T2ZmbG9hZFdpdGhWaWRlbyA9CisgICAgICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgiYXVkaW8ub2ZmbG9hZC52aWRlbyIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pOworICAgIGlmIChvZmZsb2FkSW5mby5oYXNfdmlkZW8gJiYgIWFsbG93T2ZmbG9hZFdpdGhWaWRlbykgeworICAgICAgICBBTE9HVigiJXM6IGhhc192aWRlbyA9PSB0cnVlLCByZXR1cm5pbmcgZmFsc2UiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvL0lmIGR1cmF0aW9uIGlzIGxlc3MgdGhhbiBtaW5pbXVtIHZhbHVlIGRlZmluZWQgaW4gcHJvcGVydHksIHJldHVybiBmYWxzZQorICAgIGNvbnN0IGludCBtaW5fZHVyYXRpb25fc2VjcyA9IHByb3BlcnR5X2dldF9pbnQzMigKKyAgICAgICAgICAgICJhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIiwgLTEgLyogZGVmYXVsdF92YWx1ZSAqLyk7CisgICAgaWYgKCFkdXJhdGlvbklnbm9yZWQpIHsKKyAgICAgICAgaWYgKG1pbl9kdXJhdGlvbl9zZWNzID49IDApIHsKKyAgICAgICAgICAgIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IG1pbl9kdXJhdGlvbl9zZWNzICogMTAwMDAwMExMKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1pbl9kdXJhdGlvbl9zZWNzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MgKiAxMDAwMDAwKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IE9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgZGVmYXVsdCBtaW4oPSV1KSIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIERvIG5vdCBhbGxvdyBvZmZsb2FkaW5nIGlmIG9uZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0IGlzIGVuYWJsZWQuIFRoaXMgcHJldmVudHMgZnJvbQorICAgIC8vIGNyZWF0aW5nIGFuIG9mZmxvYWRlZCB0cmFjayBhbmQgdGVhcmluZyBpdCBkb3duIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0IHdoZW4gYXVkaW9mbGluZ2VyCisgICAgLy8gZGV0ZWN0cyB0aGVyZSBpcyBhbiBhY3RpdmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdC4KKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGNoZWNrIHRoZSBhdWRpbyBzZXNzaW9uIGhlcmUgYnV0IHdlIGRvIG5vdCBoYXZlIGl0IGluIHRoaXMgY29udGV4dC4KKyAgICAvLyBUaGlzIG1heSBwcmV2ZW50IG9mZmxvYWRpbmcgaW4gcmFyZSBzaXR1YXRpb25zIHdoZXJlIGVmZmVjdHMgYXJlIGxlZnQgYWN0aXZlIGJ5IGFwcHMKKyAgICAvLyBpbiB0aGUgYmFja2dyb3VuZC4KKyAgICBpZiAobUVmZmVjdHMuaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2F1ZGlvX2RpcmVjdF9tb2RlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnKSB7CisgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3Qgb2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgIG9mZmxvYWRJbmZvLmZvcm1hdCA9IGNvbmZpZy0+Zm9ybWF0OworICAgIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKKyAgICBvZmZsb2FkSW5mby5jaGFubmVsX21hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzazsKKyAgICBvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSA9IG1FbmdpbmUtPmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKCphdHRyKTsKKyAgICBvZmZsb2FkSW5mby5oYXNfdmlkZW8gPSBmYWxzZTsKKyAgICBvZmZsb2FkSW5mby5pc19zdHJlYW1pbmcgPSBmYWxzZTsKKyAgICBjb25zdCBib29sIG9mZmxvYWRQb3NzaWJsZSA9IGlzT2ZmbG9hZFBvc3NpYmxlKG9mZmxvYWRJbmZvLCB0cnVlIC8qZHVyYXRpb25JZ25vcmVkKi8pOworCisgICAgYXVkaW9fZGlyZWN0X21vZGVfdCBkaXJlY3RNb2RlID0gQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQ7CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIGF1ZGlvX2ZsYWdzX3RvX2F1ZGlvX291dHB1dF9mbGFncyhhdHRyLT5mbGFncywgJmZsYWdzKTsKKyAgICAvLyBvbmx5IHJldGFpbiBmbGFncyB0aGF0IHdpbGwgZHJpdmUgY29tcHJlc3NlZCBvZmZsb2FkIG9yIHBhc3N0aHJvdWdoCisgICAgdWludDMyX3QgcmVsZXZhbnRGbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgaWYgKG9mZmxvYWRQb3NzaWJsZSkgeworICAgICAgICByZWxldmFudEZsYWdzIHw9IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQ7CisgICAgfQorICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgoZmxhZ3MgJiByZWxldmFudEZsYWdzKSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisKKyAgICBEZXZpY2VWZWN0b3IgZW5naW5lT3V0cHV0RGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKCphdHRyKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgICAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IGVuZ2luZU91dHB1dERldmljZXM7CisgICAgICAgIC8vIHRoZSBNU0QgbW9kdWxlIGNoZWNrcyBmb3IgZGlmZmVyZW50IGNvbmRpdGlvbnMgYW5kIG91dHB1dCBkZXZpY2VzCisgICAgICAgIGlmIChzdHJjbXAoaHdNb2R1bGUtPmdldE5hbWUoKSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFtc2RIYXNQYXRjaGVzVG9BbGxEZXZpY2VzKGVuZ2luZU91dHB1dERldmljZXMudG9UeXBlQWRkclZlY3RvcigpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cHV0RGV2aWNlcyA9IGdldE1zZEF1ZGlvT3V0RGV2aWNlcygpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY3VyUHJvZmlsZSA6IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CisgICAgICAgICAgICBpZiAoIWN1clByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUob3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgbnVsbHB0ciAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsIG51bGxwdHIgLyp1cGRhdGVkRm9ybWF0Ki8sCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBudWxscHRyIC8qdXBkYXRlZENoYW5uZWxNYXNrKi8sCisgICAgICAgICAgICAgICAgICAgIGZsYWdzKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcmVqZWN0IHByb2ZpbGVzIG5vdCBjb3JyZXNwb25kaW5nIHRvIGEgZGV2aWNlIGN1cnJlbnRseSBhdmFpbGFibGUKKyAgICAgICAgICAgIGlmICghbUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnNBdExlYXN0T25lKGN1clByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoY3VyUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBBVURJT19PVVRQVVRfRkxBR19OT05FKSB7CisgICAgICAgICAgICAgICAgaWYgKChkaXJlY3RNb2RlICYgQVVESU9fRElSRUNUX09GRkxPQURfR0FQTEVTU19TVVBQT1JURUQpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCkgeworICAgICAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IHJlcG9ydHMgb2ZmbG9hZCBnYXBsZXNzIHN1cHBvcnRlZC4gTm8gbmVlZCB0byByZXBvcnQgb2ZmbG9hZCBzdXBwb3J0LgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChjdXJQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfR0FQTEVTU19PRkZMT0FEKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBvZmZsb2FkIGdhcGxlc3MgaXMgcmVwb3J0ZWQsIG5vIG5lZWQgdG8gcmVwb3J0IG9mZmxvYWQgc3VwcG9ydC4KKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0TW9kZSA9IChhdWRpb19kaXJlY3RfbW9kZV90KSAoKGRpcmVjdE1vZGUgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5BVURJT19ESVJFQ1RfT0ZGTE9BRF9TVVBQT1JURUQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ESVJFQ1RfT0ZGTE9BRF9HQVBMRVNTX1NVUFBPUlRFRCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0TW9kZSA9IChhdWRpb19kaXJlY3RfbW9kZV90KShkaXJlY3RNb2RlIHwgQVVESU9fRElSRUNUX09GRkxPQURfU1VQUE9SVEVEKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpcmVjdE1vZGUgPSAoYXVkaW9fZGlyZWN0X21vZGVfdCkgKGRpcmVjdE1vZGUgfCBBVURJT19ESVJFQ1RfQklUU1RSRUFNX1NVUFBPUlRFRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRpcmVjdE1vZGU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciYgYXVkaW9Qcm9maWxlc1ZlY3RvcikgeworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXREZXZpY2VzRm9yQXR0cmlidXRlcygqYXR0ciwgJmRldmljZXMsIGZhbHNlIC8qIGZvclZvbHVtZSAqLyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBBTE9HVigiJXM6IGZvdW5kICV6dSBvdXRwdXQgZGV2aWNlcyBmb3IgYXR0cmlidXRlcy4iLCBfX2Z1bmNfXywgZGV2aWNlcy5zaXplKCkpOworICAgIGlmIChkZXZpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE9LOyAvLyBubyBvdXRwdXQgZGV2aWNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgICAgICAvLyB0aGUgTVNEIG1vZHVsZSBjaGVja3MgZm9yIGRpZmZlcmVudCBjb25kaXRpb25zCisgICAgICAgIGlmIChzdHJjbXAoaHdNb2R1bGUtPmdldE5hbWUoKSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRwdXRQcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKKyAgICAgICAgICAgIGlmICghb3V0cHV0UHJvZmlsZS0+YXNBdWRpb1BvcnQoKS0+aXNEaXJlY3RPdXRwdXQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYWxsb3cgb25seSBwcm9maWxlcyB0aGF0IHN1cHBvcnQgYWxsIHRoZSBhdmFpbGFibGUgYW5kIHJvdXRlZCBkZXZpY2VzCisgICAgICAgICAgICBpZiAob3V0cHV0UHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpLmdldERldmljZXNGcm9tRGV2aWNlVHlwZUFkZHJWZWMoZGV2aWNlcykuc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgICE9IGRldmljZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb1Byb2ZpbGVzVmVjdG9yLmFkZEFsbFZhbGlkUHJvZmlsZXMoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb2ZpbGUtPmFzQXVkaW9Qb3J0KCktPmdldEF1ZGlvUHJvZmlsZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBhZGQgdGhlIGRpcmVjdCBwcm9maWxlcyBmcm9tIE1TRCBpZiBwcmVzZW50IGFuZCBoYXMgYXVkaW8gcGF0Y2hlcyB0byBhbGwgdGhlIG91dHB1dChzKQorICAgIGNvbnN0IGF1dG8mIG1zZE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCk7CisgICAgaWYgKG1zZE1vZHVsZSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtc2RIYXNQYXRjaGVzVG9BbGxEZXZpY2VzKGRldmljZXMpKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IE1TRCBhdWRpbyBwYXRjaGVzIHNldCB0byBhbGwgb3V0cHV0IGRldmljZXMuIiwgX19mdW5jX18pOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRwdXRQcm9maWxlIDogbXNkTW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXRQcm9maWxlLT5hc0F1ZGlvUG9ydCgpLT5pc0RpcmVjdE91dHB1dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdWRpb1Byb2ZpbGVzVmVjdG9yLmFkZEFsbFZhbGlkUHJvZmlsZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm9maWxlLT5hc0F1ZGlvUG9ydCgpLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBNU0QgYXVkaW8gcGF0Y2hlcyBOT1Qgc2V0IHRvIGFsbCBvdXRwdXQgZGV2aWNlcy4iLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKQEAgLTM3ODcsMTcgKzQyMjcsMTUgQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNyZWF0ZUF1ZGlvUGF0Y2hJbnRlcm5hbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgdWludDMyX3QgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCiB7CiAgICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOwogICAgIGlmIChoYW5kbGUgPT0gTlVMTCB8fCBwYXRjaCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEFMT0dWKCIlcyBudW0gc291cmNlcyAlZCBudW0gc2lua3MgJWQiLCBfX2Z1bmNfXywgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKLQogICAgIGlmICghYXVkaW9fcGF0Y2hfaXNfdmFsaWQocGF0Y2gpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMzgwNSw3ICs0MjQzLDYgQEAKICAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID4gMSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotCiAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnJvbGUgIT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMzgxNSw2ICs0MjUyLDg2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c2lua3NbMF0uaWQpOworICAgIGlmIChzcmNEZXZpY2UgPT0gbnVsbHB0ciB8fCBzaW5rRGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBjcmVhdGUgcGF0Y2gsIGludmFsaWQgc2luayBhbmQvb3Igc291cmNlIGRldmljZShzKSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIiVzIGJldHdlZW4gc291cmNlICVzIGFuZCBzaW5rICVzIiwgX19mdW5jX18sCisgICAgICAgICAgICBzcmNEZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgc2lua0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IFBvbGljeUF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisgICAgLy8gRGVmYXVsdCBhdHRyaWJ1dGVzLCBkZWZhdWx0IHZvbHVtZSBwcmlvcml0eSwgbm90IHRvIGluZmVyIHdpdGggbm9uIHJhdyBhdWRpbyBwYXRjaGVzLgorICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSk7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UgPSAmcGF0Y2gtPnNvdXJjZXNbMF07CisgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9CisgICAgICAgICAgICBuZXcgSW50ZXJuYWxTb3VyY2VDbGllbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIHBvcnRJZCwgdWlkLCBhdHRyaWJ1dGVzLCAqc291cmNlLCBzcmNEZXZpY2UsIHNpbmtEZXZpY2UsCisgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwgdG9Wb2x1bWVTb3VyY2UoYXR0cmlidXRlcykpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIGNvbm5lY3RBdWRpb1NvdXJjZVRvU2luayhzb3VyY2VEZXNjLCBzaW5rRGV2aWNlLCBwYXRjaCwgKmhhbmRsZSwgdWlkLCAwIC8qIGRlbGF5TXMgKi8pOworCisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1BdWRpb1NvdXJjZXMuYWRkKHBvcnRJZCwgc291cmNlRGVzYyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNvbm5lY3RBdWRpb1NvdXJjZVRvU2luaygKKyAgICAgICAgY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZzaW5rRGV2aWNlLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAmaGFuZGxlLAorICAgICAgICB1aWRfdCB1aWQsIHVpbnQzMl90IGRlbGF5TXMpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaEludGVybmFsKHBhdGNoLCAmaGFuZGxlLCB1aWQsIGRlbGF5TXMsIHNvdXJjZURlc2MpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSkgPCAwKSB7CisgICAgICAgIEFMT0dXKCIlcyBwYXRjaCBwYW5lbCBjb3VsZCBub3QgY29ubmVjdCBkZXZpY2UgcGF0Y2gsIGVycm9yICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc291cmNlRGVzYy0+Y29ubmVjdChoYW5kbGUsIHNpbmtEZXZpY2UpOworICAgIGlmIChpc01zZFBhdGNoKGhhbmRsZSkpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICAvLyBTVyBCcmlkZ2U/IChAdG9kbzogSFcgYnJpZGdlLCBrZWVwIHRyYWNrIG9mIEh3T3V0cHV0IGZvciBkZXZpY2Ugc2VsZWN0aW9uICJyZWNvbnNpZGVyYXRpb24iKQorICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dCA9IHNvdXJjZURlc2MtPnN3T3V0cHV0KCkucHJvbW90ZSgpOworICAgIEFMT0dfQVNTRVJUKHN3T3V0cHV0ICE9IG51bGxwdHIsICIlczogYSBzd091dHB1dCBzaGFsbCBhbHdheXMgYmUgYXNzb2NpYXRlZCIsIF9fZnVuY19fKTsKKyAgICBpZiAoc3dPdXRwdXQtPmdldENsaWVudChzb3VyY2VEZXNjLT5wb3J0SWQoKSkgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXMgc291cmNlIHBvcnRJZCBoYXMgYWxyZWFkeSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dERlc2MiLCBfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gRmFpbHVyZVBhdGNoQWRkZWQ7CisgICAgfQorICAgIHN0YXR1cyA9IHN3T3V0cHV0LT5zdGFydCgpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgZ290byBGYWlsdXJlU291cmNlQWRkZWQ7CisgICAgfQorICAgIHN3T3V0cHV0LT5hZGRDbGllbnQoc291cmNlRGVzYyk7CisgICAgc3RhdHVzID0gc3RhcnRTb3VyY2Uoc3dPdXRwdXQsIHNvdXJjZURlc2MsICZkZWxheU1zKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dXKCIlcyBmYWlsZWQgdG8gc3RhcnQgc291cmNlLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKyAgICAgICAgZ290byBGYWlsdXJlU291cmNlQWN0aXZlOworICAgIH0KKyAgICBpZiAoZGVsYXlNcyAhPSAwKSB7CisgICAgICAgIHVzbGVlcChkZWxheU1zICogMTAwMCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKKworRmFpbHVyZVNvdXJjZUFjdGl2ZToKKyAgICBzd091dHB1dC0+c3RvcCgpOworICAgIHJlbGVhc2VPdXRwdXQoc291cmNlRGVzYy0+cG9ydElkKCkpOworRmFpbHVyZVNvdXJjZUFkZGVkOgorICAgIHNvdXJjZURlc2MtPnNldFN3T3V0cHV0KG51bGxwdHIpOworRmFpbHVyZVBhdGNoQWRkZWQ6CisgICAgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChoYW5kbGUpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVBdWRpb1BhdGNoSW50ZXJuYWwoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIHVpbnQzMl90IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYykKK3sKKyAgICBBTE9HVigiJXMgbnVtIHNvdXJjZXMgJWQgbnVtIHNpbmtzICVkIiwgX19mdW5jX18sIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcyk7CiAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjOwogICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7CiAKQEAgLTQwMDMsNyArNDUyMCw3IEBACiAgICAgICAgICAgICAgICAgLy8gaW4gY29uZmlnIFhNTCB0byByZWFjaCB0aGUgc2luayBzbyB0aGF0IGlzIGNhbiBiZSBkZWNsYXJlZCBhcyBhdmFpbGFibGUuCiAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBudWxscHRyOwotICAgICAgICAgICAgICAgIGlmIChzb3VyY2VEZXNjICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZURlc2MtPmlzSW50ZXJuYWwoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIGNhcmUgb2YgZHluYW1pYyByb3V0aW5nIGZvciBTd091dHB1dCBzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gc291cmNlRGVzYy0+YXR0cmlidXRlcygpOwogICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHNvdXJjZURlc2MtPnN0cmVhbSgpOwpAQCAtNDAxNiwxMCArNDUzMywxMSBAQAogICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgICAgICAgICBib29sIGlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlX3Qgb3V0cHV0VHlwZTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NwYXRpYWxpemVkOwogICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRGb3JBdHRySW50KCZyZXN1bHRBdHRyLCAmb3V0cHV0LCBBVURJT19TRVNTSU9OX05PTkUsICZhdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0sIHNvdXJjZURlc2MtPnVpZCgpLCAmY29uZmlnLCAmZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGVkRGV2aWNlSWQsICZpc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAmb3V0cHV0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgJm91dHB1dFR5cGUsICZpc1NwYXRpYWxpemVkKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIG5vIG91dHB1dCBmb3IgZGV2aWNlICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2lua0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKQEAgLTQwMzEsNDQgKzQ1NDksNDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5zZXRTd091dHB1dChvdXRwdXREZXNjKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGZvciAicmF3IHBhdGNoZXMiIGFrYSBjcmVhdGVkIGZyb20gY3JlYXRlQXVkaW9QYXRjaCBBUEkKKyAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlcyhEZXZpY2VWZWN0b3Ioc2lua0RldmljZSksIG1PdXRwdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNpbmsgZGV2aWNlIGlzIHJlYWNoYWJsZSB2aWEgYW4gb3BlbmVkIG91dHB1dCBzdHJlYW0sIHJlcXVlc3QgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gZ28gdmlhIHRoaXMgb3V0cHV0IHN0cmVhbSBieSBhZGRpbmcgYSBzZWNvbmQgc291cmNlIHRvIHRoZSBwYXRjaAorICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBubyBvdXRwdXQgYXZhaWxhYmxlIGZvciBpbnRlcm5hbCBwYXRjaCBzaW5rIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBvdXRwdXQgZm9yIGRldmljZSAlcyBpcyBkdXBsaWNhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZURlc2MtPnNldFN3T3V0cHV0KG91dHB1dERlc2MpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBzb2Z0d2FyZSBicmlkZ2UgaW4gUGF0Y2hQYW5lbCBpZjoKICAgICAgICAgICAgICAgICAvLyAtIHNvdXJjZSBhbmQgc2luayBkZXZpY2VzIGFyZSBvbiBkaWZmZXJlbnQgSFcgbW9kdWxlcyBPUgogICAgICAgICAgICAgICAgIC8vIC0gYXVkaW8gSEFMIHZlcnNpb24gaXMgPCAzLjAKICAgICAgICAgICAgICAgICAvLyAtIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzID49IDMuMCBidXQgbm8gcm91dGUgaGFzIGJlZW4gZGVjbGFyZWQgYmV0d2VlbiBkZXZpY2VzCi0gICAgICAgICAgICAgICAgLy8gLSBjYWxsZWQgZnJvbSBzdGFydEF1ZGlvU291cmNlIChha2Egc291cmNlRGVzYyAhPSBudWxscHRyKSBhbmQgc291cmNlIGRldmljZSBkb2VzCi0gICAgICAgICAgICAgICAgLy8gICBub3QgaGF2ZSBhIGdhaW4gY29udHJvbGxlcgorICAgICAgICAgICAgICAgIC8vIC0gY2FsbGVkIGZyb20gc3RhcnRBdWRpb1NvdXJjZSAoYWthIHNvdXJjZURlc2MgaXMgbm90IGludGVybmFsKSBhbmQgc291cmNlIGRldmljZQorICAgICAgICAgICAgICAgIC8vICAgZG9lcyBub3QgaGF2ZSBhIGdhaW4gY29udHJvbGxlcgogICAgICAgICAgICAgICAgIGlmICghc3JjRGV2aWNlLT5oYXNTYW1lSHdNb2R1bGVBcyhzaW5rRGV2aWNlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgKHNyY0RldmljZS0+Z2V0TW9kdWxlVmVyc2lvbk1ham9yKCkgPCAzKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgIXNyY0RldmljZS0+Z2V0TW9kdWxlKCktPnN1cHBvcnRzUGF0Y2goc3JjRGV2aWNlLCBzaW5rRGV2aWNlKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHNvdXJjZURlc2MgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKCFzb3VyY2VEZXNjLT5pc0ludGVybmFsKCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEZXZpY2UtPmdldEF1ZGlvUG9ydCgpLT5nZXRHYWlucygpLnNpemUoKSA9PSAwKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IG9ubHkgb25lIHNpbmsgZGV2aWNlIGZvciBub3cgdG8gc2ltcGxpZnkgb3V0cHV0IHNlbGVjdGlvbiBsb2dpYwogICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlRGVzYyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlcyhEZXZpY2VWZWN0b3Ioc2lua0RldmljZSksIG1PdXRwdXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzaW5rIGRldmljZSBpcyByZWFjaGFibGUgdmlhIGFuIG9wZW5lZCBvdXRwdXQgc3RyZWFtLCByZXF1ZXN0IHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnbyB2aWEgdGhpcyBvdXRwdXQgc3RyZWFtIGJ5IGFkZGluZyBhIHNlY29uZCBzb3VyY2UgdG8gdGhlIHBhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXMgb3V0cHV0IGZvciBkZXZpY2UgJXMgaXMgZHVwbGljYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2lua0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5zZXRVc2VTd0JyaWRnZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYyAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyBzcmNNaXhQb3J0Q29uZmlnID0ge307Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmc3JjTWl4UG9ydENvbmZpZywgJnBhdGNoLT5zb3VyY2VzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZzcmNNaXhQb3J0Q29uZmlnLCBudWxscHRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB2b2x1bWUgY29udHJvbCwgd2UgbWF5IG5lZWQgYSB2YWxpZCBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY01peFBvcnRDb25maWcuZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IHNvdXJjZURlc2MgIT0gbnVsbHB0ciA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5zdHJlYW0oKSA6IEFVRElPX1NUUkVBTV9QQVRDSDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY01peFBvcnRDb25maWcuZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9ICFzb3VyY2VEZXNjLT5pc0ludGVybmFsKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoc291cmNlRGVzYy0+YXR0cmlidXRlcygpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fUEFUQ0g7CiAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKHNyY01peFBvcnRDb25maWcpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNDA5MSwxMSArNDYxNCw5IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsIHVpZF90IHVpZCkKIHsKLSAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBwYXRjaCAlZCIsIGhhbmRsZSk7Ci0KKyAgICBBTE9HVigiJXMgcGF0Y2ggJWQiLCBfX2Z1bmNfXywgaGFuZGxlKTsKICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSk7CiAKICAgICBpZiAoaW5kZXggPCAwKSB7CkBAIC00MTA3LDExICs0NjI4LDIxIEBACiAgICAgaWYgKHBhdGNoRGVzYy0+Z2V0VWlkKCkgIT0gbVVpZENhY2hlZCAmJiB1aWQgIT0gcGF0Y2hEZXNjLT5nZXRVaWQoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHJldHVybiByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKGhhbmRsZSk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvU291cmNlcy5zaXplKCk7IGkrKykgIHsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHNvdXJjZURlc2MgIT0gbnVsbHB0ciAmJiBzb3VyY2VEZXNjLT5nZXRQYXRjaEhhbmRsZSgpID09IGhhbmRsZSkgeworICAgICAgICAgICAgcG9ydElkID0gc291cmNlRGVzYy0+cG9ydElkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcG9ydElkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUgPworICAgICAgICAgICAgICAgIHN0b3BBdWRpb1NvdXJjZShwb3J0SWQpIDogcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChoYW5kbGUpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYykKIHsKICAgICBBTE9HVigiJXMgcGF0Y2ggJWQiLCBfX2Z1bmNfXywgaGFuZGxlKTsKICAgICBpZiAobUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSkgPCAwKSB7CkBAIC00MTUyLDI2ICs0NjgzLDI5IEBACiAgICAgICAgICAgICByZW1vdmVBdWRpb1BhdGNoKHBhdGNoRGVzYy0+Z2V0SGFuZGxlKCkpOwogICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICAvLyBTVyBCcmlkZ2UKKyAgICAgICAgICAgIC8vIFNXIG9yIEhXIEJyaWRnZQorICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBudWxscHRyOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPiAxICYmIHBhdGNoLT5zb3VyY2VzWzFdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmdldE91dHB1dEZyb21JZChwYXRjaC0+c291cmNlc1sxXS5pZCk7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgb3V0cHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBfX2Z1bmNfXywgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlT3V0cHV0IGhhcyBhbHJlYWR5IGNhbGxlZCBjbG9zZU91cHV0IGluIGNhc2Ugb2YgZGlyZWN0IG91dHB1dAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPmdldEhhbmRsZSgpICE9IG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2UgU3dPdXRwdXQgcGF0Y2ggcmVtb3ZhbCBhcyBBRiBjb3VudGVyIHBhcnQgcGF0Y2ggaGFzIGFscmVhZHkgZ29uZS4KLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIHJlc2V0IHBhdGNoIGhhbmRsZSBvbiBPdXRwdXQgYXMgZGlmZmVyZW50IGZyb20gU1dCcmlkZ2UiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZUF1ZGlvUGF0Y2gob3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnNldFBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjID0gbU91dHB1dHMuZ2V0T3V0cHV0RnJvbUlkKHBhdGNoLT5zb3VyY2VzWzFdLmlkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDEgJiYgc291cmNlRGVzYyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPnN3T3V0cHV0KCkucHJvbW90ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dHB1dERlc2MgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBubyBvdXRwdXQgZm9yIGlkICVkIiwgX19mdW5jX18sIHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgICAgICAvLyByZWxlYXNlT3V0cHV0IGhhcyBhbHJlYWR5IGNhbGxlZCBjbG9zZU91dHB1dCBpbiBjYXNlIG9mIGRpcmVjdCBvdXRwdXQKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgIXNvdXJjZURlc2MtPnVzZVN3QnJpZGdlKCkpIHsKKyAgICAgICAgICAgICAgICByZXNldE91dHB1dERldmljZShvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gUmV1c2UgcGF0Y2ggaGFuZGxlIGlmIHN0aWxsIHZhbGlkIC8gZG8gbm90IGZvcmNlIHJlcm91dGluZyBpZiBzdGlsbCByb3V0ZWQKKyAgICAgICAgICAgICAgICBwYXRjaEhhbmRsZSA9IG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCk7CiAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgLypmb3JjZSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaEhhbmRsZSA9PSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSwgLypmb3JjZSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaEhhbmRsZSA9PSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSA/IG51bGxwdHIgOiAmcGF0Y2hIYW5kbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTQ0MTcsNiArNDk1MSwxOCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3NwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRBdWRpb1NvdXJjZUludGVybmFsKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLCB1aWRfdCB1aWQpCit7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgJnBvcnRJZCwgdWlkKTsKKyAgICBBTE9HRV9JRihzdGF0dXMgIT0gT0ssICIlczogZmFpbGVkIHRvIHN0YXJ0IGF1ZGlvIHNvdXJjZSAoJWQpIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgcmV0dXJuIG1BdWRpb1NvdXJjZXMudmFsdWVGb3IocG9ydElkKTsKK30KKworCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYykKIHsKICAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CkBAIC00NDQxLDUyICs0OTg3LDkgQEAKICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOwogICAgIHBhdGNoQnVpbGRlci5hZGRTaW5rKHNpbmtEZXZpY2UpLmFkZFNvdXJjZShzcmNEZXZpY2UpOwogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIHN0YXR1c190IHN0YXR1cyA9Ci0gICAgICAgICAgICBjcmVhdGVBdWRpb1BhdGNoSW50ZXJuYWwocGF0Y2hCdWlsZGVyLnBhdGNoKCksICZoYW5kbGUsIG1VaWRDYWNoZWQsIDAsIHNvdXJjZURlc2MpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBwYXRjaCBwYW5lbCBjb3VsZCBub3QgY29ubmVjdCBkZXZpY2UgcGF0Y2gsIGVycm9yICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgc291cmNlRGVzYy0+Y29ubmVjdChoYW5kbGUsIHNpbmtEZXZpY2UpOwotICAgIC8vIFNXIEJyaWRnZT8gKEB0b2RvOiBIVyBicmlkZ2UsIGtlZXAgdHJhY2sgb2YgSHdPdXRwdXQgZm9yIGRldmljZSBzZWxlY3Rpb24gInJlY29uc2lkZXJhdGlvbiIpCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0ID0gc291cmNlRGVzYy0+c3dPdXRwdXQoKS5wcm9tb3RlKCk7Ci0gICAgaWYgKHN3T3V0cHV0ICE9IDApIHsKLSAgICAgICAgc3RhdHVzID0gc3dPdXRwdXQtPnN0YXJ0KCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGdvdG8gRmFpbHVyZVNvdXJjZUFkZGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzd091dHB1dC0+Z2V0Q2xpZW50KHNvdXJjZURlc2MtPnBvcnRJZCgpKSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMgc291cmNlIHBvcnRJZCBoYXMgYWxyZWFkeSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dERlc2MiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICBnb3RvIEZhaWx1cmVSZWxlYXNlUGF0Y2g7Ci0gICAgICAgIH0KLSAgICAgICAgc3dPdXRwdXQtPmFkZENsaWVudChzb3VyY2VEZXNjKTsKLSAgICAgICAgdWludDMyX3QgZGVsYXlNcyA9IDA7Ci0gICAgICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKHN3T3V0cHV0LCBzb3VyY2VEZXNjLCAmZGVsYXlNcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dXKCIlcyBmYWlsZWQgdG8gc3RhcnQgc291cmNlLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKLSAgICAgICAgICAgIGdvdG8gRmFpbHVyZVNvdXJjZUFjdGl2ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVsYXlNcyAhPSAwKSB7Ci0gICAgICAgICAgICB1c2xlZXAoZGVsYXlNcyAqIDEwMDApOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPmh3T3V0cHV0KCkucHJvbW90ZSgpOwotICAgICAgICBpZiAoaHdPdXRwdXREZXNjICE9IDApIHsKLSAgICAgICAgICAvLyAgIGNyZWF0ZSBId291dHB1dCBhbmQgYWRkIHRvIG1Id091dHB1dHMKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCIlcyBzb3VyY2UgaGFzIG5laXRoZXIgU1cgbm9yIEhXIG91dHB1dCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogCi1GYWlsdXJlU291cmNlQWN0aXZlOgotICAgIHN3T3V0cHV0LT5zdG9wKCk7Ci0gICAgcmVsZWFzZU91dHB1dChzb3VyY2VEZXNjLT5wb3J0SWQoKSk7Ci1GYWlsdXJlU291cmNlQWRkZWQ6Ci0gICAgc291cmNlRGVzYy0+c2V0U3dPdXRwdXQobnVsbHB0cik7Ci1GYWlsdXJlUmVsZWFzZVBhdGNoOgotICAgIHJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwoaGFuZGxlKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIGNvbm5lY3RBdWRpb1NvdXJjZVRvU2luaygKKyAgICAgICAgICAgICAgICBzb3VyY2VEZXNjLCBzaW5rRGV2aWNlLCBwYXRjaEJ1aWxkZXIucGF0Y2goKSwgaGFuZGxlLCBtVWlkQ2FjaGVkLCAwIC8qZGVsYXlNcyovKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCkBAIC00NzQ5LDYgKzUyNTIsMzcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1VsdHJhc291bmRTdXBwb3J0ZWQoKQoreworICAgIGJvb2wgaGFzVWx0cmFzb3VuZE91dHB1dCA9IGZhbHNlOworICAgIGJvb2wgaGFzVWx0cmFzb3VuZElucHV0ID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKKyAgICAgICAgY29uc3QgT3V0cHV0UHJvZmlsZUNvbGxlY3Rpb24gJm91dHB1dFByb2ZpbGVzID0gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCk7CisgICAgICAgIGlmICghaGFzVWx0cmFzb3VuZE91dHB1dCkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZvdXRQcm9maWxlIDogb3V0cHV0UHJvZmlsZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX1VMVFJBU09VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzVWx0cmFzb3VuZE91dHB1dCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IElucHV0UHJvZmlsZUNvbGxlY3Rpb24gJmlucHV0UHJvZmlsZXMgPSBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpOworICAgICAgICBpZiAoIWhhc1VsdHJhc291bmRJbnB1dCkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnB1dFByb2ZpbGUgOiBpbnB1dFByb2ZpbGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX0lOUFVUX0ZMQUdfVUxUUkFTT1VORCkgeworICAgICAgICAgICAgICAgICAgICBoYXNVbHRyYXNvdW5kSW5wdXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGFzVWx0cmFzb3VuZE91dHB1dCAmJiBoYXNVbHRyYXNvdW5kSW5wdXQpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZCgpCiB7CiAgICAgcmV0dXJuIGdldENvbmZpZygpLmlzQ2FsbFNjcmVlbk1vZGVTdXBwb3J0ZWQoKTsKQEAgLTQ3ODEsNyArNTMxNSw3IEBACiAgICAgICAgICAgICBBTE9HVygiJXMgc291cmNlIGhhcyBuZWl0aGVyIFNXIG5vciBIVyBvdXRwdXQiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICB9CiAgICAgfQotICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwoc291cmNlRGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChzb3VyY2VEZXNjLT5nZXRQYXRjaEhhbmRsZSgpLCAwLCBzb3VyY2VEZXNjKTsKICAgICBzb3VyY2VEZXNjLT5kaXNjb25uZWN0KCk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTQ4MDIsNiArNTMzNiwxODYgQEAKICAgICByZXR1cm4gc291cmNlOwogfQogCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2FuQmVTcGF0aWFsaXplZEludChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpICBjb25zdAoreworICAgIC8vIFRoZSBjYWxsZXIgY2FuIGhhdmUgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMgY3JpdGVyaWEgaWdub3JlZCBieSBlaXRoZXIgcGFzc2luZyBhIG51bGwgcHRyIG9yCisgICAgLy8gdGhlIEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVIgdmFsdWUuCisgICAgLy8gSWYgYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkLCBjdXJyZW50IHBvbGljeSBpcyB0byBvbmx5IGFsbG93IHNwYXRpYWxpemF0aW9uIGZvciBtZWRpYQorICAgIC8vIGFuZCBnYW1lIHVzYWdlcy4KKyAgICBpZiAoYXR0ciAhPSBudWxscHRyICYmICphdHRyICE9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVIpIHsKKyAgICAgICAgaWYgKGF0dHItPnVzYWdlICE9IEFVRElPX1VTQUdFX01FRElBICYmIGF0dHItPnVzYWdlICE9IEFVRElPX1VTQUdFX0dBTUUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGF0dHItPmZsYWdzICYgKEFVRElPX0ZMQUdfQ09OVEVOVF9TUEFUSUFMSVpFRCB8IEFVRElPX0ZMQUdfTkVWRVJfU1BBVElBTElaRSkpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoZSBjYWxsZXIgY2FuIGhhdmUgdGhlIGRldmljZXMgY3JpdGVyaWEgaWdub3JlZCBieSBwYXNzaW5nIGFuZCBlbXB0eSB2ZWN0b3IsIGFuZAorICAgIC8vIGdldFNwYXRpYWxpemVyT3V0cHV0UHJvZmlsZSgpIHdpbGwgaWdub3JlIHRoZSBkZXZpY2VzIHdoZW4gbG9va2luZyBmb3IgYSBtYXRjaC4KKyAgICAvLyBPdGhlcndpc2UgYW4gb3V0cHV0IHByb2ZpbGUgc3VwcG9ydGluZyBhIHNwYXRpYWxpemVyIGVmZmVjdCB0aGF0IGNhbiBiZSByb3V0ZWQKKyAgICAvLyB0byB0aGUgc3BlY2lmaWVkIGRldmljZXMgbXVzdCBleGlzdC4KKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPQorICAgICAgICAgICAgZ2V0U3BhdGlhbGl6ZXJPdXRwdXRQcm9maWxlKGNvbmZpZywgZGV2aWNlcyk7CisgICAgaWYgKHByb2ZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVGhlIGNhbGxlciBjYW4gaGF2ZSB0aGUgYXVkaW8gY29uZmlnIGNyaXRlcmlhIGlnbm9yZWQgYnkgZWl0aGVyIHBhc3NpbmcgYSBudWxsIHB0ciBvcgorICAgIC8vIHRoZSBBVURJT19DT05GSUdfSU5JVElBTElaRVIgdmFsdWUuCisgICAgLy8gSWYgYW4gYXVkaW8gY29uZmlnIGlzIHNwZWNpZmllZCwgY3VycmVudCBwb2xpY3kgaXMgdG8gb25seSBhbGxvdyBzcGF0aWFsaXphdGlvbiBmb3IKKyAgICAvLyBzb21lIHBvc2l0aW9uYWwgY2hhbm5lbCBtYXNrcy4KKworICAgIGlmIChjb25maWcgIT0gbnVsbHB0ciAmJiAqY29uZmlnICE9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUikgeworICAgICAgICBpZiAoIWF1ZGlvX2lzX2NoYW5uZWxfbWFza19zcGF0aWFsaXplZChjb25maWctPmNoYW5uZWxfbWFzaykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrVmlydHVhbGl6ZXJDbGllbnRSb3V0ZXMoKSB7CisgICAgc3RkOjpzZXQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4gc3RyZWFtc1RvSW52YWxpZGF0ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgZGVzYyA9IG1PdXRwdXRzW2ldOworICAgICAgICBmb3IgKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCA6IGRlc2MtPmdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0gY2xpZW50LT5hdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHIsIG51bGxwdHIsIGZhbHNlKTsKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlc1R5cGVBZGRyZXNzID0gZGV2aWNlcy50b1R5cGVBZGRyVmVjdG9yKCk7CisgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNsaWVudENvbmZpZyA9IGNsaWVudC0+Y29uZmlnKCk7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBhdWRpb19jb25maWdfaW5pdGlhbGl6ZXIoJmNsaWVudENvbmZpZyk7CisgICAgICAgICAgICBpZiAoZGVzYyAhPSBtU3BhdGlhbGl6ZXJPdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgJiYgY2FuQmVTcGF0aWFsaXplZEludCgmYXR0ciwgJmNvbmZpZywgZGV2aWNlc1R5cGVBZGRyZXNzKSkgeworICAgICAgICAgICAgICAgIHN0cmVhbXNUb0ludmFsaWRhdGUuaW5zZXJ0KGNsaWVudC0+c3RyZWFtKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA6IHN0cmVhbXNUb0ludmFsaWRhdGUpIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oc3RyZWFtKTsKKyAgICB9Cit9CisKKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzT3V0cHV0T25seUF2YWlsYWJsZVJvdXRlVG9Tb21lRGV2aWNlKAorICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpIHsKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGRlc2MgPT0gb3V0cHV0RGVzYyB8fCBkZXNjLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgRGV2aWNlVmVjdG9yIHNoYXJlZERldmljZXMgPSBkZXNjLT5maWx0ZXJTdXBwb3J0ZWREZXZpY2VzKGRldmljZXMpOworICAgICAgICBpZiAoIXNoYXJlZERldmljZXMuaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgJiYgKGRlc2MtPmRldmljZXNTdXBwb3J0RW5jb2RlZEZvcm1hdHMoc2hhcmVkRGV2aWNlcy50eXBlcygpKQorICAgICAgICAgICAgICAgICAgICA9PSBvdXRwdXREZXNjLT5kZXZpY2VzU3VwcG9ydEVuY29kZWRGb3JtYXRzKHNoYXJlZERldmljZXMudHlwZXMoKSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTcGF0aWFsaXplck91dHB1dChjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICptaXhlckNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0KSB7CisgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworCisgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygqYXR0ciwgbnVsbHB0ciwgZmFsc2UpOworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlc1R5cGVBZGRyZXNzID0gZGV2aWNlcy50b1R5cGVBZGRyVmVjdG9yKCk7CisgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZ1B0ciA9IG51bGxwdHI7CisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnOworICAgIGlmIChtaXhlckNvbmZpZyAhPSBudWxscHRyKSB7CisgICAgICAgIGNvbmZpZyA9IGF1ZGlvX2NvbmZpZ19pbml0aWFsaXplcihtaXhlckNvbmZpZyk7CisgICAgICAgIGNvbmZpZ1B0ciA9ICZjb25maWc7CisgICAgfQorICAgIGlmICghY2FuQmVTcGF0aWFsaXplZEludChhdHRyLCBjb25maWdQdHIsIGRldmljZXNUeXBlQWRkcmVzcykpIHsKKyAgICAgICAgQUxPR1YoIiVzIHByb3ZpZGVkIGF0dHJpYnV0ZXMgb3IgbWl4ZXIgY29uZmlnIGNhbm5vdCBiZSBzcGF0aWFsaXplZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPQorICAgICAgICAgICAgZ2V0U3BhdGlhbGl6ZXJPdXRwdXRQcm9maWxlKGNvbmZpZ1B0ciwgZGV2aWNlc1R5cGVBZGRyZXNzKTsKKyAgICBpZiAocHJvZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlcyBubyBzdWl0YWJsZSBvdXRwdXQgcHJvZmlsZSBmb3IgcHJvdmlkZWQgYXR0cmlidXRlcyBvciBtaXhlciBjb25maWciLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiBzcGF0aWFsaXplck91dHB1dHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkKKyAgICAgICAgICAgICAgICAmJiAoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfU1BBVElBTElaRVIpICE9IDApIHsKKyAgICAgICAgICAgIHNwYXRpYWxpemVyT3V0cHV0cy5wdXNoX2JhY2soZGVzYyk7CisgICAgICAgICAgICBBTE9HVigiJXMgYWRkaW5nIG9wZW5lZCBzcGF0aWFsaXplciBPdXRwdXQgJWQiLCBfX2Z1bmNfXywgZGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU3BhdGlhbGl6ZXJPdXRwdXQuY2xlYXIoKTsKKyAgICBib29sIG91dHB1dHNDaGFuZ2VkID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXNjIDogc3BhdGlhbGl6ZXJPdXRwdXRzKSB7CisgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlCisgICAgICAgICAgICAgICAgJiYgKGNvbmZpZ1B0ciA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgfHwgY29uZmlnUHRyLT5jaGFubmVsX21hc2sgPT0gZGVzYy0+bU1peGVyQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICBtU3BhdGlhbGl6ZXJPdXRwdXQgPSBkZXNjOworICAgICAgICAgICAgQUxPR1YoIiVzIHJldXNpbmcgY3VycmVudCBzcGF0aWFsaXplciBvdXRwdXQgJWQiLCBfX2Z1bmNfXywgZGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBjbG9zaW5nIHNwYXRpYWxpemVyT3V0cHV0IG91dHB1dCAlZCB0byBtYXRjaCBjaGFubmVsIG1hc2sgJSN4IgorICAgICAgICAgICAgICAgICAgICAiIGFuZCBkZXZpY2VzICVzIiwgX19mdW5jX18sIGRlc2MtPm1Jb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnUHRyICE9IG51bGxwdHIgPyBjb25maWdQdHItPmNoYW5uZWxfbWFzayA6IDAsCisgICAgICAgICAgICAgICAgICAgIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGNsb3NlT3V0cHV0KGRlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBvdXRwdXRzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVNwYXRpYWxpemVyT3V0cHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPQorICAgICAgICAgICAgICAgIG9wZW5PdXRwdXRXaXRoUHJvZmlsZUFuZERldmljZShwcm9maWxlLCBkZXZpY2VzLCBtaXhlckNvbmZpZyk7CisgICAgICAgIGlmIChkZXNjICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1TcGF0aWFsaXplck91dHB1dCA9IGRlc2M7CisgICAgICAgICAgICBvdXRwdXRzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjaGVja1ZpcnR1YWxpemVyQ2xpZW50Um91dGVzKCk7CisKKyAgICBpZiAob3V0cHV0c0NoYW5nZWQpIHsKKyAgICAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgfQorCisgICAgaWYgKG1TcGF0aWFsaXplck91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlcyBjb3VsZCBub3Qgb3BlbiBzcGF0aWFsaXplciBvdXRwdXQgd2l0aCByZXF1ZXN0ZWQgY29uZmlnIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAqb3V0cHV0ID0gbVNwYXRpYWxpemVyT3V0cHV0LT5tSW9IYW5kbGU7CisgICAgQUxPR1YoIiVzIHJldHVybmluZyBuZXcgc3BhdGlhbGl6ZXIgb3V0cHV0ICVkIiwgX19mdW5jX18sICpvdXRwdXQpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlU3BhdGlhbGl6ZXJPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSB7CisgICAgaWYgKG1TcGF0aWFsaXplck91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG1TcGF0aWFsaXplck91dHB1dC0+bUlvSGFuZGxlICE9IG91dHB1dCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmICghaXNPdXRwdXRPbmx5QXZhaWxhYmxlUm91dGVUb1NvbWVEZXZpY2UobVNwYXRpYWxpemVyT3V0cHV0KSkgeworICAgICAgICBBTE9HVigiJXMgY2xvc2luZyBzcGF0aWFsaXplciBvdXRwdXQgJWQiLCBfX2Z1bmNfXywgbVNwYXRpYWxpemVyT3V0cHV0LT5tSW9IYW5kbGUpOworICAgICAgICBjbG9zZU91dHB1dChtU3BhdGlhbGl6ZXJPdXRwdXQtPm1Jb0hhbmRsZSk7CisgICAgICAgIC8vZnJvbSBub3cgb24gbVNwYXRpYWxpemVyT3V0cHV0IGlzIG51bGwKKyAgICAgICAgY2hlY2tWaXJ0dWFsaXplckNsaWVudFJvdXRlcygpOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQXVkaW9Qb2xpY3lNYW5hZ2VyCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00ODc0LDYgKzU1ODgsNyBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAorICAgIG1FbmdpbmUtPnVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlKCk7CiAgICAgbUNvbW11bm5pY2F0aW9uU3RyYXRlZ3kgPSBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKAogICAgICAgICBtRW5naW5lLT5nZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpOwogCkBAIC00OTUzLDkgKzU2NjgsOCBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgbUh3TW9kdWxlcy5wdXNoX2JhY2soaHdNb2R1bGUpOwotICAgICAgICAvLyBvcGVuIGFsbCBvdXRwdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMKLSAgICAgICAgLy8gZXhjZXB0IGZvciBkaXJlY3Qgb3V0cHV0IHN0cmVhbXMgdGhhdCBhcmUgb25seSBvcGVuZWQgd2hlbiB0aGV5IGFyZSBhY3R1YWxseQotICAgICAgICAvLyByZXF1aXJlZCBieSBhbiBhcHAuCisgICAgICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcy4KKyAgICAgICAgLy8gZGlyZWN0IG91dHB1dHMgYXJlIGNsb3NlZCBpbW1lZGlhdGVseSBhZnRlciBjaGVja2luZyB0aGUgYXZhaWxhYmlsaXR5IG9mIGF0dGFjaGVkIGRldmljZXMKICAgICAgICAgLy8gVGhpcyBhbHNvIHZhbGlkYXRlcyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBsaXN0CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgb3V0UHJvZmlsZSA6IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CiAgICAgICAgICAgICBpZiAoIW91dFByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7CkBAIC00OTY3LDcgKzU2ODEsOCBAQAogICAgICAgICAgICAgICAgIEFMT0dXKCJPdXRwdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19UVFMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgob3V0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX1RUUykgIT0gMCB8fAorICAgICAgICAgICAgICAgIChvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfVUxUUkFTT1VORCkgIT0gMCkgewogICAgICAgICAgICAgICAgIG1UdHNPdXRwdXRBdmFpbGFibGUgPSB0cnVlOwogICAgICAgICAgICAgfQogCkBAIC00OTkwLDcgKzU3MDUsOCBAQAogICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3Iob3V0UHJvZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlKTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+b3BlbihudWxscHRyLCBEZXZpY2VWZWN0b3Ioc3VwcG9ydGVkRGV2aWNlKSwKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPm9wZW4obnVsbHB0ciAvKiBoYWxDb25maWcgKi8sIG51bGxwdHIgLyogbWl4ZXJDb25maWcgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvcihzdXBwb3J0ZWREZXZpY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC01MDcyLDYgKzU3ODgsMjEgQEAKICAgICAgICAgICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KKworICAgIC8vIENoZWNrIGlmIHNwYXRpYWxpemVyIG91dHB1dHMgY2FuIGJlIGNsb3NlZCB1bnRpbCB1c2VkLgorICAgIC8vIG1PdXRwdXRzIHZlY3RvciBuZXZlciBjb250YWlucyBkdXBsaWNhdGVkIG91dHB1dHMgYXQgdGhpcyBwb2ludC4KKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0c0Nsb3NlZDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19TUEFUSUFMSVpFUikgIT0gMAorICAgICAgICAgICAgICAgICYmICFpc091dHB1dE9ubHlBdmFpbGFibGVSb3V0ZVRvU29tZURldmljZShkZXNjKSkgeworICAgICAgICAgICAgb3V0cHV0c0Nsb3NlZC5wdXNoX2JhY2soZGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIGRlc2MtPmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChhdXRvIG91dHB1dCA6IG91dHB1dHNDbG9zZWQpIHsKKyAgICAgICAgcmVtb3ZlT3V0cHV0KG91dHB1dCk7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKQEAgLTUzNTEsNyArNjA4Miw3IEBACiAgICAgICAgICAgICB9IC8vIGVuZGlmIGlucHV0ICE9IDAKIAogICAgICAgICAgICAgaWYgKGlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBvcGVuIGlucHV0IGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgIAorICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBjb3VsZCBub3Qgb3BlbiBpbnB1dCBmb3IgZGV2aWNlICVzIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBwcm9maWxlcy5yZW1vdmVBdChwcm9maWxlX2luZGV4KTsKICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LS07CkBAIC01NDQ1LDYgKzYxNzYsOSBAQAogCiAgICAgcmVtb3ZlT3V0cHV0KG91dHB1dCk7CiAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworICAgIGlmIChjbG9zaW5nT3V0cHV0ID09IG1TcGF0aWFsaXplck91dHB1dCkgeworICAgICAgICBtU3BhdGlhbGl6ZXJPdXRwdXQuY2xlYXIoKTsKKyAgICB9CiAKICAgICAvLyBNU0QgcGF0Y2hlcyBtYXkgaGF2ZSBiZWVuIHJlbGVhc2VkIHRvIHN1cHBvcnQgYSBub24tTVNEIGRpcmVjdCBvdXRwdXQuIFJlc2V0IE1TRCBwYXRjaCBpZgogICAgIC8vIG5vIGRpcmVjdCBvdXRwdXRzIGFyZSBvcGVuLgpAQCAtNTU1NSw3ICs2Mjg5LDcgQEAKICAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKICAgICAgICAgaWYgKHNvdXJjZURlc2MgIT0gbnVsbHB0ciAmJiBmb2xsb3dzU2FtZVJvdXRpbmcoYXR0ciwgc291cmNlRGVzYy0+YXR0cmlidXRlcygpKQogICAgICAgICAgICAgICAgICYmIHNvdXJjZURlc2MtPmdldFBhdGNoSGFuZGxlKCkgPT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUKLSAgICAgICAgICAgICAgICAmJiAhaXNDYWxsUnhBdWRpb1NvdXJjZShzb3VyY2VEZXNjKSkgeworICAgICAgICAgICAgICAgICYmICFpc0NhbGxSeEF1ZGlvU291cmNlKHNvdXJjZURlc2MpICYmICFzb3VyY2VEZXNjLT5pc0ludGVybmFsKCkpIHsKICAgICAgICAgICAgIGNvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2VEZXNjKTsKICAgICAgICAgfQogICAgIH0KQEAgLTU2NjgsNyArNjQwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RldmljZXMudHlwZXMoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2UgPSBnZXRTb3VyY2VGb3JBdHRyaWJ1dGVzT25PdXRwdXQoc3JjT3V0LCBhdHRyKTsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbHB0ciAmJiAhaXNDYWxsUnhBdWRpb1NvdXJjZShzb3VyY2UpKSB7CisgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGxwdHIgJiYgIWlzQ2FsbFJ4QXVkaW9Tb3VyY2Uoc291cmNlKSAmJiAhc291cmNlLT5pc0ludGVybmFsKCkpIHsKICAgICAgICAgICAgICAgICBjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTY4Miw2ICs2NDE2LDEyIEBACiAgICAgICAgICAgICBmb3IgKGF1dG8gc3RyZWFtIDogIG1FbmdpbmUtPmdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHBzSWQpKSB7CiAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oc3RyZWFtKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0IDogc3JjT3V0cHV0cykgeworICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbVByZXZpb3VzT3V0cHV0cy52YWx1ZUZvcihzcmNPdXQpOworICAgICAgICAgICAgICAgIGlmIChkZXNjID09IG51bGxwdHIpIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgZGVzYy0+c2V0VHJhY2tzSW52YWxpZGF0ZWRTdGF0dXNCeVN0cmF0ZWd5KHBzSWQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpAQCAtNTcyMCwxNCArNjQ2MCwyMCBAQAogICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmdldFNlY29uZGFyeU91dHB1dHMoKS5iZWdpbigpLAogICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmdldFNlY29uZGFyeU91dHB1dHMoKS5lbmQoKSwKICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5RGVzY3MuYmVnaW4oKSwgc2Vjb25kYXJ5RGVzY3MuZW5kKCkpKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8d3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiB3ZWFrU2Vjb25kYXJ5RGVzY3M7Ci0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dElkczsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNlY29uZGFyeURlc2MgOiBzZWNvbmRhcnlEZXNjcykgewotICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRJZHMucHVzaF9iYWNrKHNlY29uZGFyeURlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHdlYWtTZWNvbmRhcnlEZXNjcy5wdXNoX2JhY2soc2Vjb25kYXJ5RGVzYyk7CisgICAgICAgICAgICAgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGNsaWVudC0+Y29uZmlnKCkuZm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZm9ybWF0IGlzIG5vdCBQQ00sIHRoZSB0cmFja3Mgc2hvdWxkIGJlIGludmFsaWRhdGVkIHRvIGdldCBjb3JyZWN0CisgICAgICAgICAgICAgICAgICAgIC8vIGJlaGF2aW9yIHdoZW4gdGhlIHNlY29uZGFyeSBvdXRwdXQgaXMgY2hhbmdlZC4KKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtc1RvSW52YWxpZGF0ZS5pbnNlcnQoY2xpZW50LT5zdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8d3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiB3ZWFrU2Vjb25kYXJ5RGVzY3M7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzZWNvbmRhcnlPdXRwdXRJZHM7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmc2Vjb25kYXJ5RGVzYzogc2Vjb25kYXJ5RGVzY3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dElkcy5wdXNoX2JhY2soc2Vjb25kYXJ5RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlYWtTZWNvbmRhcnlEZXNjcy5wdXNoX2JhY2soc2Vjb25kYXJ5RGVzYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJhY2tTZWNvbmRhcnlPdXRwdXRzLmVtcGxhY2UoY2xpZW50LT5wb3J0SWQoKSwgc2Vjb25kYXJ5T3V0cHV0SWRzKTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5zZXRTZWNvbmRhcnlPdXRwdXRzKHN0ZDo6bW92ZSh3ZWFrU2Vjb25kYXJ5RGVzY3MpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJhY2tTZWNvbmRhcnlPdXRwdXRzLmVtcGxhY2UoY2xpZW50LT5wb3J0SWQoKSwgc2Vjb25kYXJ5T3V0cHV0SWRzKTsKLSAgICAgICAgICAgICAgICBjbGllbnQtPnNldFNlY29uZGFyeU91dHB1dHMoc3RkOjptb3ZlKHdlYWtTZWNvbmRhcnlEZXNjcykpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNTc1MSw2ICs2NDk3LDE4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNIZWFyaW5nQWlkVXNlZEZvckNvbW0oKSBjb25zdCB7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgIGlmIChkZXZpY2UtPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKwogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrQTJkcFN1c3BlbmQoKQogewogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGEyZHBPdXRwdXQgPSBtT3V0cHV0cy5nZXRBMmRwT3V0cHV0KCk7CkBAIC01ODQxLDkgKzY1OTksMTAgQEAKIAogICAgICAgICBhdXRvIGRvR2V0T3V0cHV0RGV2aWNlc0ZvclZvaWNlID0gWyZdKCkgewogICAgICAgICAgICAgcmV0dXJuIGhhc1ZvaWNlU3RyZWFtKHN0cmVhbXMpICYmIChvdXRwdXREZXNjID09IG1QcmltYXJ5T3V0cHV0IHx8Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNBY3RpdmUodG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc0FjdGl2ZSh0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgZmFsc2UpKSkgJiYKICAgICAgICAgICAgICAgICAoaXNJbkNhbGwoKSB8fAotICAgICAgICAgICAgICAgICBtT3V0cHV0cy5pc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3RTdHJhdGVneSwgb3V0cHV0RGVzYykpOworICAgICAgICAgICAgICAgICBtT3V0cHV0cy5pc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3RTdHJhdGVneSwgb3V0cHV0RGVzYykpICYmCisgICAgICAgICAgICAgICAgIWlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFLCAwKTsKICAgICAgICAgfTsKIAogICAgICAgICAvLyBXaXRoIGxvdy1sYXRlbmN5IHBsYXlpbmcgb24gc3BlYWtlciwgbXVzaWMgb24gV0ZELCB3aGVuIHRoZSBmaXJzdCBsb3ctbGF0ZW5jeQpAQCAtNTg5NSwxMSArNjY1NCwxMSBAQAogICAgIHVpZF90IHVpZDsKICAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiB0b3BDbGllbnQgPSBpbnB1dERlc2MtPmdldEhpZ2hlc3RQcmlvcml0eUNsaWVudCgpOwogICAgIGlmICh0b3BDbGllbnQgIT0gbnVsbHB0cikgewotICAgICAgYXR0cmlidXRlcyA9IHRvcENsaWVudC0+YXR0cmlidXRlcygpOwotICAgICAgdWlkID0gdG9wQ2xpZW50LT51aWQoKTsKKyAgICAgICAgYXR0cmlidXRlcyA9IHRvcENsaWVudC0+YXR0cmlidXRlcygpOworICAgICAgICB1aWQgPSB0b3BDbGllbnQtPnVpZCgpOwogICAgIH0gZWxzZSB7Ci0gICAgICBhdHRyaWJ1dGVzID0geyAuc291cmNlID0gQVVESU9fU09VUkNFX0RFRkFVTFQgfTsKLSAgICAgIHVpZCA9IDA7CisgICAgICAgIGF0dHJpYnV0ZXMgPSB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVCB9OworICAgICAgICB1aWQgPSAwOwogICAgIH0KIAogICAgIGlmIChhdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCAmJiBpc0luQ2FsbCgpKSB7CkBAIC01OTE3LDY2ICs2Njc2LDcxIEBACiAgICAgcmV0dXJuIChzdHJlYW0xID09IHN0cmVhbTIpOwogfQogCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7Ci0gICAgLy8gQnkgY2hlY2tpbmcgdGhlIHJhbmdlIG9mIHN0cmVhbSBiZWZvcmUgY2FsbGluZyBnZXRTdHJhdGVneSwgd2UgYXZvaWQKLSAgICAvLyBnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtJ3MgYmVoYXZpb3IgZm9yIGludmFsaWQgc3RyZWFtcy4KLSAgICAvLyBlbmdpbmUncyBnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtIHdvdWxkIGZhbGxiYWNrIG9uIGl0cyBkZWZhdWx0IGJlaGF2aW9yIChtb3N0IHByb2JhYmx5Ci0gICAgLy8gZGV2aWNlIGZvciBtdXNpYyBzdHJlYW0pLCBidXQgd2Ugd2FudCB0byByZXR1cm4gdGhlIGVtcHR5IHNldC4KLSAgICBpZiAoc3RyZWFtIDwgQVVESU9fU1RSRUFNX01JTiB8fCBzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOwotICAgIH0KLSAgICBEZXZpY2VWZWN0b3IgYWN0aXZlRGV2aWNlczsKLSAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKLSAgICBmb3IgKGludCBpID0gQVVESU9fU1RSRUFNX01JTjsgaSA8IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UOyArK2kpIHsKLSAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBjdXJTdHJlYW17c3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oaSl9OwotICAgICAgICBpZiAoIXN0cmVhbXNNYXRjaEZvcnZvbHVtZShzdHJlYW0sIGN1clN0cmVhbSkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIERldmljZVZlY3RvciBjdXJEZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShjdXJTdHJlYW0sIGZhbHNlLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGRldmljZXMubWVyZ2UoY3VyRGV2aWNlcyk7Ci0gICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogZ2V0T3V0cHV0c0ZvckRldmljZXMoY3VyRGV2aWNlcywgbU91dHB1dHMpKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKHRvVm9sdW1lU291cmNlKGN1clN0cmVhbSkpKSB7Ci0gICAgICAgICAgICAgICAgYWN0aXZlRGV2aWNlcy5tZXJnZShvdXRwdXREZXNjLT5kZXZpY2VzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gRmF2b3IgZGV2aWNlcyBzZWxlY3RlZCBvbiBhY3RpdmUgc3RyZWFtcyBpZiBhbnkgdG8gcmVwb3J0IGNvcnJlY3QgZGV2aWNlIGluIGNhc2Ugb2YKLSAgICAvLyBleHBsaWNpdCBkZXZpY2Ugc2VsZWN0aW9uCi0gICAgaWYgKCFhY3RpdmVEZXZpY2VzLmlzRW1wdHkoKSkgewotICAgICAgICBkZXZpY2VzID0gYWN0aXZlRGV2aWNlczsKLSAgICB9Ci0gICAgLypGaWx0ZXIgU1BFQUtFUl9TQUZFIG91dCBvZiByZXN1bHRzLCBhcyBBdWRpb1NlcnZpY2UgZG9lc24ndCBrbm93IGFib3V0IGl0Ci0gICAgICBhbmQgZG9lc24ndCByZWFsbHkgbmVlZCB0by4qLwotICAgIERldmljZVZlY3RvciBzcGVha2VyU2FmZURldmljZXMgPSBkZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSk7Ci0gICAgaWYgKCFzcGVha2VyU2FmZURldmljZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGRldmljZXMubWVyZ2UobUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikpOwotICAgICAgICBkZXZpY2VzLnJlbW92ZShzcGVha2VyU2FmZURldmljZXMpOwotICAgIH0KLSAgICAvLyBGSVhNRTogdXNlIERldmljZVR5cGVTZXQgd2hlbiBKYXZhIGxheWVyIGlzIHJlYWR5IGZvciBpdC4KLSAgICByZXR1cm4gZGV2aWNlVHlwZXNUb0JpdE1hc2soZGV2aWNlcy50eXBlcygpKTsKLX0KLQorLy8gVE9ETyAtIGNvbnNpZGVyIE1TRCByb3V0ZXMgYi8yMTQ5NzE3ODAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAqZGV2aWNlcykgeworICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgKmRldmljZXMsIGJvb2wgZm9yVm9sdW1lKSB7CiAgICAgaWYgKGRldmljZXMgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKworICAgIC8vIERldmljZXMgYXJlIGRldGVybWluZWQgaW4gdGhlIGZvbGxvd2luZyBwcmVjZWRlbmNlOgorICAgIC8vCisgICAgLy8gMSkgRGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggYSBkeW5hbWljIHBvbGljeSBtYXRjaGluZyB0aGUgYXR0cmlidXRlcy4gIFRoaXMgaXMgb2Z0ZW4KKyAgICAvLyAgICBhIHJlbW90ZSBzdWJtaXggZnJvbSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0suCisgICAgLy8KKyAgICAvLyBJZiBubyBzdWNoIGR5bmFtaWMgcG9saWN5IHRoZW4KKyAgICAvLyAyKSBEZXZpY2VzIGNvbnRhaW5pbmcgYW4gYWN0aXZlIGNsaWVudCB1c2luZyBzZXRQcmVmZXJyZWREZXZpY2UKKyAgICAvLyAgICB3aXRoIHNhbWUgc3RyYXRlZ3kgYXMgdGhlIGF0dHJpYnV0ZXMuCisgICAgLy8gICAgKGZyb20gdGhlIGRlZmF1bHQgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygpIGltcGxlbWVudGF0aW9uKS4KKyAgICAvLworICAgIC8vIElmIG5vIGNvcnJlc3BvbmRpbmcgYWN0aXZlIGNsaWVudCB3aXRoIHNldFByZWZlcnJlZERldmljZSB0aGVuCisgICAgLy8gMykgRGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmF0ZWd5IGRldGVybWluZWQgYnkgdGhlIGF0dHJpYnV0ZXMKKyAgICAvLyAgICAoZnJvbSB0aGUgZGVmYXVsdCBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKCkgaW1wbGVtZW50YXRpb24pLgorICAgIC8vCisgICAgLy8gU2VlIHJlbGF0ZWQgZ2V0T3V0cHV0Rm9yQXR0ckludCgpLgorCiAgICAgLy8gY2hlY2sgZHluYW1pYyBwb2xpY2llcyBidXQgb25seSBmb3IgcHJpbWFyeSBkZXNjcmlwdG9ycyAoc2Vjb25kYXJ5IG5vdCB1c2VkIGZvciBhdWRpYmxlCiAgICAgLy8gYXVkaW8gcm91dGluZywgb25seSB1c2VkIGZvciBkdXBsaWNhdGlvbiBmb3IgcGxheWJhY2sgY2FwdHVyZSkKICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4OwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb2xpY3lNaXhlcy5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIDAgLyp1aWQgdW5rbm93biBoZXJlKi8sCi0gICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCBwb2xpY3lNaXgsIG51bGxwdHIpOworICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgcG9saWN5TWl4LCBudWxscHRyIC8qIHNlY29uZGFyeU1peGVzICovKTsKICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIGlmIChwb2xpY3lNaXggIT0gbnVsbHB0ciAmJiBwb2xpY3lNaXgtPmdldE91dHB1dCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBkZXZpY2UocG9saWN5TWl4LT5tRGV2aWNlVHlwZSwgcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcy5jX3N0cigpKTsKLSAgICAgICAgZGV2aWNlcy0+cHVzaF9iYWNrKGRldmljZSk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKworICAgIERldmljZVZlY3RvciBjdXJEZXZpY2VzOworICAgIGlmIChwb2xpY3lNaXggIT0gbnVsbHB0ciAmJiBwb2xpY3lNaXgtPmdldE91dHB1dCgpICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgIC8vIEZvciB2b2x1bWUgY29udHJvbCwgc2tpcCBMT09QQkFDSyBtaXhlcyB3aGljaCB1c2UgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYCisgICAgICAgICAgICAvLyBhcyB0aGV5IGFyZSB1bmFmZmVjdGVkIGJ5IGRldmljZS9zdHJlYW0gdm9sdW1lCisgICAgICAgICAgICAvLyAocGVyIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0ZpeGVkVm9sdW1lKCkpLgorICAgICAgICAgICAgKCFmb3JWb2x1bWUgfHwgcG9saWN5TWl4LT5tRGV2aWNlVHlwZSAhPSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpCisgICAgICAgICAgICApIHsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZSgKKyAgICAgICAgICAgICAgICBwb2xpY3lNaXgtPm1EZXZpY2VUeXBlLCBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgIGN1ckRldmljZXMuYWRkKGRldmljZURlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZSBkZWZhdWx0IEVuZ2luZTo6Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoKSB1c2VzIGZpbmRQcmVmZXJyZWREZXZpY2UoKQorICAgICAgICAvLyB3aGljaCBzZWxlY3RzIHNldFByZWZlcnJlZERldmljZSBpZiBhY3RpdmUuICBUaGlzIG1lYW5zIGZvclZvbHVtZSBjYWxsCisgICAgICAgIC8vIHdpbGwgdGFrZSBhbiBhY3RpdmUgc2V0UHJlZmVycmVkRGV2aWNlLCBpZiBzdWNoIGV4aXN0cy4KKworICAgICAgICBjdXJEZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgYXR0ciwgbnVsbHB0ciAvKiBwcmVmZXJyZWREZXZpY2UgKi8sIGZhbHNlIC8qIGZyb21DYWNoZSAqLyk7CiAgICAgfQotICAgIERldmljZVZlY3RvciBjdXJEZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0ciwgbnVsbHB0ciwgZmFsc2UpOworCisgICAgaWYgKGZvclZvbHVtZSkgeworICAgICAgICAvLyBXZSBhbGlhcyB0aGUgZGV2aWNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFIHRvIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUgorICAgICAgICAvLyBmb3Igc2luZ2xlIHZvbHVtZSBjb250cm9sIGluIEF1ZGlvU2VydmljZSAoc3VjaCByZWxhdGlvbnNoaXAgc2hvdWxkIGV4aXN0IGlmCisgICAgICAgIC8vIFNQRUFLRVJfU0FGRSBpcyBwcmVzZW50KS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gKFRoaXMgaXMgdW5yZWxhdGVkIHRvIGEgZGlmZmVyZW50IGRldmljZSBncm91cGluZyBhcyBWb2x1bWU6OmdldERldmljZUNhdGVnb3J5KQorICAgICAgICBEZXZpY2VWZWN0b3Igc3BlYWtlclNhZmVEZXZpY2VzID0KKyAgICAgICAgICAgICAgICBjdXJEZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSk7CisgICAgICAgIGlmICghc3BlYWtlclNhZmVEZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgY3VyRGV2aWNlcy5tZXJnZSgKKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikpOworICAgICAgICAgICAgY3VyRGV2aWNlcy5yZW1vdmUoc3BlYWtlclNhZmVEZXZpY2VzKTsKKyAgICAgICAgfQorICAgIH0KICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGN1ckRldmljZXMpIHsKICAgICAgICAgZGV2aWNlcy0+cHVzaF9iYWNrKGRldmljZS0+Z2V0RGV2aWNlVHlwZUFkZHIoKSk7CiAgICAgfQpAQCAtNjAzNyw3ICs2ODAxLDExIEBACiAgICAgICAgIC8vIG11dGUvdW5tdXRlIEFVRElPX1NUUkVBTV9UVFMgb24gYWxsIG91dHB1dHMKICAgICAgICAgQUxPR1YoIlx0IG11dGluZyAlZCIsIG11dGUpOwogICAgICAgICB1aW50MzJfdCBtYXhMYXRlbmN5ID0gMDsKLSAgICAgICAgYXV0byB0dHNWb2x1bWVTb3VyY2UgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVFRTKTsKKyAgICAgICAgYXV0byB0dHNWb2x1bWVTb3VyY2UgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVFRTLCBmYWxzZSk7CisgICAgICAgIGlmICh0dHNWb2x1bWVTb3VyY2UgPT0gVk9MVU1FX1NPVVJDRV9OT05FKSB7CisgICAgICAgICAgICBBTE9HVigiXHQgbm8gdHRzIHZvbHVtZSBzb3VyY2UgYXZhaWxhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICBzZXRWb2x1bWVTb3VyY2VNdXRlKHR0c1ZvbHVtZVNvdXJjZSwgbXV0ZS8qb24qLywgZGVzYywgMCAvKmRlbGF5Ki8sIERldmljZVR5cGVTZXQoKSk7CkBAIC02MTE5LDExICs2ODg3LDE4IEBACiAgICAgLy8gZGlmZmVyZW50IHBlciBkZXZpY2Ugdm9sdW1lcwogICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChkZXZpY2VzICE9IHByZXZEZXZpY2VzKSkgewogICAgICAgICB1aW50MzJfdCB0ZW1wTXV0ZVdhaXRNcyA9IG91dHB1dERlc2MtPmxhdGVuY3koKSAqIDI7Ci0gICAgICAgIC8vIHRlbXBvcmFyeSBtdXRlIGR1cmF0aW9uIGlzIGNvbnNlcnZhdGl2ZWx5IHNldCB0byA0IHRpbWVzIHRoZSByZXBvcnRlZCBsYXRlbmN5Ci0gICAgICAgIHVpbnQzMl90IHRlbXBNdXRlRHVyYXRpb25NcyA9IG91dHB1dERlc2MtPmxhdGVuY3koKSAqIDQ7CisKICAgICAgICAgaWYgKG11dGVXYWl0TXMgPCB0ZW1wTXV0ZVdhaXRNcykgewogICAgICAgICAgICAgbXV0ZVdhaXRNcyA9IHRlbXBNdXRlV2FpdE1zOwogICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgcmVjb21tZW5kZWQgZHVyYXRpb24gaXMgZGVmaW5lZCwgcmVwbGFjZSB0ZW1wb3JhcnkgbXV0ZSBkdXJhdGlvbiB0byBhdm9pZAorICAgICAgICAvLyB0cnVuY2F0ZWQgbm90aWZpY2F0aW9ucyBhdCBiZWdpbm5pbmcsIHdoaWNoIGRlcGVuZHMgb24gZHVyYXRpb24gb2YgY2hhbmdpbmcgcGF0aCBpbiBIQUwuCisgICAgICAgIC8vIE90aGVyd2lzZSwgdGVtcG9yYXJ5IG11dGUgZHVyYXRpb24gaXMgY29uc2VydmF0aXZlbHkgc2V0IHRvIDQgdGltZXMgdGhlIHJlcG9ydGVkIGxhdGVuY3kuCisgICAgICAgIHVpbnQzMl90IHRlbXBSZWNvbW1lbmRlZE11dGVEdXJhdGlvbiA9IG91dHB1dERlc2MtPmdldFJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uTXMoKTsKKyAgICAgICAgdWludDMyX3QgdGVtcE11dGVEdXJhdGlvbk1zID0gdGVtcFJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uID4gMCA/CisgICAgICAgICAgICAgICAgdGVtcFJlY29tbWVuZGVkTXV0ZUR1cmF0aW9uIDogb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogNDsKKwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmFjdGl2ZVZzIDogb3V0cHV0RGVzYy0+Z2V0QWN0aXZlVm9sdW1lU291cmNlcygpKSB7CiAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3Qgc3RhcnQgdGhlIHRlbXBvcmFyeSBtdXRlIHBlcmlvZCB0b28gZWFybHkgaW4gY2FzZSBvZgogICAgICAgICAgICAgLy8gZGVsYXllZCBkZXZpY2UgY2hhbmdlCkBAIC02MTQ3LDcgKzY5MjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZXNNdXRlQ2hlY2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjaywgYm9vbCByZXF1aXJlc1ZvbHVtZUNoZWNrKQogewogICAgIEFMT0dWKCIlcyBkZXZpY2UgJXMgZGVsYXlNcyAlZCIsIF9fZnVuY19fLCBkZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgZGVsYXlNcyk7CiAgICAgdWludDMyX3QgbXV0ZVdhaXRNczsKQEAgLTYxNjMsNiArNjkzOCw3IEBACiAgICAgLy8gZmlsdGVyIGRldmljZXMgYWNjb3JkaW5nIHRvIG91dHB1dCBzZWxlY3RlZAogICAgIERldmljZVZlY3RvciBmaWx0ZXJlZERldmljZXMgPSBvdXRwdXREZXNjLT5maWx0ZXJTdXBwb3J0ZWREZXZpY2VzKGRldmljZXMpOwogICAgIERldmljZVZlY3RvciBwcmV2RGV2aWNlcyA9IG91dHB1dERlc2MtPmRldmljZXMoKTsKKyAgICBEZXZpY2VWZWN0b3IgYXZhaWxQcmV2RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmZpbHRlcihwcmV2RGV2aWNlcyk7CiAKICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlcygpIHByZXZEZXZpY2UgJXMiLCBwcmV2RGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOwogCkBAIC02MTc4LDExICs2OTU0LDEyIEBACiAgICAgICAgIG11dGVXYWl0TXMgPSAwOwogICAgIH0KIAorICAgIGJvb2wgb3V0cHV0Um91dGVkID0gb3V0cHV0RGVzYy0+aXNSb3V0ZWQoKTsKKwogICAgIC8vIG5vIG5lZWQgdG8gcHJvY2VlZCBpZiBuZXcgZGV2aWNlIGlzIG5vdCBBVURJT19ERVZJQ0VfTk9ORSBhbmQgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50CiAgICAgLy8gb3V0cHV0IHByb2ZpbGUgb3IgaWYgbmV3IGRldmljZSBpcyBub3Qgc3VwcG9ydGVkIEFORCBwcmV2aW91cyBkZXZpY2UocykgaXMoYXJlKSBzdGlsbAogICAgIC8vIGF2YWlsYWJsZSAob3RoZXJ3aXNlIHJlc2V0IGRldmljZSBtdXN0IGJlIGRvbmUgb24gdGhlIG91dHB1dCkKLSAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpICYmIGZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkgJiYKLSAgICAgICAgICAgICFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5maWx0ZXIocHJldkRldmljZXMpLmVtcHR5KCkpIHsKKyAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpICYmIGZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkgJiYgIWF2YWlsUHJldkRldmljZXMuZW1wdHkoKSkgewogICAgICAgICBBTE9HVigiJXM6IHVuc3VwcG9ydGVkIGRldmljZSAlcyBmb3Igb3V0cHV0IiwgX19mdW5jX18sIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgLy8gcmVzdG9yZSBwcmV2aW91cyBkZXZpY2UgYWZ0ZXIgZXZhbHVhdGluZyBzdHJhdGVneSBtdXRlIHN0YXRlCiAgICAgICAgIG91dHB1dERlc2MtPnNldERldmljZXMocHJldkRldmljZXMpOwpAQCAtNjE5NSwxNyArNjk3MiwyMCBAQAogICAgIC8vICBBTkQgZm9yY2UgaXMgbm90IHNwZWNpZmllZAogICAgIC8vICBBTkQgdGhlIG91dHB1dCBpcyBjb25uZWN0ZWQgYnkgYSB2YWxpZCBhdWRpbyBwYXRjaC4KICAgICAvLyBEb2luZyB0aGlzIGNoZWNrIGhlcmUgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY2FsbCBzZXRPdXRwdXREZXZpY2VzKCkgd2l0aG91dCBjb25kaXRpb25zCi0gICAgaWYgKChmaWx0ZXJlZERldmljZXMuaXNFbXB0eSgpIHx8IGZpbHRlcmVkRGV2aWNlcyA9PSBwcmV2RGV2aWNlcykgJiYKLSAgICAgICAgICAgICFmb3JjZSAmJiBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpICE9IDApIHsKKyAgICBpZiAoKGZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkgfHwgZmlsdGVyZWREZXZpY2VzID09IHByZXZEZXZpY2VzKSAmJiAhZm9yY2UgJiYgb3V0cHV0Um91dGVkKSB7CiAgICAgICAgIEFMT0dWKCIlcyBzZXR0aW5nIHNhbWUgZGV2aWNlICVzIG9yIG51bGwgZGV2aWNlLCBmb3JjZT0lZCwgcGF0Y2ggaGFuZGxlPSVkIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgIGZpbHRlcmVkRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIGZvcmNlLCBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICAgICAgaWYgKHJlcXVpcmVzVm9sdW1lQ2hlY2sgJiYgIWZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBzZXR0aW5nIHNhbWUgZGV2aWNlIG9uIHJvdXRlZCBvdXRwdXQsIGZvcmNlIGFwcGx5IHZvbHVtZXMiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0RGVzYywgZmlsdGVyZWREZXZpY2VzLnR5cGVzKCksIGRlbGF5TXMsIHRydWUgLypmb3JjZSovKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKICAgICB9CiAKICAgICBBTE9HVigiJXMgY2hhbmdpbmcgZGV2aWNlIHRvICVzIiwgX19mdW5jX18sIGZpbHRlcmVkRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgLy8gZG8gdGhlIHJvdXRpbmcKLSAgICBpZiAoZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgIGlmIChmaWx0ZXJlZERldmljZXMuaXNFbXB0eSgpIHx8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmZpbHRlcihmaWx0ZXJlZERldmljZXMpLmVtcHR5KCkpIHsKICAgICAgICAgcmVzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZGVsYXlNcywgTlVMTCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKQEAgLTYyMzIsNiArNzAxMiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSkKIHsKICAgICBzc2l6ZV90IGluZGV4OworICAgIGlmIChwYXRjaEhhbmRsZSA9PSBudWxscHRyICYmICFvdXRwdXREZXNjLT5pc1JvdXRlZCgpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiAgICAgaWYgKHBhdGNoSGFuZGxlKSB7CiAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7CiAgICAgfSBlbHNlIHsKQEAgLTYzNjksMTEgKzcxNTIsMTEgQEAKICAgICAvLyBsb3VkZXIgdGhhbiB0aGUgYWNjZXNzaWJpbGl0eSBwcm9tcHQsIHRoZSBwcm9tcHQgY2Fubm90IGJlIGhlYXJkLCB0aHVzIG1hc2tpbmcgdGhlIHRvdWNoCiAgICAgLy8gZXhwbG9yYXRpb24gb2YgdGhlIGRpYWxlciBVSS4gSW4gdGhpcyBzaXR1YXRpb24sIGJyaW5nIHRoZSBhY2Nlc3NpYmlsaXR5IHZvbHVtZSBjbG9zZXIgdG8KICAgICAvLyB0aGUgcmluZ3RvbmUgdm9sdW1lCi0gICAgY29uc3QgYXV0byBjYWxsVm9sdW1lU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgIGNvbnN0IGF1dG8gcmluZ1ZvbHVtZVNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9SSU5HKTsKLSAgICBjb25zdCBhdXRvIG11c2ljVm9sdW1lU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX01VU0lDKTsKLSAgICBjb25zdCBhdXRvIGFsYXJtVm9sdW1lU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0FMQVJNKTsKLSAgICBjb25zdCBhdXRvIGExMXlWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSk7CisgICAgY29uc3QgYXV0byBjYWxsVm9sdW1lU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIGZhbHNlKTsKKyAgICBjb25zdCBhdXRvIHJpbmdWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fUklORywgZmFsc2UpOworICAgIGNvbnN0IGF1dG8gbXVzaWNWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTVVTSUMsIGZhbHNlKTsKKyAgICBjb25zdCBhdXRvIGFsYXJtVm9sdW1lU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0FMQVJNLCBmYWxzZSk7CisgICAgY29uc3QgYXV0byBhMTF5Vm9sdW1lU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIGZhbHNlKTsKIAogICAgIGlmICh2b2x1bWVTb3VyY2UgPT0gYTExeVZvbHVtZVNyYwogICAgICAgICAgICAgJiYgKEFVRElPX01PREVfUklOR1RPTkUgPT0gbUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpKSAmJgpAQCAtNjM4NiwxMiArNzE2OSwxMiBAQAogICAgIC8vIGluLWNhbGw6IGFsd2F5cyBjYXAgdm9sdW1lIGJ5IHZvaWNlIHZvbHVtZSArIHNvbWUgbG93IGhlYWRyb29tCiAgICAgaWYgKCh2b2x1bWVTb3VyY2UgIT0gY2FsbFZvbHVtZVNyYyAmJiAoaXNJbkNhbGwoKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmlzQWN0aXZlTG9jYWxseShjYWxsVm9sdW1lU3JjKSkpICYmCi0gICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9TWVNURU0pIHx8CisgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9TWVNURU0sIGZhbHNlKSB8fAogICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSByaW5nVm9sdW1lU3JjIHx8IHZvbHVtZVNvdXJjZSA9PSBtdXNpY1ZvbHVtZVNyYyB8fAogICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSBhbGFybVZvbHVtZVNyYyB8fAotICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OKSB8fAotICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSkgfHwKLSAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0RUTUYpIHx8CisgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04sIGZhbHNlKSB8fAorICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSwgZmFsc2UpIHx8CisgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9EVE1GLCBmYWxzZSkgfHwKICAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gYTExeVZvbHVtZVNyYykpIHsKICAgICAgICAgYXV0byAmdm9pY2VDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoY2FsbFZvbHVtZVNyYyk7CiAgICAgICAgIGludCB2b2ljZVZvbHVtZUluZGV4ID0gdm9pY2VDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlVHlwZXMpOwpAQCAtNjQyOSw5ICs3MjEyLDkgQEAKICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUfSkuZW1wdHkoKSAmJgogICAgICAgICAgICAgKCh2b2x1bWVTb3VyY2UgPT0gYWxhcm1Wb2x1bWVTcmMgfHwKICAgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHJpbmdWb2x1bWVTcmMpIHx8Ci0gICAgICAgICAgICAgKHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OKSkgfHwKLSAgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9TWVNURU0pKSB8fAotICAgICAgICAgICAgICgodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSkgJiYKKyAgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04sIGZhbHNlKSkgfHwKKyAgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9TWVNURU0sIGZhbHNlKSkgfHwKKyAgICAgICAgICAgICAoKHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSwgZmFsc2UpKSAmJgogICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpICYmCiAgICAgICAgICAgICBjdXJ2ZXMuY2FuQmVNdXRlZCgpKSB7CiAKQEAgLTY1MTcsMTkgKzczMDAsMjEgQEAKICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmdldE11dGVDb3VudCh2b2x1bWVTb3VyY2UpLCBvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UpKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KLSAgICBWb2x1bWVTb3VyY2UgY2FsbFZvbFNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKLSAgICBWb2x1bWVTb3VyY2UgYnRTY29Wb2xTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyk7Ci0gICAgYm9vbCBpc1ZvaWNlVm9sU3JjID0gY2FsbFZvbFNyYyA9PSB2b2x1bWVTb3VyY2U7Ci0gICAgYm9vbCBpc0J0U2NvVm9sU3JjID0gYnRTY29Wb2xTcmMgPT0gdm9sdW1lU291cmNlOworICAgIFZvbHVtZVNvdXJjZSBjYWxsVm9sU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIGZhbHNlKTsKKyAgICBWb2x1bWVTb3VyY2UgYnRTY29Wb2xTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTywgZmFsc2UpOworICAgIGJvb2wgaXNWb2ljZVZvbFNyYyA9ICh2b2x1bWVTb3VyY2UgIT0gVk9MVU1FX1NPVVJDRV9OT05FKSAmJiAoY2FsbFZvbFNyYyA9PSB2b2x1bWVTb3VyY2UpOworICAgIGJvb2wgaXNCdFNjb1ZvbFNyYyA9ICh2b2x1bWVTb3VyY2UgIT0gVk9MVU1FX1NPVVJDRV9OT05FKSAmJiAoYnRTY29Wb2xTcmMgPT0gdm9sdW1lU291cmNlKTsKIAogICAgIGJvb2wgaXNTY29SZXF1ZXN0ZWQgPSBpc1Njb1JlcXVlc3RlZEZvckNvbW0oKTsKKyAgICBib29sIGlzSEFVc2VkID0gaXNIZWFyaW5nQWlkVXNlZEZvckNvbW0oKTsKKwogICAgIC8vIGRvIG5vdCBjaGFuZ2UgaW4gY2FsbCB2b2x1bWUgaWYgYmx1ZXRvb3RoIGlzIGNvbm5lY3RlZCBhbmQgdmljZSB2ZXJzYQogICAgIC8vIGlmIHNjbyBhbmQgY2FsbCBmb2xsb3cgc2FtZSBjdXJ2ZXMsIGJ5cGFzcyBmb3JjZVVzZUZvckNvbW0KICAgICBpZiAoKGNhbGxWb2xTcmMgIT0gYnRTY29Wb2xTcmMpICYmCiAgICAgICAgICAgICAoKGlzVm9pY2VWb2xTcmMgJiYgaXNTY29SZXF1ZXN0ZWQpIHx8Ci0gICAgICAgICAgICAgKGlzQnRTY29Wb2xTcmMgJiYgIWlzU2NvUmVxdWVzdGVkKSkpIHsKKyAgICAgICAgICAgICAoaXNCdFNjb1ZvbFNyYyAmJiAhKGlzU2NvUmVxdWVzdGVkIHx8IGlzSEFVc2VkKSkpKSB7CiAgICAgICAgIEFMT0dWKCIlcyBjYW5ub3Qgc2V0IHZvbHVtZSBncm91cCAlZCB2b2x1bWUgd2hlbiBpcyVzcmVxdWVzdGVkIGZvciBjb21tIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgdm9sdW1lU291cmNlLCBpc1Njb1JlcXVlc3RlZCA/ICIgIiA6ICJuIG90ICIpOworICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSwgaXNTY29SZXF1ZXN0ZWQgPyAiICIgOiAiIG5vdCAiKTsKICAgICAgICAgLy8gRG8gbm90IHJldHVybiBhbiBlcnJvciBoZXJlIGFzIEF1ZGlvU2VydmljZSB3aWxsIGFsd2F5cyBzZXQgYm90aCB2b2ljZSBjYWxsCiAgICAgICAgIC8vIGFuZCBibHVldG9vdGggU0NPIHZvbHVtZXMgZHVlIHRvIHN0cmVhbSBhbGlhc2luZy4KICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNjUzOCw2ICs3MzIzLDExIEBACiAgICAgICAgIGRldmljZVR5cGVzID0gb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCk7CiAgICAgfQogCisgICAgaWYgKGN1cnZlcy5nZXRWb2x1bWVJbmRleE1pbigpIDwgMCB8fCBjdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNYXgoKSA8IDApIHsKKyAgICAgICAgQUxPR0UoImludmFsaWQgdm9sdW1lIGluZGV4IHJhbmdlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgZmxvYXQgdm9sdW1lRGIgPSBjb21wdXRlVm9sdW1lKGN1cnZlcywgdm9sdW1lU291cmNlLCBpbmRleCwgZGV2aWNlVHlwZXMpOwogICAgIGlmIChvdXRwdXREZXNjLT5pc0ZpeGVkVm9sdW1lKGRldmljZVR5cGVzKSB8fAogICAgICAgICAgICAgLy8gRm9yY2UgVm9JUCB2b2x1bWUgdG8gbWF4IGZvciBibHVldG9vdGggU0NPIGRldmljZSBleGNlcHQgaWYgbXV0ZWQKQEAgLTY1NDUsMTAgKzczMzUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgaXNTaW5nbGVEZXZpY2VUeXBlKGRldmljZVR5cGVzLCBhdWRpb19pc19ibHVldG9vdGhfb3V0X3Njb19kZXZpY2UpKSkgewogICAgICAgICB2b2x1bWVEYiA9IDAuMGY7CiAgICAgfQorICAgIGNvbnN0IGJvb2wgbXV0ZWQgPSAoaW5kZXggPT0gMCkgJiYgKHZvbHVtZURiICE9IDAuMGYpOwogICAgIG91dHB1dERlc2MtPnNldFZvbHVtZSgKLSAgICAgICAgICAgIHZvbHVtZURiLCB2b2x1bWVTb3VyY2UsIGN1cnZlcy5nZXRTdHJlYW1UeXBlcygpLCBkZXZpY2VUeXBlcywgZGVsYXlNcywgZm9yY2UpOworICAgICAgICAgICAgdm9sdW1lRGIsIG11dGVkLCB2b2x1bWVTb3VyY2UsIGN1cnZlcy5nZXRTdHJlYW1UeXBlcygpLCBkZXZpY2VUeXBlcywgZGVsYXlNcywgZm9yY2UpOwogCi0gICAgaWYgKGlzVm9pY2VWb2xTcmMgfHwgaXNCdFNjb1ZvbFNyYykgeworICAgIGlmIChvdXRwdXREZXNjID09IG1QcmltYXJ5T3V0cHV0ICYmIChpc1ZvaWNlVm9sU3JjIHx8IGlzQnRTY29Wb2xTcmMpKSB7CiAgICAgICAgIGZsb2F0IHZvaWNlVm9sdW1lOwogICAgICAgICAvLyBGb3JjZSB2b2ljZSB2b2x1bWUgdG8gbWF4IG9yIG11dGUgZm9yIEJsdWV0b290aCBTQ08gYXMgb3RoZXIgYXR0ZW51YXRpb25zIGFyZSBtYW5hZ2VkIGJ5IHRoZSBoZWFkc2V0CiAgICAgICAgIGlmIChpc1ZvaWNlVm9sU3JjKSB7CkBAIC02NTg4LDggKzczNzksMTAgQEAKICAgICBmb3IgKGF1dG8gYXR0cmlidXRlczogbUVuZ2luZS0+Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSkpIHsKICAgICAgICAgQUxPR1ZWKCIlcygpIGF0dHJpYnV0ZXMgJXMsIG11dGUgJWQsIG91dHB1dCBJRCAlZCIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgdG9TdHJpbmcoYXR0cmlidXRlcykuY19zdHIoKSwgb24sIG91dHB1dERlc2MtPmdldElkKCkpOwotICAgICAgICBWb2x1bWVTb3VyY2Ugc291cmNlID0gdG9Wb2x1bWVTb3VyY2UoYXR0cmlidXRlcyk7Ci0gICAgICAgIGlmIChzdGQ6OmZpbmQoYmVnaW4oc291cmNlc1RvTXV0ZSksIGVuZChzb3VyY2VzVG9NdXRlKSwgc291cmNlKSA9PSBlbmQoc291cmNlc1RvTXV0ZSkpIHsKKyAgICAgICAgVm9sdW1lU291cmNlIHNvdXJjZSA9IHRvVm9sdW1lU291cmNlKGF0dHJpYnV0ZXMsIGZhbHNlKTsKKyAgICAgICAgaWYgKChzb3VyY2UgIT0gVk9MVU1FX1NPVVJDRV9OT05FKSAmJgorICAgICAgICAgICAgICAgIChzdGQ6OmZpbmQoYmVnaW4oc291cmNlc1RvTXV0ZSksIGVuZChzb3VyY2VzVG9NdXRlKSwgc291cmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gZW5kKHNvdXJjZXNUb011dGUpKSkgewogICAgICAgICAgICAgc291cmNlc1RvTXV0ZS5wdXNoX2JhY2soc291cmNlKTsKICAgICAgICAgfQogICAgIH0KQEAgLTY2MTIsNyArNzQwNSw3IEBACiAgICAgaWYgKG9uKSB7CiAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNNdXRlZCh2b2x1bWVTb3VyY2UpKSB7CiAgICAgICAgICAgICBpZiAoY3VydmVzLmNhbkJlTXV0ZWQoKSAmJgotICAgICAgICAgICAgICAgICAgICAodm9sdW1lU291cmNlICE9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAorICAgICAgICAgICAgICAgICAgICAodm9sdW1lU291cmNlICE9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFLCBmYWxzZSkgfHwKICAgICAgICAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0KICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSB7CiAgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoY3VydmVzLCB2b2x1bWVTb3VyY2UsIDAsIG91dHB1dERlc2MsIGRldmljZVR5cGVzLCBkZWxheU1zKTsKQEAgLTY2NzksMTMgKzc0NzIsMTEgQEAKICAgICByZXR1cm4gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UodXNhZ2UpOwogfQogCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNJbkNhbGwoKQoteworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzSW5DYWxsKCkgY29uc3QgewogICAgIHJldHVybiBpc1N0YXRlSW5DYWxsKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSk7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0YXRlSW5DYWxsKGludCBzdGF0ZSkKLXsKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0YXRlSW5DYWxsKGludCBzdGF0ZSkgY29uc3QgewogICAgIHJldHVybiBpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKTsKIH0KIApAQCAtNjY5Myw4ICs3NDg0LDggQEAKIHsKICAgICBhdWRpb19tb2RlX3QgbW9kZSA9IG1FbmdpbmUtPmdldFBob25lU3RhdGUoKTsKICAgICByZXR1cm4gKG1vZGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKQotICAgICAgICAgICAgfHwgKG1vZGUgPT0gQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OKQotICAgICAgICAgICAgfHwgKG1vZGUgPT0gQVVESU9fTU9ERV9DQUxMX1NDUkVFTik7CisgICAgICAgICAgICB8fCAobW9kZSA9PSBBVURJT19NT0RFX0NBTExfU0NSRUVOKQorICAgICAgICAgICAgfHwgKG1vZGUgPT0gQVVESU9fTU9ERV9DQUxMX1JFRElSRUNUKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFuVXBGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZURlc2MpCkBAIC02OTczLDcgKzc3NjQsMTAgQEAKICAgICAgICAgcm91dGVkRGV2aWNlcy5hZGQoZGV2aWNlKTsKICAgICB9CiAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBhY3RpdmVDbGllbnRzKSB7Ci0gICAgICAgIC8vIFRPRE86IGIvMTc1MzQzMDk5IG9ubHkgdHJhdmVsIHRoZSB2YWxpZCBjbGllbnQKKyAgICAgICAgaWYgKGNsaWVudC0+aXNJbnZhbGlkKCkpIHsKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gdGFrZSBjYXJlIGFib3V0IGludmFsaWRhdGVkIGNsaWVudHMuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBwcmVmZXJyZWREZXZpY2UgPQogICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChjbGllbnQtPnByZWZlcnJlZERldmljZUlkKCkpOwogICAgICAgICBpZiAobUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoCkBAIC02OTg1LDcgKzc3NzksOCBAQAogfQogCiBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpvcGVuT3V0cHV0V2l0aFByb2ZpbGVBbmREZXZpY2UoCi0gICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcykKKyAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLAorICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICptaXhlckNvbmZpZykKIHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGRldmljZXMpIHsKICAgICAgICAgLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgY2hlY2tpbmcgaWYgdGhlIHByb2ZpbGUgc3VwcG9ydHMgdGhlIGRldmljZSBjb21iby4KQEAgLTY5OTUsNyArNzc5MCw3IEBACiAgICAgfQogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIGRldmljZXMsCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyIC8qIGhhbENvbmZpZyAqLywgbWl4ZXJDb25maWcsIGRldmljZXMsCiAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTcwMjUsNyArNzgyMCw3IEBACiAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBjb25maWcuZm9ybWF0OwogCi0gICAgICAgIHN0YXR1cyA9IGRlc2MtPm9wZW4oJmNvbmZpZywgZGV2aWNlcywKKyAgICAgICAgc3RhdHVzID0gZGVzYy0+b3BlbigmY29uZmlnLCBtaXhlckNvbmZpZywgZGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwpAQCAtNzAzMyw2ICs3ODI4LDcgQEAKICAgICB9CiAKICAgICBhZGRPdXRwdXQob3V0cHV0LCBkZXNjKTsKKwogICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2VUeXBlKSAmJiBhZGRyZXNzICE9ICIwIikgewogICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4OwogICAgICAgICBpZiAobVBvbGljeU1peGVzLmdldEF1ZGlvUG9saWN5TWl4KGRldmljZVR5cGUsIGFkZHJlc3MsIHBvbGljeU1peCkgPT0gTk9fRVJST1IpIHsKQEAgLTcwNDMsOSArNzgzOSwxMyBAQAogICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgfQogCi0gICAgfSBlbHNlIGlmICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgJiYgaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgIC8vIG5vIGR1cGxpY2F0ZWQgb3V0cHV0IGZvciBkaXJlY3Qgb3V0cHV0cyBhbmQKLSAgICAgICAgLy8gb3V0cHV0cyB1c2VkIGJ5IGR5bmFtaWMgcG9saWN5IG1peGVzCisgICAgfSBlbHNlIGlmIChoYXNQcmltYXJ5T3V0cHV0KCkgJiYgcHJvZmlsZS0+Z2V0TW9kdWxlKCkKKyAgICAgICAgICAgICAgICAhPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKQorICAgICAgICAgICAgJiYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID09IDApKSB7CisgICAgICAgIC8vIG5vIGR1cGxpY2F0ZWQgb3V0cHV0IGZvcjoKKyAgICAgICAgLy8gLSBkaXJlY3Qgb3V0cHV0cworICAgICAgICAvLyAtIG91dHB1dHMgdXNlZCBieSBkeW5hbWljIHBvbGljeSBtaXhlcworICAgICAgICAvLyAtIG91dHB1dHMgb3BlbmVkIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZQogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAKICAgICAgICAgLy9UT0RPOiBjb25maWd1cmUgYXVkaW8gZWZmZWN0IG91dHB1dCBzdGFnZSBoZXJlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCmluZGV4IDk4Zjk2ZDEuLmRiMGVlMTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvUGF0Y2hCdWlsZGVyLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCIKIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvYXVkaW8vY29tbW9uL0F1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lDb25maWcuaD4KICNpbmNsdWRlIDxQb2xpY3lBdWRpb1BvcnQuaD4KQEAgLTk1LDExICs5Niw4IEBACiAgICAgICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5TWFuYWdlcigpOwogCiAgICAgICAgIC8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUG9ydCYgcG9ydCwgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLApAQCAtMTI0LDcgKzEyMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlX3QgKm91dHB1dFR5cGUpIG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlX3QgKm91dHB1dFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTcGF0aWFsaXplZCkgb3ZlcnJpZGU7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgICAgICB2aXJ0dWFsIGJvb2wgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CkBAIC0xOTIsMTIgKzE5MSwzNyBAQAogICAgICAgICAgICAgcmV0dXJuIG1FbmdpbmUtPmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyByZXR1cm4gdGhlIGVuYWJsZWQgb3V0cHV0IGRldmljZXMgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLQorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIHZlY3RvciBvZiBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCBhdHRyaWJ1dGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBBbiBBdWRpb1RyYWNrIG9wZW5lZCB3aXRoIHNwZWNpZmllZCBhdHRyaWJ1dGVzIHNob3VsZCBwbGF5IG9uIHRoZSByZXR1cm5lZCBkZXZpY2VzLgorICAgICAgICAgKiBJZiBmb3JWb2x1bWUgaXMgc2V0IHRvIHRydWUsIHRoZSBjYWxsZXIgaXMgQXVkaW9TZXJ2aWNlLCBkZXRlcm1pbmluZyB0aGUgcHJvcGVyCisgICAgICAgICAqIGRldmljZSB2b2x1bWUgdG8gYWRqdXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBEZXZpY2VzIGFyZSBkZXRlcm1pbmVkIGluIHRoZSBmb2xsb3dpbmcgcHJlY2VkZW5jZToKKyAgICAgICAgICogMSkgRGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggYSBkeW5hbWljIHBvbGljeSBtYXRjaGluZyB0aGUgYXR0cmlidXRlcy4gIFRoaXMgaXMgb2Z0ZW4KKyAgICAgICAgICogICAgYSByZW1vdGUgc3VibWl4IGZyb20gTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLLiAgU2Vjb25kYXJ5IG1peGVzIGZyb20gYQorICAgICAgICAgKiAgICBkeW5hbWljIHBvbGljeSBhcmUgbm90IGluY2x1ZGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBubyBzdWNoIGR5bmFtaWMgcG9saWN5IHRoZW4KKyAgICAgICAgICogMikgRGV2aWNlcyBjb250YWluaW5nIGFuIGFjdGl2ZSBjbGllbnQgdXNpbmcgc2V0UHJlZmVycmVkRGV2aWNlCisgICAgICAgICAqICAgIHdpdGggc2FtZSBzdHJhdGVneSBhcyB0aGUgYXR0cmlidXRlcy4KKyAgICAgICAgICogICAgKGZyb20gdGhlIGRlZmF1bHQgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygpIGltcGxlbWVudGF0aW9uKS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgbm8gY29ycmVzcG9uZGluZyBhY3RpdmUgY2xpZW50IHdpdGggc2V0UHJlZmVycmVkRGV2aWNlIHRoZW4KKyAgICAgICAgICogMykgRGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmF0ZWd5IGRldGVybWluZWQgYnkgdGhlIGF0dHJpYnV0ZXMKKyAgICAgICAgICogICAgKGZyb20gdGhlIGRlZmF1bHQgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygpIGltcGxlbWVudGF0aW9uKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgdG8gYmUgY29uc2lkZXJlZAorICAgICAgICAgKiBAcGFyYW0gZGV2aWNlcyAgICBhbiBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGNvbnRhaW5lciBwYXNzZWQgaW4gdGhhdAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGZpbGxlZCBvbiBzdWNjZXNzLgorICAgICAgICAgKiBAcGFyYW0gZm9yVm9sdW1lICB0cnVlIGlmIHRoZSBkZXZpY2VzIGFyZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudCBkZXZpY2Ugdm9sdW1lLgorICAgICAgICAgKiBAcmV0dXJuICAgICAgICAgICBOT19FUlJPUiBvbiBzdWNjZXNzLgorICAgICAgICAgKi8KICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yQXR0cmlidXRlcygKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAqZGV2aWNlcyk7CisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICBib29sIGZvclZvbHVtZSk7CiAKICAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyA9IE5VTEwpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCkBAIC0yNDAsMTAgKzI2NCw3IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpIHsKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVBdWRpb1BhdGNoSW50ZXJuYWwocGF0Y2gsIGhhbmRsZSwgdWlkKTsKLSAgICAgICAgfQotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCkBAIC0zMjAsMTMgKzM0MSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKTsKIAotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKAorICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpOwogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRBcHBTdGF0ZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgYXBwX3N0YXRlX3Qgc3RhdGUpOwogCiAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7CiAKKyAgICAgICAgdmlydHVhbCBib29sIGlzVWx0cmFzb3VuZFN1cHBvcnRlZCgpOworCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBtRW5naW5lLT5saXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKQEAgLTM1Niw2ICszNzksMjQgQEAKICAgICAgICAgICAgICAgICAgICAgQkFEX1ZBTFVFIDogTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICB2aXJ0dWFsIGJvb2wgY2FuQmVTcGF0aWFsaXplZChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBjYW5CZVNwYXRpYWxpemVkSW50KGF0dHIsIGNvbmZpZywgZGV2aWNlcyk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNwYXRpYWxpemVyT3V0cHV0KGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNwYXRpYWxpemVyT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisKKyAgICAgICAgdmlydHVhbCBhdWRpb19kaXJlY3RfbW9kZV90IGdldERpcmVjdFBsYXliYWNrU3VwcG9ydChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZyk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qcm9maWxlVmVjdG9yJiBhdWRpb1Byb2ZpbGVzKTsKKwogICAgICAgICBib29sIGlzQ2FsbFNjcmVlbk1vZGVTdXBwb3J0ZWQoKSBvdmVycmlkZTsKIAogICAgICAgICB2b2lkIG9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCkgb3ZlcnJpZGU7CkBAIC00MjEsMTMgKzQ2MiwzMCBAQAogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Vm9sdW1lU291cmNlPih2b2x1bWVHcm91cCk7CiAgICAgICAgIH0KLSAgICAgICAgVm9sdW1lU291cmNlIHRvVm9sdW1lU291cmNlKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcykgY29uc3QKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiB0b1ZvbHVtZVNvdXJjZSBjb252ZXJ0cyBhbiBhdWRpbyBhdHRyaWJ1dGVzIGludG8gYSB2b2x1bWUgc291cmNlCisgICAgICAgICAqIChlaXRoZXIgYSBsZWdhY3kgc3RyZWFtIG9yIGEgdm9sdW1lIGdyb3VwKS4gSWYgZmFsbGJhY2sgb24gZGVmYXVsdCBpcyBhbGxvd2VkLCBhbmQgaWYKKyAgICAgICAgICogdGhlIGF1ZGlvIGF0dHJpYnV0ZXMgZG8gbm90IGZvbGxvdyBhbnkgc3BlY2lmaWMgcHJvZHVjdCBzdHJhdGVneSdzIHJ1bGUsIGl0IHdpbGwgYmUKKyAgICAgICAgICogYXNzb2NpYXRlZCB0byBkZWZhdWx0IHZvbHVtZSBzb3VyY2UsIGUuZy4gbXVzaWMuIFRodXMsIGFueSBvZiBjYWxsIG9mIHZvbHVtZSBBUEkKKyAgICAgICAgICogdXNpbmcgdGhpcyB0cmFuc2xhdGlvbiBmdW5jdGlvbiBtYXkgYWZmZWN0IHRoZSBkZWZhdWx0IHZvbHVtZSBzb3VyY2UuCisgICAgICAgICAqIElmIGZhbGxiYWNrIGlzIG5vdCBhbGxvd2VkIGFuZCBubyBtYXRjaGluZyBydWxlIGlzIGlkZW50aWZpZWQgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLAorICAgICAgICAgKiB0aGUgdm9sdW1lIHNvdXJjZSB3aWxsIGJlIHVuZGVmaW5lZCwgdGh1cywgbm8gdm9sdW1lIHdpbGwgYmUgYWx0ZXJlZC9tb2RpZmllZC4KKyAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgdG8gYmUgY29uc2lkZXJlZAorICAgICAgICAgKiBAcGFyYW0gZmFsbGJhY2tPbkRlZmF1bHQKKyAgICAgICAgICogQHJldHVybiB2b2x1bWUgc291cmNlIGFzc29jaWF0ZWQgd2l0aCBnaXZlbiBhdHRyaWJ1dGVzLCBvdGhlcndpc2UgZWl0aGVyIG11c2ljIGlmCisgICAgICAgICAqIGZhbGxiYWNrT25EZWZhdWx0IGlzIHNldCBvciBub25lLgorICAgICAgICAgKi8KKyAgICAgICAgVm9sdW1lU291cmNlIHRvVm9sdW1lU291cmNlKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLCBib29sIGZhbGxiYWNrT25EZWZhdWx0ID0gdHJ1ZSkgY29uc3QKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRvVm9sdW1lU291cmNlKG1FbmdpbmUtPmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSk7CisgICAgICAgICAgICByZXR1cm4gdG9Wb2x1bWVTb3VyY2UobUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsIGZhbGxiYWNrT25EZWZhdWx0KSk7CiAgICAgICAgIH0KLSAgICAgICAgVm9sdW1lU291cmNlIHRvVm9sdW1lU291cmNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAorICAgICAgICBWb2x1bWVTb3VyY2UgdG9Wb2x1bWVTb3VyY2UoCisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBmYWxsYmFja09uRGVmYXVsdCA9IHRydWUpIGNvbnN0CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0b1ZvbHVtZVNvdXJjZShtRW5naW5lLT5nZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoc3RyZWFtKSk7CisgICAgICAgICAgICByZXR1cm4gdG9Wb2x1bWVTb3VyY2UobUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKAorICAgICAgICAgICAgICAgIHN0cmVhbSwgZmFsbGJhY2tPbkRlZmF1bHQpKTsKICAgICAgICAgfQogICAgICAgICBJVm9sdW1lQ3VydmVzICZnZXRWb2x1bWVDdXJ2ZXMoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSkKICAgICAgICAgewpAQCAtNDUzLDE0ICs1MTEsMjcgQEAKICAgICAgICAgdm9pZCByZW1vdmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKICAgICAgICAgdm9pZCBhZGRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MpOwogCi0gICAgICAgIC8vIGNoYW5nZSB0aGUgcm91dGUgb2YgdGhlIHNwZWNpZmllZCBvdXRwdXQuIFJldHVybnMgdGhlIG51bWJlciBvZiBtcyB3ZSBoYXZlIHNsZXB0IHRvCi0gICAgICAgIC8vIGFsbG93IG5ldyByb3V0aW5nIHRvIHRha2UgZWZmZWN0IGluIGNlcnRhaW4gY2FzZXMuCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgc2V0T3V0cHV0RGV2aWNlcyBjaGFuZ2UgdGhlIHJvdXRlIG9mIHRoZSBzcGVjaWZpZWQgb3V0cHV0LgorICAgICAgICAgKiBAcGFyYW0gb3V0cHV0RGVzYyB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAqIEBwYXJhbSBkZXZpY2UgdG8gYmUgY29uc2lkZXJlZCB0byByb3V0ZSB0aGUgb3V0cHV0CisgICAgICAgICAqIEBwYXJhbSBmb3JjZSBpZiB0cnVlLCBmb3JjZSB0aGUgcm91dGluZyBldmVuIGlmIG5vIGNoYW5nZS4KKyAgICAgICAgICogQHBhcmFtIGRlbGF5TXMgaWYgc3BlY2lmaWVkLCBkZWxheSB0byBhcHBseSBmb3IgbXV0ZS92b2x1bWUgb3Agd2hlbiBjaGFuZ2luZyBkZXZpY2UKKyAgICAgICAgICogQHBhcmFtIHBhdGNoSGFuZGxlIGlmIHNwZWNpZmllZCwgdGhlIHBhdGNoIGhhbmRsZSB0aGlzIG91dHB1dCBpcyBjb25uZWN0ZWQgdGhyb3VnaC4KKyAgICAgICAgICogQHBhcmFtIHJlcXVpcmVzTXV0ZUNoZWNrIGlmIHNwZWNpZmllZCwgZm9yIGUuZy4gd2hlbiBhbm90aGVyIG91dHB1dCBpcyBvbiBhIHNoYXJlZCBkZXZpY2UKKyAgICAgICAgICogICAgICAgIGFuZCBjdXJyZW50bHkgYWN0aXZlLCBhbGxvdyB0byBoYXZlIHByb3BlciBkcmFpbiBhbmQgYXZvaWQgcG9wcworICAgICAgICAgKiBAcGFyYW0gcmVxdWlyZXNWb2x1bWVDaGVjayB0cnVlIGlmIGNhbGxlZCByZXF1aXJlcyB0byByZWFwcGx5IHZvbHVtZSBpZiB0aGUgcm91dGluZyBkaWQKKyAgICAgICAgICogbm90IGNoYW5nZSAoYnV0IHRoZSBvdXRwdXQgaXMgc3RpbGwgcm91dGVkKS4KKyAgICAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1zIHdlIGhhdmUgc2xlcHQgdG8gYWxsb3cgbmV3IHJvdXRpbmcgdG8gdGFrZSBlZmZlY3QgaW4gY2VydGFpbgorICAgICAgICAgKiBjYXNlcy4KKyAgICAgICAgICovCiAgICAgICAgIHVpbnQzMl90IHNldE91dHB1dERldmljZXMoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVzTXV0ZUNoZWNrID0gdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjayA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc1ZvbHVtZUNoZWNrID0gZmFsc2UpOwogICAgICAgICBzdGF0dXNfdCByZXNldE91dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOwpAQCAtNTI3LDkgKzU5OCw5IEBACiAgICAgICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCk7CiAKICAgICAgICAgLy8gdHJ1ZSBpZiBkZXZpY2UgaXMgaW4gYSB0ZWxlcGhvbnkgb3IgVm9JUCBjYWxsCi0gICAgICAgIHZpcnR1YWwgYm9vbCBpc0luQ2FsbCgpOworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbkNhbGwoKSBjb25zdDsKICAgICAgICAgLy8gdHJ1ZSBpZiBnaXZlbiBzdGF0ZSByZXByZXNlbnRzIGEgZGV2aWNlIGluIGEgdGVsZXBob255IG9yIFZvSVAgY2FsbAotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdGF0ZUluQ2FsbChpbnQgc3RhdGUpOworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdGF0ZUluQ2FsbChpbnQgc3RhdGUpIGNvbnN0OwogICAgICAgICAvLyB0cnVlIGlmIHBsYXliYWNrIHRvIGNhbGwgVFggb3IgY2FwdHVyZSBmcm9tIGNhbGwgUlggaXMgcG9zc2libGUKICAgICAgICAgYm9vbCBpc0NhbGxBdWRpb0FjY2Vzc2libGUoKTsKIApAQCAtNTY1LDEzICs2MzYsMjIgQEAKICAgICAgICAgdm9pZCB1cGRhdGVDYWxsQW5kT3V0cHV0Um91dGluZyhib29sIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZSwgdWludDMyX3QgZGVsYXlNcyA9IDApOwogCiAgICAgICAgIGJvb2wgaXNDYWxsUnhBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiAmc291cmNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNhbGxSeFNvdXJjZUNsaWVudFBvcnQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORQotICAgICAgICAgICAgICAgICYmIHNvdXJjZSA9PSBtQXVkaW9Tb3VyY2VzLnZhbHVlRm9yKG1DYWxsUnhTb3VyY2VDbGllbnRQb3J0KTsKKyAgICAgICAgICAgIHJldHVybiBtQ2FsbFJ4U291cmNlQ2xpZW50ICE9IG51bGxwdHIgJiYgc291cmNlID09IG1DYWxsUnhTb3VyY2VDbGllbnQ7CiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIGNvbm5lY3RUZWxlcGhvbnlSeEF1ZGlvU291cmNlKCk7CiAKLSAgICAgICAgdm9pZCBkaXNjb25uZWN0VGVsZXBob255UnhBdWRpb1NvdXJjZSgpOworICAgICAgICB2b2lkIGRpc2Nvbm5lY3RUZWxlcGhvbnlBdWRpb1NvdXJjZShzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiAmY2xpZW50RGVzYyk7CisKKyAgICAgICAgdm9pZCBjb25uZWN0VGVsZXBob255VHhBdWRpb1NvdXJjZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmc3JjZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZzaW5rRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpOworCisgICAgICAgIGJvb2wgaXNUZWxlcGhvbnlSeE9yVHgoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBkZXNjKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKG1DYWxsUnhTb3VyY2VDbGllbnQgIT0gbnVsbHB0ciAmJiBtQ2FsbFJ4U291cmNlQ2xpZW50LT5iZWxvbmdzVG9PdXRwdXQoZGVzYykpCisgICAgICAgICAgICAgICAgICAgIHx8IChtQ2FsbFR4U291cmNlQ2xpZW50ICE9IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgJiYgIG1DYWxsVHhTb3VyY2VDbGllbnQtPmJlbG9uZ3NUb091dHB1dChkZXNjKSk7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogQGJyaWVmIHVwZGF0ZXMgcm91dGluZyBmb3IgYWxsIGlucHV0cy4KQEAgLTY4OSw2ICs3NjksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRpcmVjdE9ubHkpOworICAgICAgICAvKioKKyAgICAgICAgKiBTYW1lIGFzIGdldFByb2ZpbGVGb3JPdXRwdXQsIGJ1dCBpdCBsb29rcyBmb3IgYW4gTVNEIHByb2ZpbGUKKyAgICAgICAgKi8KKyAgICAgICAgc3A8SU9Qcm9maWxlPiBnZXRNc2RQcm9maWxlRm9yT3V0cHV0KGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGlyZWN0T25seSk7CiAKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzKCk7CiAKQEAgLTc3OCw2ICs4NjcsMTIgQEAKICAgICAgICAgc3RhdHVzX3QgY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKTsKICAgICAgICAgc3RhdHVzX3QgZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKTsKIAorICAgICAgICBzdGF0dXNfdCBjb25uZWN0QXVkaW9Tb3VyY2VUb1NpbmsoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmc2lua0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAmaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCB1aW50MzJfdCBkZWxheU1zKTsKKwogICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBnZXRTb3VyY2VGb3JBdHRyaWJ1dGVzT25PdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKTsKICAgICAgICAgdm9pZCBjbGVhckF1ZGlvU291cmNlc0Zvck91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwpAQCAtNzkyLDExICs4ODcsMjggQEAKICAgICAgICAgdm9pZCBjbG9zZUFjdGl2ZUNsaWVudHMoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dCk7CiAgICAgICAgIHZvaWQgY2xvc2VDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgaXNBbnlEZXZpY2VUeXBlQWN0aXZlOiByZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb25lIGFjdGl2ZSBjbGllbnQgaXMgcm91dGVkIHRvCisgICAgICAgICAqIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGRldmljZXMKKyAgICAgICAgICogQHBhcmFtIGRldmljZVR5cGVzIGxpc3Qgb2YgZGV2aWNlcyB0byBjb25zaWRlcgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBpc0FueURldmljZVR5cGVBY3RpdmUoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpIGNvbnN0OworICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIGlzTGVVbmljYXN0QWN0aXZlOiByZXR1cm5zIHRydWUgaWYgYSBjYWxsIGlzIGFjdGl2ZSBvciBhdCBsZWFzdCBvbmUgYWN0aXZlIGNsaWVudAorICAgICAgICAgKiBpcyByb3V0ZWQgdG8gYSBMRSB1bmljYXN0IGRldmljZQorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBpc0xlVW5pY2FzdEFjdGl2ZSgpIGNvbnN0OworCisgICAgICAgIHZvaWQgY2hlY2tMZUJyb2FkY2FzdFJvdXRlcyhib29sIHdhc1VuaWNhc3RBY3RpdmUsCisgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGlnbm9yZWRPdXRwdXQsIHVpbnQzMl90IGRlbGF5TXMpOworCiAgICAgICAgIGNvbnN0IHVpZF90IG1VaWRDYWNoZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFJRF9BVURJT1NFUlZFUgogICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbXBDbGllbnRJbnRlcmZhY2U7ICAvLyBhdWRpbyBwb2xpY3kgY2xpZW50IGludGVyZmFjZQogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVByaW1hcnlPdXRwdXQ7ICAgICAvLyBwcmltYXJ5IG91dHB1dCBkZXNjcmlwdG9yCiAgICAgICAgIC8vIGxpc3Qgb2YgZGVzY3JpcHRvcnMgZm9yIG91dHB1dHMgY3VycmVudGx5IG9wZW5lZAogCisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtU3BhdGlhbGl6ZXJPdXRwdXQ7CisKICAgICAgICAgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gbU91dHB1dHM7CiAgICAgICAgIC8vIGNvcHkgb2YgbU91dHB1dHMgYmVmb3JlIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIG9wZW5zIG5ldyBvdXRwdXRzCiAgICAgICAgIC8vIHJlc2V0IHRvIG1PdXRwdXRzIHdoZW4gdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKSBpcyBjYWxsZWQuCkBAIC04MjYsOCArOTM4LDYgQEAKIAogICAgICAgICBTb3VuZFRyaWdnZXJTZXNzaW9uQ29sbGVjdGlvbiBtU291bmRUcmlnZ2VyU2Vzc2lvbnM7CiAKLSAgICAgICAgc3A8QXVkaW9QYXRjaD4gbUNhbGxUeFBhdGNoOwotCiAgICAgICAgIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uIG1Id091dHB1dHM7CiAgICAgICAgIFNvdXJjZUNsaWVudENvbGxlY3Rpb24gbUF1ZGlvU291cmNlczsKIApAQCAtODQyLDcgKzk1Miw4IEBACiAgICAgICAgIHVpbnQzMl90IG1CZWFjb25NdXRlUmVmQ291bnQ7ICAgLy8gcmVmIGNvdW50IGZvciBzdHJlYW0gdGhhdCB3b3VsZCBtdXRlIGJlYWNvbgogICAgICAgICB1aW50MzJfdCBtQmVhY29uUGxheWluZ1JlZkNvdW50Oy8vIHJlZiBjb3VudCBmb3IgdGhlIHBsYXlpbmcgYmVhY29uIHN0cmVhbXMKICAgICAgICAgYm9vbCBtQmVhY29uTXV0ZWQ7ICAgICAgICAgICAgICAvLyBoYXMgU1RSRUFNX1RUUyBiZWVuIG11dGVkCi0gICAgICAgIGJvb2wgbVR0c091dHB1dEF2YWlsYWJsZTsgICAgICAgLy8gdHJ1ZSBpZiBhIGRlZGljYXRlZCBvdXRwdXQgZm9yIFRUUyBzdHJlYW0gaXMgYXZhaWxhYmxlCisgICAgICAgIC8vIHRydWUgaWYgYSBkZWRpY2F0ZWQgb3V0cHV0IGZvciBUVFMgc3RyZWFtIG9yIFVsdHJhc291bmQgaXMgYXZhaWxhYmxlCisgICAgICAgIGJvb2wgbVR0c091dHB1dEF2YWlsYWJsZTsKIAogICAgICAgICBib29sIG1NYXN0ZXJNb25vOyAgICAgICAgICAgICAgIC8vIHRydWUgaWYgd2Ugd2lzaCB0byBmb3JjZSBhbGwgb3V0cHV0cyB0byBtb25vCiAgICAgICAgIEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbiBtUG9saWN5TWl4ZXM7IC8vIGxpc3Qgb2YgcmVnaXN0ZXJlZCBtaXhlcwpAQCAtODY3LDcgKzk3OCw4IEBACiAKICAgICAgICAgLy8gVGhlIHBvcnQgaGFuZGxlIG9mIHRoZSBoYXJkd2FyZSBhdWRpbyBzb3VyY2UgY3JlYXRlZCBpbnRlcm5hbGx5IGZvciB0aGUgQ2FsbCBSWCBhdWRpbwogICAgICAgICAvLyBlbmQgcG9pbnQuCi0gICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUNhbGxSeFNvdXJjZUNsaWVudFBvcnQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBtQ2FsbFJ4U291cmNlQ2xpZW50OworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBtQ2FsbFR4U291cmNlQ2xpZW50OwogCiAgICAgICAgIC8vIFN1cHBvcnQgZm9yIE11bHRpLVN0cmVhbSBEZWNvZGVyIChNU0QpIG1vZHVsZQogICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRNc2RBdWRpb0luRGV2aWNlKCkgY29uc3Q7CkBAIC04ODgsNyArMTAwMCwyNCBAQAogICAgICAgICBQYXRjaEJ1aWxkZXIgYnVpbGRNc2RQYXRjaChib29sIG1zZElzU291cmNlLCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKSBjb25zdDsKICAgICAgICAgc3RhdHVzX3Qgc2V0TXNkT3V0cHV0UGF0Y2hlcyhjb25zdCBEZXZpY2VWZWN0b3IgKm91dHB1dERldmljZXMgPSBudWxscHRyKTsKICAgICAgICAgdm9pZCByZWxlYXNlTXNkT3V0cHV0UGF0Y2hlcyhjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMpOworICAgICAgICBib29sIG1zZEhhc1BhdGNoZXNUb0FsbERldmljZXMoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcyk7CisKKyAgICAgICAgLy8gT3ZlcmxvYWQgb2Ygc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkKKyAgICAgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGV2aWNlX2FkZHJlc3MsIGNvbnN0IGNoYXIqIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CisKKyAgICAgICAgLy8gQ2FsbGVkIGJ5IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpCisgICAgICAgIHN0YXR1c190IGRldmljZVRvQXVkaW9Qb3J0KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLCBjb25zdCBjaGFyKiBkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGV2aWNlX25hbWUsIG1lZGlhOjpBdWRpb1BvcnQqIGFpZFBvcnQpOworICAgICAgICBib29sIGlzTXNkUGF0Y2goY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgJmhhbmRsZSkgY29uc3Q7CisKIHByaXZhdGU6CisgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHN0YXJ0QXVkaW9Tb3VyY2VJbnRlcm5hbCgKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7CisKICAgICAgICAgdm9pZCBvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZUludChEZXZpY2VWZWN0b3IgKm5ld0RldmljZXMpOwogCiAgICAgICAgIC8vIEFkZCBvciByZW1vdmUgQUMzIERUUyBlbmNvZGluZ3MgYmFzZWQgb24gdXNlciBwcmVmZXJlbmNlcy4KQEAgLTkyOCwxNCArMTA1NywxNiBAQAogICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgYm9vbCAqaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8QXVkaW9Qb2xpY3lNaXg+PiAqc2Vjb25kYXJ5TWl4ZXMsCi0gICAgICAgICAgICAgICAgb3V0cHV0X3R5cGVfdCAqb3V0cHV0VHlwZSk7CisgICAgICAgICAgICAgICAgb3V0cHV0X3R5cGVfdCAqb3V0cHV0VHlwZSwKKyAgICAgICAgICAgICAgICBib29sICppc1NwYXRpYWxpemVkKTsKICAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRvIHJldHVybiB0aGUgb3V0cHV0IGhhbmRsZSBmb3IgdGhlIGdpdmVuIGRldmljZSBhbmQgZm9ybWF0CiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckRldmljZXMoCiAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgICAgICAgICBib29sICppc1NwYXRpYWxpemVkLAogICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VNdXRpbmdIYXB0aWMgPSBmYWxzZSk7CiAKICAgICAgICAgLy8gSW50ZXJuYWwgbWV0aG9kIGNoZWNraW5nIGlmIGEgZGlyZWN0IG91dHB1dCBjYW4gYmUgb3BlbmVkIG1hdGNoaW5nIHRoZSByZXF1ZXN0ZWQKQEAgLTk0OCw2ICsxMDc5LDQxIEBACiAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgUXVlcmllcyBpZiBzb21lIGtpbmQgb2Ygc3BhdGlhbGl6YXRpb24gd2lsbCBiZSBwZXJmb3JtZWQgaWYgdGhlIGF1ZGlvIHBsYXliYWNrCisgICAgICAgICAqIGNvbnRleHQgZGVzY3JpYmVkIGJ5IHRoZSBwcm92aWRlZCBhcmd1bWVudHMgaXMgcHJlc2VudC4KKyAgICAgICAgICogVGhlIGNvbnRleHQgaXMgbWFkZSBvZjoKKyAgICAgICAgICogLSBUaGUgYXVkaW8gYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBwbGF5YmFjayB1c2UgY2FzZS4KKyAgICAgICAgICogLSBUaGUgYXVkaW8gY29uZmlndXJhdGlvbiBkZXNjcmliaW5nIHRoZSBhdWRpbyBmb3JtYXQsIGNoYW5uZWxzLCBzYW1wbGluZyByYXRlIC4uLgorICAgICAgICAgKiAtIFRoZSBkZXZpY2VzIGRlc2NyaWJpbmcgdGhlIHNpbmsgYXVkaW8gZGV2aWNlIHNlbGVjdGVkIGZvciBwbGF5YmFjay4KKyAgICAgICAgICogQWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwgYW5kIG9ubHkgdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYXJlIHVzZWQgdG8gbWF0Y2ggYWdhaW5zdAorICAgICAgICAgKiBzdXBwb3J0ZWQgY3JpdGVyaWEuIEZvciBpbnN0YW5jZSwgc3VwcGx5aW5nIG5vIGFyZ3VtZW50IHdpbGwgdGVsbCBpZiBzcGF0aWFsaXphdGlvbiBpcworICAgICAgICAgKiBzdXBwb3J0ZWQgb3Igbm90IGluIGdlbmVyYWwuCisgICAgICAgICAqIEBwYXJhbSBhdHRyIGF1ZGlvIGF0dHJpYnV0ZXMgZGVzY3JpYmluZyB0aGUgcGxheWJhY2sgdXNlIGNhc2UKKyAgICAgICAgICogQHBhcmFtIGNvbmZpZyBhdWRpbyBjb25maWd1cmF0aW9uIGRlc2NyaWJpbmcgdGhlIGF1ZGlvIGZvcm1hdCwgY2hhbm5lbHMsIHNhbXBsZSByYXRlLi4uCisgICAgICAgICAqIEBwYXJhbSBkZXZpY2VzIHRoZSBzaW5rIGF1ZGlvIGRldmljZSBzZWxlY3RlZCBmb3IgcGxheWJhY2sKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHNwYXRpYWxpemF0aW9uIGlzIHBvc3NpYmxlIGZvciB0aGlzIGNvbnRleHQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgYm9vbCBjYW5CZVNwYXRpYWxpemVkSW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAgICAgc3A8SU9Qcm9maWxlPiBnZXRTcGF0aWFsaXplck91dHB1dFByb2ZpbGUoY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAgICAgdm9pZCBjaGVja1ZpcnR1YWxpemVyQ2xpZW50Um91dGVzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBSZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb25lIGRldmljZSBjYW4gb25seSBiZSByZWFjaGVkIHZpYSB0aGUgb3V0cHV0IHBhc3NlZAorICAgICAgICAgKiBhcyBhcmd1bWVudC4gQWx3YXlzIHJldHVybnMgZmFsc2UgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0cy4KKyAgICAgICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBkZWNpZGUgaWYgYW4gb3V0cHV0IGNhbiBiZSBjbG9zZWQgd2l0aG91dCBmb3JiaWRkaW5nCisgICAgICAgICAqIHBsYXliYWNrIHRvIGFueSBnaXZlbiBkZXZpY2UuCisgICAgICAgICAqIEBwYXJhbSBvdXRwdXREZXNjIHRoZSBvdXRwdXQgdG8gY29uc2lkZXIKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBkZXZpY2UgY2FuIG9ubHkgYmUgcmVhY2hlZCB2aWEgdGhlIG91dHB1dC4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaXNPdXRwdXRPbmx5QXZhaWxhYmxlUm91dGVUb1NvbWVEZXZpY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKKwogICAgICAgICAvKioKICAgICAgICAgICogQGJyaWVmIGdldElucHV0Rm9yRGV2aWNlIHNlbGVjdHMgYW4gaW5wdXQgaGFuZGxlIGZvciBhIGdpdmVuIGlucHV0IGRldmljZSBhbmQKICAgICAgICAgICogcmVxdWVzdGVyIGNvbnRleHQKQEAgLTk3NSw2ICsxMTQxLDkgQEAKICAgICAgICAgYm9vbCAgICAgaXNWYWxpZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICpwYWEpOwogCiAgICAgICAgIC8vIENhbGxlZCBieSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKS4KKyAgICAgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnQmIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICAgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCkBAIC05OTgsMjEgKzExNjcsMjUgQEAKICAgICAgICAgICogQHBhcmFtW291dF0gaGFuZGxlIHBhdGNoIGhhbmRsZSB0byBiZSBwcm92aWRlZCBpZiBwYXRjaCBpbnN0YWxsZWQgY29ycmVjdGx5CiAgICAgICAgICAqIEBwYXJhbVtpbl0gdWlkIG9mIHRoZSBjbGllbnQKICAgICAgICAgICogQHBhcmFtW2luXSBkZWxheU1zIGlmIHJlcXVpcmVkCi0gICAgICAgICAqIEBwYXJhbVtpbl0gc291cmNlRGVzYyBbb3B0aW9uYWxdIGluIGNhc2Ugb2YgZXh0ZXJuYWwgc291cmNlLCBzb3VyY2UgY2xpZW50IHRvIGJlCi0gICAgICAgICAqIGNvbmZpZ3VyZWQgYnkgdGhlIHBhdGNoLCBpLmUuIGFzc2lnbmluZyBhbiBPdXRwdXQgKEhXIG9yIFNXKQorICAgICAgICAgKiBAcGFyYW1baW5dIHNvdXJjZURlc2Mgc291cmNlIGNsaWVudCB0byBiZSBjb25maWd1cmVkIHdoZW4gY3JlYXRpbmcgdGhlIHBhdGNoLCBpLmUuCisgICAgICAgICAqICAgICAgICAgICAgYXNzaWduaW5nIGFuIE91dHB1dCAoSFcgb3IgU1cpIHVzZWQgZm9yIHZvbHVtZSBjb250cm9sLgogICAgICAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHBhdGNoIGluc3RhbGxlZCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgogICAgICAgICAgKi8KICAgICAgICAgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaEludGVybmFsKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCB1aW50MzJfdCBkZWxheU1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjID0gbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIHVpbnQzMl90IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYyk7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBAYnJpZWYgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbCBpbnRlcm5hbCBmdW5jdGlvbiB0byByZW1vdmUgYW4gYXVkaW8gcGF0Y2gKICAgICAgICAgICogQHBhcmFtW2luXSBoYW5kbGUgb2YgdGhlIHBhdGNoIHRvIGJlIHJlbW92ZWQKICAgICAgICAgICogQHBhcmFtW2luXSBkZWxheU1zIGlmIHJlcXVpcmVkCisgICAgICAgICAqIEBwYXJhbVtpbl0gc291cmNlRGVzYyBbb3B0aW9uYWxdIGluIGNhc2Ugb2YgZXh0ZXJuYWwgc291cmNlLCBzb3VyY2UgY2xpZW50IHRvIGJlCisgICAgICAgICAqIHVucm91dGVkIGZyb20gdGhlIHBhdGNoLCBpLmUuIGFzc2lnbmluZyBhbiBPdXRwdXQgKEhXIG9yIFNXKQogICAgICAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHBhdGNoIHJlbW92ZWQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KICAgICAgICAgICovCi0gICAgICAgIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLCB1aW50MzJfdCBkZWxheU1zID0gMCk7CisgICAgICAgIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjID0gbnVsbHB0cik7CiAKICAgICAgICAgc3RhdHVzX3QgaW5zdGFsbFBhdGNoKGNvbnN0IGNoYXIgKmNhbGxlciwKICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCkBAIC0xMDM0LDExICsxMjA3LDQ3IEBACiAKICAgICAgICAgYm9vbCBpc1Njb1JlcXVlc3RlZEZvckNvbW0oKSBjb25zdDsKIAorICAgICAgICBib29sIGlzSGVhcmluZ0FpZFVzZWRGb3JDb21tKCkgY29uc3Q7CisKICAgICAgICAgYm9vbCBhcmVBbGxBY3RpdmVUcmFja3NSZXJvdXRlZChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dCk7CiAKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG9wZW5PdXRwdXRXaXRoUHJvZmlsZUFuZERldmljZShjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcyk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgT3BlbnMgYW4gb3V0cHV0IHN0cmVhbSBmcm9tIHRoZSBzdXBwbGllZCBJT1Byb2ZpbGUgYW5kIHJvdXRlIGl0IHRvIHRoZQorICAgICAgICAgKiBzdXBwbGllZCBhdWRpbyBkZXZpY2VzLiBJZiBhIG1peGVyIGNvbmZpZyBpcyBzcGVjaWZpZWQsIGl0IGlzIGZvcndhcmRlZCB0byBhdWRpbworICAgICAgICAgKiBmbGluZ2VyLiBJZiBub3QsIGEgZGVmYXVsdCBjb25maWcgaXMgZGVyaXZlZCBmcm9tIHRoZSBvdXRwdXQgc3RyZWFtIGNvbmZpZy4KKyAgICAgICAgICogQWxzbyBvcGVucyBhIGR1cGxpY2F0aW5nIG91dHB1dCBpZiBuZWVkZWQgYW5kIHF1ZXJpZXMgdGhlIGF1ZGlvIEhBTCBmb3Igc3VwcG9ydGVkCisgICAgICAgICAqIGF1ZGlvIHByb2ZpbGVzIGlmIHRoZSBJT1Byb2ZpbGUgaXMgZHluYW1pYy4KKyAgICAgICAgICogQHBhcmFtW2luXSBwcm9maWxlIElPUHJvZmlsZSB0byB1c2UgYXMgdGVtcGxhdGUKKyAgICAgICAgICogQHBhcmFtW2luXSBkZXZpY2VzIGluaXRpYWwgcm91dGUgdG8gYXBwbHkgdG8gdGhpcyBvdXRwdXQgc3RyZWFtCisgICAgICAgICAqIEBwYXJhbVtpbl0gbWl4ZXJDb25maWcgaWYgbm90IG51bGwsIHVzZSB0aGlzIHRvIGNvbmZpZ3VyZSB0aGUgbWl4ZXIKKyAgICAgICAgICogQHJldHVybiBhbiBvdXRwdXQgZGVzY3JpcHRvciBmb3IgdGhlIG5ld2x5IG9wZW5lZCBzdHJlYW0gb3IgbnVsbCBpbiBjYXNlIG9mIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG9wZW5PdXRwdXRXaXRoUHJvZmlsZUFuZERldmljZSgKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlLCBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsCisgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqbWl4ZXJDb25maWcgPSBudWxscHRyKTsKIAorICAgICAgICBib29sIGlzT2ZmbG9hZFBvc3NpYmxlKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGR1cmF0aW9uSWdub3JlZCA9IGZhbHNlKTsKKworICAgICAgICAvLyBhZGRzIHRoZSBwcm9maWxlcyBmcm9tIHRoZSBvdXRwdXRQcm9maWxlIHRvIHRoZSBwYXNzZWQgYXVkaW9Qcm9maWxlc1ZlY3RvcgorICAgICAgICAvLyB3aXRob3V0IGR1cGxpY2F0aW5nIHRoZW0gaWYgYWxyZWFkeSBwcmVzZW50CisgICAgICAgIHZvaWQgYWRkUG9ydFByb2ZpbGVzVG9WZWN0b3Ioc3A8SU9Qcm9maWxlPiBvdXRwdXRQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qcm9maWxlVmVjdG9yJiBhdWRpb1Byb2ZpbGVzVmVjdG9yKTsKKworICAgICAgICAvLyBTZWFyY2hlcyBmb3IgYSBjb21wYXRpYmxlIHByb2ZpbGUgd2l0aCB0aGUgc2FtcGxlIHJhdGUsIGF1ZGlvIGZvcm1hdCBhbmQgY2hhbm5lbCBtYXNrCisgICAgICAgIC8vIGluIHRoZSBsaXN0IG9mIHBhc3NlZCBId01vZHVsZShzKS4KKyAgICAgICAgLy8gcmV0dXJucyBhIGNvbXBhdGlibGUgcHJvZmlsZSBpZiBmb3VuZCwgbnVsbHB0ciBvdGhlcndpc2UKKyAgICAgICAgc3A8SU9Qcm9maWxlPiBzZWFyY2hDb21wYXRpYmxlUHJvZmlsZUh3TW9kdWxlcyAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEh3TW9kdWxlQ29sbGVjdGlvbiYgaHdNb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGlyZWN0T25seSk7CisKKyAgICAgICAgLy8gRmlsdGVycyBvbmx5IHRoZSByZWxldmFudCBmbGFncyBmb3IgZ2V0UHJvZmlsZUZvck91dHB1dAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBnZXRSZWxldmFudEZsYWdzIChhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywgYm9vbCBkaXJlY3RPbmx5KTsKIH07CiAKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0FuZHJvaWQuYnAKaW5kZXggNDU0YzAyMC4uY2RhZDlhNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQW5kcm9pZC5icApAQCAtMTYsNiArMTYsOCBAQAogICAgICAgICAiQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCIsCiAgICAgICAgICJBdWRpb1BvbGljeVNlcnZpY2UuY3BwIiwKICAgICAgICAgIkNhcHR1cmVTdGF0ZU5vdGlmaWVyLmNwcCIsCisgICAgICAgICJTcGF0aWFsaXplci5jcHAiLAorICAgICAgICAiU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlci5jcHAiLAogICAgIF0sCiAKICAgICBpbmNsdWRlX2RpcnM6IFsKQEAgLTI3LDYgKzI5LDcgQEAKICAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCiAgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAorICAgICAgICAibGliYXVkaW9oYWwiLAogICAgICAgICAibGliYXVkaW9wb2xpY3kiLAogICAgICAgICAibGliYXVkaW9wb2xpY3ltYW5hZ2VyZGVmYXVsdCIsCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKQEAgLTM0LDE5ICszNywyNyBAQAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmVmZmVjdHNjb25maWciLAogICAgICAgICAibGliaGFyZHdhcmVfbGVnYWN5IiwKKyAgICAgICAgImxpYmhlYWR0cmFja2luZyIsCisgICAgICAgICJsaWJoZWFkdHJhY2tpbmctYmluZGluZyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYnBlcm1pc3Npb24iLAorICAgICAgICAibGlic2Vuc29yIiwKICAgICAgICAgImxpYnNlbnNvcnByaXZhY3kiLAorICAgICAgICAibGlic2htZW1jb21wYXQiLAogICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAogICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAiYXVkaW9mbGluZ2VyLWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvcG9saWN5LWFpZGwtY3BwIiwKICAgICAgICAgImF1ZGlvcG9saWN5LXR5cGVzLWFpZGwtY3BwIiwKICAgICAgICAgImNhcHR1cmVfc3RhdGVfbGlzdGVuZXItYWlkbC1jcHAiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgICAgICAicGFja2FnZW1hbmFnZXJfYWlkbC1jcHAiLAorICAgICAgICAic3BhdGlhbGl6ZXItYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpAQCAtNTUsNiArNjYsNyBAQAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9oYWxfaGVhZGVycyIsCiAgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbW1vbiIsCiAgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyIsCiAgICAgICAgICJsaWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJmYWNlX2hlYWRlcnMiLApAQCAtNzAsNiArODIsOCBAQAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwogICAgICAgICAibGliYWN0aXZpdHltYW5hZ2VyX2FpZGwiLAorICAgICAgICAibGliaGVhZHRyYWNraW5nIiwKKyAgICAgICAgImxpYmhlYWR0cmFja2luZy1iaW5kaW5nIiwKICAgICAgICAgImxpYnNlbnNvcnByaXZhY3kiLAogICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgIF0sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKaW5kZXggY2Q1MzA3My4uYzc2NmExNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcApAQCAtNDAsNyArNDAsOCBAQAogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpoYWxDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKm1peGVyQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCkBAIC01NSwxNCArNTYsMTggQEAKICAgICBtZWRpYTo6T3Blbk91dHB1dFJlc3BvbnNlIHJlc3BvbnNlOwogCiAgICAgcmVxdWVzdC5tb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KG1vZHVsZSkpOwotICAgIHJlcXVlc3QuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZygqY29uZmlnKSk7CisgICAgcmVxdWVzdC5oYWxDb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoKmhhbENvbmZpZywgZmFsc2UgLyppc0lucHV0Ki8pKTsKKyAgICByZXF1ZXN0Lm1peGVyQ29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKCptaXhlckNvbmZpZywgZmFsc2UgLyppc0lucHV0Ki8pKTsKICAgICByZXF1ZXN0LmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfRGV2aWNlRGVzY3JpcHRvckJhc2UoZGV2aWNlKSk7CiAgICAgcmVxdWVzdC5mbGFncyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfaW50MzJfdF9tYXNrKGZsYWdzKSk7CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhZi0+b3Blbk91dHB1dChyZXF1ZXN0LCAmcmVzcG9uc2UpOwogICAgIGlmIChzdGF0dXMgPT0gT0spIHsKICAgICAgICAgKm91dHB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChyZXNwb25zZS5vdXRwdXQpKTsKLSAgICAgICAgKmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QocmVzcG9uc2UuY29uZmlnKSk7CisgICAgICAgICpoYWxDb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KHJlc3BvbnNlLmNvbmZpZywgZmFsc2UgLyppc0lucHV0Ki8pKTsKICAgICAgICAgKmxhdGVuY3lNcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPHVpbnQzMl90PihyZXNwb25zZS5sYXRlbmN5TXMpKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTEzMSw5ICsxMzYsMTAgQEAKICAgICBtZWRpYTo6T3BlbklucHV0UmVxdWVzdCByZXF1ZXN0OwogICAgIHJlcXVlc3QubW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChtb2R1bGUpKTsKICAgICByZXF1ZXN0LmlucHV0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KCppbnB1dCkpOwotICAgIHJlcXVlc3QuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZygqY29uZmlnKSk7CisgICAgcmVxdWVzdC5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoKmNvbmZpZywgdHJ1ZSAvKmlzSW5wdXQqLykpOwogICAgIHJlcXVlc3QuZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGRldmljZVR5cGVBZGRyKSk7Ci0gICAgcmVxdWVzdC5zb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShzb3VyY2UpKTsKKyAgICByZXF1ZXN0LnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2Uoc291cmNlKSk7CiAgICAgcmVxdWVzdC5mbGFncyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soZmxhZ3MpKTsKIAogICAgIG1lZGlhOjpPcGVuSW5wdXRSZXNwb25zZSByZXNwb25zZTsKQEAgLTI3MSw2ICsyNzcsMTEgQEAKICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vblJvdXRpbmdVcGRhdGVkKCk7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCkKK3sKKyAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKTsKK30KKwogYXVkaW9fdW5pcXVlX2lkX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6bmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgdXNlKQogewogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZCh1c2UpOwpAQCAtMzAxLDQgKzMxMiwxNSBAQAogICAgIHJldHVybiBhZi0+dXBkYXRlU2Vjb25kYXJ5T3V0cHV0cyh0cmFja1NlY29uZGFyeU91dHB1dHMpOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZSgKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQsIGJvb2wgY29ubmVjdGVkKSB7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhZi0+c2V0RGV2aWNlQ29ubmVjdGVkU3RhdGUocG9ydCwgY29ubmVjdGVkKTsKK30KKworCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKaW5kZXggM2YwMWRlOS4uNzBmZGZjYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApAQCAtMzQ1LDcgKzM0NSw4IEBACiAgICAgICAgICAgICAoc291cmNlID4gQVVESU9fU09VUkNFX01BWCAmJgogICAgICAgICAgICAgIHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJgogICAgICAgICAgICAgIHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIgJiYKLSAgICAgICAgICAgICBzb3VyY2UgIT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSkgeworICAgICAgICAgICAgIHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UgJiYKKyAgICAgICAgICAgICBzb3VyY2UgIT0gQVVESU9fU09VUkNFX1VMVFJBU09VTkQpKSB7CiAgICAgICAgIEFMT0dFKCJhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCk6IFVuc3VwcG9ydGVkIHNvdXJjZSB0eXBlICVkIiwgc291cmNlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CkBAIC0zODYsNyArMzg3LDcgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbmV3IEVmZmVjdERlc2MoCi0gICAgICAgICAgICBkZXNjcmlwdG9yLm5hbWUsICp0eXBlLCBvcFBhY2thZ2VOYW1lLCAqdXVpZCwgcHJpb3JpdHksICppZCk7CisgICAgICAgICAgICBkZXNjcmlwdG9yLm5hbWUsIGRlc2NyaXB0b3IudHlwZSwgb3BQYWNrYWdlTmFtZSwgZGVzY3JpcHRvci51dWlkLCBwcmlvcml0eSwgKmlkKTsKICAgICBkZXNjLT5tRWZmZWN0cy5hZGQoZWZmZWN0KTsKICAgICAvLyBUT0RPKGIvNzE4MTM2OTcpOiBTdXBwb3J0IHNldHRpbmcgcGFyYW1zIGFzIHdlbGwuCiAKQEAgLTQ1MSw3ICs0NTIsNyBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KICAgICBFZmZlY3REZXNjICplZmZlY3QgPSBuZXcgRWZmZWN0RGVzYygKLSAgICAgICAgICAgIGRlc2NyaXB0b3IubmFtZSwgKnR5cGUsIG9wUGFja2FnZU5hbWUsICp1dWlkLCBwcmlvcml0eSwgKmlkKTsKKyAgICAgICAgICAgIGRlc2NyaXB0b3IubmFtZSwgZGVzY3JpcHRvci50eXBlLCBvcFBhY2thZ2VOYW1lLCBkZXNjcmlwdG9yLnV1aWQsIHByaW9yaXR5LCAqaWQpOwogICAgIGRlc2MtPm1FZmZlY3RzLmFkZChlZmZlY3QpOwogICAgIC8vIFRPRE8oYi83MTgxMzY5Nyk6IFN1cHBvcnQgc2V0dGluZyBwYXJhbXMgYXMgd2VsbC4KIApAQCAtNTQ0LDYgKzU0NSw3IEBACiAgICAgQ0FNQ09SREVSX1NSQ19UQUcsCiAgICAgVk9JQ0VfUkVDX1NSQ19UQUcsCiAgICAgVk9JQ0VfQ09NTV9TUkNfVEFHLAorICAgIFJFTU9URV9TVUJNSVhfU1JDX1RBRywKICAgICBVTlBST0NFU1NFRF9TUkNfVEFHLAogICAgIFZPSUNFX1BFUkZPUk1BTkNFX1NSQ19UQUcKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKaW5kZXggNzcyMjNiNi4uZGY0OWJiYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcApAQCAtMzIsNiArMzIsOSBAQAogICAgICAgIGlmICghX3RtcC5vaygpKSByZXR1cm4gYWlkbF91dGlsczo6YmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoX3RtcC5lcnJvcigpKTsgXAogICAgICAgIHN0ZDo6bW92ZShfdG1wLnZhbHVlKCkpOyB9KQogCisjZGVmaW5lIFJFVFVSTl9CSU5ERVJfU1RBVFVTX0lGX0VSUk9SKHgpIFwKKyAgICBpZiAoc3RhdHVzX3QgX3RtcCA9ICh4KTsgX3RtcCAhPSBPSykgcmV0dXJuIGFpZGxfdXRpbHM6OmJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKF90bXApOworCiAjZGVmaW5lIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoeCkgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGJpbmRlcjo6U3RhdHVzIF90bXAgPSAoeCk7ICAgICBcCkBAIC00NCw2ICs0NywxOSBAQAogdXNpbmcgYmluZGVyOjpTdGF0dXM7CiB1c2luZyBhaWRsX3V0aWxzOjpiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVDsKIHVzaW5nIGNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db25maWc7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db25maWdCYXNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlQWRkcmVzczsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0RldmljZURlc2NyaXB0aW9uOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0RGVzY3JpcHRpb247Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Nb2RlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvT2ZmbG9hZEluZm87Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Tb3VyY2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdHJlYW1UeXBlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvVXNhZ2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9VdWlkOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkludDsKIAogY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fdXNhZ2VfdD4mIFNZU1RFTV9VU0FHRVMgPSB7CiAgICAgQVVESU9fVVNBR0VfQ0FMTF9BU1NJU1RBTlQsCkBAIC02MywxNyArNzksMjQgQEAKICAgICAgICAgIT0gc3RkOjplbmQobVN1cHBvcnRlZFN5c3RlbVVzYWdlcyk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6dmFsaWRhdGVVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKSB7Ci0gICAgIHJldHVybiB2YWxpZGF0ZVVzYWdlKHVzYWdlLCBnZXRDYWxsaW5nQXR0cmlidXRpb25Tb3VyY2UoKSk7CitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnZhbGlkYXRlVXNhZ2UoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyKSB7CisgICAgIHJldHVybiB2YWxpZGF0ZVVzYWdlKGF0dHIsIGdldENhbGxpbmdBdHRyaWJ1dGlvblNvdXJjZSgpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp2YWxpZGF0ZVVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnZhbGlkYXRlVXNhZ2UoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLAogICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSkgewotICAgIGlmIChpc1N5c3RlbVVzYWdlKHVzYWdlKSkgewotICAgICAgICBpZiAoaXNTdXBwb3J0ZWRTeXN0ZW1Vc2FnZSh1c2FnZSkpIHsKLSAgICAgICAgICAgIGlmICghbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZChhdHRyaWJ1dGlvblNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgoInBlcm1pc3Npb24gZGVuaWVkOiBtb2RpZnkgYXVkaW8gcm91dGluZyBub3QgYWxsb3dlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICJmb3IgYXR0cmlidXRpb25Tb3VyY2UgJXMiKSwgYXR0cmlidXRpb25Tb3VyY2UudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICBpZiAoaXNTeXN0ZW1Vc2FnZShhdHRyLnVzYWdlKSkgeworICAgICAgICBpZiAoaXNTdXBwb3J0ZWRTeXN0ZW1Vc2FnZShhdHRyLnVzYWdlKSkgeworICAgICAgICAgICAgaWYgKGF0dHIudXNhZ2UgPT0gQVVESU9fVVNBR0VfQ0FMTF9BU1NJU1RBTlQKKyAgICAgICAgICAgICAgICAgICAgJiYgKChhdHRyLmZsYWdzICYgQVVESU9fRkxBR19DQUxMX1JFRElSRUNUSU9OKSAhPSAwKSkgeworICAgICAgICAgICAgICAgIGlmICghY2FsbEF1ZGlvSW50ZXJjZXB0aW9uQWxsb3dlZChhdHRyaWJ1dGlvblNvdXJjZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjYWxsIGF1ZGlvIGludGVyY2VwdGlvbiBub3QgYWxsb3dlZCBmb3IgYXR0cmlidXRpb24gc291cmNlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYXR0cmlidXRpb25Tb3VyY2UudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoYXR0cmlidXRpb25Tb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBtb2RpZnkgYXVkaW8gcm91dGluZyBub3QgYWxsb3dlZCBmb3IgYXR0cmlidXRpb24gc291cmNlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYXR0cmlidXRpb25Tb3VyY2UudG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CkBAIC05NiwxNiArMTE5LDEzIEBACiB9CiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvRGV2aWNlJiBkZXZpY2VBaWRsLAogICAgICAgICBtZWRpYTo6QXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSBzdGF0ZUFpZGwsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VOYW1lQWlkbCwKLSAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGVuY29kZWRGb3JtYXRBaWRsKSB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbC50eXBlKSk7CisgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnQmIHBvcnQsCisgICAgICAgIGNvbnN0IEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24mIGVuY29kZWRGb3JtYXRBaWRsKSB7CiAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvbGljeURldmljZVN0YXRlX2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdChzdGF0ZUFpZGwpKTsKICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdChlbmNvZGVkRm9ybWF0QWlkbCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdChlbmNvZGVkRm9ybWF0QWlkbCkpOwogCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CkBAIC0xMjEsMzkgKzE0MSw0NSBAQAogICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCi0gICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VBaWRsLmFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lQWlkbC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRGb3JtYXQpKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICBzdGF0ZSwgcG9ydCwgZW5jb2RlZEZvcm1hdCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBvbkNoZWNrU3BhdGlhbGl6ZXJfbCgpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1Qoc3RhdHVzKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IG1lZGlhOjpBdWRpb0RldmljZSYgZGV2aWNlQWlkbCwKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBBdWRpb0RldmljZSYgZGV2aWNlQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSogX2FpZGxfcmV0dXJuKSB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbC50eXBlKSk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKKyAgICBzdGQ6OnN0cmluZyBhZGRyZXNzOworICAgIFJFVFVSTl9CSU5ERVJfU1RBVFVTX0lGX0VSUk9SKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VfYXVkaW9fZGV2aWNlKGRldmljZUFpZGwsICZkZXZpY2UsICZhZGRyZXNzKSk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90X0F1ZGlvUG9saWN5RGV2aWNlU3RhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSk7CiAgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb2xpY3lfZGV2X3N0YXRlX3RfQXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUFpZGwuYWRkcmVzcy5jX3N0cigpKSkpOworICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLmNfc3RyKCkpKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9EZXZpY2UmIGRldmljZUFpZGwsCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlJiBkZXZpY2VBaWRsLAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlTmFtZUFpZGwsCi0gICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBlbmNvZGVkRm9ybWF0QWlkbCkgewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwudHlwZSkpOworICAgICAgICBjb25zdCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uJiBlbmNvZGVkRm9ybWF0QWlkbCkgeworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2U7CisgICAgc3RkOjpzdHJpbmcgYWRkcmVzczsKKyAgICBSRVRVUk5fQklOREVSX1NUQVRVU19JRl9FUlJPUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlX2F1ZGlvX2RldmljZShkZXZpY2VBaWRsLCAmZGV2aWNlLCAmYWRkcmVzcykpOwogICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGVuY29kZWRGb3JtYXRBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uX2F1ZGlvX2Zvcm1hdF90KGVuY29kZWRGb3JtYXRBaWRsKSk7CiAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKQEAgLTE2NSwxMiArMTkxLDE2IEBACiAgICAgQUxPR1YoImhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSgpIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKLSAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShkZXZpY2UsIGRldmljZUFpZGwuYWRkcmVzcy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZU5hbWVBaWRsLmNfc3RyKCksIGVuY29kZWRGb3JtYXQpKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSAgbUF1ZGlvUG9saWN5TWFuYWdlci0+aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKAorICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLmNfc3RyKCksIGRldmljZU5hbWVBaWRsLmNfc3RyKCksIGVuY29kZWRGb3JtYXQpOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgIG9uQ2hlY2tTcGF0aWFsaXplcl9sKCk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChzdGF0dXMpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKG1lZGlhOjpBdWRpb01vZGUgc3RhdGVBaWRsLCBpbnQzMl90IHVpZEFpZGwpCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKEF1ZGlvTW9kZSBzdGF0ZUFpZGwsIGludDMyX3QgdWlkQWlkbCkKIHsKICAgICBhdWRpb19tb2RlX3Qgc3RhdGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvTW9kZV9hdWRpb19tb2RlX3Qoc3RhdGVBaWRsKSk7CkBAIC0xOTIsNyArMjIyLDE1IEBACiAgICAgLy8gY2FuIGJlIGludGVybGVhdmVkKS4KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIC8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIG1vcmUgYXBwcm9wcmlhdGUgdG8gZG8gaXQgaW4gcGxhdGZvcm0gc3BlY2lmaWMgcG9saWN5IG1hbmFnZXIKLSAgICBBdWRpb1N5c3RlbTo6c2V0TW9kZShzdGF0ZSk7CisKKyAgICAvLyBBdWRpbyBIQUwgbW9kZSBjb252ZXJzaW9uIGZvciBjYWxsIHJlZGlyZWN0IG1vZGVzCisgICAgYXVkaW9fbW9kZV90IGhhbE1vZGUgPSBzdGF0ZTsKKyAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9DQUxMX1JFRElSRUNUKSB7CisgICAgICAgIGhhbE1vZGUgPSBBVURJT19NT0RFX0NBTExfU0NSRUVOOworICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9DT01NVU5JQ0FUSU9OX1JFRElSRUNUKSB7CisgICAgICAgIGhhbE1vZGUgPSBBVURJT19NT0RFX05PUk1BTDsKKyAgICB9CisgICAgQXVkaW9TeXN0ZW06OnNldE1vZGUoaGFsTW9kZSk7CiAKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFBob25lU3RhdGUoc3RhdGUpOwpAQCAtMjAyLDcgKzI0MCw3IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0UGhvbmVTdGF0ZShtZWRpYTo6QXVkaW9Nb2RlKiBfYWlkbF9yZXR1cm4pIHsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFBob25lU3RhdGUoQXVkaW9Nb2RlKiBfYWlkbF9yZXR1cm4pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19tb2RlX3RfQXVkaW9Nb2RlKG1QaG9uZVN0YXRlKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKQEAgLTIzNCw2ICsyNzIsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKKyAgICBvbkNoZWNrU3BhdGlhbGl6ZXJfbCgpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKQEAgLTI1Nyw3ICsyOTYsNyBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dChtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsIGludDMyX3QqIF9haWRsX3JldHVybikKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dChBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKQogewogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW1BaWRsKSk7CkBAIC0yODEsNyArMzIwLDcgQEAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckF0dHIoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZyYgY29uZmlnQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9Db25maWcmIGNvbmZpZ0FpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3NBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlbGVjdGVkRGV2aWNlSWRBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6R2V0T3V0cHV0Rm9yQXR0clJlc3BvbnNlKiBfYWlkbF9yZXR1cm4pCkBAIC0yOTIsNyArMzMxLDcgQEAKICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KHNlc3Npb25BaWRsKSk7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KGNvbmZpZ0FpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KGNvbmZpZ0FpZGwsIGZhbHNlIC8qaXNJbnB1dCovKSk7CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfbWFzayhmbGFnc0FpZGwpKTsKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKQEAgLTMwOCw3ICszNDcsNyBAQAogCiAgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUigKICAgICAgICAgICAgIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvQXR0cmlidXRlcyhhdHRyLCAiNjg5NTM5NTAiKSkpOwotICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QodmFsaWRhdGVVc2FnZShhdHRyLnVzYWdlLCBhdHRyaWJ1dGlvblNvdXJjZSkpKTsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKHZhbGlkYXRlVXNhZ2UoYXR0ciwgYXR0cmlidXRpb25Tb3VyY2UpKSk7CiAKICAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMzMzLDE1ICszNzIsMjYgQEAKICAgICAgICAgYXR0ci5mbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oCiAgICAgICAgICAgICAgICAgYXR0ci5mbGFncyAmIH4oQVVESU9fRkxBR19CWVBBU1NfSU5URVJSVVBUSU9OX1BPTElDWXxBVURJT19GTEFHX0JZUEFTU19NVVRFKSk7CiAgICAgfQorCisgICAgaWYgKGF0dHIuY29udGVudF90eXBlID09IEFVRElPX0NPTlRFTlRfVFlQRV9VTFRSQVNPVU5EKSB7CisgICAgICAgIGlmICghYWNjZXNzVWx0cmFzb3VuZEFsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHBlcm1pc3Npb24gZGVuaWVkOiB1bHRyYXNvdW5kIG5vdCBhbGxvd2VkIGZvciB1aWQgJWQgcGlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGFkakF0dHJpYnV0aW9uU291cmNlLnVpZCwgYWRqQXR0cmlidXRpb25Tb3VyY2UucGlkKTsKKyAgICAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChQRVJNSVNTSU9OX0RFTklFRCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpvdXRwdXRfdHlwZV90IG91dHB1dFR5cGU7CisgICAgYm9vbCBpc1NwYXRpYWxpemVkID0gZmFsc2U7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cigmYXR0ciwgJm91dHB1dCwgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGpBdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsICZzZWxlY3RlZERldmljZUlkLCAmcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlY29uZGFyeU91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1NwYXRpYWxpemVkKTsKIAogICAgIC8vIEZJWE1FOiBJbnRyb2R1Y2UgYSB3YXkgdG8gY2hlY2sgZm9yIHRoZSB0aGUgdGVsZXBob255IGRldmljZSBiZWZvcmUgb3BlbmluZyB0aGUgb3V0cHV0CiAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewpAQCAtMzUwLDcgKzQwMCwxMiBAQAogICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfT1VUUFVUX0xFR0FDWToKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfT1VUUFVUX1RFTEVQSE9OWV9UWDoKLSAgICAgICAgICAgIGlmICghbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpKSB7CisgICAgICAgICAgICBpZiAoKChhdHRyLmZsYWdzICYgQVVESU9fRkxBR19DQUxMX1JFRElSRUNUSU9OKSAhPSAwKQorICAgICAgICAgICAgICAgICYmICFjYWxsQXVkaW9JbnRlcmNlcHRpb25BbGxvd2VkKGFkakF0dHJpYnV0aW9uU291cmNlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIHBlcm1pc3Npb24gZGVuaWVkOiBjYWxsIHJlZGlyZWN0aW9uIG5vdCBhbGxvd2VkIGZvciB1aWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYWRqQXR0cmlidXRpb25Tb3VyY2UudWlkKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1vZGlmeVBob25lU3RhdGVBbGxvd2VkKGFkakF0dHJpYnV0aW9uU291cmNlKSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIHBlcm1pc3Npb24gZGVuaWVkOiBtb2RpZnkgcGhvbmUgc3RhdGUgbm90IGFsbG93ZWQgZm9yIHVpZCAlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhZGpBdHRyaWJ1dGlvblNvdXJjZS51aWQpOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IFBFUk1JU1NJT05fREVOSUVEOwpAQCAtMzczLDcgKzQyOCw3IEBACiAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewogICAgICAgICBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQgPQogICAgICAgICAgICAgICAgIG5ldyBBdWRpb1BsYXliYWNrQ2xpZW50KGF0dHIsIG91dHB1dCwgYWRqQXR0cmlidXRpb25Tb3VyY2UsIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgIHBvcnRJZCwgc2VsZWN0ZWREZXZpY2VJZCwgc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgcG9ydElkLCBzZWxlY3RlZERldmljZUlkLCBzdHJlYW0sIGlzU3BhdGlhbGl6ZWQpOwogICAgICAgICBtQXVkaW9QbGF5YmFja0NsaWVudHMuYWRkKHBvcnRJZCwgY2xpZW50KTsKIAogICAgICAgICBfYWlkbF9yZXR1cm4tPm91dHB1dCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKApAQCAtMzg3LDYgKzQ0Miw3IEBACiAgICAgICAgIF9haWRsX3JldHVybi0+c2Vjb25kYXJ5T3V0cHV0cyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8aW50MzJfdD4+KHNlY29uZGFyeU91dHB1dHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdCkpOworICAgICAgICBfYWlkbF9yZXR1cm4tPmlzU3BhdGlhbGl6ZWQgPSBpc1NwYXRpYWxpemVkOwogICAgIH0KICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QocmVzdWx0KTsKIH0KQEAgLTQzMiw2ICs0ODgsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0T3V0cHV0KHBvcnRJZCk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IHRydWU7CisgICAgICAgIG9uVXBkYXRlQWN0aXZlU3BhdGlhbGl6ZXJUcmFja3NfbCgpOwogICAgIH0KICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1Qoc3RhdHVzKTsKIH0KQEAgLTQ2OSw2ICs1MjYsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQocG9ydElkKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgICAgIG9uVXBkYXRlQWN0aXZlU3BhdGlhbGl6ZXJUcmFja3NfbCgpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtNDk5LDggKzU1NywxMCBAQAogICAgICAgICAgICAgY2xpZW50LT5pbywgY2xpZW50LT5zdHJlYW0sIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKGNsaWVudCAhPSBudWxscHRyICYmIGNsaWVudC0+YWN0aXZlKSB7CisgICAgICAgIG9uVXBkYXRlQWN0aXZlU3BhdGlhbGl6ZXJUcmFja3NfbCgpOworICAgIH0KICAgICBtQXVkaW9QbGF5YmFja0NsaWVudHMucmVtb3ZlSXRlbShwb3J0SWQpOwotCiAgICAgLy8gY2FsbGVkIGZyb20gaW50ZXJuYWwgdGhyZWFkOiBubyBuZWVkIHRvIGNsZWFyIGNhbGxlciBpZGVudGl0eQogICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQocG9ydElkKTsKIH0KQEAgLTUxMCw3ICs1NzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmlpZEFpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Db25maWdCYXNlJiBjb25maWdBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvQ29uZmlnQmFzZSYgY29uZmlnQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlbGVjdGVkRGV2aWNlSWRBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpHZXRJbnB1dEZvckF0dHJSZXNwb25zZSogX2FpZGxfcmV0dXJuKSB7CkBAIC01MjMsNyArNTgzLDcgQEAKICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3Qoc2Vzc2lvbkFpZGwpKTsKICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoY29uZmlnQWlkbCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdCYXNlX2F1ZGlvX2NvbmZpZ19iYXNlX3QoY29uZmlnQWlkbCwgdHJ1ZSAvKmlzSW5wdXQqLykpOwogICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW5wdXRfZmxhZ3NfdF9tYXNrKGZsYWdzQWlkbCkpOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKApAQCAtNTQ4LDcgKzYwOCw4IEBACiAgICAgICAgICAgICB8fCAoaW5wdXRTb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVAogICAgICAgICAgICAgICAgICYmIGlucHV0U291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JECiAgICAgICAgICAgICAgICAgJiYgaW5wdXRTb3VyY2UgIT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSCi0gICAgICAgICAgICAgICAgJiYgaW5wdXRTb3VyY2UgIT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSkgeworICAgICAgICAgICAgICAgICYmIGlucHV0U291cmNlICE9IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRQorICAgICAgICAgICAgICAgICYmIGlucHV0U291cmNlICE9IEFVRElPX1NPVVJDRV9VTFRSQVNPVU5EKSkgewogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAKQEAgLTU3NywzMiArNjM4LDQzIEBACiAgICAgICAgIGFkakF0dHJpYnV0aW9uU291cmNlLnBpZCA9IGNhbGxpbmdQaWQ7CiAgICAgfQogCi0gICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCh2YWxpZGF0ZVVzYWdlKGF0dHIudXNhZ2UsCisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCh2YWxpZGF0ZVVzYWdlKGF0dHIsCiAgICAgICAgICAgICBhZGpBdHRyaWJ1dGlvblNvdXJjZSkpKTsKIAogICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMuCi0gICAgLy8gQ2FwdHVyaW5nIGZyb20gRk1fVFVORVIgc291cmNlIGlzIGNvbnRyb2xsZWQgYnkgY2FwdHVyZVR1bmVyQXVkaW9JbnB1dEFsbG93ZWQoKSBhbmQKLSAgICAvLyBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKCkgKGRlcHJlY2F0ZWQpIGFzIHRoaXMgZG9lcyBub3QgYWZmZWN0IHVzZXJzIHByaXZhY3kKLSAgICAvLyBhcyBkb2VzIGNhcHR1cmluZyBmcm9tIGFuIGFjdHVhbCBtaWNyb3Bob25lLgotICAgIGlmICghKHJlY29yZGluZ0FsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UsIGF0dHIuc291cmNlKQotICAgICAgICAgICAgfHwgYXR0ci5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKSkgeworICAgIC8vIENhcHR1cmluZyBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcyBkb2VzIG5vdCByZXF1aXJlIHBlcm1pc3Npb24gUkVDT1JEX0FVRElPCisgICAgLy8gYXMgdGhlIGNhcHR1cmVkIGF1ZGlvIGRvZXMgbm90IGNvbWUgZnJvbSBhIG1pY3JvcGhvbmU6CisgICAgLy8gLSBGTV9UVU5FUiBzb3VyY2UgaXMgY29udHJvbGxlZCBieSBjYXB0dXJlVHVuZXJBdWRpb0lucHV0QWxsb3dlZCgpIG9yCisgICAgLy8gY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZCgpIChkZXByZWNhdGVkKS4KKyAgICAvLyAtIFJFTU9URV9TVUJNSVggc291cmNlIGlzIGNvbnRyb2xsZWQgYnkgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZCgpIGlmIHRoZSBpbnB1dAorICAgIC8vIHR5cGUgaXMgQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEUgYW5kIGJ5IEF1ZGlvU2VydmljZSBpZiBhIG1lZGlhIHByb2plY3Rpb24KKyAgICAvLyBpcyB1c2VkIGFuZCBpbnB1dCB0eXBlIGlzIEFQSV9JTlBVVF9NSVhfUFVCTElDX0NBUFRVUkVfUExBWUJBQ0sKKyAgICAvLyAtIEVDSE9fUkVGRVJFTkNFIHNvdXJjZSBpcyBjb250cm9sbGVkIGJ5IGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQoKQorICAgIGlmICghKHJlY29yZGluZ0FsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UsIGlucHV0U291cmNlKQorICAgICAgICAgICAgfHwgaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSCisgICAgICAgICAgICB8fCBpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWAorICAgICAgICAgICAgfHwgaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSkgewogICAgICAgICBBTE9HRSgiJXMgcGVybWlzc2lvbiBkZW5pZWQ6IHJlY29yZGluZyBub3QgYWxsb3dlZCBmb3IgJXMiLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhZGpBdHRyaWJ1dGlvblNvdXJjZS50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOwogICAgIH0KIAogICAgIGJvb2wgY2FuQ2FwdHVyZU91dHB1dCA9IGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpOwotICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSyB8fAotICAgICAgICBpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksgfHwKLSAgICAgICAgaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NBTEwgfHwKLSAgICAgICAgaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKQotICAgICAgICAmJiAhY2FuQ2FwdHVyZU91dHB1dCkgeworICAgIGJvb2wgY2FuSW50ZXJjZXB0Q2FsbEF1ZGlvID0gY2FsbEF1ZGlvSW50ZXJjZXB0aW9uQWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSk7CisgICAgYm9vbCBpc0NhbGxBdWRpb1NvdXJjZSA9IGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTksKKyAgICAgICAgICAgICB8fCBpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksKKyAgICAgICAgICAgICB8fCBpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDsKKworICAgIGlmIChpc0NhbGxBdWRpb1NvdXJjZSAmJiAhY2FuSW50ZXJjZXB0Q2FsbEF1ZGlvICYmICFjYW5DYXB0dXJlT3V0cHV0KSB7CiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChQRVJNSVNTSU9OX0RFTklFRCk7CiAgICAgfQotCisgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRQorICAgICAgICAgICAgJiYgIWNhbkNhcHR1cmVPdXRwdXQpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKKyAgICB9CiAgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9GTV9UVU5FUgotICAgICAgICAmJiAhY2FwdHVyZVR1bmVyQXVkaW9JbnB1dEFsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpCi0gICAgICAgICYmICFjYW5DYXB0dXJlT3V0cHV0KSB7CisgICAgICAgICYmICFjYW5DYXB0dXJlT3V0cHV0CisgICAgICAgICYmICFjYXB0dXJlVHVuZXJBdWRpb0lucHV0QWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSkpIHsKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9CiAKQEAgLTYxOCw2ICs2OTAsMTQgQEAKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9CiAKKyAgICBpZiAoYXR0ci5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1VMVFJBU09VTkQpIHsKKyAgICAgICAgaWYgKCFhY2Nlc3NVbHRyYXNvdW5kQWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogcGVybWlzc2lvbiBkZW5pZWQ6IHVsdHJhc291bmQgbm90IGFsbG93ZWQgZm9yIHVpZCAlZCBwaWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYWRqQXR0cmlidXRpb25Tb3VyY2UudWlkLCBhZGpBdHRyaWJ1dGlvblNvdXJjZS5waWQpOworICAgICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgewogICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CkBAIC02NDQsMjMgKzcyNCwzMCBAQAogICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0xFR0FDWToKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9URUxFUEhPTllfUlg6CisgICAgICAgICAgICAgICAgaWYgKChhdHRyLmZsYWdzICYgQVVESU9fRkxBR19DQUxMX1JFRElSRUNUSU9OKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBjYW5JbnRlcmNlcHRDYWxsQXVkaW8pIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB1c2UgdGhlIHNhbWUgcGVybWlzc2lvbiBhcyBmb3IgcmVtb3RlIHN1Ym1peCBmb3Igbm93LgorICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX01JWF9DQVBUVVJFOgogICAgICAgICAgICAgICAgIGlmICghY2FuQ2FwdHVyZU91dHB1dCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0SW5wdXRGb3JBdHRyKCkgcGVybWlzc2lvbiBkZW5pZWQ6IGNhcHR1cmUgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIHBlcm1pc3Npb24gZGVuaWVkOiBjYXB0dXJlIG5vdCBhbGxvd2VkIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURToKLSAgICAgICAgICAgICAgICBpZiAoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRJbnB1dEZvckF0dHIoKSBwZXJtaXNzaW9uIGRlbmllZDogbW9kaWZ5IGF1ZGlvIHJvdXRpbmcgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoIShtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKGFkakF0dHJpYnV0aW9uU291cmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChhdHRyLmZsYWdzICYgQVVESU9fRkxBR19DQUxMX1JFRElSRUNUSU9OKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2FuSW50ZXJjZXB0Q2FsbEF1ZGlvKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIHBlcm1pc3Npb24gZGVuaWVkIGZvciByZW1vdGUgc3VibWl4IGNhcHR1cmUiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9JTlZBTElEOgogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJnZXRJbnB1dEZvckF0dHIoKSBlbmNvdW50ZXJlZCBhbiBpbnZhbGlkIGlucHV0IHR5cGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludClpbnB1dFR5cGUpOworICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzIGVuY291bnRlcmVkIGFuIGludmFsaWQgaW5wdXQgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKGludClpbnB1dFR5cGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTczMCw4ICs4MTcsMTAgQEAKIAogICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKICAgICBpZiAoIShzdGFydFJlY29yZGluZyhjbGllbnQtPmF0dHJpYnV0aW9uU291cmNlLCBTdHJpbmcxNihtc2cuc3RyKCkuY19zdHIoKSksCi0gICAgICAgIGNsaWVudC0+YXR0cmlidXRlcy5zb3VyY2UpCi0gICAgICAgICAgICB8fCBjbGllbnQtPmF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9GTV9UVU5FUikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmF0dHJpYnV0ZXMuc291cmNlKQorICAgICAgICAgICAgfHwgY2xpZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRk1fVFVORVIKKyAgICAgICAgICAgIHx8IGNsaWVudC0+YXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVgKKyAgICAgICAgICAgIHx8IGNsaWVudC0+YXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSkgewogICAgICAgICBBTE9HRSgiJXMgcGVybWlzc2lvbiBkZW5pZWQ6IHJlY29yZGluZyBub3QgYWxsb3dlZCBmb3IgYXR0cmlidXRpb24gc291cmNlICVzIiwKICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT5hdHRyaWJ1dGlvblNvdXJjZS50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOwpAQCAtOTAxLDcgKzk5MCw3IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6aW5pdFN0cmVhbVZvbHVtZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbml0U3RyZWFtVm9sdW1lKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4TWluQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleE1heEFpZGwpIHsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKApAQCAtOTI0LDEzICsxMDEzLDE0IEBACiAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0VSUk9SKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lSW5kZXgobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXZpY2VBaWRsLCBpbnQzMl90IGluZGV4QWlkbCkgeworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2VBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleEFpZGwpIHsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtQWlkbCkpOwogICAgIGludCBpbmRleCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KGluZGV4QWlkbCkpOwogICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb25fYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwpKTsKIAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwpAQCAtOTQ4LDEyICsxMDM4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRldmljZUFpZGwsIGludDMyX3QqIF9haWRsX3JldHVybikgeworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2VBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KHN0cmVhbUFpZGwpKTsKICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsKSk7CiAgICAgaW50IGluZGV4OwogCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewpAQCAtOTcxLDEyICsxMDYyLDEzIEBACiB9CiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcygKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyQWlkbCwgaW50MzJfdCBkZXZpY2VBaWRsLCBpbnQzMl90IGluZGV4QWlkbCkgeworICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHJBaWRsLAorICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2VBaWRsLCBpbnQzMl90IGluZGV4QWlkbCkgewogICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoYXR0ckFpZGwpKTsKICAgICBpbnQgaW5kZXggPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50PihpbmRleEFpZGwpKTsKICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsKSk7CiAgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKICAgICAgICAgICAgIEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCAiMTY5NTcyNjQxIikpKTsKIApAQCAtOTkzLDExICsxMDg1LDEyIEBACiB9CiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcygKLSAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyQWlkbCwgaW50MzJfdCBkZXZpY2VBaWRsLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyQWlkbCwKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiYgZGV2aWNlQWlkbCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsX2F1ZGlvX2F0dHJpYnV0ZXNfdChhdHRyQWlkbCkpOwogICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb25fYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwpKTsKICAgICBpbnQgaW5kZXg7CiAgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKICAgICAgICAgICAgIEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCAiMTY5NTcyNjQxIikpKTsKQEAgLTEwNTEsNyArMTE0NCw3IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0obWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLAorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtQWlkbCkpOwpAQCAtMTA3MywzMCArMTE2Niw5IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotLy9hdWRpbyBwb2xpY3k6IHVzZSBhdWRpb19kZXZpY2VfdCBhcHByb3ByaWF0ZWx5Ci0KLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZXNGb3JTdHJlYW0obWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtQWlkbCkpOwotCi0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KEFVRElPX0RFVklDRV9OT05FKSk7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QobUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0pKSk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0V4JiBhdHRyQWlkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+KiBfYWlkbF9yZXR1cm4pCiB7CiAgICAgQXVkaW9BdHRyaWJ1dGVzIGFhID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNFeF9BdWRpb0F0dHJpYnV0ZXMoYXR0ckFpZGwpKTsKQEAgLTExMDgsMTAgKzExODAsMTEgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKLSAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERldmljZXNGb3JBdHRyaWJ1dGVzKGFhLmdldEF0dHJpYnV0ZXMoKSwgJmRldmljZXMpKSk7CisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VzRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICAgICAgYWEuZ2V0QXR0cmlidXRlcygpLCAmZGV2aWNlcywgZm9yVm9sdW1lKSkpOwogICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4+KGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKQEAgLTExOTcsNyArMTI3MCw3IEBACiAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKG1BdWRpb1BvbGljeU1hbmFnZXItPm1vdmVFZmZlY3RzVG9JbyhpZHMsIGlvKSk7CiB9CiAKLVN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwgaW50MzJfdCBpblBhc3RNc0FpZGwsCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwgaW50MzJfdCBpblBhc3RNc0FpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtQWlkbCkpOwpAQCAtMTIxNiw3ICsxMjg5LDcgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5QYXN0TXNBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKApAQCAtMTIzNiw5ICsxMzA5LDkgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1NvdXJjZUFjdGl2ZShtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIHNvdXJjZUFpZGwsIGJvb2wqIF9haWRsX3JldHVybikgeworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTb3VyY2VBY3RpdmUoQXVkaW9Tb3VyY2Ugc291cmNlQWlkbCwgYm9vbCogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3Qoc291cmNlQWlkbCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VfYXVkaW9fc291cmNlX3Qoc291cmNlQWlkbCkpOwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KQEAgLTEyNjYsNyArMTMzOSw3IEBACiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoCiAgICAgICAgIGludDMyX3QgYXVkaW9TZXNzaW9uQWlkbCwKLSAgICAgICAgbWVkaWE6OkludCogY291bnRBaWRsLAorICAgICAgICBJbnQqIGNvdW50QWlkbCwKICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkVmZmVjdERlc2NyaXB0b3I+KiBfYWlkbF9yZXR1cm4pIHsKICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhdWRpb1Nlc3Npb25BaWRsKSk7CkBAIC0xMjkwLDExICsxMzYzLDExIEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB0eXBlQWlkbCwKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgQXVkaW9VdWlkJiB0eXBlQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wUGFja2FnZU5hbWVBaWRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB1dWlkQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9VdWlkJiB1dWlkQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBzb3VyY2VBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1NvdXJjZSBzb3VyY2VBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKICAgICBlZmZlY3RfdXVpZF90IHR5cGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvVXVpZF9hdWRpb191dWlkX3QodHlwZUFpZGwpKTsKQEAgLTEzMDMsNyArMTM3Niw3IEBACiAgICAgZWZmZWN0X3V1aWRfdCB1dWlkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1V1aWRfYXVkaW9fdXVpZF90KHV1aWRBaWRsKSk7CiAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3Qoc291cmNlQWlkbCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VfYXVkaW9fc291cmNlX3Qoc291cmNlQWlkbCkpOwogICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkOwogCiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKQEAgLTEzMTcsMTAgKzEzOTAsMTAgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIHR5cGVBaWRsLAorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6YWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBBdWRpb1V1aWQmIHR5cGVBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3BQYWNrYWdlTmFtZUFpZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIHV1aWRBaWRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LCBtZWRpYTo6QXVkaW9Vc2FnZSB1c2FnZUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvVXVpZCYgdXVpZEFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksIEF1ZGlvVXNhZ2UgdXNhZ2VBaWRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKICAgICBlZmZlY3RfdXVpZF90IHR5cGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvVXVpZF9hdWRpb191dWlkX3QodHlwZUFpZGwpKTsKQEAgLTEzNjgsNyArMTQ0MSw3IEBACiB9CiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN1cHBvcnRlZFN5c3RlbVVzYWdlcygKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvVXNhZ2U+JiBzeXN0ZW1Vc2FnZXNBaWRsKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvVXNhZ2U+JiBzeXN0ZW1Vc2FnZXNBaWRsKSB7CiAgICAgc2l6ZV90IHNpemUgPSBzeXN0ZW1Vc2FnZXNBaWRsLnNpemUoKTsKICAgICBpZiAoc2l6ZSA+IE1BWF9JVEVNU19QRVJfTElTVCkgewogICAgICAgICBzaXplID0gTUFYX0lURU1TX1BFUl9MSVNUOwpAQCAtMTQwNyw3ICsxNDgwLDcgQEAKICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHVpZCwgY2FwdHVyZVBvbGljeSkpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPZmZsb2FkU3VwcG9ydChjb25zdCBtZWRpYTo6QXVkaW9PZmZsb2FkSW5mbyYgaW5mb0FpZGwsCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPZmZsb2FkU3VwcG9ydChjb25zdCBBdWRpb09mZmxvYWRJbmZvJiBpbmZvQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb09mZmxvYWRNb2RlKiBfYWlkbF9yZXR1cm4pIHsKICAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBpbmZvID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb09mZmxvYWRJbmZvX2F1ZGlvX29mZmxvYWRfaW5mb190KGluZm9BaWRsKSk7CkBAIC0xNDIzLDExICsxNDk2LDExIEBACiB9CiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKAotICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Db25maWdCYXNlJiBjb25maWdBaWRsLAorICAgICAgICBjb25zdCBBdWRpb0NvbmZpZ0Jhc2UmIGNvbmZpZ0FpZGwsCiAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0cmlidXRlc0FpZGwsCiAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgewogICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChjb25maWdBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChjb25maWdBaWRsLCBmYWxzZSAvKmlzSW5wdXQqLykpOwogICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoYXR0cmlidXRlc0FpZGwpKTsKICAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKApAQCAtMTQzOCw3ICsxNTExLDcgQEAKICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KIAotICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QodmFsaWRhdGVVc2FnZShhdHRyaWJ1dGVzLnVzYWdlKSkpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QodmFsaWRhdGVVc2FnZShhdHRyaWJ1dGVzKSkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAqX2FpZGxfcmV0dXJuID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uZmlnLCBhdHRyaWJ1dGVzKTsKQEAgLTE0NDcsNyArMTUyMCw3IEBACiAKIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUG9ydHMobWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZUFpZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlQWlkbCwgbWVkaWE6OkludCogY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlQWlkbCwgSW50KiBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1BvcnQ+KiBwb3J0c0FpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCkBAIC0xNDc5LDEyICsxNTUyLDkgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRBdWRpb1BvcnQoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgcG9ydEFpZGwsCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRBdWRpb1BvcnQoaW50IHBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0KiBfYWlkbF9yZXR1cm4pIHsKLSAgICBhdWRpb19wb3J0X3Y3IHBvcnQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydF9hdWRpb19wb3J0X3Y3KHBvcnRBaWRsKSk7Ci0gICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb1BvcnQocG9ydCkpKTsKLQorICAgIGF1ZGlvX3BvcnRfdjcgcG9ydHsgLmlkID0gcG9ydElkIH07CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKQEAgLTE1MzUsNyArMTYwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUGF0Y2hlcyhtZWRpYTo6SW50KiBjb3VudCwKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1BhdGNoZXMoSW50KiBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUGF0Y2g+KiBwYXRjaGVzQWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgdW5zaWduZWQgaW50IG51bV9wYXRjaGVzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCkBAIC0xNjAyLDcgKzE2NzIsNyBAQAogICAgIF9haWRsX3JldHVybi0+aW9IYW5kbGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoaW9IYW5kbGUpKTsKICAgICBfYWlkbF9yZXR1cm4tPmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoZGV2aWNlKSk7CisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfQXVkaW9EZXZpY2VEZXNjcmlwdGlvbihkZXZpY2UpKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCkBAIC0xNjcyLDcgKzE3NDIsNyBAQAogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRVaWREZXZpY2VBZmZpbml0aWVzKAogICAgICAgICBpbnQzMl90IHVpZEFpZGwsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4mIGRldmljZXNBaWRsKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwpIHsKICAgICB1aWRfdCB1aWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KHVpZEFpZGwpKTsKICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGRldmljZXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8QXVkaW9EZXZpY2VUeXBlQWRkclZlY3Rvcj4oZGV2aWNlc0FpZGwsCkBAIC0xNzA1LDcgKzE3NzUsNyBAQAogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKAogICAgICAgICBpbnQzMl90IHVzZXJJZEFpZGwsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4mIGRldmljZXNBaWRsKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwpIHsKICAgICBpbnQgdXNlcklkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoY29udmVydFJlaW50ZXJwcmV0PGludD4odXNlcklkQWlkbCkpOwogICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlcyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yPihkZXZpY2VzQWlkbCwKQEAgLTE3NTQsNyArMTgyNCw3IEBACiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAKLSAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKHZhbGlkYXRlVXNhZ2UoYXR0cmlidXRlcy51c2FnZSkpKTsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKHZhbGlkYXRlVXNhZ2UoYXR0cmlidXRlcykpKTsKIAogICAgIC8vIHN0YXJ0QXVkaW9Tb3VyY2Ugc2hvdWxkIGJlIGNyZWF0ZWQgYXMgdGhlIGNhbGxpbmcgdWlkCiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKQEAgLTE4MDIsMTMgKzE4NzIsMTQgQEAKIH0KIAogCi1TdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJlYW1Wb2x1bWVEQihtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsIGludDMyX3QgaW5kZXhBaWRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXZpY2VBaWRsLCBmbG9hdCogX2FpZGxfcmV0dXJuKSB7CitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJlYW1Wb2x1bWVEQigKKyAgICAgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwsIGludDMyX3QgaW5kZXhBaWRsLAorICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2VBaWRsLCBmbG9hdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KHN0cmVhbUFpZGwpKTsKICAgICBpbnQgaW5kZXggPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50PihpbmRleEFpZGwpKTsKICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZURlc2NyaXB0aW9uX2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsKSk7CiAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKQEAgLTE4MTksOCArMTg5MCw4IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3Vycm91bmRGb3JtYXRzKG1lZGlhOjpJbnQqIGNvdW50LAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+KiBmb3JtYXRzLAorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3Vycm91bmRGb3JtYXRzKEludCogY291bnQsCisgICAgICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+KiBmb3JtYXRzLAogICAgICAgICBzdGQ6OnZlY3Rvcjxib29sPiogZm9ybWF0c0VuYWJsZWQpIHsKICAgICB1bnNpZ25lZCBpbnQgbnVtU3Vycm91bmRGb3JtYXRzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50Pihjb3VudC0+dmFsdWUpKTsKQEAgLTE4NDIsNyArMTkxMyw4IEBACiAgICAgbnVtU3Vycm91bmRGb3JtYXRzUmVxID0gc3RkOjptaW4obnVtU3Vycm91bmRGb3JtYXRzLCBudW1TdXJyb3VuZEZvcm1hdHNSZXEpOwogICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCiAgICAgICAgICAgICBjb252ZXJ0UmFuZ2Uoc3Vycm91bmRGb3JtYXRzLmdldCgpLCBzdXJyb3VuZEZvcm1hdHMuZ2V0KCkgKyBudW1TdXJyb3VuZEZvcm1hdHNSZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKCpmb3JtYXRzKSwgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKCpmb3JtYXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKSkpOwogICAgIGZvcm1hdHNFbmFibGVkLT5pbnNlcnQoCiAgICAgICAgICAgICBmb3JtYXRzRW5hYmxlZC0+YmVnaW4oKSwKICAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQuZ2V0KCksCkBAIC0xODUyLDcgKzE5MjQsNyBAQAogfQogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRSZXBvcnRlZFN1cnJvdW5kRm9ybWF0cygKLSAgICAgICAgbWVkaWE6OkludCogY291bnQsIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4qIGZvcm1hdHMpIHsKKyAgICAgICAgSW50KiBjb3VudCwgc3RkOjp2ZWN0b3I8QXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4qIGZvcm1hdHMpIHsKICAgICB1bnNpZ25lZCBpbnQgbnVtU3Vycm91bmRGb3JtYXRzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50Pihjb3VudC0+dmFsdWUpKTsKICAgICBpZiAobnVtU3Vycm91bmRGb3JtYXRzID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CkBAIC0xODcyLDEzICsxOTQ0LDE1IEBACiAgICAgbnVtU3Vycm91bmRGb3JtYXRzUmVxID0gc3RkOjptaW4obnVtU3Vycm91bmRGb3JtYXRzLCBudW1TdXJyb3VuZEZvcm1hdHNSZXEpOwogICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCiAgICAgICAgICAgICBjb252ZXJ0UmFuZ2Uoc3Vycm91bmRGb3JtYXRzLmdldCgpLCBzdXJyb3VuZEZvcm1hdHMuZ2V0KCkgKyBudW1TdXJyb3VuZEZvcm1hdHNSZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKCpmb3JtYXRzKSwgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKCpmb3JtYXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdERlc2NyaXB0aW9uKSkpOwogICAgIGNvdW50LT52YWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4obnVtU3Vycm91bmRGb3JtYXRzKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiogX2FpZGxfcmV0dXJuKSB7CitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWEoCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24mIGRldmljZUFpZGwsCisgICAgICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+KiBfYWlkbF9yZXR1cm4pIHsKICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gZm9ybWF0czsKIAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKQEAgLTE4ODYsMTkgKzE5NjAsMjEgQEAKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlRGVzY3JpcHRpb25fYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwpKTsKICAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAotICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgmZm9ybWF0cykpKTsKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldEh3T2ZmbG9hZEZvcm1hdHNTdXBwb3J0ZWRGb3JCbHVldG9vdGhNZWRpYShkZXZpY2UsICZmb3JtYXRzKSkpOwogICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0Pj4oCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+PigKICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cywKLSAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQpKTsKKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbikpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZCgKLSAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGF1ZGlvRm9ybWF0QWlkbCwgYm9vbCBlbmFibGVkKSB7CisgICAgICAgIGNvbnN0IEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24mIGF1ZGlvRm9ybWF0QWlkbCwgYm9vbCBlbmFibGVkKSB7CiAgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGF1ZGlvRm9ybWF0QWlkbCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXREZXNjcmlwdGlvbl9hdWRpb19mb3JtYXRfdChhdWRpb0Zvcm1hdEFpZGwpKTsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CkBAIC0xOTA4LDM0ICsxOTg0LDQzIEBACiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9Gb3JtYXQsIGVuYWJsZWQpKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXNzaXN0YW50VWlkKGludDMyX3QgdWlkQWlkbCkKLXsKLSAgICB1aWRfdCB1aWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KHVpZEFpZGwpKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1VaWRQb2xpY3ktPnNldEFzc2lzdGFudFVpZCh1aWQpOworU3RhdHVzIGNvbnZlcnRJbnQzMlZlY3RvclRvVWlkVmVjdG9yV2l0aExpbWl0KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgdWlkc0FpZGwsIHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykgeworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgIGNvbnZlcnRSYW5nZVdpdGhMaW1pdCh1aWRzQWlkbC5iZWdpbigpLAorICAgICAgICAgICAgdWlkc0FpZGwuZW5kKCksCisgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIodWlkcyksCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90LAorICAgICAgICAgICAgTUFYX0lURU1TX1BFUl9MSVNUKSkpOworCiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0SG90d29yZERldGVjdGlvblNlcnZpY2VVaWQoaW50MzJfdCB1aWRBaWRsKQorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXNzaXN0YW50U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiB1aWRzQWlkbCkKIHsKLSAgICB1aWRfdCB1aWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KHVpZEFpZGwpKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gdWlkczsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGNvbnZlcnRJbnQzMlZlY3RvclRvVWlkVmVjdG9yV2l0aExpbWl0KHVpZHNBaWRsLCB1aWRzKSk7CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1VaWRQb2xpY3ktPnNldEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkKHVpZCk7CisgICAgbVVpZFBvbGljeS0+c2V0QXNzaXN0YW50VWlkcyh1aWRzKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBY3RpdmVBc3Npc3RhbnRTZXJ2aWNlc1VpZHMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBhY3RpdmVVaWRzQWlkbCkgeworICAgIHN0ZDo6dmVjdG9yPHVpZF90PiBhY3RpdmVVaWRzOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoY29udmVydEludDMyVmVjdG9yVG9VaWRWZWN0b3JXaXRoTGltaXQoYWN0aXZlVWlkc0FpZGwsIGFjdGl2ZVVpZHMpKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVVpZFBvbGljeS0+c2V0QWN0aXZlQXNzaXN0YW50VWlkcyhhY3RpdmVVaWRzKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiB1aWRzQWlkbCkKIHsKLSAgICBzaXplX3Qgc2l6ZSA9IHVpZHNBaWRsLnNpemUoKTsKLSAgICBpZiAoc2l6ZSA+IE1BWF9JVEVNU19QRVJfTElTVCkgewotICAgICAgICBzaXplID0gTUFYX0lURU1TX1BFUl9MSVNUOwotICAgIH0KICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gdWlkczsKLSAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAotICAgICAgICAgICAgY29udmVydFJhbmdlKHVpZHNBaWRsLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWlkc0FpZGwuYmVnaW4oKSArIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKHVpZHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QpKSk7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihjb252ZXJ0SW50MzJWZWN0b3JUb1VpZFZlY3RvcldpdGhMaW1pdCh1aWRzQWlkbCwgdWlkcykpOworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBtVWlkUG9saWN5LT5zZXRBMTF5VWlkcyh1aWRzKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwpAQCAtMTk2MCw2ICsyMDQ1LDE3IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6aXNVbHRyYXNvdW5kU3VwcG9ydGVkKGJvb2wqIF9haWRsX3JldHVybikKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgICpfYWlkbF9yZXR1cm4gPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc1VsdHJhc291bmRTdXBwb3J0ZWQoKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcygKICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUHJvZHVjdFN0cmF0ZWd5PiogX2FpZGxfcmV0dXJuKSB7CiAgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3Igc3RyYXRlZ2llczsKQEAgLTIwNDksNyArMjE0NSw3IEBACiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5KAogICAgICAgICBpbnQzMl90IHN0cmF0ZWd5QWlkbCwKICAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4mIGRldmljZXNBaWRsKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwpIHsKICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfcHJvZHVjdF9zdHJhdGVneV90KHN0cmF0ZWd5QWlkbCkpOwogICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKApAQCAtMjA2Miw4ICsyMTU4LDExIEBACiAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCi0gICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCByb2xlLCBkZXZpY2VzKSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShzdHJhdGVneSwgcm9sZSwgZGV2aWNlcyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgIG9uQ2hlY2tTcGF0aWFsaXplcl9sKCk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChzdGF0dXMpOwogfQogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KGludDMyX3Qgc3RyYXRlZ3lBaWRsLApAQCAtMjA3NiwxNCArMjE3NSwxNyBAQAogICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAotICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneShzdHJhdGVneSwgcm9sZSkpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICBvbkNoZWNrU3BhdGlhbGl6ZXJfbCgpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1Qoc3RhdHVzKTsKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneSgKICAgICAgICAgaW50MzJfdCBzdHJhdGVneUFpZGwsCiAgICAgICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsLAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+KiBfYWlkbF9yZXR1cm4pIHsKICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfcHJvZHVjdF9zdHJhdGVneV90KHN0cmF0ZWd5QWlkbCkpOwogICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKApAQCAtMjA5Nyw4ICsyMTk5LDggQEAKICAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAogICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneShzdHJhdGVneSwgcm9sZSwgZGV2aWNlcykpKTsKICAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4+KGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+PihkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCkBAIC0yMTA5LDExICsyMjExLDExIEBACiB9CiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZUFpZGwsCisgICAgICAgIEF1ZGlvU291cmNlIGF1ZGlvU291cmNlQWlkbCwKICAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4mIGRldmljZXNBaWRsKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwpIHsKICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KGF1ZGlvU291cmNlQWlkbCkpOworICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VfYXVkaW9fc291cmNlX3QoYXVkaW9Tb3VyY2VBaWRsKSk7CiAgICAgZGV2aWNlX3JvbGVfdCByb2xlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCiAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9EZXZpY2VSb2xlX2RldmljZV9yb2xlX3Qocm9sZUFpZGwpKTsKICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGRldmljZXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKQEAgLTIxMjksMTEgKzIyMzEsMTEgQEAKIH0KIAogU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6YWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAotICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCwKKyAgICAgICAgQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2VBaWRsLAogICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCkgewogICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoYXVkaW9Tb3VyY2VBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdChhdWRpb1NvdXJjZUFpZGwpKTsKICAgICBkZXZpY2Vfcm9sZV90IHJvbGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0RldmljZVJvbGVfZGV2aWNlX3JvbGVfdChyb2xlQWlkbCkpOwogICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlcyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKApAQCAtMjE0OSwxMSArMjI1MSwxMSBAQAogfQogCiBTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCi0gICAgICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2VBaWRsLAorICAgICAgICBBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZUFpZGwsCiAgICAgICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCkgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4mIGRldmljZXNBaWRsKSB7CiAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKLSAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChhdWRpb1NvdXJjZUFpZGwpKTsKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlX2F1ZGlvX3NvdXJjZV90KGF1ZGlvU291cmNlQWlkbCkpOwogICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAogICAgICAgICAgICAgYWlkbDJsZWdhY3lfRGV2aWNlUm9sZV9kZXZpY2Vfcm9sZV90KHJvbGVBaWRsKSk7CiAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCkBAIC0yMTY4LDEwICsyMjcwLDEwIEBACiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpKTsKIH0KIAotU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Y2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQobWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZUFpZGwsCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZUFpZGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCkgewogICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoYXVkaW9Tb3VyY2VBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdChhdWRpb1NvdXJjZUFpZGwpKTsKICAgICBkZXZpY2Vfcm9sZV90IHJvbGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0RldmljZVJvbGVfZGV2aWNlX3JvbGVfdChyb2xlQWlkbCkpOwogCkBAIC0yMTg0LDExICsyMjg2LDExIEBACiB9CiAKIFN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldCgKLSAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZUFpZGwsCisgICAgICAgIEF1ZGlvU291cmNlIGF1ZGlvU291cmNlQWlkbCwKICAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwsCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikgeworICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikgewogICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCi0gICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoYXVkaW9Tb3VyY2VBaWRsKSk7CisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZV9hdWRpb19zb3VyY2VfdChhdWRpb1NvdXJjZUFpZGwpKTsKICAgICBkZXZpY2Vfcm9sZV90IHJvbGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKICAgICAgICAgICAgIGFpZGwybGVnYWN5X0RldmljZVJvbGVfZGV2aWNlX3JvbGVfdChyb2xlQWlkbCkpOwogICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlczsKQEAgLTIyMDAsOCArMjMwMiw5MSBAQAogICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpKSk7CiAgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAotICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+PihkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3BhdGlhbGl6ZXIoCisgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICBtZWRpYTo6R2V0U3BhdGlhbGl6ZXJSZXNwb25zZSogX2FpZGxfcmV0dXJuKSB7CisgICAgX2FpZGxfcmV0dXJuLT5zcGF0aWFsaXplciA9IG51bGxwdHI7CisgICAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgfQorICAgIGlmIChtU3BhdGlhbGl6ZXIgIT0gbnVsbHB0cikgeworICAgICAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKAorICAgICAgICAgICAgICAgIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKG1TcGF0aWFsaXplci0+cmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFjaykpKTsKKyAgICAgICAgX2FpZGxfcmV0dXJuLT5zcGF0aWFsaXplciA9IG1TcGF0aWFsaXplcjsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Y2FuQmVTcGF0aWFsaXplZCgKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWw+JiBhdHRyQWlkbCwKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxBdWRpb0NvbmZpZz4mIGNvbmZpZ0FpZGwsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwsCisgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgeworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOworICAgIH0KKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisgICAgaWYgKGF0dHJBaWRsLmhhc192YWx1ZSgpKSB7CisgICAgICAgIGF0dHIgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsX2F1ZGlvX2F0dHJpYnV0ZXNfdChhdHRyQWlkbC52YWx1ZSgpKSk7CisgICAgfQorICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICBpZiAoY29uZmlnQWlkbC5oYXNfdmFsdWUoKSkgeworICAgICAgICBjb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KGNvbmZpZ0FpZGwudmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qaXNJbnB1dCovKSk7CisgICAgfQorICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlcyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yPihkZXZpY2VzQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Y2FuQmVTcGF0aWFsaXplZCgmYXR0ciwgJmNvbmZpZywgZGV2aWNlcyk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCAmYXR0ckFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9Db25maWcgJmNvbmZpZ0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvRGlyZWN0TW9kZSAqX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CisgICAgfQorICAgIGlmIChfYWlkbF9yZXR1cm4gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsX2F1ZGlvX2F0dHJpYnV0ZXNfdChhdHRyQWlkbCkpOworICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QoY29uZmlnQWlkbCwgZmFsc2UgLyppc0lucHV0Ki8pKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICpfYWlkbF9yZXR1cm4gPSBzdGF0aWNfY2FzdDxtZWRpYTo6QXVkaW9EaXJlY3RNb2RlPigKKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2RpcmVjdF9tb2RlX3RfaW50MzJfdF9tYXNrKAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoJmF0dHIsICZjb25maWcpKSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvUHJvZmlsZT4qIF9haWRsX3JldHVybikgeworICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CisgICAgfQorICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoYXR0ckFpZGwpKTsKKyAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgYXVkaW9Qcm9maWxlczsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcygmYXR0ciwgYXVkaW9Qcm9maWxlcykpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1Byb2ZpbGU+PigKKyAgICAgICAgICAgICAgICBhdWRpb1Byb2ZpbGVzLCBsZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGVfY29tbW9uLCBmYWxzZSAvKmlzSW5wdXQqLykpOworCiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IDRkMGUxZjEuLmU3ZDk0NWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL01ldGhvZFN0YXRpc3RpY3MuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1RpbWVDaGVjay5oPgogI2luY2x1ZGUgPHNlbnNvcnByaXZhY3kvU2Vuc29yUHJpdmFjeU1hbmFnZXIuaD4KQEAgLTYwLDYgKzYxLDEyMCBAQAogCiBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01hbmFnZUF1ZGlvUG9saWN5UGVybWlzc2lvbigiYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9BVURJT19QT0xJQ1kiKTsKIAorLy8gQ3JlYXRlcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIEJpbmRlciBjb2RlIHRvIG5hbWUgZm9yIElBdWRpb1BvbGljeVNlcnZpY2UuCisjZGVmaW5lIElBVURJT1BPTElDWVNFUlZJQ0VfQklOREVSX01FVEhPRF9NQUNST19MSVNUIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkob25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldERldmljZUNvbm5lY3Rpb25TdGF0ZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0UGhvbmVTdGF0ZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRGb3JjZVVzZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRGb3JjZVVzZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRPdXRwdXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0T3V0cHV0Rm9yQXR0cikgXAorQklOREVSX01FVEhPRF9FTlRSWShzdGFydE91dHB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShzdG9wT3V0cHV0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHJlbGVhc2VPdXRwdXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0SW5wdXRGb3JBdHRyKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHN0YXJ0SW5wdXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc3RvcElucHV0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHJlbGVhc2VJbnB1dCkgXAorQklOREVSX01FVEhPRF9FTlRSWShpbml0U3RyZWFtVm9sdW1lKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFN0cmVhbVZvbHVtZUluZGV4KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldFN0cmVhbVZvbHVtZUluZGV4KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRTdHJhdGVneUZvclN0cmVhbSkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXREZXZpY2VzRm9yQXR0cmlidXRlcykgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRPdXRwdXRGb3JFZmZlY3QpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVnaXN0ZXJFZmZlY3QpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkodW5yZWdpc3RlckVmZmVjdCkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRFZmZlY3RFbmFibGVkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKG1vdmVFZmZlY3RzVG9JbykgXAorQklOREVSX01FVEhPRF9FTlRSWShpc1N0cmVhbUFjdGl2ZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGlzU291cmNlQWN0aXZlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoYWRkU291cmNlRGVmYXVsdEVmZmVjdCkgXAorQklOREVSX01FVEhPRF9FTlRSWShhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdCkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRTdXBwb3J0ZWRTeXN0ZW1Vc2FnZXMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0T2ZmbG9hZFN1cHBvcnQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkobGlzdEF1ZGlvUG9ydHMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0QXVkaW9Qb3J0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGNyZWF0ZUF1ZGlvUGF0Y2gpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVsZWFzZUF1ZGlvUGF0Y2gpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkobGlzdEF1ZGlvUGF0Y2hlcykgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRBdWRpb1BvcnRDb25maWcpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVnaXN0ZXJDbGllbnQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbikgXAorQklOREVSX01FVEhPRF9FTlRSWShyZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbikgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRQaG9uZVN0YXRlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHJlZ2lzdGVyUG9saWN5TWl4ZXMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0VWlkRGV2aWNlQWZmaW5pdGllcykgXAorQklOREVSX01FVEhPRF9FTlRSWShyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFVzZXJJZERldmljZUFmZmluaXRpZXMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllcykgXAorQklOREVSX01FVEhPRF9FTlRSWShzdGFydEF1ZGlvU291cmNlKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHN0b3BBdWRpb1NvdXJjZSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRNYXN0ZXJNb25vKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldE1hc3Rlck1vbm8pIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0U3RyZWFtVm9sdW1lREIpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0U3Vycm91bmRGb3JtYXRzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldEh3T2ZmbG9hZEZvcm1hdHNTdXBwb3J0ZWRGb3JCbHVldG9vdGhNZWRpYSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoc2V0QXNzaXN0YW50U2VydmljZXNVaWRzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldEFjdGl2ZUFzc2lzdGFudFNlcnZpY2VzVWlkcykgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXRBMTF5U2VydmljZXNVaWRzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldEN1cnJlbnRJbWVVaWQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShpc1VsdHJhc291bmRTdXBwb3J0ZWQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkobGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcykgXAorQklOREVSX01FVEhPRF9FTlRSWShsaXN0QXVkaW9Wb2x1bWVHcm91cHMpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHNldFJ0dEVuYWJsZWQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoaXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZCkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3kpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoZ2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneSkgXAorQklOREVSX01FVEhPRF9FTlRSWShzZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkoYWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKHJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCkgXAorQklOREVSX01FVEhPRF9FTlRSWShjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQpIFwKK0JJTkRFUl9NRVRIT0RfRU5UUlkocmVnaXN0ZXJTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lcikgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXRTcGF0aWFsaXplcikgXAorQklOREVSX01FVEhPRF9FTlRSWShjYW5CZVNwYXRpYWxpemVkKSBcCitCSU5ERVJfTUVUSE9EX0VOVFJZKGdldERpcmVjdFBsYXliYWNrU3VwcG9ydCkgXAorQklOREVSX01FVEhPRF9FTlRSWShnZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMpIFwKKworLy8gc2luZ2xldG9uIGZvciBCaW5kZXIgTWV0aG9kIFN0YXRpc3RpY3MgZm9yIElBdWRpb1BvbGljeVNlcnZpY2UKK3N0YXRpYyBhdXRvJiBnZXRJQXVkaW9Qb2xpY3lTZXJ2aWNlU3RhdGlzdGljcygpIHsKKyAgICB1c2luZyBDb2RlID0gaW50OworCisjcHJhZ21hIHB1c2hfbWFjcm8oIkJJTkRFUl9NRVRIT0RfRU5UUlkiKQorI3VuZGVmIEJJTkRFUl9NRVRIT0RfRU5UUlkKKyNkZWZpbmUgQklOREVSX01FVEhPRF9FTlRSWShFTlRSWSkgXAorICAgICAgICB7KENvZGUpbWVkaWE6OkJuQXVkaW9Qb2xpY3lTZXJ2aWNlOjpUUkFOU0FDVElPTl8jI0VOVFJZLCAjRU5UUll9LAorCisgICAgc3RhdGljIG1lZGlhdXRpbHM6Ok1ldGhvZFN0YXRpc3RpY3M8Q29kZT4gbWV0aG9kU3RhdGlzdGljc3sKKyAgICAgICAgSUFVRElPUE9MSUNZU0VSVklDRV9CSU5ERVJfTUVUSE9EX01BQ1JPX0xJU1QKKyAgICAgICAgTUVUSE9EX1NUQVRJU1RJQ1NfQklOREVSX0NPREVfTkFNRVMoQ29kZSkKKyAgICB9OworI3ByYWdtYSBwb3BfbWFjcm8oIkJJTkRFUl9NRVRIT0RfRU5UUlkiKQorCisgICAgcmV0dXJuIG1ldGhvZFN0YXRpc3RpY3M7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIEF1ZGlvUG9saWN5SW50ZXJmYWNlKiBjcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKQEAgLTExNCw2ICsyMjksMTMgQEAKIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uRmlyc3RSZWYoKQogeworICAgIC8vIExvZyBhbiBBdWRpb1BvbGljeSAiY29uc3RydWN0b3IiIG1lZGlhbWV0cmljcyBldmVudCBvbiBmaXJzdCByZWYuCisgICAgLy8gVGhpcyByZWNvcmRzIHRoZSB0aW1lIGl0IHRha2VzIHRvIGxvYWQgdGhlIGF1ZGlvIG1vZHVsZXMgYW5kIGRldmljZXMuCisgICAgbWVkaWFtZXRyaWNzOjpEZWZlciBkZWZlcihbYmVnaW5OcyA9IHN5c3RlbVRpbWUoKV0geworICAgICAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0oQU1FRElBTUVUUklDU19LRVlfQVVESU9fUE9MSUNZKQorICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9DVE9SKQorICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVhFQ1VUSU9OVElNRU5TLCAoaW50NjRfdCkoc3lzdGVtVGltZSgpIC0gYmVnaW5OcykpCisgICAgICAgICAgICAucmVjb3JkKCk7IH0pOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIApAQCAtMTI3LDYgKzI0OSw3IEBACiAgICAgICAgIGxvYWRBdWRpb1BvbGljeU1hbmFnZXIoKTsKICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlciA9IG1DcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIobUF1ZGlvUG9saWN5Q2xpZW50KTsKICAgICB9CisKICAgICAvLyBsb2FkIGF1ZGlvIHByb2Nlc3NpbmcgbW9kdWxlcwogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4gYXVkaW9Qb2xpY3lFZmZlY3RzID0gbmV3IEF1ZGlvUG9saWN5RWZmZWN0cygpOwogICAgIHNwPFVpZFBvbGljeT4gdWlkUG9saWN5ID0gbmV3IFVpZFBvbGljeSh0aGlzKTsKQEAgLTEzOSw2ICsyNjIsMTggQEAKICAgICB9CiAgICAgdWlkUG9saWN5LT5yZWdpc3RlclNlbGYoKTsKICAgICBzZW5zb3JQcml2YWN5UG9saWN5LT5yZWdpc3RlclNlbGYoKTsKKworICAgIC8vIENyZWF0ZSBzcGF0aWFsaXplciBpZiBzdXBwb3J0ZWQKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciAhPSBudWxscHRyKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0gYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSk7CisgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlczsKKyAgICAgICAgYm9vbCBoYXNTcGF0aWFsaXplciA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmNhbkJlU3BhdGlhbGl6ZWQoJmF0dHIsIG51bGxwdHIsIGRldmljZXMpOworICAgICAgICBpZiAoaGFzU3BhdGlhbGl6ZXIpIHsKKyAgICAgICAgICAgIG1TcGF0aWFsaXplciA9IFNwYXRpYWxpemVyOjpjcmVhdGUodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgQXVkaW9TeXN0ZW06OmF1ZGlvUG9saWN5UmVhZHkoKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnVubG9hZEF1ZGlvUG9saWN5TWFuYWdlcigpCkBAIC0zNTMsNiArNDg4LDExNCBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpCit7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnZvbFJhbmdlSW5pdFJlcUNvbW1hbmQoKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uQ2hlY2tTcGF0aWFsaXplcigpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBvbkNoZWNrU3BhdGlhbGl6ZXJfbCgpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25DaGVja1NwYXRpYWxpemVyX2woKQoreworICAgIGlmIChtU3BhdGlhbGl6ZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+Y2hlY2tTcGF0aWFsaXplckNvbW1hbmQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uQ2hlY2tTcGF0aWFsaXplcigpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIEFMT0dJKCIlcyBtU3BhdGlhbGl6ZXIgJXAgbGV2ZWwgJWQiLCBfX2Z1bmNfXywgbVNwYXRpYWxpemVyLmdldCgpLCAoaW50KW1TcGF0aWFsaXplci0+Z2V0TGV2ZWwoKSk7CisKKyAgICBpZiAobVNwYXRpYWxpemVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gTm90ZTogbVNwYXRpYWxpemVyICE9IG51bGxwdHIgPT4gIG1BdWRpb1BvbGljeU1hbmFnZXIgIT0gbnVsbHB0cgorICAgICAgICBpZiAobVNwYXRpYWxpemVyLT5nZXRMZXZlbCgpICE9IG1lZGlhOjpTcGF0aWFsaXphdGlvbkxldmVsOjpOT05FKSB7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBjdXJyZW50T3V0cHV0ID0gbVNwYXRpYWxpemVyLT5nZXRPdXRwdXQoKTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG5ld091dHB1dDsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0gYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSk7CisgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IG1TcGF0aWFsaXplci0+Z2V0QXVkaW9JbkNvbmZpZygpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0U3BhdGlhbGl6ZXJPdXRwdXQoJmNvbmZpZywgJmF0dHIsICZuZXdPdXRwdXQpOworICAgICAgICAgICAgQUxPR1YoIiVzIGN1cnJlbnRPdXRwdXQgJWQgbmV3T3V0cHV0ICVkIGNoYW5uZWxfbWFzayAlI3giLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY3VycmVudE91dHB1dCwgbmV3T3V0cHV0LCBjb25maWcuY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgY3VycmVudE91dHB1dCA9PSBuZXdPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplX3QgbnVtQWN0aXZlVHJhY2tzID0gY291bnRBY3RpdmVDbGllbnRzT25PdXRwdXRfbChuZXdPdXRwdXQpOworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAvLyBJdCBpcyBPSyB0byBjYWxsIGRldGFjaE91dHB1dCgpIGlzIG5vbmUgaXMgYWxyZWFkeSBhdHRhY2hlZC4KKyAgICAgICAgICAgIG1TcGF0aWFsaXplci0+ZGV0YWNoT3V0cHV0KCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IG5ld091dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBtU3BhdGlhbGl6ZXItPmF0dGFjaE91dHB1dChuZXdPdXRwdXQsIG51bUFjdGl2ZVRyYWNrcyk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZVNwYXRpYWxpemVyT3V0cHV0KG5ld091dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobVNwYXRpYWxpemVyLT5nZXRMZXZlbCgpID09IG1lZGlhOjpTcGF0aWFsaXphdGlvbkxldmVsOjpOT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVNwYXRpYWxpemVyLT5nZXRPdXRwdXQoKSAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBtU3BhdGlhbGl6ZXItPmRldGFjaE91dHB1dCgpOworICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VTcGF0aWFsaXplck91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzaXplX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjb3VudEFjdGl2ZUNsaWVudHNPbk91dHB1dF9sKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGJvb2wgc3BhdGlhbGl6ZWRPbmx5KSB7CisgICAgc2l6ZV90IGNvdW50ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1BsYXliYWNrQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBhdXRvIGNsaWVudCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoY2xpZW50LT5pbyA9PSBvdXRwdXQgJiYgY2xpZW50LT5hY3RpdmUKKyAgICAgICAgICAgICAgICAmJiAoIXNwYXRpYWxpemVkT25seSB8fCBjbGllbnQtPmlzU3BhdGlhbGl6ZWQpKSB7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uVXBkYXRlQWN0aXZlU3BhdGlhbGl6ZXJUcmFja3NfbCgpIHsKKyAgICBpZiAobVNwYXRpYWxpemVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+dXBkYXRlQWN0aXZlU3BhdGlhbGl6ZXJUcmFja3NDb21tYW5kKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uVXBkYXRlQWN0aXZlU3BhdGlhbGl6ZXJUcmFja3MoKQoreworICAgIHNwPFNwYXRpYWxpemVyPiBzcGF0aWFsaXplcjsKKyAgICBzaXplX3QgYWN0aXZlQ2xpZW50czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGlmIChtU3BhdGlhbGl6ZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNwYXRpYWxpemVyID0gbVNwYXRpYWxpemVyOworICAgICAgICBhY3RpdmVDbGllbnRzID0gY291bnRBY3RpdmVDbGllbnRzT25PdXRwdXRfbChtU3BhdGlhbGl6ZXItPmdldE91dHB1dCgpKTsKKyAgICB9CisgICAgaWYgKHNwYXRpYWxpemVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3BhdGlhbGl6ZXItPnVwZGF0ZUFjdGl2ZVRyYWNrcyhhY3RpdmVDbGllbnRzKTsKKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Y2xpZW50Q3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQpAQCAtNDA5LDcgKzY1Miw3IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKSB7CkBAIC00NDIsMjIgKzY4NSwyNCBAQAogICAgICAgICAgICAgaW50MzJfdCBldmVudEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihldmVudCkpOwogICAgICAgICAgICAgbWVkaWE6OlJlY29yZENsaWVudEluZm8gY2xpZW50SW5mb0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9yZWNvcmRfY2xpZW50X2luZm9fdF9SZWNvcmRDbGllbnRJbmZvKCpjbGllbnRJbmZvKSk7Ci0gICAgICAgICAgICBtZWRpYTo6QXVkaW9Db25maWdCYXNlIGNsaWVudENvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAotICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZSgqY2xpZW50Q29uZmlnKSk7CisgICAgICAgICAgICBBdWRpb0NvbmZpZ0Jhc2UgY2xpZW50Q29uZmlnQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjbGllbnRDb25maWcsIHRydWUgLyppc0lucHV0Ki8pKTsKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yPiBjbGllbnRFZmZlY3RzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCiAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkVmZmVjdERlc2NyaXB0b3I+PigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRFZmZlY3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2VmZmVjdF9kZXNjcmlwdG9yX3RfRWZmZWN0RGVzY3JpcHRvcikpOwotICAgICAgICAgICAgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSBkZXZpY2VDb25maWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoKmRldmljZUNvbmZpZykpOworICAgICAgICAgICAgQXVkaW9Db25maWdCYXNlIGRldmljZUNvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGV2aWNlQ29uZmlnLCB0cnVlIC8qaXNJbnB1dCovKSk7CiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0c0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAogICAgICAgICAgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yPj4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9lZmZlY3RfZGVzY3JpcHRvcl90X0VmZmVjdERlc2NyaXB0b3IpKTsKICAgICAgICAgICAgIGludDMyX3QgcGF0Y2hIYW5kbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcGF0Y2hfaGFuZGxlX3RfaW50MzJfdChwYXRjaEhhbmRsZSkpOwotICAgICAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBzb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKLSAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKHNvdXJjZSkpOworICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvU291cmNlIHNvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZShzb3VyY2UpKTsKICAgICAgICAgICAgIHJldHVybiBhaWRsX3V0aWxzOjpzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50QWlkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEluZm9BaWRsLApAQCAtNDg5LDYgKzczNCwxMyBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIGlzU2VydmljZVVpZChtVWlkKSkgeworICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKTsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKICAgICBBTE9HVygiYmluZGVyRGllZCgpICVwLCBjYWxsaW5nIHBpZCAlZCIsIHdoby51bnNhZmVfZ2V0KCksCiAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwpAQCAtNTEwLDIwICs3NjIsMjcgQEAKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkF1ZGlvUG9saWN5TWFuYWdlcjogJXBcbiIsIG1BdWRpb1BvbGljeU1hbmFnZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlN1cHBvcnRlZCBTeXN0ZW0gVXNhZ2VzOlxuICAiKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ29tbWFuZCBUaHJlYWQ6ICVwXG4iLCBtQXVkaW9Db21tYW5kVGhyZWFkLmdldCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJTdXBwb3J0ZWQgU3lzdGVtIFVzYWdlczpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHN0ZDo6dmVjdG9yPGF1ZGlvX3VzYWdlX3Q+OjppdGVyYXRvciBpdCA9IG1TdXBwb3J0ZWRTeXN0ZW1Vc2FnZXMuYmVnaW4oKTsKLSAgICAgICAgaXQgIT0gbVN1cHBvcnRlZFN5c3RlbVVzYWdlcy5lbmQoKTsgKytpdCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdCVkXG4iLCAqaXQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gbXNnOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGF1dG8gdXNhZ2UgOiBtU3VwcG9ydGVkU3lzdGVtVXNhZ2VzKSB7CisgICAgICAgIGlmIChpKysgIT0gMCkgbXNnIDw8ICIsICI7CisgICAgICAgIGlmIChjb25zdCBjaGFyKiBzdHJVc2FnZSA9IGF1ZGlvX3VzYWdlX3RvX3N0cmluZyh1c2FnZSk7IHN0clVzYWdlKSB7CisgICAgICAgICAgICBtc2cgPDwgc3RyVXNhZ2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtc2cgPDwgdXNhZ2UgPDwgIiAodW5rbm93bikiOworICAgICAgICB9CiAgICAgfQorICAgIGlmIChpID09IDApIHsKKyAgICAgICAgbXNnIDw8ICJOb25lIjsKKyAgICB9CisgICAgbXNnIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXN1bHQuYXBwZW5kKG1zZy5zdHIoKS5jX3N0cigpKTsKIAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgbVVpZFBvbGljeS0+ZHVtcEludGVybmFscyhmZCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC01MzcsMTMgKzc5NiwyMCBAQAogewogLy8gICAgR28gb3ZlciBhbGwgYWN0aXZlIGNsaWVudHMgYW5kIGFsbG93IGNhcHR1cmUgKGRvZXMgbm90IGZvcmNlIHNpbGVuY2UpIGluIHRoZQogLy8gICAgZm9sbG93aW5nIGNhc2VzOgotLy8gICAgVGhlIGNsaWVudCBpcyB0aGUgYXNzaXN0YW50CisvLyAgICBUaGUgY2xpZW50IGlzIGluIHRoZSBhY3RpdmUgYXNzaXN0YW50IGxpc3QKKy8vICAgICAgICAgQU5EIGlzIFRPUAorLy8gICAgICAgICAgICAgICBBTkQgYW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIFRPUAorLy8gICAgICAgICAgICAgICAgICBBTkQgc291cmNlIGlzIGVpdGhlciBWT0lDRV9SRUNPR05JVElPTiBPUiBIT1RXT1JECisvLyAgICAgICAgICAgICAgIE9SIHRoZXJlIGlzIG5vIGFjdGl2ZSBwcml2YWN5IHNlbnNpdGl2ZSBjYXB0dXJlIG9yIGNhbGwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBPUiBjbGllbnQgaGFzIENBUFRVUkVfQVVESU9fT1VUUFVUIHByaXZpbGVnZWQgcGVybWlzc2lvbgorLy8gICAgICAgICAgICAgICAgICBBTkQgc291cmNlIGlzIFZPSUNFX1JFQ09HTklUSU9OIE9SIEhPVFdPUkQKKy8vICAgIFRoZSBjbGllbnQgaXMgYW4gYXNzaXN0YW50IEFORCBhY3RpdmUgYXNzaXN0YW50IGlzIG5vdCBiZWluZyB1c2VkCiAvLyAgICAgICAgQU5EIGFuIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBvbiBUT1Agb3IgYSBSVFQgY2FsbCBpcyBhY3RpdmUKIC8vICAgICAgICAgICAgICAgIEFORCB0aGUgc291cmNlIGlzIFZPSUNFX1JFQ09HTklUSU9OIG9yIEhPVFdPUkQKLS8vICAgICAgICAgICAgT1IgdXNlcyBWT0lDRV9SRUNPR05JVElPTiBBTkQgaXMgb24gVE9QCi0vLyAgICAgICAgICAgICAgICBPUiB1c2VzIEhPVFdPUkQKLS8vICAgICAgICAgICAgQU5EIHRoZXJlIGlzIG5vIGFjdGl2ZSBwcml2YWN5IHNlbnNpdGl2ZSBjYXB0dXJlIG9yIGNhbGwKKy8vICAgICAgICBPUiB0aGVyZSBpcyBubyBhY3RpdmUgcHJpdmFjeSBzZW5zaXRpdmUgY2FwdHVyZSBvciBjYWxsCiAvLyAgICAgICAgICAgICAgICBPUiBjbGllbnQgaGFzIENBUFRVUkVfQVVESU9fT1VUUFVUIHByaXZpbGVnZWQgcGVybWlzc2lvbgorLy8gICAgICAgICAgICBBTkQgaXMgVE9QIG1vc3QgcmVjZW50IGFzc2lzdGFudCBhbmQgdXNlcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisvLyAgICAgICAgICAgICAgICBPUiB0aGVyZSBpcyBubyB0b3AgcmVjZW50IGFzc2lzdGFudCBhbmQgc291cmNlIGlzIEhPVFdPUkQKIC8vICAgIE9SIFRoZSBjbGllbnQgaXMgYW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCiAvLyAgICAgICAgQU5EIElzIG9uIFRPUAogLy8gICAgICAgICAgICAgICAgQU5EIHRoZSBzb3VyY2UgaXMgVk9JQ0VfUkVDT0dOSVRJT04gb3IgSE9UV09SRApAQCAtNTcxLDEzICs4MzcsMTYgQEAKICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gbGF0ZXN0QWN0aXZlOwogICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiB0b3BTZW5zaXRpdmVBY3RpdmU7CiAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGxhdGVzdFNlbnNpdGl2ZUFjdGl2ZU9yQ29tbTsKKyAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gbGF0ZXN0QWN0aXZlQXNzaXN0YW50OwogCiAgICAgbnNlY3NfdCB0b3BTdGFydE5zID0gMDsKICAgICBuc2Vjc190IGxhdGVzdFN0YXJ0TnMgPSAwOwogICAgIG5zZWNzX3QgdG9wU2Vuc2l0aXZlU3RhcnROcyA9IDA7CiAgICAgbnNlY3NfdCBsYXRlc3RTZW5zaXRpdmVTdGFydE5zID0gMDsKKyAgICBuc2Vjc190IGxhdGVzdEFzc2lzdGFudFN0YXJ0TnMgPSAwOwogICAgIGJvb2wgaXNBMTF5T25Ub3AgPSBtVWlkUG9saWN5LT5pc0ExMXlPblRvcCgpOwogICAgIGJvb2wgaXNBc3Npc3RhbnRPblRvcCA9IGZhbHNlOworICAgIGJvb2wgdXNlQWN0aXZlQXNzaXN0YW50TGlzdCA9IGZhbHNlOwogICAgIGJvb2wgaXNTZW5zaXRpdmVBY3RpdmUgPSBmYWxzZTsKICAgICBib29sIGlzSW5DYWxsID0gbVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMOwogICAgIGJvb2wgaXNJbkNvbW11bmljYXRpb24gPSBtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NPTU1VTklDQVRJT047CkBAIC02MTIsNiArODgxLDcgQEAKICAgICAgICAgLy8gZm9yIHRvcCBvciBsYXRlc3QgYWN0aXZlIHRvIGF2b2lkIG1hc2tpbmcgcmVndWxhciBjbGllbnRzIHN0YXJ0ZWQgYmVmb3JlCiAgICAgICAgIGlmICghaXNBY2Nlc3NpYmlsaXR5ICYmICFpc1ZpcnR1YWxTb3VyY2UoY3VycmVudC0+YXR0cmlidXRlcy5zb3VyY2UpKSB7CiAgICAgICAgICAgICBib29sIGlzQXNzaXN0YW50ID0gbVVpZFBvbGljeS0+aXNBc3Npc3RhbnRVaWQoY3VycmVudFVpZCk7CisgICAgICAgICAgICBib29sIGlzQWN0aXZlQXNzaXN0YW50ID0gbVVpZFBvbGljeS0+aXNBY3RpdmVBc3Npc3RhbnRVaWQoY3VycmVudFVpZCk7CiAgICAgICAgICAgICBib29sIGlzUHJpdmFjeVNlbnNpdGl2ZSA9CiAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50LT5hdHRyaWJ1dGVzLmZsYWdzICYgQVVESU9fRkxBR19DQVBUVVJFX1BSSVZBVEUpICE9IDA7CiAKQEAgLTYyOSw2ICs4OTksMTQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGlzQXNzaXN0YW50KSB7CiAgICAgICAgICAgICAgICAgICAgIGlzQXNzaXN0YW50T25Ub3AgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNBY3RpdmVBc3Npc3RhbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZUFjdGl2ZUFzc2lzdGFudExpc3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF1c2VBY3RpdmVBc3Npc3RhbnRMaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudC0+c3RhcnRUaW1lTnMgPiBsYXRlc3RBc3Npc3RhbnRTdGFydE5zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0QWN0aXZlQXNzaXN0YW50ID0gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RBc3Npc3RhbnRTdGFydE5zID0gY3VycmVudC0+c3RhcnRUaW1lTnM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBDbGllbnRzIGNhcHR1cmluZyBmb3IgSE9UV09SRCBhcmUgbm90IGNvbnNpZGVyZWQKQEAgLTY2MCw3ICs5MzgsOCBAQAogICAgICAgICBpZiAoY3VycmVudC0+YXR0cmlidXRlcy5zb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKICAgICAgICAgICAgIG9ubHlIb3R3b3JkQWN0aXZlID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnRVaWQgPT0gbVBob25lU3RhdGVPd25lclVpZCkgeworICAgICAgICBpZiAoY3VycmVudFVpZCA9PSBtUGhvbmVTdGF0ZU93bmVyVWlkICYmCisgICAgICAgICAgICAgICAgIWlzVmlydHVhbFNvdXJjZShjdXJyZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSkpIHsKICAgICAgICAgICAgIGlzUGhvbmVTdGF0ZU93bmVyQWN0aXZlID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KQEAgLTcwNyw2ICs5ODYsOCBAQAogICAgICAgICAgICAgY3VycmVudC0+YXR0cmlidXRpb25Tb3VyY2UudWlkID09IHRvcEFjdGl2ZS0+YXR0cmlidXRpb25Tb3VyY2UudWlkOwogICAgICAgICBib29sIGlzVG9wT3JMYXRlc3RTZW5zaXRpdmUgPSB0b3BTZW5zaXRpdmVBY3RpdmUgPT0gbnVsbHB0ciA/IGZhbHNlIDoKICAgICAgICAgICAgIGN1cnJlbnQtPmF0dHJpYnV0aW9uU291cmNlLnVpZCA9PSB0b3BTZW5zaXRpdmVBY3RpdmUtPmF0dHJpYnV0aW9uU291cmNlLnVpZDsKKyAgICAgICAgYm9vbCBpc1RvcE9yTGF0ZXN0QXNzaXN0YW50ID0gbGF0ZXN0QWN0aXZlQXNzaXN0YW50ID09IG51bGxwdHIgPyBmYWxzZSA6CisgICAgICAgICAgICBjdXJyZW50LT5hdHRyaWJ1dGlvblNvdXJjZS51aWQgPT0gbGF0ZXN0QWN0aXZlQXNzaXN0YW50LT5hdHRyaWJ1dGlvblNvdXJjZS51aWQ7CiAKICAgICAgICAgYXV0byBjYW5DYXB0dXJlSWZJbkNhbGxPckNvbW11bmljYXRpb24gPSBbJl0oY29uc3QgYXV0byAmcmVjb3JkQ2xpZW50KSBSRVFVSVJFUyhtTG9jaykgewogICAgICAgICAgICAgdWlkX3QgcmVjb3JkVWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdCgKQEAgLTczNiwyMyArMTAxNyw0NSBAQAogICAgICAgICB9IGVsc2UgaWYgKGlzVmlydHVhbFNvdXJjZShzb3VyY2UpKSB7CiAgICAgICAgICAgICAvLyBBbGxvdyBjYXB0dXJlIGZvciB2aXJ0dWFsIChyZW1vdGUgc3VibWl4LCBjYWxsIGF1ZGlvIFRYIG9yIFJYLi4uKSBzb3VyY2VzCiAgICAgICAgICAgICBhbGxvd0NhcHR1cmUgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKG1VaWRQb2xpY3ktPmlzQXNzaXN0YW50VWlkKGN1cnJlbnRVaWQpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoIXVzZUFjdGl2ZUFzc2lzdGFudExpc3QgJiYgbVVpZFBvbGljeS0+aXNBc3Npc3RhbnRVaWQoY3VycmVudFVpZCkpIHsKICAgICAgICAgICAgIC8vIEZvciBhc3Npc3RhbnQgYWxsb3cgY2FwdHVyZSBpZjoKLSAgICAgICAgICAgIC8vICAgICBBbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaXMgb24gVE9QIG9yIGEgUlRUIGNhbGwgaXMgYWN0aXZlCisgICAgICAgICAgICAvLyAgICAgQWN0aXZlIGFzc2lzdGFudCBsaXN0IGlzIG5vdCBiZWluZyB1c2VkCisgICAgICAgICAgICAvLyAgICAgQU5EIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBvbiBUT1Agb3IgYSBSVFQgY2FsbCBpcyBhY3RpdmUKICAgICAgICAgICAgIC8vICAgICAgICAgICAgQU5EIHRoZSBzb3VyY2UgaXMgVk9JQ0VfUkVDT0dOSVRJT04gb3IgSE9UV09SRAotICAgICAgICAgICAgLy8gICAgIE9SIGlzIG9uIFRPUCBBTkQgdXNlcyBWT0lDRV9SRUNPR05JVElPTgotICAgICAgICAgICAgLy8gICAgICAgICAgICBPUiB1c2VzIEhPVFdPUkQKLSAgICAgICAgICAgIC8vICAgICAgICAgQU5EIHRoZXJlIGlzIG5vIGFjdGl2ZSBwcml2YWN5IHNlbnNpdGl2ZSBjYXB0dXJlIG9yIGNhbGwKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgIE9SIGNsaWVudCBoYXMgQ0FQVFVSRV9BVURJT19PVVRQVVQgcHJpdmlsZWdlZCBwZXJtaXNzaW9uCisgICAgICAgICAgICAvLyAgICAgT1IgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAorICAgICAgICAgICAgLy8gICAgICAgICAgT1IgY2xpZW50IGhhcyBDQVBUVVJFX0FVRElPX09VVFBVVCBwcml2aWxlZ2VkIHBlcm1pc3Npb24KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgQU5EIGlzIGxhdGVzdCBUT1AgYXNzaXN0YW50IEFORAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICB1c2VzIFZPSUNFX1JFQ09HTklUSU9OIE9SIHVzZXMgSE9UV09SRAorICAgICAgICAgICAgLy8gICAgICAgICAgICBPUiB0aGVyZSBpcyBubyBUT1AgYXNzaXN0YW50IGFuZCB1c2VzIEhPVFdPUkQKICAgICAgICAgICAgIGlmIChpc0ExMXlPblRvcCB8fCBydHRDYWxsQWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCB8fCBzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsbG93Q2FwdHVyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoKChpc0Fzc2lzdGFudE9uVG9wICYmIHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhKGlzU2Vuc2l0aXZlQWN0aXZlICYmICFjdXJyZW50LT5jYW5DYXB0dXJlT3V0cHV0KQorICAgICAgICAgICAgfSBlbHNlIGlmICghKGlzU2Vuc2l0aXZlQWN0aXZlICYmICFjdXJyZW50LT5jYW5DYXB0dXJlT3V0cHV0KQorICAgICAgICAgICAgICAgICAgICAmJiBjYW5DYXB0dXJlSWZJbkNhbGxPckNvbW11bmljYXRpb24oY3VycmVudCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNUb3BPckxhdGVzdEFzc2lzdGFudAorICAgICAgICAgICAgICAgICAgICAmJiAoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Fzc2lzdGFudE9uVG9wICYmIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG93Q2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHVzZUFjdGl2ZUFzc2lzdGFudExpc3QgJiYgbVVpZFBvbGljeS0+aXNBY3RpdmVBc3Npc3RhbnRVaWQoY3VycmVudFVpZCkpIHsKKyAgICAgICAgICAgIC8vIEZvciBhc3Npc3RhbnQgb24gYWN0aXZlIGxpc3QgYW5kIG9uIHRvcCBhbGxvdyBjYXB0dXJlIGlmOgorICAgICAgICAgICAgLy8gICAgIEFuIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBvbiBUT1AKKyAgICAgICAgICAgIC8vICAgICAgICAgQU5EIHRoZSBzb3VyY2UgaXMgVk9JQ0VfUkVDT0dOSVRJT04gb3IgSE9UV09SRAorICAgICAgICAgICAgLy8gICAgIE9SIHRoZXJlIGlzIG5vIGFjdGl2ZSBwcml2YWN5IHNlbnNpdGl2ZSBjYXB0dXJlIG9yIGNhbGwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgIE9SIGNsaWVudCBoYXMgQ0FQVFVSRV9BVURJT19PVVRQVVQgcHJpdmlsZWdlZCBwZXJtaXNzaW9uCisgICAgICAgICAgICAvLyAgICAgICAgIEFORCB1c2VzIFZPSUNFX1JFQ09HTklUSU9OIE9SIHVzZXMgSE9UV09SRAorICAgICAgICAgICAgaWYgKGlzQTExeU9uVG9wKSB7CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCB8fCBzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG93Q2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghKGlzU2Vuc2l0aXZlQWN0aXZlICYmICFjdXJyZW50LT5jYW5DYXB0dXJlT3V0cHV0KQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2FuQ2FwdHVyZUlmSW5DYWxsT3JDb21tdW5pY2F0aW9uKGN1cnJlbnQpKSB7CisgICAgICAgICAgICAgICAgaWYgKChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSB8fCAoc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSkKKyAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGFsbG93Q2FwdHVyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtODM5LDYgKzExNDIsNyBAQAogICAgIHN3aXRjaCAoc291cmNlKSB7CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOgogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRToKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwpAQCAtODg3LDE3ICsxMTkxLDM1IEBACiAgICAgICAgIH0KIAogICAgICAgICBkdW1wSW50ZXJuYWxzKGZkKTsKKworICAgICAgICBTdHJpbmc4IGFjdFB0ciA9IFN0cmluZzg6OmZvcm1hdCgiQXVkaW9Db21tYW5kVGhyZWFkOiAlcFxuIiwgbUF1ZGlvQ29tbWFuZFRocmVhZC5nZXQoKSk7CisgICAgICAgIHdyaXRlKGZkLCBhY3RQdHIuc3RyaW5nKCksIGFjdFB0ci5zaXplKCkpOwogICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZFRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5kdW1wKGZkKTsKICAgICAgICAgfQogCisgICAgICAgIFN0cmluZzggb2N0UHRyID0gU3RyaW5nODo6Zm9ybWF0KCJPdXRwdXRDb21tYW5kVGhyZWFkOiAlcFxuIiwgbU91dHB1dENvbW1hbmRUaHJlYWQuZ2V0KCkpOworICAgICAgICB3cml0ZShmZCwgb2N0UHRyLnN0cmluZygpLCBvY3RQdHIuc2l6ZSgpKTsKKyAgICAgICAgaWYgKG1PdXRwdXRDb21tYW5kVGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5kdW1wKGZkKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5kdW1wKGZkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZzggYXBtUHRyID0gU3RyaW5nODo6Zm9ybWF0KCJBdWRpb1BvbGljeU1hbmFnZXI6ICVwXG4iLCBtQXVkaW9Qb2xpY3lNYW5hZ2VyKTsKKyAgICAgICAgICAgIHdyaXRlKGZkLCBhcG1QdHIuc3RyaW5nKCksIGFwbVB0ci5zaXplKCkpOwogICAgICAgICB9CiAKICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyLmR1bXAoZmQpOwogCiAgICAgICAgIGR1bXBSZWxlYXNlTG9jayhtTG9jaywgbG9ja2VkKTsKKworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0aW1lQ2hlY2tTdGF0cyA9IGdldElBdWRpb1BvbGljeVNlcnZpY2VTdGF0aXN0aWNzKCkuZHVtcCgpOworICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuSUF1ZGlvUG9saWN5U2VydmljZSBiaW5kZXIgY2FsbCBwcm9maWxlXG4iKTsKKyAgICAgICAgICAgIHdyaXRlKGZkLCB0aW1lQ2hlY2tTdGF0cy5jX3N0cigpLCB0aW1lQ2hlY2tTdGF0cy5zaXplKCkpOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTk1OCwxOSArMTI4MCwxOSBAQAogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2lzU3RyZWFtQWN0aXZlOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2lzU3RyZWFtQWN0aXZlUmVtb3RlbHk6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05faXNTb3VyY2VBY3RpdmU6Ci0gICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0RGV2aWNlc0ZvclN0cmVhbToKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9yZWdpc3RlclBvbGljeU1peGVzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldE1hc3Rlck1vbm86CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0U3Vycm91bmRGb3JtYXRzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldFN1cnJvdW5kRm9ybWF0RW5hYmxlZDoKLSAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9zZXRBc3Npc3RhbnRVaWQ6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fc2V0QXNzaXN0YW50U2VydmljZXNVaWRzOgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldEFjdGl2ZUFzc2lzdGFudFNlcnZpY2VzVWlkczoKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9zZXRBMTF5U2VydmljZXNVaWRzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldFVpZERldmljZUFmZmluaXRpZXM6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllczoKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9zZXRVc2VySWREZXZpY2VBZmZpbml0aWVzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3JlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXM6Ci0gICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUDoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9nZXRId09mZmxvYWRGb3JtYXRzU3VwcG9ydGVkRm9yQmx1ZXRvb3RoTWVkaWE6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fbGlzdEF1ZGlvVm9sdW1lR3JvdXBzOgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlczoKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9hY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbjoKQEAgLTk5MCw3ICsxMzEyLDggQEAKICAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9hZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQ6CiAgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fcmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0OgogICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2NsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0OgotICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldDogeworICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldDoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9nZXRTcGF0aWFsaXplcjogewogICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQgdW5hdXRob3JpemVkIFVJRCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKQEAgLTEwMDIsOCArMTMyNSwyMCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgc3RkOjpzdHJpbmcgdGFnKCJJQXVkaW9Qb2xpY3lTZXJ2aWNlIGNvbW1hbmQgIiArIHN0ZDo6dG9fc3RyaW5nKGNvZGUpKTsKLSAgICBUaW1lQ2hlY2sgY2hlY2sodGFnLmNfc3RyKCkpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1ldGhvZE5hbWUgPSBnZXRJQXVkaW9Qb2xpY3lTZXJ2aWNlU3RhdGlzdGljcygpLmdldE1ldGhvZEZvckNvZGUoY29kZSk7CisgICAgbWVkaWF1dGlsczo6VGltZUNoZWNrIGNoZWNrKAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoIklBdWRpb1BvbGljeVNlcnZpY2U6OiIpLmFwcGVuZChtZXRob2ROYW1lKSwKKyAgICAgICAgICAgIFtjb2RlLCBtZXRob2ROYW1lXShib29sIHRpbWVvdXQsIGZsb2F0IGVsYXBzZWRNcykgeyAvLyBkb24ndCBtb3ZlIG1ldGhvZE5hbWUuCisgICAgICAgIGlmICh0aW1lb3V0KSB7CisgICAgICAgICAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0oQU1FRElBTUVUUklDU19LRVlfQVVESU9fUE9MSUNZKQorICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfVElNRU9VVCkKKyAgICAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9NRVRIT0RDT0RFLCBpbnQ2NF90KGNvZGUpKQorICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX01FVEhPRE5BTUUsIG1ldGhvZE5hbWUuY19zdHIoKSkKKyAgICAgICAgICAgICAgICAucmVjb3JkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRJQXVkaW9Qb2xpY3lTZXJ2aWNlU3RhdGlzdGljcygpLmV2ZW50KGNvZGUsIGVsYXBzZWRNcyk7CisgICAgICAgIH0KKyAgICB9KTsKIAogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIFNIRUxMX0NPTU1BTkRfVFJBTlNBQ1RJT046IHsKQEAgLTEzMjUsNiArMTY2MCw5IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZFByb2NBZGpDaGFuZ2VkKHVpZF90IHVpZCBfX3VudXNlZCkgeworfQorCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCkgewogICAgIHVwZGF0ZVVpZCgmbU92ZXJyaWRlVWlkcywgdWlkLCBhY3RpdmUsIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLCBpbnNlcnQpOwogfQpAQCAtMTQwMSw2ICsxNzM5LDY2IEBACiAgICAgcmV0dXJuIGl0ICE9IG1BMTF5VWlkcy5lbmQoKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6c2V0QXNzaXN0YW50VWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpIHsKKyAgICBtQXNzaXN0YW50VWlkcy5jbGVhcigpOworICAgIG1Bc3Npc3RhbnRVaWRzID0gdWlkczsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNBc3Npc3RhbnRVaWQodWlkX3QgdWlkKQoreworICAgIHN0ZDo6dmVjdG9yPHVpZF90Pjo6aXRlcmF0b3IgaXQgPSBmaW5kKG1Bc3Npc3RhbnRVaWRzLmJlZ2luKCksIG1Bc3Npc3RhbnRVaWRzLmVuZCgpLCB1aWQpOworICAgIHJldHVybiBpdCAhPSBtQXNzaXN0YW50VWlkcy5lbmQoKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6c2V0QWN0aXZlQXNzaXN0YW50VWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIGFjdGl2ZVVpZHMpIHsKKyAgICBtQWN0aXZlQXNzaXN0YW50VWlkcyA9IGFjdGl2ZVVpZHM7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzQWN0aXZlQXNzaXN0YW50VWlkKHVpZF90IHVpZCkKK3sKKyAgICBzdGQ6OnZlY3Rvcjx1aWRfdD46Oml0ZXJhdG9yIGl0ID0gZmluZChtQWN0aXZlQXNzaXN0YW50VWlkcy5iZWdpbigpLAorICAgICAgICAgICAgbUFjdGl2ZUFzc2lzdGFudFVpZHMuZW5kKCksIHVpZCk7CisgICAgcmV0dXJuIGl0ICE9IG1BY3RpdmVBc3Npc3RhbnRVaWRzLmVuZCgpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpkdW1wSW50ZXJuYWxzKGludCBmZCkgeworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworICAgIGF1dG8gYXBwZW5kVWlkc1RvUmVzdWx0ID0gWyZdKGNvbnN0IGNoYXIqIHRpdGxlLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4gJnVpZHMpIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHQlczogXG4iLCB0aXRsZSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgICAgICBpZiAodWlkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0Tm8gVUlEcyBwcmVzZW50LlxuIik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZ1aWQgOiB1aWRzKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0VUlEWyVkXT0lZFxuIiwgY291bnRlcisrLCB1aWQpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICB9CisgICAgfTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlVJRCBQb2xpY3k6XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRtT2JzZXJ2ZXJSZWdpc3RlcmVkPSVzXG4iLChtT2JzZXJ2ZXJSZWdpc3RlcmVkID8gIlRydWUiOiJGYWxzZSIpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICBhcHBlbmRVaWRzVG9SZXN1bHQoIkFzc2lzdGFudHMgVUlEcyIsIG1Bc3Npc3RhbnRVaWRzKTsKKyAgICBhcHBlbmRVaWRzVG9SZXN1bHQoIkFjdGl2ZSBBc3Npc3RhbnRzIFVJRHMiLCBtQWN0aXZlQXNzaXN0YW50VWlkcyk7CisKKyAgICBhcHBlbmRVaWRzVG9SZXN1bHQoIkFjY2Vzc2liaWxpdHkgVUlEcyIsIG1BMTF5VWlkcyk7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdElucHV0IE1ldGhvZCBTZXJ2aWNlIFVJRD0lZFxuIiwgbUN1cnJlbnRJbWVVaWQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0SXMgUlRUIEVuYWJsZWQ6ICVzXG4iLCAobVJ0dEVuYWJsZWQgPyAiVHJ1ZSI6IkZhbHNlIikpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworfQorCiAvLyAtLS0tLS0tLS0tLSAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5U2VydmljZSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6cmVnaXN0ZXJTZWxmKCkgewogICAgIFNlbnNvclByaXZhY3lNYW5hZ2VyIHNwbTsKQEAgLTE0MDgsMTQgKzE4MDYsNiBAQAogICAgIHNwbS5hZGRTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpyZWdpc3RlclNlbGZGb3JNaWNyb3Bob25lT25seShpbnQgdXNlcklkKSB7Ci0gICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOwotICAgIG1TZW5zb3JQcml2YWN5RW5hYmxlZCA9IHNwbS5pc0luZGl2aWR1YWxTZW5zb3JQcml2YWN5RW5hYmxlZCh1c2VySWQsCi0gICAgICAgICAgICBTZW5zb3JQcml2YWN5TWFuYWdlcjo6SU5ESVZJRFVBTF9TRU5TT1JfTUlDUk9QSE9ORSk7Ci0gICAgc3BtLmFkZEluZGl2aWR1YWxTZW5zb3JQcml2YWN5TGlzdGVuZXIodXNlcklkLAotICAgICAgICAgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXI6OklORElWSURVQUxfU0VOU09SX01JQ1JPUEhPTkUsIHRoaXMpOwotfQotCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6dW5yZWdpc3RlclNlbGYoKSB7CiAgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOwogICAgIHNwbS5yZW1vdmVTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7CkBAIC0xNDI1LDcgKzE4MTUsOCBAQAogICAgIHJldHVybiBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7CiB9CiAKLWJpbmRlcjo6U3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6b25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpIHsKK2JpbmRlcjo6U3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6b25TZW5zb3JQcml2YWN5Q2hhbmdlZCgKKyAgICBpbnQgdG9nZ2xlVHlwZSBfX3VudXNlZCwgaW50IHNlbnNvciBfX3VudXNlZCwgYm9vbCBlbmFibGVkKSB7CiAgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gZW5hYmxlZDsKICAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CiAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgewpAQCAtMTU2NywxMiArMTk1OCwxNiBAQAogICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKICAgICB7CiAgICAgICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc3ZjOworICAgICAgICBpbnQgbnVtVGltZXNCZWNhbWVFbXB0eSA9IDA7CiAgICAgICAgIHdoaWxlICghbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpICYmICFleGl0UGVuZGluZygpKSB7CiAgICAgICAgICAgICBuc2Vjc190IGN1clRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICAvLyBjb21tYW5kcyBhcmUgc29ydGVkIGJ5IGluY3JlYXNpbmcgdGltZSBzdGFtcDogZXhlY3V0ZSB0aGVtIGZyb20gaW5kZXggMCBhbmQgdXAKICAgICAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kc1swXS0+bVRpbWUgPD0gY3VyVGltZSkgewogICAgICAgICAgICAgICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG1BdWRpb0NvbW1hbmRzWzBdOwogICAgICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRzLnJlbW92ZUF0KDApOworICAgICAgICAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICsrbnVtVGltZXNCZWNhbWVFbXB0eTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUxhc3RDb21tYW5kID0gY29tbWFuZDsKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZC0+bUNvbW1hbmQpIHsKQEAgLTE3NjQsNiArMjE1OSwzOSBAQAogICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAKKyAgICAgICAgICAgICAgICBjYXNlIENIRUNLX1NQQVRJQUxJWkVSX09VVFBVVDogeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBjaGVjayBzcGF0aWFsaXplciIpOworICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PbkNoZWNrU3BhdGlhbGl6ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfQUNUSVZFX1NQQVRJQUxJWkVSX1RSQUNLUzogeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyB1cGRhdGUgc3BhdGlhbGl6ZXIgdHJhY2tzIik7CisgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uVXBkYXRlQWN0aXZlU3BhdGlhbGl6ZXJUcmFja3MoKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBWT0xfUkFOR0VfSU5JVF9SRVFVRVNUOiB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHZvbHVtZSByYW5nZSBpbml0IHJlcXVlc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvT25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSB1bmtub3duIGNvbW1hbmQgJWQiLCBjb21tYW5kLT5tQ29tbWFuZCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTc4Nyw4ICsyMjE1LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIHJlbGVhc2UgZGVsYXllZCBjb21tYW5kcyB3YWtlIGxvY2sgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5Ci0gICAgICAgIGlmIChtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gcmVsZWFzZSBkZWxheWVkIGNvbW1hbmRzIHdha2UgbG9jayBhcyBtYW55IHRpbWVzIGFzIHdlIG1hZGUgdGhlICBxdWV1ZSBpcworICAgICAgICAvLyBlbXB0eSBkdXJpbmcgcG9wcGluZy4KKyAgICAgICAgd2hpbGUgKG51bVRpbWVzQmVjYW1lRW1wdHktLSkgewogICAgICAgICAgICAgcmVsZWFzZV93YWtlX2xvY2sobU5hbWUuc3RyaW5nKCkpOwogICAgICAgICB9CiAKQEAgLTE4MTcsMTAgKzIyNDYsNiBAQAogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9Db21tYW5kVGhyZWFkICVwIER1bXBcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQogICAgIGNvbnN0IGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobUxvY2spOwogICAgIGlmICghbG9ja2VkKSB7CiAgICAgICAgIFN0cmluZzggcmVzdWx0MihrQ21kRGVhZGxvY2tlZFN0cmluZyk7CkBAIC0yMDc1LDYgKzI1MDAsMzAgQEAKICAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6Y2hlY2tTcGF0aWFsaXplckNvbW1hbmQoKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD5jb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gQ0hFQ0tfU1BBVElBTElaRVJfT1VUUFVUOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgY2hlY2sgc3BhdGlhbGl6ZXIiKTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dXBkYXRlQWN0aXZlU3BhdGlhbGl6ZXJUcmFja3NDb21tYW5kKCkKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+Y29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFVQREFURV9BQ1RJVkVfU1BBVElBTElaRVJfVFJBQ0tTOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdXBkYXRlIGFjdGl2ZSBzcGF0aWFsaXplciB0cmFja3MiKTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9sUmFuZ2VJbml0UmVxQ29tbWFuZCgpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBWT0xfUkFOR0VfSU5JVF9SRVFVRVNUOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdm9sdW1lIHJhbmdlIGluaXQgcmVxdWVzdCIpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c2VuZENvbW1hbmQoc3A8QXVkaW9Db21tYW5kPiYgY29tbWFuZCwgaW50IGRlbGF5TXMpCiB7CiAgICAgewpAQCAtMjI0Miw2ICsyNjkxLDEwIEBACiAKICAgICAgICAgfSBicmVhazsKIAorICAgICAgICBjYXNlIFZPTF9SQU5HRV9JTklUX1JFUVVFU1Q6IHsKKyAgICAgICAgICAgIC8vIGNvbW1hbmQgbWF5IGNvbWUgZnJvbSBkaWZmZXJlbnQgcmVxdWVzdHMsIGRvIG5vdCBmaWx0ZXIKKyAgICAgICAgfSBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IDdlZDgyOWMuLjNhMDhjZjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBBTkRST0lEX0FVRElPUE9MSUNZU0VSVklDRV9ICiAKICNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9HZXRTcGF0aWFsaXplclJlc3BvbnNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZF9hbm5vdGF0aW9ucy5oPgogI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgpAQCAtMzgsNiArMzksNyBAQAogI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5RWZmZWN0cy5oIgogI2luY2x1ZGUgIkNhcHR1cmVTdGF0ZU5vdGlmaWVyLmgiCisjaW5jbHVkZSAiU3BhdGlhbGl6ZXIuaCIKICNpbmNsdWRlIDxBdWRpb1BvbGljeUludGVyZmFjZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5TZW5zb3JQcml2YWN5TGlzdGVuZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgpAQCAtNDcsMTMgKzQ5LDI1IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIGNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db25maWc7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Db25maWdCYXNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRGV2aWNlRGVzY3JpcHRpb247Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXREZXNjcmlwdGlvbjsKK3VzaW5nIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb01vZGU7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Tb3VyY2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9TdHJlYW1UeXBlOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvVXNhZ2U7Cit1c2luZyBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9VdWlkOwordXNpbmcgbWVkaWE6OmF1ZGlvOjpjb21tb246OkludDsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2UgOgogICAgIHB1YmxpYyBCaW5kZXJTZXJ2aWNlPEF1ZGlvUG9saWN5U2VydmljZT4sCiAgICAgcHVibGljIG1lZGlhOjpCbkF1ZGlvUG9saWN5U2VydmljZSwKLSAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKKyAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsCisgICAgcHVibGljIFNwYXRpYWxpemVyUG9saWN5Q2FsbGJhY2sKIHsKICAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxBdWRpb1BvbGljeVNlcnZpY2U+OwogCkBAIC02OCwyNSArODIsMjQgQEAKICAgICAvLwogICAgIGJpbmRlcjo6U3RhdHVzIG9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvRGV2aWNlJiBkZXZpY2UsCiAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSBzdGF0ZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VOYW1lLAotICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGVuY29kZWRGb3JtYXQpIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBtZWRpYTo6QXVkaW9EZXZpY2UmIGRldmljZSwKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb1BvcnQmIHBvcnQsCisgICAgICAgICAgICBjb25zdCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uJiBlbmNvZGVkRm9ybWF0KSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3QgQXVkaW9EZXZpY2UmIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9saWN5RGV2aWNlU3RhdGUqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKAotICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvRGV2aWNlJiBkZXZpY2UsCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZSYgZGV2aWNlLAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZU5hbWUsCi0gICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgZW5jb2RlZEZvcm1hdCkgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgc2V0UGhvbmVTdGF0ZShtZWRpYTo6QXVkaW9Nb2RlIHN0YXRlLCBpbnQzMl90IHVpZCkgb3ZlcnJpZGU7CisgICAgICAgICAgICBjb25zdCBBdWRpb0Zvcm1hdERlc2NyaXB0aW9uJiBlbmNvZGVkRm9ybWF0KSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRQaG9uZVN0YXRlKEF1ZGlvTW9kZSBzdGF0ZSwgaW50MzJfdCB1aWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldEZvcmNlVXNlKG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlVXNlIHVzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZyBjb25maWcpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIGdldEZvcmNlVXNlKG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlVXNlIHVzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBnZXRPdXRwdXQobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0T3V0cHV0KEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHIsIGludDMyX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUgJmF0dHJpYnV0aW9uU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnJiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0NvbmZpZyYgY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmbGFncywgaW50MzJfdCBzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkdldE91dHB1dEZvckF0dHJSZXNwb25zZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBzdGFydE91dHB1dChpbnQzMl90IHBvcnRJZCkgb3ZlcnJpZGU7CkBAIC05NSwzMiArMTA4LDM1IEBACiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ciwgaW50MzJfdCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByaWlkLCBpbnQzMl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUgJmF0dHJpYnV0aW9uU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Db25maWdCYXNlJiBjb25maWcsIGludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvQ29uZmlnQmFzZSYgY29uZmlnLCBpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpHZXRJbnB1dEZvckF0dHJSZXNwb25zZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBzdGFydElucHV0KGludDMyX3QgcG9ydElkKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBzdG9wSW5wdXQoaW50MzJfdCBwb3J0SWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlbGVhc2VJbnB1dChpbnQzMl90IHBvcnRJZCkgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgaW5pdFN0cmVhbVZvbHVtZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBpbmRleE1pbiwKKyAgICBiaW5kZXI6OlN0YXR1cyBpbml0U3RyZWFtVm9sdW1lKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3QgaW5kZXhNaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4TWF4KSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBzZXRTdHJlYW1Wb2x1bWVJbmRleChtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBkZXZpY2UsCisgICAgYmluZGVyOjpTdGF0dXMgc2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleCkgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgZ2V0U3RyZWFtVm9sdW1lSW5kZXgobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3QgZGV2aWNlLAorICAgIGJpbmRlcjo6U3RhdHVzIGdldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXZpY2UsIGludDMyX3QgaW5kZXgpIG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXgpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGV2aWNlLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZURlc2NyaXB0aW9uJiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGdldFN0cmF0ZWd5Rm9yU3RyZWFtKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLAorICAgIGJpbmRlcjo6U3RhdHVzIGdldFN0cmF0ZWd5Rm9yU3RyZWFtKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBnZXREZXZpY2VzRm9yU3RyZWFtKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBnZXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzRXgmIGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvclZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yJiBkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlZ2lzdGVyRWZmZWN0KGNvbnN0IG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yJiBkZXNjLCBpbnQzMl90IGlvLCBpbnQzMl90IHN0cmF0ZWd5LApAQCAtMTI4LDQyICsxNDQsNDIgQEAKICAgICBiaW5kZXI6OlN0YXR1cyB1bnJlZ2lzdGVyRWZmZWN0KGludDMyX3QgaWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldEVmZmVjdEVuYWJsZWQoaW50MzJfdCBpZCwgYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBtb3ZlRWZmZWN0c1RvSW8oY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGlkcywgaW50MzJfdCBpbykgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgaXNTdHJlYW1BY3RpdmUobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3QgaW5QYXN0TXMsCisgICAgYmluZGVyOjpTdGF0dXMgaXNTdHJlYW1BY3RpdmUoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBpblBhc3RNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3QgaW5QYXN0TXMsCisgICAgYmluZGVyOjpTdGF0dXMgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQzMl90IGluUGFzdE1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBpc1NvdXJjZUFjdGl2ZShtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIHNvdXJjZSwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBpc1NvdXJjZUFjdGl2ZShBdWRpb1NvdXJjZSBzb3VyY2UsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgcXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZygKLSAgICAgICAgICAgIGludDMyX3QgYXVkaW9TZXNzaW9uLCBtZWRpYTo6SW50KiBjb3VudCwKKyAgICAgICAgICAgIGludDMyX3QgYXVkaW9TZXNzaW9uLCBJbnQqIGNvdW50LAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkVmZmVjdERlc2NyaXB0b3I+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdHlwZSwKKyAgICBiaW5kZXI6OlN0YXR1cyBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IEF1ZGlvVXVpZCYgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdXVpZCwgaW50MzJfdCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9VdWlkJiB1dWlkLCBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Tb3VyY2Ugc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIHR5cGUsCisgICAgYmluZGVyOjpTdGF0dXMgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBBdWRpb1V1aWQmIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIHV1aWQsIGludDMyX3QgcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Vc2FnZSB1c2FnZSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvVXVpZCYgdXVpZCwgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVXNhZ2UgdXNhZ2UsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChpbnQzMl90IGlkKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGludDMyX3QgaWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldFN1cHBvcnRlZFN5c3RlbVVzYWdlcygKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1VzYWdlPiYgc3lzdGVtVXNhZ2VzKSBvdmVycmlkZTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvVXNhZ2U+JiBzeXN0ZW1Vc2FnZXMpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KGludDMyX3QgdWlkLCBpbnQzMl90IGNhcHR1cmVQb2xpY3kpIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGdldE9mZmxvYWRTdXBwb3J0KGNvbnN0IG1lZGlhOjpBdWRpb09mZmxvYWRJbmZvJiBpbmZvLAorICAgIGJpbmRlcjo6U3RhdHVzIGdldE9mZmxvYWRTdXBwb3J0KGNvbnN0IG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb09mZmxvYWRJbmZvJiBpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb09mZmxvYWRNb2RlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UmIGNvbmZpZywKKyAgICBiaW5kZXI6OlN0YXR1cyBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBBdWRpb0NvbmZpZ0Jhc2UmIGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBsaXN0QXVkaW9Qb3J0cyhtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlLCBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpJbnQqIGNvdW50LCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qb3J0PiogcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50KiBjb3VudCwgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUG9ydD4qIHBvcnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgZ2V0QXVkaW9Qb3J0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIHBvcnQsCisgICAgYmluZGVyOjpTdGF0dXMgZ2V0QXVkaW9Qb3J0KGludCBwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvcnQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBtZWRpYTo6QXVkaW9QYXRjaCYgcGF0Y2gsIGludDMyX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyByZWxlYXNlQXVkaW9QYXRjaChpbnQzMl90IGhhbmRsZSkgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgbGlzdEF1ZGlvUGF0Y2hlcyhtZWRpYTo6SW50KiBjb3VudCwgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUGF0Y2g+KiBwYXRjaGVzLAorICAgIGJpbmRlcjo6U3RhdHVzIGxpc3RBdWRpb1BhdGNoZXMoSW50KiBjb3VudCwgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUGF0Y2g+KiBwYXRjaGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBzZXRBdWRpb1BvcnRDb25maWcoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyYgY29uZmlnKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyByZWdpc3RlckNsaWVudChjb25zdCBzcDxtZWRpYTo6SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCkgb3ZlcnJpZGU7CkBAIC0xNzEsMTUgKzE4NywxNSBAQAogICAgIGJpbmRlcjo6U3RhdHVzIHNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24obWVkaWE6OlNvdW5kVHJpZ2dlclNlc3Npb24qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oaW50MzJfdCBzZXNzaW9uKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBnZXRQaG9uZVN0YXRlKG1lZGlhOjpBdWRpb01vZGUqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0UGhvbmVTdGF0ZShBdWRpb01vZGUqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9NaXg+JiBtaXhlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVnaXN0cmF0aW9uKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBzZXRVaWREZXZpY2VBZmZpbml0aWVzKGludDMyX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4mIGRldmljZXMpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlbW92ZVVpZERldmljZUFmZmluaXRpZXMoaW50MzJfdCB1aWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldFVzZXJJZERldmljZUFmZmluaXRpZXMoCiAgICAgICAgICAgICBpbnQzMl90IHVzZXJJZCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4mIGRldmljZXMpIG92ZXJyaWRlOworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+JiBkZXZpY2VzKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyByZW1vdmVVc2VySWREZXZpY2VBZmZpbml0aWVzKGludDMyX3QgdXNlcklkKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBzdGFydEF1ZGlvU291cmNlKGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWcmIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0cmlidXRlcywKQEAgLTE4NywyMiArMjAzLDI1IEBACiAgICAgYmluZGVyOjpTdGF0dXMgc3RvcEF1ZGlvU291cmNlKGludDMyX3QgcG9ydElkKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0TWFzdGVyTW9ubyhib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGdldFN0cmVhbVZvbHVtZURCKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQzMl90IGluZGV4LCBpbnQzMl90IGRldmljZSwKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRTdHJlYW1Wb2x1bWVEQihBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlRGVzY3JpcHRpb24mIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBiaW5kZXI6OlN0YXR1cyBnZXRTdXJyb3VuZEZvcm1hdHMobWVkaWE6OkludCogY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4qIGZvcm1hdHMsCisgICAgYmluZGVyOjpTdGF0dXMgZ2V0U3Vycm91bmRGb3JtYXRzKEludCogY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24+KiBmb3JtYXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxib29sPiogZm9ybWF0c0VuYWJsZWQpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIGdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzKAotICAgICAgICAgICAgbWVkaWE6OkludCogY291bnQsIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4qIGZvcm1hdHMpIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgYXVkaW9Gb3JtYXQsCisgICAgICAgICAgICBJbnQqIGNvdW50LCBzdGQ6OnZlY3RvcjxBdWRpb0Zvcm1hdERlc2NyaXB0aW9uPiogZm9ybWF0cykgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0SHdPZmZsb2FkRm9ybWF0c1N1cHBvcnRlZEZvckJsdWV0b290aE1lZGlhKAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VEZXNjcmlwdGlvbiYgZGV2aWNlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXVkaW9Gb3JtYXREZXNjcmlwdGlvbj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGNvbnN0IEF1ZGlvRm9ybWF0RGVzY3JpcHRpb24mIGF1ZGlvRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQpIG92ZXJyaWRlOwotICAgIGJpbmRlcjo6U3RhdHVzIHNldEFzc2lzdGFudFVpZChpbnQzMl90IHVpZCkgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgc2V0SG90d29yZERldGVjdGlvblNlcnZpY2VVaWQoaW50MzJfdCB1aWQpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHNldEFzc2lzdGFudFNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgdWlkcykgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0QWN0aXZlQXNzaXN0YW50U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBhY3RpdmVVaWRzKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiB1aWRzKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBzZXRDdXJyZW50SW1lVWlkKGludDMyX3QgdWlkKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgaXNVbHRyYXNvdW5kU3VwcG9ydGVkKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qcm9kdWN0U3RyYXRlZ3k+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0V4JiBhYSwKQEAgLTIxNywzNyArMjM2LDQ4IEBACiAgICAgYmluZGVyOjpTdGF0dXMgaXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZChib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldERldmljZXNSb2xlRm9yU3RyYXRlZ3koCiAgICAgICAgICAgICBpbnQzMl90IHN0cmF0ZWd5LCBtZWRpYTo6RGV2aWNlUm9sZSByb2xlLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4mIGRldmljZXMpIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3koaW50MzJfdCBzdHJhdGVneSwgbWVkaWE6OkRldmljZVJvbGUgcm9sZSkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneSgKICAgICAgICAgICAgIGludDMyX3Qgc3RyYXRlZ3ksIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGUsCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogICAgIGJpbmRlcjo6U3RhdHVzIHNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKLSAgICAgICAgICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBBdWRpb1NvdXJjZSBhdWRpb1NvdXJjZSwKICAgICAgICAgICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzKSBvdmVycmlkZTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgYWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAotICAgICAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIEF1ZGlvU291cmNlIGF1ZGlvU291cmNlLAogICAgICAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4mIGRldmljZXMpIG92ZXJyaWRlOworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2U+JiBkZXZpY2VzKSBvdmVycmlkZTsKICAgICBiaW5kZXI6OlN0YXR1cyByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCi0gICAgICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlLAorICAgICAgICAgICAgQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2UsCiAgICAgICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7Ci0gICAgYmluZGVyOjpTdGF0dXMgY2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQobWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgY2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoQXVkaW9Tb3VyY2UgYXVkaW9Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZSkgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgZ2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KAotICAgICAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIEF1ZGlvU291cmNlIGF1ZGlvU291cmNlLAogICAgICAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZSwKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAgICAgYmluZGVyOjpTdGF0dXMgcmVnaXN0ZXJTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lcigKICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJQ2FwdHVyZVN0YXRlTGlzdGVuZXI+JiBsaXN0ZW5lciwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworICAgIGJpbmRlcjo6U3RhdHVzIGdldFNwYXRpYWxpemVyKGNvbnN0IHNwPG1lZGlhOjpJTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAgICAgbWVkaWE6OkdldFNwYXRpYWxpemVyUmVzcG9uc2UqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgY2FuQmVTcGF0aWFsaXplZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8bWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsPiYgYXR0ciwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8QXVkaW9Db25maWc+JiBjb25maWcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0RldmljZT4mIGRldmljZXMsCisgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCisgICAgYmluZGVyOjpTdGF0dXMgZ2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9Db25maWcmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvRGlyZWN0TW9kZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICAgIGJpbmRlcjo6U3RhdHVzIGdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcyhjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Qcm9maWxlPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykgb3ZlcnJpZGU7CiAKICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CkBAIC0zMTMsNiArMzQzLDIzIEBACiAgICAgdm9pZCBvblJvdXRpbmdVcGRhdGVkKCk7CiAgICAgdm9pZCBkb09uUm91dGluZ1VwZGF0ZWQoKTsKIAorICAgIHZvaWQgb25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCk7CisgICAgdm9pZCBkb09uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpOworCisgICAgLyoqCisgICAgICogU3BhdGlhbGl6ZXIgU3BhdGlhbGl6ZXJQb2xpY3lDYWxsYmFjayBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBvbkNoZWNrU3BhdGlhbGl6ZXIoKSBzZW5kcyBhbiBldmVudCBvbiBtT3V0cHV0Q29tbWFuZFRocmVhZCB3aGljaCBleGVjdXRlcworICAgICAqIGRvT25DaGVja1NwYXRpYWxpemVyKCkgdG8gY2hlY2sgaWYgYSBTcGF0aWFsaXplciBvdXRwdXQgbXVzdCBiZSBvcGVuZWQgb3IgY2xvc2VkCisgICAgICogYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgYW5kIGF0dGFjaC9kZXRhY2ggdGhlIHNwYXRpYWxpemVyIGVmZmVjdCBhY2NvcmRpbmdseS4KKyAgICAgKi8KKyAgICB2b2lkIG9uQ2hlY2tTcGF0aWFsaXplcigpIG92ZXJyaWRlOworICAgIHZvaWQgb25DaGVja1NwYXRpYWxpemVyX2woKSBSRVFVSVJFUyhtTG9jayk7CisgICAgdm9pZCBkb09uQ2hlY2tTcGF0aWFsaXplcigpOworCisgICAgdm9pZCBvblVwZGF0ZUFjdGl2ZVNwYXRpYWxpemVyVHJhY2tzX2woKSBSRVFVSVJFUyhtTG9jayk7CisgICAgdm9pZCBkb09uVXBkYXRlQWN0aXZlU3BhdGlhbGl6ZXJUcmFja3MoKTsKKworCiAgICAgdm9pZCBzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQpOwpAQCAtMzUwLDggKzM5Nyw5IEBACiAgICAgYXBwX3N0YXRlX3QgYXBtU3RhdEZyb21BbVN0YXRlKGludCBhbVN0YXRlKTsKIAogICAgIGJvb2wgaXNTdXBwb3J0ZWRTeXN0ZW1Vc2FnZShhdWRpb191c2FnZV90IHVzYWdlKTsKLSAgICBzdGF0dXNfdCB2YWxpZGF0ZVVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpOwotICAgIHN0YXR1c190IHZhbGlkYXRlVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSwgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOworICAgIHN0YXR1c190IHZhbGlkYXRlVXNhZ2UoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyKTsKKyAgICBzdGF0dXNfdCB2YWxpZGF0ZVVzYWdlKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKTsKIAogICAgIHZvaWQgdXBkYXRlVWlkU3RhdGVzKCk7CiAgICAgdm9pZCB1cGRhdGVVaWRTdGF0ZXNfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKQEAgLTM3Nyw3ICs0MjUsNyBAQAogICAgIHB1YmxpYzoKICAgICAgICAgZXhwbGljaXQgVWlkUG9saWN5KHdwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSkKICAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtT2JzZXJ2ZXJSZWdpc3RlcmVkKGZhbHNlKSwKLSAgICAgICAgICAgICAgICAgIG1Bc3Npc3RhbnRVaWQoMCksIG1Ib3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZCgwKSwgbUN1cnJlbnRJbWVVaWQoMCksCisgICAgICAgICAgICAgICAgICBtQ3VycmVudEltZVVpZCgwKSwKICAgICAgICAgICAgICAgICAgIG1SdHRFbmFibGVkKGZhbHNlKSB7fQogCiAgICAgICAgIHZvaWQgcmVnaXN0ZXJTZWxmKCk7CkBAIC0zODgsMTMgKzQzNiwxMCBAQAogCiAgICAgICAgIGJvb2wgaXNVaWRBY3RpdmUodWlkX3QgdWlkKTsKICAgICAgICAgaW50IGdldFVpZFN0YXRlKHVpZF90IHVpZCk7Ci0gICAgICAgIHZvaWQgc2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkgeyBtQXNzaXN0YW50VWlkID0gdWlkOyB9OwotICAgICAgICB2b2lkIHNldEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkKHVpZF90IHVpZCkgeyBtSG90d29yZERldGVjdGlvblNlcnZpY2VVaWQgPSB1aWQ7IH0KLSAgICAgICAgYm9vbCBpc0Fzc2lzdGFudFVpZCh1aWRfdCB1aWQpIGNvbnN0IHsKLSAgICAgICAgICAgIC8vIFRoZSBIb3R3b3JkRGV0ZWN0aW9uU2VydmljZSBpcyBwYXJ0IG9mIHRoZSBBc3Npc3RhbnQgcGFja2FnZSBidXQgcnVucyB3aXRoIGEgc2VwYXJhdGUKLSAgICAgICAgICAgIC8vIChpc29sYXRlZCkgdWlkLCBzbyB3ZSBjaGVjayBmb3IgZWl0aGVyIHVpZCBoZXJlLgotICAgICAgICAgICAgcmV0dXJuIHVpZCA9PSBtQXNzaXN0YW50VWlkIHx8IHVpZCA9PSBtSG90d29yZERldGVjdGlvblNlcnZpY2VVaWQ7Ci0gICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXRBc3Npc3RhbnRVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcyk7CisgICAgICAgIGJvb2wgaXNBc3Npc3RhbnRVaWQodWlkX3QgdWlkKTsKKyAgICAgICAgdm9pZCBzZXRBY3RpdmVBc3Npc3RhbnRVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgYWN0aXZlVWlkcyk7CisgICAgICAgIGJvb2wgaXNBY3RpdmVBc3Npc3RhbnRVaWQodWlkX3QgdWlkKTsKICAgICAgICAgdm9pZCBzZXRBMTF5VWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpIHsgbUExMXlVaWRzLmNsZWFyKCk7IG1BMTF5VWlkcyA9IHVpZHM7IH0KICAgICAgICAgYm9vbCBpc0ExMXlVaWQodWlkX3QgdWlkKTsKICAgICAgICAgYm9vbCBpc0ExMXlPblRvcCgpOwpAQCAtNDA4LDcgKzQ1Myw4IEBACiAgICAgICAgIHZvaWQgb25VaWRHb25lKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCkgb3ZlcnJpZGU7CiAgICAgICAgIHZvaWQgb25VaWRJZGxlKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCkgb3ZlcnJpZGU7CiAgICAgICAgIHZvaWQgb25VaWRTdGF0ZUNoYW5nZWQodWlkX3QgdWlkLCBpbnQzMl90IHByb2NTdGF0ZSwgaW50NjRfdCBwcm9jU3RhdGVTZXEsCi0gICAgICAgICAgICAgICAgaW50MzJfdCBjYXBhYmlsaXR5KTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGNhcGFiaWxpdHkpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uVWlkUHJvY0FkakNoYW5nZWQodWlkX3QgdWlkKSBvdmVycmlkZTsKIAogICAgICAgICB2b2lkIGFkZE92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUpIHsgdXBkYXRlT3ZlcnJpZGVVaWQodWlkLCBhY3RpdmUsIHRydWUpOyB9CiAgICAgICAgIHZvaWQgcmVtb3ZlT3ZlcnJpZGVVaWQodWlkX3QgdWlkKSB7IHVwZGF0ZU92ZXJyaWRlVWlkKHVpZCwgZmFsc2UsIGZhbHNlKTsgfQpAQCAtNDE2LDYgKzQ2Miw4IEBACiAgICAgICAgIHZvaWQgdXBkYXRlVWlkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+ICp1aWRzLAogICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBpbnQgc3RhdGUsIGJvb2wgaW5zZXJ0KTsKIAorICAgICAgICB2b2lkIGR1bXBJbnRlcm5hbHMoaW50IGZkKTsKKwogICAgICBwcml2YXRlOgogICAgICAgICB2b2lkIG5vdGlmeVNlcnZpY2UoKTsKICAgICAgICAgdm9pZCB1cGRhdGVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCk7CkBAIC00MjksOCArNDc3LDggQEAKICAgICAgICAgYm9vbCBtT2JzZXJ2ZXJSZWdpc3RlcmVkID0gZmFsc2U7CiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+IG1PdmVycmlkZVVpZHM7CiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+IG1DYWNoZWRVaWRzOwotICAgICAgICB1aWRfdCBtQXNzaXN0YW50VWlkID0gLTE7Ci0gICAgICAgIHVpZF90IG1Ib3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZCA9IC0xOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gbUFzc2lzdGFudFVpZHM7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpZF90PiBtQWN0aXZlQXNzaXN0YW50VWlkczsKICAgICAgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+IG1BMTF5VWlkczsKICAgICAgICAgdWlkX3QgbUN1cnJlbnRJbWVVaWQgPSAtMTsKICAgICAgICAgYm9vbCBtUnR0RW5hYmxlZCA9IGZhbHNlOwpAQCAtNDQ2LDEyICs0OTQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgOiBtU2VydmljZShzZXJ2aWNlKSB7fQogCiAgICAgICAgICAgICB2b2lkIHJlZ2lzdGVyU2VsZigpOwotICAgICAgICAgICAgdm9pZCByZWdpc3RlclNlbGZGb3JNaWNyb3Bob25lT25seShpbnQgdXNlcklkKTsKICAgICAgICAgICAgIHZvaWQgdW5yZWdpc3RlclNlbGYoKTsKIAogICAgICAgICAgICAgYm9vbCBpc1NlbnNvclByaXZhY3lFbmFibGVkKCk7CiAKLSAgICAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKTsKKyAgICAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoaW50IHRvZ2dsZVR5cGUsIGludCBzZW5zb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCk7CiAKICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgIHdwPEF1ZGlvUG9saWN5U2VydmljZT4gbVNlcnZpY2U7CkBAIC00ODMsNyArNTMxLDEwIEBACiAgICAgICAgICAgICBTRVRfRUZGRUNUX1NVU1BFTkRFRCwKICAgICAgICAgICAgIEFVRElPX01PRFVMRVNfVVBEQVRFLAogICAgICAgICAgICAgUk9VVElOR19VUERBVEVELAotICAgICAgICAgICAgVVBEQVRFX1VJRF9TVEFURVMKKyAgICAgICAgICAgIFVQREFURV9VSURfU1RBVEVTLAorICAgICAgICAgICAgQ0hFQ0tfU1BBVElBTElaRVJfT1VUUFVULCAvLyB2ZXJpZnkgaWYgc3BhdGlhbGl6ZXIgZWZmZWN0IHNob3VsZCBiZSBjcmVhdGVkIG9yIG1vdmVkCisgICAgICAgICAgICBVUERBVEVfQUNUSVZFX1NQQVRJQUxJWkVSX1RSQUNLUywgLy8gVXBkYXRlIGFjdGl2ZSB0cmFjayBjb3VudHMgb24gc3BhbGlhbGl6ZXIgb3V0cHV0CisgICAgICAgICAgICBWT0xfUkFOR0VfSU5JVF9SRVFVRVNULCAvLyByZXF1ZXN0IHRvIHJlc2V0IHRoZSB2b2x1bWUgcmFuZ2UgaW5kaWNlcwogICAgICAgICB9OwogCiAgICAgICAgIEF1ZGlvQ29tbWFuZFRocmVhZCAoU3RyaW5nOCBuYW1lLCBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKTsKQEAgLTUzMiw2ICs1ODMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgYXVkaW9Nb2R1bGVzVXBkYXRlQ29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByb3V0aW5nQ2hhbmdlZENvbW1hbmQoKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlVWlkU3RhdGVzQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBjaGVja1NwYXRpYWxpemVyQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVBY3RpdmVTcGF0aWFsaXplclRyYWNrc0NvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgdm9sUmFuZ2VJbml0UmVxQ29tbWFuZCgpOworCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChBdWRpb0NvbW1hbmQgKmNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAgICAgcHJpdmF0ZToKICAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kRGF0YTsKQEAgLTY2Nyw3ICs3MjIsOCBAQAogICAgICAgICAvLyBUaGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgY2FuIGNoZWNrIGlmIHRoZSBwcm9wb3NlZCBwYXJhbWV0ZXJzIGFyZSBzdWl0YWJsZSBvciBub3QgYW5kIGFjdCBhY2NvcmRpbmdseS4KICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpoYWxDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90ICptaXhlckNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3JCYXNlPiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKQEAgLTc1Miw2ICs4MDgsOCBAQAogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBvblJvdXRpbmdVcGRhdGVkKCk7CiAKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpOworCiAgICAgICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgdXNlKTsKIAogICAgICAgICB2b2lkIHNldFNvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSkgb3ZlcnJpZGU7CkBAIC03NjEsNiArODE5LDkgQEAKICAgICAgICAgc3RhdHVzX3QgdXBkYXRlU2Vjb25kYXJ5T3V0cHV0cygKICAgICAgICAgICAgICAgICBjb25zdCBUcmFja1NlY29uZGFyeU91dHB1dHNNYXAmIHRyYWNrU2Vjb25kYXJ5T3V0cHV0cykgb3ZlcnJpZGU7CiAKKyAgICAgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGVkU3RhdGUoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQsIGJvb2wgY29ubmVjdGVkKSBvdmVycmlkZTsKKwogICAgICBwcml2YXRlOgogICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2UgKm1BdWRpb1BvbGljeVNlcnZpY2U7CiAgICAgfTsKQEAgLTc4OCw2ICs4NDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uUm91dGluZ1VwZGF0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25Wb2x1bWVSYW5nZUluaXRSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCk7CiAKQEAgLTkxNywxMiArOTc5LDE0IEBACiAgICAgICAgICAgICAgICAgQXVkaW9QbGF5YmFja0NsaWVudChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbywgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3BhdGlhbGl6ZWQpIDoKICAgICAgICAgICAgICAgICAgICAgQXVkaW9DbGllbnQoYXR0cmlidXRlcywgaW8sIGF0dHJpYnV0aW9uU291cmNlLCBzZXNzaW9uLCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCksIHN0cmVhbShzdHJlYW0pIHt9CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCksIHN0cmVhbShzdHJlYW0pLCBpc1NwYXRpYWxpemVkKGlzU3BhdGlhbGl6ZWQpICB7fQogICAgICAgICAgICAgICAgIH5BdWRpb1BsYXliYWNrQ2xpZW50KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCiAgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtOworICAgICAgICBjb25zdCBib29sIGlzU3BhdGlhbGl6ZWQ7CiAgICAgfTsKIAogICAgIHZvaWQgZ2V0UGxheWJhY2tDbGllbnRBbmRFZmZlY3RzKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLApAQCAtOTUyLDYgKzEwMTYsMTcgQEAKICAgICB2b2lkIGxvYWRBdWRpb1BvbGljeU1hbmFnZXIoKTsKICAgICB2b2lkIHVubG9hZEF1ZGlvUG9saWN5TWFuYWdlcigpOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBhdWRpbyB0cmFja3Mgb24gdGhlIHNwZWNpZmllZCBvdXRwdXQgbWl4ZXIuCisgICAgICogVGhlIHF1ZXJ5IGNhbiBiZSBzcGVjaWZpZWQgdG8gb25seSBpbmNsdWRlIHNwYXRpYWxpemVkIGF1ZGlvIHRyYWNrcyBvciBjb25zaWRlcgorICAgICAqIGFsbCB0cmFja3MuCisgICAgICogQHBhcmFtIG91dHB1dCB0aGUgSS9PIGhhbmRsZSBvZiB0aGUgb3V0cHV0IG1peGVyIHRvIGNvbnNpZGVyCisgICAgICogQHBhcmFtIHNwYXRpYWxpemVkT25seSB0cnVlIGlmIG9ubHkgc3BhdGlhbGl6ZWQgdHJhY2tzIHNob3VsZCBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGFjdGl2ZSB0cmFja3MuCisgICAgICovCisgICAgc2l6ZV90IGNvdW50QWN0aXZlQ2xpZW50c09uT3V0cHV0X2woCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYm9vbCBzcGF0aWFsaXplZE9ubHkgPSB0cnVlKSBSRVFVSVJFUyhtTG9jayk7CisKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOyAgICAvLyBwcmV2ZW50cyBjb25jdXJyZW50IGFjY2VzcyB0byBBdWRpb1BvbGljeSBtYW5hZ2VyIGZ1bmN0aW9ucyBjaGFuZ2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBjb25uZWN0aW9uIHN0YXRlICBvciByb3V0aW5nCiAgICAgLy8gTm90ZTogbG9jayBhY3F1aXNpdGlvbiBvcmRlciBpcyBhbHdheXMgbUxvY2sgPiBtRWZmZWN0c0xvY2s6CkBAIC05ODUsNiArMTA2MCw4IEBACiAKICAgICBDYXB0dXJlU3RhdGVOb3RpZmllciBtQ2FwdHVyZVN0YXRlTm90aWZpZXI7CiAKKyAgICBzcDxTcGF0aWFsaXplcj4gbVNwYXRpYWxpemVyOworCiAgICAgdm9pZCAqbUxpYnJhcnlIYW5kbGUgPSBudWxscHRyOwogICAgIENyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlckluc3RhbmNlIG1DcmVhdGVBdWRpb1BvbGljeU1hbmFnZXI7CiAgICAgRGVzdHJveUF1ZGlvUG9saWN5TWFuYWdlckluc3RhbmNlIG1EZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VyOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL1NwYXRpYWxpemVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTk5YTc2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplci5jcHAKQEAgLTAsMCArMSw4NjQgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworI2RlZmluZSBMT0dfVEFHICJTcGF0aWFsaXplciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9maXhlZGZmdC5oPgorI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9zZW5zb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9TaG1lbUNvbXBhdC5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorCisjaW5jbHVkZSAiU3BhdGlhbGl6ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBhaWRsX3V0aWxzOjpzdGF0dXNURnJvbUJpbmRlclN0YXR1czsKK3VzaW5nIGFpZGxfdXRpbHM6OmJpbmRlclN0YXR1c0Zyb21TdGF0dXNUOwordXNpbmcgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKK3VzaW5nIGJpbmRlcjo6U3RhdHVzOwordXNpbmcgbWVkaWE6OkhlYWRUcmFja2luZ01vZGU7Cit1c2luZyBtZWRpYTo6UG9zZTNmOwordXNpbmcgbWVkaWE6OlNwYXRpYWxpemF0aW9uTGV2ZWw7Cit1c2luZyBtZWRpYTo6U3BhdGlhbGl6YXRpb25Nb2RlOwordXNpbmcgbWVkaWE6OlNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZTsKK3VzaW5nIG1lZGlhOjpTZW5zb3JQb3NlUHJvdmlkZXI7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworI2RlZmluZSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyh4KSBcCisgICAgKHsgYXV0byBfdG1wID0gKHgpOyBcCisgICAgICAgaWYgKCFfdG1wLm9rKCkpIHJldHVybiBhaWRsX3V0aWxzOjpiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChfdG1wLmVycm9yKCkpOyBcCisgICAgICAgc3RkOjptb3ZlKF90bXAudmFsdWUoKSk7IH0pCisKK2F1ZGlvX2NoYW5uZWxfbWFza190IGdldE1heENoYW5uZWxNYXNrKHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiBtYXNrcykgeworICAgIHVpbnQzMl90IG1heENvdW50ID0gMDsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtYXhNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIGZvciAoYXV0byBtYXNrIDogbWFza3MpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1hc2spOworICAgICAgICBpZiAoY291bnQgPiBtYXhDb3VudCkgeworICAgICAgICAgICAgbWF4TWFzayA9IG1hc2s7CisgICAgICAgICAgICBtYXhDb3VudCA9IGNvdW50OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtYXhNYXNrOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgU3BhdGlhbGl6ZXI6OkVuZ2luZUNhbGxiYWNrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CitwdWJsaWM6CisgICAgRW5naW5lQ2FsbGJhY2tIYW5kbGVyKHdwPFNwYXRpYWxpemVyPiBzcGF0aWFsaXplcikKKyAgICAgICAgICAgIDogbVNwYXRpYWxpemVyKHNwYXRpYWxpemVyKSB7CisgICAgfQorCisgICAgZW51bSB7CisgICAgICAgIC8vIERldmljZSBzdGF0ZSBjYWxsYmFja3MKKyAgICAgICAga1doYXRPbkZyYW1lc1Byb2Nlc3NlZCwgICAgLy8gQXVkaW9FZmZlY3Q6OkVWRU5UX0ZSQU1FU19QUk9DRVNTRUQKKyAgICAgICAga1doYXRPbkhlYWRUb1N0YWdlUG9zZSwgICAgLy8gU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6TGlzdGVuZXI6Om9uSGVhZFRvU3RhZ2VQb3NlCisgICAgICAgIGtXaGF0T25BY3R1YWxNb2RlQ2hhbmdlLCAgIC8vIFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6Okxpc3RlbmVyOjpvbkFjdHVhbE1vZGVDaGFuZ2UKKyAgICB9OworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqa051bUZyYW1lc0tleSA9ICJudW1GcmFtZXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqa01vZGVLZXkgPSAibW9kZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICprVHJhbnNsYXRpb24wS2V5ID0gInRyYW5zbGF0aW9uMCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICprVHJhbnNsYXRpb24xS2V5ID0gInRyYW5zbGF0aW9uMSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICprVHJhbnNsYXRpb24yS2V5ID0gInRyYW5zbGF0aW9uMiI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICprUm90YXRpb24wS2V5ID0gInJvdGF0aW9uMCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICprUm90YXRpb24xS2V5ID0gInJvdGF0aW9uMSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICprUm90YXRpb24yS2V5ID0gInJvdGF0aW9uMiI7CisKKyAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZSB7CisgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgIGNhc2Uga1doYXRPbkZyYW1lc1Byb2Nlc3NlZDogeworICAgICAgICAgICAgICAgIHNwPFNwYXRpYWxpemVyPiBzcGF0aWFsaXplciA9IG1TcGF0aWFsaXplci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHNwYXRpYWxpemVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBDYW5ub3QgcHJvbW90ZSBzcGF0aWFsaXplciIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbnVtRnJhbWVzOworICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoa051bUZyYW1lc0tleSwgJm51bUZyYW1lcykpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBudW0gZnJhbWVzISIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobnVtRnJhbWVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzcGF0aWFsaXplci0+Y2FsY3VsYXRlSGVhZFBvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1doYXRPbkhlYWRUb1N0YWdlUG9zZTogeworICAgICAgICAgICAgICAgIHNwPFNwYXRpYWxpemVyPiBzcGF0aWFsaXplciA9IG1TcGF0aWFsaXplci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHNwYXRpYWxpemVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBDYW5ub3QgcHJvbW90ZSBzcGF0aWFsaXplciIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gaGVhZFRvU3RhZ2Uoc0hlYWRQb3NlS2V5cy5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IHNIZWFkUG9zZUtleXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRGbG9hdChzSGVhZFBvc2VLZXlzW2ldLCAmaGVhZFRvU3RhZ2VbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGtUcmFuc2xhdGlvbjBLZXkhIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwYXRpYWxpemVyLT5vbkhlYWRUb1N0YWdlUG9zZU1zZyhoZWFkVG9TdGFnZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1doYXRPbkFjdHVhbE1vZGVDaGFuZ2U6IHsKKyAgICAgICAgICAgICAgICBzcDxTcGF0aWFsaXplcj4gc3BhdGlhbGl6ZXIgPSBtU3BhdGlhbGl6ZXIucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChzcGF0aWFsaXplciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogQ2Fubm90IHByb21vdGUgc3BhdGlhbGl6ZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG1vZGU7CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihFbmdpbmVDYWxsYmFja0hhbmRsZXI6OmtNb2RlS2V5LCAmbW9kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBhY3R1YWxNb2RlISIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcGF0aWFsaXplci0+b25BY3R1YWxNb2RlQ2hhbmdlTXNnKHN0YXRpY19jYXN0PEhlYWRUcmFja2luZ01vZGU+KG1vZGUpKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbnZhbGlkIGNhbGxiYWNrIG1lc3NhZ2UgJWQiLCBtc2ctPndoYXQoKSk7CisgICAgICAgIH0KKyAgICB9Citwcml2YXRlOgorICAgIHdwPFNwYXRpYWxpemVyPiBtU3BhdGlhbGl6ZXI7Cit9OworCitjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IFNwYXRpYWxpemVyOjpzSGVhZFBvc2VLZXlzID0geworICAgIFNwYXRpYWxpemVyOjpFbmdpbmVDYWxsYmFja0hhbmRsZXI6OmtUcmFuc2xhdGlvbjBLZXksCisgICAgU3BhdGlhbGl6ZXI6OkVuZ2luZUNhbGxiYWNrSGFuZGxlcjo6a1RyYW5zbGF0aW9uMUtleSwKKyAgICBTcGF0aWFsaXplcjo6RW5naW5lQ2FsbGJhY2tIYW5kbGVyOjprVHJhbnNsYXRpb24yS2V5LAorICAgIFNwYXRpYWxpemVyOjpFbmdpbmVDYWxsYmFja0hhbmRsZXI6OmtSb3RhdGlvbjBLZXksCisgICAgU3BhdGlhbGl6ZXI6OkVuZ2luZUNhbGxiYWNrSGFuZGxlcjo6a1JvdGF0aW9uMUtleSwKKyAgICBTcGF0aWFsaXplcjo6RW5naW5lQ2FsbGJhY2tIYW5kbGVyOjprUm90YXRpb24yS2V5LAorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzcDxTcGF0aWFsaXplcj4gU3BhdGlhbGl6ZXI6OmNyZWF0ZShTcGF0aWFsaXplclBvbGljeUNhbGxiYWNrICpjYWxsYmFjaykgeworICAgIHNwPFNwYXRpYWxpemVyPiBzcGF0aWFsaXplcjsKKworICAgIHNwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBlZmZlY3RzRmFjdG9yeUhhbCA9IEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKTsKKyAgICBpZiAoZWZmZWN0c0ZhY3RvcnlIYWwgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXMgZmFpbGVkIHRvIGNyZWF0ZSBlZmZlY3QgZmFjdG9yeSBpbnRlcmZhY2UiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBzcGF0aWFsaXplcjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBkZXNjcmlwdG9yczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgZWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3JzKEZYX0lJRF9TUEFUSUFMSVpFUiwgJmRlc2NyaXB0b3JzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dXKCIlcyBmYWlsZWQgdG8gZ2V0IHNwYXRpYWxpemVyIGRlc2NyaXB0b3IsIGVycm9yICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzcGF0aWFsaXplcjsKKyAgICB9CisgICAgQUxPR19BU1NFUlQoIWRlc2NyaXB0b3JzLmVtcHR5KCksCisgICAgICAgICAgICAiJXMgZ2V0RGVzY3JpcHRvcnMoKSByZXR1cm5lZCBubyBlcnJvciBidXQgZW1wdHkgbGlzdCIsIF9fZnVuY19fKTsKKworICAgIC8vVE9ETzogZ2V0IHN1cHBvcnRlZCBzcGF0aWFsaXphdGlvbiBtb2RlcyBmcm9tIEZYIGVuZ2luZSBvciBkZXNjcmlwdG9yCisKKyAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdDsKKyAgICBzdGF0dXMgPSBlZmZlY3RzRmFjdG9yeUhhbC0+Y3JlYXRlRWZmZWN0KCZkZXNjcmlwdG9yc1swXS51dWlkLCBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSwKKyAgICAgICAgICAgIEFVRElPX0lPX0hBTkRMRV9OT05FLCBBVURJT19QT1JUX0hBTkRMRV9OT05FLCAmZWZmZWN0KTsKKyAgICBBTE9HSSgiJXMgRlggY3JlYXRlIHN0YXR1cyAlZCBlZmZlY3QgJXAiLCBfX2Z1bmNfXywgc3RhdHVzLCBlZmZlY3QuZ2V0KCkpOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBlZmZlY3QgIT0gbnVsbHB0cikgeworICAgICAgICBzcGF0aWFsaXplciA9IG5ldyBTcGF0aWFsaXplcihkZXNjcmlwdG9yc1swXSwgY2FsbGJhY2spOworICAgICAgICBpZiAoc3BhdGlhbGl6ZXItPmxvYWRFbmdpbmVDb25maWd1cmF0aW9uKGVmZmVjdCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHNwYXRpYWxpemVyLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3BhdGlhbGl6ZXI7Cit9CisKK1NwYXRpYWxpemVyOjpTcGF0aWFsaXplcihlZmZlY3RfZGVzY3JpcHRvcl90IGVuZ2luZURlc2NyaXB0b3IsIFNwYXRpYWxpemVyUG9saWN5Q2FsbGJhY2sqIGNhbGxiYWNrKQorICAgIDogbUVuZ2luZURlc2NyaXB0b3IoZW5naW5lRGVzY3JpcHRvciksCisgICAgICBtUG9saWN5Q2FsbGJhY2soY2FsbGJhY2spIHsKKyAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXI6Om9uRmlyc3RSZWYoKSB7CisgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1Mb29wZXItPnNldE5hbWUoIlNwYXRpYWxpemVyLWxvb3BlciIpOworICAgIG1Mb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgLypydW5PbkNhbGxpbmdUaHJlYWQqL2ZhbHNlLAorICAgICAgICAgICAgLypjYW5DYWxsSmF2YSovICAgICAgIGZhbHNlLAorICAgICAgICAgICAgUFJJT1JJVFlfQVVESU8pOworCisgICAgbUhhbmRsZXIgPSBuZXcgRW5naW5lQ2FsbGJhY2tIYW5kbGVyKHRoaXMpOworICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7Cit9CisKK1NwYXRpYWxpemVyOjp+U3BhdGlhbGl6ZXIoKSB7CisgICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOworICAgIGlmIChtTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUxvb3Blci0+c3RvcCgpOworICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisgICAgfQorICAgIG1Mb29wZXIuY2xlYXIoKTsKKyAgICBtSGFuZGxlci5jbGVhcigpOworfQorCitzdGF0dXNfdCBTcGF0aWFsaXplcjo6bG9hZEVuZ2luZUNvbmZpZ3VyYXRpb24oc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CisKKyAgICBzdGQ6OnZlY3Rvcjxib29sPiBzdXBwb3J0c0hlYWRUcmFja2luZzsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRIYWxQYXJhbWV0ZXI8ZmFsc2U+KGVmZmVjdCwgU1BBVElBTElaRVJfUEFSQU1fSEVBRFRSQUNLSU5HX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1cHBvcnRzSGVhZFRyYWNraW5nKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dXKCIlczogY2Fubm90IGdldCBTUEFUSUFMSVpFUl9QQVJBTV9IRUFEVFJBQ0tJTkdfU1VQUE9SVEVEIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBtU3VwcG9ydHNIZWFkVHJhY2tpbmcgPSBzdXBwb3J0c0hlYWRUcmFja2luZ1swXTsKKworICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpTcGF0aWFsaXphdGlvbkxldmVsPiBzcGF0aWFsaXphdGlvbkxldmVsczsKKyAgICBzdGF0dXMgPSBnZXRIYWxQYXJhbWV0ZXI8dHJ1ZT4oZWZmZWN0LCBTUEFUSUFMSVpFUl9QQVJBTV9TVVBQT1JURURfTEVWRUxTLAorICAgICAgICAgICAgJnNwYXRpYWxpemF0aW9uTGV2ZWxzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dXKCIlczogY2Fubm90IGdldCBTUEFUSUFMSVpFUl9QQVJBTV9TVVBQT1JURURfTEVWRUxTIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBib29sIG5vbmVMZXZlbEZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBhY3RpdmVMZXZlbEZvdW5kID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvIHNwYXRpYWxpemF0aW9uTGV2ZWwgOiBzcGF0aWFsaXphdGlvbkxldmVscykgeworICAgICAgICBpZiAoIWFpZGxfdXRpbHM6OmlzVmFsaWRFbnVtKHNwYXRpYWxpemF0aW9uTGV2ZWwpKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IGlnbm9yaW5nIHNwYXRpYWxpemF0aW9uTGV2ZWw6JWQiLCBfX2Z1bmNfXywgKGludClzcGF0aWFsaXphdGlvbkxldmVsKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzcGF0aWFsaXphdGlvbkxldmVsID09IG1lZGlhOjpTcGF0aWFsaXphdGlvbkxldmVsOjpOT05FKSB7CisgICAgICAgICAgICBub25lTGV2ZWxGb3VuZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhY3RpdmVMZXZlbEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyB3ZSBkb24ndCBkZXRlY3QgZHVwbGljYXRlcy4KKyAgICAgICAgbUxldmVscy5lbXBsYWNlX2JhY2soc3BhdGlhbGl6YXRpb25MZXZlbCk7CisgICAgfQorICAgIGlmICghbm9uZUxldmVsRm91bmQgfHwgIWFjdGl2ZUxldmVsRm91bmQpIHsKKyAgICAgICAgQUxPR1coIiVzOiBTUEFUSUFMSVpFUl9QQVJBTV9TVVBQT1JURURfTEVWRUxTIG11c3QgaW5jbHVkZSBOT05FIgorICAgICAgICAgICAgICAgICIgYW5kIGFub3RoZXIgdmFsaWQgbGV2ZWwiLCAgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpTcGF0aWFsaXphdGlvbk1vZGU+IHNwYXRpYWxpemF0aW9uTW9kZXM7CisgICAgc3RhdHVzID0gZ2V0SGFsUGFyYW1ldGVyPHRydWU+KGVmZmVjdCwgU1BBVElBTElaRVJfUEFSQU1fU1VQUE9SVEVEX1NQQVRJQUxJWkFUSU9OX01PREVTLAorICAgICAgICAgICAgJnNwYXRpYWxpemF0aW9uTW9kZXMpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIiVzOiBjYW5ub3QgZ2V0IFNQQVRJQUxJWkVSX1BBUkFNX1NVUFBPUlRFRF9TUEFUSUFMSVpBVElPTl9NT0RFUyIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvIHNwYXRpYWxpemF0aW9uTW9kZSA6IHNwYXRpYWxpemF0aW9uTW9kZXMpIHsKKyAgICAgICAgaWYgKCFhaWRsX3V0aWxzOjppc1ZhbGlkRW51bShzcGF0aWFsaXphdGlvbk1vZGUpKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IGlnbm9yaW5nIHNwYXRpYWxpemF0aW9uTW9kZTolZCIsIF9fZnVuY19fLCAoaW50KXNwYXRpYWxpemF0aW9uTW9kZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyB3ZSBkb24ndCBkZXRlY3QgZHVwbGljYXRlcy4KKyAgICAgICAgbVNwYXRpYWxpemF0aW9uTW9kZXMuZW1wbGFjZV9iYWNrKHNwYXRpYWxpemF0aW9uTW9kZSk7CisgICAgfQorICAgIGlmIChtU3BhdGlhbGl6YXRpb25Nb2Rlcy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCIlczogU1BBVElBTElaRVJfUEFSQU1fU1VQUE9SVEVEX1NQQVRJQUxJWkFUSU9OX01PREVTIHJlcG9ydHMgZW1wdHkiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IGNoYW5uZWxNYXNrczsKKyAgICBzdGF0dXMgPSBnZXRIYWxQYXJhbWV0ZXI8dHJ1ZT4oZWZmZWN0LCBTUEFUSUFMSVpFUl9QQVJBTV9TVVBQT1JURURfQ0hBTk5FTF9NQVNLUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsTWFza3MpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIiVzOiBjYW5ub3QgZ2V0IFNQQVRJQUxJWkVSX1BBUkFNX1NVUFBPUlRFRF9DSEFOTkVMX01BU0tTIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gY2hhbm5lbE1hc2sgOiBjaGFubmVsTWFza3MpIHsKKyAgICAgICAgaWYgKCFhdWRpb19pc19jaGFubmVsX21hc2tfc3BhdGlhbGl6ZWQoY2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IGlnbm9yaW5nIGNoYW5uZWxNYXNrOiUjeCIsIF9fZnVuY19fLCBjaGFubmVsTWFzayk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyB3ZSBkb24ndCBkZXRlY3QgZHVwbGljYXRlcy4KKyAgICAgICAgbUNoYW5uZWxNYXNrcy5lbXBsYWNlX2JhY2soY2hhbm5lbE1hc2spOworICAgIH0KKyAgICBpZiAobUNoYW5uZWxNYXNrcy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCIlczogU1BBVElBTElaRVJfUEFSQU1fU1VQUE9SVEVEX0NIQU5ORUxfTUFTS1MgcmVwb3J0cyBlbXB0eSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDdXJyZW50bHkgd2UgZXhwb3NlIG9ubHkgUkVMQVRJVkVfV09STEQuCisgICAgLy8gVGhpcyBpcyBhIGxpbWl0YXRpb24gb2YgdGhlIGhlYWQgdHJhY2tpbmcgbGlicmFyeSBiYXNlZCBvbiBhIFVYIGNob2ljZS4KKyAgICBtSGVhZFRyYWNraW5nTW9kZXMucHVzaF9iYWNrKFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZTo6RElTQUJMRUQpOworICAgIGlmIChtU3VwcG9ydHNIZWFkVHJhY2tpbmcpIHsKKyAgICAgICAgbUhlYWRUcmFja2luZ01vZGVzLnB1c2hfYmFjayhTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGU6OlJFTEFUSVZFX1dPUkxEKTsKKyAgICB9CisgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKG1NZXRyaWNzSWQpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfQ1JFQVRFKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9DSEFOTkVMTUFTSywgKGludDMyX3QpZ2V0TWF4Q2hhbm5lbE1hc2sobUNoYW5uZWxNYXNrcykpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0xFVkVMUywgYWlkbF91dGlsczo6ZW51bXNUb1N0cmluZyhtTGV2ZWxzKSkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfTU9ERVMsIGFpZGxfdXRpbHM6OmVudW1zVG9TdHJpbmcobVNwYXRpYWxpemF0aW9uTW9kZXMpKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9IRUFEVFJBQ0tJTkdNT0RFUywgYWlkbF91dGlsczo6ZW51bXNUb1N0cmluZyhtSGVhZFRyYWNraW5nTW9kZXMpKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVMsIChpbnQzMl90KXN0YXR1cykKKyAgICAgICAgLnJlY29yZCgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyoqIEdldHMgdGhlIGNoYW5uZWwgbWFzaywgc2FtcGxpbmcgcmF0ZSBhbmQgZm9ybWF0IHNldCBmb3IgdGhlIHNwYXRpYWxpemVyIGlucHV0LiAqLworYXVkaW9fY29uZmlnX2Jhc2VfdCBTcGF0aWFsaXplcjo6Z2V0QXVkaW9JbkNvbmZpZygpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcgPSBBVURJT19DT05GSUdfQkFTRV9JTklUSUFMSVpFUjsKKyAgICAvLyBGb3Igbm93IHVzZSBoaWdoZXN0IHN1cHBvcnRlZCBjaGFubmVsIGNvdW50CisgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGdldE1heENoYW5uZWxNYXNrKG1DaGFubmVsTWFza3MpOworICAgIHJldHVybiBjb25maWc7Cit9CisKK3N0YXR1c190IFNwYXRpYWxpemVyOjpyZWdpc3RlckNhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxtZWRpYTo6SU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2s+JiBjYWxsYmFjaykgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBiaW5kZXItPmxpbmtUb0RlYXRoKHRoaXMpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbVNwYXRpYWxpemVyQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisgICAgQUxPR1YoIiVzIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Cit2b2lkIFNwYXRpYWxpemVyOjpiaW5kZXJEaWVkKF9fdW51c2VkIGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pIHsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgbUxldmVsID0gU3BhdGlhbGl6YXRpb25MZXZlbDo6Tk9ORTsKKyAgICAgICAgbVNwYXRpYWxpemVyQ2FsbGJhY2suY2xlYXIoKTsKKyAgICB9CisgICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOworICAgIG1Qb2xpY3lDYWxsYmFjay0+b25DaGVja1NwYXRpYWxpemVyKCk7Cit9CisKKy8vIElTcGF0aWFsaXplcgorU3RhdHVzIFNwYXRpYWxpemVyOjpnZXRTdXBwb3J0ZWRMZXZlbHMoc3RkOjp2ZWN0b3I8U3BhdGlhbGl6YXRpb25MZXZlbD4gKmxldmVscykgeworICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKKyAgICBpZiAobGV2ZWxzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgfQorICAgIC8vIFNwYXRpYWxpemF0aW9uTGV2ZWw6Ok5PTkUgaXMgYWxyZWFkeSByZXF1aXJlZCBmcm9tIHRoZSBlZmZlY3Qgb3Igd2UgZG9uJ3QgbG9hZCBpdC4KKyAgICBsZXZlbHMtPmluc2VydChsZXZlbHMtPmVuZCgpLCBtTGV2ZWxzLmJlZ2luKCksIG1MZXZlbHMuZW5kKCkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBTcGF0aWFsaXplcjo6c2V0TGV2ZWwoU3BhdGlhbGl6YXRpb25MZXZlbCBsZXZlbCkgeworICAgIEFMT0dWKCIlcyBsZXZlbCAlZCIsIF9fZnVuY19fLCAoaW50KWxldmVsKTsKKyAgICBpZiAobGV2ZWwgIT0gU3BhdGlhbGl6YXRpb25MZXZlbDo6Tk9ORQorICAgICAgICAgICAgJiYgc3RkOjpmaW5kKG1MZXZlbHMuYmVnaW4oKSwgbUxldmVscy5lbmQoKSwgbGV2ZWwpID09IG1MZXZlbHMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgfQorICAgIHNwPG1lZGlhOjpJTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjaz4gY2FsbGJhY2s7CisgICAgYm9vbCBsZXZlbENoYW5nZWQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgbGV2ZWxDaGFuZ2VkID0gbUxldmVsICE9IGxldmVsOworICAgICAgICBtTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgY2FsbGJhY2sgPSBtU3BhdGlhbGl6ZXJDYWxsYmFjazsKKworICAgICAgICBpZiAobGV2ZWxDaGFuZ2VkICYmIG1FbmdpbmUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2hlY2tFbmdpbmVTdGF0ZV9sKCk7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tTZW5zb3JzU3RhdGVfbCgpOworICAgIH0KKworICAgIGlmIChsZXZlbENoYW5nZWQpIHsKKyAgICAgICAgbVBvbGljeUNhbGxiYWNrLT5vbkNoZWNrU3BhdGlhbGl6ZXIoKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbkxldmVsQ2hhbmdlZChsZXZlbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFNwYXRpYWxpemVyOjpnZXRMZXZlbChTcGF0aWFsaXphdGlvbkxldmVsICpsZXZlbCkgeworICAgIGlmIChsZXZlbCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisgICAgKmxldmVsID0gbUxldmVsOworICAgIEFMT0dWKCIlcyBsZXZlbCAlZCIsIF9fZnVuY19fLCAoaW50KSpsZXZlbCk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFNwYXRpYWxpemVyOjppc0hlYWRUcmFja2luZ1N1cHBvcnRlZChib29sICpzdXBwb3J0cykgeworICAgIEFMT0dWKCIlcyBtU3VwcG9ydHNIZWFkVHJhY2tpbmcgJWQiLCBfX2Z1bmNfXywgbVN1cHBvcnRzSGVhZFRyYWNraW5nKTsKKyAgICBpZiAoc3VwcG9ydHMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOworICAgICpzdXBwb3J0cyA9IG1TdXBwb3J0c0hlYWRUcmFja2luZzsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgU3BhdGlhbGl6ZXI6OmdldFN1cHBvcnRlZEhlYWRUcmFja2luZ01vZGVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGU+KiBtb2RlcykgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CisgICAgaWYgKG1vZGVzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgfQorICAgIG1vZGVzLT5pbnNlcnQobW9kZXMtPmVuZCgpLCBtSGVhZFRyYWNraW5nTW9kZXMuYmVnaW4oKSwgbUhlYWRUcmFja2luZ01vZGVzLmVuZCgpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgU3BhdGlhbGl6ZXI6OnNldERlc2lyZWRIZWFkVHJhY2tpbmdNb2RlKFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZSBtb2RlKSB7CisgICAgQUxPR1YoIiVzIG1vZGUgJWQiLCBfX2Z1bmNfXywgKGludCltb2RlKTsKKworICAgIGlmICghbVN1cHBvcnRzSGVhZFRyYWNraW5nKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChJTlZBTElEX09QRVJBVElPTik7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgY2FzZSBTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGU6Ok9USEVSOgorICAgICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgICAgIGNhc2UgU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlOjpESVNBQkxFRDoKKyAgICAgICAgICAgIG1EZXNpcmVkSGVhZFRyYWNraW5nTW9kZSA9IEhlYWRUcmFja2luZ01vZGU6OlNUQVRJQzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZTo6UkVMQVRJVkVfV09STEQ6CisgICAgICAgICAgICBtRGVzaXJlZEhlYWRUcmFja2luZ01vZGUgPSBIZWFkVHJhY2tpbmdNb2RlOjpXT1JMRF9SRUxBVElWRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZTo6UkVMQVRJVkVfU0NSRUVOOgorICAgICAgICAgICAgbURlc2lyZWRIZWFkVHJhY2tpbmdNb2RlID0gSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2hlY2tQb3NlQ29udHJvbGxlcl9sKCk7CisgICAgY2hlY2tTZW5zb3JzU3RhdGVfbCgpOworCisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFNwYXRpYWxpemVyOjpnZXRBY3R1YWxIZWFkVHJhY2tpbmdNb2RlKFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZSAqbW9kZSkgeworICAgIGlmIChtb2RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICAqbW9kZSA9IG1BY3R1YWxIZWFkVHJhY2tpbmdNb2RlOworICAgIEFMT0dWKCIlcyBtb2RlICVkIiwgX19mdW5jX18sIChpbnQpKm1vZGUpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBTcGF0aWFsaXplcjo6cmVjZW50ZXJIZWFkVHJhY2tlcigpIHsKKyAgICBpZiAoIW1TdXBwb3J0c0hlYWRUcmFja2luZykgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoSU5WQUxJRF9PUEVSQVRJT04pOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisgICAgaWYgKG1Qb3NlQ29udHJvbGxlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1Qb3NlQ29udHJvbGxlci0+cmVjZW50ZXIoKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFNwYXRpYWxpemVyOjpzZXRHbG9iYWxUcmFuc2Zvcm0oY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBzY3JlZW5Ub1N0YWdlKSB7CisgICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOworICAgIGlmICghbVN1cHBvcnRzSGVhZFRyYWNraW5nKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChJTlZBTElEX09QRVJBVElPTik7CisgICAgfQorICAgIHN0ZDo6b3B0aW9uYWw8UG9zZTNmPiBtYXliZVBvc2UgPSBQb3NlM2Y6OmZyb21WZWN0b3Ioc2NyZWVuVG9TdGFnZSk7CisgICAgaWYgKCFtYXliZVBvc2UuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgQUxPR1coIkludmFsaWQgc2NyZWVuVG9TdGFnZSB2ZWN0b3IuIik7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisgICAgaWYgKG1Qb3NlQ29udHJvbGxlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1Qb3NlQ29udHJvbGxlci0+c2V0U2NyZWVuVG9TdGFnZVBvc2UobWF5YmVQb3NlLnZhbHVlKCkpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgU3BhdGlhbGl6ZXI6OnJlbGVhc2UoKSB7CisgICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOworICAgIGJvb2wgbGV2ZWxDaGFuZ2VkID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtU3BhdGlhbGl6ZXJDYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICB9CisKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIobVNwYXRpYWxpemVyQ2FsbGJhY2spOworICAgICAgICBiaW5kZXItPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgIG1TcGF0aWFsaXplckNhbGxiYWNrLmNsZWFyKCk7CisKKyAgICAgICAgbGV2ZWxDaGFuZ2VkID0gbUxldmVsICE9IFNwYXRpYWxpemF0aW9uTGV2ZWw6Ok5PTkU7CisgICAgICAgIG1MZXZlbCA9IFNwYXRpYWxpemF0aW9uTGV2ZWw6Ok5PTkU7CisgICAgfQorCisgICAgaWYgKGxldmVsQ2hhbmdlZCkgeworICAgICAgICBtUG9saWN5Q2FsbGJhY2stPm9uQ2hlY2tTcGF0aWFsaXplcigpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgU3BhdGlhbGl6ZXI6OnNldEhlYWRTZW5zb3IoaW50IHNlbnNvckhhbmRsZSkgeworICAgIEFMT0dWKCIlcyBzZW5zb3JIYW5kbGUgJWQiLCBfX2Z1bmNfXywgc2Vuc29ySGFuZGxlKTsKKyAgICBpZiAoIW1TdXBwb3J0c0hlYWRUcmFja2luZykgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoSU5WQUxJRF9PUEVSQVRJT04pOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisgICAgaWYgKG1IZWFkU2Vuc29yICE9IHNlbnNvckhhbmRsZSkgeworICAgICAgICBtSGVhZFNlbnNvciA9IHNlbnNvckhhbmRsZTsKKyAgICAgICAgY2hlY2tQb3NlQ29udHJvbGxlcl9sKCk7CisgICAgICAgIGNoZWNrU2Vuc29yc1N0YXRlX2woKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFNwYXRpYWxpemVyOjpzZXRTY3JlZW5TZW5zb3IoaW50IHNlbnNvckhhbmRsZSkgeworICAgIEFMT0dWKCIlcyBzZW5zb3JIYW5kbGUgJWQiLCBfX2Z1bmNfXywgc2Vuc29ySGFuZGxlKTsKKyAgICBpZiAoIW1TdXBwb3J0c0hlYWRUcmFja2luZykgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoSU5WQUxJRF9PUEVSQVRJT04pOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisgICAgaWYgKG1TY3JlZW5TZW5zb3IgIT0gc2Vuc29ySGFuZGxlKSB7CisgICAgICAgIG1TY3JlZW5TZW5zb3IgPSBzZW5zb3JIYW5kbGU7CisgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGEgbmV3IG1ldGhvZCBzZXRIZWFkQW5kU2NyZWVuU2Vuc29yKCkKKyAgICAgICAgLy8gYmVjYXVzZSB3ZSBnZW5lcmFsbHkgc2V0IGJvdGggYXQgdGhlIHNhbWUgdGltZS4KKyAgICAgICAgLy8gVGhpcyB3aWxsIGF2b2lkIGR1cGxpY2F0ZWQgd29yayBhbmQgcmVjZW50ZXJpbmcuCisgICAgICAgIGNoZWNrU2Vuc29yc1N0YXRlX2woKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFNwYXRpYWxpemVyOjpzZXREaXNwbGF5T3JpZW50YXRpb24oZmxvYXQgcGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSkgeworICAgIEFMT0dWKCIlcyBwaHlzaWNhbFRvTG9naWNhbEFuZ2xlICVmIiwgX19mdW5jX18sIHBoeXNpY2FsVG9Mb2dpY2FsQW5nbGUpOworICAgIGlmICghbVN1cHBvcnRzSGVhZFRyYWNraW5nKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChJTlZBTElEX09QRVJBVElPTik7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICBtRGlzcGxheU9yaWVudGF0aW9uID0gcGh5c2ljYWxUb0xvZ2ljYWxBbmdsZTsKKyAgICBpZiAobVBvc2VDb250cm9sbGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVBvc2VDb250cm9sbGVyLT5zZXREaXNwbGF5T3JpZW50YXRpb24obURpc3BsYXlPcmllbnRhdGlvbik7CisgICAgfQorICAgIGlmIChtRW5naW5lICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2V0RWZmZWN0UGFyYW1ldGVyX2woCisgICAgICAgICAgICBTUEFUSUFMSVpFUl9QQVJBTV9ESVNQTEFZX09SSUVOVEFUSU9OLCBzdGQ6OnZlY3RvcjxmbG9hdD57cGh5c2ljYWxUb0xvZ2ljYWxBbmdsZX0pOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgU3BhdGlhbGl6ZXI6OnNldEhpbmdlQW5nbGUoZmxvYXQgaGluZ2VBbmdsZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMgaGluZ2VBbmdsZSAlZiIsIF9fZnVuY19fLCBoaW5nZUFuZ2xlKTsKKyAgICBpZiAobUVuZ2luZSAhPSBudWxscHRyKSB7CisgICAgICAgIHNldEVmZmVjdFBhcmFtZXRlcl9sKFNQQVRJQUxJWkVSX1BBUkFNX0hJTkdFX0FOR0xFLCBzdGQ6OnZlY3RvcjxmbG9hdD57aGluZ2VBbmdsZX0pOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgU3BhdGlhbGl6ZXI6OmdldFN1cHBvcnRlZE1vZGVzKHN0ZDo6dmVjdG9yPFNwYXRpYWxpemF0aW9uTW9kZT4gKm1vZGVzKSB7CisgICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOworICAgIGlmIChtb2RlcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KKyAgICAqbW9kZXMgPSBtU3BhdGlhbGl6YXRpb25Nb2RlczsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgU3BhdGlhbGl6ZXI6OnJlZ2lzdGVySGVhZFRyYWNraW5nQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdDYWxsYmFjaz4mIGNhbGxiYWNrKSB7CisgICAgQUxPR1YoIiVzIGNhbGxiYWNrICVwIiwgX19mdW5jX18sIGNhbGxiYWNrLmdldCgpKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisgICAgaWYgKCFtU3VwcG9ydHNIZWFkVHJhY2tpbmcpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICB9CisgICAgbUhlYWRUcmFja2luZ0NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFNwYXRpYWxpemVyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIHZhbHVlKSB7CisgICAgQUxPR1YoIiVzIGtleSAlZCIsIF9fZnVuY19fLCBrZXkpOworICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICBpZiAobUVuZ2luZSAhPSBudWxscHRyKSB7CisgICAgICAgIHN0YXR1cyA9IHNldEVmZmVjdFBhcmFtZXRlcl9sKGtleSwgdmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1Qoc3RhdHVzKTsKK30KKworU3RhdHVzIFNwYXRpYWxpemVyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gKnZhbHVlKSB7CisgICAgQUxPR1YoIiVzIGtleSAlZCB2YWx1ZSBzaXplICVkIiwgX19mdW5jX18sIGtleSwKKyAgICAgICAgICAodmFsdWUgIT0gbnVsbHB0ciA/IChpbnQpdmFsdWUtPnNpemUoKSA6IC0xKSk7CisgICAgaWYgKHZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICBpZiAobUVuZ2luZSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlcyBrZXkgJWQgbUVuZ2luZSAlcCIsIF9fZnVuY19fLCBrZXksIG1FbmdpbmUuZ2V0KCkpOworICAgICAgICBzdGF0dXMgPSBnZXRFZmZlY3RQYXJhbWV0ZXJfbChrZXksIHZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKHN0YXR1cyk7Cit9CisKK1N0YXR1cyBTcGF0aWFsaXplcjo6Z2V0T3V0cHV0KGludCAqb3V0cHV0KSB7CisgICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOworICAgIGlmIChvdXRwdXQgPT0gbnVsbHB0cikgeworICAgICAgICBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisgICAgKm91dHB1dCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QobU91dHB1dCkpOworICAgIEFMT0dWKCIlcyBnb3Qgb3V0cHV0ICVkIiwgX19mdW5jX18sICpvdXRwdXQpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKKy8vIFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6Okxpc3RlbmVyCit2b2lkIFNwYXRpYWxpemVyOjpvbkhlYWRUb1N0YWdlUG9zZShjb25zdCBQb3NlM2YmIGhlYWRUb1N0YWdlKSB7CisgICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIW1TdXBwb3J0c0hlYWRUcmFja2luZywKKyAgICAgICAgICAgICJvbkhlYWRUb1N0YWdlUG9zZSgpIGNhbGxlZCB3aXRoIG5vIGhlYWQgdHJhY2tpbmcgc3VwcG9ydCEiKTsKKworICAgIGF1dG8gdmVjID0gaGVhZFRvU3RhZ2UudG9WZWN0b3IoKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHZlYy5zaXplKCkgIT0gc0hlYWRQb3NlS2V5cy5zaXplKCksCisgICAgICAgICAgICAiJXMgaW52YWxpZCBoZWFkIHRvIHN0YWdlIHZlY3RvciBzaXplICV6dSIsIF9fZnVuY19fLCB2ZWMuc2l6ZSgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0KKyAgICAgICAgICAgIG5ldyBBTWVzc2FnZShFbmdpbmVDYWxsYmFja0hhbmRsZXI6OmtXaGF0T25IZWFkVG9TdGFnZVBvc2UsIG1IYW5kbGVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBzSGVhZFBvc2VLZXlzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1zZy0+c2V0RmxvYXQoc0hlYWRQb3NlS2V5c1tpXSwgdmVjW2ldKTsKKyAgICB9CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXI6Om9uSGVhZFRvU3RhZ2VQb3NlTXNnKGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiYgaGVhZFRvU3RhZ2UpIHsKKyAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CisgICAgc3A8bWVkaWE6OklTcGF0aWFsaXplckhlYWRUcmFja2luZ0NhbGxiYWNrPiBjYWxsYmFjazsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgY2FsbGJhY2sgPSBtSGVhZFRyYWNraW5nQ2FsbGJhY2s7CisgICAgICAgIGlmIChtRW5naW5lICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNldEVmZmVjdFBhcmFtZXRlcl9sKFNQQVRJQUxJWkVSX1BBUkFNX0hFQURfVE9fU1RBR0UsIGhlYWRUb1N0YWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIGNhbGxiYWNrLT5vbkhlYWRUb1NvdW5kU3RhZ2VQb3NlVXBkYXRlZChoZWFkVG9TdGFnZSk7CisgICAgfQorfQorCit2b2lkIFNwYXRpYWxpemVyOjpvbkFjdHVhbE1vZGVDaGFuZ2UoSGVhZFRyYWNraW5nTW9kZSBtb2RlKSB7CisgICAgQUxPR1YoIiVzKCVkKSIsIF9fZnVuY19fLCAoaW50KW1vZGUpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPQorICAgICAgICAgICAgbmV3IEFNZXNzYWdlKEVuZ2luZUNhbGxiYWNrSGFuZGxlcjo6a1doYXRPbkFjdHVhbE1vZGVDaGFuZ2UsIG1IYW5kbGVyKTsKKyAgICBtc2ctPnNldEludDMyKEVuZ2luZUNhbGxiYWNrSGFuZGxlcjo6a01vZGVLZXksIHN0YXRpY19jYXN0PGludD4obW9kZSkpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIFNwYXRpYWxpemVyOjpvbkFjdHVhbE1vZGVDaGFuZ2VNc2coSGVhZFRyYWNraW5nTW9kZSBtb2RlKSB7CisgICAgQUxPR1YoIiVzKCVkKSIsIF9fZnVuY19fLCAoaW50KSBtb2RlKTsKKyAgICBzcDxtZWRpYTo6SVNwYXRpYWxpemVySGVhZFRyYWNraW5nQ2FsbGJhY2s+IGNhbGxiYWNrOworICAgIFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZSBzcGF0aWFsaXplck1vZGU7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisgICAgICAgIGlmICghbVN1cHBvcnRzSGVhZFRyYWNraW5nKSB7CisgICAgICAgICAgICBzcGF0aWFsaXplck1vZGUgPSBTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGU6OkRJU0FCTEVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUM6CisgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxpemVyTW9kZSA9IFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZTo6RElTQUJMRUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSGVhZFRyYWNraW5nTW9kZTo6V09STERfUkVMQVRJVkU6CisgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxpemVyTW9kZSA9IFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZTo6UkVMQVRJVkVfV09STEQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSGVhZFRyYWNraW5nTW9kZTo6U0NSRUVOX1JFTEFUSVZFOgorICAgICAgICAgICAgICAgICAgICBzcGF0aWFsaXplck1vZGUgPSBTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGU6OlJFTEFUSVZFX1NDUkVFTjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBtb2RlOiAlZCIsIG1vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1BY3R1YWxIZWFkVHJhY2tpbmdNb2RlID0gc3BhdGlhbGl6ZXJNb2RlOworICAgICAgICBpZiAobUVuZ2luZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzZXRFZmZlY3RQYXJhbWV0ZXJfbChTUEFUSUFMSVpFUl9QQVJBTV9IRUFEVFJBQ0tJTkdfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZT57c3BhdGlhbGl6ZXJNb2RlfSk7CisgICAgICAgIH0KKyAgICAgICAgY2FsbGJhY2sgPSBtSGVhZFRyYWNraW5nQ2FsbGJhY2s7CisgICAgfQorICAgIGlmIChjYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIGNhbGxiYWNrLT5vbkhlYWRUcmFja2luZ01vZGVDaGFuZ2VkKHNwYXRpYWxpemVyTW9kZSk7CisgICAgfQorfQorCitzdGF0dXNfdCBTcGF0aWFsaXplcjo6YXR0YWNoT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgc2l6ZV90IG51bUFjdGl2ZVRyYWNrcykgeworICAgIGJvb2wgb3V0cHV0Q2hhbmdlZCA9IGZhbHNlOworICAgIHNwPG1lZGlhOjpJTmF0aXZlU3BhdGlhbGl6ZXJDYWxsYmFjaz4gY2FsbGJhY2s7CisKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgQUxPR1YoIiVzIG91dHB1dCAlZCBtT3V0cHV0ICVkIiwgX19mdW5jX18sIChpbnQpb3V0cHV0LCAoaW50KW1PdXRwdXQpOworICAgICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRW5naW5lID09IG51bGxwdHIsICIlcyBvdXRwdXQgc2V0IHdpdGhvdXQgRlggZW5naW5lIiwgX19mdW5jX18pOworICAgICAgICAgICAgLy8gcmVtb3ZlIEZYIGluc3RhbmNlCisgICAgICAgICAgICBtRW5naW5lLT5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIG1FbmdpbmUuY2xlYXIoKTsKKyAgICAgICAgICAgIG1Qb3NlQ29udHJvbGxlci5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIC8vIGNyZWF0ZSBGWCBpbnN0YW5jZSBvbiBvdXRwdXQKKyAgICAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZSA9IEF0dHJpYnV0aW9uU291cmNlU3RhdGUoKTsKKyAgICAgICAgbUVuZ2luZSA9IG5ldyBBdWRpb0VmZmVjdChhdHRyaWJ1dGlvblNvdXJjZSk7CisgICAgICAgIG1FbmdpbmUtPnNldChudWxscHRyLCAmbUVuZ2luZURlc2NyaXB0b3IudXVpZCwgMCwgU3BhdGlhbGl6ZXI6OmVuZ2luZUNhbGxiYWNrIC8qIGNiZiAqLywKKyAgICAgICAgICAgICAgICAgICAgIHRoaXMgLyogdXNlciAqLywgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UsIG91dHB1dCwge30gLyogZGV2aWNlICovLAorICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogcHJvYmUgKi8sIHRydWUgLyogbm90aWZ5RnJhbWVzUHJvY2Vzc2VkICovKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVuZ2luZS0+aW5pdENoZWNrKCk7CisgICAgICAgIEFMT0dWKCIlcyBtRW5naW5lIGNyZWF0ZSBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgKGludClzdGF0dXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgb3V0cHV0Q2hhbmdlZCA9IG1PdXRwdXQgIT0gb3V0cHV0OworICAgICAgICBtT3V0cHV0ID0gb3V0cHV0OworICAgICAgICBtTnVtQWN0aXZlVHJhY2tzID0gbnVtQWN0aXZlVHJhY2tzOworCisgICAgICAgIGNoZWNrRW5naW5lU3RhdGVfbCgpOworICAgICAgICBpZiAobVN1cHBvcnRzSGVhZFRyYWNraW5nKSB7CisgICAgICAgICAgICBjaGVja1Bvc2VDb250cm9sbGVyX2woKTsKKyAgICAgICAgICAgIGNoZWNrU2Vuc29yc1N0YXRlX2woKTsKKyAgICAgICAgfQorICAgICAgICBjYWxsYmFjayA9IG1TcGF0aWFsaXplckNhbGxiYWNrOworICAgIH0KKworICAgIGlmIChvdXRwdXRDaGFuZ2VkICYmIGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2FsbGJhY2stPm9uT3V0cHV0Q2hhbmdlZChvdXRwdXQpOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9faW9faGFuZGxlX3QgU3BhdGlhbGl6ZXI6OmRldGFjaE91dHB1dCgpIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICBzcDxtZWRpYTo6SU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2s+IGNhbGxiYWNrOworCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisgICAgICAgIEFMT0dWKCIlcyBtT3V0cHV0ICVkIiwgX19mdW5jX18sIChpbnQpbU91dHB1dCk7CisgICAgICAgIGlmIChtT3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0OworICAgICAgICB9CisgICAgICAgIC8vIHJlbW92ZSBGWCBpbnN0YW5jZQorICAgICAgICBtRW5naW5lLT5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgbUVuZ2luZS5jbGVhcigpOworICAgICAgICBvdXRwdXQgPSBtT3V0cHV0OworICAgICAgICBtT3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgIG1Qb3NlQ29udHJvbGxlci5yZXNldCgpOworICAgICAgICBjYWxsYmFjayA9IG1TcGF0aWFsaXplckNhbGxiYWNrOworICAgIH0KKworICAgIGlmIChjYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIGNhbGxiYWNrLT5vbk91dHB1dENoYW5nZWQoQVVESU9fSU9fSEFORExFX05PTkUpOworICAgIH0KKyAgICByZXR1cm4gb3V0cHV0OworfQorCit2b2lkIFNwYXRpYWxpemVyOjp1cGRhdGVBY3RpdmVUcmFja3Moc2l6ZV90IG51bUFjdGl2ZVRyYWNrcykgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobU51bUFjdGl2ZVRyYWNrcyAhPSBudW1BY3RpdmVUcmFja3MpIHsKKyAgICAgICAgbU51bUFjdGl2ZVRyYWNrcyA9IG51bUFjdGl2ZVRyYWNrczsKKyAgICAgICAgY2hlY2tFbmdpbmVTdGF0ZV9sKCk7CisgICAgICAgIGNoZWNrU2Vuc29yc1N0YXRlX2woKTsKKyAgICB9Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXI6OmNoZWNrU2Vuc29yc1N0YXRlX2woKSB7CisgICAgaWYgKG1TdXBwb3J0c0hlYWRUcmFja2luZyAmJiBtUG9zZUNvbnRyb2xsZXIgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAobU51bUFjdGl2ZVRyYWNrcyA+IDAgJiYgbUxldmVsICE9IFNwYXRpYWxpemF0aW9uTGV2ZWw6Ok5PTkUKKyAgICAgICAgICAgICYmIG1EZXNpcmVkSGVhZFRyYWNraW5nTW9kZSAhPSBIZWFkVHJhY2tpbmdNb2RlOjpTVEFUSUMKKyAgICAgICAgICAgICYmIG1IZWFkU2Vuc29yICE9IFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6OklOVkFMSURfU0VOU09SKSB7CisgICAgICAgICAgICBtUG9zZUNvbnRyb2xsZXItPnNldEhlYWRTZW5zb3IobUhlYWRTZW5zb3IpOworICAgICAgICAgICAgbVBvc2VDb250cm9sbGVyLT5zZXRTY3JlZW5TZW5zb3IobVNjcmVlblNlbnNvcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUG9zZUNvbnRyb2xsZXItPnNldEhlYWRTZW5zb3IoU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6SU5WQUxJRF9TRU5TT1IpOworICAgICAgICAgICAgbVBvc2VDb250cm9sbGVyLT5zZXRTY3JlZW5TZW5zb3IoU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6SU5WQUxJRF9TRU5TT1IpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFNwYXRpYWxpemVyOjpjaGVja0VuZ2luZVN0YXRlX2woKSB7CisgICAgaWYgKG1FbmdpbmUgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAobUxldmVsICE9IFNwYXRpYWxpemF0aW9uTGV2ZWw6Ok5PTkUgJiYgbU51bUFjdGl2ZVRyYWNrcyA+IDApIHsKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICBzZXRFZmZlY3RQYXJhbWV0ZXJfbChTUEFUSUFMSVpFUl9QQVJBTV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3BhdGlhbGl6YXRpb25MZXZlbD57bUxldmVsfSk7CisgICAgICAgICAgICBzZXRFZmZlY3RQYXJhbWV0ZXJfbChTUEFUSUFMSVpFUl9QQVJBTV9IRUFEVFJBQ0tJTkdfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlPnttQWN0dWFsSGVhZFRyYWNraW5nTW9kZX0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0RWZmZWN0UGFyYW1ldGVyX2woU1BBVElBTElaRVJfUEFSQU1fTEVWRUwsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNwYXRpYWxpemF0aW9uTGV2ZWw+e1NwYXRpYWxpemF0aW9uTGV2ZWw6Ok5PTkV9KTsKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFNwYXRpYWxpemVyOjpjaGVja1Bvc2VDb250cm9sbGVyX2woKSB7CisgICAgYm9vbCBpc0NvbnRyb2xsZXJOZWVkZWQgPSBtRGVzaXJlZEhlYWRUcmFja2luZ01vZGUgIT0gSGVhZFRyYWNraW5nTW9kZTo6U1RBVElDCisgICAgICAgICAgICAmJiBtSGVhZFNlbnNvciAhPSBTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpJTlZBTElEX1NFTlNPUjsKKworICAgIGlmIChpc0NvbnRyb2xsZXJOZWVkZWQgJiYgbVBvc2VDb250cm9sbGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgbVBvc2VDb250cm9sbGVyID0gc3RkOjptYWtlX3NoYXJlZDxTcGF0aWFsaXplclBvc2VDb250cm9sbGVyPigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpMaXN0ZW5lcio+KHRoaXMpLAorICAgICAgICAgICAgICAgIDEwbXMsIHN0ZDo6bnVsbG9wdCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVBvc2VDb250cm9sbGVyID09IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGNvdWxkIG5vdCBhbGxvY2F0ZSBwb3NlIGNvbnRyb2xsZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIG1Qb3NlQ29udHJvbGxlci0+c2V0RGlzcGxheU9yaWVudGF0aW9uKG1EaXNwbGF5T3JpZW50YXRpb24pOworICAgIH0gZWxzZSBpZiAoIWlzQ29udHJvbGxlck5lZWRlZCAmJiBtUG9zZUNvbnRyb2xsZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtUG9zZUNvbnRyb2xsZXIucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKG1Qb3NlQ29udHJvbGxlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1Qb3NlQ29udHJvbGxlci0+c2V0RGVzaXJlZE1vZGUobURlc2lyZWRIZWFkVHJhY2tpbmdNb2RlKTsKKyAgICB9Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXI6OmNhbGN1bGF0ZUhlYWRQb3NlKCkgeworICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisgICAgaWYgKG1Qb3NlQ29udHJvbGxlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1Qb3NlQ29udHJvbGxlci0+Y2FsY3VsYXRlQXN5bmMoKTsKKyAgICB9Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXI6OmVuZ2luZUNhbGxiYWNrKGludDMyX3QgZXZlbnQsIHZvaWQgKnVzZXIsIHZvaWQgKmluZm8pIHsKKyAgICBpZiAodXNlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU3BhdGlhbGl6ZXIqIGNvbnN0IG1lID0gcmVpbnRlcnByZXRfY2FzdDxTcGF0aWFsaXplciAqPih1c2VyKTsKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgICAgIGNhc2UgQXVkaW9FZmZlY3Q6OkVWRU5UX0ZSQU1FU19QUk9DRVNTRUQ6IHsKKyAgICAgICAgICAgIGludCBmcmFtZXMgPSBpbmZvID09IG51bGxwdHIgPyAwIDogKihpbnQqKWluZm87CisgICAgICAgICAgICBBTE9HVigiJXMgZnJhbWVzIHByb2Nlc3NlZCAlZCBmb3IgbWUgJXAiLCBfX2Z1bmNfXywgZnJhbWVzLCBtZSk7CisgICAgICAgICAgICBtZS0+cG9zdEZyYW1lc1Byb2Nlc3NlZE1zZyhmcmFtZXMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1YoIiVzIGV2ZW50ICVkIiwgX19mdW5jX18sIGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBTcGF0aWFsaXplcjo6cG9zdEZyYW1lc1Byb2Nlc3NlZE1zZyhpbnQgZnJhbWVzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9CisgICAgICAgICAgICBuZXcgQU1lc3NhZ2UoRW5naW5lQ2FsbGJhY2tIYW5kbGVyOjprV2hhdE9uRnJhbWVzUHJvY2Vzc2VkLCBtSGFuZGxlcik7CisgICAgbXNnLT5zZXRJbnQzMihFbmdpbmVDYWxsYmFja0hhbmRsZXI6OmtOdW1GcmFtZXNLZXksIGZyYW1lcyk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvU3BhdGlhbGl6ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvU3BhdGlhbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWY0YjA4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplci5oCkBAIC0wLDAgKzEsMzY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1NQQVRJQUxJWkVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9TUEFUSUFMSVpFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuRWZmZWN0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9CblNwYXRpYWxpemVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9TcGF0aWFsaXphdGlvbkxldmVsLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9TcGF0aWFsaXphdGlvbk1vZGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL1NwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZS5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X3NwYXRpYWxpemVyLmg+CisKKyNpbmNsdWRlICJTcGF0aWFsaXplclBvc2VDb250cm9sbGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorICogQSBjYWxsYmFjayBpbnRlcmZhY2UgZnJvbSB0aGUgU3BhdGlhbGl6ZXIgb2JqZWN0IG9yIGl0cyBwYXJlbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlLgorICogVGhpcyBpcyBpbXBsZW1lbnRlZCBieSB0aGUgYXVkaW8gcG9saWN5IHNlcnZpY2UgaG9zdGluZyB0aGUgU3BhdGlhbGl6ZXIgdG8gcGVyZm9ybQorICogYWN0aW9ucyBuZWVkZWQgd2hlbiBhIHN0YXRlIGNoYW5nZSBpbnNpZGUgdGhlIFNwYXRpYWxpemVyIHJlcXVpcmVzIHNvbWUgYXVkaW8gc3lzdGVtCisgKiBjaGFuZ2VzIHRoYXQgY2Fubm90IGJlIHBlcmZvcm1lZCBieSB0aGUgU3BhdGlhbGl6ZXIuIEZvciBpbnN0YW5jZSBvcGVuaW5nIG9yIGNsb3NpbmcgYQorICogc3BhdGlhbGl6ZXIgb3V0cHV0IHN0cmVhbSB3aGVuIHRoZSBzcGF0aWFsaXplciBpcyBlbmFibGVkIG9yIGRpc2FibGVkCisgKi8KK2NsYXNzIFNwYXRpYWxpemVyUG9saWN5Q2FsbGJhY2sgeworcHVibGljOgorICAgIC8qKiBDYWxsZWQgd2hlbiBhIHN0YWdlIGNoYW5nZSBvY2N1cnMgdGhhdCByZXF1aXJlcyB0aGUgcGFyZW50IGF1ZGlvIHBvbGljeSBzZXJ2aWNlIHRvIHRha2UKKyAgICAgKiBzb21lIGFjdGlvbi4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25DaGVja1NwYXRpYWxpemVyKCkgPSAwOworCisgICAgdmlydHVhbCB+U3BhdGlhbGl6ZXJQb2xpY3lDYWxsYmFjaygpID0gZGVmYXVsdDsKK307CisvKioKKyAqIFRoZSBTcGF0aWFsaXplciBjbGFzcyBpbXBsZW1lbnRzIGFsbCBmdW5jdGlvbmFsIGNvbnRyb2xsaW5nIHRoZSBtdWx0aWNoYW5uZWwgc3BhdGlhbGl6ZXIKKyAqIHdpdGggaGVhZCB0cmFja2luZyBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgbmF0aXZlIGF1ZGlvIHNlcnZpY2U6IGF1ZGlvIHBvbGljeSBhbmQgYXVkaW8gZmxpbmdlci4KKyAqIEl0IHByZXNlbnRzIGFuIEFJREwgaW50ZXJmYWNlIGF2YWlsYWJsZSB0byB0aGUgamF2YSBhdWRpbyBzZXJ2aWNlIHRvIGRpc2NvdmVyIHRoZSBhdmFpbGFiaWxpdHkKKyAqIG9mIHRoZSBmZWF0dXJlIGFuZCBvcHRpb25zLCBjb250cm9sIGl0cyBzdGF0ZSBhbmQgcmVnaXN0ZXIgYW4gYWN0aXZlIGhlYWQgdHJhY2tpbmcgc2Vuc29yLgorICogSXQgbWFpbnRhaW5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwbGF0Zm9ybSBzcGF0aWFsaXplciBhbmQgYXBwbGllcyB0aGUgc3RvcmVkIHBhcmFtZXRlcnMKKyAqIHdoZW4gdGhlIHNwYXRpYWxpemVyIGVuZ2luZSBpcyBjcmVhdGVkIGFuZCBlbmFibGVkLgorICogQmFzZWQgb24gdGhlIHJlcXVlc3RlZCBzcGF0aWFsaXplciBsZXZlbCwgaXQgd2lsbCByZXF1ZXN0IHRoZSBjcmVhdGlvbiBvZiBhIHNwZWNpYWxpemVkIG91dHB1dAorICogbWl4ZXIgdG8gdGhlIGF1ZGlvIHBvbGljeSBzZXJ2aWNlIHdoaWNoIHdpbGwgaW4gdHVybiBub3RpZnkgdGhlIFNwYXRpYWxpemVyIG9mIHRoZSBvdXRwdXQKKyAqIHN0cmVhbSBvbiB3aGljaCBhIHNwYXRpYWxpemVyIGVuZ2luZSBzaG91bGQgYmUgY3JlYXRlZCwgY29uZmlndXJlZCBhbmQgZW5hYmxlZC4KKyAqIFRoZSBzcGF0aWFsaXplciBhbHNvIGhvc3RzIHRoZSBoZWFkIHRyYWNraW5nIG1hbmFnZW1lbnQgbG9naWMuIFRoaXMgbG9naWMgcmVjZWl2ZXMgdGhlCisgKiBkZXNpcmVkIGhlYWQgdHJhY2tpbmcgbW9kZSBhbmQgc2VsZWN0ZWQgaGVhZCB0cmFja2luZyBzZW5zb3IsIHJlZ2lzdGVycyBhIHNlbnNvciBldmVudCBsaXN0ZW5lcgorICogYW5kIGRlcml2ZXMgdGhlIGNvbXBvdW5kZWQgaGVhZCBwb3NlIGluZm9ybWF0aW9uIHRvIHRoZSBzcGF0aWFsaXplciBlbmdpbmUuCisgKgorICogV29ya2Zsb3c6CisgKiAtIEluaXRpYWxpemF0aW9uOiB3aGVuIHRoZSBhdWRpbyBwb2xpY3kgc2VydmljZSBzdGFydHMsIGl0IGNoZWNrcyBpZiBhIHNwYXRpYWxpemVyIGVmZmVjdAorICogZW5naW5lIGV4aXN0cyBhbmQgaWYgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHJlcG9ydHMgYSBkZWRpY2F0ZWQgc3BhdGlhbGl6ZXIgb3V0cHV0IHByb2ZpbGUuCisgKiBJZiBib3RoIGNvbmRpdGlvbnMgYXJlIG1ldCwgYSBTcGF0aWFsaXplciBvYmplY3QgaXMgY3JlYXRlZAorICogLSBDYXBhYmlsaXRpZXMgZGlzY292ZXJ5OiBBdWRpb1NlcnZpY2Ugd2lsbCBjYWxsIEF1ZGlvU3lzdGVtOjpjYW5CZVNwYXRpYWxpemVkKCkgYW5kIGlmIHRydWUsCisgKiBhY3F1aXJlIGFuIElTcGF0aWFsaXplciBpbnRlcmZhY2Ugd2l0aCBBdWRpb1N5c3RlbTo6Z2V0U3BhdGlhbGl6ZXIoKS4gVGhpcyBpbnRlcmZhY2UKKyAqIHdpbGwgYmUgdXNlZCB0byBxdWVyeSB0aGUgaW1wbGVtZW50YXRpb24gY2FwYWJpbGl0aWVzIGFuZCBjb25maWd1cmUgdGhlIHNwYXRpYWxpemVyLgorICogLSBFbmFibGluZzogd2hlbiBJU3BhdGlhbGl6ZXI6OnNldExldmVsKCkgc2V0cyBhIGxldmVsIGRpZmZlcmVudCBmcm9tIE5PTkUgdGhlIHNwYXRpYWxpemVyCisgKiBpcyBjb25zaWRlcmVkIGVuYWJsZWQuIFRoZSBhdWRpbyBwb2xpY3kgY2FsbGJhY2sgb25DaGVja1NwYXRpYWxpemVyKCkgaXMgY2FsbGVkLiBUaGlzCisgKiB0cmlnZ2VycyBhIHJlcXVlc3QgdG8gYXVkaW8gcG9saWN5IG1hbmFnZXIgdG8gb3BlbiBhIHNwYXRpYWxpemF0aW9uIG91dHB1dCBzdHJlYW0gYW5kIGEKKyAqIHNwYXRpYWxpemVyIG1peGVyIGlzIGNyZWF0ZWQgaW4gYXVkaW8gZmxpbmdlci4gV2hlbiBhbiBvdXRwdXQgaXMgcmV0dXJuZWQgYnkgYXVkaW8gcG9saWN5CisgKiBtYW5hZ2VyLCBTcGF0aWFsaXplcjo6YXR0YWNoT3V0cHV0KCkgaXMgY2FsbGVkIHdoaWNoIGNyZWF0ZXMgYW5kIGVuYWJsZXMgdGhlIHNwYXRpYWxpemVyCisgKiBzdGFnZSBlbmdpbmUgb24gdGhlIHNwZWNpZmllZCBvdXRwdXQuCisgKiAtIERpc2FibGluZzogd2hlbiB0aGUgc3BhdGlhbGl6YXRpb24gbGV2ZWwgaXMgc2V0IHRvIE5PTkUsIHRoZSBzcGF0aWFsaXplciBpcyBjb25zaWRlcmVkCisgKiBkaXNhYmxlZC4gVGhlIGF1ZGlvIHBvbGljeSBjYWxsYmFjayBvbkNoZWNrU3BhdGlhbGl6ZXIoKSBpcyBjYWxsZWQuIFRoaXMgdHJpZ2dlcnMgYSBjYWxsCisgKiB0byBTcGF0aWFsaXplcjo6ZGV0YWNoT3V0cHV0KCkgYW5kIHRoZSBzcGF0aWFsaXplciBlbmdpbmUgaXMgcmVsZWFzZWQuIFRoZW4gYSByZXF1ZXN0IGlzCisgKiBtYWRlIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRvIHJlbGVhc2UgYW5kIGNsb3NlIHRoZSBzcGF0aWFsaXplciBvdXRwdXQgc3RyZWFtIGFuZCB0aGUKKyAqIHNwYXRpYWxpemVyIG1peGVyIHRocmVhZCBpcyBkZXN0cm95ZWQuCisgKi8KK2NsYXNzIFNwYXRpYWxpemVyIDogcHVibGljIG1lZGlhOjpCblNwYXRpYWxpemVyLAorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6TGlzdGVuZXIgeworICBwdWJsaWM6CisgICAgc3RhdGljIHNwPFNwYXRpYWxpemVyPiBjcmVhdGUoU3BhdGlhbGl6ZXJQb2xpY3lDYWxsYmFjayAqY2FsbGJhY2spOworCisgICAgICAgICAgIH5TcGF0aWFsaXplcigpIG92ZXJyaWRlOworCisgICAgLyoqIFJlZkJhc2UgKi8KKyAgICB2b2lkIG9uRmlyc3RSZWYoKTsKKworICAgIC8qKiBJU3BhdGlhbGl6ZXIsIHNlZSBJU3BhdGlhbGl6ZXIuYWlkbCAqLworICAgIGJpbmRlcjo6U3RhdHVzIHJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRTdXBwb3J0ZWRMZXZlbHMoc3RkOjp2ZWN0b3I8bWVkaWE6OlNwYXRpYWxpemF0aW9uTGV2ZWw+KiBsZXZlbHMpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHNldExldmVsKG1lZGlhOjpTcGF0aWFsaXphdGlvbkxldmVsIGxldmVsKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRMZXZlbChtZWRpYTo6U3BhdGlhbGl6YXRpb25MZXZlbCAqbGV2ZWwpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGlzSGVhZFRyYWNraW5nU3VwcG9ydGVkKGJvb2wgKnN1cHBvcnRzKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRTdXBwb3J0ZWRIZWFkVHJhY2tpbmdNb2RlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGU+KiBtb2Rlcykgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0RGVzaXJlZEhlYWRUcmFja2luZ01vZGUoCisgICAgICAgICAgICBtZWRpYTo6U3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlIG1vZGUpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGdldEFjdHVhbEhlYWRUcmFja2luZ01vZGUoCisgICAgICAgICAgICBtZWRpYTo6U3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlKiBtb2RlKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyByZWNlbnRlckhlYWRUcmFja2VyKCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0R2xvYmFsVHJhbnNmb3JtKGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiYgc2NyZWVuVG9TdGFnZSkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0SGVhZFNlbnNvcihpbnQgc2Vuc29ySGFuZGxlKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRTY3JlZW5TZW5zb3IoaW50IHNlbnNvckhhbmRsZSkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0RGlzcGxheU9yaWVudGF0aW9uKGZsb2F0IHBoeXNpY2FsVG9Mb2dpY2FsQW5nbGUpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHNldEhpbmdlQW5nbGUoZmxvYXQgaGluZ2VBbmdsZSkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0U3VwcG9ydGVkTW9kZXMoc3RkOjp2ZWN0b3I8bWVkaWE6OlNwYXRpYWxpemF0aW9uTW9kZT4qIG1vZGVzKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyByZWdpc3RlckhlYWRUcmFja2luZ0NhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxtZWRpYTo6SVNwYXRpYWxpemVySGVhZFRyYWNraW5nQ2FsbGJhY2s+JiBjYWxsYmFjaykgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiB2YWx1ZSkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0UGFyYW1ldGVyKGludCBrZXksIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+ICp2YWx1ZSkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0T3V0cHV0KGludCAqb3V0cHV0KTsKKworICAgIC8qKiBJQmluZGVyOjpEZWF0aFJlY2lwaWVudC4gTGlzdGVuIHRvIHRoZSBkZWF0aCBvZiB0aGUgSU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2suICovCisgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CisKKyAgICAvKiogUmVnaXN0ZXJzIGEgSU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2sgd2hlbiBhIGNsaWVudCBpcyBhdHRhY2hlZCB0byB0aGlzIFNwYXRpYWxpemVyCisgICAgICogYnkgYXVkaW8gcG9saWN5IHNlcnZpY2UuCisgICAgICovCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJDYWxsYmFjayhjb25zdCBzcDxtZWRpYTo6SU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisKKyAgICBzdGF0dXNfdCBsb2FkRW5naW5lQ29uZmlndXJhdGlvbihzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisKKyAgICAvKiogTGV2ZWwgZ2V0dGVyIGZvciB1c2UgYnkgbG9jYWwgY2xhc3Nlcy4gKi8KKyAgICBtZWRpYTo6U3BhdGlhbGl6YXRpb25MZXZlbCBnZXRMZXZlbCgpIGNvbnN0IHsgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOyByZXR1cm4gbUxldmVsOyB9CisKKyAgICAvKiogQ2FsbGVkIGJ5IGF1ZGlvIHBvbGljeSBzZXJ2aWNlIHdoZW4gdGhlIHNwZWNpYWwgb3V0cHV0IG1peGVyIGRlZGljYXRlZCB0byBzcGF0aWFsaXphdGlvbgorICAgICAqIGlzIG9wZW5lZCBhbmQgdGhlIHNwYXRpYWxpemVyIGVuZ2luZSBtdXN0IGJlIGNyZWF0ZWQuCisgICAgICovCisgICAgc3RhdHVzX3QgYXR0YWNoT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgc2l6ZV90IG51bUFjdGl2ZVRyYWNrcyk7CisgICAgLyoqIENhbGxlZCBieSBhdWRpbyBwb2xpY3kgc2VydmljZSB3aGVuIHRoZSBzcGVjaWFsIG91dHB1dCBtaXhlciBkZWRpY2F0ZWQgdG8gc3BhdGlhbGl6YXRpb24KKyAgICAgKiBpcyBjbG9zZWQgYW5kIHRoZSBzcGF0aWFsaXplciBlbmdpbmUgbXVzdCBiZSByZWxlYXNlLgorICAgICAqLworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRldGFjaE91dHB1dCgpOworICAgIC8qKiBSZXR1cm5zIHRoZSBvdXRwdXQgc3RyZWFtIHRoZSBzcGF0aWFsaXplciBpcyBhdHRhY2hlZCB0by4gKi8KKyAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoKSBjb25zdCB7IHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsgcmV0dXJuIG1PdXRwdXQ7IH0KKworICAgIHZvaWQgdXBkYXRlQWN0aXZlVHJhY2tzKHNpemVfdCBudW1BY3RpdmVUcmFja3MpOworCisgICAgLyoqIEdldHMgdGhlIGNoYW5uZWwgbWFzaywgc2FtcGxpbmcgcmF0ZSBhbmQgZm9ybWF0IHNldCBmb3IgdGhlIHNwYXRpYWxpemVyIGlucHV0LiAqLworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0QXVkaW9JbkNvbmZpZygpIGNvbnN0OworCisgICAgdm9pZCBjYWxjdWxhdGVIZWFkUG9zZSgpOworCitwcml2YXRlOgorICAgIFNwYXRpYWxpemVyKGVmZmVjdF9kZXNjcmlwdG9yX3QgZW5naW5lRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgIFNwYXRpYWxpemVyUG9saWN5Q2FsbGJhY2sgKmNhbGxiYWNrKTsKKworICAgIHN0YXRpYyB2b2lkIGVuZ2luZUNhbGxiYWNrKGludDMyX3QgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQgKmluZm8pOworCisgICAgLy8gRnJvbSBWaXJ0dWFsaXplclN0YWdlQ29udHJvbGxlcjo6TGlzdGVuZXIKKyAgICB2b2lkIG9uSGVhZFRvU3RhZ2VQb3NlKGNvbnN0IG1lZGlhOjpQb3NlM2YmIGhlYWRUb1N0YWdlKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uQWN0dWFsTW9kZUNoYW5nZShtZWRpYTo6SGVhZFRyYWNraW5nTW9kZSBtb2RlKSBvdmVycmlkZTsKKworICAgIHZvaWQgb25IZWFkVG9TdGFnZVBvc2VNc2coY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBoZWFkVG9TdGFnZSk7CisgICAgdm9pZCBvbkFjdHVhbE1vZGVDaGFuZ2VNc2cobWVkaWE6OkhlYWRUcmFja2luZ01vZGUgbW9kZSk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrTWF4RWZmZWN0UGFyYW1WYWx1ZXMgPSAxMDsKKyAgICAvKioKKyAgICAgKiBHZXQgYSBwYXJhbWV0ZXIgZnJvbSBzcGF0aWFsaXplciBlbmdpbmUgYnkgY2FsbGluZyB0aGUgZWZmZWN0IEhBTCBjb21tYW5kIG1ldGhvZCBkaXJlY3RseS4KKyAgICAgKiBUbyBiZSB1c2VkIHdoZW4gdGhlIGVuZ2luZSBpbnN0YW5jZSBtRW5naW5lIGlzIG5vdCB5ZXQgY3JlYXRlZCBpbiB0aGUgZWZmZWN0IGZyYW1ld29yay4KKyAgICAgKiBXaGVuIE1VTFRJX1ZBTFVFUyBpcyBmYWxzZSwgdGhlIGV4cGVjdGVkIHJlcGx5IGlzIG9ubHkgb25lIHZhbHVlIG9mIHR5cGUgVC4KKyAgICAgKiBXaGVuIE1VTFRJX1ZBTFVFUyBpcyB0cnVlLCB0aGUgZXhwZWN0ZWQgcmVwbHkgaXMgbWFkZSBvZiBhIG51bWJlciAob2YgdHlwZSBUKSBpbmRpY2F0aW5nCisgICAgICogaG93IG1hbnkgdmFsdWVzIGFyZSByZXR1cm5lZCwgZm9sbG93ZWQgYnkgdGhpcyBudW1iZXIgZm9yIHZhbHVlcyBvZiB0eXBlIFQuCisgICAgICovCisgICAgdGVtcGxhdGU8Ym9vbCBNVUxUSV9WQUxVRVMsIHR5cGVuYW1lIFQ+CisgICAgc3RhdHVzX3QgZ2V0SGFsUGFyYW1ldGVyKHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0LCB1aW50MzJfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gKnZhbHVlcykgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUKSA8PSBzaXplb2YodWludDMyX3QpLCAiVGhlIHNpemUgb2YgVCBtdXN0IGxlc3MgdGhhbiAzMiBiaXRzIik7CisKKyAgICAgICAgdWludDMyX3QgY21kW3NpemVvZihlZmZlY3RfcGFyYW1fdCkgLyBzaXplb2YodWludDMyX3QpICsgMV07CisgICAgICAgIHVpbnQzMl90IHJlcGx5W3NpemVvZihlZmZlY3RfcGFyYW1fdCkgLyBzaXplb2YodWludDMyX3QpICsgMiArIGtNYXhFZmZlY3RQYXJhbVZhbHVlc107CisKKyAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKiljbWQ7CisgICAgICAgIHAtPnBzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgaWYgKE1VTFRJX1ZBTFVFUykgeworICAgICAgICAgICAgcC0+dnNpemUgPSAoa01heEVmZmVjdFBhcmFtVmFsdWVzICsgMSkgKiBzaXplb2YoVCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwLT52c2l6ZSA9IHNpemVvZihUKTsKKyAgICAgICAgfQorICAgICAgICAqKHVpbnQzMl90ICopcC0+ZGF0YSA9IHR5cGU7CisgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSArIHAtPnZzaXplOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGVmZmVjdC0+Y29tbWFuZChFRkZFQ1RfQ01EX0dFVF9QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YodWludDMyX3QpLCBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCByZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHAtPnN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHAtPnN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVwbHlTaXplIDwKKyAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKHVpbnQzMl90KSArIChNVUxUSV9WQUxVRVMgPyAyIDogMSkgKiBzaXplb2YoVCkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBUICpwYXJhbXMgPSAoVCAqKSgodWludDhfdCAqKXJlcGx5ICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICBpbnQgbnVtUGFyYW1zID0gMTsKKyAgICAgICAgaWYgKE1VTFRJX1ZBTFVFUykgeworICAgICAgICAgICAgbnVtUGFyYW1zID0gKGludCkqcGFyYW1zKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bVBhcmFtcyA+IGtNYXhFZmZlY3RQYXJhbVZhbHVlcykgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAoKnZhbHVlcykuY2xlYXIoKTsKKyAgICAgICAgc3RkOjpjb3B5KCZwYXJhbXNbMF0sICZwYXJhbXNbbnVtUGFyYW1zXSwgYmFja19pbnNlcnRlcigqdmFsdWVzKSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBwYXJhbWV0ZXIgdG8gc3BhdGlhbGl6ZXIgZW5naW5lIGJ5IGNhbGxpbmcgc2V0UGFyYW1ldGVyIG9uIG1FbmdpbmUgQXVkaW9FZmZlY3Qgb2JqZWN0LgorICAgICAqIEl0IGlzIHBvc3NpYmxlIHRvIHBhc3MgbW9yZSB0aGFuIG9uZSB2YWx1ZSBvZiB0eXBlIFQgYWNjb3JkaW5nIHRvIHRoZSBwYXJhbWV0ZXIgdHlwZQorICAgICAqICBhY2NvcmRpbmcgdG8gdmFsdWVzIHZlY3RvciBzaXplLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdHVzX3Qgc2V0RWZmZWN0UGFyYW1ldGVyX2wodWludDMyX3QgdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHZhbHVlcykgUkVRVUlSRVMobUxvY2spIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoVCkgPD0gc2l6ZW9mKHVpbnQzMl90KSwgIlRoZSBzaXplIG9mIFQgbXVzdCBsZXNzIHRoYW4gMzIgYml0cyIpOworCisgICAgICAgIHVpbnQzMl90IGNtZFtzaXplb2YoZWZmZWN0X3BhcmFtX3QpIC8gc2l6ZW9mKHVpbnQzMl90KSArIDEgKyB2YWx1ZXMuc2l6ZSgpXTsKKyAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKiljbWQ7CisgICAgICAgIHAtPnBzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgcC0+dnNpemUgPSBzaXplb2YoVCkgKiB2YWx1ZXMuc2l6ZSgpOworICAgICAgICAqKHVpbnQzMl90ICopcC0+ZGF0YSA9IHR5cGU7CisgICAgICAgIG1lbWNweSgodWludDMyX3QgKilwLT5kYXRhICsgMSwgdmFsdWVzLmRhdGEoKSwgc2l6ZW9mKFQpICogdmFsdWVzLnNpemUoKSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVuZ2luZS0+c2V0UGFyYW1ldGVyKHApOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGlmIChwLT5zdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBwLT5zdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHBhcmFtZXRlciBmcm9tIHNwYXRpYWxpemVyIGVuZ2luZSBieSBjYWxsaW5nIGdldFBhcmFtZXRlciBvbiBBdWRpb0VmZmVjdCBvYmplY3QuCisgICAgICogSXQgaXMgcG9zc2libGUgdG8gcmVhZCBtb3JlIHRoYW4gb25lIHZhbHVlIG9mIHR5cGUgVCBhY2NvcmRpbmcgdG8gdGhlIHBhcmFtZXRlciB0eXBlCisgICAgICogYnkgc3BlY2lmeWluZyB2YWx1ZXMgdmVjdG9yIHNpemUuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBnZXRFZmZlY3RQYXJhbWV0ZXJfbCh1aW50MzJfdCB0eXBlLCBzdGQ6OnZlY3RvcjxUPiAqdmFsdWVzKSBSRVFVSVJFUyhtTG9jaykgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUKSA8PSBzaXplb2YodWludDMyX3QpLCAiVGhlIHNpemUgb2YgVCBtdXN0IGxlc3MgdGhhbiAzMiBiaXRzIik7CisKKyAgICAgICAgdWludDMyX3QgY21kW3NpemVvZihlZmZlY3RfcGFyYW1fdCkgLyBzaXplb2YodWludDMyX3QpICsgMSArIHZhbHVlcy0+c2l6ZSgpXTsKKyAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKiljbWQ7CisgICAgICAgIHAtPnBzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgcC0+dnNpemUgPSBzaXplb2YoVCkgKiB2YWx1ZXMtPnNpemUoKTsKKyAgICAgICAgKih1aW50MzJfdCAqKXAtPmRhdGEgPSB0eXBlOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPmdldFBhcmFtZXRlcihwKTsKKworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGlmIChwLT5zdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBwLT5zdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbnVtVmFsdWVzID0gc3RkOjptaW4ocC0+dnNpemUgLyBzaXplb2YoVCksIHZhbHVlcy0+c2l6ZSgpKTsKKyAgICAgICAgKCp2YWx1ZXMpLmNsZWFyKCk7CisgICAgICAgIFQgKnJldFZhbHVlcyA9IChUICopKCh1aW50OF90ICopcC0+ZGF0YSArIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICBzdGQ6OmNvcHkoJnJldFZhbHVlc1swXSwgJnJldFZhbHVlc1tudW1WYWx1ZXNdLCBiYWNrX2luc2VydGVyKCp2YWx1ZXMpKTsKKworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgdm9pZCBwb3N0RnJhbWVzUHJvY2Vzc2VkTXNnKGludCBmcmFtZXMpOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGhlYWQgYW5kIHNjcmVlbiBzZW5zb3JzIG11c3QgYmUgYWN0aXZlbHkgbW9uaXRvcmVkIGJhc2VkIG9uCisgICAgICogc3BhdGlhbGl6ZXIgc3RhdGUgYW5kIHBsYXliYWNrIGFjdGl2aXR5IGFuZCBjb25maWd1cmVzIHRoZSBwb3NlIGNvbnRyb2xsZXIKKyAgICAgKiBhY2NvcmRpbmdseS4KKyAgICAgKi8KKyAgICB2b2lkIGNoZWNrU2Vuc29yc1N0YXRlX2woKSBSRVFVSVJFUyhtTG9jayk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIGhlYWQgcG9zZSBjb250cm9sbGVyIHNob3VsZCBiZSBjcmVhdGVkIG9yIGRlc3Ryb3llZCBhY2NvcmRpbmcKKyAgICAgKiB0byBkZXNpcmVkIGhlYWQgdHJhY2tpbmcgbW9kZS4KKyAgICAgKi8KKyAgICB2b2lkIGNoZWNrUG9zZUNvbnRyb2xsZXJfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgc3BhdGlhbGl6ZXIgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkIGJhc2VkIG9uCisgICAgICogcGxheWJhY2sgYWN0aXZpdHkgYW5kIHJlcXVlc3RlZCBsZXZlbC4KKyAgICAgKi8KKyAgICB2b2lkIGNoZWNrRW5naW5lU3RhdGVfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKKworICAgIC8qKiBFZmZlY3QgZW5naW5lIGRlc2NyaXB0b3IgKi8KKyAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IG1FbmdpbmVEZXNjcmlwdG9yOworICAgIC8qKiBDYWxsYmFjayBpbnRlcmZhY2UgdG8gcGFyZW50IGF1ZGlvIHBvbGljeSBzZXJ2aWNlICovCisgICAgU3BhdGlhbGl6ZXJQb2xpY3lDYWxsYmFjayogY29uc3QgbVBvbGljeUNhbGxiYWNrOworCisgICAgLyoqIEN1cnJlbnRseSB0aGVyZSBpcyBvbmx5IG9uZSB2ZXJzaW9uIG9mIHRoZSBzcGF0aWFsaXplciBydW5uaW5nICovCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbU1ldHJpY3NJZCA9IEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19TUEFUSUFMSVpFUiAiMCI7CisKKyAgICAvKiogTXV0ZXggcHJvdGVjdGluZyBpbnRlcm5hbCBzdGF0ZSAqLworICAgIG11dGFibGUgc3RkOjptdXRleCBtTG9jazsKKworICAgIC8qKiBDbGllbnQgQXVkaW9FZmZlY3QgZm9yIHRoZSBlbmdpbmUgKi8KKyAgICBzcDxBdWRpb0VmZmVjdD4gbUVuZ2luZSBHVUFSREVEX0JZKG1Mb2NrKTsKKyAgICAvKiogT3V0cHV0IHN0cmVhbSB0aGUgc3BhdGlhbGl6ZXIgbWl4ZXIgdGhyZWFkIGlzIGF0dGFjaGVkIHRvICovCisgICAgYXVkaW9faW9faGFuZGxlX3QgbU91dHB1dCBHVUFSREVEX0JZKG1Mb2NrKSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworCisgICAgLyoqIENhbGxiYWNrIGludGVyZmFjZSB0byB0aGUgY2xpZW50IChBdWRpb1NlcnZpY2UpIGNvbnRyb2xsaW5nIHRoaXNgU3BhdGlhbGl6ZXIgKi8KKyAgICBzcDxtZWRpYTo6SU5hdGl2ZVNwYXRpYWxpemVyQ2FsbGJhY2s+IG1TcGF0aWFsaXplckNhbGxiYWNrIEdVQVJERURfQlkobUxvY2spOworCisgICAgLyoqIENhbGxiYWNrIGludGVyZmFjZSBmb3IgaGVhZCB0cmFja2luZyAqLworICAgIHNwPG1lZGlhOjpJU3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdDYWxsYmFjaz4gbUhlYWRUcmFja2luZ0NhbGxiYWNrIEdVQVJERURfQlkobUxvY2spOworCisgICAgLyoqIFJlcXVlc3RlZCBzcGF0aWFsaXphdGlvbiBsZXZlbCAqLworICAgIG1lZGlhOjpTcGF0aWFsaXphdGlvbkxldmVsIG1MZXZlbCBHVUFSREVEX0JZKG1Mb2NrKSA9IG1lZGlhOjpTcGF0aWFsaXphdGlvbkxldmVsOjpOT05FOworCisgICAgLyoqIENvbnRyb2wgbG9naWMgZm9yIGhlYWQtdHJhY2tpbmcsIGV0Yy4gKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8U3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcj4gbVBvc2VDb250cm9sbGVyIEdVQVJERURfQlkobUxvY2spOworCisgICAgLyoqIExhc3QgcmVxdWVzdGVkIGhlYWQgdHJhY2tpbmcgbW9kZSAqLworICAgIG1lZGlhOjpIZWFkVHJhY2tpbmdNb2RlIG1EZXNpcmVkSGVhZFRyYWNraW5nTW9kZSBHVUFSREVEX0JZKG1Mb2NrKQorICAgICAgICAgICAgPSBtZWRpYTo6SGVhZFRyYWNraW5nTW9kZTo6U1RBVElDOworCisgICAgLyoqIExhc3QtcmVwb3J0ZWQgYWN0dWFsIGhlYWQtdHJhY2tpbmcgbW9kZS4gKi8KKyAgICBtZWRpYTo6U3BhdGlhbGl6ZXJIZWFkVHJhY2tpbmdNb2RlIG1BY3R1YWxIZWFkVHJhY2tpbmdNb2RlIEdVQVJERURfQlkobUxvY2spCisgICAgICAgICAgICA9IG1lZGlhOjpTcGF0aWFsaXplckhlYWRUcmFja2luZ01vZGU6OkRJU0FCTEVEOworCisgICAgLyoqIFNlbGVjdGVkIEhlYWQgcG9zZSBzZW5zb3IgKi8KKyAgICBpbnQzMl90IG1IZWFkU2Vuc29yIEdVQVJERURfQlkobUxvY2spID0gU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6SU5WQUxJRF9TRU5TT1I7CisKKyAgICAvKiogU2VsZWN0ZWQgU2NyZWVuIHBvc2Ugc2Vuc29yICovCisgICAgaW50MzJfdCBtU2NyZWVuU2Vuc29yIEdVQVJERURfQlkobUxvY2spID0gU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6SU5WQUxJRF9TRU5TT1I7CisKKyAgICAvKiogTGFzdCBkaXNwbGF5IG9yaWVudGF0aW9uIHJlY2VpdmVkICovCisgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrRGlzcGxheU9yaWVudGF0aW9uSW52YWxpZCA9IDEwMDA7CisgICAgZmxvYXQgbURpc3BsYXlPcmllbnRhdGlvbiBHVUFSREVEX0JZKG1Mb2NrKSA9IGtEaXNwbGF5T3JpZW50YXRpb25JbnZhbGlkOworCisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OlNwYXRpYWxpemF0aW9uTGV2ZWw+IG1MZXZlbHM7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OlNwYXRpYWxpemVySGVhZFRyYWNraW5nTW9kZT4gbUhlYWRUcmFja2luZ01vZGVzOworICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpTcGF0aWFsaXphdGlvbk1vZGU+IG1TcGF0aWFsaXphdGlvbk1vZGVzOworICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiBtQ2hhbm5lbE1hc2tzOworICAgIGJvb2wgbVN1cHBvcnRzSGVhZFRyYWNraW5nOworCisgICAgLy8gTG9vcGVyIHRocmVhZCBmb3IgbUVuZ2luZSBjYWxsYmFja3MKKyAgICBjbGFzcyBFbmdpbmVDYWxsYmFja0hhbmRsZXI7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPEVuZ2luZUNhbGxiYWNrSGFuZGxlcj4gbUhhbmRsZXI7CisKKyAgICBzaXplX3QgbU51bUFjdGl2ZVRyYWNrcyBHVUFSREVEX0JZKG1Mb2NrKSA9IDA7CisKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBzSGVhZFBvc2VLZXlzOworfTsKKworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9TUEFUSUFMSVpFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL1NwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplclBvc2VDb250cm9sbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRkNDRhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplclBvc2VDb250cm9sbGVyLmNwcApAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJTcGF0aWFsaXplclBvc2VDb250cm9sbGVyLmgiCisKKyNkZWZpbmUgTE9HX1RBRyAiU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDxzZW5zb3IvU2Vuc29yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N5c3RlbUNsb2NrLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgbWVkaWE6OmNyZWF0ZUhlYWRUcmFja2luZ1Byb2Nlc3NvcjsKK3VzaW5nIG1lZGlhOjpIZWFkVHJhY2tpbmdNb2RlOwordXNpbmcgbWVkaWE6OkhlYWRUcmFja2luZ1Byb2Nlc3NvcjsKK3VzaW5nIG1lZGlhOjpQb3NlM2Y7Cit1c2luZyBtZWRpYTo6U2Vuc29yUG9zZVByb3ZpZGVyOwordXNpbmcgbWVkaWE6OlR3aXN0M2Y7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworbmFtZXNwYWNlIHsKKworLy8gVGhpcyBpcyBob3cgZmFzdCwgaW4gbS9zLCB3ZSBhbGxvdyBwb3NpdGlvbiB0byBzaGlmdCBkdXJpbmcgcmF0ZS1saW1pdGluZy4KK2NvbnN0ZXhwciBmbG9hdCBrTWF4VHJhbnNsYXRpb25hbFZlbG9jaXR5ID0gMjsKKworLy8gVGhpcyBpcyBob3cgZmFzdCwgaW4gcmFkL3MsIHdlIGFsbG93IHJvdGF0aW9uIGFuZ2xlIHRvIHNoaWZ0IGR1cmluZyByYXRlLWxpbWl0aW5nLgorY29uc3RleHByIGZsb2F0IGtNYXhSb3RhdGlvbmFsVmVsb2NpdHkgPSA4OworCisvLyBUaGlzIGlzIGhvdyBmYXIgaW50byB0aGUgZnV0dXJlIHdlIHByZWRpY3QgdGhlIGhlYWQgcG9zZSwgdXNpbmcgbGluZWFyIGV4dHJhcG9sYXRpb24gYmFzZWQgb24KKy8vIHR3aXN0ICh2ZWxvY2l0eSkuIEl0IHNob3VsZCBiZSBzZXQgdG8gYSB2YWx1ZSB0aGF0IG1hdGNoZXMgdGhlIGNoYXJhY3RlcmlzdGljIGR1cmF0aW9ucyBvZiBtb3ZpbmcKKy8vIG9uZSdzIGhlYWQuIFRoZSBoaWdoZXIgd2Ugc2V0IHRoaXMsIHRoZSBtb3JlIGxhdGVuY3kgd2UgYXJlIGFibGUgdG8gcmVkdWNlLCBidXQgc2V0dGluZyB0aGlzIHRvbworLy8gaGlnaCB3aWxsIHJlc3VsdCBpbiBoaWdoIHByZWRpY3Rpb24gZXJyb3JzIHdoZW5ldmVyIHRoZSBoZWFkIGFjY2VsZXJhdGVzIChjaGFuZ2VzIHZlbG9jaXR5KS4KK2NvbnN0ZXhwciBhdXRvIGtQcmVkaWN0aW9uRHVyYXRpb24gPSA1MG1zOworCisvLyBBZnRlciBub3QgZ2V0dGluZyBhIHBvc2Ugc2FtcGxlIGZvciB0aGlzIGxvbmcsIHdlIHdvdWxkIHRyZWF0IHRoZSBtZWFzdXJlbWVudCBhcyBzdGFsZS4KK2NvbnN0ZXhwciBhdXRvIGtGcmVzaG5lc3NUaW1lb3V0ID0gNTBtczsKKworLy8gQXV0by1yZWNlbnRlciBraWNrcyBpbiBhZnRlciB0aGUgaGVhZCBoYXMgYmVlbiBzdGlsbCBmb3IgdGhpcyBsb25nLgorY29uc3RleHByIGF1dG8ga0F1dG9SZWNlbnRlcldpbmRvd0R1cmF0aW9uID0gNnM7CisKKy8vIEF1dG8tcmVjZW50ZXIgY29uc2lkZXJzIGhlYWQgbm90IHN0aWxsIGlmIHRyYW5zbGF0ZWQgYnkgdGhpcyBtdWNoIChpbiBtZXRlcnMsIGFwcHJveCkuCitjb25zdGV4cHIgZmxvYXQga0F1dG9SZWNlbnRlclRyYW5zbGF0aW9uVGhyZXNob2xkID0gMC4xZjsKKworLy8gQXV0by1yZWNlbnRlciBjb25zaWRlcnMgaGVhZCBub3Qgc3RpbGwgaWYgcm90YXRlZCBieSB0aGlzIG11Y2ggKGluIHJhZGlhbnMsIGFwcHJveCkuCitjb25zdGV4cHIgZmxvYXQga0F1dG9SZWNlbnRlclJvdGF0aW9uVGhyZXNob2xkID0gMTAuNWYgLyAxODAgKiBNX1BJOworCisvLyBTY3JlZW4gaXMgY29uc2lkZXJlZCB0byBiZSB1bnN0YWJsZSAobm90IHN0aWxsKSBpZiBpdCBoYXMgbW92ZWQgc2lnbmlmaWNhbnRseSB3aXRoaW4gdGhlIGxhc3QKKy8vIHRpbWUgd2luZG93IG9mIHRoaXMgZHVyYXRpb24uCitjb25zdGV4cHIgYXV0byBrU2NyZWVuU3RpbGxuZXNzV2luZG93RHVyYXRpb24gPSAzczsKKworLy8gU2NyZWVuIGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBtb3ZlZCBzaWduaWZpY2FudGx5IGlmIHRyYW5zbGF0ZWQgYnkgdGhpcyBtdWNoIChpbiBtZXRlciwgYXBwcm94KS4KK2NvbnN0ZXhwciBmbG9hdCBrU2NyZWVuU3RpbGxuZXNzVHJhbnNsYXRpb25UaHJlc2hvbGQgPSAwLjFmOworCisvLyBTY3JlZW4gaXMgY29uc2lkZXJlZCB0byBoYXZlIG1vdmVkIHNpZ25pZmljYW50bHkgaWYgcm90YXRlZCBieSB0aGlzIG11Y2ggKGluIHJhZGlhbnMsIGFwcHJveCkuCitjb25zdGV4cHIgZmxvYXQga1NjcmVlblN0aWxsbmVzc1JvdGF0aW9uVGhyZXNob2xkID0gNy4wZiAvIDE4MCAqIE1fUEk7CisKKy8vIFRpbWUgdW5pdHMgZm9yIHN5c3RlbSBjbG9jayB0aWNrcy4gVGhpcyBpcyB3aGF0IHRoZSBTZW5zb3IgRnJhbWV3b3JrIHRpbWVzdGFtcHMgcmVwcmVzZW50IGFuZAorLy8gd2hhdCB3ZSB1c2UgZm9yIHBvc2UgZmlsdGVyaW5nLgordXNpbmcgVGlja3MgPSBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHM7CisKKy8vIEhvdyBtYW55IHRpY2tzIGluIGEgc2Vjb25kLgorY29uc3RleHByIGF1dG8ga1RpY2tzUGVyU2Vjb25kID0gVGlja3M6OnBlcmlvZDo6ZGVuOworCitzdGQ6OnN0cmluZyBnZXRTZW5zb3JNZXRyaWNzSWQoaW50MzJfdCBzZW5zb3JJZCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZyhBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fU0VOU09SKS5hcHBlbmQoc3RkOjp0b19zdHJpbmcoc2Vuc29ySWQpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK1NwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6OlNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXIoTGlzdGVuZXIqIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHMgc2Vuc29yUGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4gbWF4VXBkYXRlUGVyaW9kKQorICAgIDogbUxpc3RlbmVyKGxpc3RlbmVyKSwKKyAgICAgIG1TZW5zb3JQZXJpb2Qoc2Vuc29yUGVyaW9kKSwKKyAgICAgIG1Qcm9jZXNzb3IoY3JlYXRlSGVhZFRyYWNraW5nUHJvY2Vzc29yKEhlYWRUcmFja2luZ1Byb2Nlc3Nvcjo6T3B0aW9uc3sKKyAgICAgICAgICAgICAgLm1heFRyYW5zbGF0aW9uYWxWZWxvY2l0eSA9IGtNYXhUcmFuc2xhdGlvbmFsVmVsb2NpdHkgLyBrVGlja3NQZXJTZWNvbmQsCisgICAgICAgICAgICAgIC5tYXhSb3RhdGlvbmFsVmVsb2NpdHkgPSBrTWF4Um90YXRpb25hbFZlbG9jaXR5IC8ga1RpY2tzUGVyU2Vjb25kLAorICAgICAgICAgICAgICAuZnJlc2huZXNzVGltZW91dCA9IFRpY2tzKGtGcmVzaG5lc3NUaW1lb3V0KS5jb3VudCgpLAorICAgICAgICAgICAgICAucHJlZGljdGlvbkR1cmF0aW9uID0gVGlja3Moa1ByZWRpY3Rpb25EdXJhdGlvbikuY291bnQoKSwKKyAgICAgICAgICAgICAgLmF1dG9SZWNlbnRlcldpbmRvd0R1cmF0aW9uID0gVGlja3Moa0F1dG9SZWNlbnRlcldpbmRvd0R1cmF0aW9uKS5jb3VudCgpLAorICAgICAgICAgICAgICAuYXV0b1JlY2VudGVyVHJhbnNsYXRpb25hbFRocmVzaG9sZCA9IGtBdXRvUmVjZW50ZXJUcmFuc2xhdGlvblRocmVzaG9sZCwKKyAgICAgICAgICAgICAgLmF1dG9SZWNlbnRlclJvdGF0aW9uYWxUaHJlc2hvbGQgPSBrQXV0b1JlY2VudGVyUm90YXRpb25UaHJlc2hvbGQsCisgICAgICAgICAgICAgIC5zY3JlZW5TdGlsbG5lc3NXaW5kb3dEdXJhdGlvbiA9IFRpY2tzKGtTY3JlZW5TdGlsbG5lc3NXaW5kb3dEdXJhdGlvbikuY291bnQoKSwKKyAgICAgICAgICAgICAgLnNjcmVlblN0aWxsbmVzc1RyYW5zbGF0aW9uYWxUaHJlc2hvbGQgPSBrU2NyZWVuU3RpbGxuZXNzVHJhbnNsYXRpb25UaHJlc2hvbGQsCisgICAgICAgICAgICAgIC5zY3JlZW5TdGlsbG5lc3NSb3RhdGlvbmFsVGhyZXNob2xkID0ga1NjcmVlblN0aWxsbmVzc1JvdGF0aW9uVGhyZXNob2xkLAorICAgICAgfSkpLAorICAgICAgbVBvc2VQcm92aWRlcihTZW5zb3JQb3NlUHJvdmlkZXI6OmNyZWF0ZSgiaGVhZHRyYWNrZXIiLCB0aGlzKSksCisgICAgICBtVGhyZWFkKFt0aGlzLCBtYXhVcGRhdGVQZXJpb2RdIHsKKyAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICBQb3NlM2YgaGVhZFRvU3RhZ2U7CisgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8SGVhZFRyYWNraW5nTW9kZT4gbW9kZUlmQ2hhbmdlZDsKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgICAgICAgICAgICBpZiAobWF4VXBkYXRlUGVyaW9kLmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgbUNvbmRWYXIud2FpdF9mb3IobG9jaywgbWF4VXBkYXRlUGVyaW9kLnZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXNdIHsgcmV0dXJuIG1TaG91bGRFeGl0IHx8IG1TaG91bGRDYWxjdWxhdGU7IH0pOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICBtQ29uZFZhci53YWl0KGxvY2ssIFt0aGlzXSB7IHJldHVybiBtU2hvdWxkRXhpdCB8fCBtU2hvdWxkQ2FsY3VsYXRlOyB9KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmIChtU2hvdWxkRXhpdCkgeworICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJFeGl0aW5nIHRocmVhZCIpOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlLgorICAgICAgICAgICAgICAgICAgc3RkOjp0aWUoaGVhZFRvU3RhZ2UsIG1vZGVJZkNoYW5nZWQpID0gY2FsY3VsYXRlX2woKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8vIEludm9rZSB0aGUgY2FsbGJhY2tzIG91dHNpZGUgdGhlIGxvY2suCisgICAgICAgICAgICAgIG1MaXN0ZW5lci0+b25IZWFkVG9TdGFnZVBvc2UoaGVhZFRvU3RhZ2UpOworICAgICAgICAgICAgICBpZiAobW9kZUlmQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLT5vbkFjdHVhbE1vZGVDaGFuZ2UobW9kZUlmQ2hhbmdlZC52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1NdXRleCk7CisgICAgICAgICAgICAgICAgICBpZiAoIW1DYWxjdWxhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgbUNhbGN1bGF0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgIG1Db25kVmFyLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIG1TaG91bGRDYWxjdWxhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0pIHt9CisKK1NwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6On5TcGF0aWFsaXplclBvc2VDb250cm9sbGVyKCkgeworICAgIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgIG1TaG91bGRFeGl0ID0gdHJ1ZTsKKyAgICAgICAgbUNvbmRWYXIubm90aWZ5X2FsbCgpOworICAgIH0KKyAgICBtVGhyZWFkLmpvaW4oKTsKK30KKwordm9pZCBTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpzZXRIZWFkU2Vuc29yKGludDMyX3Qgc2Vuc29yKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobU11dGV4KTsKKyAgICBpZiAoc2Vuc29yID09IG1IZWFkU2Vuc29yKSByZXR1cm47CisgICAgQUxPR1YoIiVzOiBuZXcgc2Vuc29yOiVkICBtSGVhZFNlbnNvcjolZCAgbVNjcmVlblNlbnNvcjolZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgc2Vuc29yLCBtSGVhZFNlbnNvciwgbVNjcmVlblNlbnNvcik7CisKKyAgICAvLyBTdG9wIGN1cnJlbnQgc2Vuc29yLCBpZiB2YWxpZCBhbmQgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyIHNlbnNvci4KKyAgICBpZiAobUhlYWRTZW5zb3IgIT0gSU5WQUxJRF9TRU5TT1IgJiYgbUhlYWRTZW5zb3IgIT0gbVNjcmVlblNlbnNvcikgeworICAgICAgICBtUG9zZVByb3ZpZGVyLT5zdG9wU2Vuc29yKG1IZWFkU2Vuc29yKTsKKyAgICAgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKGdldFNlbnNvck1ldHJpY3NJZChtSGVhZFNlbnNvcikpCisgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1NUT1ApCisgICAgICAgICAgICAucmVjb3JkKCk7CisgICAgfQorCisgICAgaWYgKHNlbnNvciAhPSBJTlZBTElEX1NFTlNPUikgeworICAgICAgICBpZiAoc2Vuc29yICE9IG1TY3JlZW5TZW5zb3IpIHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IG5ldyBzZW5zb3IuCisgICAgICAgICAgICBtSGVhZFNlbnNvciA9CisgICAgICAgICAgICAgICAgICAgIG1Qb3NlUHJvdmlkZXItPnN0YXJ0U2Vuc29yKHNlbnNvciwgbVNlbnNvclBlcmlvZCkgPyBzZW5zb3IgOiBJTlZBTElEX1NFTlNPUjsKKyAgICAgICAgICAgIGlmIChtSGVhZFNlbnNvciAhPSBJTlZBTElEX1NFTlNPUikgeworICAgICAgICAgICAgICAgIGF1dG8gc2Vuc29yID0gbVBvc2VQcm92aWRlci0+Z2V0U2Vuc29yQnlIYW5kbGUobUhlYWRTZW5zb3IpOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0cmluZ1R5cGUgPSBzZW5zb3IgPyBzZW5zb3ItPmdldFN0cmluZ1R5cGUoKS5jX3N0cigpIDogIiI7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKGdldFNlbnNvck1ldHJpY3NJZChtSGVhZFNlbnNvcikpCisgICAgICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU1RBUlQpCisgICAgICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX01PREUsIEFNRURJQU1FVFJJQ1NfUFJPUF9NT0RFX1ZBTFVFX0hFQUQpCisgICAgICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1RZUEUsIHN0cmluZ1R5cGUpCisgICAgICAgICAgICAgICAgICAgIC5yZWNvcmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNlbnNvciBpcyBhbHJlYWR5IGVuYWJsZWQuCisgICAgICAgICAgICBtSGVhZFNlbnNvciA9IG1TY3JlZW5TZW5zb3I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtSGVhZFNlbnNvciA9IElOVkFMSURfU0VOU09SOworICAgIH0KKworICAgIG1Qcm9jZXNzb3ItPnJlY2VudGVyKHRydWUgLyogcmVjZW50ZXJIZWFkICovLCBmYWxzZSAvKiByZWNlbnRlclNjcmVlbiAqLyk7Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6c2V0U2NyZWVuU2Vuc29yKGludDMyX3Qgc2Vuc29yKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobU11dGV4KTsKKyAgICBpZiAoc2Vuc29yID09IG1TY3JlZW5TZW5zb3IpIHJldHVybjsKKyAgICBBTE9HVigiJXM6IG5ldyBzZW5zb3I6JWQgIG1IZWFkU2Vuc29yOiVkICBtU2NyZWVuU2Vuc29yOiVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzZW5zb3IsIG1IZWFkU2Vuc29yLCBtU2NyZWVuU2Vuc29yKTsKKworICAgIC8vIFN0b3AgY3VycmVudCBzZW5zb3IsIGlmIHZhbGlkIGFuZCBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIgc2Vuc29yLgorICAgIGlmIChtU2NyZWVuU2Vuc29yICE9IElOVkFMSURfU0VOU09SICYmIG1TY3JlZW5TZW5zb3IgIT0gbUhlYWRTZW5zb3IpIHsKKyAgICAgICAgbVBvc2VQcm92aWRlci0+c3RvcFNlbnNvcihtU2NyZWVuU2Vuc29yKTsKKyAgICAgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKGdldFNlbnNvck1ldHJpY3NJZChtU2NyZWVuU2Vuc29yKSkKKyAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU1RPUCkKKyAgICAgICAgICAgIC5yZWNvcmQoKTsKKyAgICB9CisKKyAgICBpZiAoc2Vuc29yICE9IElOVkFMSURfU0VOU09SKSB7CisgICAgICAgIGlmIChzZW5zb3IgIT0gbUhlYWRTZW5zb3IpIHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IG5ldyBzZW5zb3IuCisgICAgICAgICAgICBtU2NyZWVuU2Vuc29yID0KKyAgICAgICAgICAgICAgICAgICAgbVBvc2VQcm92aWRlci0+c3RhcnRTZW5zb3Ioc2Vuc29yLCBtU2Vuc29yUGVyaW9kKSA/IHNlbnNvciA6IElOVkFMSURfU0VOU09SOworICAgICAgICAgICAgYXV0byBzZW5zb3IgPSBtUG9zZVByb3ZpZGVyLT5nZXRTZW5zb3JCeUhhbmRsZShtU2NyZWVuU2Vuc29yKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0cmluZ1R5cGUgPSBzZW5zb3IgPyBzZW5zb3ItPmdldFN0cmluZ1R5cGUoKS5jX3N0cigpIDogIiI7CisgICAgICAgICAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0oZ2V0U2Vuc29yTWV0cmljc0lkKG1TY3JlZW5TZW5zb3IpKQorICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU1RBUlQpCisgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfTU9ERSwgQU1FRElBTUVUUklDU19QUk9QX01PREVfVkFMVUVfU0NSRUVOKQorICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1RZUEUsIHN0cmluZ1R5cGUpCisgICAgICAgICAgICAgICAgLnJlY29yZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gU2Vuc29yIGlzIGFscmVhZHkgZW5hYmxlZC4KKyAgICAgICAgICAgIG1TY3JlZW5TZW5zb3IgPSBtSGVhZFNlbnNvcjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1TY3JlZW5TZW5zb3IgPSBJTlZBTElEX1NFTlNPUjsKKyAgICB9CisKKyAgICBtUHJvY2Vzc29yLT5yZWNlbnRlcihmYWxzZSAvKiByZWNlbnRlckhlYWQgKi8sIHRydWUgLyogcmVjZW50ZXJTY3JlZW4gKi8pOworfQorCit2b2lkIFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6OnNldERlc2lyZWRNb2RlKEhlYWRUcmFja2luZ01vZGUgbW9kZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1NdXRleCk7CisgICAgbVByb2Nlc3Nvci0+c2V0RGVzaXJlZE1vZGUobW9kZSk7Cit9CisKK3ZvaWQgU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6c2V0U2NyZWVuVG9TdGFnZVBvc2UoY29uc3QgUG9zZTNmJiBzY3JlZW5Ub1N0YWdlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobU11dGV4KTsKKyAgICBtUHJvY2Vzc29yLT5zZXRTY3JlZW5Ub1N0YWdlUG9zZShzY3JlZW5Ub1N0YWdlKTsKK30KKwordm9pZCBTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpzZXREaXNwbGF5T3JpZW50YXRpb24oZmxvYXQgcGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1NdXRleCk7CisgICAgbVByb2Nlc3Nvci0+c2V0RGlzcGxheU9yaWVudGF0aW9uKHBoeXNpY2FsVG9Mb2dpY2FsQW5nbGUpOworfQorCit2b2lkIFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6OmNhbGN1bGF0ZUFzeW5jKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1NdXRleCk7CisgICAgbVNob3VsZENhbGN1bGF0ZSA9IHRydWU7CisgICAgbUNvbmRWYXIubm90aWZ5X2FsbCgpOworfQorCit2b2lkIFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6OndhaXRVbnRpbENhbGN1bGF0ZWQoKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1NdXRleCk7CisgICAgbUNvbmRWYXIud2FpdChsb2NrLCBbdGhpc10geyByZXR1cm4gbUNhbGN1bGF0ZWQ7IH0pOworfQorCitzdGQ6OnR1cGxlPG1lZGlhOjpQb3NlM2YsIHN0ZDo6b3B0aW9uYWw8bWVkaWE6OkhlYWRUcmFja2luZ01vZGU+PgorU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcjo6Y2FsY3VsYXRlX2woKSB7CisgICAgUG9zZTNmIGhlYWRUb1N0YWdlOworICAgIEhlYWRUcmFja2luZ01vZGUgbW9kZTsKKyAgICBzdGQ6Om9wdGlvbmFsPG1lZGlhOjpIZWFkVHJhY2tpbmdNb2RlPiBtb2RlSWZDaGFuZ2VkOworCisgICAgbVByb2Nlc3Nvci0+Y2FsY3VsYXRlKGVsYXBzZWRSZWFsdGltZU5hbm8oKSk7CisgICAgaGVhZFRvU3RhZ2UgPSBtUHJvY2Vzc29yLT5nZXRIZWFkVG9TdGFnZVBvc2UoKTsKKyAgICBtb2RlID0gbVByb2Nlc3Nvci0+Z2V0QWN0dWFsTW9kZSgpOworICAgIGlmICghbUFjdHVhbE1vZGUuaGFzX3ZhbHVlKCkgfHwgbUFjdHVhbE1vZGUudmFsdWUoKSAhPSBtb2RlKSB7CisgICAgICAgIG1BY3R1YWxNb2RlID0gbW9kZTsKKyAgICAgICAgbW9kZUlmQ2hhbmdlZCA9IG1vZGU7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1ha2VfdHVwbGUoaGVhZFRvU3RhZ2UsIG1vZGVJZkNoYW5nZWQpOworfQorCit2b2lkIFNwYXRpYWxpemVyUG9zZUNvbnRyb2xsZXI6OnJlY2VudGVyKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1NdXRleCk7CisgICAgbVByb2Nlc3Nvci0+cmVjZW50ZXIoKTsKK30KKwordm9pZCBTcGF0aWFsaXplclBvc2VDb250cm9sbGVyOjpvblBvc2UoaW50NjRfdCB0aW1lc3RhbXAsIGludDMyX3Qgc2Vuc29yLCBjb25zdCBQb3NlM2YmIHBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFR3aXN0M2Y+JiB0d2lzdCwgYm9vbCBpc05ld1JlZmVyZW5jZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1NdXRleCk7CisgICAgaWYgKHNlbnNvciA9PSBtSGVhZFNlbnNvcikgeworICAgICAgICBtUHJvY2Vzc29yLT5zZXRXb3JsZFRvSGVhZFBvc2UodGltZXN0YW1wLCBwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdpc3QudmFsdWVfb3IoVHdpc3QzZigpKSAvIGtUaWNrc1BlclNlY29uZCk7CisgICAgICAgIGlmIChpc05ld1JlZmVyZW5jZSkgeworICAgICAgICAgICAgbVByb2Nlc3Nvci0+cmVjZW50ZXIodHJ1ZSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzZW5zb3IgPT0gbVNjcmVlblNlbnNvcikgeworICAgICAgICBtUHJvY2Vzc29yLT5zZXRXb3JsZFRvU2NyZWVuUG9zZSh0aW1lc3RhbXAsIHBvc2UpOworICAgICAgICBpZiAoaXNOZXdSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIG1Qcm9jZXNzb3ItPnJlY2VudGVyKGZhbHNlLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9TcGF0aWFsaXplclBvc2VDb250cm9sbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM2ZDc5YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlci5oCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPG1lZGlhL0hlYWRUcmFja2luZ1Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPG1lZGlhL1NlbnNvclBvc2VQcm92aWRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIGZvciBwb3NlIHByb2Nlc3NpbmcsIGludGVuZGVkIGZvciBkcml2aW5nIGEgc3BhdGlhbGl6ZXIgZWZmZWN0LgorICogVGhpcyBpbmNsdWRlcyBpbnRlZ3JhdGlvbiB3aXRoIHRoZSBTZW5zb3Igc3ViLXN5c3RlbSBmb3IgcmV0cmlldmluZyBzZW5zb3IgZGF0YSwgZG9pbmcgYWxsIHRoZQorICogbmVjZXNzYXJ5IHByb2Nlc3NpbmcsIGV0Yy4KKyAqCisgKiBDYWxjdWxhdGlvbnMgaGFwcGVuIG9uIGEgZGVkaWNhdGVkIHRocmVhZCBhbmQgcHVibGlzaGVkIHRvIHRoZSBjbGllbnQgdmlhIHRoZSBMaXN0ZW5lciBpbnRlcmZhY2UuCisgKiBBIGNhbGN1bGF0aW9uIG1heSBiZSB0cmlnZ2VyZWQgaW4gb25lIG9mIHR3byB3YXlzOgorICogLSBCeSBjYWxsaW5nIGNhbGN1bGF0ZUFzeW5jKCkgLSBjYWxjdWxhdGlvbiB3aWxsIGJlIGtpY2tlZCBvZmYgaW4gdGhlIGJhY2tncm91bmQuCisgKiAtIEJ5IHNldHRpbmcgYSB0aW1lb3V0IGluIHRoZSBjdG9yLCBhIGNhbGN1bGF0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIGFmdGVyIHRoZSB0aW1lb3V0IGVsYXBzZWQKKyAqICAgZnJvbSB0aGUgbGFzdCBjYWxjdWxhdGVBc3luYygpIGNhbGwuCisgKgorICogVGhpcyBjbGFzcyBpcyB0aHJlYWQtc2FmZS4KKyAqLworY2xhc3MgU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlciA6IHByaXZhdGUgbWVkaWE6OlNlbnNvclBvc2VQcm92aWRlcjo6TGlzdGVuZXIgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IElOVkFMSURfU0VOU09SID0gbWVkaWE6OlNlbnNvclBvc2VQcm92aWRlcjo6SU5WQUxJRF9IQU5ETEU7CisKKyAgICAvKioKKyAgICAgKiBMaXN0ZW5lciBpbnRlcmZhY2UgZm9yIGdldHRpbmcgcG9zZSBhbmQgbW9kZSB1cGRhdGVzLgorICAgICAqIE1ldGhvZHMgd2lsbCBhbHdheXMgYmUgaW52b2tlZCBmcm9tIGEgZGVzaWduYXRlZCB0aHJlYWQuCisgICAgICovCisgICAgY2xhc3MgTGlzdGVuZXIgeworICAgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpID0gZGVmYXVsdDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgb25IZWFkVG9TdGFnZVBvc2UoY29uc3QgbWVkaWE6OlBvc2UzZiYpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQWN0dWFsTW9kZUNoYW5nZShtZWRpYTo6SGVhZFRyYWNraW5nTW9kZSkgPSAwOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDdG9yLgorICAgICAqIHNlbnNvclBlcmlvZCBkZXRlcm1pbmVzIGhvdyBvZnRlbiB0byByZWNlaXZlIHVwZGF0ZXMgZnJvbSB0aGUgc2Vuc29ycyAoaW5wdXQgcmF0ZSkuCisgICAgICogbWF4VXBkYXRlUGVyaW9kIGRldGVybWluZXMgaG93IG9mdGVuIHRvIHByb2R1Y2UgYW4gb3V0cHV0IHdoZW4gY2FsY3VsYXRlQXN5bmMoKSBpc24ndAorICAgICAqIGludm9rZWQ7IHBhc3NpbmcgbnVsbG9wdCBtZWFucyBhbiBvdXRwdXQgaXMgbmV2ZXIgcHJvZHVjZWQuCisgICAgICovCisgICAgU3BhdGlhbGl6ZXJQb3NlQ29udHJvbGxlcihMaXN0ZW5lciogbGlzdGVuZXIsIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHMgc2Vuc29yUGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4gbWF4VXBkYXRlUGVyaW9kKTsKKworICAgIC8qKiBEdG9yLiAqLworICAgIH5TcGF0aWFsaXplclBvc2VDb250cm9sbGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlbnNvciB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIGhlYWQtdHJhY2tpbmcuCisgICAgICogSU5WQUxJRF9TRU5TT1IgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBoZWFkLXRyYWNraW5nLgorICAgICAqLworICAgIHZvaWQgc2V0SGVhZFNlbnNvcihpbnQzMl90IHNlbnNvcik7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlbnNvciB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHNjcmVlbi10cmFja2luZy4KKyAgICAgKiBJTlZBTElEX1NFTlNPUiBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIHNjcmVlbi10cmFja2luZy4KKyAgICAgKi8KKyAgICB2b2lkIHNldFNjcmVlblNlbnNvcihpbnQzMl90IHNlbnNvcik7CisKKyAgICAvKiogU2V0cyB0aGUgZGVzaXJlZCBoZWFkLXRyYWNraW5nIG1vZGUuICovCisgICAgdm9pZCBzZXREZXNpcmVkTW9kZShtZWRpYTo6SGVhZFRyYWNraW5nTW9kZSBtb2RlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2NyZWVuLXRvLXN0YWdlIHBvc2UsIHVzZWQgaW4gYWxsIG1vZGVzLgorICAgICAqLworICAgIHZvaWQgc2V0U2NyZWVuVG9TdGFnZVBvc2UoY29uc3QgbWVkaWE6OlBvc2UzZiYgc2NyZWVuVG9TdGFnZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkaXNwbGF5IG9yaWVudGF0aW9uLgorICAgICAqIE9yaWVudGF0aW9uIGlzIGV4cHJlc3NlZCBpbiB0aGUgYW5nbGUgb2Ygcm90YXRpb24gZnJvbSB0aGUgcGh5c2ljYWwgInVwIiBzaWRlIG9mIHRoZSBzY3JlZW4KKyAgICAgKiB0byB0aGUgbG9naWNhbCAidXAiIHNpZGUgb2YgdGhlIGNvbnRlbnQgZGlzcGxheWVkIHRoZSBzY3JlZW4uIENvdW50ZXJjbG9ja3dpc2UgYW5nbGVzLCBhcworICAgICAqIHZpZXdlZCB3aGlsZSBmYWNpbmcgdGhlIHNjcmVlbiBhcmUgcG9zaXRpdmUuCisgICAgICovCisgICAgdm9pZCBzZXREaXNwbGF5T3JpZW50YXRpb24oZmxvYXQgcGh5c2ljYWxUb0xvZ2ljYWxBbmdsZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhdXNlcyB0aGUgY3VycmVudCBwb3NlcyBmb3IgYm90aCB0aGUgaGVhZCBhbmQgc2NyZWVuIHRvIGJlIGNvbnNpZGVyZWQgImNlbnRlciIuCisgICAgICovCisgICAgdm9pZCByZWNlbnRlcigpOworCisgICAgLyoqCisgICAgICogVGhpcyBjYWxsIHRyaWdnZXJzIHRoZSByZWNhbGN1bGF0aW9uIG9mIHRoZSBvdXRwdXQgYW5kIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSByZWxldmFudAorICAgICAqIGNhbGxiYWNrcy4gVGhpcyBjYWxsIGlzIGFzeW5jIGFuZCB0aGUgY2FsbGJhY2tzIHdpbGwgYmUgdHJpZ2dlcmVkIHNob3J0bHkgYWZ0ZXIuCisgICAgICovCisgICAgdm9pZCBjYWxjdWxhdGVBc3luYygpOworCisgICAgLyoqCisgICAgICogQmxvY2tzIHVudGlsIGNhbGN1bGF0aW9uIGFuZCBpbnZvY2F0aW9uIG9mIHRoZSByZXNwZWN0aXZlIGNhbGxiYWNrcyBoYXMgaGFwcGVuZWQgYXQgbGVhc3QKKyAgICAgKiBvbmNlLiBEbyBub3QgY2FsbCBmcm9tIHdpdGhpbiBjYWxsYmFja3MuCisgICAgICovCisgICAgdm9pZCB3YWl0VW50aWxDYWxjdWxhdGVkKCk7CisKKyAgcHJpdmF0ZToKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIExpc3RlbmVyKiBjb25zdCBtTGlzdGVuZXI7CisgICAgY29uc3Qgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyBtU2Vuc29yUGVyaW9kOworICAgIC8vIE9yZGVyIG1hdHRlcnMgZm9yIHRoZSBmb2xsb3dpbmcgdHdvIG1lbWJlcnMgdG8gZW5zdXJlIGNvcnJlY3QgZGVzdHJ1Y3Rpb24uCisgICAgc3RkOjp1bmlxdWVfcHRyPG1lZGlhOjpIZWFkVHJhY2tpbmdQcm9jZXNzb3I+IG1Qcm9jZXNzb3I7CisgICAgc3RkOjp1bmlxdWVfcHRyPG1lZGlhOjpTZW5zb3JQb3NlUHJvdmlkZXI+IG1Qb3NlUHJvdmlkZXI7CisgICAgaW50MzJfdCBtSGVhZFNlbnNvciA9IG1lZGlhOjpTZW5zb3JQb3NlUHJvdmlkZXI6OklOVkFMSURfSEFORExFOworICAgIGludDMyX3QgbVNjcmVlblNlbnNvciA9IG1lZGlhOjpTZW5zb3JQb3NlUHJvdmlkZXI6OklOVkFMSURfSEFORExFOworICAgIHN0ZDo6b3B0aW9uYWw8bWVkaWE6OkhlYWRUcmFja2luZ01vZGU+IG1BY3R1YWxNb2RlOworICAgIHN0ZDo6dGhyZWFkIG1UaHJlYWQ7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbmRWYXI7CisgICAgYm9vbCBtU2hvdWxkQ2FsY3VsYXRlID0gdHJ1ZTsKKyAgICBib29sIG1TaG91bGRFeGl0ID0gZmFsc2U7CisgICAgYm9vbCBtQ2FsY3VsYXRlZCA9IGZhbHNlOworCisgICAgdm9pZCBvblBvc2UoaW50NjRfdCB0aW1lc3RhbXAsIGludDMyX3Qgc2Vuc29yLCBjb25zdCBtZWRpYTo6UG9zZTNmJiBwb3NlLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8bWVkaWE6OlR3aXN0M2Y+JiB0d2lzdCwgYm9vbCBpc05ld1JlZmVyZW5jZSkgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGVzIHRoZSBuZXcgb3V0cHV0cyBhbmQgdXBkYXRlcyBpbnRlcm5hbCBzdGF0ZS4gTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkLgorICAgICAqIFJldHVybnMgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgcmVzcGVjdGl2ZSBjYWxsYmFja3MuCisgICAgICovCisgICAgc3RkOjp0dXBsZTxtZWRpYTo6UG9zZTNmLCBzdGQ6Om9wdGlvbmFsPG1lZGlhOjpIZWFkVHJhY2tpbmdNb2RlPj4gY2FsY3VsYXRlX2woKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5icAppbmRleCBiMjk2ZmIwLi4yZTIyMGJjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTI1LDEzICsyNSwxMyBAQAogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYnhtbDIiLAotICAgICAgICAibGlicGVybWlzc2lvbiIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIiwKLSAgICAgICAgImxpYmdtb2NrIgorICAgICAgICAibGliZ21vY2siLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwpAQCAtNjUsNiArNjUsMTIgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24udHlwZXMtVjEtY3BwIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnNobWVtY29tcGF0IiwKKyAgICAgICAgImxpYnNobWVtdXRpbCIsCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyJdLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudC5oCmluZGV4IGY3YjA1NjUuLjA1N2ZhNTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50LmgKQEAgLTM3LDcgKzM3LDggQEAKIAogICAgIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqIC8qY29uZmlnKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqIC8qaGFsQ29uZmlnKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90ICogLyptaXhlckNvbmZpZyovLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+JiAvKmRldmljZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKiAvKmxhdGVuY3lNcyovLAogICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgLypmbGFncyovKSBvdmVycmlkZSB7CkBAIC0xMDIsNiArMTAzLDExIEBACiAgICAgICAgICsrbUF1ZGlvUG9ydExpc3RVcGRhdGVDb3VudDsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0ZWRTdGF0ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0IF9fdW51c2VkLCBib29sIGNvbm5lY3RlZCBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCiAgICAgLy8gSGVscGVyIG1ldGhvZHMgZm9yIHRlc3RzCiAgICAgc2l6ZV90IGdldEFjdGl2ZVBhdGNoZXNDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1BY3RpdmVQYXRjaGVzLnNpemUoKTsgfQogCkBAIC0xMzIsNyArMTM4LDEyIEBACiAgICAgfQogCiAgICAgc2l6ZV90IGdldFJvdXRpbmdVcGRhdGVkQ291bnRlcigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0aW5nVXBkYXRlZFVwZGF0ZUNvdW50OyB9CisgICAgICAgIHJldHVybiBtUm91dGluZ1VwZGF0ZWRVcGRhdGVDb3VudDsKKyAgICB9CisKKyAgICB2b2lkIG9uVm9sdW1lUmFuZ2VJbml0UmVxdWVzdCgpIG92ZXJyaWRlIHsKKworICAgIH0KIAogICAgIHN0YXR1c190IHVwZGF0ZVNlY29uZGFyeU91dHB1dHMoCiAgICAgICAgICAgICBjb25zdCBUcmFja1NlY29uZGFyeU91dHB1dHNNYXAmIHRyYWNrU2Vjb25kYXJ5T3V0cHV0cyBfX3VudXNlZCkgb3ZlcnJpZGUgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudEZvckhkbWkuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnRGb3JIZG1pLmgKaW5kZXggYTVhZDliMS4uNzM0M2I5YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudEZvckhkbWkuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50Rm9ySGRtaS5oCkBAIC0yOCwxOSArMjgsMjYgQEAKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnRGb3JIZG1pIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQgewogcHVibGljOgogICAgIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCAvKiBpb0hhbmRsZSAqLywgY29uc3QgU3RyaW5nOCYgIC8qIGtleXMqLyApIG92ZXJyaWRlIHsKKyAgICAgICAgQXVkaW9QYXJhbWV0ZXIgbUF1ZGlvUGFyYW1ldGVyczsKKyAgICAgICAgc3RkOjpzdHJpbmcgZm9ybWF0czsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBmIDogbVN1cHBvcnRlZEZvcm1hdHMpIHsKKyAgICAgICAgICAgIGlmICghZm9ybWF0cy5lbXB0eSgpKSBmb3JtYXRzICs9IEFVRElPX1BBUkFNRVRFUl9WQUxVRV9MSVNUX1NFUEFSQVRPUjsKKyAgICAgICAgICAgIGZvcm1hdHMgKz0gYXVkaW9fZm9ybWF0X3RvX3N0cmluZyhmKTsKKyAgICAgICAgfQorICAgICAgICBtQXVkaW9QYXJhbWV0ZXJzLmFkZCgKKyAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRGb3JtYXRzKSwKKyAgICAgICAgICAgICAgICBTdHJpbmc4KGZvcm1hdHMuY19zdHIoKSkpOworICAgICAgICBtQXVkaW9QYXJhbWV0ZXJzLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwgNDgwMDApOworICAgICAgICBtQXVkaW9QYXJhbWV0ZXJzLmFkZChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIFN0cmluZzgoIiIpKTsKICAgICAgICAgcmV0dXJuIG1BdWRpb1BhcmFtZXRlcnMudG9TdHJpbmcoKTsKICAgICB9CiAKICAgICB2b2lkIGFkZFN1cHBvcnRlZEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIG92ZXJyaWRlIHsKLSAgICAgICAgbUF1ZGlvUGFyYW1ldGVycy5hZGQoCi0gICAgICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0cyksCi0gICAgICAgICAgICAgICAgU3RyaW5nOChhdWRpb19mb3JtYXRfdG9fc3RyaW5nKGZvcm1hdCkpKTsKLSAgICAgICAgbUF1ZGlvUGFyYW1ldGVycy5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyksIDQ4MDAwKTsKLSAgICAgICAgbUF1ZGlvUGFyYW1ldGVycy5hZGQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCBTdHJpbmc4KCIiKSk7CisgICAgICAgIG1TdXBwb3J0ZWRGb3JtYXRzLmluc2VydChmb3JtYXQpOwogICAgIH0KIAogcHJpdmF0ZToKLSAgICBBdWRpb1BhcmFtZXRlciBtQXVkaW9QYXJhbWV0ZXJzOworICAgIHN0ZDo6c2V0PGF1ZGlvX2Zvcm1hdF90PiBtU3VwcG9ydGVkRm9ybWF0czsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCmluZGV4IDEzODQ4NjQuLjhhODVmZWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCkBAIC0zMCw3ICszMCw4IEBACiAgICAgfQogICAgIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IC8qbW9kdWxlKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCogLypvdXRwdXQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190KiAvKmNvbmZpZyovLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QqIC8qaGFsQ29uZmlnKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90KiAvKm1peGVyQ29uZmlnKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIC8qZGV2aWNlKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogLypsYXRlbmN5TXMqLywKICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IC8qZmxhZ3MqLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQpAQCAtODQsNiArODUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSBfX3VudXNlZCkgb3ZlcnJpZGUgeyB9CiAgICAgdm9pZCBvblJvdXRpbmdVcGRhdGVkKCkgb3ZlcnJpZGUgeyB9CisgICAgdm9pZCBvblZvbHVtZVJhbmdlSW5pdFJlcXVlc3QoKSBvdmVycmlkZSB7IH0KICAgICB2b2lkIHNldEVmZmVjdFN1c3BlbmRlZChpbnQgZWZmZWN0SWQgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCBfX3VudXNlZCkge30KQEAgLTk1LDYgKzk3LDEwIEBACiAgICAgICAgICAgICBjb25zdCBUcmFja1NlY29uZGFyeU91dHB1dHNNYXAmIHRyYWNrU2Vjb25kYXJ5T3V0cHV0cyBfX3VudXNlZCkgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGVkU3RhdGUoCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCBfX3VudXNlZCwgYm9vbCBjb25uZWN0ZWQgX191bnVzZWQpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oCmluZGV4IDdmNjc5NDAuLjc0NDFmMjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdE1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgKQEAgLTMzLDYgKzMzLDEwIEBACiAgICAgdXNpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlTXNkT3V0cHV0UGF0Y2hlczsKICAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OnNldE1zZE91dHB1dFBhdGNoZXM7CiAgICAgdXNpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBdWRpb1BhdGNoZXM7CisgICAgdXNpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREaXJlY3RQbGF5YmFja1N1cHBvcnQ7CisgICAgdXNpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXM7CisgICAgdXNpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGU7CisgICAgdXNpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkZXZpY2VUb0F1ZGlvUG9ydDsKICAgICB1aW50MzJfdCBnZXRBdWRpb1BvcnRHZW5lcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvUG9ydEdlbmVyYXRpb247IH0KIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvX2hlYWx0aF90ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb19oZWFsdGhfdGVzdHMuY3BwCmluZGV4IGRmNDM4OWIuLjEwZjhkYzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvX2hlYWx0aF90ZXN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9faGVhbHRoX3Rlc3RzLmNwcApAQCAtMTExLDE2ICsxMTEsMTcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIHN0ZDo6c3RyaW5nIGFkZHJlc3MgPSAiMTE6MjI6MzM6NDQ6NTU6NjYiOworICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0IGFpZGxQb3J0OworICAgICAgICBBU1NFUlRfRVEoT0ssIG1hbmFnZXIuZGV2aWNlVG9BdWRpb1BvcnQoZGV2aWNlLT50eXBlKCksIGFkZHJlc3MuY19zdHIoKSwgIiIgLypuYW1lKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFpZGxQb3J0KSk7CiAgICAgICAgIEFTU0VSVF9FUShBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAogICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLT50eXBlKCksIGFkZHJlc3MuY19zdHIoKSkpOwogICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIEF1ZGlvU3lzdGVtOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgICAgICAgICAgZGV2aWNlLT50eXBlKCksIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLCBhZGRyZXNzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIiIgLypkZXZpY2VfbmFtZSovLCBBVURJT19GT1JNQVRfREVGQVVMVCkpOworICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLCBhaWRsUG9ydC5oYWwsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CiAgICAgICAgIEFTU0VSVF9FUShBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZS0+dHlwZSgpLCBhZGRyZXNzLmNfc3RyKCkpKTsKICAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBBdWRpb1N5c3RlbTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICAgICAgICAgIGRldmljZS0+dHlwZSgpLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLCBhZGRyZXNzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIiIgLypkZXZpY2VfbmFtZSovLCBBVURJT19GT1JNQVRfREVGQVVMVCkpOworICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsIGFpZGxQb3J0LmhhbCwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKICAgICAgICAgQVNTRVJUX0VRKEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UtPnR5cGUoKSwgYWRkcmVzcy5jX3N0cigpKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKaW5kZXggYTE2YWI3ZC4uNTQyOTE3NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCkBAIC0xMzcsNiArMTM3LDggQEAKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCA9IG51bGxwdHIpOwogICAgIFBhdGNoQ291bnRDaGVjayBzbmFwc2hvdFBhdGNoQ291bnQoKSB7IHJldHVybiBQYXRjaENvdW50Q2hlY2sobUNsaWVudC5nZXQoKSk7IH0KIAorICAgIHZvaWQgZ2V0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3R5cGVfdCB0eXBlLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fcG9ydF92Nz4qIHBvcnRzKTsKICAgICAvLyBUcmllcyB0byBmaW5kIGEgZGV2aWNlIHBvcnQuIElmICdmb3VuZFBvcnQnIGlzbid0IG51bGxwdHIsCiAgICAgLy8gd2lsbCBnZW5lcmF0ZSBhIGZhaWx1cmUgaWYgdGhlIHBvcnQgaGFzbid0IGJlZW4gZm91bmQuCiAgICAgYm9vbCBmaW5kRGV2aWNlUG9ydChhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKQEAgLTE1MSw3ICsxNTMsNyBAQAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpTZXRVcCgpIHsKICAgICBtQ2xpZW50LnJlc2V0KGdldENsaWVudCgpKTsKICAgICBtTWFuYWdlci5yZXNldChuZXcgQXVkaW9Qb2xpY3lUZXN0TWFuYWdlcihtQ2xpZW50LmdldCgpKSk7Ci0gICAgU2V0VXBNYW5hZ2VyQ29uZmlnKCk7ICAvLyBTdWJjbGFzc2VzIG1heSB3YW50IHRvIGN1c3RvbWl6ZSB0aGUgY29uZmlnLgorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldFVwTWFuYWdlckNvbmZpZygpKTsgIC8vIFN1YmNsYXNzZXMgbWF5IHdhbnQgdG8gY3VzdG9taXplIHRoZSBjb25maWcuCiAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+aW5pdGlhbGl6ZSgpKTsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5pbml0Q2hlY2soKSk7CiB9CkBAIC0yMTYsMTMgKzIxOCwxNCBAQAogICAgIGlmICghcG9ydElkKSBwb3J0SWQgPSAmbG9jYWxQb3J0SWQ7CiAgICAgKnBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6Om91dHB1dF90eXBlX3Qgb3V0cHV0VHlwZTsKKyAgICBib29sIGlzU3BhdGlhbGl6ZWQ7CiAgICAgLy8gVE9ETyBiLzE4MjM5Mjc2OTogdXNlIGF0dHJpYnV0aW9uIHNvdXJjZSB1dGlsCiAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZSA9IEF0dHJpYnV0aW9uU291cmNlU3RhdGUoKTsKICAgICBhdHRyaWJ1dGlvblNvdXJjZS51aWQgPSAwOwogICAgIGF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gc3A8QkJpbmRlcj46Om1ha2UoKTsKICAgICBBU1NFUlRfRVEoT0ssIG1NYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKAogICAgICAgICAgICAgICAgICAgICAmYXR0ciwgb3V0cHV0LCBBVURJT19TRVNTSU9OX05PTkUsICZzdHJlYW0sIGF0dHJpYnV0aW9uU291cmNlLCAmY29uZmlnLCAmZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwge30sICZvdXRwdXRUeXBlKSk7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwge30sICZvdXRwdXRUeXBlLCAmaXNTcGF0aWFsaXplZCkpOwogICAgIEFTU0VSVF9ORShBVURJT19QT1JUX0hBTkRMRV9OT05FLCAqcG9ydElkKTsKICAgICBBU1NFUlRfTkUoQVVESU9fSU9fSEFORExFX05PTkUsICpvdXRwdXQpOwogfQpAQCAtMjU1LDIxICsyNTgsMjYgQEAKICAgICBBU1NFUlRfTkUoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwgKnBvcnRJZCk7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6ZmluZERldmljZVBvcnQoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzLCBhdWRpb19wb3J0X3Y3ICpmb3VuZFBvcnQpIHsKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6Z2V0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3R5cGVfdCB0eXBlLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19wb3J0X3Y3PiogcG9ydHMpIHsKICAgICB1aW50MzJfdCBudW1Qb3J0cyA9IDA7CiAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjE7CiAgICAgc3RhdHVzX3QgcmV0OwogCi0gICAgcmV0ID0gbU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzKHJvbGUsIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsICZudW1Qb3J0cywgbnVsbHB0ciwgJmdlbmVyYXRpb24xKTsKLSAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIHJldCkgPDwgIm1NYW5hZ2VyLT5saXN0QXVkaW9Qb3J0cyByZXR1cm5lZCBlcnJvciI7Ci0gICAgaWYgKEhhc0ZhaWx1cmUoKSkgcmV0dXJuIGZhbHNlOworICAgIHJldCA9IG1NYW5hZ2VyLT5saXN0QXVkaW9Qb3J0cyhyb2xlLCB0eXBlLCAmbnVtUG9ydHMsIG51bGxwdHIsICZnZW5lcmF0aW9uMSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXQpIDw8ICJtTWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMgcmV0dXJuZWQgZXJyb3IiOwogCiAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjI7Ci0gICAgc3RydWN0IGF1ZGlvX3BvcnRfdjcgcG9ydHNbbnVtUG9ydHNdOwotICAgIHJldCA9IG1NYW5hZ2VyLT5saXN0QXVkaW9Qb3J0cyhyb2xlLCBBVURJT19QT1JUX1RZUEVfREVWSUNFLCAmbnVtUG9ydHMsIHBvcnRzLCAmZ2VuZXJhdGlvbjIpOwotICAgIEVYUEVDVF9FUShOT19FUlJPUiwgcmV0KSA8PCAibU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzIHJldHVybmVkIGVycm9yIjsKLSAgICBFWFBFQ1RfRVEoZ2VuZXJhdGlvbjEsIGdlbmVyYXRpb24yKSA8PCAiR2VuZXJhdGlvbnMgY2hhbmdlZCBkdXJpbmcgcG9ydHMgcmV0cmlldmFsIjsKKyAgICBwb3J0cy0+cmVzaXplKG51bVBvcnRzKTsKKyAgICByZXQgPSBtTWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMocm9sZSwgdHlwZSwgJm51bVBvcnRzLCBwb3J0cy0+ZGF0YSgpLCAmZ2VuZXJhdGlvbjIpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmV0KSA8PCAibU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzIHJldHVybmVkIGVycm9yIjsKKyAgICBBU1NFUlRfRVEoZ2VuZXJhdGlvbjEsIGdlbmVyYXRpb24yKSA8PCAiR2VuZXJhdGlvbnMgY2hhbmdlZCBkdXJpbmcgcG9ydHMgcmV0cmlldmFsIjsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpmaW5kRGV2aWNlUG9ydChhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MsIGF1ZGlvX3BvcnRfdjcgKmZvdW5kUG9ydCkgeworICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX3BvcnRfdjc+IHBvcnRzOworICAgIGdldEF1ZGlvUG9ydHMoQVVESU9fUE9SVF9UWVBFX0RFVklDRSwgcm9sZSwgJnBvcnRzKTsKICAgICBpZiAoSGFzRmFpbHVyZSgpKSByZXR1cm4gZmFsc2U7CiAKICAgICBmb3IgKGNvbnN0IGF1dG8gJnBvcnQgOiBwb3J0cykgewpAQCAtMzczLDYgKzM4MSw3IEBACiAgIHByb3RlY3RlZDoKICAgICB2b2lkIFNldFVwTWFuYWdlckNvbmZpZygpIG92ZXJyaWRlOwogICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKKyAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgZ2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cik7CiAKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtTXNkT3V0cHV0RGV2aWNlOwogICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1Nc2RJbnB1dERldmljZTsKQEAgLTQwMSw3ICs0MTAsNyBAQAogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2Q6OlNldFVwTWFuYWdlckNvbmZpZygpIHsKICAgICAvLyBUT0RPOiBDb25zaWRlciB1c2luZyBTZXJpYWxpemVyIHRvIGxvYWQgcGFydCBvZiB0aGUgY29uZmlnIGZyb20gYSBzdHJpbmcuCi0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6U2V0VXBNYW5hZ2VyQ29uZmlnKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6U2V0VXBNYW5hZ2VyQ29uZmlnKCkpOwogICAgIEF1ZGlvUG9saWN5Q29uZmlnJiBjb25maWcgPSBtTWFuYWdlci0+Z2V0Q29uZmlnKCk7CiAgICAgbU1zZE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9PVVRfQlVTKTsKICAgICBzcDxBdWRpb1Byb2ZpbGU+IHBjbU91dHB1dFByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKApAQCAtNTAyLDYgKzUxMSwxMyBAQAogICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OlRlYXJEb3duKCk7CiB9CiAKK0F1ZGlvUHJvZmlsZVZlY3RvciBBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkOjpnZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyKSB7CisgICAgQXVkaW9Qcm9maWxlVmVjdG9yIGF1ZGlvUHJvZmlsZXNWZWN0b3I7CisgICAgbU1hbmFnZXItPmdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcygmYXR0ciwgYXVkaW9Qcm9maWxlc1ZlY3Rvcik7CisgICAgcmV0dXJuIGF1ZGlvUHJvZmlsZXNWZWN0b3I7Cit9CisKIFRFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBJbml0U3VjY2VzcykgewogICAgIEFTU0VSVF9UUlVFKG1Nc2RPdXRwdXREZXZpY2UpOwogICAgIEFTU0VSVF9UUlVFKG1Nc2RJbnB1dERldmljZSk7CkBAIC02NDIsNiArNjU4LDIwMCBAQAogICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOwogfQogCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzV2l0aE1zZCkgeworICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0geworICAgICAgICBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKKyAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9OworCisgICAgLy8gY291bnQgZXhwZWN0ZWQgZGlyZWN0IHByb2ZpbGVzIGZvciB0aGUgZGVmYXVsdCBkZXZpY2UKKyAgICBpbnQgY291bnREaXJlY3RQcm9maWxlc1ByaW1hcnkgPSAwOworICAgIGNvbnN0IGF1dG8mIHByaW1hcnkgPSBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0SHdNb2R1bGVzKCkKKyAgICAgICAgICAgIC5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSk7CisgICAgZm9yIChjb25zdCBhdXRvIG91dHB1dFByb2ZpbGUgOiBwcmltYXJ5LT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CisgICAgICAgIGlmIChvdXRwdXRQcm9maWxlLT5hc0F1ZGlvUG9ydCgpLT5pc0RpcmVjdE91dHB1dCgpKSB7CisgICAgICAgICAgICBjb3VudERpcmVjdFByb2ZpbGVzUHJpbWFyeSArPSBvdXRwdXRQcm9maWxlLT5hc0F1ZGlvUG9ydCgpLT5nZXRBdWRpb1Byb2ZpbGVzKCkuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gY291bnQgZXhwZWN0ZWQgZGlyZWN0IHByb2ZpbGVzIGZvciB0aGUgbXNkIGRldmljZQorICAgIGludCBjb3VudERpcmVjdFByb2ZpbGVzTXNkID0gMDsKKyAgICBjb25zdCBhdXRvJiBtc2QgPSBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0SHdNb2R1bGVzKCkKKyAgICAgICAgICAgIC5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gb3V0cHV0UHJvZmlsZSA6IG1zZC0+Z2V0T3V0cHV0UHJvZmlsZXMoKSkgeworICAgICAgICBpZiAob3V0cHV0UHJvZmlsZS0+YXNBdWRpb1BvcnQoKS0+aXNEaXJlY3RPdXRwdXQoKSkgeworICAgICAgICAgICAgY291bnREaXJlY3RQcm9maWxlc01zZCArPSBvdXRwdXRQcm9maWxlLT5hc0F1ZGlvUG9ydCgpLT5nZXRBdWRpb1Byb2ZpbGVzKCkuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gYmVmb3JlIHNldHRpbmcgdXAgTVNEIGF1ZGlvIHBhdGNoZXMgd2Ugb25seSBoYXZlIHRoZSBwcmltYXJ5IGhhbCBkaXJlY3QgcHJvZmlsZXMKKyAgICBBU1NFUlRfRVEoY291bnREaXJlY3RQcm9maWxlc1ByaW1hcnksIGdldERpcmVjdFByb2ZpbGVzRm9yQXR0cmlidXRlcyhhdHRyKS5zaXplKCkpOworCisgICAgRGV2aWNlVmVjdG9yIG91dHB1dERldmljZXMgPSBtTWFuYWdlci0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIC8vIFJlbW92ZSBNU0Qgb3V0cHV0IGRldmljZSB0byBhdm9pZCBwYXRjaGluZyB0byBpdHNlbGYKKyAgICBvdXRwdXREZXZpY2VzLnJlbW92ZShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBtTWFuYWdlci0+c2V0TXNkT3V0cHV0UGF0Y2hlcygmb3V0cHV0RGV2aWNlcyk7CisKKyAgICAvLyBhZnRlciBzZXR0aW5nIHVwIE1TRCBhdWRpbyBwYXRjaGVzIHRoZSBNU0QgZGlyZWN0IHByb2ZpbGVzIGFyZSBhZGRlZAorICAgIEFTU0VSVF9FUShjb3VudERpcmVjdFByb2ZpbGVzUHJpbWFyeSArIGNvdW50RGlyZWN0UHJvZmlsZXNNc2QsCisgICAgICAgICAgICAgICAgZ2V0RGlyZWN0UHJvZmlsZXNGb3JBdHRyaWJ1dGVzKGF0dHIpLnNpemUoKSk7CisKKyAgICBtTWFuYWdlci0+cmVsZWFzZU1zZE91dHB1dFBhdGNoZXMob3V0cHV0RGV2aWNlcyk7CisgICAgLy8gcmVsZWFzaW5nIHRoZSBNU0QgYXVkaW8gcGF0Y2hlcyBnZXRzIHVzIGJhY2sgdG8gdGhlIHByaW1hcnkgaGFsIGRpcmVjdCBwcm9maWxlcyBvbmx5CisgICAgQVNTRVJUX0VRKGNvdW50RGlyZWN0UHJvZmlsZXNQcmltYXJ5LCBnZXREaXJlY3RQcm9maWxlc0ZvckF0dHJpYnV0ZXMoYXR0cikuc2l6ZSgpKTsKK30KKworVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIElzRGlyZWN0UGxheWJhY2tTdXBwb3J0ZWRXaXRoTXNkKSB7CisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7CisgICAgICAgIEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAorICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn07CisKKyAgICBhdWRpb19jb25maWdfYmFzZV90IGRpcmVjdENvbmZpZyA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgIGRpcmVjdENvbmZpZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfRFRTOworICAgIGRpcmVjdENvbmZpZy5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgIGRpcmVjdENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxOworCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBub25EaXJlY3RDb25maWcgPSBBVURJT19DT05GSUdfQkFTRV9JTklUSUFMSVpFUjsKKyAgICBub25EaXJlY3RDb25maWcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgbm9uRGlyZWN0Q29uZmlnLnNhbXBsZV9yYXRlID0gNDgwMDA7CisgICAgbm9uRGlyZWN0Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3Qgbm9uRXhpc3RlbnRDb25maWcgPSBBVURJT19DT05GSUdfQkFTRV9JTklUSUFMSVpFUjsKKyAgICBub25FeGlzdGVudENvbmZpZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfRV9BQzM7CisgICAgbm9uRXhpc3RlbnRDb25maWcuc2FtcGxlX3JhdGUgPSA0ODAwMDsKKyAgICBub25FeGlzdGVudENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisKKyAgICBhdWRpb19jb25maWdfYmFzZV90IG1zZERpcmVjdENvbmZpZzEgPSBBVURJT19DT05GSUdfQkFTRV9JTklUSUFMSVpFUjsKKyAgICBtc2REaXJlY3RDb25maWcxLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9BQzM7CisgICAgbXNkRGlyZWN0Q29uZmlnMS5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgIG1zZERpcmVjdENvbmZpZzEuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMTsKKworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgbXNkRGlyZWN0Q29uZmlnMiA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgIG1zZERpcmVjdENvbmZpZzIuZm9ybWF0ID0gQVVESU9fRk9STUFUX0lFQzYwOTU4OworICAgIG1zZERpcmVjdENvbmZpZzIuc2FtcGxlX3JhdGUgPSA0ODAwMDsKKyAgICBtc2REaXJlY3RDb25maWcyLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgbXNkTm9uRGlyZWN0Q29uZmlnID0gQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7CisgICAgbXNkTm9uRGlyZWN0Q29uZmlnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIG1zZE5vbkRpcmVjdENvbmZpZy5zYW1wbGVfcmF0ZSA9IDk2MDAwOworICAgIG1zZE5vbkRpcmVjdENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisKKyAgICBBU1NFUlRfVFJVRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoZGlyZWN0Q29uZmlnLCBhdHRyKSk7CisgICAgQVNTRVJUX0ZBTFNFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChub25EaXJlY3RDb25maWcsIGF0dHIpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG5vbkV4aXN0ZW50Q29uZmlnLCBhdHRyKSk7CisgICAgLy8gYmVmb3JlIHNldHRpbmcgTVNEIHBhdGNoZXMgdGhlIGRpcmVjdCBNU0QgY29uZmlncyByZXR1cm4gZmFsc2UKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG1zZERpcmVjdENvbmZpZzEsIGF0dHIpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG1zZERpcmVjdENvbmZpZzIsIGF0dHIpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG1zZE5vbkRpcmVjdENvbmZpZywgYXR0cikpOworCisgICAgRGV2aWNlVmVjdG9yIG91dHB1dERldmljZXMgPSBtTWFuYWdlci0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIC8vIFJlbW92ZSBNU0Qgb3V0cHV0IGRldmljZSB0byBhdm9pZCBwYXRjaGluZyB0byBpdHNlbGYKKyAgICBvdXRwdXREZXZpY2VzLnJlbW92ZShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBtTWFuYWdlci0+c2V0TXNkT3V0cHV0UGF0Y2hlcygmb3V0cHV0RGV2aWNlcyk7CisKKyAgICBBU1NFUlRfVFJVRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoZGlyZWN0Q29uZmlnLCBhdHRyKSk7CisgICAgQVNTRVJUX0ZBTFNFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChub25EaXJlY3RDb25maWcsIGF0dHIpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG5vbkV4aXN0ZW50Q29uZmlnLCBhdHRyKSk7CisgICAgLy8gYWZ0ZXIgc2V0dGluZyBNU0QgcGF0Y2hlcyB0aGUgZGlyZWN0IE1TRCBjb25maWdzIHJldHVybiB0cnVlCisgICAgQVNTRVJUX1RSVUUobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG1zZERpcmVjdENvbmZpZzEsIGF0dHIpKTsKKyAgICBBU1NFUlRfVFJVRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobXNkRGlyZWN0Q29uZmlnMiwgYXR0cikpOworICAgIEFTU0VSVF9GQUxTRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQobXNkTm9uRGlyZWN0Q29uZmlnLCBhdHRyKSk7CisKKyAgICBtTWFuYWdlci0+cmVsZWFzZU1zZE91dHB1dFBhdGNoZXMob3V0cHV0RGV2aWNlcyk7CisKKyAgICBBU1NFUlRfVFJVRShtTWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoZGlyZWN0Q29uZmlnLCBhdHRyKSk7CisgICAgQVNTRVJUX0ZBTFNFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChub25EaXJlY3RDb25maWcsIGF0dHIpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKG5vbkV4aXN0ZW50Q29uZmlnLCBhdHRyKSk7CisgICAgLy8gQUZURVIgcmVsZWFzaW5nIE1TRCBwYXRjaGVzIHRoZSBkaXJlY3QgTVNEIGNvbmZpZ3MgcmV0dXJuIGZhbHNlCisgICAgQVNTRVJUX0ZBTFNFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChtc2REaXJlY3RDb25maWcxLCBhdHRyKSk7CisgICAgQVNTRVJUX0ZBTFNFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChtc2REaXJlY3RDb25maWcyLCBhdHRyKSk7CisgICAgQVNTRVJUX0ZBTFNFKG1NYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChtc2ROb25EaXJlY3RDb25maWcsIGF0dHIpKTsKK30KKworVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldERpcmVjdFBsYXliYWNrU3VwcG9ydFdpdGhNc2QpIHsKKyAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHsKKyAgICAgICAgQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sCisgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifTsKKworICAgIGF1ZGlvX2NvbmZpZ190IGRpcmVjdENvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICBkaXJlY3RDb25maWcuZm9ybWF0ID0gQVVESU9fRk9STUFUX0RUUzsKKyAgICBkaXJlY3RDb25maWcuc2FtcGxlX3JhdGUgPSA0ODAwMDsKKyAgICBkaXJlY3RDb25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMTsKKworICAgIGF1ZGlvX2NvbmZpZ190IG5vbkRpcmVjdENvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICBub25EaXJlY3RDb25maWcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgbm9uRGlyZWN0Q29uZmlnLnNhbXBsZV9yYXRlID0gNDgwMDA7CisgICAgbm9uRGlyZWN0Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKworICAgIGF1ZGlvX2NvbmZpZ190IG5vbkV4aXN0ZW50Q29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIG5vbkV4aXN0ZW50Q29uZmlnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9FX0FDMzsKKyAgICBub25FeGlzdGVudENvbmZpZy5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgIG5vbkV4aXN0ZW50Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKworICAgIGF1ZGlvX2NvbmZpZ190IG1zZERpcmVjdENvbmZpZzEgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgbXNkRGlyZWN0Q29uZmlnMS5mb3JtYXQgPSBBVURJT19GT1JNQVRfQUMzOworICAgIG1zZERpcmVjdENvbmZpZzEuc2FtcGxlX3JhdGUgPSA0ODAwMDsKKyAgICBtc2REaXJlY3RDb25maWcxLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDE7CisKKyAgICBhdWRpb19jb25maWdfdCBtc2REaXJlY3RDb25maWcyID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIG1zZERpcmVjdENvbmZpZzIuZm9ybWF0ID0gQVVESU9fRk9STUFUX0lFQzYwOTU4OworICAgIG1zZERpcmVjdENvbmZpZzIuc2FtcGxlX3JhdGUgPSA0ODAwMDsKKyAgICBtc2REaXJlY3RDb25maWcyLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKworICAgIGF1ZGlvX2NvbmZpZ190IG1zZE5vbkRpcmVjdENvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICBtc2ROb25EaXJlY3RDb25maWcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgbXNkTm9uRGlyZWN0Q29uZmlnLnNhbXBsZV9yYXRlID0gOTYwMDA7CisgICAgbXNkTm9uRGlyZWN0Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfQklUU1RSRUFNX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmZGlyZWN0Q29uZmlnKSk7CisgICAgQVNTRVJUX0VRKEFVRElPX0RJUkVDVF9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5nZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoJmF0dHIsICZub25EaXJlY3RDb25maWcpKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJm5vbkV4aXN0ZW50Q29uZmlnKSk7CisgICAgLy8gYmVmb3JlIHNldHRpbmcgTVNEIHBhdGNoZXMgdGhlIGRpcmVjdCBNU0QgY29uZmlncyByZXR1cm4gQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJm1zZERpcmVjdENvbmZpZzEpKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJm1zZERpcmVjdENvbmZpZzIpKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJm1zZE5vbkRpcmVjdENvbmZpZykpOworCisgICAgRGV2aWNlVmVjdG9yIG91dHB1dERldmljZXMgPSBtTWFuYWdlci0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIC8vIFJlbW92ZSBNU0Qgb3V0cHV0IGRldmljZSB0byBhdm9pZCBwYXRjaGluZyB0byBpdHNlbGYKKyAgICBvdXRwdXREZXZpY2VzLnJlbW92ZShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBtTWFuYWdlci0+c2V0TXNkT3V0cHV0UGF0Y2hlcygmb3V0cHV0RGV2aWNlcyk7CisKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX0JJVFNUUkVBTV9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJmRpcmVjdENvbmZpZykpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbm9uRGlyZWN0Q29uZmlnKSk7CisgICAgQVNTRVJUX0VRKEFVRElPX0RJUkVDVF9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5nZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoJmF0dHIsICZub25FeGlzdGVudENvbmZpZykpOworICAgIC8vIGFmdGVyIHNldHRpbmcgTVNEIHBhdGNoZXMgdGhlIGRpcmVjdCBNU0QgY29uZmlncyByZXR1cm4gdmFsdWVzIGFjY29yZGluZyB0byB0aGVpciBmbGFncworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfT0ZGTE9BRF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJm1zZERpcmVjdENvbmZpZzEpKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX0JJVFNUUkVBTV9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJm1zZERpcmVjdENvbmZpZzIpKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJm1zZE5vbkRpcmVjdENvbmZpZykpOworCisgICAgbU1hbmFnZXItPnJlbGVhc2VNc2RPdXRwdXRQYXRjaGVzKG91dHB1dERldmljZXMpOworCisgICAgQVNTRVJUX0VRKEFVRElPX0RJUkVDVF9CSVRTVFJFQU1fU1VQUE9SVEVELAorICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5nZXREaXJlY3RQbGF5YmFja1N1cHBvcnQoJmF0dHIsICZkaXJlY3RDb25maWcpKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJm5vbkRpcmVjdENvbmZpZykpOworICAgIEFTU0VSVF9FUShBVURJT19ESVJFQ1RfTk9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0RGlyZWN0UGxheWJhY2tTdXBwb3J0KCZhdHRyLCAmbm9uRXhpc3RlbnRDb25maWcpKTsKKyAgICAvLyBhZnRlciByZWxlYXNpbmcgTVNEIHBhdGNoZXMgdGhlIGRpcmVjdCBNU0QgY29uZmlncyByZXR1cm4gQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJm1zZERpcmVjdENvbmZpZzEpKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJm1zZERpcmVjdENvbmZpZzIpKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRElSRUNUX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERpcmVjdFBsYXliYWNrU3VwcG9ydCgmYXR0ciwgJm1zZE5vbkRpcmVjdENvbmZpZykpOworfQorCiBjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0V2l0aENvbmZpZ3VyYXRpb25GaWxlIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3QgewogcHJvdGVjdGVkOgogICAgIHZvaWQgU2V0VXBNYW5hZ2VyQ29uZmlnKCkgb3ZlcnJpZGU7CkBAIC02NjAsNiArODcwLDcgQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdFdpdGhDb25maWd1cmF0aW9uRmlsZTo6U2V0VXBNYW5hZ2VyQ29uZmlnKCkgewogICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGdldENvbmZpZ0ZpbGUoKS5jX3N0cigpLCAmbU1hbmFnZXItPmdldENvbmZpZygpKTsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHN0YXR1cyk7CisgICAgbU1hbmFnZXItPmdldENvbmZpZygpLnNldFNvdXJjZShnZXRDb25maWdGaWxlKCkpOwogfQogCiBURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdFdpdGhDb25maWd1cmF0aW9uRmlsZSwgSW5pdFN1Y2Nlc3MpIHsKQEAgLTY3MCw2ICs4ODEsNDQgQEAKICAgICBkdW1wVG9Mb2coKTsKIH0KIAorVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RXaXRoQ29uZmlndXJhdGlvbkZpbGUsIExpc3RBdWRpb1BvcnRzSGFzRmxhZ3MpIHsKKyAgICAvLyBDcmVhdGUgYW4gaW5wdXQgZm9yIFZPSVAgVFggYmVjYXVzZSBpdCdzIG5vdCBvcGVuZWQgYXV0b21hdGljYWxseSBsaWtlIG91dHB1dHMgYXJlLgorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtaXhQb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0geworICAgICAgICBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgc291cmNlLCBBVURJT19GTEFHX05PTkUsICIifTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEZvckF0dHIoYXR0ciwgMSwgJnNlbGVjdGVkRGV2aWNlSWQsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX01PTk8sIDgwMDAsIEFVRElPX0lOUFVUX0ZMQUdfVk9JUF9UWCwgJm1peFBvcnRJZCkpOworCisgICAgc3RkOjp2ZWN0b3I8YXVkaW9fcG9ydF92Nz4gcG9ydHM7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBnZXRBdWRpb1BvcnRzKEFVRElPX1BPUlRfVFlQRV9NSVgsIEFVRElPX1BPUlRfUk9MRV9OT05FLCAmcG9ydHMpKTsKKyAgICBFWFBFQ1RfTkUoMCwgcG9ydHMuc2l6ZSgpKTsKKyAgICBib29sIGhhc0ZsYWdzID0gZmFsc2UsIGZvdW5kUHJpbWFyeSA9IGZhbHNlLCBmb3VuZFZvaXBSeCA9IGZhbHNlLCBmb3VuZFZvaXBUeCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgcG9ydCA6IHBvcnRzKSB7CisgICAgICAgIGlmICgocG9ydC5hY3RpdmVfY29uZmlnLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MpICE9IDApIHsKKyAgICAgICAgICAgIGhhc0ZsYWdzID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChwb3J0LnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgeworICAgICAgICAgICAgICAgIGlmICgocG9ydC5hY3RpdmVfY29uZmlnLmZsYWdzLm91dHB1dCAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmRQcmltYXJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChwb3J0LmFjdGl2ZV9jb25maWcuZmxhZ3Mub3V0cHV0ICYgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZFZvaXBSeCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChwb3J0LnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBvcnQuYWN0aXZlX2NvbmZpZy5mbGFncy5pbnB1dCAmIEFVRElPX0lOUFVUX0ZMQUdfVk9JUF9UWCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZFZvaXBUeCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEVYUEVDVF9UUlVFKGhhc0ZsYWdzKTsKKyAgICBFWFBFQ1RfVFJVRShmb3VuZFByaW1hcnkpOworICAgIEVYUEVDVF9UUlVFKGZvdW5kVm9pcFJ4KTsKKyAgICBFWFBFQ1RfVFJVRShmb3VuZFZvaXBUeCk7Cit9CisKIHVzaW5nIFBvbGljeU1peFR1cGxlID0gc3RkOjp0dXBsZTxhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdCwgdWludDMyX3Q+OwogCiBjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RHluYW1pY1BvbGljeSA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0V2l0aENvbmZpZ3VyYXRpb25GaWxlIHsKQEAgLTgwMyw3ICsxMDUyLDggQEAKIH0KIAogY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWkKLSAgICAgICAgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdFdpdGhDb25maWd1cmF0aW9uRmlsZSB7CisgICAgICAgIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RXaXRoQ29uZmlndXJhdGlvbkZpbGUsCisgICAgICAgICAgcHVibGljIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxhdWRpb19mb3JtYXRfdD4gewogcHJvdGVjdGVkOgogICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKICAgICBzdGQ6OnN0cmluZyBnZXRDb25maWdGaWxlKCkgb3ZlcnJpZGUgeyByZXR1cm4gc1R2Q29uZmlnOyB9CkBAIC04MjQsNyArMTA3NCw4IEBACiAgICAgICAgICJ0ZXN0X3NldHRvcF9ib3hfc3Vycm91bmRfY29uZmlndXJhdGlvbi54bWwiOwogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pOjpTZXRVcCgpIHsKLSAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpTZXRVcCgpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OlNldFVwKCkpOworICAgIG1DbGllbnQtPmFkZFN1cHBvcnRlZEZvcm1hdChBVURJT19GT1JNQVRfQUMzKTsKICAgICBtQ2xpZW50LT5hZGRTdXBwb3J0ZWRGb3JtYXQoQVVESU9fRk9STUFUX0VfQUMzKTsKICAgICBtTWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAogICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKQEAgLTkxNCw3NiArMTE2NSw5MCBAQAogICAgIHJldHVybiBmb3JtYXRzOwogfQogCi1URVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksIEdldFN1cnJvdW5kRm9ybWF0c1JldHVybnNTdXBwb3J0ZWRGb3JtYXRzKSB7CitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWksIEdldFN1cnJvdW5kRm9ybWF0c1JldHVybnNTdXBwb3J0ZWRGb3JtYXRzKSB7CiAgICAgbU1hbmFnZXItPnNldEZvcmNlVXNlKAogICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5ELCBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpOwogICAgIGF1dG8gc3Vycm91bmRGb3JtYXRzID0gZ2V0U3Vycm91bmRGb3JtYXRzSGVscGVyKCk7Ci0gICAgQVNTRVJUX0VRKDEsIHN1cnJvdW5kRm9ybWF0cy5jb3VudChBVURJT19GT1JNQVRfRV9BQzMpKTsKKyAgICBBU1NFUlRfRVEoMSwgc3Vycm91bmRGb3JtYXRzLmNvdW50KEdldFBhcmFtKCkpKTsKIH0KIAotVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLAorVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLAogICAgICAgICBHZXRTdXJyb3VuZEZvcm1hdHNSZXR1cm5zTWFuaXB1bGF0ZWRGb3JtYXRzKSB7CiAgICAgbU1hbmFnZXItPnNldEZvcmNlVXNlKAogICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5ELCBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpOwogCiAgICAgc3RhdHVzX3QgcmV0ID0KLSAgICAgICAgICAgIG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoQVVESU9fRk9STUFUX0VfQUMzLCBmYWxzZSAvKmVuYWJsZWQqLyk7CisgICAgICAgICAgICBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEdldFBhcmFtKCksIGZhbHNlIC8qZW5hYmxlZCovKTsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJldCk7CiAgICAgYXV0byBzdXJyb3VuZEZvcm1hdHMgPSBnZXRTdXJyb3VuZEZvcm1hdHNIZWxwZXIoKTsKLSAgICBBU1NFUlRfRVEoMSwgc3Vycm91bmRGb3JtYXRzLmNvdW50KEFVRElPX0ZPUk1BVF9FX0FDMykpOwotICAgIEFTU0VSVF9GQUxTRShzdXJyb3VuZEZvcm1hdHNbQVVESU9fRk9STUFUX0VfQUMzXSk7CisgICAgQVNTRVJUX0VRKDEsIHN1cnJvdW5kRm9ybWF0cy5jb3VudChHZXRQYXJhbSgpKSk7CisgICAgQVNTRVJUX0ZBTFNFKHN1cnJvdW5kRm9ybWF0c1tHZXRQYXJhbSgpXSk7CiAKLSAgICByZXQgPSBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEFVRElPX0ZPUk1BVF9FX0FDMywgdHJ1ZSAvKmVuYWJsZWQqLyk7CisgICAgcmV0ID0gbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChHZXRQYXJhbSgpLCB0cnVlIC8qZW5hYmxlZCovKTsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJldCk7CiAgICAgc3Vycm91bmRGb3JtYXRzID0gZ2V0U3Vycm91bmRGb3JtYXRzSGVscGVyKCk7Ci0gICAgQVNTRVJUX0VRKDEsIHN1cnJvdW5kRm9ybWF0cy5jb3VudChBVURJT19GT1JNQVRfRV9BQzMpKTsKLSAgICBBU1NFUlRfVFJVRShzdXJyb3VuZEZvcm1hdHNbQVVESU9fRk9STUFUX0VfQUMzXSk7CisgICAgQVNTRVJUX0VRKDEsIHN1cnJvdW5kRm9ybWF0cy5jb3VudChHZXRQYXJhbSgpKSk7CisgICAgQVNTRVJUX1RSVUUoc3Vycm91bmRGb3JtYXRzW0dldFBhcmFtKCldKTsKIAotICAgIHJldCA9IG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoQVVESU9fRk9STUFUX0VfQUMzLCBmYWxzZSAvKmVuYWJsZWQqLyk7CisgICAgcmV0ID0gbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChHZXRQYXJhbSgpLCBmYWxzZSAvKmVuYWJsZWQqLyk7CiAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXQpOwogICAgIHN1cnJvdW5kRm9ybWF0cyA9IGdldFN1cnJvdW5kRm9ybWF0c0hlbHBlcigpOwotICAgIEFTU0VSVF9FUSgxLCBzdXJyb3VuZEZvcm1hdHMuY291bnQoQVVESU9fRk9STUFUX0VfQUMzKSk7Ci0gICAgQVNTRVJUX0ZBTFNFKHN1cnJvdW5kRm9ybWF0c1tBVURJT19GT1JNQVRfRV9BQzNdKTsKKyAgICBBU1NFUlRfRVEoMSwgc3Vycm91bmRGb3JtYXRzLmNvdW50KEdldFBhcmFtKCkpKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3Vycm91bmRGb3JtYXRzW0dldFBhcmFtKCldKTsKIH0KIAotVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLAorVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLAogICAgICAgICBMaXN0QXVkaW9Qb3J0c1JldHVybk1hbmlwdWxhdGVkSGRtaUZvcm1hdHMpIHsKICAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQsIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCk7CiAKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoQVVESU9fRk9STUFUX0VfQUMzLCBmYWxzZSAvKmVuYWJsZWQqLykpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChHZXRQYXJhbSgpLCBmYWxzZSAvKmVuYWJsZWQqLykpOwogICAgIGF1dG8gZm9ybWF0cyA9IGdldEZvcm1hdHNGcm9tUG9ydHMoKTsKLSAgICBBU1NFUlRfRVEoMCwgZm9ybWF0cy5jb3VudChBVURJT19GT1JNQVRfRV9BQzMpKTsKKyAgICBBU1NFUlRfRVEoMCwgZm9ybWF0cy5jb3VudChHZXRQYXJhbSgpKSk7CiAKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoQVVESU9fRk9STUFUX0VfQUMzLCB0cnVlIC8qZW5hYmxlZCovKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEdldFBhcmFtKCksIHRydWUgLyplbmFibGVkKi8pKTsKICAgICBmb3JtYXRzID0gZ2V0Rm9ybWF0c0Zyb21Qb3J0cygpOwotICAgIEFTU0VSVF9FUSgxLCBmb3JtYXRzLmNvdW50KEFVRElPX0ZPUk1BVF9FX0FDMykpOworICAgIEFTU0VSVF9FUSgxLCBmb3JtYXRzLmNvdW50KEdldFBhcmFtKCkpKTsKIH0KIAotVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLAorVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLAogICAgICAgICBHZXRSZXBvcnRlZFN1cnJvdW5kRm9ybWF0c1JldHVybnNIZG1pUmVwb3J0ZWRGb3JtYXRzKSB7CiAgICAgbU1hbmFnZXItPnNldEZvcmNlVXNlKAogICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5ELCBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpOwogICAgIGF1dG8gc3Vycm91bmRGb3JtYXRzID0gZ2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHNIZWxwZXIoKTsKLSAgICBBU1NFUlRfRVEoMSwgc3RkOjpjb3VudChzdXJyb3VuZEZvcm1hdHMuYmVnaW4oKSwgc3Vycm91bmRGb3JtYXRzLmVuZCgpLCBBVURJT19GT1JNQVRfRV9BQzMpKTsKKyAgICBBU1NFUlRfRVEoMSwgc3RkOjpjb3VudChzdXJyb3VuZEZvcm1hdHMuYmVnaW4oKSwgc3Vycm91bmRGb3JtYXRzLmVuZCgpLCBHZXRQYXJhbSgpKSk7CiB9CiAKLVRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaSwKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaSwKICAgICAgICAgR2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHNSZXR1cm5zTm9uTWFuaXB1bGF0ZWRIZG1pUmVwb3J0ZWRGb3JtYXRzKSB7CiAgICAgbU1hbmFnZXItPnNldEZvcmNlVXNlKAogICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5ELCBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpOwogCi0gICAgc3RhdHVzX3QgcmV0ID0gbU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChBVURJT19GT1JNQVRfRV9BQzMsIGZhbHNlIC8qZW5hYmxlZCovKTsKKyAgICBzdGF0dXNfdCByZXQgPSBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEdldFBhcmFtKCksIGZhbHNlIC8qZW5hYmxlZCovKTsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJldCk7CiAgICAgYXV0byBzdXJyb3VuZEZvcm1hdHMgPSBnZXRSZXBvcnRlZFN1cnJvdW5kRm9ybWF0c0hlbHBlcigpOwotICAgIEFTU0VSVF9FUSgxLCBzdGQ6OmNvdW50KHN1cnJvdW5kRm9ybWF0cy5iZWdpbigpLCBzdXJyb3VuZEZvcm1hdHMuZW5kKCksIEFVRElPX0ZPUk1BVF9FX0FDMykpOworICAgIEFTU0VSVF9FUSgxLCBzdGQ6OmNvdW50KHN1cnJvdW5kRm9ybWF0cy5iZWdpbigpLCBzdXJyb3VuZEZvcm1hdHMuZW5kKCksIEdldFBhcmFtKCkpKTsKIAotICAgIHJldCA9IG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoQVVESU9fRk9STUFUX0VfQUMzLCB0cnVlIC8qZW5hYmxlZCovKTsKKyAgICByZXQgPSBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEdldFBhcmFtKCksIHRydWUgLyplbmFibGVkKi8pOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmV0KTsKICAgICBzdXJyb3VuZEZvcm1hdHMgPSBnZXRSZXBvcnRlZFN1cnJvdW5kRm9ybWF0c0hlbHBlcigpOwotICAgIEFTU0VSVF9FUSgxLCBzdGQ6OmNvdW50KHN1cnJvdW5kRm9ybWF0cy5iZWdpbigpLCBzdXJyb3VuZEZvcm1hdHMuZW5kKCksIEFVRElPX0ZPUk1BVF9FX0FDMykpOworICAgIEFTU0VSVF9FUSgxLCBzdGQ6OmNvdW50KHN1cnJvdW5kRm9ybWF0cy5iZWdpbigpLCBzdXJyb3VuZEZvcm1hdHMuZW5kKCksIEdldFBhcmFtKCkpKTsKIH0KIAorVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLCBHZXRTdXJyb3VuZEZvcm1hdHNJZ25vcmVzU3VwcG9ydGVkRm9ybWF0cykgeworICAgIG1NYW5hZ2VyLT5zZXRGb3JjZVVzZSgKKyAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCwgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTkVWRVIpOworICAgIGF1dG8gc3Vycm91bmRGb3JtYXRzID0gZ2V0U3Vycm91bmRGb3JtYXRzSGVscGVyKCk7CisgICAgQVNTRVJUX0VRKDEsIHN1cnJvdW5kRm9ybWF0cy5jb3VudChHZXRQYXJhbSgpKSk7CisgICAgQVNTRVJUX0ZBTFNFKHN1cnJvdW5kRm9ybWF0c1tHZXRQYXJhbSgpXSk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChTdXJyb3VuZEZvcm1hdFN1cHBvcnQsIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLAorICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMoQVVESU9fRk9STUFUX0FDMywgQVVESU9fRk9STUFUX0VfQUMzKSwKKyAgICAgICAgW10oY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pOjpQYXJhbVR5cGU+JiBpbmZvKSB7CisgICAgICAgICAgICByZXR1cm4gYXVkaW9fZm9ybWF0X3RvX3N0cmluZyhpbmZvLnBhcmFtKTsKKyAgICAgICAgfSk7CisKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REUE5vUmVtb3RlU3VibWl4TW9kdWxlIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REeW5hbWljUG9saWN5IHsKIHByb3RlY3RlZDoKICAgICBzdGQ6OnN0cmluZyBnZXRDb25maWdGaWxlKCkgb3ZlcnJpZGUgeyByZXR1cm4gc1ByaW1hcnlPbmx5Q29uZmlnOyB9CkBAIC0xMDM1LDcgKzEzMDAsNyBAQAogfTsKIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBQbGF5YmFja1JlUm91dGluZzo6U2V0VXAoKSB7Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdER5bmFtaWNQb2xpY3k6OlNldFVwKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdER5bmFtaWNQb2xpY3k6OlNldFVwKCkpOwogCiAgICAgbVRyYWNrZXIucmVzZXQobmV3IFJlY29yZGluZ0FjdGl2aXR5VHJhY2tlcigpKTsKIApAQCAtMTIyMSw3ICsxNDg2LDcgQEAKIH07CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERQTWl4UmVjb3JkSW5qZWN0aW9uOjpTZXRVcCgpIHsKLSAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RHluYW1pY1BvbGljeTo6U2V0VXAoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShBdWRpb1BvbGljeU1hbmFnZXJUZXN0RHluYW1pY1BvbGljeTo6U2V0VXAoKSk7CiAKICAgICBtVHJhY2tlci5yZXNldChuZXcgUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyKCkpOwogCkBAIC0xMzc1LDcgKzE2NDAsOCBAQAogICAgIGlmICh0eXBlID09IEFVRElPX0RFVklDRV9PVVRfSERNSSkgewogICAgICAgICAvLyBTZXQgZGV2aWNlIGNvbm5lY3Rpb24gc3RhdGUgZmFpbGVkIGR1ZSB0byBubyBkZXZpY2UgZGVzY3JpcHRvciBmb3VuZAogICAgICAgICAvLyBGb3IgSERNSSBjYXNlLCBpdCBpcyBlYXNpZXIgdG8gc2ltdWxhdGUgZGV2aWNlIGRlc2NyaXB0b3Igbm90IGZvdW5kIGVycm9yCi0gICAgICAgIC8vIGJ5IHVzaW5nIGEgdW5kZWNsYXJlZCBlbmNvZGVkIGZvcm1hdC4KKyAgICAgICAgLy8gYnkgdXNpbmcgYW4gZW5jb2RlZCBmb3JtYXQgd2hpY2ggaXNuJ3QgbGlzdGVkIGluIHRoZSAnZW5jb2RlZEZvcm1hdHMnCisgICAgICAgIC8vIGF0dHJpYnV0ZSBmb3IgdGhpcyBkZXZpY2VQb3J0LgogICAgICAgICBBU1NFUlRfRVEoSU5WQUxJRF9PUEVSQVRJT04sIG1NYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCiAgICAgICAgICAgICAgICAgdHlwZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgYWRkcmVzcy5jX3N0cigpLCBuYW1lLmNfc3RyKCksIEFVRElPX0ZPUk1BVF9NQVRfMl8xKSk7CkBAIC0xNTE5LDcgKzE3ODUsNyBAQAogfTsKIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJEeW5hbWljSHdNb2R1bGVzVGVzdDo6U2V0VXBNYW5hZ2VyQ29uZmlnKCkgewotICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RXaXRoQ29uZmlndXJhdGlvbkZpbGU6OlNldFVwTWFuYWdlckNvbmZpZygpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RXaXRoQ29uZmlndXJhdGlvbkZpbGU6OlNldFVwTWFuYWdlckNvbmZpZygpKTsKICAgICAvLyBPbmx5IGFsbG93IHN1Y2Nlc3NmdWwgb3BlbmluZyBvZiAicHJpbWFyeSIgaHcgbW9kdWxlIGR1cmluZyBBUE0gaW5pdGlhbGl6YXRpb24uCiAgICAgbUNsaWVudC0+c3dhcEFsbG93ZWRNb2R1bGVOYW1lcyh7InByaW1hcnkifSk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9yZXNvdXJjZXMvdGVzdF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9yZXNvdXJjZXMvdGVzdF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKaW5kZXggODdmMGFiOS4uNWUxODIyYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL3Rlc3RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMTQsNyArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogCi08YXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIHZlcnNpb249IjEuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSI3LjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KICAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJ0cnVlIi8+CiAKICAgICA8bW9kdWxlcz4KQEAgLTQxLDggKzQxLDE4IEBACiAgICAgICAgICAgICAgICAgPC9taXhQb3J0PgogICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1peHBvcnRfYnRfaGZwX2lucHV0IiByb2xlPSJzaW5rIj4KICAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDExMDI1LDE2MDAwLDQ0MTAwLDQ4MDAwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPLEFVRElPX0NIQU5ORUxfSU5fTU9OTyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDExMDI1IDE2MDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIEFVRElPX0NIQU5ORUxfSU5fTU9OTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJ2b2lwX3R4IiByb2xlPSJzaW5rIgorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzPSJBVURJT19JTlBVVF9GTEFHX1ZPSVBfVFgiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAgMzIwMDAgNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9InZvaXBfcngiIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAgMzIwMDAgNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CiAgICAgICAgICAgICAgICAgPC9taXhQb3J0PgogICAgICAgICAgICAgPC9taXhQb3J0cz4KICAgICAgICAgICAgIDxkZXZpY2VQb3J0cz4KQEAgLTUwLDcgKzYwLDggQEAKICAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CiAgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQnVpbHQtSW4gTWljIiB0eXBlPSJBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMiIHJvbGU9InNvdXJjZSI+CiAgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgotICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkhkbWkiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfSERNSSIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iSGRtaSIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRE1JIiByb2xlPSJzaW5rIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRGb3JtYXRzPSJBVURJT19GT1JNQVRfQUMzIj4KICAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CiAgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iSGRtaS1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9IRE1JIiByb2xlPSJzb3VyY2UiPgogICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KQEAgLTYzLDEzICs3NCwxNSBAQAogICAgICAgICAgICAgPC9kZXZpY2VQb3J0cz4KICAgICAgICAgICAgIDxyb3V0ZXM+CiAgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iU3BlYWtlciIKLSAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icHJpbWFyeSBvdXRwdXQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icHJpbWFyeSBvdXRwdXQsdm9pcF9yeCIvPgogICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9InByaW1hcnkgaW5wdXQiCiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IkJ1aWx0LUluIE1pYyxIZG1pLUluIE1pYyIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9InZvaXBfdHgiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IkJ1aWx0LUluIE1pYyIvPgogICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkhkbWkiCiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0Ii8+CiAgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgU0NPIgotICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJtaXhwb3J0X2J0X2hmcF9vdXRwdXQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0ibWl4cG9ydF9idF9oZnBfb3V0cHV0LHZvaXBfcngiLz4KICAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJtaXhwb3J0X2J0X2hmcF9pbnB1dCIKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iQlQgU0NPIEhlYWRzZXQgTWljIi8+CiAgICAgICAgICAgICA8L3JvdXRlcz4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwCmluZGV4IDI2NTYyZTAuLjk4MWM1NjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icApAQCAtNDIsMTMgKzQyLDE1IEBACiAKICAgICBzcmNzOiBbCiAgICAgICAgICJDYW1lcmFTZXJ2aWNlLmNwcCIsCisgICAgICAgICJDYW1lcmFTZXJ2aWNlV2F0Y2hkb2cuY3BwIiwKICAgICAgICAgIkNhbWVyYUZsYXNobGlnaHQuY3BwIiwKICAgICAgICAgImNvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAiLAogICAgICAgICAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuY3BwIiwKICAgICAgICAgImNvbW1vbi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UuY3BwIiwKICAgICAgICAgImNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIiwKLSAgICAgICAgImNvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmNwcCIsCiAgICAgICAgICJjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCIsCisgICAgICAgICJjb21tb24vaGlkbC9IaWRsUHJvdmlkZXJJbmZvLmNwcCIsCisgICAgICAgICJjb21tb24vYWlkbC9BaWRsUHJvdmlkZXJJbmZvLmNwcCIsCiAgICAgICAgICJhcGkxL0NhbWVyYTJDbGllbnQuY3BwIiwKICAgICAgICAgImFwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCIsCiAgICAgICAgICJhcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwIiwKQEAgLTc2LDMyICs3OCwzNyBAQAogICAgICAgICAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcCIsCiAgICAgICAgICJkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcCIsCiAgICAgICAgICJkZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAiLAotICAgICAgICAiZGV2aWNlMy9Db29yZGluYXRlTWFwcGVyLmNwcCIsCi0gICAgICAgICJkZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwIiwKLSAgICAgICAgImRldmljZTMvWm9vbVJhdGlvTWFwcGVyLmNwcCIsCi0gICAgICAgICJkZXZpY2UzL1JvdGF0ZUFuZENyb3BNYXBwZXIuY3BwIiwKICAgICAgICAgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5jcHAiLAogICAgICAgICAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuY3BwIiwKICAgICAgICAgImRldmljZTMvQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMuY3BwIiwKICAgICAgICAgImRldmljZTMvVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uTWFwcGVyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL1ByZXZpZXdGcmFtZVNwYWNlci5jcHAiLAorICAgICAgICAiZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzRGV2aWNlLmNwcCIsCisgICAgICAgICJkZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5jcHAiLAorICAgICAgICAiZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT3V0cHV0VXRpbHMuY3BwIiwKKyAgICAgICAgImRldmljZTMvYWlkbC9BaWRsQ2FtZXJhM0RldmljZS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT3V0cHV0VXRpbHMuY3BwIiwKKyAgICAgICAgImRldmljZTMvYWlkbC9BaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcCIsCiAgICAgICAgICJndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCIsCiAgICAgICAgICJoaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwIiwKICAgICAgICAgImhpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAiLAotICAgICAgICAiaGlkbC9Db252ZXJ0LmNwcCIsCiAgICAgICAgICJoaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmNwcCIsCiAgICAgICAgICJoaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcCIsCisgICAgICAgICJoaWRsL1V0aWxzLmNwcCIsCiAgICAgICAgICJ1dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmNwcCIsCiAgICAgICAgICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5jcHAiLAogICAgICAgICAidXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCIsCiAgICAgICAgICJ1dGlscy9BdXRvQ29uZGl0aW9uTG9jay5jcHAiLAotICAgICAgICAidXRpbHMvRXhpZlV0aWxzLmNwcCIsCiAgICAgICAgICJ1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmNwcCIsCisgICAgICAgICJ1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSGlkbC5jcHAiLAogICAgICAgICAidXRpbHMvU2Vzc2lvblN0YXRzQnVpbGRlci5jcHAiLAogICAgICAgICAidXRpbHMvVGFnTW9uaXRvci5jcHAiLAogICAgICAgICAidXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAiLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliZHluYW1pY19kZXB0aC1pbnRlcm5hbF9oZWFkZXJzIiwKKyAgICAgICAgImxpYmR5bmFtaWNfZGVwdGgtcHVibGljX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFkcm1faGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCiAgICAgXSwKQEAgLTExNSw2ICsxMjIsNyBAQAogICAgICAgICAibGlidXRpbHNjYWxsc3RhY2siLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAogICAgICAgICAibGliYWN0aXZpdHltYW5hZ2VyX2FpZGwiLAogICAgICAgICAibGlicGVybWlzc2lvbiIsCiAgICAgICAgICJsaWJjdXRpbHMiLApAQCAtMTQ4LDE5ICsxNTYsMjMgQEAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjYiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi43IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyLVYxLW5kayIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjMiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy41IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjYiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2UtVjEtbmRrIiwKICAgICAgICAgIm1lZGlhX3Blcm1pc3Npb24tYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYWlkbGNvbW1vbnN1cHBvcnQiLAogICAgICAgICAibGlicHJvY2Vzc2luZm9zZXJ2aWNlX2FpZGwiLAogICAgICAgICAibGliYmluZGVydGhyZWFkc3RhdGV1dGlscyIsCiAgICAgICAgICJtZWRpYV9wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICAgICAgImxpYmNhbWVyYXNlcnZpY2VfZGV2aWNlX2luZGVwZW5kZW50IiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpAQCAtMTc1LDkgKzE4Nyw1NSBAQAogICAgIGluY2x1ZGVfZGlyczogWwogICAgICAgICAic3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUiLAogICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrIiwKLSAgICAgICAgImV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW5jbHVkZXMiLAotICAgICAgICAiZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbnRlcm5hbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1pZ25vcmVkLXF1YWxpZmllcnMiLAorICAgIF0sCisKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJjYW1lcmFzZXJ2aWNlX2RldmljZV9pbmRlcGVuZGVudCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICAvLyBDYW1lcmEgc2VydmljZSBzb3VyY2UKKworICAgIHNyY3M6IFsKKyAgICAgICAgImNvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0Nvb3JkaW5hdGVNYXBwZXIuY3BwIiwKKyAgICAgICAgImRldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAiLAorICAgICAgICAiZGV2aWNlMy9Sb3RhdGVBbmRDcm9wTWFwcGVyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL1pvb21SYXRpb01hcHBlci5jcHAiLAorICAgICAgICAidXRpbHMvRXhpZlV0aWxzLmNwcCIsCisgICAgICAgICJ1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSG9zdC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliZHluYW1pY19kZXB0aC1pbnRlcm5hbF9oZWFkZXJzIiwKKyAgICAgICAgImxpYmR5bmFtaWNfZGVwdGgtcHVibGljX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY2FtZXJhX21ldGFkYXRhIiwKKyAgICAgICAgImxpYmR5bmFtaWNfZGVwdGgiLAorICAgICAgICAibGliZXhpZiIsCisgICAgICAgICJsaWJqcGVnIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L2NhbWVyYS9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvY2FtZXJhL2luY2x1ZGUvY2FtZXJhIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwCmluZGV4IGNjZGQ5ZTUuLmZmZDM4YmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwCkBAIC0zMiw4ICszMiw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXM7Ci0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gQ2FtZXJhRmxhc2hsaWdodCBpbXBsZW1lbnRhdGlvbiBiZWdpbnMKIC8vIHVzZWQgYnkgY2FtZXJhIHNlcnZpY2UgdG8gY29udHJvbCBmbGFzaGZsaWdodC4KQEAgLTExOSw2ICsxMTcsNTkgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitzdGF0dXNfdCBDYW1lcmFGbGFzaGxpZ2h0Ojp0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICAgICAgaW50MzJfdCB0b3JjaFN0cmVuZ3RoKSB7CisgICAgaWYgKCFtRmxhc2hsaWdodE1hcEluaXRpYWxpemVkKSB7CisgICAgICAgIEFMT0dFKCIlczogZmluZEZsYXNoVW5pdHMoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhpcyBtZXRob2QuIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIEFMT0dWKCIlczogc2V0IHRvcmNoIHN0cmVuZ3RoIG9mIGNhbWVyYSAlcyB0byAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCB0b3JjaFN0cmVuZ3RoKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBpZiAobU9wZW5lZENhbWVyYUlkcy5pbmRleE9mKGNhbWVyYUlkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSBkZXZpY2UgJXMgaXMgaW4gdXNlLCBjYW5ub3QgYmUgdHVybmVkIE9OLiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgfQorCisgICAgaWYgKG1GbGFzaENvbnRyb2wgPT0gTlVMTCkgeworICAgICAgICByZXMgPSBjcmVhdGVGbGFzaGxpZ2h0Q29udHJvbChjYW1lcmFJZCk7CisgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSBtRmxhc2hDb250cm9sLT50dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGNhbWVyYUlkLCB0b3JjaFN0cmVuZ3RoKTsKKyAgICByZXR1cm4gcmVzOworfQorCisKK3N0YXR1c190IENhbWVyYUZsYXNobGlnaHQ6OmdldFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgICAgIGludDMyX3QqIHRvcmNoU3RyZW5ndGgpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBpZiAoIW1GbGFzaGxpZ2h0TWFwSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmaW5kRmxhc2hVbml0cygpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIG1ldGhvZC4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIGlmIChtRmxhc2hDb250cm9sID09IE5VTEwpIHsKKyAgICAgICAgcmVzID0gY3JlYXRlRmxhc2hsaWdodENvbnRyb2woY2FtZXJhSWQpOworICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gbUZsYXNoQ29udHJvbC0+Z2V0VG9yY2hTdHJlbmd0aExldmVsKGNhbWVyYUlkLCB0b3JjaFN0cmVuZ3RoKTsKKyAgICByZXR1cm4gcmVzOworfQorCiBzdGF0dXNfdCBDYW1lcmFGbGFzaGxpZ2h0OjpmaW5kRmxhc2hVbml0cygpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzOwpAQCAtMzA2LDYgKzM1NywyMiBAQAogCiAgICAgcmV0dXJuIG1Qcm92aWRlck1hbmFnZXItPnNldFRvcmNoTW9kZShjYW1lcmFJZC5zdHJpbmcoKSwgZW5hYmxlZCk7CiB9CisKK3N0YXR1c190IFByb3ZpZGVyRmxhc2hDb250cm9sOjp0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICAgICAgaW50MzJfdCB0b3JjaFN0cmVuZ3RoKSB7CisgICAgQUxPR1YoIiVzOiBjaGFuZ2UgdG9yY2ggc3RyZW5ndGggbGV2ZWwgb2YgY2FtZXJhICVzIHRvICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIHRvcmNoU3RyZW5ndGgpOworCisgICAgcmV0dXJuIG1Qcm92aWRlck1hbmFnZXItPnR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoY2FtZXJhSWQuc3RyaW5nKCksIHRvcmNoU3RyZW5ndGgpOworfQorCitzdGF0dXNfdCBQcm92aWRlckZsYXNoQ29udHJvbDo6Z2V0VG9yY2hTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICAgICAgaW50MzJfdCogdG9yY2hTdHJlbmd0aCkgeworICAgIEFMT0dWKCIlczogZ2V0IHRvcmNoIHN0cmVuZ3RoIGxldmVsIG9mIGNhbWVyYSAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKworICAgIHJldHVybiBtUHJvdmlkZXJNYW5hZ2VyLT5nZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoY2FtZXJhSWQuc3RyaW5nKCksIHRvcmNoU3RyZW5ndGgpOworfQogLy8gUHJvdmlkZXJGbGFzaENvbnRyb2wgaW1wbGVtZW50YXRpb24gZW5kcwogCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmgKaW5kZXggYjk3ZmE1Zi4uMTcwM2RkYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuaApAQCAtNDQsNiArNDQsMTQgQEAKICAgICAgICAgLy8gc2V0IHRoZSB0b3JjaCBtb2RlIHRvIG9uIG9yIG9mZi4KICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCkgPSAwOworCisgICAgICAgIC8vIENoYW5nZSB0aGUgYnJpZ2h0bmVzcyBsZXZlbCBvZiB0aGUgdG9yY2guIElmIHRoZSB0b3JjaCBpcyBPRkYgYW5kCisgICAgICAgIC8vIHRvcmNoU3RyZW5ndGggPj0gMSwgdGhlbiB0aGUgdG9yY2ggd2lsbCBhbHNvIGJlIHR1cm5lZCBPTi4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRvcmNoU3RyZW5ndGgpID0gMDsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSB0b3JjaCBzdHJlbmd0aCBsZXZlbC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludDMyX3QqIHRvcmNoU3RyZW5ndGgpID0gMDsKIH07CiAKIC8qKgpAQCAtNjcsNiArNzUsMTIgQEAKICAgICAgICAgLy8gc2V0IHRoZSB0b3JjaCBtb2RlIHRvIG9uIG9yIG9mZi4KICAgICAgICAgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQpOwogCisgICAgICAgIC8vIENoYW5nZSB0aGUgdG9yY2ggc3RyZW5ndGggbGV2ZWwgb2YgdGhlIGZsYXNoIHVuaXQgaW4gdG9yY2ggbW9kZS4KKyAgICAgICAgc3RhdHVzX3QgdHVybk9uVG9yY2hXaXRoU3RyZW5ndGhMZXZlbChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50MzJfdCB0b3JjaFN0cmVuZ3RoKTsKKworICAgICAgICAvLyBHZXQgdGhlIHRvcmNoIHN0cmVuZ3RoIGxldmVsCisgICAgICAgIHN0YXR1c190IGdldFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50MzJfdCogdG9yY2hTdHJlbmd0aCk7CisKICAgICAgICAgLy8gTm90aWZ5IENhbWVyYUZsYXNobGlnaHQgdGhhdCBjYW1lcmEgc2VydmljZSBpcyBnb2luZyB0byBvcGVuIGEgY2FtZXJhCiAgICAgICAgIC8vIGRldmljZS4gQ2FtZXJhRmxhc2hsaWdodCB3aWxsIGZyZWUgdGhlIHJlc291cmNlcyB0aGF0IG1heSBjYXVzZSB0aGUKICAgICAgICAgLy8gY2FtZXJhIG9wZW4gdG8gZmFpbC4gQ2FtZXJhIHNlcnZpY2UgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlCkBAIC0xMTUsNiArMTI5LDggQEAKICAgICAgICAgLy8gRmxhc2hDb250cm9sQmFzZQogICAgICAgICBzdGF0dXNfdCBoYXNGbGFzaFVuaXQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoKTsKICAgICAgICAgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQpOworICAgICAgICBzdGF0dXNfdCB0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQzMl90IHRvcmNoU3RyZW5ndGgpOworICAgICAgICBzdGF0dXNfdCBnZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludDMyX3QqIHRvcmNoU3RyZW5ndGgpOwogCiAgICAgcHJpdmF0ZToKICAgICAgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtUHJvdmlkZXJNYW5hZ2VyOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAppbmRleCBkMGQzYTlkLi44MDQxMGFiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcApAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHBvbGwuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYUNsaWVudC5oPgpAQCAtODUsMTMgKzg2LDExIEBACiAKIHVzaW5nIGJhc2U6OlN0cmluZ1ByaW50ZjsKIHVzaW5nIGJpbmRlcjo6U3RhdHVzOwotdXNpbmcgY2FtZXJhMzo6U2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczsKK3VzaW5nIG5hbWVzcGFjZSBjYW1lcmEzOwogdXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkhpZGxDYW1lcmFTZXJ2aWNlOwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmE7CiB1c2luZyBoYXJkd2FyZTo6SUNhbWVyYUNsaWVudDsKIHVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOwotdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM7Ci11c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1czsKIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2s7CiB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYUluamVjdGlvblNlc3Npb247CiB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OkNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb247CkBAIC0xMzMsMTAgKzEzMiwxMiBAQAogc3RhdGljIGNvbnN0IFN0cmluZzE2CiAgICAgICAgIHNDYW1lcmFJbmplY3RFeHRlcm5hbENhbWVyYVBlcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfSU5KRUNUX0VYVEVSTkFMX0NBTUVSQSIpOwogY29uc3QgY2hhciAqc0ZpbGVOYW1lID0gImxhc3RPcGVuU2Vzc2lvbkR1bXBGaWxlIjsKLXN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrVmVuZG9yQ2xpZW50U2NvcmUgPSByZXNvdXJjZV9wb2xpY3k6OlBFUkNFUFRJQkxFX0FQUF9BREo7Ci1zdGF0aWMgY29uc3RleHByIGludDMyX3Qga1ZlbmRvckNsaWVudFN0YXRlID0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1BFUlNJU1RFTlRfVUk7CitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga1N5c3RlbU5hdGl2ZUNsaWVudFNjb3JlID0gcmVzb3VyY2VfcG9saWN5OjpQRVJDRVBUSUJMRV9BUFBfQURKOworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtTeXN0ZW1OYXRpdmVDbGllbnRTdGF0ZSA9CisgICAgICAgIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9QRVJTSVNURU5UX1VJOwogCiBjb25zdCBTdHJpbmc4IENhbWVyYVNlcnZpY2U6OmtPZmZsaW5lRGV2aWNlKCJvZmZsaW5lLSIpOworY29uc3QgU3RyaW5nMTYgQ2FtZXJhU2VydmljZTo6a1dhdGNoQWxsQ2xpZW50c0ZsYWcoImFsbCIpOwogCiAvLyBTZXQgdG8ga2VlcCB0cmFjayBvZiBsb2dnZWQgc2VydmljZSBlcnJvciBldmVudHMuCiBzdGF0aWMgc3RkOjpzZXQ8U3RyaW5nOD4gc1NlcnZpY2VFcnJvckV2ZW50U2V0OwpAQCAtMTU1LDYgKzE1NiwxMiBAQAogICAgIH0KIH0KIAorLy8gVGhlIHdvcmQgJ1N5c3RlbScgaGVyZSBkb2VzIG5vdCByZWZlciB0byBjbGllbnRzIG9ubHkgb24gdGhlIHN5c3RlbQorLy8gcGFydGl0aW9uLiBUaGV5IGp1c3QgbmVlZCB0byBoYXZlIGEgYW5kcm9pZCBzeXN0ZW0gdWlkLgorc3RhdGljIGJvb2wgZG9lc0NsaWVudEhhdmVTeXN0ZW1VaWQoKSB7CisgICAgcmV0dXJuIChDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpIDwgQUlEX0FQUF9TVEFSVCk7Cit9CisKIHZvaWQgQ2FtZXJhU2VydmljZTo6b25GaXJzdFJlZigpCiB7CiAKQEAgLTM2MSwxOCArMzY4LDIwIEBACiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6YWRkU3RhdGVzKGNvbnN0IFN0cmluZzggaWQpIHsKICAgICBzdGQ6OnN0cmluZyBjYW1lcmFJZChpZC5jX3N0cigpKTsKLSAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCBjb3N0OworICAgIENhbWVyYVJlc291cmNlQ29zdCBjb3N0OwogICAgIHN0YXR1c190IHJlcyA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldFJlc291cmNlQ29zdChjYW1lcmFJZCwgJmNvc3QpOwotICAgIFN5c3RlbUNhbWVyYUtpbmQgZGV2aWNlS2luZCA9IFN5c3RlbUNhbWVyYUtpbmQ6OlBVQkxJQzsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcXVlcnkgZGV2aWNlIHJlc291cmNlIGNvc3Q6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBTeXN0ZW1DYW1lcmFLaW5kIGRldmljZUtpbmQgPSBTeXN0ZW1DYW1lcmFLaW5kOjpQVUJMSUM7CiAgICAgcmVzID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0U3lzdGVtQ2FtZXJhS2luZChjYW1lcmFJZCwgJmRldmljZUtpbmQpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBkZXZpY2Uga2luZDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEoY2FtZXJhSWQsICZwaHlzaWNhbENhbWVyYUlkcyk7CiAgICAgc3RkOjpzZXQ8U3RyaW5nOD4gY29uZmxpY3Rpbmc7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3N0LmNvbmZsaWN0aW5nRGV2aWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICBjb25mbGljdGluZy5lbXBsYWNlKFN0cmluZzgoY29zdC5jb25mbGljdGluZ0RldmljZXNbaV0uY19zdHIoKSkpOwpAQCAtMzgxLDcgKzM5MCw3IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtQ2FtZXJhU3RhdGVzTG9jayk7CiAgICAgICAgIG1DYW1lcmFTdGF0ZXMuZW1wbGFjZShpZCwgc3RkOjptYWtlX3NoYXJlZDxDYW1lcmFTdGF0ZT4oaWQsIGNvc3QucmVzb3VyY2VDb3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nLCBkZXZpY2VLaW5kKSk7CisgICAgICAgICAgICAgICAgY29uZmxpY3RpbmcsIGRldmljZUtpbmQsIHBoeXNpY2FsQ2FtZXJhSWRzKSk7CiAgICAgfQogCiAgICAgaWYgKG1GbGFzaGxpZ2h0LT5oYXNGbGFzaFVuaXQoaWQpKSB7CkBAIC01NjAsNiArNTY5LDIyIEBACiAgICAgb25Ub3JjaFN0YXR1c0NoYW5nZWRMb2NrZWQoY2FtZXJhSWQsIG5ld1N0YXR1cywgc3lzdGVtQ2FtZXJhS2luZCk7CiB9CiAKKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpvblRvcmNoU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgVG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cywgU3lzdGVtQ2FtZXJhS2luZCBzeXN0ZW1DYW1lcmFLaW5kKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaFN0YXR1c011dGV4KTsKKyAgICBvblRvcmNoU3RhdHVzQ2hhbmdlZExvY2tlZChjYW1lcmFJZCwgbmV3U3RhdHVzLCBzeXN0ZW1DYW1lcmFLaW5kKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpicm9hZGNhc3RUb3JjaFN0cmVuZ3RoTGV2ZWwoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgIGludDMyX3QgbmV3U3RyZW5ndGhMZXZlbCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOworICAgIGZvciAoYXV0byYgaSA6IG1MaXN0ZW5lckxpc3QpIHsKKyAgICAgICAgaS0+Z2V0TGlzdGVuZXIoKS0+b25Ub3JjaFN0cmVuZ3RoTGV2ZWxDaGFuZ2VkKFN0cmluZzE2e2NhbWVyYUlkfSwKKyAgICAgICAgICAgICAgICBuZXdTdHJlbmd0aExldmVsKTsKKyAgICB9Cit9CisKIHZvaWQgQ2FtZXJhU2VydmljZTo6b25Ub3JjaFN0YXR1c0NoYW5nZWRMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIFRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMsIFN5c3RlbUNhbWVyYUtpbmQgc3lzdGVtQ2FtZXJhS2luZCkgewogICAgIEFMT0dJKCIlczogVG9yY2ggc3RhdHVzIGNoYW5nZWQgZm9yIGNhbWVyYUlkPSVzLCBuZXdTdGF0dXM9JWQiLApAQCAtNjEzLDggKzYzOCwxMCBAQAogICAgIGJyb2FkY2FzdFRvcmNoTW9kZVN0YXR1cyhjYW1lcmFJZCwgbmV3U3RhdHVzLCBzeXN0ZW1DYW1lcmFLaW5kKTsKIH0KIAotc3RhdGljIGJvb2wgaGFzUGVybWlzc2lvbnNGb3JTeXN0ZW1DYW1lcmEoaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKSB7Ci0gICAgcmV0dXJuIGNoZWNrUGVybWlzc2lvbihzU3lzdGVtQ2FtZXJhUGVybWlzc2lvbiwgY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCkgJiYKK3N0YXRpYyBib29sIGhhc1Blcm1pc3Npb25zRm9yU3lzdGVtQ2FtZXJhKGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCwKKyAgICAgICAgYm9vbCBsb2dQZXJtaXNzaW9uRmFpbHVyZSA9IGZhbHNlKSB7CisgICAgcmV0dXJuIGNoZWNrUGVybWlzc2lvbihzU3lzdGVtQ2FtZXJhUGVybWlzc2lvbiwgY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCwKKyAgICAgICAgICAgIGxvZ1Blcm1pc3Npb25GYWlsdXJlKSAmJgogICAgICAgICAgICAgY2hlY2tQZXJtaXNzaW9uKHNDYW1lcmFQZXJtaXNzaW9uLCBjYWxsaW5nUGlkLCBjYWxsaW5nVWlkKTsKIH0KIApAQCAtNjkzLDggKzcyMCw4IEBACiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICpkZXZpY2VJZHMgPSAmbU5vcm1hbERldmljZUlkc1dpdGhvdXRTeXN0ZW1DYW1lcmE7CiAgICAgYXV0byBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBhdXRvIGNhbGxpbmdVaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChjaGVja1Blcm1pc3Npb24oc1N5c3RlbUNhbWVyYVBlcm1pc3Npb24sIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpIHx8Ci0gICAgICAgICAgICBnZXRwaWQoKSA9PSBjYWxsaW5nUGlkKSB7CisgICAgaWYgKGNoZWNrUGVybWlzc2lvbihzU3lzdGVtQ2FtZXJhUGVybWlzc2lvbiwgY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCwKKyAgICAgICAgICAgIC8qbG9nUGVybWlzc2lvbkZhaWx1cmUqL2ZhbHNlKSB8fCBnZXRwaWQoKSA9PSBjYWxsaW5nUGlkKSB7CiAgICAgICAgIGRldmljZUlkcyA9ICZtTm9ybWFsRGV2aWNlSWRzOwogICAgIH0KICAgICBpZiAoY2FtZXJhSWRJbnQgPCAwIHx8IGNhbWVyYUlkSW50ID49IHN0YXRpY19jYXN0PGludD4oZGV2aWNlSWRzLT5zaXplKCkpKSB7CkBAIC03OTMsNiArODIwLDMxIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorU3RhdHVzIENhbWVyYVNlcnZpY2U6OmdldFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCisgICAgICAgIGludDMyX3QqIHRvcmNoU3RyZW5ndGgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1TZXJ2aWNlTG9jayk7CisgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgSEFMIGNvdWxkbid0IGJlIGluaXRpYWxpemVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIEhBTCBjb3VsZG4ndCBiZSBpbml0aWFsaXplZC4iKTsKKyAgICB9CisKKyAgICBpZih0b3JjaFN0cmVuZ3RoID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzdHJlbmd0aCBsZXZlbCBtdXN0IG5vdCBiZSBudWxsLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlN0cmVuZ3RoIGxldmVsIHNob3VsZCBub3QgYmUgbnVsbC4iKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXMgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCksCisgICAgICAgIHRvcmNoU3RyZW5ndGgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sICJVbmFibGUgdG8gcmV0cmlldmUgdG9yY2ggIgorICAgICAgICAgICAgInN0cmVuZ3RoIGxldmVsIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLCBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwKKyAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKyAgICBBTE9HSSgiJXM6IFRvcmNoIHN0cmVuZ3RoIGxldmVsIGlzOiAlZCIsIF9fRlVOQ1RJT05fXywgKnRvcmNoU3RyZW5ndGgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKIFN0cmluZzggQ2FtZXJhU2VydmljZTo6Z2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKSB7CiAgICAgdGltZV90IG5vdyA9IHRpbWUobnVsbHB0cik7CiAgICAgY2hhciBmb3JtYXR0ZWRUaW1lWzY0XTsKQEAgLTgzNSwyOSArODg3LDM3IEBACiAgICAgQmFzaWNDbGllbnQ6OkJhc2ljQ2xpZW50OjpzQ2FtZXJhU2VydmljZSA9IG51bGxwdHI7CiB9CiAKLWludCBDYW1lcmFTZXJ2aWNlOjpnZXREZXZpY2VWZXJzaW9uKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQqIGZhY2luZywgaW50KiBvcmllbnRhdGlvbikgeworc3RkOjpwYWlyPGludCwgSVBDVHJhbnNwb3J0PiBDYW1lcmFTZXJ2aWNlOjpnZXREZXZpY2VWZXJzaW9uKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQqIGZhY2luZywKKyAgICAgICAgaW50KiBvcmllbnRhdGlvbikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IDA7CiAKICAgICBzdGF0dXNfdCByZXM7CiAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uezAsMH07CisgICAgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCA9IElQQ1RyYW5zcG9ydDo6SU5WQUxJRDsKICAgICByZXMgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRIaWdoZXN0U3VwcG9ydGVkVmVyc2lvbihjYW1lcmFJZC5zdHJpbmcoKSwKLSAgICAgICAgICAgICZtYXhWZXJzaW9uKTsKLSAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gLTE7CisgICAgICAgICAgICAmbWF4VmVyc2lvbiwgJnRyYW5zcG9ydCk7CisgICAgaWYgKHJlcyAhPSBPSyB8fCB0cmFuc3BvcnQgPT0gSVBDVHJhbnNwb3J0OjpJTlZBTElEKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdldCBoaWdoZXN0IHN1cHBvcnRlZCB2ZXJzaW9uIGZvciBjYW1lcmEgaWQgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoLTEsIElQQ1RyYW5zcG9ydDo6SU5WQUxJRCkgOworICAgIH0KICAgICBkZXZpY2VWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKG1heFZlcnNpb24uZ2V0X21ham9yKCksIG1heFZlcnNpb24uZ2V0X21pbm9yKCkpOwogCiAgICAgaGFyZHdhcmU6OkNhbWVyYUluZm8gaW5mbzsKICAgICBpZiAoZmFjaW5nKSB7CiAgICAgICAgIHJlcyA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldENhbWVyYUluZm8oY2FtZXJhSWQuc3RyaW5nKCksICZpbmZvKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIC0xOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoLTEsIElQQ1RyYW5zcG9ydDo6SU5WQUxJRCk7CisgICAgICAgIH0KICAgICAgICAgKmZhY2luZyA9IGluZm8uZmFjaW5nOwogICAgICAgICBpZiAob3JpZW50YXRpb24pIHsKICAgICAgICAgICAgICpvcmllbnRhdGlvbiA9IGluZm8ub3JpZW50YXRpb247CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gZGV2aWNlVmVyc2lvbjsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZGV2aWNlVmVyc2lvbiwgdHJhbnNwb3J0KTsKIH0KIAogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmZpbHRlckdldEluZm9FcnJvckNvZGUoc3RhdHVzX3QgZXJyKSB7CkBAIC04NzgsNDggKzkzOCw1MCBAQAogfQogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6bWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKLSAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsCisgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLCBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCwKICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGZlYXR1cmVJZCwgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgZmFjaW5nLCBpbnQgc2Vuc29yT3JpZW50YXRpb24sIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwKLSAgICAgICAgaW50IHNlcnZpY2VQaWQsIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywKLSAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KSB7Ci0KLSAgICAvLyBDcmVhdGUgQ2FtZXJhQ2xpZW50IGJhc2VkIG9uIGRldmljZSB2ZXJzaW9uIHJlcG9ydGVkIGJ5IHRoZSBIQUwuCi0gICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKLSAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgdXNpbmcgb2xkIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfREVQUkVDQVRFRF9IQUwsCi0gICAgICAgICAgICAgICAgICAgICJDYW1lcmEgZGV2aWNlIFwiJXNcIiBIQUwgdmVyc2lvbiAlZCBubyBsb25nZXIgc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6Ci0gICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6Ci0gICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6Ci0gICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6Ci0gICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzQ6Ci0gICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzU6Ci0gICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzY6Ci0gICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzc6Ci0gICAgICAgICAgICBpZiAoZWZmZWN0aXZlQXBpTGV2ZWwgPT0gQVBJXzEpIHsgLy8gQ2FtZXJhMSBBUEkgcm91dGUKLSAgICAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOwotICAgICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhMkNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLCBmZWF0dXJlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBzZW5zb3JPcmllbnRhdGlvbiwgY2xpZW50UGlkLCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkLCBvdmVycmlkZUZvclBlcmZDbGFzcyk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvLyBDYW1lcmEyIEFQSSByb3V0ZQotICAgICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiB0bXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3MqPihjYW1lcmFDYi5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFEZXZpY2VDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwgZmVhdHVyZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGZhY2luZywgc2Vuc29yT3JpZW50YXRpb24sIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBTaG91bGQgbm90IGJlIHJlYWNoYWJsZQotICAgICAgICAgICAgQUxPR0UoIlVua25vd24gY2FtZXJhIGRldmljZSBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKLSAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhIGRldmljZSBcIiVzXCIgaGFzIHVua25vd24gSEFMIHZlcnNpb24gJWQiLAotICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgZGV2aWNlVmVyc2lvbik7CisgICAgICAgIGludCBzZXJ2aWNlUGlkLCBzdGQ6OnBhaXI8aW50LCBJUENUcmFuc3BvcnQ+IGRldmljZVZlcnNpb25BbmRUcmFuc3BvcnQsCisgICAgICAgIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpIHsKKyAgICAvLyBGb3IgSElETCBkZXZpY2VzCisgICAgaWYgKGRldmljZVZlcnNpb25BbmRUcmFuc3BvcnQuc2Vjb25kID09IElQQ1RyYW5zcG9ydDo6SElETCkgeworICAgICAgICAvLyBDcmVhdGUgQ2FtZXJhQ2xpZW50IGJhc2VkIG9uIGRldmljZSB2ZXJzaW9uIHJlcG9ydGVkIGJ5IHRoZSBIQUwuCisgICAgICAgIGludCBkZXZpY2VWZXJzaW9uID0gZGV2aWNlVmVyc2lvbkFuZFRyYW5zcG9ydC5maXJzdDsKKyAgICAgICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSB1c2luZyBvbGQgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfREVQUkVDQVRFRF9IQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhIGRldmljZSBcIiVzXCIgSEFMIHZlcnNpb24gJWQgbm8gbG9uZ2VyIHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgZGV2aWNlVmVyc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOgorICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzU6CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM182OgorICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBiZSByZWFjaGFibGUKKyAgICAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBjYW1lcmEgZGV2aWNlIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOworICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSBkZXZpY2UgXCIlc1wiIGhhcyB1bmtub3duIEhBTCB2ZXJzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZWZmZWN0aXZlQXBpTGV2ZWwgPT0gQVBJXzEpIHsgLy8gQ2FtZXJhMSBBUEkgcm91dGUKKyAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKKyAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmEyQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsIGZlYXR1cmVJZCwKKyAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBmYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkLCBvdmVycmlkZUZvclBlcmZDbGFzcyk7CisgICAgfSBlbHNlIHsgLy8gQ2FtZXJhMiBBUEkgcm91dGUKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHRtcCA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3MqPihjYW1lcmFDYi5nZXQoKSk7CisgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhRGV2aWNlQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgc3lzdGVtTmF0aXZlQ2xpZW50LCBmZWF0dXJlSWQsIGNhbWVyYUlkLCBmYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkLCBvdmVycmlkZUZvclBlcmZDbGFzcyk7CiAgICAgfQogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CkBAIC0xMDA3LDcgKzEwNjksNyBAQAogICAgIHNwPENsaWVudD4gdG1wID0gbnVsbHB0cjsKICAgICBpZiAoIShyZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PigKICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+e251bGxwdHJ9LCBpZCwgY2FtZXJhSWQsCi0gICAgICAgICAgICBpbnRlcm5hbFBhY2thZ2VOYW1lLCB7fSwgdWlkLCBVU0VfQ0FMTElOR19QSUQsCisgICAgICAgICAgICBpbnRlcm5hbFBhY2thZ2VOYW1lLCAvKnN5c3RlbU5hdGl2ZUNsaWVudCovIGZhbHNlLCB7fSwgdWlkLCBVU0VfQ0FMTElOR19QSUQsCiAgICAgICAgICAgICBBUElfMSwgLypzaGltVXBkYXRlT25seSovIHRydWUsIC8qb29tU2NvcmVPZmZzZXQqLyAwLAogICAgICAgICAgICAgLyp0YXJnZXRTZGtWZXJzaW9uKi8gX19BTkRST0lEX0FQSV9GVVRVUkVfXywgLypvdXQqLyB0bXApCiAgICAgICAgICAgICApLmlzT2soKSkgewpAQCAtMTI0Miw5ICsxMzA0LDkgQEAKIAogICAgIHVzZXJpZF90IGNsaWVudFVzZXJJZCA9IG11bHRpdXNlcl9nZXRfdXNlcl9pZChjbGllbnRVaWQpOwogCi0gICAgLy8gT25seSBhbGxvdyBjbGllbnRzIHdobyBhcmUgYmVpbmcgdXNlZCBieSB0aGUgY3VycmVudCBmb3JlZ3JvdW5kIGRldmljZSB1c2VyLCB1bmxlc3MgY2FsbGluZwotICAgIC8vIGZyb20gb3VyIG93biBwcm9jZXNzIE9SIHRoZSBjYWxsZXIgaXMgdXNpbmcgdGhlIGNhbWVyYXNlcnZlcidzIEhJREwgaW50ZXJmYWNlLgotICAgIGlmIChnZXRDdXJyZW50U2VydmluZ0NhbGwoKSAhPSBCaW5kZXJDYWxsVHlwZTo6SFdCSU5ERVIgJiYgY2FsbGluZ1BpZCAhPSBnZXRwaWQoKSAmJgorICAgIC8vIEZvciBub24tc3lzdGVtIGNsaWVudHMgOiBPbmx5IGFsbG93IGNsaWVudHMgd2hvIGFyZSBiZWluZyB1c2VkIGJ5IHRoZSBjdXJyZW50IGZvcmVncm91bmQKKyAgICAvLyBkZXZpY2UgdXNlciwgdW5sZXNzIGNhbGxpbmcgZnJvbSBvdXIgb3duIHByb2Nlc3MuCisgICAgaWYgKCFkb2VzQ2xpZW50SGF2ZVN5c3RlbVVpZCgpICYmIGNhbGxpbmdQaWQgIT0gZ2V0cGlkKCkgJiYKICAgICAgICAgICAgIChtQWxsb3dlZFVzZXJzLmZpbmQoY2xpZW50VXNlcklkKSA9PSBtQWxsb3dlZFVzZXJzLmVuZCgpKSkgewogICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChjYW5ub3QgY29ubmVjdCBmcm9tICIKICAgICAgICAgICAgICAgICAiZGV2aWNlIHVzZXIgJWQsIGN1cnJlbnRseSBhbGxvd2VkIGRldmljZSB1c2VyczogJXMpIiwgY2FsbGluZ1BpZCwgY2xpZW50VXNlcklkLApAQCAtMTI4MSwxMiArMTM0MywxMiBAQAogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6OmZpbmlzaENvbm5lY3RMb2NrZWQoY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgIGNvbnN0IENhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHImIGRlc2MsIGludCBvb21TY29yZU9mZnNldCkgeworICAgICAgICBjb25zdCBDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyJiBkZXNjLCBpbnQgb29tU2NvcmVPZmZzZXQsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50KSB7CiAKICAgICAvLyBNYWtlIGEgZGVzY3JpcHRvciBmb3IgdGhlIGluY29taW5nIGNsaWVudAogICAgIGF1dG8gY2xpZW50RGVzY3JpcHRvciA9CiAgICAgICAgICAgICBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFDbGllbnRNYW5hZ2VyOjptYWtlQ2xpZW50RGVzY3JpcHRvcihjbGllbnQsIGRlc2MsCi0gICAgICAgICAgICAgICAgICAgIG9vbVNjb3JlT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgb29tU2NvcmVPZmZzZXQsIHN5c3RlbU5hdGl2ZUNsaWVudCk7CiAgICAgYXV0byBldmljdGVkID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuYWRkQW5kRXZpY3QoY2xpZW50RGVzY3JpcHRvcik7CiAKICAgICBsb2dDb25uZWN0ZWQoZGVzYy0+Z2V0S2V5KCksIHN0YXRpY19jYXN0PGludD4oZGVzYy0+Z2V0T3duZXJJZCgpKSwKQEAgLTEzMTYsNyArMTM3OCw3IEBACiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmhhbmRsZUV2aWN0aW9uc0xvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGNsaWVudFBpZCwKICAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGNvbnN0IHNwPElCaW5kZXI+JiByZW1vdGVDYWxsYmFjaywgY29uc3QgU3RyaW5nOCYgcGFja2FnZU5hbWUsCi0gICAgICAgIGludCBvb21TY29yZU9mZnNldCwKKyAgICAgICAgaW50IG9vbVNjb3JlT2Zmc2V0LCBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCwKICAgICAgICAgLypvdXQqLwogICAgICAgICBzcDxCYXNpY0NsaWVudD4qIGNsaWVudCwKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHJlc291cmNlX3BvbGljeTo6Q2xpZW50RGVzY3JpcHRvcjxTdHJpbmc4LCBzcDxCYXNpY0NsaWVudD4+PiogcGFydGlhbCkgewpAQCAtMTMzNCw3ICsxMzk2LDcgQEAKICAgICAgICAgICAgICAgICBhdXRvIGNsaWVudFNwID0gY3VycmVudC0+Z2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICBpZiAoY2xpZW50U3AuZ2V0KCkgIT0gbnVsbHB0cikgeyAvLyBzaG91bGQgbmV2ZXIgYmUgbmVlZGVkCiAgICAgICAgICAgICAgICAgICAgIGlmICghY2xpZW50U3AtPmNhbkNhc3RUb0FwaUNsaWVudChlZmZlY3RpdmVBcGlMZXZlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJDYW1lcmFTZXJ2aWNlIGNvbm5lY3QgY2FsbGVkIGZyb20gc2FtZSBjbGllbnQsIGJ1dCB3aXRoIGEgZGlmZmVyZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkNhbWVyYVNlcnZpY2UgY29ubmVjdCBjYWxsZWQgd2l0aCBhIGRpZmZlcmVudCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBUEkgbGV2ZWwsIGV2aWN0aW5nIHByaW9yIGNsaWVudC4uLiIpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNsaWVudFNwLT5nZXRSZW1vdGUoKSA9PSByZW1vdGVDYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSAoc2Vjb25kIGNhbGwgZnJvbSBzYW1lIgpAQCAtMTM5MSw3ICsxNDUzLDcgQEAKICAgICAgICAgY2xpZW50RGVzY3JpcHRvciA9IENhbWVyYUNsaWVudE1hbmFnZXI6Om1ha2VDbGllbnREZXNjcmlwdG9yKGNhbWVyYUlkLAogICAgICAgICAgICAgICAgIHNwPEJhc2ljQ2xpZW50PntudWxscHRyfSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdGUtPmdldENvc3QoKSksCiAgICAgICAgICAgICAgICAgc3RhdGUtPmdldENvbmZsaWN0aW5nKCksIGFjdHVhbFNjb3JlLCBjbGllbnRQaWQsIGFjdHVhbFN0YXRlLAotICAgICAgICAgICAgICAgIG9vbVNjb3JlT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBvb21TY29yZU9mZnNldCwgc3lzdGVtTmF0aXZlQ2xpZW50KTsKIAogICAgICAgICByZXNvdXJjZV9wb2xpY3k6OkNsaWVudFByaW9yaXR5IGNsaWVudFByaW9yaXR5ID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0UHJpb3JpdHkoKTsKIApAQCAtMTUzNCw3ICsxNTk2LDcgQEAKICAgICBTdHJpbmc4IGlkID0gY2FtZXJhSWRJbnRUb1N0cihhcGkxQ2FtZXJhSWQpOwogICAgIHNwPENsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBhcGkxQ2FtZXJhSWQsCi0gICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwge30sIGNsaWVudFVpZCwgY2xpZW50UGlkLCBBUElfMSwKKyAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLC8qc3lzdGVtTmF0aXZlQ2xpZW50Ki8gZmFsc2UsIHt9LCBjbGllbnRVaWQsIGNsaWVudFBpZCwgQVBJXzEsCiAgICAgICAgICAgICAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsIC8qb29tU2NvcmVPZmZzZXQqLyAwLCB0YXJnZXRTZGtWZXJzaW9uLCAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7CkBAIC0xNTY2LDE0ICsxNjI4LDE0IEBACiAgICAgLy8gMSkgSWYgY2FtZXJhc2VydmVyIHRyaWVzIHRvIGFjY2VzcyB0aGlzIGNhbWVyYSBkZXZpY2UsIGFjY2VwdCB0aGUKICAgICAvLyAgICBjb25uZWN0aW9uLgogICAgIC8vIDIpIFRoZSBjYW1lcmEgZGV2aWNlIGlzIGEgcHVibGljbHkgaGlkZGVuIHNlY3VyZSBjYW1lcmEgZGV2aWNlIEFORCBzb21lCi0gICAgLy8gICAgY29tcG9uZW50IGlzIHRyeWluZyB0byBhY2Nlc3MgaXQgb24gYSBub24taHdiaW5kZXIgdGhyZWFkIChnZW5lcmFsbHkgYSBub24gSEFMIGNsaWVudCksCi0gICAgLy8gICAgcmVqZWN0IGl0LgorICAgIC8vICAgIG5vbiBzeXN0ZW0gY29tcG9uZW50IGlzIHRyeWluZyB0byBhY2Nlc3MgaXQuCiAgICAgLy8gMykgaWYgdGhlIGNhbWVyYSBkZXZpY2UgaXMgYWR2ZXJ0aXNlZCBieSB0aGUgY2FtZXJhIEhBTCBhcyBTWVNURU1fT05MWQogICAgIC8vICAgIGFuZCB0aGUgc2VydmluZyB0aHJlYWQgaXMgYSBub24gaHdiaW5kZXIgdGhyZWFkLCB0aGUgY2xpZW50IG11c3QgaGF2ZQogICAgIC8vICAgIGFuZHJvaWQucGVybWlzc2lvbi5TWVNURU1fQ0FNRVJBIHBlcm1pc3Npb25zIHRvIGNvbm5lY3QuCiAKICAgICBpbnQgY1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaW50IGNVaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOworICAgIGJvb2wgc3lzdGVtQ2xpZW50ID0gZG9lc0NsaWVudEhhdmVTeXN0ZW1VaWQoKTsKICAgICBTeXN0ZW1DYW1lcmFLaW5kIHN5c3RlbUNhbWVyYUtpbmQgPSBTeXN0ZW1DYW1lcmFLaW5kOjpQVUJMSUM7CiAgICAgaWYgKGdldFN5c3RlbUNhbWVyYUtpbmQoY2FtZXJhSWQsICZzeXN0ZW1DYW1lcmFLaW5kKSAhPSBPSykgewogICAgICAgICAvLyBUaGlzIGlzbid0IGEga25vd24gY2FtZXJhIElELCBzbyBpdCdzIG5vdCBhIHN5c3RlbSBjYW1lcmEKQEAgLTE1ODYsOCArMTY0OCw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgLy8gKDIpCi0gICAgaWYgKGdldEN1cnJlbnRTZXJ2aW5nQ2FsbCgpICE9IEJpbmRlckNhbGxUeXBlOjpIV0JJTkRFUiAmJgotICAgICAgICAgICAgc3lzdGVtQ2FtZXJhS2luZCA9PSBTeXN0ZW1DYW1lcmFLaW5kOjpISURERU5fU0VDVVJFX0NBTUVSQSkgeworICAgIGlmICghc3lzdGVtQ2xpZW50ICYmIHN5c3RlbUNhbWVyYUtpbmQgPT0gU3lzdGVtQ2FtZXJhS2luZDo6SElEREVOX1NFQ1VSRV9DQU1FUkEpIHsKICAgICAgICAgQUxPR1coIlJlamVjdGluZyBhY2Nlc3MgdG8gc2VjdXJlIGhpZGRlbiBjYW1lcmEgJXMiLCBjYW1lcmFJZC5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMTU5NSw5ICsxNjU2LDggQEAKICAgICAvLyAgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKCkgYWxsb3dzIGZvciBjYWxscyB0byBzdWNjZWVkIChhbGJlaXQgYWZ0ZXIgaGlkaW5nIHNvbWUKICAgICAvLyAgICAgY2hhcmFjdGVyaXN0aWNzKSBldmVuIGlmIGNsaWVudHMgZG9uJ3QgaGF2ZSBhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBLiBXZSBkbyBub3Qgd2FudCB0aGUKICAgICAvLyAgICAgc2FtZSBiZWhhdmlvciBmb3Igc3lzdGVtIGNhbWVyYSBkZXZpY2VzLgotICAgIGlmIChnZXRDdXJyZW50U2VydmluZ0NhbGwoKSAhPSBCaW5kZXJDYWxsVHlwZTo6SFdCSU5ERVIgJiYKLSAgICAgICAgICAgIHN5c3RlbUNhbWVyYUtpbmQgPT0gU3lzdGVtQ2FtZXJhS2luZDo6U1lTVEVNX09OTFlfQ0FNRVJBICYmCi0gICAgICAgICAgICAhaGFzUGVybWlzc2lvbnNGb3JTeXN0ZW1DYW1lcmEoY1BpZCwgY1VpZCkpIHsKKyAgICBpZiAoIXN5c3RlbUNsaWVudCAmJiBzeXN0ZW1DYW1lcmFLaW5kID09IFN5c3RlbUNhbWVyYUtpbmQ6OlNZU1RFTV9PTkxZX0NBTUVSQSAmJgorICAgICAgICAgICAgIWhhc1Blcm1pc3Npb25zRm9yU3lzdGVtQ2FtZXJhKGNQaWQsIGNVaWQsIC8qbG9nUGVybWlzc2lvbkZhaWx1cmUqL3RydWUpKSB7CiAgICAgICAgIEFMT0dXKCJSZWplY3RpbmcgYWNjZXNzIHRvIHN5c3RlbSBvbmx5IGNhbWVyYSAlcywgaW5hZGVxdWV0ZSBwZXJtaXNzaW9ucyIsCiAgICAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMTYyMSwxMSArMTY4MSwxMiBAQAogICAgIHNwPENhbWVyYURldmljZUNsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICBTdHJpbmcxNiBjbGllbnRQYWNrYWdlTmFtZUFkaiA9IGNsaWVudFBhY2thZ2VOYW1lOwogICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKLQotICAgIGlmIChnZXRDdXJyZW50U2VydmluZ0NhbGwoKSA9PSBCaW5kZXJDYWxsVHlwZTo6SFdCSU5ERVIpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgdmVuZG9yQ2xpZW50ID0KLSAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoInZlbmRvci5jbGllbnQucGlkPCVkPiIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwotICAgICAgICBjbGllbnRQYWNrYWdlTmFtZUFkaiA9IFN0cmluZzE2KHZlbmRvckNsaWVudC5jX3N0cigpKTsKKyAgICBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCA9IGZhbHNlOworICAgIGlmIChkb2VzQ2xpZW50SGF2ZVN5c3RlbVVpZCgpICYmIChjbGllbnRQYWNrYWdlTmFtZUFkai5zaXplKCkgPT0gMCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3lzdGVtQ2xpZW50ID0KKyAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoImNsaWVudC5waWQ8JWQ+IiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CisgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lQWRqID0gU3RyaW5nMTYoc3lzdGVtQ2xpZW50LmNfc3RyKCkpOworICAgICAgICBzeXN0ZW1OYXRpdmVDbGllbnQgPSB0cnVlOwogICAgIH0KIAogICAgIGlmIChvb21TY29yZU9mZnNldCA8IDApIHsKQEAgLTE2MzcsNiArMTY5OCwxMyBAQAogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CiAgICAgfQogCisgICAgaWYgKENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmlzQ2FtZXJhRGlzYWJsZWQoKSkgeworICAgICAgICBTdHJpbmc4IG1zZyA9CisgICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgZGlzYWJsZWQgYnkgZGV2aWNlIHBvbGljeSIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKEVSUk9SX0RJU0FCTEVELCBtc2cuc3RyaW5nKCkpOworICAgIH0KKwogICAgIC8vIGVuZm9yY2Ugc3lzdGVtIGNhbWVyYSBwZXJtaXNzaW9ucwogICAgIGlmIChvb21TY29yZU9mZnNldCA+IDAgJiYKICAgICAgICAgICAgICFoYXNQZXJtaXNzaW9uc0ZvclN5c3RlbUNhbWVyYShjYWxsaW5nUGlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpKSkgewpAQCAtMTY0OSw3ICsxNzE3LDcgQEAKICAgICB9CiAKICAgICByZXQgPSBjb25uZWN0SGVscGVyPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLENhbWVyYURldmljZUNsaWVudD4oY2FtZXJhQ2IsIGlkLAotICAgICAgICAgICAgLyphcGkxQ2FtZXJhSWQqLy0xLCBjbGllbnRQYWNrYWdlTmFtZUFkaiwgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgLyphcGkxQ2FtZXJhSWQqLy0xLCBjbGllbnRQYWNrYWdlTmFtZUFkaiwgc3lzdGVtTmF0aXZlQ2xpZW50LGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMiwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLCBvb21TY29yZU9mZnNldCwKICAgICAgICAgICAgIHRhcmdldFNka1ZlcnNpb24sIC8qb3V0Ki9jbGllbnQpOwogCkBAIC0xNjgwLDcgKzE3NDgsNyBAQAogCiB0ZW1wbGF0ZTxjbGFzcyBDQUxMQkFDSywgY2xhc3MgQ0xJRU5UPgogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmNvbm5lY3RIZWxwZXIoY29uc3Qgc3A8Q0FMTEJBQ0s+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCi0gICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCwKICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwKICAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgc2hpbVVwZGF0ZU9ubHksIGludCBvb21TY29yZU9mZnNldCwgaW50IHRhcmdldFNka1ZlcnNpb24sCiAgICAgICAgIC8qb3V0Ki9zcDxDTElFTlQ+JiBkZXZpY2UpIHsKQEAgLTE2OTksNyArMTc2Nyw3IEBACiAgICAgc3A8Q0xJRU5UPiBjbGllbnQgPSBudWxscHRyOwogICAgIGludCBmYWNpbmcgPSAtMTsKICAgICBpbnQgb3JpZW50YXRpb24gPSAwOwotICAgIGJvb2wgaXNOZGsgPSAoY2xpZW50UGFja2FnZU5hbWUuc2l6ZSgpID09IDApOworICAgIGJvb2wgaXNOb25TeXN0ZW1OZGsgPSAoY2xpZW50UGFja2FnZU5hbWUuc2l6ZSgpID09IDApOwogICAgIHsKICAgICAgICAgLy8gQWNxdWlyZSBtU2VydmljZUxvY2sgYW5kIHByZXZlbnQgb3RoZXIgY2xpZW50cyBmcm9tIGNvbm5lY3RpbmcKICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPiBsb2NrID0KQEAgLTE3MzMsOCArMTgwMSw4IEBACiAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnRUbXAgPSBudWxscHRyOwogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cmVzb3VyY2VfcG9saWN5OjpDbGllbnREZXNjcmlwdG9yPFN0cmluZzgsIHNwPEJhc2ljQ2xpZW50Pj4+IHBhcnRpYWw7CiAgICAgICAgIGlmICgoZXJyID0gaGFuZGxlRXZpY3Rpb25zTG9ja2VkKGNhbWVyYUlkLCBvcmlnaW5hbENsaWVudFBpZCwgZWZmZWN0aXZlQXBpTGV2ZWwsCi0gICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhQ2IpLCBjbGllbnROYW1lOCwgb29tU2NvcmVPZmZzZXQsIC8qb3V0Ki8mY2xpZW50VG1wLAotICAgICAgICAgICAgICAgIC8qb3V0Ki8mcGFydGlhbCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhQ2IpLCBjbGllbnROYW1lOCwgb29tU2NvcmVPZmZzZXQsIHN5c3RlbU5hdGl2ZUNsaWVudCwKKyAgICAgICAgICAgICAgICAvKm91dCovJmNsaWVudFRtcCwgLypvdXQqLyZwYXJ0aWFsKSkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN3aXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAtRU5PREVWOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9ESVNDT05ORUNURUQsCkBAIC0xNzY0LDcgKzE4MzIsOCBAQAogICAgICAgICAvLyBnaXZlIGZsYXNobGlnaHQgYSBjaGFuY2UgdG8gY2xvc2UgZGV2aWNlcyBpZiBuZWNlc3NhcnkuCiAgICAgICAgIG1GbGFzaGxpZ2h0LT5wcmVwYXJlRGV2aWNlT3BlbihjYW1lcmFJZCk7CiAKLSAgICAgICAgaW50IGRldmljZVZlcnNpb24gPSBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAvKm91dCovJmZhY2luZywgLypvdXQqLyZvcmllbnRhdGlvbik7CisgICAgICAgIGF1dG8gZGV2aWNlVmVyc2lvbkFuZFRyYW5zcG9ydCA9CisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgLypvdXQqLyZmYWNpbmcsIC8qb3V0Ki8mb3JpZW50YXRpb24pOwogICAgICAgICBpZiAoZmFjaW5nID09IC0xKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZXQgY2FtZXJhIGRldmljZSBcIiVzXCIgIGZhY2luZyIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOwogICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCkBAIC0xNzc0LDEwICsxODQzLDEwIEBACiAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiB0bXAgPSBudWxscHRyOwogICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6dGFyZ2V0UGVyZkNsYXNzUHJpbWFyeUNhbWVyYSgKICAgICAgICAgICAgICAgICBtUGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywgY2FtZXJhSWQuc3RyaW5nKCksIHRhcmdldFNka1ZlcnNpb24pOwotICAgICAgICBpZighKHJldCA9IG1ha2VDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRGZWF0dXJlSWQsCi0gICAgICAgICAgICAgICAgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwgZmFjaW5nLCBvcmllbnRhdGlvbiwKKyAgICAgICAgaWYoIShyZXQgPSBtYWtlQ2xpZW50KHRoaXMsIGNhbWVyYUNiLCBjbGllbnRQYWNrYWdlTmFtZSwgc3lzdGVtTmF0aXZlQ2xpZW50LAorICAgICAgICAgICAgICAgIGNsaWVudEZlYXR1cmVJZCwgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwgZmFjaW5nLCBvcmllbnRhdGlvbiwKICAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksCi0gICAgICAgICAgICAgICAgZGV2aWNlVmVyc2lvbiwgZWZmZWN0aXZlQXBpTGV2ZWwsIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAorICAgICAgICAgICAgICAgIGRldmljZVZlcnNpb25BbmRUcmFuc3BvcnQsIGVmZmVjdGl2ZUFwaUxldmVsLCBvdmVycmlkZUZvclBlcmZDbGFzcywKICAgICAgICAgICAgICAgICAvKm91dCovJnRtcCkpLmlzT2soKSkgewogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQpAQCAtMTc4Niw3ICsxODU1LDggQEAKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjbGllbnQuZ2V0KCkgPT0gbnVsbHB0ciwgIiVzOiBDYW1lcmFTZXJ2aWNlIGluIGludmFsaWQgc3RhdGUiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAKLSAgICAgICAgZXJyID0gY2xpZW50LT5pbml0aWFsaXplKG1DYW1lcmFQcm92aWRlck1hbmFnZXIsIG1Nb25pdG9yVGFncyk7CisgICAgICAgIFN0cmluZzggbW9uaXRvclRhZ3MgPSBpc0NsaWVudFdhdGNoZWQoY2xpZW50LmdldCgpKSA/IG1Nb25pdG9yVGFncyA6IFN0cmluZzgoIiIpOworICAgICAgICBlcnIgPSBjbGllbnQtPmluaXRpYWxpemUobUNhbWVyYVByb3ZpZGVyTWFuYWdlciwgbW9uaXRvclRhZ3MpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBpbml0aWFsaXplIGNsaWVudCBmcm9tIEhBTC4iLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgLy8gRXJyb3JzIGNvdWxkIGJlIGZyb20gdGhlIEhBTCBtb2R1bGUgb3BlbiBjYWxsIG9yIGZyb20gQXBwT3BzTWFuYWdlcgpAQCAtMTgzNCwxNCArMTkwNCwxNSBAQAogICAgICAgICAvLyBTZXQgcm90YXRlLWFuZC1jcm9wIG92ZXJyaWRlIGJlaGF2aW9yCiAgICAgICAgIGlmIChtT3ZlcnJpZGVSb3RhdGVBbmRDcm9wTW9kZSAhPSBBTkRST0lEX1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfQVVUTykgewogICAgICAgICAgICAgY2xpZW50LT5zZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUobU92ZXJyaWRlUm90YXRlQW5kQ3JvcE1vZGUpOwotICAgICAgICB9IGVsc2UgaWYgKENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmlzUm90YXRlQW5kQ3JvcE92ZXJyaWRlTmVlZGVkKGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiwgZmFjaW5nKSkgewotICAgICAgICAgICAgY2xpZW50LT5zZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUoQU5EUk9JRF9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QXzkwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjbGllbnQtPnNldFJvdGF0ZUFuZENyb3BPdmVycmlkZSgKKyAgICAgICAgICAgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6Z2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKAorICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGZhY2luZywgbXVsdGl1c2VyX2dldF91c2VyX2lkKGNsaWVudFVpZCkpKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFNldCBjYW1lcmEgbXV0aW5nIGJlaGF2aW9yCiAgICAgICAgIGJvb2wgaXNDYW1lcmFQcml2YWN5RW5hYmxlZCA9Ci0gICAgICAgICAgICAgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPmlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQobXVsdGl1c2VyX2dldF91c2VyX2lkKGNsaWVudFVpZCkpOworICAgICAgICAgICAgICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LT5pc0NhbWVyYVByaXZhY3lFbmFibGVkKCk7CiAgICAgICAgIGlmIChjbGllbnQtPnN1cHBvcnRzQ2FtZXJhTXV0ZSgpKSB7CiAgICAgICAgICAgICBjbGllbnQtPnNldENhbWVyYU11dGUoCiAgICAgICAgICAgICAgICAgICAgIG1PdmVycmlkZUNhbWVyYU11dGVNb2RlIHx8IGlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQpOwpAQCAtMTg3NCw3ICsxOTQ1LDcgQEAKICAgICAgICAgICAgIG1TZXJ2aWNlTG9jay5sb2NrKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGFkZCBjbGllbnQgdG8gYWN0aXZlIGNsaWVudHMgbGlzdAotICAgICAgICAgICAgZmluaXNoQ29ubmVjdExvY2tlZChjbGllbnQsIHBhcnRpYWwsIG9vbVNjb3JlT2Zmc2V0KTsKKyAgICAgICAgICAgIGZpbmlzaENvbm5lY3RMb2NrZWQoY2xpZW50LCBwYXJ0aWFsLCBvb21TY29yZU9mZnNldCwgc3lzdGVtTmF0aXZlQ2xpZW50KTsKICAgICAgICAgfQogCiAgICAgICAgIGNsaWVudC0+c2V0SW1hZ2VEdW1wTWFzayhtSW1hZ2VEdW1wTWFzayk7CkBAIC0xODg2LDcgKzE5NTcsMzQgQEAKIAogICAgIGludDMyX3Qgb3BlbkxhdGVuY3lNcyA9IG5zMm1zKHN5c3RlbVRpbWUoKSAtIG9wZW5UaW1lTnMpOwogICAgIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ09wZW4oY2FtZXJhSWQsIGZhY2luZywgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBlZmZlY3RpdmVBcGlMZXZlbCwgaXNOZGssIG9wZW5MYXRlbmN5TXMpOworICAgICAgICAgICAgZWZmZWN0aXZlQXBpTGV2ZWwsIGlzTm9uU3lzdGVtTmRrLCBvcGVuTGF0ZW5jeU1zKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUluamVjdGlvblBhcmFtZXRlcnNMb2NrKTsKKyAgICAgICAgaWYgKGNhbWVyYUlkID09IG1JbmplY3Rpb25JbnRlcm5hbENhbUlkICYmIG1JbmplY3Rpb25Jbml0UGVuZGluZykgeworICAgICAgICAgICAgbUluamVjdGlvbkluaXRQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKKyAgICAgICAgICAgIGF1dG8gY2xpZW50RGVzY3JpcHRvciA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldChtSW5qZWN0aW9uSW50ZXJuYWxDYW1JZCk7CisgICAgICAgICAgICBpZiAoY2xpZW50RGVzY3JpcHRvciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFNwID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICByZXMgPSBjaGVja0lmSW5qZWN0aW9uQ2FtZXJhSXNQcmVzZW50KG1JbmplY3Rpb25FeHRlcm5hbENhbUlkLCBjbGllbnRTcCk7CisgICAgICAgICAgICAgICAgaWYocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RJU0NPTk5FQ1RFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gY2FtZXJhIGRldmljZSB3aXRoIElEIFwiJXNcIiBjdXJyZW50bHkgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcyA9IGNsaWVudFNwLT5pbmplY3RDYW1lcmEobUluamVjdGlvbkV4dGVybmFsQ2FtSWQsIG1DYW1lcmFQcm92aWRlck1hbmFnZXIpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgbUluamVjdGlvblN0YXR1c0xpc3RlbmVyLT5ub3RpZnlJbmplY3Rpb25FcnJvcihtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZCwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW50ZXJuYWwgY2FtZXJhIElEID0gJXMgJ3MgY2xpZW50IGRvZXMgbm90IGV4aXN0ISIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JbmplY3Rpb25JbnRlcm5hbENhbUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXMgPSBOT19JTklUOworICAgICAgICAgICAgICAgIG1JbmplY3Rpb25TdGF0dXNMaXN0ZW5lci0+bm90aWZ5SW5qZWN0aW9uRXJyb3IobUluamVjdGlvbkV4dGVybmFsQ2FtSWQsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKICAgICByZXR1cm4gcmV0OwogfQpAQCAtMTkyMiw3ICsyMDIwLDggQEAKICAgICAgICAgICAgICAgICBrT2ZmbGluZURldmljZSArIG9ubGluZUNsaWVudERlc2MtPmdldEtleSgpLCBvZmZsaW5lQ2xpZW50LCAvKmNvc3QqLyAwLAogICAgICAgICAgICAgICAgIC8qY29uZmxpY3RpbmdLZXlzKi8gc3RkOjpzZXQ8U3RyaW5nOD4oKSwgb25saW5lUHJpb3JpdHkuZ2V0U2NvcmUoKSwKICAgICAgICAgICAgICAgICBvbmxpbmVDbGllbnREZXNjLT5nZXRPd25lcklkKCksIG9ubGluZVByaW9yaXR5LmdldFN0YXRlKCksCi0gICAgICAgICAgICAgICAgLypvbW1TY29yZU9mZnNldCovIDApOworICAgICAgICAgICAgICAgIC8vIG5hdGl2ZSBjbGllbnRzIGRvbid0IGhhdmUgb2ZmbGluZSBwcm9jZXNzaW5nIHN1cHBvcnQuCisgICAgICAgICAgICAgICAgLypvbW1TY29yZU9mZnNldCovIDAsIC8qc3lzdGVtTmF0aXZlQ2xpZW50Ki9mYWxzZSk7CiAKICAgICAgICAgLy8gQWxsb3cgb25seSBvbmUgb2ZmbGluZSBkZXZpY2UgcGVyIGNhbWVyYQogICAgICAgICBhdXRvIGluY29tcGF0aWJsZUNsaWVudHMgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRJbmNvbXBhdGlibGVDbGllbnRzKG9mZmxpbmVDbGllbnREZXNjKTsKQEAgLTE5MzEsNyArMjAzMCw4IEBACiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAKLSAgICAgICAgYXV0byBlcnIgPSBvZmZsaW5lQ2xpZW50LT5pbml0aWFsaXplKG1DYW1lcmFQcm92aWRlck1hbmFnZXIsIG1Nb25pdG9yVGFncyk7CisgICAgICAgIFN0cmluZzggbW9uaXRvclRhZ3MgPSBpc0NsaWVudFdhdGNoZWQob2ZmbGluZUNsaWVudC5nZXQoKSkgPyBtTW9uaXRvclRhZ3MgOiBTdHJpbmc4KCIiKTsKKyAgICAgICAgYXV0byBlcnIgPSBvZmZsaW5lQ2xpZW50LT5pbml0aWFsaXplKG1DYW1lcmFQcm92aWRlck1hbmFnZXIsIG1vbml0b3JUYWdzKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgaW5pdGlhbGl6ZSBvZmZsaW5lIGNsaWVudC4iLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTE5NjMsNiArMjA2MywxMzYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK1N0YXR1cyBDYW1lcmFTZXJ2aWNlOjp0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwgaW50MzJfdCB0b3JjaFN0cmVuZ3RoLAorICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgY2xpZW50QmluZGVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKKworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKGNsaWVudEJpbmRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogdG9yY2ggY2xpZW50IGJpbmRlciBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICJUb3JjaCBjbGllbnQgYmluZGVyIGluIG51bGwuIik7CisgICAgfQorCisgICAgU3RyaW5nOCBpZCA9IFN0cmluZzgoY2FtZXJhSWQuc3RyaW5nKCkpOworICAgIGludCB1aWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOworCisgICAgaWYgKHNob3VsZFJlamVjdFN5c3RlbUNhbWVyYUNvbm5lY3Rpb24oaWQpKSB7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJVbmFibGUgdG8gY2hhbmdlIHRoZSBzdHJlbmd0aCBsZXZlbCIKKyAgICAgICAgICAgICAgICAiZm9yIHN5c3RlbSBvbmx5IGRldmljZSAlczogIiwgaWQuc3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIHZlcmlmeSBpZCBpcyB2YWxpZAorICAgIGF1dG8gc3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShpZCk7CisgICAgaWYgKHN0YXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgaWQgaXMgaW52YWxpZCAlcyIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgIkNhbWVyYSBJRCBcIiVzXCIgaXMgYSBub3QgdmFsaWQgY2FtZXJhIElEIiwgaWQuc3RyaW5nKCkpOworICAgIH0KKworICAgIFN0YXR1c0ludGVybmFsIGNhbWVyYVN0YXR1cyA9IHN0YXRlLT5nZXRTdGF0dXMoKTsKKyAgICBpZiAoY2FtZXJhU3RhdHVzICE9IFN0YXR1c0ludGVybmFsOjpOT1RfQVZBSUxBQkxFICYmCisgICAgICAgICAgICBjYW1lcmFTdGF0dXMgIT0gU3RhdHVzSW50ZXJuYWw6OlBSRVNFTlQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgaWQgaXMgaW52YWxpZCAlcywgc3RhdHVzICVkIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSwKKyAgICAgICAgICAgIChpbnQpY2FtZXJhU3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAiQ2FtZXJhIElEIFwiJXNcIiBpcyBhIG5vdCB2YWxpZCBjYW1lcmEgSUQiLCBpZC5zdHJpbmcoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoU3RhdHVzTXV0ZXgpOworICAgICAgICBUb3JjaE1vZGVTdGF0dXMgc3RhdHVzOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBnZXRUb3JjaFN0YXR1c0xvY2tlZChpZCwgJnN0YXR1cyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhIFwiJXNcIiBkb2VzIG5vdCBoYXZlIGEgZmxhc2ggdW5pdCIsIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dFKCIlczogZ2V0dGluZyBjdXJyZW50IHRvcmNoIHN0YXR1cyBmYWlsZWQgZm9yIGNhbWVyYSAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBjaGFuZ2luZyB0b3JjaCBzdHJlbmd0aCBsZXZlbCBmb3IgY2FtZXJhIFwiJXNcIjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIGlkLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0dXMgPT0gVG9yY2hNb2RlU3RhdHVzOjpOT1RfQVZBSUxBQkxFKSB7CisgICAgICAgICAgICBpZiAoY2FtZXJhU3RhdHVzID09IFN0YXR1c0ludGVybmFsOjpOT1RfQVZBSUxBQkxFKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB0b3JjaCBtb2RlIG9mIGNhbWVyYSAlcyBpcyBub3QgYXZhaWxhYmxlIGJlY2F1c2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgImNhbWVyYSBpcyBpbiB1c2UuIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfQ0FNRVJBX0lOX1VTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUb3JjaCBmb3IgY2FtZXJhIFwiJXNcIiBpcyBub3QgYXZhaWxhYmxlIGR1ZSB0byBhbiBleGlzdGluZyBjYW1lcmEgdXNlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBpZC5zdHJpbmcoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdG9yY2ggbW9kZSBvZiBjYW1lcmEgJXMgaXMgbm90IGF2YWlsYWJsZSBkdWUgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAiaW5zdWZmaWNpZW50IHJlc291cmNlcyIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX01BWF9DQU1FUkFTX0lOX1VTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUb3JjaCBmb3IgY2FtZXJhIFwiJXNcIiBpcyBub3QgYXZhaWxhYmxlIGR1ZSB0byBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaFVpZE1hcE11dGV4KTsKKyAgICAgICAgdXBkYXRlVG9yY2hVaWRNYXBMb2NrZWQoY2FtZXJhSWQsIHVpZCk7CisgICAgfQorICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHRvcmNoIHN0cmVuZ3RoIGxldmVsIGlzIHNhbWUgYXMgdGhlIG5ldyBvbmUuCisgICAgYm9vbCBzaG91bGRTa2lwVG9yY2hTdHJlbmd0aFVwZGF0ZXMgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5zaG91bGRTa2lwVG9yY2hTdHJlbmd0aFVwZGF0ZSgKKyAgICAgICAgICAgIGlkLnN0cmluZygpLCB0b3JjaFN0cmVuZ3RoKTsKKworICAgIHN0YXR1c190IGVyciA9IG1GbGFzaGxpZ2h0LT50dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGlkLCB0b3JjaFN0cmVuZ3RoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgaW50MzJfdCBlcnJvckNvZGU7CisgICAgICAgIFN0cmluZzggbXNnOworICAgICAgICBzd2l0Y2ggKGVycikgeworICAgICAgICAgICAgY2FzZSAtRU5PU1lTOgorICAgICAgICAgICAgICAgIG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhIFwiJXNcIiBoYXMgbm8gZmxhc2hsaWdodC4iLAorICAgICAgICAgICAgICAgICAgICBpZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgLUVCVVNZOgorICAgICAgICAgICAgICAgIG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhIFwiJXNcIiBpcyBpbiB1c2UiLAorICAgICAgICAgICAgICAgICAgICBpZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gRVJST1JfQ0FNRVJBX0lOX1VTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgLUVJTlZBTDoKKyAgICAgICAgICAgICAgICBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIlRvcmNoIHN0cmVuZ3RoIGxldmVsICVkIGlzIG5vdCB3aXRoaW4gdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZCByYW5nZS4iLCB0b3JjaFN0cmVuZ3RoKTsKKyAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSBFUlJPUl9JTExFR0FMX0FSR1VNRU5UOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNoYW5naW5nIHRvcmNoIHN0cmVuZ3RoIGxldmVsIGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSBFUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKGVycm9yQ29kZSwgbXNnLnN0cmluZygpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIHVwZGF0ZSB0aGUgbGluayB0byBjbGllbnQncyBkZWF0aAorICAgICAgICAvLyBTdG9yZSB0aGUgbGFzdCBjbGllbnQgdGhhdCB0dXJucyBvbiBlYWNoIGNhbWVyYSdzIHRvcmNoIG1vZGUuCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtVG9yY2hDbGllbnRNYXBNdXRleCk7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtVG9yY2hDbGllbnRNYXAuaW5kZXhPZktleShpZCk7CisgICAgICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgbVRvcmNoQ2xpZW50TWFwLmFkZChpZCwgY2xpZW50QmluZGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Ub3JjaENsaWVudE1hcC52YWx1ZUF0KGluZGV4KS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgICAgIG1Ub3JjaENsaWVudE1hcC5yZXBsYWNlVmFsdWVBdChpbmRleCwgY2xpZW50QmluZGVyKTsKKyAgICAgICAgfQorICAgICAgICBjbGllbnRCaW5kZXItPmxpbmtUb0RlYXRoKHRoaXMpOworICAgIH0KKworICAgIGludCBjbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGNoYXIgKmlkX2NzdHIgPSBpZC5jX3N0cigpOworICAgIEFMT0dJKCIlczogVG9yY2ggc3RyZW5ndGggZm9yIGNhbWVyYSBpZCAlcyBjaGFuZ2VkIHRvICVkIGZvciBjbGllbnQgUElEICVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWRfY3N0ciwgdG9yY2hTdHJlbmd0aCwgY2xpZW50UGlkKTsKKyAgICBpZiAoIXNob3VsZFNraXBUb3JjaFN0cmVuZ3RoVXBkYXRlcykgeworICAgICAgICBicm9hZGNhc3RUb3JjaFN0cmVuZ3RoTGV2ZWwoaWQsIHRvcmNoU3RyZW5ndGgpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6c2V0VG9yY2hNb2RlKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwgYm9vbCBlbmFibGVkLAogICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgY2xpZW50QmluZGVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKQEAgLTIwMzQsMTMgKzIyNjQsNyBAQAogICAgICAgICAvLyBVcGRhdGUgVUlEIG1hcCAtIHRoaXMgaXMgdXNlZCBpbiB0aGUgdG9yY2ggc3RhdHVzIGNoYW5nZWQgY2FsbGJhY2tzLCBzbyBtdXN0IGJlIGRvbmUKICAgICAgICAgLy8gYmVmb3JlIHNldFRvcmNoTW9kZQogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoVWlkTWFwTXV0ZXgpOwotICAgICAgICBpZiAobVRvcmNoVWlkTWFwLmZpbmQoaWQpID09IG1Ub3JjaFVpZE1hcC5lbmQoKSkgewotICAgICAgICAgICAgbVRvcmNoVWlkTWFwW2lkXS5maXJzdCA9IHVpZDsKLSAgICAgICAgICAgIG1Ub3JjaFVpZE1hcFtpZF0uc2Vjb25kID0gdWlkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU2V0IHRoZSBwZW5kaW5nIFVJRAotICAgICAgICAgICAgbVRvcmNoVWlkTWFwW2lkXS5maXJzdCA9IHVpZDsKLSAgICAgICAgfQorICAgICAgICB1cGRhdGVUb3JjaFVpZE1hcExvY2tlZChjYW1lcmFJZCwgdWlkKTsKICAgICB9CiAKICAgICBzdGF0dXNfdCBlcnIgPSBtRmxhc2hsaWdodC0+c2V0VG9yY2hNb2RlKGlkLCBlbmFibGVkKTsKQEAgLTIwNTQsNiArMjI3OCwxMSBAQAogICAgICAgICAgICAgICAgICAgICBpZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgLUVCVVNZOgorICAgICAgICAgICAgICAgIG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhIFwiJXNcIiBpcyBpbiB1c2UiLAorICAgICAgICAgICAgICAgICAgICBpZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gRVJST1JfQ0FNRVJBX0lOX1VTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgbXNnID0gU3RyaW5nODo6Zm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAiU2V0dGluZyB0b3JjaCBtb2RlIG9mIGNhbWVyYSBcIiVzXCIgdG8gJWQgZmFpbGVkOiAlcyAoJWQpIiwKQEAgLTIwOTAsNiArMjMxOSwxNyBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6dXBkYXRlVG9yY2hVaWRNYXBMb2NrZWQoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBpbnQgdWlkKSB7CisgICAgU3RyaW5nOCBpZCA9IFN0cmluZzgoY2FtZXJhSWQuc3RyaW5nKCkpOworICAgIGlmIChtVG9yY2hVaWRNYXAuZmluZChpZCkgPT0gbVRvcmNoVWlkTWFwLmVuZCgpKSB7CisgICAgICAgIG1Ub3JjaFVpZE1hcFtpZF0uZmlyc3QgPSB1aWQ7CisgICAgICAgIG1Ub3JjaFVpZE1hcFtpZF0uc2Vjb25kID0gdWlkOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNldCB0aGUgcGVuZGluZyBVSUQKKyAgICAgICAgbVRvcmNoVWlkTWFwW2lkXS5maXJzdCA9IHVpZDsKKyAgICB9Cit9CisKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpub3RpZnlTeXN0ZW1FdmVudChpbnQzMl90IGV2ZW50SWQsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBhcmdzKSB7CiAgICAgY29uc3QgaW50IHBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CkBAIC0yMTIwLDYgKzIzNjAsMTMgQEAKICAgICAgICAgICAgIGRvVXNlclN3aXRjaCgvKm5ld1VzZXJJZHMqLyBhcmdzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGNhc2UgSUNhbWVyYVNlcnZpY2U6OkVWRU5UX1VTQl9ERVZJQ0VfQVRUQUNIRUQ6CisgICAgICAgIGNhc2UgSUNhbWVyYVNlcnZpY2U6OkVWRU5UX1VTQl9ERVZJQ0VfREVUQUNIRUQ6IHsKKyAgICAgICAgICAgIC8vIE5vdGlmeSBDYW1lcmFQcm92aWRlck1hbmFnZXIgZm9yIGxhenkgSEFMcworICAgICAgICAgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+bm90aWZ5VXNiRGV2aWNlRXZlbnQoZXZlbnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoYXJnc1swXSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBJQ2FtZXJhU2VydmljZTo6RVZFTlRfTk9ORToKICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgQUxPR1coIiVzOiBSZWNlaXZlZCBpbnZhbGlkIHN5c3RlbSBldmVudCBmcm9tIHN5c3RlbV9zZXJ2ZXI6ICVkIiwgX19GVU5DVElPTl9fLApAQCAtMjE2MiwyNCArMjQwOSw3IEBACiAKICAgICBBVFJBQ0VfQ0FMTCgpOwogCi0gICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlOwotICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPiBuZXdEZXZpY2VTdGF0ZXt9OwotICAgIGlmIChuZXdTdGF0ZSAmIElDYW1lcmFTZXJ2aWNlOjpERVZJQ0VfU1RBVEVfQkFDS19DT1ZFUkVEKSB7Ci0gICAgICAgIG5ld0RldmljZVN0YXRlIHw9IERldmljZVN0YXRlOjpCQUNLX0NPVkVSRUQ7Ci0gICAgfQotICAgIGlmIChuZXdTdGF0ZSAmIElDYW1lcmFTZXJ2aWNlOjpERVZJQ0VfU1RBVEVfRlJPTlRfQ09WRVJFRCkgewotICAgICAgICBuZXdEZXZpY2VTdGF0ZSB8PSBEZXZpY2VTdGF0ZTo6RlJPTlRfQ09WRVJFRDsKLSAgICB9Ci0gICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9GT0xERUQpIHsKLSAgICAgICAgbmV3RGV2aWNlU3RhdGUgfD0gRGV2aWNlU3RhdGU6OkZPTERFRDsKLSAgICB9Ci0gICAgLy8gT25seSBtYXAgdmVuZG9yIGJpdHMgZGlyZWN0bHkKLSAgICB1aW50NjRfdCB2ZW5kb3JCaXRzID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG5ld1N0YXRlKSAmIDB4RkZGRkZGRkYwMDAwMDAwMGw7Ci0gICAgbmV3RGV2aWNlU3RhdGUgfD0gdmVuZG9yQml0czsKLQotICAgIEFMT0dWKCIlczogTmV3IGRldmljZSBzdGF0ZSAweCUiIFBSSXg2NCwgX19GVU5DVElPTl9fLCBuZXdEZXZpY2VTdGF0ZSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobVNlcnZpY2VMb2NrKTsKLSAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShuZXdEZXZpY2VTdGF0ZSk7CisgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobmV3U3RhdGUpOwogCiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KQEAgLTIyMTMsMTMgKzI0NDMsMTEgQEAKICAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgY29uc3QgYXV0byBiYXNpY0NsaWVudCA9IGN1cnJlbnQtPmdldFZhbHVlKCk7CiAgICAgICAgICAgICBpZiAoYmFzaWNDbGllbnQuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIGlmIChDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjppc1JvdGF0ZUFuZENyb3BPdmVycmlkZU5lZWRlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY0NsaWVudC0+Z2V0UGFja2FnZU5hbWUoKSwgYmFzaWNDbGllbnQtPmdldENhbWVyYU9yaWVudGF0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNDbGllbnQtPmdldENhbWVyYUZhY2luZygpKSkgewotICAgICAgICAgICAgICAgICAgICBiYXNpY0NsaWVudC0+c2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKEFORFJPSURfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUF85MCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYmFzaWNDbGllbnQtPnNldFJvdGF0ZUFuZENyb3BPdmVycmlkZShBTkRST0lEX1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfTk9ORSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBiYXNpY0NsaWVudC0+c2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKAorICAgICAgICAgICAgICAgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6Z2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKAorICAgICAgICAgICAgICAgICAgICAgIGJhc2ljQ2xpZW50LT5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2ljQ2xpZW50LT5nZXRDYW1lcmFGYWNpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICBtdWx0aXVzZXJfZ2V0X3VzZXJfaWQoYmFzaWNDbGllbnQtPmdldENsaWVudFVpZCgpKSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjMzNiw3ICsyNTY0LDcgQEAKICAgICBhdXRvIGNsaWVudFVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAgICAgYXV0byBjbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGJvb2wgb3BlbkNsb3NlQ2FsbGJhY2tBbGxvd2VkID0gY2hlY2tQZXJtaXNzaW9uKHNDYW1lcmFPcGVuQ2xvc2VMaXN0ZW5lclBlcm1pc3Npb24sCi0gICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCk7CisgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgLypsb2dQZXJtaXNzaW9uRmFpbHVyZSovZmFsc2UpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKIApAQCAtMjM3Myw3ICsyNjAxLDggQEAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUNhbWVyYVN0YXRlc0xvY2spOwogICAgICAgICBmb3IgKGF1dG8mIGkgOiBtQ2FtZXJhU3RhdGVzKSB7CiAgICAgICAgICAgICBjYW1lcmFTdGF0dXNlcy0+ZW1wbGFjZV9iYWNrKGkuZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgIG1hcFRvSW50ZXJmYWNlKGkuc2Vjb25kLT5nZXRTdGF0dXMoKSksIGkuc2Vjb25kLT5nZXRVbmF2YWlsYWJsZVBoeXNpY2FsSWRzKCkpOworICAgICAgICAgICAgICAgICAgICBtYXBUb0ludGVyZmFjZShpLnNlY29uZC0+Z2V0U3RhdHVzKCkpLCBpLnNlY29uZC0+Z2V0VW5hdmFpbGFibGVQaHlzaWNhbElkcygpLAorICAgICAgICAgICAgICAgICAgICBvcGVuQ2xvc2VDYWxsYmFja0FsbG93ZWQgPyBpLnNlY29uZC0+Z2V0Q2xpZW50UGFja2FnZSgpIDogU3RyaW5nODo6ZW1wdHkoKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgLy8gUmVtb3ZlIHRoZSBjYW1lcmEgc3RhdHVzZXMgdGhhdCBzaG91bGQgYmUgaGlkZGVuIGZyb20gdGhlIGNsaWVudCwgd2UgZG8KQEAgLTI0OTAsNDQgKzI3MTksNDggQEAKICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKICAgICB9CiAKLSAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oaWQpOwotICAgIHN3aXRjaCAoZGV2aWNlVmVyc2lvbikgewotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgotICAgICAgICAgICAgaWYgKGFwaVZlcnNpb24gPT0gQVBJX1ZFUlNJT05fMikgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVzIHVzZXMgSEFMIHZlcnNpb24gJWQgPDMuMiwgZG9lc24ndCBzdXBwb3J0IGFwaTIgd2l0aG91dCBzaGltIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCksIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsgLy8gaWYgKGFwaVZlcnNpb24gPT0gQVBJX1ZFUlNJT05fMSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVzIHVzZXMgb2xkZXIgSEFMIGJlZm9yZSAzLjIsIGJ1dCBhcGkxIGlzIGFsd2F5cyBzdXBwb3J0ZWQiLAorICAgIGF1dG8gZGV2aWNlVmVyc2lvbkFuZFRyYW5zcG9ydCA9IGdldERldmljZVZlcnNpb24oaWQpOworICAgIGlmIChkZXZpY2VWZXJzaW9uQW5kVHJhbnNwb3J0LmZpcnN0ID09IC0xKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJVbmtub3duIGNhbWVyYSBJRCAlcyIsIGlkLnN0cmluZygpKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAoZGV2aWNlVmVyc2lvbkFuZFRyYW5zcG9ydC5zZWNvbmQgPT0gSVBDVHJhbnNwb3J0OjpISURMKSB7CisgICAgICAgIGludCBkZXZpY2VWZXJzaW9uID0gZGV2aWNlVmVyc2lvbkFuZFRyYW5zcG9ydC5maXJzdDsKKyAgICAgICAgc3dpdGNoIChkZXZpY2VWZXJzaW9uKSB7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgorICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgICAgICAgICAgaWYgKGFwaVZlcnNpb24gPT0gQVBJX1ZFUlNJT05fMikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSBpZCAlcyB1c2VzIEhBTCB2ZXJzaW9uICVkIDwzLjIsIGRvZXNuJ3Qgc3VwcG9ydCBhcGkyIHdpdGhvdXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaGltIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSwgZGV2aWNlVmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGlmIChhcGlWZXJzaW9uID09IEFQSV9WRVJTSU9OXzEpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgaWQgJXMgdXNlcyBvbGRlciBIQUwgYmVmb3JlIDMuMiwgYnV0IGFwaTEgaXMgYWx3YXlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydGVkIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OgorICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNToKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzY6CisgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM183OgorICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVzIHVzZXMgSEFMMy4yIG9yIG5ld2VyLCBzdXBwb3J0cyBhcGkxL2FwaTIgZGlyZWN0bHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiVW5rbm93biBkZXZpY2UgdmVyc2lvbiAleCBmb3IgZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVZlcnNpb24sIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMzoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNToKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNjoKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNzoKLSAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVzIHVzZXMgSEFMMy4yIG9yIG5ld2VyLCBzdXBwb3J0cyBhcGkxL2FwaTIgZGlyZWN0bHkiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKLSAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAtMTogewotICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIlVua25vd24gY2FtZXJhIElEICVzIiwgaWQuc3RyaW5nKCkpOwotICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiVW5rbm93biBkZXZpY2UgdmVyc2lvbiAleCBmb3IgZGV2aWNlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlVmVyc2lvbiwgaWQuc3RyaW5nKCkpOwotICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOwogICAgIH0KLQogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKQEAgLTI1NDgsNyArMjc4MSw3IEBACiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBleHRlcm5hbENhbUlkLAogICAgICAgICBjb25zdCBzcDxJQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgLypvdXQqLwotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYUluamVjdGlvblNlc3Npb24+KiBjYW1lcmFJbmplY3Rpb25TZXNzaW9uKSB7CisgICAgICAgIHNwPElDYW1lcmFJbmplY3Rpb25TZXNzaW9uPiogY2FtZXJhSW5qZWN0aW9uU2Vzc2lvbikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0NhbWVyYUluamVjdEV4dGVybmFsQ2FtZXJhUGVybWlzc2lvbikpIHsKQEAgLTI1NjUsMTggKzI3OTgsMzYgQEAKICAgICAgICAgX19GVU5DVElPTl9fLCBTdHJpbmc4KHBhY2thZ2VOYW1lKS5zdHJpbmcoKSwKICAgICAgICAgU3RyaW5nOChpbnRlcm5hbENhbUlkKS5zdHJpbmcoKSwgU3RyaW5nOChleHRlcm5hbENhbUlkKS5zdHJpbmcoKSk7CiAKLSAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKLSAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhlIGluamVjdGlvbiBjYW1lcmEgZnVuY3Rpb24uCi0gICAgLy8gcmV0ID0gaW50ZXJuYWxJbmplY3RDYW1lcmEoLi4uKTsKLSAgICAvLyBpZighcmV0LmlzT2soKSkgewotICAgIC8vICAgICBtSW5qZWN0aW9uU3RhdHVzTGlzdGVuZXItPm5vdGlmeUluamVjdGlvbkVycm9yKC4uLik7Ci0gICAgLy8gICAgIHJldHVybiByZXQ7Ci0gICAgLy8gfQorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUluamVjdGlvblBhcmFtZXRlcnNMb2NrKTsKKyAgICAgICAgbUluamVjdGlvbkludGVybmFsQ2FtSWQgPSBTdHJpbmc4KGludGVybmFsQ2FtSWQpOworICAgICAgICBtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZCA9IFN0cmluZzgoZXh0ZXJuYWxDYW1JZCk7CisgICAgICAgIG1JbmplY3Rpb25TdGF0dXNMaXN0ZW5lci0+YWRkTGlzdGVuZXIoY2FsbGJhY2spOworICAgICAgICAqY2FtZXJhSW5qZWN0aW9uU2Vzc2lvbiA9IG5ldyBDYW1lcmFJbmplY3Rpb25TZXNzaW9uKHRoaXMpOworICAgICAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKKyAgICAgICAgYXV0byBjbGllbnREZXNjcmlwdG9yID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0KG1JbmplY3Rpb25JbnRlcm5hbENhbUlkKTsKKyAgICAgICAgLy8gSWYgdGhlIGNsaWVudCBhbHJlYWR5IGV4aXN0cywgd2UgY2FuIGRpcmVjdGx5IGNvbm5lY3QgdG8gdGhlIGNhbWVyYSBkZXZpY2UgdGhyb3VnaCB0aGUKKyAgICAgICAgLy8gY2xpZW50J3MgaW5qZWN0Q2FtZXJhKCksIG90aGVyd2lzZSB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhlIGNsaWVudCBpcyBlc3RhYmxpc2hlZAorICAgICAgICAvLyAoZXhlY3V0ZSBjb25uZWN0SGVscGVyKCkpIGJlZm9yZSBpbmplY3RpbmcgdGhlIGNhbWVyYSB0byB0aGUgY2FtZXJhIGRldmljZS4KKyAgICAgICAgaWYgKGNsaWVudERlc2NyaXB0b3IgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUluamVjdGlvbkluaXRQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50U3AgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgcmVzID0gY2hlY2tJZkluamVjdGlvbkNhbWVyYUlzUHJlc2VudChtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZCwgY2xpZW50U3ApOworICAgICAgICAgICAgaWYocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfRElTQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGNhbWVyYSBkZXZpY2Ugd2l0aCBJRCBcIiVzXCIgY3VycmVudGx5IGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZC5zdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBjbGllbnRTcC0+aW5qZWN0Q2FtZXJhKG1JbmplY3Rpb25FeHRlcm5hbENhbUlkLCBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyKTsKKyAgICAgICAgICAgIGlmKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIG1JbmplY3Rpb25TdGF0dXNMaXN0ZW5lci0+bm90aWZ5SW5qZWN0aW9uRXJyb3IobUluamVjdGlvbkV4dGVybmFsQ2FtSWQsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5qZWN0aW9uSW5pdFBlbmRpbmcgPSB0cnVlOworICAgICAgICB9CisgICAgfQogCi0gICAgbUluamVjdGlvblN0YXR1c0xpc3RlbmVyLT5hZGRMaXN0ZW5lcihjYWxsYmFjayk7Ci0gICAgKmNhbWVyYUluamVjdGlvblNlc3Npb24gPSBuZXcgQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbih0aGlzKTsKLQotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6OnJlbW92ZUJ5Q2xpZW50KGNvbnN0IEJhc2ljQ2xpZW50KiBjbGllbnQpIHsKQEAgLTI1ODQsNiArMjgzNSw3IEBACiAgICAgZm9yIChhdXRvJiBpIDogbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0QWxsKCkpIHsKICAgICAgICAgYXV0byBjbGllbnRTcCA9IGktPmdldFZhbHVlKCk7CiAgICAgICAgIGlmIChjbGllbnRTcC5nZXQoKSA9PSBjbGllbnQpIHsKKyAgICAgICAgICAgIGNhY2hlQ2xpZW50VGFnRHVtcElmTmVlZGVkKGNsaWVudC0+bUNhbWVyYUlkU3RyLCBjbGllbnRTcC5nZXQoKSk7CiAgICAgICAgICAgICBtQWN0aXZlQ2xpZW50TWFuYWdlci5yZW1vdmUoaSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNjYwLDcgKzI5MTIsMTEgQEAKICAgICAgICAgcmV0dXJuIHNwPEJhc2ljQ2xpZW50PntudWxscHRyfTsKICAgICB9CiAKLSAgICByZXR1cm4gY2xpZW50RGVzY3JpcHRvclB0ci0+Z2V0VmFsdWUoKTsKKyAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50ID0gY2xpZW50RGVzY3JpcHRvclB0ci0+Z2V0VmFsdWUoKTsKKyAgICBpZiAoY2xpZW50LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2FjaGVDbGllbnRUYWdEdW1wSWZOZWVkZWQoY2xpZW50RGVzY3JpcHRvclB0ci0+Z2V0S2V5KCksIGNsaWVudC5nZXQoKSk7CisgICAgfQorICAgIHJldHVybiBjbGllbnQ7CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6ZG9Vc2VyU3dpdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBuZXdVc2VySWRzKSB7CkBAIC0yOTQzLDcgKzMxOTksNyBAQAogCiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywgaW50IHNlbnNvck9yaWVudGF0aW9uLApAQCAtMjk1MSw3ICszMjA3LDcgQEAKICAgICAgICAgaW50IHNlcnZpY2VQaWQpIDoKICAgICAgICAgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQoY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDbGllbnQpLAotICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIHN5c3RlbU5hdGl2ZUNsaWVudCwgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkU3RyLCBjYW1lcmFGYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLAogICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLAogICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpLApAQCAtMjk4MSwxMyArMzIzNywxNCBAQAogCiBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6QmFzaWNDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiByZW1vdGVDYWxsYmFjaywKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAotICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwgaW50IGNhbWVyYUZhY2luZywgaW50IHNlbnNvck9yaWVudGF0aW9uLAotICAgICAgICBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgYm9vbCBuYXRpdmVDbGllbnQsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLAorICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLCBpbnQgc2Vuc29yT3JpZW50YXRpb24sIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgaW50IHNlcnZpY2VQaWQpOgogICAgICAgICBtRGVzdHJ1Y3Rpb25TdGFydGVkKGZhbHNlKSwKICAgICAgICAgbUNhbWVyYUlkU3RyKGNhbWVyYUlkU3RyKSwgbUNhbWVyYUZhY2luZyhjYW1lcmFGYWNpbmcpLCBtT3JpZW50YXRpb24oc2Vuc29yT3JpZW50YXRpb24pLAotICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUoY2xpZW50UGFja2FnZU5hbWUpLCBtQ2xpZW50RmVhdHVyZUlkKGNsaWVudEZlYXR1cmVJZCksCisgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZShjbGllbnRQYWNrYWdlTmFtZSksIG1TeXN0ZW1OYXRpdmVDbGllbnQobmF0aXZlQ2xpZW50KSwKKyAgICAgICAgbUNsaWVudEZlYXR1cmVJZChjbGllbnRGZWF0dXJlSWQpLAogICAgICAgICBtQ2xpZW50UGlkKGNsaWVudFBpZCksIG1DbGllbnRVaWQoY2xpZW50VWlkKSwKICAgICAgICAgbVNlcnZpY2VQaWQoc2VydmljZVBpZCksCiAgICAgICAgIG1EaXNjb25uZWN0ZWQoZmFsc2UpLCBtVWlkSXNUcnVzdGVkKGZhbHNlKSwKQEAgLTMwMzAsNyArMzI4NywxOSBAQAogICAgICAgICB9CiAgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZSA9IHBhY2thZ2VzWzBdOwogICAgIH0KLSAgICBpZiAoZ2V0Q3VycmVudFNlcnZpbmdDYWxsKCkgIT0gQmluZGVyQ2FsbFR5cGU6OkhXQklOREVSKSB7CisKKyAgICAvLyBUaGVyZSBhcmUgMiBzY2VuYXJpb3MgaW4gd2hpY2ggYSBjbGllbnQgd29uJ3QgaGF2ZSBBcHBPcHMgb3BlcmF0aW9ucworICAgIC8vIChib3RoIHNjZW5hcmlvcyA6IG5hdGl2ZSBjbGllbnRzKQorICAgIC8vICAgIDEpIEl0J3MgYW4gc3lzdGVtIG5hdGl2ZSBjbGllbnQqLCB0aGUgcGFja2FnZSBuYW1lIHdpbGwgYmUgZW1wdHkKKyAgICAvLyAgICAgICBhbmQgaXQgd2lsbCByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIGluIHRoZSBwcmV2aW91cyBpZiBjb25kaXRpb24KKyAgICAvLyAgICAgICAoVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXNseSBleGlzdGluZyBiZWhhdmlvcikuCisgICAgLy8gICAgMikgSXQgaXMgYSBzeXN0ZW0gbmF0aXZlIGNsaWVudCwgYnV0IGl0cyBwYWNrYWdlIG5hbWUgaGFzIGJlZW4KKyAgICAvLyAgICAgICBtb2RpZmllZCBmb3IgZGVidWdnaW5nLCBob3dldmVyIGl0IHN0aWxsIG11c3Qgbm90IHVzZSBBcHBPcHMgc2luY2UKKyAgICAvLyAgICAgICB0aGUgcGFja2FnZSBuYW1lIGlzIG5vdCBhIHJlYWwgb25lLgorICAgIC8vCisgICAgLy8gICAgICAgKiBzeXN0ZW0gbmF0aXZlIGNsaWVudCAtIG5hdGl2ZSBjbGllbnQgd2l0aCBVSUQgPCBBSURfQVBQX1NUQVJULiBJdAorICAgIC8vICAgICAgICAgZG9lc24ndCBleGNsdWRlIGNsaWVudHMgbm90IG9uIHRoZSBzeXN0ZW0gcGFydGl0aW9uLgorICAgIGlmICghbVN5c3RlbU5hdGl2ZUNsaWVudCkgewogICAgICAgICBtQXBwT3BzTWFuYWdlciA9IHN0ZDo6bWFrZV91bmlxdWU8QXBwT3BzTWFuYWdlcj4oKTsKICAgICB9CiAKQEAgLTMwNzksNiArMzM0OCwyMSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OnN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFN0cmluZzgmLCBpbnQpIHsKKyAgICAvLyBDYW4ndCB3YXRjaCB0YWdzIGRpcmVjdGx5LCBtdXN0IGdvIHRocm91Z2ggQ2FtZXJhU2VydmljZTo6c3RhcnRXYXRjaGluZ1RhZ3MKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpzdG9wV2F0Y2hpbmdUYWdzKGludCkgeworICAgIC8vIENhbid0IHdhdGNoIHRhZ3MgZGlyZWN0bHksIG11c3QgZ28gdGhyb3VnaCBDYW1lcmFTZXJ2aWNlOjpzdG9wV2F0Y2hpbmdUYWdzCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6ZHVtcFdhdGNoZWRFdmVudHNUb1ZlY3RvcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJikgeworICAgIC8vIENhbid0IHdhdGNoIHRhZ3MgZGlyZWN0bHksIG11c3QgZ28gdGhyb3VnaCBDYW1lcmFTZXJ2aWNlOjpkdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yCisgICAgcmV0dXJuIE9LOworfQorCiBTdHJpbmcxNiBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6Z2V0UGFja2FnZU5hbWUoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1DbGllbnRQYWNrYWdlTmFtZTsKIH0KQEAgLTMxNDQsOCArMzQyOCw3IEBACiAgICAgICAgIGJvb2wgaXNVaWRBY3RpdmUgPSBzQ2FtZXJhU2VydmljZS0+bVVpZFBvbGljeS0+aXNVaWRBY3RpdmUobUNsaWVudFVpZCwKICAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUpOwogICAgICAgICBib29sIGlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQgPQotICAgICAgICAgICAgICAgIHNDYW1lcmFTZXJ2aWNlLT5tU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNDYW1lcmFQcml2YWN5RW5hYmxlZCgKLSAgICAgICAgICAgICAgICAgICAgbXVsdGl1c2VyX2dldF91c2VyX2lkKG1DbGllbnRVaWQpKTsKKyAgICAgICAgICAgICAgICBzQ2FtZXJhU2VydmljZS0+bVNlbnNvclByaXZhY3lQb2xpY3ktPmlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQoKTsKICAgICAgICAgaWYgKCFpc1VpZEFjdGl2ZSB8fCAhaXNDYW1lcmFQcml2YWN5RW5hYmxlZCkgewogICAgICAgICAgICAgQUxPR0koIkNhbWVyYSAlczogQWNjZXNzIGZvciBcIiVzXCIgaGFzIGJlZW4gcmVzdHJpY3RlZCIsCiAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpKTsKQEAgLTMzMjcsOCArMzYxMCw3IEBACiAgICAgfSBlbHNlIGlmIChyZXMgPT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9JR05PUkVEKSB7CiAgICAgICAgIGJvb2wgaXNVaWRBY3RpdmUgPSBzQ2FtZXJhU2VydmljZS0+bVVpZFBvbGljeS0+aXNVaWRBY3RpdmUobUNsaWVudFVpZCwgbUNsaWVudFBhY2thZ2VOYW1lKTsKICAgICAgICAgYm9vbCBpc0NhbWVyYVByaXZhY3lFbmFibGVkID0KLSAgICAgICAgICAgICAgICBzQ2FtZXJhU2VydmljZS0+bVNlbnNvclByaXZhY3lQb2xpY3ktPmlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXVzZXJfZ2V0X3VzZXJfaWQobUNsaWVudFVpZCkpOworICAgICAgICAgICAgICAgIHNDYW1lcmFTZXJ2aWNlLT5tU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNDYW1lcmFQcml2YWN5RW5hYmxlZCgpOwogICAgICAgICBBTE9HSSgiQ2FtZXJhICVzOiBBY2Nlc3MgZm9yIFwiJXNcIiBoYXMgYmVlbiByZXN0cmljdGVkLCBpc1VpZFRydXN0ZWQgJWQsIGlzVWlkQWN0aXZlICVkIiwKICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwKICAgICAgICAgICAgICAgICBtVWlkSXNUcnVzdGVkLCBpc1VpZEFjdGl2ZSk7CkBAIC0zNDA4LDcgKzM2OTAsOCBAQAogICAgIHN0YXR1c190IHJlcyA9IG1BbS5saW5rVG9EZWF0aCh0aGlzKTsKICAgICBtQW0ucmVnaXN0ZXJVaWRPYnNlcnZlcih0aGlzLCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9HT05FCiAgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0lETEUKLSAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfQUNUSVZFIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfUFJPQ1NUQVRFLAorICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9BQ1RJVkUgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9QUk9DU1RBVEUKKyAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfUFJPQ19PT01fQURKLAogICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sCiAgICAgICAgICAgICBTdHJpbmcxNigiY2FtZXJhc2VydmVyIikpOwogICAgIGlmIChyZXMgPT0gT0spIHsKQEAgLTM0NTcsOSArMzc0MCw5IEBACiAgICAgYm9vbCBwcm9jU3RhdGVDaGFuZ2UgPSBmYWxzZTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7Ci0gICAgICAgIGlmICgobU1vbml0b3JlZFVpZHMuZmluZCh1aWQpICE9IG1Nb25pdG9yZWRVaWRzLmVuZCgpKSAmJgotICAgICAgICAgICAgICAgIChtTW9uaXRvcmVkVWlkc1t1aWRdLmZpcnN0ICE9IHByb2NTdGF0ZSkpIHsKLSAgICAgICAgICAgIG1Nb25pdG9yZWRVaWRzW3VpZF0uZmlyc3QgPSBwcm9jU3RhdGU7CisgICAgICAgIGlmIChtTW9uaXRvcmVkVWlkcy5maW5kKHVpZCkgIT0gbU1vbml0b3JlZFVpZHMuZW5kKCkgJiYKKyAgICAgICAgICAgICAgICBtTW9uaXRvcmVkVWlkc1t1aWRdLnByb2NTdGF0ZSAhPSBwcm9jU3RhdGUpIHsKKyAgICAgICAgICAgIG1Nb25pdG9yZWRVaWRzW3VpZF0ucHJvY1N0YXRlID0gcHJvY1N0YXRlOwogICAgICAgICAgICAgcHJvY1N0YXRlQ2hhbmdlID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KQEAgLTM0NzIsMTUgKzM3NTUsMzMgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5OjpvblVpZFByb2NBZGpDaGFuZ2VkKHVpZF90IHVpZCkgeworICAgIGJvb2wgcHJvY0FkakNoYW5nZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKKyAgICAgICAgaWYgKG1Nb25pdG9yZWRVaWRzLmZpbmQodWlkKSAhPSBtTW9uaXRvcmVkVWlkcy5lbmQoKSkgeworICAgICAgICAgICAgcHJvY0FkakNoYW5nZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJvY0FkakNoYW5nZSkgeworICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzZXJ2aWNlLT5ub3RpZnlNb25pdG9yZWRVaWRzKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5OjpyZWdpc3Rlck1vbml0b3JVaWQodWlkX3QgdWlkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKICAgICBhdXRvIGl0ID0gbU1vbml0b3JlZFVpZHMuZmluZCh1aWQpOwogICAgIGlmIChpdCAhPSBtTW9uaXRvcmVkVWlkcy5lbmQoKSkgewotICAgICAgICBpdC0+c2Vjb25kLnNlY29uZCsrOworICAgICAgICBpdC0+c2Vjb25kLnJlZkNvdW50Kys7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbU1vbml0b3JlZFVpZHMuZW1wbGFjZSgKLSAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8dWlkX3QsIHN0ZDo6cGFpcjxpbnQzMl90LCBzaXplX3Q+PiAodWlkLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgc2l6ZV90PiAoQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX05PTkVYSVNURU5ULCAxKSkpOworICAgICAgICBNb25pdG9yZWRVaWQgbW9uaXRvcmVkVWlkOworICAgICAgICBtb25pdG9yZWRVaWQucHJvY1N0YXRlID0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX05PTkVYSVNURU5UOworICAgICAgICBtb25pdG9yZWRVaWQucmVmQ291bnQgPSAxOworICAgICAgICBtTW9uaXRvcmVkVWlkcy5lbXBsYWNlKHN0ZDo6cGFpcjx1aWRfdCwgTW9uaXRvcmVkVWlkPih1aWQsIG1vbml0b3JlZFVpZCkpOwogICAgIH0KIH0KIApAQCAtMzQ4OCw4ICszNzg5LDggQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOwogICAgIGF1dG8gaXQgPSBtTW9uaXRvcmVkVWlkcy5maW5kKHVpZCk7CiAgICAgaWYgKGl0ICE9IG1Nb25pdG9yZWRVaWRzLmVuZCgpKSB7Ci0gICAgICAgIGl0LT5zZWNvbmQuc2Vjb25kLS07Ci0gICAgICAgIGlmIChpdC0+c2Vjb25kLnNlY29uZCA9PSAwKSB7CisgICAgICAgIGl0LT5zZWNvbmQucmVmQ291bnQtLTsKKyAgICAgICAgaWYgKGl0LT5zZWNvbmQucmVmQ291bnQgPT0gMCkgewogICAgICAgICAgICAgbU1vbml0b3JlZFVpZHMuZXJhc2UoaXQpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTM1NjcsNyArMzg2OCw3IEBACiBpbnQzMl90IENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6Z2V0UHJvY1N0YXRlTG9ja2VkKHVpZF90IHVpZCkgewogICAgIGludDMyX3QgcHJvY1N0YXRlID0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CiAgICAgaWYgKG1Nb25pdG9yZWRVaWRzLmZpbmQodWlkKSAhPSBtTW9uaXRvcmVkVWlkcy5lbmQoKSkgewotICAgICAgICBwcm9jU3RhdGUgPSBtTW9uaXRvcmVkVWlkc1t1aWRdLmZpcnN0OworICAgICAgICBwcm9jU3RhdGUgPSBtTW9uaXRvcmVkVWlkc1t1aWRdLnByb2NTdGF0ZTsKICAgICB9CiAgICAgcmV0dXJuIHByb2NTdGF0ZTsKIH0KQEAgLTM2NDAsMTggKzM5NDEsMTggQEAKICAgICByZXR1cm4gbVNlbnNvclByaXZhY3lFbmFibGVkOwogfQogCi1ib29sIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OmlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQodXNlcmlkX3QgdXNlcklkKSB7Citib29sIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OmlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQoKSB7CiAgICAgaWYgKCFoYXNDYW1lcmFQcml2YWN5RmVhdHVyZSgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIG1TcG0uaXNJbmRpdmlkdWFsU2Vuc29yUHJpdmFjeUVuYWJsZWQodXNlcklkLAotICAgICAgICBTZW5zb3JQcml2YWN5TWFuYWdlcjo6SU5ESVZJRFVBTF9TRU5TT1JfQ0FNRVJBKTsKKyAgICByZXR1cm4gbVNwbS5pc1RvZ2dsZVNlbnNvclByaXZhY3lFbmFibGVkKFNlbnNvclByaXZhY3lNYW5hZ2VyOjpUT0dHTEVfU0VOU09SX0NBTUVSQSk7CiB9CiAKLWJpbmRlcjo6U3RhdHVzIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6Om9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKSB7CitiaW5kZXI6OlN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpvblNlbnNvclByaXZhY3lDaGFuZ2VkKAorICAgIGludCB0b2dnbGVUeXBlIF9fdW51c2VkLCBpbnQgc2Vuc29yIF9fdW51c2VkLCBib29sIGVuYWJsZWQpIHsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vuc29yUHJpdmFjeUxvY2spOwotICAgICAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBlbmFibGVkOworICAgICAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBtU3BtLmlzVG9nZ2xlU2Vuc29yUHJpdmFjeUVuYWJsZWQoU2Vuc29yUHJpdmFjeU1hbmFnZXI6OlRPR0dMRV9TRU5TT1JfQ0FNRVJBKTsKICAgICB9CiAgICAgLy8gaWYgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGJsb2NrIGFsbCBjbGllbnRzIGZyb20gYWNjZXNzaW5nIHRoZSBjYW1lcmEKICAgICBpZiAoZW5hYmxlZCkgewpAQCAtMzY3MCw3ICszOTcxLDExIEBACiB9CiAKIGJvb2wgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6aGFzQ2FtZXJhUHJpdmFjeUZlYXR1cmUoKSB7Ci0gICAgcmV0dXJuIG1TcG0uc3VwcG9ydHNTZW5zb3JUb2dnbGUoU2Vuc29yUHJpdmFjeU1hbmFnZXI6OklORElWSURVQUxfU0VOU09SX0NBTUVSQSk7CisgICAgYm9vbCBzdXBwb3J0c1NvZnR3YXJlVG9nZ2xlID0gbVNwbS5zdXBwb3J0c1NlbnNvclRvZ2dsZSgKKyAgICAgICAgICAgIFNlbnNvclByaXZhY3lNYW5hZ2VyOjpUT0dHTEVfVFlQRV9TT0ZUV0FSRSwgU2Vuc29yUHJpdmFjeU1hbmFnZXI6OlRPR0dMRV9TRU5TT1JfQ0FNRVJBKTsKKyAgICBib29sIHN1cHBvcnRzSGFyZHdhcmVUb2dnbGUgPSBtU3BtLnN1cHBvcnRzU2Vuc29yVG9nZ2xlKAorICAgICAgICAgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXI6OlRPR0dMRV9UWVBFX0hBUkRXQVJFLCBTZW5zb3JQcml2YWN5TWFuYWdlcjo6VE9HR0xFX1NFTlNPUl9DQU1FUkEpOworICAgIHJldHVybiBzdXBwb3J0c1NvZnR3YXJlVG9nZ2xlIHx8IHN1cHBvcnRzSGFyZHdhcmVUb2dnbGU7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM2NzgsOSArMzk4MywxMCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6Q2FtZXJhU3RhdGUoY29uc3QgU3RyaW5nOCYgaWQsIGludCBjb3N0LAotICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgY29uZmxpY3RpbmcsIFN5c3RlbUNhbWVyYUtpbmQgc3lzdGVtQ2FtZXJhS2luZCkgOiBtSWQoaWQpLAorICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgY29uZmxpY3RpbmcsIFN5c3RlbUNhbWVyYUtpbmQgc3lzdGVtQ2FtZXJhS2luZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwaHlzaWNhbENhbWVyYXMpIDogbUlkKGlkKSwKICAgICAgICAgbVN0YXR1cyhTdGF0dXNJbnRlcm5hbDo6Tk9UX1BSRVNFTlQpLCBtQ29zdChjb3N0KSwgbUNvbmZsaWN0aW5nKGNvbmZsaWN0aW5nKSwKLSAgICAgICAgbVN5c3RlbUNhbWVyYUtpbmQoc3lzdGVtQ2FtZXJhS2luZCkge30KKyAgICAgICAgbVN5c3RlbUNhbWVyYUtpbmQoc3lzdGVtQ2FtZXJhS2luZCksIG1QaHlzaWNhbENhbWVyYXMocGh5c2ljYWxDYW1lcmFzKSB7fQogCiBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6fkNhbWVyYVN0YXRlKCkge30KIApAQCAtMzcxOSw2ICs0MDI1LDExIEBACiAgICAgcmV0dXJuIG1TeXN0ZW1DYW1lcmFLaW5kOwogfQogCitib29sIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjpjb250YWluc1BoeXNpY2FsQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYUlkKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6ZmluZChtUGh5c2ljYWxDYW1lcmFzLmJlZ2luKCksIG1QaHlzaWNhbENhbWVyYXMuZW5kKCksIHBoeXNpY2FsQ2FtZXJhSWQpCisgICAgICAgICAgICAhPSBtUGh5c2ljYWxDYW1lcmFzLmVuZCgpOworfQorCiBib29sIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjphZGRVbmF2YWlsYWJsZVBoeXNpY2FsSWQoY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxJZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMb2NrKTsKICAgICBhdXRvIHJlc3VsdCA9IG1VbmF2YWlsYWJsZVBoeXNpY2FsSWRzLmluc2VydChwaHlzaWNhbElkKTsKQEAgLTM3MzEsNiArNDA0MiwxNiBAQAogICAgIHJldHVybiBjb3VudCA+IDA7CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OnNldENsaWVudFBhY2thZ2UoY29uc3QgU3RyaW5nOCYgY2xpZW50UGFja2FnZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMb2NrKTsKKyAgICBtQ2xpZW50UGFja2FnZSA9IGNsaWVudFBhY2thZ2U7Cit9CisKK1N0cmluZzggQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OmdldENsaWVudFBhY2thZ2UoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xvY2spOworICAgIHJldHVybiBtQ2xpZW50UGFja2FnZTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICAgICAgICAgICAgICBDbGllbnRFdmVudExpc3RlbmVyCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zODIxLDIzICs0MTQyLDIzIEBACiBDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyIENhbWVyYVNlcnZpY2U6OkNhbWVyYUNsaWVudE1hbmFnZXI6Om1ha2VDbGllbnREZXNjcmlwdG9yKAogICAgICAgICBjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IHNwPEJhc2ljQ2xpZW50PiYgdmFsdWUsIGludDMyX3QgY29zdCwKICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBzY29yZSwgaW50MzJfdCBvd25lcklkLAotICAgICAgICBpbnQzMl90IHN0YXRlLCBpbnQzMl90IG9vbVNjb3JlT2Zmc2V0KSB7CisgICAgICAgIGludDMyX3Qgc3RhdGUsIGludDMyX3Qgb29tU2NvcmVPZmZzZXQsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50KSB7CiAKLSAgICBib29sIGlzVmVuZG9yQ2xpZW50ID0gZ2V0Q3VycmVudFNlcnZpbmdDYWxsKCkgPT0gQmluZGVyQ2FsbFR5cGU6OkhXQklOREVSOwotICAgIGludDMyX3Qgc2NvcmVfYWRqID0gaXNWZW5kb3JDbGllbnQgPyBrVmVuZG9yQ2xpZW50U2NvcmUgOiBzY29yZTsKLSAgICBpbnQzMl90IHN0YXRlX2FkaiA9IGlzVmVuZG9yQ2xpZW50ID8ga1ZlbmRvckNsaWVudFN0YXRlOiBzdGF0ZTsKKyAgICBpbnQzMl90IHNjb3JlX2FkaiA9IHN5c3RlbU5hdGl2ZUNsaWVudCA/IGtTeXN0ZW1OYXRpdmVDbGllbnRTY29yZSA6IHNjb3JlOworICAgIGludDMyX3Qgc3RhdGVfYWRqID0gc3lzdGVtTmF0aXZlQ2xpZW50ID8ga1N5c3RlbU5hdGl2ZUNsaWVudFN0YXRlOiBzdGF0ZTsKIAogICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPHJlc291cmNlX3BvbGljeTo6Q2xpZW50RGVzY3JpcHRvcjxTdHJpbmc4LCBzcDxCYXNpY0NsaWVudD4+PigKLSAgICAgICAgICAgIGtleSwgdmFsdWUsIGNvc3QsIGNvbmZsaWN0aW5nS2V5cywgc2NvcmVfYWRqLCBvd25lcklkLCBzdGF0ZV9hZGosIGlzVmVuZG9yQ2xpZW50LAotICAgICAgICAgICAgb29tU2NvcmVPZmZzZXQpOworICAgICAgICAgICAga2V5LCB2YWx1ZSwgY29zdCwgY29uZmxpY3RpbmdLZXlzLCBzY29yZV9hZGosIG93bmVySWQsIHN0YXRlX2FkaiwKKyAgICAgICAgICAgIHN5c3RlbU5hdGl2ZUNsaWVudCwgb29tU2NvcmVPZmZzZXQpOwogfQogCiBDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyIENhbWVyYVNlcnZpY2U6OkNhbWVyYUNsaWVudE1hbmFnZXI6Om1ha2VDbGllbnREZXNjcmlwdG9yKAogICAgICAgICBjb25zdCBzcDxCYXNpY0NsaWVudD4mIHZhbHVlLCBjb25zdCBDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyJiBwYXJ0aWFsLAotICAgICAgICBpbnQzMl90IG9vbVNjb3JlT2Zmc2V0KSB7CisgICAgICAgIGludDMyX3Qgb29tU2NvcmVPZmZzZXQsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50KSB7CiAgICAgcmV0dXJuIG1ha2VDbGllbnREZXNjcmlwdG9yKHBhcnRpYWwtPmdldEtleSgpLCB2YWx1ZSwgcGFydGlhbC0+Z2V0Q29zdCgpLAogICAgICAgICAgICAgcGFydGlhbC0+Z2V0Q29uZmxpY3RpbmcoKSwgcGFydGlhbC0+Z2V0UHJpb3JpdHkoKS5nZXRTY29yZSgpLAotICAgICAgICAgICAgcGFydGlhbC0+Z2V0T3duZXJJZCgpLCBwYXJ0aWFsLT5nZXRQcmlvcml0eSgpLmdldFN0YXRlKCksIG9vbVNjb3JlT2Zmc2V0KTsKKyAgICAgICAgICAgIHBhcnRpYWwtPmdldE93bmVySWQoKSwgcGFydGlhbC0+Z2V0UHJpb3JpdHkoKS5nZXRTdGF0ZSgpLCBvb21TY29yZU9mZnNldCwKKyAgICAgICAgICAgIHN5c3RlbU5hdGl2ZUNsaWVudCk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM4NjUsMjIgKzQxODYsNjIgQEAKIH0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpJbmplY3Rpb25TdGF0dXNMaXN0ZW5lcjo6bm90aWZ5SW5qZWN0aW9uRXJyb3IoCi0gICAgICAgIGludCBlcnJvckNvZGUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTGlzdGVuZXJMb2NrKTsKKyAgICAgICAgU3RyaW5nOCBpbmplY3RlZENhbUlkLCBzdGF0dXNfdCBlcnIpIHsKICAgICBpZiAobUNhbWVyYUluamVjdGlvbkNhbGxiYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR1coIkluamVjdGlvblN0YXR1c0xpc3RlbmVyOiBtQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2sgPT0gbnVsbHB0ciIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1DYW1lcmFJbmplY3Rpb25DYWxsYmFjay0+b25JbmplY3Rpb25FcnJvcihlcnJvckNvZGUpOworCisgICAgc3dpdGNoIChlcnIpIHsKKyAgICAgICAgY2FzZSAtRU5PREVWOgorICAgICAgICAgICAgbUNhbWVyYUluamVjdGlvbkNhbGxiYWNrLT5vbkluamVjdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2s6OkVSUk9SX0lOSkVDVElPTl9TRVNTSU9OKTsKKyAgICAgICAgICAgIEFMT0dFKCJObyBjYW1lcmEgZGV2aWNlIHdpdGggSUQgXCIlc1wiIGN1cnJlbnRseSBhdmFpbGFibGUhIiwKKyAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAtRUJVU1k6CisgICAgICAgICAgICBtQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2stPm9uSW5qZWN0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIElDYW1lcmFJbmplY3Rpb25DYWxsYmFjazo6RVJST1JfSU5KRUNUSU9OX1NFU1NJT04pOworICAgICAgICAgICAgQUxPR0UoIkhpZ2hlci1wcmlvcml0eSBjbGllbnQgdXNpbmcgY2FtZXJhLCBJRCBcIiVzXCIgY3VycmVudGx5IHVuYXZhaWxhYmxlISIsCisgICAgICAgICAgICAgICAgICAgIGluamVjdGVkQ2FtSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgREVBRF9PQkpFQ1Q6CisgICAgICAgICAgICBtQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2stPm9uSW5qZWN0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIElDYW1lcmFJbmplY3Rpb25DYWxsYmFjazo6RVJST1JfSU5KRUNUSU9OX1NFU1NJT04pOworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBJRCBcIiVzXCIgb2JqZWN0IGlzIGRlYWQhIiwKKyAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgIG1DYW1lcmFJbmplY3Rpb25DYWxsYmFjay0+b25JbmplY3Rpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgSUNhbWVyYUluamVjdGlvbkNhbGxiYWNrOjpFUlJPUl9JTkpFQ1RJT05fU0VTU0lPTik7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIElEIFwiJXNcIiBlbmNvdW50ZXJlZCBhbiBvcGVyYXRpbmcgb3IgaW50ZXJuYWwgZXJyb3IhIiwKKyAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVTktOT1dOX1RSQU5TQUNUSU9OOgorICAgICAgICAgICAgbUNhbWVyYUluamVjdGlvbkNhbGxiYWNrLT5vbkluamVjdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2s6OkVSUk9SX0lOSkVDVElPTl9VTlNVUFBPUlRFRCk7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIElEIFwiJXNcIiBtZXRob2QgZG9lc24ndCBzdXBwb3J0ISIsCisgICAgICAgICAgICAgICAgICAgIGluamVjdGVkQ2FtSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2stPm9uSW5qZWN0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIElDYW1lcmFJbmplY3Rpb25DYWxsYmFjazo6RVJST1JfSU5KRUNUSU9OX0lOVkFMSURfRVJST1IpOworICAgICAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgZXJyb3IgJXMgKCVkKSBvcGVuaW5nIGNhbWVyYSBcIiVzXCIhIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVyciwgaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSk7CisgICAgfQogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6OkluamVjdGlvblN0YXR1c0xpc3RlbmVyOjpiaW5kZXJEaWVkKAogICAgICAgICBjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLykgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1MaXN0ZW5lckxvY2spOwogICAgIEFMT0dWKCJJbmplY3Rpb25TdGF0dXNMaXN0ZW5lcjogSUNhbWVyYUluamVjdGlvbkNhbGxiYWNrIGhhcyBkaWVkIik7CiAgICAgYXV0byBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKLSAgICAgICAgcGFyZW50LT5zdG9wSW5qZWN0aW9uSW1wbCgpOworICAgICAgICBhdXRvIGNsaWVudERlc2NyaXB0b3IgPSBwYXJlbnQtPm1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldChwYXJlbnQtPm1JbmplY3Rpb25JbnRlcm5hbENhbUlkKTsKKyAgICAgICAgaWYgKGNsaWVudERlc2NyaXB0b3IgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQmFzaWNDbGllbnQqIGJhc2VDbGllbnRQdHIgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpLmdldCgpOworICAgICAgICAgICAgYmFzZUNsaWVudFB0ci0+c3RvcEluamVjdGlvbigpOworICAgICAgICB9CisgICAgICAgIHBhcmVudC0+Y2xlYXJJbmplY3Rpb25QYXJhbWV0ZXJzKCk7CiAgICAgfQogfQogCkBAIC0zODk2LDcgKzQyNTcsMjAgQEAKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihJQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2s6OkVSUk9SX0lOSkVDVElPTl9TRVJWSUNFLAogICAgICAgICAgICAgICAgICJDYW1lcmEgc2VydmljZSBlbmNvdW50ZXJlZCBlcnJvciIpOwogICAgIH0KLSAgICBwYXJlbnQtPnN0b3BJbmplY3Rpb25JbXBsKCk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKKyAgICBhdXRvIGNsaWVudERlc2NyaXB0b3IgPSBwYXJlbnQtPm1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldChwYXJlbnQtPm1JbmplY3Rpb25JbnRlcm5hbENhbUlkKTsKKyAgICBpZiAoY2xpZW50RGVzY3JpcHRvciAhPSBudWxscHRyKSB7CisgICAgICAgIEJhc2ljQ2xpZW50KiBiYXNlQ2xpZW50UHRyID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0VmFsdWUoKS5nZXQoKTsKKyAgICAgICAgcmVzID0gYmFzZUNsaWVudFB0ci0+c3RvcEluamVjdGlvbigpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbjogRmFpbGVkIHRvIHN0b3AgdGhlIGluamVjdGlvbiBjYW1lcmEhIgorICAgICAgICAgICAgICAgICIgcmV0ICE9IE5PX0VSUk9SOiAlZCIsIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKElDYW1lcmFJbmplY3Rpb25DYWxsYmFjazo6RVJST1JfSU5KRUNUSU9OX1NFU1NJT04sCisgICAgICAgICAgICAgICAgIkNhbWVyYSBzZXNzaW9uIGVuY291bnRlcmVkIGVycm9yIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcGFyZW50LT5jbGVhckluamVjdGlvblBhcmFtZXRlcnMoKTsKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiB9CiAKQEAgLTQwMzcsNyArNDQxMSw3IEBACiAKICAgICAvLyBEdW1wIGNhbWVyYSB0cmFjZXMgaWYgdGhlcmUgd2VyZSBhbnkKICAgICBkcHJpbnRmKGZkLCAiXG4iKTsKLSAgICBjYW1lcmEzOjpDYW1lcmFUcmFjZXM6OmR1bXAoZmQsIGFyZ3MpOworICAgIGNhbWVyYTM6OkNhbWVyYVRyYWNlczo6ZHVtcChmZCk7CiAKICAgICAvLyBQcm9jZXNzIGR1bXAgYXJndW1lbnRzLCBpZiBhbnkKICAgICBpbnQgbiA9IGFyZ3Muc2l6ZSgpOwpAQCAtNDA5Niw4ICs0NDcwLDkgQEAKIHZvaWQgQ2FtZXJhU2VydmljZTo6ZHVtcE9wZW5TZXNzaW9uQ2xpZW50TG9ncyhpbnQgZmQsCiAgICAgICAgIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CiAgICAgYXV0byBjbGllbnREZXNjcmlwdG9yID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0KGNhbWVyYUlkKTsKLSAgICBkcHJpbnRmKGZkLCAiICBEZXZpY2UgJXMgaXMgb3Blbi4gQ2xpZW50IGluc3RhbmNlIGR1bXA6XG4iLAotICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgZHByaW50ZihmZCwgIiAgJXMgOiBEZXZpY2UgJXMgaXMgb3Blbi4gQ2xpZW50IGluc3RhbmNlIGR1bXA6XG4iLAorICAgICAgICAgICAgZ2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKS5zdHJpbmcoKSwKKyAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKICAgICBkcHJpbnRmKGZkLCAiICAgIENsaWVudCBwcmlvcml0eSBzY29yZTogJWQgc3RhdGU6ICVkXG4iLAogICAgICAgICBjbGllbnREZXNjcmlwdG9yLT5nZXRQcmlvcml0eSgpLmdldFNjb3JlKCksCiAgICAgICAgIGNsaWVudERlc2NyaXB0b3ItPmdldFByaW9yaXR5KCkuZ2V0U3RhdGUoKSk7CkBAIC00MTMxLDYgKzQ1MDYsNDUgQEAKICAgICBkcHJpbnRmKGZkLCAiXG4iKTsKIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjpjYWNoZUNsaWVudFRhZ0R1bXBJZk5lZWRlZChjb25zdCBjaGFyICpjYW1lcmFJZCwgQmFzaWNDbGllbnQqIGNsaWVudCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2dMb2NrKTsKKyAgICBpZiAoIWlzQ2xpZW50V2F0Y2hlZExvY2tlZChjbGllbnQpKSB7IHJldHVybjsgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGR1bXBWZWN0b3I7CisgICAgY2xpZW50LT5kdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKGR1bXBWZWN0b3IpOworCisgICAgaWYgKGR1bXBWZWN0b3IuZW1wdHkoKSkgeyByZXR1cm47IH0KKworICAgIHN0ZDo6c3RyaW5nIGR1bXBTdHJpbmc7CisKKyAgICBTdHJpbmc4IGN1cnJlbnRUaW1lID0gZ2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKTsKKyAgICBkdW1wU3RyaW5nICs9ICJDYWNoZWQgQCAiOworICAgIGR1bXBTdHJpbmcgKz0gY3VycmVudFRpbWUuc3RyaW5nKCk7CisgICAgZHVtcFN0cmluZyArPSAiXG4iOyAvLyBGaXJzdCBsaW5lIGlzIHRoZSB0aW1lc3RhbXAgb2Ygd2hlbiBjbGllbnQgaXMgY2FjaGVkLgorCisKKyAgICBjb25zdCBTdHJpbmcxNiAmcGFja2FnZU5hbWUgPSBjbGllbnQtPmdldFBhY2thZ2VOYW1lKCk7CisKKyAgICBTdHJpbmc4IHBhY2thZ2VOYW1lOCA9IFN0cmluZzgocGFja2FnZU5hbWUpOworICAgIGNvbnN0IGNoYXIgKnByaW50YWJsZVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU4LmxvY2tCdWZmZXIocGFja2FnZU5hbWUuc2l6ZSgpKTsKKworCisgICAgc2l6ZV90IGkgPSBkdW1wVmVjdG9yLnNpemUoKTsKKworICAgIC8vIFN0b3JlIHRoZSBzdHJpbmcgaW4gcmV2ZXJzZSBvcmRlciAobGF0ZXN0IGxhc3QpCisgICAgd2hpbGUgKGkgPiAwKSB7CisgICAgICAgICBpLS07CisgICAgICAgICBkdW1wU3RyaW5nICs9IGNhbWVyYUlkOworICAgICAgICAgZHVtcFN0cmluZyArPSAiOiI7CisgICAgICAgICBkdW1wU3RyaW5nICs9IHByaW50YWJsZVBhY2thZ2VOYW1lOworICAgICAgICAgZHVtcFN0cmluZyArPSAiICAiOworICAgICAgICAgZHVtcFN0cmluZyArPSBkdW1wVmVjdG9yW2ldOyAvLyBpbXBsaWNpdGx5IGVuZHMgd2l0aCAnXG4nCisgICAgfQorCisgICAgcGFja2FnZU5hbWU4LnVubG9ja0J1ZmZlcigpOworICAgIG1XYXRjaGVkQ2xpZW50c0R1bXBDYWNoZVtwYWNrYWdlTmFtZV0gPSBkdW1wU3RyaW5nOworfQorCiB2b2lkIENhbWVyYVNlcnZpY2U6OmhhbmRsZVRvcmNoQ2xpZW50QmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaENsaWVudE1hcE11dGV4KTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ub3JjaENsaWVudE1hcC5zaXplKCk7IGkrKykgewpAQCAtNDI0MSw2ICs0NjU1LDE4IEBACiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6dXBkYXRlT3BlbkNsb3NlU3RhdHVzKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sIG9wZW4sCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSkgeworICAgIGF1dG8gc3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShjYW1lcmFJZCk7CisgICAgaWYgKHN0YXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgdXBkYXRlIHRoZSBzdGF0dXMgZm9yICVzLCBubyBzdWNoIGRldmljZSBleGlzdHMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChvcGVuKSB7CisgICAgICAgIHN0YXRlLT5zZXRDbGllbnRQYWNrYWdlKFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0ZS0+c2V0Q2xpZW50UGFja2FnZShTdHJpbmc4OjplbXB0eSgpKTsKKyAgICB9CisKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtTGlzdGVuZXJMaXN0KSB7CkBAIC00MzM3LDE4ICs0NzYzLDkgQEAKICAgICBzdGQ6Omxpc3Q8U3RyaW5nMTY+IHJldExpc3Q7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUNhbWVyYVN0YXRlc0xvY2spOwogICAgIGZvciAoY29uc3QgYXV0byYgc3RhdGUgOiBtQ2FtZXJhU3RhdGVzKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKLSAgICAgICAgaWYgKCFtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEoc3RhdGUuZmlyc3QuY19zdHIoKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKSkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoc3RhdGUuc2Vjb25kLT5jb250YWluc1BoeXNpY2FsQ2FtZXJhKHBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIHJldExpc3QuZW1wbGFjZV9iYWNrKFN0cmluZzE2KHN0YXRlLmZpcnN0KSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwgcGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKQotICAgICAgICAgICAgICAgID09IHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICAvLyBjYW1lcmFJZCBpcyBub3QgYSBwaHlzaWNhbCBjYW1lcmEgb2YgdGhpcyBsb2dpY2FsIG11bHRpLWNhbWVyYS4KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0TGlzdC5lbXBsYWNlX2JhY2soU3RyaW5nMTYoc3RhdGUuZmlyc3QpKTsKICAgICB9CiAgICAgcmV0dXJuIHJldExpc3Q7CiB9CkBAIC00NDIzLDkgKzQ4NDAsMTEgQEAKICAgICAgICAgcmV0dXJuIGhhbmRsZUdldEltYWdlRHVtcE1hc2sob3V0KTsKICAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID49IDIgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigic2V0LWNhbWVyYS1tdXRlIikpIHsKICAgICAgICAgcmV0dXJuIGhhbmRsZVNldENhbWVyYU11dGUoYXJncyk7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA+PSAyICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoIndhdGNoIikpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZVdhdGNoQ29tbWFuZChhcmdzLCBpbiwgb3V0KTsKICAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDEgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigiaGVscCIpKSB7CiAgICAgICAgIHByaW50SGVscChvdXQpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAgICAgcHJpbnRIZWxwKGVycik7CiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTQ1NjksNiArNDk4OCwzNDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmhhbmRsZVdhdGNoQ29tbWFuZChjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgaW5GZCwgaW50IG91dEZkKSB7CisgICAgaWYgKGFyZ3Muc2l6ZSgpID49IDMgJiYgYXJnc1sxXSA9PSBTdHJpbmcxNigic3RhcnQiKSkgeworICAgICAgICByZXR1cm4gc3RhcnRXYXRjaGluZ1RhZ3MoYXJncywgb3V0RmQpOworICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPT0gMiAmJiBhcmdzWzFdID09IFN0cmluZzE2KCJzdG9wIikpIHsKKyAgICAgICAgcmV0dXJuIHN0b3BXYXRjaGluZ1RhZ3Mob3V0RmQpOworICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPT0gMiAmJiBhcmdzWzFdID09IFN0cmluZzE2KCJkdW1wIikpIHsKKyAgICAgICAgcmV0dXJuIHByaW50V2F0Y2hlZFRhZ3Mob3V0RmQpOworICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPj0gMiAmJiBhcmdzWzFdID09IFN0cmluZzE2KCJsaXZlIikpIHsKKyAgICAgICAgcmV0dXJuIHByaW50V2F0Y2hlZFRhZ3NVbnRpbEludGVycnVwdChhcmdzLCBpbkZkLCBvdXRGZCk7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA9PSAyICYmIGFyZ3NbMV0gPT0gU3RyaW5nMTYoImNsZWFyIikpIHsKKyAgICAgICAgcmV0dXJuIGNsZWFyQ2FjaGVkTW9uaXRvcmVkVGFnRHVtcHMob3V0RmQpOworICAgIH0KKyAgICBkcHJpbnRmKG91dEZkLCAiQ2FtZXJhIHNlcnZpY2Ugd2F0Y2ggY29tbWFuZHM6XG4iCisgICAgICAgICAgICAgICAgICIgIHN0YXJ0IC1tIDxjb21tYV9zZXBhcmF0ZWRfdGFnX2xpc3Q+IFstYyA8Y29tbWFfc2VwYXJhdGVkX2NsaWVudF9saXN0Pl1cbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgc3RhcnRzIHdhdGNoaW5nIHRoZSBwcm92aWRlZCB0YWdzIGZvciBjbGllbnRzIHdpdGggcHJvdmlkZWQgcGFja2FnZVxuIgorICAgICAgICAgICAgICAgICAiICAgICAgICByZWNvZ25pemVzIHRhZyBzaG9ydGhhbmRzIGxpa2UgJzNhJ1xuIgorICAgICAgICAgICAgICAgICAiICAgICAgICB3YXRjaGVzIGFsbCBjbGllbnRzIGlmIG5vIGNsaWVudCBpcyBwYXNzZWQsIG9yIGlmICdhbGwnIGlzIGxpc3RlZFxuIgorICAgICAgICAgICAgICAgICAiICBkdW1wIGR1bXBzIHRoZSBtb25pdG9yaW5nIGluZm9ybWF0aW9uIGFuZCBleGl0c1xuIgorICAgICAgICAgICAgICAgICAiICBzdG9wIHN0b3BzIHdhdGNoaW5nIGFsbCB0YWdzXG4iCisgICAgICAgICAgICAgICAgICIgIGxpdmUgWy1uIDxyZWZyZXNoX2ludGVydmFsX21zPl1cbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgcHJpbnRzIHRoZSBtb25pdG9yZWQgaW5mb3JtYXRpb24gaW4gcmVhbCB0aW1lXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgIEhpdCByZXR1cm4gdG8gZXhpdFxuIgorICAgICAgICAgICAgICAgICAiICBjbGVhciBjbGVhcnMgYWxsIGJ1ZmZlcnMgc3RvcmluZyBpbmZvcm1hdGlvbiBmb3Igd2F0Y2ggY29tbWFuZCIpOworICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpzdGFydFdhdGNoaW5nVGFncyhjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzLCBpbnQgb3V0RmQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9nTG9jayk7CisgICAgc2l6ZV90IHRhZ3NJZHg7IC8vIGluZGV4IG9mICctbScKKyAgICBTdHJpbmcxNiB0YWdzKCIiKTsKKyAgICBmb3IgKHRhZ3NJZHggPSAyOyB0YWdzSWR4IDwgYXJncy5zaXplKCkgJiYgYXJnc1t0YWdzSWR4XSAhPSBTdHJpbmcxNigiLW0iKTsgdGFnc0lkeCsrKTsKKyAgICBpZiAodGFnc0lkeCA8IGFyZ3Muc2l6ZSgpIC0gMSkgeworICAgICAgICB0YWdzID0gYXJnc1t0YWdzSWR4ICsgMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHByaW50ZihvdXRGZCwgIk5vIHRhZ3MgcHJvdmlkZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3QgY2xpZW50c0lkeDsgLy8gaW5kZXggb2YgJy1jJworICAgIFN0cmluZzE2IGNsaWVudHMgPSBrV2F0Y2hBbGxDbGllbnRzRmxhZzsgLy8gd2F0Y2ggYWxsIGNsaWVudHMgaWYgbm8gY2xpZW50cyBhcmUgcHJvdmlkZWQKKyAgICBmb3IgKGNsaWVudHNJZHggPSAyOyBjbGllbnRzSWR4IDwgYXJncy5zaXplKCkgJiYgYXJnc1tjbGllbnRzSWR4XSAhPSBTdHJpbmcxNigiLWMiKTsKKyAgICAgICAgIGNsaWVudHNJZHgrKyk7CisgICAgaWYgKGNsaWVudHNJZHggPCBhcmdzLnNpemUoKSAtIDEpIHsKKyAgICAgICAgY2xpZW50cyA9IGFyZ3NbY2xpZW50c0lkeCArIDFdOworICAgIH0KKyAgICBwYXJzZUNsaWVudHNUb1dhdGNoTG9ja2VkKFN0cmluZzgoY2xpZW50cykpOworCisgICAgLy8gdHJhY2sgdGFncyB0byBpbml0aWFsaXplIGZ1dHVyZSBjbGllbnRzIHdpdGggdGhlIG1vbml0b3JpbmcgaW5mb3JtYXRpb24KKyAgICBtTW9uaXRvclRhZ3MgPSBTdHJpbmc4KHRhZ3MpOworCisgICAgYm9vbCBzZXJ2aWNlTG9jayA9IHRyeUxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICBpbnQgbnVtV2F0Y2hlZENsaWVudHMgPSAwOworICAgIGF1dG8gY2FtZXJhQ2xpZW50cyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50RGVzY3JpcHRvcjogY2FtZXJhQ2xpZW50cykgeworICAgICAgICBpZiAoY2xpZW50RGVzY3JpcHRvciA9PSBudWxscHRyKSB7IGNvbnRpbnVlOyB9CisgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnQgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRWYWx1ZSgpOworICAgICAgICBpZiAoY2xpZW50LmdldCgpID09IG51bGxwdHIpIHsgY29udGludWU7IH0KKworICAgICAgICBpZiAoaXNDbGllbnRXYXRjaGVkTG9ja2VkKGNsaWVudC5nZXQoKSkpIHsKKyAgICAgICAgICAgIGNsaWVudC0+c3RhcnRXYXRjaGluZ1RhZ3MobU1vbml0b3JUYWdzLCBvdXRGZCk7CisgICAgICAgICAgICBudW1XYXRjaGVkQ2xpZW50cysrOworICAgICAgICB9CisgICAgfQorICAgIGRwcmludGYob3V0RmQsICJTdGFydGVkIHdhdGNoaW5nICVkIGFjdGl2ZSBjbGllbnRzXG4iLCBudW1XYXRjaGVkQ2xpZW50cyk7CisKKyAgICBpZiAoc2VydmljZUxvY2spIHsgbVNlcnZpY2VMb2NrLnVubG9jaygpOyB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpzdG9wV2F0Y2hpbmdUYWdzKGludCBvdXRGZCkgeworICAgIC8vIGNsZWFyIG1Nb25pdG9yVGFncyB0byBwcmV2ZW50IG5ldyBjbGllbnRzIGZyb20gbW9uaXRvcmluZyB0YWdzIGF0IGluaXRpYWxpemF0aW9uCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvZ0xvY2spOworICAgIG1Nb25pdG9yVGFncyA9IFN0cmluZzg6OmVtcHR5KCk7CisKKyAgICBtV2F0Y2hlZENsaWVudFBhY2thZ2VzLmNsZWFyKCk7CisgICAgbVdhdGNoZWRDbGllbnRzRHVtcENhY2hlLmNsZWFyKCk7CisKKyAgICBib29sIHNlcnZpY2VMb2NrID0gdHJ5TG9jayhtU2VydmljZUxvY2spOworICAgIGF1dG8gY2FtZXJhQ2xpZW50cyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50RGVzY3JpcHRvciA6IGNhbWVyYUNsaWVudHMpIHsKKyAgICAgICAgaWYgKGNsaWVudERlc2NyaXB0b3IgPT0gbnVsbHB0cikgeyBjb250aW51ZTsgfQorICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50ID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKGNsaWVudC5nZXQoKSA9PSBudWxscHRyKSB7IGNvbnRpbnVlOyB9CisgICAgICAgIGNsaWVudC0+c3RvcFdhdGNoaW5nVGFncyhvdXRGZCk7CisgICAgfQorICAgIGRwcmludGYob3V0RmQsICJTdG9wcGVkIHdhdGNoaW5nIGFsbCBjbGllbnRzLlxuIik7CisgICAgaWYgKHNlcnZpY2VMb2NrKSB7IG1TZXJ2aWNlTG9jay51bmxvY2soKTsgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y2xlYXJDYWNoZWRNb25pdG9yZWRUYWdEdW1wcyhpbnQgb3V0RmQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9nTG9jayk7CisgICAgc2l6ZV90IGNsZWFyZWRTaXplID0gbVdhdGNoZWRDbGllbnRzRHVtcENhY2hlLnNpemUoKTsKKyAgICBtV2F0Y2hlZENsaWVudHNEdW1wQ2FjaGUuY2xlYXIoKTsKKyAgICBkcHJpbnRmKG91dEZkLCAiQ2xlYXJlZCB0YWcgaW5mb3JtYXRpb24gb2YgJXp1IGNhY2hlZCBjbGllbnRzLlxuIiwgY2xlYXJlZFNpemUpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6cHJpbnRXYXRjaGVkVGFncyhpbnQgb3V0RmQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9nTG9jayhtTG9nTG9jayk7CisgICAgc3RkOjpzZXQ8U3RyaW5nMTY+IGNvbm5lY3RlZE1vbml0b3JlZENsaWVudHM7CisKKyAgICBib29sIHByaW50ZWRTb21ldGhpbmcgPSBmYWxzZTsgLy8gdHJhY2tzIGlmIGFueSBtb25pdG9yaW5nIGluZm9ybWF0aW9uIHdhcyBwcmludGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmcm9tIGVpdGhlciBjYWNoZWQgb3IgYWN0aXZlIGNsaWVudHMpCisKKyAgICBib29sIHNlcnZpY2VMb2NrID0gdHJ5TG9jayhtU2VydmljZUxvY2spOworICAgIC8vIGdldCBhbGwgd2F0Y2hlZCBjbGllbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBjb25uZWN0ZWQKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudERlc2NyaXB0b3I6IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpKSB7CisgICAgICAgIGlmIChjbGllbnREZXNjcmlwdG9yID09IG51bGxwdHIpIHsgY29udGludWU7IH0KKworICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50ID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKGNsaWVudC5nZXQoKSA9PSBudWxscHRyKSB7IGNvbnRpbnVlOyB9CisgICAgICAgIGlmICghaXNDbGllbnRXYXRjaGVkTG9ja2VkKGNsaWVudC5nZXQoKSkpIHsgY29udGludWU7IH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZHVtcFZlY3RvcjsKKyAgICAgICAgY2xpZW50LT5kdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKGR1bXBWZWN0b3IpOworCisgICAgICAgIHNpemVfdCBwcmludElkeCA9IGR1bXBWZWN0b3Iuc2l6ZSgpOworICAgICAgICBpZiAocHJpbnRJZHggPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBQcmludCB0YWcgZHVtcHMgZm9yIGFjdGl2ZSBjbGllbnQKKyAgICAgICAgY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQgPSBjbGllbnREZXNjcmlwdG9yLT5nZXRLZXkoKTsKKyAgICAgICAgU3RyaW5nOCBwYWNrYWdlTmFtZTggPSBTdHJpbmc4KGNsaWVudC0+Z2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIGNvbnN0IGNoYXIgKnByaW50YWJsZVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU4LmxvY2tCdWZmZXIocGFja2FnZU5hbWU4LnNpemUoKSk7CisgICAgICAgIGRwcmludGYob3V0RmQsICJDbGllbnQ6ICVzIChhY3RpdmUpXG4iLCBwcmludGFibGVQYWNrYWdlTmFtZSk7CisgICAgICAgIHdoaWxlKHByaW50SWR4ID4gMCkgeworICAgICAgICAgICAgcHJpbnRJZHgtLTsKKyAgICAgICAgICAgIGRwcmludGYob3V0RmQsICIlczolcyAgJXMiLCBjYW1lcmFJZC5zdHJpbmcoKSwgcHJpbnRhYmxlUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIGR1bXBWZWN0b3JbcHJpbnRJZHhdLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGRwcmludGYob3V0RmQsICJcbiIpOworICAgICAgICBwYWNrYWdlTmFtZTgudW5sb2NrQnVmZmVyKCk7CisgICAgICAgIHByaW50ZWRTb21ldGhpbmcgPSB0cnVlOworCisgICAgICAgIGNvbm5lY3RlZE1vbml0b3JlZENsaWVudHMuZW1wbGFjZShjbGllbnQtPmdldFBhY2thZ2VOYW1lKCkpOworICAgIH0KKyAgICBpZiAoc2VydmljZUxvY2spIHsgbVNlcnZpY2VMb2NrLnVubG9jaygpOyB9CisKKyAgICAvLyBQcmludCBlbnRyaWVzIGluIG1XYXRjaGVkQ2xpZW50c0R1bXBDYWNoZSBmb3IgY2xpZW50cyB0aGF0IGFyZSBub3QgY29ubmVjdGVkCisgICAgZm9yIChjb25zdCBhdXRvICZrdjogbVdhdGNoZWRDbGllbnRzRHVtcENhY2hlKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzE2ICZwYWNrYWdlID0ga3YuZmlyc3Q7CisgICAgICAgIGlmIChjb25uZWN0ZWRNb25pdG9yZWRDbGllbnRzLmZpbmQocGFja2FnZSkgIT0gY29ubmVjdGVkTW9uaXRvcmVkQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBkcHJpbnRmKG91dEZkLCAiQ2xpZW50OiAlcyAoY2FjaGVkKVxuIiwgU3RyaW5nOChwYWNrYWdlKS5zdHJpbmcoKSk7CisgICAgICAgIGRwcmludGYob3V0RmQsICIlc1xuIiwga3Yuc2Vjb25kLmNfc3RyKCkpOworICAgICAgICBwcmludGVkU29tZXRoaW5nID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIXByaW50ZWRTb21ldGhpbmcpIHsKKyAgICAgICAgZHByaW50ZihvdXRGZCwgIk5vIG1vbml0b3JpbmcgaW5mb3JtYXRpb24gdG8gcHJpbnQuXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFByaW50IGFsbCBldmVudHMgaW4gdmVjdG9yIGBldmVudHMnIHRoYXQgY2FtZSBhZnRlciBsYXN0UHJpbnRlZEV2ZW50Cit2b2lkIHByaW50TmV3V2F0Y2hlZEV2ZW50cyhpbnQgb3V0RmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmxhc3RQcmludGVkRXZlbnQpIHsKKyAgICBpZiAoZXZlbnRzLmVtcHR5KCkpIHsgcmV0dXJuOyB9CisKKyAgICAvLyBpbmRleCBvZiBsYXN0UHJpbnRlZEV2ZW50IGluIGV2ZW50cy4KKyAgICAvLyBsYXN0UHJpbnRlZElkeCA9IGV2ZW50cy5zaXplKCkgaWYgbGFzdFByaW50ZWRFdmVudCBpcyBub3QgaW4gZXZlbnRzCisgICAgc2l6ZV90IGxhc3RQcmludGVkSWR4OworICAgIGZvciAobGFzdFByaW50ZWRJZHggPSAwOworICAgICAgICAgbGFzdFByaW50ZWRJZHggPCBldmVudHMuc2l6ZSgpICYmIGxhc3RQcmludGVkRXZlbnQgIT0gZXZlbnRzW2xhc3RQcmludGVkSWR4XTsKKyAgICAgICAgIGxhc3RQcmludGVkSWR4KyspOworCisgICAgaWYgKGxhc3RQcmludGVkSWR4ID09IDApIHsgcmV0dXJuOyB9IC8vIGVhcmx5IGV4aXQgaWYgbm8gbmV3IGV2ZW50IGluIGBldmVudHNgCisKKyAgICBTdHJpbmc4IHBhY2thZ2VOYW1lOChwYWNrYWdlTmFtZSk7CisgICAgY29uc3QgY2hhciAqcHJpbnRhYmxlUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTgubG9ja0J1ZmZlcihwYWNrYWdlTmFtZTguc2l6ZSgpKTsKKworICAgIC8vIHByaW50IGV2ZW50cyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIChsYXRlc3QgZXZlbnQgbGFzdCkKKyAgICBzaXplX3QgaWR4VG9QcmludCA9IGxhc3RQcmludGVkSWR4OworICAgIGRvIHsKKyAgICAgICAgaWR4VG9QcmludC0tOworICAgICAgICBkcHJpbnRmKG91dEZkLCAiJXM6JXMgICVzIiwgY2FtZXJhSWQsIHByaW50YWJsZVBhY2thZ2VOYW1lLCBldmVudHNbaWR4VG9QcmludF0uY19zdHIoKSk7CisgICAgfSB3aGlsZSAoaWR4VG9QcmludCAhPSAwKTsKKworICAgIHBhY2thZ2VOYW1lOC51bmxvY2tCdWZmZXIoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIGFkYiBzaGVsbCBjbWQgd2F0Y2ggc2hvdWxkIGJlIGludGVycnVwdGVkIGJhc2VkIG9uIGRhdGEgaW4gaW5GZC4gVGhlIHdhdGNoCisvLyBjb21tYW5kIHNob3VsZCBiZSBpbnRlcnJ1cHRlZCBpZiB0aGUgdXNlciBwcmVzc2VzIHRoZSByZXR1cm4ga2V5LCBvciBpZiB1c2VyIGxvc2VzIGFueSB3YXkgdG8KKy8vIHNpZ25hbCBpbnRlcnJ1cHQuCisvLyBJZiB0aW1lb3V0TXMgPT0gMCwgdGhpcyBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UKK2Jvb2wgc2hvdWxkSW50ZXJydXB0V2F0Y2hDb21tYW5kKGludCBpbkZkLCBpbnQgb3V0RmQsIGxvbmcgdGltZW91dE1zKSB7CisgICAgc3RydWN0IHRpbWV2YWwgc3RhcnRUaW1lOworICAgIGludCBzdGFydFRpbWVFcnJvciA9IGdldHRpbWVvZmRheSgmc3RhcnRUaW1lLCBudWxscHRyKTsKKyAgICBpZiAoc3RhcnRUaW1lRXJyb3IpIHsKKyAgICAgICAgZHByaW50ZihvdXRGZCwgIkZhaWxlZCB3YWl0aW5nIGZvciBpbnRlcnJ1cHQsIGFib3J0aW5nLlxuIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGNvbnN0IG5mZHNfdCBudW1GZHMgPSAxOworICAgIHN0cnVjdCBwb2xsZmQgcG9sbEZkID0geyAuZmQgPSBpbkZkLCAuZXZlbnRzID0gUE9MTElOLCAucmV2ZW50cyA9IDAgfTsKKworICAgIHN0cnVjdCB0aW1ldmFsIGN1cnJUaW1lOworICAgIGNoYXIgYnVmZmVyWzJdOworICAgIHdoaWxlKHRydWUpIHsKKyAgICAgICAgaW50IGN1cnJUaW1lRXJyb3IgPSBnZXR0aW1lb2ZkYXkoJmN1cnJUaW1lLCBudWxscHRyKTsKKyAgICAgICAgaWYgKGN1cnJUaW1lRXJyb3IpIHsKKyAgICAgICAgICAgIGRwcmludGYob3V0RmQsICJGYWlsZWQgd2FpdGluZyBmb3IgaW50ZXJydXB0LCBhYm9ydGluZy5cbiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBsb25nIGVsYXBzZWRUaW1lTXMgPSAoKGN1cnJUaW1lLnR2X3NlYyAtIHN0YXJ0VGltZS50dl9zZWMpICogMTAwMEwpCisgICAgICAgICAgICAgICAgKyAoKGN1cnJUaW1lLnR2X3VzZWMgLSBzdGFydFRpbWUudHZfdXNlYykgLyAxMDAwTCk7CisgICAgICAgIGludCByZW1haW5pbmdUaW1lTXMgPSAoaW50KSAodGltZW91dE1zIC0gZWxhcHNlZFRpbWVNcyk7CisKKyAgICAgICAgaWYgKHJlbWFpbmluZ1RpbWVNcyA8PSAwKSB7CisgICAgICAgICAgICAvLyBObyB1c2VyIGludGVycnVwdCB3aXRoaW4gdGltZW91dE1zLCBkb24ndCBpbnRlcnJ1cHQgd2F0Y2ggY29tbWFuZAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50IG51bUZkc1VwZGF0ZWQgPSBwb2xsKCZwb2xsRmQsIG51bUZkcywgcmVtYWluaW5nVGltZU1zKTsKKyAgICAgICAgaWYgKG51bUZkc1VwZGF0ZWQgPCAwKSB7CisgICAgICAgICAgICBkcHJpbnRmKG91dEZkLCAiRmFpbGVkIHdoaWxlIHdhaXRpbmcgZm9yIHVzZXIgaW5wdXQuIEV4aXRpbmcuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bUZkc1VwZGF0ZWQgPT0gMCkgeworICAgICAgICAgICAgLy8gTm8gdXNlciBpbnB1dCB3aXRoaW4gdGltZW91dE1zLCBkb24ndCBpbnRlcnJ1cHQgd2F0Y2ggY29tbWFuZAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEocG9sbEZkLnJldmVudHMgJiBQT0xMSU4pKSB7CisgICAgICAgICAgICBkcHJpbnRmKG91dEZkLCAiRmFpbGVkIHdoaWxlIHdhaXRpbmcgZm9yIHVzZXIgaW5wdXQuIEV4aXRpbmcuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBzaXplUmVhZCA9IHJlYWQoaW5GZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSAtIDEpOworICAgICAgICBpZiAoc2l6ZVJlYWQgPCAwKSB7CisgICAgICAgICAgICBkcHJpbnRmKG91dEZkLCAiRXJyb3IgcmVhZGluZyB1c2VyIGlucHV0LiBFeGl0aW5nLlxuIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaXplUmVhZCA9PSAwKSB7CisgICAgICAgICAgICAvLyBSZWFjaGVkIGVuZCBvZiBpbnB1dCBmZCAoY2FuIGhhcHBlbiBpZiBpbnB1dCBpcyBwaXBlZCkKKyAgICAgICAgICAgIC8vIFVzZXIgaGFzIG5vIHdheSB0byBzaWduYWwgYW4gaW50ZXJydXB0LCBzbyBpbnRlcnJ1cHQgaGVyZQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnVmZmVyWzBdID09ICdcbicpIHsKKyAgICAgICAgICAgIC8vIFVzZXIgcHJlc3NlZCByZXR1cm4sIGludGVycnVwdCB3YXRjaCBjb21tYW5kLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OnByaW50V2F0Y2hlZFRhZ3NVbnRpbEludGVycnVwdChjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbkZkLCBpbnQgb3V0RmQpIHsKKyAgICAvLyBGaWd1cmUgb3V0IHJlZnJlc2ggaW50ZXJ2YWwsIGlmIHByZXNlbnQgaW4gYXJncworICAgIGxvbmcgcmVmcmVzaFRpbWVvdXRNcyA9IDEwMDBMOyAvLyByZWZyZXNoIGV2ZXJ5IDFzIGJ5IGRlZmF1bHQKKyAgICBpZiAoYXJncy5zaXplKCkgPiAyKSB7CisgICAgICAgIHNpemVfdCBpbnRlcnZhbElkeDsgLy8gaW5kZXggb2YgJy1uJworICAgICAgICBmb3IgKGludGVydmFsSWR4ID0gMjsgaW50ZXJ2YWxJZHggPCBhcmdzLnNpemUoKSAmJiBTdHJpbmcxNigiLW4iKSAhPSBhcmdzW2ludGVydmFsSWR4XTsKKyAgICAgICAgICAgICBpbnRlcnZhbElkeCsrKTsKKworICAgICAgICBzaXplX3QgaW50ZXJ2YWxWYWxJZHggPSBpbnRlcnZhbElkeCArIDE7CisgICAgICAgIGlmIChpbnRlcnZhbFZhbElkeCA8IGFyZ3Muc2l6ZSgpKSB7CisgICAgICAgICAgICByZWZyZXNoVGltZW91dE1zID0gc3RydG9sKFN0cmluZzgoYXJnc1tpbnRlcnZhbFZhbElkeF0uc3RyaW5nKCkpLCBudWxscHRyLCAxMCk7CisgICAgICAgICAgICBpZiAoZXJybm8pIHsgcmV0dXJuIEJBRF9WQUxVRTsgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IG1pbiB0aW1lb3V0IG9mIDEwbXMuIFRoaXMgcHJldmVudHMgZWRnZSBjYXNlcyBpbiBwb2xsaW5nIHdoZW4gdGltZW91dCBvZiAwIGlzIHBhc3NlZC4KKyAgICByZWZyZXNoVGltZW91dE1zID0gcmVmcmVzaFRpbWVvdXRNcyA8IDEwID8gMTAgOiByZWZyZXNoVGltZW91dE1zOworCisgICAgZHByaW50ZihvdXRGZCwgIlByZXNzIHJldHVybiB0byBleGl0Li4uXG5cbiIpOworICAgIHN0ZDo6bWFwPFN0cmluZzE2LCBzdGQ6OnN0cmluZz4gcGFja2FnZU5hbWVUb0xhc3RFdmVudDsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGJvb2wgc2VydmljZUxvY2sgPSB0cnlMb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIGF1dG8gY2FtZXJhQ2xpZW50cyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpOworICAgICAgICBpZiAoc2VydmljZUxvY2spIHsgbVNlcnZpY2VMb2NrLnVubG9jaygpOyB9CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnREZXNjcmlwdG9yIDogY2FtZXJhQ2xpZW50cykgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvZ0xvY2spOworICAgICAgICAgICAgaWYgKGNsaWVudERlc2NyaXB0b3IgPT0gbnVsbHB0cikgeyBjb250aW51ZTsgfQorCisgICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50ID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChjbGllbnQuZ2V0KCkgPT0gbnVsbHB0cikgeyBjb250aW51ZTsgfQorICAgICAgICAgICAgaWYgKCFpc0NsaWVudFdhdGNoZWRMb2NrZWQoY2xpZW50LmdldCgpKSkgeyBjb250aW51ZTsgfQorCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiAmcGFja2FnZU5hbWUgPSBjbGllbnQtPmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgICAgICAvLyBUaGlzIGFsc28gaW5pdGlhbGl6ZXMgdGhlIG1hcCBlbnRyaWVzIHdpdGggYW4gZW1wdHkgc3RyaW5nCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGFzdFByaW50ZWRFdmVudCA9IHBhY2thZ2VOYW1lVG9MYXN0RXZlbnRbcGFja2FnZU5hbWVdOworCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGF0ZXN0RXZlbnRzOworICAgICAgICAgICAgY2xpZW50LT5kdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKGxhdGVzdEV2ZW50cyk7CisKKyAgICAgICAgICAgIGlmICghbGF0ZXN0RXZlbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IGNhbWVyYUlkID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0S2V5KCk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJpbnRhYmxlQ2FtZXJhSWQgPSBjYW1lcmFJZC5sb2NrQnVmZmVyKGNhbWVyYUlkLnNpemUoKSk7CisgICAgICAgICAgICAgICAgcHJpbnROZXdXYXRjaGVkRXZlbnRzKG91dEZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGFibGVDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdEV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFByaW50ZWRFdmVudCk7CisgICAgICAgICAgICAgICAgcGFja2FnZU5hbWVUb0xhc3RFdmVudFtwYWNrYWdlTmFtZV0gPSBsYXRlc3RFdmVudHNbMF07CisgICAgICAgICAgICAgICAgY2FtZXJhSWQudW5sb2NrQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNob3VsZEludGVycnVwdFdhdGNoQ29tbWFuZChpbkZkLCBvdXRGZCwgcmVmcmVzaFRpbWVvdXRNcykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpwYXJzZUNsaWVudHNUb1dhdGNoTG9ja2VkKFN0cmluZzggY2xpZW50cykgeworICAgIG1XYXRjaGVkQ2xpZW50UGFja2FnZXMuY2xlYXIoKTsKKworICAgIGNvbnN0IGNoYXIgKmFsbFNlbnRpbmVsID0gU3RyaW5nOChrV2F0Y2hBbGxDbGllbnRzRmxhZykuc3RyaW5nKCk7CisKKyAgICBjaGFyICp0b2tlbml6ZWQgPSBjbGllbnRzLmxvY2tCdWZmZXIoY2xpZW50cy5zaXplKCkpOworICAgIGNoYXIgKnNhdmVQdHI7CisgICAgY2hhciAqbmV4dENsaWVudCA9IHN0cnRva19yKHRva2VuaXplZCwgIiwiLCAmc2F2ZVB0cik7CisKKyAgICB3aGlsZSAobmV4dENsaWVudCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChzdHJjbXAobmV4dENsaWVudCwgYWxsU2VudGluZWwpID09IDApIHsKKyAgICAgICAgICAgIC8vIERvbid0IG5lZWQgdG8gdHJhY2sgYW55IG90aGVyIHBhY2thZ2UgaWYgJ2FsbCcgaXMgcHJlc2VudAorICAgICAgICAgICAgbVdhdGNoZWRDbGllbnRQYWNrYWdlcy5jbGVhcigpOworICAgICAgICAgICAgbVdhdGNoZWRDbGllbnRQYWNrYWdlcy5lbXBsYWNlKGtXYXRjaEFsbENsaWVudHNGbGFnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gdHJhY2sgcGFja2FnZSBuYW1lcworICAgICAgICBtV2F0Y2hlZENsaWVudFBhY2thZ2VzLmVtcGxhY2UobmV4dENsaWVudCk7CisgICAgICAgIG5leHRDbGllbnQgPSBzdHJ0b2tfcihudWxscHRyLCAiLCIsICZzYXZlUHRyKTsKKyAgICB9CisgICAgY2xpZW50cy51bmxvY2tCdWZmZXIoKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6cHJpbnRIZWxwKGludCBvdXQpIHsKICAgICByZXR1cm4gZHByaW50ZihvdXQsICJDYW1lcmEgc2VydmljZSBjb21tYW5kczpcbiIKICAgICAgICAgIiAgZ2V0LXVpZC1zdGF0ZSA8UEFDS0FHRT4gWy0tdXNlciBVU0VSX0lEXSBnZXRzIHRoZSB1aWQgc3RhdGVcbiIKQEAgLTQ1ODEsOSArNTM0MiwyMCBAQAogICAgICAgICAiICAgICAgVmFsaWQgdmFsdWVzIDA9T0ZGLCAxPU9OIGZvciBKUEVHXG4iCiAgICAgICAgICIgIGdldC1pbWFnZS1kdW1wLW1hc2sgcmV0dXJucyB0aGUgY3VycmVudCBpbWFnZS1kdW1wLW1hc2sgdmFsdWVcbiIKICAgICAgICAgIiAgc2V0LWNhbWVyYS1tdXRlIDwwLzE+IGVuYWJsZSBvciBkaXNhYmxlIGNhbWVyYSBtdXRpbmdcbiIKKyAgICAgICAgIiAgd2F0Y2ggPHN0YXJ0fHN0b3B8ZHVtcHxwcmludHxjbGVhcj4gbWFuYWdlcyB0YWcgbW9uaXRvcmluZyBpbiBjb25uZWN0ZWQgY2xpZW50c1xuIgogICAgICAgICAiICBoZWxwIHByaW50IHRoaXMgbWVzc2FnZVxuIik7CiB9CiAKK2Jvb2wgQ2FtZXJhU2VydmljZTo6aXNDbGllbnRXYXRjaGVkKGNvbnN0IEJhc2ljQ2xpZW50ICpjbGllbnQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9nTG9jayk7CisgICAgcmV0dXJuIGlzQ2xpZW50V2F0Y2hlZExvY2tlZChjbGllbnQpOworfQorCitib29sIENhbWVyYVNlcnZpY2U6OmlzQ2xpZW50V2F0Y2hlZExvY2tlZChjb25zdCBCYXNpY0NsaWVudCAqY2xpZW50KSB7CisgICAgcmV0dXJuIG1XYXRjaGVkQ2xpZW50UGFja2FnZXMuZmluZChrV2F0Y2hBbGxDbGllbnRzRmxhZykgIT0gbVdhdGNoZWRDbGllbnRQYWNrYWdlcy5lbmQoKSB8fAorICAgICAgICAgICBtV2F0Y2hlZENsaWVudFBhY2thZ2VzLmZpbmQoY2xpZW50LT5nZXRQYWNrYWdlTmFtZSgpKSAhPSBtV2F0Y2hlZENsaWVudFBhY2thZ2VzLmVuZCgpOworfQorCiBpbnQzMl90IENhbWVyYVNlcnZpY2U6OnVwZGF0ZUF1ZGlvUmVzdHJpY3Rpb24oKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKICAgICByZXR1cm4gdXBkYXRlQXVkaW9SZXN0cmljdGlvbkxvY2tlZCgpOwpAQCAtNDYwNSwxMCArNTM3Nyw0MyBAQAogICAgIHJldHVybiBtb2RlOwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OnN0b3BJbmplY3Rpb25JbXBsKCkgewotICAgIG1JbmplY3Rpb25TdGF0dXNMaXN0ZW5lci0+cmVtb3ZlTGlzdGVuZXIoKTsKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmNoZWNrSWZJbmplY3Rpb25DYW1lcmFJc1ByZXNlbnQoY29uc3QgU3RyaW5nOCYgZXh0ZXJuYWxDYW1JZCwKKyAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFNwKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPiBsb2NrID0KKyAgICAgICAgICAgIEF1dG9Db25kaXRpb25Mb2NrOjp3YWl0QW5kQWNxdWlyZShtU2VydmljZUxvY2tXcmFwcGVyKTsKKyAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKKyAgICBpZiAoKHJlcyA9IGNoZWNrSWZEZXZpY2VJc1VzYWJsZShleHRlcm5hbENhbUlkKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIkRldmljZSAlcyBpcyBub3QgdXNhYmxlISIsIGV4dGVybmFsQ2FtSWQuc3RyaW5nKCkpOworICAgICAgICBtSW5qZWN0aW9uU3RhdHVzTGlzdGVuZXItPm5vdGlmeUluamVjdGlvbkVycm9yKAorICAgICAgICAgICAgICAgIGV4dGVybmFsQ2FtSWQsIFVOS05PV05fVFJBTlNBQ1RJT04pOworICAgICAgICBjbGllbnRTcC0+bm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQsCisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcygpKTsKIAotICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGUgc3RvcCBpbmplY3Rpb24gZnVuY3Rpb24uCisgICAgICAgIC8vIERvIG5vdCBob2xkIG1TZXJ2aWNlTG9jayB3aGlsZSBkaXNjb25uZWN0aW5nIGNsaWVudHMsIGJ1dCByZXRhaW4gdGhlIGNvbmRpdGlvbiBibG9ja2luZworICAgICAgICAvLyBvdGhlciBjbGllbnRzIGZyb20gY29ubmVjdGluZyBpbiBtU2VydmljZUxvY2tXcmFwcGVyIGlmIGhlbGQKKyAgICAgICAgbVNlcnZpY2VMb2NrLnVubG9jaygpOworCisgICAgICAgIC8vIENsZWFyIGNhbGxlciBpZGVudGl0eSB0ZW1wb3JhcmlseSBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5CisgICAgICAgIGludDY0X3QgdG9rZW4gPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgY2xpZW50U3AtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworCisgICAgICAgIC8vIFJlYWNxdWlyZSBtU2VydmljZUxvY2sKKyAgICAgICAgbVNlcnZpY2VMb2NrLmxvY2soKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OmNsZWFySW5qZWN0aW9uUGFyYW1ldGVycygpIHsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1JbmplY3Rpb25QYXJhbWV0ZXJzTG9jayk7CisgICAgICAgIG1JbmplY3Rpb25Jbml0UGVuZGluZyA9IGZhbHNlOworICAgICAgICBtSW5qZWN0aW9uSW50ZXJuYWxDYW1JZCA9ICIiOworICAgIH0KKyAgICBtSW5qZWN0aW9uRXh0ZXJuYWxDYW1JZCA9ICIiOworICAgIG1JbmplY3Rpb25TdGF0dXNMaXN0ZW5lci0+cmVtb3ZlTGlzdGVuZXIoKTsKIH0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAppbmRleCBiYzJlMzQ3Li5kOTZlYTAwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSAibWVkaWEvUmluZ0J1ZmZlci5oIgogI2luY2x1ZGUgInV0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmgiCiAjaW5jbHVkZSAidXRpbHMvQ2xpZW50TWFuYWdlci5oIgorI2luY2x1ZGUgInV0aWxzL0lQQ1RyYW5zcG9ydC5oIgogCiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN0cmluZz4KQEAgLTEwNiwxMiArMTA3LDIwIEBACiAgICAgLy8gSEFMIENhbGxiYWNrcyAtIGltcGxlbWVudHMgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpTdGF0dXNMaXN0ZW5lcgogCiAgICAgdmlydHVhbCB2b2lkICAgICAgICBvbkRldmljZVN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBuZXdIYWxTdGF0dXMpIG92ZXJyaWRlOworICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld0hhbFN0YXR1cykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBvbkRldmljZVN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgbmV3SGFsU3RhdHVzKSBvdmVycmlkZTsKKyAgICAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBuZXdIYWxTdGF0dXMpIG92ZXJyaWRlOworICAgIC8vIFRoaXMgbWV0aG9kIG1heSBob2xkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bUludGVyZmFjZU11dGV4IGFzIGEgcGFydAorICAgIC8vIG9mIGNhbGxpbmcgZ2V0U3lzdGVtQ2FtZXJhS2luZCgpIGludGVybmFsbHkuIENhcmUgc2hvdWxkIGJlIHRha2VuIG5vdCB0bworICAgIC8vIGRpcmVjdGx5IC8gaW5kaXJlY3RseSBjYWxsIHRoaXMgZnJvbSBjYWxsZXJzIHdobyBhbHNvIGhvbGQKKyAgICAvLyBtSW50ZXJmYWNlTXV0ZXguCiAgICAgdmlydHVhbCB2b2lkICAgICAgICBvblRvcmNoU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cykgb3ZlcnJpZGU7CisgICAgICAgICAgICBUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKSBvdmVycmlkZTsKKyAgICAvLyBEb2VzIG5vdCBob2xkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bUludGVyZmFjZU11dGV4LgorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25Ub3JjaFN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICBUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzLAorICAgICAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBraW5kKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uTmV3UHJvdmlkZXJSZWdpc3RlcmVkKCkgb3ZlcnJpZGU7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTE2NCw2ICsxNzMsMTIgQEAKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIHNldFRvcmNoTW9kZShjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCwKICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBjbGllbnRCaW5kZXIpOwogCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICB0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKKyAgICAgICAgICAgIGludDMyX3QgdG9yY2hTdHJlbmd0aCwgY29uc3Qgc3A8SUJpbmRlcj4mIGNsaWVudEJpbmRlcik7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIGdldFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCisgICAgICAgICAgICBpbnQzMl90KiB0b3JjaFN0cmVuZ3RoKTsKKwogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICAgbm90aWZ5U3lzdGVtRXZlbnQoaW50MzJfdCBldmVudElkLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGFyZ3MpOwogCkBAIC0yMjgsNyArMjQzLDcgQEAKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vIENhbWVyYURldmljZUZhY3RvcnkgZnVuY3Rpb25hbGl0eQotICAgIGludCAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlVmVyc2lvbihjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50KiBmYWNpbmcgPSBudWxscHRyLAorICAgIHN0ZDo6cGFpcjxpbnQsIElQQ1RyYW5zcG9ydD4gICAgZ2V0RGV2aWNlVmVyc2lvbihjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50KiBmYWNpbmcgPSBudWxscHRyLAogICAgICAgICAgICAgaW50KiBvcmllbnRhdGlvbiA9IG51bGxwdHIpOwogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0yNzIsNiArMjg3LDEwIEBACiAgICAgICAgIC8vIEludGVybmFsIGR1bXAgbWV0aG9kIHRvIGJlIGNhbGxlZCBieSBDYW1lcmFTZXJ2aWNlCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcENsaWVudChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpID0gMDsKIAorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFN0cmluZzggJnRhZ3MsIGludCBvdXRGZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFdhdGNoaW5nVGFncyhpbnQgb3V0RmQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3Ioc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZvdXQpOworCiAgICAgICAgIC8vIFJldHVybiB0aGUgcGFja2FnZSBuYW1lIGZvciB0aGlzIGNsaWVudAogICAgICAgICB2aXJ0dWFsIFN0cmluZzE2IGdldFBhY2thZ2VOYW1lKCkgY29uc3Q7CiAKQEAgLTMyMCwxMCArMzM5LDE5IEBACiAgICAgICAgIC8vIFNldC9yZXNldCBjYW1lcmEgbXV0ZQogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYU11dGUoYm9vbCBlbmFibGVkKSA9IDA7CiAKKyAgICAgICAgLy8gVGhlIGluamVjdGlvbiBjYW1lcmEgc2Vzc2lvbiB0byByZXBsYWNlIHRoZSBpbnRlcm5hbCBjYW1lcmEKKyAgICAgICAgLy8gc2Vzc2lvbi4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbmplY3RDYW1lcmEoY29uc3QgU3RyaW5nOCYgaW5qZWN0ZWRDYW1JZCwKKyAgICAgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpID0gMDsKKworICAgICAgICAvLyBTdG9wIHRoZSBpbmplY3Rpb24gY2FtZXJhIGFuZCByZXN0b3JlIHRvIGludGVybmFsIGNhbWVyYSBzZXNzaW9uLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbmplY3Rpb24oKSA9IDA7CisKICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIEJhc2ljQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgYm9vbCBuYXRpdmVDbGllbnQsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwKICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLApAQCAtMzQ2LDYgKzM3NCw3IEBACiAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUZhY2luZzsKICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb247CiAgICAgICAgIFN0cmluZzE2ICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lOworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1OYXRpdmVDbGllbnQ7CiAgICAgICAgIHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+ICAgICAgICAgbUNsaWVudEZlYXR1cmVJZDsKICAgICAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkOwogICAgICAgICBjb25zdCB1aWRfdCAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRVaWQ7CkBAIC00MzMsNiArNDYyLDcgQEAKICAgICAgICAgQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCwKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLAogICAgICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCkBAIC01MTYsMTQgKzU0NiwxNSBAQAogICAgICAgICAgKi8KICAgICAgICAgc3RhdGljIERlc2NyaXB0b3JQdHIgbWFrZUNsaWVudERlc2NyaXB0b3IoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBzcDxCYXNpY0NsaWVudD4mIHZhbHVlLAogICAgICAgICAgICAgICAgIGludDMyX3QgY29zdCwgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBzY29yZSwKLSAgICAgICAgICAgICAgICBpbnQzMl90IG93bmVySWQsIGludDMyX3Qgc3RhdGUsIGludCBvb21TY29yZU9mZnNldCk7CisgICAgICAgICAgICAgICAgaW50MzJfdCBvd25lcklkLCBpbnQzMl90IHN0YXRlLCBpbnQgb29tU2NvcmVPZmZzZXQsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50KTsKIAogICAgICAgICAvKioKICAgICAgICAgICogTWFrZSBhIENsaWVudERlc2NyaXB0b3Igb2JqZWN0IHdyYXBwaW5nIHRoZSBnaXZlbiBCYXNpY0NsaWVudCBzdHJvbmcgcG9pbnRlciB3aXRoCiAgICAgICAgICAqIHZhbHVlcyBpbnRpYWxpemVkIGZyb20gYSBwcmlvciBDbGllbnREZXNjcmlwdG9yLgogICAgICAgICAgKi8KICAgICAgICAgc3RhdGljIERlc2NyaXB0b3JQdHIgbWFrZUNsaWVudERlc2NyaXB0b3IoY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiB2YWx1ZSwKLSAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyJiBwYXJ0aWFsLCBpbnQgb29tU2NvcmVPZmZzZXQpOworICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHImIHBhcnRpYWwsIGludCBvb21TY29yZU9mZnNldCwKKyAgICAgICAgICAgICAgICBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCk7CiAKICAgICB9OyAvLyBjbGFzcyBDYW1lcmFDbGllbnRNYW5hZ2VyCiAKQEAgLTUzMiw4ICs1NjMsNiBAQAogCiBwcml2YXRlOgogCi0gICAgdHlwZWRlZiBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBDYW1lcmFEZXZpY2VTdGF0dXM7Ci0KICAgICAvKioKICAgICAgKiBUeXBlc2FmZSB2ZXJzaW9uIG9mIGRldmljZSBzdGF0dXMsIGNvbnRhaW5pbmcgYm90aCB0aGUgSEFMLWxheWVyIGFuZCB0aGUgc2VydmljZSBpbnRlcmZhY2UtCiAgICAgICogbGF5ZXIgdmFsdWVzLgpAQCAtNTYzLDcgKzU5Miw3IEBACiAgICAgICAgICAqIHJldHVybmVkIGluIHRoZSBIQUwncyBjYW1lcmFfaW5mbyBzdHJ1Y3QgZm9yIGVhY2ggZGV2aWNlLgogICAgICAgICAgKi8KICAgICAgICAgQ2FtZXJhU3RhdGUoY29uc3QgU3RyaW5nOCYgaWQsIGludCBjb3N0LCBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgY29uZmxpY3RpbmcsCi0gICAgICAgICAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBkZXZpY2VLaW5kKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIGRldmljZUtpbmQsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcGh5c2ljYWxDYW1lcmFzKTsKICAgICAgICAgdmlydHVhbCB+Q2FtZXJhU3RhdGUoKTsKIAogICAgICAgICAvKioKQEAgLTYyMSwxMiArNjUwLDI0IEBACiAgICAgICAgIFN5c3RlbUNhbWVyYUtpbmQgZ2V0U3lzdGVtQ2FtZXJhS2luZCgpIGNvbnN0OwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIGNhbWVyYSBpcyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGFuZCBoYXMgYQorICAgICAgICAgKiBwYXJ0aWN1bGFyIHBoeXNpY2FsIHN1Yi1jYW1lcmEuCisgICAgICAgICAqLworICAgICAgICBib29sIGNvbnRhaW5zUGh5c2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQpIGNvbnN0OworCisgICAgICAgIC8qKgogICAgICAgICAgKiBBZGQvUmVtb3ZlIHRoZSB1bmF2YWlsYWJsZSBwaHlzaWNhbCBjYW1lcmEgSUQuCiAgICAgICAgICAqLwogICAgICAgICBib29sIGFkZFVuYXZhaWxhYmxlUGh5c2ljYWxJZChjb25zdCBTdHJpbmc4JiBwaHlzaWNhbElkKTsKICAgICAgICAgYm9vbCByZW1vdmVVbmF2YWlsYWJsZVBoeXNpY2FsSWQoY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxJZCk7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhbmQgZ2V0IGNsaWVudCBwYWNrYWdlIG5hbWUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHNldENsaWVudFBhY2thZ2UoY29uc3QgU3RyaW5nOCYgY2xpZW50UGFja2FnZSk7CisgICAgICAgIFN0cmluZzggZ2V0Q2xpZW50UGFja2FnZSgpIGNvbnN0OworCisgICAgICAgIC8qKgogICAgICAgICAgKiBSZXR1cm4gdGhlIHVuYXZhaWxhYmxlIHBoeXNpY2FsIGlkcyBmb3IgdGhpcyBkZXZpY2UuCiAgICAgICAgICAqCiAgICAgICAgICAqIFRoaXMgbWV0aG9kIGFjcXVpcmVzIG1TdGF0dXNMb2NrLgpAQCAtNjM4LDkgKzY3OSwxMSBAQAogICAgICAgICBjb25zdCBpbnQgbUNvc3Q7CiAgICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+IG1Db25mbGljdGluZzsKICAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4gbVVuYXZhaWxhYmxlUGh5c2ljYWxJZHM7CisgICAgICAgIFN0cmluZzggbUNsaWVudFBhY2thZ2U7CiAgICAgICAgIG11dGFibGUgTXV0ZXggbVN0YXR1c0xvY2s7CiAgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgbVNoaW1QYXJhbXM7CiAgICAgICAgIGNvbnN0IFN5c3RlbUNhbWVyYUtpbmQgbVN5c3RlbUNhbWVyYUtpbmQ7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUGh5c2ljYWxDYW1lcmFzOyAvLyBFbXB0eSBpZiBub3QgYSBsb2dpY2FsIG11bHRpLWNhbWVyYQogICAgIH07IC8vIGNsYXNzIENhbWVyYVN0YXRlCiAKICAgICAvLyBPYnNlcnZlciBmb3IgVUlEIGxpZmVjeWNsZSBlbmZvcmNpbmcgdGhhdCBVSURzIGluIGlkbGUKQEAgLTY1NiwxMSArNjk5LDEzIEBACiAgICAgICAgIGJvb2wgaXNVaWRBY3RpdmUodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSk7CiAgICAgICAgIGludDMyX3QgZ2V0UHJvY1N0YXRlKHVpZF90IHVpZCk7CiAKLSAgICAgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKTsKLSAgICAgICAgdm9pZCBvblVpZEFjdGl2ZSh1aWRfdCB1aWQpOwotICAgICAgICB2b2lkIG9uVWlkSWRsZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpOworICAgICAgICAvLyBJVWlkT2JzZXJ2ZXIKKyAgICAgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBvblVpZEFjdGl2ZSh1aWRfdCB1aWQpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uVWlkSWRsZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpIG92ZXJyaWRlOwogICAgICAgICB2b2lkIG9uVWlkU3RhdGVDaGFuZ2VkKHVpZF90IHVpZCwgaW50MzJfdCBwcm9jU3RhdGUsIGludDY0X3QgcHJvY1N0YXRlU2VxLAotICAgICAgICAgICAgICAgIGludDMyX3QgY2FwYWJpbGl0eSk7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjYXBhYmlsaXR5KSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBvblVpZFByb2NBZGpDaGFuZ2VkKHVpZF90IHVpZCkgb3ZlcnJpZGU7CiAKICAgICAgICAgdm9pZCBhZGRPdmVycmlkZVVpZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlLCBib29sIGFjdGl2ZSk7CiAgICAgICAgIHZvaWQgcmVtb3ZlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSk7CkBAIC02NzUsMTMgKzcyMCwxOCBAQAogICAgICAgICBpbnQzMl90IGdldFByb2NTdGF0ZUxvY2tlZCh1aWRfdCB1aWQpOwogICAgICAgICB2b2lkIHVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCk7CiAKKyAgICAgICAgc3RydWN0IE1vbml0b3JlZFVpZCB7CisgICAgICAgICAgICBpbnQzMl90IHByb2NTdGF0ZTsKKyAgICAgICAgICAgIHNpemVfdCByZWZDb3VudDsKKyAgICAgICAgfTsKKwogICAgICAgICBNdXRleCBtVWlkTG9jazsKICAgICAgICAgYm9vbCBtUmVnaXN0ZXJlZDsKICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyIG1BbTsKICAgICAgICAgd3A8Q2FtZXJhU2VydmljZT4gbVNlcnZpY2U7CiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4gbUFjdGl2ZVVpZHM7Ci0gICAgICAgIC8vIE1vbml0b3JlZCB1aWQgbWFwIHRvIGNhY2hlZCBwcm9jU3RhdGUgYW5kIHJlZkNvdW50IHBhaXIKLSAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8aW50MzJfdCwgc2l6ZV90Pj4gbU1vbml0b3JlZFVpZHM7CisgICAgICAgIC8vIE1vbml0b3JlZCB1aWQgbWFwCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgTW9uaXRvcmVkVWlkPiBtTW9uaXRvcmVkVWlkczsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiBtT3ZlcnJpZGVVaWRzOwogICAgIH07IC8vIGNsYXNzIFVpZFBvbGljeQogCkBAIC02OTcsOSArNzQ3LDEwIEBACiAgICAgICAgICAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CiAKICAgICAgICAgICAgIGJvb2wgaXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpOwotICAgICAgICAgICAgYm9vbCBpc0NhbWVyYVByaXZhY3lFbmFibGVkKHVzZXJpZF90IHVzZXJJZCk7CisgICAgICAgICAgICBib29sIGlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQoKTsKIAotICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpOworICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25TZW5zb3JQcml2YWN5Q2hhbmdlZChpbnQgdG9nZ2xlVHlwZSwgaW50IHNlbnNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKTsKIAogICAgICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOwpAQCAtNzQ1LDcgKzc5Niw3IEBACiAgICAgLy8gT25seSBjYWxsIHdpdGggd2l0aCBtU2VydmljZUxvY2sgaGVsZC4KICAgICBzdGF0dXNfdCBoYW5kbGVFdmljdGlvbnNMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBjbGllbnRQaWQsCiAgICAgICAgIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlQ2FsbGJhY2ssIGNvbnN0IFN0cmluZzgmIHBhY2thZ2VOYW1lLAotICAgICAgICBpbnQgc2NvcmVPZmZzZXQsCisgICAgICAgIGludCBzY29yZU9mZnNldCwgYm9vbCBzeXN0ZW1OYXRpdmVDbGllbnQsCiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQsCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4qIHBhcnRpYWwpOwpAQCAtNzc3LDcgKzgyOCw3IEBACiAgICAgLy8gU2luZ2xlIGltcGxlbWVudGF0aW9uIHNoYXJlZCBiZXR3ZWVuIHRoZSB2YXJpb3VzIGNvbm5lY3QgY2FsbHMKICAgICB0ZW1wbGF0ZTxjbGFzcyBDQUxMQkFDSywgY2xhc3MgQ0xJRU5UPgogICAgIGJpbmRlcjo6U3RhdHVzIGNvbm5lY3RIZWxwZXIoY29uc3Qgc3A8Q0FMTEJBQ0s+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCi0gICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIHNoaW1VcGRhdGVPbmx5LCBpbnQgc2NvcmVPZmZzZXQsIGludCB0YXJnZXRTZGtWZXJzaW9uLAogICAgICAgICAgICAgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSk7CkBAIC04MTAsNiArODYxLDE0IEBACiAgICAgUmluZ0J1ZmZlcjxTdHJpbmc4PiBtRXZlbnRMb2c7CiAgICAgTXV0ZXggbUxvZ0xvY2s7CiAKKyAgICAvLyBzZXQgb2YgY2xpZW50IHBhY2thZ2UgbmFtZXMgdG8gd2F0Y2guIGlmIHRoaXMgc2V0IGNvbnRhaW5zICdhbGwnLCB0aGVuIGFsbCBjbGllbnRzIHdpbGwKKyAgICAvLyBiZSB3YXRjaGVkLiBBY2Nlc3Mgc2hvdWxkIGJlIGd1YXJkZWQgYnkgbUxvZ0xvY2sKKyAgICBzdGQ6OnNldDxTdHJpbmcxNj4gbVdhdGNoZWRDbGllbnRQYWNrYWdlczsKKyAgICAvLyBjYWNoZSBvZiBsYXN0IG1vbml0b3JlZCB0YWdzIGR1bXAgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjbGllbnQgZGlzY29ubmVjdHMuIElmIGEgY2xpZW50CisgICAgLy8gcmUtY29ubmVjdHMsIGl0cyBlbnRyeSBpcyBub3QgdXBkYXRlZCB1bnRpbCBpdCBkaXNjb25uZWN0cyBhZ2Fpbi4gQWNjZXNzIHNob3VsZCBiZSBndWFyZGVkCisgICAgLy8gYnkgbUxvZ0xvY2sKKyAgICBzdGQ6Om1hcDxTdHJpbmcxNiwgc3RkOjpzdHJpbmc+IG1XYXRjaGVkQ2xpZW50c0R1bXBDYWNoZTsKKwogICAgIC8vIFRoZSBsYXN0IG1vbml0b3JlZCB0YWdzIHNldCBieSBjbGllbnQKICAgICBTdHJpbmc4IG1Nb25pdG9yVGFnczsKIApAQCAtODQ2LDcgKzkwNSw3IEBACiAgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgd2l0aCBtU2VydmljZUxvY2sgaGVsZC4KICAgICAgKi8KICAgICB2b2lkIGZpbmlzaENvbm5lY3RMb2NrZWQoY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiBjbGllbnQsIGNvbnN0IERlc2NyaXB0b3JQdHImIGRlc2MsCi0gICAgICAgICAgICBpbnQgb29tU2NvcmVPZmZzZXQpOworICAgICAgICAgICAgaW50IG9vbVNjb3JlT2Zmc2V0LCBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGNhbWVyYSBJZCBzdHJpbmcgbWFwcGVkIHRvIGEgY2FtZXJhIGlkIGludApAQCAtOTQyLDYgKzEwMDEsOCBAQAogICAgICAqLwogICAgIHZvaWQgZHVtcEV2ZW50TG9nKGludCBmZCk7CiAKKyAgICB2b2lkIGNhY2hlQ2xpZW50VGFnRHVtcElmTmVlZGVkKGNvbnN0IGNoYXIgKmNhbWVyYUlkLCBCYXNpY0NsaWVudCAqY2xpZW50KTsKKwogICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYWNxdWlyZSBtU2VydmljZUxvY2sKICAgICAgKi8KQEAgLTEwNTIsNyArMTExMyw3IEBACiAgICAgLy8gZ3VhcmQgbVRvcmNoVWlkTWFwCiAgICAgTXV0ZXggICAgICAgICAgICAgICAgbVRvcmNoVWlkTWFwTXV0ZXg7CiAgICAgLy8gY2FtZXJhIGlkIC0+IHRvcmNoIHN0YXR1cwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzPgorICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFRvcmNoTW9kZVN0YXR1cz4KICAgICAgICAgICAgIG1Ub3JjaFN0YXR1c01hcDsKICAgICAvLyBjYW1lcmEgaWQgLT4gdG9yY2ggY2xpZW50IGJpbmRlcgogICAgIC8vIG9ubHkgc3RvcmUgdGhlIGxhc3QgY2xpZW50IHRoYXQgdHVybnMgb24gZWFjaCBjYW1lcmEncyB0b3JjaCBtb2RlCkBAIC0xMDY2LDE2ICsxMTI3LDE2IEBACiAgICAgLy8gaGFuZGxlIHRvcmNoIG1vZGUgc3RhdHVzIGNoYW5nZSBhbmQgaW52b2tlIGNhbGxiYWNrcy4gbVRvcmNoU3RhdHVzTXV0ZXgKICAgICAvLyBzaG91bGQgYmUgbG9ja2VkLgogICAgIHZvaWQgb25Ub3JjaFN0YXR1c0NoYW5nZWRMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMsCisgICAgICAgICAgICBUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzLAogICAgICAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBzeXN0ZW1DYW1lcmFLaW5kKTsKIAogICAgIC8vIGdldCBhIGNhbWVyYSdzIHRvcmNoIHN0YXR1cy4gbVRvcmNoU3RhdHVzTXV0ZXggc2hvdWxkIGJlIGxvY2tlZC4KICAgICBzdGF0dXNfdCBnZXRUb3JjaFN0YXR1c0xvY2tlZChjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCwKLSAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyAqc3RhdHVzKSBjb25zdDsKKyAgICAgICAgICAgICBUb3JjaE1vZGVTdGF0dXMgKnN0YXR1cykgY29uc3Q7CiAKICAgICAvLyBzZXQgYSBjYW1lcmEncyB0b3JjaCBzdGF0dXMuIG1Ub3JjaFN0YXR1c011dGV4IHNob3VsZCBiZSBsb2NrZWQuCiAgICAgc3RhdHVzX3Qgc2V0VG9yY2hTdGF0dXNMb2NrZWQoY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyBzdGF0dXMpOworICAgICAgICAgICAgVG9yY2hNb2RlU3RhdHVzIHN0YXR1cyk7CiAKICAgICAvLyBub3RpZnkgcGh5c2ljYWwgY2FtZXJhIHN0YXR1cyB3aGVuIHRoZSBwaHlzaWNhbCBjYW1lcmEgaXMgcHVibGljLgogICAgIC8vIEV4cGVjdHMgbVN0YXR1c0xpc3RlbmVyTG9jayB0byBiZSBsb2NrZWQuCkBAIC0xMTM0LDkgKzExOTUsNDMgQEAKICAgICAvLyBTZXQgdGhlIGNhbWVyYSBtdXRlIHN0YXRlCiAgICAgc3RhdHVzX3QgaGFuZGxlU2V0Q2FtZXJhTXV0ZShjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAorICAgIC8vIEhhbmRsZSAnd2F0Y2gnIGNvbW1hbmQgYXMgcGFzc2VkIHRocm91Z2ggJ2NtZCcKKyAgICBzdGF0dXNfdCBoYW5kbGVXYXRjaENvbW1hbmQoY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncywgaW50IGluRmQsIGludCBvdXRGZCk7CisKKyAgICAvLyBFbmFibGUgdGFnIG1vbml0b3Jpbmcgb2YgdGhlIGdpdmVuIHRhZ3MgaW4gcHJvdmlkZWQgY2xpZW50cworICAgIHN0YXR1c190IHN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MsIGludCBvdXRGZCk7CisKKyAgICAvLyBEaXNhYmxlIHRhZyBtb25pdG9yaW5nCisgICAgc3RhdHVzX3Qgc3RvcFdhdGNoaW5nVGFncyhpbnQgb3V0RmQpOworCisgICAgLy8gQ2xlYXJzIG1XYXRjaGVkQ2xpZW50c0R1bXBDYWNoZQorICAgIHN0YXR1c190IGNsZWFyQ2FjaGVkTW9uaXRvcmVkVGFnRHVtcHMoaW50IG91dEZkKTsKKworICAgIC8vIFByaW50IGV2ZW50cyBvZiBtb25pdG9yZWQgdGFncyBpbiBhbGwgY2FjaGVkIGFuZCBhdHRhY2hlZCBjbGllbnRzCisgICAgc3RhdHVzX3QgcHJpbnRXYXRjaGVkVGFncyhpbnQgb3V0RmQpOworCisgICAgLy8gUHJpbnQgZXZlbnRzIG9mIG1vbml0b3JlZCB0YWdzIGluIGFsbCBhdHRhY2hlZCBjbGllbnRzIGFzIHRoZXkgYXJlIGNhcHR1cmVkLiBOZXcgZXZlbnRzIGFyZQorICAgIC8vIGZldGNoZWQgZXZlcnkgYHJlZnJlc2hNaWxsaXNgIG1zCisgICAgLy8gTk9URTogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB0ZXJtaW5hdGUgdW50aWwgdXNlciBwYXNzZXMgJ1xuJyB0byBpbkZkLgorICAgIHN0YXR1c190IHByaW50V2F0Y2hlZFRhZ3NVbnRpbEludGVycnVwdChjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzLCBpbnQgaW5GZCwgaW50IG91dEZkKTsKKworICAgIC8vIFBhcnNlcyBjb21tYSBzZXBhcmF0ZWQgY2xpZW50cyBsaXN0IGFuZCBhZGRzIHRoZW0gdG8gbVdhdGNoZWRDbGllbnRQYWNrYWdlcy4KKyAgICAvLyBEb2VzIG5vdCBhY3F1aXJlIG1Mb2dMb2NrIGJlZm9yZSBtb2RpZnlpbmcgbVdhdGNoZWRDbGllbnRQYWNrYWdlcy4gSXQgaXMgdGhlIGNhbGxlcidzCisgICAgLy8gcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSBtTG9nTG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICAgIHZvaWQgcGFyc2VDbGllbnRzVG9XYXRjaExvY2tlZChTdHJpbmc4IGNsaWVudHMpOworCiAgICAgLy8gUHJpbnRzIHRoZSBzaGVsbCBjb21tYW5kIGhlbHAKICAgICBzdGF0dXNfdCBwcmludEhlbHAoaW50IG91dCk7CiAKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgY2xpZW50IHNob3VsZCBtb25pdG9yIHRhZ3MgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIG1XYXRjaGVkQ2xpZW50UGFja2FnZXMuCisgICAgLy8gQWNxdWlyZXMgbUxvZ0xvY2sgYmVmb3JlIHF1ZXJ5aW5nIG1XYXRjaGVkQ2xpZW50UGFja2FnZXMuCisgICAgYm9vbCBpc0NsaWVudFdhdGNoZWQoY29uc3QgQmFzaWNDbGllbnQgKmNsaWVudCk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgY2xpZW50IHNob3VsZCBtb25pdG9yIHRhZ3MgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIG1XYXRjaGVkQ2xpZW50UGFja2FnZXMuCisgICAgLy8gRG9lcyBub3QgYWNxdWlyZSBtTG9nTG9jayBiZWZvcmUgcXVlcnlpbmcgbVdhdGNoZWRDbGllbnRQYWNrYWdlcy4gSXQgaXMgdGhlIGNhbGxlcidzCisgICAgLy8gcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSBtTG9nTG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9ucy4KKyAgICBib29sIGlzQ2xpZW50V2F0Y2hlZExvY2tlZChjb25zdCBCYXNpY0NsaWVudCAqY2xpZW50KTsKKwogICAgIC8qKgogICAgICAqIEdldCB0aGUgY3VycmVudCBzeXN0ZW0gdGltZSBhcyBhIGZvcm1hdHRlZCBzdHJpbmcuCiAgICAgICovCkBAIC0xMTQ0LDIyICsxMjM5LDI0IEBACiAKICAgICBzdGF0aWMgYmluZGVyOjpTdGF0dXMgbWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGZlYXR1cmVJZCwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBhcGkxQ2FtZXJhSWQsCi0gICAgICAgICAgICBpbnQgZmFjaW5nLCBpbnQgc2Vuc29yT3JpZW50YXRpb24sIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCi0gICAgICAgICAgICAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpOworICAgICAgICAgICAgYm9vbCBzeXN0ZW1OYXRpdmVDbGllbnQsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBmZWF0dXJlSWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGFwaTFDYW1lcmFJZCwgaW50IGZhY2luZywgaW50IHNlbnNvck9yaWVudGF0aW9uLAorICAgICAgICAgICAgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCwKKyAgICAgICAgICAgIHN0ZDo6cGFpcjxpbnQsIElQQ1RyYW5zcG9ydD4gZGV2aWNlVmVyc2lvbkFuZElQQ1RyYW5zcG9ydCwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpOwogCiAgICAgc3RhdHVzX3QgY2hlY2tDYW1lcmFBY2Nlc3MoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwogCiAgICAgc3RhdGljIFN0cmluZzggdG9TdHJpbmcoc3RkOjpzZXQ8dXNlcmlkX3Q+IGludFNldCk7Ci0gICAgc3RhdGljIGludDMyX3QgbWFwVG9JbnRlcmZhY2UoaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMgc3RhdHVzKTsKLSAgICBzdGF0aWMgU3RhdHVzSW50ZXJuYWwgbWFwVG9JbnRlcm5hbChoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpOworICAgIHN0YXRpYyBpbnQzMl90IG1hcFRvSW50ZXJmYWNlKFRvcmNoTW9kZVN0YXR1cyBzdGF0dXMpOworICAgIHN0YXRpYyBTdGF0dXNJbnRlcm5hbCBtYXBUb0ludGVybmFsKENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpOwogICAgIHN0YXRpYyBpbnQzMl90IG1hcFRvSW50ZXJmYWNlKFN0YXR1c0ludGVybmFsIHN0YXR1cyk7CiAKIAogICAgIHZvaWQgYnJvYWRjYXN0VG9yY2hNb2RlU3RhdHVzKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBzeXN0ZW1DYW1lcmFLaW5kKTsKKyAgICAgICAgICAgIFRvcmNoTW9kZVN0YXR1cyBzdGF0dXMsIFN5c3RlbUNhbWVyYUtpbmQgc3lzdGVtQ2FtZXJhS2luZCk7CisKKyAgICB2b2lkIGJyb2FkY2FzdFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50MzJfdCBuZXdUb3JjaFN0cmVuZ3RoTGV2ZWwpOwogCiAgICAgdm9pZCBkaXNjb25uZWN0Q2xpZW50KGNvbnN0IFN0cmluZzgmIGlkLCBzcDxCYXNpY0NsaWVudD4gY2xpZW50VG9EaXNjb25uZWN0KTsKIApAQCAtMTE2Nyw2ICsxMjY0LDEwIEBACiAgICAgLy8gVXNlIHNlcGFyYXRlIGtleXMgZm9yIG9mZmxpbmUgZGV2aWNlcy4KICAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBrT2ZmbGluZURldmljZTsKIAorICAgIC8vIFNlbnRpbmVsIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiBgbVdhdGNoZWRDbGllbnRzUGFja2FnZXNgIHRvIGluZGljYXRlIHRoYXQgYWxsIGNsaWVudHMgc2hvdWxkCisgICAgLy8gYmUgd2F0Y2hlZC4KKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYga1dhdGNoQWxsQ2xpZW50c0ZsYWc7CisKICAgICAvLyBUT0RPOiByaWdodCBub3cgZWFjaCBCYXNpY0NsaWVudCBob2xkcyBvbmUgQXBwT3BzTWFuYWdlciBpbnN0YW5jZS4KICAgICAvLyBXZSBjYW4gcmVmYWN0b3IgdGhlIGNvZGUgc28gYWxsIG9mIGNsaWVudHMgc2hhcmUgdGhpcyBpbnN0YW5jZQogICAgIEFwcE9wc01hbmFnZXIgbUFwcE9wczsKQEAgLTExOTQsNyArMTI5NSw3IEBACiAKICAgICAgICAgICAgIHZvaWQgYWRkTGlzdGVuZXIoY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFJbmplY3Rpb25DYWxsYmFjaz4mIGNhbGxiYWNrKTsKICAgICAgICAgICAgIHZvaWQgcmVtb3ZlTGlzdGVuZXIoKTsKLSAgICAgICAgICAgIHZvaWQgbm90aWZ5SW5qZWN0aW9uRXJyb3IoaW50IGVycm9yQ29kZSk7CisgICAgICAgICAgICB2b2lkIG5vdGlmeUluamVjdGlvbkVycm9yKFN0cmluZzggaW5qZWN0ZWRDYW1JZCwgc3RhdHVzX3QgZXJyKTsKIAogICAgICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwpAQCAtMTIyMSw3ICsxMzIyLDIyIEBACiAgICAgICAgICAgICB3cDxDYW1lcmFTZXJ2aWNlPiBtUGFyZW50OwogICAgIH07CiAKLSAgICB2b2lkIHN0b3BJbmplY3Rpb25JbXBsKCk7CisgICAgLy8gV2hlbiBpbmplY3RpbmcgdGhlIGNhbWVyYSwgaXQgd2lsbCBjaGVjayB3aGV0aGVyIHRoZSBpbmplY3RpbmcgY2FtZXJhIHN0YXR1cyBpcyB1bmF2YWlsYWJsZS4KKyAgICAvLyBJZiBpdCBpcywgdGhlIGRpc2Nvbm5lY3QgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgdG8gdG8gcHJldmVudCBjYW1lcmEgYWNjZXNzIG9uIHRoZSBkZXZpY2UuCisgICAgc3RhdHVzX3QgY2hlY2tJZkluamVjdGlvbkNhbWVyYUlzUHJlc2VudChjb25zdCBTdHJpbmc4JiBleHRlcm5hbENhbUlkLAorICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFNwKTsKKworICAgIHZvaWQgY2xlYXJJbmplY3Rpb25QYXJhbWV0ZXJzKCk7CisKKyAgICAvLyBUaGlzIGlzIHRoZSBleGlzdGluZyBjYW1lcmEgaWQgYmVpbmcgcmVwbGFjZWQuCisgICAgU3RyaW5nOCBtSW5qZWN0aW9uSW50ZXJuYWxDYW1JZDsKKyAgICAvLyBUaGlzIGlzIHRoZSBleHRlcm5hbCBjYW1lcmEgSWQgcmVwbGFjaW5nIHRoZSBpbnRlcm5hbElkLgorICAgIFN0cmluZzggbUluamVjdGlvbkV4dGVybmFsQ2FtSWQ7CisgICAgYm9vbCBtSW5qZWN0aW9uSW5pdFBlbmRpbmcgPSBmYWxzZTsKKyAgICAvLyBHdWFyZCBtSW5qZWN0aW9uSW50ZXJuYWxDYW1JZCBhbmQgbUluamVjdGlvbkluaXRQZW5kaW5nLgorICAgIE11dGV4IG1JbmplY3Rpb25QYXJhbWV0ZXJzTG9jazsKKworICAgIHZvaWQgdXBkYXRlVG9yY2hVaWRNYXBMb2NrZWQoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBpbnQgdWlkKTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2VXYXRjaGRvZy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlV2F0Y2hkb2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNjk2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlV2F0Y2hkb2cuY3BwCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNlcnZpY2VXYXRjaGRvZyIKKworI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2VXYXRjaGRvZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgQ2FtZXJhU2VydmljZVdhdGNoZG9nOjp0aHJlYWRMb29wKCkKK3sKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtV2F0Y2hkb2dMb2NrKTsKKworICAgICAgICB3aGlsZSAobVBhdXNlKSB7CisgICAgICAgICAgICBtV2F0Y2hkb2dDb25kaXRpb24ud2FpdChtV2F0Y2hkb2dMb2NrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKG1DeWNsZUxlbmd0aE1zKSk7CisKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtV2F0Y2hkb2dMb2NrKTsKKworICAgICAgICBmb3IgKGF1dG8gaXQgPSB0aWRUb0N5Y2xlQ291bnRlck1hcC5iZWdpbigpOyBpdCAhPSB0aWRUb0N5Y2xlQ291bnRlck1hcC5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgdWludDMyX3QgY3VycmVudFRocmVhZElkID0gaXQtPmZpcnN0OworCisgICAgICAgICAgICB0aWRUb0N5Y2xlQ291bnRlck1hcFtjdXJyZW50VGhyZWFkSWRdKys7CisKKyAgICAgICAgICAgIGlmICh0aWRUb0N5Y2xlQ291bnRlck1hcFtjdXJyZW50VGhyZWFkSWRdID49IG1NYXhDeWNsZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ2FtZXJhU2VydmljZVdhdGNoZG9nIHRyaWdnZXJpbmcgYWJvcnQgZm9yIHBpZDogJWQiLCBnZXRwaWQoKSk7CisgICAgICAgICAgICAgICAgLy8gV2UgdXNlIGFib3J0IGhlcmUgc28gd2UgY2FuIGdldCBhIHRvbWJzdG9uZSBmb3IgYmV0dGVyCisgICAgICAgICAgICAgICAgLy8gZGVidWdnaW5nLgorICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlV2F0Y2hkb2c6OnJlcXVlc3RFeGl0KCkKK3sKKyAgICBUaHJlYWQ6OnJlcXVlc3RFeGl0KCk7CisKKyAgICBBdXRvTXV0ZXggX2wobVdhdGNoZG9nTG9jayk7CisKKyAgICB0aWRUb0N5Y2xlQ291bnRlck1hcC5jbGVhcigpOworCisgICAgaWYgKG1QYXVzZSkgeworICAgICAgICBtUGF1c2UgPSBmYWxzZTsKKyAgICAgICAgbVdhdGNoZG9nQ29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlV2F0Y2hkb2c6OnN0b3AodWludDMyX3QgdGlkKQoreworICAgIEF1dG9NdXRleCBfbChtV2F0Y2hkb2dMb2NrKTsKKworICAgIHRpZFRvQ3ljbGVDb3VudGVyTWFwLmVyYXNlKHRpZCk7CisKKyAgICBpZiAodGlkVG9DeWNsZUNvdW50ZXJNYXAuZW1wdHkoKSkgeworICAgICAgICBtUGF1c2UgPSB0cnVlOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlV2F0Y2hkb2c6OnN0YXJ0KHVpbnQzMl90IHRpZCkKK3sKKyAgICBBdXRvTXV0ZXggX2wobVdhdGNoZG9nTG9jayk7CisKKyAgICB0aWRUb0N5Y2xlQ291bnRlck1hcFt0aWRdID0gMDsKKworICAgIGlmIChtUGF1c2UpIHsKKyAgICAgICAgbVBhdXNlID0gZmFsc2U7CisgICAgICAgIG1XYXRjaGRvZ0NvbmRpdGlvbi5zaWduYWwoKTsKKyAgICB9Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZVdhdGNoZG9nLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlV2F0Y2hkb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDk1NWUyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZVdhdGNoZG9nLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFRoZSBDYW1lcmFTZXJ2aWNlIHdhdGNoZG9nIGlzIHVzZWQgdG8gaGVscCBkZXRlY3QgYmFkIHN0YXRlcyBpbiB0aGUKKyAqIENhbWVyYSBIQUwuIFRoZSB0aHJlYWRsb29wIHVzZXMgY3ljbGUgY291bnRlcnMsIGFzc2lnbmVkIHRvIGVhY2ggY2FsbGluZworICogdGhyZWFkLCB0byBtb25pdG9yIHRoZSBlbGFwc2luZyB0aW1lIGFuZCBraWxscyB0aGUgcHJvY2VzcyB3aGVuIHRoZQorICogZXhwZWN0ZWQgZHVyYXRpb24gaGFzIGV4Y2VlZGVkLgorICogTm90ZXMgb24gbXVsdGktdGhyZWFkZWQgYmVoYXZpb3JzOgorICogICAgLSBUaGUgdGhyZWFkbG9vcCBpcyBibG9ja2VkL3BhdXNlZCB3aGVuIHRoZXJlIGFyZSBubyBjYWxscyBiZWluZworICogICBtb25pdG9yZWQuCisgKiAgIC0gVGhlIHN0YXJ0IGFuZCBzdG9wIGZ1bmN0aW9ucyBoYW5kbGUgc2ltdWx0YW5lb3VzIGNhbGwgbW9uaXRvcmluZworICogICBhbmQgc2luZ2xlIGNhbGwgbW9uaXRvcmluZyBkaWZmZXJlbnRseS4gU2VlIGZ1bmN0aW9uIGRvY3VtZW50YXRpb24gZm9yCisgKiAgIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworLy8gVXNlZCB0byB3cmFwIHRoZSBjYWxsIG9mIGludGVyZXN0IGluIHN0YXJ0IGFuZCBzdG9wIGNhbGxzCisjZGVmaW5lIFdBVENIKHRvTW9uaXRvcikgd2F0Y2hUaHJlYWQoWyZdKCkgeyByZXR1cm4gdG9Nb25pdG9yO30sIGdldHRpZCgpKQorI2RlZmluZSBXQVRDSF9DVVNUT01fVElNRVIodG9Nb25pdG9yLCBjeWNsZXMsIGN5Y2xlTGVuZ3RoKSBcCisgICAgICAgIHdhdGNoVGhyZWFkKFsmXSgpIHsgcmV0dXJuIHRvTW9uaXRvcjt9LCBnZXR0aWQoKSwgY3ljbGVzLCBjeWNsZUxlbmd0aCk7CisKKy8vIERlZmF1bHQgY3ljbGVzIGFuZCBjeWNsZSBsZW5ndGggdmFsdWVzIHVzZWQgdG8gY2FsY3VsYXRlIHBlcm1pdHRlZCBlbGFwc2VkIHRpbWUKK2NvbnN0IHN0YXRpYyBzaXplX3QgICBrTWF4Q3ljbGVzICAgICA9IDEwMDsKK2NvbnN0IHN0YXRpYyB1aW50MzJfdCBrQ3ljbGVMZW5ndGhNcyA9IDEwMDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDYW1lcmFTZXJ2aWNlV2F0Y2hkb2cgOiBwdWJsaWMgVGhyZWFkIHsKKworcHVibGljOgorICAgIGV4cGxpY2l0IENhbWVyYVNlcnZpY2VXYXRjaGRvZygpIDogbVBhdXNlKHRydWUpLCBtTWF4Q3ljbGVzKGtNYXhDeWNsZXMpLAorICAgICAgICAgICAgbUN5Y2xlTGVuZ3RoTXMoa0N5Y2xlTGVuZ3RoTXMpIHt9OworCisgICAgZXhwbGljaXQgQ2FtZXJhU2VydmljZVdhdGNoZG9nIChzaXplX3QgbWF4Q3ljbGVzLCB1aW50MzJfdCBjeWNsZUxlbmd0aE1zKSA6CisgICAgICAgICAgICBtUGF1c2UodHJ1ZSksIG1NYXhDeWNsZXMobWF4Q3ljbGVzKSwgbUN5Y2xlTGVuZ3RoTXMoY3ljbGVMZW5ndGhNcykge307CisKKyAgICB2aXJ0dWFsIH5DYW1lcmFTZXJ2aWNlV2F0Y2hkb2coKSB7fTsKKworICAgIHZpcnR1YWwgdm9pZCByZXF1ZXN0RXhpdCgpOworCisgICAgLyoqIFVzZWQgdG8gd3JhcCBtb25pdG9yZWQgY2FsbHMgaW4gc3RhcnQgYW5kIHN0b3AgZnVuY3Rpb25zIHVzaW5nIGN1c3RvbSB0aW1lciB2YWx1ZXMgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGF1dG8gd2F0Y2hUaHJlYWQoVCBmdW5jLCB1aW50MzJfdCB0aWQsIHVpbnQzMl90IGN5Y2xlcywgdWludDMyX3QgY3ljbGVMZW5ndGgpIHsKKyAgICAgICAgYXV0byByZXMgPSBOVUxMOworCisgICAgICAgIGlmIChjeWNsZXMgIT0gbU1heEN5Y2xlcyB8fCBjeWNsZUxlbmd0aCAhPSBtQ3ljbGVMZW5ndGhNcykgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlIHdhdGNoZG9nIHRvIHByZXZlbnQgZGlzcnVwdGlvbgorICAgICAgICAgICAgLy8gb2YgdGltZXIgZm9yIGN1cnJlbnQgbW9uaXRvcmVkIGNhbGxzCisgICAgICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlV2F0Y2hkb2c+IHRlbXBXYXRjaGRvZyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBDYW1lcmFTZXJ2aWNlV2F0Y2hkb2coY3ljbGVzLCBjeWNsZUxlbmd0aCk7CisgICAgICAgICAgICB0ZW1wV2F0Y2hkb2ctPnJ1bigiQ2FtZXJhU2VydmljZVdhdGNoZG9nIik7CisgICAgICAgICAgICByZXMgPSB0ZW1wV2F0Y2hkb2ctPndhdGNoVGhyZWFkKGZ1bmMsIHRpZCk7CisgICAgICAgICAgICB0ZW1wV2F0Y2hkb2ctPnJlcXVlc3RFeGl0KCk7CisgICAgICAgICAgICB0ZW1wV2F0Y2hkb2cuY2xlYXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIGN1c3RvbSB0aW1lciB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQgdG8gc2V0IGNsYXNzIHRpbWVyIHZhbHVlcywgdXNlCisgICAgICAgICAgICAvLyBjdXJyZW50IHRocmVhZAorICAgICAgICAgICAgcmVzID0gd2F0Y2hUaHJlYWQoZnVuYywgdGlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLyoqIFVzZWQgdG8gd3JhcCBtb25pdG9yZWQgY2FsbHMgaW4gc3RhcnQgYW5kIHN0b3AgZnVuY3Rpb25zIHVzaW5nIGNsYXNzIHRpbWVyIHZhbHVlcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgYXV0byB3YXRjaFRocmVhZChUIGZ1bmMsIHVpbnQzMl90IHRpZCkgeworICAgICAgICBhdXRvIHJlcyA9IE5VTEw7CisKKyAgICAgICAgc3RhcnQodGlkKTsKKyAgICAgICAgcmVzID0gZnVuYygpOworICAgICAgICBzdG9wKHRpZCk7CisKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBhZGRzIGEgY3ljbGUgY291bnRlciBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkLiBXaGVuIHRocmVhZGxvb3AgaXMgYmxvY2tlZC9wYXVzZWQsCisgICAgICogc3RhcnQoKSB1bmJsb2NrcyBhbmQgc3RhcnRzIHRoZSB3YXRjaGRvZworICAgICAqLworICAgIHZvaWQgc3RhcnQodWludDMyX3QgdGlkKTsKKworICAgIC8qKgorICAgICAqIElmIHRoZXJlIGFyZSBubyBjYWxscyBsZWZ0IHRvIGJlIG1vbml0b3JlZCwgc3RvcCBibG9ja3MvcGF1c2VzIHRocmVhZGxvb3AKKyAgICAgKiBvdGhlcndpc2Ugc3RvcCgpIGVyYXNlcyB0aGUgY3ljbGUgY291bnRlciB0byBlbmQgd2F0Y2hkb2cgZm9yIHRoZSBjYWxsaW5nIHRocmVhZAorICAgICAqLworICAgIHZvaWQgc3RvcCh1aW50MzJfdCB0aWQpOworCisgICAgdmlydHVhbCBib29sICAgIHRocmVhZExvb3AoKTsKKworICAgIE11dGV4ICAgICAgICAgICBtV2F0Y2hkb2dMb2NrOyAgICAgICAgLy8gTG9jayBmb3IgY29uZGl0aW9uIHZhcmlhYmxlCisgICAgQ29uZGl0aW9uICAgICAgIG1XYXRjaGRvZ0NvbmRpdGlvbjsgICAvLyBDb25kaXRpb24gdmFyaWFibGUgZm9yIHN0b3Avc3RhcnQKKyAgICBib29sICAgICAgICAgICAgbVBhdXNlOyAgICAgICAgICAgICAgIC8vIFRydWUgaWYgdGhyZWFkIGlzIGN1cnJlbnRseSBwYXVzZWQKKyAgICB1aW50MzJfdCAgICAgICAgbU1heEN5Y2xlczsgICAgICAgICAgIC8vIE1heCBjeWNsZXMKKyAgICB1aW50MzJfdCAgICAgICAgbUN5Y2xlTGVuZ3RoTXM7ICAgICAgIC8vIExlbmd0aCBvZiB0aW1lIGVsYXBzZWQgcGVyIGN5Y2xlCisKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIHVpbnQzMl90PiB0aWRUb0N5Y2xlQ291bnRlck1hcDsgLy8gVGhyZWFkIElkIHRvIGN5Y2xlIGNvdW50ZXIgbWFwCit9OworCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCmluZGV4IDk0NGI4YWIuLjY4ZGM3ZjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KQEAgLTMzLDYgKzM0LDcgQEAKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oIgogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oIgogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJkZXZpY2UzL1JvdGF0ZUFuZENyb3BNYXBwZXIuaCIKICNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaCIKIApAQCAtNjAsMTMgKzYyLDE4IEBACiAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgaW50IHNlcnZpY2VQaWQsCiAgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpOgotICAgICAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRGZWF0dXJlSWQsCi0gICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlSWQsIGFwaTFDYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBzZW5zb3JPcmllbnRhdGlvbiwKLSAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpLAorICAgICAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgIGZhbHNlLypzeXN0ZW1OYXRpdmVDbGllbnQgLSBzaW5jZSBubyBuZGsgZm9yIGFwaTEqLywgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgICAgIGNhbWVyYURldmljZUlkLCBhcGkxQ2FtZXJhSWQsIGNhbWVyYUZhY2luZywgc2Vuc29yT3JpZW50YXRpb24sIGNsaWVudFBpZCwKKyAgICAgICAgICAgICAgICBjbGllbnRVaWQsIHNlcnZpY2VQaWQsIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCAvKmxlZ2FjeUNsaWVudCovIHRydWUpLAogICAgICAgICBtUGFyYW1ldGVycyhhcGkxQ2FtZXJhSWQsIGNhbWVyYUZhY2luZykKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCisgICAgbVJvdGF0ZUFuZENyb3BNb2RlID0gQU5EUk9JRF9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QX05PTkU7CisgICAgbVJvdGF0ZUFuZENyb3BJc1N1cHBvcnRlZCA9IGZhbHNlOworICAgIG1Sb3RhdGVBbmRDcm9wUHJldmlld1RyYW5zZm9ybSA9IDA7CisKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogICAgIGwubVBhcmFtZXRlcnMuc3RhdGUgPSBQYXJhbWV0ZXJzOjpESVNDT05ORUNURUQ7CiB9CkBAIC0xMDUsNyArMTEyLDcgQEAKICAgICB7CiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAKLSAgICAgICAgcmVzID0gbC5tUGFyYW1ldGVycy5pbml0aWFsaXplKG1EZXZpY2UuZ2V0KCksIG1EZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgcmVzID0gbC5tUGFyYW1ldGVycy5pbml0aWFsaXplKG1EZXZpY2UuZ2V0KCkpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogdW5hYmxlIHRvIGJ1aWxkIGRlZmF1bHRzOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTE1LDYgKzEyMiwxNCBAQAogICAgICAgICBsLm1QYXJhbWV0ZXJzLmlzRGV2aWNlWnNsU3VwcG9ydGVkID0gaXNac2xFbmFibGVkSW5TdGlsbFRlbXBsYXRlKCk7CiAgICAgfQogCisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8gPSBtRGV2aWNlLT5pbmZvKCk7CisgICAgbVJvdGF0ZUFuZENyb3BJc1N1cHBvcnRlZCA9IGNhbWVyYTM6OlJvdGF0ZUFuZENyb3BNYXBwZXI6OmlzTmVlZGVkKCZzdGF0aWNJbmZvKTsKKyAgICAvLyBUaGUgJ21Sb3RhdGVBbmRDcm9wTW9kZScgdmFsdWUgb25seSBhY2NvdW50cyBmb3IgdGhlIG5lY2Vzc2FyeSBhZGp1c3RtZW50CisgICAgLy8gd2hlbiB0aGUgZGlzcGxheSByb3RhdGVzLiBUaGUgc2Vuc29yIG9yaWVudGF0aW9uIHN0aWxsIG5lZWRzIHRvIGJlIGNhbGN1bGF0ZWQKKyAgICAvLyBhbmQgYXBwbGllZCBzaW1pbGFyIHRvIHRoZSBDYW1lcmEyIHBhdGguCisgICAgQ2FtZXJhVXRpbHM6OmdldFJvdGF0aW9uVHJhbnNmb3JtKHN0YXRpY0luZm8sIE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX0FVVE8sCisgICAgICAgICAgICAmbVJvdGF0ZUFuZENyb3BQcmV2aWV3VHJhbnNmb3JtKTsKKwogICAgIFN0cmluZzggdGhyZWFkTmFtZTsKIAogICAgIG1TdHJlYW1pbmdQcm9jZXNzb3IgPSBuZXcgU3RyZWFtaW5nUHJvY2Vzc29yKHRoaXMpOwpAQCAtMTY3NCw2ICsxNjg5LDE0IEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGRlZ3JlZXMpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBpY2wobVJvdGF0ZUFuZENyb3BMb2NrKTsKKyAgICAgICAgaWYgKG1Sb3RhdGVBbmRDcm9wTW9kZSAhPSBBTkRST0lEX1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfTk9ORSkgeworICAgICAgICAgICAgQUxPR0koIiVzOiBSb3RhdGUgYW5kIGNyb3Agc2V0IHRvOiAlZCwgc2tpcHBpbmcgZGlzcGxheSBvcmllbnRhdGlvbiEiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIG1Sb3RhdGVBbmRDcm9wTW9kZSk7CisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBtUm90YXRlQW5kQ3JvcFByZXZpZXdUcmFuc2Zvcm07CisgICAgICAgIH0KKyAgICB9CiAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICBpZiAodHJhbnNmb3JtICE9IGwubVBhcmFtZXRlcnMucHJldmlld1RyYW5zZm9ybSAmJgogICAgICAgICAgICAgZ2V0UHJldmlld1N0cmVhbUlkKCkgIT0gTk9fU1RSRUFNKSB7CkBAIC0yMjk2LDYgKzIzMTksMTYgQEAKIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OnNldFJvdGF0ZUFuZENyb3BPdmVycmlkZSh1aW50OF90IHJvdGF0ZUFuZENyb3ApIHsKICAgICBpZiAocm90YXRlQW5kQ3JvcCA+IEFORFJPSURfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUF9BVVRPKSByZXR1cm4gQkFEX1ZBTFVFOwogCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1Sb3RhdGVBbmRDcm9wTG9jayk7CisgICAgICAgIGlmIChtUm90YXRlQW5kQ3JvcElzU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBtUm90YXRlQW5kQ3JvcE1vZGUgPSByb3RhdGVBbmRDcm9wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJvdGF0ZUFuZENyb3BNb2RlID0gQU5EUk9JRF9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QX05PTkU7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gbURldmljZS0+c2V0Um90YXRlQW5kQ3JvcEF1dG9CZWhhdmlvcigKICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfcm90YXRlX2FuZF9jcm9wX3Q+KHJvdGF0ZUFuZENyb3ApKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKaW5kZXggNjRhYjhmZi4uYzhkZmM0NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKQEAgLTIzOCw2ICsyMzgsMTUgQEAKICAgICBzdGF0dXNfdCBpbml0aWFsaXplSW1wbChUUHJvdmlkZXJQdHIgcHJvdmlkZXJQdHIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKTsKIAogICAgIGJvb2wgaXNac2xFbmFibGVkSW5TdGlsbFRlbXBsYXRlKCk7CisgICAgLy8gVGhlIGN1cnJlbnQgcm90YXRlICYgY3JvcCBtb2RlIHBhc3NlZCBieSBjYW1lcmEgc2VydmljZQorICAgIHVpbnQ4X3QgbVJvdGF0ZUFuZENyb3BNb2RlOworICAgIC8vIFN5bmNocm9uaXplIGFjY2VzcyB0byAnbVJvdGF0ZUFuZENyb3BNb2RlJworICAgIG11dGFibGUgTXV0ZXggbVJvdGF0ZUFuZENyb3BMb2NrOworICAgIC8vIENvbnRhaW5zIHRoZSBwcmV2aWV3IHN0cmVhbSB0cmFuc2Zvcm1hdGlvbiB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIGFwcGxpZWQKKyAgICAvLyB3aGVuIHRoZSBkaXNwbGF5IHJvdGF0aW9uIGlzIDAKKyAgICBpbnQgbVJvdGF0ZUFuZENyb3BQcmV2aWV3VHJhbnNmb3JtOworICAgIC8vIEZsYWcgaW5kaWNhdGluZyBjYW1lcmEgZGV2aWNlIHN1cHBvcnQgZm9yIHRoZSByb3RhdGUgJiBjcm9wIGludGVyZmFjZQorICAgIGJvb2wgbVJvdGF0ZUFuZENyb3BJc1N1cHBvcnRlZDsKIAogICAgIG11dGFibGUgTXV0ZXggbUxhdGVzdFJlcXVlc3RNdXRleDsKICAgICBDb25kaXRpb24gbUxhdGVzdFJlcXVlc3RTaWduYWw7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKaW5kZXggZWVkMjY1NC4uNDY3MTA4ZCAxMDA3NTUKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcApAQCAtMjAsNiArMjAsOSBAQAogCiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvQ2FtZXJhQmxvYi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0NhbWVyYUJsb2JJZC5oPgorCiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTM2LDYgKzM5LDggQEAKIG5hbWVzcGFjZSBjYW1lcmEyIHsKIAogdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Q0FNRVJBX1NUUkVBTV9ST1RBVElPTl8wOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFCbG9iOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFCbG9iSWQ7CiAKIEpwZWdQcm9jZXNzb3I6OkpwZWdQcm9jZXNzb3IoCiAgICAgc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50LApAQCAtNzgsNyArODMsOCBAQAogICAgIH0KIAogICAgIC8vIEZpbmQgb3V0IGJ1ZmZlciBzaXplIGZvciBKUEVHCi0gICAgc3NpemVfdCBtYXhKcGVnU2l6ZSA9IGRldmljZS0+Z2V0SnBlZ0J1ZmZlclNpemUocGFyYW1zLnBpY3R1cmVXaWR0aCwgcGFyYW1zLnBpY3R1cmVIZWlnaHQpOworICAgIHNzaXplX3QgbWF4SnBlZ1NpemUgPSBkZXZpY2UtPmdldEpwZWdCdWZmZXJTaXplKGRldmljZS0+aW5mb1BoeXNpY2FsKFN0cmluZzgoIiIpKSwKKyAgICAgICAgICAgIHBhcmFtcy5waWN0dXJlV2lkdGgsIHBhcmFtcy5waWN0dXJlSGVpZ2h0KTsKICAgICBpZiAobWF4SnBlZ1NpemUgPD0gMCkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogSnBlZyBidWZmZXIgc2l6ZSAoJXp1KSBpcyBpbnZhbGlkICIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1heEpwZWdTaXplKTsKQEAgLTM0OSwxMSArMzU1LDExIEBACiAgICAgc2l6ZV90IHNpemU7CiAKICAgICAvLyBGaXJzdCBjaGVjayBmb3IgSlBFRyB0cmFuc3BvcnQgaGVhZGVyIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgotICAgIHVpbnQ4X3QgKmhlYWRlciA9IGpwZWdCdWZmZXIgKyAobWF4U2l6ZSAtIHNpemVvZihzdHJ1Y3QgY2FtZXJhMl9qcGVnX2Jsb2IpKTsKLSAgICBzdHJ1Y3QgY2FtZXJhMl9qcGVnX2Jsb2IgKmJsb2IgPSAoc3RydWN0IGNhbWVyYTJfanBlZ19ibG9iKikoaGVhZGVyKTsKLSAgICBpZiAoYmxvYi0+anBlZ19ibG9iX2lkID09IENBTUVSQTJfSlBFR19CTE9CX0lEKSB7Ci0gICAgICAgIHNpemUgPSBibG9iLT5qcGVnX3NpemU7Ci0gICAgICAgIGlmIChzaXplID4gMCAmJiBzaXplIDw9IG1heFNpemUgLSBzaXplb2Yoc3RydWN0IGNhbWVyYTJfanBlZ19ibG9iKSkgeworICAgIHVpbnQ4X3QgKmhlYWRlciA9IGpwZWdCdWZmZXIgKyAobWF4U2l6ZSAtIHNpemVvZihDYW1lcmFCbG9iKSk7CisgICAgQ2FtZXJhQmxvYiAqYmxvYiA9IChDYW1lcmFCbG9iKikoaGVhZGVyKTsKKyAgICBpZiAoYmxvYi0+YmxvYklkID09IENhbWVyYUJsb2JJZDo6SlBFRykgeworICAgICAgICBzaXplID0gYmxvYi0+YmxvYlNpemVCeXRlczsKKyAgICAgICAgaWYgKHNpemUgPiAwICYmIHNpemUgPD0gbWF4U2l6ZSAtIHNpemVvZihDYW1lcmFCbG9iKSkgewogICAgICAgICAgICAgLy8gVmVyaWZ5IFNPSSBhbmQgRU9JIG1hcmtlcnMKICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSBzaXplIC0gTUFSS0VSX0xFTkdUSDsKICAgICAgICAgICAgIHVpbnQ4X3QgKmVuZCA9IGpwZWdCdWZmZXIgKyBvZmZzZXQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKaW5kZXggODA1MDhlNC4uMTIzY2Q3NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcApAQCAtNTAsNyArNTAsNyBAQAogUGFyYW1ldGVyczo6flBhcmFtZXRlcnMoKSB7CiB9CiAKLXN0YXR1c190IFBhcmFtZXRlcnM6OmluaXRpYWxpemUoQ2FtZXJhRGV2aWNlQmFzZSAqZGV2aWNlLCBpbnQgZGV2aWNlVmVyc2lvbikgeworc3RhdHVzX3QgUGFyYW1ldGVyczo6aW5pdGlhbGl6ZShDYW1lcmFEZXZpY2VCYXNlICpkZXZpY2UpIHsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogZGV2aWNlIGlzIG51bGwhIiwgX19GVU5DVElPTl9fKTsKQEAgLTYzLDcgKzYzLDYgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgUGFyYW1ldGVyczo6aW5mbyA9ICZpbmZvOwotICAgIG1EZXZpY2VWZXJzaW9uID0gZGV2aWNlVmVyc2lvbjsKIAogICAgIHJlcyA9IGJ1aWxkRmFzdEluZm8oZGV2aWNlKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwpAQCAtNzUsMjMgKzc0LDQzIEBACiAgICAgLy8gVHJlYXQgdGhlIEguMjY0IG1heCBzaXplIGFzIHRoZSBtYXggc3VwcG9ydGVkIHZpZGVvIHNpemUuCiAgICAgTWVkaWFQcm9maWxlcyAqdmlkZW9FbmNvZGVyUHJvZmlsZXMgPSBNZWRpYVByb2ZpbGVzOjpnZXRJbnN0YW5jZSgpOwogICAgIFZlY3Rvcjx2aWRlb19lbmNvZGVyPiBlbmNvZGVycyA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJzKCk7CisgICAgaW50MzJfdCBtaW5WaWRlb1dpZHRoID0gTUFYX1BSRVZJRVdfV0lEVEg7CisgICAgaW50MzJfdCBtaW5WaWRlb0hlaWdodCA9IE1BWF9QUkVWSUVXX0hFSUdIVDsKICAgICBpbnQzMl90IG1heFZpZGVvV2lkdGggPSAwOwogICAgIGludDMyX3QgbWF4VmlkZW9IZWlnaHQgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW5jb2RlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaW50IHdpZHRoID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICBpbnQgdzAgPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgImVuYy52aWQud2lkdGgubWluIiwgZW5jb2RlcnNbaV0pOworICAgICAgICBpbnQgaDAgPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgImVuYy52aWQuaGVpZ2h0Lm1pbiIsIGVuY29kZXJzW2ldKTsKKyAgICAgICAgaW50IHcxID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAogICAgICAgICAgICAgICAgICJlbmMudmlkLndpZHRoLm1heCIsIGVuY29kZXJzW2ldKTsKLSAgICAgICAgaW50IGhlaWdodCA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKKyAgICAgICAgaW50IGgxID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAogICAgICAgICAgICAgICAgICJlbmMudmlkLmhlaWdodC5tYXgiLCBlbmNvZGVyc1tpXSk7Ci0gICAgICAgIC8vIFRyZWF0IHdpZHRoL2hlaWdodCBzZXBhcmF0ZWx5IGhlcmUgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGRpZmZlcmVudAotICAgICAgICAvLyBwcm9maWxlIG1pZ2h0IHJlcG9ydCBtYXggc2l6ZSBvZiBkaWZmZXJlbnQgYXNwZWN0IHJhdGlvCi0gICAgICAgIGlmICh3aWR0aCA+IG1heFZpZGVvV2lkdGgpIHsKLSAgICAgICAgICAgIG1heFZpZGVvV2lkdGggPSB3aWR0aDsKKyAgICAgICAgLy8gQXNzdW1lIHRoZSBtaW4gc2l6ZSBpcyAwIGlmIGl0J3Mgbm90IHJlcG9ydGVkIGJ5IGVuY29kZXIKKyAgICAgICAgaWYgKHcwID09IC0xKSB7CisgICAgICAgICAgICB3MCA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGhlaWdodCA+IG1heFZpZGVvSGVpZ2h0KSB7Ci0gICAgICAgICAgICBtYXhWaWRlb0hlaWdodCA9IGhlaWdodDsKKyAgICAgICAgaWYgKGgwID09IC0xKSB7CisgICAgICAgICAgICBoMCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gVHJlYXQgd2lkdGgvaGVpZ2h0IHNlcGFyYXRlbHkgaGVyZSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgZGlmZmVyZW50CisgICAgICAgIC8vIHByb2ZpbGUgbWlnaHQgcmVwb3J0IG1pbi9tYXggc2l6ZSBvZiBkaWZmZXJlbnQgYXNwZWN0IHJhdGlvCisgICAgICAgIGlmICh3MCA8IG1pblZpZGVvV2lkdGgpIHsKKyAgICAgICAgICAgIG1pblZpZGVvV2lkdGggPSB3MDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaDAgPCBtaW5WaWRlb0hlaWdodCkgeworICAgICAgICAgICAgbWluVmlkZW9IZWlnaHQgPSBoMDsKKyAgICAgICAgfQorICAgICAgICBpZiAodzEgPiBtYXhWaWRlb1dpZHRoKSB7CisgICAgICAgICAgICBtYXhWaWRlb1dpZHRoID0gdzE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGgxID4gbWF4VmlkZW9IZWlnaHQpIHsKKyAgICAgICAgICAgIG1heFZpZGVvSGVpZ2h0ID0gaDE7CiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gVGhpcyBpcyBqdXN0IGFuIHVwcGVyIGJvdW5kIGFuZCBtYXkgbm90IGJlIGFuIGFjdHVhbGx5IHZhbGlkIHZpZGVvIHNpemUKKyAgICAvLyBUaGVzZSBhcmUgdXBwZXIvbG93ZXIgYm91bmRzIGFuZCBtYXkgbm90IGJlIGFuIGFjdHVhbGx5IHZhbGlkIHZpZGVvIHNpemUKKyAgICBjb25zdCBTaXplIFZJREVPX1NJWkVfTE9XRVJfQk9VTkQgPSB7bWluVmlkZW9XaWR0aCwgbWluVmlkZW9IZWlnaHR9OwogICAgIFNpemUgdmlkZW9TaXplVXBwZXJCb3VuZCA9IHttYXhWaWRlb1dpZHRoLCBtYXhWaWRlb0hlaWdodH07CiAKICAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CkBAIC05OSw5ICsxMTgsMTAgQEAKICAgICAgICAgdmlkZW9TaXplVXBwZXJCb3VuZCA9IGdldE1heFNpemUoZ2V0UHJlZmVycmVkVmlkZW9TaXplcygpKTsKICAgICB9CiAKLSAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKG1heFByZXZpZXdTaXplLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKKyAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKFNpemV7MCwgMH0sIG1heFByZXZpZXdTaXplLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwotICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXModmlkZW9TaXplVXBwZXJCb3VuZCwgJmF2YWlsYWJsZVZpZGVvU2l6ZXMpOworICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoCisgICAgICAgIFZJREVPX1NJWkVfTE9XRVJfQk9VTkQsIHZpZGVvU2l6ZVVwcGVyQm91bmQsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgLy8gU2VsZWN0IGluaXRpYWwgcHJldmlldyBhbmQgdmlkZW8gc2l6ZSB0aGF0J3MgdW5kZXIgdGhlIGluaXRpYWwgYm91bmQgYW5kCkBAIC04NjQsNyArODg0LDYgQEAKIAogICAgIGlmIChmYWJzKG1heERpZ2l0YWxab29tLmRhdGEuZlswXSAtIDEuZikgPiAwLjAwMDAxZikgewogICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9aT09NLCB6b29tKTsKLSAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfTUFYX1pPT00sIE5VTV9aT09NX1NURVBTIC0gMSk7CiAKICAgICAgICAgewogICAgICAgICAgICAgU3RyaW5nOCB6b29tUmF0aW9zOwpAQCAtODcyLDE4ICs4OTEsMzQgQEAKICAgICAgICAgICAgIGZsb2F0IHpvb21JbmNyZW1lbnQgPSAobWF4RGlnaXRhbFpvb20uZGF0YS5mWzBdIC0gem9vbSkgLwogICAgICAgICAgICAgICAgICAgICAoTlVNX1pPT01fU1RFUFMtMSk7CiAgICAgICAgICAgICBib29sIGFkZENvbW1hID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBOVU1fWk9PTV9TVEVQUzsgaSsrKSB7CisgICAgICAgICAgICBpbnQgcHJldmlvdXNab29tID0gLTE7CisgICAgICAgICAgICBzaXplX3Qgem9vbVN0ZXBzID0gMDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX1pPT01fU1RFUFM7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBjdXJyZW50Wm9vbSA9IHN0YXRpY19jYXN0PGludD4oem9vbSAqIDEwMCk7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzWm9vbSA9PSBjdXJyZW50Wm9vbSkgeworICAgICAgICAgICAgICAgICAgICB6b29tICs9IHpvb21JbmNyZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoYWRkQ29tbWEpIHpvb21SYXRpb3MgKz0gIiwiOwogICAgICAgICAgICAgICAgIGFkZENvbW1hID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB6b29tUmF0aW9zICs9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHpvb20gKiAxMDApKTsKKyAgICAgICAgICAgICAgICB6b29tUmF0aW9zICs9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjdXJyZW50Wm9vbSk7CiAgICAgICAgICAgICAgICAgem9vbSArPSB6b29tSW5jcmVtZW50OworICAgICAgICAgICAgICAgIHByZXZpb3VzWm9vbSA9IGN1cnJlbnRab29tOworICAgICAgICAgICAgICAgIHpvb21TdGVwcysrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfWk9PTV9SQVRJT1MsIHpvb21SYXRpb3MpOworCisgICAgICAgICAgICBpZiAoem9vbVN0ZXBzID4gMCkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1pPT01fUkFUSU9TLCB6b29tUmF0aW9zKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9aT09NX1NVUFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OlRSVUUpOworICAgICAgICAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX01BWF9aT09NLCB6b29tU3RlcHMgLSAxKTsKKyAgICAgICAgICAgICAgICB6b29tQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfWk9PTV9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpGQUxTRSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9aT09NX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpUUlVFKTsKLSAgICAgICAgem9vbUF2YWlsYWJsZSA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfWk9PTV9TVVBQT1JURUQsCiAgICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6RkFMU0UpOwpAQCAtMTA0MCw3ICsxMDc1LDggQEAKICAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CiAgICAgICAgIHByZXZpZXdTaXplQm91bmQgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZFByZXZpZXdTaXplcygpKTsKICAgICB9Ci0gICAgc3RhdHVzX3QgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhwcmV2aWV3U2l6ZUJvdW5kLCAmc3VwcG9ydGVkUHJldmlld1NpemVzKTsKKyAgICBzdGF0dXNfdCByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKAorICAgICAgICBTaXplezAsIDB9LCBwcmV2aWV3U2l6ZUJvdW5kLCAmc3VwcG9ydGVkUHJldmlld1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUZwc1Jhbmdlcy5jb3VudDsgaSArPSAyKSB7CiAgICAgICAgIGlmICghaXNGcHNTdXBwb3J0ZWQoc3VwcG9ydGVkUHJldmlld1NpemVzLApAQCAtMjk4Myw3ICszMDE5LDggQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFBhcmFtZXRlcnM6OmdldEZpbHRlcmVkU2l6ZXMoU2l6ZSBsaW1pdCwgVmVjdG9yPFNpemU+ICpzaXplcykgeworc3RhdHVzX3QgUGFyYW1ldGVyczo6Z2V0RmlsdGVyZWRTaXplcyhjb25zdCBTaXplICZsb3dlciwgY29uc3QgU2l6ZSAmdXBwZXIsCisgICAgICAgIFZlY3RvcjxTaXplPiAqc2l6ZXMpIHsKICAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RhdGljIG1ldGFkYXRhIGlzIG5vdCBpbml0aWFsaXplZCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtMjk5OSw3ICszMDM2LDggQEAKICAgICAgICAgY29uc3QgU3RyZWFtQ29uZmlndXJhdGlvbiAmc2MgPSBzY3NbaV07CiAgICAgICAgIGlmIChzYy5pc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUICYmCiAgICAgICAgICAgICAgICAgc2MuZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCAmJgotICAgICAgICAgICAgICAgICgoc2Mud2lkdGggKiBzYy5oZWlnaHQpIDw9IChsaW1pdC53aWR0aCAqIGxpbWl0LmhlaWdodCkpKSB7CisgICAgICAgICAgICAgICAgKChzYy53aWR0aCAqIHNjLmhlaWdodCkgPj0gKGxvd2VyLndpZHRoICogbG93ZXIuaGVpZ2h0KSkgJiYKKyAgICAgICAgICAgICAgICAoKHNjLndpZHRoICogc2MuaGVpZ2h0KSA8PSAodXBwZXIud2lkdGggKiB1cHBlci5oZWlnaHQpKSkgewogICAgICAgICAgICAgaW50NjRfdCBtaW5GcmFtZUR1cmF0aW9uID0gZ2V0TWluRnJhbWVEdXJhdGlvbk5zKAogICAgICAgICAgICAgICAgICAgICB7c2Mud2lkdGgsIHNjLmhlaWdodH0sIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCk7CiAgICAgICAgICAgICBpZiAobWluRnJhbWVEdXJhdGlvbiA+IE1BWF9QUkVWSUVXX1JFQ09SRF9EVVJBVElPTl9OUykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKaW5kZXggZTJmOGQwMTEuLmNiZTYyYTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaApAQCAtMjA1LDcgKzIwNSw3IEBACiAgICAgc3RhdGljIGNvbnN0IGludCBNQVhfSU5JVElBTF9QUkVWSUVXX1dJRFRIID0gMTkyMDsKICAgICBzdGF0aWMgY29uc3QgaW50IE1BWF9JTklUSUFMX1BSRVZJRVdfSEVJR0hUID0gMTA4MDsKICAgICAvLyBBc3BlY3QgcmF0aW8gdG9sZXJhbmNlCi0gICAgc3RhdGljIGNvbnN0IENPTlNURVhQUiBmbG9hdCBBU1BFQ1RfUkFUSU9fVE9MRVJBTkNFID0gMC4wMDE7CisgICAgc3RhdGljIGNvbnN0IENPTlNURVhQUiBmbG9hdCBBU1BFQ1RfUkFUSU9fVE9MRVJBTkNFID0gMC4wMTsKICAgICAvLyBUaHJlc2hvbGQgZm9yIHNsb3cganBlZyBtb2RlCiAgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1Nsb3dKcGVnTW9kZVRocmVzaG9sZCA9IDMzNDAwMDAwTEw7IC8vIDMzLjQgbXMKICAgICAvLyBNYXJnaW4gZm9yIGNoZWNraW5nIEZQUwpAQCAtMjY5LDcgKzI2OSw3IEBACiAgICAgflBhcmFtZXRlcnMoKTsKIAogICAgIC8vIFNldHMgdXAgZGVmYXVsdCBwYXJhbWV0ZXJzCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShDYW1lcmFEZXZpY2VCYXNlICpkZXZpY2UsIGludCBkZXZpY2VWZXJzaW9uKTsKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplKENhbWVyYURldmljZUJhc2UgKmRldmljZSk7CiAKICAgICAvLyBCdWlsZCBmYXN0LWFjY2VzcyBkZXZpY2Ugc3RhdGljIGluZm8gZnJvbSBzdGF0aWMgaW5mbwogICAgIHN0YXR1c190IGJ1aWxkRmFzdEluZm8oQ2FtZXJhRGV2aWNlQmFzZSAqZGV2aWNlKTsKQEAgLTM5Niw5ICszOTYsMTAgQEAKIAogICAgIFZlY3RvcjxTaXplPiBhdmFpbGFibGVQcmV2aWV3U2l6ZXM7CiAgICAgVmVjdG9yPFNpemU+IGF2YWlsYWJsZVZpZGVvU2l6ZXM7Ci0gICAgLy8gR2V0IHNpemUgbGlzdCAodGhhdCBhcmUgbm8gbGFyZ2VyIHRoYW4gbGltaXQpIGZyb20gc3RhdGljIG1ldGFkYXRhLgorICAgIC8vIEdldCBzaXplIGxpc3QgKHRoYXQgZmFsbCB3aXRoaW4gbG93ZXIvdXBwZXIgYm91bmRzKSBmcm9tIHN0YXRpYyBtZXRhZGF0YS4KICAgICAvLyBUaGlzIG1ldGhvZCBmaWx0ZXJlZCBzaXplIHdpdGggbWluRnJhbWVEdXJhdGlvbiA8IE1BWF9QUkVWSUVXX1JFQ09SRF9EVVJBVElPTl9OUwotICAgIHN0YXR1c190IGdldEZpbHRlcmVkU2l6ZXMoU2l6ZSBsaW1pdCwgVmVjdG9yPFNpemU+ICpzaXplcyk7CisgICAgc3RhdHVzX3QgZ2V0RmlsdGVyZWRTaXplcyhjb25zdCBTaXplICZsb3dlciwgY29uc3QgU2l6ZSAmdXBwZXIsCisgICAgICAgICAgICBWZWN0b3I8U2l6ZT4gKnNpemVzKTsKICAgICAvLyBHZXQgbWF4IHNpemUgKGZyb20gdGhlIHNpemUgYXJyYXkpIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gYXNwZWN0IHJhdGlvLgogICAgIFNpemUgZ2V0TWF4U2l6ZUZvclJhdGlvKGZsb2F0IHJhdGlvLCBjb25zdCBpbnQzMl90KiBzaXplQXJyYXksIHNpemVfdCBjb3VudCk7CiAKQEAgLTQ1OCw3ICs0NTksNiBAQAogICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIHN1Z2dlc3RlZCB2aWRlbyBzaXplcwogICAgIFZlY3RvcjxTaXplPiBnZXRQcmVmZXJyZWRWaWRlb1NpemVzKCkgY29uc3Q7CiAKLSAgICBpbnQgbURldmljZVZlcnNpb247CiAgICAgdWludDhfdCBtRGVmYXVsdFNjZW5lTW9kZTsKIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAppbmRleCAxZjNkNDc4Li41ZTkxNTAxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCkBAIC01MSwxMyArNTEsMTQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogdXNpbmcgbmFtZXNwYWNlIGNhbWVyYTI7Cit1c2luZyBuYW1lc3BhY2UgY2FtZXJhMzsKIHVzaW5nIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fcm90YXRpb25fdDo6Q0FNRVJBX1NUUkVBTV9ST1RBVElPTl8wOwotdXNpbmcgY2FtZXJhMzo6U2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczsKIAogQ2FtZXJhRGV2aWNlQ2xpZW50QmFzZTo6Q2FtZXJhRGV2aWNlQ2xpZW50QmFzZSgKICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgYm9vbCBzeXN0ZW1OYXRpdmVDbGllbnQsCiAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLApAQCAtNjksNiArNzAsNyBAQAogICAgIEJhc2ljQ2xpZW50KGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihyZW1vdGVDYWxsYmFjayksCiAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIHN5c3RlbU5hdGl2ZUNsaWVudCwKICAgICAgICAgICAgIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGNhbWVyYUlkLAogICAgICAgICAgICAgY2FtZXJhRmFjaW5nLApAQCAtODYsNiArODgsNyBAQAogQ2FtZXJhRGV2aWNlQ2xpZW50OjpDYW1lcmFEZXZpY2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgYm9vbCBzeXN0ZW1OYXRpdmVDbGllbnQsCiAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLApAQCAtOTQsOCArOTcsOCBAQAogICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgIGludCBzZXJ2aWNlUGlkLAogICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzKSA6Ci0gICAgQ2FtZXJhMkNsaWVudEJhc2UoY2FtZXJhU2VydmljZSwgcmVtb3RlQ2FsbGJhY2ssIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRGZWF0dXJlSWQsCi0gICAgICAgICAgICAgICAgY2FtZXJhSWQsIC8qQVBJMSBjYW1lcmEgSUQqLyAtMSwgY2FtZXJhRmFjaW5nLCBzZW5zb3JPcmllbnRhdGlvbiwKKyAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCByZW1vdGVDYWxsYmFjaywgY2xpZW50UGFja2FnZU5hbWUsIHN5c3RlbU5hdGl2ZUNsaWVudCwKKyAgICAgICAgICAgICAgICBjbGllbnRGZWF0dXJlSWQsIGNhbWVyYUlkLCAvKkFQSTEgY2FtZXJhIElEKi8gLTEsIGNhbWVyYUZhY2luZywgc2Vuc29yT3JpZW50YXRpb24sCiAgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQsIG92ZXJyaWRlRm9yUGVyZkNsYXNzKSwKICAgICBtSW5wdXRTdHJlYW0oKSwKICAgICBtU3RyZWFtaW5nUmVxdWVzdElkKFJFUVVFU1RfSURfTk9ORSksCkBAIC0xNDAsNiArMTQzLDQwIEBACiAgICAgICAgICAgICAgICAgcGh5c2ljYWxLZXlzRW50cnkuZGF0YS5pMzIgKyBwaHlzaWNhbEtleXNFbnRyeS5jb3VudCk7CiAgICAgfQogCisgICAgYXV0byBlbnRyeSA9IGRldmljZUluZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgbUR5bmFtaWNQcm9maWxlTWFwLmVtcGxhY2UoCisgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJELAorICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCk7CisgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICBjb25zdCBhdXRvIGl0ID0gc3RkOjpmaW5kKGVudHJ5LmRhdGEudTgsIGVudHJ5LmRhdGEudTggKyBlbnRyeS5jb3VudCwKKyAgICAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19EWU5BTUlDX1JBTkdFX1RFTl9CSVQpOworICAgICAgICBpZiAoaXQgIT0gZW50cnkuZGF0YS51OCArIGVudHJ5LmNvdW50KSB7CisgICAgICAgICAgICBlbnRyeSA9IGRldmljZUluZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDAgfHwgKChlbnRyeS5jb3VudCAlIDMpICE9IDApKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzdGFuZGFyZEJpdG1hcCA9CisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJEOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkgKz0gMykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuZGF0YS5pNjRbaV0gIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHluYW1pY1Byb2ZpbGVNYXAuZW1wbGFjZShlbnRyeS5kYXRhLmk2NFtpXSwgZW50cnkuZGF0YS5pNjRbaSsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGVudHJ5LmRhdGEuaTY0W2krMV0gPT0gMCkgfHwgKGVudHJ5LmRhdGEuaTY0W2krMV0gJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQml0bWFwIHw9IGVudHJ5LmRhdGEuaTY0W2ldOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBEZXZpY2UgJXMgaW5jbHVkZXMgdW5leHBlY3RlZCBwcm9maWxlIGVudHJ5OiAweCUiIFBSSXg2NCAiISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkU3RyLmNfc3RyKCksIGVudHJ5LmRhdGEuaTY0W2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtRHluYW1pY1Byb2ZpbGVNYXBbQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRCaXRtYXA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRGV2aWNlICVzIHN1cHBvcnRzIDEwLWJpdCBvdXRwdXQgYnV0IGRvZXNuJ3QgaW5jbHVkZSBhIGR5bmFtaWMgcmFuZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAiIHByb2ZpbGUgbWFwISIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkU3RyLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgbVByb3ZpZGVyTWFuYWdlciA9IHByb3ZpZGVyUHRyOwogICAgIC8vIENhY2hlIHBoeXNpY2FsIGNhbWVyYSBpZHMgY29ycmVzcG9uZGluZyB0byB0aGlzIGRldmljZSBhbmQgYWxzbyB0aGUgaGlnaAogICAgIC8vIHJlc29sdXRpb24gc2Vuc29ycyBpbiB0aGlzIGRldmljZSArIHBoeXNpY2FsIGNhbWVyYSBpZHMKQEAgLTE3Miw2ICsyMDksNyBAQAogICAgIGludCBjb21wb3NpdGVJZHg7CiAgICAgaW50IGlkeCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShJSW50ZXJmYWNlOjphc0JpbmRlcihnYnApKTsKIAorICAgIE11dGV4OjpBdXRvbG9jayBsKG1Db21wb3NpdGVMb2NrKTsKICAgICAvLyBUcnlpbmcgdG8gc3VibWl0IHJlcXVlc3Qgd2l0aCBzdXJmYWNlIHRoYXQgd2Fzbid0IGNyZWF0ZWQKICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBUcmllZCB0byBzdWJtaXQgYSByZXF1ZXN0IHdpdGggYSBzdXJmYWNlIHRoYXQiCkBAIC0yOTcsNiArMzM1LDcgQEAKICAgICAgICAgU3VyZmFjZU1hcCBzdXJmYWNlTWFwOwogICAgICAgICBWZWN0b3I8aW50MzJfdD4gb3V0cHV0U3RyZWFtSWRzOwogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVxdWVzdGVkUGh5c2ljYWxJZHM7CisgICAgICAgIGludDY0X3QgZHluYW1pY1Byb2ZpbGVCaXRtYXAgPSAwOwogICAgICAgICBpZiAocmVxdWVzdC5tU3VyZmFjZUxpc3Quc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgZm9yIChjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSA6IHJlcXVlc3QubVN1cmZhY2VMaXN0KSB7CiAgICAgICAgICAgICAgICAgaWYgKHN1cmZhY2UgPT0gMCkgY29udGludWU7CkBAIC0zMTMsNiArMzUyLDggQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCByZXF1ZXN0ZWRQaHlzaWNhbElkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy52YWx1ZUF0KGluZGV4KS5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOwogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQaHlzaWNhbElkcy5wdXNoX2JhY2socmVxdWVzdGVkUGh5c2ljYWxJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNQcm9maWxlQml0bWFwIHw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLnZhbHVlQXQoaW5kZXgpLmdldER5bmFtaWNSYW5nZVByb2ZpbGUoKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IE91dHB1dCBzdHJlYW0gSWQgbm90IGZvdW5kIGFtb25nIGNvbmZpZ3VyZWQgb3V0cHV0cyEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgICAgIH0KQEAgLTM0OCw2ICszODksNDEgQEAKICAgICAgICAgICAgICAgICBTdHJpbmc4IHJlcXVlc3RlZFBoeXNpY2FsSWQoCiAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlndXJlZE91dHB1dHMudmFsdWVBdChpbmRleCkuZ2V0UGh5c2ljYWxDYW1lcmFJZCgpKTsKICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQaHlzaWNhbElkcy5wdXNoX2JhY2socmVxdWVzdGVkUGh5c2ljYWxJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZHluYW1pY1Byb2ZpbGVCaXRtYXAgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy52YWx1ZUF0KGluZGV4KS5nZXREeW5hbWljUmFuZ2VQcm9maWxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZHluYW1pY1Byb2ZpbGVCaXRtYXAgIT0KKyAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQ7CisgICAgICAgICAgICAgICAgICAgIGkgPCBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX01BWDsgaSA8PD0gMSkgeworICAgICAgICAgICAgICAgIGlmICgoZHluYW1pY1Byb2ZpbGVCaXRtYXAgJiBpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8mIGl0ID0gbUR5bmFtaWNQcm9maWxlTWFwLmZpbmQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG1EeW5hbWljUHJvZmlsZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGl0LT5zZWNvbmQgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGl0LT5zZWNvbmQgJiBkeW5hbWljUHJvZmlsZUJpdG1hcCkgPT0gZHluYW1pY1Byb2ZpbGVCaXRtYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBUcmllZCB0byBzdWJtaXQgYSByZXF1ZXN0IHdpdGggYSBzdXJmYWNlcyB0aGF0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlZmVyZW5jZSBhbiB1bnN1cHBvcnRlZCBkeW5hbWljIHJhbmdlIHByb2ZpbGUgY29tYmluYXRpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgMHglIiBQUkl4NjQgIiEiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY1Byb2ZpbGVCaXRtYXApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdCB0YXJnZXRzIGFuIHVuc3VwcG9ydGVkIGR5bmFtaWMgcmFuZ2UgcHJvZmlsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjb21iaW5hdGlvbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXM6IFRyaWVkIHRvIHN1Ym1pdCBhIHJlcXVlc3Qgd2l0aCBhIHN1cmZhY2UgdGhhdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlZmVyZW5jZXMgdW5zdXBwb3J0ZWQgZHluYW1pYyByYW5nZSBwcm9maWxlIDB4JXghIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgaSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdCB0YXJnZXRzIDEwLWJpdCBTdXJmYWNlIHdpdGggdW5zdXBwb3J0ZWQgZHluYW1pYyByYW5nZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHByb2ZpbGUiKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzc5LDYgKzQ1NSwxMiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmc4IHBoeXNpY2FsSWQoaXQuaWQuY19zdHIoKSk7CisgICAgICAgICAgICBib29sIGhhc1Rlc3RQYXR0ZXJuTW9kZVBoeXNpY2FsS2V5ID0gc3RkOjpmaW5kKG1TdXBwb3J0ZWRQaHlzaWNhbFJlcXVlc3RLZXlzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIG1TdXBwb3J0ZWRQaHlzaWNhbFJlcXVlc3RLZXlzLmVuZCgpLCBBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fTU9ERSkgIT0KKyAgICAgICAgICAgICAgICAgICAgbVN1cHBvcnRlZFBoeXNpY2FsUmVxdWVzdEtleXMuZW5kKCk7CisgICAgICAgICAgICBib29sIGhhc1Rlc3RQYXR0ZXJuRGF0YVBoeXNpY2FsS2V5ID0gc3RkOjpmaW5kKG1TdXBwb3J0ZWRQaHlzaWNhbFJlcXVlc3RLZXlzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIG1TdXBwb3J0ZWRQaHlzaWNhbFJlcXVlc3RLZXlzLmVuZCgpLCBBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fREFUQSkgIT0KKyAgICAgICAgICAgICAgICAgICAgbVN1cHBvcnRlZFBoeXNpY2FsUmVxdWVzdEtleXMuZW5kKCk7CiAgICAgICAgICAgICBpZiAocGh5c2ljYWxJZCAhPSBtRGV2aWNlLT5nZXRJZCgpKSB7CiAgICAgICAgICAgICAgICAgYXV0byBmb3VuZCA9IHN0ZDo6ZmluZChyZXF1ZXN0ZWRQaHlzaWNhbElkcy5iZWdpbigpLCByZXF1ZXN0ZWRQaHlzaWNhbElkcy5lbmQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGl0LmlkKTsKQEAgLTQwNCw3ICs0ODYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxTZXR0aW5nc0xpc3QucHVzaF9iYWNrKHtpdC5pZCwgZmlsdGVyZWRQYXJhbXN9KTsKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxTZXR0aW5nc0xpc3QucHVzaF9iYWNrKHtpdC5pZCwgZmlsdGVyZWRQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVGVzdFBhdHRlcm5Nb2RlUGh5c2ljYWxLZXksIGhhc1Rlc3RQYXR0ZXJuRGF0YVBoeXNpY2FsS2V5fSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBwaHlzaWNhbFNldHRpbmdzTGlzdC5wdXNoX2JhY2soe2l0LmlkLCBpdC5zZXR0aW5nc30pOwpAQCAtNDM0LDYgKzUxNywxNyBAQAogCiAgICAgICAgIG1ldGFkYXRhUmVxdWVzdExpc3QucHVzaF9iYWNrKHBoeXNpY2FsU2V0dGluZ3NMaXN0KTsKICAgICAgICAgc3VyZmFjZU1hcExpc3QucHVzaF9iYWNrKHN1cmZhY2VNYXApOworCisgICAgICAgIC8vIFNhdmUgY2VydGFpbiBDYXB0dXJlUmVxdWVzdCBzZXR0aW5ncworICAgICAgICBpZiAoIXJlcXVlc3QubVVzZXJUYWcuZW1wdHkoKSkgeworICAgICAgICAgICAgbVVzZXJUYWcgPSByZXF1ZXN0Lm1Vc2VyVGFnOworICAgICAgICB9CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBlbnRyeSA9CisgICAgICAgICAgICAgICAgcGh5c2ljYWxTZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEuZmluZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9WSURFT19TVEFCSUxJWkFUSU9OX01PREUpOworICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMSkgeworICAgICAgICAgICAgbVZpZGVvU3RhYmlsaXphdGlvbk1vZGUgPSBlbnRyeS5kYXRhLnU4WzBdOworICAgICAgICB9CiAgICAgfQogICAgIG1SZXF1ZXN0SWRDb3VudGVyKys7CiAKQEAgLTU2MSw2ICs2NTUsNyBAQAogICAgICAgICBvZmZsaW5lU3RyZWFtSWRzLT5jbGVhcigpOwogICAgICAgICBtRGV2aWNlLT5nZXRPZmZsaW5lU3RyZWFtSWRzKG9mZmxpbmVTdHJlYW1JZHMpOwogCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Db21wb3NpdGVMb2NrKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICBlcnIgPSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPmNvbmZpZ3VyZVN0cmVhbSgpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtNjMxLDI3ICs3MjYsMTEgQEAKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwogICAgIH0KIAotICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiBzdHJlYW1Db25maWd1cmF0aW9uOwotICAgIGJvb2wgZWFybHlFeGl0ID0gZmFsc2U7CisgICAgKnN0YXR1cyA9IGZhbHNlOwogICAgIGNhbWVyYTM6Om1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhID0gW3RoaXNdKGNvbnN0IFN0cmluZzggJmlkLCBib29sIC8qb3ZlcnJpZGVGb3JQZXJmQ2xhc3MqLykgewogICAgICAgICAgIHJldHVybiBtRGV2aWNlLT5pbmZvUGh5c2ljYWwoaWQpO307Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOwotICAgIG1Qcm92aWRlck1hbmFnZXItPmlzTG9naWNhbENhbWVyYShtQ2FtZXJhSWRTdHIuc3RyaW5nKCksICZwaHlzaWNhbENhbWVyYUlkcyk7Ci0gICAgcmVzID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb24oc2Vzc2lvbkNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICBtQ2FtZXJhSWRTdHIsIG1EZXZpY2UtPmluZm8oKSwgZ2V0TWV0YWRhdGEsIHBoeXNpY2FsQ2FtZXJhSWRzLCBzdHJlYW1Db25maWd1cmF0aW9uLAotICAgICAgICAgICAgbU92ZXJyaWRlRm9yUGVyZkNsYXNzLCAmZWFybHlFeGl0KTsKLSAgICBpZiAoIXJlcy5pc09rKCkpIHsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBpZiAoZWFybHlFeGl0KSB7Ci0gICAgICAgICpzdGF0dXMgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgICpzdGF0dXMgPSBmYWxzZTsKICAgICByZXQgPSBtUHJvdmlkZXJNYW5hZ2VyLT5pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKLSAgICAgICAgICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24sIHN0YXR1cyk7CisgICAgICAgICAgICBzZXNzaW9uQ29uZmlndXJhdGlvbiwgbU92ZXJyaWRlRm9yUGVyZkNsYXNzLCBnZXRNZXRhZGF0YSwgc3RhdHVzKTsKICAgICBzd2l0Y2ggKHJldCkgewogICAgICAgICBjYXNlIE9LOgogICAgICAgICAgICAgLy8gRXhwZWN0ZWQsIGRvIG5vdGhpbmcuCkBAIC03MTMsNiArNzkyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Db21wb3NpdGVMb2NrKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICBpZiAoc3RyZWFtSWQgPT0gbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5nZXRTdHJlYW1JZCgpKSB7CiAgICAgICAgICAgICAgICAgY29tcG9zaXRlSW5kZXggPSBpOwpAQCAtNzUxLDYgKzgzMSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjb21wb3NpdGVJbmRleCAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Db21wb3NpdGVMb2NrKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXQ7CiAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoY29tcG9zaXRlSW5kZXgpLT5kZWxldGVTdHJlYW0oKSkKICAgICAgICAgICAgICAgICAgICAgICAgICE9IE9LKSB7CkBAIC03OTQsNiArODc1LDEwIEBACiAgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gU3RyaW5nOChvdXRwdXRDb25maWd1cmF0aW9uLmdldFBoeXNpY2FsQ2FtZXJhSWQoKSk7CiAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyT25seSA9IGRlZmVycmVkQ29uc3VtZXIgJiYgbnVtQnVmZmVyUHJvZHVjZXJzID09IDA7CiAgICAgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IG91dHB1dENvbmZpZ3VyYXRpb24uaXNNdWx0aVJlc29sdXRpb24oKTsKKyAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldER5bmFtaWNSYW5nZVByb2ZpbGUoKTsKKyAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN0cmVhbVVzZUNhc2UoKTsKKyAgICBpbnQgdGltZXN0YW1wQmFzZSA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0VGltZXN0YW1wQmFzZSgpOworICAgIGludCBtaXJyb3JNb2RlID0gb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRNaXJyb3JNb2RlKCk7CiAKICAgICByZXMgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjaGVja1N1cmZhY2VUeXBlKG51bUJ1ZmZlclByb2R1Y2VycywgZGVmZXJyZWRDb25zdW1lciwKICAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVR5cGUoKSk7CkBAIC04MzcsNyArOTIyLDggQEAKICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKICAgICAgICAgcmVzID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y3JlYXRlU3VyZmFjZUZyb21HYnAoc3RyZWFtSW5mbywKICAgICAgICAgICAgICAgICBpc1N0cmVhbUluZm9WYWxpZCwgc3VyZmFjZSwgYnVmZmVyUHJvZHVjZXIsIG1DYW1lcmFJZFN0ciwKLSAgICAgICAgICAgICAgICBtRGV2aWNlLT5pbmZvUGh5c2ljYWwocGh5c2ljYWxDYW1lcmFJZCksIHNlbnNvclBpeGVsTW9kZXNVc2VkKTsKKyAgICAgICAgICAgICAgICBtRGV2aWNlLT5pbmZvUGh5c2ljYWwocGh5c2ljYWxDYW1lcmFJZCksIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICAgICAgICAgIHN0cmVhbVVzZUNhc2UsIHRpbWVzdGFtcEJhc2UsIG1pcnJvck1vZGUpOwogCiAgICAgICAgIGlmICghcmVzLmlzT2soKSkKICAgICAgICAgICAgIHJldHVybiByZXM7CkBAIC04NzMsNiArOTU5LDcgQEAKICAgICAgICAgICAgICAgICAmc3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN0cmVhbUluZm8uc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsICZzdXJmYWNlSWRzLAogICAgICAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVNldElEKCksIGlzU2hhcmVkLCBpc011bHRpUmVzb2x1dGlvbik7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Db21wb3NpdGVMb2NrKTsKICAgICAgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAuYWRkKElJbnRlcmZhY2U6OmFzQmluZGVyKHN1cmZhY2VzWzBdLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkpLAogICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVTdHJlYW0pOwogICAgICAgICB9CkBAIC04ODEsNyArOTY4LDkgQEAKICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCwgc3RyZWFtSW5mby5mb3JtYXQsIHN0cmVhbUluZm8uZGF0YVNwYWNlLAogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdD4ob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRSb3RhdGlvbigpKSwKICAgICAgICAgICAgICAgICAmc3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN0cmVhbUluZm8uc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsICZzdXJmYWNlSWRzLAotICAgICAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVNldElEKCksIGlzU2hhcmVkLCBpc011bHRpUmVzb2x1dGlvbik7CisgICAgICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlU2V0SUQoKSwgaXNTaGFyZWQsIGlzTXVsdGlSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgIC8qY29uc3VtZXJVc2FnZSovMCwgc3RyZWFtSW5mby5keW5hbWljUmFuZ2VQcm9maWxlLCBzdHJlYW1JbmZvLnN0cmVhbVVzZUNhc2UsCisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby50aW1lc3RhbXBCYXNlLCBzdHJlYW1JbmZvLm1pcnJvck1vZGUpOwogICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTkwNyw3ICs5OTYsNyBAQAogICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQsIHN0cmVhbUluZm8uZm9ybWF0KTsKIAogICAgICAgICAvLyBTZXQgdHJhbnNmb3JtIGZsYWdzIHRvIGVuc3VyZSBwcmV2aWV3IHRvIGJlIHJvdGF0ZWQgY29ycmVjdGx5LgotICAgICAgICByZXMgPSBzZXRTdHJlYW1UcmFuc2Zvcm1Mb2NrZWQoc3RyZWFtSWQpOworICAgICAgICByZXMgPSBzZXRTdHJlYW1UcmFuc2Zvcm1Mb2NrZWQoc3RyZWFtSWQsIHN0cmVhbUluZm8ubWlycm9yTW9kZSk7CiAKICAgICAgICAgLy8gRmlsbCBpbiBtSGlnaFJlc29sdXRpb25DYW1lcmFJZFRvU3RyZWFtSWRTZXQgbWFwCiAgICAgICAgIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkVXNlZCA9CkBAIC05NzUsNyArMTA2NCwxMCBAQAogICAgICAgICAgICAgb3ZlcnJpZGRlblNlbnNvclBpeGVsTW9kZXNVc2VkLAogICAgICAgICAgICAgJnN1cmZhY2VJZHMsCiAgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLCBpc1NoYXJlZCwKLSAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uaXNNdWx0aVJlc29sdXRpb24oKSwgY29uc3VtZXJVc2FnZSk7CisgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmlzTXVsdGlSZXNvbHV0aW9uKCksIGNvbnN1bWVyVXNhZ2UsCisgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldER5bmFtaWNSYW5nZVByb2ZpbGUoKSwKKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3RyZWFtVXNlQ2FzZSgpLAorICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRNaXJyb3JNb2RlKCkpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXMgPSBTVEFUVVNfRVJST1JfRk1UKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLApAQCAtOTg4LDE0ICsxMDgwLDE4IEBACiAgICAgICAgIG1EZWZlcnJlZFN0cmVhbXMucHVzaF9iYWNrKHN0cmVhbUlkKTsKICAgICAgICAgbVN0cmVhbUluZm9NYXAuZW1wbGFjZShzdGQ6OnBpZWNld2lzZV9jb25zdHJ1Y3QsIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdHJlYW1JZCksCiAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgZGF0YVNwYWNlLCBjb25zdW1lclVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGRlblNlbnNvclBpeGVsTW9kZXNVc2VkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZGVuU2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldER5bmFtaWNSYW5nZVByb2ZpbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3RyZWFtVXNlQ2FzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRUaW1lc3RhbXBCYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldE1pcnJvck1vZGUoKSkpOwogCiAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVzOiBTdWNjZXNzZnVsbHkgY3JlYXRlZCBhIG5ldyBzdHJlYW0gSUQgJWQgZm9yIGEgZGVmZXJyZWQgc3VyZmFjZSIKICAgICAgICAgICAgICAgICAiICglZCB4ICVkKSBzdHJlYW0gd2l0aCBmb3JtYXQgMHgleC4iLAogICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZWFtSWQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CiAKICAgICAgICAgLy8gU2V0IHRyYW5zZm9ybSBmbGFncyB0byBlbnN1cmUgcHJldmlldyB0byBiZSByb3RhdGVkIGNvcnJlY3RseS4KLSAgICAgICAgcmVzID0gc2V0U3RyZWFtVHJhbnNmb3JtTG9ja2VkKHN0cmVhbUlkKTsKKyAgICAgICAgcmVzID0gc2V0U3RyZWFtVHJhbnNmb3JtTG9ja2VkKHN0cmVhbUlkLCBvdXRwdXRDb25maWd1cmF0aW9uLmdldE1pcnJvck1vZGUoKSk7CiAKICAgICAgICAgKm5ld1N0cmVhbUlkID0gc3RyZWFtSWQ7CiAgICAgICAgIC8vIEZpbGwgaW4gbUhpZ2hSZXNvbHV0aW9uQ2FtZXJhSWRUb1N0cmVhbUlkU2V0CkBAIC0xMDA5LDcgKzExMDUsNyBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLWJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6c2V0U3RyZWFtVHJhbnNmb3JtTG9ja2VkKGludCBzdHJlYW1JZCkgeworYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpzZXRTdHJlYW1UcmFuc2Zvcm1Mb2NrZWQoaW50IHN0cmVhbUlkLCBpbnQgbWlycm9yTW9kZSkgewogICAgIGludDMyX3QgdHJhbnNmb3JtID0gMDsKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgYmluZGVyOjpTdGF0dXMgcmVzOwpAQCAtMTAxOCw3ICsxMTE0LDcgQEAKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQsICJDYW1lcmEgZGV2aWNlIG5vIGxvbmdlciBhbGl2ZSIpOwogICAgIH0KIAotICAgIGVyciA9IGdldFJvdGF0aW9uVHJhbnNmb3JtTG9ja2VkKCZ0cmFuc2Zvcm0pOworICAgIGVyciA9IGdldFJvdGF0aW9uVHJhbnNmb3JtTG9ja2VkKG1pcnJvck1vZGUsICZ0cmFuc2Zvcm0pOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgLy8gRXJyb3IgbG9nZ2VkIGJ5IGdldFJvdGF0aW9uVHJhbnNmb3JtTG9ja2VkLgogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLApAQCAtMTE3NiwxMyArMTI3MiwxOCBAQAogICAgIH0KICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQgPQogICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTZW5zb3JQaXhlbE1vZGVzVXNlZCgpOworICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3RyZWFtVXNlQ2FzZSgpOworICAgIGludCB0aW1lc3RhbXBCYXNlID0gb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRUaW1lc3RhbXBCYXNlKCk7CisgICAgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlID0gb3V0cHV0Q29uZmlndXJhdGlvbi5nZXREeW5hbWljUmFuZ2VQcm9maWxlKCk7CisgICAgaW50IG1pcnJvck1vZGUgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldE1pcnJvck1vZGUoKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3T3V0cHV0c01hcC5zaXplKCk7IGkrKykgewogICAgICAgICBPdXRwdXRTdHJlYW1JbmZvIG91dEluZm87CiAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CiAgICAgICAgIHJlcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNyZWF0ZVN1cmZhY2VGcm9tR2JwKG91dEluZm8sCiAgICAgICAgICAgICAgICAgLyppc1N0cmVhbUluZm9WYWxpZCovIGZhbHNlLCBzdXJmYWNlLCBuZXdPdXRwdXRzTWFwLnZhbHVlQXQoaSksIG1DYW1lcmFJZFN0ciwKLSAgICAgICAgICAgICAgICBtRGV2aWNlLT5pbmZvUGh5c2ljYWwocGh5c2ljYWxDYW1lcmFJZCksIHNlbnNvclBpeGVsTW9kZXNVc2VkKTsKKyAgICAgICAgICAgICAgICBtRGV2aWNlLT5pbmZvUGh5c2ljYWwocGh5c2ljYWxDYW1lcmFJZCksIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICAgICAgICAgIHN0cmVhbVVzZUNhc2UsIHRpbWVzdGFtcEJhc2UsIG1pcnJvck1vZGUpOwogICAgICAgICBpZiAoIXJlcy5pc09rKCkpCiAgICAgICAgICAgICByZXR1cm4gcmVzOwogCkBAIC0xNTM5LDYgKzE2NDAsMTAgQEAKICAgICBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gY29uc3VtZXJTdXJmYWNlczsKICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQgPQogICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTZW5zb3JQaXhlbE1vZGVzVXNlZCgpOworICAgIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpOworICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZT0gb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdHJlYW1Vc2VDYXNlKCk7CisgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldFRpbWVzdGFtcEJhc2UoKTsKKyAgICBpbnQgbWlycm9yTW9kZSA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0TWlycm9yTW9kZSgpOwogICAgIGZvciAoYXV0byYgYnVmZmVyUHJvZHVjZXIgOiBidWZmZXJQcm9kdWNlcnMpIHsKICAgICAgICAgLy8gRG9uJ3QgY3JlYXRlIG11bHRpcGxlIHN0cmVhbXMgZm9yIHRoZSBzYW1lIHRhcmdldCBzdXJmYWNlCiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU3RyZWFtTWFwLmluZGV4T2ZLZXkoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpKTsKQEAgLTE1NTEsNyArMTY1Niw4IEBACiAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CiAgICAgICAgIHJlcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNyZWF0ZVN1cmZhY2VGcm9tR2JwKG1TdHJlYW1JbmZvTWFwW3N0cmVhbUlkXSwKICAgICAgICAgICAgICAgICB0cnVlIC8qaXNTdHJlYW1JbmZvVmFsaWQqLywgc3VyZmFjZSwgYnVmZmVyUHJvZHVjZXIsIG1DYW1lcmFJZFN0ciwKLSAgICAgICAgICAgICAgICBtRGV2aWNlLT5pbmZvUGh5c2ljYWwocGh5c2ljYWxJZCksIHNlbnNvclBpeGVsTW9kZXNVc2VkKTsKKyAgICAgICAgICAgICAgICBtRGV2aWNlLT5pbmZvUGh5c2ljYWwocGh5c2ljYWxJZCksIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICAgICAgICAgIHN0cmVhbVVzZUNhc2UsIHRpbWVzdGFtcEJhc2UsIG1pcnJvck1vZGUpOwogCiAgICAgICAgIGlmICghcmVzLmlzT2soKSkKICAgICAgICAgICAgIHJldHVybiByZXM7CkBAIC0xNjg2LDEwICsxNzkyLDExIEBACiAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CiAgICAgICAgIH0KIAorICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtQ29tcG9zaXRlTG9jayk7CiAgICAgICAgIGJvb2wgaXNDb21wb3NpdGVTdHJlYW0gPSBmYWxzZTsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBnYnAgOiBtQ29uZmlndXJlZE91dHB1dHNbc3RyZWFtSWRdLmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcnMoKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGdicCA6IG1Db25maWd1cmVkT3V0cHV0cy52YWx1ZUF0KGluZGV4KS5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXJzKCkpIHsKICAgICAgICAgICAgIHNwPFN1cmZhY2U+IHMgPSBuZXcgU3VyZmFjZShnYnAsIGZhbHNlIC8qY29udHJvbGxlZEJ5QXBwKi8pOwotICAgICAgICAgICAgaXNDb21wb3NpdGVTdHJlYW0gPSBjYW1lcmEzOjpEZXB0aENvbXBvc2l0ZVN0cmVhbTo6aXNEZXB0aENvbXBvc2l0ZVN0cmVhbShzKSB8CisgICAgICAgICAgICBpc0NvbXBvc2l0ZVN0cmVhbSA9IGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtOjppc0RlcHRoQ29tcG9zaXRlU3RyZWFtKHMpIHx8CiAgICAgICAgICAgICAgICAgY2FtZXJhMzo6SGVpY0NvbXBvc2l0ZVN0cmVhbTo6aXNIZWljQ29tcG9zaXRlU3RyZWFtKHMpOwogICAgICAgICAgICAgaWYgKGlzQ29tcG9zaXRlU3RyZWFtKSB7CiAgICAgICAgICAgICAgICAgYXV0byBjb21wb3NpdGVJZHggPSBtQ29tcG9zaXRlU3RyZWFtTWFwLmluZGV4T2ZLZXkoSUludGVyZmFjZTo6YXNCaW5kZXIoZ2JwKSk7CkBAIC0xNzM2LDYgKzE4NDMsNyBAQAogICAgICAgICBtQ29uZmlndXJlZE91dHB1dHMuY2xlYXIoKTsKICAgICAgICAgbURlZmVycmVkU3RyZWFtcy5jbGVhcigpOwogICAgICAgICBtU3RyZWFtSW5mb01hcC5jbGVhcigpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtQ29tcG9zaXRlTG9jayk7CiAgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAuY2xlYXIoKTsKICAgICAgICAgbUlucHV0U3RyZWFtID0ge2ZhbHNlLCAwLCAwLCAwLCAwfTsKICAgICB9IGVsc2UgewpAQCAtMTc5NywxNiArMTkwNSw1MCBAQAogICAgIHJldHVybiBkdW1wRGV2aWNlKGZkLCBhcmdzKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpzdGFydFdhdGNoaW5nVGFncyhjb25zdCBTdHJpbmc4ICZ0YWdzLCBpbnQgb3V0KSB7CisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZTsKKyAgICBpZiAoIWRldmljZSkgeworICAgICAgICBkcHJpbnRmKG91dCwgIiAgRGV2aWNlIGlzIGRldGFjaGVkLiIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIGRldmljZS0+c3RhcnRXYXRjaGluZ1RhZ3ModGFncyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OnN0b3BXYXRjaGluZ1RhZ3MoaW50IG91dCkgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2U7CisgICAgaWYgKCFkZXZpY2UpIHsKKyAgICAgICAgZHByaW50ZihvdXQsICIgIERldmljZSBpcyBkZXRhY2hlZC4iKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBkZXZpY2UtPnN0b3BXYXRjaGluZ1RhZ3MoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6ZHVtcFdhdGNoZWRFdmVudHNUb1ZlY3RvcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm91dCkgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2U7CisgICAgaWYgKCFkZXZpY2UpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBkZXZpY2UtPmR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3Iob3V0KTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKICAgICAvLyBUaHJlYWQgc2FmZS4gRG9uJ3QgYm90aGVyIGxvY2tpbmcuCiAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0gZ2V0UmVtb3RlQ2FsbGJhY2soKTsKIAotICAgIC8vIENvbXBvc2l0ZXMgY2FuIGhhdmUgbXVsdGlwbGUgaW50ZXJuYWwgc3RyZWFtcy4gRXJyb3Igbm90aWZpY2F0aW9ucyBjb21pbmcgZnJvbSBzdWNoIGludGVybmFsCi0gICAgLy8gc3RyZWFtcyBtYXkgbmVlZCB0byByZW1haW4gd2l0aGluIGNhbWVyYSBzZXJ2aWNlLgogICAgIGJvb2wgc2tpcENsaWVudE5vdGlmaWNhdGlvbiA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7IGkrKykgewotICAgICAgICBza2lwQ2xpZW50Tm90aWZpY2F0aW9uIHw9IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+b25FcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CisgICAgeworICAgICAgICAvLyBBY2Nlc3MgdG8gdGhlIGNvbXBvc2l0ZSBzdHJlYW0gbWFwIG11c3QgYmUgc3luY2hyb25pemVkCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Db21wb3NpdGVMb2NrKTsKKyAgICAgICAgLy8gQ29tcG9zaXRlcyBjYW4gaGF2ZSBtdWx0aXBsZSBpbnRlcm5hbCBzdHJlYW1zLiBFcnJvciBub3RpZmljYXRpb25zIGNvbWluZyBmcm9tIHN1Y2gKKyAgICAgICAgLy8gaW50ZXJuYWwgc3RyZWFtcyBtYXkgbmVlZCB0byByZW1haW4gd2l0aGluIGNhbWVyYSBzZXJ2aWNlLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNraXBDbGllbnROb3RpZmljYXRpb24gfD0gbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5vbkVycm9yKGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmICgocmVtb3RlQ2IgIT0gMCkgJiYgKCFza2lwQ2xpZW50Tm90aWZpY2F0aW9uKSkgewpAQCAtMTgzNCw3ICsxOTc2LDggQEAKICAgICBpZiAocmVtb3RlQ2IgIT0gMCkgewogICAgICAgICByZW1vdGVDYi0+b25EZXZpY2VJZGxlKCk7CiAgICAgfQotICAgIENhbWVyYTJDbGllbnRCYXNlOjpub3RpZnlJZGxlKHJlcXVlc3RDb3VudCwgcmVzdWx0RXJyb3JDb3VudCwgZGV2aWNlRXJyb3IsIHN0cmVhbVN0YXRzKTsKKyAgICBDYW1lcmEyQ2xpZW50QmFzZTo6bm90aWZ5SWRsZVdpdGhVc2VyVGFnKHJlcXVlc3RDb3VudCwgcmVzdWx0RXJyb3JDb3VudCwgZGV2aWNlRXJyb3IsCisgICAgICAgICAgICBzdHJlYW1TdGF0cywgbVVzZXJUYWcsIG1WaWRlb1N0YWJpbGl6YXRpb25Nb2RlKTsKIH0KIAogdm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLApAQCAtMTg0Niw2ICsxOTg5LDggQEAKICAgICB9CiAgICAgQ2FtZXJhMkNsaWVudEJhc2U6Om5vdGlmeVNodXR0ZXIocmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOwogCisgICAgLy8gQWNjZXNzIHRvIHRoZSBjb21wb3NpdGUgc3RyZWFtIG1hcCBtdXN0IGJlIHN5bmNocm9uaXplZAorICAgIE11dGV4OjpBdXRvbG9jayBsKG1Db21wb3NpdGVMb2NrKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5vblNodXR0ZXIocmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOwogICAgIH0KQEAgLTE4NzMsMTMgKzIwMTgsMTUgQEAKICAgICBuc2Vjc190IHN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBBTE9HVigiQ2FtZXJhICVzOiBTdG9wcGluZyBwcm9jZXNzb3JzIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKIAotICAgIG1GcmFtZVByb2Nlc3Nvci0+cmVtb3ZlTGlzdGVuZXIoY2FtZXJhMjo6RnJhbWVQcm9jZXNzb3JCYXNlOjpGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUlOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhMjo6RnJhbWVQcm9jZXNzb3JCYXNlOjpGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUFYX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsaXN0ZW5lciovdGhpcyk7Ci0gICAgbUZyYW1lUHJvY2Vzc29yLT5yZXF1ZXN0RXhpdCgpOwotICAgIEFMT0dWKCJDYW1lcmEgJXM6IFdhaXRpbmcgZm9yIHRocmVhZHMiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwotICAgIG1GcmFtZVByb2Nlc3Nvci0+am9pbigpOwotICAgIEFMT0dWKCJDYW1lcmEgJXM6IERpc2Nvbm5lY3RpbmcgZGV2aWNlIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICBpZiAobUZyYW1lUHJvY2Vzc29yLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUZyYW1lUHJvY2Vzc29yLT5yZW1vdmVMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICBjYW1lcmEyOjpGcmFtZVByb2Nlc3NvckJhc2U6OkZSQU1FX1BST0NFU1NPUl9MSVNURU5FUl9NSU5fSUQsCisgICAgICAgICAgICAgICAgY2FtZXJhMjo6RnJhbWVQcm9jZXNzb3JCYXNlOjpGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUFYX0lELCAvKmxpc3RlbmVyKi90aGlzKTsKKyAgICAgICAgbUZyYW1lUHJvY2Vzc29yLT5yZXF1ZXN0RXhpdCgpOworICAgICAgICBBTE9HVigiQ2FtZXJhICVzOiBXYWl0aW5nIGZvciB0aHJlYWRzIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICAgICAgbUZyYW1lUHJvY2Vzc29yLT5qb2luKCk7CisgICAgICAgIEFMT0dWKCJDYW1lcmEgJXM6IERpc2Nvbm5lY3RpbmcgZGV2aWNlIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICB9CiAKICAgICAvLyBXT1JLQVJPVU5EOiBIQUwgcmVmdXNlcyB0byBkaXNjb25uZWN0IHdoaWxlIHRoZXJlJ3Mgc3RyZWFtcyBpbiBmbGlnaHQKICAgICB7CkBAIC0xODk1LDE0ICsyMDQyLDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgYXV0byByZXQgPSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPmRlbGV0ZUludGVybmFsU3RyZWFtcygpOwotICAgICAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCByZW1vdmluZyBjb21wb3NpdGUgc3RyZWFtICAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Db21wb3NpdGVMb2NrKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBhdXRvIHJldCA9IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+ZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgcmVtb3ZpbmcgY29tcG9zaXRlIHN0cmVhbSAgJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAuY2xlYXIoKTsKICAgICB9Ci0gICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC5jbGVhcigpOwogCiAgICAgQ2FtZXJhMkNsaWVudEJhc2U6OmRldGFjaERldmljZSgpOwogCkBAIC0xOTIyLDYgKzIwNzIsOCBAQAogICAgICAgICAgICAgICAgIHJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpOwogICAgIH0KIAorICAgIC8vIEFjY2VzcyB0byB0aGUgY29tcG9zaXRlIHN0cmVhbSBtYXAgbXVzdCBiZSBzeW5jaHJvbml6ZWQKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtQ29tcG9zaXRlTG9jayk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+b25SZXN1bHRBdmFpbGFibGUocmVzdWx0KTsKICAgICB9CkBAIC0xOTkwLDExICsyMTQyLDEyIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Z2V0Um90YXRpb25UcmFuc2Zvcm1Mb2NrZWQoaW50MzJfdCogdHJhbnNmb3JtKSB7CitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmdldFJvdGF0aW9uVHJhbnNmb3JtTG9ja2VkKGludCBtaXJyb3JNb2RlLAorICAgICAgICBpbnQzMl90KiB0cmFuc2Zvcm0pIHsKICAgICBBTE9HVigiJXM6IGJlZ2luIiwgX19GVU5DVElPTl9fKTsKIAogICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOwotICAgIHJldHVybiBDYW1lcmFVdGlsczo6Z2V0Um90YXRpb25UcmFuc2Zvcm0oc3RhdGljSW5mbywgdHJhbnNmb3JtKTsKKyAgICByZXR1cm4gQ2FtZXJhVXRpbHM6OmdldFJvdGF0aW9uVHJhbnNmb3JtKHN0YXRpY0luZm8sIG1pcnJvck1vZGUsIHRyYW5zZm9ybSk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6bWFwUmVxdWVzdFRlbXBsYXRlKGludCB0ZW1wbGF0ZUlkLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKaW5kZXggNzZiM2Y1My4uYzVhYWQ2YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU3VibWl0SW5mby5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAKICNpbmNsdWRlICJDYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudC5oIgogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKQEAgLTQ5LDYgKzUwLDcgQEAKICAgICBDYW1lcmFEZXZpY2VDbGllbnRCYXNlKGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKQEAgLTE3Nyw2ICsxNzksNyBAQAogICAgIENhbWVyYURldmljZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICBib29sIGNsaWVudFBhY2thZ2VPdmVycmlkZSwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCkBAIC0xOTksNiArMjAyLDEwIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcENsaWVudChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIHN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFN0cmluZzggJnRhZ3MsIGludCBvdXQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBzdG9wV2F0Y2hpbmdUYWdzKGludCBvdXQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmb3V0KTsKKwogICAgIC8qKgogICAgICAqIERldmljZSBsaXN0ZW5lciBpbnRlcmZhY2UKICAgICAgKi8KQEAgLTIyMiw3ICsyMjksNyBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBkZXRhY2hEZXZpY2UoKTsKIAogICAgIC8vIENhbGN1bGF0ZSB0aGUgQU5hdGl2ZVdpbmRvdyB0cmFuc2Zvcm0gZnJvbSBhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbgotICAgIHN0YXR1c190ICAgICAgICAgICAgICBnZXRSb3RhdGlvblRyYW5zZm9ybUxvY2tlZCgvKm91dCovaW50MzJfdCogdHJhbnNmb3JtKTsKKyAgICBzdGF0dXNfdCAgICAgICAgICAgICAgZ2V0Um90YXRpb25UcmFuc2Zvcm1Mb2NrZWQoaW50IG1pcnJvck1vZGUsIC8qb3V0Ki9pbnQzMl90KiB0cmFuc2Zvcm0pOwogCiAgICAgYm9vbCBpc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IoY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQpOwogCkBAIC0yODIsNyArMjg5LDcgQEAKIAogICAgIC8vIFNldCB0aGUgc3RyZWFtIHRyYW5zZm9ybSBmbGFncyB0byBhdXRvbWF0aWNhbGx5IHJvdGF0ZSB0aGUgY2FtZXJhIHN0cmVhbSBmb3IgcHJldmlldyB1c2UKICAgICAvLyBjYXNlcy4KLSAgICBiaW5kZXI6OlN0YXR1cyBzZXRTdHJlYW1UcmFuc2Zvcm1Mb2NrZWQoaW50IHN0cmVhbUlkKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRTdHJlYW1UcmFuc2Zvcm1Mb2NrZWQoaW50IHN0cmVhbUlkLCBpbnQgbWlycm9yTW9kZSk7CiAKICAgICAvLyBVdGlsaXR5IG1ldGhvZCB0byBpbnNlcnQgdGhlIHN1cmZhY2UgaW50byBTdXJmYWNlTWFwCiAgICAgYmluZGVyOjpTdGF0dXMgaW5zZXJ0R2JwTG9ja2VkKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsCkBAIC0yOTksNiArMzA2LDEwIEBACiAgICAgLy8gU3RyZWFtIElEIC0+IE91dHB1dENvbmZpZ3VyYXRpb24uIFVzZWQgZm9yIGxvb2tpbmcgdXAgU3VyZmFjZSBieSBzdHJlYW0vc3VyZmFjZSBpbmRleAogICAgIEtleWVkVmVjdG9yPGludDMyX3QsIGhhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb24+IG1Db25maWd1cmVkT3V0cHV0czsKIAorICAgIC8vIER5bmFtaWMgcmFuZ2UgcHJvZmlsZSBpZCAtPiBTdXBwb3J0ZWQgZHluYW1pYyBwcm9maWxlcyBiaXRtYXAgd2l0aGluIGFuIHNpbmdsZSBjYXB0dXJlCisgICAgLy8gcmVxdWVzdAorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQ2NF90LCBpbnQ2NF90PiBtRHluYW1pY1Byb2ZpbGVNYXA7CisKICAgICBzdHJ1Y3QgSW5wdXRTdHJlYW1Db25maWd1cmF0aW9uIHsKICAgICAgICAgYm9vbCBjb25maWd1cmVkOwogICAgICAgICBpbnQzMl90IHdpZHRoOwpAQCAtMzMwLDEyICszNDEsMTkgQEAKICAgICAvLyBzZXQgb2YgaGlnaCByZXNvbHV0aW9uIGNhbWVyYSBpZCAobG9naWNhbCAvIHBoeXNpY2FsKQogICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gbUhpZ2hSZXNvbHV0aW9uU2Vuc29yczsKIAorICAgIC8vIFN5bmNocm9uaXplIGFjY2VzcyB0byAnbUNvbXBvc2l0ZVN0cmVhbU1hcCcKKyAgICBNdXRleCBtQ29tcG9zaXRlTG9jazsKICAgICBLZXllZFZlY3RvcjxzcDxJQmluZGVyPiwgc3A8Q29tcG9zaXRlU3RyZWFtPj4gbUNvbXBvc2l0ZVN0cmVhbU1hcDsKIAogICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbVByb3ZpZGVyTWFuYWdlcjsKIAogICAgIC8vIE92ZXJyaWRlIHRoZSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBwZXJmb3JtYW5jZSBjbGFzcyBwcmltYXJ5IGNhbWVyYXMuCiAgICAgYm9vbCBtT3ZlcnJpZGVGb3JQZXJmQ2xhc3M7CisKKyAgICAvLyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdCBwYXNzZWQgaW50byBDYXB0dXJlUmVxdWVzdC5zZXRUYWcuCisgICAgc3RkOjpzdHJpbmcgbVVzZXJUYWc7CisgICAgLy8gVGhlIGxhc3Qgc2V0IHZpZGVvIHN0YWJpbGl6YXRpb24gbW9kZQorICAgIGludCBtVmlkZW9TdGFiaWxpemF0aW9uTW9kZSA9IC0xOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudC5jcHAKaW5kZXggZWYxNWYyZC4uOTMwM2ZkMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudC5jcHAKQEAgLTExMCw2ICsxMTAsMTggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50OjpzdGFydFdhdGNoaW5nVGFncyhjb25zdCBTdHJpbmc4ICZ0YWdzLCBpbnQgb3V0RmQpIHsKKyAgICByZXR1cm4gQmFzaWNDbGllbnQ6OnN0YXJ0V2F0Y2hpbmdUYWdzKHRhZ3MsIG91dEZkKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQ6OnN0b3BXYXRjaGluZ1RhZ3MoaW50IG91dEZkKSB7CisgICAgcmV0dXJuIEJhc2ljQ2xpZW50OjpzdG9wV2F0Y2hpbmdUYWdzKG91dEZkKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQ6OmR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3Ioc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZvdXQpIHsKKyAgICByZXR1cm4gQmFzaWNDbGllbnQ6OmR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3Iob3V0KTsKK30KKwogYmluZGVyOjpTdGF0dXMgQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQ6OmRpc2Nvbm5lY3QoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogCkBAIC0yNzUsNyArMjg3LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IENhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50Ojpub3RpZnlBY3RpdmUoKSB7CitzdGF0dXNfdCBDYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudDo6bm90aWZ5QWN0aXZlKGZsb2F0IG1heFByZXZpZXdGcHMgX191bnVzZWQpIHsKICAgICByZXR1cm4gc3RhcnRDYW1lcmFTdHJlYW1pbmdPcHMoKTsKIH0KIApAQCAtMzMwLDUgKzM0MiwxOSBAQAogICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMoKSk7CiB9CiAKK3N0YXR1c190IENhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50OjppbmplY3RDYW1lcmEoY29uc3QgU3RyaW5nOCYgaW5qZWN0ZWRDYW1JZCwKKyAgICAgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgeworICAgIEFMT0dWKCIlczogVGhpcyBjbGllbnQgZG9lc24ndCBzdXBwb3J0IHRoZSBpbmplY3Rpb24gY2FtZXJhLiBpbmplY3RlZENhbUlkOiAlcyBwcm92aWRlclB0cjogJXAiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpbmplY3RlZENhbUlkLnN0cmluZygpLCBtYW5hZ2VyLmdldCgpKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQ6OnN0b3BJbmplY3Rpb24oKSB7CisgICAgQUxPR1YoIiVzOiBUaGlzIGNsaWVudCBkb2Vzbid0IHN1cHBvcnQgdGhlIGluamVjdGlvbiBjYW1lcmEuIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJldHVybiBPSzsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuaAppbmRleCBiMjE5YTRjLi5mMmM0MmQ4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudC5oCkBAIC01NCw3ICs1NCw4IEBACiAgICAgICAgICAgICBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudCgKICAgICAgICAgICAgICAgICAgICAgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIocmVtb3RlQ2FsbGJhY2spLAotICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgICAgICAgICAvLyAodiluZGsgZG9lc24ndCBoYXZlIG9mZmxpbmUgc2Vzc2lvbiBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCAvKm92ZXJyaWRlUGFja2FnZU5hbWUqL2ZhbHNlLCBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkU3RyLCBjYW1lcmFGYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCiAgICAgICAgICAgICBtUmVtb3RlQ2FsbGJhY2socmVtb3RlQ2FsbGJhY2spLCBtT2ZmbGluZVNlc3Npb24oc2Vzc2lvbiksCiAgICAgICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwKG9mZmxpbmVDb21wb3NpdGVTdHJlYW1NYXApIHt9CkBAIC03MSw2ICs3MiwxMCBAQAogCiAgICAgc3RhdHVzX3QgZHVtcENsaWVudChpbnQgLypmZCovLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiAvKmFyZ3MqLykgb3ZlcnJpZGU7CiAKKyAgICBzdGF0dXNfdCBzdGFydFdhdGNoaW5nVGFncyhjb25zdCBTdHJpbmc4ICZ0YWdzLCBpbnQgb3V0RmQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHN0b3BXYXRjaGluZ1RhZ3MoaW50IG91dEZkKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmb3V0KSBvdmVycmlkZTsKKwogICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiAvKm1hbmFnZXIqLywKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qbW9uaXRvclRhZ3MqLykgb3ZlcnJpZGU7CiAKQEAgLTg5LDcgKzk0LDcgQEAKICAgICAvLyBOb3RpZmljYXRpb25MaXN0ZW5lciBBUEkKICAgICB2b2lkIG5vdGlmeUVycm9yKGludDMyX3QgZXJyb3JDb2RlLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOwogICAgIHZvaWQgbm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsIG5zZWNzX3QgdGltZXN0YW1wKSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCBub3RpZnlBY3RpdmUoKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBub3RpZnlBY3RpdmUoZmxvYXQgbWF4UHJldmlld0Zwcykgb3ZlcnJpZGU7CiAgICAgdm9pZCBub3RpZnlJZGxlKGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsIGJvb2wgZGV2aWNlRXJyb3IsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+JiBzdHJlYW1TdGF0cykgb3ZlcnJpZGU7CiAgICAgdm9pZCBub3RpZnlBdXRvRm9jdXModWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCkgb3ZlcnJpZGU7CkBAIC05OCw2ICsxMDMsOSBAQAogICAgIHZvaWQgbm90aWZ5UHJlcGFyZWQoaW50IHN0cmVhbUlkKSBvdmVycmlkZTsKICAgICB2b2lkIG5vdGlmeVJlcXVlc3RRdWV1ZUVtcHR5KCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBub3RpZnlSZXBlYXRpbmdSZXF1ZXN0RXJyb3IobG9uZyBsYXN0RnJhbWVOdW1iZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGluamVjdENhbWVyYShjb25zdCBTdHJpbmc4JiBpbmplY3RlZENhbUlkLAorICAgICAgICAgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzdG9wSW5qZWN0aW9uKCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgICAgbXV0YWJsZSBNdXRleCBtQmluZGVyU2VyaWFsaXphdGlvbkxvY2s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uY3BwCmluZGV4IGE2NmE1OTIuLjA0OGQ4NWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uY3BwCkBAIC0xOCw2ICsxOCw5IEBACiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0NhbWVyYUJsb2IuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9DYW1lcmFCbG9iSWQuaD4KKwogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgiCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIgogI2luY2x1ZGUgInV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaCIKQEAgLTMwLDYgKzMzLDkgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAordXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFCbG9iOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFCbG9iSWQ7CisKIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpEZXB0aENvbXBvc2l0ZVN0cmVhbShzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsCiAgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYikgOgogICAgICAgICBDb21wb3NpdGVTdHJlYW0oZGV2aWNlLCBjYiksCkBAIC0yOTcsNyArMzAzLDggQEAKICAgICB9CiAKICAgICBzcDxHcmFwaGljQnVmZmVyPiBnYiA9IEdyYXBoaWNCdWZmZXI6OmZyb20oYW5iKTsKLSAgICByZXMgPSBnYi0+bG9ja0FzeW5jKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICZkc3RCdWZmZXIsIGZlbmNlRmQpOworICAgIEdyYXBoaWNCdWZmZXJMb2NrZXIgZ2JMb2NrZXIoZ2IpOworICAgIHJlcyA9IGdiTG9ja2VyLmxvY2tBc3luYygmZHN0QnVmZmVyLCBmZW5jZUZkKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgdHJ5aW5nIHRvIGxvY2sgb3V0cHV0IGJ1ZmZlciBmZW5jZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTM2Niw3ICszNzMsNyBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIHNpemVfdCBmaW5hbEpwZWdTaXplID0gYWN0dWFsSnBlZ1NpemUgKyBzaXplb2Yoc3RydWN0IGNhbWVyYV9qcGVnX2Jsb2IpOworICAgIHNpemVfdCBmaW5hbEpwZWdTaXplID0gYWN0dWFsSnBlZ1NpemUgKyBzaXplb2YoQ2FtZXJhQmxvYik7CiAgICAgaWYgKGZpbmFsSnBlZ1NpemUgPiBmaW5hbEpwZWdCdWZmZXJTaXplKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmluYWwganBlZyBidWZmZXIgbm90IGxhcmdlIGVub3VnaCBmb3IgdGhlIGpwZWcgYmxvYiBoZWFkZXIiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICBvdXRwdXRBTlctPmNhbmNlbEJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgYW5iLCAvKmZlbmNlKi8gLTEpOwpAQCAtMzgyLDEwICszODksMTAgQEAKIAogICAgIEFMT0dWKCIlczogRmluYWwganBlZyBzaXplOiAlenUiLCBfX2Z1bmNfXywgZmluYWxKcGVnU2l6ZSk7CiAgICAgdWludDhfdCogaGVhZGVyID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPiAoZHN0QnVmZmVyKSArCi0gICAgICAgIChnYi0+Z2V0V2lkdGgoKSAtIHNpemVvZihzdHJ1Y3QgY2FtZXJhX2pwZWdfYmxvYikpOwotICAgIHN0cnVjdCBjYW1lcmFfanBlZ19ibG9iICpibG9iID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgY2FtZXJhX2pwZWdfYmxvYio+IChoZWFkZXIpOwotICAgIGJsb2ItPmpwZWdfYmxvYl9pZCA9IENBTUVSQV9KUEVHX0JMT0JfSUQ7Ci0gICAgYmxvYi0+anBlZ19zaXplID0gYWN0dWFsSnBlZ1NpemU7CisgICAgICAgIChnYi0+Z2V0V2lkdGgoKSAtIHNpemVvZihDYW1lcmFCbG9iKSk7CisgICAgQ2FtZXJhQmxvYiAqYmxvYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FtZXJhQmxvYio+IChoZWFkZXIpOworICAgIGJsb2ItPmJsb2JJZCA9IENhbWVyYUJsb2JJZDo6SlBFRzsKKyAgICBibG9iLT5ibG9iU2l6ZUJ5dGVzID0gYWN0dWFsSnBlZ1NpemU7CiAgICAgb3V0cHV0QU5XLT5xdWV1ZUJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgYW5iLCAvKmZlbmNlKi8gLTEpOwogCiAgICAgcmV0dXJuIHJlczsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwCmluZGV4IGE3M2ZmYjkuLjU0Y2MyN2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcApAQCAtMjMsNyArMjMsOCBAQAogI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS90eXBlcy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0NhbWVyYUJsb2IuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9DYW1lcmFCbG9iSWQuaD4KICNpbmNsdWRlIDxsaWJ5dXYuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtNDEsOCArNDIsOCBAQAogI2luY2x1ZGUgIkhlaWNFbmNvZGVySW5mb01hbmFnZXIuaCIKICNpbmNsdWRlICJIZWljQ29tcG9zaXRlU3RyZWFtLmgiCiAKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6Q2FtZXJhQmxvYjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6Q2FtZXJhQmxvYklkOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFCbG9iOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFCbG9iSWQ7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBjYW1lcmEzIHsKQEAgLTQ0MSw2ICs0NDIsMTAgQEAKICAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1RJTEVfSEVJR0hULCBtR3JpZEhlaWdodCk7CiAgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9HUklEX1JPV1MsIG1HcmlkUm93cyk7CiAgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9HUklEX0NPTFVNTlMsIG1HcmlkQ29scyk7CisgICAgICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKKyAgICAgICAgICAgIGlmIChuZXdGb3JtYXQtPmZpbmRSZWN0KCJjcm9wIiwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpIHsKKyAgICAgICAgICAgICAgICBuZXdGb3JtYXQtPnNldFJlY3QoImNyb3AiLCAwLCAwLCBtT3V0cHV0V2lkdGggLSAxLCBtT3V0cHV0SGVpZ2h0IC0gMSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfSVNfREVGQVVMVCwgMSAvKmlzUHJpbWFyeSovKTsKQEAgLTExMzAsNyArMTEzNSw4IEBACiAgICAgLy8gQ29weSB0aGUgY29udGVudCBvZiB0aGUgZmlsZSB0byBtZW1vcnkuCiAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ2IgPSBHcmFwaGljQnVmZmVyOjpmcm9tKGlucHV0RnJhbWUuYW5iKTsKICAgICB2b2lkKiBkc3RCdWZmZXI7Ci0gICAgYXV0byByZXMgPSBnYi0+bG9ja0FzeW5jKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICZkc3RCdWZmZXIsIGlucHV0RnJhbWUuZmVuY2VGZCk7CisgICAgR3JhcGhpY0J1ZmZlckxvY2tlciBnYkxvY2tlcihnYik7CisgICAgYXV0byByZXMgPSBnYkxvY2tlci5sb2NrQXN5bmMoJmRzdEJ1ZmZlciwgaW5wdXRGcmFtZS5mZW5jZUZkKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgdHJ5aW5nIHRvIGxvY2sgb3V0cHV0IGJ1ZmZlciBmZW5jZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTExNTYsMTAgKzExNjIsMTAgQEAKIAogICAgIC8vIEZpbGwgaW4gSEVJQyBoZWFkZXIKICAgICB1aW50OF90ICpoZWFkZXIgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oZHN0QnVmZmVyKSArIG1NYXhIZWljQnVmZmVyU2l6ZSAtIHNpemVvZihDYW1lcmFCbG9iKTsKLSAgICBzdHJ1Y3QgQ2FtZXJhQmxvYiAqYmxvYkhlYWRlciA9IChzdHJ1Y3QgQ2FtZXJhQmxvYiAqKWhlYWRlcjsKKyAgICBDYW1lcmFCbG9iICpibG9iSGVhZGVyID0gKENhbWVyYUJsb2IgKiloZWFkZXI7CiAgICAgLy8gTXVzdCBiZSBpbiBzeW5jIHdpdGggQ0FNRVJBM19IRUlDX0JMT0JfSUQgaW4gYW5kcm9pZF9tZWRpYV9VdGlscy5jcHAKICAgICBibG9iSGVhZGVyLT5ibG9iSWQgPSBzdGF0aWNfY2FzdDxDYW1lcmFCbG9iSWQ+KDB4MDBGRSk7Ci0gICAgYmxvYkhlYWRlci0+YmxvYlNpemUgPSBmU2l6ZTsKKyAgICBibG9iSGVhZGVyLT5ibG9iU2l6ZUJ5dGVzID0gZlNpemU7CiAKICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChtT3V0cHV0U3VyZmFjZS5nZXQoKSwgaW5wdXRGcmFtZS50aW1lc3RhbXApOwogICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTE0MjEsMTUgKzE0MjcsMTUgQEAKIAogICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSAwOwogICAgIC8vIEZpcnN0IGNoZWNrIGZvciBFWElGIHRyYW5zcG9ydCBoZWFkZXIgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyCi0gICAgY29uc3QgdWludDhfdCAqaGVhZGVyID0gYXBwU2VnbWVudEJ1ZmZlciArIChtYXhTaXplIC0gc2l6ZW9mKHN0cnVjdCBDYW1lcmFCbG9iKSk7Ci0gICAgY29uc3Qgc3RydWN0IENhbWVyYUJsb2IgKmJsb2IgPSAoY29uc3Qgc3RydWN0IENhbWVyYUJsb2IqKShoZWFkZXIpOworICAgIGNvbnN0IHVpbnQ4X3QgKmhlYWRlciA9IGFwcFNlZ21lbnRCdWZmZXIgKyAobWF4U2l6ZSAtIHNpemVvZihDYW1lcmFCbG9iKSk7CisgICAgY29uc3QgQ2FtZXJhQmxvYiAqYmxvYiA9IChjb25zdCBDYW1lcmFCbG9iKikoaGVhZGVyKTsKICAgICBpZiAoYmxvYi0+YmxvYklkICE9IENhbWVyYUJsb2JJZDo6SlBFR19BUFBfU0VHTUVOVFMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEVYSUYgYmxvYklkICVodSIsIF9fRlVOQ1RJT05fXywgYmxvYi0+YmxvYklkKTsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEVYSUYgYmxvYklkICVkIiwgX19GVU5DVElPTl9fLCBibG9iLT5ibG9iSWQpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBleHBlY3RlZFNpemUgPSBibG9iLT5ibG9iU2l6ZTsKLSAgICBpZiAoZXhwZWN0ZWRTaXplID09IDAgfHwgZXhwZWN0ZWRTaXplID4gbWF4U2l6ZSAtIHNpemVvZihzdHJ1Y3QgQ2FtZXJhQmxvYikpIHsKKyAgICBleHBlY3RlZFNpemUgPSBibG9iLT5ibG9iU2l6ZUJ5dGVzOworICAgIGlmIChleHBlY3RlZFNpemUgPT0gMCB8fCBleHBlY3RlZFNpemUgPiBtYXhTaXplIC0gc2l6ZW9mKENhbWVyYUJsb2IpKSB7CiAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBibG9iU2l6ZSAlenUuIiwgX19GVU5DVElPTl9fLCBleHBlY3RlZFNpemUpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0xNjMyLDcgKzE2MzgsNyBAQAogICAgICAgICBtYXhBcHBzU2VnbWVudCA9IGVudHJ5LmRhdGEudThbMF0gPCAxID8gMSA6CiAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS51OFswXSA+IDE2ID8gMTYgOiBlbnRyeS5kYXRhLnU4WzBdOwogICAgIH0KLSAgICByZXR1cm4gbWF4QXBwc1NlZ21lbnQgKiAoMiArIDB4RkZGRikgKyBzaXplb2Yoc3RydWN0IENhbWVyYUJsb2IpOworICAgIHJldHVybiBtYXhBcHBzU2VnbWVudCAqICgyICsgMHhGRkZGKSArIHNpemVvZihDYW1lcmFCbG9iKTsKIH0KIAogdm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjp1cGRhdGVDb2RlY1F1YWxpdHlMb2NrZWQoaW50MzJfdCBxdWFsaXR5KSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAppbmRleCAxM2QwNDRhLi5kYzUwMDJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKQEAgLTM0LDYgKzM0LDggQEAKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogCiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzRGV2aWNlLmgiCiAjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKICNpbmNsdWRlICJ1dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmgiCiAKQEAgLTQ3LDYgKzQ5LDcgQEAKICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPFRDYW1DYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBib29sIHN5c3RlbU5hdGl2ZUNsaWVudCwKICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCkBAIC01NSwyMCArNTgsMjAgQEAKICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcyk6Ci0gICAgICAgIFRDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIHJlbW90ZUNhbGxiYWNrLCBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50RmVhdHVyZUlkLAotICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsIGNhbWVyYUZhY2luZywgc2Vuc29yT3JpZW50YXRpb24sIGNsaWVudFBpZCwgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpLAorICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAorICAgICAgICBib29sIGxlZ2FjeUNsaWVudCk6CisgICAgICAgIFRDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIHJlbW90ZUNhbGxiYWNrLCBjbGllbnRQYWNrYWdlTmFtZSwgc3lzdGVtTmF0aXZlQ2xpZW50LAorICAgICAgICAgICAgICAgIGNsaWVudEZlYXR1cmVJZCwgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBzZW5zb3JPcmllbnRhdGlvbiwgY2xpZW50UGlkLAorICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgc2VydmljZVBpZCksCiAgICAgICAgIG1TaGFyZWRDYW1lcmFDYWxsYmFja3MocmVtb3RlQ2FsbGJhY2spLAotICAgICAgICBtRGV2aWNlVmVyc2lvbihjYW1lcmFTZXJ2aWNlLT5nZXREZXZpY2VWZXJzaW9uKFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIpKSwKLSAgICAgICAgbURldmljZShuZXcgQ2FtZXJhM0RldmljZShjYW1lcmFJZCwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpKSwKICAgICAgICAgbURldmljZUFjdGl2ZShmYWxzZSksIG1BcGkxQ2FtZXJhSWQoYXBpMUNhbWVyYUlkKQogewogICAgIEFMT0dJKCJDYW1lcmEgJXM6IE9wZW5lZC4gQ2xpZW50OiAlcyAoUElEICVkLCBVSUQgJWQpIiwgY2FtZXJhSWQuc3RyaW5nKCksCiAgICAgICAgICAgICBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwgY2xpZW50UGlkLCBjbGllbnRVaWQpOwogCiAgICAgbUluaXRpYWxDbGllbnRQaWQgPSBjbGllbnRQaWQ7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlID09IDAsICJEZXZpY2Ugc2hvdWxkIG5ldmVyIGJlIE5VTEwgaGVyZS4iKTsKKyAgICBtT3ZlcnJpZGVGb3JQZXJmQ2xhc3MgPSBvdmVycmlkZUZvclBlcmZDbGFzczsKKyAgICBtTGVnYWN5Q2xpZW50ID0gbGVnYWN5Q2xpZW50OwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CkBAIC0xMDMsNyArMTA2LDI4IEBACiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KLQorICAgIElQQ1RyYW5zcG9ydCBwcm92aWRlclRyYW5zcG9ydCA9IElQQ1RyYW5zcG9ydDo6SU5WQUxJRDsKKyAgICByZXMgPSBwcm92aWRlclB0ci0+Z2V0Q2FtZXJhSWRJUENUcmFuc3BvcnQoVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKKyAgICAgICAgICAgICZwcm92aWRlclRyYW5zcG9ydCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBzd2l0Y2ggKHByb3ZpZGVyVHJhbnNwb3J0KSB7CisgICAgICAgIGNhc2UgSVBDVHJhbnNwb3J0OjpISURMOgorICAgICAgICAgICAgbURldmljZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBIaWRsQ2FtZXJhM0RldmljZShUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLCBtT3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxlZ2FjeUNsaWVudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJUENUcmFuc3BvcnQ6OkFJREw6CisgICAgICAgICAgICBtRGV2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEFpZGxDYW1lcmEzRGV2aWNlKFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIsIG1PdmVycmlkZUZvclBlcmZDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGVnYWN5Q2xpZW50KTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlcyBJbnZhbGlkIHRyYW5zcG9ydCBmb3IgY2FtZXJhIGlkICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KICAgICBpZiAobURldmljZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBObyBkZXZpY2UgY29ubmVjdGVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwpAQCAtMTU1LDYgKzE3OSwzOCBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OnN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFN0cmluZzggJnRhZ3MsIGludCBvdXQpIHsKKyAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZTsKKyAgaWYgKCFkZXZpY2UpIHsKKyAgICBkcHJpbnRmKG91dCwgIiAgRGV2aWNlIGlzIGRldGFjaGVkIik7CisgICAgcmV0dXJuIE9LOworICB9CisKKyAgcmV0dXJuIGRldmljZS0+c3RhcnRXYXRjaGluZ1RhZ3ModGFncyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KK3N0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6c3RvcFdhdGNoaW5nVGFncyhpbnQgb3V0KSB7CisgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2U7CisgIGlmICghZGV2aWNlKSB7CisgICAgZHByaW50ZihvdXQsICIgIERldmljZSBpcyBkZXRhY2hlZCIpOworICAgIHJldHVybiBPSzsKKyAgfQorCisgIHJldHVybiBkZXZpY2UtPnN0b3BXYXRjaGluZ1RhZ3MoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgorc3RhdHVzX3QgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+OjpkdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmb3V0KSB7CisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZTsKKyAgICBpZiAoIWRldmljZSkgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGR1bXAgaWYgdGhlIGRldmljZSBpcyBkZXRhY2hlZAorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiBkZXZpY2UtPmR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3Iob3V0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+OjpkdW1wRGV2aWNlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewpAQCAtMTg2LDIwICsyNDIsMjMgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KIGJpbmRlcjo6U3RhdHVzIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6ZGlzY29ubmVjdCgpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dEKCJDYW1lcmEgJXM6IHN0YXJ0IHRvIGRpc2Nvbm5lY3QiLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKKyAgICBBTE9HRCgiQ2FtZXJhICVzOiBzZXJpYWxpemF0aW9uTG9jayBhY3F1aXJlZCIsIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlcyA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIC8vIEFsbG93IGJvdGggY2xpZW50IGFuZCB0aGUgbWVkaWEgc2VydmVyIHRvIGRpc2Nvbm5lY3QgYXQgYWxsIHRpbWVzCiAgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkICE9IFRDbGllbnRCYXNlOjptQ2xpZW50UGlkICYmCiAgICAgICAgIGNhbGxpbmdQaWQgIT0gVENsaWVudEJhc2U6Om1TZXJ2aWNlUGlkKSByZXR1cm4gcmVzOwogCi0gICAgQUxPR1YoIkNhbWVyYSAlczogU2h1dHRpbmcgZG93biIsIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgIEFMT0dEKCJDYW1lcmEgJXM6IFNodXR0aW5nIGRvd24iLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKIAogICAgIC8vIEJlZm9yZSBkZXRhY2hpbmcgdGhlIGRldmljZSwgY2FjaGUgdGhlIGluZm8gZnJvbSBjdXJyZW50IG9wZW4gc2Vzc2lvbi4KICAgICAvLyBUaGUgZGlzY29ubmVjdGVkIGNoZWNrIGF2b2lkcyBkdXBsaWNhdGlvbiBvZiBpbmZvIGFuZCBhbHNvIHByZXZlbnRzCiAgICAgLy8gZGVhZGxvY2sgd2hpbGUgYWNxdWlyaW5nIHNlcnZpY2UgbG9jayBpbiBjYWNoZUR1bXAuCiAgICAgaWYgKCFUQ2xpZW50QmFzZTo6bURpc2Nvbm5lY3RlZCkgeworICAgICAgICBBTE9HRCgiQ2FtZXJhICVzOiBzdGFydCB0byBjYWNoZUR1bXAiLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKICAgICAgICAgQ2FtZXJhMkNsaWVudEJhc2U6OmdldENhbWVyYVNlcnZpY2UoKS0+Y2FjaGVEdW1wKCk7CiAgICAgfQogCkBAIC0yNTgsNyArMzE3LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgotc3RhdHVzX3QgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlBY3RpdmUoKSB7CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46Om5vdGlmeUFjdGl2ZShmbG9hdCBtYXhQcmV2aWV3RnBzKSB7CiAgICAgaWYgKCFtRGV2aWNlQWN0aXZlKSB7CiAgICAgICAgIHN0YXR1c190IHJlcyA9IFRDbGllbnRCYXNlOjpzdGFydENhbWVyYVN0cmVhbWluZ09wcygpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0yNjYsNyArMzI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICAgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nQWN0aXZlKFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIpOworICAgICAgICBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpsb2dBY3RpdmUoVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ciwgbWF4UHJldmlld0Zwcyk7CiAgICAgfQogICAgIG1EZXZpY2VBY3RpdmUgPSB0cnVlOwogCkBAIC0yNzUsOSArMzM0LDEwIEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KLXZvaWQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlJZGxlKAordm9pZCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46Om5vdGlmeUlkbGVXaXRoVXNlclRhZygKICAgICAgICAgaW50NjRfdCByZXF1ZXN0Q291bnQsIGludDY0X3QgcmVzdWx0RXJyb3JDb3VudCwgYm9vbCBkZXZpY2VFcnJvciwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0cmVhbVN0YXRzPiYgc3RyZWFtU3RhdHMpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0cmVhbVN0YXRzPiYgc3RyZWFtU3RhdHMsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB1c2VyVGFnLCBpbnQgdmlkZW9TdGFiaWxpemF0aW9uTW9kZSkgewogICAgIGlmIChtRGV2aWNlQWN0aXZlKSB7CiAgICAgICAgIHN0YXR1c190IHJlcyA9IFRDbGllbnRCYXNlOjpmaW5pc2hDYW1lcmFTdHJlYW1pbmdPcHMoKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMjg1LDcgKzM0NSw4IEBACiAgICAgICAgICAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHJlcyk7CiAgICAgICAgIH0KICAgICAgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nSWRsZShUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLAotICAgICAgICAgICAgICAgIHJlcXVlc3RDb3VudCwgcmVzdWx0RXJyb3JDb3VudCwgZGV2aWNlRXJyb3IsIHN0cmVhbVN0YXRzKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q291bnQsIHJlc3VsdEVycm9yQ291bnQsIGRldmljZUVycm9yLCB1c2VyVGFnLCB2aWRlb1N0YWJpbGl6YXRpb25Nb2RlLAorICAgICAgICAgICAgICAgIHN0cmVhbVN0YXRzKTsKICAgICB9CiAgICAgbURldmljZUFjdGl2ZSA9IGZhbHNlOwogCkBAIC0zNjEsMTEgKzQyMiw2IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KLWludCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmdldENhbWVyYURldmljZVZlcnNpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1EZXZpY2VWZXJzaW9uOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CiBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiYgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+OjpnZXRDYW1lcmFEZXZpY2UoKSB7CiAgICAgcmV0dXJuIG1EZXZpY2U7CiB9CkBAIC00MTMsNiArNDY5LDE3IEBACiAgICAgbVJlbW90ZUNhbGxiYWNrLmNsZWFyKCk7CiB9CiAKK3RlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KK3N0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6aW5qZWN0Q2FtZXJhKGNvbnN0IFN0cmluZzgmIGluamVjdGVkQ2FtSWQsCisgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgeworICAgIHJldHVybiBtRGV2aWNlLT5pbmplY3RDYW1lcmEoaW5qZWN0ZWRDYW1JZCwgbWFuYWdlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KK3N0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6c3RvcEluamVjdGlvbigpIHsKKyAgICByZXR1cm4gbURldmljZS0+c3RvcEluamVjdGlvbigpOworfQorCiB0ZW1wbGF0ZSBjbGFzcyBDYW1lcmEyQ2xpZW50QmFzZTxDYW1lcmFTZXJ2aWNlOjpDbGllbnQ+OwogdGVtcGxhdGUgY2xhc3MgQ2FtZXJhMkNsaWVudEJhc2U8Q2FtZXJhRGV2aWNlQ2xpZW50QmFzZT47CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKaW5kZXggNjI0NmY3Yi4uYjBkMWMzZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKQEAgLTQ4LDYgKzQ4LDcgQEAKICAgICBDYW1lcmEyQ2xpZW50QmFzZShjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUQ2FtQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtTmF0aXZlQ2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKQEAgLTU2LDExICs1NywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICAgICAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsZWdhY3lDbGllbnQgPSBmYWxzZSk7CiAgICAgdmlydHVhbCB+Q2FtZXJhMkNsaWVudEJhc2UoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkdW1wQ2xpZW50KGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIHN0YXJ0V2F0Y2hpbmdUYWdzKGNvbnN0IFN0cmluZzggJnRhZ3MsIGludCBvdXQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBzdG9wV2F0Y2hpbmdUYWdzKGludCBvdXQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkdW1wV2F0Y2hlZEV2ZW50c1RvVmVjdG9yKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmb3V0KTsKIAogICAgIC8qKgogICAgICAqIE5vdGlmaWNhdGlvbkxpc3RlbmVyIGltcGxlbWVudGF0aW9uCkBAIC02OCwxMCArNzMsMTEgQEAKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgbm90aWZ5QWN0aXZlKCk7ICAvLyBSZXR1cm5zIGVycm9ycyBvbiBhcHAgb3BzIHBlcm1pc3Npb24gZmFpbHVyZXMKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5SWRsZShpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvckNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGV2aWNlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0cmVhbVN0YXRzPiYgc3RyZWFtU3RhdHMpOworICAgIC8vIFJldHVybnMgZXJyb3JzIG9uIGFwcCBvcHMgcGVybWlzc2lvbiBmYWlsdXJlcworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBub3RpZnlBY3RpdmUoZmxvYXQgbWF4UHJldmlld0Zwcyk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUlkbGUoaW50NjRfdCAvKnJlcXVlc3RDb3VudCovLCBpbnQ2NF90IC8qcmVzdWx0RXJyb3JDb3VudCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLypkZXZpY2VFcnJvciovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mKSB7fQogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUF1dG9Gb2N1cyh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKTsKQEAgLTgyLDYgKzg4LDExIEBACiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeVJlcXVlc3RRdWV1ZUVtcHR5KCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeVJlcGVhdGluZ1JlcXVlc3RFcnJvcihsb25nIGxhc3RGcmFtZU51bWJlcik7CiAKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgbm90aWZ5SWRsZVdpdGhVc2VyVGFnKGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZXZpY2VFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+JiBzdHJlYW1TdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdXNlclRhZywgaW50IHZpZGVvU3RhYmlsaXphdGlvbk1vZGUpOworCiAgICAgaW50ICAgICAgICAgICAgICAgICAgIGdldENhbWVyYUlkKCkgY29uc3Q7CiAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbWVyYURldmljZSgpOwpAQCAtMTE0LDEwICsxMjUsMTYgQEAKICAgICAgICAgbXV0YWJsZSBNdXRleCBtUmVtb3RlQ2FsbGJhY2tMb2NrOwogICAgIH0gbVNoYXJlZENhbWVyYUNhbGxiYWNrczsKIAorICAgIHN0YXR1c190ICAgICAgaW5qZWN0Q2FtZXJhKGNvbnN0IFN0cmluZzgmIGluamVjdGVkQ2FtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCAgICAgIHN0b3BJbmplY3Rpb24oKSBvdmVycmlkZTsKKwogcHJvdGVjdGVkOgogCiAgICAgLy8gVGhlIFBJRCBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3IgY2FsbAogICAgIHBpZF90IG1Jbml0aWFsQ2xpZW50UGlkOworICAgIGJvb2wgbU92ZXJyaWRlRm9yUGVyZkNsYXNzID0gZmFsc2U7CisgICAgYm9vbCBtTGVnYWN5Q2xpZW50ID0gZmFsc2U7CiAKICAgICB2aXJ0dWFsIHNwPElCaW5kZXI+IGFzQmluZGVyV3JhcHBlcigpIHsKICAgICAgICAgcmV0dXJuIElJbnRlcmZhY2U6OmFzQmluZGVyKHRoaXMpOwpAQCAtMTM1LDExICsxNTIsMTIgQEAKIAogICAgIC8qKiBDYW1lcmFEZXZpY2VCYXNlIGluc3RhbmNlIHdyYXBwaW5nIEhBTDMrIGVudHJ5ICovCiAKLSAgICBjb25zdCBpbnQgbURldmljZVZlcnNpb247Ci0KLSAgICAvLyBTZXQgdG8gY29uc3QgdG8gYXZvaWQgbURldmljZSBiZWluZyB1cGRhdGVkICh1cGRhdGUgb2Ygc3A8PiBpcyByYWN5KSBkdXJpbmcKLSAgICAvLyBkdW1wRGV2aWNlICh3aGljaCBpcyBpbXBvcnRhbnQgdG8gYmUgbG9jayBmcmVlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSkKLSAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAgbURldmljZTsKKyAgICAvLyBOb3RlOiBUaGlzIHdhcyBwcmV2aW91c2x5IHNldCB0byBjb25zdCB0byBhdm9pZCBtRGV2aWNlIGJlaW5nIHVwZGF0ZWQgLQorICAgIC8vIGIvMTEyNjM5OTM5ICh1cGRhdGUgb2Ygc3A8PiBpcyByYWN5KSBkdXJpbmcgZHVtcERldmljZSAod2hpY2ggaXMgaW1wb3J0YW50IHRvIGJlIGxvY2sgZnJlZQorICAgIC8vIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSkuIFRoZSBjb25zdCBoYXMgYmVlbiByZW1vdmVkIHNpbmNlIENhbWVyYURldmljZUJhc2UKKyAgICAvLyBuZWVkcyB0byBiZSBzZXQgZHVyaW5nIGluaXRpYWxpemVJbXBsKCkuIFRoaXMgbXVzdCBub3QgYmUgc2V0IC8gY2xlYXJlZAorICAgIC8vIGFueXdoZXJlIGVsc2UuCisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gIG1EZXZpY2U7CiAKICAgICAvKiogVXRpbGl0eSBtZW1iZXJzICovCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCmluZGV4IDg1YjBjYzIuLjdlMmY5M2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgImRldmljZTMvU3RhdHVzVHJhY2tlci5oIgogI2luY2x1ZGUgImJpbmRlci9TdGF0dXMuaCIKICNpbmNsdWRlICJGcmFtZVByb2R1Y2VyLmgiCisjaW5jbHVkZSAidXRpbHMvSVBDVHJhbnNwb3J0LmgiCiAKICNpbmNsdWRlICJDYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UuaCIKIApAQCAtNTksNiArNjAsOSBAQAogICAgIENBTUVSQV9WRU5ET1JfU1RSRUFNX0NPTkZJR1VSQVRJT05fTU9ERV9TVEFSVCA9IDB4ODAwMAogfSBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90OwogCisvLyBNYXRjaGVzIGRlZmluaXRpb24gb2YgY2FtZXJhM19qcGVnX2Jsb2IgaW4gY2FtZXJhMy5oIGFuZCBISURMIGRlZmluaXRpb24KKy8vIGRldmljZUAzLjI6dHlwZXMuaGFsLCBuZWVkcyB0byBzdGF5IGFyb3VuZCB0aWxsIEhJREwgc3VwcG9ydCBpcyByZW1vdmVkIChmb3IKKy8vIEhJREwgLT4gQUlETCBjYW1lcmFCbG9iIHRyYW5zbGF0aW9uKQogdHlwZWRlZiBzdHJ1Y3QgY2FtZXJhX2pwZWdfYmxvYiB7CiAgICAgdWludDE2X3QganBlZ19ibG9iX2lkOwogICAgIHVpbnQzMl90IGpwZWdfc2l6ZTsKQEAgLTg4LDYgKzkyLDggQEAKICAgcHVibGljOgogICAgIHZpcnR1YWwgfkNhbWVyYURldmljZUJhc2UoKTsKIAorICAgIHZpcnR1YWwgSVBDVHJhbnNwb3J0IGdldFRyYW5zcG9ydFR5cGUoKSBjb25zdCA9IDA7CisKICAgICAvKioKICAgICAgKiBUaGUgZGV2aWNlIHZlbmRvciB0YWcgSUQKICAgICAgKi8KQEAgLTk3LDE1ICsxMDMsMjkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3QoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFdhdGNoaW5nVGFncyhjb25zdCBTdHJpbmc4ICZ0YWdzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wV2F0Y2hpbmdUYWdzKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFdhdGNoZWRFdmVudHNUb1ZlY3RvcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm91dCkgPSAwOwogCiAgICAgLyoqCi0gICAgICogVGhlIHBoeXNpY2FsIGNhbWVyYSBkZXZpY2UncyBzdGF0aWMgY2hhcmFjdGVyaXN0aWNzIG1ldGFkYXRhIGJ1ZmZlcgorICAgICAqIFRoZSBwaHlzaWNhbCBjYW1lcmEgZGV2aWNlJ3Mgc3RhdGljIGNoYXJhY3RlcmlzdGljcyBtZXRhZGF0YSBidWZmZXIsIG9yCisgICAgICogdGhlIGxvZ2ljYWwgY2FtZXJhJ3Mgc3RhdGljIGNoYXJhY3RlcmlzdGljcyBpZiBwaHlzaWNhbCBpZCBpcyBlbXB0eS4KICAgICAgKi8KICAgICB2aXJ0dWFsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvUGh5c2ljYWwoY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxJZCkgY29uc3QgPSAwOwogCiAgICAgc3RydWN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgewogICAgICAgICBzdGQ6OnN0cmluZyBjYW1lcmFJZDsKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CisKKyAgICAgICAgLy8gV2hldGhlciB0aGUgcGh5c2ljYWwgY2FtZXJhIHN1cHBvcnRzIHRlc3RQYXR0ZXJuTW9kZS90ZXN0UGF0dGVybkRhdGEKKyAgICAgICAgYm9vbCBtSGFzVGVzdFBhdHRlcm5Nb2RlVGFnID0gdHJ1ZTsKKyAgICAgICAgYm9vbCBtSGFzVGVzdFBhdHRlcm5EYXRhVGFnID0gdHJ1ZTsKKworICAgICAgICAvLyBPcmlnaW5hbCB2YWx1ZSBvZiBURVNUX1BBVFRFUk5fTU9ERSBhbmQgREFUQSBzbyB0aGF0IHRoZXkgY2FuIGJlCisgICAgICAgIC8vIHJlc3RvcmVkIHdoZW4gc2Vuc29yIG11dGluZyBpcyB0dXJuZWQgb2ZmCisgICAgICAgIGludDMyX3QgbU9yaWdpbmFsVGVzdFBhdHRlcm5Nb2RlID0gMDsKKyAgICAgICAgaW50MzJfdCBtT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbNF0gPSB7fTsKKwogICAgIH07CiAgICAgdHlwZWRlZiBMaXN0PFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0OwogCkBAIC0xNjgsNyArMTg4LDExIEBACiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzID0gbnVsbHB0ciwKICAgICAgICAgICAgIGludCBzdHJlYW1TZXRJZCA9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELAogICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCkgPSAwOworICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDAsCisgICAgICAgICAgICBpbnQ2NF90IGR5bmFtaWNQcm9maWxlID0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCwKKyAgICAgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSA9IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgbWlycm9yTW9kZSA9IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX0FVVE8pID0gMDsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBvdXRwdXQgc3RyZWFtIG9mIHRoZSByZXF1ZXN0ZWQgc2l6ZSwgZm9ybWF0LCByb3RhdGlvbiBhbmQKQEAgLTE4NSw3ICsyMDksMTEgQEAKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMgPSBudWxscHRyLAogICAgICAgICAgICAgaW50IHN0cmVhbVNldElkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCiAgICAgICAgICAgICBib29sIGlzU2hhcmVkID0gZmFsc2UsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwKSA9IDA7CisgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCwKKyAgICAgICAgICAgIGludDY0X3QgZHluYW1pY1Byb2ZpbGUgPSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJELAorICAgICAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlID0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCwKKyAgICAgICAgICAgIGludCB0aW1lc3RhbXBCYXNlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfREVGQVVMVCwKKyAgICAgICAgICAgIGludCBtaXJyb3JNb2RlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTykgPSAwOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuIGlucHV0IHN0cmVhbSBvZiB3aWR0aCwgaGVpZ2h0LCBhbmQgZm9ybWF0LgpAQCAtMjA2LDEwICsyMzQsMTIgQEAKICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOwogICAgICAgICBib29sIGRhdGFTcGFjZU92ZXJyaWRkZW47CiAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIG9yaWdpbmFsRGF0YVNwYWNlOworICAgICAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGU7CiAKICAgICAgICAgU3RyZWFtSW5mbygpIDogd2lkdGgoMCksIGhlaWdodCgwKSwgZm9ybWF0KDApLCBmb3JtYXRPdmVycmlkZGVuKGZhbHNlKSwgb3JpZ2luYWxGb3JtYXQoMCksCiAgICAgICAgICAgICAgICAgZGF0YVNwYWNlKEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiksIGRhdGFTcGFjZU92ZXJyaWRkZW4oZmFsc2UpLAotICAgICAgICAgICAgICAgIG9yaWdpbmFsRGF0YVNwYWNlKEhBTF9EQVRBU1BBQ0VfVU5LTk9XTikge30KKyAgICAgICAgICAgICAgICBvcmlnaW5hbERhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pLAorICAgICAgICAgICAgICAgIGR5bmFtaWNSYW5nZVByb2ZpbGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCl7fQogICAgICAgICAvKioKICAgICAgICAgICogQ2hlY2sgd2hldGhlciB0aGUgZm9ybWF0IG1hdGNoZXMgdGhlIGN1cnJlbnQgb3IgdGhlIG9yaWdpbmFsIG9uZSBpbiBjYXNlCiAgICAgICAgICAqIGl0IGdvdCBvdmVycmlkZGVuLgpAQCAtMjk0LDcgKzMyNCw4IEBACiAgICAgICogR2V0IEpwZWcgYnVmZmVyIHNpemUgZm9yIGEgZ2l2ZW4ganBlZyByZXNvbHV0aW9uLgogICAgICAqIE5lZ2F0aXZlIHZhbHVlcyBhcmUgZXJyb3IgY29kZXMuCiAgICAgICovCi0gICAgdmlydHVhbCBzc2l6ZV90IGdldEpwZWdCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0SnBlZ0J1ZmZlclNpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmluZm8sIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0KSBjb25zdCA9IDA7CiAKICAgICAvKioKICAgICAgKiBDb25uZWN0IEhBTCBub3RpZmljYXRpb25zIHRvIGEgbGlzdGVuZXIuIE92ZXJ3cml0ZXMgcHJldmlvdXMKQEAgLTQyNyw2ICs0NTgsMTggQEAKICAgICAgKi8KICAgICB2b2lkIHNldEltYWdlRHVtcE1hc2soaW50IG1hc2spIHsgbUltYWdlRHVtcE1hc2sgPSBtYXNrOyB9CiAKKyAgICAvKioKKyAgICAgKiBUaGUgaW5qZWN0aW9uIGNhbWVyYSBzZXNzaW9uIHRvIHJlcGxhY2UgdGhlIGludGVybmFsIGNhbWVyYQorICAgICAqIHNlc3Npb24uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbmplY3RDYW1lcmEoY29uc3QgU3RyaW5nOCYgaW5qZWN0ZWRDYW1JZCwKKyAgICAgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgPSAwOworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgaW5qZWN0aW9uIGNhbWVyYSBhbmQgcmVzdG9yZSB0byBpbnRlcm5hbCBjYW1lcmEgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbmplY3Rpb24oKSA9IDA7CisKIHByb3RlY3RlZDoKICAgICBib29sIG1JbWFnZUR1bXBNYXNrID0gMDsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlLmgKaW5kZXggNTRlNDJhNi4uZjM5YjkyYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UuaApAQCAtNDAsNyArNDAsOCBAQAogICAgIC8vIFJlcXVpcmVkIGZvciBBUEkgMSBhbmQgMgogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBub3RpZnlBY3RpdmUoKSA9IDA7IC8vIE1heSByZXR1cm4gYW4gZXJyb3Igc2luY2UgaXQgY2hlY2tzIGFwcG9wcworICAgIC8vIE1heSByZXR1cm4gYW4gZXJyb3Igc2luY2UgaXQgY2hlY2tzIGFwcG9wcworICAgIHZpcnR1YWwgc3RhdHVzX3Qgbm90aWZ5QWN0aXZlKGZsb2F0IG1heFByZXZpZXdGcHMpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SWRsZShpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvciwgYm9vbCBkZXZpY2VFcnJvciwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKSA9IDA7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlckluZm9UZW1wbGF0ZWQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlckluZm9UZW1wbGF0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjc2OTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVySW5mb1RlbXBsYXRlZC5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFQUk9WSURFUklORk9fVEVNUExBVEVESAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVBST1ZJREVSSU5GT19URU1QTEFURURICisKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGUgPGNsYXNzIFZlbmRvclRhZ1NlY3Rpb25WZWN0b3JUeXBlLCBjbGFzcyBWZW5kb3JUYWdTZWN0aW9uVHlwZT4KK3N0YXR1c190IElkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSWRsKAorICAgICAgICBjb25zdCBWZW5kb3JUYWdTZWN0aW9uVmVjdG9yVHlwZSYgdnRzLAorICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgeworCisgICAgaW50IHRhZ0NvdW50ID0gMDsKKworICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgdnRzLnNpemUoKTsgcysrKSB7CisgICAgICAgIHRhZ0NvdW50ICs9IHZ0c1tzXS50YWdzLnNpemUoKTsKKyAgICB9CisKKyAgICBpZiAodGFnQ291bnQgPCAwIHx8IHRhZ0NvdW50ID4gSU5UMzJfTUFYKSB7CisgICAgICAgIEFMT0dFKCIlczogdGFnIGNvdW50ICVkIGZyb20gdmVuZG9yIHRhZyBzZWN0aW9ucyBpcyBpbnZhbGlkLiIsIF9fRlVOQ1RJT05fXywgdGFnQ291bnQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIFZlY3Rvcjx1aW50MzJfdD4gdGFnQXJyYXk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRih0YWdBcnJheS5yZXNpemUodGFnQ291bnQpICE9IHRhZ0NvdW50LAorICAgICAgICAgICAgIiVzOiB0b28gbWFueSAoJXUpIHZlbmRvciB0YWdzIGRlZmluZWQuIiwgX19GVU5DVElPTl9fLCB0YWdDb3VudCk7CisgICAgc3A8SWRsVmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBJZGxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgZGVzYy0+bVRhZ0NvdW50ID0gdGFnQ291bnQ7CisKKyAgICBTb3J0ZWRWZWN0b3I8U3RyaW5nOD4gc2VjdGlvbnM7CisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIFN0cmluZzg+IHRhZ1RvU2VjdGlvbk1hcDsKKworICAgIGludCBpZHggPSAwOworICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgdnRzLnNpemUoKTsgcysrKSB7CisgICAgICAgIGNvbnN0IFZlbmRvclRhZ1NlY3Rpb25UeXBlJiBzZWN0aW9uID0gdnRzW3NdOworICAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uTmFtZSA9IHNlY3Rpb24uc2VjdGlvbk5hbWUuY19zdHIoKTsKKyAgICAgICAgaWYgKHNlY3Rpb25OYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc2VjdGlvbiBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgc2VjdGlvbiAlenUuIiwgX19GVU5DVElPTl9fLCBzKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nOCBzZWN0aW9uU3RyaW5nKHNlY3Rpb25OYW1lKTsKKyAgICAgICAgc2VjdGlvbnMuYWRkKHNlY3Rpb25TdHJpbmcpOworCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2VjdGlvbi50YWdzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICB1aW50MzJfdCB0YWcgPSBzZWN0aW9uLnRhZ3Nbal0udGFnSWQ7CisgICAgICAgICAgICBpZiAodGFnIDwgQ0FNRVJBX01FVEFEQVRBX1ZFTkRPUl9UQUdfQk9VTkRBUlkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHZlbmRvciB0YWcgJWQgbm90IGluIHZlbmRvciB0YWcgc2VjdGlvbi4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGFnQXJyYXkuZWRpdEl0ZW1BdChpZHgrKykgPSBzZWN0aW9uLnRhZ3Nbal0udGFnSWQ7CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZ05hbWUgPSBzZWN0aW9uLnRhZ3Nbal0udGFnTmFtZS5jX3N0cigpOworICAgICAgICAgICAgaWYgKHRhZ05hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogbm8gdGFnIG5hbWUgZGVmaW5lZCBmb3IgdmVuZG9yIHRhZyAlZC4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc2MtPm1UYWdUb05hbWVNYXAuYWRkKHRhZywgU3RyaW5nOCh0YWdOYW1lKSk7CisgICAgICAgICAgICB0YWdUb1NlY3Rpb25NYXAuYWRkKHRhZywgc2VjdGlvblN0cmluZyk7CisKKyAgICAgICAgICAgIGludCB0YWdUeXBlID0gKGludCkgc2VjdGlvbi50YWdzW2pdLnRhZ1R5cGU7CisgICAgICAgICAgICBpZiAodGFnVHlwZSA8IDAgfHwgdGFnVHlwZSA+PSBOVU1fVFlQRVMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHRhZyB0eXBlICVkIGZyb20gdmVuZG9yIG9wcyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHRhZ1R5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXNjLT5tVGFnVG9UeXBlTWFwLmFkZCh0YWcsIHRhZ1R5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgZGVzYy0+bVNlY3Rpb25zID0gc2VjdGlvbnM7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRhZ0FycmF5LnNpemUoKTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IHRhZ0FycmF5W2ldOworICAgICAgICBTdHJpbmc4IHNlY3Rpb25TdHJpbmcgPSB0YWdUb1NlY3Rpb25NYXAudmFsdWVGb3IodGFnKTsKKworICAgICAgICAvLyBTZXQgdXAgdGFnIHRvIHNlY3Rpb24gaW5kZXggbWFwCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBzZWN0aW9ucy5pbmRleE9mKHNlY3Rpb25TdHJpbmcpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4IDwgMCwgImluZGV4ICV6ZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIsIGluZGV4KTsKKyAgICAgICAgZGVzYy0+bVRhZ1RvU2VjdGlvbk1hcC5hZGQodGFnLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZXgpKTsKKworICAgICAgICAvLyBTZXQgdXAgcmV2ZXJzZSBtYXBwaW5nCisgICAgICAgIHNzaXplX3QgcmV2ZXJzZUluZGV4ID0gLTE7CisgICAgICAgIGlmICgocmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmluZGV4T2ZLZXkoc2VjdGlvblN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KiBuYW1lTWFwcGVyID0gbmV3IEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90PigpOworICAgICAgICAgICAgcmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmFkZChzZWN0aW9uU3RyaW5nLCBuYW1lTWFwcGVyKTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tUmV2ZXJzZU1hcHBpbmdbcmV2ZXJzZUluZGV4XS0+YWRkKGRlc2MtPm1UYWdUb05hbWVNYXAudmFsdWVGb3IodGFnKSwgdGFnKTsKKyAgICB9CisKKyAgICBkZXNjcmlwdG9yID0gc3RkOjptb3ZlKGRlc2MpOworICAgIHJldHVybiBPSzsKK30KKworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcAppbmRleCA0ZjJiODc4Li5hYmFlYTY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcApAQCAtMjAsMTQgKzIwLDE3IEBACiAKICNpbmNsdWRlICJDYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjcvSUNhbWVyYURldmljZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0lDYW1lcmFEZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSAiY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJoaWRsL0hpZGxQcm92aWRlckluZm8uaCIKKyNpbmNsdWRlICJhaWRsL0FpZGxQcm92aWRlckluZm8uaCIKICNpbmNsdWRlIDxkbGZjbi5oPgogI2luY2x1ZGUgPGZ1dHVyZT4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CkBAIC0zNiw3ICszOSw2IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKICNpbmNsdWRlICJhcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaCIKQEAgLTQ1LDI2ICs0Nyw1MyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOwotdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOwotdXNpbmcgY2FtZXJhMzo6U2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmNhbWVyYTM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1czsKK3VzaW5nIG5hbWVzcGFjZSBjYW1lcmEzOjpTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOwogdXNpbmcgc3RkOjpsaXRlcmFsczo6Y2hyb25vX2xpdGVyYWxzOjpvcGVyYXRvciIiczsKIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbjsKLXVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl83OjpDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uOwogCiBuYW1lc3BhY2UgewogY29uc3QgYm9vbCBrRW5hYmxlTGF6eUhhbChwcm9wZXJ0eV9nZXRfYm9vbCgicm8uY2FtZXJhLmVuYWJsZUxhenlIYWwiLCBmYWxzZSkpOworY29uc3Qgc3RkOjpzdHJpbmcga0V4dGVybmFsUHJvdmlkZXJOYW1lID0gImV4dGVybmFsLzAiOwogfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIGNvbnN0IGZsb2F0IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6a0RlcHRoQVJUb2xlcmFuY2UgPSAuMWY7CiAKLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6SGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eQotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eXt9OworQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpIaWRsU2VydmljZUludGVyYWN0aW9uUHJveHlJbXBsCitDYW1lcmFQcm92aWRlck1hbmFnZXI6OnNIaWRsU2VydmljZUludGVyYWN0aW9uUHJveHl7fTsKIAogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjp+Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyKCkgewogfQogCitjb25zdCBjaGFyKiBGcmFtZXdvcmtUb3JjaFN0YXR1c1RvU3RyaW5nKGNvbnN0IFRvcmNoTW9kZVN0YXR1cyYgcykgeworICAgIHN3aXRjaCAocykgeworICAgICAgICBjYXNlIFRvcmNoTW9kZVN0YXR1czo6Tk9UX0FWQUlMQUJMRToKKyAgICAgICAgICAgIHJldHVybiAiTk9UX0FWQUlMQUJMRSI7CisgICAgICAgIGNhc2UgVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT0ZGOgorICAgICAgICAgICAgcmV0dXJuICJBVkFJTEFCTEVfT0ZGIjsKKyAgICAgICAgY2FzZSBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PTjoKKyAgICAgICAgICAgIHJldHVybiAiQVZBSUxBQkxFX09OIjsKKyAgICB9CisgICAgQUxPR1coIlVuZXhwZWN0ZWQgSEFMIHRvcmNoIG1vZGUgc3RhdHVzIGNvZGUgJWQiLCBzKTsKKyAgICByZXR1cm4gIlVOS05PV05fU1RBVFVTIjsKK30KKworY29uc3QgY2hhciogRnJhbWV3b3JrRGV2aWNlU3RhdHVzVG9TdHJpbmcoY29uc3QgQ2FtZXJhRGV2aWNlU3RhdHVzJiBzKSB7CisgICAgc3dpdGNoIChzKSB7CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVDoKKyAgICAgICAgICAgIHJldHVybiAiTk9UX1BSRVNFTlQiOworICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVDoKKyAgICAgICAgICAgIHJldHVybiAiUFJFU0VOVCI7CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpFTlVNRVJBVElORzoKKyAgICAgICAgICAgIHJldHVybiAiRU5VTUVSQVRJTkciOworICAgIH0KKyAgICBBTE9HVygiVW5leHBlY3RlZCBIQUwgZGV2aWNlIHN0YXR1cyBjb2RlICVkIiwgcyk7CisgICAgcmV0dXJuICJVTktOT1dOX1NUQVRVUyI7Cit9CisKIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+Ci1DYW1lcmFQcm92aWRlck1hbmFnZXI6OkhhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHk6Omxpc3RTZXJ2aWNlcygpIHsKK0NhbWVyYVByb3ZpZGVyTWFuYWdlcjo6SGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5SW1wbDo6bGlzdFNlcnZpY2VzKCkgewogICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+IHJldDsKICAgICBhdXRvIG1hbmFnZXIgPSBoYXJkd2FyZTo6ZGVmYXVsdFNlcnZpY2VNYW5hZ2VyMV8yKCk7CiAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbHB0cikgewpAQCAtNzYsMjAgKzEwNSwxMSBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aW5pdGlhbGl6ZSh3cDxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lciwKLSAgICAgICAgU2VydmljZUludGVyYWN0aW9uUHJveHkqIHByb3h5KSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKLSAgICBpZiAocHJveHkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IE5vIHZhbGlkIHNlcnZpY2UgaW50ZXJhY3Rpb24gcHJveHkgcHJvdmlkZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICBtU2VydmljZVByb3h5ID0gcHJveHk7Ci0gICAgbURldmljZVN0YXRlID0gc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPj4oCi0gICAgICAgIHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZTo6Tk9STUFMKTsKLQorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjp0cnlUb0luaXRBbmRBZGRIaWRsUHJvdmlkZXJzTG9ja2VkKAorICAgICAgICBIaWRsU2VydmljZUludGVyYWN0aW9uUHJveHkgKmhpZGxQcm94eSkgeworICAgIG1IaWRsU2VydmljZVByb3h5ID0gaGlkbFByb3h5OwogICAgIC8vIFJlZ2lzdGVyaW5nIHdpbGwgdHJpZ2dlciBub3RpZmljYXRpb25zIGZvciBhbGwgYWxyZWFkeS1rbm93biBwcm92aWRlcnMKLSAgICBib29sIHN1Y2Nlc3MgPSBtU2VydmljZVByb3h5LT5yZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoCisgICAgYm9vbCBzdWNjZXNzID0gbUhpZGxTZXJ2aWNlUHJveHktPnJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucygKICAgICAgICAgLyogaW5zdGFuY2UgbmFtZSwgZW1wdHkgbWVhbnMgbm8gZmlsdGVyICovICIiLAogICAgICAgICB0aGlzKTsKICAgICBpZiAoIXN1Y2Nlc3MpIHsKQEAgLTk4LDE0ICsxMTgsNTcgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotCi0gICAgZm9yIChjb25zdCBhdXRvJiBpbnN0YW5jZSA6IG1TZXJ2aWNlUHJveHktPmxpc3RTZXJ2aWNlcygpKSB7Ci0gICAgICAgIHRoaXMtPmFkZFByb3ZpZGVyTG9ja2VkKGluc3RhbmNlKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGluc3RhbmNlIDogbUhpZGxTZXJ2aWNlUHJveHktPmxpc3RTZXJ2aWNlcygpKSB7CisgICAgICAgIHRoaXMtPmFkZEhpZGxQcm92aWRlckxvY2tlZChpbnN0YW5jZSk7CiAgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGdldEZ1bGxBaWRsUHJvdmlkZXJOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nIGluc3RhbmNlKSB7CisgICAgc3RkOjpzdHJpbmcgYWlkbEhhbFNlcnZpY2VEZXNjcmlwdG9yID0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpJQ2FtZXJhUHJvdmlkZXI6OmRlc2NyaXB0b3IpOworICAgcmV0dXJuIGFpZGxIYWxTZXJ2aWNlRGVzY3JpcHRvciArICIvIiArIGluc3RhbmNlOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnRyeVRvQWRkQWlkbFByb3ZpZGVyc0xvY2tlZCgpIHsKKyAgICBjb25zdCBjaGFyICogYWlkbEhhbFNlcnZpY2VEZXNjcmlwdG9yID0KKyAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpJQ2FtZXJhUHJvdmlkZXI6OmRlc2NyaXB0b3I7CisgICAgYXV0byBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIGF1dG8gYWlkbFByb3ZpZGVycyA9IHNtLT5nZXREZWNsYXJlZEluc3RhbmNlcygKKyAgICAgICAgICAgIFN0cmluZzE2KGFpZGxIYWxTZXJ2aWNlRGVzY3JpcHRvcikpOworICAgIGZvciAoY29uc3QgYXV0byAmYWlkbEluc3RhbmNlIDogYWlkbFByb3ZpZGVycykgeworICAgICAgICBzdGQ6OnN0cmluZyBhaWRsU2VydmljZU5hbWUgPQorICAgICAgICAgICAgICAgIGdldEZ1bGxBaWRsUHJvdmlkZXJOYW1lKHN0ZDo6c3RyaW5nKFN0cmluZzgoYWlkbEluc3RhbmNlKS5jX3N0cigpKSk7CisgICAgICAgIGF1dG8gcmVzID0gc20tPnJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucyhTdHJpbmcxNihhaWRsU2VydmljZU5hbWUuY19zdHIoKSksIHRoaXMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgVW5hYmxlIHRvIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIHdpdGggQUlETCBzZXJ2aWNlIG1hbmFnZXIiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBhZGRBaWRsUHJvdmlkZXJMb2NrZWQoYWlkbFNlcnZpY2VOYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmluaXRpYWxpemUod3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXIsCisgICAgICAgIEhpZGxTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSogaGlkbFByb3h5KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKyAgICBpZiAoaGlkbFByb3h5ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyB2YWxpZCBzZXJ2aWNlIGludGVyYWN0aW9uIHByb3h5IHByb3ZpZGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgbURldmljZVN0YXRlID0gMDsKKyAgICBhdXRvIHJlcyA9IHRyeVRvSW5pdEFuZEFkZEhpZGxQcm92aWRlcnNMb2NrZWQoaGlkbFByb3h5KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIC8vIExvZ2dpbmcgZG9uZSBpbiBjYWxsZWQgZnVuY3Rpb247CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJlcyA9IHRyeVRvQWRkQWlkbFByb3ZpZGVyc0xvY2tlZCgpOwogCiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0ZDo6cGFpcjxpbnQsIGludD4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRDYW1lcmFDb3VudCgpIGNvbnN0IHsKQEAgLTIxMSwxNSArMjc0LDEzIEBACiAgICAgcmV0dXJuIGRldmljZUlkczsKIH0KIAotYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzVmFsaWREZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtYWpvclZlcnNpb24pIGNvbnN0IHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwotICAgIHJldHVybiBpc1ZhbGlkRGV2aWNlTG9ja2VkKGlkLCBtYWpvclZlcnNpb24pOwotfQotCi1ib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNWYWxpZERldmljZUxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1ham9yVmVyc2lvbikgY29uc3QgeworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzVmFsaWREZXZpY2VMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtYWpvclZlcnNpb24sCisgICAgICAgIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQpIGNvbnN0IHsKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBJUENUcmFuc3BvcnQgcHJvdmlkZXJUcmFuc3BvcnQgPSBwcm92aWRlci0+Z2V0SVBDVHJhbnNwb3J0KCk7CiAgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IHByb3ZpZGVyLT5tRGV2aWNlcykgewotICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1JZCA9PSBpZCAmJiBkZXZpY2VJbmZvLT5tVmVyc2lvbi5nZXRfbWFqb3IoKSA9PSBtYWpvclZlcnNpb24pIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tSWQgPT0gaWQgJiYgZGV2aWNlSW5mby0+bVZlcnNpb24uZ2V0X21ham9yKCkgPT0gbWFqb3JWZXJzaW9uICYmCisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9PSBwcm92aWRlclRyYW5zcG9ydCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yNjcsMTUgKzMyOCwzMSBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCi0gICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSBjb25zdCB7CisgICAgICAgIGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAorICAgICAgICBtZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSwgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIGNvbnN0IHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKICAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKICAgICB9CiAKLSAgICByZXR1cm4gZGV2aWNlSW5mby0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChjb25maWd1cmF0aW9uLCBzdGF0dXMpOworICAgIHJldHVybiBkZXZpY2VJbmZvLT5pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBvdmVycmlkZUZvclBlcmZDbGFzcywgZ2V0TWV0YWRhdGEsIHN0YXR1cyk7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0Q2FtZXJhSWRJUENUcmFuc3BvcnQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAorICAgICAgICBJUENUcmFuc3BvcnQgKnByb3ZpZGVyVHJhbnNwb3J0KSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIgPSBkZXZpY2VJbmZvLT5tUGFyZW50UHJvdmlkZXIucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnRQcm92aWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgKnByb3ZpZGVyVHJhbnNwb3J0ID0gcGFyZW50UHJvdmlkZXItPmdldElQQ1RyYW5zcG9ydCgpOworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLApAQCAtMjg1LDM5ICszNjIsMTA2IEBACiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0SGlnaGVzdFN1cHBvcnRlZFZlcnNpb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAotICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uICp2KSB7CisgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gKnYsIElQQ1RyYW5zcG9ydCAqdHJhbnNwb3J0KSB7CisgICAgaWYgKHYgPT0gbnVsbHB0ciB8fCB0cmFuc3BvcnQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogCiAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uezAsMH07CiAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIElQQ1RyYW5zcG9ydCBwcm92aWRlclRyYW5zcG9ydCA9IElQQ1RyYW5zcG9ydDo6SU5WQUxJRDsKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgewogICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKICAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tSWQgPT0gaWQpIHsKICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bVZlcnNpb24gPiBtYXhWZXJzaW9uKSB7CiAgICAgICAgICAgICAgICAgICAgIG1heFZlcnNpb24gPSBkZXZpY2VJbmZvLT5tVmVyc2lvbjsKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJUcmFuc3BvcnQgPSBwcm92aWRlci0+Z2V0SVBDVHJhbnNwb3J0KCk7CiAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFmb3VuZCkgeworICAgIGlmICghZm91bmQgfHwgcHJvdmlkZXJUcmFuc3BvcnQgPT0gSVBDVHJhbnNwb3J0OjpJTlZBTElEKSB7CiAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKICAgICB9CiAgICAgKnYgPSBtYXhWZXJzaW9uOworICAgICp0cmFuc3BvcnQgPSBwcm92aWRlclRyYW5zcG9ydDsKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0VG9yY2hTdHJlbmd0aExldmVsKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKKyAgICAgICAgaW50MzJfdCogdG9yY2hTdHJlbmd0aCAvKm91dCovKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKKyAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisKKyAgICByZXR1cm4gZGV2aWNlSW5mby0+Z2V0VG9yY2hTdHJlbmd0aExldmVsKHRvcmNoU3RyZW5ndGgpOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAorICAgICAgICBpbnQzMl90IHRvcmNoU3RyZW5ndGgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOworICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKworICAgIHJldHVybiBkZXZpY2VJbmZvLT50dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKHRvcmNoU3RyZW5ndGgpOworfQorCitib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c2hvdWxkU2tpcFRvcmNoU3RyZW5ndGhVcGRhdGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAorICAgICAgICBpbnQzMl90IHRvcmNoU3RyZW5ndGgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOworICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKworICAgIGlmIChkZXZpY2VJbmZvLT5tVG9yY2hTdHJlbmd0aExldmVsID09IHRvcmNoU3RyZW5ndGgpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBTa2lwcGluZyB0b3JjaCBzdHJlbmd0aCBsZXZlbCB1cGRhdGVzIHByZXZfbGV2ZWw6ICVkLCBuZXdfbGV2ZWw6ICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZUluZm8tPm1Ub3JjaFN0cmVuZ3RoTGV2ZWwsIHRvcmNoU3RyZW5ndGgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQzMl90IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0VG9yY2hEZWZhdWx0U3RyZW5ndGhMZXZlbChjb25zdCBzdGQ6OnN0cmluZyAmaWQpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOworICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKworICAgIHJldHVybiBkZXZpY2VJbmZvLT5tVG9yY2hEZWZhdWx0U3RyZW5ndGhMZXZlbDsKK30KKwogYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN1cHBvcnRTZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSBjb25zdCB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgewotICAgICAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7Ci0gICAgICAgIGlmIChkZXZpY2VJbmZvICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm92aWRlci0+bVNldFRvcmNoTW9kZVN1cHBvcnRlZDsKKyAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlkID09IGlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLT5tU2V0VG9yY2hNb2RlU3VwcG9ydGVkOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAordGVtcGxhdGUgPGNsYXNzIFByb3ZpZGVySW5mb1R5cGUsIGNsYXNzIEhhbENhbWVyYVByb3ZpZGVyVHlwZT4KK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c2V0VG9yY2hNb2RlVChzcDxQcm92aWRlckluZm8+ICZwYXJlbnRQcm92aWRlciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEhhbENhbWVyYVByb3ZpZGVyPiAqaGFsQ2FtZXJhUHJvdmlkZXIpIHsKKyAgICBpZiAoaGFsQ2FtZXJhUHJvdmlkZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBQcm92aWRlckluZm9UeXBlICppZGxQcm92aWRlckluZm8gPSBzdGF0aWNfY2FzdDxQcm92aWRlckluZm9UeXBlICo+KHBhcmVudFByb3ZpZGVyLmdldCgpKTsKKyAgICBhdXRvIGlkbEludGVyZmFjZSA9IGlkbFByb3ZpZGVySW5mby0+c3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpZGxJbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgICpoYWxDYW1lcmFQcm92aWRlciA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEhhbENhbWVyYVByb3ZpZGVyVHlwZT4oaWRsSW50ZXJmYWNlLCBpZGxJbnRlcmZhY2UtPmRlc2NyaXB0b3IpOworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCBib29sIGVuYWJsZWQpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogCkBAIC0zMzAsMTEgKzQ3NCwyNiBAQAogICAgIGlmIChwYXJlbnRQcm92aWRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9Ci0gICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gcGFyZW50UHJvdmlkZXItPnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKLSAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIHN0ZDo6c2hhcmVkX3B0cjxIYWxDYW1lcmFQcm92aWRlcj4gaGFsQ2FtZXJhUHJvdmlkZXIgPSBudWxscHRyOworICAgIElQQ1RyYW5zcG9ydCBwcm92aWRlclRyYW5zcG9ydCA9IHBhcmVudFByb3ZpZGVyLT5nZXRJUENUcmFuc3BvcnQoKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBpZiAocHJvdmlkZXJUcmFuc3BvcnQgPT0gSVBDVHJhbnNwb3J0OjpISURMKSB7CisgICAgICAgIHJlcyA9IHNldFRvcmNoTW9kZVQ8SGlkbFByb3ZpZGVySW5mbywgSGlkbEhhbENhbWVyYVByb3ZpZGVyPihwYXJlbnRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAmaGFsQ2FtZXJhUHJvdmlkZXIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwcm92aWRlclRyYW5zcG9ydCA9PSBJUENUcmFuc3BvcnQ6OkFJREwpIHsKKyAgICAgICAgcmVzID0gc2V0VG9yY2hNb2RlVDxBaWRsUHJvdmlkZXJJbmZvLCBBaWRsSGFsQ2FtZXJhUHJvdmlkZXI+KHBhcmVudFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICZoYWxDYW1lcmFQcm92aWRlcik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXMgSW52YWxpZCBwcm92aWRlciB0cmFuc3BvcnQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHNhdmVSZWYoRGV2aWNlTW9kZTo6VE9SQ0gsIGRldmljZUluZm8tPm1JZCwgaW50ZXJmYWNlKTsKKyAgICBzYXZlUmVmKERldmljZU1vZGU6OlRPUkNILCBkZXZpY2VJbmZvLT5tSWQsIGhhbENhbWVyYVByb3ZpZGVyKTsKIAogICAgIHJldHVybiBkZXZpY2VJbmZvLT5zZXRUb3JjaE1vZGUoZW5hYmxlZCk7CiB9CkBAIC0zNTEsMTUgKzUxMCw4NSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKLSAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBuZXdTdGF0ZSkgeworc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm8+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhcnRFeHRlcm5hbExhenlQcm92aWRlcigpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gcHJvdmlkZXJMb2NrKG1Qcm92aWRlckxpZmVjeWNsZUxvY2spOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHByb3ZpZGVySW5mbyA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgaWYgKHByb3ZpZGVySW5mby0+aXNFeHRlcm5hbExhenlIQUwoKSkgeworICAgICAgICAgICAgaWYgKCFwcm92aWRlckluZm8tPnN1Y2Nlc3NmdWxseVN0YXJ0ZWRQcm92aWRlckludGVyZmFjZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlckluZm87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bm90aWZ5VXNiRGV2aWNlRXZlbnQoaW50MzJfdCBldmVudElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdXNiRGV2aWNlSWQpIHsKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBBTE9HVigibm90aWZ5U3lzdGVtRXZlbnQ6ICVkIHVzYkRldmljZUlkIDogJXMiLCBldmVudElkLCB1c2JEZXZpY2VJZC5jX3N0cigpKTsKKworICAgIGlmIChldmVudElkID09IGFuZHJvaWQ6OmhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVZFTlRfVVNCX0RFVklDRV9BVFRBQ0hFRCkgeworICAgICAgICBzcDxQcm92aWRlckluZm8+IGV4dGVybmFsUHJvdmlkZXIgPSBzdGFydEV4dGVybmFsTGF6eVByb3ZpZGVyKCk7CisgICAgICAgIGlmIChleHRlcm5hbFByb3ZpZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGF1dG8gdXNiRGV2aWNlcyA9IG1FeHRlcm5hbFVzYkRldmljZXNGb3JQcm92aWRlci5maXJzdDsKKyAgICAgICAgICAgIHVzYkRldmljZXMucHVzaF9iYWNrKHVzYkRldmljZUlkKTsKKyAgICAgICAgICAgIG1FeHRlcm5hbFVzYkRldmljZXNGb3JQcm92aWRlciA9IHt1c2JEZXZpY2VzLCBleHRlcm5hbFByb3ZpZGVyfTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXZlbnRJZAorICAgICAgICAgID09IGFuZHJvaWQ6OmhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVZFTlRfVVNCX0RFVklDRV9ERVRBQ0hFRCkgeworICAgICAgICB1c2JEZXZpY2VEZXRhY2hlZCh1c2JEZXZpY2VJZCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnVzYkRldmljZURldGFjaGVkKGNvbnN0IHN0ZDo6c3RyaW5nICZ1c2JEZXZpY2VJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBwcm92aWRlckxvY2sobVByb3ZpZGVyTGlmZWN5Y2xlTG9jayk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGludGVyZmFjZUxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgIGF1dG8gdXNiRGV2aWNlcyA9IG1FeHRlcm5hbFVzYkRldmljZXNGb3JQcm92aWRlci5maXJzdDsKKyAgICBhdXRvIGZvdW5kSWQgPSBzdGQ6OmZpbmQodXNiRGV2aWNlcy5iZWdpbigpLCB1c2JEZXZpY2VzLmVuZCgpLCB1c2JEZXZpY2VJZCk7CisgICAgaWYgKGZvdW5kSWQgIT0gdXNiRGV2aWNlcy5lbmQoKSkgeworICAgICAgICBzcDxQcm92aWRlckluZm8+IHByb3ZpZGVySW5mbyA9IG1FeHRlcm5hbFVzYkRldmljZXNGb3JQcm92aWRlci5zZWNvbmQ7CisgICAgICAgIGlmIChwcm92aWRlckluZm8gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICBBTE9HRSgiJXMgTm8gdmFsaWQgZXh0ZXJuYWwgcHJvdmlkZXIgZm9yIFVTQiBkZXZpY2U6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICB1c2JEZXZpY2VJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgbUV4dGVybmFsVXNiRGV2aWNlc0ZvclByb3ZpZGVyID0ge3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpLCBudWxscHRyfTsKKyAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUludGVyZmFjZU11dGV4LnVubG9jaygpOworICAgICAgICAgICAgcHJvdmlkZXJJbmZvLT5yZW1vdmVBbGxEZXZpY2VzKCk7CisgICAgICAgICAgICBtSW50ZXJmYWNlTXV0ZXgubG9jaygpOworICAgICAgICAgICAgbUV4dGVybmFsVXNiRGV2aWNlc0ZvclByb3ZpZGVyID0ge3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPigpLCBudWxscHRyfTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGludDY0X3QgbmV3U3RhdGUpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogICAgIG1EZXZpY2VTdGF0ZSA9IG5ld1N0YXRlOwogICAgIHN0YXR1c190IHJlcyA9IE9LOwogICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CiAgICAgICAgIEFMT0dWKCIlczogTm90aWZ5aW5nICVzIGZvciBuZXcgc3RhdGUgMHglIiBQUkl4NjQsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwcm92aWRlci0+bVByb3ZpZGVyTmFtZS5jX3N0cigpLCBuZXdTdGF0ZSk7CisgICAgICAgIC8vIGIvMTk5MjQwNzI2IENhbWVyYSBwcm92aWRlcnMgY2FuIGZvciBleGFtcGxlIHRyeSB0byBhZGQvcmVtb3ZlCisgICAgICAgIC8vIGNhbWVyYSBkZXZpY2VzIGFzIHBhcnQgb2YgdGhlIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb24uIEhvbGRpbmcKKyAgICAgICAgLy8gJ21JbnRlcmZhY2VNdXRleCcgd2hpbGUgY2FsbGluZyAnbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UnIGNhbgorICAgICAgICAvLyByZXN1bHQgaW4gYSByZWN1cnNpdmUgZGVhZGxvY2suCisgICAgICAgIG1JbnRlcmZhY2VNdXRleC51bmxvY2soKTsKICAgICAgICAgc3RhdHVzX3Qgc2luZ2xlUmVzID0gcHJvdmlkZXItPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKG1EZXZpY2VTdGF0ZSk7CisgICAgICAgIG1JbnRlcmZhY2VNdXRleC5sb2NrKCk7CiAgICAgICAgIGlmIChzaW5nbGVSZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIG5vdGlmeSBwcm92aWRlciAlcyBhYm91dCBkZXZpY2Ugc3RhdGUgY2hhbmdlIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLApAQCAtMzY3LDM2ICs1OTYsMTIwIEBACiAgICAgICAgICAgICByZXMgPSBzaW5nbGVSZXM7CiAgICAgICAgICAgICAvLyBjb250aW51ZSB0byBkbyB0aGUgcmVzdCBvZiB0aGUgcHJvdmlkZXJzIGluc3RlYWQgb2YgcmV0dXJuaW5nIG5vdwogICAgICAgICB9CisgICAgICAgIHByb3ZpZGVyLT5ub3RpZnlEZXZpY2VJbmZvU3RhdGVDaGFuZ2VMb2NrZWQobURldmljZVN0YXRlKTsKICAgICB9CiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpvcGVuU2Vzc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om9wZW5BaWRsU2Vzc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjwKKyAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAvKm91dCovCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAqc2Vzc2lvbikgeworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKKyAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisKKyAgICBhdXRvICphaWRsRGV2aWNlSW5mbzMgPSBzdGF0aWNfY2FzdDxBaWRsUHJvdmlkZXJJbmZvOjpBaWRsRGV2aWNlSW5mbzMqPihkZXZpY2VJbmZvKTsKKyAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyID0gZGV2aWNlSW5mby0+bVBhcmVudFByb3ZpZGVyLnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50UHJvdmlkZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGF1dG8gcHJvdmlkZXIgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QWlkbFByb3ZpZGVySW5mbyAqPihwYXJlbnRQcm92aWRlci5nZXQoKSktPnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAocHJvdmlkZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxIYWxDYW1lcmFQcm92aWRlcj4gaGFsQ2FtZXJhUHJvdmlkZXIgPQorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxBaWRsSGFsQ2FtZXJhUHJvdmlkZXI+KHByb3ZpZGVyLCBwcm92aWRlci0+ZGVzY3JpcHRvcik7CisgICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkLCBoYWxDYW1lcmFQcm92aWRlcik7CisKKyAgICBhdXRvIGludGVyZmFjZSA9IGFpZGxEZXZpY2VJbmZvMy0+c3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmVtb3ZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgYXV0byByZXQgPSBpbnRlcmZhY2UtPm9wZW4oY2FsbGJhY2ssIHNlc3Npb24pOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICByZW1vdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCk7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igb3BlbmluZyBhIHNlc3Npb24gZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHJldC5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gQWlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKHJldCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpvcGVuQWlkbEluamVjdGlvblNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8CisgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgLypvdXQqLworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8CisgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbj4gKnNlc3Npb24pIHsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCisgICAgYXV0byAqYWlkbERldmljZUluZm8zID0gc3RhdGljX2Nhc3Q8QWlkbFByb3ZpZGVySW5mbzo6QWlkbERldmljZUluZm8zKj4oZGV2aWNlSW5mbyk7CisgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciA9IGRldmljZUluZm8tPm1QYXJlbnRQcm92aWRlci5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudFByb3ZpZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBhdXRvIHByb3ZpZGVyID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEFpZGxQcm92aWRlckluZm8gKj4ocGFyZW50UHJvdmlkZXIuZ2V0KCkpLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKHByb3ZpZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8SGFsQ2FtZXJhUHJvdmlkZXI+IGhhbENhbWVyYVByb3ZpZGVyID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QWlkbEhhbENhbWVyYVByb3ZpZGVyPihwcm92aWRlciwgcHJvdmlkZXItPmRlc2NyaXB0b3IpOworICAgIHNhdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCwgaGFsQ2FtZXJhUHJvdmlkZXIpOworCisgICAgYXV0byBpbnRlcmZhY2UgPSBhaWRsRGV2aWNlSW5mbzMtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBhdXRvIHJldCA9IGludGVyZmFjZS0+b3BlbkluamVjdGlvblNlc3Npb24oY2FsbGJhY2ssIHNlc3Npb24pOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICByZW1vdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCk7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igb3BlbmluZyBhIHNlc3Npb24gZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHJldC5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpvcGVuSGlkbFNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICBjb25zdCBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAvKm91dCovCiAgICAgICAgIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICpzZXNzaW9uKSB7CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogCi0gICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQsCi0gICAgICAgICAgICAvKm1pblZlcnNpb24qLyB7MywwfSwgLyptYXhWZXJzaW9uKi8gezQsMH0pOworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKICAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAKLSAgICBhdXRvICpkZXZpY2VJbmZvMyA9IHN0YXRpY19jYXN0PFByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzMqPihkZXZpY2VJbmZvKTsKKyAgICBhdXRvICpoaWRsRGV2aWNlSW5mbzMgPSBzdGF0aWNfY2FzdDxIaWRsUHJvdmlkZXJJbmZvOjpIaWRsRGV2aWNlSW5mbzMqPihkZXZpY2VJbmZvKTsKICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyID0gZGV2aWNlSW5mby0+bVBhcmVudFByb3ZpZGVyLnByb21vdGUoKTsKICAgICBpZiAocGFyZW50UHJvdmlkZXIgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQotICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyID0gcGFyZW50UHJvdmlkZXItPnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlciA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsUHJvdmlkZXJJbmZvICo+KHBhcmVudFByb3ZpZGVyLmdldCgpKS0+c3RhcnRQcm92aWRlckludGVyZmFjZSgpOwogICAgIGlmIChwcm92aWRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9Ci0gICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkLCBwcm92aWRlcik7CisgICAgc3RkOjpzaGFyZWRfcHRyPEhhbENhbWVyYVByb3ZpZGVyPiBoYWxDYW1lcmFQcm92aWRlciA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEhpZGxIYWxDYW1lcmFQcm92aWRlcj4ocHJvdmlkZXIsIHByb3ZpZGVyLT5kZXNjcmlwdG9yKTsKKyAgICBzYXZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQsIGhhbENhbWVyYVByb3ZpZGVyKTsKIAogICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgYXV0byBpbnRlcmZhY2UgPSBkZXZpY2VJbmZvMy0+c3RhcnREZXZpY2VJbnRlcmZhY2U8Ci0gICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OkludGVyZmFjZVQ+KCk7CisgICAgYXV0byBpbnRlcmZhY2UgPSBoaWRsRGV2aWNlSW5mbzMtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlKCk7CiAgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CkBAIC00MTQsMTcgKzcyNywxOCBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9Ci0gICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIHJldHVybiBIaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKIH0KIAogdm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnNhdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwKLSAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEhhbENhbWVyYVByb3ZpZGVyPiBwcm92aWRlcikgewogICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBTE9HVigiU2F2aW5nIGNhbWVyYSBwcm92aWRlciAlcyBmb3IgY2FtZXJhIGRldmljZSAlcyIsIHByb3ZpZGVyLT5kZXNjcmlwdG9yLCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICBBTE9HVigiU2F2aW5nIGNhbWVyYSBwcm92aWRlciAlcyBmb3IgY2FtZXJhIGRldmljZSAlcyIsIHByb3ZpZGVyLT5tRGVzY3JpcHRvci5jX3N0cigpLAorICAgICAgICAgICAgICBjYW1lcmFJZC5jX3N0cigpKTsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvdmlkZXJJbnRlcmZhY2VNYXBMb2NrKTsKLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PiAqcHJpbWFyeU1hcCwgKmFsdGVybmF0ZU1hcDsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxIYWxDYW1lcmFQcm92aWRlcj4+ICpwcmltYXJ5TWFwLCAqYWx0ZXJuYXRlTWFwOwogICAgIGlmICh1c2FnZVR5cGUgPT0gRGV2aWNlTW9kZTo6VE9SQ0gpIHsKICAgICAgICAgcHJpbWFyeU1hcCA9ICZtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CiAgICAgICAgIGFsdGVybmF0ZU1hcCA9ICZtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkOwpAQCAtNDQ3LDcgKzc2MSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQUxPR1YoIlJlbW92aW5nIGNhbWVyYSBkZXZpY2UgJXMiLCBjYW1lcmFJZC5jX3N0cigpKTsKLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PiAqcHJvdmlkZXJNYXA7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8SGFsQ2FtZXJhUHJvdmlkZXI+PiAqcHJvdmlkZXJNYXA7CiAgICAgaWYgKHVzYWdlVHlwZSA9PSBEZXZpY2VNb2RlOjpUT1JDSCkgewogICAgICAgICBwcm92aWRlck1hcCA9ICZtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CiAgICAgfSBlbHNlIHsKQEAgLTQ3Miw2ICs3ODYsMjYgQEAKICAgICB9CiB9CiAKKy8vIFdlIGlnbm9yZSBzcDxJQmluZGVyPiBwYXJhbSBoZXJlIHNpbmNlIHdlIG5lZWQgc3RkOjpzaGFyZWRfcHRyPC4uLj4gd2hpY2gKKy8vIHdpbGwgYmUgcmV0cmlldmVkIHRocm91Z2ggdGhlIG5kayBhcGkgdGhyb3VnaCBhZGRBaWRsUHJvdmlkZXJMb2NrZWQgLT4KKy8vIHRyeVRvSW5pdGlhbGl6ZUFpZGxQcm92aWRlci4KK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpvblNlcnZpY2VSZWdpc3RyYXRpb24oY29uc3QgU3RyaW5nMTYgJm5hbWUsIGNvbnN0IHNwPElCaW5kZXI+JikgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBwcm92aWRlckxvY2sobVByb3ZpZGVyTGlmZWN5Y2xlTG9jayk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgICAgIHJlcyA9IGFkZEFpZGxQcm92aWRlckxvY2tlZChTdHJpbmc4KG5hbWUpLmNfc3RyKCkpOworICAgIH0KKworICAgIHNwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lciA9IGdldFN0YXR1c0xpc3RlbmVyKCk7CisgICAgaWYgKG51bGxwdHIgIT0gbGlzdGVuZXIuZ2V0KCkgJiYgcmVzID09IE9LKSB7CisgICAgICAgIGxpc3RlbmVyLT5vbk5ld1Byb3ZpZGVyUmVnaXN0ZXJlZCgpOworICAgIH0KKworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKK30KKwogaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om9uUmVnaXN0cmF0aW9uKAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIC8qZnFOYW1lKi8sCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgbmFtZSwKQEAgLTQ4MSw3ICs4MTUsNyBAQAogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKIAotICAgICAgICByZXMgPSBhZGRQcm92aWRlckxvY2tlZChuYW1lLCBwcmVleGlzdGluZyk7CisgICAgICAgIHJlcyA9IGFkZEhpZGxQcm92aWRlckxvY2tlZChuYW1lLCBwcmVleGlzdGluZyk7CiAgICAgfQogCiAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyID0gZ2V0U3RhdHVzTGlzdGVuZXIoKTsKQEAgLTUwMywxMCArODM3LDcwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjppbml0aWFsaXplUHJvdmlkZXJJbmZvQ29tbW9uKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmRldmljZXMpIHsKKworICAgIHNwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lciA9IG1NYW5hZ2VyLT5nZXRTdGF0dXNMaXN0ZW5lcigpOworCisgICAgZm9yIChhdXRvJiBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlkOworICAgICAgICBzdGF0dXNfdCByZXMgPSBhZGREZXZpY2UoZGV2aWNlLCBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQsICZpZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGVudW1lcmF0ZSBjYW1lcmEgZGV2aWNlICclcyc6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS5jX3N0cigpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR0koIkNhbWVyYSBwcm92aWRlciAlcyByZWFkeSB3aXRoICV6dSBjYW1lcmEgZGV2aWNlcyIsCisgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1EZXZpY2VzLnNpemUoKSk7CisKKyAgICAvLyBQcm9jZXNzIGNhY2hlZCBzdGF0dXMgY2FsbGJhY2tzCisgICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPENhbWVyYVN0YXR1c0luZm9UPj4gY2FjaGVkU3RhdHVzID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8c3RkOjp2ZWN0b3I8Q2FtZXJhU3RhdHVzSW5mb1Q+PigpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUluaXRMb2NrKTsKKworICAgICAgICBmb3IgKGF1dG8mIHN0YXR1c0luZm8gOiBtQ2FjaGVkU3RhdHVzKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBpZCwgcGh5c2ljYWxJZDsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgICAgICAgICAgaWYgKHN0YXR1c0luZm8uaXNQaHlzaWNhbENhbWVyYVN0YXR1cykgeworICAgICAgICAgICAgICAgIHJlcyA9IHBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKCZpZCwgJnBoeXNpY2FsSWQsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c0luZm8uY2FtZXJhSWQsIHN0YXR1c0luZm8ucGh5c2ljYWxDYW1lcmFJZCwgc3RhdHVzSW5mby5zdGF0dXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXMgPSBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoJmlkLCBzdGF0dXNJbmZvLmNhbWVyYUlkLCBzdGF0dXNJbmZvLnN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgY2FjaGVkU3RhdHVzLT5lbXBsYWNlX2JhY2soc3RhdHVzSW5mby5pc1BoeXNpY2FsQ2FtZXJhU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaWQuY19zdHIoKSwgcGh5c2ljYWxJZC5jX3N0cigpLCBzdGF0dXNJbmZvLnN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUNhY2hlZFN0YXR1cy5jbGVhcigpOworCisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorCisgICAgLy8gVGhlIGNhY2hlZCBzdGF0dXMgY2hhbmdlIGNhbGxiYWNrcyBjYW5ub3QgYmUgZmlyZWQgZGlyZWN0bHkgZnJvbSB0aGlzCisgICAgLy8gZnVuY3Rpb24sIGR1ZSB0byBzYW1lLXRocmVhZCBkZWFkbG9jayB0cnlpbmcgdG8gYWNxdWlyZSBtSW50ZXJmYWNlTXV0ZXgKKyAgICAvLyB0d2ljZS4KKyAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtSW5pdGlhbFN0YXR1c0NhbGxiYWNrRnV0dXJlID0gc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsCisgICAgICAgICAgICAgICAgJkNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpub3RpZnlJbml0aWFsU3RhdHVzQ2hhbmdlLCB0aGlzLAorICAgICAgICAgICAgICAgIGxpc3RlbmVyLCBzdGQ6Om1vdmUoY2FjaGVkU3RhdHVzKSk7CisgICAgfQorfQorCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbyogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpmaW5kRGV2aWNlSW5mb0xvY2tlZCgKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAotICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1pblZlcnNpb24sIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbWF4VmVyc2lvbikgY29uc3QgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaWQpIGNvbnN0IHsKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICB1c2luZyBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uOworICAgICAgICBJUENUcmFuc3BvcnQgdHJhbnNwb3J0ID0gcHJvdmlkZXItPmdldElQQ1RyYW5zcG9ydCgpOworICAgICAgICAvLyBBSURMIG1pbiB2ZXJzaW9uIHN0YXJ0cyBhdCBtYWpvcjogMSBtaW5vcjogMQorICAgICAgICBoaWRsX3ZlcnNpb24gbWluVmVyc2lvbiA9CisgICAgICAgICAgICAgICAgKHRyYW5zcG9ydCA9PSBJUENUcmFuc3BvcnQ6OkhJREwpID8gaGlkbF92ZXJzaW9uezMsIDJ9IDogaGlkbF92ZXJzaW9uezEsIDF9IDsKKyAgICAgICAgaGlkbF92ZXJzaW9uIG1heFZlcnNpb24gPQorICAgICAgICAgICAgICAgICh0cmFuc3BvcnQgPT0gSVBDVHJhbnNwb3J0OjpISURMKSA/IGhpZGxfdmVyc2lvbnszLCA3fSA6IGhpZGxfdmVyc2lvbnsxMDAwLCAwfTsKKwogICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKICAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tSWQgPT0gaWQgJiYKICAgICAgICAgICAgICAgICAgICAgbWluVmVyc2lvbiA8PSBkZXZpY2VJbmZvLT5tVmVyc2lvbiAmJiBtYXhWZXJzaW9uID49IGRldmljZUluZm8tPm1WZXJzaW9uKSB7CkBAIC01MTgsMTYgKzkxMiwxMyBAQAogfQogCiBtZXRhZGF0YV92ZW5kb3JfaWRfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldFByb3ZpZGVyVGFnSWRMb2NrZWQoCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtaW5WZXJzaW9uLAotICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb24pIGNvbnN0IHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkKSBjb25zdCB7CiAgICAgbWV0YWRhdGFfdmVuZG9yX2lkX3QgcmV0ID0gQ0FNRVJBX01FVEFEQVRBX0lOVkFMSURfVkVORE9SX0lEOwogCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgewogICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKLSAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tSWQgPT0gaWQgJiYKLSAgICAgICAgICAgICAgICAgICAgbWluVmVyc2lvbiA8PSBkZXZpY2VJbmZvLT5tVmVyc2lvbiAmJgotICAgICAgICAgICAgICAgICAgICBtYXhWZXJzaW9uID49IGRldmljZUluZm8tPm1WZXJzaW9uKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlkID09IGlkKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLT5tUHJvdmlkZXJUYWdpZDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODUwLDEyICsxMjQxLDQ1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmZpeHVwVG9yY2hTdHJlbmd0aFRhZ3MoKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgYXV0byYgYyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CisgICAgYXV0byBmbGFzaEluZm9TdHJlbmd0aERlZmF1bHRMZXZlbEVudHJ5ID0gYy5maW5kKEFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9ERUZBVUxUX0xFVkVMKTsKKyAgICBpZiAoZmxhc2hJbmZvU3RyZW5ndGhEZWZhdWx0TGV2ZWxFbnRyeS5jb3VudCA9PSAwKSB7CisgICAgICAgIGludDMyX3QgZmxhc2hJbmZvU3RyZW5ndGhEZWZhdWx0TGV2ZWwgPSAxOworICAgICAgICByZXMgPSBjLnVwZGF0ZShBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfREVGQVVMVF9MRVZFTCwKKyAgICAgICAgICAgICAgICAmZmxhc2hJbmZvU3RyZW5ndGhEZWZhdWx0TGV2ZWwsIDEpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgQU5EUk9JRF9GTEFTSF9JTkZPX1NUUkVOR1RIX0RFRkFVTFRfTEVWRUw6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorICAgIGF1dG8gZmxhc2hJbmZvU3RyZW5ndGhNYXhpbXVtTGV2ZWxFbnRyeSA9IGMuZmluZChBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfTUFYSU1VTV9MRVZFTCk7CisgICAgaWYgKGZsYXNoSW5mb1N0cmVuZ3RoTWF4aW11bUxldmVsRW50cnkuY291bnQgPT0gMCkgeworICAgICAgICBpbnQzMl90IGZsYXNoSW5mb1N0cmVuZ3RoTWF4aW11bUxldmVsID0gMTsKKyAgICAgICAgcmVzID0gYy51cGRhdGUoQU5EUk9JRF9GTEFTSF9JTkZPX1NUUkVOR1RIX01BWElNVU1fTEVWRUwsCisgICAgICAgICAgICAgICAgJmZsYXNoSW5mb1N0cmVuZ3RoTWF4aW11bUxldmVsLCAxKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIEFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9NQVhJTVVNX0xFVkVMOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmZpeHVwTW9ub2Nocm9tZVRhZ3MoKSB7CiAgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAgICAgYXV0byYgYyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7Ci0KKyAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyID0gbVBhcmVudFByb3ZpZGVyLnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50UHJvdmlkZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIElQQ1RyYW5zcG9ydCBpcGNUcmFuc3BvcnQgPSBwYXJlbnRQcm92aWRlci0+Z2V0SVBDVHJhbnNwb3J0KCk7CiAgICAgLy8gT3ZlcnJpZGUgc3RhdGljIG1ldGFkYXRhIGZvciBNT05PQ0hST01FIGNhbWVyYSB3aXRoIG9sZGVyIGRldmljZSB2ZXJzaW9uCi0gICAgaWYgKG1WZXJzaW9uLmdldF9tYWpvcigpID09IDMgJiYgbVZlcnNpb24uZ2V0X21pbm9yKCkgPCA1KSB7CisgICAgaWYgKGlwY1RyYW5zcG9ydCA9PSBJUENUcmFuc3BvcnQ6OkhJREwgJiYKKyAgICAgICAgICAgIChtVmVyc2lvbi5nZXRfbWFqb3IoKSA9PSAzICYmIG1WZXJzaW9uLmdldF9taW5vcigpIDwgNSkpIHsKICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGNhcCA9IGMuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwLmNvdW50OyBpKyspIHsKICAgICAgICAgICAgIGlmIChjYXAuZGF0YS51OFtpXSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT05PQ0hST01FKSB7CkBAIC0xMTg1LDEwICsxNjA5LDEyIEBACiB9CiAKIGJvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0hpZGRlblBoeXNpY2FsQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAgICAgcmV0dXJuIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmFJbnRlcm5hbChjYW1lcmFJZCkuZmlyc3Q7CiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6ZmlsdGVyU21hbGxKcGVnU2l6ZXMoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgewogICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKICAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tSWQgPT0gY2FtZXJhSWQpIHsKQEAgLTEyMTMsNiArMTYzOSw3IEBACiAgICAgfQogCiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCA9IHByb3ZpZGVyLT5nZXRJUENUcmFuc3BvcnQoKTsKICAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxJZHM7CiAgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYSkgewpAQCAtMTIyMCw3ICsxNjQ3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkKSAhPSBkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHMuZW5kKCkpIHsKICAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZVZlcnNpb24gPSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby0+bVZlcnNpb24uZ2V0X21ham9yKCksIGRldmljZUluZm8tPm1WZXJzaW9uLmdldF9taW5vcigpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNwb3J0ID09IElQQ1RyYW5zcG9ydDo6SElETCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNSkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBXcm9uZyBkZXZpY2VWZXJzaW9uICV4IGZvciBoaWRkZW5QaHlzaWNhbENhbWVyYUlkICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2VWZXJzaW9uLCBjYW1lcmFJZC5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVJldDsKQEAgLTEyMzUsMjMgKzE2NjMsODkgQEAKICAgICByZXR1cm4gZmFsc2VSZXQ7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6dHJ5VG9Jbml0aWFsaXplUHJvdmlkZXJMb2NrZWQoCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnRyeVRvSW5pdGlhbGl6ZUFpZGxQcm92aWRlckxvY2tlZCgKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3ZpZGVyTmFtZSwgY29uc3Qgc3A8UHJvdmlkZXJJbmZvPiYgcHJvdmlkZXJJbmZvKSB7Ci0gICAgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlOwotICAgIGludGVyZmFjZSA9IG1TZXJ2aWNlUHJveHktPnRyeUdldFNlcnZpY2UocHJvdmlkZXJOYW1lKTsKKyAgICB1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6SUNhbWVyYVByb3ZpZGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9CisgICAgICAgICAgICBJQ2FtZXJhUHJvdmlkZXI6OmZyb21CaW5kZXIobmRrOjpTcEFJQmluZGVyKAorICAgICAgICAgICAgICAgICAgICBBU2VydmljZU1hbmFnZXJfZ2V0U2VydmljZShwcm92aWRlck5hbWUuY19zdHIoKSkpKTsKIAogICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICAvLyBUaGUgaW50ZXJmYWNlIG1heSBub3QgYmUgc3RhcnRlZCB5ZXQuIEluIHRoYXQgY2FzZSwgdGhpcyBpcyBub3QgYQotICAgICAgICAvLyBmYXRhbCBlcnJvci4KLSAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgcHJvdmlkZXIgSEFMICclcycgaXMgbm90IGFjdHVhbGx5IGF2YWlsYWJsZSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgQUxPR1coIiVzOiBBSURMIENhbWVyYSBwcm92aWRlciBIQUwgJyVzJyBpcyBub3QgYWN0dWFsbHkgYXZhaWxhYmxlIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIHByb3ZpZGVyTmFtZS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICByZXR1cm4gcHJvdmlkZXJJbmZvLT5pbml0aWFsaXplKGludGVyZmFjZSwgbURldmljZVN0YXRlKTsKKyAgICBBaWRsUHJvdmlkZXJJbmZvICphaWRsUHJvdmlkZXJJbmZvID0gc3RhdGljX2Nhc3Q8QWlkbFByb3ZpZGVySW5mbyAqPihwcm92aWRlckluZm8uZ2V0KCkpOworICAgIHJldHVybiBhaWRsUHJvdmlkZXJJbmZvLT5pbml0aWFsaXplQWlkbFByb3ZpZGVyKGludGVyZmFjZSwgbURldmljZVN0YXRlKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjphZGRQcm92aWRlckxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgbmV3UHJvdmlkZXIsCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnRyeVRvSW5pdGlhbGl6ZUhpZGxQcm92aWRlckxvY2tlZCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3ZpZGVyTmFtZSwgY29uc3Qgc3A8UHJvdmlkZXJJbmZvPiYgcHJvdmlkZXJJbmZvKSB7CisgICAgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlOworICAgIGludGVyZmFjZSA9IG1IaWRsU2VydmljZVByb3h5LT50cnlHZXRTZXJ2aWNlKHByb3ZpZGVyTmFtZSk7CisKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gVGhlIGludGVyZmFjZSBtYXkgbm90IGJlIHN0YXJ0ZWQgeWV0LiBJbiB0aGF0IGNhc2UsIHRoaXMgaXMgbm90IGEKKyAgICAgICAgLy8gZmF0YWwgZXJyb3IuCisgICAgICAgIEFMT0dXKCIlczogSElETCBDYW1lcmEgcHJvdmlkZXIgSEFMICclcycgaXMgbm90IGFjdHVhbGx5IGF2YWlsYWJsZSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBwcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgSGlkbFByb3ZpZGVySW5mbyAqaGlkbFByb3ZpZGVySW5mbyA9IHN0YXRpY19jYXN0PEhpZGxQcm92aWRlckluZm8gKj4ocHJvdmlkZXJJbmZvLmdldCgpKTsKKyAgICByZXR1cm4gaGlkbFByb3ZpZGVySW5mby0+aW5pdGlhbGl6ZUhpZGxQcm92aWRlcihpbnRlcmZhY2UsIG1EZXZpY2VTdGF0ZSk7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6YWRkQWlkbFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdQcm92aWRlcikgeworICAgIC8vIFNldmVyYWwgY2FtZXJhIHByb3ZpZGVyIGluc3RhbmNlcyBjYW4gYmUgdGVtcG9yYXJpbHkgcHJlc2VudC4KKyAgICAvLyBEZWZlciBpbml0aWFsaXphdGlvbiBvZiBhIG5ldyBpbnN0YW5jZSB1bnRpbCB0aGUgb2xkZXIgaW5zdGFuY2UgaXMgcHJvcGVybHkgcmVtb3ZlZC4KKyAgICBhdXRvIHByb3ZpZGVySW5zdGFuY2UgPSBuZXdQcm92aWRlciArICItIiArIHN0ZDo6dG9fc3RyaW5nKG1Qcm92aWRlckluc3RhbmNlSWQpOworICAgIGJvb2wgcHJvdmlkZXJQcmVzZW50ID0gZmFsc2U7CisgICAgYm9vbCBwcmVleGlzdGluZyA9CisgICAgICAgICAgICAobUFpZGxQcm92aWRlcldpdGhCaW5kZXJzLmZpbmQobmV3UHJvdmlkZXIpICE9IG1BaWRsUHJvdmlkZXJXaXRoQmluZGVycy5lbmQoKSk7CisKKyAgICAvLyBXZSBuZWVkIHRvIHVzZSB0aGUgZXh0cmFjdGVkIHByb3ZpZGVyIG5hbWUgaGVyZSBzaW5jZSAnbmV3UHJvdmlkZXInIGhhcworICAgIC8vIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgcHJvdmlkZXIgc2VydmljZSBpbiBjYXNlIG9mIEFJREwuIFdlIHdhbnQKKyAgICAvLyBqdXN0IGluc3RhbmNlIG5hbWUuCisgICAgdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OklDYW1lcmFQcm92aWRlcjsKKyAgICBzdGQ6OnN0cmluZyBleHRyYWN0ZWRQcm92aWRlck5hbWUgPQorICAgICAgICAgICAgbmV3UHJvdmlkZXIuc3Vic3RyKHN0ZDo6c3RyaW5nKElDYW1lcmFQcm92aWRlcjo6ZGVzY3JpcHRvcikuc2l6ZSgpICsgMSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBwcm92aWRlckluZm8gOiBtUHJvdmlkZXJzKSB7CisgICAgICAgIGlmIChwcm92aWRlckluZm8tPm1Qcm92aWRlck5hbWUgPT0gZXh0cmFjdGVkUHJvdmlkZXJOYW1lKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IENhbWVyYSBwcm92aWRlciBIQUwgd2l0aCBuYW1lICclcycgYWxyZWFkeSByZWdpc3RlcmVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBuZXdQcm92aWRlci5jX3N0cigpKTsKKyAgICAgICAgICAgIC8vIERvIG5vdCBhZGQgbmV3IGluc3RhbmNlcyBmb3IgbGF6eSBIQUwgZXh0ZXJuYWwgcHJvdmlkZXIgb3IgYWlkbAorICAgICAgICAgICAgLy8gYmluZGVycyBwcmV2aW91c2x5IHNlZW4uCisgICAgICAgICAgICBpZiAocHJlZXhpc3RpbmcgfHwgcHJvdmlkZXJJbmZvLT5pc0V4dGVybmFsTGF6eUhBTCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXM6IFRoZSBuZXcgcHJvdmlkZXIgaW5zdGFuY2Ugd2lsbCBnZXQgaW5pdGlhbGl6ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBjdXJyZW50bHkgcHJlc2VudCBpbnN0YW5jZSBpcyByZW1vdmVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcHJvdmlkZXJQcmVzZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEFpZGxQcm92aWRlckluZm8+IHByb3ZpZGVySW5mbyA9CisgICAgICAgICAgICBuZXcgQWlkbFByb3ZpZGVySW5mbyhleHRyYWN0ZWRQcm92aWRlck5hbWUsIHByb3ZpZGVySW5zdGFuY2UsIHRoaXMpOworCisgICAgaWYgKCFwcm92aWRlclByZXNlbnQpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gdHJ5VG9Jbml0aWFsaXplQWlkbFByb3ZpZGVyTG9ja2VkKG5ld1Byb3ZpZGVyLCBwcm92aWRlckluZm8pOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIG1BaWRsUHJvdmlkZXJXaXRoQmluZGVycy5lbXBsYWNlKG5ld1Byb3ZpZGVyKTsKKyAgICB9CisKKyAgICBtUHJvdmlkZXJzLnB1c2hfYmFjayhwcm92aWRlckluZm8pOworICAgIG1Qcm92aWRlckluc3RhbmNlSWQrKzsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjphZGRIaWRsUHJvdmlkZXJMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5ld1Byb3ZpZGVyLAogICAgICAgICBib29sIHByZWV4aXN0aW5nKSB7CiAgICAgLy8gU2V2ZXJhbCBjYW1lcmEgcHJvdmlkZXIgaW5zdGFuY2VzIGNhbiBiZSB0ZW1wb3JhcmlseSBwcmVzZW50LgogICAgIC8vIERlZmVyIGluaXRpYWxpemF0aW9uIG9mIGEgbmV3IGluc3RhbmNlIHVudGlsIHRoZSBvbGRlciBpbnN0YW5jZSBpcyBwcm9wZXJseSByZW1vdmVkLgpAQCAtMTI2MSw5ICsxNzU1LDEwIEBACiAgICAgICAgIGlmIChwcm92aWRlckluZm8tPm1Qcm92aWRlck5hbWUgPT0gbmV3UHJvdmlkZXIpIHsKICAgICAgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhIHByb3ZpZGVyIEhBTCB3aXRoIG5hbWUgJyVzJyBhbHJlYWR5IHJlZ2lzdGVyZWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5ld1Byb3ZpZGVyLmNfc3RyKCkpOwotICAgICAgICAgICAgaWYgKHByZWV4aXN0aW5nKSB7CisgICAgICAgICAgICAvLyBEbyBub3QgYWRkIG5ldyBpbnN0YW5jZXMgZm9yIGxhenkgSEFMIGV4dGVybmFsIHByb3ZpZGVyCisgICAgICAgICAgICBpZiAocHJlZXhpc3RpbmcgfHwgcHJvdmlkZXJJbmZvLT5pc0V4dGVybmFsTGF6eUhBTCgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwotICAgICAgICAgICAgfSBlbHNleworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IFRoZSBuZXcgcHJvdmlkZXIgaW5zdGFuY2Ugd2lsbCBnZXQgaW5pdGlhbGl6ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIgogICAgICAgICAgICAgICAgICAgICAgICAgIiBjdXJyZW50bHkgcHJlc2VudCBpbnN0YW5jZSBpcyByZW1vdmVkISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgcHJvdmlkZXJQcmVzZW50ID0gdHJ1ZTsKQEAgLTEyNzIsOSArMTc2Nyw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzcDxQcm92aWRlckluZm8+IHByb3ZpZGVySW5mbyA9IG5ldyBQcm92aWRlckluZm8obmV3UHJvdmlkZXIsIHByb3ZpZGVySW5zdGFuY2UsIHRoaXMpOworICAgIHNwPEhpZGxQcm92aWRlckluZm8+IHByb3ZpZGVySW5mbyA9IG5ldyBIaWRsUHJvdmlkZXJJbmZvKG5ld1Byb3ZpZGVyLCBwcm92aWRlckluc3RhbmNlLCB0aGlzKTsKICAgICBpZiAoIXByb3ZpZGVyUHJlc2VudCkgewotICAgICAgICBzdGF0dXNfdCByZXMgPSB0cnlUb0luaXRpYWxpemVQcm92aWRlckxvY2tlZChuZXdQcm92aWRlciwgcHJvdmlkZXJJbmZvKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gdHJ5VG9Jbml0aWFsaXplSGlkbFByb3ZpZGVyTG9ja2VkKG5ld1Byb3ZpZGVyLCBwcm92aWRlckluZm8pOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CkBAIC0xMzEyLDcgKzE4MDcsMTcgQEAKICAgICAgICAgLy8gaW5pdGlhbGl6ZS4KICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwcm92aWRlckluZm8gOiBtUHJvdmlkZXJzKSB7CiAgICAgICAgICAgICBpZiAocHJvdmlkZXJJbmZvLT5tUHJvdmlkZXJOYW1lID09IHJlbW92ZWRQcm92aWRlck5hbWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ5VG9Jbml0aWFsaXplUHJvdmlkZXJMb2NrZWQocmVtb3ZlZFByb3ZpZGVyTmFtZSwgcHJvdmlkZXJJbmZvKTsKKyAgICAgICAgICAgICAgICBJUENUcmFuc3BvcnQgcHJvdmlkZXJUcmFuc3BvcnQgPSBwcm92aWRlckluZm8tPmdldElQQ1RyYW5zcG9ydCgpOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlbW92ZWRBaWRsUHJvdmlkZXJOYW1lID0gZ2V0RnVsbEFpZGxQcm92aWRlck5hbWUocmVtb3ZlZFByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICAgICAgc3dpdGNoKHByb3ZpZGVyVHJhbnNwb3J0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSVBDVHJhbnNwb3J0OjpISURMOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyeVRvSW5pdGlhbGl6ZUhpZGxQcm92aWRlckxvY2tlZChyZW1vdmVkUHJvdmlkZXJOYW1lLCBwcm92aWRlckluZm8pOworICAgICAgICAgICAgICAgICAgICBjYXNlIElQQ1RyYW5zcG9ydDo6QUlETDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnlUb0luaXRpYWxpemVBaWRsUHJvdmlkZXJMb2NrZWQocmVtb3ZlZEFpZGxQcm92aWRlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVySW5mbyk7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXMgVW5zdXBwb3J0ZWQgVHJhbnNwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwcm92aWRlclRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTEzMzQsNyArMTgzOSw2IEBACiBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyPiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldFN0YXR1c0xpc3RlbmVyKCkgY29uc3QgewogICAgIHJldHVybiBtTGlzdGVuZXIucHJvbW90ZSgpOwogfQotCiAvKioqKiBNZXRob2RzIGZvciBQcm92aWRlckluZm8gKioqKi8KIAogCkBAIC0xMzUwLDI4NSArMTg1NCw2MyBAQAogICAgICh2b2lkKSBtTWFuYWdlcjsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmluaXRpYWxpemUoCi0gICAgICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UsCi0gICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gY3VycmVudERldmljZVN0YXRlKSB7Ci0gICAgc3RhdHVzX3QgcmVzID0gcGFyc2VQcm92aWRlck5hbWUobVByb3ZpZGVyTmFtZSwgJm1UeXBlLCAmbUlkKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBwcm92aWRlciBuYW1lLCBpZ25vcmluZyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIEFMT0dJKCJDb25uZWN0aW5nIHRvIG5ldyBjYW1lcmEgcHJvdmlkZXI6ICVzLCBpc1JlbW90ZT8gJWQiLAotICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBpbnRlcmZhY2UtPmlzUmVtb3RlKCkpOwotCi0gICAgLy8gRGV0ZXJtaW5lIG1pbm9yIHZlcnNpb24KLSAgICBtTWlub3JWZXJzaW9uID0gNDsKLSAgICBhdXRvIGNhc3QyXzYgPSBwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOwotICAgIHNwPHByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZTJfNiA9IG51bGxwdHI7Ci0gICAgaWYgKGNhc3QyXzYuaXNPaygpKSB7Ci0gICAgICAgIGludGVyZmFjZTJfNiA9IGNhc3QyXzY7Ci0gICAgICAgIGlmIChpbnRlcmZhY2UyXzYgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgbU1pbm9yVmVyc2lvbiA9IDY7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gV2UgbmVlZCB0byBjaGVjayBhZ2FpbiBzaW5jZSBjYXN0Ml82LmlzT2soKSBzdWNjZWVkcyBldmVuIGlmIHRoZSBwcm92aWRlcgotICAgIC8vIHZlcnNpb24gaXNuJ3QgYWN0dWFsbHkgMi42LgotICAgIGlmIChpbnRlcmZhY2UyXzYgPT0gbnVsbHB0cil7Ci0gICAgICAgIGF1dG8gY2FzdDJfNSA9Ci0gICAgICAgICAgICAgICAgcHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKLSAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlMl81ID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKGNhc3QyXzUuaXNPaygpKSB7Ci0gICAgICAgICAgICBpbnRlcmZhY2UyXzUgPSBjYXN0Ml81OwotICAgICAgICAgICAgaWYgKGludGVyZmFjZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgbU1pbm9yVmVyc2lvbiA9IDU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBhdXRvIGNhc3QyXzcgPSBwcm92aWRlcjo6VjJfNzo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOwotICAgICAgICBpZiAoY2FzdDJfNy5pc09rKCkpIHsKLSAgICAgICAgICAgIHNwPHByb3ZpZGVyOjpWMl83OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZTJfNyA9IGNhc3QyXzc7Ci0gICAgICAgICAgICBpZiAoaW50ZXJmYWNlMl83ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBtTWlub3JWZXJzaW9uID0gNzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGNhbWVyYURldmljZVN0YXR1c0NoYW5nZSBjYWxsYmFja3MgbWF5IGJlIGNhbGxlZCAoYW5kIGNhdXNpbmcgbmV3IGRldmljZXMgYWRkZWQpCi0gICAgLy8gYmVmb3JlIHNldENhbGxiYWNrIHJldHVybnMKLSAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gaW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBzZXR0aW5nIHVwIGNhbGxiYWNrcyB3aXRoIGNhbWVyYSBwcm92aWRlciAnJXMnOiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byByZWdpc3RlciBjYWxsYmFja3Mgd2l0aCBjYW1lcmEgcHJvdmlkZXIgJyVzJyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgaGFyZHdhcmU6OlJldHVybjxib29sPiBsaW5rZWQgPSBpbnRlcmZhY2UtPmxpbmtUb0RlYXRoKHRoaXMsIC8qY29va2llKi8gbUlkKTsKLSAgICBpZiAoIWxpbmtlZC5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBsaW5raW5nIHRvIGNhbWVyYSBwcm92aWRlciAnJXMnIGRlYXRoOiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGxpbmtlZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfSBlbHNlIGlmICghbGlua2VkKSB7Ci0gICAgICAgIEFMT0dXKCIlczogVW5hYmxlIHRvIGxpbmsgdG8gcHJvdmlkZXIgJyVzJyBkZWF0aCBub3RpZmljYXRpb25zIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgewotICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5Ci0gICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQWN0aXZlSW50ZXJmYWNlID0gaW50ZXJmYWNlOwotICAgIH0KLQotICAgIEFMT0dWKCIlczogU2V0dGluZyBkZXZpY2Ugc3RhdGUgZm9yICVzOiAweCUiIFBSSXg2NCwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlU3RhdGUpOwotICAgIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGN1cnJlbnREZXZpY2VTdGF0ZSk7Ci0KLSAgICByZXMgPSBzZXRVcFZlbmRvclRhZ3MoKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHNldCB1cCB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyciLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICAvLyBHZXQgaW5pdGlhbCBsaXN0IG9mIGNhbWVyYSBkZXZpY2VzLCBpZiBhbnkKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGV2aWNlczsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhSWRMaXN0KFsmc3RhdHVzLCB0aGlzLCAmZGV2aWNlc10oCi0gICAgICAgICAgICBTdGF0dXMgaWRTdGF0dXMsCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiYgY2FtZXJhRGV2aWNlTmFtZXMpIHsKLSAgICAgICAgc3RhdHVzID0gaWRTdGF0dXM7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgZm9yIChhdXRvJiBuYW1lIDogY2FtZXJhRGV2aWNlTmFtZXMpIHsKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBtYWpvciwgbWlub3I7Ci0gICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHlwZSwgaWQ7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VEZXZpY2VOYW1lKG5hbWUsICZtYWpvciwgJm1pbm9yLCAmdHlwZSwgJmlkKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgcGFyc2luZyBkZXZpY2VOYW1lOiAlczogJWQiLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSwgcmVzKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLnB1c2hfYmFjayhuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLnB1c2hfYmFjayhpZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IH0pOwotICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGdldHRpbmcgY2FtZXJhIElEIGxpc3QgZnJvbSBwcm92aWRlciAnJXMnOiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGxpbmtlZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBmb3IgY2FtZXJhIGRldmljZXMgZnJvbSBwcm92aWRlciAnJXMnIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLSAgICB9Ci0KLSAgICAvLyBHZXQgbGlzdCBvZiBjb25jdXJyZW50IHN0cmVhbWluZyBjYW1lcmEgZGV2aWNlIGNvbWJpbmF0aW9ucwotICAgIGlmIChtTWlub3JWZXJzaW9uID49IDYpIHsKLSAgICAgICAgcmVzID0gZ2V0Q29uY3VycmVudENhbWVyYUlkc0ludGVybmFsTG9ja2VkKGludGVyZmFjZTJfNik7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXQgPSBpbnRlcmZhY2UtPmlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkKAotICAgICAgICBbdGhpc10oYXV0byBzdGF0dXMsIGJvb2wgc3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICBtU2V0VG9yY2hNb2RlU3VwcG9ydGVkID0gc3VwcG9ydGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBjaGVja2luZyB0b3JjaCBtb2RlIHN1cHBvcnQgJyVzJzogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLQotICAgIG1Jc1JlbW90ZSA9IGludGVyZmFjZS0+aXNSZW1vdGUoKTsKLQotICAgIHNwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lciA9IG1NYW5hZ2VyLT5nZXRTdGF0dXNMaXN0ZW5lcigpOwotICAgIGZvciAoYXV0byYgZGV2aWNlIDogZGV2aWNlcykgewotICAgICAgICBzdGQ6OnN0cmluZyBpZDsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gYWRkRGV2aWNlKGRldmljZSwgY29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQsICZpZCk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGVudW1lcmF0ZSBjYW1lcmEgZGV2aWNlICclcyc6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS5jX3N0cigpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQUxPR0koIkNhbWVyYSBwcm92aWRlciAlcyByZWFkeSB3aXRoICV6dSBjYW1lcmEgZGV2aWNlcyIsCi0gICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1EZXZpY2VzLnNpemUoKSk7Ci0KLSAgICAvLyBQcm9jZXNzIGNhY2hlZCBzdGF0dXMgY2FsbGJhY2tzCi0gICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPENhbWVyYVN0YXR1c0luZm9UPj4gY2FjaGVkU3RhdHVzID0KLSAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8c3RkOjp2ZWN0b3I8Q2FtZXJhU3RhdHVzSW5mb1Q+PigpOwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUluaXRMb2NrKTsKLQotICAgICAgICBmb3IgKGF1dG8mIHN0YXR1c0luZm8gOiBtQ2FjaGVkU3RhdHVzKSB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBpZCwgcGh5c2ljYWxJZDsKLSAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IE9LOwotICAgICAgICAgICAgaWYgKHN0YXR1c0luZm8uaXNQaHlzaWNhbENhbWVyYVN0YXR1cykgewotICAgICAgICAgICAgICAgIHJlcyA9IHBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKCZpZCwgJnBoeXNpY2FsSWQsCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1c0luZm8uY2FtZXJhSWQsIHN0YXR1c0luZm8ucGh5c2ljYWxDYW1lcmFJZCwgc3RhdHVzSW5mby5zdGF0dXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXMgPSBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoJmlkLCBzdGF0dXNJbmZvLmNhbWVyYUlkLCBzdGF0dXNJbmZvLnN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgY2FjaGVkU3RhdHVzLT5lbXBsYWNlX2JhY2soc3RhdHVzSW5mby5pc1BoeXNpY2FsQ2FtZXJhU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgaWQuY19zdHIoKSwgcGh5c2ljYWxJZC5jX3N0cigpLCBzdGF0dXNJbmZvLnN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUNhY2hlZFN0YXR1cy5jbGVhcigpOwotCi0gICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gVGhlIGNhY2hlZCBzdGF0dXMgY2hhbmdlIGNhbGxiYWNrcyBjYW5ub3QgYmUgZmlyZWQgZGlyZWN0bHkgZnJvbSB0aGlzCi0gICAgLy8gZnVuY3Rpb24sIGR1ZSB0byBzYW1lLXRocmVhZCBkZWFkbG9jayB0cnlpbmcgdG8gYWNxdWlyZSBtSW50ZXJmYWNlTXV0ZXgKLSAgICAvLyB0d2ljZS4KLSAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0cikgewotICAgICAgICBtSW5pdGlhbFN0YXR1c0NhbGxiYWNrRnV0dXJlID0gc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsCi0gICAgICAgICAgICAgICAgJkNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpub3RpZnlJbml0aWFsU3RhdHVzQ2hhbmdlLCB0aGlzLAotICAgICAgICAgICAgICAgIGxpc3RlbmVyLCBzdGQ6Om1vdmUoY2FjaGVkU3RhdHVzKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1jb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiUmVxdWVzdCB0byBzdGFydCBjYW1lcmEgcHJvdmlkZXI6ICVzIiwgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKLSAgICBpZiAobVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG1TYXZlZEludGVyZmFjZTsKLSAgICB9Ci0gICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgewotICAgICAgICBBTE9HRSgiQmFkIHByb3ZpZGVyIHN0YXRlISBTaG91bGQgbm90IGJlIGhlcmUgb24gYSBub24tbGF6eSBIQUwhIik7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIGF1dG8gaW50ZXJmYWNlID0gbUFjdGl2ZUludGVyZmFjZS5wcm9tb3RlKCk7Ci0gICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dJKCJDYW1lcmEgSEFMIHByb3ZpZGVyIG5lZWRzIHJlc3RhcnQsIGNhbGxpbmcgZ2V0U2VydmljZSglcykiLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOwotICAgICAgICBpbnRlcmZhY2UgPSBtTWFuYWdlci0+bVNlcnZpY2VQcm94eS0+Z2V0U2VydmljZShtUHJvdmlkZXJOYW1lKTsKLSAgICAgICAgaW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgaGFyZHdhcmU6OlJldHVybjxib29sPiBsaW5rZWQgPSBpbnRlcmZhY2UtPmxpbmtUb0RlYXRoKHRoaXMsIC8qY29va2llKi8gbUlkKTsKLSAgICAgICAgaWYgKCFsaW5rZWQuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGxpbmtpbmcgdG8gY2FtZXJhIHByb3ZpZGVyICclcycgZGVhdGg6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGxpbmtlZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZVByb3ZpZGVyKG1Qcm92aWRlck5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWxpbmtlZCkgewotICAgICAgICAgICAgQUxPR1coIiVzOiBVbmFibGUgdG8gbGluayB0byBwcm92aWRlciAnJXMnIGRlYXRoIG5vdGlmaWNhdGlvbnMiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2VuZCBjdXJyZW50IGRldmljZSBzdGF0ZQotICAgICAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA1KSB7Ci0gICAgICAgICAgICBhdXRvIGNhc3RSZXN1bHQgPSBwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOwotICAgICAgICAgICAgaWYgKGNhc3RSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlXzJfNSA9IGNhc3RSZXN1bHQ7Ci0gICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IEluaXRpYWwgZGV2aWNlIHN0YXRlIGZvciAlczogMHggJSIgUFJJeDY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlU3RhdGUpOwotICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfMl81LT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1BY3RpdmVJbnRlcmZhY2UgPSBpbnRlcmZhY2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIkNhbWVyYSBwcm92aWRlciAoJXMpIGFscmVhZHkgaW4gdXNlLiBSZS11c2luZyBpbnN0YW5jZS4iLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOwotICAgIH0KLSAgICByZXR1cm4gaW50ZXJmYWNlOwotfQotCiBjb25zdCBzdGQ6OnN0cmluZyYgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldFR5cGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1UeXBlOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6YWRkRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgaW5pdGlhbFN0YXR1cywgLypvdXQqLyBzdGQ6OnN0cmluZyogcGFyc2VkSWQpIHsKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjphZGREZXZpY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBDYW1lcmFEZXZpY2VTdGF0dXMgaW5pdGlhbFN0YXR1cywKKyAgICAgICAgLypvdXQqLyBzdGQ6OnN0cmluZyogcGFyc2VkSWQpIHsKIAogICAgIEFMT0dJKCJFbnVtZXJhdGluZyBuZXcgY2FtZXJhIGRldmljZTogJXMiLCBuYW1lLmNfc3RyKCkpOwogCiAgICAgdWludDE2X3QgbWFqb3IsIG1pbm9yOwogICAgIHN0ZDo6c3RyaW5nIHR5cGUsIGlkOworICAgIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQgPSBnZXRJUENUcmFuc3BvcnQoKTsKIAogICAgIHN0YXR1c190IHJlcyA9IHBhcnNlRGV2aWNlTmFtZShuYW1lLCAmbWFqb3IsICZtaW5vciwgJnR5cGUsICZpZCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KKwogICAgIGlmICh0eXBlICE9IG1UeXBlKSB7CiAgICAgICAgIEFMT0dFKCIlczogRGV2aWNlIHR5cGUgJXMgZG9lcyBub3QgbWF0Y2ggcHJvdmlkZXIgdHlwZSAlcyIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICB0eXBlLmNfc3RyKCksIG1UeXBlLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBpZiAobU1hbmFnZXItPmlzVmFsaWREZXZpY2VMb2NrZWQoaWQsIG1ham9yKSkgeworICAgIGlmIChtTWFuYWdlci0+aXNWYWxpZERldmljZUxvY2tlZChpZCwgbWFqb3IsIHRyYW5zcG9ydCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBEZXZpY2UgJXM6IElEICVzIGlzIGFscmVhZHkgaW4gdXNlIGZvciBkZXZpY2UgbWFqb3IgdmVyc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIGlkLmNfc3RyKCksIG1ham9yKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4gZGV2aWNlSW5mbzsKLSAgICBzd2l0Y2ggKG1ham9yKSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIEFMT0dFKCIlczogRGV2aWNlICVzOiBVbnN1cHBvcnRlZCBISURMIGRldmljZSBIQUwgbWFqb3IgdmVyc2lvbiAlZDoiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgbWFqb3IpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgZGV2aWNlSW5mbyA9IGluaXRpYWxpemVEZXZpY2VJbmZvPERldmljZUluZm8zPihuYW1lLCBtUHJvdmlkZXJUYWdpZCwKLSAgICAgICAgICAgICAgICAgICAgaWQsIG1pbm9yKTsKKyAgICBzd2l0Y2ggKHRyYW5zcG9ydCkgeworICAgICAgICBjYXNlIElQQ1RyYW5zcG9ydDo6SElETDoKKyAgICAgICAgICAgIHN3aXRjaCAobWFqb3IpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRGV2aWNlICVzOiBVbnN1cHBvcnRlZCBISURMIGRldmljZSBIQUwgbWFqb3IgdmVyc2lvbiAlZDoiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICBuYW1lLmNfc3RyKCksIG1ham9yKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElQQ1RyYW5zcG9ydDo6QUlETDoKKyAgICAgICAgICAgIGlmIChtYWpvciAhPSAxKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBEZXZpY2UgJXM6IFVuc3VwcG9ydGVkIEFJREwgZGV2aWNlIEhBTCBtYWpvciB2ZXJzaW9uICVkOiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgbWFqb3IpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCIlczogRGV2aWNlICVzOiBVbmtub3duIEhJREwgZGV2aWNlIEhBTCBtYWpvciB2ZXJzaW9uICVkOiIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBtYWpvcik7CisgICAgICAgICAgICBBTE9HRSgiJXMgSW52YWxpZCB0cmFuc3BvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHRyYW5zcG9ydCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKworICAgIGRldmljZUluZm8gPSBpbml0aWFsaXplRGV2aWNlSW5mbyhuYW1lLCBtUHJvdmlkZXJUYWdpZCwgaWQsIG1pbm9yKTsKICAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGRldmljZUluZm8tPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGdldERldmljZVN0YXRlKCkpOwogICAgIGRldmljZUluZm8tPm1TdGF0dXMgPSBpbml0aWFsU3RhdHVzOwogICAgIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSA9IGRldmljZUluZm8tPmlzQVBJMUNvbXBhdGlibGUoKTsKIApAQCAtMTY1NiwxNSArMTkzOCw1MCBAQAogICAgICAgICAgICAgbVVuaXF1ZUNhbWVyYUlkcy5lcmFzZShpZCk7CiAgICAgICAgICAgICBpZiAoKCppdCktPmlzQVBJMUNvbXBhdGlibGUoKSkgewogICAgICAgICAgICAgICAgIG1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkcy5lcmFzZShzdGQ6OnJlbW92ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgbVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzLmVuZCgpLCBpZCkpOworICAgICAgICAgICAgICAgICAgICBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgbVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzLmVuZCgpLCBpZCkpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZW1vdmUgcmVmZXJlbmNlIHRvIGNhbWVyYSBwcm92aWRlciB0byBhdm9pZCBwb2ludGVyIGxlYWsgd2hlbgorICAgICAgICAgICAgLy8gdW5wbHVnZ2luZyBleHRlcm5hbCBjYW1lcmEgd2hpbGUgaW4gdXNlIHdpdGggbGF6eSBIQUxzCisgICAgICAgICAgICBtTWFuYWdlci0+cmVtb3ZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQpOworICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZVJlZihEZXZpY2VNb2RlOjpUT1JDSCwgaWQpOworCiAgICAgICAgICAgICBtRGV2aWNlcy5lcmFzZShpdCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIH0KIAordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6cmVtb3ZlQWxsRGV2aWNlcygpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisKKyAgICBhdXRvIGl0RGV2aWNlcyA9IG1EZXZpY2VzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0RGV2aWNlcyAhPSBtRGV2aWNlcy5lbmQoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBpZCA9ICgqaXREZXZpY2VzKS0+bUlkOworICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2VOYW1lID0gKCppdERldmljZXMpLT5tTmFtZTsKKyAgICAgICAgcmVtb3ZlRGV2aWNlKGlkKTsKKyAgICAgICAgLy8gZGV2aWNlIHdhcyByZW1vdmVkLCByZXNldCBpdGVyYXRvcgorICAgICAgICBpdERldmljZXMgPSBtRGV2aWNlcy5iZWdpbigpOworCisgICAgICAgIC8vbm90aWZ5IENhbWVyYVNlcnZpY2Ugb2Ygc3RhdHVzIGNoYW5nZQorICAgICAgICBzcDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTWFuYWdlci0+Z2V0U3RhdHVzTGlzdGVuZXIoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgQUxPR1YoIiVzOiBub3RpZnkgZGV2aWNlIG5vdF9wcmVzZW50OiAlcyIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgbGlzdGVuZXItPm9uRGV2aWNlU3RhdHVzQ2hhbmdlZChTdHJpbmc4KGlkLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UKTsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6aXNFeHRlcm5hbExhenlIQUwoKSBjb25zdCB7CisgICAgcmV0dXJuIGtFbmFibGVMYXp5SGFsICYmIChtUHJvdmlkZXJOYW1lID09IGtFeHRlcm5hbFByb3ZpZGVyTmFtZSk7Cit9CisKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYpIGNvbnN0IHsKICAgICBkcHJpbnRmKGZkLCAiPT0gQ2FtZXJhIFByb3ZpZGVyIEhBTCAlcyAodjIuJWQsICVzKSBzdGF0aWMgaW5mbzogJXp1IGRldmljZXM6ID09XG4iLAogICAgICAgICAgICAgbVByb3ZpZGVySW5zdGFuY2UuY19zdHIoKSwKQEAgLTE3MzksMTE3ICsyMDU2LDU3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Z2V0Q29uY3VycmVudENhbWVyYUlkc0ludGVybmFsTG9ja2VkKAotICAgICAgICBzcDxwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyPiAmaW50ZXJmYWNlMl82KSB7Ci0gICAgaWYgKGludGVyZmFjZTJfNiA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbnVsbCBpbnRlcmZhY2UgcHJvdmlkZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldCA9Ci0gICAgICAgICAgICBpbnRlcmZhY2UyXzYtPmdldENvbmN1cnJlbnRTdHJlYW1pbmdDYW1lcmFJZHMoWyZzdGF0dXMsIHRoaXNdKAotICAgICAgICAgICAgU3RhdHVzIGNvbmN1cnJlbnRJZFN0YXR1cywgLy8gVE9ETzogTW92ZSBhbGwgaW5zdGFuY2VzIG9mIGhpZGxfc3RyaW5nIHRvICd1c2luZycKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPj4mCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2VJZENvbWJpbmF0aW9ucykgewotICAgICAgICAgICAgc3RhdHVzID0gY29uY3VycmVudElkU3RhdHVzOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgbUNvbmN1cnJlbnRDYW1lcmFJZENvbWJpbmF0aW9ucy5jbGVhcigpOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byYgY29tYmluYXRpb24gOiBjYW1lcmFEZXZpY2VJZENvbWJpbmF0aW9ucykgewotICAgICAgICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGRldmljZUlkczsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvICZjYW1lcmFEZXZpY2VJZCA6IGNvbWJpbmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZHMuaW5zZXJ0KGNhbWVyYURldmljZUlkLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Db25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbnMucHVzaF9iYWNrKHN0ZDo6bW92ZShkZXZpY2VJZHMpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IH0pOwotICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGdldHRpbmcgY29uY3VycmVudCBjYW1lcmEgSUQgbGlzdCBmcm9tIHByb3ZpZGVyICclcyciLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHF1ZXJ5IGZvciBjYW1lcmEgZGV2aWNlcyBmcm9tIHByb3ZpZGVyICclcyciLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6cmVDYWNoZUNvbmN1cnJlbnRTdHJlYW1pbmdDYW1lcmFJZHNMb2NrZWQoKSB7Ci0gICAgaWYgKG1NaW5vclZlcnNpb24gPCA2KSB7Ci0gICAgICAvLyBVbnN1cHBvcnRlZCBvcGVyYXRpb24sIG5vdGhpbmcgdG8gZG8gaGVyZQotICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZXIgaXMgY3VycmVudGx5IGFjdGl2ZSAtIG5vdCBnb2luZyB0byBzdGFydCBpdCB1cCBmb3IgdGhpcyBub3RpZmljYXRpb24KLSAgICBhdXRvIGludGVyZmFjZSA9IG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyID8gbVNhdmVkSW50ZXJmYWNlIDogbUFjdGl2ZUludGVyZmFjZS5wcm9tb3RlKCk7Ci0gICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogY2FtZXJhIHByb3ZpZGVyIGludGVyZmFjZSBmb3IgJXMgaXMgbm90IHZhbGlkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgYXV0byBjYXN0UmVzdWx0ID0gcHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKLQotICAgIGlmIChjYXN0UmVzdWx0LmlzT2soKSkgewotICAgICAgICBzcDxwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UyXzYgPSBjYXN0UmVzdWx0OwotICAgICAgICBpZiAoaW50ZXJmYWNlMl82ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb25jdXJyZW50Q2FtZXJhSWRzSW50ZXJuYWxMb2NrZWQoaW50ZXJmYWNlMl82KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gc2luY2UgbU1pbm9yVmVyc2lvbiA+PSA2Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IG1NaW5vclZlcnNpb24gd2FzID49IDYsIGJ1dCBpbnRlcmZhY2UyXzYgd2FzIG51bGxwdHIiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCiBzdGQ6OnZlY3RvcjxzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+PgogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldENvbmN1cnJlbnRDYW1lcmFJZENvbWJpbmF0aW9ucygpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1Db25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbnM7CiB9CiAKLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmNhbWVyYURldmljZVN0YXR1c0NoYW5nZSgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAotICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSB7Cit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VJbnRlcm5hbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsIENhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpIHsKICAgICBzcDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXI7CiAgICAgc3RkOjpzdHJpbmcgaWQ7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUluaXRMb2NrKTsKLQorICAgIENhbWVyYURldmljZVN0YXR1cyBpbnRlcm5hbE5ld1N0YXR1cyA9IG5ld1N0YXR1czsKICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewogICAgICAgICBtQ2FjaGVkU3RhdHVzLmVtcGxhY2VfYmFjayhmYWxzZSAvKmlzUGh5c2ljYWxDYW1lcmFTdGF0dXMqLywKLSAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCksIHN0ZDo6c3RyaW5nKCkuY19zdHIoKSwgbmV3U3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpLCBzdGQ6OnN0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgaW50ZXJuYWxOZXdTdGF0dXMpOworICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgICAgIGlmIChPSyAhPSBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoJmlkLCBjYW1lcmFEZXZpY2VOYW1lLCBuZXdTdGF0dXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBsaXN0ZW5lciA9IG1NYW5hZ2VyLT5nZXRTdGF0dXNMaXN0ZW5lcigpOwogICAgIH0KIAogICAgIC8vIENhbGwgd2l0aG91dCBsb2NrIGhlbGQgdG8gYWxsb3cgcmVlbnRyYW5jeSBpbnRvIHByb3ZpZGVyIG1hbmFnZXIKICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0cikgewotICAgICAgICBsaXN0ZW5lci0+b25EZXZpY2VTdGF0dXNDaGFuZ2VkKFN0cmluZzgoaWQuY19zdHIoKSksIG5ld1N0YXR1cyk7CisgICAgICAgIGxpc3RlbmVyLT5vbkRldmljZVN0YXR1c0NoYW5nZWQoU3RyaW5nOChpZC5jX3N0cigpKSwgaW50ZXJuYWxOZXdTdGF0dXMpOwogICAgIH0KLQotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Y2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKAotICAgICAgICBzdGQ6OnN0cmluZyogaWQsIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgc3RkOjpzdHJpbmcqIGlkLCBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgewogICAgIGJvb2wga25vd24gPSBmYWxzZTsKICAgICBzdGQ6OnN0cmluZyBjYW1lcmFJZDsKICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBtRGV2aWNlcykgewogICAgICAgICBpZiAoZGV2aWNlSW5mby0+bU5hbWUgPT0gY2FtZXJhRGV2aWNlTmFtZSkgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwoZGV2aWNlSW5mby0+bURldmljZUF2YWlsYWJsZUxvY2spOwogICAgICAgICAgICAgQUxPR0koIkNhbWVyYSBkZXZpY2UgJXMgc3RhdHVzIGlzIG5vdyAlcywgd2FzICVzIiwgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXNUb1N0cmluZyhuZXdTdGF0dXMpLCBkZXZpY2VTdGF0dXNUb1N0cmluZyhkZXZpY2VJbmZvLT5tU3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgIEZyYW1ld29ya0RldmljZVN0YXR1c1RvU3RyaW5nKG5ld1N0YXR1cyksCisgICAgICAgICAgICAgICAgICAgIEZyYW1ld29ya0RldmljZVN0YXR1c1RvU3RyaW5nKGRldmljZUluZm8tPm1TdGF0dXMpKTsKICAgICAgICAgICAgIGRldmljZUluZm8tPm1TdGF0dXMgPSBuZXdTdGF0dXM7CiAgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgZGV2aWNlIHJlbW92YWwgKE5PVF9QUkVTRU5UKQogICAgICAgICAgICAgY2FtZXJhSWQgPSBkZXZpY2VJbmZvLT5tSWQ7CiAgICAgICAgICAgICBrbm93biA9IHRydWU7CisgICAgICAgICAgICBkZXZpY2VJbmZvLT5tSXNEZXZpY2VBdmFpbGFibGUgPQorICAgICAgICAgICAgICAgIChuZXdTdGF0dXMgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5UKTsKKyAgICAgICAgICAgIGRldmljZUluZm8tPm1EZXZpY2VBdmFpbGFibGVTaWduYWwuc2lnbmFsKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTE4NjMsNyArMjEyMCwxMyBAQAogICAgICAgICBhZGREZXZpY2UoY2FtZXJhRGV2aWNlTmFtZSwgbmV3U3RhdHVzLCAmY2FtZXJhSWQpOwogICAgIH0gZWxzZSBpZiAobmV3U3RhdHVzID09IENhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlQpIHsKICAgICAgICAgcmVtb3ZlRGV2aWNlKGNhbWVyYUlkKTsKKyAgICB9IGVsc2UgaWYgKGlzRXh0ZXJuYWxMYXp5SEFMKCkpIHsKKyAgICAgICAgLy8gRG8gbm90IG5vdGlmeSBDYW1lcmFTZXJ2aWNlIGZvciBQUkVTRU5ULT5QUkVTRU5UIChsYXp5IEhBTCByZXN0YXJ0KQorICAgICAgICAvLyBiZWNhdXNlIE5PVF9BVkFJTEFCTEUgaXMgc2V0IG9uIENhbWVyYVNlcnZpY2U6OmNvbm5lY3QgYW5kIGEgUFJFU0VOVAorICAgICAgICAvLyBub3RpZi4gd291bGQgb3ZlcndyaXRlIGl0CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorCiAgICAgaWYgKHJlQ2FjaGVDb25jdXJyZW50U3RyZWFtaW5nQ2FtZXJhSWRzTG9ja2VkKCkgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmFQcm92aWRlciAlcyBjb3VsZCBub3QgcmUtY2FjaGUgY29uY3VycmVudCBzdHJlYW1pbmcgY2FtZXJhIGlkIGxpc3QgIiwKICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKQEAgLTE4NzIsMTkgKzIxMzUsMTggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6cGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VJbnRlcm5hbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCiAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpIHsKICAgICBzcDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXI7CiAgICAgc3RkOjpzdHJpbmcgaWQ7CiAgICAgc3RkOjpzdHJpbmcgcGh5c2ljYWxJZDsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW5pdExvY2spOwotCiAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgbUNhY2hlZFN0YXR1cy5lbXBsYWNlX2JhY2sodHJ1ZSAvKmlzUGh5c2ljYWxDYW1lcmFTdGF0dXMqLywgY2FtZXJhRGV2aWNlTmFtZSwKICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsIG5ld1N0YXR1cyk7Ci0gICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgewpAQCAtMTg5Miw3ICsyMTU0LDcgQEAKIAogICAgICAgICBpZiAoT0sgIT0gcGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoJmlkLCAmcGh5c2ljYWxJZCwgY2FtZXJhRGV2aWNlTmFtZSwKICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsIG5ld1N0YXR1cykpIHsKLSAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgbGlzdGVuZXIgPSBtTWFuYWdlci0+Z2V0U3RhdHVzTGlzdGVuZXIoKTsKQEAgLTE5MDIsMTMgKzIxNjQsMTMgQEAKICAgICAgICAgbGlzdGVuZXItPm9uRGV2aWNlU3RhdHVzQ2hhbmdlZChTdHJpbmc4KGlkLmNfc3RyKCkpLAogICAgICAgICAgICAgICAgIFN0cmluZzgocGh5c2ljYWxJZC5jX3N0cigpKSwgbmV3U3RhdHVzKTsKICAgICB9Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgcmV0dXJuOwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6cGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoCiAgICAgICAgICAgICBzdGQ6OnN0cmluZyogaWQsIHN0ZDo6c3RyaW5nKiBwaHlzaWNhbElkLAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCiAgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSB7CiAgICAgYm9vbCBrbm93biA9IGZhbHNlOwogICAgIHN0ZDo6c3RyaW5nIGNhbWVyYUlkOwpAQCAtMTkyOCw3ICsyMTkwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dJKCJDYW1lcmEgZGV2aWNlICVzIHBoeXNpY2FsIGRldmljZSAlcyBzdGF0dXMgaXMgbm93ICVzIiwKICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpLCBwaHlzaWNhbENhbWVyYURldmljZU5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlU3RhdHVzVG9TdHJpbmcobmV3U3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgIEZyYW1ld29ya0RldmljZVN0YXR1c1RvU3RyaW5nKG5ld1N0YXR1cykpOwogICAgICAgICAgICAga25vd24gPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE5NDYsMjIgKzIyMDgsMjUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnRvcmNoTW9kZVN0YXR1c0NoYW5nZSgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6dG9yY2hNb2RlU3RhdHVzQ2hhbmdlSW50ZXJuYWwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAogICAgICAgICBUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKSB7CiAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyOworICAgIFN5c3RlbUNhbWVyYUtpbmQgc3lzdGVtQ2FtZXJhS2luZCA9IFN5c3RlbUNhbWVyYUtpbmQ6OlBVQkxJQzsKICAgICBzdGQ6OnN0cmluZyBpZDsKKyAgICBib29sIGtub3duID0gZmFsc2U7CiAgICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWFuYWdlci0+bVN0YXR1c0xpc3RlbmVyTXV0ZXgpOwotICAgICAgICBib29sIGtub3duID0gZmFsc2U7CisgICAgICAgIC8vIEhvbGQgbUxvY2sgZm9yIGFjY2Vzc2luZyBtRGV2aWNlcworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IG1EZXZpY2VzKSB7CiAgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bU5hbWUgPT0gY2FtZXJhRGV2aWNlTmFtZSkgewogICAgICAgICAgICAgICAgIEFMT0dJKCJDYW1lcmEgZGV2aWNlICVzIHRvcmNoIHN0YXR1cyBpcyBub3cgJXMiLCBjYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0b3JjaFN0YXR1c1RvU3RyaW5nKG5ld1N0YXR1cykpOworICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWV3b3JrVG9yY2hTdGF0dXNUb1N0cmluZyhuZXdTdGF0dXMpKTsKICAgICAgICAgICAgICAgICBpZCA9IGRldmljZUluZm8tPm1JZDsKICAgICAgICAgICAgICAgICBrbm93biA9IHRydWU7CisgICAgICAgICAgICAgICAgc3lzdGVtQ2FtZXJhS2luZCA9IGRldmljZUluZm8tPm1TeXN0ZW1DYW1lcmFLaW5kOwogICAgICAgICAgICAgICAgIGlmIChUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PTiAhPSBuZXdTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZVJlZihEZXZpY2VNb2RlOjpUT1JDSCwgaWQpOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci0+cmVtb3ZlUmVmKENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6RGV2aWNlTW9kZTo6VE9SQ0gsIGlkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xOTY5LDE2NSArMjIzNCwzMSBAQAogICAgICAgICBpZiAoIWtub3duKSB7CiAgICAgICAgICAgICBBTE9HVygiQ2FtZXJhIHByb3ZpZGVyICVzIHNheXMgYW4gdW5rbm93biBjYW1lcmEgJXMgbm93IGhhcyB0b3JjaCBzdGF0dXMgJWQuIEN1cmlvdXMuIiwKICAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBjYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCksIG5ld1N0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICAvLyBubyBsb2NrIG5lZWRlZCBzaW5jZSBsaXN0ZW5lciBpcyBzZXQgdXAgb25seSBvbmNlIGR1cmluZworICAgICAgICAvLyBDYW1lcmFQcm92aWRlck1hbmFnZXIgaW5pdGlhbGl6YXRpb24gYW5kIHRoZW4gbmV2ZXIgY2hhbmdlZCB0aWxsIGl0IGlzCisgICAgICAgIC8vIGRlc3RydWN0ZWQuCiAgICAgICAgIGxpc3RlbmVyID0gbU1hbmFnZXItPmdldFN0YXR1c0xpc3RlbmVyKCk7Ci0gICAgfQorICAgICB9CiAgICAgLy8gQ2FsbCB3aXRob3V0IGxvY2sgaGVsZCB0byBhbGxvdyByZWVudHJhbmN5IGludG8gcHJvdmlkZXIgbWFuYWdlcgorICAgIC8vIFRoZSBwcm9ibGVtIHdpdGggaG9sZGluZyBtTG9jayBoZXJlIGlzIHRoYXQgd2UKKyAgICAvLyBtaWdodCBiZSBsaW1pdGluZyByZS1lbnRyYW5jeSA6IENhbWVyYVNlcnZpY2U6Om9uVG9yY2hTdGF0dXNDaGFuZ2VkIGNhbGxzCisgICAgLy8gYmFjayBpbnRvIENhbWVyYVByb3ZpZGVyTWFuYWdlciB3aGljaCBtaWdodCB0cnkgdG8gaG9sZCBtTG9jayBhZ2FpbiAoZWc6CisgICAgLy8gZmluZERldmljZUluZm8sIHdoaWNoIHNob3VsZCBiZSBob2xkaW5nIG1Mb2NrIHdoaWxlIGl0ZXJhdGluZyB0aHJvdWdoCisgICAgLy8gZWFjaCBwcm92aWRlcidzIGRldmljZXMpLgogICAgIGlmIChsaXN0ZW5lciAhPSBudWxscHRyKSB7Ci0gICAgICAgIGxpc3RlbmVyLT5vblRvcmNoU3RhdHVzQ2hhbmdlZChTdHJpbmc4KGlkLmNfc3RyKCkpLCBuZXdTdGF0dXMpOworICAgICAgICBsaXN0ZW5lci0+b25Ub3JjaFN0YXR1c0NoYW5nZWQoU3RyaW5nOChpZC5jX3N0cigpKSwgbmV3U3RhdHVzLCBzeXN0ZW1DYW1lcmFLaW5kKTsKICAgICB9Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgcmV0dXJuOwogfQogCi12b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsCi0gICAgICAgIGNvbnN0IHdwPGhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgd2hvKSB7Ci0gICAgKHZvaWQpIHdobzsKLSAgICBBTE9HSSgiQ2FtZXJhIHByb3ZpZGVyICclcycgaGFzIGRpZWQ7IHJlbW92aW5nIGl0IiwgbVByb3ZpZGVySW5zdGFuY2UuY19zdHIoKSk7Ci0gICAgaWYgKGNvb2tpZSAhPSBtSWQpIHsKLSAgICAgICAgQUxPR1coIiVzOiBVbmV4cGVjdGVkIHNlcnZpY2VEaWVkIGNvb2tpZSAlIiBQUkl1NjQgIiwgZXhwZWN0ZWQgJSIgUFJJdTMyLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY29va2llLCBtSWQpOwordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6bm90aWZ5RGV2aWNlSW5mb1N0YXRlQ2hhbmdlTG9ja2VkKAorICAgICAgICBpbnQ2NF90IG5ld0RldmljZVN0YXRlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGZvciAoYXV0byBpdCA9IG1EZXZpY2VzLmJlZ2luKCk7IGl0ICE9IG1EZXZpY2VzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICgqaXQpLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShuZXdEZXZpY2VTdGF0ZSk7CiAgICAgfQotICAgIG1NYW5hZ2VyLT5yZW1vdmVQcm92aWRlcihtUHJvdmlkZXJJbnN0YW5jZSk7Ci19Ci0KLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzZXRVcFZlbmRvclRhZ3MoKSB7Ci0gICAgaWYgKG1WZW5kb3JUYWdEZXNjcmlwdG9yICE9IG51bGxwdHIpCi0gICAgICAgIHJldHVybiBPSzsKLQotICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxWZW5kb3JUYWdTZWN0aW9uPiB2dHM7Ci0gICAgU3RhdHVzIHN0YXR1czsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7Ci0gICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRWZW5kb3JUYWdzKAotICAgICAgICBbJl0oYXV0byBzLCBjb25zdCBhdXRvJiB2ZW5kb3JUYWdTZWNzKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgaWYgKHMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgIHZ0cyA9IHZlbmRvclRhZ1NlY3M7Ci0gICAgICAgICAgICB9Ci0gICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyc6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLSAgICB9Ci0KLSAgICAvLyBSZWFkIGFsbCB2ZW5kb3IgdGFnIGRlZmluaXRpb25zIGludG8gYSBkZXNjcmlwdG9yCi0gICAgc3RhdHVzX3QgcmVzOwotICAgIGlmICgocmVzID0gSGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSGlkbCh2dHMsIC8qb3V0Ki9tVmVuZG9yVGFnRGVzY3JpcHRvcikpCi0gICAgICAgICAgICAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBnZW5lcmF0ZSBkZXNjcmlwdG9yIGZyb20gdmVuZG9yIHRhZyBvcGVyYXRpb25zLCIKLSAgICAgICAgICAgICAgICAicmVjZWl2ZWQgZXJyb3IgJXMgKCVkKS4gQ2FtZXJhIGNsaWVudHMgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UiCi0gICAgICAgICAgICAgICAgInZlbmRvciB0YWdzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihyZXMpLCByZXMpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86Om5vdGlmeURldmljZVN0YXRlQ2hhbmdlKAotICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IG5ld0RldmljZVN0YXRlKSB7Ci0gICAgbURldmljZVN0YXRlID0gbmV3RGV2aWNlU3RhdGU7Ci0gICAgaWYgKG1NaW5vclZlcnNpb24gPj0gNSkgewotICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZXIgaXMgY3VycmVudGx5IGFjdGl2ZSAtIG5vdCBnb2luZyB0byBzdGFydCBpdCB1cCBmb3IgdGhpcyBub3RpZmljYXRpb24KLSAgICAgICAgYXV0byBpbnRlcmZhY2UgPSBtU2F2ZWRJbnRlcmZhY2UgIT0gbnVsbHB0ciA/IG1TYXZlZEludGVyZmFjZSA6IG1BY3RpdmVJbnRlcmZhY2UucHJvbW90ZSgpOwotICAgICAgICBpZiAoaW50ZXJmYWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vIFNlbmQgY3VycmVudCBkZXZpY2Ugc3RhdGUKLSAgICAgICAgICAgIGF1dG8gY2FzdFJlc3VsdCA9IHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7Ci0gICAgICAgICAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKLSAgICAgICAgICAgICAgICBzcDxwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl81ID0gY2FzdFJlc3VsdDsKLSAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlXzJfNSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV8yXzUtPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKG1EZXZpY2VTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmlzQ29uY3VycmVudFNlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4gJmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywKLSAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKLSAgICBzdGF0dXNfdCByZXMgPSBPSzsKLSAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA2KSB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlciBpcyBjdXJyZW50bHkgYWN0aXZlIC0gbm90IGdvaW5nIHRvIHN0YXJ0IGl0IHVwIGZvciB0aGlzIG5vdGlmaWNhdGlvbgotICAgICAgICBhdXRvIGludGVyZmFjZSA9IG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyID8gbVNhdmVkSW50ZXJmYWNlIDogbUFjdGl2ZUludGVyZmFjZS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBtaWdodCBiZSBzb21lIG90aGVyIHByb2JsZW0KLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBhdXRvIGNhc3RSZXN1bHQyXzYgPSBwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOwotICAgICAgICBhdXRvIGNhc3RSZXN1bHQyXzcgPSBwcm92aWRlcjo6VjJfNzo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOwotICAgICAgICBTdGF0dXMgY2FsbFN0YXR1czsKLSAgICAgICAgYXV0byBjYiA9Ci0gICAgICAgICAgICAgICAgWyZpc1N1cHBvcnRlZCwgJmNhbGxTdGF0dXNdKFN0YXR1cyBzLCBib29sIHN1cHBvcnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHN1cHBvcnRlZDsgfTsKLQotICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgICAgICBzcDxwcm92aWRlcjo6VjJfNzo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl83OwotICAgICAgICBzcDxwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl82OwotICAgICAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA3ICYmIGNhc3RSZXN1bHQyXzcuaXNPaygpKSB7Ci0gICAgICAgICAgICBpbnRlcmZhY2VfMl83ID0gY2FzdFJlc3VsdDJfNzsKLSAgICAgICAgICAgIGlmIChpbnRlcmZhY2VfMl83ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBpbnRlcmZhY2VfMl83LT5pc0NvbmN1cnJlbnRTdHJlYW1Db21iaW5hdGlvblN1cHBvcnRlZF8yXzcoCi0gICAgICAgICAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsIGNiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtTWlub3JWZXJzaW9uID09IDYgJiYgY2FzdFJlc3VsdDJfNi5pc09rKCkpIHsKLSAgICAgICAgICAgIGludGVyZmFjZV8yXzYgPSBjYXN0UmVzdWx0Ml82OwotICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzYgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxwcm92aWRlcjo6VjJfNjo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzY7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG51bVN0cmVhbXMgPSBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzYucmVzaXplKG51bVN0cmVhbXMpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3RyZWFtczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBjYW1lcmEzOwotICAgICAgICAgICAgICAgICAgICBhdXRvIGNvbnN0JiBjb21iaW5hdGlvbiA9IGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zXzJfNltpXS5jYW1lcmFJZCA9IGNvbWJpbmF0aW9uLmNhbWVyYUlkOwotICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRIQUxTdHJlYW1Db21iaW5hdGlvbkZyb21WMzdUb1YzNCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzZbaV0uc3RyZWFtQ29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uLnN0cmVhbUNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldCA9IGludGVyZmFjZV8yXzYtPmlzQ29uY3VycmVudFN0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zXzJfNiwgY2IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGludGVyZmFjZV8yXzcgIT0gbnVsbHB0ciB8fCBpbnRlcmZhY2VfMl82ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjYWxsU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIGNhc2UsIGRvIG5vdGhpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBPSzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gcXVlcnkgZmFpbGVkOiAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgYmluZGVyIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgcmVzID0gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCiB2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpub3RpZnlJbml0aWFsU3RhdHVzQ2hhbmdlKApAQCAtMjE0NCwyNzcgKzIyNzUsMjEgQEAKICAgICB9CiB9CiAKLXRlbXBsYXRlPGNsYXNzIERldmljZUluZm9UPgotc3RkOjp1bmlxdWVfcHRyPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvPgotICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjppbml0aWFsaXplRGV2aWNlSW5mbygKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbikgewotICAgIFN0YXR1cyBzdGF0dXM7Ci0KLSAgICBhdXRvIGNhbWVyYUludGVyZmFjZSA9Ci0gICAgICAgICAgICBzdGFydERldmljZUludGVyZmFjZTx0eXBlbmFtZSBEZXZpY2VJbmZvVDo6SW50ZXJmYWNlVD4obmFtZSk7Ci0gICAgaWYgKGNhbWVyYUludGVyZmFjZSA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKLQotICAgIENhbWVyYVJlc291cmNlQ29zdCByZXNvdXJjZUNvc3Q7Ci0gICAgY2FtZXJhSW50ZXJmYWNlLT5nZXRSZXNvdXJjZUNvc3QoWyZzdGF0dXMsICZyZXNvdXJjZUNvc3RdKAotICAgICAgICBTdGF0dXMgcywgQ2FtZXJhUmVzb3VyY2VDb3N0IGNvc3QpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIHJlc291cmNlQ29zdCA9IGNvc3Q7Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb2J0YWluIHJlc291cmNlIGNvc3RzIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIHN0YXR1c1RvU3RyaW5nKHN0YXR1cykpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8mIGNvbmZsaWN0TmFtZSA6IHJlc291cmNlQ29zdC5jb25mbGljdGluZ0RldmljZXMpIHsKLSAgICAgICAgdWludDE2X3QgbWFqb3IsIG1pbm9yOwotICAgICAgICBzdGQ6OnN0cmluZyB0eXBlLCBpZDsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VEZXZpY2VOYW1lKGNvbmZsaWN0TmFtZSwgJm1ham9yLCAmbWlub3IsICZ0eXBlLCAmaWQpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwYXJzZSBjb25mbGljdGluZyBkZXZpY2UgJXMiLCBfX0ZVTkNUSU9OX18sIGNvbmZsaWN0TmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIGNvbmZsaWN0TmFtZSA9IGlkOwotICAgIH0KLQotICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4oCi0gICAgICAgIG5ldyBEZXZpY2VJbmZvVChuYW1lLCB0YWdJZCwgaWQsIG1pbm9yVmVyc2lvbiwgcmVzb3VyY2VDb3N0LCB0aGlzLAotICAgICAgICAgICAgICAgIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcywgY2FtZXJhSW50ZXJmYWNlKSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+Ci1zcDxJbnRlcmZhY2VUPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7Ci0gICAgQUxPR0UoIiVzOiBEZXZpY2UgJXM6IFVua25vd24gSElETCBkZXZpY2UgSEFMIG1ham9yIHZlcnNpb24gJWQ6IiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBJbnRlcmZhY2VUOjp2ZXJzaW9uLmdldF9tYWpvcigpKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdGVtcGxhdGU8Pgotc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlCi0gICAgICAgIDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7Ci0gICAgU3RhdHVzIHN0YXR1czsKLSAgICBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGNhbWVyYUludGVyZmFjZTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7Ci0gICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WM194KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKLSAgICAgICAgU3RhdHVzIHMsIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICBjYW1lcmFJbnRlcmZhY2UgPSBpbnRlcmZhY2U7Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciB0cnlpbmcgdG8gb2J0YWluIGludGVyZmFjZSBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvYnRhaW4gaW50ZXJmYWNlIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIHN0YXR1c1RvU3RyaW5nKHN0YXR1cykpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcmV0dXJuIGNhbWVyYUludGVyZmFjZTsKLX0KLQotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm86On5EZXZpY2VJbmZvKCkge30KLQotdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KLXNwPEludGVyZmFjZVQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvOjpzdGFydERldmljZUludGVyZmFjZSgpIHsKLSAgICBzcDxJbnRlcmZhY2VUPiBkZXZpY2U7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBpZiAobVNhdmVkSW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciA9IG1QYXJlbnRQcm92aWRlci5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChwYXJlbnRQcm92aWRlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBwYXJlbnRQcm92aWRlci0+c3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4obU5hbWUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGV2aWNlID0gKEludGVyZmFjZVQgKikgbVNhdmVkSW50ZXJmYWNlLmdldCgpOwotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm86OnNldFRvcmNoTW9kZShJbnRlcmZhY2VUJiBpbnRlcmZhY2UsCi0gICAgICAgIGJvb2wgZW5hYmxlZCkgewotICAgIFN0YXR1cyBzID0gaW50ZXJmYWNlLT5zZXRUb3JjaE1vZGUoZW5hYmxlZCA/IFRvcmNoTW9kZTo6T04gOiBUb3JjaE1vZGU6Ok9GRik7Ci0gICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzKTsKLX0KLQogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpEZXZpY2VJbmZvMyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICBjb25zdCBDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCi0gICAgICAgIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSkgOgorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcykgOgogICAgICAgICBEZXZpY2VJbmZvKG5hbWUsIHRhZ0lkLCBpZCwgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnszLCBtaW5vclZlcnNpb259LAotICAgICAgICAgICAgICAgICAgIHB1YmxpY0NhbWVyYUlkcywgcmVzb3VyY2VDb3N0LCBwYXJlbnRQcm92aWRlcikgewotICAgIC8vIEdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGFuZCBpbml0aWFsaXplIGZsYXNoIHVuaXQgYXZhaWxhYmlsaXR5Ci0gICAgU3RhdHVzIHN0YXR1czsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhbJnN0YXR1cywgdGhpc10oU3RhdHVzIHMsCi0gICAgICAgICAgICAgICAgICAgIGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKmJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KG1ldGFkYXRhLmRhdGEoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBtZXRhZGF0YS5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXMgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gT0sgfHwgcmVzID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKGJ1ZmZlciwgbVByb3ZpZGVyVGFnaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUNoYXJhY3RlcmlzdGljcyA9IGJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXMiCi0gICAgICAgICAgICAgICAgIiB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwKLSAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgIHB1YmxpY0NhbWVyYUlkcywgcmVzb3VyY2VDb3N0LCBwYXJlbnRQcm92aWRlcikgeyB9CisKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShpbnQ2NF90IG5ld1N0YXRlKSB7CisgICAgaWYgKCFtRGV2aWNlU3RhdGVPcmllbnRhdGlvbk1hcC5lbXB0eSgpICYmCisgICAgICAgICAgICAobURldmljZVN0YXRlT3JpZW50YXRpb25NYXAuZmluZChuZXdTdGF0ZSkgIT0gbURldmljZVN0YXRlT3JpZW50YXRpb25NYXAuZW5kKCkpKSB7CisgICAgICAgIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MudXBkYXRlKEFORFJPSURfU0VOU09SX09SSUVOVEFUSU9OLAorICAgICAgICAgICAgICAgICZtRGV2aWNlU3RhdGVPcmllbnRhdGlvbk1hcFtuZXdTdGF0ZV0sIDEpOwogICAgIH0KLSAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtU3lzdGVtQ2FtZXJhS2luZCA9IGdldFN5c3RlbUNhbWVyYUtpbmQoKTsKLQotICAgIHN0YXR1c190IHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MoKTsKLSAgICBpZiAoT0sgIT0gcmVzKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGZpeCB1cCBtb25vY2hyb21lIHRhZ3MgYmFzZWQgZm9yIG9sZGVyIEhBTCB2ZXJzaW9uOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gc3RhdCA9IGFkZER5bmFtaWNEZXB0aFRhZ3MoKTsKLSAgICBpZiAoT0sgIT0gc3RhdCkgewotICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBhcHBlbmRpbmcgZHluYW1pYyBkZXB0aCB0YWdzOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtc3RhdCksCi0gICAgICAgICAgICAgICAgc3RhdCk7Ci0gICAgfQotICAgIHJlcyA9IGRlcml2ZUhlaWNUYWdzKCk7Ci0gICAgaWYgKE9LICE9IHJlcykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBkZXJpdmUgSEVJQyB0YWdzIGJhc2VkIG9uIGNhbWVyYSBhbmQgbWVkaWEgY2FwYWJpbGl0aWVzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgIH0KLQotICAgIGlmIChTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjppc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IobUNhbWVyYUNoYXJhY3RlcmlzdGljcykpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWRkRHluYW1pY0RlcHRoVGFncygvKm1heFJlc29sdXRpb24qL3RydWUpOwotICAgICAgICBpZiAoT0sgIT0gc3RhdHVzKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBhcHBlbmRpbmcgZHluYW1pYyBkZXB0aCB0YWdzIGZvciBtYXhpbXVtIHJlc29sdXRpb24gbW9kZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXN0YXR1cyksIHN0YXR1cyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXMgPSBkZXJpdmVIZWljVGFncygvKm1heFJlc29sdXRpb24qL3RydWUpOwotICAgICAgICBpZiAoT0sgIT0gc3RhdHVzKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBkZXJpdmUgSEVJQyB0YWdzIGJhc2VkIG9uIGNhbWVyYSBhbmQgbWVkaWEgY2FwYWJpbGl0aWVzIGZvciIKLSAgICAgICAgICAgICAgICAgICAgIm1heGltdW0gcmVzb2x1dGlvbiBtb2RlOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtc3RhdHVzKSwgc3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJlcyA9IGFkZFJvdGF0ZUNyb3BUYWdzKCk7Ci0gICAgaWYgKE9LICE9IHJlcykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBhZGQgZGVmYXVsdCBTQ0FMRVJfUk9UQVRFX0FORF9DUk9QIHRhZ3M6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgfQotICAgIHJlcyA9IGFkZFByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUoKTsKLSAgICBpZiAoT0sgIT0gcmVzKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGFkZCBQUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICB9Ci0gICAgcmVzID0gY2FtZXJhMzo6Wm9vbVJhdGlvTWFwcGVyOjpvdmVycmlkZVpvb21SYXRpb1RhZ3MoCi0gICAgICAgICAgICAmbUNhbWVyYUNoYXJhY3RlcmlzdGljcywgJm1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvKTsKLSAgICBpZiAoT0sgIT0gcmVzKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIG92ZXJyaWRlIHpvb21SYXRpbyByZWxhdGVkIHRhZ3M6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgfQotCi0gICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGZsYXNoQXZhaWxhYmxlID0KLSAgICAgICAgICAgIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFKTsKLSAgICBpZiAoZmxhc2hBdmFpbGFibGUuY291bnQgPT0gMSAmJgotICAgICAgICAgICAgZmxhc2hBdmFpbGFibGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFX1RSVUUpIHsKLSAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IGZhbHNlOwotICAgIH0KLQotICAgIHF1ZXJ5UGh5c2ljYWxDYW1lcmFJZHMoKTsKLQotICAgIC8vIEdldCBwaHlzaWNhbCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGlmIGFwcGxpY2FibGUKLSAgICBhdXRvIGNhc3RSZXN1bHQgPSBkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U6OmNhc3RGcm9tKGludGVyZmFjZSk7Ci0gICAgaWYgKCFjYXN0UmVzdWx0LmlzT2soKSkgewotICAgICAgICBBTE9HVigiJXM6IFVuYWJsZSB0byBjb252ZXJ0IElDYW1lcmFEZXZpY2UgaW5zdGFuY2UgdG8gdmVyc2lvbiAzLjUiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNwPGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlXzNfNSA9IGNhc3RSZXN1bHQ7Ci0gICAgaWYgKGludGVyZmFjZV8zXzUgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IENvbnZlcnRlZCBJQ2FtZXJhRGV2aWNlIGluc3RhbmNlIHRvIG51bGxwdHIiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1Jc0xvZ2ljYWxDYW1lcmEpIHsKLSAgICAgICAgZm9yIChhdXRvJiBpZCA6IG1QaHlzaWNhbElkcykgewotICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChtUHVibGljQ2FtZXJhSWRzLmJlZ2luKCksIG1QdWJsaWNDYW1lcmFJZHMuZW5kKCksIGlkKSAhPQotICAgICAgICAgICAgICAgICAgICBtUHVibGljQ2FtZXJhSWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyBoaWRsSWQoaWQpOwotICAgICAgICAgICAgcmV0ID0gaW50ZXJmYWNlXzNfNS0+Z2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaGlkbElkLAotICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmlkLCB0aGlzXShTdGF0dXMgcywgZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgaWYgKHMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqYnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4obWV0YWRhdGEuZGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IG1ldGFkYXRhLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJlcyA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoYnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBPSyB8fCByZXMgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfaWQoYnVmZmVyLCBtUHJvdmlkZXJUYWdpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3NbaWRdID0gYnVmZmVyOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIHBoeXNpY2FsIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3MgZm9yICVzOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIGlkLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdldCBwaHlzaWNhbCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBtSWQuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlcyA9IGNhbWVyYTM6Olpvb21SYXRpb01hcHBlcjo6b3ZlcnJpZGVab29tUmF0aW9UYWdzKAotICAgICAgICAgICAgICAgICAgICAmbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzW2lkXSwgJm1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvKTsKLSAgICAgICAgICAgIGlmIChPSyAhPSByZXMpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvdmVycmlkZSB6b29tUmF0aW8gcmVsYXRlZCB0YWdzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7Ci0gICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKLSAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOwotICAgIH0KLX0KLQotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjp+RGV2aWNlSW5mbzMoKSB7fQotCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OnNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIHsKLSAgICByZXR1cm4gc2V0VG9yY2hNb2RlRm9yRGV2aWNlPEludGVyZmFjZVQ+KGVuYWJsZWQpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldENhbWVyYUluZm8oCkBAIC0yNDcyLDIxICsyMzQ3LDYgQEAKICAgICByZXR1cm4gaXNCYWNrd2FyZENvbXBhdGlibGU7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZHVtcFN0YXRlKGludCBmZCkgewotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKLSAgICBoYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZTxJbnRlcmZhY2VUPigpOwotICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIGF1dG8gcmV0ID0gaW50ZXJmYWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwotICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCiAgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKICAgICBpZiAoY2hhcmFjdGVyaXN0aWNzID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CkBAIC0yNTEyLDYzICsyMzcyLDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAotICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykgewotCi0gICAgY29uc3Qgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpJbnRlcmZhY2VUPiBpbnRlcmZhY2UgPQotICAgICAgICAgICAgdGhpcy0+c3RhcnREZXZpY2VJbnRlcmZhY2U8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpJbnRlcmZhY2VUPigpOwotICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIGF1dG8gY2FzdFJlc3VsdF8zXzUgPSBkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U6OmNhc3RGcm9tKGludGVyZmFjZSk7Ci0gICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2VfM181ID0gY2FzdFJlc3VsdF8zXzU7Ci0gICAgYXV0byBjYXN0UmVzdWx0XzNfNyA9IGRldmljZTo6VjNfNzo6SUNhbWVyYURldmljZTo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKLSAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZV8zXzcgPSBjYXN0UmVzdWx0XzNfNzsKLQotICAgIHN0YXR1c190IHJlczsKLSAgICBTdGF0dXMgY2FsbFN0YXR1czsKLSAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIGF1dG8gaGFsQ2IgPQotICAgICAgICAgICAgWyZjYWxsU3RhdHVzLCAmc3RhdHVzXSAoU3RhdHVzIHMsIGJvb2wgY29tYlN0YXR1cykgewotICAgICAgICAgICAgICAgIGNhbGxTdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICpzdGF0dXMgPSBjb21iU3RhdHVzOwotICAgICAgICAgICAgfTsKLSAgICBpZiAoaW50ZXJmYWNlXzNfNyAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldCA9IGludGVyZmFjZV8zXzctPmlzU3RyZWFtQ29tYmluYXRpb25TdXBwb3J0ZWRfM183KGNvbmZpZ3VyYXRpb24sIGhhbENiKTsKLSAgICB9IGVsc2UgaWYgKGludGVyZmFjZV8zXzUgIT0gbnVsbHB0cikgewotICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbl8zXzQ7Ci0gICAgICAgIGJvb2wgc3VjY2VzcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRIQUxTdHJlYW1Db21iaW5hdGlvbkZyb21WMzdUb1YzNCgKLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uXzNfNCwgY29uZmlndXJhdGlvbik7Ci0gICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgKnN0YXR1cyA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHJldCA9IGludGVyZmFjZV8zXzUtPmlzU3RyZWFtQ29tYmluYXRpb25TdXBwb3J0ZWQoY29uZmlndXJhdGlvbl8zXzQsIGhhbENiKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIHN3aXRjaCAoY2FsbFN0YXR1cykgewotICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok9LOgotICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIGNhc2UsIGRvIG5vdGhpbmcuCi0gICAgICAgICAgICAgICAgcmVzID0gT0s7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6Ci0gICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU2Vzc2lvbiBjb25maWd1cmF0aW9uIHF1ZXJ5IGZhaWxlZDogJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxTdGF0dXMpOwotICAgICAgICAgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgYmluZGVyIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpmaWx0ZXJTbWFsbEpwZWdTaXplcygpIHsKICAgICBpbnQzMl90IHRocmVzaG9sZFcgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpQRVJGX0NMQVNTX0pQRUdfVEhSRVNIX1c7CiAgICAgaW50MzJfdCB0aHJlc2hvbGRIID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6UEVSRl9DTEFTU19KUEVHX1RIUkVTSF9IOwpAQCAtMjgyMCw4ICsyNjIzLDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLQotCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6flByb3ZpZGVySW5mbygpIHsKICAgICBpZiAobUluaXRpYWxTdGF0dXNDYWxsYmFja0Z1dHVyZS52YWxpZCgpKSB7CiAgICAgICAgIG1Jbml0aWFsU3RhdHVzQ2FsbGJhY2tGdXR1cmUud2FpdCgpOwpAQCAtMjgzMCwxNjcgKzI2MzEsNiBAQAogICAgIC8vIENhbWVyYVByb3ZpZGVyIGludGVyZmFjZSBkaWVzLCBzbyBkbyBub3QgdW5yZWdpc3RlciBjYWxsYmFja3MuCiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKGNvbnN0IFN0YXR1cyYgcykgIHsKLSAgICBzd2l0Y2gocykgewotICAgICAgICBjYXNlIFN0YXR1czo6T0s6Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgY2FzZSBTdGF0dXM6OkNBTUVSQV9JTl9VU0U6Ci0gICAgICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgICAgICBjYXNlIFN0YXR1czo6TUFYX0NBTUVSQVNfSU5fVVNFOgotICAgICAgICAgICAgcmV0dXJuIC1FVVNFUlM7Ci0gICAgICAgIGNhc2UgU3RhdHVzOjpNRVRIT0RfTk9UX1NVUFBPUlRFRDoKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX1RSQU5TQUNUSU9OOwotICAgICAgICBjYXNlIFN0YXR1czo6T1BFUkFUSU9OX05PVF9TVVBQT1JURUQ6Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgU3RhdHVzOjpDQU1FUkFfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgICAgICBjYXNlIFN0YXR1czo6SU5URVJOQUxfRVJST1I6Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIEFMT0dXKCJVbmV4cGVjdGVkIEhBTCBzdGF0dXMgY29kZSAlZCIsIHMpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotY29uc3QgY2hhciogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhjb25zdCBTdGF0dXMmIHMpIHsKLSAgICBzd2l0Y2gocykgewotICAgICAgICBjYXNlIFN0YXR1czo6T0s6Ci0gICAgICAgICAgICByZXR1cm4gIk9LIjsKLSAgICAgICAgY2FzZSBTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ6Ci0gICAgICAgICAgICByZXR1cm4gIklMTEVHQUxfQVJHVU1FTlQiOwotICAgICAgICBjYXNlIFN0YXR1czo6Q0FNRVJBX0lOX1VTRToKLSAgICAgICAgICAgIHJldHVybiAiQ0FNRVJBX0lOX1VTRSI7Ci0gICAgICAgIGNhc2UgU3RhdHVzOjpNQVhfQ0FNRVJBU19JTl9VU0U6Ci0gICAgICAgICAgICByZXR1cm4gIk1BWF9DQU1FUkFTX0lOX1VTRSI7Ci0gICAgICAgIGNhc2UgU3RhdHVzOjpNRVRIT0RfTk9UX1NVUFBPUlRFRDoKLSAgICAgICAgICAgIHJldHVybiAiTUVUSE9EX05PVF9TVVBQT1JURUQiOwotICAgICAgICBjYXNlIFN0YXR1czo6T1BFUkFUSU9OX05PVF9TVVBQT1JURUQ6Ci0gICAgICAgICAgICByZXR1cm4gIk9QRVJBVElPTl9OT1RfU1VQUE9SVEVEIjsKLSAgICAgICAgY2FzZSBTdGF0dXM6OkNBTUVSQV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICByZXR1cm4gIkNBTUVSQV9ESVNDT05ORUNURUQiOwotICAgICAgICBjYXNlIFN0YXR1czo6SU5URVJOQUxfRVJST1I6Ci0gICAgICAgICAgICByZXR1cm4gIklOVEVSTkFMX0VSUk9SIjsKLSAgICB9Ci0gICAgQUxPR1coIlVuZXhwZWN0ZWQgSEFMIHN0YXR1cyBjb2RlICVkIiwgcyk7Ci0gICAgcmV0dXJuICJVTktOT1dOX0VSUk9SIjsKLX0KLQotY29uc3QgY2hhciogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpkZXZpY2VTdGF0dXNUb1N0cmluZyhjb25zdCBDYW1lcmFEZXZpY2VTdGF0dXMmIHMpIHsKLSAgICBzd2l0Y2gocykgewotICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlQ6Ci0gICAgICAgICAgICByZXR1cm4gIk5PVF9QUkVTRU5UIjsKLSAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQ6Ci0gICAgICAgICAgICByZXR1cm4gIlBSRVNFTlQiOwotICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6RU5VTUVSQVRJTkc6Ci0gICAgICAgICAgICByZXR1cm4gIkVOVU1FUkFUSU5HIjsKLSAgICB9Ci0gICAgQUxPR1coIlVuZXhwZWN0ZWQgSEFMIGRldmljZSBzdGF0dXMgY29kZSAlZCIsIHMpOwotICAgIHJldHVybiAiVU5LTk9XTl9TVEFUVVMiOwotfQotCi1jb25zdCBjaGFyKiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnRvcmNoU3RhdHVzVG9TdHJpbmcoY29uc3QgVG9yY2hNb2RlU3RhdHVzJiBzKSB7Ci0gICAgc3dpdGNoKHMpIHsKLSAgICAgICAgY2FzZSBUb3JjaE1vZGVTdGF0dXM6Ok5PVF9BVkFJTEFCTEU6Ci0gICAgICAgICAgICByZXR1cm4gIk5PVF9BVkFJTEFCTEUiOwotICAgICAgICBjYXNlIFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09GRjoKLSAgICAgICAgICAgIHJldHVybiAiQVZBSUxBQkxFX09GRiI7Ci0gICAgICAgIGNhc2UgVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT046Ci0gICAgICAgICAgICByZXR1cm4gIkFWQUlMQUJMRV9PTiI7Ci0gICAgfQotICAgIEFMT0dXKCJVbmV4cGVjdGVkIEhBTCB0b3JjaCBtb2RlIHN0YXR1cyBjb2RlICVkIiwgcyk7Ci0gICAgcmV0dXJuICJVTktOT1dOX1NUQVRVUyI7Ci19Ci0KLQotc3RhdHVzX3QgSGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSGlkbCgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbj4mIHZ0cywKLSAgICAgICAgLypvdXQqLwotICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgewotCi0gICAgaW50IHRhZ0NvdW50ID0gMDsKLQotICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgdnRzLnNpemUoKTsgcysrKSB7Ci0gICAgICAgIHRhZ0NvdW50ICs9IHZ0c1tzXS50YWdzLnNpemUoKTsKLSAgICB9Ci0KLSAgICBpZiAodGFnQ291bnQgPCAwIHx8IHRhZ0NvdW50ID4gSU5UMzJfTUFYKSB7Ci0gICAgICAgIEFMT0dFKCIlczogdGFnIGNvdW50ICVkIGZyb20gdmVuZG9yIHRhZyBzZWN0aW9ucyBpcyBpbnZhbGlkLiIsIF9fRlVOQ1RJT05fXywgdGFnQ291bnQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIFZlY3Rvcjx1aW50MzJfdD4gdGFnQXJyYXk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRih0YWdBcnJheS5yZXNpemUodGFnQ291bnQpICE9IHRhZ0NvdW50LAotICAgICAgICAgICAgIiVzOiB0b28gbWFueSAoJXUpIHZlbmRvciB0YWdzIGRlZmluZWQuIiwgX19GVU5DVElPTl9fLCB0YWdDb3VudCk7Ci0KLQotICAgIHNwPEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjID0gbmV3IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7Ci0gICAgZGVzYy0+bVRhZ0NvdW50ID0gdGFnQ291bnQ7Ci0KLSAgICBTb3J0ZWRWZWN0b3I8U3RyaW5nOD4gc2VjdGlvbnM7Ci0gICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIFN0cmluZzg+IHRhZ1RvU2VjdGlvbk1hcDsKLQotICAgIGludCBpZHggPSAwOwotICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgdnRzLnNpemUoKTsgcysrKSB7Ci0gICAgICAgIGNvbnN0IGNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbiYgc2VjdGlvbiA9IHZ0c1tzXTsKLSAgICAgICAgY29uc3QgY2hhciAqc2VjdGlvbk5hbWUgPSBzZWN0aW9uLnNlY3Rpb25OYW1lLmNfc3RyKCk7Ci0gICAgICAgIGlmIChzZWN0aW9uTmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHNlY3Rpb24gbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnIHNlY3Rpb24gJXp1LiIsIF9fRlVOQ1RJT05fXywgcyk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyhzZWN0aW9uTmFtZSk7Ci0gICAgICAgIHNlY3Rpb25zLmFkZChzZWN0aW9uU3RyaW5nKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNlY3Rpb24udGFncy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgdWludDMyX3QgdGFnID0gc2VjdGlvbi50YWdzW2pdLnRhZ0lkOwotICAgICAgICAgICAgaWYgKHRhZyA8IENBTUVSQV9NRVRBREFUQV9WRU5ET1JfVEFHX0JPVU5EQVJZKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB2ZW5kb3IgdGFnICVkIG5vdCBpbiB2ZW5kb3IgdGFnIHNlY3Rpb24uIiwgX19GVU5DVElPTl9fLCB0YWcpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRhZ0FycmF5LmVkaXRJdGVtQXQoaWR4KyspID0gc2VjdGlvbi50YWdzW2pdLnRhZ0lkOwotCi0gICAgICAgICAgICBjb25zdCBjaGFyICp0YWdOYW1lID0gc2VjdGlvbi50YWdzW2pdLnRhZ05hbWUuY19zdHIoKTsKLSAgICAgICAgICAgIGlmICh0YWdOYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHRhZyBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXNjLT5tVGFnVG9OYW1lTWFwLmFkZCh0YWcsIFN0cmluZzgodGFnTmFtZSkpOwotICAgICAgICAgICAgdGFnVG9TZWN0aW9uTWFwLmFkZCh0YWcsIHNlY3Rpb25TdHJpbmcpOwotCi0gICAgICAgICAgICBpbnQgdGFnVHlwZSA9IChpbnQpIHNlY3Rpb24udGFnc1tqXS50YWdUeXBlOwotICAgICAgICAgICAgaWYgKHRhZ1R5cGUgPCAwIHx8IHRhZ1R5cGUgPj0gTlVNX1RZUEVTKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB0YWcgdHlwZSAlZCBmcm9tIHZlbmRvciBvcHMgZG9lcyBub3QgZXhpc3QuIiwgX19GVU5DVElPTl9fLCB0YWdUeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzYy0+bVRhZ1RvVHlwZU1hcC5hZGQodGFnLCB0YWdUeXBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRlc2MtPm1TZWN0aW9ucyA9IHNlY3Rpb25zOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YWdBcnJheS5zaXplKCk7ICsraSkgewotICAgICAgICB1aW50MzJfdCB0YWcgPSB0YWdBcnJheVtpXTsKLSAgICAgICAgU3RyaW5nOCBzZWN0aW9uU3RyaW5nID0gdGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyk7Ci0KLSAgICAgICAgLy8gU2V0IHVwIHRhZyB0byBzZWN0aW9uIGluZGV4IG1hcAotICAgICAgICBzc2l6ZV90IGluZGV4ID0gc2VjdGlvbnMuaW5kZXhPZihzZWN0aW9uU3RyaW5nKTsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpbmRleCA8IDAsICJpbmRleCAlemQgbXVzdCBiZSBub24tbmVnYXRpdmUiLCBpbmRleCk7Ci0gICAgICAgIGRlc2MtPm1UYWdUb1NlY3Rpb25NYXAuYWRkKHRhZywgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4KSk7Ci0KLSAgICAgICAgLy8gU2V0IHVwIHJldmVyc2UgbWFwcGluZwotICAgICAgICBzc2l6ZV90IHJldmVyc2VJbmRleCA9IC0xOwotICAgICAgICBpZiAoKHJldmVyc2VJbmRleCA9IGRlc2MtPm1SZXZlcnNlTWFwcGluZy5pbmRleE9mS2V5KHNlY3Rpb25TdHJpbmcpKSA8IDApIHsKLSAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90PiogbmFtZU1hcHBlciA9IG5ldyBLZXllZFZlY3RvcjxTdHJpbmc4LCB1aW50MzJfdD4oKTsKLSAgICAgICAgICAgIHJldmVyc2VJbmRleCA9IGRlc2MtPm1SZXZlcnNlTWFwcGluZy5hZGQoc2VjdGlvblN0cmluZywgbmFtZU1hcHBlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzYy0+bVJldmVyc2VNYXBwaW5nW3JldmVyc2VJbmRleF0tPmFkZChkZXNjLT5tVGFnVG9OYW1lTWFwLnZhbHVlRm9yKHRhZyksIHRhZyk7Ci0gICAgfQotCi0gICAgZGVzY3JpcHRvciA9IHN0ZDo6bW92ZShkZXNjKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KIC8vIEV4cGVjdHMgdG8gaGF2ZSBtSW50ZXJmYWNlTXV0ZXggbG9ja2VkCiBzdGQ6OnZlY3RvcjxzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+PgogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRDb25jdXJyZW50Q2FtZXJhSWRzKCkgY29uc3QgewpAQCAtMzAwNCw1OSArMjY0NCw2IEBACiAgICAgcmV0dXJuIGRldmljZUlkQ29tYmluYXRpb25zOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uQW5kQ2FtZXJhSWRzTG9ja2VkKAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uPiAmY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsCi0gICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywKLSAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24sCi0gICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uPiAqaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLAotICAgICAgICBib29sICplYXJseUV4aXQpIHsKLSAgICBiaW5kZXI6OlN0YXR1cyBiU3RhdHVzID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci0gICAgc3RkOjp2ZWN0b3I8Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4gaGFsQ2FtZXJhSWRzQW5kU3RyZWFtc1Y7Ci0gICAgYm9vbCBzaG91bGRFeGl0ID0gZmFsc2U7Ci0gICAgc3RhdHVzX3QgcmVzID0gT0s7Ci0gICAgZm9yIChhdXRvICZjYW1lcmFJZEFuZFNlc3Npb25Db25maWcgOiBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncykgewotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQgPSBjYW1lcmFJZEFuZFNlc3Npb25Db25maWcubUNhbWVyYUlkOwotICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gc3RyZWFtQ29uZmlndXJhdGlvbjsKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgZGV2aWNlSW5mbzsKLSAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcyA9Ci0gICAgICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6dGFyZ2V0UGVyZkNsYXNzUHJpbWFyeUNhbWVyYSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsIGNhbWVyYUlkLCB0YXJnZXRTZGtWZXJzaW9uKTsKLSAgICAgICAgcmVzID0gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGNhbWVyYUlkLCBvdmVycmlkZUZvclBlcmZDbGFzcywgJmRldmljZUluZm8pOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgICAgIGNhbWVyYTM6Om1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhID0KLSAgICAgICAgICAgICAgICBbdGhpc10oY29uc3QgU3RyaW5nOCAmaWQsIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgcGh5c2ljYWxEZXZpY2VJbmZvOwotICAgICAgICAgICAgICAgICAgICBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoaWQuc3RyaW5nKCksIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeXNpY2FsRGV2aWNlSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwaHlzaWNhbERldmljZUluZm87Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOwotICAgICAgICBpc0xvZ2ljYWxDYW1lcmFMb2NrZWQoY2FtZXJhSWQsICZwaHlzaWNhbENhbWVyYUlkcyk7Ci0gICAgICAgIGJTdGF0dXMgPQotICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZy5tU2Vzc2lvbkNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY2FtZXJhSWQuY19zdHIoKSksIGRldmljZUluZm8sIGdldE1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcywgc3RyZWFtQ29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsICZzaG91bGRFeGl0KTsKLSAgICAgICAgaWYgKCFiU3RhdHVzLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbiBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzaG91bGRFeGl0KSB7Ci0gICAgICAgICAgICAqZWFybHlFeGl0ID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICBDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uIGhhbENhbWVyYUlkQW5kU3RyZWFtOwotICAgICAgICBoYWxDYW1lcmFJZEFuZFN0cmVhbS5jYW1lcmFJZCA9IGNhbWVyYUlkOwotICAgICAgICBoYWxDYW1lcmFJZEFuZFN0cmVhbS5zdHJlYW1Db25maWd1cmF0aW9uID0gc3RyZWFtQ29uZmlndXJhdGlvbjsKLSAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtc1YucHVzaF9iYWNrKGhhbENhbWVyYUlkQW5kU3RyZWFtKTsKLSAgICB9Ci0gICAgKmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucyA9IGhhbENhbWVyYUlkc0FuZFN0cmVhbXNWOwotICAgIHJldHVybiBPSzsKLX0KLQogLy8gQ2hlY2tzIGlmIHRoZSBjb250YWluaW5nIHZlY3RvciBvZiBzZXRzIGhhcyBhbnkgc2V0IHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZQogLy8gY2FtZXJhIGlkcyBpbiBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncy4KIHN0YXRpYyBib29sIGNoZWNrSWZTZXRDb250YWluc0FsbCgKQEAgLTMwOTEsMjcgKzI2NzgsOSBAQAogICAgIGZvciAoYXV0byAmcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CiAgICAgICAgIGlmIChjaGVja0lmU2V0Q29udGFpbnNBbGwoY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsCiAgICAgICAgICAgICAgICAgcHJvdmlkZXItPmdldENvbmN1cnJlbnRDYW1lcmFJZENvbWJpbmF0aW9ucygpKSkgewotICAgICAgICAgICAgLy8gRm9yIGVhY2ggY2FtZXJhIGRldmljZSBpbiBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncyBjb2xsZWN0Ci0gICAgICAgICAgICAvLyB0aGUgc3RyZWFtQ29uZmlncyBhbmQgY3JlYXRlIHRoZSBIQUwKLSAgICAgICAgICAgIC8vIENhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24sIGV4aXQgZWFybHkgaWYgbmVlZGVkCi0gICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4gaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zOwotICAgICAgICAgICAgYm9vbCBrbm93VW5zdXBwb3J0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uQW5kQ2FtZXJhSWRzTG9ja2VkKAotICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiwgJmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywgJmtub3dVbnN1cHBvcnRlZCk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzIHVuYWJsZSB0byBjb252ZXJ0IHNlc3Npb24gY29uZmlndXJhdGlvbnMgcHJvdmlkZWQgdG8gSEFMIHN0cmVhbSIKLSAgICAgICAgICAgICAgICAgICAgICAiY29tYmluYXRpb25zIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGtub3dVbnN1cHBvcnRlZCkgewotICAgICAgICAgICAgICAgIC8vIFdlIGdvdCB0byBrbm93IHRoZSBzdHJlYW1zIGFyZW4ndCB2YWxpZCBiZWZvcmUgZG9pbmcgdGhlIEhBTAotICAgICAgICAgICAgICAgIC8vIGNhbGwgaXRzZWxmLgotICAgICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBwcm92aWRlci0+aXNDb25jdXJyZW50U2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCi0gICAgICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywgaXNTdXBwb3J0ZWQpOworICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywgdGFyZ2V0U2RrVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgaXNTdXBwb3J0ZWQpOwogICAgICAgICB9CiAgICAgfQogICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOwpAQCAtMzEyMSw3ICsyNjkwLDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBDYW1lcmFNZXRhZGF0YSogY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7Ci0gICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQsIC8qbWluVmVyc2lvbiovIHszLDB9LCAvKm1heFZlcnNpb24qLyB7NSwwfSk7CisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOwogICAgIGlmIChkZXZpY2VJbmZvICE9IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIGRldmljZUluZm8tPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhvdmVycmlkZUZvclBlcmZDbGFzcywgY2hhcmFjdGVyaXN0aWNzKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKaW5kZXggMWJkYmI0NC4uYTY2NTk4ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaApAQCAtMjksNyArMjksMTIgQEAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVyczIuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9JUENUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9wcm92aWRlci9JQ2FtZXJhUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9jb21tb24vMS4wL3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvcHJvdmlkZXIvMi41L0lDYW1lcmFQcm92aWRlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyLzIuNi9JQ2FtZXJhUHJvdmlkZXJDYWxsYmFjay5oPgpAQCAtMzcsMjcgKzQyLDI4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvcHJvdmlkZXIvMi43L0lDYW1lcmFQcm92aWRlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjcvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjAvSVNlcnZpY2VOb3RpZmljYXRpb24uaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vKioKLSAqIFRoZSB2ZW5kb3IgdGFnIGRlc2NyaXB0b3IgY2xhc3MgdGhhdCB0YWtlcyBISURMIHZlbmRvciB0YWcgaW5mb3JtYXRpb24gYXMKLSAqIGlucHV0LiBOb3QgcGFydCBvZiBWZW5kb3JUYWdEZXNjcmlwdG9yIGNsYXNzIGJlY2F1c2UgdGhhdCBjbGFzcyBpcyB1c2VkCi0gKiBpbiBBSURMIGdlbmVyYXRlZCBzb3VyY2VzIHdoaWNoIGRvbid0IGhhdmUgYWNjZXNzIHRvIEhJREwgaGVhZGVycy4KLSAqLwotY2xhc3MgSGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3IgOiBwdWJsaWMgVmVuZG9yVGFnRGVzY3JpcHRvciB7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgVmVuZG9yVGFnRGVzY3JpcHRvciBvYmplY3QgZnJvbSB0aGUgSElETCBWZW5kb3JUYWdTZWN0aW9uCi0gICAgICogdmVjdG9yLgotICAgICAqCi0gICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCi0gICAgICovCi0gICAgc3RhdGljIHN0YXR1c190IGNyZWF0ZURlc2NyaXB0b3JGcm9tSGlkbCgKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+JiB2dHMsCi0gICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcik7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OkNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb247CisKK2VudW0gY2xhc3MgQ2FtZXJhRGV2aWNlU3RhdHVzIDogdWludDMyX3QgeworICBOT1RfUFJFU0VOVCA9IDAsCisgIFBSRVNFTlQgPSAxLAorICBFTlVNRVJBVElORyA9IDIKK307CisKK2VudW0gY2xhc3MgVG9yY2hNb2RlU3RhdHVzIDogdWludDMyX3QgeworICBOT1RfQVZBSUxBQkxFID0gMCwKKyAgQVZBSUxBQkxFX09GRiA9IDEsCisgIEFWQUlMQUJMRV9PTiA9IDIKK307CisKK3N0cnVjdCBDYW1lcmFSZXNvdXJjZUNvc3QgeworICB1aW50MzJfdCByZXNvdXJjZUNvc3Q7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25mbGljdGluZ0RldmljZXM7CiB9OwogCiBlbnVtIFN5c3RlbUNhbWVyYUtpbmQgewpAQCAtOTEsNiArOTcsMjYgQEAKICNkZWZpbmUgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzcgSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDMsIDcpCiAKIC8qKgorICogVGhlIHZlbmRvciB0YWcgZGVzY3JpcHRvciBjbGFzcyB0aGF0IHRha2VzIEhJREwvQUlETCB2ZW5kb3IgdGFnIGluZm9ybWF0aW9uIGFzCisgKiBpbnB1dC4gTm90IHBhcnQgb2YgVmVuZG9yVGFnRGVzY3JpcHRvciBjbGFzcyBiZWNhdXNlIHRoYXQgY2xhc3MgaXMgdXNlZAorICogaW4gQUlETCBnZW5lcmF0ZWQgc291cmNlcyB3aGljaCBkb24ndCBoYXZlIGFjY2VzcyB0byBBSURMIC8gSElETCBoZWFkZXJzLgorICovCitjbGFzcyBJZGxWZW5kb3JUYWdEZXNjcmlwdG9yIDogcHVibGljIFZlbmRvclRhZ0Rlc2NyaXB0b3IgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIFZlbmRvclRhZ0Rlc2NyaXB0b3Igb2JqZWN0IGZyb20gdGhlIEhJREwvQUlETCBWZW5kb3JUYWdTZWN0aW9uCisgICAgICogdmVjdG9yLgorICAgICAqCisgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICovCisgICAgdGVtcGxhdGUgPGNsYXNzIFZlbmRvclRhZ1NlY3Rpb25WZWN0b3JUeXBlLCBjbGFzcyBWZW5kb3JUYWdTZWN0aW9uVHlwZT4KKyAgICBzdGF0aWMgc3RhdHVzX3QgY3JlYXRlRGVzY3JpcHRvckZyb21JZGwoCisgICAgICAgICAgICBjb25zdCBWZW5kb3JUYWdTZWN0aW9uVmVjdG9yVHlwZSYgdnRzLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2NyaXB0b3IpOworfTsKKworLyoqCiAgKiBBIG1hbmFnZXIgZm9yIGFsbCBjYW1lcmEgcHJvdmlkZXJzIGF2YWlsYWJsZSBvbiBhbiBBbmRyb2lkIGRldmljZS4KICAqCiAgKiBSZXNwb25zaWJsZSBmb3IgZW51bWVyYXRpbmcgcHJvdmlkZXJzIGFuZCB0aGUgaW5kaXZpZHVhbCBjYW1lcmEgZGV2aWNlcwpAQCAtMTAwLDE0ICsxMjYsMTggQEAKICAqIG9wZW5pbmcgdGhlbSBmb3IgYWN0aXZlIHVzZS4KICAqCiAgKi8KLWNsYXNzIENhbWVyYVByb3ZpZGVyTWFuYWdlciA6IHZpcnR1YWwgcHVibGljIGhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTm90aWZpY2F0aW9uIHsKK2NsYXNzIENhbWVyYVByb3ZpZGVyTWFuYWdlciA6IHZpcnR1YWwgcHVibGljIGhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTm90aWZpY2F0aW9uLAorICAgICAgICBwdWJsaWMgdmlydHVhbCBJU2VydmljZU1hbmFnZXI6OkxvY2FsUmVnaXN0cmF0aW9uQ2FsbGJhY2sgewogcHVibGljOgotCisgICAgLy8gbmVlZHMgdG8gYmUgbWFkZSBmcmllbmQgc3RyaWN0IHNpbmNlIEhpZGxQcm92aWRlckluZm8gbmVlZHMgdG8gaW5oZXJpdAorICAgIC8vIGZyb20gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm8gd2hpY2ggaXNuJ3QgYSBwdWJsaWMgbWVtYmVyLgorICAgIGZyaWVuZCBzdHJ1Y3QgSGlkbFByb3ZpZGVySW5mbzsKKyAgICBmcmllbmQgc3RydWN0IEFpZGxQcm92aWRlckluZm87CiAgICAgfkNhbWVyYVByb3ZpZGVyTWFuYWdlcigpOwogCiAgICAgLy8gVGlueSBwcm94eSBmb3IgdGhlIHN0YXRpYyBtZXRob2RzIGluIGEgSElETCBpbnRlcmZhY2UgdGhhdCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBoYXJkd2FyZQogICAgIC8vIHNlcnZpY2UgbWFuYWdlciwgdG8gYmUgcmVwbGFjYWJsZSBpbiB1bml0IHRlc3RzIHdpdGggYSBmYWtlLgotICAgIHN0cnVjdCBTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSB7CisgICAgc3RydWN0IEhpZGxTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSB7CiAgICAgICAgIHZpcnR1YWwgYm9vbCByZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNlcnZpY2VOYW1lLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPGhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTm90aWZpY2F0aW9uPgpAQCAtMTE5LDEyICsxNDksMTIgQEAKICAgICAgICAgdmlydHVhbCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBnZXRTZXJ2aWNlKAogICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzZXJ2aWNlTmFtZSkgPSAwOwogICAgICAgICB2aXJ0dWFsIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+IGxpc3RTZXJ2aWNlcygpID0gMDsKLSAgICAgICAgdmlydHVhbCB+U2VydmljZUludGVyYWN0aW9uUHJveHkoKSB7fQorICAgICAgICB2aXJ0dWFsIH5IaWRsU2VydmljZUludGVyYWN0aW9uUHJveHkoKSB7fQogICAgIH07CiAKICAgICAvLyBTdGFuZGFyZCB1c2UgY2FzZSAtIGNhbGwgaW50byB0aGUgbm9ybWFsIGdlbmVyYXRlZCBzdGF0aWMgbWV0aG9kcyB3aGljaCBpbnZva2UKICAgICAvLyB0aGUgcmVhbCBoYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIKLSAgICBzdHJ1Y3QgSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSA6IHB1YmxpYyBTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSB7CisgICAgc3RydWN0IEhpZGxTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eUltcGwgOiBwdWJsaWMgSGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5IHsKICAgICAgICAgdmlydHVhbCBib29sIHJlZ2lzdGVyRm9yTm90aWZpY2F0aW9ucygKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc2VydmljZU5hbWUsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8aGlkbDo6bWFuYWdlcjo6VjFfMDo6SVNlcnZpY2VOb3RpZmljYXRpb24+CkBAIC0xNTEsMTIgKzE4MSwxNSBAQAogICAgICAgICB+U3RhdHVzTGlzdGVuZXIoKSB7fQogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkRldmljZVN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSA9IDA7CisgICAgICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgPSAwOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EZXZpY2VTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJnBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSA9IDA7CisgICAgICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgPSAwOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25Ub3JjaFN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKSA9IDA7CisgICAgICAgICAgICAgICAgVG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cywKKyAgICAgICAgICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIGtpbmQpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLAorICAgICAgICAgICAgICAgIFRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMpID0gMDsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uTmV3UHJvdmlkZXJSZWdpc3RlcmVkKCkgPSAwOwogICAgIH07CiAKQEAgLTE3Niw3ICsyMDksMTAgQEAKICAgICAgKiB1c2VkIGZvciB0ZXN0aW5nLiBUaGUgbGlmZXRpbWUgb2YgdGhlIHByb3h5IG11c3QgZXhjZWVkIHRoZSBsaWZldGltZSBvZiB0aGUgbWFuYWdlci4KICAgICAgKi8KICAgICBzdGF0dXNfdCBpbml0aWFsaXplKHdwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lciwKLSAgICAgICAgICAgIFNlcnZpY2VJbnRlcmFjdGlvblByb3h5ICpwcm94eSA9ICZzSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSk7CisgICAgICAgICAgICBIaWRsU2VydmljZUludGVyYWN0aW9uUHJveHkgKmhpZGxQcm94eSA9ICZzSGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5KTsKKworICAgIHN0YXR1c190IGdldENhbWVyYUlkSVBDVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKKyAgICAgICAgICAgIElQQ1RyYW5zcG9ydCAqcHJvdmlkZXJUcmFuc3BvcnQpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIHRvdGFsIG51bWJlciBvZiBhdmFpbGFibGUgY2FtZXJhcy4KQEAgLTE5NSwxMSArMjMxLDYgQEAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0QVBJMUNvbXBhdGlibGVDYW1lcmFEZXZpY2VJZHMoKSBjb25zdDsKIAogICAgIC8qKgotICAgICAqIFJldHVybiB0cnVlIGlmIGEgZGV2aWNlIHdpdGggYSBnaXZlbiBJRCBhbmQgbWFqb3IgdmVyc2lvbiBleGlzdHMKLSAgICAgKi8KLSAgICBib29sIGlzVmFsaWREZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtYWpvclZlcnNpb24pIGNvbnN0OwotCi0gICAgLyoqCiAgICAgICogUmV0dXJuIHRydWUgaWYgYSBkZXZpY2Ugd2l0aCBhIGdpdmVuIElEIGhhcyBhIGZsYXNoIHVuaXQuIFJldHVybnMgZmFsc2UKICAgICAgKiBmb3IgZGV2aWNlcyB0aGF0IGFyZSB1bmtub3duLgogICAgICAqLwpAQCAtMjE0LDcgKzI0NSw3IEBACiAgICAgICogUmV0dXJuIHRoZSByZXNvdXJjZSBjb3N0IG9mIHRoaXMgY2FtZXJhIGRldmljZQogICAgICAqLwogICAgIHN0YXR1c190IGdldFJlc291cmNlQ29zdChjb25zdCBzdGQ6OnN0cmluZyAmaWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCogY29zdCkgY29uc3Q7CisgICAgICAgICAgICBDYW1lcmFSZXNvdXJjZUNvc3QqIGNvc3QpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBvbGQgY2FtZXJhIEFQSSBjYW1lcmEgaW5mbwpAQCAtMjQwLDE0ICsyNzEsMTUgQEAKICAgICAgKiBDaGVjayBmb3IgZGV2aWNlIHN1cHBvcnQgb2Ygc3BlY2lmaWMgc3RyZWFtIGNvbWJpbmF0aW9uLgogICAgICAqLwogICAgIHN0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBjYW1lcmEzOjptZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSwKICAgICAgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgZGV2aWNlIGludGVyZmFjZSB2ZXJzaW9uIGZvciB0aGlzIElECiAgICAgICovCiAgICAgc3RhdHVzX3QgZ2V0SGlnaGVzdFN1cHBvcnRlZFZlcnNpb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAotICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiAqdik7CisgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uICp2LCBJUENUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CiAKICAgICAvKioKICAgICAgKiBDaGVjayBpZiBhIGdpdmVuIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydCBzZXRUb3JjaE1vZGUgQVBJLgpAQCAtMjU1LDYgKzI4NywxNyBAQAogICAgIGJvb2wgc3VwcG9ydFNldFRvcmNoTW9kZShjb25zdCBzdGQ6OnN0cmluZyAmaWQpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdG9yY2ggc3RyZW5ndGggdXBkYXRlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdC4KKyAgICAgKi8KKyAgICBib29sIHNob3VsZFNraXBUb3JjaFN0cmVuZ3RoVXBkYXRlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgaW50MzJfdCB0b3JjaFN0cmVuZ3RoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCB0b3JjaCBzdHJlbmd0aCBsZXZlbCBpZiB0aGUgdG9yY2ggc3RyZW5ndGggY29udHJvbAorICAgICAqIGZlYXR1cmUgaXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIGludDMyX3QgZ2V0VG9yY2hEZWZhdWx0U3RyZW5ndGhMZXZlbChjb25zdCBzdGQ6OnN0cmluZyAmaWQpIGNvbnN0OworCisgICAgLyoqCiAgICAgICogVHVybiBvbiBvciBvZmYgdGhlIGZsYXNobGlnaHQgb24gYSBnaXZlbiBjYW1lcmEgZGV2aWNlLgogICAgICAqIE1heSBmYWlsIGlmIHRoZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIEFQSSwgaXMgaW4gYWN0aXZlIHVzZSwgb3IgaWYgdGhlIGRldmljZQogICAgICAqIGRvZXNuJ3QgZXhpc3QsIGV0Yy4KQEAgLTI2Miw2ICszMDUsMjQgQEAKICAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCBib29sIGVuYWJsZWQpOwogCiAgICAgLyoqCisgICAgICogQ2hhbmdlIHRoZSBicmlnaHRuZXNzIGxldmVsIG9mIHRoZSBmbGFzaCB1bml0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FtZXJhSWQgYW5kCisgICAgICogc2V0IGl0IHRvIHRoZSB2YWx1ZSBpbiB0b3JjaFN0cmVuZ3RoLgorICAgICAqIElmIHRoZSB0b3JjaCBpcyBPRkYgYW5kIHRvcmNoU3RyZW5ndGggPiAwLCB0aGUgdG9yY2ggd2lsbCBiZSB0dXJuZWQgT04gd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgc3RyZW5ndGggbGV2ZWwuIElmIHRoZSB0b3JjaCBpcyBPTiwgb25seSB0aGUgYnJpZ2h0bmVzcyBsZXZlbCB3aWxsIGJlCisgICAgICogY2hhbmdlZC4KKyAgICAgKgorICAgICAqIFRoaXMgb3BlcmF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgZmxhc2ggdW5pdCwgaGFzIGZsYXNoIHVuaXQKKyAgICAgKiBidXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIEFQSSwgdG9yY2hTdHJlbmd0aCBpcyBpbnZhbGlkIG9yIGlmIHRoZSBkZXZpY2UgZG9lc24ndAorICAgICAqIGV4aXN0IGV0Yy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCB0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgaW50MzJfdCB0b3JjaFN0cmVuZ3RoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdG9yY2ggc3RyZW5ndGggbGV2ZWwgb2YgdGhpcyBjYW1lcmEgZGV2aWNlLgorICAgICAqLworICAgIHN0YXR1c190IGdldFRvcmNoU3RyZW5ndGhMZXZlbChjb25zdCBzdGQ6OnN0cmluZyAmaWQsIGludDMyX3QqIHRvcmNoU3RyZW5ndGgpOworCisgICAgLyoqCiAgICAgICogU2V0dXAgdmVuZG9yIHRhZ3MgZm9yIGFsbCByZWdpc3RlcmVkIHByb3ZpZGVycwogICAgICAqLwogICAgIHN0YXR1c190IHNldFVwVmVuZG9yVGFncygpOwpAQCAtMjY5LDggKzMzMCwxOSBAQAogICAgIC8qKgogICAgICAqIEluZm9ybSByZWdpc3RlcmVkIHByb3ZpZGVycyBhYm91dCBhIGRldmljZSBzdGF0ZSBjaGFuZ2UsIHN1Y2ggYXMgZm9sZGluZyBvciB1bmZvbGRpbmcKICAgICAgKi8KLSAgICBzdGF0dXNfdCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKLSAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBuZXdTdGF0ZSk7CisgICAgc3RhdHVzX3Qgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoaW50NjRfdCBuZXdTdGF0ZSk7CisKKyAgICBzdGF0dXNfdCBvcGVuQWlkbFNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8CisgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgLypvdXQqLworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gKnNlc3Npb24pOworCisgICAgc3RhdHVzX3Qgb3BlbkFpZGxJbmplY3Rpb25TZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYUluamVjdGlvblNlc3Npb24+ICpzZXNzaW9uKTsKIAogICAgIC8qKgogICAgICAqIE9wZW4gYW4gYWN0aXZlIHNlc3Npb24gdG8gYSBjYW1lcmEgZGV2aWNlLgpAQCAtMjc4LDE4ICszNTAsMTIgQEAKICAgICAgKiBUaGlzIGZ1bGx5IHBvd2VycyBvbiB0aGUgY2FtZXJhIGRldmljZSBoYXJkd2FyZSwgYW5kIHJldHVybnMgYSBoYW5kbGUgdG8gYQogICAgICAqIHNlc3Npb24gdG8gYmUgdXNlZCBmb3IgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBhbmQgb3BlcmF0aW9uLgogICAgICAqLwotICAgIHN0YXR1c190IG9wZW5TZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKKyAgICBzdGF0dXNfdCBvcGVuSGlkbFNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICpzZXNzaW9uKTsKIAogICAgIC8qKgotICAgICAqIFNhdmUgdGhlIElDYW1lcmFQcm92aWRlciB3aGlsZSBpdCBpcyBiZWluZyB1c2VkIGJ5IGEgY2FtZXJhIG9yIHRvcmNoIGNsaWVudAotICAgICAqLwotICAgIHZvaWQgc2F2ZVJlZihEZXZpY2VNb2RlIHVzYWdlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkLAotICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIpOwotCi0gICAgLyoqCiAgICAgICogTm90aWZ5IHRoYXQgdGhlIGNhbWVyYSBvciB0b3JjaCBpcyBubyBsb25nZXIgYmVpbmcgdXNlZCBieSBhIGNhbWVyYSBjbGllbnQKICAgICAgKi8KICAgICB2b2lkIHJlbW92ZVJlZihEZXZpY2VNb2RlIHVzYWdlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkKTsKQEAgLTMwMiw2ICszNjgsOSBAQAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBuYW1lLAogICAgICAgICAgICAgYm9vbCBwcmVleGlzdGluZykgb3ZlcnJpZGU7CiAKKyAgICAvLyBMb2NhbFJlZ2lzdHJhdGlvbkNhbGxiYWNrOjpvblNlcnZpY2VSZWdpc3RyYXRpb24KKyAgICB2aXJ0dWFsIHZvaWQgb25TZXJ2aWNlUmVnaXN0cmF0aW9uKGNvbnN0IFN0cmluZzE2JiBuYW1lLCBjb25zdCBzcDxJQmluZGVyPiAmYmluZGVyKSBvdmVycmlkZTsKKwogICAgIC8qKgogICAgICAqIER1bXAgb3V0IGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBwcm92aWRlcnMgYW5kIGRldmljZXMKICAgICAgKi8KQEAgLTMxNiw5ICszODUsNyBAQAogICAgIC8qCiAgICAgICogUmV0dXJuIHByb3ZpZGVyIHR5cGUgZm9yIGEgc3BlY2lmaWMgZGV2aWNlLgogICAgICAqLwotICAgIG1ldGFkYXRhX3ZlbmRvcl9pZF90IGdldFByb3ZpZGVyVGFnSWRMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAotICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtaW5WZXJzaW9uID0gaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnswLDB9LAotICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uID0gaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnsxMDAwLDB9KSBjb25zdDsKKyAgICBtZXRhZGF0YV92ZW5kb3JfaWRfdCBnZXRQcm92aWRlclRhZ0lkTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgY29uc3Q7CiAKICAgICAvKgogICAgICAqIENoZWNrIGlmIGEgY2FtZXJhIGlzIGEgbG9naWNhbCBjYW1lcmEuIEFuZCBpZiB5ZXMsIHJldHVybgpAQCAtMzMxLDE0NiArMzk4LDE2OCBAQAogCiAgICAgc3RhdHVzX3QgZmlsdGVyU21hbGxKcGVnU2l6ZXMoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKTsKIAorICAgIHN0YXR1c190IG5vdGlmeVVzYkRldmljZUV2ZW50KGludDMyX3QgZXZlbnRJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnVzYkRldmljZUlkKTsKKwogICAgIHN0YXRpYyBjb25zdCBmbG9hdCBrRGVwdGhBUlRvbGVyYW5jZTsKIHByaXZhdGU6CiAgICAgLy8gQWxsIHByaXZhdGUgbWVtYmVycywgdW5sZXNzIG90aGVyd2lzZSBub3RlZCwgZXhwZWN0IG1JbnRlcmZhY2VNdXRleCB0byBiZSBsb2NrZWQgYmVmb3JlIHVzZQogICAgIG11dGFibGUgc3RkOjptdXRleCBtSW50ZXJmYWNlTXV0ZXg7CiAKLSAgICAvLyB0aGUgc3RhdHVzIGxpc3RlbmVyIHVwZGF0ZSBjYWxsYmFja3Mgd2lsbCBsb2NrIG1TdGF0dXNNdXRleAotICAgIG11dGFibGUgc3RkOjptdXRleCBtU3RhdHVzTGlzdGVuZXJNdXRleDsKICAgICB3cDxTdGF0dXNMaXN0ZW5lcj4gbUxpc3RlbmVyOwotICAgIFNlcnZpY2VJbnRlcmFjdGlvblByb3h5KiBtU2VydmljZVByb3h5OworICAgIEhpZGxTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSogbUhpZGxTZXJ2aWNlUHJveHk7CiAKICAgICAvLyBDdXJyZW50IG92ZXJhbGwgQW5kcm9pZCBkZXZpY2UgcGh5c2ljYWwgc3RhdHVzCi0gICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBtRGV2aWNlU3RhdGU7CisgICAgaW50NjRfdCBtRGV2aWNlU3RhdGU7CiAKICAgICAvLyBtUHJvdmlkZXJMaWZlY3ljbGVMb2NrIGlzIGxvY2tlZCBkdXJpbmcgb25SZWdpc3RyYXRpb24gYW5kIHJlbW92ZVByb3ZpZGVyCiAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Qcm92aWRlckxpZmVjeWNsZUxvY2s7CiAKLSAgICBzdGF0aWMgSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSBzSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eTsKKyAgICBzdGF0aWMgSGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5SW1wbCBzSGlkbFNlcnZpY2VJbnRlcmFjdGlvblByb3h5OworCisgICAgc3RydWN0IEhhbENhbWVyYVByb3ZpZGVyIHsKKyAgICAgIC8vIEVtcHR5IHBhcmVudCBzdHJ1Y3QgZm9yIHN0b3JpbmcgZWl0aGVyIGFpZGwgLyBoaWRsIGNhbWVyYSBwcm92aWRlciByZWZlcmVuY2UKKyAgICAgIEhhbENhbWVyYVByb3ZpZGVyKGNvbnN0IGNoYXIgKmRlc2NyaXB0b3IpIDogbURlc2NyaXB0b3IoZGVzY3JpcHRvcikgeyB9OworICAgICAgdmlydHVhbCB+SGFsQ2FtZXJhUHJvdmlkZXIoKSB7fTsKKyAgICAgIHN0ZDo6c3RyaW5nIG1EZXNjcmlwdG9yOworICAgIH07CisKKyAgICBzdHJ1Y3QgSGlkbEhhbENhbWVyYVByb3ZpZGVyIDogcHVibGljIEhhbENhbWVyYVByb3ZpZGVyIHsKKyAgICAgICAgSGlkbEhhbENhbWVyYVByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+ICZwcm92aWRlciwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXNjcmlwdG9yKSA6CisgICAgICAgICAgICAgICAgSGFsQ2FtZXJhUHJvdmlkZXIoZGVzY3JpcHRvciksIG1DYW1lcmFQcm92aWRlcihwcm92aWRlcikgeyB9OworICAgICBwcml2YXRlOgorICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBtQ2FtZXJhUHJvdmlkZXI7CisgICAgfTsKKworICAgIHN0cnVjdCBBaWRsSGFsQ2FtZXJhUHJvdmlkZXIgOiBwdWJsaWMgSGFsQ2FtZXJhUHJvdmlkZXIgeworICAgICAgICBBaWRsSGFsQ2FtZXJhUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OklDYW1lcmFQcm92aWRlcj4gJnByb3ZpZGVyLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0b3IpIDoKKyAgICAgICAgICAgICAgICBIYWxDYW1lcmFQcm92aWRlcihkZXNjcmlwdG9yKSwgbUNhbWVyYVByb3ZpZGVyKHByb3ZpZGVyKSB7IH07CisgICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6SUNhbWVyYVByb3ZpZGVyPiBtQ2FtZXJhUHJvdmlkZXI7CisgICAgfTsKKwogCiAgICAgLy8gTWFwcGluZyBmcm9tIENhbWVyYURldmljZSBJRHMgdG8gQ2FtZXJhUHJvdmlkZXJzLiBUaGlzIG1hcCBpcyB1c2VkIHRvIGtlZXAgdGhlCiAgICAgLy8gSUNhbWVyYVByb3ZpZGVyIGFsaXZlIHdoaWxlIGl0IGlzIGluIHVzZSBieSB0aGUgY2FtZXJhIHdpdGggdGhlIGdpdmVuIElEIGZvciBjYW1lcmEKICAgICAvLyBjYXBhYmlsaXRpZXMKLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PgorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEhhbENhbWVyYVByb3ZpZGVyPj4KICAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlckJ5Q2FtZXJhSWQ7CiAKICAgICAvLyBNYXBwaW5nIGZyb20gQ2FtZXJhRGV2aWNlIElEcyB0byBDYW1lcmFQcm92aWRlcnMuIFRoaXMgbWFwIGlzIHVzZWQgdG8ga2VlcCB0aGUKICAgICAvLyBJQ2FtZXJhUHJvdmlkZXIgYWxpdmUgd2hpbGUgaXQgaXMgaW4gdXNlIGJ5IHRoZSBjYW1lcmEgd2l0aCB0aGUgZ2l2ZW4gSUQgZm9yIHRvcmNoCiAgICAgLy8gY2FwYWJpbGl0aWVzCi0gICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxIYWxDYW1lcmFQcm92aWRlcj4+CiAgICAgICAgICAgICBtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CiAKICAgICAvLyBMb2NrIGZvciBhY2Nlc3NpbmcgbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZCBhbmQgbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkCiAgICAgc3RkOjptdXRleCBtUHJvdmlkZXJJbnRlcmZhY2VNYXBMb2NrOwotCi0gICAgc3RydWN0IFByb3ZpZGVySW5mbyA6Ci0gICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2ssCi0gICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQKLSAgICB7CisgICAgc3RydWN0IFByb3ZpZGVySW5mbyA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworICAgICAgICBmcmllbmQgc3RydWN0IEhpZGxQcm92aWRlckluZm87CisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQWlkbFByb3ZpZGVySW5mbzsKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbVByb3ZpZGVyTmFtZTsKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbVByb3ZpZGVySW5zdGFuY2U7CiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IG1Qcm92aWRlclRhZ2lkOwotICAgICAgICBpbnQgbU1pbm9yVmVyc2lvbjsKKyAgICAgICAgaW50MzJfdCBtTWlub3JWZXJzaW9uOwogICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBtVmVuZG9yVGFnRGVzY3JpcHRvcjsKICAgICAgICAgYm9vbCBtU2V0VG9yY2hNb2RlU3VwcG9ydGVkOwogICAgICAgICBib29sIG1Jc1JlbW90ZTsKIAotICAgICAgICAvLyBDdXJyZW50IG92ZXJhbGwgQW5kcm9pZCBkZXZpY2UgcGh5c2ljYWwgc3RhdHVzCi0gICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbURldmljZVN0YXRlOwotCi0gICAgICAgIC8vIFRoaXMgcG9pbnRlciBpcyB1c2VkIHRvIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIElDYW1lcmFQcm92aWRlciB0aGF0IHdhcyBsYXN0IGFjY2Vzc2VkLgotICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBtQWN0aXZlSW50ZXJmYWNlOwotCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IG1TYXZlZEludGVyZmFjZTsKLQogICAgICAgICBQcm92aWRlckluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVyTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyICptYW5hZ2VyKTsKICAgICAgICAgflByb3ZpZGVySW5mbygpOwogCi0gICAgICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXZpY2VTdGF0ZSk7Ci0KLSAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgICAgICB2aXJ0dWFsIElQQ1RyYW5zcG9ydCBnZXRJUENUcmFuc3BvcnQoKSA9IDA7CiAKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFR5cGUoKSBjb25zdDsKIAotICAgICAgICBzdGF0dXNfdCBhZGREZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgaW5pdGlhbFN0YXR1cyA9Ci0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQsCi0gICAgICAgICAgICAgICAgLypvdXQqLyBzdGQ6OnN0cmluZyAqcGFyc2VkSWQgPSBudWxscHRyKTsKLQogICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKLSAgICAgICAgLy8gSUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2tzIGludGVyZmFjZSAtIHRoZXNlIGxvY2sgdGhlIHBhcmVudCBtSW50ZXJmYWNlTXV0ZXgKLSAgICAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoCi0gICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgb3ZlcnJpZGU7Ci0gICAgICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gdG9yY2hNb2RlU3RhdHVzQ2hhbmdlKAotICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMpIG92ZXJyaWRlOwotICAgICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKAotICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpIG92ZXJyaWRlOwotCi0gICAgICAgIHN0YXR1c190IGNhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgKLSAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogaWQsIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpOwotICAgICAgICBzdGF0dXNfdCBwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgKLSAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogaWQsIHN0ZDo6c3RyaW5nKiBwaHlzaWNhbElkLAotICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpOwotCi0gICAgICAgIC8vIGhpZGxfZGVhdGhfcmVjaXBpZW50IGludGVyZmFjZSAtIHRoaXMgbG9ja3MgdGhlIHBhcmVudCBtSW50ZXJmYWNlTXV0ZXgKLSAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKHVpbnQ2NF90IGNvb2tpZSwgY29uc3Qgd3A8aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiB3aG8pIG92ZXJyaWRlOwotCisgICAgICAgIHZvaWQgaW5pdGlhbGl6ZVByb3ZpZGVySW5mb0NvbW1vbihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmRldmljZXMpOwogICAgICAgICAvKioKICAgICAgICAgICogU2V0dXAgdmVuZG9yIHRhZ3MgZm9yIHRoaXMgcHJvdmlkZXIKICAgICAgICAgICovCi0gICAgICAgIHN0YXR1c190IHNldFVwVmVuZG9yVGFncygpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVwVmVuZG9yVGFncygpID0gMDsKIAogICAgICAgICAvKioKICAgICAgICAgICogTm90aWZ5IHByb3ZpZGVyIGFib3V0IHRvcC1sZXZlbCBkZXZpY2UgcGh5c2ljYWwgc3RhdGUgY2hhbmdlcworICAgICAgICAgKgorICAgICAgICAgKiBOb3RlIHRoYXQgJ21JbnRlcmZhY2VNdXRleCcgc2hvdWxkIG5vdCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgICAgICogSXQgaXMgcG9zc2libGUgZm9yIGNhbWVyYSBwcm92aWRlcnMgdG8gYWRkL3JlbW92ZSBkZXZpY2VzIGFuZCB0cnkgdG8KKyAgICAgICAgICogYWNxdWlyZSBpdC4KICAgICAgICAgICovCi0gICAgICAgIHN0YXR1c190IG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4KLSAgICAgICAgICAgICAgICAgICAgbmV3RGV2aWNlU3RhdGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGludDY0X3QgbmV3RGV2aWNlU3RhdGUpID0gMDsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgc3VjY2Vzc2Z1bGx5U3RhcnRlZFByb3ZpZGVySW50ZXJmYWNlKCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgaW50NjRfdCBnZXREZXZpY2VTdGF0ZSgpID0gMDsKIAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+PiBnZXRDb25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbnMoKTsKIAogICAgICAgICAvKioKKyAgICAgICAgICogTm90aWZ5ICdEZXZpY2VJbmZvJyBpbnN0YW5jZWQgYWJvdXQgdG9wLWxldmVsIGRldmljZSBwaHlzaWNhbCBzdGF0ZSBjaGFuZ2VzCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGUgdGhhdCAnbUludGVyZmFjZU11dGV4JyBzaG91bGQgYmUgaGVsZCB3aGVuIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG5vdGlmeURldmljZUluZm9TdGF0ZUNoYW5nZUxvY2tlZChpbnQ2NF90IG5ld0RldmljZVN0YXRlKTsKKworICAgICAgICAvKioKICAgICAgICAgICogUXVlcnkgdGhlIGNhbWVyYSBwcm92aWRlciBmb3IgY29uY3VycmVudCBzdHJlYW0gY29uZmlndXJhdGlvbiBzdXBwb3J0CiAgICAgICAgICAqLwotICAgICAgICBzdGF0dXNfdCBpc0NvbmN1cnJlbnRTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKLSAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNzo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywKLSAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDb25jdXJyZW50U2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb24+ICZjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwgYm9vbCAqaXNTdXBwb3J0ZWQpID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlIGFsbCBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb3ZpZGVyIGFuZCBub3RpZnkgbGlzdGVuZXJzCisgICAgICAgICAqIHdpdGggTk9UX1BSRVNFTlQgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHJlbW92ZUFsbERldmljZXMoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvdmlkZXIgaXMgYW4gZXh0ZXJuYWwgbGF6eSBIQUwKKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaXNFeHRlcm5hbExhenlIQUwoKSBjb25zdDsKIAogICAgICAgICAvLyBCYXNpYyBkZXZpY2UgaW5mb3JtYXRpb24sIGNvbW1vbiB0byBhbGwgY2FtZXJhIGRldmljZXMKICAgICAgICAgc3RydWN0IERldmljZUluZm8gewogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbU5hbWU7ICAvLyBGdWxsIGluc3RhbmNlIG5hbWUKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1JZDsgICAgLy8gSUQgc2VjdGlvbiBvZiBmdWxsIG5hbWUKKyAgICAgICAgICAgIC8vQm90aCBoaWRsIGFuZCBhaWRsIERldmljZUluZm9zLiBBaWRsIGRldmljZUluZm9zIGdldCB7MywgOH0gdG8KKyAgICAgICAgICAgIC8vc3RhcnQgb2ZmLgogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtVmVyc2lvbjsKICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IG1Qcm92aWRlclRhZ2lkOwogICAgICAgICAgICAgYm9vbCBtSXNMb2dpY2FsQ2FtZXJhOwogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1QaHlzaWNhbElkczsKICAgICAgICAgICAgIGhhcmR3YXJlOjpDYW1lcmFJbmZvIG1JbmZvOwotICAgICAgICAgICAgc3A8SUJhc2U+IG1TYXZlZEludGVyZmFjZTsKICAgICAgICAgICAgIFN5c3RlbUNhbWVyYUtpbmQgbVN5c3RlbUNhbWVyYUtpbmQgPSBTeXN0ZW1DYW1lcmFLaW5kOjpQVUJMSUM7CiAKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0IG1SZXNvdXJjZUNvc3Q7CisgICAgICAgICAgICBjb25zdCBDYW1lcmFSZXNvdXJjZUNvc3QgbVJlc291cmNlQ29zdDsKIAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgbVN0YXR1czsKKyAgICAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBtU3RhdHVzOwogCiAgICAgICAgICAgICB3cDxQcm92aWRlckluZm8+IG1QYXJlbnRQcm92aWRlcjsKKyAgICAgICAgICAgIC8vIFRvcmNoIHN0cmVuZ3RoIGRlZmF1bHQsIG1heGltdW0gbGV2ZWxzIGlmIHRoZSB0b3JjaCBzdHJlbmd0aCBjb250cm9sCisgICAgICAgICAgICAvLyBmZWF0dXJlIGlzIHN1cHBvcnRlZC4KKyAgICAgICAgICAgIGludDMyX3QgbVRvcmNoU3RyZW5ndGhMZXZlbDsKKyAgICAgICAgICAgIGludDMyX3QgbVRvcmNoTWF4aW11bVN0cmVuZ3RoTGV2ZWw7CisgICAgICAgICAgICBpbnQzMl90IG1Ub3JjaERlZmF1bHRTdHJlbmd0aExldmVsOworCisgICAgICAgICAgICAvLyBXYWl0IGZvciBsYXp5IEhBTHMgdG8gY29uZmlybSBkZXZpY2UgYXZhaWxhYmlsaXR5CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGV2aWNlQXZhaWxhYmxlVGltZW91dCA9IDIwMDBlNjsgLy8gMjAwMCBtcworICAgICAgICAgICAgTXV0ZXggICAgIG1EZXZpY2VBdmFpbGFibGVMb2NrOworICAgICAgICAgICAgQ29uZGl0aW9uIG1EZXZpY2VBdmFpbGFibGVTaWduYWw7CisgICAgICAgICAgICBib29sIG1Jc0RldmljZUF2YWlsYWJsZSA9IHRydWU7CiAKICAgICAgICAgICAgIGJvb2wgaGFzRmxhc2hVbml0KCkgY29uc3QgeyByZXR1cm4gbUhhc0ZsYXNoVW5pdDsgfQogICAgICAgICAgICAgYm9vbCBzdXBwb3J0TmF0aXZlWm9vbVJhdGlvKCkgY29uc3QgeyByZXR1cm4gbVN1cHBvcnROYXRpdmVab29tUmF0aW87IH0KICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgPSAwOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGludDMyX3QgdG9yY2hTdHJlbmd0aCkgPSAwOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUb3JjaFN0cmVuZ3RoTGV2ZWwoaW50MzJfdCAqdG9yY2hTdHJlbmd0aCkgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSgpIGNvbnN0ID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgPSAwOwpAQCAtNDg4LDQxICs1NzcsMzMgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJi8qY29uZmlndXJhdGlvbiovLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiAmLypjb25maWd1cmF0aW9uKi8sCisgICAgICAgICAgICAgICAgICAgIGJvb2wgLypvdmVycmlkZUZvclBlcmZDbGFzcyovLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmEzOjptZXRhZGF0YUdldHRlciAvKmdldE1ldGFkYXRhKi8sCiAgICAgICAgICAgICAgICAgICAgIGJvb2wgKiAvKnN0YXR1cyovKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBmaWx0ZXJTbWFsbEpwZWdTaXplcygpID0gMDsKLQotICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KLSAgICAgICAgICAgIHNwPEludGVyZmFjZVQ+IHN0YXJ0RGV2aWNlSW50ZXJmYWNlKCk7CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoaW50NjRfdCAvKm5ld1N0YXRlKi8pIHt9CiAKICAgICAgICAgICAgIERldmljZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24mIHZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKICAgICAgICAgICAgICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlcikgOgogICAgICAgICAgICAgICAgICAgICBtTmFtZShuYW1lKSwgbUlkKGlkKSwgbVZlcnNpb24odmVyc2lvbiksIG1Qcm92aWRlclRhZ2lkKHRhZ0lkKSwKICAgICAgICAgICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYShmYWxzZSksIG1SZXNvdXJjZUNvc3QocmVzb3VyY2VDb3N0KSwKLSAgICAgICAgICAgICAgICAgICAgbVN0YXR1cyhoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVCksCi0gICAgICAgICAgICAgICAgICAgIG1QYXJlbnRQcm92aWRlcihwYXJlbnRQcm92aWRlciksIG1IYXNGbGFzaFVuaXQoZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICBtU3VwcG9ydE5hdGl2ZVpvb21SYXRpbyhmYWxzZSksIG1QdWJsaWNDYW1lcmFJZHMocHVibGljQ2FtZXJhSWRzKSB7fQotICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlSW5mbygpOworICAgICAgICAgICAgICAgICAgICBtU3RhdHVzKENhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVCksCisgICAgICAgICAgICAgICAgICAgIG1QYXJlbnRQcm92aWRlcihwYXJlbnRQcm92aWRlciksIG1Ub3JjaFN0cmVuZ3RoTGV2ZWwoMCksCisgICAgICAgICAgICAgICAgICAgIG1Ub3JjaE1heGltdW1TdHJlbmd0aExldmVsKDApLCBtVG9yY2hEZWZhdWx0U3RyZW5ndGhMZXZlbCgwKSwKKyAgICAgICAgICAgICAgICAgICAgbUhhc0ZsYXNoVW5pdChmYWxzZSksIG1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgbVB1YmxpY0NhbWVyYUlkcyhwdWJsaWNDYW1lcmFJZHMpIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5EZXZpY2VJbmZvKCkge30KICAgICAgICAgcHJvdGVjdGVkOgorCiAgICAgICAgICAgICBib29sIG1IYXNGbGFzaFVuaXQ7IC8vIGNvbnN0IGFmdGVyIGNvbnN0cnVjdG9yCiAgICAgICAgICAgICBib29sIG1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvOyAvLyBjb25zdCBhZnRlciBjb25zdHJ1Y3RvcgogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBtUHVibGljQ2FtZXJhSWRzOwotCi0gICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgotICAgICAgICAgICAgc3RhdGljIHN0YXR1c190IHNldFRvcmNoTW9kZShJbnRlcmZhY2VUJiBpbnRlcmZhY2UsIGJvb2wgZW5hYmxlZCk7Ci0KLSAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+Ci0gICAgICAgICAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGVGb3JEZXZpY2UoYm9vbCBlbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3Qgc2F2ZSB0aGUgSUNhbWVyYVByb3ZpZGVyIGludGVyZmFjZSBoZXJlIGJlY2F1c2Ugd2UgYXNzdW1lIHRoYXQgdGhpcyB3YXMKLSAgICAgICAgICAgICAgICAvLyBjYWxsZWQgZnJvbSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnNldFRvcmNoTW9kZSgpLCB3aGljaCBkb2VzIHNhdmUgaXQuCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4oKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRGV2aWNlSW5mbzo6c2V0VG9yY2hNb2RlKGludGVyZmFjZSwgZW5hYmxlZCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPj4gbURldmljZXM7CiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gbVVuaXF1ZUNhbWVyYUlkczsKQEAgLTUzNywzOCArNjE4LDQ3IEBACiAKICAgICAgICAgLy8gSEFMdjMtc3BlY2lmaWMgY2FtZXJhIGZpZWxkcywgaW5jbHVkaW5nIHRoZSBhY3R1YWwgZGV2aWNlIGludGVyZmFjZQogICAgICAgICBzdHJ1Y3QgRGV2aWNlSW5mbzMgOiBwdWJsaWMgRGV2aWNlSW5mbyB7Ci0gICAgICAgICAgICB0eXBlZGVmIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZSBJbnRlcmZhY2VUOwogCi0gICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHR1cm5PblRvcmNoV2l0aFN0cmVuZ3RoTGV2ZWwoaW50MzJfdCB0b3JjaFN0cmVuZ3RoKSA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRvcmNoU3RyZW5ndGhMZXZlbChpbnQzMl90ICp0b3JjaFN0cmVuZ3RoKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBib29sIGlzQVBJMUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAogICAgICAgICAgICAgICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAogICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKQotICAgICAgICAgICAgICAgICAgICBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sIGJvb2wgLypvdmVycmlkZUZvclBlcmZDbGFzcyovLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmEzOjptZXRhZGF0YUdldHRlciAvKmdldE1ldGFkYXRhKi8sCisgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGZpbHRlclNtYWxsSnBlZ1NpemVzKCkgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG5ld1N0YXRlKSBvdmVycmlkZTsKIAogICAgICAgICAgICAgRGV2aWNlSW5mbzMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCiAgICAgICAgICAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLCBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpOwotICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlSW5mbzMoKTsKLSAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMpOworICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlSW5mbzMoKSB7fTsKKyAgICAgICAgcHJvdGVjdGVkOgorICAgICAgICAgICAgLy8gTW9kaWZpZWQgYnkgZGVyaXZlZCB0cmFuc3BvcnQgc3BlY2lmaWMgKGhpZGwgLyBhaWRsKSBjbGFzcwogICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbUNhbWVyYUNoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgIC8vIE1hcCBkZXZpY2Ugc3RhdGVzIHRvIHNlbnNvciBvcmllbnRhdGlvbnMKKyAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQ2NF90LCBpbnQzMl90PiBtRGV2aWNlU3RhdGVPcmllbnRhdGlvbk1hcDsKICAgICAgICAgICAgIC8vIEEgY29weSBvZiBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzIHdpdGhvdXQgcGVyZm9ybWFuY2UgY2xhc3MKICAgICAgICAgICAgIC8vIG92ZXJyaWRlCiAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q2FtZXJhTWV0YWRhdGE+IG1DYW1lcmFDaGFyTm9QQ092ZXJyaWRlOworICAgICAgICAgICAgLy8gT25seSBjb250YWlucyBjaGFyYWN0ZXJpc3RpY3MgZm9yIGhpZGRlbiBwaHlzaWNhbCBjYW1lcmFzLAorICAgICAgICAgICAgLy8gbm90IGZvciBwdWJsaWMgcGh5c2ljYWwgY2FtZXJhcy4KICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+IG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljczsKICAgICAgICAgICAgIHZvaWQgcXVlcnlQaHlzaWNhbENhbWVyYUlkcygpOwogICAgICAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBnZXRTeXN0ZW1DYW1lcmFLaW5kKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBmaXh1cE1vbm9jaHJvbWVUYWdzKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBmaXh1cFRvcmNoU3RyZW5ndGhUYWdzKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBhZGREeW5hbWljRGVwdGhUYWdzKGJvb2wgbWF4UmVzb2x1dGlvbiA9IGZhbHNlKTsKICAgICAgICAgICAgIHN0YXR1c190IGRlcml2ZUhlaWNUYWdzKGJvb2wgbWF4UmVzb2x1dGlvbiA9IGZhbHNlKTsKICAgICAgICAgICAgIHN0YXR1c190IGFkZFJvdGF0ZUNyb3BUYWdzKCk7CkBAIC01OTgsOCArNjg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX2VudHJ5JiBoYWxTdHJlYW1Db25maWdzLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfZW50cnkmIGhhbFN0cmVhbUR1cmF0aW9ucyk7CiAgICAgICAgIH07Ci0KLSAgICBwcml2YXRlOgorICAgIHByb3RlY3RlZDoKICAgICAgICAgc3RkOjpzdHJpbmcgbVR5cGU7CiAgICAgICAgIHVpbnQzMl90IG1JZDsKIApAQCAtNjA5LDEyICs2OTgsMTIgQEAKIAogICAgICAgICBzdHJ1Y3QgQ2FtZXJhU3RhdHVzSW5mb1QgewogICAgICAgICAgICAgYm9vbCBpc1BoeXNpY2FsQ2FtZXJhU3RhdHVzID0gZmFsc2U7Ci0gICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgY2FtZXJhSWQ7Ci0gICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgcGh5c2ljYWxDYW1lcmFJZDsKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1czsKLSAgICAgICAgICAgIENhbWVyYVN0YXR1c0luZm9UKGJvb2wgaXNGb3JQaHlzaWNhbENhbWVyYSwgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBpZCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBwaHlzaWNhbElkLAotICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBzKSA6CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYW1lcmFJZDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzOworICAgICAgICAgICAgQ2FtZXJhU3RhdHVzSW5mb1QoYm9vbCBpc0ZvclBoeXNpY2FsQ2FtZXJhLCBjb25zdCBzdGQ6OnN0cmluZyYgaWQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbElkLAorICAgICAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgcykgOgogICAgICAgICAgICAgICAgICAgICBpc1BoeXNpY2FsQ2FtZXJhU3RhdHVzKGlzRm9yUGh5c2ljYWxDYW1lcmEpLCBjYW1lcmFJZChpZCksCiAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxJZCksIHN0YXR1cyhzKSB7fQogICAgICAgICB9OwpAQCAtNjI2LDIyICs3MTUsMTkgQEAKICAgICAgICAgLy8gRW5kIG9mIHNjb3BlIGZvciBtSW5pdExvY2sKIAogICAgICAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBtSW5pdGlhbFN0YXR1c0NhbGxiYWNrRnV0dXJlOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQcm92aWRlckluZm86OkRldmljZUluZm8+CisgICAgICAgIHZpcnR1YWwgaW5pdGlhbGl6ZURldmljZUluZm8oCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZUNhY2hlQ29uY3VycmVudFN0cmVhbWluZ0NhbWVyYUlkc0xvY2tlZCgpID0gMDsKKwogICAgICAgICB2b2lkIG5vdGlmeUluaXRpYWxTdGF0dXNDaGFuZ2Uoc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyLAogICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxDYW1lcmFTdGF0dXNJbmZvVD4+IGNhY2hlZFN0YXR1cyk7CiAKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPj4gbUNvbmN1cnJlbnRDYW1lcmFJZENvbWJpbmF0aW9uczsKIAotICAgICAgICAvLyBUZW1wbGF0ZWQgbWV0aG9kIHRvIGluc3RhbnRpYXRlIHRoZSByaWdodCBraW5kIG9mIERldmljZUluZm8gYW5kIGNhbGwgdGhlCi0gICAgICAgIC8vIHJpZ2h0IENhbWVyYVByb3ZpZGVyIGdldENhbWVyYURldmljZUludGVyZmFjZV8qIG1ldGhvZC4KLSAgICAgICAgdGVtcGxhdGU8Y2xhc3MgRGV2aWNlSW5mb1Q+Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPiBpbml0aWFsaXplRGV2aWNlSW5mbyhjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAotICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbm9yVmVyc2lvbik7Ci0KLSAgICAgICAgLy8gSGVscGVyIGZvciBpbml0aWFsaXplRGV2aWNlSW5mbyB0byB1c2UgdGhlIHJpZ2h0IENhbWVyYVByb3ZpZGVyIGdldCBtZXRob2QuCi0gICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+Ci0gICAgICAgIHNwPEludGVyZmFjZVQ+IHN0YXJ0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKLQogICAgICAgICAvLyBQYXJzZSBwcm92aWRlciBpbnN0YW5jZSBuYW1lIGZvciB0eXBlIGFuZCBpZAogICAgICAgICBzdGF0aWMgc3RhdHVzX3QgcGFyc2VQcm92aWRlck5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKnR5cGUsIHVpbnQzMl90ICppZCk7CkBAIC02NTMsNDYgKzczOSw4OSBAQAogICAgICAgICAvLyBHZW5lcmF0ZSB2ZW5kb3IgdGFnIGlkCiAgICAgICAgIHN0YXRpYyBtZXRhZGF0YV92ZW5kb3JfaWRfdCBnZW5lcmF0ZVZlbmRvclRhZ0lkKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKIAorICAgICAgICBzdGF0dXNfdCBhZGREZXZpY2UoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIENhbWVyYURldmljZVN0YXR1cyBpbml0aWFsU3RhdHVzLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8gc3RkOjpzdHJpbmcqIHBhcnNlZElkKTsKKworICAgICAgICB2b2lkIGNhbWVyYURldmljZVN0YXR1c0NoYW5nZUludGVybmFsKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpOworCisgICAgICAgIHN0YXR1c190IGNhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpOworCisgICAgICAgIHZvaWQgcGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VJbnRlcm5hbChjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpOworCisgICAgICBzdGF0dXNfdCBwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBpZCwgc3RkOjpzdHJpbmcqIHBoeXNpY2FsSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKTsKKworICAgICAgICB2b2lkIHRvcmNoTW9kZVN0YXR1c0NoYW5nZUludGVybmFsKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgIFRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMpOworCiAgICAgICAgIHZvaWQgcmVtb3ZlRGV2aWNlKHN0ZDo6c3RyaW5nIGlkKTsKIAotICAgICAgICAvLyBFeHBlY3RzIHRvIGhhdmUgbUxvY2sgbG9ja2VkCi0gICAgICAgIHN0YXR1c190IHJlQ2FjaGVDb25jdXJyZW50U3RyZWFtaW5nQ2FtZXJhSWRzTG9ja2VkKCk7Ci0gICAgICAgIC8vIEV4cGVjdHMgdG8gaGF2ZSBtTG9jayBsb2NrZWQKLSAgICAgICAgc3RhdHVzX3QgZ2V0Q29uY3VycmVudENhbWVyYUlkc0ludGVybmFsTG9ja2VkKAotICAgICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXI+ICZpbnRlcmZhY2UyXzYpOwogICAgIH07CiAKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUHJvdmlkZXJJbmZvVHlwZSwgY2xhc3MgSGFsQ2FtZXJhUHJvdmlkZXJUeXBlPgorICAgIHN0YXR1c190IHNldFRvcmNoTW9kZVQoc3A8UHJvdmlkZXJJbmZvPiAmcGFyZW50UHJvdmlkZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SGFsQ2FtZXJhUHJvdmlkZXI+ICpoYWxDYW1lcmFQcm92aWRlcik7CisKKyAgICAvLyBUcnkgdG8gZ2V0IGhpZGwgcHJvdmlkZXIgc2VydmljZXMgZGVjbGFyZWQuIEV4cGVjdHMgbUludGVyZmFjZU11dGV4IHRvIGJlCisgICAgLy8gbG9ja2VkLiBBbHNvIHJlZ2lzdGVycyBmb3IgaGlkbCBwcm92aWRlciBzZXJ2aWNlIG5vdGlmaWNhdGlvbnMuCisgICAgc3RhdHVzX3QgdHJ5VG9Jbml0QW5kQWRkSGlkbFByb3ZpZGVyc0xvY2tlZChIaWRsU2VydmljZUludGVyYWN0aW9uUHJveHkgKmhpZGxQcm94eSk7CisKKyAgICAvLyBUcnkgdG8gZ2V0IGFpZGwgcHJvdmlkZXIgc2VydmljZXMgZGVjbGFyZWQuIEV4cGVjdHMgbUludGVyZmFjZU11dGV4IHRvIGJlCisgICAgLy8gbG9ja2VkLiBBbHNvIHJlZ2lzdGVycyBmb3IgYWlkbCBwcm92aWRlciBzZXJ2aWNlIG5vdGlmaWNhdGlvbnMuCisgICAgc3RhdHVzX3QgdHJ5VG9BZGRBaWRsUHJvdmlkZXJzTG9ja2VkKCk7CisKKyAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBJQ2FtZXJhUHJvdmlkZXIgd2hpbGUgaXQgaXMgYmVpbmcgdXNlZCBieSBhIGNhbWVyYSBvciB0b3JjaCBjbGllbnQKKyAgICAgKi8KKyAgICB2b2lkIHNhdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxIYWxDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIpOworCiAgICAgLy8gVXRpbGl0eSB0byBmaW5kIGEgRGV2aWNlSW5mbyBieSBJRDsgcG9pbnRlciBpcyBvbmx5IHZhbGlkIHdoaWxlIG1JbnRlcmZhY2VNdXRleCBpcyBoZWxkCiAgICAgLy8gYW5kIHRoZSBjYWxsaW5nIGNvZGUgZG9lc24ndCBtdXRhdGUgdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIG9yIHRoZWlyIGxpc3RzIG9mIGRldmljZXMuCi0gICAgLy8gRmluZHMgdGhlIGZpcnN0IGRldmljZSBvZiB0aGUgZ2l2ZW4gSUQgdGhhdCBmYWxscyB3aXRoaW4gdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIHJhbmdlCi0gICAgLy8gICBtaW5WZXJzaW9uIDw9IGRldmljZVZlcnNpb24gPCBtYXhWZXJzaW9uCiAgICAgLy8gTm8gZ3VhcmFudGVlcyBvbiB0aGUgb3JkZXIgb2YgdHJhdmVyc2FsCi0gICAgUHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvKiBmaW5kRGV2aWNlSW5mb0xvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgaWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1pblZlcnNpb24gPSBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezAsMH0sCi0gICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb24gPSBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezEwMDAsMH0pIGNvbnN0OworICAgIFByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbyogZmluZERldmljZUluZm9Mb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKSBjb25zdDsKIAotICAgIHN0YXR1c190IGFkZFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdQcm92aWRlciwgYm9vbCBwcmVleGlzdGluZyA9IGZhbHNlKTsKKyAgICAvLyBNYXAgZXh0ZXJuYWwgcHJvdmlkZXJzIHRvIFVTQiBkZXZpY2VzIGluIG9yZGVyIHRvIGhhbmRsZSBVU0IgaG90cGx1ZworICAgIC8vIGV2ZW50cyBmb3IgbGF6eSBIQUxzCisgICAgc3RkOjpwYWlyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiwgc3A8UHJvdmlkZXJJbmZvPj4KKyAgICAgICAgbUV4dGVybmFsVXNiRGV2aWNlc0ZvclByb3ZpZGVyOworICAgIHNwPFByb3ZpZGVySW5mbz4gc3RhcnRFeHRlcm5hbExhenlQcm92aWRlcigpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgdHJ5VG9Jbml0aWFsaXplUHJvdmlkZXJMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3ZpZGVyTmFtZSwKKyAgICBzdGF0dXNfdCBhZGRIaWRsUHJvdmlkZXJMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5ld1Byb3ZpZGVyLCBib29sIHByZWV4aXN0aW5nID0gZmFsc2UpOworCisgICAgc3RhdHVzX3QgYWRkQWlkbFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdQcm92aWRlcik7CisKKyAgICBzdGF0dXNfdCB0cnlUb0luaXRpYWxpemVIaWRsUHJvdmlkZXJMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3ZpZGVyTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPFByb3ZpZGVySW5mbz4mIHByb3ZpZGVySW5mbyk7CisKKyAgICBzdGF0dXNfdCB0cnlUb0luaXRpYWxpemVBaWRsUHJvdmlkZXJMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3ZpZGVyTmFtZSwKICAgICAgICAgICAgIGNvbnN0IHNwPFByb3ZpZGVySW5mbz4mIHByb3ZpZGVySW5mbyk7CiAKICAgICBib29sIGlzTG9naWNhbENhbWVyYUxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgaWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpOwogCisgICAgLy8gTm8gbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNhbWUgcHJvdmlkZXIgLyBtZW1iZXIgYmVsb25naW5nIHRvIHRoZQorICAgIC8vIHNhbWUgcHJvdmlkZXIgc2hvdWxkIGJlIHVzZWQgYWZ0ZXIgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHNpbmNlIGl0J2xsIGxlYWQKKyAgICAvLyB0byBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MgKGVzcGVjaWFsbHkgc2luY2UgdGhpcyBpcyBjYWxsZWQgYnkgUHJvdmlkZXJJbmZvIG1ldGhvZHMgb24gaGFsCisgICAgLy8gc2VydmljZSBkZWF0aCkuCiAgICAgc3RhdHVzX3QgcmVtb3ZlUHJvdmlkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3ZpZGVyKTsKICAgICBzcDxTdGF0dXNMaXN0ZW5lcj4gZ2V0U3RhdHVzTGlzdGVuZXIoKSBjb25zdDsKIAotICAgIGJvb2wgaXNWYWxpZERldmljZUxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1ham9yVmVyc2lvbikgY29uc3Q7CisgICAgYm9vbCBpc1ZhbGlkRGV2aWNlTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWFqb3JWZXJzaW9uLAorICAgICAgICAgICAgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCkgY29uc3Q7CiAKICAgICBzaXplX3QgbVByb3ZpZGVySW5zdGFuY2VJZCA9IDA7CiAgICAgc3RkOjp2ZWN0b3I8c3A8UHJvdmlkZXJJbmZvPj4gbVByb3ZpZGVyczsKLQotICAgIHZvaWQgYWRkUHJvdmlkZXJUb01hcCgKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwKLSAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyLAotICAgICAgICAgICAgYm9vbCBpc1RvcmNoVXNhZ2UpOwotICAgIHZvaWQgcmVtb3ZlQ2FtZXJhSWRGcm9tTWFwKAotICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PiAmbWFwLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQpOworICAgIC8vIFByb3ZpZGVyIG5hbWVzIG9mIEFJREwgcHJvdmlkZXJzIHdpdGggcmV0cmlldmVkIGJpbmRlcnMuCisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IG1BaWRsUHJvdmlkZXJXaXRoQmluZGVyczsKIAogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXZpY2VTdGF0dXNUb1N0cmluZygKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMmKTsKQEAgLTcwNCwyMCArODMzLDE2IEBACiAgICAgdm9pZCBmaWx0ZXJMb2dpY2FsQ2FtZXJhSWRzTG9ja2VkKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZGV2aWNlSWRzKSBjb25zdDsKIAogICAgIHN0YXR1c190IGdldFN5c3RlbUNhbWVyYUtpbmRMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBTeXN0ZW1DYW1lcmFLaW5kICpraW5kKSBjb25zdDsKLSAgICBzdGQ6OnBhaXI8Ym9vbCwgUHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvICo+IGlzSGlkZGVuUGh5c2ljYWxDYW1lcmFJbnRlcm5hbChjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQpIGNvbnN0OworICAgIHN0ZDo6cGFpcjxib29sLCBQcm92aWRlckluZm86OkRldmljZUluZm8gKj4gaXNIaWRkZW5QaHlzaWNhbENhbWVyYUludGVybmFsKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKSBjb25zdDsKIAogICAgIHZvaWQgY29sbGVjdERldmljZUlkc0xvY2tlZChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGV2aWNlSWRzLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBub3JtYWxEZXZpY2VJZHMsCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHN5c3RlbUNhbWVyYURldmljZUlkcykgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbkFuZENhbWVyYUlkc0xvY2tlZCgKLSAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywKLSAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAotICAgICAgICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKLSAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl83OjpDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICpoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsCi0gICAgICAgICAgICAgIGJvb2wgKmVhcmx5RXhpdCk7CisgICAgc3RhdHVzX3QgdXNiRGV2aWNlRGV0YWNoZWQoY29uc3Qgc3RkOjpzdHJpbmcgJnVzYkRldmljZUlkKTsKKyAgICBuZGs6OlNjb3BlZEFTdGF0dXMgb25BaWRsUmVnaXN0cmF0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9uYW1lLAorICAgICAgICAgICAgY29uc3QgOjpuZGs6OlNwQUlCaW5kZXImIGluX2JpbmRlcik7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5jcHAKaW5kZXggYzk5NTY3MC4uNzE5ZmYyYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmNwcApAQCAtNDIsNiArNDIsMTAgQEAKICNpbmNsdWRlIDx4bXBtZXRhL3htcF9kYXRhLmg+CiAjaW5jbHVkZSA8eG1wbWV0YS94bXBfd3JpdGVyLmg+CiAKKyNpZm5kZWYgX191bnVzZWQKKyNkZWZpbmUgX191bnVzZWQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCisjZW5kaWYKKwogdXNpbmcgZHluYW1pY19kZXB0aDo6Q2FtZXJhOwogdXNpbmcgZHluYW1pY19kZXB0aDo6Q2FtZXJhczsKIHVzaW5nIGR5bmFtaWNfZGVwdGg6OkNhbWVyYVBhcmFtczsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9IYWxDb252ZXJzaW9uc1RlbXBsYXRlZC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0hhbENvbnZlcnNpb25zVGVtcGxhdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhNzE1YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9IYWxDb252ZXJzaW9uc1RlbXBsYXRlZC5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0hBTF9DT05WRVJTSU9OX1RFTVBMQVRFRF9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfSEFMX0NPTlZFUlNJT05fVEVNUExBVEVEX0gKKworI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKKworI2luY2x1ZGUgPGRldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlIDxjbGFzcyBIYWxDYW1lcmFEZXZpY2VTdGF0dXM+CitIYWxDYW1lcmFEZXZpY2VTdGF0dXMgbWFwRnJhbWV3b3JrVG9IYWxDYW1lcmFEZXZpY2VTdGF0dXMoCisgICAgICAgIGNvbnN0IENhbWVyYURldmljZVN0YXR1cyYgcykgIHsKKyAgICBzd2l0Y2gocykgeworICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVDoKKyAgICAgICAgICAgIHJldHVybiBIYWxDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQ7CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVDoKKyAgICAgICAgICAgIHJldHVybiBIYWxDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UOworICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6RU5VTUVSQVRJTkc6CisgICAgICAgICAgICByZXR1cm4gSGFsQ2FtZXJhRGV2aWNlU3RhdHVzOjpFTlVNRVJBVElORzsKKyAgICB9CisgICAgQUxPR1coIlVuZXhwZWN0ZWRjYW1lcmEgZGV2aWNlIHN0YXR1cyBjb2RlICVkIiwgcyk7CisgICAgcmV0dXJuIEhhbENhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBIYWxDYW1lcmFEZXZpY2VTdGF0dXM+CitDYW1lcmFEZXZpY2VTdGF0dXMgSGFsVG9GcmFtZXdvcmtDYW1lcmFEZXZpY2VTdGF0dXMoCisgICAgICAgIGNvbnN0IEhhbENhbWVyYURldmljZVN0YXR1cyYgcykgIHsKKyAgICBzd2l0Y2gocykgeworICAgICAgICBjYXNlIEhhbENhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVDoKKyAgICAgICAgICAgIHJldHVybiBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQ7CisgICAgICAgIGNhc2UgSGFsQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVDoKKyAgICAgICAgICAgIHJldHVybiBDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UOworICAgICAgICBjYXNlIEhhbENhbWVyYURldmljZVN0YXR1czo6RU5VTUVSQVRJTkc6CisgICAgICAgICAgICByZXR1cm4gQ2FtZXJhRGV2aWNlU3RhdHVzOjpFTlVNRVJBVElORzsKKyAgICB9CisgICAgQUxPR1coIlVuZXhwZWN0ZWRjYW1lcmEgZGV2aWNlIHN0YXR1cyBjb2RlICVkIiwgcyk7CisgICAgcmV0dXJuIENhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBIYWxDYW1lcmFSZXNvdXJjZUNvc3Q+CitDYW1lcmFSZXNvdXJjZUNvc3QgSGFsVG9GcmFtZXdvcmtSZXNvdXJjZUNvc3QoCisgICAgICAgIGNvbnN0IEhhbENhbWVyYVJlc291cmNlQ29zdCYgcykgIHsKKyAgICBDYW1lcmFSZXNvdXJjZUNvc3QgaW50ZXJuYWxSZXNvdXJjZUNvc3Q7CisgICAgaW50ZXJuYWxSZXNvdXJjZUNvc3QucmVzb3VyY2VDb3N0ID0gKHVpbnQzMl90KXMucmVzb3VyY2VDb3N0OworICAgIGZvciAoY29uc3QgYXV0byBkZXZpY2UgOiBzLmNvbmZsaWN0aW5nRGV2aWNlcykgeworICAgICAgICBpbnRlcm5hbFJlc291cmNlQ29zdC5jb25mbGljdGluZ0RldmljZXMuZW1wbGFjZV9iYWNrKGRldmljZS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGludGVybmFsUmVzb3VyY2VDb3N0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSGFsVG9yY2hNb2RlU3RhdHVzPgorVG9yY2hNb2RlU3RhdHVzIEhhbFRvRnJhbWV3b3JrVG9yY2hNb2RlU3RhdHVzKAorICAgICAgICBjb25zdCBIYWxUb3JjaE1vZGVTdGF0dXMmIHMpICB7CisgICAgc3dpdGNoKHMpIHsKKyAgICAgICAgY2FzZSBIYWxUb3JjaE1vZGVTdGF0dXM6Ok5PVF9BVkFJTEFCTEU6CisgICAgICAgICAgICByZXR1cm4gVG9yY2hNb2RlU3RhdHVzOjpOT1RfQVZBSUxBQkxFOworICAgICAgICBjYXNlIEhhbFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09GRjoKKyAgICAgICAgICAgIHJldHVybiBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkY7CisgICAgICAgIGNhc2UgSGFsVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT046CisgICAgICAgICAgICByZXR1cm4gVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT047CisgICAgfQorICAgIEFMT0dXKCJVbmV4cGVjdGVkY2FtZXJhIHRvcmNoIG1vZGUgc3RhdHVzIGNvZGUgJWQiLCBzKTsKKyAgICByZXR1cm4gVG9yY2hNb2RlU3RhdHVzOjpOT1RfQVZBSUxBQkxFOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSGFsQ2FtZXJhRGV2aWNlU3RhdHVzPgorIGNvbnN0IGNoYXIqIEhhbERldmljZVN0YXR1c1RvU3RyaW5nKGNvbnN0IEhhbENhbWVyYURldmljZVN0YXR1cyYgcykgeworICAgIHN3aXRjaChzKSB7CisgICAgICAgIGNhc2UgSGFsQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVDoKKyAgICAgICAgICAgIHJldHVybiAiTk9UX1BSRVNFTlQiOworICAgICAgICBjYXNlIEhhbENhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVDoKKyAgICAgICAgICAgIHJldHVybiAiUFJFU0VOVCI7CisgICAgICAgIGNhc2UgSGFsQ2FtZXJhRGV2aWNlU3RhdHVzOjpFTlVNRVJBVElORzoKKyAgICAgICAgICAgIHJldHVybiAiRU5VTUVSQVRJTkciOworICAgIH0KKyAgICBBTE9HVygiVW5leHBlY3RlZCBIQUwgZGV2aWNlIHN0YXR1cyBjb2RlICVkIiwgcyk7CisgICAgcmV0dXJuICJVTktOT1dOX1NUQVRVUyI7Cit9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vYWlkbC9BaWRsUHJvdmlkZXJJbmZvLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9haWRsL0FpZGxQcm92aWRlckluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYjQ3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vYWlkbC9BaWRsUHJvdmlkZXJJbmZvLmNwcApAQCAtMCwwICsxLDgzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiQWlkbFByb3ZpZGVySW5mby5oIgorI2luY2x1ZGUgImNvbW1vbi9IYWxDb252ZXJzaW9uc1RlbXBsYXRlZC5oIgorI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFQcm92aWRlckluZm9UZW1wbGF0ZWQuaCIKKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlIDxhaWRsY29tbW9uc3VwcG9ydC9OYXRpdmVIYW5kbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KKworI2luY2x1ZGUgImRldmljZTMvWm9vbVJhdGlvTWFwcGVyLmgiCisjaW5jbHVkZSA8dXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKK25hbWVzcGFjZSB7Citjb25zdCBib29sIGtFbmFibGVMYXp5SGFsKHByb3BlcnR5X2dldF9ib29sKCJyby5jYW1lcmEuZW5hYmxlTGF6eUhhbCIsIGZhbHNlKSk7Cit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscyA9IDo6YW5kcm9pZDo6Y2FtZXJhMzo6U2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczsKKwordXNpbmcgbmFtZXNwYWNlIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYW1lcmE7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OkNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb247Cit1c2luZyBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U7CisKK3VzaW5nIEhhbERldmljZVN0YXR1c1R5cGUgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OkNhbWVyYURldmljZVN0YXR1czsKK3VzaW5nIElDYW1lcmFQcm92aWRlciA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpJQ2FtZXJhUHJvdmlkZXI7Cit1c2luZyBTdGF0dXNMaXN0ZW5lciA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6U3RhdHVzTGlzdGVuZXI7CisKK3N0YXRpYyBzdGF0dXNfdCBtYXBFeGNlcHRpb25Db2RlVG9TdGF0dXNUKGJpbmRlcl9leGNlcHRpb25fdCBiaW5kZXJFeGNlcHRpb24pIHsKKyAgICBzd2l0Y2ggKGJpbmRlckV4Y2VwdGlvbikgeworICAgICAgICBjYXNlIEVYX05PTkU6CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgRVhfSUxMRUdBTF9BUkdVTUVOVDoKKyAgICAgICAgY2FzZSBFWF9OVUxMX1BPSU5URVI6CisgICAgICAgIGNhc2UgRVhfQkFEX1BBUkNFTEFCTEU6CisgICAgICAgIGNhc2UgRVhfSUxMRUdBTF9TVEFURToKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIGNhc2UgRVhfVU5TVVBQT1JURURfT1BFUkFUSU9OOgorICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBjYXNlIEVYX1RSQU5TQUNUSU9OX0ZBSUxFRDoKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KK30KKworc3RhdHVzX3QgQWlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKGNvbnN0IG5kazo6U2NvcGVkQVN0YXR1cyYgcykgeworICAgIHVzaW5nIFN0YXR1cyA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6U3RhdHVzOworICAgIGF1dG8gZXhjZXB0aW9uQ29kZSA9IHMuZ2V0RXhjZXB0aW9uQ29kZSgpOworICAgIGlmIChleGNlcHRpb25Db2RlICE9IEVYX1NFUlZJQ0VfU1BFQ0lGSUMpIHsKKyAgICAgICAgcmV0dXJuIG1hcEV4Y2VwdGlvbkNvZGVUb1N0YXR1c1QoZXhjZXB0aW9uQ29kZSk7CisgICAgfQorICAgIFN0YXR1cyBzdCA9IHN0YXRpY19jYXN0PFN0YXR1cz4ocy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpKTsKKyAgICBzd2l0Y2ggKHN0KSB7CisgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ6CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIFN0YXR1czo6Q0FNRVJBX0lOX1VTRToKKyAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgIGNhc2UgU3RhdHVzOjpNQVhfQ0FNRVJBU19JTl9VU0U6CisgICAgICAgICAgICByZXR1cm4gLUVVU0VSUzsKKyAgICAgICAgY2FzZSBTdGF0dXM6Ok9QRVJBVElPTl9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBjYXNlIFN0YXR1czo6Q0FNRVJBX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgY2FzZSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBBTE9HVygiVW5leHBlY3RlZCBIQUwgc3RhdHVzIGNvZGUgJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0KSk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitBaWRsUHJvdmlkZXJJbmZvOjpBaWRsUHJvdmlkZXJJbmZvKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVyTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlckluc3RhbmNlLAorICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyICptYW5hZ2VyKSA6CisgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbyhwcm92aWRlck5hbWUsIHByb3ZpZGVySW5zdGFuY2UsIG1hbmFnZXIpIHt9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86OmluaXRpYWxpemVBaWRsUHJvdmlkZXIoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UsIGludDY0X3QgY3VycmVudERldmljZVN0YXRlKSB7CisKKyAgICBzdGF0dXNfdCByZXMgPSBwYXJzZVByb3ZpZGVyTmFtZShtUHJvdmlkZXJOYW1lLCAmbVR5cGUsICZtSWQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHByb3ZpZGVyIG5hbWUsIGlnbm9yaW5nIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR0koIkNvbm5lY3RpbmcgdG8gbmV3IGNhbWVyYSBwcm92aWRlcjogJXMsIGlzUmVtb3RlPyAlZCIsCisgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGludGVyZmFjZS0+aXNSZW1vdGUoKSk7CisKKyAgICAvLyBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UgY2FsbGJhY2tzIG1heSBiZSBjYWxsZWQgKGFuZCBjYXVzaW5nIG5ldyBkZXZpY2VzIGFkZGVkKQorICAgIC8vIGJlZm9yZSBzZXRDYWxsYmFjayByZXR1cm5zCisgICAgbUNhbGxiYWNrcyA9CisgICAgICAgICAgICBuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8QWlkbFByb3ZpZGVyQ2FsbGJhY2tzPih0aGlzKTsKKyAgICBuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgIGludGVyZmFjZS0+c2V0Q2FsbGJhY2sobUNhbGxiYWNrcyk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igc2V0dGluZyB1cCBjYWxsYmFja3Mgd2l0aCBjYW1lcmEgcHJvdmlkZXIgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIH0KKworICAgIG1EZWF0aFJlY2lwaWVudCA9IG5kazo6U2NvcGVkQUlCaW5kZXJfRGVhdGhSZWNpcGllbnQoQUlCaW5kZXJfRGVhdGhSZWNpcGllbnRfbmV3KGJpbmRlckRpZWQpKTsKKyAgICBhdXRvIGxpbmsgPSBBSUJpbmRlcl9saW5rVG9EZWF0aChpbnRlcmZhY2UtPmFzQmluZGVyKCkuZ2V0KCksIG1EZWF0aFJlY2lwaWVudC5nZXQoKSwgdGhpcyk7CisgICAgaWYgKGxpbmsgIT0gU1RBVFVTX09LKSB7CisgICAgICAgIEFMT0dXKCIlczogVW5hYmxlIHRvIGxpbmsgdG8gcHJvdmlkZXIgJyVzJyBkZWF0aCBub3RpZmljYXRpb25zIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKKyAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1BY3RpdmVJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBTZXR0aW5nIGRldmljZSBzdGF0ZSBmb3IgJXM6IDB4JSIgUFJJeDY0LAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1EZXZpY2VTdGF0ZSk7CisgICAgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoY3VycmVudERldmljZVN0YXRlKTsKKworICAgIHJlcyA9IHNldFVwVmVuZG9yVGFncygpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc2V0IHVwIHZlbmRvciB0YWdzIGZyb20gcHJvdmlkZXIgJyVzJyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgICB9CisKKyAgICAvLyBHZXQgaW5pdGlhbCBsaXN0IG9mIGNhbWVyYSBkZXZpY2VzLCBpZiBhbnkKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGV2aWNlczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmV0RGV2aWNlczsKKyAgICBzdGF0dXMgPSBpbnRlcmZhY2UtPmdldENhbWVyYUlkTGlzdCgmcmV0RGV2aWNlcyk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgaW4gZ2V0dGluZyBjYW1lcmEgSUQgbGlzdCBmcm9tIHByb3ZpZGVyICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8mIG5hbWUgOiByZXREZXZpY2VzKSB7CisgICAgICAgIHVpbnQxNl90IG1ham9yLCBtaW5vcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHlwZSwgaWQ7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHBhcnNlRGV2aWNlTmFtZShuYW1lLCAmbWFqb3IsICZtaW5vciwgJnR5cGUsICZpZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgcGFyc2luZyBkZXZpY2VOYW1lOiAlczogJWQiLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXZpY2VzLnB1c2hfYmFjayhuYW1lKTsKKyAgICAgICAgICAgIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5wdXNoX2JhY2soaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gR2V0IGxpc3Qgb2YgY29uY3VycmVudCBzdHJlYW1pbmcgY2FtZXJhIGRldmljZSBjb21iaW5hdGlvbnMKKyAgICByZXMgPSBnZXRDb25jdXJyZW50Q2FtZXJhSWRzSW50ZXJuYWxMb2NrZWQoaW50ZXJmYWNlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbVNldFRvcmNoTW9kZVN1cHBvcnRlZCA9IHRydWU7CisKKyAgICBtSXNSZW1vdGUgPSBpbnRlcmZhY2UtPmlzUmVtb3RlKCk7CisKKyAgICBpbml0aWFsaXplUHJvdmlkZXJJbmZvQ29tbW9uKGRldmljZXMpOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBBaWRsUHJvdmlkZXJJbmZvOjpiaW5kZXJEaWVkKHZvaWQgKmNvb2tpZSkgeworICAgIEFpZGxQcm92aWRlckluZm8gKnByb3ZpZGVyID0gcmVpbnRlcnByZXRfY2FzdDxBaWRsUHJvdmlkZXJJbmZvICo+KGNvb2tpZSk7CisgICAgQUxPR0koIkNhbWVyYSBwcm92aWRlciAnJXMnIGhhcyBkaWVkOyByZW1vdmluZyBpdCIsIHByb3ZpZGVyLT5tUHJvdmlkZXJJbnN0YW5jZS5jX3N0cigpKTsKKyAgICBwcm92aWRlci0+bU1hbmFnZXItPnJlbW92ZVByb3ZpZGVyKHByb3ZpZGVyLT5tUHJvdmlkZXJJbnN0YW5jZSk7Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86OnNldFVwVmVuZG9yVGFncygpIHsKKyAgICBpZiAobVZlbmRvclRhZ0Rlc2NyaXB0b3IgIT0gbnVsbHB0cikKKyAgICAgICAgcmV0dXJuIE9LOworCisgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpjb21tb246OlZlbmRvclRhZ1NlY3Rpb24+IHZ0czsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXM7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHN0YXR1cyA9IGludGVyZmFjZS0+Z2V0VmVuZG9yVGFncygmdnRzKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIHZlbmRvciB0YWdzIGZyb20gcHJvdmlkZXIgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIH0KKworICAgIC8vIFJlYWQgYWxsIHZlbmRvciB0YWcgZGVmaW5pdGlvbnMgaW50byBhIGRlc2NyaXB0b3IKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKChyZXMgPQorICAgICAgICAgICAgSWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6CisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZURlc2NyaXB0b3JGcm9tSWRsPHN0ZDo6dmVjdG9yPGNhbWVyYTo6Y29tbW9uOjpWZW5kb3JUYWdTZWN0aW9uPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmE6OmNvbW1vbjo6VmVuZG9yVGFnU2VjdGlvbj4odnRzLCAvKm91dCovbVZlbmRvclRhZ0Rlc2NyaXB0b3IpKQorICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgZ2VuZXJhdGUgZGVzY3JpcHRvciBmcm9tIHZlbmRvciB0YWcgb3BlcmF0aW9ucywiCisgICAgICAgICAgICAgICAgInJlY2VpdmVkIGVycm9yICVzICglZCkuIENhbWVyYSBjbGllbnRzIHdpbGwgbm90IGJlIGFibGUgdG8gdXNlIgorICAgICAgICAgICAgICAgICJ2ZW5kb3IgdGFncyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IocmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86Om5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGludDY0X3QgbmV3RGV2aWNlU3RhdGUpIHsKKworICAgIG1EZXZpY2VTdGF0ZSA9IG5ld0RldmljZVN0YXRlOworICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlciBpcyBjdXJyZW50bHkgYWN0aXZlIC0gbm90IGdvaW5nIHRvIHN0YXJ0IGl0IHVwIGZvciB0aGlzIG5vdGlmaWNhdGlvbgorICAgIGF1dG8gaW50ZXJmYWNlID0gbVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIgPyBtU2F2ZWRJbnRlcmZhY2UgOiBtQWN0aXZlSW50ZXJmYWNlLmxvY2soKTsKKyAgICBpZiAoaW50ZXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gU2VuZCBjdXJyZW50IGRldmljZSBzdGF0ZQorICAgICAgICBpbnRlcmZhY2UtPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKG1EZXZpY2VTdGF0ZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworYm9vbCBBaWRsUHJvdmlkZXJJbmZvOjpzdWNjZXNzZnVsbHlTdGFydGVkUHJvdmlkZXJJbnRlcmZhY2UoKSB7CisgICAgcmV0dXJuIHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKSAhPSBudWxscHRyOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2U+CitBaWRsUHJvdmlkZXJJbmZvOjpzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgeworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2U+IGNhbWVyYUludGVyZmFjZTsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzdGF0dXMgPSBpbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZShuYW1lLCAmY2FtZXJhSW50ZXJmYWNlKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciB0cnlpbmcgdG8gb2J0YWluIGludGVyZmFjZSBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBjYW1lcmFJbnRlcmZhY2U7Cit9CisKK2NvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJQ2FtZXJhUHJvdmlkZXI+IEFpZGxQcm92aWRlckluZm86OnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiUmVxdWVzdCB0byBzdGFydCBjYW1lcmEgcHJvdmlkZXI6ICVzIiwgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICBpZiAobVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1TYXZlZEludGVyZmFjZTsKKyAgICB9CisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICBBTE9HRSgiQmFkIHByb3ZpZGVyIHN0YXRlISBTaG91bGQgbm90IGJlIGhlcmUgb24gYSBub24tbGF6eSBIQUwhIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGF1dG8gaW50ZXJmYWNlID0gbUFjdGl2ZUludGVyZmFjZS5sb2NrKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIFRyeSB0byBnZXQgc2VydmljZSB3aXRob3V0IHN0YXJ0aW5nCisgICAgICAgIGludGVyZmFjZSA9CisgICAgICAgICAgICAgICAgICAgIElDYW1lcmFQcm92aWRlcjo6ZnJvbUJpbmRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZGs6OlNwQUlCaW5kZXIoQVNlcnZpY2VNYW5hZ2VyX2NoZWNrU2VydmljZShtUHJvdmlkZXJOYW1lLmNfc3RyKCkpKSk7CisgICAgICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSBwcm92aWRlciBhY3R1YWxseSBuZWVkcyByZXN0YXJ0LCBjYWxsaW5nIGdldFNlcnZpY2UoJXMpIiwKKyAgICAgICAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBpbnRlcmZhY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDYW1lcmFQcm92aWRlcjo6ZnJvbUJpbmRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kazo6U3BBSUJpbmRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTZXJ2aWNlTWFuYWdlcl9nZXRTZXJ2aWNlKG1Qcm92aWRlck5hbWUuY19zdHIoKSkpKTsKKworICAgICAgICAgICAgLy8gU2V0IGFsbCBkZXZpY2VzIGFzIEVOVU1FUkFUSU5HLCBwcm92aWRlciBzaG91bGQgdXBkYXRlIHN0YXR1cworICAgICAgICAgICAgLy8gdG8gUFJFU0VOVCBhZnRlciBpbml0aWFsaXppbmcuCisgICAgICAgICAgICAvLyBUaGlzIGF2b2lkcyBmYWlsaW5nIGdldENhbWVyYURldmljZUludGVyZmFjZV9WM194IGJlZm9yZSBkZXZpY2VzCisgICAgICAgICAgICAvLyBhcmUgcmVhZHkuCisgICAgICAgICAgICBmb3IgKGF1dG8mIGRldmljZSA6IG1EZXZpY2VzKSB7CisgICAgICAgICAgICAgIGRldmljZS0+bUlzRGV2aWNlQXZhaWxhYmxlID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludGVyZmFjZS0+c2V0Q2FsbGJhY2sobUNhbGxiYWNrcyk7CisgICAgICAgICAgICBhdXRvIGxpbmsgPSBBSUJpbmRlcl9saW5rVG9EZWF0aChpbnRlcmZhY2UtPmFzQmluZGVyKCkuZ2V0KCksIG1EZWF0aFJlY2lwaWVudC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisgICAgICAgICAgICBpZiAobGluayAhPSBTVEFUVVNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXM6IFVuYWJsZSB0byBsaW5rIHRvIHByb3ZpZGVyICclcycgZGVhdGggbm90aWZpY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZVByb3ZpZGVyKG1Qcm92aWRlck5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZW5kIGN1cnJlbnQgZGV2aWNlIHN0YXRlCisgICAgICAgICAgICBpbnRlcmZhY2UtPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKG1EZXZpY2VTdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgbUFjdGl2ZUludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiQ2FtZXJhIHByb3ZpZGVyICglcykgYWxyZWFkeSBpbiB1c2UuIFJlLXVzaW5nIGluc3RhbmNlLiIsCisgICAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGludGVyZmFjZTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbFByb3ZpZGVySW5mbzo6QWlkbFByb3ZpZGVyQ2FsbGJhY2tzOjpjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgSGFsRGV2aWNlU3RhdHVzVHlwZSBuZXdTdGF0dXMpIHsKKyAgICBzcDxBaWRsUHJvdmlkZXJJbmZvPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBQYXJlbnQgcHJvdmlkZXIgbm90IGFsaXZlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKyAgICByZXR1cm4gcGFyZW50LT5jYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoY2FtZXJhRGV2aWNlTmFtZSwgbmV3U3RhdHVzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbFByb3ZpZGVySW5mbzo6QWlkbFByb3ZpZGVyQ2FsbGJhY2tzOjp0b3JjaE1vZGVTdGF0dXNDaGFuZ2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cykgeworICAgIHNwPEFpZGxQcm92aWRlckluZm8+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IFBhcmVudCBwcm92aWRlciBub3QgYWxpdmUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHJldHVybiBwYXJlbnQtPnRvcmNoTW9kZVN0YXR1c0NoYW5nZShjYW1lcmFEZXZpY2VOYW1lLCBuZXdTdGF0dXMpOworCit9OworCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsUHJvdmlkZXJJbmZvOjpBaWRsUHJvdmlkZXJDYWxsYmFja3M6OnBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgSGFsRGV2aWNlU3RhdHVzVHlwZSBuZXdTdGF0dXMpIHsKKyAgICBzcDxBaWRsUHJvdmlkZXJJbmZvPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBQYXJlbnQgcHJvdmlkZXIgbm90IGFsaXZlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKyAgICByZXR1cm4gcGFyZW50LT5waHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZShjYW1lcmFEZXZpY2VOYW1lLCBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBuZXdTdGF0dXMpOworfTsKKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbFByb3ZpZGVySW5mbzo6Y2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgSGFsRGV2aWNlU3RhdHVzVHlwZSBuZXdTdGF0dXMpIHsKKyAgICBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VJbnRlcm5hbChjYW1lcmFEZXZpY2VOYW1lLCBIYWxUb0ZyYW1ld29ya0NhbWVyYURldmljZVN0YXR1cyhuZXdTdGF0dXMpKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxQcm92aWRlckluZm86OnRvcmNoTW9kZVN0YXR1c0NoYW5nZShjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cykgeworICAgIHRvcmNoTW9kZVN0YXR1c0NoYW5nZUludGVybmFsKGNhbWVyYURldmljZU5hbWUsIEhhbFRvRnJhbWV3b3JrVG9yY2hNb2RlU3RhdHVzKG5ld1N0YXR1cykpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK307CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxQcm92aWRlckluZm86OnBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgSGFsRGV2aWNlU3RhdHVzVHlwZSBuZXdTdGF0dXMpIHsKKyAgICBwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZUludGVybmFsKGNhbWVyYURldmljZU5hbWUsIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgIEhhbFRvRnJhbWV3b3JrQ2FtZXJhRGV2aWNlU3RhdHVzKG5ld1N0YXR1cykpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK307CisKK3N0ZDo6dW5pcXVlX3B0cjxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbz4KKyAgICBBaWRsUHJvdmlkZXJJbmZvOjppbml0aWFsaXplRGV2aWNlSW5mbygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbikgeworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1czsKKworICAgIGF1dG8gY2FtZXJhSW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2UobmFtZSk7CisgICAgaWYgKGNhbWVyYUludGVyZmFjZSA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKKworICAgIGNhbWVyYTo6Y29tbW9uOjpDYW1lcmFSZXNvdXJjZUNvc3QgcmVzb3VyY2VDb3N0OworICAgIHN0YXR1cyA9IGNhbWVyYUludGVyZmFjZS0+Z2V0UmVzb3VyY2VDb3N0KCZyZXNvdXJjZUNvc3QpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvYnRhaW4gcmVzb3VyY2UgY29zdHMgZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGZvciAoYXV0byYgY29uZmxpY3ROYW1lIDogcmVzb3VyY2VDb3N0LmNvbmZsaWN0aW5nRGV2aWNlcykgeworICAgICAgICB1aW50MTZfdCBtYWpvciwgbWlub3I7CisgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGUsIGlkOworICAgICAgICBzdGF0dXNfdCByZXMgPSBwYXJzZURldmljZU5hbWUoY29uZmxpY3ROYW1lLCAmbWFqb3IsICZtaW5vciwgJnR5cGUsICZpZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHBhcnNlIGNvbmZsaWN0aW5nIGRldmljZSAlcyIsIF9fRlVOQ1RJT05fXywgY29uZmxpY3ROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgY29uZmxpY3ROYW1lID0gaWQ7CisgICAgfQorCisgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvMz4oCisgICAgICAgIG5ldyBBaWRsRGV2aWNlSW5mbzMobmFtZSwgdGFnSWQsIGlkLCBtaW5vclZlcnNpb24sIEhhbFRvRnJhbWV3b3JrUmVzb3VyY2VDb3N0KHJlc291cmNlQ29zdCksCisgICAgICAgICAgICAgICAgdGhpcywgbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLCBjYW1lcmFJbnRlcmZhY2UpKTsKK30KKworc3RhdHVzX3QgQWlkbFByb3ZpZGVySW5mbzo6cmVDYWNoZUNvbmN1cnJlbnRTdHJlYW1pbmdDYW1lcmFJZHNMb2NrZWQoKSB7CisKKyAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZXIgaXMgY3VycmVudGx5IGFjdGl2ZSAtIG5vdCBnb2luZyB0byBzdGFydCBpdCB1cCBmb3IgdGhpcyBub3RpZmljYXRpb24KKyAgICBhdXRvIGludGVyZmFjZSA9IG1TYXZlZEludGVyZmFjZSAhPSBudWxscHRyID8gbVNhdmVkSW50ZXJmYWNlIDogbUFjdGl2ZUludGVyZmFjZS5sb2NrKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogY2FtZXJhIHByb3ZpZGVyIGludGVyZmFjZSBmb3IgJXMgaXMgbm90IHZhbGlkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gZ2V0Q29uY3VycmVudENhbWVyYUlkc0ludGVybmFsTG9ja2VkKGludGVyZmFjZSk7Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86OmdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZCgKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElDYW1lcmFQcm92aWRlcj4gJmludGVyZmFjZSkgeworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IG51bGwgaW50ZXJmYWNlIHByb3ZpZGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6Q29uY3VycmVudENhbWVyYUlkQ29tYmluYXRpb24+IGNvbWJzOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXR1cyA9IGludGVyZmFjZS0+Z2V0Q29uY3VycmVudENhbWVyYUlkcygmY29tYnMpOworCisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgaW4gZ2V0dGluZyBjb25jdXJyZW50IGNhbWVyYSBJRCBsaXN0IGZyb20gcHJvdmlkZXIgJyVzJyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorICAgIG1Db25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbnMuY2xlYXIoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNvbWJpbmF0aW9uIDogY29tYnMpIHsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBkZXZpY2VJZHM7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmY2FtZXJhRGV2aWNlSWQgOiBjb21iaW5hdGlvbi5jb21iaW5hdGlvbikgeworICAgICAgICAgICAgZGV2aWNlSWRzLmluc2VydChjYW1lcmFEZXZpY2VJZC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBtQ29uY3VycmVudENhbWVyYUlkQ29tYmluYXRpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGV2aWNlSWRzKSk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitBaWRsUHJvdmlkZXJJbmZvOjpBaWRsRGV2aWNlSW5mbzM6OkFpZGxEZXZpY2VJbmZvMygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKKyAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSkgOgorICAgICAgICBEZXZpY2VJbmZvMyhuYW1lLCB0YWdJZCwgaWQsIG1pbm9yVmVyc2lvbiwgcmVzb3VyY2VDb3N0LCBwYXJlbnRQcm92aWRlciwgcHVibGljQ2FtZXJhSWRzKSB7CisKKyAgICAvLyBHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBhbmQgaW5pdGlhbGl6ZSBmbGFzaCB1bml0IGF2YWlsYWJpbGl0eQorICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhTWV0YWRhdGEgY2hhcnM7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoJmNoYXJzKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbWV0YWRhdGEgPSBjaGFycy5tZXRhZGF0YTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfdCAqYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KG1ldGFkYXRhLmRhdGEoKSk7CisgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IG1ldGFkYXRhLnNpemUoKTsKKyAgICBpbnQgcmVzViA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoYnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICBpZiAocmVzViA9PSBPSyB8fCByZXNWID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKKyAgICAgICAgc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfaWQoYnVmZmVyLCBtUHJvdmlkZXJUYWdpZCk7CisgICAgICAgIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MgPSBidWZmZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzIgorICAgICAgICAgICAgICAgICIgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLCBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUNhbWVyYUNoYXJhY3RlcmlzdGljcy5leGlzdHMoQU5EUk9JRF9JTkZPX0RFVklDRV9TVEFURV9PUklFTlRBVElPTlMpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJnN0YXRlTWFwID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKEFORFJPSURfSU5GT19ERVZJQ0VfU1RBVEVfT1JJRU5UQVRJT05TKTsKKyAgICAgICAgaWYgKChzdGF0ZU1hcC5jb3VudCA+IDApICYmICgoc3RhdGVNYXAuY291bnQgJSAyKSA9PSAwKSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZU1hcC5jb3VudDsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgbURldmljZVN0YXRlT3JpZW50YXRpb25NYXAuZW1wbGFjZShzdGF0ZU1hcC5kYXRhLmk2NFtpXSwgc3RhdGVNYXAuZGF0YS5pNjRbaSsxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IEludmFsaWQgQU5EUk9JRF9JTkZPX0RFVklDRV9TVEFURV9PUklFTlRBVElPTlMgbWFwIHNpemU6ICV6dSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVNYXAuY291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgbVN5c3RlbUNhbWVyYUtpbmQgPSBnZXRTeXN0ZW1DYW1lcmFLaW5kKCk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBmaXh1cE1vbm9jaHJvbWVUYWdzKCk7CisgICAgaWYgKE9LICE9IHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBmaXggdXAgbW9ub2Nocm9tZSB0YWdzIGJhc2VkIGZvciBvbGRlciBIQUwgdmVyc2lvbjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhdXRvIHN0YXQgPSBhZGREeW5hbWljRGVwdGhUYWdzKCk7CisgICAgaWYgKE9LICE9IHN0YXQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgYXBwZW5kaW5nIGR5bmFtaWMgZGVwdGggdGFnczogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXN0YXQpLAorICAgICAgICAgICAgICAgIHN0YXQpOworICAgIH0KKyAgICByZXMgPSBkZXJpdmVIZWljVGFncygpOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZGVyaXZlIEhFSUMgdGFncyBiYXNlZCBvbiBjYW1lcmEgYW5kIG1lZGlhIGNhcGFiaWxpdGllczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisKKyAgICBpZiAoY2FtZXJhMzo6U2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6aXNVbHRyYUhpZ2hSZXNvbHV0aW9uU2Vuc29yKG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MpKSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFkZER5bmFtaWNEZXB0aFRhZ3MoLyptYXhSZXNvbHV0aW9uKi90cnVlKTsKKyAgICAgICAgaWYgKE9LICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgYXBwZW5kaW5nIGR5bmFtaWMgZGVwdGggdGFncyBmb3IgbWF4aW11bSByZXNvbHV0aW9uIG1vZGU6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1zdGF0dXMpLCBzdGF0dXMpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gZGVyaXZlSGVpY1RhZ3MoLyptYXhSZXNvbHV0aW9uKi90cnVlKTsKKyAgICAgICAgaWYgKE9LICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZGVyaXZlIEhFSUMgdGFncyBiYXNlZCBvbiBjYW1lcmEgYW5kIG1lZGlhIGNhcGFiaWxpdGllcyBmb3IiCisgICAgICAgICAgICAgICAgICAgICJtYXhpbXVtIHJlc29sdXRpb24gbW9kZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXN0YXR1cyksIHN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSBhZGRSb3RhdGVDcm9wVGFncygpOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gYWRkIGRlZmF1bHQgU0NBTEVSX1JPVEFURV9BTkRfQ1JPUCB0YWdzOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKyAgICByZXMgPSBhZGRQcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplKCk7CisgICAgaWYgKE9LICE9IHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBhZGQgUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkU6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorICAgIHJlcyA9IGNhbWVyYTM6Olpvb21SYXRpb01hcHBlcjo6b3ZlcnJpZGVab29tUmF0aW9UYWdzKAorICAgICAgICAgICAgJm1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MsICZtU3VwcG9ydE5hdGl2ZVpvb21SYXRpbyk7CisgICAgaWYgKE9LICE9IHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvdmVycmlkZSB6b29tUmF0aW8gcmVsYXRlZCB0YWdzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBmbGFzaEF2YWlsYWJsZSA9CisgICAgICAgICAgICBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRSk7CisgICAgaWYgKGZsYXNoQXZhaWxhYmxlLmNvdW50ID09IDEgJiYKKyAgICAgICAgICAgIGZsYXNoQXZhaWxhYmxlLmRhdGEudThbMF0gPT0gQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRV9UUlVFKSB7CisgICAgICAgIG1IYXNGbGFzaFVuaXQgPSB0cnVlOworICAgICAgICAvLyBGaXggdXAgZmxhc2ggc3RyZW5ndGggdGFncyBmb3IgZGV2aWNlcyB3aXRob3V0IHRoZXNlIGtleXMuCisgICAgICAgIHJlcyA9IGZpeHVwVG9yY2hTdHJlbmd0aFRhZ3MoKTsKKyAgICAgICAgaWYgKE9LICE9IHJlcykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gYWRkIGRlZmF1bHQgQU5EUk9JRF9GTEFTSF9JTkZPX1NUUkVOR1RIX0RFRkFVTFRfTEVWRUwgYW5kIgorICAgICAgICAgICAgICAgICAgICAiQU5EUk9JRF9GTEFTSF9JTkZPX1NUUkVOR1RIX01BWElNVU1fTEVWRUwgdGFnczogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtSGFzRmxhc2hVbml0ID0gZmFsc2U7CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGVudHJ5ID0KKyAgICAgICAgICAgIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfREVGQVVMVF9MRVZFTCk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKKyAgICAgICAgbVRvcmNoRGVmYXVsdFN0cmVuZ3RoTGV2ZWwgPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICB9IGVsc2UgeworICAgICAgICBtVG9yY2hEZWZhdWx0U3RyZW5ndGhMZXZlbCA9IDA7CisgICAgfQorICAgIGVudHJ5ID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKEFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9NQVhJTVVNX0xFVkVMKTsKKyAgICBpZiAoZW50cnkuY291bnQgPT0gMSkgeworICAgICAgICBtVG9yY2hNYXhpbXVtU3RyZW5ndGhMZXZlbCA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Ub3JjaE1heGltdW1TdHJlbmd0aExldmVsID0gMDsKKyAgICB9CisKKyAgICBtVG9yY2hTdHJlbmd0aExldmVsID0gMDsKKworICAgIHF1ZXJ5UGh5c2ljYWxDYW1lcmFJZHMoKTsKKworICAgIC8vIEdldCBwaHlzaWNhbCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGlmIGFwcGxpY2FibGUKKyAgICBpZiAobUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICBmb3IgKGF1dG8mIGlkIDogbVBoeXNpY2FsSWRzKSB7CisgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKG1QdWJsaWNDYW1lcmFJZHMuYmVnaW4oKSwgbVB1YmxpY0NhbWVyYUlkcy5lbmQoKSwgaWQpICE9CisgICAgICAgICAgICAgICAgICAgIG1QdWJsaWNDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFNZXRhZGF0YSBwQ2hhcnM7CisgICAgICAgICAgICBzdGF0dXMgPSBpbnRlcmZhY2UtPmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGlkLCAmcENoYXJzKTsKKyAgICAgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyBwaHlzaWNhbCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzIGZvciAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBpZC5jX3N0cigpLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcE1ldGFkYXRhID0gcENoYXJzLm1ldGFkYXRhOworICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKnBCdWZmZXIgPQorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4ocE1ldGFkYXRhLmRhdGEoKSk7CisgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gcE1ldGFkYXRhLnNpemUoKTsKKyAgICAgICAgICAgIGludCByZXMgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKHBCdWZmZXIsICZleHBlY3RlZFNpemUpOworICAgICAgICAgICAgaWYgKHJlcyA9PSBPSyB8fCByZXMgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAgICAgICAgIHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKHBCdWZmZXIsIG1Qcm92aWRlclRhZ2lkKTsKKyAgICAgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3NbaWRdID0gcEJ1ZmZlcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcyA9IGNhbWVyYTM6Olpvb21SYXRpb01hcHBlcjo6b3ZlcnJpZGVab29tUmF0aW9UYWdzKAorICAgICAgICAgICAgICAgICAgICAmbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzW2lkXSwgJm1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvKTsKKyAgICAgICAgICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvdmVycmlkZSB6b29tUmF0aW8gcmVsYXRlZCB0YWdzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKKyAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0KK30KKworc3RhdHVzX3QgQWlkbFByb3ZpZGVySW5mbzo6QWlkbERldmljZUluZm8zOjpzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSB7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZSgpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHMgPSBpbnRlcmZhY2UtPnNldFRvcmNoTW9kZShlbmFibGVkKTsKKyAgICBpZiAoIXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBVbmFibGUgdG8gc2V0IHRvcmNoIG1vZGU6ICVzIiwgX19GVU5DVElPTl9fLCBzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qocyk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQWlkbFByb3ZpZGVySW5mbzo6QWlkbERldmljZUluZm8zOjp0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKAorICAgICAgICBpbnQzMl90IHRvcmNoU3RyZW5ndGgpIHsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzID0gaW50ZXJmYWNlLT50dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKHRvcmNoU3RyZW5ndGgpOworICAgIGlmICghcy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIFVuYWJsZSB0byBzZXQgdG9yY2ggbW9kZSBzdHJlbmd0aCAlZCA6ICVzIiwgX19GVU5DVElPTl9fLCB0b3JjaFN0cmVuZ3RoLAorICAgICAgICAgICAgICAgIHMuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzKTsKKyAgICB9CisgICAgbVRvcmNoU3RyZW5ndGhMZXZlbCA9IHRvcmNoU3RyZW5ndGg7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBaWRsUHJvdmlkZXJJbmZvOjpBaWRsRGV2aWNlSW5mbzM6OmdldFRvcmNoU3RyZW5ndGhMZXZlbChpbnQzMl90ICp0b3JjaFN0cmVuZ3RoKSB7CisgICAgaWYgKHRvcmNoU3RyZW5ndGggPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGF0dXMgPSBpbnRlcmZhY2UtPmdldFRvcmNoU3RyZW5ndGhMZXZlbCh0b3JjaFN0cmVuZ3RoKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZG4ndCBnZXQgdG9yY2ggc3RyZW5ndGggbGV2ZWw6ICVzIiwgX19GVU5DVElPTl9fLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2U+CitBaWRsUHJvdmlkZXJJbmZvOjpBaWRsRGV2aWNlSW5mbzM6OnN0YXJ0RGV2aWNlSW50ZXJmYWNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1EZXZpY2VBdmFpbGFibGVMb2NrKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2U+IGRldmljZTsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChtU2F2ZWRJbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBzcDxBaWRsUHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QWlkbFByb3ZpZGVySW5mbyAqPihtUGFyZW50UHJvdmlkZXIucHJvbW90ZSgpLmdldCgpKTsKKyAgICAgICAgaWYgKHBhcmVudFByb3ZpZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIGxhenkgSEFMcyB0byBjb25maXJtIGRldmljZSBhdmFpbGFiaWxpdHkKKyAgICAgICAgICAgIGlmIChwYXJlbnRQcm92aWRlci0+aXNFeHRlcm5hbExhenlIQUwoKSAmJiAhbUlzRGV2aWNlQXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBXYWl0IGZvciBleHRlcm5hbCBkZXZpY2UgdG8gYmVjb21lIGF2YWlsYWJsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgIG1JZC5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIGF1dG8gcmVzID0gbURldmljZUF2YWlsYWJsZVNpZ25hbC53YWl0UmVsYXRpdmUobURldmljZUF2YWlsYWJsZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGV2aWNlQXZhaWxhYmxlVGltZW91dCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB3YWl0aW5nIGZvciBkZXZpY2UgdG8gYmVjb21lIGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGV2aWNlID0gcGFyZW50UHJvdmlkZXItPnN0YXJ0RGV2aWNlSW50ZXJmYWNlKG1OYW1lKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRldmljZSA9IG1TYXZlZEludGVyZmFjZTsKKyAgICB9CisgICAgcmV0dXJuIGRldmljZTsKK30KKworc3RhdHVzX3QgQWlkbFByb3ZpZGVySW5mbzo6QWlkbERldmljZUluZm8zOjpkdW1wU3RhdGUoaW50IGZkKSB7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKmFyZ3MgPSBudWxscHRyOworICAgIGF1dG8gcmV0ID0gaW50ZXJmYWNlLT5kdW1wKGZkLCAmYXJncywgLypudW1BcmdzKi8wKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQWlkbFByb3ZpZGVySW5mbzo6QWlkbERldmljZUluZm8zOjppc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywKKyAgICAgICAgY2FtZXJhMzo6bWV0YWRhdGFHZXR0ZXIgZ2V0TWV0YWRhdGEsIGJvb2wgKnN0YXR1cykgeworCisgICAgY2FtZXJhOjpkZXZpY2U6OlN0cmVhbUNvbmZpZ3VyYXRpb24gc3RyZWFtQ29uZmlndXJhdGlvbjsKKyAgICBib29sIGVhcmx5RXhpdCA9IGZhbHNlOworICAgIGF1dG8gYlJlcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBTdHJpbmc4KG1JZC5jX3N0cigpKSwgbUNhbWVyYUNoYXJhY3RlcmlzdGljcywgZ2V0TWV0YWRhdGEsIG1QaHlzaWNhbElkcywKKyAgICAgICAgICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCAmZWFybHlFeGl0KTsKKworICAgIGlmICghYlJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKGVhcmx5RXhpdCkgeworICAgICAgICAqc3RhdHVzID0gZmFsc2U7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSA9CisgICAgICAgICAgICBzdGFydERldmljZUludGVyZmFjZSgpOworCisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXQgPQorICAgICAgICBpbnRlcmZhY2UtPmlzU3RyZWFtQ29tYmluYXRpb25TdXBwb3J0ZWQoc3RyZWFtQ29uZmlndXJhdGlvbiwgc3RhdHVzKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgKnN0YXR1cyA9IGZhbHNlOworICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgYmluZGVyIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1QocmV0KTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworCit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86OmNvbnZlcnRUb0FpZGxIQUxTdHJlYW1Db21iaW5hdGlvbkFuZENhbWVyYUlkc0xvY2tlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbj4gJmNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzLAorICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsCisgICAgICAgIGludCB0YXJnZXRTZGtWZXJzaW9uLAorICAgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmE6OnByb3ZpZGVyOjpDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uPgorICAgICAgICAgICAgICAgICpoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsCisgICAgICAgIGJvb2wgKmVhcmx5RXhpdCkgeworICAgIGJpbmRlcjo6U3RhdHVzIGJTdGF0dXMgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICBzdGQ6OnZlY3RvcjxjYW1lcmE6OnByb3ZpZGVyOjpDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uPiBoYWxDYW1lcmFJZHNBbmRTdHJlYW1zVjsKKyAgICBib29sIHNob3VsZEV4aXQgPSBmYWxzZTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBmb3IgKGF1dG8gJmNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZyA6IGNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCA9IGNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZy5tQ2FtZXJhSWQ7CisgICAgICAgIGNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Db25maWd1cmF0aW9uIHN0cmVhbUNvbmZpZ3VyYXRpb247CisgICAgICAgIENhbWVyYU1ldGFkYXRhIGRldmljZUluZm87CisgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MgPQorICAgICAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OnRhcmdldFBlcmZDbGFzc1ByaW1hcnlDYW1lcmEoCisgICAgICAgICAgICAgICAgICAgICAgICBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLCBjYW1lcmFJZCwgdGFyZ2V0U2RrVmVyc2lvbik7CisgICAgICAgIHJlcyA9IG1NYW5hZ2VyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoY2FtZXJhSWQsIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCAmZGV2aWNlSW5mbyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgY2FtZXJhMzo6bWV0YWRhdGFHZXR0ZXIgZ2V0TWV0YWRhdGEgPQorICAgICAgICAgICAgICAgIFt0aGlzXShjb25zdCBTdHJpbmc4ICZpZCwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcykgeworICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBwaHlzaWNhbERldmljZUluZm87CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoaWQuc3RyaW5nKCksIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeXNpY2FsRGV2aWNlSW5mbyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwaHlzaWNhbERldmljZUluZm87CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOworICAgICAgICBtTWFuYWdlci0+aXNMb2dpY2FsQ2FtZXJhTG9ja2VkKGNhbWVyYUlkLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICBiU3RhdHVzID0KKyAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKAorICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZEFuZFNlc3Npb25Db25maWcubVNlc3Npb25Db25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNhbWVyYUlkLmNfc3RyKCkpLCBkZXZpY2VJbmZvLCBnZXRNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMsIHN0cmVhbUNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCAmc2hvdWxkRXhpdCk7CisgICAgICAgIGlmICghYlN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb24gZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2hvdWxkRXhpdCkgeworICAgICAgICAgICAgKmVhcmx5RXhpdCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgY2FtZXJhOjpwcm92aWRlcjo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbiBoYWxDYW1lcmFJZEFuZFN0cmVhbTsKKyAgICAgICAgaGFsQ2FtZXJhSWRBbmRTdHJlYW0uY2FtZXJhSWQgPSBjYW1lcmFJZDsKKyAgICAgICAgaGFsQ2FtZXJhSWRBbmRTdHJlYW0uc3RyZWFtQ29uZmlndXJhdGlvbiA9IHN0cmVhbUNvbmZpZ3VyYXRpb247CisgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbXNWLnB1c2hfYmFjayhoYWxDYW1lcmFJZEFuZFN0cmVhbSk7CisgICAgfQorICAgICpoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMgPSBoYWxDYW1lcmFJZHNBbmRTdHJlYW1zVjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFpZGxQcm92aWRlckluZm86OmlzQ29uY3VycmVudFNlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uPiAmY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywKKyAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24sIGJvb2wgKmlzU3VwcG9ydGVkKSB7CisKKyAgICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTo6cHJvdmlkZXI6OkNhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+IGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uczsKKyAgICAgIGJvb2wga25vd1Vuc3VwcG9ydGVkID0gZmFsc2U7CisgICAgICBzdGF0dXNfdCByZXMgPSBjb252ZXJ0VG9BaWRsSEFMU3RyZWFtQ29tYmluYXRpb25BbmRDYW1lcmFJZHNMb2NrZWQoCisgICAgICAgICAgICAgIGNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzLCBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICAgICAgICB0YXJnZXRTZGtWZXJzaW9uLCAmaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLCAma25vd1Vuc3VwcG9ydGVkKTsKKyAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICBBTE9HRSgiJXMgdW5hYmxlIHRvIGNvbnZlcnQgc2Vzc2lvbiBjb25maWd1cmF0aW9ucyBwcm92aWRlZCB0byBIQUwgc3RyZWFtIgorICAgICAgICAgICAgICAgICJjb21iaW5hdGlvbnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgIHJldHVybiByZXM7CisgICAgICB9CisgICAgICBpZiAoa25vd1Vuc3VwcG9ydGVkKSB7CisgICAgICAgICAgLy8gV2UgZ290IHRvIGtub3cgdGhlIHN0cmVhbXMgYXJlbid0IHZhbGlkIGJlZm9yZSBkb2luZyB0aGUgSEFMCisgICAgICAgICAgLy8gY2FsbCBpdHNlbGYuCisgICAgICAgICAgKmlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgfQorCisgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZXIgaXMgY3VycmVudGx5IGFjdGl2ZSAtIG5vdCBnb2luZyB0byBzdGFydCBpdCB1cCBmb3IgdGhpcyBub3RpZmljYXRpb24KKyAgICAgIGF1dG8gaW50ZXJmYWNlID0gbVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIgPyBtU2F2ZWRJbnRlcmZhY2UgOiBtQWN0aXZlSW50ZXJmYWNlLmxvY2soKTsKKyAgICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgIC8vIFRPRE86IFRoaXMgbWlnaHQgYmUgc29tZSBvdGhlciBwcm9ibGVtCisgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgfQorICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhdHVzID0gaW50ZXJmYWNlLT5pc0NvbmN1cnJlbnRTdHJlYW1Db21iaW5hdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLCBpc1N1cHBvcnRlZCk7CisgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICBBTE9HRSgiJXM6IGhhbCBpbnRlcmZhY2Ugc2Vzc2lvbiBjb25maWd1cmF0aW9uIHF1ZXJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit9IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9haWRsL0FpZGxQcm92aWRlckluZm8uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9haWRsL0FpZGxQcm92aWRlckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2E4ZmVkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL2FpZGwvQWlkbFByb3ZpZGVySW5mby5oCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVBST1ZJREVSX0FJRExQUk9WSURFUklORk9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBUFJPVklERVJfQUlETFBST1ZJREVSSU5GT0gKKworI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvY29tbW9uL1N0YXR1cy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvcHJvdmlkZXIvQm5DYW1lcmFQcm92aWRlckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvSUNhbWVyYURldmljZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBaWRsUHJvdmlkZXJJbmZvIDogcHVibGljIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvIHsKKyAgICAvLyBDdXJyZW50IG92ZXJhbGwgQW5kcm9pZCBkZXZpY2UgcGh5c2ljYWwgc3RhdHVzCisgICAgaW50NjRfdCBtRGV2aWNlU3RhdGU7CisKKyAgICAvLyBUaGlzIHBvaW50ZXIgaXMgdXNlZCB0byBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBJQ2FtZXJhUHJvdmlkZXIgdGhhdCB3YXMgbGFzdCBhY2Nlc3NlZC4KKyAgICBzdGQ6OndlYWtfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpJQ2FtZXJhUHJvdmlkZXI+IG1BY3RpdmVJbnRlcmZhY2U7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OklDYW1lcmFQcm92aWRlcj4gbVNhdmVkSW50ZXJmYWNlOworCisgICAgQWlkbFByb3ZpZGVySW5mbygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlck5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmcHJvdmlkZXJJbnN0YW5jZSwKKyAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlciAqbWFuYWdlcik7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgbWFwVG9TdGF0dXNUKGNvbnN0IG5kazo6U2NvcGVkQVN0YXR1cyYgcyk7CisKKyAgICAvLyBTdGFydCBjYW1lcmEgZGV2aWNlIGludGVyZmFjZSwgc3RhcnQgdGhlIGNhbWVyYSBwcm92aWRlciBwcm9jZXNzIGZvciBsYXp5CisgICAgLy8gaGFscywgaWYgbmVlZGVkCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUFpZGxQcm92aWRlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UsCisgICAgICAgIGludDY0X3QgY3VycmVudERldmljZVN0YXRlKTsKKworICAgIHN0YXRpYyB2b2lkIGJpbmRlckRpZWQodm9pZCAqY29va2llKTsKKworICAgIHZpcnR1YWwgSVBDVHJhbnNwb3J0IGdldElQQ1RyYW5zcG9ydCgpIG92ZXJyaWRlIHtyZXR1cm4gSVBDVHJhbnNwb3J0OjpBSURMO30KKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6SUNhbWVyYVByb3ZpZGVyPgorICAgIHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VXBWZW5kb3JUYWdzKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShpbnQ2NF90IG5ld0RldmljZVN0YXRlKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYm9vbCBzdWNjZXNzZnVsbHlTdGFydGVkUHJvdmlkZXJJbnRlcmZhY2UoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgaW50NjRfdCBnZXREZXZpY2VTdGF0ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIG1EZXZpY2VTdGF0ZTsgfTsKKworICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSBjYW1lcmEgcHJvdmlkZXIgZm9yIGNvbmN1cnJlbnQgc3RyZWFtIGNvbmZpZ3VyYXRpb24gc3VwcG9ydAorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDb25jdXJyZW50U2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb24+ICZjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwgYm9vbCAqaXNTdXBwb3J0ZWQpIG92ZXJyaWRlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZT4KKyAgICAgICAgICAgIHN0YXJ0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZpY2VOYW1lKTsKKworICAgIC8vIEFJREwgSUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2sgaW50ZXJmYWNlIC0gdGhlc2UgbG9jayB0aGUgcGFyZW50CisgICAgLy8gbUludGVyZmFjZU11dGV4CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6Q2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cyk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyB0b3JjaE1vZGVTdGF0dXNDaGFuZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cyk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKTsKKworICAgIHN0cnVjdCBBaWRsUHJvdmlkZXJDYWxsYmFja3MgOgorICAgICAgICAgICAgcHVibGljIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpCbkNhbWVyYVByb3ZpZGVyQ2FsbGJhY2sgeworICAgICAgICBBaWRsUHJvdmlkZXJDYWxsYmFja3Mod3A8QWlkbFByb3ZpZGVySW5mbz4gcGFyZW50KSA6IG1QYXJlbnQocGFyZW50KSB7IH0KKyAgICAgICAgdmlydHVhbCA6Om5kazo6U2NvcGVkQVN0YXR1cyBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OkNhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpIG92ZXJyaWRlOworCisgICAgICAgIHZpcnR1YWwgOjpuZGs6OlNjb3BlZEFTdGF0dXMgdG9yY2hNb2RlU3RhdHVzQ2hhbmdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKSBvdmVycmlkZTsKKworICAgICAgICB2aXJ0dWFsIDo6bmRrOjpTY29wZWRBU3RhdHVzIHBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OkNhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpIG92ZXJyaWRlOworCisgICAgICAgcHJpdmF0ZToKKyAgICAgICAgd3A8QWlkbFByb3ZpZGVySW5mbz4gbVBhcmVudCA9IG51bGxwdHI7CisKKyAgICB9OworCisgICAgc3RydWN0IEFpZGxEZXZpY2VJbmZvMyA6IHB1YmxpYyBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzMgeworCisgICAgICAgIC8vVE9ETzogZml4IGluaXQKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtVmVyc2lvbiA9IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MywgMn07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2U+CisgICAgICAgICAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gbnVsbHB0cjsKKworICAgICAgICBBaWRsRGV2aWNlSW5mbzMoY29uc3Qgc3RkOjpzdHJpbmcmICwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICYsIHVpbnQxNl90ICwKKyAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFSZXNvdXJjZUNvc3QmICwKKyAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+ICwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mICwKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlPik7CisKKyAgICAgICAgfkFpZGxEZXZpY2VJbmZvMygpIHt9CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGludDMyX3QgdG9yY2hTdHJlbmd0aCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VG9yY2hTdHJlbmd0aExldmVsKGludDMyX3QgKnRvcmNoU3RyZW5ndGgpIG92ZXJyaWRlOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgb3ZlcnJpZGU7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgIGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uICYvKmNvbmZpZ3VyYXRpb24qLywKKyAgICAgICAgICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBjYW1lcmEzOjptZXRhZGF0YUdldHRlciAvKmdldE1ldGFkYXRhKi8sCisgICAgICAgICAgICAgICAgYm9vbCAqc3RhdHVzLypzdGF0dXMqLyk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZT4KKyAgICAgICAgICAgICAgICBzdGFydERldmljZUludGVyZmFjZSgpOworICAgIH07CisKKyBwcml2YXRlOgorCisgICAgLy8gSGVscGVyIGZvciBpbml0aWFsaXplRGV2aWNlSW5mbyB0byB1c2UgdGhlIHJpZ2h0IENhbWVyYVByb3ZpZGVyIGdldCBtZXRob2QuCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4gaW5pdGlhbGl6ZURldmljZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJiwKKyAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90ICwgY29uc3Qgc3RkOjpzdHJpbmcgJiwKKyAgICAgICAgICAgIHVpbnQxNl90ICkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlQ2FjaGVDb25jdXJyZW50U3RyZWFtaW5nQ2FtZXJhSWRzTG9ja2VkKCkgb3ZlcnJpZGU7CisKKyAgICAvL0V4cGVjdHMgdG8gaGF2ZSBtTG9jayBsb2NrZWQKKworICAgIHN0YXR1c190IGdldENvbmN1cnJlbnRDYW1lcmFJZHNJbnRlcm5hbExvY2tlZCgKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpJQ2FtZXJhUHJvdmlkZXI+ICZpbnRlcmZhY2UpOworCisgICAgLy9leHBlY3RzIHRvIGhhdmUgbU1hbmFnZXItPm1JbnRlcmZhY2VNdXRleCBsb2NrZWQKKworICAgIHN0YXR1c190IGNvbnZlcnRUb0FpZGxIQUxTdHJlYW1Db21iaW5hdGlvbkFuZENhbWVyYUlkc0xvY2tlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbj4gJmNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzLAorICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsCisgICAgICAgIGludCB0YXJnZXRTZGtWZXJzaW9uLAorICAgICAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4KKyAgICAgICAgICAgICAgICAqaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLAorICAgICAgICBib29sICplYXJseUV4aXQpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxBaWRsUHJvdmlkZXJDYWxsYmFja3M+IG1DYWxsYmFja3MgPSBudWxscHRyOworICAgIG5kazo6U2NvcGVkQUlCaW5kZXJfRGVhdGhSZWNpcGllbnQgbURlYXRoUmVjaXBpZW50OworCit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9oaWRsL0hpZGxQcm92aWRlckluZm8uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL2hpZGwvSGlkbFByb3ZpZGVySW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlZDlhYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9oaWRsL0hpZGxQcm92aWRlckluZm8uY3BwCkBAIC0wLDAgKzEsMTA1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiSGlkbFByb3ZpZGVySW5mby5oIgorI2luY2x1ZGUgImNvbW1vbi9IYWxDb252ZXJzaW9uc1RlbXBsYXRlZC5oIgorI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFQcm92aWRlckluZm9UZW1wbGF0ZWQuaCIKKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgorCisjaW5jbHVkZSAiZGV2aWNlMy9ab29tUmF0aW9NYXBwZXIuaCIKKyNpbmNsdWRlIDx1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSGlkbC5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy43L0lDYW1lcmFEZXZpY2UuaD4KKworbmFtZXNwYWNlIHsKK2NvbnN0IGJvb2wga0VuYWJsZUxhenlIYWwocHJvcGVydHlfZ2V0X2Jvb2woInJvLmNhbWVyYS5lbmFibGVMYXp5SGFsIiwgZmFsc2UpKTsKK30gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYW1lcmE7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb247Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1czsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl83OjpDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uOworCisKK3VzaW5nIFN0YXR1c0xpc3RlbmVyID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpTdGF0dXNMaXN0ZW5lcjsKK3VzaW5nIEhhbERldmljZVN0YXR1c1R5cGUgPSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1czsKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlOwordXNpbmcgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOworCitzdGF0dXNfdCBIaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1QoY29uc3QgU3RhdHVzJiBzKSAgeworICAgIHN3aXRjaChzKSB7CisgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ6CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIFN0YXR1czo6Q0FNRVJBX0lOX1VTRToKKyAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgIGNhc2UgU3RhdHVzOjpNQVhfQ0FNRVJBU19JTl9VU0U6CisgICAgICAgICAgICByZXR1cm4gLUVVU0VSUzsKKyAgICAgICAgY2FzZSBTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fVFJBTlNBQ1RJT047CisgICAgICAgIGNhc2UgU3RhdHVzOjpPUEVSQVRJT05fTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkNBTUVSQV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgQUxPR1coIlVuZXhwZWN0ZWQgSEFMIHN0YXR1cyBjb2RlICVkIiwgcyk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0aWMgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+IG1hcFRvSGlkbERldmljZVN0YXRlKGludDY0X3QgbmV3U3RhdGUpIHsKKyAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxEZXZpY2VTdGF0ZT4gbmV3RGV2aWNlU3RhdGV7fTsKKyAgICBpZiAobmV3U3RhdGUgJiBJQ2FtZXJhU2VydmljZTo6REVWSUNFX1NUQVRFX0JBQ0tfQ09WRVJFRCkgeworICAgICAgICBuZXdEZXZpY2VTdGF0ZSB8PSBEZXZpY2VTdGF0ZTo6QkFDS19DT1ZFUkVEOworICAgIH0KKyAgICBpZiAobmV3U3RhdGUgJiBJQ2FtZXJhU2VydmljZTo6REVWSUNFX1NUQVRFX0ZST05UX0NPVkVSRUQpIHsKKyAgICAgICAgbmV3RGV2aWNlU3RhdGUgfD0gRGV2aWNlU3RhdGU6OkZST05UX0NPVkVSRUQ7CisgICAgfQorICAgIGlmIChuZXdTdGF0ZSAmIElDYW1lcmFTZXJ2aWNlOjpERVZJQ0VfU1RBVEVfRk9MREVEKSB7CisgICAgICAgIG5ld0RldmljZVN0YXRlIHw9IERldmljZVN0YXRlOjpGT0xERUQ7CisgICAgfQorICAgIC8vIE9ubHkgbWFwIHZlbmRvciBiaXRzIGRpcmVjdGx5CisgICAgdWludDY0X3QgdmVuZG9yQml0cyA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihuZXdTdGF0ZSkgJiAweEZGRkZGRkZGMDAwMDAwMDBsOworICAgIG5ld0RldmljZVN0YXRlIHw9IHZlbmRvckJpdHM7CisKKyAgICBBTE9HVigiJXM6IE5ldyBkZXZpY2Ugc3RhdGUgMHglIiBQUkl4NjQsIF9fRlVOQ1RJT05fXywgbmV3RGV2aWNlU3RhdGUpOworICAgIHJldHVybiBuZXdEZXZpY2VTdGF0ZTsKK30KKworY29uc3QgY2hhciogc3RhdHVzVG9TdHJpbmcoY29uc3QgU3RhdHVzJiBzKSB7CisgICAgc3dpdGNoKHMpIHsKKyAgICAgICAgY2FzZSBTdGF0dXM6Ok9LOgorICAgICAgICAgICAgcmV0dXJuICJPSyI7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgcmV0dXJuICJJTExFR0FMX0FSR1VNRU5UIjsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkNBTUVSQV9JTl9VU0U6CisgICAgICAgICAgICByZXR1cm4gIkNBTUVSQV9JTl9VU0UiOworICAgICAgICBjYXNlIFN0YXR1czo6TUFYX0NBTUVSQVNfSU5fVVNFOgorICAgICAgICAgICAgcmV0dXJuICJNQVhfQ0FNRVJBU19JTl9VU0UiOworICAgICAgICBjYXNlIFN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6CisgICAgICAgICAgICByZXR1cm4gIk1FVEhPRF9OT1RfU1VQUE9SVEVEIjsKKyAgICAgICAgY2FzZSBTdGF0dXM6Ok9QRVJBVElPTl9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgcmV0dXJuICJPUEVSQVRJT05fTk9UX1NVUFBPUlRFRCI7CisgICAgICAgIGNhc2UgU3RhdHVzOjpDQU1FUkFfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgcmV0dXJuICJDQU1FUkFfRElTQ09OTkVDVEVEIjsKKyAgICAgICAgY2FzZSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuICJJTlRFUk5BTF9FUlJPUiI7CisgICAgfQorICAgIEFMT0dXKCJVbmV4cGVjdGVkIEhBTCBzdGF0dXMgY29kZSAlZCIsIHMpOworICAgIHJldHVybiAiVU5LTk9XTl9FUlJPUiI7Cit9CisKK3N0YXR1c190IEhpZGxQcm92aWRlckluZm86OmluaXRpYWxpemVIaWRsUHJvdmlkZXIoCisgICAgICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UsCisgICAgICAgIGludDY0X3QgY3VycmVudERldmljZVN0YXRlKSB7CisgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VQcm92aWRlck5hbWUobVByb3ZpZGVyTmFtZSwgJm1UeXBlLCAmbUlkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBwcm92aWRlciBuYW1lLCBpZ25vcmluZyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dJKCJDb25uZWN0aW5nIHRvIG5ldyBjYW1lcmEgcHJvdmlkZXI6ICVzLCBpc1JlbW90ZT8gJWQiLAorICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBpbnRlcmZhY2UtPmlzUmVtb3RlKCkpOworCisgICAgLy8gRGV0ZXJtaW5lIG1pbm9yIHZlcnNpb24KKyAgICBtTWlub3JWZXJzaW9uID0gNDsKKyAgICBhdXRvIGNhc3QyXzYgPSBwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgIHNwPHByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZTJfNiA9IG51bGxwdHI7CisgICAgaWYgKGNhc3QyXzYuaXNPaygpKSB7CisgICAgICAgIGludGVyZmFjZTJfNiA9IGNhc3QyXzY7CisgICAgICAgIGlmIChpbnRlcmZhY2UyXzYgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbU1pbm9yVmVyc2lvbiA9IDY7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gV2UgbmVlZCB0byBjaGVjayBhZ2FpbiBzaW5jZSBjYXN0Ml82LmlzT2soKSBzdWNjZWVkcyBldmVuIGlmIHRoZSBwcm92aWRlcgorICAgIC8vIHZlcnNpb24gaXNuJ3QgYWN0dWFsbHkgMi42LgorICAgIGlmIChpbnRlcmZhY2UyXzYgPT0gbnVsbHB0cil7CisgICAgICAgIGF1dG8gY2FzdDJfNSA9CisgICAgICAgICAgICAgICAgcHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcjo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlMl81ID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKGNhc3QyXzUuaXNPaygpKSB7CisgICAgICAgICAgICBpbnRlcmZhY2UyXzUgPSBjYXN0Ml81OworICAgICAgICAgICAgaWYgKGludGVyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbU1pbm9yVmVyc2lvbiA9IDU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBhdXRvIGNhc3QyXzcgPSBwcm92aWRlcjo6VjJfNzo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgICAgICBpZiAoY2FzdDJfNy5pc09rKCkpIHsKKyAgICAgICAgICAgIHNwPHByb3ZpZGVyOjpWMl83OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZTJfNyA9IGNhc3QyXzc7CisgICAgICAgICAgICBpZiAoaW50ZXJmYWNlMl83ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtTWlub3JWZXJzaW9uID0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNhbWVyYURldmljZVN0YXR1c0NoYW5nZSBjYWxsYmFja3MgbWF5IGJlIGNhbGxlZCAoYW5kIGNhdXNpbmcgbmV3IGRldmljZXMgYWRkZWQpCisgICAgLy8gYmVmb3JlIHNldENhbGxiYWNrIHJldHVybnMKKyAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gaW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBzZXR0aW5nIHVwIGNhbGxiYWNrcyB3aXRoIGNhbWVyYSBwcm92aWRlciAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byByZWdpc3RlciBjYWxsYmFja3Mgd2l0aCBjYW1lcmEgcHJvdmlkZXIgJyVzJyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorCisgICAgaGFyZHdhcmU6OlJldHVybjxib29sPiBsaW5rZWQgPSBpbnRlcmZhY2UtPmxpbmtUb0RlYXRoKHRoaXMsIC8qY29va2llKi8gbUlkKTsKKyAgICBpZiAoIWxpbmtlZC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBsaW5raW5nIHRvIGNhbWVyYSBwcm92aWRlciAnJXMnIGRlYXRoOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGxpbmtlZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfSBlbHNlIGlmICghbGlua2VkKSB7CisgICAgICAgIEFMT0dXKCIlczogVW5hYmxlIHRvIGxpbmsgdG8gcHJvdmlkZXIgJyVzJyBkZWF0aCBub3RpZmljYXRpb25zIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5CisgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQWN0aXZlSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0KKworICAgIEFMT0dWKCIlczogU2V0dGluZyBkZXZpY2Ugc3RhdGUgZm9yICVzOiAweCUiIFBSSXg2NCwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlU3RhdGUpOworICAgIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGN1cnJlbnREZXZpY2VTdGF0ZSk7CisKKyAgICByZXMgPSBzZXRVcFZlbmRvclRhZ3MoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHNldCB1cCB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBHZXQgaW5pdGlhbCBsaXN0IG9mIGNhbWVyYSBkZXZpY2VzLCBpZiBhbnkKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGV2aWNlczsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhSWRMaXN0KFsmc3RhdHVzLCB0aGlzLCAmZGV2aWNlc10oCisgICAgICAgICAgICBTdGF0dXMgaWRTdGF0dXMsCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiYgY2FtZXJhRGV2aWNlTmFtZXMpIHsKKyAgICAgICAgc3RhdHVzID0gaWRTdGF0dXM7CisgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgZm9yIChhdXRvJiBuYW1lIDogY2FtZXJhRGV2aWNlTmFtZXMpIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBtYWpvciwgbWlub3I7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHlwZSwgaWQ7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VEZXZpY2VOYW1lKG5hbWUsICZtYWpvciwgJm1pbm9yLCAmdHlwZSwgJmlkKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgcGFyc2luZyBkZXZpY2VOYW1lOiAlczogJWQiLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLnB1c2hfYmFjayhuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLnB1c2hfYmFjayhpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IH0pOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGdldHRpbmcgY2FtZXJhIElEIGxpc3QgZnJvbSBwcm92aWRlciAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGxpbmtlZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBmb3IgY2FtZXJhIGRldmljZXMgZnJvbSBwcm92aWRlciAnJXMnIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICAvLyBHZXQgbGlzdCBvZiBjb25jdXJyZW50IHN0cmVhbWluZyBjYW1lcmEgZGV2aWNlIGNvbWJpbmF0aW9ucworICAgIGlmIChtTWlub3JWZXJzaW9uID49IDYpIHsKKyAgICAgICAgcmVzID0gZ2V0Q29uY3VycmVudENhbWVyYUlkc0ludGVybmFsTG9ja2VkKGludGVyZmFjZTJfNik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSBpbnRlcmZhY2UtPmlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkKAorICAgICAgICBbdGhpc10oYXV0byBzdGF0dXMsIGJvb2wgc3VwcG9ydGVkKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBtU2V0VG9yY2hNb2RlU3VwcG9ydGVkID0gc3VwcG9ydGVkOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBjaGVja2luZyB0b3JjaCBtb2RlIHN1cHBvcnQgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIG1Jc1JlbW90ZSA9IGludGVyZmFjZS0+aXNSZW1vdGUoKTsKKworICAgIGluaXRpYWxpemVQcm92aWRlckluZm9Db21tb24oZGV2aWNlcyk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhpZGxQcm92aWRlckluZm86OnNldFVwVmVuZG9yVGFncygpIHsKKyAgICBpZiAobVZlbmRvclRhZ0Rlc2NyaXB0b3IgIT0gbnVsbHB0cikKKyAgICAgICAgcmV0dXJuIE9LOworCisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPFZlbmRvclRhZ1NlY3Rpb24+IHZ0czsKKyAgICBTdGF0dXMgc3RhdHVzOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OworICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9CisgICAgICAgICAgICBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRWZW5kb3JUYWdzKAorICAgICAgICBbJl0oYXV0byBzLCBjb25zdCBhdXRvJiB2ZW5kb3JUYWdTZWNzKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgaWYgKHMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIHZ0cyA9IHZlbmRvclRhZ1NlY3M7CisgICAgICAgICAgICB9CisgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGFsbCB2ZW5kb3IgdGFnIGRlZmluaXRpb25zIGludG8gYSBkZXNjcmlwdG9yCisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmICgocmVzID0gSWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21JZGw8CisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbj4sCisgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+KHZ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL21WZW5kb3JUYWdEZXNjcmlwdG9yKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGdlbmVyYXRlIGRlc2NyaXB0b3IgZnJvbSB2ZW5kb3IgdGFnIG9wZXJhdGlvbnMsIgorICAgICAgICAgICAgICAgICJyZWNlaXZlZCBlcnJvciAlcyAoJWQpLiBDYW1lcmEgY2xpZW50cyB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSIKKyAgICAgICAgICAgICAgICAidmVuZG9yIHRhZ3MiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIaWRsUHJvdmlkZXJJbmZvOjpub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShpbnQ2NF90IG5ld0RldmljZVN0YXRlKSB7CisgICAgbURldmljZVN0YXRlID0gbWFwVG9IaWRsRGV2aWNlU3RhdGUobmV3RGV2aWNlU3RhdGUpOworICAgIGlmIChtTWlub3JWZXJzaW9uID49IDUpIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVyIGlzIGN1cnJlbnRseSBhY3RpdmUgLSBub3QgZ29pbmcgdG8gc3RhcnQgaXQgZm9yIHRoaXMgbm90aWZpY2F0aW9uCisgICAgICAgIGF1dG8gaW50ZXJmYWNlID0gbVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIgPyBtU2F2ZWRJbnRlcmZhY2UgOiBtQWN0aXZlSW50ZXJmYWNlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGludGVyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBTZW5kIGN1cnJlbnQgZGV2aWNlIHN0YXRlCisgICAgICAgICAgICBhdXRvIGNhc3RSZXN1bHQgPSBwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgICAgICAgICAgaWYgKGNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlXzJfNSA9IGNhc3RSZXN1bHQ7CisgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfMl81LT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4KK0hpZGxQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGNhbWVyYUludGVyZmFjZTsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WM194KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKKyAgICAgICAgU3RhdHVzIHMsIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICBjYW1lcmFJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciB0cnlpbmcgdG8gb2J0YWluIGludGVyZmFjZSBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvYnRhaW4gaW50ZXJmYWNlIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIHN0YXR1c1RvU3RyaW5nKHN0YXR1cykpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGNhbWVyYUludGVyZmFjZTsKK30KKworYm9vbCBIaWRsUHJvdmlkZXJJbmZvOjpzdWNjZXNzZnVsbHlTdGFydGVkUHJvdmlkZXJJbnRlcmZhY2UoKSB7CisgICAgcmV0dXJuIHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKSAhPSBudWxscHRyOworfQorCitjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPgorSGlkbFByb3ZpZGVySW5mbzo6c3RhcnRQcm92aWRlckludGVyZmFjZSgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCJSZXF1ZXN0IHRvIHN0YXJ0IGNhbWVyYSBwcm92aWRlcjogJXMiLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgIGlmIChtU2F2ZWRJbnRlcmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbVNhdmVkSW50ZXJmYWNlOworICAgIH0KKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIEFMT0dFKCJCYWQgcHJvdmlkZXIgc3RhdGUhIFNob3VsZCBub3QgYmUgaGVyZSBvbiBhIG5vbi1sYXp5IEhBTCEiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYXV0byBpbnRlcmZhY2UgPSBtQWN0aXZlSW50ZXJmYWNlLnByb21vdGUoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gVHJ5IHRvIGdldCBzZXJ2aWNlIHdpdGhvdXQgc3RhcnRpbmcKKyAgICAgICAgaW50ZXJmYWNlID0gbU1hbmFnZXItPm1IaWRsU2VydmljZVByb3h5LT50cnlHZXRTZXJ2aWNlKG1Qcm92aWRlck5hbWUpOworICAgICAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJDYW1lcmEgcHJvdmlkZXIgYWN0dWFsbHkgbmVlZHMgcmVzdGFydCwgY2FsbGluZyBnZXRTZXJ2aWNlKCVzKSIsCisgICAgICAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgaW50ZXJmYWNlID0gbU1hbmFnZXItPm1IaWRsU2VydmljZVByb3h5LT5nZXRTZXJ2aWNlKG1Qcm92aWRlck5hbWUpOworCisgICAgICAgICAgICAvLyBTZXQgYWxsIGRldmljZXMgYXMgRU5VTUVSQVRJTkcsIHByb3ZpZGVyIHNob3VsZCB1cGRhdGUgc3RhdHVzCisgICAgICAgICAgICAvLyB0byBQUkVTRU5UIGFmdGVyIGluaXRpYWxpemluZy4KKyAgICAgICAgICAgIC8vIFRoaXMgYXZvaWRzIGZhaWxpbmcgZ2V0Q2FtZXJhRGV2aWNlSW50ZXJmYWNlX1YzX3ggYmVmb3JlIGRldmljZXMKKyAgICAgICAgICAgIC8vIGFyZSByZWFkeS4KKyAgICAgICAgICAgIGZvciAoYXV0byYgZGV2aWNlIDogbURldmljZXMpIHsKKyAgICAgICAgICAgICAgZGV2aWNlLT5tSXNEZXZpY2VBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgICAgIGhhcmR3YXJlOjpSZXR1cm48Ym9vbD4KKyAgICAgICAgICAgICAgICBsaW5rZWQgPSBpbnRlcmZhY2UtPmxpbmtUb0RlYXRoKHRoaXMsIC8qY29va2llKi8gbUlkKTsKKyAgICAgICAgICAgIGlmICghbGlua2VkLmlzT2soKSkgeworICAgICAgICAgICAgICBBTE9HRSgKKyAgICAgICAgICAgICAgICAgICIlczogVHJhbnNhY3Rpb24gZXJyb3IgaW4gbGlua2luZyB0byBjYW1lcmEgcHJvdmlkZXIgJyVzJyBkZWF0aDogJXMiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgbGlua2VkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVQcm92aWRlcihtUHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFsaW5rZWQpIHsKKyAgICAgICAgICAgICAgQUxPR1coIiVzOiBVbmFibGUgdG8gbGluayB0byBwcm92aWRlciAnJXMnIGRlYXRoIG5vdGlmaWNhdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTZW5kIGN1cnJlbnQgZGV2aWNlIHN0YXRlCisgICAgICAgICAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA1KSB7CisgICAgICAgICAgICAgIGF1dG8gY2FzdFJlc3VsdCA9CisgICAgICAgICAgICAgICAgICBwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgICAgICAgICAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBzcDxwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl81ID0gY2FzdFJlc3VsdDsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlXzJfNSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IEluaXRpYWwgZGV2aWNlIHN0YXRlIGZvciAlczogMHggJSIgUFJJeDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1EZXZpY2VTdGF0ZSk7CisgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfMl81LT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1BY3RpdmVJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkNhbWVyYSBwcm92aWRlciAoJXMpIGFscmVhZHkgaW4gdXNlLiBSZS11c2luZyBpbnN0YW5jZS4iLAorICAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiBpbnRlcmZhY2U7Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gSGlkbFByb3ZpZGVySW5mbzo6Y2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCisgICAgICAgIEhhbERldmljZVN0YXR1c1R5cGUgbmV3U3RhdHVzKSB7CisgICAgY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlSW50ZXJuYWwoY2FtZXJhRGV2aWNlTmFtZSwgSGFsVG9GcmFtZXdvcmtDYW1lcmFEZXZpY2VTdGF0dXMobmV3U3RhdHVzKSk7CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gSGlkbFByb3ZpZGVySW5mbzo6cGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCisgICAgICAgIEhhbERldmljZVN0YXR1c1R5cGUgbmV3U3RhdHVzKSB7CisgICAgcGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VJbnRlcm5hbChjYW1lcmFEZXZpY2VOYW1lLCBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBIYWxUb0ZyYW1ld29ya0NhbWVyYURldmljZVN0YXR1cyhuZXdTdGF0dXMpKTsKKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsUHJvdmlkZXJJbmZvOjp0b3JjaE1vZGVTdGF0dXNDaGFuZ2UoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzKSB7CisKKyAgICB0b3JjaE1vZGVTdGF0dXNDaGFuZ2VJbnRlcm5hbChjYW1lcmFEZXZpY2VOYW1lLCBIYWxUb0ZyYW1ld29ya1RvcmNoTW9kZVN0YXR1cyhuZXdTdGF0dXMpKTsKKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKwordm9pZCBIaWRsUHJvdmlkZXJJbmZvOjpzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsCisgICAgICAgIGNvbnN0IHdwPGhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgd2hvKSB7CisgICAgKHZvaWQpIHdobzsKKyAgICBBTE9HSSgiQ2FtZXJhIHByb3ZpZGVyICclcycgaGFzIGRpZWQ7IHJlbW92aW5nIGl0IiwgbVByb3ZpZGVySW5zdGFuY2UuY19zdHIoKSk7CisgICAgaWYgKGNvb2tpZSAhPSBtSWQpIHsKKyAgICAgICAgQUxPR1coIiVzOiBVbmV4cGVjdGVkIHNlcnZpY2VEaWVkIGNvb2tpZSAlIiBQUkl1NjQgIiwgZXhwZWN0ZWQgJSIgUFJJdTMyLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY29va2llLCBtSWQpOworICAgIH0KKyAgICBtTWFuYWdlci0+cmVtb3ZlUHJvdmlkZXIobVByb3ZpZGVySW5zdGFuY2UpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8+CisgICAgSGlkbFByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZURldmljZUluZm8oCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24pIHsKKyAgICBTdGF0dXMgc3RhdHVzOworCisgICAgYXV0byBjYW1lcmFJbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZShuYW1lKTsKKyAgICBpZiAoY2FtZXJhSW50ZXJmYWNlID09IG51bGxwdHIpIHJldHVybiBudWxscHRyOworCisgICAgY29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QgcmVzb3VyY2VDb3N0OworICAgIGNhbWVyYUludGVyZmFjZS0+Z2V0UmVzb3VyY2VDb3N0KFsmc3RhdHVzLCAmcmVzb3VyY2VDb3N0XSgKKyAgICAgICAgU3RhdHVzIHMsIGNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0IGNvc3QpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIHJlc291cmNlQ29zdCA9IGNvc3Q7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb2J0YWluIHJlc291cmNlIGNvc3RzIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIHN0YXR1c1RvU3RyaW5nKHN0YXR1cykpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8mIGNvbmZsaWN0TmFtZSA6IHJlc291cmNlQ29zdC5jb25mbGljdGluZ0RldmljZXMpIHsKKyAgICAgICAgdWludDE2X3QgbWFqb3IsIG1pbm9yOworICAgICAgICBzdGQ6OnN0cmluZyB0eXBlLCBpZDsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VEZXZpY2VOYW1lKGNvbmZsaWN0TmFtZSwgJm1ham9yLCAmbWlub3IsICZ0eXBlLCAmaWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwYXJzZSBjb25mbGljdGluZyBkZXZpY2UgJXMiLCBfX0ZVTkNUSU9OX18sIGNvbmZsaWN0TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGNvbmZsaWN0TmFtZSA9IGlkOworICAgIH0KKworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbzM+KAorICAgICAgICBuZXcgSGlkbERldmljZUluZm8zKG5hbWUsIHRhZ0lkLCBpZCwgbWlub3JWZXJzaW9uLCBIYWxUb0ZyYW1ld29ya1Jlc291cmNlQ29zdChyZXNvdXJjZUNvc3QpLAorICAgICAgICAgICAgICAgIHRoaXMsIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcywgY2FtZXJhSW50ZXJmYWNlKSk7Cit9CisKK3N0YXR1c190IEhpZGxQcm92aWRlckluZm86OnJlQ2FjaGVDb25jdXJyZW50U3RyZWFtaW5nQ2FtZXJhSWRzTG9ja2VkKCkgeworICAgIGlmIChtTWlub3JWZXJzaW9uIDwgNikgeworICAgICAgLy8gVW5zdXBwb3J0ZWQgb3BlcmF0aW9uLCBub3RoaW5nIHRvIGRvIGhlcmUKKyAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVyIGlzIGN1cnJlbnRseSBhY3RpdmUgLSBub3QgZ29pbmcgdG8gc3RhcnQgaXQgdXAgZm9yIHRoaXMgbm90aWZpY2F0aW9uCisgICAgYXV0byBpbnRlcmZhY2UgPSBtU2F2ZWRJbnRlcmZhY2UgIT0gbnVsbHB0ciA/IG1TYXZlZEludGVyZmFjZSA6IG1BY3RpdmVJbnRlcmZhY2UucHJvbW90ZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBwcm92aWRlciBpbnRlcmZhY2UgZm9yICVzIGlzIG5vdCB2YWxpZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGF1dG8gY2FzdFJlc3VsdCA9IHByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7CisKKyAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlMl82ID0gY2FzdFJlc3VsdDsKKyAgICAgICAgaWYgKGludGVyZmFjZTJfNiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q29uY3VycmVudENhbWVyYUlkc0ludGVybmFsTG9ja2VkKGludGVyZmFjZTJfNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHNpbmNlIG1NaW5vclZlcnNpb24gPj0gNgorICAgICAgICAgICAgQUxPR0UoIiVzOiBtTWlub3JWZXJzaW9uIHdhcyA+PSA2LCBidXQgaW50ZXJmYWNlMl82IHdhcyBudWxscHRyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGlkbFByb3ZpZGVySW5mbzo6Z2V0Q29uY3VycmVudENhbWVyYUlkc0ludGVybmFsTG9ja2VkKAorICAgICAgICBzcDxwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyPiAmaW50ZXJmYWNlMl82KSB7CisgICAgaWYgKGludGVyZmFjZTJfNiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogbnVsbCBpbnRlcmZhY2UgcHJvdmlkZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldCA9CisgICAgICAgICAgICBpbnRlcmZhY2UyXzYtPmdldENvbmN1cnJlbnRTdHJlYW1pbmdDYW1lcmFJZHMoWyZzdGF0dXMsIHRoaXNdKAorICAgICAgICAgICAgU3RhdHVzIGNvbmN1cnJlbnRJZFN0YXR1cywgLy8gVE9ETzogTW92ZSBhbGwgaW5zdGFuY2VzIG9mIGhpZGxfc3RyaW5nIHRvICd1c2luZycKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPj4mCisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2VJZENvbWJpbmF0aW9ucykgeworICAgICAgICAgICAgc3RhdHVzID0gY29uY3VycmVudElkU3RhdHVzOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgbUNvbmN1cnJlbnRDYW1lcmFJZENvbWJpbmF0aW9ucy5jbGVhcigpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byYgY29tYmluYXRpb24gOiBjYW1lcmFEZXZpY2VJZENvbWJpbmF0aW9ucykgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGRldmljZUlkczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvICZjYW1lcmFEZXZpY2VJZCA6IGNvbWJpbmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZHMuaW5zZXJ0KGNhbWVyYURldmljZUlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Db25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbnMucHVzaF9iYWNrKHN0ZDo6bW92ZShkZXZpY2VJZHMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IH0pOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGdldHRpbmcgY29uY3VycmVudCBjYW1lcmEgSUQgbGlzdCBmcm9tIHByb3ZpZGVyICclcyciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHF1ZXJ5IGZvciBjYW1lcmEgZGV2aWNlcyBmcm9tIHByb3ZpZGVyICclcyciLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitIaWRsUHJvdmlkZXJJbmZvOjpIaWRsRGV2aWNlSW5mbzM6OkhpZGxEZXZpY2VJbmZvMygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKKyAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlKSA6CisgICAgICAgIERldmljZUluZm8zKG5hbWUsIHRhZ0lkLCBpZCwgbWlub3JWZXJzaW9uLCByZXNvdXJjZUNvc3QsIHBhcmVudFByb3ZpZGVyLCBwdWJsaWNDYW1lcmFJZHMpIHsKKworICAgIC8vIEdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGFuZCBpbml0aWFsaXplIGZsYXNoIHVuaXQgYXZhaWxhYmlsaXR5CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhbJnN0YXR1cywgdGhpc10oU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKmJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KG1ldGFkYXRhLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBtZXRhZGF0YS5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGludCByZXMgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gT0sgfHwgcmVzID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKGJ1ZmZlciwgbVByb3ZpZGVyVGFnaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUNoYXJhY3RlcmlzdGljcyA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXMiCisgICAgICAgICAgICAgICAgIiB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBzdGF0dXNUb1N0cmluZyhzdGF0dXMpLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZXhpc3RzKEFORFJPSURfSU5GT19ERVZJQ0VfU1RBVEVfT1JJRU5UQVRJT05TKSkgeworICAgICAgICBjb25zdCBhdXRvICZzdGF0ZU1hcCA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX0lORk9fREVWSUNFX1NUQVRFX09SSUVOVEFUSU9OUyk7CisgICAgICAgIGlmICgoc3RhdGVNYXAuY291bnQgPiAwKSAmJiAoKHN0YXRlTWFwLmNvdW50ICUgMikgPT0gMCkpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVNYXAuY291bnQ7IGkgKz0gMikgeworICAgICAgICAgICAgICAgIG1EZXZpY2VTdGF0ZU9yaWVudGF0aW9uTWFwLmVtcGxhY2Uoc3RhdGVNYXAuZGF0YS5pNjRbaV0sIHN0YXRlTWFwLmRhdGEuaTY0W2krMV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBJbnZhbGlkIEFORFJPSURfSU5GT19ERVZJQ0VfU1RBVEVfT1JJRU5UQVRJT05TIG1hcCBzaXplOiAlenUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0YXRlTWFwLmNvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1TeXN0ZW1DYW1lcmFLaW5kID0gZ2V0U3lzdGVtQ2FtZXJhS2luZCgpOworCisgICAgc3RhdHVzX3QgcmVzID0gZml4dXBNb25vY2hyb21lVGFncygpOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZml4IHVwIG1vbm9jaHJvbWUgdGFncyBiYXNlZCBmb3Igb2xkZXIgSEFMIHZlcnNpb246ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXV0byBzdGF0ID0gYWRkRHluYW1pY0RlcHRoVGFncygpOworICAgIGlmIChPSyAhPSBzdGF0KSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIGFwcGVuZGluZyBkeW5hbWljIGRlcHRoIHRhZ3M6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1zdGF0KSwKKyAgICAgICAgICAgICAgICBzdGF0KTsKKyAgICB9CisgICAgcmVzID0gZGVyaXZlSGVpY1RhZ3MoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGRlcml2ZSBIRUlDIHRhZ3MgYmFzZWQgb24gY2FtZXJhIGFuZCBtZWRpYSBjYXBhYmlsaXRpZXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorCisgICAgaWYgKFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcihtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKSkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhZGREeW5hbWljRGVwdGhUYWdzKC8qbWF4UmVzb2x1dGlvbiovdHJ1ZSk7CisgICAgICAgIGlmIChPSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIGFwcGVuZGluZyBkeW5hbWljIGRlcHRoIHRhZ3MgZm9yIG1heGltdW0gcmVzb2x1dGlvbiBtb2RlOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IGRlcml2ZUhlaWNUYWdzKC8qbWF4UmVzb2x1dGlvbiovdHJ1ZSk7CisgICAgICAgIGlmIChPSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGRlcml2ZSBIRUlDIHRhZ3MgYmFzZWQgb24gY2FtZXJhIGFuZCBtZWRpYSBjYXBhYmlsaXRpZXMgZm9yIgorICAgICAgICAgICAgICAgICAgICAibWF4aW11bSByZXNvbHV0aW9uIG1vZGU6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1zdGF0dXMpLCBzdGF0dXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gYWRkUm90YXRlQ3JvcFRhZ3MoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGFkZCBkZWZhdWx0IFNDQUxFUl9ST1RBVEVfQU5EX0NST1AgdGFnczogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisgICAgcmVzID0gYWRkUHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSgpOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gYWRkIFBSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKyAgICByZXMgPSBjYW1lcmEzOjpab29tUmF0aW9NYXBwZXI6Om92ZXJyaWRlWm9vbVJhdGlvVGFncygKKyAgICAgICAgICAgICZtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLCAmbVN1cHBvcnROYXRpdmVab29tUmF0aW8pOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb3ZlcnJpZGUgem9vbVJhdGlvIHJlbGF0ZWQgdGFnczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZmxhc2hBdmFpbGFibGUgPQorICAgICAgICAgICAgbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEUpOworICAgIGlmIChmbGFzaEF2YWlsYWJsZS5jb3VudCA9PSAxICYmCisgICAgICAgICAgICBmbGFzaEF2YWlsYWJsZS5kYXRhLnU4WzBdID09IEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEVfVFJVRSkgeworICAgICAgICBtSGFzRmxhc2hVbml0ID0gdHJ1ZTsKKyAgICAgICAgLy8gRml4IHVwIGZsYXNoIHN0cmVuZ3RoIHRhZ3MgZm9yIGRldmljZXMgd2l0aG91dCB0aGVzZSBrZXlzLgorICAgICAgICByZXMgPSBmaXh1cFRvcmNoU3RyZW5ndGhUYWdzKCk7CisgICAgICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGFkZCBkZWZhdWx0IEFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9ERUZBVUxUX0xFVkVMIGFuZCIKKyAgICAgICAgICAgICAgICAgICAgIkFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9NQVhJTVVNX0xFVkVMIHRhZ3M6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IGZhbHNlOworICAgIH0KKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBlbnRyeSA9CisgICAgICAgICAgICBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX1NUUkVOR1RIX0RFRkFVTFRfTEVWRUwpOworICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgIG1Ub3JjaERlZmF1bHRTdHJlbmd0aExldmVsID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVRvcmNoRGVmYXVsdFN0cmVuZ3RoTGV2ZWwgPSAwOworICAgIH0KKyAgICBlbnRyeSA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfTUFYSU1VTV9MRVZFTCk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKKyAgICAgICAgbVRvcmNoTWF4aW11bVN0cmVuZ3RoTGV2ZWwgPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICB9IGVsc2UgeworICAgICAgICBtVG9yY2hNYXhpbXVtU3RyZW5ndGhMZXZlbCA9IDA7CisgICAgfQorCisgICAgbVRvcmNoU3RyZW5ndGhMZXZlbCA9IDA7CisKKyAgICBxdWVyeVBoeXNpY2FsQ2FtZXJhSWRzKCk7CisKKyAgICAvLyBHZXQgcGh5c2ljYWwgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBpZiBhcHBsaWNhYmxlCisgICAgYXV0byBjYXN0UmVzdWx0ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgIGlmICghY2FzdFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBVbmFibGUgdG8gY29udmVydCBJQ2FtZXJhRGV2aWNlIGluc3RhbmNlIHRvIHZlcnNpb24gMy41IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZV8zXzUgPSBjYXN0UmVzdWx0OworICAgIGlmIChpbnRlcmZhY2VfM181ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb252ZXJ0ZWQgSUNhbWVyYURldmljZSBpbnN0YW5jZSB0byBudWxscHRyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtSXNMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgIGZvciAoYXV0byYgaWQgOiBtUGh5c2ljYWxJZHMpIHsKKyAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQobVB1YmxpY0NhbWVyYUlkcy5iZWdpbigpLCBtUHVibGljQ2FtZXJhSWRzLmVuZCgpLCBpZCkgIT0KKyAgICAgICAgICAgICAgICAgICAgbVB1YmxpY0NhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgaGlkbElkKGlkKTsKKyAgICAgICAgICAgIHJldCA9IGludGVyZmFjZV8zXzUtPmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGhpZGxJZCwKKyAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZpZCwgdGhpc10oU3RhdHVzIHMsIGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKmJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KG1ldGFkYXRhLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBtZXRhZGF0YS5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGludCByZXMgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gT0sgfHwgcmVzID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKGJ1ZmZlciwgbVByb3ZpZGVyVGFnaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzW2lkXSA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyBwaHlzaWNhbCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzIGZvciAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBpZC5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZXQgcGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgbUlkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNUb1N0cmluZyhzdGF0dXMpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzID0gY2FtZXJhMzo6Wm9vbVJhdGlvTWFwcGVyOjpvdmVycmlkZVpvb21SYXRpb1RhZ3MoCisgICAgICAgICAgICAgICAgICAgICZtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3NbaWRdLCAmbVN1cHBvcnROYXRpdmVab29tUmF0aW8pOworICAgICAgICAgICAgaWYgKE9LICE9IHJlcykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIG92ZXJyaWRlIHpvb21SYXRpbyByZWxhdGVkIHRhZ3M6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgLy8gU2F2ZSBIQUwgcmVmZXJlbmNlIGluZGVmaW5pdGVseQorICAgICAgICBtU2F2ZWRJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfQorCisKK30KKworc3RhdHVzX3QgSGlkbFByb3ZpZGVySW5mbzo6SGlkbERldmljZUluZm8zOjpzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSB7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGU7CisgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZSgpOworICAgIFN0YXR1cyBzID0gaW50ZXJmYWNlLT5zZXRUb3JjaE1vZGUoZW5hYmxlZCA/IFRvcmNoTW9kZTo6T04gOiBUb3JjaE1vZGU6Ok9GRik7CisgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzKTsKK30KKworc3RhdHVzX3QgSGlkbFByb3ZpZGVySW5mbzo6SGlkbERldmljZUluZm8zOjp0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKAorICAgICAgICBpbnQzMl90IC8qdG9yY2hTdHJlbmd0aExldmVsKi8pIHsKKyAgICBBTE9HRSgiJXMgSElETCBkb2VzIG5vdCBzdXBwb3J0IHR1cm5pbmcgb24gdG9yY2ggd2l0aCB2YXJpYWJsZSBzdHJlbmd0aCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBIaWRsUHJvdmlkZXJJbmZvOjpIaWRsRGV2aWNlSW5mbzM6OmdldFRvcmNoU3RyZW5ndGhMZXZlbChpbnQzMl90ICogLyp0b3JjaFN0cmVuZ3RoKi8pIHsKKyAgICBBTE9HRSgiJXMgSElETCBkb2VzIG5vdCBzdXBwb3J0IHZhcmlhYmxlIHRvcmNoIHN0cmVuZ3RoIGxldmVsIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3NwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4KK0hpZGxQcm92aWRlckluZm86OkhpZGxEZXZpY2VJbmZvMzo6c3RhcnREZXZpY2VJbnRlcmZhY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobURldmljZUF2YWlsYWJsZUxvY2spOworICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gZGV2aWNlOworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKG1TYXZlZEludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHNwPEhpZGxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsUHJvdmlkZXJJbmZvICo+KG1QYXJlbnRQcm92aWRlci5wcm9tb3RlKCkuZ2V0KCkpOworICAgICAgICBpZiAocGFyZW50UHJvdmlkZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gV2FpdCBmb3IgbGF6eSBIQUxzIHRvIGNvbmZpcm0gZGV2aWNlIGF2YWlsYWJpbGl0eQorICAgICAgICAgICAgaWYgKHBhcmVudFByb3ZpZGVyLT5pc0V4dGVybmFsTGF6eUhBTCgpICYmICFtSXNEZXZpY2VBdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFdhaXQgZm9yIGV4dGVybmFsIGRldmljZSB0byBiZWNvbWUgYXZhaWxhYmxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgbUlkLmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgYXV0byByZXMgPSBtRGV2aWNlQXZhaWxhYmxlU2lnbmFsLndhaXRSZWxhdGl2ZShtRGV2aWNlQXZhaWxhYmxlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZXZpY2VBdmFpbGFibGVUaW1lb3V0KTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHdhaXRpbmcgZm9yIGRldmljZSB0byBiZWNvbWUgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZXZpY2UgPSBwYXJlbnRQcm92aWRlci0+c3RhcnREZXZpY2VJbnRlcmZhY2UobU5hbWUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGV2aWNlID0gKGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZSAqKSBtU2F2ZWRJbnRlcmZhY2UuZ2V0KCk7CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3N0YXR1c190IEhpZGxQcm92aWRlckluZm86OkhpZGxEZXZpY2VJbmZvMzo6ZHVtcFN0YXRlKGludCBmZCkgeworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKKyAgICBoYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSA9CisgICAgICAgICAgICBzdGFydERldmljZUludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGF1dG8gcmV0ID0gaW50ZXJmYWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGlkbFByb3ZpZGVySW5mbzo6SGlkbERldmljZUluZm8zOjppc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywKKyAgICAgICAgbWV0YWRhdGFHZXR0ZXIgZ2V0TWV0YWRhdGEsIGJvb2wgKnN0YXR1cykgeworCisgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb25fM183OworICAgIGJvb2wgZWFybHlFeGl0ID0gZmFsc2U7CisgICAgYXV0byBiUmVzID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb24oY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIFN0cmluZzgobUlkLmNfc3RyKCkpLCBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLCBnZXRNZXRhZGF0YSwgbVBoeXNpY2FsSWRzLAorICAgICAgICAgICAgY29uZmlndXJhdGlvbl8zXzcsIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCAmZWFybHlFeGl0KTsKKworICAgIGlmICghYlJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKGVhcmx5RXhpdCkgeworICAgICAgICAqc3RhdHVzID0gZmFsc2U7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSA9CisgICAgICAgICAgICBzdGFydERldmljZUludGVyZmFjZSgpOworCisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBhdXRvIGNhc3RSZXN1bHRfM181ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlXzNfNSA9IGNhc3RSZXN1bHRfM181OworICAgIGF1dG8gY2FzdFJlc3VsdF8zXzcgPSBkZXZpY2U6OlYzXzc6OklDYW1lcmFEZXZpY2U6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2VfM183ID0gY2FzdFJlc3VsdF8zXzc7CisKKyAgICBzdGF0dXNfdCByZXM7CisgICAgU3RhdHVzIGNhbGxTdGF0dXM7CisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKKyAgICBhdXRvIGhhbENiID0KKyAgICAgICAgICAgIFsmY2FsbFN0YXR1cywgJnN0YXR1c10gKFN0YXR1cyBzLCBib29sIGNvbWJTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBjYWxsU3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAqc3RhdHVzID0gY29tYlN0YXR1czsKKyAgICAgICAgICAgIH07CisgICAgaWYgKGludGVyZmFjZV8zXzcgIT0gbnVsbHB0cikgeworICAgICAgICByZXQgPSBpbnRlcmZhY2VfM183LT5pc1N0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkXzNfNyhjb25maWd1cmF0aW9uXzNfNywgaGFsQ2IpOworICAgIH0gZWxzZSBpZiAoaW50ZXJmYWNlXzNfNSAhPSBudWxscHRyKSB7CisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uXzNfNDsKKyAgICAgICAgYm9vbCBzdWNjZXNzID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y29udmVydEhBTFN0cmVhbUNvbWJpbmF0aW9uRnJvbVYzN1RvVjM0KAorICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25fM180LCBjb25maWd1cmF0aW9uXzNfNyk7CisgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgKnN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHJldCA9IGludGVyZmFjZV8zXzUtPmlzU3RyZWFtQ29tYmluYXRpb25TdXBwb3J0ZWQoY29uZmlndXJhdGlvbl8zXzQsIGhhbENiKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIHN3aXRjaCAoY2FsbFN0YXR1cykgeworICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok9LOgorICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIGNhc2UsIGRvIG5vdGhpbmcuCisgICAgICAgICAgICAgICAgcmVzID0gT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6CisgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU2Vzc2lvbiBjb25maWd1cmF0aW9uIHF1ZXJ5IGZhaWxlZDogJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxTdGF0dXMpOworICAgICAgICAgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgYmluZGVyIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgSGlkbFByb3ZpZGVySW5mbzo6Y29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb25BbmRDYW1lcmFJZHNMb2NrZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb24+ICZjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPENhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+ICpoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsCisgICAgICAgIGJvb2wgKmVhcmx5RXhpdCkgeworICAgIGJpbmRlcjo6U3RhdHVzIGJTdGF0dXMgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICBzdGQ6OnZlY3RvcjxDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uPiBoYWxDYW1lcmFJZHNBbmRTdHJlYW1zVjsKKyAgICBib29sIHNob3VsZEV4aXQgPSBmYWxzZTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBmb3IgKGF1dG8gJmNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZyA6IGNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCA9IGNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZy5tQ2FtZXJhSWQ7CisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiBzdHJlYW1Db25maWd1cmF0aW9uOworICAgICAgICBDYW1lcmFNZXRhZGF0YSBkZXZpY2VJbmZvOworICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzID0KKyAgICAgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjp0YXJnZXRQZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhKAorICAgICAgICAgICAgICAgICAgICAgICAgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywgY2FtZXJhSWQsIHRhcmdldFNka1ZlcnNpb24pOworICAgICAgICByZXMgPSBtTWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGNhbWVyYUlkLCBvdmVycmlkZUZvclBlcmZDbGFzcywgJmRldmljZUluZm8pOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIGNhbWVyYTM6Om1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhID0KKyAgICAgICAgICAgICAgICBbdGhpc10oY29uc3QgU3RyaW5nOCAmaWQsIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgcGh5c2ljYWxEZXZpY2VJbmZvOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGlkLnN0cmluZygpLCBvdmVycmlkZUZvclBlcmZDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbERldmljZUluZm8pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGh5c2ljYWxEZXZpY2VJbmZvOworICAgICAgICAgICAgICAgIH07CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICAgICAgbU1hbmFnZXItPmlzTG9naWNhbENhbWVyYUxvY2tlZChjYW1lcmFJZCwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgYlN0YXR1cyA9CisgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlnLm1TZXNzaW9uQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChjYW1lcmFJZC5jX3N0cigpKSwgZGV2aWNlSW5mbywgZ2V0TWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzLCBzdHJlYW1Db25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZUZvclBlcmZDbGFzcywgJnNob3VsZEV4aXQpOworICAgICAgICBpZiAoIWJTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNob3VsZEV4aXQpIHsKKyAgICAgICAgICAgICplYXJseUV4aXQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIENhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24gaGFsQ2FtZXJhSWRBbmRTdHJlYW07CisgICAgICAgIGhhbENhbWVyYUlkQW5kU3RyZWFtLmNhbWVyYUlkID0gY2FtZXJhSWQ7CisgICAgICAgIGhhbENhbWVyYUlkQW5kU3RyZWFtLnN0cmVhbUNvbmZpZ3VyYXRpb24gPSBzdHJlYW1Db25maWd1cmF0aW9uOworICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1zVi5wdXNoX2JhY2soaGFsQ2FtZXJhSWRBbmRTdHJlYW0pOworICAgIH0KKyAgICAqaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zID0gaGFsQ2FtZXJhSWRzQW5kU3RyZWFtc1Y7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIaWRsUHJvdmlkZXJJbmZvOjppc0NvbmN1cnJlbnRTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbj4gJmNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzLAorICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsCisgICAgICAgIGludCB0YXJnZXRTZGtWZXJzaW9uLCBib29sICppc1N1cHBvcnRlZCkgeworCisgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4gaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zOworICAgICAgYm9vbCBrbm93VW5zdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgIHN0YXR1c190IHJlcyA9IGNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uQW5kQ2FtZXJhSWRzTG9ja2VkKAorICAgICAgICAgICAgICBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywKKyAgICAgICAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiwgJmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywgJmtub3dVbnN1cHBvcnRlZCk7CisgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgQUxPR0UoIiVzIHVuYWJsZSB0byBjb252ZXJ0IHNlc3Npb24gY29uZmlndXJhdGlvbnMgcHJvdmlkZWQgdG8gSEFMIHN0cmVhbSIKKyAgICAgICAgICAgICAgICAiY29tYmluYXRpb25zIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgfQorICAgICAgaWYgKGtub3dVbnN1cHBvcnRlZCkgeworICAgICAgICAgIC8vIFdlIGdvdCB0byBrbm93IHRoZSBzdHJlYW1zIGFyZW4ndCB2YWxpZCBiZWZvcmUgZG9pbmcgdGhlIEhBTAorICAgICAgICAgIC8vIGNhbGwgaXRzZWxmLgorICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgIH0KKworICAgIGlmIChtTWlub3JWZXJzaW9uID49IDYpIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVyIGlzIGN1cnJlbnRseSBhY3RpdmUgLSBub3QgZ29pbmcgdG8gc3RhcnQgaXQgZm9yIHRoaXMgbm90aWZpY2F0aW9uCisgICAgICAgIGF1dG8gaW50ZXJmYWNlID0gbVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIgPyBtU2F2ZWRJbnRlcmZhY2UgOiBtQWN0aXZlSW50ZXJmYWNlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIG1pZ2h0IGJlIHNvbWUgb3RoZXIgcHJvYmxlbQorICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGF1dG8gY2FzdFJlc3VsdDJfNiA9IHByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgICAgIGF1dG8gY2FzdFJlc3VsdDJfNyA9IHByb3ZpZGVyOjpWMl83OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgICAgIFN0YXR1cyBjYWxsU3RhdHVzOworICAgICAgICBhdXRvIGNiID0KKyAgICAgICAgICAgICAgICBbJmlzU3VwcG9ydGVkLCAmY2FsbFN0YXR1c10oU3RhdHVzIHMsIGJvb2wgc3VwcG9ydGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gc3VwcG9ydGVkOyB9OworCisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7CisgICAgICAgIHNwPHByb3ZpZGVyOjpWMl83OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZV8yXzc7CisgICAgICAgIHNwPHByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZV8yXzY7CisgICAgICAgIGlmIChtTWlub3JWZXJzaW9uID49IDcgJiYgY2FzdFJlc3VsdDJfNy5pc09rKCkpIHsKKyAgICAgICAgICAgIGludGVyZmFjZV8yXzcgPSBjYXN0UmVzdWx0Ml83OworICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzcgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldCA9IGludGVyZmFjZV8yXzctPmlzQ29uY3VycmVudFN0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkXzJfNygKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywgY2IpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1NaW5vclZlcnNpb24gPT0gNiAmJiBjYXN0UmVzdWx0Ml82LmlzT2soKSkgeworICAgICAgICAgICAgaW50ZXJmYWNlXzJfNiA9IGNhc3RSZXN1bHQyXzY7CisgICAgICAgICAgICBpZiAoaW50ZXJmYWNlXzJfNiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPHByb3ZpZGVyOjpWMl82OjpDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zXzJfNjsKKyAgICAgICAgICAgICAgICBzaXplX3QgbnVtU3RyZWFtcyA9IGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucy5zaXplKCk7CisgICAgICAgICAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zXzJfNi5yZXNpemUobnVtU3RyZWFtcyk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGNhbWVyYTM7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY29uc3QmIGNvbWJpbmF0aW9uID0gaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zW2ldOworICAgICAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnNfMl82W2ldLmNhbWVyYUlkID0gY29tYmluYXRpb24uY2FtZXJhSWQ7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y29udmVydEhBTFN0cmVhbUNvbWJpbmF0aW9uRnJvbVYzN1RvVjM0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zXzJfNltpXS5zdHJlYW1Db25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24uc3RyZWFtQ29uZmlndXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0ID0gaW50ZXJmYWNlXzJfNi0+aXNDb25jdXJyZW50U3RyZWFtQ29tYmluYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnNfMl82LCBjYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW50ZXJmYWNlXzJfNyAhPSBudWxscHRyIHx8IGludGVyZmFjZV8yXzYgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNhbGxTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok9LOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgY2FzZSwgZG8gbm90aGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IE9LOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpNRVRIT0RfTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFNlc3Npb24gY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQ6ICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBiaW5kZXIgZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyB1bnN1cHBvcnRlZCBvcGVyYXRpb24KKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK30gLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL2hpZGwvSGlkbFByb3ZpZGVySW5mby5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL2hpZGwvSGlkbFByb3ZpZGVySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjE2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vaGlkbC9IaWRsUHJvdmlkZXJJbmZvLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBUFJPVklERVJfSElETFBST1ZJREVSSU5GT0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFQUk9WSURFUl9ISURMUFJPVklERVJJTkZPSAorCisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBIaWRsUHJvdmlkZXJJbmZvIDogcHVibGljIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvLAorICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlckNhbGxiYWNrLAorICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAvLyBDdXJyZW50IG92ZXJhbGwgQW5kcm9pZCBkZXZpY2UgcGh5c2ljYWwgc3RhdHVzCisgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBtRGV2aWNlU3RhdGU7CisKKyAgICAvLyBUaGlzIHBvaW50ZXIgaXMgdXNlZCB0byBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBJQ2FtZXJhUHJvdmlkZXIgdGhhdCB3YXMgbGFzdCBhY2Nlc3NlZC4KKyAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBtQWN0aXZlSW50ZXJmYWNlOworCisgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gbVNhdmVkSW50ZXJmYWNlOworICAgIEhpZGxQcm92aWRlckluZm8oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmcHJvdmlkZXJOYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVySW5zdGFuY2UsCisgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXIgKm1hbmFnZXIpIDoKKyAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvKHByb3ZpZGVyTmFtZSwgcHJvdmlkZXJJbnN0YW5jZSwgbWFuYWdlcikge30KKworICAgIHZpcnR1YWwgfkhpZGxQcm92aWRlckluZm8oKSB7fQorCisgICAgc3RhdGljIHN0YXR1c190IG1hcFRvU3RhdHVzVChjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cyAmc3RhdHVzKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemVIaWRsUHJvdmlkZXIoCisgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLAorICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50RGV2aWNlU3RhdGUpOworCisgICAgSVBDVHJhbnNwb3J0IGdldElQQ1RyYW5zcG9ydCgpIG92ZXJyaWRlIHtyZXR1cm4gSVBDVHJhbnNwb3J0OjpISURMO30KKworICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKworICAgIHZpcnR1YWwgYm9vbCBzdWNjZXNzZnVsbHlTdGFydGVkUHJvdmlkZXJJbnRlcmZhY2UoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgaW50NjRfdCBnZXREZXZpY2VTdGF0ZSgpIG92ZXJyaWRlIHtyZXR1cm4gbURldmljZVN0YXRlO307CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVwVmVuZG9yVGFncygpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoaW50NjRfdCkgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgY2FtZXJhIHByb3ZpZGVyIGZvciBjb25jdXJyZW50IHN0cmVhbSBjb25maWd1cmF0aW9uIHN1cHBvcnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGlzQ29uY3VycmVudFNlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uPiAmY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywKKyAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24sIGJvb2wgKmlzU3VwcG9ydGVkKSBvdmVycmlkZTsKKworICAgIC8vIEhlbHBlciBmb3IgaW5pdGlhbGl6ZURldmljZUluZm8gdG8gdXNlIHRoZSByaWdodCBDYW1lcmFQcm92aWRlciBnZXQgbWV0aG9kLgorICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4KKyAgICAgICAgICAgIHN0YXJ0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZpY2VOYW1lKTsKKworICAgIC8vIElDYW1lcmFQcm92aWRlckNhbGxiYWNrcyBpbnRlcmZhY2UgLSB0aGVzZSBsb2NrIHRoZSBwYXJlbnQgbUludGVyZmFjZU11dGV4CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmICwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzICkgb3ZlcnJpZGU7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiB0b3JjaE1vZGVTdGF0dXNDaGFuZ2UoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmICwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzICkgb3ZlcnJpZGU7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZSgKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgLAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiAsCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyApIG92ZXJyaWRlOworCisgICAgLy8gaGlkbF9kZWF0aF9yZWNpcGllbnQgaW50ZXJmYWNlIC0gdGhpcyBsb2NrcyB0aGUgcGFyZW50IG1JbnRlcmZhY2VNdXRleAorICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCh1aW50NjRfdCAsIGNvbnN0IHdwPGhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgKSBvdmVycmlkZTsKKworICAgIHN0cnVjdCBIaWRsRGV2aWNlSW5mbzMgOiBwdWJsaWMgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zIHsKKworICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1WZXJzaW9uID0gaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnszLCAyfTsKKyAgICAgICAgc3A8SUJhc2U+IG1TYXZlZEludGVyZmFjZSA9IG51bGxwdHI7CisKKyAgICAgICAgSGlkbERldmljZUluZm8zKGNvbnN0IHN0ZDo6c3RyaW5nJiAsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90ICwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmLCB1aW50MTZfdCAsCisgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0JiAsCisgICAgICAgICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiAsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiAsCisgICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPik7CisKKyAgICAgICAgfkhpZGxEZXZpY2VJbmZvMygpIHt9CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB0dXJuT25Ub3JjaFdpdGhTdHJlbmd0aExldmVsKGludDMyX3QgdG9yY2hTdHJlbmd0aCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VG9yY2hTdHJlbmd0aExldmVsKGludDMyX3QgKnRvcmNoU3RyZW5ndGgpIG92ZXJyaWRlOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgb3ZlcnJpZGU7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgIGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uICYvKmNvbmZpZ3VyYXRpb24qLywKKyAgICAgICAgICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBjYW1lcmEzOjptZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICBib29sICpzdGF0dXMvKnN0YXR1cyovKTsKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBzdGFydERldmljZUludGVyZmFjZSgpOworICAgIH07CisKKyBwcml2YXRlOgorCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4gaW5pdGlhbGl6ZURldmljZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJiwKKyAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90ICwgY29uc3Qgc3RkOjpzdHJpbmcgJiwKKyAgICAgICAgICAgIHVpbnQxNl90ICkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZUNhY2hlQ29uY3VycmVudFN0cmVhbWluZ0NhbWVyYUlkc0xvY2tlZCgpIG92ZXJyaWRlOworCisgICAgLy9FeHBlY3RzIHRvIGhhdmUgbUxvY2sgbG9ja2VkCisgICAgc3RhdHVzX3QgZ2V0Q29uY3VycmVudENhbWVyYUlkc0ludGVybmFsTG9ja2VkKAorICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcj4gJik7CisKKyAgICAvL2V4cGVjdHMgdG8gaGF2ZSBtTWFuYWdlci0+bUludGVyZmFjZU11dGV4IGxvY2tlZAorICAgIHN0YXR1c190IGNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uQW5kQ2FtZXJhSWRzTG9ja2VkKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OkNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb24+JgorICAgICAgICAgICAgICAgIGNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzLAorICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsCisgICAgICAgIGludCB0YXJnZXRTZGtWZXJzaW9uLAorICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzc6OkNhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+KgorICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywKKyAgICAgICAgYm9vbCAqZWFybHlFeGl0KTsKK307IC8vIEhpZGxQcm92aWRlckluZm8KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0J1ZmZlclV0aWxzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQnVmZmVyVXRpbHMuY3BwCmluZGV4IGYzYWRmMjAuLmMwZDQ3ZDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQnVmZmVyVXRpbHMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQnVmZmVyVXRpbHMuY3BwCkBAIC0yOCwxNiArMjgsNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNhbWVyYTMgewogCi1jYW1lcmFfYnVmZmVyX3N0YXR1c190IG1hcEhpZGxCdWZmZXJTdGF0dXMoaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJTdGF0dXMgc3RhdHVzKSB7Ci0gICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJTdGF0dXM7Ci0KLSAgICBzd2l0Y2ggKHN0YXR1cykgewotICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6T0s6IHJldHVybiBDQU1FUkFfQlVGRkVSX1NUQVRVU19PSzsKLSAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OkVSUk9SOiByZXR1cm4gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUjsKLX0KLQogdm9pZCBCdWZmZXJSZWNvcmRzOjp0YWtlSW5mbGlnaHRCdWZmZXJNYXAoQnVmZmVyUmVjb3JkcyYgb3RoZXIpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gb0xvY2sob3RoZXIubUluZmxpZ2h0TG9jayk7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUluZmxpZ2h0TG9jayk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0J1ZmZlclV0aWxzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0J1ZmZlclV0aWxzLmgKaW5kZXggMWUxY2Q2MC4uOTZmYzExMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9CdWZmZXJVdGlscy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQnVmZmVyVXRpbHMuaApAQCAtMTA0LDcgKzEwNCw3IEBACiAKICAgICAgICAgLy8gUmV0dXJuIHRoZSByZW1vdmVkIGJ1ZmZlciBJRCBpZiBpbnB1dCBjYWNoZSBpcyBmb3VuZC4KICAgICAgICAgLy8gT3RoZXJ3aXNlIHJldHVybiBCVUZGRVJfSURfTk9fQlVGRkVSCi0gICAgICAgIHVpbnQ2NF90IHJlbW92ZU9uZUJ1ZmZlckNhY2hlKGludCBzdHJlYW1JZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpOworICAgICAgICB1aW50NjRfdCByZW1vdmVPbmVCdWZmZXJDYWNoZShpbnQgc3RyZWFtSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKSBvdmVycmlkZTsKIAogICAgICAgICAvLyBDbGVhciBhbGwgY2FjaGVzIGZvciBpbnB1dCBzdHJlYW0sIGJ1dCBkbyBub3QgcmVtb3ZlIHRoZSBzdHJlYW0KICAgICAgICAgLy8gUmVtb3ZlZCBidWZmZXJzJyBJRCBhcmUgcmV0dXJuZWQKQEAgLTE1NCw5ICsxNTQsNiBAQAogICAgIH07IC8vIGNsYXNzIEJ1ZmZlclJlY29yZHMKIAogICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBCVUZGRVJfSURfTk9fQlVGRkVSID0gMDsKLQotICAgIGNhbWVyYV9idWZmZXJfc3RhdHVzX3QgbWFwSGlkbEJ1ZmZlclN0YXR1cygKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzIHN0YXR1cyk7CiB9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCmluZGV4IGZkNjQ1YzcuLjdjMmYzNGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcApAQCAtNzAsMTkgKzcwLDE5IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE7Ci11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6bWV0YWRhdGE6OlYzXzY6OkNhbWVyYU1ldGFkYXRhRW51bUFuZHJvaWRTZW5zb3JQaXhlbE1vZGU7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZShjb25zdCBTdHJpbmc4ICZpZCwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcyk6CitDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlKGNvbnN0IFN0cmluZzggJmlkLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBib29sIGxlZ2FjeUNsaWVudCk6CiAgICAgICAgIG1JZChpZCksCisgICAgICAgIG1MZWdhY3lDbGllbnQobGVnYWN5Q2xpZW50KSwKICAgICAgICAgbU9wZXJhdGluZ01vZGUoTk9fTU9ERSksCiAgICAgICAgIG1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbihmYWxzZSksCiAgICAgICAgIG1TdGF0dXMoU1RBVFVTX1VOSU5JVElBTElaRUQpLAogICAgICAgICBtU3RhdHVzV2FpdGVycygwKSwKICAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHQoZmFsc2UpLAogICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMoMSksCisgICAgICAgIG1EZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUoZmFsc2UpLAogICAgICAgICBtVGltZXN0YW1wT2Zmc2V0KDApLAogICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyKDApLApAQCAtMTExLDE2NiArMTExLDEyIEBACiAgICAgcmV0dXJuIG1JZDsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwotICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKLQotICAgIEFMT0dWKCIlczogSW5pdGlhbGl6aW5nIEhJREwgZGV2aWNlIGZvciBjYW1lcmEgJXMiLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7Ci0gICAgaWYgKG1TdGF0dXMgIT0gU1RBVFVTX1VOSU5JVElBTElaRUQpIHsKLSAgICAgICAgQ0xPR0UoIkFscmVhZHkgaW5pdGlhbGl6ZWQhIik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgaWYgKG1hbmFnZXIgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotCi0gICAgc3A8SUNhbWVyYURldmljZVNlc3Npb24+IHNlc3Npb247Ci0gICAgQVRSQUNFX0JFR0lOKCJDYW1lcmFIYWw6Om9wZW5TZXNzaW9uIik7Ci0gICAgc3RhdHVzX3QgcmVzID0gbWFuYWdlci0+b3BlblNlc3Npb24obUlkLnN0cmluZygpLCB0aGlzLAotICAgICAgICAgICAgLypvdXQqLyAmc2Vzc2lvbik7Ci0gICAgQVRSQUNFX0VORCgpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgU0VUX0VSUl9MKCJDb3VsZCBub3Qgb3BlbiBjYW1lcmEgc2Vzc2lvbjogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHJlcyA9IG1hbmFnZXItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhtSWQuc3RyaW5nKCksIG1PdmVycmlkZUZvclBlcmZDbGFzcywgJm1EZXZpY2VJbmZvKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIFNFVF9FUlJfTCgiQ291bGQgbm90IHJldHJpZXZlIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3M6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgc2Vzc2lvbi0+Y2xvc2UoKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgbVN1cHBvcnROYXRpdmVab29tUmF0aW8gPSBtYW5hZ2VyLT5zdXBwb3J0TmF0aXZlWm9vbVJhdGlvKG1JZC5zdHJpbmcoKSk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7Ci0gICAgYm9vbCBpc0xvZ2ljYWwgPSBtYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEobUlkLnN0cmluZygpLCAmcGh5c2ljYWxDYW1lcmFJZHMpOwotICAgIGlmIChpc0xvZ2ljYWwpIHsKLSAgICAgICAgZm9yIChhdXRvJiBwaHlzaWNhbElkIDogcGh5c2ljYWxDYW1lcmFJZHMpIHsKLSAgICAgICAgICAgIC8vIERvIG5vdCBvdmVycmlkZSBjaGFyYWN0ZXJpc3RpY3MgZm9yIHBoeXNpY2FsIGNhbWVyYXMKLSAgICAgICAgICAgIHJlcyA9IG1hbmFnZXItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKLSAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxJZCwgLypvdmVycmlkZUZvclBlcmZDbGFzcyovZmFsc2UsICZtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBTRVRfRVJSX0woIkNvdWxkIG5vdCByZXRyaWV2ZSBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsSWQuY19zdHIoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi0+Y2xvc2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sIHVzZVByZWNvcnJlY3RBcnJheSA9Ci0gICAgICAgICAgICAgICAgICAgIERpc3RvcnRpb25NYXBwZXI6OmlzRGlzdG9ydGlvblN1cHBvcnRlZChtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKTsKLSAgICAgICAgICAgIGlmICh1c2VQcmVjb3JyZWN0QXJyYXkpIHsKLSAgICAgICAgICAgICAgICByZXMgPSBtRGlzdG9ydGlvbk1hcHBlcnNbcGh5c2ljYWxJZF0uc2V0dXBTdGF0aWNJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byByZWFkIGNhbWVyYSAlcydzIGNhbGlicmF0aW9uIGZpZWxkcyBmb3IgZGlzdG9ydGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJlY3Rpb24iLCBwaHlzaWNhbElkLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVpvb21SYXRpb01hcHBlcnNbcGh5c2ljYWxJZF0gPSBab29tUmF0aW9NYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgICZtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdLAotICAgICAgICAgICAgICAgICAgICBtU3VwcG9ydE5hdGl2ZVpvb21SYXRpbywgdXNlUHJlY29ycmVjdEFycmF5KTsKLQotICAgICAgICAgICAgaWYgKFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcigKLSAgICAgICAgICAgICAgICAgICAgbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSkpIHsKLSAgICAgICAgICAgICAgICBtVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uTWFwcGVyc1twaHlzaWNhbElkXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBVSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXIobVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlUHJlY29ycmVjdEFycmF5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWU7Ci0gICAgYXV0byByZXF1ZXN0UXVldWVSZXQgPSBzZXNzaW9uLT5nZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoCi0gICAgICAgIFsmcXVldWVdKGNvbnN0IGF1dG8mIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIHF1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4oZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBpZiAoIXF1ZXVlLT5pc1ZhbGlkKCkgfHwgcXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkhBTCByZXR1cm5zIGVtcHR5IHJlcXVlc3QgbWV0YWRhdGEgZm1xLCBub3QgdXNlIGl0Iik7Ci0gICAgICAgICAgICAgICAgcXVldWUgPSBudWxscHRyOwotICAgICAgICAgICAgICAgIC8vIGRvbid0IHVzZSB0aGUgcXVldWUgb253YXJkcy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXF1ZXN0UXVldWVSZXQuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvciB3aGVuIGdldHRpbmcgcmVxdWVzdCBtZXRhZGF0YSBmbXE6ICVzLCBub3QgdXNlIGl0IiwKLSAgICAgICAgICAgICAgICByZXF1ZXN0UXVldWVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiYgcmVzUXVldWUgPSBtUmVzdWx0TWV0YWRhdGFRdWV1ZTsKLSAgICBhdXRvIHJlc3VsdFF1ZXVlUmV0ID0gc2Vzc2lvbi0+Z2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoCi0gICAgICAgIFsmcmVzUXVldWVdKGNvbnN0IGF1dG8mIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIHJlc1F1ZXVlID0gc3RkOjptYWtlX3VuaXF1ZTxSZXN1bHRNZXRhZGF0YVF1ZXVlPihkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIGlmICghcmVzUXVldWUtPmlzVmFsaWQoKSB8fCByZXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiSEFMIHJldHVybnMgZW1wdHkgcmVzdWx0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSBpdCIpOwotICAgICAgICAgICAgICAgIHJlc1F1ZXVlID0gbnVsbHB0cjsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCB1c2UgdGhlIHJlc1F1ZXVlIG9ud2FyZHMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIGlmICghcmVzdWx0UXVldWVSZXQuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvciB3aGVuIGdldHRpbmcgcmVzdWx0IG1ldGFkYXRhIHF1ZXVlIGZyb20gY2FtZXJhIHNlc3Npb246ICVzIiwKLSAgICAgICAgICAgICAgICByZXN1bHRRdWV1ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIElGX0FMT0dWKCkgewotICAgICAgICBzZXNzaW9uLT5pbnRlcmZhY2VDaGFpbihbXSgKLSAgICAgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiBpbnRlcmZhY2VDaGFpbikgewotICAgICAgICAgICAgICAgIEFMT0dWKCJTZXNzaW9uIGludGVyZmFjZSBjaGFpbjoiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGlmYWNlIDogaW50ZXJmYWNlQ2hhaW4pIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiAgJXMiLCBpZmFjZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgYnVmTWdyTW9kZSA9Ci0gICAgICAgICAgICBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfSU5GT19TVVBQT1JURURfQlVGRkVSX01BTkFHRU1FTlRfVkVSU0lPTik7Ci0gICAgaWYgKGJ1Zk1nck1vZGUuY291bnQgPiAwKSB7Ci0gICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciA9IChidWZNZ3JNb2RlLmRhdGEudThbMF0gPT0KLSAgICAgICAgICAgIEFORFJPSURfSU5GT19TVVBQT1JURURfQlVGRkVSX01BTkFHRU1FTlRfVkVSU0lPTl9ISURMX0RFVklDRV8zXzUpOwotICAgIH0KLQotICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGNhcGFiaWxpdGllcyA9IG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwYWJpbGl0aWVzLmNvdW50OyBpKyspIHsKLSAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gY2FwYWJpbGl0aWVzLmRhdGEudThbaV07Ci0gICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX09GRkxJTkVfUFJPQ0VTU0lORykgewotICAgICAgICAgICAgbVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtSW50ZXJmYWNlID0gbmV3IEhhbEludGVyZmFjZShzZXNzaW9uLCBxdWV1ZSwgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpOwotICAgIHN0ZDo6c3RyaW5nIHByb3ZpZGVyVHlwZTsKLSAgICBtVmVuZG9yVGFnSWQgPSBtYW5hZ2VyLT5nZXRQcm92aWRlclRhZ0lkTG9ja2VkKG1JZC5zdHJpbmcoKSk7Ci0gICAgbVRhZ01vbml0b3IuaW5pdGlhbGl6ZShtVmVuZG9yVGFnSWQpOwotICAgIGlmICghbW9uaXRvclRhZ3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgIG1UYWdNb25pdG9yLnBhcnNlVGFnc1RvTW9uaXRvcihTdHJpbmc4KG1vbml0b3JUYWdzKSk7Ci0gICAgfQotCi0gICAgLy8gTWV0YWRhdGEgdGFncyBuZWVkcyBmaXh1cCBmb3IgbW9ub2Nocm9tZSBjYW1lcmEgZGV2aWNlIHZlcnNpb24gbGVzcwotICAgIC8vIHRoYW4gMy41LgotICAgIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbWF4VmVyc2lvbnswLDB9OwotICAgIHJlcyA9IG1hbmFnZXItPmdldEhpZ2hlc3RTdXBwb3J0ZWRWZXJzaW9uKG1JZC5zdHJpbmcoKSwgJm1heFZlcnNpb24pOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBpbiBnZXR0aW5nIGNhbWVyYSBkZXZpY2UgdmVyc2lvbiBpZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgaW50IGRldmljZVZlcnNpb24gPSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oCi0gICAgICAgICAgICBtYXhWZXJzaW9uLmdldF9tYWpvcigpLCBtYXhWZXJzaW9uLmdldF9taW5vcigpKTsKLQotICAgIGJvb2wgaXNNb25vY2hyb21lID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBhYmlsaXRpZXMuY291bnQ7IGkrKykgewotICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBjYXBhYmlsaXRpZXMuZGF0YS51OFtpXTsKLSAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSkgewotICAgICAgICAgICAgaXNNb25vY2hyb21lID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MgPSAoaXNNb25vY2hyb21lICYmIGRldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNSk7Ci0KLSAgICByZXR1cm4gaW5pdGlhbGl6ZUNvbW1vbkxvY2tlZCgpOwotfQotCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjppbml0aWFsaXplQ29tbW9uTG9ja2VkKCkgewogCisgICAgLyoqIFN0YXJ0IHdhdGNoZG9nIHRocmVhZCAqLworICAgIG1DYW1lcmFTZXJ2aWNlV2F0Y2hkb2cgPSBuZXcgQ2FtZXJhU2VydmljZVdhdGNoZG9nKCk7CisgICAgbUNhbWVyYVNlcnZpY2VXYXRjaGRvZy0+cnVuKCJDYW1lcmFTZXJ2aWNlV2F0Y2hkb2ciKTsKKwogICAgIC8qKiBTdGFydCB1cCBzdGF0dXMgdHJhY2tlciB0aHJlYWQgKi8KICAgICBtU3RhdHVzVHJhY2tlciA9IG5ldyBTdGF0dXNUcmFja2VyKHRoaXMpOwogICAgIHN0YXR1c190IHJlcyA9IG1TdGF0dXNUcmFja2VyLT5ydW4oU3RyaW5nODo6Zm9ybWF0KCJDM0Rldi0lcy1TdGF0dXMiLCBtSWQuc3RyaW5nKCkpLnN0cmluZygpKTsKQEAgLTMyMiw3ICsxNjgsNyBAQAogICAgIH0KIAogICAgIC8qKiBTdGFydCB1cCByZXF1ZXN0IHF1ZXVlIHRocmVhZCAqLwotICAgIG1SZXF1ZXN0VGhyZWFkID0gbmV3IFJlcXVlc3RUaHJlYWQoCisgICAgbVJlcXVlc3RUaHJlYWQgPSBjcmVhdGVOZXdSZXF1ZXN0VGhyZWFkKAogICAgICAgICAgICAgdGhpcywgbVN0YXR1c1RyYWNrZXIsIG1JbnRlcmZhY2UsIHNlc3Npb25QYXJhbUtleXMsCiAgICAgICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVN1cHBvcnRDYW1lcmFNdXRlKTsKICAgICByZXMgPSBtUmVxdWVzdFRocmVhZC0+cnVuKFN0cmluZzg6OmZvcm1hdCgiQzNEZXYtJXMtUmVxUXVldWUiLCBtSWQuc3RyaW5nKCkpLnN0cmluZygpKTsKQEAgLTM0NCwxMSArMTkwLDEyIEBACiAgICAgbUlzSW5wdXRTdHJlYW1NdWx0aVJlc29sdXRpb24gPSBmYWxzZTsKIAogICAgIC8vIE1lYXN1cmUgdGhlIGNsb2NrIGRvbWFpbiBvZmZzZXQgYmV0d2VlbiBjYW1lcmEgYW5kIHZpZGVvL2h3X2NvbXBvc2VyCisgICAgbVRpbWVzdGFtcE9mZnNldCA9IGdldE1vbm9Ub0Jvb3R0aW1lT2Zmc2V0KCk7CiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHRpbWVzdGFtcFNvdXJjZSA9CiAgICAgICAgICAgICBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfU0VOU09SX0lORk9fVElNRVNUQU1QX1NPVVJDRSk7CiAgICAgaWYgKHRpbWVzdGFtcFNvdXJjZS5jb3VudCA+IDAgJiYgdGltZXN0YW1wU291cmNlLmRhdGEudThbMF0gPT0KICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0lORk9fVElNRVNUQU1QX1NPVVJDRV9SRUFMVElNRSkgewotICAgICAgICBtVGltZXN0YW1wT2Zmc2V0ID0gZ2V0TW9ub1RvQm9vdHRpbWVPZmZzZXQoKTsKKyAgICAgICAgbURldmljZVRpbWVCYXNlSXNSZWFsdGltZSA9IHRydWU7CiAgICAgfQogCiAgICAgLy8gV2lsbCB0aGUgSEFMIGJlIHNlbmRpbmcgaW4gZWFybHkgcGFydGlhbCByZXN1bHQgbWV0YWRhdGE/CkBAIC0zODAsNyArMjI3LDggQEAKICAgICAgICAgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLmVtcGxhY2UobUlkLmNfc3RyKCksICZtRGV2aWNlSW5mbyk7CiAgICAgfQogCi0gICAgbUluamVjdGlvbk1ldGhvZHMgPSBuZXcgQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHModGhpcyk7CisgICAgLy8gSGlkbC9BaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMKKyAgICBtSW5qZWN0aW9uTWV0aG9kcyA9IGNyZWF0ZUNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKHRoaXMpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNDcwLDcgKzMxOCw3IEBACiAKICAgICAgICAgLy8gQ2FsbCBjbG9zZSB3aXRob3V0IGludGVybmFsIG11dGV4IGhlbGQsIGFzIHRoZSBIQUwgY2xvc2UgbWF5IG5lZWQgdG8KICAgICAgICAgLy8gd2FpdCBvbiBhc3NvcnRlZCBjYWxsYmFja3MsZXRjLCB0byBjb21wbGV0ZSBiZWZvcmUgaXQgY2FuIHJldHVybi4KLSAgICAgICAgaW50ZXJmYWNlLT5jbG9zZSgpOworICAgICAgICBtQ2FtZXJhU2VydmljZVdhdGNoZG9nLT5XQVRDSChpbnRlcmZhY2UtPmNsb3NlKCkpOwogCiAgICAgICAgIGZsdXNoSW5mbGlnaHRSZXF1ZXN0cygpOwogCkBAIC00OTMsNiArMzQxLDEyIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgQUxPR0koIiVzOiBYIiwgX19GVU5DVElPTl9fKTsKKworICAgIGlmIChtQ2FtZXJhU2VydmljZVdhdGNoZG9nICE9IE5VTEwpIHsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2VXYXRjaGRvZy0+cmVxdWVzdEV4aXQoKTsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2VXYXRjaGRvZy5jbGVhcigpOworICAgIH0KKwogICAgIHJldHVybiByZXM7CiB9CiAKQEAgLTUzMCw4NiArMzg0LDE2IEBACiAgICAgcmV0dXJuIG1lYXN1cmVkOwogfQogCi1oYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdCgKLSAgICAgICAgaW50IGZyYW1ld29ya0Zvcm1hdCkgewotICAgIHJldHVybiAoaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0KSBmcmFtZXdvcmtGb3JtYXQ7Ci19Ci0KLURhdGFzcGFjZUZsYWdzIENhbWVyYTNEZXZpY2U6Om1hcFRvSGlkbERhdGFzcGFjZSgKLSAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKSB7Ci0gICAgcmV0dXJuIGRhdGFTcGFjZTsKLX0KLQotQnVmZmVyVXNhZ2VGbGFncyBDYW1lcmEzRGV2aWNlOjptYXBUb0NvbnN1bWVyVXNhZ2UoCi0gICAgICAgIHVpbnQ2NF90IHVzYWdlKSB7Ci0gICAgcmV0dXJuIHVzYWdlOwotfQotCi1TdHJlYW1Sb3RhdGlvbiBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbVJvdGF0aW9uKGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbikgewotICAgIHN3aXRjaCAocm90YXRpb24pIHsKLSAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzA6Ci0gICAgICAgICAgICByZXR1cm4gU3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzA7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl85MDoKLSAgICAgICAgICAgIHJldHVybiBTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fOTA7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl8xODA6Ci0gICAgICAgICAgICByZXR1cm4gU3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzE4MDsKLSAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzI3MDoKLSAgICAgICAgICAgIHJldHVybiBTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMjcwOwotICAgIH0KLSAgICBBTE9HRSgiJXM6IFVua25vd24gc3RyZWFtIHJvdGF0aW9uICVkIiwgX19GVU5DVElPTl9fLCByb3RhdGlvbik7Ci0gICAgcmV0dXJuIFN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8wOwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAotICAgICAgICBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90IG9wZXJhdGlvbk1vZGUsIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKSB7Ci0gICAgaWYgKG1vZGUgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBpZiAob3BlcmF0aW9uTW9kZSA8IENBTUVSQV9WRU5ET1JfU1RSRUFNX0NPTkZJR1VSQVRJT05fTU9ERV9TVEFSVCkgewotICAgICAgICBzd2l0Y2gob3BlcmF0aW9uTW9kZSkgewotICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0NPTkZJR1VSQVRJT05fTk9STUFMX01PREU6Ci0gICAgICAgICAgICAgICAgKm1vZGUgPSBTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Tk9STUFMX01PREU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREU6Ci0gICAgICAgICAgICAgICAgKm1vZGUgPSBTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gc3RyZWFtIGNvbmZpZ3VyYXRpb24gbW9kZSAlZCIsIF9fRlVOQ1RJT05fXywgb3BlcmF0aW9uTW9kZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgICptb2RlID0gc3RhdGljX2Nhc3Q8U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU+KG9wZXJhdGlvbk1vZGUpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWludCBDYW1lcmEzRGV2aWNlOjptYXBUb0ZyYW1ld29ya0Zvcm1hdCgKLSAgICAgICAgaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihwaXhlbEZvcm1hdCk7Ci19Ci0KLWFuZHJvaWRfZGF0YXNwYWNlIENhbWVyYTNEZXZpY2U6Om1hcFRvRnJhbWV3b3JrRGF0YXNwYWNlKAotICAgICAgICBEYXRhc3BhY2VGbGFncyBkYXRhU3BhY2UpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KGRhdGFTcGFjZSk7Ci19Ci0KLXVpbnQ2NF90IENhbWVyYTNEZXZpY2U6Om1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZSgKLSAgICAgICAgQnVmZmVyVXNhZ2VGbGFncyB1c2FnZSkgewotICAgIHJldHVybiB1c2FnZTsKLX0KLQotdWludDY0X3QgQ2FtZXJhM0RldmljZTo6bWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAotICAgICAgICBCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKSB7Ci0gICAgcmV0dXJuIHVzYWdlOwotfQotCi1zc2l6ZV90IENhbWVyYTNEZXZpY2U6OmdldEpwZWdCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKK3NzaXplX3QgQ2FtZXJhM0RldmljZTo6Z2V0SnBlZ0J1ZmZlclNpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmluZm8sIHVpbnQzMl90IHdpZHRoLAorICAgICAgICB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKICAgICAvLyBHZXQgbWF4IGpwZWcgc2l6ZSAoYXJlYS13aXNlKSBmb3IgZGVmYXVsdCBzZW5zb3IgcGl4ZWwgbW9kZQogICAgIGNhbWVyYTM6OlNpemUgbWF4RGVmYXVsdEpwZWdSZXNvbHV0aW9uID0KLSAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldE1heEpwZWdSZXNvbHV0aW9uKG1EZXZpY2VJbmZvLAorICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0TWF4SnBlZ1Jlc29sdXRpb24oaW5mbywKICAgICAgICAgICAgICAgICAgICAgLyppc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IqL2ZhbHNlKTsKICAgICAvLyBHZXQgbWF4IGpwZWcgc2l6ZSAoYXJlYS13aXNlKSBmb3IgbWF4IHJlc29sdXRpb24gc2Vuc29yIHBpeGVsIG1vZGUgLyAwIGlmCiAgICAgLy8gbm90IHVsdHJhIGhpZ2ggcmVzIHNlbnNvcgogICAgIGNhbWVyYTM6OlNpemUgdWhyTWF4SnBlZ1Jlc29sdXRpb24gPQotICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0TWF4SnBlZ1Jlc29sdXRpb24obURldmljZUluZm8sCisgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRNYXhKcGVnUmVzb2x1dGlvbihpbmZvLAogICAgICAgICAgICAgICAgICAgICAvKmlzVWx0cmFIaWdoUmVzb2x1dGlvbiovdHJ1ZSk7CiAgICAgaWYgKG1heERlZmF1bHRKcGVnUmVzb2x1dGlvbi53aWR0aCA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBDYW4ndCBmaW5kIHZhbGlkIGF2YWlsYWJsZSBqcGVnIHNpemVzIGluIHN0YXRpYyBtZXRhZGF0YSEiLApAQCAtNjI1LDcgKzQwOSw3IEBACiAKICAgICAvLyBHZXQgbWF4IGpwZWcgYnVmZmVyIHNpemUKICAgICBzc2l6ZV90IG1heEpwZWdCdWZmZXJTaXplID0gMDsKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkganBlZ0J1Zk1heFNpemUgPSBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfSlBFR19NQVhfU0laRSk7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGpwZWdCdWZNYXhTaXplID0gaW5mby5maW5kKEFORFJPSURfSlBFR19NQVhfU0laRSk7CiAgICAgaWYgKGpwZWdCdWZNYXhTaXplLmNvdW50ID09IDApIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXM6IENhbid0IGZpbmQgbWF4aW11bSBKUEVHIHNpemUgaW4gc3RhdGljIG1ldGFkYXRhISIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBtSWQuc3RyaW5nKCkpOwpAQCAtNjU1LDkgKzQzOSw5IEBACiAgICAgcmV0dXJuIGpwZWdCdWZmZXJTaXplOwogfQogCi1zc2l6ZV90IENhbWVyYTNEZXZpY2U6OmdldFBvaW50Q2xvdWRCdWZmZXJTaXplKCkgY29uc3Qgeworc3NpemVfdCBDYW1lcmEzRGV2aWNlOjpnZXRQb2ludENsb3VkQnVmZmVyU2l6ZShjb25zdCBDYW1lcmFNZXRhZGF0YSAmaW5mbykgY29uc3QgewogICAgIGNvbnN0IGludCBGTE9BVFNfUEVSX1BPSU5UPTQ7Ci0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IG1heFBvaW50Q291bnQgPSBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfREVQVEhfTUFYX0RFUFRIX1NBTVBMRVMpOworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBtYXhQb2ludENvdW50ID0gaW5mby5maW5kKEFORFJPSURfREVQVEhfTUFYX0RFUFRIX1NBTVBMRVMpOwogICAgIGlmIChtYXhQb2ludENvdW50LmNvdW50ID09IDApIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXM6IENhbid0IGZpbmQgbWF4aW11bSBkZXB0aCBwb2ludCBjbG91ZCBzaXplIGluIHN0YXRpYyBtZXRhZGF0YSEiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKQEAgLTY2OCwxNCArNDUyLDE0IEBACiAgICAgcmV0dXJuIG1heEJ5dGVzRm9yUG9pbnRDbG91ZDsKIH0KIAotc3NpemVfdCBDYW1lcmEzRGV2aWNlOjpnZXRSYXdPcGFxdWVCdWZmZXJTaXplKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICBib29sIG1heFJlc29sdXRpb24pIGNvbnN0IHsKK3NzaXplX3QgQ2FtZXJhM0RldmljZTo6Z2V0UmF3T3BhcXVlQnVmZmVyU2l6ZShjb25zdCBDYW1lcmFNZXRhZGF0YSAmaW5mbywgaW50MzJfdCB3aWR0aCwKKyAgICAgICAgaW50MzJfdCBoZWlnaHQsIGJvb2wgbWF4UmVzb2x1dGlvbikgY29uc3QgewogICAgIGNvbnN0IGludCBQRVJfQ09ORklHVVJBVElPTl9TSVpFID0gMzsKICAgICBjb25zdCBpbnQgV0lEVEhfT0ZGU0VUID0gMDsKICAgICBjb25zdCBpbnQgSEVJR0hUX09GRlNFVCA9IDE7CiAgICAgY29uc3QgaW50IFNJWkVfT0ZGU0VUID0gMjsKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgcmF3T3BhcXVlU2l6ZXMgPQotICAgICAgICBtRGV2aWNlSW5mby5maW5kKAorICAgICAgICBpbmZvLmZpbmQoCiAgICAgICAgICAgICBjYW1lcmEzOjpTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcHByb3ByaWF0ZU1vZGVUYWcoCiAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX09QQVFVRV9SQVdfU0laRSwKICAgICAgICAgICAgICAgICAgICAgbWF4UmVzb2x1dGlvbikpOwpAQCAtNzUyLDEwICs1MzYsOSBAQAogICAgIH0KICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICBTdHJlYW0gY29uZmlndXJhdGlvbjpcbiIpOwogICAgIGNvbnN0IGNoYXIgKm1vZGUgPQotICAgICAgICAgICAgbU9wZXJhdGluZ01vZGUgPT0gc3RhdGljX2Nhc3Q8aW50PihTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Tk9STUFMX01PREUpID8gIk5PUk1BTCIgOgotICAgICAgICAgICAgbU9wZXJhdGluZ01vZGUgPT0gc3RhdGljX2Nhc3Q8aW50PigKLSAgICAgICAgICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFKSA/ICJDT05TVFJBSU5FRF9ISUdIX1NQRUVEIiA6Ci0gICAgICAgICAgICAiQ1VTVE9NIjsKKyAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlID09IENBTUVSQV9TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERSA/ICJOT1JNQUwiIDoKKyAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlID09IENBTUVSQV9TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUgPworICAgICAgICAgICAgICAgICAgICAiQ09OU1RSQUlORURfSElHSF9TUEVFRCIgOiAiQ1VTVE9NIjsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICBPcGVyYXRpb24gbW9kZTogJXMgKCVkKSBcbiIsIG1vZGUsIG1PcGVyYXRpbmdNb2RlKTsKIAogICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gTlVMTCkgewpAQCAtODQ4LDYgKzYzMSwyMSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c3RhcnRXYXRjaGluZ1RhZ3MoY29uc3QgU3RyaW5nOCAmdGFncykgeworICAgIG1UYWdNb25pdG9yLnBhcnNlVGFnc1RvTW9uaXRvcih0YWdzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnN0b3BXYXRjaGluZ1RhZ3MoKSB7CisgICAgbVRhZ01vbml0b3IuZGlzYWJsZU1vbml0b3JpbmcoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3Ioc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZvdXQpIHsKKyAgICBtVGFnTW9uaXRvci5nZXRMYXRlc3RNb25pdG9yZWRUYWdFdmVudHMob3V0KTsKKyAgICByZXR1cm4gT0s7Cit9CisKIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBDYW1lcmEzRGV2aWNlOjppbmZvUGh5c2ljYWwoY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxJZCkgY29uc3QgewogICAgIEFMT0dWVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogICAgIGlmIChDQ19VTkxJS0VMWShtU3RhdHVzID09IFNUQVRVU19VTklOSVRJQUxJWkVEIHx8CkBAIC0xMDI3LDE3NiArODI1LDYgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6OnJlcXVlc3RTdHJlYW1CdWZmZXJzKAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKLSAgICAgICAgcmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IgX2hpZGxfY2IpIHsKLSAgICBSZXF1ZXN0QnVmZmVyU3RhdGVzIHN0YXRlcyB7Ci0gICAgICAgIG1JZCwgbVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLAotICAgICAgICAqdGhpcywgKm1JbnRlcmZhY2UsICp0aGlzfTsKLSAgICBjYW1lcmEzOjpyZXF1ZXN0U3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZlJlcXMsIF9oaWRsX2NiKTsKLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQotaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpyZXR1cm5TdHJlYW1CdWZmZXJzKAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7Ci0gICAgUmV0dXJuQnVmZmVyU3RhdGVzIHN0YXRlcyB7Ci0gICAgICAgIG1JZCwgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgKm1JbnRlcmZhY2V9OwotICAgIGNhbWVyYTM6OnJldHVyblN0cmVhbUJ1ZmZlcnMoc3RhdGVzLCBidWZmZXJzKTsKLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQotaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7Ci0gICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgZ3JhYiBtTG9jaywgYnV0IHRoYXQgY2FuIGxlYWQgdG8gZGVhZGxvY2ssIGFuZAotICAgIC8vIGl0J3Mgbm90IHN1cGVyIGltcG9ydGFudCB0byBnZXQgdXAgdG8gZGF0ZSB2YWx1ZSBvZiBtU3RhdHVzIGZvciB0aGlzCi0gICAgLy8gd2FybmluZyBwcmludCwgaGVuY2Ugc2tpcHBpbmcgdGhlIGxvY2sgaGVyZQotICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19FUlJPUikgewotICAgICAgICAvLyBQZXIgQVBJIGNvbnRyYWN0LCBIQUwgc2hvdWxkIGFjdCBhcyBjbG9zZWQgYWZ0ZXIgZGV2aWNlIGVycm9yCi0gICAgICAgIC8vIEJ1dCBtU3RhdHVzIGNhbiBiZSBzZXQgdG8gZXJyb3IgYnkgZnJhbWV3b3JrIGFzIHdlbGwsIHNvIGp1c3QgbG9nCi0gICAgICAgIC8vIGEgd2FybmluZyBoZXJlLgotICAgICAgICBBTE9HVygiJXM6IHJlY2VpdmVkIGNhcHR1cmUgcmVzdWx0IGluIGVycm9yIHN0YXRlLiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotCi0gICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobU91dHB1dExvY2spOwotICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7Ci0gICAgfQotCi0gICAgaWYgKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudHJ5TG9jaygpICE9IE9LKSB7Ci0gICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbjsgaXQgaW5kaWNhdGVzIGEgd3JvbmcgY2xpZW50IGltcGxlbWVudGF0aW9uCi0gICAgICAgIC8vIHRoYXQgZG9lc24ndCBmb2xsb3cgdGhlIGNvbnRyYWN0LiBCdXQsIHdlIGNhbiBiZSB0b2xlcmFudCBoZXJlLgotICAgICAgICBBTE9HRSgiJXM6IGNhbGxiYWNrIG92ZXJsYXBwZWQhIHdhaXRpbmcgMXMuLi4iLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGlmIChtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnRpbWVkTG9jaygxMDAwMDAwMDAwIC8qIDFzICovKSAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgYWNxdWlyZSBsb2NrIGluIDFzLCBkcm9wcGluZyByZXN1bHRzIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIC8vIHJlYWxseSBkb24ndCBrbm93IHdoYXQgdG8gZG8sIHNvIGJhaWwgb3V0LgotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ2FwdHVyZU91dHB1dFN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsCi0gICAgICAgIG1JbkZsaWdodExvY2ssIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAotICAgICAgICBtTGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyLCBtTGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyLAotICAgICAgICBtSW5GbGlnaHRNYXAsIG1PdXRwdXRMb2NrLCAgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAotICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKLSAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCi0gICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKLSAgICAgICAgbVJlc3VsdE1ldGFkYXRhUXVldWUsIG1EaXN0b3J0aW9uTWFwcGVycywgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycywKLSAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAotICAgICAgICAqbUludGVyZmFjZQotICAgIH07Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIHJlc3VsdCA6IHJlc3VsdHMpIHsKLSAgICAgICAgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoc3RhdGVzLCByZXN1bHQudjNfMiwgcmVzdWx0LnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOwotICAgIH0KLSAgICBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnVubG9jaygpOwotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotfQotCi0vLyBPbmx5IG9uZSBwcm9jZXNzQ2FwdHVyZVJlc3VsdCBzaG91bGQgYmUgY2FsbGVkIGF0IGEgdGltZSwgc28KLS8vIHRoZSBsb2NrcyB3b24ndCBibG9jay4gVGhlIGxvY2tzIGFyZSBwcmVzZW50IGhlcmUgc2ltcGx5IHRvIGVuZm9yY2UgdGhpcy4KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM0RldmljZTo6cHJvY2Vzc0NhcHR1cmVSZXN1bHQoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7Ci0gICAgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4gbm9QaHlzTWV0YWRhdGE7Ci0KLSAgICAvLyBJZGVhbGx5IHdlIHNob3VsZCBncmFiIG1Mb2NrLCBidXQgdGhhdCBjYW4gbGVhZCB0byBkZWFkbG9jaywgYW5kCi0gICAgLy8gaXQncyBub3Qgc3VwZXIgaW1wb3J0YW50IHRvIGdldCB1cCB0byBkYXRlIHZhbHVlIG9mIG1TdGF0dXMgZm9yIHRoaXMKLSAgICAvLyB3YXJuaW5nIHByaW50LCBoZW5jZSBza2lwcGluZyB0aGUgbG9jayBoZXJlCi0gICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX0VSUk9SKSB7Ci0gICAgICAgIC8vIFBlciBBUEkgY29udHJhY3QsIEhBTCBzaG91bGQgYWN0IGFzIGNsb3NlZCBhZnRlciBkZXZpY2UgZXJyb3IKLSAgICAgICAgLy8gQnV0IG1TdGF0dXMgY2FuIGJlIHNldCB0byBlcnJvciBieSBmcmFtZXdvcmsgYXMgd2VsbCwgc28ganVzdCBsb2cKLSAgICAgICAgLy8gYSB3YXJuaW5nIGhlcmUuCi0gICAgICAgIEFMT0dXKCIlczogcmVjZWl2ZWQgY2FwdHVyZSByZXN1bHQgaW4gZXJyb3Igc3RhdGUuIiwgX19GVU5DVElPTl9fKTsKLSAgICB9Ci0KLSAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChtT3V0cHV0TG9jayk7Ci0gICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKLSAgICB9Ci0KLSAgICBpZiAobVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay50cnlMb2NrKCkgIT0gT0spIHsKLSAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuOyBpdCBpbmRpY2F0ZXMgYSB3cm9uZyBjbGllbnQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgLy8gdGhhdCBkb2Vzbid0IGZvbGxvdyB0aGUgY29udHJhY3QuIEJ1dCwgd2UgY2FuIGJlIHRvbGVyYW50IGhlcmUuCi0gICAgICAgIEFMT0dFKCIlczogY2FsbGJhY2sgb3ZlcmxhcHBlZCEgd2FpdGluZyAxcy4uLiIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgaWYgKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudGltZWRMb2NrKDEwMDAwMDAwMDAgLyogMXMgKi8pICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBhY3F1aXJlIGxvY2sgaW4gMXMsIGRyb3BwaW5nIHJlc3VsdHMiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgLy8gcmVhbGx5IGRvbid0IGtub3cgd2hhdCB0byBkbywgc28gYmFpbCBvdXQuCi0gICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENhcHR1cmVPdXRwdXRTdGF0ZXMgc3RhdGVzIHsKLSAgICAgICAgbUlkLAotICAgICAgICBtSW5GbGlnaHRMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKLSAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKLSAgICAgICAgbUluRmxpZ2h0TWFwLCBtT3V0cHV0TG9jaywgIG1SZXN1bHRRdWV1ZSwgbVJlc3VsdFNpZ25hbCwKLSAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIsCi0gICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtVXNlUGFydGlhbFJlc3VsdCwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAotICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMsIG1WZW5kb3JUYWdJZCwgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsCi0gICAgICAgIG1SZXN1bHRNZXRhZGF0YVF1ZXVlLCBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCi0gICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywKLSAgICAgICAgKm1JbnRlcmZhY2UKLSAgICB9OwotCi0gICAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgICAgIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKHN0YXRlcywgcmVzdWx0LCBub1BoeXNNZXRhZGF0YSk7Ci0gICAgfQotICAgIG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudW5sb2NrKCk7Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM0RldmljZTo6bm90aWZ5KAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpOb3RpZnlNc2c+JiBtc2dzKSB7Ci0gICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgZ3JhYiBtTG9jaywgYnV0IHRoYXQgY2FuIGxlYWQgdG8gZGVhZGxvY2ssIGFuZAotICAgIC8vIGl0J3Mgbm90IHN1cGVyIGltcG9ydGFudCB0byBnZXQgdXAgdG8gZGF0ZSB2YWx1ZSBvZiBtU3RhdHVzIGZvciB0aGlzCi0gICAgLy8gd2FybmluZyBwcmludCwgaGVuY2Ugc2tpcHBpbmcgdGhlIGxvY2sgaGVyZQotICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19FUlJPUikgewotICAgICAgICAvLyBQZXIgQVBJIGNvbnRyYWN0LCBIQUwgc2hvdWxkIGFjdCBhcyBjbG9zZWQgYWZ0ZXIgZGV2aWNlIGVycm9yCi0gICAgICAgIC8vIEJ1dCBtU3RhdHVzIGNhbiBiZSBzZXQgdG8gZXJyb3IgYnkgZnJhbWV3b3JrIGFzIHdlbGwsIHNvIGp1c3QgbG9nCi0gICAgICAgIC8vIGEgd2FybmluZyBoZXJlLgotICAgICAgICBBTE9HVygiJXM6IHJlY2VpdmVkIG5vdGlmeSBtZXNzYWdlIGluIGVycm9yIHN0YXRlLiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotCi0gICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobU91dHB1dExvY2spOwotICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7Ci0gICAgfQotCi0gICAgQ2FwdHVyZU91dHB1dFN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsCi0gICAgICAgIG1JbkZsaWdodExvY2ssIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAotICAgICAgICBtTGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyLCBtTGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyLAotICAgICAgICBtSW5GbGlnaHRNYXAsIG1PdXRwdXRMb2NrLCAgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAotICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKLSAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCi0gICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKLSAgICAgICAgbVJlc3VsdE1ldGFkYXRhUXVldWUsIG1EaXN0b3J0aW9uTWFwcGVycywgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycywKLSAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAotICAgICAgICAqbUludGVyZmFjZQotICAgIH07Ci0gICAgZm9yIChjb25zdCBhdXRvJiBtc2cgOiBtc2dzKSB7Ci0gICAgICAgIGNhbWVyYTM6Om5vdGlmeShzdGF0ZXMsIG1zZyk7Ci0gICAgfQotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotfQotCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiAmcmVxdWVzdHNMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PGNvbnN0IFN1cmZhY2VNYXA+ICZzdXJmYWNlTWFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewpAQCAtMTM1Nyw3ICs5ODUsOCBAQAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24sCi0gICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlKSB7CisgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUsIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwKKyAgICAgICAgICAgIGludCB0aW1lc3RhbXBCYXNlLCBpbnQgbWlycm9yTW9kZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBpZiAoY29uc3VtZXIgPT0gbnVsbHB0cikgewpAQCAtMTM3MCw3ICs5OTksOCBAQAogCiAgICAgcmV0dXJuIGNyZWF0ZVN0cmVhbShjb25zdW1lcnMsIC8qaGFzRGVmZXJyZWRDb25zdW1lciovIGZhbHNlLCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLCBpZCwgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHN1cmZhY2VJZHMsCi0gICAgICAgICAgICBzdHJlYW1TZXRJZCwgaXNTaGFyZWQsIGlzTXVsdGlSZXNvbHV0aW9uLCBjb25zdW1lclVzYWdlKTsKKyAgICAgICAgICAgIHN0cmVhbVNldElkLCBpc1NoYXJlZCwgaXNNdWx0aVJlc29sdXRpb24sIGNvbnN1bWVyVXNhZ2UsIGR5bmFtaWNSYW5nZVByb2ZpbGUsCisgICAgICAgICAgICBzdHJlYW1Vc2VDYXNlLCB0aW1lc3RhbXBCYXNlLCBtaXJyb3JNb2RlKTsKIH0KIAogc3RhdGljIGJvb2wgaXNSYXdGb3JtYXQoaW50IGZvcm1hdCkgewpAQCAtMTM5MCwxNiArMTAyMCwyMCBAQAogICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uLAotICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlKSB7CisgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSwgaW50NjRfdCBzdHJlYW1Vc2VDYXNlLAorICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSwgaW50IG1pcnJvck1vZGUpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24gPSBnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgQUxPR1YoIkNhbWVyYSAlczogQ3JlYXRpbmcgbmV3IHN0cmVhbSAlZDogJWQgeCAlZCwgZm9ybWF0ICVkLCBkYXRhc3BhY2UgJWQgcm90YXRpb24gJWQiCi0gICAgICAgICAgICAiIGNvbnN1bWVyIHVzYWdlICUiIFBSSXU2NCAiLCBpc1NoYXJlZCAlZCwgcGh5c2ljYWxDYW1lcmFJZCAlcywgaXNNdWx0aVJlc29sdXRpb24gJWQiLAorICAgICAgICAgICAgIiBjb25zdW1lciB1c2FnZSAlIiBQUkl1NjQgIiwgaXNTaGFyZWQgJWQsIHBoeXNpY2FsQ2FtZXJhSWQgJXMsIGlzTXVsdGlSZXNvbHV0aW9uICVkIgorICAgICAgICAgICAgIiBkeW5hbWljUmFuZ2VQcm9maWxlIDB4JSIgUFJJeDY0ICIsIHN0cmVhbVVzZUNhc2UgJSIgUFJJZDY0ICIsIHRpbWVzdGFtcEJhc2UgJWQsIgorICAgICAgICAgICAgIiBtaXJyb3JNb2RlICVkIiwKICAgICAgICAgICAgIG1JZC5zdHJpbmcoKSwgbU5leHRTdHJlYW1JZCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgY29uc3VtZXJVc2FnZSwgaXNTaGFyZWQsIHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCksIGlzTXVsdGlSZXNvbHV0aW9uKTsKKyAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UsIGlzU2hhcmVkLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpLCBpc011bHRpUmVzb2x1dGlvbiwKKyAgICAgICAgICAgIGR5bmFtaWNSYW5nZVByb2ZpbGUsIHN0cmVhbVVzZUNhc2UsIHRpbWVzdGFtcEJhc2UsIG1pcnJvck1vZGUpOwogCiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGJvb2wgd2FzQWN0aXZlID0gZmFsc2U7CkBAIC0xNDQ4LDEwICsxMDgyLDExIEBACiAgICAgICAgIEFMT0dFKCIlczogUkFXIG9wYXF1ZSBzdHJlYW0gY2Fubm90IGJlIHVzZWQgd2l0aCA+IDEgc2Vuc29yIHBpeGVsIG1vZGVzIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCA9IGdldFRyYW5zcG9ydFR5cGUoKTsKICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewogICAgICAgICBzc2l6ZV90IGJsb2JCdWZmZXJTaXplOwogICAgICAgICBpZiAoZGF0YVNwYWNlID09IEhBTF9EQVRBU1BBQ0VfREVQVEgpIHsKLSAgICAgICAgICAgIGJsb2JCdWZmZXJTaXplID0gZ2V0UG9pbnRDbG91ZEJ1ZmZlclNpemUoKTsKKyAgICAgICAgICAgIGJsb2JCdWZmZXJTaXplID0gZ2V0UG9pbnRDbG91ZEJ1ZmZlclNpemUoaW5mb1BoeXNpY2FsKHBoeXNpY2FsQ2FtZXJhSWQpKTsKICAgICAgICAgICAgIGlmIChibG9iQnVmZmVyU2l6ZSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIHBvaW50IGNsb3VkIGJ1ZmZlciBzaXplICV6ZCIsIGJsb2JCdWZmZXJTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMTQ1OSw3ICsxMDk0LDcgQEAKICAgICAgICAgfSBlbHNlIGlmIChkYXRhU3BhY2UgPT0gc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSlBFR19BUFBfU0VHTUVOVFMpKSB7CiAgICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IHdpZHRoICogaGVpZ2h0OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYmxvYkJ1ZmZlclNpemUgPSBnZXRKcGVnQnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGJsb2JCdWZmZXJTaXplID0gZ2V0SnBlZ0J1ZmZlclNpemUoaW5mb1BoeXNpY2FsKHBoeXNpY2FsQ2FtZXJhSWQpLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIGlmIChibG9iQnVmZmVyU2l6ZSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIGpwZWcgYnVmZmVyIHNpemUgJXpkIiwgYmxvYkJ1ZmZlclNpemUpOwogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0xNDY3LDM2ICsxMTAyLDQyIEBACiAgICAgICAgIH0KICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzWzBdLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGJsb2JCdWZmZXJTaXplLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHN0cmVhbVNldElkLAotICAgICAgICAgICAgICAgIGlzTXVsdGlSZXNvbHV0aW9uKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgdHJhbnNwb3J0LCBzdHJlYW1TZXRJZCwKKyAgICAgICAgICAgICAgICBpc011bHRpUmVzb2x1dGlvbiwgZHluYW1pY1JhbmdlUHJvZmlsZSwgc3RyZWFtVXNlQ2FzZSwgbURldmljZVRpbWVCYXNlSXNSZWFsdGltZSwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBCYXNlLCBtaXJyb3JNb2RlKTsKICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JBV19PUEFRVUUpIHsKICAgICAgICAgYm9vbCBtYXhSZXNvbHV0aW9uID0KICAgICAgICAgICAgICAgICBzZW5zb3JQaXhlbE1vZGVzVXNlZC5maW5kKEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OKSAhPQogICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQuZW5kKCk7Ci0gICAgICAgIHNzaXplX3QgcmF3T3BhcXVlQnVmZmVyU2l6ZSA9IGdldFJhd09wYXF1ZUJ1ZmZlclNpemUod2lkdGgsIGhlaWdodCwgbWF4UmVzb2x1dGlvbik7CisgICAgICAgIHNzaXplX3QgcmF3T3BhcXVlQnVmZmVyU2l6ZSA9IGdldFJhd09wYXF1ZUJ1ZmZlclNpemUoaW5mb1BoeXNpY2FsKHBoeXNpY2FsQ2FtZXJhSWQpLCB3aWR0aCwKKyAgICAgICAgICAgICAgICBoZWlnaHQsIG1heFJlc29sdXRpb24pOwogICAgICAgICBpZiAocmF3T3BhcXVlQnVmZmVyU2l6ZSA8PSAwKSB7CiAgICAgICAgICAgICBTRVRfRVJSX0woIkludmFsaWQgUkFXIG9wYXF1ZSBidWZmZXIgc2l6ZSAlemQiLCByYXdPcGFxdWVCdWZmZXJTaXplKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzWzBdLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHJhd09wYXF1ZUJ1ZmZlclNpemUsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc3RyZWFtU2V0SWQsCi0gICAgICAgICAgICAgICAgaXNNdWx0aVJlc29sdXRpb24pOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCB0cmFuc3BvcnQsIHN0cmVhbVNldElkLAorICAgICAgICAgICAgICAgIGlzTXVsdGlSZXNvbHV0aW9uLCBkeW5hbWljUmFuZ2VQcm9maWxlLCBzdHJlYW1Vc2VDYXNlLCBtRGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLAorICAgICAgICAgICAgICAgIHRpbWVzdGFtcEJhc2UsIG1pcnJvck1vZGUpOwogICAgIH0gZWxzZSBpZiAoaXNTaGFyZWQpIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgY29uc3VtZXJVc2FnZSwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc3RyZWFtU2V0SWQsCi0gICAgICAgICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIpOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCB0cmFuc3BvcnQsIHN0cmVhbVNldElkLAorICAgICAgICAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBkeW5hbWljUmFuZ2VQcm9maWxlLCBzdHJlYW1Vc2VDYXNlLCBtRGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLAorICAgICAgICAgICAgICAgIHRpbWVzdGFtcEJhc2UsIG1pcnJvck1vZGUpOwogICAgIH0gZWxzZSBpZiAoY29uc3VtZXJzLnNpemUoKSA9PSAwICYmIGhhc0RlZmVycmVkQ29uc3VtZXIpIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGNvbnN1bWVyVXNhZ2UsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHN0cmVhbVNldElkLAotICAgICAgICAgICAgICAgIGlzTXVsdGlSZXNvbHV0aW9uKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgdHJhbnNwb3J0LCBzdHJlYW1TZXRJZCwKKyAgICAgICAgICAgICAgICBpc011bHRpUmVzb2x1dGlvbiwgZHluYW1pY1JhbmdlUHJvZmlsZSwgc3RyZWFtVXNlQ2FzZSwgbURldmljZVRpbWVCYXNlSXNSZWFsdGltZSwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBCYXNlLCBtaXJyb3JNb2RlKTsKICAgICB9IGVsc2UgewogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM091dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLCBjb25zdW1lcnNbMF0sCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzdHJlYW1TZXRJZCwKLSAgICAgICAgICAgICAgICBpc011bHRpUmVzb2x1dGlvbik7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHRyYW5zcG9ydCwgc3RyZWFtU2V0SWQsCisgICAgICAgICAgICAgICAgaXNNdWx0aVJlc29sdXRpb24sIGR5bmFtaWNSYW5nZVByb2ZpbGUsIHN0cmVhbVVzZUNhc2UsIG1EZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUsCisgICAgICAgICAgICAgICAgdGltZXN0YW1wQmFzZSwgbWlycm9yTW9kZSk7CiAgICAgfQogCiAgICAgc2l6ZV90IGNvbnN1bWVyQ291bnQgPSBjb25zdW1lcnMuc2l6ZSgpOwpAQCAtMTU4Myw2ICsxMjI0LDcgQEAKICAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbEZvcm1hdCA9IHN0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKTsKICAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2VPdmVycmlkZGVuID0gc3RyZWFtLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKTsKICAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbERhdGFTcGFjZSA9IHN0cmVhbS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKTsKKyAgICBzdHJlYW1JbmZvLT5keW5hbWljUmFuZ2VQcm9maWxlID0gc3RyZWFtLT5nZXREeW5hbWljUmFuZ2VQcm9maWxlKCk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xNjE0LDcgKzEyNTYsNyBAQAogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0IiwgaWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICByZXR1cm4gc3RyZWFtLT5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKKyAgICByZXR1cm4gc3RyZWFtLT5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtLCBmYWxzZSAvKm1heUNoYW5nZU1pcnJvciovKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZGVsZXRlU3RyZWFtKGludCBpZCkgewpAQCAtMTkxNSwxMyArMTU1NywyMiBAQAogICAgIH0KIAogICAgIGJvb2wgc3RhdGVTZWVuID0gZmFsc2U7CisgICAgbnNlY3NfdCBzdGFydFRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgZG8gewogICAgICAgICBpZiAoYWN0aXZlID09IChtU3RhdHVzID09IFNUQVRVU19BQ1RJVkUpKSB7CiAgICAgICAgICAgICAvLyBEZXNpcmVkIHN0YXRlIGlzIGN1cnJlbnQKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgcmVzID0gbVN0YXR1c0NoYW5nZWQud2FpdFJlbGF0aXZlKG1Mb2NrLCB0aW1lb3V0KTsKKyAgICAgICAgbnNlY3NfdCB0aW1lRWxhcHNlZCA9IHN5c3RlbVRpbWUoKSAtIHN0YXJ0VGltZTsKKyAgICAgICAgbnNlY3NfdCB0aW1lVG9XYWl0ID0gdGltZW91dCAtIHRpbWVFbGFwc2VkOworICAgICAgICBpZiAodGltZVRvV2FpdCA8PSAwKSB7CisgICAgICAgICAgICAvLyBUaHJlYWQgd29rZSB1cCBzcHVyaW91c2x5IGJ1dCBoYXMgdGltZWQgb3V0IHNpbmNlLgorICAgICAgICAgICAgLy8gRm9yY2Ugb3V0IG9mIGxvb3Agd2l0aCBUSU1FRF9PVVQgcmVzdWx0LgorICAgICAgICAgICAgcmVzID0gVElNRURfT1VUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gbVN0YXR1c0NoYW5nZWQud2FpdFJlbGF0aXZlKG1Mb2NrLCB0aW1lVG9XYWl0KTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgYnJlYWs7CiAKICAgICAgICAgLy8gVGhpcyBpcyBpbXBvc3NpYmxlLCBidXQgaWYgbm90LCBjb3VsZCByZXN1bHQgaW4gc3VidGxlIGRlYWRsb2NrcyBhbmQgaW52YWxpZCBzdGF0ZQpAQCAtMjA4NSw3ICsxNzM2LDEyIEBACiAgICAgICAgIG1TZXNzaW9uU3RhdHNCdWlsZGVyLnN0b3BDb3VudGVyKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5mbHVzaCgpOworICAgIC8vIENhbGN1bGF0ZSBleHBlY3RlZCBkdXJhdGlvbiBmb3IgZmx1c2ggd2l0aCBhZGRpdGlvbmFsIGJ1ZmZlciB0aW1lIGluIG1zIGZvciB3YXRjaGRvZworICAgIHVpbnQ2NF90IG1heEV4cGVjdGVkRHVyYXRpb24gPSAoZ2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCkgKyBrQmFzZUdldEJ1ZmZlcldhaXQpIC8gMWU2OworICAgIHN0YXR1c190IHJlcyA9IG1DYW1lcmFTZXJ2aWNlV2F0Y2hkb2ctPldBVENIX0NVU1RPTV9USU1FUihtUmVxdWVzdFRocmVhZC0+Zmx1c2goKSwKKyAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24gLyBrQ3ljbGVMZW5ndGhNcywga0N5Y2xlTGVuZ3RoTXMpOworCisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6cHJlcGFyZShpbnQgc3RyZWFtSWQpIHsKQEAgLTIxNTQsNiArMTgxMCwyMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorZmxvYXQgQ2FtZXJhM0RldmljZTo6Z2V0TWF4UHJldmlld0ZwcyhzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0pIHsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbWluRHVyYXRpb25zID0KKyAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWluRHVyYXRpb25zLmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgaWYgKG1pbkR1cmF0aW9ucy5kYXRhLmk2NFtpXSA9PSBzdHJlYW0tPmdldEZvcm1hdCgpCisgICAgICAgICAgICAgICAgJiYgbWluRHVyYXRpb25zLmRhdGEuaTY0W2krMV0gPT0gc3RyZWFtLT5nZXRXaWR0aCgpCisgICAgICAgICAgICAgICAgJiYgbWluRHVyYXRpb25zLmRhdGEuaTY0W2krMl0gPT0gc3RyZWFtLT5nZXRIZWlnaHQoKSkgeworICAgICAgICAgICAgaW50NjRfdCBtaW5GcmFtZUR1cmF0aW9uID0gbWluRHVyYXRpb25zLmRhdGEuaTY0W2krM107CisgICAgICAgICAgICByZXR1cm4gMWU5ZiAvIG1pbkZyYW1lRHVyYXRpb247CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDAuMGY7Cit9CisKIC8qKgogICogTWV0aG9kcyBjYWxsZWQgYnkgc3ViY2xhc3NlcwogICovCkBAIC0yMTYyLDYgKzE4MzIsNyBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RkOjp2ZWN0b3I8aW50PiBzdHJlYW1JZHM7CiAgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0cmVhbVN0YXRzPiBzdHJlYW1TdGF0czsKKyAgICBmbG9hdCBzZXNzaW9uTWF4UHJldmlld0ZwcyA9IDAuMGY7CiAKICAgICB7CiAgICAgICAgIC8vIE5lZWQgbUxvY2sgdG8gc2FmZWx5IHVwZGF0ZSBzdGF0ZSBhbmQgc3luY2hyb25pemUgdG8gY3VycmVudApAQCAtMjE4MSwyMSArMTg1MiwyOCBAQAogICAgICAgICAvLyBzdGF0ZSBjaGFuZ2VzCiAgICAgICAgIGlmIChtUGF1c2VTdGF0ZU5vdGlmeSkgcmV0dXJuOwogCi0gICAgICAgIC8vIFBvcHVsYXRlIHN0cmVhbSBzdGF0aXN0aWNzIGluIGNhc2Ugb2YgSWRsZQotICAgICAgICBpZiAoaWRsZSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGF1dG8gc3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSBjb250aW51ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXV0byBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgY29udGludWU7CisKKyAgICAgICAgICAgIGZsb2F0IHN0cmVhbU1heFByZXZpZXdGcHMgPSBnZXRNYXhQcmV2aWV3RnBzKHN0cmVhbSk7CisgICAgICAgICAgICBzZXNzaW9uTWF4UHJldmlld0ZwcyA9IHN0ZDo6bWF4KHNlc3Npb25NYXhQcmV2aWV3RnBzLCBzdHJlYW1NYXhQcmV2aWV3RnBzKTsKKworICAgICAgICAgICAgLy8gUG9wdWxhdGUgc3RyZWFtIHN0YXRpc3RpY3MgaW4gY2FzZSBvZiBJZGxlCisgICAgICAgICAgICBpZiAoaWRsZSkgewogICAgICAgICAgICAgICAgIHN0cmVhbUlkcy5wdXNoX2JhY2soc3RyZWFtLT5nZXRJZCgpKTsKICAgICAgICAgICAgICAgICBDYW1lcmEzU3RyZWFtKiBjYW1lcmEzU3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzdHJlYW0tPmFzSGFsU3RyZWFtKCkpOwogICAgICAgICAgICAgICAgIGludDY0X3QgdXNhZ2UgPSAwTEw7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlID0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVDsKICAgICAgICAgICAgICAgICBpZiAoY2FtZXJhM1N0cmVhbSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgIHVzYWdlID0gY2FtZXJhM1N0cmVhbS0+Z2V0VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtVXNlQ2FzZSA9IGNhbWVyYTNTdHJlYW0tPmdldFN0cmVhbVVzZUNhc2UoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc3RyZWFtU3RhdHMuZW1wbGFjZV9iYWNrKHN0cmVhbS0+Z2V0V2lkdGgoKSwgc3RyZWFtLT5nZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5nZXRGb3JtYXQoKSwgc3RyZWFtLT5nZXREYXRhU3BhY2UoKSwgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Z2V0Rm9ybWF0KCksIHN0cmVhbU1heFByZXZpZXdGcHMsIHN0cmVhbS0+Z2V0RGF0YVNwYWNlKCksIHVzYWdlLAogICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmdldE1heEhhbEJ1ZmZlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5nZXRNYXhUb3RhbEJ1ZmZlcnMoKSAtIHN0cmVhbS0+Z2V0TWF4SGFsQnVmZmVycygpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5nZXRNYXhUb3RhbEJ1ZmZlcnMoKSAtIHN0cmVhbS0+Z2V0TWF4SGFsQnVmZmVycygpLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmdldER5bmFtaWNSYW5nZVByb2ZpbGUoKSwgc3RyZWFtVXNlQ2FzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yMjMzLDcgKzE5MTEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeUlkbGUocmVxdWVzdENvdW50LCByZXN1bHRFcnJvckNvdW50LCBkZXZpY2VFcnJvciwgc3RyZWFtU3RhdHMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzID0gbGlzdGVuZXItPm5vdGlmeUFjdGl2ZSgpOworICAgICAgICAgICAgcmVzID0gbGlzdGVuZXItPm5vdGlmeUFjdGl2ZShzZXNzaW9uTWF4UHJldmlld0Zwcyk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMjQ1NSwyMiArMjEzMywyNCBAQAogICAgIH0KIAogICAgIGlmIChtU3VwcG9ydENhbWVyYU11dGUpIHsKLSAgICAgICAgYXV0byB0ZXN0UGF0dGVybk1vZGVFbnRyeSA9Ci0gICAgICAgICAgICAgICAgbmV3UmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFKTsKLSAgICAgICAgbmV3UmVxdWVzdC0+bU9yaWdpbmFsVGVzdFBhdHRlcm5Nb2RlID0gdGVzdFBhdHRlcm5Nb2RlRW50cnkuY291bnQgPiAwID8KLSAgICAgICAgICAgICAgICB0ZXN0UGF0dGVybk1vZGVFbnRyeS5kYXRhLmkzMlswXSA6Ci0gICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREVfT0ZGOworICAgICAgICBmb3IgKGF1dG8mIHNldHRpbmdzIDogbmV3UmVxdWVzdC0+bVNldHRpbmdzTGlzdCkgeworICAgICAgICAgICAgYXV0byB0ZXN0UGF0dGVybk1vZGVFbnRyeSA9CisgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREUpOworICAgICAgICAgICAgc2V0dGluZ3MubU9yaWdpbmFsVGVzdFBhdHRlcm5Nb2RlID0gdGVzdFBhdHRlcm5Nb2RlRW50cnkuY291bnQgPiAwID8KKyAgICAgICAgICAgICAgICAgICAgdGVzdFBhdHRlcm5Nb2RlRW50cnkuZGF0YS5pMzJbMF0gOgorICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fTU9ERV9PRkY7CiAKLSAgICAgICAgYXV0byB0ZXN0UGF0dGVybkRhdGFFbnRyeSA9Ci0gICAgICAgICAgICAgICAgbmV3UmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9EQVRBKTsKLSAgICAgICAgaWYgKHRlc3RQYXR0ZXJuRGF0YUVudHJ5LmNvdW50ID49IDQpIHsKLSAgICAgICAgICAgIG1lbWNweShuZXdSZXF1ZXN0LT5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGEsIHRlc3RQYXR0ZXJuRGF0YUVudHJ5LmRhdGEuaTMyLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ2FwdHVyZVJlcXVlc3Q6Om1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV3UmVxdWVzdC0+bU9yaWdpbmFsVGVzdFBhdHRlcm5EYXRhWzBdID0gMDsKLSAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVsxXSA9IDA7Ci0gICAgICAgICAgICBuZXdSZXF1ZXN0LT5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbMl0gPSAwOwotICAgICAgICAgICAgbmV3UmVxdWVzdC0+bU9yaWdpbmFsVGVzdFBhdHRlcm5EYXRhWzNdID0gMDsKKyAgICAgICAgICAgIGF1dG8gdGVzdFBhdHRlcm5EYXRhRW50cnkgPQorICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5tZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9EQVRBKTsKKyAgICAgICAgICAgIGlmICh0ZXN0UGF0dGVybkRhdGFFbnRyeS5jb3VudCA+PSA0KSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHNldHRpbmdzLm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YSwgdGVzdFBhdHRlcm5EYXRhRW50cnkuZGF0YS5pMzIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUGh5c2ljYWxDYW1lcmFTZXR0aW5nczo6bU9yaWdpbmFsVGVzdFBhdHRlcm5EYXRhKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNldHRpbmdzLm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVswXSA9IDA7CisgICAgICAgICAgICAgICAgc2V0dGluZ3MubU9yaWdpbmFsVGVzdFBhdHRlcm5EYXRhWzFdID0gMDsKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbMl0gPSAwOworICAgICAgICAgICAgICAgIHNldHRpbmdzLm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVszXSA9IDA7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI2MDMsOCArMjI4Myw3IEBACiAgICAgfQogCiAgICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSkgPT0KLSAgICAgICAgICAgIG9wZXJhdGluZ01vZGU7CisgICAgICAgICAgICBDQU1FUkFfU1RSRUFNX0NPTkZJR1VSQVRJT05fQ09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFID09IG9wZXJhdGluZ01vZGU7CiAKICAgICBpZiAobU9wZXJhdGluZ01vZGUgIT0gb3BlcmF0aW5nTW9kZSkgewogICAgICAgICBtTmVlZENvbmZpZyA9IHRydWU7CkBAIC0yNjEyLDYgKzIyOTEsOSBAQAogICAgICAgICBtT3BlcmF0aW5nTW9kZSA9IG9wZXJhdGluZ01vZGU7CiAgICAgfQogCisgICAgLy8gUmVzZXQgbWluIGV4cGVjdGVkIGR1cmF0aW9uIHdoZW4gc2Vzc2lvbiBpcyByZWNvbmZpZ3VyZWQuCisgICAgbU1pbkV4cGVjdGVkRHVyYXRpb24gPSAwOworCiAgICAgLy8gSW4gY2FzZSBjYWxsZWQgZnJvbSBjb25maWd1cmVTdHJlYW1zLCBhYm9ydCBxdWV1ZWQgaW5wdXQgYnVmZmVycyBub3QgYmVsb25naW5nIHRvCiAgICAgLy8gYW55IHBlbmRpbmcgcmVxdWVzdHMuCiAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBOVUxMICYmIG5vdGlmeVJlcXVlc3RUaHJlYWQpIHsKQEAgLTI2NzcsNiArMjM1OSw3IEBACiAgICAgfQogCiAgICAgbUdyb3VwSWRQaHlzaWNhbENhbWVyYU1hcC5jbGVhcigpOworICAgIGJvb2wgY29tcG9zZXJTdXJmYWNlUHJlc2VudCA9IGZhbHNlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKIAogICAgICAgICAvLyBEb24ndCBjb25maWd1cmUgYmlkaSBzdHJlYW1zIHR3aWNlLCBub3IgYWRkIHRoZW0gdHdpY2UgdG8gdGhlIGxpc3QKQEAgLTI3MDEsNyArMjM4NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIG9jY3VweSB0aGUgaW5pdGlhbCBlbnRyeS4KICAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmRhdGFfc3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9WMF9KRklGKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZXNba10gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRKcGVnQnVmZmVyU2l6ZShvdXRwdXRTdHJlYW0tPndpZHRoLCBvdXRwdXRTdHJlYW0tPmhlaWdodCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SnBlZ0J1ZmZlclNpemUoaW5mb1BoeXNpY2FsKFN0cmluZzgob3V0cHV0U3RyZWFtLT5waHlzaWNhbF9jYW1lcmFfaWQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLT53aWR0aCwgb3V0cHV0U3RyZWFtLT5oZWlnaHQpKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0cHV0U3RyZWFtLT5kYXRhX3NwYWNlID09CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihIQUxfREFUQVNQQUNFX0pQRUdfQVBQX1NFR01FTlRTKSkgewogICAgICAgICAgICAgICAgIGJ1ZmZlclNpemVzW2tdID0gb3V0cHV0U3RyZWFtLT53aWR0aCAqIG91dHB1dFN0cmVhbS0+aGVpZ2h0OwpAQCAtMjcxNiw2ICsyNDAwLDEwIEBACiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkID0gbU91dHB1dFN0cmVhbXNbaV0tPmdldFBoeXNpY2FsQ2FtZXJhSWQoKTsKICAgICAgICAgICAgIG1Hcm91cElkUGh5c2ljYWxDYW1lcmFNYXBbc3RyZWFtR3JvdXBJZF0uaW5zZXJ0KHBoeXNpY2FsQ2FtZXJhSWQpOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+dXNhZ2UgJiBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19DT01QT1NFUikgeworICAgICAgICAgICAgY29tcG9zZXJTdXJmYWNlUHJlc2VudCA9IHRydWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICBjb25maWcuc3RyZWFtcyA9IHN0cmVhbXMuZWRpdEFycmF5KCk7CkBAIC0yNzgzLDYgKzI0NzEsOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgbVJlcXVlc3RUaHJlYWQtPnNldENvbXBvc2VyU3VyZmFjZShjb21wb3NlclN1cmZhY2VQcmVzZW50KTsKKwogICAgIC8vIFJlcXVlc3QgdGhyZWFkIG5lZWRzIHRvIGtub3cgdG8gYXZvaWQgdXNpbmcgcmVwZWF0LWxhc3Qtc2V0dGluZ3MgcHJvdG9jb2wKICAgICAvLyBhY3Jvc3MgY29uZmlndXJlX3N0cmVhbXMoKSBjYWxscwogICAgIGlmIChub3RpZnlSZXF1ZXN0VGhyZWFkKSB7CkBAIC0yODM2LDE3ICsyNTI2LDI4IEBACiAgICAgICAgIG1SZXF1ZXN0QnVmZmVyU00ub25TdHJlYW1zQ29uZmlndXJlZCgpOwogICAgIH0KIAorICAgIC8vIEZpcnN0IGNhbGwgaW5qZWN0Q2FtZXJhKCkgYW5kIHRoZW4gcnVuIGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoKSBjYXNlOgogICAgIC8vIFNpbmNlIHRoZSBzdHJlYW1zIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGluamVjdGlvbiBjYW1lcmEgaXMgYmFzZWQgb24gdGhlIGludGVybmFsIGNhbWVyYSwgd2UKLSAgICAvLyBtdXN0IHdhaXQgdW50aWwgdGhlIGludGVybmFsIGNhbWVyYSBjb25maWd1cmUgc3RyZWFtcyBiZWZvcmUgY2FsbGluZyBpbmplY3RDYW1lcmEoKSB0bworICAgIC8vIG11c3Qgd2FpdCB1bnRpbCB0aGUgaW50ZXJuYWwgY2FtZXJhIGNvbmZpZ3VyZSBzdHJlYW1zIGJlZm9yZSBydW5uaW5nIHRoZSBpbmplY3Rpb24gam9iIHRvCiAgICAgLy8gY29uZmlndXJlIHRoZSBpbmplY3Rpb24gc3RyZWFtcy4KICAgICBpZiAobUluamVjdGlvbk1ldGhvZHMtPmlzSW5qZWN0aW5nKCkpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBJbmplY3Rpb24gY2FtZXJhICVzOiBTdGFydCB0byBjb25maWd1cmUgc3RyZWFtcy4iLAorICAgICAgICBBTE9HRCgiJXM6IEluamVjdGlvbiBjYW1lcmEgJXM6IFN0YXJ0IHRvIGNvbmZpZ3VyZSBzdHJlYW1zLiIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUluamVjdGlvbk1ldGhvZHMtPmdldEluamVjdGVkQ2FtSWQoKS5zdHJpbmcoKSk7CiAgICAgICAgIHJlcyA9IG1JbmplY3Rpb25NZXRob2RzLT5pbmplY3RDYW1lcmEoY29uZmlnLCBidWZmZXJTaXplcyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJDYW4ndCBmaW5pc2ggaW5qZWN0IGNhbWVyYSBwcm9jZXNzISIpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZpcnN0IHJ1biBjb25maWd1cmVTdHJlYW1zTG9ja2VkKCkgYW5kIHRoZW4gY2FsbCBpbmplY3RDYW1lcmEoKSBjYXNlOgorICAgICAgICAvLyBJZiB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIGFuZCBjYW1lcmEgZGVpdmUgaXMgYWN0aXZlLCBidXQgdGhlCisgICAgICAgIC8vIGluamVjdGlvbiBjYW1lcmEgaGFzIG5vdCBiZWVuIGluamVjdGVkIHlldCwgd2UgbmVlZCB0byBzdG9yZSB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gb2YKKyAgICAgICAgLy8gdGhlIGludGVybmFsIGNhbWVyYSAoYmVjYXVzZSB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGluamVjdGlvbiBjYW1lcmEgaXMgYmFzZWQKKyAgICAgICAgLy8gb24gdGhlIGludGVybmFsIGNhbWVyYSkuIFdoZW4gaW5qZWN0aW5nIG9jY3VycyBsYXRlciwgdGhpcyBjb25maWd1cmF0aW9uIGNhbiBiZSB1c2VkIGJ5CisgICAgICAgIC8vIHRoZSBpbmplY3Rpb24gY2FtZXJhLgorICAgICAgICBBTE9HVigiJXM6IFRoZSBzdHJlYW0gY29uZmlndXJhdGlvbiBpcyBjb21wbGV0ZSBhbmQgdGhlIGNhbWVyYSBkZXZpY2UgaXMgYWN0aXZlLCBidXQgdGhlIgorICAgICAgICAgICAgICAiIGluamVjdGlvbiBjYW1lcmEgaGFzIG5vdCBiZWVuIGluamVjdGVkIHlldC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBtSW5qZWN0aW9uTWV0aG9kcy0+c3RvcmVJbmplY3Rpb25Db25maWcoY29uZmlnLCBidWZmZXJTaXplcyk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtMjk3Miw3ICsyNjczLDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6cmVnaXN0ZXJJbkZsaWdodCh1aW50MzJfdCBmcmFtZU51bWJlciwKICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCwKLSAgICAgICAgYm9vbCBoYXNBcHBDYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLAorICAgICAgICBib29sIGhhc0FwcENhbGxiYWNrLCBuc2Vjc190IG1pbkV4cGVjdGVkRHVyYXRpb24sIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwKICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzZXQ8U3RyaW5nOD4+JiBwaHlzaWNhbENhbWVyYUlkcywKICAgICAgICAgYm9vbCBpc1N0aWxsQ2FwdHVyZSwgYm9vbCBpc1pzbENhcHR1cmUsIGJvb2wgcm90YXRlQW5kQ3JvcEF1dG8sCiAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgY2FtZXJhSWRzV2l0aFpvb20sCkBAIC0yOTgyLDggKzI2ODMsOSBAQAogCiAgICAgc3NpemVfdCByZXM7CiAgICAgcmVzID0gbUluRmxpZ2h0TWFwLmFkZChmcmFtZU51bWJlciwgSW5GbGlnaHRSZXF1ZXN0KG51bUJ1ZmZlcnMsIHJlc3VsdEV4dHJhcywgaGFzSW5wdXQsCi0gICAgICAgICAgICBoYXNBcHBDYWxsYmFjaywgbWF4RXhwZWN0ZWREdXJhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZHMsIGlzU3RpbGxDYXB0dXJlLCBpc1pzbENhcHR1cmUsCi0gICAgICAgICAgICByb3RhdGVBbmRDcm9wQXV0bywgY2FtZXJhSWRzV2l0aFpvb20sIHJlcXVlc3RUaW1lTnMsIG91dHB1dFN1cmZhY2VzKSk7CisgICAgICAgICAgICBoYXNBcHBDYWxsYmFjaywgbWluRXhwZWN0ZWREdXJhdGlvbiwgbWF4RXhwZWN0ZWREdXJhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZHMsCisgICAgICAgICAgICBpc1N0aWxsQ2FwdHVyZSwgaXNac2xDYXB0dXJlLCByb3RhdGVBbmRDcm9wQXV0bywgY2FtZXJhSWRzV2l0aFpvb20sIHJlcXVlc3RUaW1lTnMsCisgICAgICAgICAgICBvdXRwdXRTdXJmYWNlcykpOwogICAgIGlmIChyZXMgPCAwKSByZXR1cm4gcmVzOwogCiAgICAgaWYgKG1JbkZsaWdodE1hcC5zaXplKCkgPT0gMSkgewpAQCAtMzA3Miw3MTMgKzI3NzQsMTUgQEAKIAogdm9pZCBDYW1lcmEzRGV2aWNlOjptb25pdG9yTWV0YWRhdGEoVGFnTW9uaXRvcjo6ZXZlbnRTb3VyY2Ugc291cmNlLAogICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyLCBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAotICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiYgcGh5c2ljYWxNZXRhZGF0YSkgeworICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiYgcGh5c2ljYWxNZXRhZGF0YSwKKyAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0QnVmZmVycywgdWludDMyX3QgbnVtT3V0cHV0QnVmZmVycywKKyAgICAgICAgaW50MzJfdCBpbnB1dFN0cmVhbUlkKSB7CiAKICAgICBtVGFnTW9uaXRvci5tb25pdG9yTWV0YWRhdGEoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBtZXRhZGF0YSwKLSAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGEpOworICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YSwgb3V0cHV0QnVmZmVycywgbnVtT3V0cHV0QnVmZmVycywgaW5wdXRTdHJlYW1JZCk7CiB9CiAKLS8qKgotICogSGFsSW50ZXJmYWNlIGlubmVyIGNsYXNzIG1ldGhvZHMKLSAqLwotCi1DYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZSgKLSAgICAgICAgICAgIHNwPElDYW1lcmFEZXZpY2VTZXNzaW9uPiAmc2Vzc2lvbiwKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWUsCi0gICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsIGJvb2wgc3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKSA6Ci0gICAgICAgIG1IaWRsU2Vzc2lvbihzZXNzaW9uKSwKLSAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKHF1ZXVlKSwKLSAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIodXNlSGFsQnVmTWFuYWdlciksCi0gICAgICAgIG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkKHRydWUpLAotICAgICAgICBtU3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKHN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZykgewotICAgIC8vIENoZWNrIHdpdGggaGFyZHdhcmUgc2VydmljZSBtYW5hZ2VyIGlmIHdlIGNhbiBkb3duY2FzdCB0aGVzZSBpbnRlcmZhY2VzCi0gICAgLy8gU29tZXdoYXQgZXhwZW5zaXZlLCBzbyBjYWNoZSB0aGUgcmVzdWx0cyBhdCBzdGFydHVwCi0gICAgYXV0byBjYXN0UmVzdWx0XzNfNyA9IGRldmljZTo6VjNfNzo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7Ci0gICAgaWYgKGNhc3RSZXN1bHRfM183LmlzT2soKSkgewotICAgICAgICBtSGlkbFNlc3Npb25fM183ID0gY2FzdFJlc3VsdF8zXzc7Ci0gICAgfQotICAgIGF1dG8gY2FzdFJlc3VsdF8zXzYgPSBkZXZpY2U6OlYzXzY6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOwotICAgIGlmIChjYXN0UmVzdWx0XzNfNi5pc09rKCkpIHsKLSAgICAgICAgbUhpZGxTZXNzaW9uXzNfNiA9IGNhc3RSZXN1bHRfM182OwotICAgIH0KLSAgICBhdXRvIGNhc3RSZXN1bHRfM181ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKLSAgICBpZiAoY2FzdFJlc3VsdF8zXzUuaXNPaygpKSB7Ci0gICAgICAgIG1IaWRsU2Vzc2lvbl8zXzUgPSBjYXN0UmVzdWx0XzNfNTsKLSAgICB9Ci0gICAgYXV0byBjYXN0UmVzdWx0XzNfNCA9IGRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7Ci0gICAgaWYgKGNhc3RSZXN1bHRfM180LmlzT2soKSkgewotICAgICAgICBtSGlkbFNlc3Npb25fM180ID0gY2FzdFJlc3VsdF8zXzQ7Ci0gICAgfQotICAgIGF1dG8gY2FzdFJlc3VsdF8zXzMgPSBkZXZpY2U6OlYzXzM6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOwotICAgIGlmIChjYXN0UmVzdWx0XzNfMy5pc09rKCkpIHsKLSAgICAgICAgbUhpZGxTZXNzaW9uXzNfMyA9IGNhc3RSZXN1bHRfM18zOwotICAgIH0KLX0KLQotQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoKSA6Ci0gICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKGZhbHNlKSwKLSAgICAgICAgbVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyhmYWxzZSkge30KLQotQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoY29uc3QgSGFsSW50ZXJmYWNlJiBvdGhlcikgOgotICAgICAgICBtSGlkbFNlc3Npb24ob3RoZXIubUhpZGxTZXNzaW9uKSwKLSAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKG90aGVyLm1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSksCi0gICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKG90aGVyLm1Vc2VIYWxCdWZNYW5hZ2VyKSwKLSAgICAgICAgbVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyhvdGhlci5tU3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKSB7fQotCi1ib29sIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6dmFsaWQoKSB7Ci0gICAgcmV0dXJuIChtSGlkbFNlc3Npb24gIT0gbnVsbHB0cik7Ci19Ci0KLXZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjbGVhcigpIHsKLSAgICBtSGlkbFNlc3Npb25fM183LmNsZWFyKCk7Ci0gICAgbUhpZGxTZXNzaW9uXzNfNi5jbGVhcigpOwotICAgIG1IaWRsU2Vzc2lvbl8zXzUuY2xlYXIoKTsKLSAgICBtSGlkbFNlc3Npb25fM180LmNsZWFyKCk7Ci0gICAgbUhpZGxTZXNzaW9uXzNfMy5jbGVhcigpOwotICAgIG1IaWRsU2Vzc2lvbi5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MoCi0gICAgICAgIGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlX3QgdGVtcGxhdGVJZCwKLSAgICAgICAgLypvdXQqLyBjYW1lcmFfbWV0YWRhdGFfdCAqKnJlcXVlc3RUZW1wbGF0ZSkgewotICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MiKTsKLSAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzdGF0dXNfdCByZXMgPSBPSzsKLQotICAgIGNvbW1vbjo6VjFfMDo6U3RhdHVzIHN0YXR1czsKLQotICAgIGF1dG8gcmVxdWVzdENhbGxiYWNrID0gWyZzdGF0dXMsICZyZXF1ZXN0VGVtcGxhdGVdCi0gICAgICAgICAgICAoY29tbW9uOjpWMV8wOjpTdGF0dXMgcywgY29uc3QgZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSYgcmVxdWVzdCkgewotICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gY29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhICpyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QqPihyZXF1ZXN0LmRhdGEoKSk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IHJlcXVlc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgIGludCByZXQgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKHIsICZleHBlY3RlZFNpemUpOwotICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gT0sgfHwgcmV0ID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgKnJlcXVlc3RUZW1wbGF0ZSA9IGNsb25lX2NhbWVyYV9tZXRhZGF0YShyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCpyZXF1ZXN0VGVtcGxhdGUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY2xvbmUgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBlcnI7Ci0gICAgUmVxdWVzdFRlbXBsYXRlIGlkOwotICAgIHN3aXRjaCAodGVtcGxhdGVJZCkgewotICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9QUkVWSUVXOgotICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlBSRVZJRVc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfU1RJTExfQ0FQVFVSRToKLSAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpTVElMTF9DQVBUVVJFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX1ZJREVPX1JFQ09SRDoKLSAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpWSURFT19SRUNPUkQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfVklERU9fU05BUFNIT1Q6Ci0gICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6VklERU9fU05BUFNIT1Q7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRzoKLSAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpaRVJPX1NIVVRURVJfTEFHOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX01BTlVBTDoKLSAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpNQU5VQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIFVua25vd24gdGVtcGxhdGUgSUQsIG9yIHRoaXMgSEFMIGlzIHRvbyBvbGQgdG8gc3VwcG9ydCBpdAotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgZXJyID0gbUhpZGxTZXNzaW9uLT5jb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKGlkLCByZXF1ZXN0Q2FsbGJhY2spOwotCi0gICAgaWYgKCFlcnIuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1ib29sIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6aXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZChDYW1lcmFNZXRhZGF0YSYgb2xkU2Vzc2lvblBhcmFtcywKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIG5ld1Nlc3Npb25QYXJhbXMpIHsKLSAgICAvLyBXZSBkbyByZWNvbmZpZ3VyYXRpb24gYnkgZGVmYXVsdDsKLSAgICBib29sIHJldCA9IHRydWU7Ci0gICAgaWYgKChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpICYmIG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkKSB7Ci0gICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiBvbGRQYXJhbXMsIG5ld1BhcmFtczsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIG9sZFNlc3Npb01ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCi0gICAgICAgICAgICAgICAgb2xkU2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCkpOwotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogbmV3U2Vzc2lvTWV0YSA9IGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPigKLSAgICAgICAgICAgICAgICBuZXdTZXNzaW9uUGFyYW1zLmdldEFuZExvY2soKSk7Ci0gICAgICAgIG9sZFBhcmFtcy5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG9sZFNlc3Npb01ldGEpLAotICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShvbGRTZXNzaW9NZXRhKSk7Ci0gICAgICAgIG5ld1BhcmFtcy5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG5ld1Nlc3Npb01ldGEpLAotICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShuZXdTZXNzaW9NZXRhKSk7Ci0gICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzIGNhbGxTdGF0dXM7Ci0gICAgICAgIGJvb2wgcmVxdWlyZWQ7Ci0gICAgICAgIGF1dG8gaGlkbENiID0gWyZjYWxsU3RhdHVzLCAmcmVxdWlyZWRdIChoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cyBzLAotICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZWRGbGFnKSB7Ci0gICAgICAgICAgICBjYWxsU3RhdHVzID0gczsKLSAgICAgICAgICAgIHJlcXVpcmVkID0gcmVxdWlyZWRGbGFnOwotICAgICAgICB9OwotICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPmlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQob2xkUGFyYW1zLCBuZXdQYXJhbXMsIGhpZGxDYik7Ci0gICAgICAgIG9sZFNlc3Npb25QYXJhbXMudW5sb2NrKG9sZFNlc3Npb01ldGEpOwotICAgICAgICBuZXdTZXNzaW9uUGFyYW1zLnVubG9jayhuZXdTZXNzaW9NZXRhKTsKLSAgICAgICAgaWYgKGVyci5pc09rKCkpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoY2FsbFN0YXR1cykgewotICAgICAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LOgotICAgICAgICAgICAgICAgICAgICByZXQgPSByZXF1aXJlZDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6Ci0gICAgICAgICAgICAgICAgICAgIG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogUmVjb25maWd1cmF0aW9uIHF1ZXJ5IGZhaWxlZDogJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxTdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Y29uZmlndXJlU3RyZWFtcyhjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc2Vzc2lvblBhcmFtcywKLSAgICAgICAgY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uICpjb25maWcsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpIHsKLSAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpjb25maWd1cmVTdHJlYW1zIik7Ci0gICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc3RhdHVzX3QgcmVzID0gT0s7Ci0KLSAgICBpZiAoY29uZmlnLT5pbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uICYmIG1IaWRsU2Vzc2lvbl8zXzcgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IG11bHRpLXJlc29sdXRpb24gaW5wdXQgc3RyZWFtIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAvLyBDb252ZXJ0IHN0cmVhbSBjb25maWcgdG8gSElETAotICAgIHN0ZDo6c2V0PGludD4gYWN0aXZlU3RyZWFtczsKLSAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMjsKLSAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKLSAgICBkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNzsKLSAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOwotICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgewotICAgICAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbSAmZHN0M18yID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5zdHJlYW1zW2ldOwotICAgICAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbSAmZHN0M180ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldOwotICAgICAgICBkZXZpY2U6OlYzXzc6OlN0cmVhbSAmZHN0M183ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1zW2ldOwotICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3QgKnNyYyA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKLQotICAgICAgICBDYW1lcmEzU3RyZWFtKiBjYW0zc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMpOwotICAgICAgICBjYW0zc3RyZWFtLT5zZXRCdWZmZXJGcmVlZExpc3RlbmVyKHRoaXMpOwotICAgICAgICBpbnQgc3RyZWFtSWQgPSBjYW0zc3RyZWFtLT5nZXRJZCgpOwotICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbVR5cGU7Ci0gICAgICAgIHN3aXRjaCAoc3JjLT5zdHJlYW1fdHlwZSkgewotICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX09VVFBVVDoKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gU3RyZWFtVHlwZTo6T1VUUFVUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0lOUFVUOgotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpJTlBVVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IFVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIGNvbmZpZy0+c3RyZWFtc1tpXS0+c3RyZWFtX3R5cGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZHN0M18yLmlkID0gc3RyZWFtSWQ7Ci0gICAgICAgIGRzdDNfMi5zdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgZHN0M18yLndpZHRoID0gc3JjLT53aWR0aDsKLSAgICAgICAgZHN0M18yLmhlaWdodCA9IHNyYy0+aGVpZ2h0OwotICAgICAgICBkc3QzXzIudXNhZ2UgPSBtYXBUb0NvbnN1bWVyVXNhZ2UoY2FtM3N0cmVhbS0+Z2V0VXNhZ2UoKSk7Ci0gICAgICAgIGRzdDNfMi5yb3RhdGlvbiA9IG1hcFRvU3RyZWFtUm90YXRpb24oKGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCkgc3JjLT5yb3RhdGlvbik7Ci0gICAgICAgIC8vIEZvciBIaWRsU2Vzc2lvbiB2ZXJzaW9uIDMuNSBvciBuZXdlciwgdGhlIGZvcm1hdCBhbmQgZGF0YVNwYWNlIHNlbnQKLSAgICAgICAgLy8gdG8gSEFMIGFyZSBvcmlnaW5hbCwgbm90IHRoZSBvdmVycmlkZGVuIG9uZXMuCi0gICAgICAgIGlmIChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KGNhbTNzdHJlYW0tPmlzRm9ybWF0T3ZlcnJpZGRlbigpID8KLSAgICAgICAgICAgICAgICAgICAgY2FtM3N0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKSA6IHNyYy0+Zm9ybWF0KTsKLSAgICAgICAgICAgIGRzdDNfMi5kYXRhU3BhY2UgPSBtYXBUb0hpZGxEYXRhc3BhY2UoY2FtM3N0cmVhbS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCkgPwotICAgICAgICAgICAgICAgICAgICBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbERhdGFTcGFjZSgpIDogc3JjLT5kYXRhX3NwYWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KHNyYy0+Zm9ybWF0KTsKLSAgICAgICAgICAgIGRzdDNfMi5kYXRhU3BhY2UgPSBtYXBUb0hpZGxEYXRhc3BhY2Uoc3JjLT5kYXRhX3NwYWNlKTsKLSAgICAgICAgfQotICAgICAgICBkc3QzXzQudjNfMiA9IGRzdDNfMjsKLSAgICAgICAgZHN0M180LmJ1ZmZlclNpemUgPSBidWZmZXJTaXplc1tpXTsKLSAgICAgICAgaWYgKHNyYy0+cGh5c2ljYWxfY2FtZXJhX2lkICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGRzdDNfNC5waHlzaWNhbENhbWVyYUlkID0gc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQ7Ci0gICAgICAgIH0KLSAgICAgICAgZHN0M183LnYzXzQgPSBkc3QzXzQ7Ci0gICAgICAgIGRzdDNfNy5ncm91cElkID0gY2FtM3N0cmVhbS0+Z2V0SGFsU3RyZWFtR3JvdXBJZCgpOwotICAgICAgICBkc3QzXzcuc2Vuc29yUGl4ZWxNb2Rlc1VzZWQucmVzaXplKHNyYy0+c2Vuc29yX3BpeGVsX21vZGVzX3VzZWQuc2l6ZSgpKTsKLSAgICAgICAgc2l6ZV90IGogPSAwOwotICAgICAgICBmb3IgKGludCBtb2RlIDogc3JjLT5zZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZCkgewotICAgICAgICAgICAgZHN0M183LnNlbnNvclBpeGVsTW9kZXNVc2VkW2orK10gPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlPihtb2RlKTsKLSAgICAgICAgfQotICAgICAgICBhY3RpdmVTdHJlYW1zLmluc2VydChzdHJlYW1JZCk7Ci0gICAgICAgIC8vIENyZWF0ZSBCdWZmZXIgSUQgbWFwIGlmIG5lY2Vzc2FyeQotICAgICAgICBtQnVmZmVyUmVjb3Jkcy50cnlDcmVhdGVCdWZmZXJDYWNoZShzdHJlYW1JZCk7Ci0gICAgfQotICAgIC8vIHJlbW92ZSBCdWZmZXJJZE1hcCBmb3IgZGVsZXRlZCBzdHJlYW1zCi0gICAgbUJ1ZmZlclJlY29yZHMucmVtb3ZlSW5hY3RpdmVCdWZmZXJDYWNoZXMoYWN0aXZlU3RyZWFtcyk7Ci0KLSAgICBTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpb25Nb2RlOwotICAgIHJlcyA9IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCi0gICAgICAgICAgICAoY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCkgY29uZmlnLT5vcGVyYXRpb25fbW9kZSwKLSAgICAgICAgICAgIC8qb3V0Ki8gJm9wZXJhdGlvbk1vZGUpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKLSAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180Lm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOwotICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7Ci0gICAgc2l6ZV90IHNlc3Npb25QYXJhbVNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUoc2Vzc2lvblBhcmFtcyk7Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5zZXNzaW9uUGFyYW1zLnNldFRvRXh0ZXJuYWwoCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oc2Vzc2lvblBhcmFtcykpLAotICAgICAgICAgICAgc2Vzc2lvblBhcmFtU2l6ZSk7Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKLSAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnNlc3Npb25QYXJhbXMuc2V0VG9FeHRlcm5hbCgKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihzZXNzaW9uUGFyYW1zKSksCi0gICAgICAgICAgICBzZXNzaW9uUGFyYW1TaXplKTsKLQotICAgIC8vIEludm9rZSBjb25maWd1cmVTdHJlYW1zCi0gICAgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjsKLSAgICBkZXZpY2U6OlYzXzQ6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uM180OwotICAgIGRldmljZTo6VjNfNjo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzY7Ci0gICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzOwotCi0gICAgYXV0byBjb25maWdTdHJlYW0zNENiID0gWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb24zXzRdCi0gICAgICAgICAgICAoY29tbW9uOjpWMV8wOjpTdGF0dXMgcywgY29uc3QgZGV2aWNlOjpWM180OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uJiBoYWxDb25maWd1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uM180ID0gaGFsQ29uZmlndXJhdGlvbjsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgfTsKLQotICAgIGF1dG8gY29uZmlnU3RyZWFtMzZDYiA9IFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uM182XQotICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfNjo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgewotICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbjNfNiA9IGhhbENvbmZpZ3VyYXRpb247Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgIH07Ci0KLSAgICBhdXRvIHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQgPSBbJmZpbmFsQ29uZmlndXJhdGlvbiwgJmZpbmFsQ29uZmlndXJhdGlvbjNfNF0KLSAgICAgICAgICAgIChoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+JiBlcnIpIC0+IHN0YXR1c190IHsKLSAgICAgICAgICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCkpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0gPSBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtc1tpXS52M18zOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9OwotCi0gICAgYXV0byBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM2ID0gWyZmaW5hbENvbmZpZ3VyYXRpb24sICZmaW5hbENvbmZpZ3VyYXRpb24zXzZdCi0gICAgICAgICAgICAoaGFyZHdhcmU6OlJldHVybjx2b2lkPiYgZXJyKSAtPiBzdGF0dXNfdCB7Ci0gICAgICAgICAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoZmluYWxDb25maWd1cmF0aW9uM182LnN0cmVhbXMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbmFsQ29uZmlndXJhdGlvbjNfNi5zdHJlYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldID0gZmluYWxDb25maWd1cmF0aW9uM182LnN0cmVhbXNbaV0udjNfNC52M18zOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9OwotCi0gICAgLy8gU2VlIHdoaWNoIHZlcnNpb24gb2YgSEFMIHdlIGhhdmUKLSAgICBpZiAobUhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dWKCIlczogdjMuNyBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIrKzsKLSAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5tdWx0aVJlc29sdXRpb25JbnB1dEltYWdlID0gY29uZmlnLT5pbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uOwotICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzctPmNvbmZpZ3VyZVN0cmVhbXNfM183KAotICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcsIGNvbmZpZ1N0cmVhbTM2Q2IpOwotICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM2KGVycik7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzYgIT0gbnVsbHB0cikgewotICAgICAgICBBTE9HVigiJXM6IHYzLjYgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgZGV2aWNlOjpWM181OjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzU7Ci0gICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUudjNfNCA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQ7Ci0gICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUuc3RyZWFtQ29uZmlnQ291bnRlciA9IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlcisrOwotICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzYtPmNvbmZpZ3VyZVN0cmVhbXNfM182KAotICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUsIGNvbmZpZ1N0cmVhbTM2Q2IpOwotICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM2KGVycik7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzUgIT0gbnVsbHB0cikgewotICAgICAgICBBTE9HVigiJXM6IHYzLjUgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgZGV2aWNlOjpWM181OjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzU7Ci0gICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUudjNfNCA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQ7Ci0gICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUuc3RyZWFtQ29uZmlnQ291bnRlciA9IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlcisrOwotICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPmNvbmZpZ3VyZVN0cmVhbXNfM181KAotICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUsIGNvbmZpZ1N0cmVhbTM0Q2IpOwotICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM0KGVycik7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewotICAgICAgICAvLyBXZSBkbzsgdXNlIHYzLjQgZm9yIHRoZSBjYWxsCi0gICAgICAgIEFMT0dWKCIlczogdjMuNCBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzQtPmNvbmZpZ3VyZVN0cmVhbXNfM180KAotICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQsIGNvbmZpZ1N0cmVhbTM0Q2IpOwotICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM0KGVycik7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzMgIT0gbnVsbHB0cikgewotICAgICAgICAvLyBXZSBkbzsgdXNlIHYzLjMgZm9yIHRoZSBjYWxsCi0gICAgICAgIEFMT0dWKCIlczogdjMuMyBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzMtPmNvbmZpZ3VyZVN0cmVhbXNfM18zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIsCi0gICAgICAgICAgICBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbl0KLSAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzM6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24mIGhhbENvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24gPSBoYWxDb25maWd1cmF0aW9uOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBXZSBkb24ndDsgdXNlIHYzLjIgY2FsbCBhbmQgY29uc3RydWN0IGEgdjMuMyBIYWxTdHJlYW1Db25maWd1cmF0aW9uCi0gICAgICAgIEFMT0dWKCIlczogdjMuMiBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbl8zXzI7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5jb25maWd1cmVTdHJlYW1zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIsCi0gICAgICAgICAgICAgICAgWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb25fM18yXQotICAgICAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBIYWxTdHJlYW1Db25maWd1cmF0aW9uJiBoYWxDb25maWd1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbl8zXzIgPSBoYWxDb25maWd1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoZmluYWxDb25maWd1cmF0aW9uXzNfMi5zdHJlYW1zLnNpemUoKSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmluYWxDb25maWd1cmF0aW9uXzNfMi5zdHJlYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXS52M18yID0gZmluYWxDb25maWd1cmF0aW9uXzNfMi5zdHJlYW1zW2ldOwotICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0ub3ZlcnJpZGVEYXRhU3BhY2UgPQotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV0uZGF0YVNwYWNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAhPSBjb21tb246OlYxXzA6OlN0YXR1czo6T0sgKSB7Ci0gICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChzdGF0dXMpOwotICAgIH0KLQotICAgIC8vIEFuZCBjb252ZXJ0IG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbiBmcm9tIEhJREwKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnLT5udW1fc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fdCAqZHN0ID0gY29uZmlnLT5zdHJlYW1zW2ldOwotICAgICAgICBpbnQgc3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KGRzdCktPmdldElkKCk7Ci0KLSAgICAgICAgLy8gU3RhcnQgc2NhbiBhdCBpLCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHN0cmVhbSBvcmRlciBtYXRjaGVzCi0gICAgICAgIHNpemVfdCByZWFsSWR4ID0gaTsKLSAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgICAgICBzaXplX3QgaGFsU3RyZWFtQ291bnQgPSBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5zaXplKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IGhhbFN0cmVhbUNvdW50OyBpZHgrKykgewotICAgICAgICAgICAgaWYgKGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW3JlYWxJZHhdLnYzXzIuaWQgPT0gc3RyZWFtSWQpIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWFsSWR4ID0gKHJlYWxJZHggPj0gaGFsU3RyZWFtQ291bnQgLSAxKSA/IDAgOiByZWFsSWR4ICsgMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCBub3QgZm91bmQgaW4gc3RyZWFtIGNvbmZpZ3VyYXRpb24gcmVzcG9uc2UgZnJvbSBIQUwiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBkZXZpY2U6OlYzXzM6OkhhbFN0cmVhbSAmc3JjID0gZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbcmVhbElkeF07Ci0gICAgICAgIGRldmljZTo6VjNfNjo6SGFsU3RyZWFtICZzcmNfMzYgPSBmaW5hbENvbmZpZ3VyYXRpb24zXzYuc3RyZWFtc1tyZWFsSWR4XTsKLQotICAgICAgICBDYW1lcmEzU3RyZWFtKiBkc3RTdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KGRzdCk7Ci0gICAgICAgIGludCBvdmVycmlkZUZvcm1hdCA9IG1hcFRvRnJhbWV3b3JrRm9ybWF0KHNyYy52M18yLm92ZXJyaWRlRm9ybWF0KTsKLSAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2Ugb3ZlcnJpZGVEYXRhU3BhY2UgPSBtYXBUb0ZyYW1ld29ya0RhdGFzcGFjZShzcmMub3ZlcnJpZGVEYXRhU3BhY2UpOwotCi0gICAgICAgIGlmIChtSGlkbFNlc3Npb25fM182ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0T2ZmbGluZVByb2Nlc3NpbmdTdXBwb3J0KHNyY18zNi5zdXBwb3J0T2ZmbGluZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZHN0U3RyZWFtLT5nZXRPcmlnaW5hbEZvcm1hdCgpICE9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCkgewotICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRGb3JtYXRPdmVycmlkZShmYWxzZSk7Ci0gICAgICAgICAgICBkc3RTdHJlYW0tPnNldERhdGFTcGFjZU92ZXJyaWRlKGZhbHNlKTsKLSAgICAgICAgICAgIGlmIChkc3QtPmZvcm1hdCAhPSBvdmVycmlkZUZvcm1hdCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBGb3JtYXQgb3ZlcnJpZGUgbm90IGFsbG93ZWQgZm9yIGZvcm1hdCAweCV4IiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIGRzdC0+Zm9ybWF0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkc3QtPmRhdGFfc3BhY2UgIT0gb3ZlcnJpZGVEYXRhU3BhY2UpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRGF0YVNwYWNlIG92ZXJyaWRlIG5vdCBhbGxvd2VkIGZvciBmb3JtYXQgMHgleCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkLCBkc3QtPmZvcm1hdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib29sIG5lZWRGb3JtYXRPdmVycmlkZSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtc1tpXS5mb3JtYXQgIT0gc3JjLnYzXzIub3ZlcnJpZGVGb3JtYXQ7Ci0gICAgICAgICAgICBib29sIG5lZWREYXRhc3BhY2VPdmVycmlkZSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtc1tpXS5kYXRhU3BhY2UgIT0gc3JjLm92ZXJyaWRlRGF0YVNwYWNlOwotICAgICAgICAgICAgLy8gT3ZlcnJpZGUgYWxsb3dlZCB3aXRoIElNUExFTUVOVEFUSU9OX0RFRklORUQKLSAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0Rm9ybWF0T3ZlcnJpZGUobmVlZEZvcm1hdE92ZXJyaWRlKTsKLSAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0RGF0YVNwYWNlT3ZlcnJpZGUobmVlZERhdGFzcGFjZU92ZXJyaWRlKTsKLSAgICAgICAgICAgIGRzdC0+Zm9ybWF0ID0gb3ZlcnJpZGVGb3JtYXQ7Ci0gICAgICAgICAgICBkc3QtPmRhdGFfc3BhY2UgPSBvdmVycmlkZURhdGFTcGFjZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkc3QtPnN0cmVhbV90eXBlID09IENBTUVSQV9TVFJFQU1fSU5QVVQpIHsKLSAgICAgICAgICAgIGlmIChzcmMudjNfMi5wcm9kdWNlclVzYWdlICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogSU5QVVQgc3RyZWFtcyBtdXN0IGhhdmUgMCBmb3IgcHJvZHVjZXIgdXNhZ2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRVc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKHNyYy52M18yLmNvbnN1bWVyVXNhZ2UpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIE9VVFBVVAotICAgICAgICAgICAgaWYgKHNyYy52M18yLmNvbnN1bWVyVXNhZ2UgIT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBPVVRQVVQgc3RyZWFtcyBtdXN0IGhhdmUgMCBmb3IgY29uc3VtZXIgdXNhZ2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRVc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKHNyYy52M18yLnByb2R1Y2VyVXNhZ2UpKTsKLSAgICAgICAgfQotICAgICAgICBkc3QtPm1heF9idWZmZXJzID0gc3JjLnYzXzIubWF4QnVmZmVyczsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNvbmZpZ3VyZUluamVjdGVkU3RyZWFtcygKLSAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIHNlc3Npb25QYXJhbXMsIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiogY29uZmlnLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzLAotICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2FtZXJhQ2hhcmFjdGVyaXN0aWNzKSB7Ci0gICAgQVRSQUNFX05BTUUoIkluamVjdGlvbkNhbWVyYUhhbDo6Y29uZmlndXJlU3RyZWFtcyIpOwotICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHN0YXR1c190IHJlcyA9IE9LOwotCi0gICAgaWYgKGNvbmZpZy0+aW5wdXRfaXNfbXVsdGlfcmVzb2x1dGlvbikgewotICAgICAgICBBTE9HRSgiJXM6IEluamVjdGlvbiBjYW1lcmEgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aS1yZXNvbHV0aW9uIGlucHV0ICIKLSAgICAgICAgICAgICAgICAic3RyZWFtIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAvLyBDb252ZXJ0IHN0cmVhbSBjb25maWcgdG8gSElETAotICAgIHN0ZDo6c2V0PGludD4gYWN0aXZlU3RyZWFtczsKLSAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMjsKLSAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKLSAgICBkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNzsKLSAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOwotICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgewotICAgICAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbSYgZHN0M18yID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5zdHJlYW1zW2ldOwotICAgICAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbSYgZHN0M180ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldOwotICAgICAgICBkZXZpY2U6OlYzXzc6OlN0cmVhbSYgZHN0M183ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1zW2ldOwotICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3QqIHNyYyA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKLQotICAgICAgICBDYW1lcmEzU3RyZWFtKiBjYW0zc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMpOwotICAgICAgICBjYW0zc3RyZWFtLT5zZXRCdWZmZXJGcmVlZExpc3RlbmVyKHRoaXMpOwotICAgICAgICBpbnQgc3RyZWFtSWQgPSBjYW0zc3RyZWFtLT5nZXRJZCgpOwotICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbVR5cGU7Ci0gICAgICAgIHN3aXRjaCAoc3JjLT5zdHJlYW1fdHlwZSkgewotICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX09VVFBVVDoKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gU3RyZWFtVHlwZTo6T1VUUFVUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0lOUFVUOgotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpJTlBVVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IFVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIGNvbmZpZy0+c3RyZWFtc1tpXS0+c3RyZWFtX3R5cGUpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBkc3QzXzIuaWQgPSBzdHJlYW1JZDsKLSAgICAgICAgZHN0M18yLnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgICAgICBkc3QzXzIud2lkdGggPSBzcmMtPndpZHRoOwotICAgICAgICBkc3QzXzIuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7Ci0gICAgICAgIGRzdDNfMi51c2FnZSA9IG1hcFRvQ29uc3VtZXJVc2FnZShjYW0zc3RyZWFtLT5nZXRVc2FnZSgpKTsKLSAgICAgICAgZHN0M18yLnJvdGF0aW9uID0KLSAgICAgICAgICAgICAgICBtYXBUb1N0cmVhbVJvdGF0aW9uKChjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qpc3JjLT5yb3RhdGlvbik7Ci0gICAgICAgIC8vIEZvciBIaWRsU2Vzc2lvbiB2ZXJzaW9uIDMuNSBvciBuZXdlciwgdGhlIGZvcm1hdCBhbmQgZGF0YVNwYWNlIHNlbnQKLSAgICAgICAgLy8gdG8gSEFMIGFyZSBvcmlnaW5hbCwgbm90IHRoZSBvdmVycmlkZGVuIG9uZXMuCi0gICAgICAgIGlmIChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KGNhbTNzdHJlYW0tPmlzRm9ybWF0T3ZlcnJpZGRlbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2FtM3N0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNyYy0+Zm9ybWF0KTsKLSAgICAgICAgICAgIGRzdDNfMi5kYXRhU3BhY2UgPQotICAgICAgICAgICAgICAgICAgICBtYXBUb0hpZGxEYXRhc3BhY2UoY2FtM3N0cmVhbS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2FtM3N0cmVhbS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzcmMtPmRhdGFfc3BhY2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHN0M18yLmZvcm1hdCA9IG1hcFRvUGl4ZWxGb3JtYXQoc3JjLT5mb3JtYXQpOwotICAgICAgICAgICAgZHN0M18yLmRhdGFTcGFjZSA9IG1hcFRvSGlkbERhdGFzcGFjZShzcmMtPmRhdGFfc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGRzdDNfNC52M18yID0gZHN0M18yOwotICAgICAgICBkc3QzXzQuYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemVzW2ldOwotICAgICAgICBpZiAoc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgZHN0M180LnBoeXNpY2FsQ2FtZXJhSWQgPSBzcmMtPnBoeXNpY2FsX2NhbWVyYV9pZDsKLSAgICAgICAgfQotICAgICAgICBkc3QzXzcudjNfNCA9IGRzdDNfNDsKLSAgICAgICAgZHN0M183Lmdyb3VwSWQgPSBjYW0zc3RyZWFtLT5nZXRIYWxTdHJlYW1Hcm91cElkKCk7Ci0gICAgICAgIGRzdDNfNy5zZW5zb3JQaXhlbE1vZGVzVXNlZC5yZXNpemUoc3JjLT5zZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZC5zaXplKCkpOwotICAgICAgICBzaXplX3QgaiA9IDA7Ci0gICAgICAgIGZvciAoaW50IG1vZGUgOiBzcmMtPnNlbnNvcl9waXhlbF9tb2Rlc191c2VkKSB7Ci0gICAgICAgICAgICBkc3QzXzcuc2Vuc29yUGl4ZWxNb2Rlc1VzZWRbaisrXSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYU1ldGFkYXRhRW51bUFuZHJvaWRTZW5zb3JQaXhlbE1vZGU+KG1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGFjdGl2ZVN0cmVhbXMuaW5zZXJ0KHN0cmVhbUlkKTsKLSAgICAgICAgLy8gQ3JlYXRlIEJ1ZmZlciBJRCBtYXAgaWYgbmVjZXNzYXJ5Ci0gICAgICAgIG1CdWZmZXJSZWNvcmRzLnRyeUNyZWF0ZUJ1ZmZlckNhY2hlKHN0cmVhbUlkKTsKLSAgICB9Ci0gICAgLy8gcmVtb3ZlIEJ1ZmZlcklkTWFwIGZvciBkZWxldGVkIHN0cmVhbXMKLSAgICBtQnVmZmVyUmVjb3Jkcy5yZW1vdmVJbmFjdGl2ZUJ1ZmZlckNhY2hlcyhhY3RpdmVTdHJlYW1zKTsKLQotICAgIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIG9wZXJhdGlvbk1vZGU7Ci0gICAgcmVzID0gbWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZSgKLSAgICAgICAgICAgIChjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90KWNvbmZpZy0+b3BlcmF0aW9uX21vZGUsCi0gICAgICAgICAgICAvKm91dCovICZvcGVyYXRpb25Nb2RlKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7Ci0gICAgc2l6ZV90IHNlc3Npb25QYXJhbVNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUoc2Vzc2lvblBhcmFtcyk7Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKLSAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnNlc3Npb25QYXJhbXMuc2V0VG9FeHRlcm5hbCgKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihzZXNzaW9uUGFyYW1zKSksCi0gICAgICAgICAgICBzZXNzaW9uUGFyYW1TaXplKTsKLQotICAgIC8vIFNlZSB3aGljaCB2ZXJzaW9uIG9mIEhBTCB3ZSBoYXZlCi0gICAgaWYgKG1IaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgewotICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIrKzsKLSAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5tdWx0aVJlc29sdXRpb25JbnB1dEltYWdlID0KLSAgICAgICAgICAgICAgICBjb25maWctPmlucHV0X2lzX211bHRpX3Jlc29sdXRpb247Ci0KLSAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIHJhd01ldGFkYXRhID0gY2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmdldEFuZExvY2soKTsKLSAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIGhpZGxDaGFycyA9IHt9OwotICAgICAgICBoaWRsQ2hhcnMuc2V0VG9FeHRlcm5hbCgKLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4ocmF3TWV0YWRhdGEpKSwKLSAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmF3TWV0YWRhdGEpKTsKLSAgICAgICAgY2FtZXJhQ2hhcmFjdGVyaXN0aWNzLnVubG9jayhyYXdNZXRhZGF0YSk7Ci0KLSAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbj4KLSAgICAgICAgICAgICAgICBoaWRsSW5qZWN0aW9uU2Vzc2lvbl8zXzc7Ci0gICAgICAgIGF1dG8gY2FzdEluamVjdGlvblJlc3VsdF8zXzcgPQotICAgICAgICAgICAgICAgIGRldmljZTo6VjNfNzo6SUNhbWVyYUluamVjdGlvblNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbl8zXzcpOwotICAgICAgICBpZiAoY2FzdEluamVjdGlvblJlc3VsdF8zXzcuaXNPaygpKSB7Ci0gICAgICAgICAgICBoaWRsSW5qZWN0aW9uU2Vzc2lvbl8zXzcgPSBjYXN0SW5qZWN0aW9uUmVzdWx0XzNfNzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBjYXN0SW5qZWN0aW9uUmVzdWx0XzNfNy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgICAgICB9Ci0KLSAgICAgICAgYXV0byBlcnIgPSBoaWRsSW5qZWN0aW9uU2Vzc2lvbl8zXzctPmNvbmZpZ3VyZUluamVjdGlvblN0cmVhbXMoCi0gICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNywgaGlkbENoYXJzKTsKLSAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiJXM6IG1IaWRsU2Vzc2lvbl8zXzcgZG9lcyBub3QgZXhpc3QsIHRoZSBsb3dlc3QgdmVyc2lvbiBvZiBpbmplY3Rpb24gIgotICAgICAgICAgICAgICAgICJzZXNzaW9uIGlzIDMuNyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OndyYXBBc0hpZGxSZXF1ZXN0KGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCwKLSAgICAgICAgLypvdXQqL2RldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIGNhcHR1cmVSZXF1ZXN0LAotICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkLAotICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiogaW5mbGlnaHRCdWZmZXJzKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBpZiAoY2FwdHVyZVJlcXVlc3QgPT0gbnVsbHB0ciB8fCBoYW5kbGVzQ3JlYXRlZCA9PSBudWxscHRyIHx8IGluZmxpZ2h0QnVmZmVycyA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogY2FwdHVyZVJlcXVlc3QgKCVwKSwgaGFuZGxlc0NyZWF0ZWQgKCVwKSwgYW5kIGluZmxpZ2h0QnVmZmVycyglcCkgIgotICAgICAgICAgICAgICAgICJtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fLCBjYXB0dXJlUmVxdWVzdCwgaGFuZGxlc0NyZWF0ZWQsIGluZmxpZ2h0QnVmZmVycyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyID0gcmVxdWVzdC0+ZnJhbWVfbnVtYmVyOwotCi0gICAgY2FwdHVyZVJlcXVlc3QtPmZtcVNldHRpbmdzU2l6ZSA9IDA7Ci0KLSAgICB7Ci0gICAgICAgIGlmIChyZXF1ZXN0LT5pbnB1dF9idWZmZXIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IENhbWVyYTNTdHJlYW06OmNhc3QocmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5zdHJlYW0pLT5nZXRJZCgpOwotICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZiA9ICoocmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5idWZmZXIpOwotICAgICAgICAgICAgYXV0byBwYWlyID0gZ2V0QnVmZmVySWQoYnVmLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICBib29sIGlzTmV3QnVmZmVyID0gcGFpci5maXJzdDsKLSAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkID0gcGFpci5zZWNvbmQ7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuc3RyZWFtSWQgPSBzdHJlYW1JZDsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5idWZmZXJJZCA9IGJ1ZmZlcklkOwotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLmJ1ZmZlciA9IChpc05ld0J1ZmZlcikgPyBidWYgOiBudWxscHRyOwotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5hY3F1aXJlX2ZlbmNlICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKLSAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UtPmRhdGFbMF0gPSByZXF1ZXN0LT5pbnB1dF9idWZmZXItPmFjcXVpcmVfZmVuY2U7Ci0gICAgICAgICAgICAgICAgaGFuZGxlc0NyZWF0ZWQtPnB1c2hfYmFjayhhY3F1aXJlRmVuY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLmFjcXVpcmVGZW5jZSA9IGFjcXVpcmVGZW5jZTsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5yZWxlYXNlRmVuY2UgPSBudWxscHRyOwotCi0gICAgICAgICAgICBtQnVmZmVyUmVjb3Jkcy5wdXNoSW5mbGlnaHRCdWZmZXIoY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5idWZmZXIpOwotICAgICAgICAgICAgaW5mbGlnaHRCdWZmZXJzLT5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLnN0cmVhbUlkID0gLTE7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYnVmZmVySWQgPSBCVUZGRVJfSURfTk9fQlVGRkVSOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm91dHB1dEJ1ZmZlcnMucmVzaXplKHJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVycyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKnNyYyA9IHJlcXVlc3QtPm91dHB1dF9idWZmZXJzICsgaTsKLSAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciAmZHN0ID0gY2FwdHVyZVJlcXVlc3QtPm91dHB1dEJ1ZmZlcnNbaV07Ci0gICAgICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMtPnN0cmVhbSktPmdldElkKCk7Ci0gICAgICAgICAgICBpZiAoc3JjLT5idWZmZXIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWYgPSAqKHNyYy0+YnVmZmVyKTsKLSAgICAgICAgICAgICAgICBhdXRvIHBhaXIgPSBnZXRCdWZmZXJJZChidWYsIHN0cmVhbUlkKTsKLSAgICAgICAgICAgICAgICBib29sIGlzTmV3QnVmZmVyID0gcGFpci5maXJzdDsKLSAgICAgICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKLSAgICAgICAgICAgICAgICBkc3QuYnVmZmVyID0gaXNOZXdCdWZmZXIgPyBidWYgOiBudWxscHRyOwotICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKLSAgICAgICAgICAgICAgICBpZiAoc3JjLT5hY3F1aXJlX2ZlbmNlICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHNyYy0+YWNxdWlyZV9mZW5jZTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlc0NyZWF0ZWQtPnB1c2hfYmFjayhhY3F1aXJlRmVuY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkc3QuYWNxdWlyZUZlbmNlID0gYWNxdWlyZUZlbmNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgewotICAgICAgICAgICAgICAgIC8vIEhBTCBidWZmZXIgbWFuYWdlbWVudCBwYXRoCi0gICAgICAgICAgICAgICAgZHN0LmJ1ZmZlcklkID0gQlVGRkVSX0lEX05PX0JVRkZFUjsKLSAgICAgICAgICAgICAgICBkc3QuYnVmZmVyID0gbnVsbHB0cjsKLSAgICAgICAgICAgICAgICBkc3QuYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3Qgc2VuZCBhIG51bGwgYnVmZmVyIGluIGNhcHR1cmUgcmVxdWVzdCEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkc3Quc3RyZWFtSWQgPSBzdHJlYW1JZDsKLSAgICAgICAgICAgIGRzdC5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOwotICAgICAgICAgICAgZHN0LnJlbGVhc2VGZW5jZSA9IG51bGxwdHI7Ci0KLSAgICAgICAgICAgIC8vIE91dHB1dCBidWZmZXJzIGFyZSBlbXB0eSB3aGVuIHVzaW5nIEhBTCBidWZmZXIgbWFuYWdlcgotICAgICAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgewotICAgICAgICAgICAgICAgIG1CdWZmZXJSZWNvcmRzLnB1c2hJbmZsaWdodEJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQsIHNyYy0+YnVmZmVyKTsKLSAgICAgICAgICAgICAgICBpbmZsaWdodEJ1ZmZlcnMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Y2xlYW51cE5hdGl2ZUhhbmRsZXMoCit2b2lkIENhbWVyYTNEZXZpY2U6OmNsZWFudXBOYXRpdmVIYW5kbGVzKAogICAgICAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiAqaGFuZGxlcywgYm9vbCBjbG9zZUZkKSB7CiAgICAgaWYgKGhhbmRsZXMgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CkBAIC0zNzk1LDMwMSArMjc5OSw5IEBACiAgICAgcmV0dXJuOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cygKLSAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90Kj4mIHJlcXVlc3RzLC8qb3V0Ki91aW50MzJfdCogbnVtUmVxdWVzdFByb2Nlc3NlZCkgewotICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OnByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cyIpOwotICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotCi0gICAgc3A8ZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gaGlkbFNlc3Npb25fM180OwotICAgIHNwPGRldmljZTo6VjNfNzo6SUNhbWVyYURldmljZVNlc3Npb24+IGhpZGxTZXNzaW9uXzNfNzsKLSAgICBhdXRvIGNhc3RSZXN1bHRfM183ID0gZGV2aWNlOjpWM183OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKLSAgICBpZiAoY2FzdFJlc3VsdF8zXzcuaXNPaygpKSB7Ci0gICAgICAgIGhpZGxTZXNzaW9uXzNfNyA9IGNhc3RSZXN1bHRfM183OwotICAgIH0KLSAgICBhdXRvIGNhc3RSZXN1bHRfM180ID0gZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKLSAgICBpZiAoY2FzdFJlc3VsdF8zXzQuaXNPaygpKSB7Ci0gICAgICAgIGhpZGxTZXNzaW9uXzNfNCA9IGNhc3RSZXN1bHRfM180OwotICAgIH0KLQotICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0PiBjYXB0dXJlUmVxdWVzdHM7Ci0gICAgaGFyZHdhcmU6OmhpZGxfdmVjPGRldmljZTo6VjNfNDo6Q2FwdHVyZVJlcXVlc3Q+IGNhcHR1cmVSZXF1ZXN0c18zXzQ7Ci0gICAgaGFyZHdhcmU6OmhpZGxfdmVjPGRldmljZTo6VjNfNzo6Q2FwdHVyZVJlcXVlc3Q+IGNhcHR1cmVSZXF1ZXN0c18zXzc7Ci0gICAgc2l6ZV90IGJhdGNoU2l6ZSA9IHJlcXVlc3RzLnNpemUoKTsKLSAgICBpZiAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKLSAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfNy5yZXNpemUoYmF0Y2hTaXplKTsKLSAgICB9IGVsc2UgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7Ci0gICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzQucmVzaXplKGJhdGNoU2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY2FwdHVyZVJlcXVlc3RzLnJlc2l6ZShiYXRjaFNpemUpOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiBoYW5kbGVzQ3JlYXRlZDsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+IGluZmxpZ2h0QnVmZmVyczsKLQotICAgIHN0YXR1c190IHJlcyA9IE9LOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKLSAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXMgPSB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNfM183W2ldLnYzXzQudjNfMiwKLSAgICAgICAgICAgICAgICAgICAgLypvdXQqLyZoYW5kbGVzQ3JlYXRlZCwgLypvdXQqLyZpbmZsaWdodEJ1ZmZlcnMpOwotICAgICAgICB9IGVsc2UgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXMgPSB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNfM180W2ldLnYzXzIsCi0gICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQsIC8qb3V0Ki8maW5mbGlnaHRCdWZmZXJzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c1tpXSwKLSAgICAgICAgICAgICAgICAgICAgLypvdXQqLyZoYW5kbGVzQ3JlYXRlZCwgLypvdXQqLyZpbmZsaWdodEJ1ZmZlcnMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIG1CdWZmZXJSZWNvcmRzLnBvcEluZmxpZ2h0QnVmZmVycyhpbmZsaWdodEJ1ZmZlcnMpOwotICAgICAgICAgICAgY2xlYW51cE5hdGl2ZUhhbmRsZXMoJmhhbmRsZXNDcmVhdGVkKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGQ6OnZlY3RvcjxkZXZpY2U6OlYzXzI6OkJ1ZmZlckNhY2hlPiBjYWNoZXNUb1JlbW92ZTsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1GcmVlZEJ1ZmZlcnNMb2NrKTsKLSAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogbUZyZWVkQnVmZmVycykgewotICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSBtaWdodCBoYXZlIGJlZW4gcmVtb3ZlZCBzaW5jZSBvbkJ1ZmZlckZyZWVkCi0gICAgICAgICAgICBpZiAobUJ1ZmZlclJlY29yZHMuaXNTdHJlYW1DYWNoZWQocGFpci5maXJzdCkpIHsKLSAgICAgICAgICAgICAgICBjYWNoZXNUb1JlbW92ZS5wdXNoX2JhY2soe3BhaXIuZmlyc3QsIHBhaXIuc2Vjb25kfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUZyZWVkQnVmZmVycy5jbGVhcigpOwotICAgIH0KLQotICAgIGNvbW1vbjo6VjFfMDo6U3RhdHVzIHN0YXR1cyA9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9IDA7Ci0KLSAgICAvLyBXcml0ZSBtZXRhZGF0YSB0byBGTVEuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiYXRjaFNpemU7IGkrKykgewotICAgICAgICBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QqIHJlcXVlc3QgPSByZXF1ZXN0c1tpXTsKLSAgICAgICAgZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogY2FwdHVyZVJlcXVlc3Q7Ci0gICAgICAgIGlmIChoaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QgPSAmY2FwdHVyZVJlcXVlc3RzXzNfN1tpXS52M180LnYzXzI7Ci0gICAgICAgIH0gZWxzZSBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0ID0gJmNhcHR1cmVSZXF1ZXN0c18zXzRbaV0udjNfMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0ID0gJmNhcHR1cmVSZXF1ZXN0c1tpXTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXF1ZXN0LT5zZXR0aW5ncyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBzaXplX3Qgc2V0dGluZ3NTaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJlcXVlc3QtPnNldHRpbmdzKTsKLSAgICAgICAgICAgIGlmIChtUmVxdWVzdE1ldGFkYXRhUXVldWUgIT0gbnVsbHB0ciAmJiBtUmVxdWVzdE1ldGFkYXRhUXVldWUtPndyaXRlKAotICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyZXF1ZXN0LT5zZXR0aW5ncyksIHNldHRpbmdzU2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+c2V0dGluZ3MucmVzaXplKDApOwotICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5mbXFTZXR0aW5nc1NpemUgPSBzZXR0aW5nc1NpemU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtUmVxdWVzdE1ldGFkYXRhUXVldWUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNvdWxkbid0IHV0aWxpemUgZm1xLCBmYWxsYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5zZXR0aW5ncy5zZXRUb0V4dGVybmFsKAotICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHJlcXVlc3QtPnNldHRpbmdzKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmVxdWVzdC0+c2V0dGluZ3MpKTsKLSAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gMHU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBBIG51bGwgcmVxdWVzdCBzZXR0aW5ncyBtYXBzIHRvIGEgc2l6ZS0wIENhbWVyYU1ldGFkYXRhCi0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+c2V0dGluZ3MucmVzaXplKDApOwotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmZtcVNldHRpbmdzU2l6ZSA9IDB1OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGlkbCBzZXNzaW9uIDMuNyBzcGVjaWZpYyBoYW5kbGluZy4KLSAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM183W2ldLmlucHV0V2lkdGggPSByZXF1ZXN0LT5pbnB1dF93aWR0aDsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzdbaV0uaW5wdXRIZWlnaHQgPSByZXF1ZXN0LT5pbnB1dF9oZWlnaHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoaWRsIHNlc3Npb24gMy43IGFuZCAzLjQgc3BlY2lmaWMgaGFuZGxpbmcuCi0gICAgICAgIGlmIChoaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0ciB8fCBoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nPiYgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgIChoaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgPwotICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM183W2ldLnYzXzQucGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA6Ci0gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzRbaV0ucGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKLSAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucmVzaXplKHJlcXVlc3QtPm51bV9waHlzY2FtX3NldHRpbmdzKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3M7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNldHRpbmdzU2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyICYmIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nc1NpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLnJlc2l6ZSgwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uZm1xU2V0dGluZ3NTaXplID0gc2V0dGluZ3NTaXplOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBjb3VsZG4ndCB1dGlsaXplIGZtcSwgZmFsbGJhY2sgdG8gaHdiaW5kZXIiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5zZXR0aW5ncy5zZXRUb0V4dGVybmFsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5mbXFTZXR0aW5nc1NpemUgPSAwdTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uZm1xU2V0dGluZ3NTaXplID0gMHU7Ci0gICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uc2V0dGluZ3MucmVzaXplKDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnBoeXNpY2FsQ2FtZXJhSWQgPSByZXF1ZXN0LT5waHlzY2FtX2lkW2pdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaGFyZHdhcmU6OmRldGFpbHM6OnJldHVybl9zdGF0dXMgZXJyOwotICAgIGF1dG8gcmVzdWx0Q2FsbGJhY2sgPQotICAgICAgICBbJnN0YXR1cywgJm51bVJlcXVlc3RQcm9jZXNzZWRdIChhdXRvIHMsIHVpbnQzMl90IG4pIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gbjsKLSAgICAgICAgfTsKLSAgICBpZiAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKLSAgICAgICAgZXJyID0gaGlkbFNlc3Npb25fM183LT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3RfM183KGNhcHR1cmVSZXF1ZXN0c18zXzcsIGNhY2hlc1RvUmVtb3ZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOwotICAgIH0gZWxzZSBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKLSAgICAgICAgZXJyID0gaGlkbFNlc3Npb25fM180LT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3RfM180KGNhcHR1cmVSZXF1ZXN0c18zXzQsIGNhY2hlc1RvUmVtb3ZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IG1IaWRsU2Vzc2lvbi0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KGNhcHR1cmVSZXF1ZXN0cywgY2FjaGVzVG9SZW1vdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKTsKLSAgICB9Ci0gICAgaWYgKCFlcnIuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OkNBTUVSQV9ESVNDT05ORUNURUQ7Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyA9PSBjb21tb246OlYxXzA6OlN0YXR1czo6T0sgJiYgKm51bVJlcXVlc3RQcm9jZXNzZWQgIT0gYmF0Y2hTaXplKSB7Ci0gICAgICAgIEFMT0dFKCIlczogcHJvY2Vzc0NhcHR1cmVSZXF1ZXN0IHJldHVybnMgT0sgYnV0IHByb2Nlc3NlZCAlZC8lenUgcmVxdWVzdHMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKm51bVJlcXVlc3RQcm9jZXNzZWQsIGJhdGNoU2l6ZSk7Ci0gICAgICAgIHN0YXR1cyA9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICB9Ci0KLSAgICByZXMgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChzdGF0dXMpOwotICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgaWYgKG1IaWRsU2Vzc2lvbi0+aXNSZW1vdGUoKSkgewotICAgICAgICAgICAgLy8gT25seSBjbG9zZSBhY3F1aXJlIGZlbmNlIEZEcyB3aGVuIHRoZSBISURMIHRyYW5zYWN0aW9uIHN1Y2NlZWRzIChzbyB0aGUgRkRzIGhhdmUgYmVlbgotICAgICAgICAgICAgLy8gc2VudCB0byBjYW1lcmEgSEFMIHByb2Nlc3NlcykKLSAgICAgICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCwgLypjbG9zZUZkKi90cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEluIHBhc3N0aHJvdWdoIG1vZGUgdGhlIEZEcyBhcmUgbm93IG93bmVkIGJ5IEhBTAotICAgICAgICAgICAgY2xlYW51cE5hdGl2ZUhhbmRsZXMoJmhhbmRsZXNDcmVhdGVkKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1CdWZmZXJSZWNvcmRzLnBvcEluZmxpZ2h0QnVmZmVycyhpbmZsaWdodEJ1ZmZlcnMpOwotICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmZsdXNoKCkgewotICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmZsdXNoIik7Ci0gICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc3RhdHVzX3QgcmVzID0gT0s7Ci0KLSAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbi0+Zmx1c2goKTsKLSAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXMgPSBERUFEX09CSkVDVDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXMgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChlcnIpOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6ZHVtcChpbnQgLypmZCovKSB7Ci0gICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6ZHVtcCIpOwotICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotCi0gICAgLy8gSGFuZGxlZCBieSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmR1bXAKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjbG9zZSgpIHsKLSAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpjbG9zZSgpIik7Ci0gICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc3RhdHVzX3QgcmVzID0gT0s7Ci0KLSAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbi0+Y2xvc2UoKTsKLSAgICAvLyBJbnRlcmZhY2Ugd2lsbCBiZSBkZWFkIHNob3J0bHkgYW55d2F5LCBzbyBkb24ndCBsb2cgZXJyb3JzCi0gICAgaWYgKCFlcnIuaXNPaygpKSB7Ci0gICAgICAgIHJlcyA9IERFQURfT0JKRUNUOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KLXZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcykgewotICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OnNpZ25hbFBpcGVsaW5lRHJhaW4iKTsKLSAgICBpZiAoIXZhbGlkKCkgfHwgbUhpZGxTZXNzaW9uXzNfNSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgb24gaW52YWxpZCBjYW1lcmEhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNS0+c2lnbmFsU3RyZWFtRmx1c2goc3RyZWFtSWRzLCBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIgLSAxKTsKLSAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnN3aXRjaFRvT2ZmbGluZSgKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHN0cmVhbXNUb0tlZXAsCi0gICAgICAgIC8qb3V0Ki9oYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OkNhbWVyYU9mZmxpbmVTZXNzaW9uSW5mbyogb2ZmbGluZVNlc3Npb25JbmZvLAotICAgICAgICAvKm91dCovc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+KiBvZmZsaW5lU2Vzc2lvbiwKLSAgICAgICAgLypvdXQqL2NhbWVyYTM6OkJ1ZmZlclJlY29yZHMqIGJ1ZmZlclJlY29yZHMpIHsKLSAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpzd2l0Y2hUb09mZmxpbmUiKTsKLSAgICBpZiAoIXZhbGlkKCkgfHwgbUhpZGxTZXNzaW9uXzNfNiA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgb24gaW52YWxpZCBjYW1lcmEhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGlmIChvZmZsaW5lU2Vzc2lvbkluZm8gPT0gbnVsbHB0ciB8fCBvZmZsaW5lU2Vzc2lvbiA9PSBudWxscHRyIHx8IGJ1ZmZlclJlY29yZHMgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IG91dHB1dCBhcmd1bWVudHMgbXVzdCBub3QgYmUgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgIGF1dG8gcmVzdWx0Q2FsbGJhY2sgPQotICAgICAgICBbJnN0YXR1cywgJm9mZmxpbmVTZXNzaW9uSW5mbywgJm9mZmxpbmVTZXNzaW9uXSAoYXV0byBzLCBhdXRvIGluZm8sIGF1dG8gc2Vzc2lvbikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgKm9mZmxpbmVTZXNzaW9uSW5mbyA9IGluZm87Ci0gICAgICAgICAgICAgICAgKm9mZmxpbmVTZXNzaW9uID0gc2Vzc2lvbjsKLSAgICAgICAgfTsKLSAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzYtPnN3aXRjaFRvT2ZmbGluZShzdHJlYW1zVG9LZWVwLCByZXN1bHRDYWxsYmFjayk7Ci0KLSAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgcmV0ID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLSAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogYXNzZXJ0IG5vIG9uZ29pbmcgcmVxdWVzdEJ1ZmZlci9yZXR1cm5CdWZmZXIgY2FsbCBoZXJlCi0gICAgLy8gVE9ETzogdXBkYXRlIFJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmUgdG8gYmxvY2sgcmVxdWVzdEJ1ZmZlci9yZXR1cm5CdWZmZXIgb25jZSBIQUwKLSAgICAvLyAgICAgICByZXR1cm5zIGZyb20gc3dpdGNoVG9PZmZsaW5lLgotCi0KLSAgICAvLyBWYWxpZGF0ZSBidWZmZXIgY2FjaGVzCi0gICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gc3RyZWFtczsKLSAgICBzdHJlYW1zLnJlc2VydmUob2ZmbGluZVNlc3Npb25JbmZvLT5vZmZsaW5lU3RyZWFtcy5zaXplKCkpOwotICAgIGZvciAoYXV0byBvZmZsaW5lU3RyZWFtIDogb2ZmbGluZVNlc3Npb25JbmZvLT5vZmZsaW5lU3RyZWFtcykgewotICAgICAgICBpbnQzMl90IGlkID0gb2ZmbGluZVN0cmVhbS5pZDsKLSAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soaWQpOwotICAgICAgICAvLyBWZXJpZnkgYnVmZmVyIGNhY2hlcwotICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gYnVmSWRzKG9mZmxpbmVTdHJlYW0uY2lyY3VsYXRpbmdCdWZmZXJJZHMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICBvZmZsaW5lU3RyZWFtLmNpcmN1bGF0aW5nQnVmZmVySWRzLmVuZCgpKTsKLSAgICAgICAgaWYgKCF2ZXJpZnlCdWZmZXJJZHMoaWQsIGJ1ZklkcykpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogc3RyZWFtIElEICVkIGJ1ZmZlciBjYWNoZSByZWNvcmRzIG1pc21hdGNoISIsIF9fRlVOQ1RJT05fXywgaWQpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBNb3ZlIGJ1ZmZlciByZWNvcmRzCi0gICAgYnVmZmVyUmVjb3Jkcy0+dGFrZUJ1ZmZlckNhY2hlcyhtQnVmZmVyUmVjb3Jkcywgc3RyZWFtcyk7Ci0gICAgYnVmZmVyUmVjb3Jkcy0+dGFrZUluZmxpZ2h0QnVmZmVyTWFwKG1CdWZmZXJSZWNvcmRzKTsKLSAgICBidWZmZXJSZWNvcmRzLT50YWtlUmVxdWVzdGVkQnVmZmVyTWFwKG1CdWZmZXJSZWNvcmRzKTsKLSAgICByZXR1cm4gcmV0OwotfQorLyoqCisgKiBIYWxJbnRlcmZhY2UgaW5uZXIgY2xhc3MgbWV0aG9kcworICovCiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpnZXRJbmZsaWdodEJ1ZmZlcktleXMoCiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIG91dCkgewpAQCAtNDEzMiw2ICsyODQ0LDExIEBACiAgICAgcmV0dXJuIG1CdWZmZXJSZWNvcmRzLmdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOwogfQogCit1aW50NjRfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnJlbW92ZU9uZUJ1ZmZlckNhY2hlKGludCBzdHJlYW1JZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpIHsKKyAgICByZXR1cm4gbUJ1ZmZlclJlY29yZHMucmVtb3ZlT25lQnVmZmVyQ2FjaGUoc3RyZWFtSWQsIGhhbmRsZSk7Cit9CisKIHZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpvbkJ1ZmZlckZyZWVkKAogICAgICAgICBpbnQgc3RyZWFtSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKSB7CiAgICAgdWludDMyX3QgYnVmZmVySWQgPSBtQnVmZmVyUmVjb3Jkcy5yZW1vdmVPbmVCdWZmZXJDYWNoZShzdHJlYW1JZCwgaGFuZGxlKTsKQEAgLTQxNjQsNiArMjg4MSw3IEBACiAgICAgICAgIG1JbnRlcmZhY2UoaW50ZXJmYWNlKSwKICAgICAgICAgbUxpc3RlbmVyKG51bGxwdHIpLAogICAgICAgICBtSWQoZ2V0SWQocGFyZW50KSksCisgICAgICAgIG1SZXF1ZXN0Q2xlYXJpbmcoZmFsc2UpLAogICAgICAgICBtRmlyc3RSZXBlYXRpbmcoZmFsc2UpLAogICAgICAgICBtUmVjb25maWd1cmVkKGZhbHNlKSwKICAgICAgICAgbURvUGF1c2UoZmFsc2UpLApAQCAtNDE3NCw2ICsyODkyLDcgQEAKICAgICAgICAgbUN1cnJlbnRBZlRyaWdnZXJJZCgwKSwKICAgICAgICAgbUN1cnJlbnRQcmVDYXB0dXJlVHJpZ2dlcklkKDApLAogICAgICAgICBtUm90YXRlQW5kQ3JvcE92ZXJyaWRlKEFORFJPSURfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUF9OT05FKSwKKyAgICAgICAgbUNvbXBvc2VyT3V0cHV0KGZhbHNlKSwKICAgICAgICAgbUNhbWVyYU11dGUoQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREVfT0ZGKSwKICAgICAgICAgbUNhbWVyYU11dGVDaGFuZ2VkKGZhbHNlKSwKICAgICAgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcigKQEAgLTQzMjksMTAgKzMwNDgsMjAgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYXJSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgvKm91dCovaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gc3RyZWFtSWRzOworICAgIGZvciAoY29uc3QgYXV0byYgcmVxdWVzdCA6IG1SZXBlYXRpbmdSZXF1ZXN0cykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0cmVhbSA6IHJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zKSB7CisgICAgICAgICAgICBzdHJlYW1JZHMucHVzaF9iYWNrKHN0cmVhbS0+Z2V0SWQoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBtUmVwZWF0aW5nUmVxdWVzdHMuY2xlYXIoKTsKICAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKICAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CiAgICAgfQorCisgICAgbUludGVyZmFjZS0+cmVwZWF0aW5nUmVxdWVzdEVuZChtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyLCBzdHJlYW1JZHMpOworCiAgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlciA9IGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6Tk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVM7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNDM4Niw2ICszMTE1LDcgQEAKICAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CiAgICAgfQogICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIgPSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6Ok5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTOworICAgIG1SZXF1ZXN0Q2xlYXJpbmcgPSB0cnVlOwogICAgIG1SZXF1ZXN0U2lnbmFsLnNpZ25hbCgpOwogICAgIHJldHVybiBPSzsKIH0KQEAgLTQ1MTMsMTMgKzMyNDMsMTYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotbnNlY3NfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjYWxjdWxhdGVNYXhFeHBlY3RlZER1cmF0aW9uKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyZXF1ZXN0KSB7Ci0gICAgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uID0ga0RlZmF1bHRFeHBlY3RlZER1cmF0aW9uOworc3RkOjpwYWlyPG5zZWNzX3QsIG5zZWNzX3Q+IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNhbGN1bGF0ZUV4cGVjdGVkRHVyYXRpb25SYW5nZSgKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJlcXVlc3QpIHsKKyAgICBzdGQ6OnBhaXI8bnNlY3NfdCwgbnNlY3NfdD4gZXhwZWN0ZWRSYW5nZSgKKyAgICAgICAgICAgIEluRmxpZ2h0UmVxdWVzdDo6a0RlZmF1bHRNaW5FeHBlY3RlZER1cmF0aW9uLAorICAgICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0OjprRGVmYXVsdE1heEV4cGVjdGVkRHVyYXRpb24pOwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGUgPSBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCgpOwogICAgIGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KHJlcXVlc3QsCiAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQUVfTU9ERSwKICAgICAgICAgICAgICZlKTsKLSAgICBpZiAoZS5jb3VudCA9PSAwKSByZXR1cm4gbWF4RXhwZWN0ZWREdXJhdGlvbjsKKyAgICBpZiAoZS5jb3VudCA9PSAwKSByZXR1cm4gZXhwZWN0ZWRSYW5nZTsKIAogICAgIHN3aXRjaCAoZS5kYXRhLnU4WzBdKSB7CiAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT0ZGOgpAQCAtNDUyNywxMyArMzI2MCwxNSBAQAogICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9FWFBPU1VSRV9USU1FLAogICAgICAgICAgICAgICAgICAgICAmZSk7CiAgICAgICAgICAgICBpZiAoZS5jb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uID0gZS5kYXRhLmk2NFswXTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZFJhbmdlLmZpcnN0ID0gZS5kYXRhLmk2NFswXTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZFJhbmdlLnNlY29uZCA9IGV4cGVjdGVkUmFuZ2UuZmlyc3Q7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmaW5kX2NhbWVyYV9tZXRhZGF0YV9yb19lbnRyeShyZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9GUkFNRV9EVVJBVElPTiwKICAgICAgICAgICAgICAgICAgICAgJmUpOwogICAgICAgICAgICAgaWYgKGUuY291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbiA9IHN0ZDo6bWF4KGUuZGF0YS5pNjRbMF0sIG1heEV4cGVjdGVkRHVyYXRpb24pOworICAgICAgICAgICAgICAgIGV4cGVjdGVkUmFuZ2UuZmlyc3QgPSBzdGQ6Om1heChlLmRhdGEuaTY0WzBdLCBleHBlY3RlZFJhbmdlLmZpcnN0KTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZFJhbmdlLnNlY29uZCA9IGV4cGVjdGVkUmFuZ2UuZmlyc3Q7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKQEAgLTQ1NDEsMTIgKzMyNzYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX0FFX1RBUkdFVF9GUFNfUkFOR0UsCiAgICAgICAgICAgICAgICAgICAgICZlKTsKICAgICAgICAgICAgIGlmIChlLmNvdW50ID4gMSkgewotICAgICAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24gPSAxZTkgLyBlLmRhdGEudThbMF07CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRSYW5nZS5maXJzdCA9IDFlOSAvIGUuZGF0YS5pMzJbMV07CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRSYW5nZS5zZWNvbmQgPSAxZTkgLyBlLmRhdGEuaTMyWzBdOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgcmV0dXJuIG1heEV4cGVjdGVkRHVyYXRpb247CisgICAgcmV0dXJuIGV4cGVjdGVkUmFuZ2U7CiB9CiAKIGJvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2tpcEhGUlRhcmdldEZQU1VwZGF0ZShpbnQzMl90IHRhZywKQEAgLTQ1NzgsOSArMzMxNCwxNSBAQAogCiAgICAgICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOwogICAgICAgICBpZiAocGFyZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCA9IC0xOworICAgICAgICAgICAgaWYgKGhhbFJlcXVlc3QuaW5wdXRfYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgaW5wdXRTdHJlYW1JZCA9IENhbWVyYTNTdHJlYW06OmNhc3QoaGFsUmVxdWVzdC5pbnB1dF9idWZmZXItPnN0cmVhbSktPmdldElkKCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHBhcmVudC0+bW9uaXRvck1ldGFkYXRhKFRhZ01vbml0b3I6OlJFUVVFU1QsCiAgICAgICAgICAgICAgICAgICAgIGhhbFJlcXVlc3QuZnJhbWVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAwLCBtTGF0ZXN0UmVxdWVzdCwgbUxhdGVzdFBoeXNpY2FsUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIDAsIG1MYXRlc3RSZXF1ZXN0LCBtTGF0ZXN0UGh5c2ljYWxSZXF1ZXN0LCBoYWxSZXF1ZXN0Lm91dHB1dF9idWZmZXJzLAorICAgICAgICAgICAgICAgICAgICBoYWxSZXF1ZXN0Lm51bV9vdXRwdXRfYnVmZmVycywgaW5wdXRTdHJlYW1JZCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ3NzgsNiArMzUyMCwyNiBAQAogICAgIHJldHVybiBzdWJtaXRSZXF1ZXN0U3VjY2VzczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6cmVtb3ZlRndrT25seVJlZ2lvbktleXMoQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjphcnJheTx1aW50MzJfdCwgND4ga0Z3a09ubHlSZWdpb25LZXlzID0ge0FORFJPSURfQ09OVFJPTF9BRl9SRUdJT05TX1NFVCwKKyAgICAgICAgQU5EUk9JRF9DT05UUk9MX0FFX1JFR0lPTlNfU0VULCBBTkRST0lEX0NPTlRST0xfQVdCX1JFR0lPTlNfU0VULAorICAgICAgICBBTkRST0lEX1NDQUxFUl9DUk9QX1JFR0lPTl9TRVR9OworICAgIGlmIChyZXF1ZXN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIHJlcXVlc3QgbWV0YWRhdGEgbnVsbHB0ciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGZvciAoY29uc3QgYXV0byAma2V5IDoga0Z3a09ubHlSZWdpb25LZXlzKSB7CisgICAgICAgIGlmIChyZXF1ZXN0LT5leGlzdHMoa2V5KSkgeworICAgICAgICAgICAgcmVzID0gcmVxdWVzdC0+ZXJhc2Uoa2V5KTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6cHJlcGFyZUhhbFJlcXVlc3RzKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKQEAgLTQ4MDQsNyArMzU2NiwxMSBAQAogICAgICAgICBib29sIHRyaWdnZXJzTWl4ZWRJbiA9ICh0cmlnZ2VyQ291bnQgPiAwIHx8IG1QcmV2VHJpZ2dlcnMgPiAwKTsKICAgICAgICAgbVByZXZUcmlnZ2VycyA9IHRyaWdnZXJDb3VudDsKIAotICAgICAgICBib29sIHJvdGF0ZUFuZENyb3BDaGFuZ2VkID0gb3ZlcnJpZGVBdXRvUm90YXRlQW5kQ3JvcChjYXB0dXJlUmVxdWVzdCk7CisgICAgICAgIC8vIERvIG5vdCBvdmVycmlkZSByb3RhdGUmY3JvcCBmb3Igc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHRoYXQgaW5jbHVkZQorICAgICAgICAvLyBTdXJmYWNlVmlld3MoSFdfQ09NUE9TRVIpIG91dHB1dC4gVGhlIGRpc3BsYXkgcm90YXRpb24gdGhlcmUgd2lsbCBiZQorICAgICAgICAvLyBjb21wZW5zYXRlZCBieSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9JTlZFUlNFX0RJU1BMQVkKKyAgICAgICAgYm9vbCByb3RhdGVBbmRDcm9wQ2hhbmdlZCA9IG1Db21wb3Nlck91dHB1dCA/IGZhbHNlIDoKKyAgICAgICAgICAgIG92ZXJyaWRlQXV0b1JvdGF0ZUFuZENyb3AoY2FwdHVyZVJlcXVlc3QpOwogICAgICAgICBib29sIHRlc3RQYXR0ZXJuQ2hhbmdlZCA9IG92ZXJyaWRlVGVzdFBhdHRlcm4oY2FwdHVyZVJlcXVlc3QpOwogCiAgICAgICAgIC8vIElmIHRoZSByZXF1ZXN0IGlzIHRoZSBzYW1lIGFzIGxhc3QsIG9yIHdlIGhhZCB0cmlnZ2VycyBub3cgb3IgbGFzdCB0aW1lIG9yCkBAIC00ODM3LDYgKzM2MDMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5lbmQoKTsgaXQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC0+bVVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcnMuZmluZChpdC0+Y2FtZXJhSWQpID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+bVVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlRndrT25seVJlZ2lvbktleXMoJihpdC0+bWV0YWRhdGEpKSAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gcmVtb3ZlIGZ3ay1vbmx5IGtleXMgZnJvbSByZXF1ZXN0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlZDogJXMgKCVkKSIsIGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNDg1MSw2ICszNjIzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25zVXBkYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZUZ3a09ubHlSZWdpb25LZXlzKCYoaXQtPm1ldGFkYXRhKSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIHJlbW92ZSBmd2stb25seSBrZXlzIGZyb20gcmVxdWVzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQ6ICVzICglZCkiLCBoYWxSZXF1ZXN0LT5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNTExOSwxMSArMzg5NywxMyBAQAogICAgICAgICAgICAgICAgIGlzWnNsQ2FwdHVyZSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgYXV0byBleHBlY3RlZER1cmF0aW9uUmFuZ2UgPSBjYWxjdWxhdGVFeHBlY3RlZER1cmF0aW9uUmFuZ2Uoc2V0dGluZ3MpOwogICAgICAgICByZXMgPSBwYXJlbnQtPnJlZ2lzdGVySW5GbGlnaHQoaGFsUmVxdWVzdC0+ZnJhbWVfbnVtYmVyLAogICAgICAgICAgICAgICAgIHRvdGFsTnVtQnVmZmVycywgY2FwdHVyZVJlcXVlc3QtPm1SZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgLypoYXNJbnB1dCovaGFsUmVxdWVzdC0+aW5wdXRfYnVmZmVyICE9IE5VTEwsCiAgICAgICAgICAgICAgICAgaGFzQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgY2FsY3VsYXRlTWF4RXhwZWN0ZWREdXJhdGlvbihzZXR0aW5ncyksCisgICAgICAgICAgICAgICAgLyptaW4qL2V4cGVjdGVkRHVyYXRpb25SYW5nZS5maXJzdCwKKyAgICAgICAgICAgICAgICAvKm1heCovZXhwZWN0ZWREdXJhdGlvblJhbmdlLnNlY29uZCwKICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQaHlzaWNhbENhbWVyYXMsIGlzU3RpbGxDYXB0dXJlLCBpc1pzbENhcHR1cmUsCiAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1Sb3RhdGVBbmRDcm9wQXV0bywgbVByZXZDYW1lcmFJZHNXaXRoWm9vbSwKICAgICAgICAgICAgICAgICAobVVzZUhhbEJ1Zk1hbmFnZXIpID8gdW5pcXVlU3VyZmFjZUlkTWFwIDoKQEAgLTUyNTUsMzggKzQwMzUsNiBAQAogICAgIG1QcmV2UmVxdWVzdC5jbGVhcigpOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzd2l0Y2hUb09mZmxpbmUoCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAotICAgICAgICAvKm91dCovaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpDYW1lcmFPZmZsaW5lU2Vzc2lvbkluZm8qIG9mZmxpbmVTZXNzaW9uSW5mbywKLSAgICAgICAgLypvdXQqL3NwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPiogb2ZmbGluZVNlc3Npb24sCi0gICAgICAgIC8qb3V0Ki9jYW1lcmEzOjpCdWZmZXJSZWNvcmRzKiBidWZmZXJSZWNvcmRzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKLSAgICBjbGVhclJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKC8qbGFzdEZyYW1lTnVtYmVyKi9udWxscHRyKTsKLQotICAgIC8vIFdhaXQgdW50aWwgcmVxdWVzdCB0aHJlYWQgaXMgZnVsbHkgc3RvcHBlZAotICAgIC8vIFRCRDogY2hlY2sgaWYgcmVxdWVzdCB0aHJlYWQgaXMgYmVpbmcgcGF1c2VkIGJ5IG90aGVyIEFQSXMgKHNob3VsZG4ndCBiZSkKLQotICAgIC8vIFdlIGNvdWxkIGFsc28gY2hlY2sgZm9yIG1SZXBlYXRpbmdSZXF1ZXN0cy5lbXB0eSgpLCBidXQgdGhlIEFQSSBpbnRlcmZhY2UKLSAgICAvLyBpcyBzZXJpYWxpemVkIGJ5IENhbWVyYTNEZXZpY2U6Om1JbnRlcmZhY2VMb2NrIHNvIG5vIG9uZSBzaG91bGQgYmUgYWJsZSB0byBzdWJtaXQgYW55Ci0gICAgLy8gbmV3IHJlcXVlc3RzIGR1cmluZyB0aGUgY2FsbDsgaGVuY2Ugc2tpcCB0aGF0IGNoZWNrLgotICAgIGJvb2wgcXVldWVFbXB0eSA9IG1OZXh0UmVxdWVzdHMuZW1wdHkoKSAmJiBtUmVxdWVzdFF1ZXVlLmVtcHR5KCk7Ci0gICAgd2hpbGUgKCFxdWV1ZUVtcHR5KSB7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IG1SZXF1ZXN0U3VibWl0dGVkU2lnbmFsLndhaXRSZWxhdGl2ZShtUmVxdWVzdExvY2ssIGtSZXF1ZXN0U3VibWl0VGltZW91dCk7Ci0gICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IHJlcXVlc3QgdGhyZWFkIGZhaWxlZCB0byBzdWJtaXQgb25lIHJlcXVlc3Qgd2l0aGluIHRpbWVvdXQhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IHJlcXVlc3QgdGhyZWFkIGZhaWxlZCB0byBzdWJtaXQgYSByZXF1ZXN0OiAlcyAoJWQpISIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgICAgIHF1ZXVlRW1wdHkgPSBtTmV4dFJlcXVlc3RzLmVtcHR5KCkgJiYgbVJlcXVlc3RRdWV1ZS5lbXB0eSgpOwotICAgIH0KLQotICAgIHJldHVybiBtSW50ZXJmYWNlLT5zd2l0Y2hUb09mZmxpbmUoCi0gICAgICAgICAgICBzdHJlYW1zVG9LZWVwLCBvZmZsaW5lU2Vzc2lvbkluZm8sIG9mZmxpbmVTZXNzaW9uLCBidWZmZXJSZWNvcmRzKTsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2V0Um90YXRlQW5kQ3JvcEF1dG9CZWhhdmlvcigKICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfcm90YXRlX2FuZF9jcm9wX3Qgcm90YXRlQW5kQ3JvcFZhbHVlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKQEAgLTUyOTgsNiArNDA0NiwxMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2V0Q29tcG9zZXJTdXJmYWNlKGJvb2wgY29tcG9zZXJTdXJmYWNlUHJlc2VudCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVRyaWdnZXJNdXRleCk7CisgICAgbUNvbXBvc2VyT3V0cHV0ID0gY29tcG9zZXJTdXJmYWNlUHJlc2VudDsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNldENhbWVyYU11dGUoaW50MzJfdCBtdXRlTW9kZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVRyaWdnZXJNdXRleCk7CkBAIC01Mzc2LDcgKzQxMzEsOCBAQAogICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGkpLmFjcXVpcmVfZmVuY2UgPSAtMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChpKS5zdGF0dXMgPSBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUjsKLSAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChpKS0+cmV0dXJuQnVmZmVyKCgqb3V0cHV0QnVmZmVycylbaV0sIDAsCisgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaSktPnJldHVybkJ1ZmZlcigoKm91dHB1dEJ1ZmZlcnMpW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgLyp0aW1lc3RhbXAqLzAsIC8qcmVhZG91dFRpbWVzdGFtcCovMCwKICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIH0KQEAgLTU0ODgsNyArNDI0NCw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIHJlcyA9IG1SZXF1ZXN0U2lnbmFsLndhaXRSZWxhdGl2ZShtUmVxdWVzdExvY2ssIGtSZXF1ZXN0VGltZW91dCk7CisgICAgICAgIGlmICghbVJlcXVlc3RDbGVhcmluZykgeworICAgICAgICAgICAgcmVzID0gbVJlcXVlc3RTaWduYWwud2FpdFJlbGF0aXZlKG1SZXF1ZXN0TG9jaywga1JlcXVlc3RUaW1lb3V0KTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmICgobVJlcXVlc3RRdWV1ZS5lbXB0eSgpICYmIG1SZXBlYXRpbmdSZXF1ZXN0cy5lbXB0eSgpKSB8fAogICAgICAgICAgICAgICAgIGV4aXRQZW5kaW5nKCkpIHsKQEAgLTU1MTEsNiArNDI2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+bVJlcXVlc3RCdWZmZXJTTS5vblJlcXVlc3RUaHJlYWRQYXVzZWQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVxdWVzdENsZWFyaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAvLyBTdG9wIHdhaXRpbmcgZm9yIG5vdyBhbmQgbGV0IHRocmVhZCBtYW5hZ2VtZW50IGhhcHBlbgogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTU4NzEsNDggKzQ2MzAsNTMgQEAKIAogICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwogCi0gICAgaW50MzJfdCB0ZXN0UGF0dGVybk1vZGUgPSByZXF1ZXN0LT5tT3JpZ2luYWxUZXN0UGF0dGVybk1vZGU7Ci0gICAgaW50MzJfdCB0ZXN0UGF0dGVybkRhdGFbNF0gPSB7Ci0gICAgICAgIHJlcXVlc3QtPm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVswXSwKLSAgICAgICAgcmVxdWVzdC0+bU9yaWdpbmFsVGVzdFBhdHRlcm5EYXRhWzFdLAotICAgICAgICByZXF1ZXN0LT5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbMl0sCi0gICAgICAgIHJlcXVlc3QtPm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVszXQotICAgIH07CisgICAgLy8gRm9yIGEgbXVsdGktY2FtZXJhLCB0aGUgcGh5c2ljYWwgY2FtZXJhcyBzdXBwb3J0IHRoZSBzYW1lIHNldCBvZgorICAgIC8vIHRlc3QgcGF0dGVybiBtb2RlcyBhcyB0aGUgbG9naWNhbCBjYW1lcmEuCisgICAgZm9yIChhdXRvJiBzZXR0aW5ncyA6IHJlcXVlc3QtPm1TZXR0aW5nc0xpc3QpIHsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhID0gc2V0dGluZ3MubWV0YWRhdGE7CiAKLSAgICBpZiAobUNhbWVyYU11dGUgIT0gQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREVfT0ZGKSB7Ci0gICAgICAgIHRlc3RQYXR0ZXJuTW9kZSA9IG1DYW1lcmFNdXRlOwotICAgICAgICB0ZXN0UGF0dGVybkRhdGFbMF0gPSAwOwotICAgICAgICB0ZXN0UGF0dGVybkRhdGFbMV0gPSAwOwotICAgICAgICB0ZXN0UGF0dGVybkRhdGFbMl0gPSAwOwotICAgICAgICB0ZXN0UGF0dGVybkRhdGFbM10gPSAwOwotICAgIH0KLQotICAgIENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSA9IHJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGE7Ci0KLSAgICBhdXRvIHRlc3RQYXR0ZXJuRW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFKTsKLSAgICBpZiAodGVzdFBhdHRlcm5FbnRyeS5jb3VudCA+IDApIHsKLSAgICAgICAgaWYgKHRlc3RQYXR0ZXJuRW50cnkuZGF0YS5pMzJbMF0gIT0gdGVzdFBhdHRlcm5Nb2RlKSB7Ci0gICAgICAgICAgICB0ZXN0UGF0dGVybkVudHJ5LmRhdGEuaTMyWzBdID0gdGVzdFBhdHRlcm5Nb2RlOwotICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIGludDMyX3QgdGVzdFBhdHRlcm5Nb2RlID0gc2V0dGluZ3MubU9yaWdpbmFsVGVzdFBhdHRlcm5Nb2RlOworICAgICAgICBpbnQzMl90IHRlc3RQYXR0ZXJuRGF0YVs0XSA9IHsKKyAgICAgICAgICAgIHNldHRpbmdzLm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVswXSwKKyAgICAgICAgICAgIHNldHRpbmdzLm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVsxXSwKKyAgICAgICAgICAgIHNldHRpbmdzLm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVsyXSwKKyAgICAgICAgICAgIHNldHRpbmdzLm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVszXQorICAgICAgICB9OworICAgICAgICBpZiAobUNhbWVyYU11dGUgIT0gQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREVfT0ZGKSB7CisgICAgICAgICAgICB0ZXN0UGF0dGVybk1vZGUgPSBtQ2FtZXJhTXV0ZTsKKyAgICAgICAgICAgIHRlc3RQYXR0ZXJuRGF0YVswXSA9IDA7CisgICAgICAgICAgICB0ZXN0UGF0dGVybkRhdGFbMV0gPSAwOworICAgICAgICAgICAgdGVzdFBhdHRlcm5EYXRhWzJdID0gMDsKKyAgICAgICAgICAgIHRlc3RQYXR0ZXJuRGF0YVszXSA9IDA7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREUsCi0gICAgICAgICAgICAgICAgJnRlc3RQYXR0ZXJuTW9kZSwgMSk7Ci0gICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgIH0KIAotICAgIGF1dG8gdGVzdFBhdHRlcm5Db2xvciA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX0RBVEEpOwotICAgIGlmICh0ZXN0UGF0dGVybkNvbG9yLmNvdW50ID49IDQpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIGlmICh0ZXN0UGF0dGVybkNvbG9yLmRhdGEuaTMyW2ldICE9IHRlc3RQYXR0ZXJuRGF0YVtpXSkgewotICAgICAgICAgICAgICAgIHRlc3RQYXR0ZXJuQ29sb3IuZGF0YS5pMzJbaV0gPSB0ZXN0UGF0dGVybkRhdGFbaV07CisgICAgICAgIGF1dG8gdGVzdFBhdHRlcm5FbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREUpOworICAgICAgICBib29sIHN1cHBvcnRUZXN0UGF0dGVybk1vZGVLZXkgPSBzZXR0aW5ncy5tSGFzVGVzdFBhdHRlcm5Nb2RlVGFnOworICAgICAgICBpZiAodGVzdFBhdHRlcm5FbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIGlmICh0ZXN0UGF0dGVybkVudHJ5LmRhdGEuaTMyWzBdICE9IHRlc3RQYXR0ZXJuTW9kZSkgeworICAgICAgICAgICAgICAgIHRlc3RQYXR0ZXJuRW50cnkuZGF0YS5pMzJbMF0gPSB0ZXN0UGF0dGVybk1vZGU7CiAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydFRlc3RQYXR0ZXJuTW9kZUtleSkgeworICAgICAgICAgICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFLAorICAgICAgICAgICAgICAgICAgICAmdGVzdFBhdHRlcm5Nb2RlLCAxKTsKKyAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9EQVRBLAotICAgICAgICAgICAgICAgIHRlc3RQYXR0ZXJuRGF0YSwgNCk7Ci0gICAgICAgIGNoYW5nZWQgPSB0cnVlOworCisgICAgICAgIGF1dG8gdGVzdFBhdHRlcm5Db2xvciA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX0RBVEEpOworICAgICAgICBib29sIHN1cHBvcnRUZXN0UGF0dGVybkRhdGFLZXkgPSBzZXR0aW5ncy5tSGFzVGVzdFBhdHRlcm5EYXRhVGFnOworICAgICAgICBpZiAodGVzdFBhdHRlcm5Db2xvci5jb3VudCA+PSA0KSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh0ZXN0UGF0dGVybkNvbG9yLmRhdGEuaTMyW2ldICE9IHRlc3RQYXR0ZXJuRGF0YVtpXSkgeworICAgICAgICAgICAgICAgICAgICB0ZXN0UGF0dGVybkNvbG9yLmRhdGEuaTMyW2ldID0gdGVzdFBhdHRlcm5EYXRhW2ldOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydFRlc3RQYXR0ZXJuRGF0YUtleSkgeworICAgICAgICAgICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9EQVRBLAorICAgICAgICAgICAgICAgICAgICB0ZXN0UGF0dGVybkRhdGEsIDQpOworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gY2hhbmdlZDsKQEAgLTYzMDQsMjIwICs1MDY4LDYgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzd2l0Y2hUb09mZmxpbmUoCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAotICAgICAgICAvKm91dCovIHNwPENhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZT4qIHNlc3Npb24pIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGlmIChzZXNzaW9uID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7Ci0KLSAgICBib29sIGhhc0lucHV0U3RyZWFtID0gbUlucHV0U3RyZWFtICE9IG51bGxwdHI7Ci0gICAgaW50MzJfdCBpbnB1dFN0cmVhbUlkID0gaGFzSW5wdXRTdHJlYW0gPyBtSW5wdXRTdHJlYW0tPmdldElkKCkgOiAtMTsKLSAgICBib29sIGlucHV0U3RyZWFtU3VwcG9ydHNPZmZsaW5lID0gaGFzSW5wdXRTdHJlYW0gPwotICAgICAgICAgICAgbUlucHV0U3RyZWFtLT5nZXRPZmZsaW5lUHJvY2Vzc2luZ1N1cHBvcnQoKSA6IGZhbHNlOwotICAgIGF1dG8gb3V0cHV0U3RyZWFtSWRzID0gbU91dHB1dFN0cmVhbXMuZ2V0U3RyZWFtSWRzKCk7Ci0gICAgYXV0byBzdHJlYW1JZHMgPSBvdXRwdXRTdHJlYW1JZHM7Ci0gICAgaWYgKGhhc0lucHV0U3RyZWFtKSB7Ci0gICAgICAgIHN0cmVhbUlkcy5wdXNoX2JhY2sobUlucHV0U3RyZWFtLT5nZXRJZCgpKTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBhbGwgc3RyZWFtcyBpbiBzdHJlYW1zVG9LZWVwIHN1cHBvcnRzIG9mZmxpbmUgbW9kZQotICAgIGZvciAoYXV0byBpZCA6IHN0cmVhbXNUb0tlZXApIHsKLSAgICAgICAgaWYgKHN0ZDo6ZmluZChzdHJlYW1JZHMuYmVnaW4oKSwgc3RyZWFtSWRzLmVuZCgpLCBpZCkgPT0gc3RyZWFtSWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gc3RyZWFtIElEICVkIiwgX19GVU5DVElPTl9fLCBpZCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9IGVsc2UgaWYgKGlkID09IGlucHV0U3RyZWFtSWQpIHsKLSAgICAgICAgICAgIGlmICghaW5wdXRTdHJlYW1TdXBwb3J0c09mZmxpbmUpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGlucHV0IHN0cmVhbSAlZCBjYW5ub3QgYmUgc3dpdGNoZWQgdG8gb2ZmbGluZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGlkKTsKLSAgICAgICAgICAgIGlmICghc3RyZWFtLT5nZXRPZmZsaW5lUHJvY2Vzc2luZ1N1cHBvcnQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogb3V0cHV0IHN0cmVhbSAlZCBjYW5ub3QgYmUgc3dpdGNoZWQgdG8gb2ZmbGluZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVE9ETzogYmxvY2sgc3VyZmFjZSBzaGFyaW5nIGFuZCBzdXJmYWNlIGdyb3VwIHN0cmVhbXMgdW50aWwgd2UgY2FuIHN1cHBvcnQgdGhlbQotCi0gICAgLy8gU3RvcCByZXBlYXRpbmcgcmVxdWVzdCwgd2FpdCB1bnRpbCBhbGwgcmVtYWluaW5nIHJlcXVlc3RzIGFyZSBzdWJtaXR0ZWQsIHRoZW4gY2FsbCBpbnRvCi0gICAgLy8gSEFMIHN3aXRjaFRvT2ZmbGluZQotICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvIG9mZmxpbmVTZXNzaW9uSW5mbzsKLSAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4gb2ZmbGluZVNlc3Npb247Ci0gICAgY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyBidWZmZXJSZWNvcmRzOwotICAgIHN0YXR1c190IHJldCA9IG1SZXF1ZXN0VGhyZWFkLT5zd2l0Y2hUb09mZmxpbmUoCi0gICAgICAgICAgICBzdHJlYW1zVG9LZWVwLCAmb2ZmbGluZVNlc3Npb25JbmZvLCAmb2ZmbGluZVNlc3Npb24sICZidWZmZXJSZWNvcmRzKTsKLQotICAgIGlmIChyZXQgIT0gT0spIHsKLSAgICAgICAgU0VUX0VSUigiU3dpdGNoIHRvIG9mZmxpbmUgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJldCksIHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgYm9vbCBzdWNjID0gbVJlcXVlc3RCdWZmZXJTTS5vblN3aXRjaFRvT2ZmbGluZVN1Y2Nlc3MoKTsKLSAgICBpZiAoIXN1Y2MpIHsKLSAgICAgICAgU0VUX0VSUigiSEFMIG11c3Qgbm90IGJlIGNhbGxpbmcgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgY2FsbCIpOwotICAgICAgICAvLyBUT0RPOiBibG9jayBBTEwgY2FsbGJhY2tzIGZyb20gSEFMIHRpbGwgYXBwIGNvbmZpZ3VyZWQgbmV3IHN0cmVhbXM/Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vIFZlcmlmeSBvZmZsaW5lU2Vzc2lvbkluZm8KLSAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBvZmZsaW5lU3RyZWFtSWRzOwotICAgIG9mZmxpbmVTdHJlYW1JZHMucmVzZXJ2ZShvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVN0cmVhbXMuc2l6ZSgpKTsKLSAgICBmb3IgKGF1dG8gb2ZmbGluZVN0cmVhbSA6IG9mZmxpbmVTZXNzaW9uSW5mby5vZmZsaW5lU3RyZWFtcykgewotICAgICAgICAvLyB2ZXJpZnkgc3RyZWFtIElEcwotICAgICAgICBpbnQzMl90IGlkID0gb2ZmbGluZVN0cmVhbS5pZDsKLSAgICAgICAgaWYgKHN0ZDo6ZmluZChzdHJlYW1JZHMuYmVnaW4oKSwgc3RyZWFtSWRzLmVuZCgpLCBpZCkgPT0gc3RyZWFtSWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICBTRVRfRVJSKCJzdHJlYW0gSUQgJWQgbm90IGZvdW5kISIsIGlkKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2hlbiBub3QgdXNpbmcgSEFMIGJ1ZiBtYW5hZ2VyLCBvbmx5IGFsbG93IHN0cmVhbXMgcmVxdWVzdGVkIGJ5IGFwcCB0byBiZSBwcmVzZXJ2ZWQKLSAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgewotICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChzdHJlYW1zVG9LZWVwLmJlZ2luKCksIHN0cmVhbXNUb0tlZXAuZW5kKCksIGlkKSA9PSBzdHJlYW1zVG9LZWVwLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgU0VUX0VSUigic3RyZWFtIElEICVkIG11c3Qgbm90IGJlIHN3aXRjaGVkIHRvIG9mZmxpbmUhIiwgaWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgb2ZmbGluZVN0cmVhbUlkcy5wdXNoX2JhY2soaWQpOwotICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSAoaWQgPT0gaW5wdXRTdHJlYW1JZCkgPwotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+PihtSW5wdXRTdHJlYW0pIDoKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPj4obU91dHB1dFN0cmVhbXMuZ2V0KGlkKSk7Ci0gICAgICAgIC8vIFZlcmlmeSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgYnVmZmVycwotICAgICAgICBpZiAoc3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpICE9IG9mZmxpbmVTdHJlYW0ubnVtT3V0c3RhbmRpbmdCdWZmZXJzKSB7Ci0gICAgICAgICAgICBTRVRfRVJSKCJPZmZsaW5lIHN0cmVhbSAlZCAjIG9mIHJlbWFpbmluZyBidWZmZXIgbWlzbWF0Y2g6ICglenUsJWQpIChzZXJ2aWNlL0hBTCkiLAotICAgICAgICAgICAgICAgICAgICBpZCwgc3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpLCBvZmZsaW5lU3RyZWFtLm51bU91dHN0YW5kaW5nQnVmZmVycyk7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFZlcmlmeSBhbGwgc3RyZWFtcyB0byBiZSBkZWxldGVkIGRvbid0IGhhdmUgYW55IG91dHN0YW5kaW5nIGJ1ZmZlcnMKLSAgICBpZiAoaGFzSW5wdXRTdHJlYW0gJiYgc3RkOjpmaW5kKG9mZmxpbmVTdHJlYW1JZHMuYmVnaW4oKSwgb2ZmbGluZVN0cmVhbUlkcy5lbmQoKSwKLSAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbUlkKSA9PSBvZmZsaW5lU3RyZWFtSWRzLmVuZCgpKSB7Ci0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0tPmhhc091dHN0YW5kaW5nQnVmZmVycygpKSB7Ci0gICAgICAgICAgICBTRVRfRVJSKCJJbnB1dCBzdHJlYW0gJWQgc3RpbGwgaGFzICV6dSBvdXRzdGFuZGluZyBidWZmZXIhIiwKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW1JZCwgbUlucHV0U3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChjb25zdCBhdXRvJiBvdXRTdHJlYW1JZCA6IG91dHB1dFN0cmVhbUlkcykgewotICAgICAgICBpZiAoc3RkOjpmaW5kKG9mZmxpbmVTdHJlYW1JZHMuYmVnaW4oKSwgb2ZmbGluZVN0cmVhbUlkcy5lbmQoKSwKLSAgICAgICAgICAgICAgICBvdXRTdHJlYW1JZCkgPT0gb2ZmbGluZVN0cmVhbUlkcy5lbmQoKSkgewotICAgICAgICAgICAgYXV0byBvdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQob3V0U3RyZWFtSWQpOwotICAgICAgICAgICAgaWYgKG91dFN0cmVhbS0+aGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkpIHsKLSAgICAgICAgICAgICAgICBTRVRfRVJSKCJPdXRwdXQgc3RyZWFtICVkIHN0aWxsIGhhcyAlenUgb3V0c3RhbmRpbmcgYnVmZmVyISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHJlYW1JZCwgb3V0U3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEluRmxpZ2h0UmVxdWVzdE1hcCBvZmZsaW5lUmVxczsKLSAgICAvLyBWZXJpZnkgaW5mbGlnaHQgcmVxdWVzdHMgYW5kIHRoZWlyIHBlbmRpbmcgYnVmZmVycwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobUluRmxpZ2h0TG9jayk7Ci0gICAgICAgIGZvciAoYXV0byBvZmZsaW5lUmVxIDogb2ZmbGluZVNlc3Npb25JbmZvLm9mZmxpbmVSZXF1ZXN0cykgewotICAgICAgICAgICAgaW50IGlkeCA9IG1JbkZsaWdodE1hcC5pbmRleE9mS2V5KG9mZmxpbmVSZXEuZnJhbWVOdW1iZXIpOwotICAgICAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICAgICAgICAgIFNFVF9FUlIoIk9mZmxpbmUgcmVxdWVzdCBmcmFtZSBudW1iZXIgJWQgbm90IGZvdW5kISIsIG9mZmxpbmVSZXEuZnJhbWVOdW1iZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb25zdCBhdXRvJiBpbmZsaWdodFJlcSA9IG1JbkZsaWdodE1hcC52YWx1ZUF0KGlkeCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBzcGVjaWZpYyBzdHJlYW0gSURzCi0gICAgICAgICAgICBzaXplX3QgbnVtQnVmZmVyc0xlZnQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGluZmxpZ2h0UmVxLm51bUJ1ZmZlcnNMZWZ0KTsKLSAgICAgICAgICAgIGlmIChudW1CdWZmZXJzTGVmdCAhPSBvZmZsaW5lUmVxLnBlbmRpbmdTdHJlYW1zLnNpemUoKSkgewotICAgICAgICAgICAgICAgIFNFVF9FUlIoIk9mZmxpbmUgcmVxdWVzdCAjIG9mIHJlbWFpbmluZyBidWZmZXIgbWlzbWF0Y2g6ICglZCwlZCkgKHNlcnZpY2UvSEFMKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmZsaWdodFJlcS5udW1CdWZmZXJzTGVmdCwgb2ZmbGluZVJlcS5wZW5kaW5nU3RyZWFtcy5zaXplKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2ZmbGluZVJlcXMuYWRkKG9mZmxpbmVSZXEuZnJhbWVOdW1iZXIsIGluZmxpZ2h0UmVxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENyZWF0ZSBDYW1lcmEzT2ZmbGluZVNlc3Npb24gYW5kIHRyYW5zZmVyIG9iamVjdCBvd25lcnNoaXAKLSAgICAvLyAgIChzdHJlYW1zLCBpbmZsaWdodCByZXF1ZXN0cywgYnVmZmVyIGNhY2hlcykKLSAgICBjYW1lcmEzOjpTdHJlYW1TZXQgb2ZmbGluZVN0cmVhbVNldDsKLSAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiBpbnB1dFN0cmVhbTsKLSAgICBmb3IgKGF1dG8gb2ZmbGluZVN0cmVhbSA6IG9mZmxpbmVTZXNzaW9uSW5mby5vZmZsaW5lU3RyZWFtcykgewotICAgICAgICBpbnQzMl90IGlkID0gb2ZmbGluZVN0cmVhbS5pZDsKLSAgICAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyICYmIGlkID09IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSkgewotICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBtSW5wdXRTdHJlYW07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvZmZsaW5lU3RyZWFtU2V0LmFkZChpZCwgbU91dHB1dFN0cmVhbXMuZ2V0KGlkKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIHRvIGxvY2sgYmVmb3JlIGNvcHlpbmcgc3RhdGVzCi0gICAgLy8gICAgICAgdGhvdWdoIHRlY2huaWNhbGx5IG5vIG90aGVyIHRocmVhZCBzaG91bGQgYmUgdGFsa2luZyB0byBDYW1lcmEzRGV2aWNlIGF0IHRoaXMgcG9pbnQKLSAgICBDYW1lcmEzT2ZmbGluZVN0YXRlcyBvZmZsaW5lU3RhdGVzKAotICAgICAgICAgICAgbVRhZ01vbml0b3IsIG1WZW5kb3JUYWdJZCwgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKLSAgICAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTnVtUGFydGlhbFJlc3VsdHMsIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAotICAgICAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKLSAgICAgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsCi0gICAgICAgICAgICBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAotICAgICAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCi0gICAgICAgICAgICBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwgbURpc3RvcnRpb25NYXBwZXJzLAotICAgICAgICAgICAgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycyk7Ci0KLSAgICAqc2Vzc2lvbiA9IG5ldyBDYW1lcmEzT2ZmbGluZVNlc3Npb24obUlkLCBpbnB1dFN0cmVhbSwgb2ZmbGluZVN0cmVhbVNldCwKLSAgICAgICAgICAgIHN0ZDo6bW92ZShidWZmZXJSZWNvcmRzKSwgb2ZmbGluZVJlcXMsIG9mZmxpbmVTdGF0ZXMsIG9mZmxpbmVTZXNzaW9uKTsKLQotICAgIC8vIERlbGV0ZSBhbGwgc3RyZWFtcyB0aGF0IGhhcyBiZWVuIHRyYW5zZmVycmVkIHRvIG9mZmxpbmUgc2Vzc2lvbgotICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKLSAgICBmb3IgKGF1dG8gb2ZmbGluZVN0cmVhbSA6IG9mZmxpbmVTZXNzaW9uSW5mby5vZmZsaW5lU3RyZWFtcykgewotICAgICAgICBpbnQzMl90IGlkID0gb2ZmbGluZVN0cmVhbS5pZDsKLSAgICAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyICYmIGlkID09IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSkgewotICAgICAgICAgICAgbUlucHV0U3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmUoaWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZGlzY29ubmVjdCBhbGwgb3RoZXIgc3RyZWFtcyBhbmQgc3dpdGNoIHRvIFVOQ09ORklHVVJFRCBzdGF0ZQotICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cikgewotICAgICAgICByZXQgPSBtSW5wdXRTdHJlYW0tPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICAgICAgU0VUX0VSUl9MKCJkaXNjb25uZWN0IGlucHV0IHN0cmVhbSBmYWlsZWQhIik7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoYXV0byBzdHJlYW1JZCA6IG1PdXRwdXRTdHJlYW1zLmdldFN0cmVhbUlkcygpKSB7Ci0gICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7Ci0gICAgICAgIHJldCA9IHN0cmVhbS0+ZGlzY29ubmVjdCgpOwotICAgICAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgICAgICBTRVRfRVJSX0woImRpc2Nvbm5lY3Qgb3V0cHV0IHN0cmVhbSAlZCBmYWlsZWQhIiwgc3RyZWFtSWQpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKLSAgICBtT3V0cHV0U3RyZWFtcy5jbGVhcigpOwotICAgIG1OZWVkQ29uZmlnID0gdHJ1ZTsKLSAgICBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChTVEFUVVNfVU5DT05GSUdVUkVEKTsKLSAgICBtT3BlcmF0aW5nTW9kZSA9IE5PX01PREU7Ci0gICAgbUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uID0gZmFsc2U7Ci0gICAgbVJlcXVlc3RUaHJlYWQtPmNsZWFyUHJldmlvdXNSZXF1ZXN0KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci0gICAgLy8gVE8gYmUgZG9uZSBieSBDYW1lcmFEZXZpY2VDbGllbnQvQ2FtZXJhM09mZmxpbmVTZXNzaW9uCi0gICAgLy8gcmVnaXN0ZXIgdGhlIG9mZmxpbmUgY2xpZW50IHRvIGNhbWVyYSBzZXJ2aWNlCi0gICAgLy8gU2V0dXAgcmVzdWx0IHBhc3N0aGluZyB0aHJlYWRzIGV0YwotICAgIC8vIEluaXRpYWxpemUgb2ZmbGluZSBzZXNzaW9uIHNvIEhBTCBjYW4gc3RhcnQgc2VuZGluZyBjYWxsYmFjayB0byBpdCAocmVzdWx0IEZtcSkKLSAgICAvLyBUT0RPOiBjaGVjayBob3cgbWFueSBvbklkbGUgY2FsbGJhY2sgd2lsbCBiZSBzZW50Ci0gICAgLy8gSmF2YSBzaWRlIHRvIG1ha2Ugc3VyZSB0aGUgQ2FtZXJhQ2FwdHVyZVNlc3Npb24gaXMgcHJvcGVybHkgY2xvc2VkCi19Ci0KIHZvaWQgQ2FtZXJhM0RldmljZTo6Z2V0T2ZmbGluZVN0cmVhbUlkcyhzdGQ6OnZlY3RvcjxpbnQ+ICpvZmZsaW5lU3RyZWFtSWRzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIApAQCAtNjU4Miw2ICs1MTMyLDEzIEBACiAgICAgQUxPR0koIiVzIEluamVjdGlvbiBjYW1lcmE6IGluamVjdGVkQ2FtSWQgPSAlcyIsIF9fRlVOQ1RJT05fXywgaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSk7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgIC8vIFdoZW4gdGhlIGNhbWVyYSBkZXZpY2UgaXMgYWN0aXZlLCBpbmplY3RDYW1lcmEoKSBhbmQgc3RvcEluamVjdGlvbigpIHdpbGwgY2FsbAorICAgIC8vIGludGVybmFsUGF1c2VBbmRXYWl0TG9ja2VkKCkgYW5kIGludGVybmFsUmVzdW1lTG9ja2VkKCksIGFuZCB0aGVuIHRoZXkgd2lsbCBjYWxsCisgICAgLy8gbVN0YXR1c0NoYW5nZWQud2FpdFJlbGF0aXZlKG1Mb2NrLCB0aW1lb3V0KSBvZiB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soKS4gQnV0CisgICAgLy8gbVN0YXR1c0NoYW5nZWQud2FpdFJlbGF0aXZlKG1Mb2NrLCB0aW1lb3V0KSdzIHBhcmFtZXRlcjogbXV0ZXggIm1Mb2NrIiBtdXN0IGJlIGluIHRoZSBsb2NrZWQKKyAgICAvLyBzdGF0ZSwgc28gd2UgbmVlZCB0byBhZGQgIk11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKSIgdG8gbG9jayB0aGUgIm1Mb2NrIiBiZWZvcmUgY2FsbGluZworICAgIC8vIHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygpLgorICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAogICAgIHN0YXR1c190IHJlcyA9IE5PX0VSUk9SOwogICAgIGlmIChtSW5qZWN0aW9uTWV0aG9kcy0+aXNJbmplY3RpbmcoKSkgewpAQCAtNjU5NywyMyArNTE1NCwzMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmVzID0gbUluamVjdGlvbk1ldGhvZHMtPmluamVjdGlvbkluaXRpYWxpemUoaW5qZWN0ZWRDYW1JZCwgbWFuYWdlciwgdGhpcyk7CisgICAgcmVzID0gaW5qZWN0aW9uQ2FtZXJhSW5pdGlhbGl6ZShpbmplY3RlZENhbUlkLCBtYW5hZ2VyKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGluamVjdGlvbiBjYW1lcmEhIHJldCAhPSBOT19FUlJPUjogJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzKTsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24gaW5qZWN0aW9uQ29uZmlnOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBpbmplY3Rpb25CdWZmZXJTaXplczsKLSAgICBtSW5qZWN0aW9uTWV0aG9kcy0+Z2V0SW5qZWN0aW9uQ29uZmlnKCZpbmplY3Rpb25Db25maWcsICZpbmplY3Rpb25CdWZmZXJTaXplcyk7CiAgICAgLy8gV2hlbiB0aGUgc2Vjb25kIGRpc3BsYXkgb2YgYW5kcm9pZCBpcyBjYXN0IHRvIHRoZSByZW1vdGUgZGV2aWNlLCBhbmQgdGhlIG9wZW5lZCBjYW1lcmEgaXMKICAgICAvLyBhbHNvIGNhc3QgdG8gdGhlIHNlY29uZCBkaXNwbGF5LCBpbiB0aGlzIGNhc2UsIGJlY2F1c2UgdGhlIGNhbWVyYSBoYXMgY29uZmlndXJlZCB0aGUgc3RyZWFtcwogICAgIC8vIGF0IHRoaXMgdGltZSwgd2UgY2FuIGRpcmVjdGx5IGNhbGwgaW5qZWN0Q2FtZXJhKCkgdG8gcmVwbGFjZSB0aGUgaW50ZXJuYWwgY2FtZXJhIHdpdGgKICAgICAvLyBpbmplY3Rpb24gY2FtZXJhLgotICAgIGlmIChtT3BlcmF0aW5nTW9kZSA+PSAwICYmIGluamVjdGlvbkNvbmZpZy5udW1fc3RyZWFtcyA+IDAKLSAgICAgICAgICAgICAgICAmJiBpbmplY3Rpb25CdWZmZXJTaXplcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIEFMT0dWKCIlczogVGhlIG9wZW5lZCBjYW1lcmEgaXMgZGlyZWN0bHkgY2FzdCB0byB0aGUgcmVtb3RlIGRldmljZS4iLCBfX0ZVTkNUSU9OX18pOworICAgIGlmIChtSW5qZWN0aW9uTWV0aG9kcy0+aXNTdHJlYW1Db25maWdDb21wbGV0ZUJ1dE5vdEluamVjdGVkKCkpIHsKKyAgICAgICAgQUxPR0QoIiVzOiBUaGUgb3BlbmVkIGNhbWVyYSBpcyBkaXJlY3RseSBjYXN0IHRvIHRoZSByZW1vdGUgZGV2aWNlLiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uIGluamVjdGlvbkNvbmZpZzsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGluamVjdGlvbkJ1ZmZlclNpemVzOworICAgICAgICBtSW5qZWN0aW9uTWV0aG9kcy0+Z2V0SW5qZWN0aW9uQ29uZmlnKCZpbmplY3Rpb25Db25maWcsICZpbmplY3Rpb25CdWZmZXJTaXplcyk7CisgICAgICAgIGlmIChtT3BlcmF0aW5nTW9kZSA8IDAgfHwgaW5qZWN0aW9uQ29uZmlnLm51bV9zdHJlYW1zIDw9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgaW5qZWN0aW9uQnVmZmVyU2l6ZXMuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5qZWN0IGNhbWVyYSBkdWUgdG8gYWJhbmRvbmVkIGNvbmZpZ3VyYXRpb24hICIKKyAgICAgICAgICAgICAgICAgICAgIm1PcGVyYXRpbmdNb2RlOiAlZCBpbmplY3Rpb25Db25maWcubnVtX3N0cmVhbXM6ICVkICIKKyAgICAgICAgICAgICAgICAgICAgImluamVjdGlvbkJ1ZmZlclNpemVzLnNpemUoKTogJXp1IiwgbU9wZXJhdGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgIGluamVjdGlvbkNvbmZpZy5udW1fc3RyZWFtcywgaW5qZWN0aW9uQnVmZmVyU2l6ZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorCiAgICAgICAgIHJlcyA9IG1JbmplY3Rpb25NZXRob2RzLT5pbmplY3RDYW1lcmEoCiAgICAgICAgICAgICAgICAgaW5qZWN0aW9uQ29uZmlnLCBpbmplY3Rpb25CdWZmZXJTaXplcyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTY2MjgsNiArNTE5NCw3IEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzdG9wSW5qZWN0aW9uKCkgewogICAgIEFMT0dJKCIlczogSW5qZWN0aW9uIGNhbWVyYTogc3RvcEluamVjdGlvbiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgcmV0dXJuIG1JbmplY3Rpb25NZXRob2RzLT5zdG9wSW5qZWN0aW9uKCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKaW5kZXggMzk3MTRmMC4uZjkyN2I0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKQEAgLTI5LDIwICsyOSwxMSBAQAogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL0lDYW1lcmFEZXZpY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMy9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZVNlc3Npb24uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNi9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjcvSUNhbWVyYURldmljZVNlc3Npb24uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0KICNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogCisjaW5jbHVkZSAiQ2FtZXJhU2VydmljZVdhdGNoZG9nLmgiCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvQ2FtZXJhQmxvYi5oPgorCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKICNpbmNsdWRlICJkZXZpY2UzL0J1ZmZlclV0aWxzLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmgiCkBAIC01NiwxMSArNDcsMTEgQEAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oIgogI2luY2x1ZGUgInV0aWxzL1RhZ01vbml0b3IuaCIKKyNpbmNsdWRlICJ1dGlscy9JUENUcmFuc3BvcnQuaCIKICNpbmNsdWRlICJ1dGlscy9MYXRlbmN5SGlzdG9ncmFtLmgiCiAjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgogCiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3Q7Ci11c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpjYW1lcmFfanBlZ19ibG9iX3Q7CiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpjYW1lcmFfcmVxdWVzdF90ZW1wbGF0ZTsKIHVzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fYnVmZmVyX3Q7CiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdDsKQEAgLTgzLDE2ICs3NCwyNCBAQAogICovCiBjbGFzcyBDYW1lcmEzRGV2aWNlIDoKICAgICAgICAgICAgIHB1YmxpYyBDYW1lcmFEZXZpY2VCYXNlLAotICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2ssCiAgICAgICAgICAgICBwdWJsaWMgY2FtZXJhMzo6U2V0RXJyb3JJbnRlcmZhY2UsCiAgICAgICAgICAgICBwdWJsaWMgY2FtZXJhMzo6SW5mbGlnaHRSZXF1ZXN0VXBkYXRlSW50ZXJmYWNlLAogICAgICAgICAgICAgcHVibGljIGNhbWVyYTM6OlJlcXVlc3RCdWZmZXJJbnRlcmZhY2UsCiAgICAgICAgICAgICBwdWJsaWMgY2FtZXJhMzo6Rmx1c2hCdWZmZXJJbnRlcmZhY2UgeworICBmcmllbmQgY2xhc3MgSGlkbENhbWVyYTNEZXZpY2U7CisgIGZyaWVuZCBjbGFzcyBBaWRsQ2FtZXJhM0RldmljZTsKICAgcHVibGljOgogCi0gICAgZXhwbGljaXQgQ2FtZXJhM0RldmljZShjb25zdCBTdHJpbmc4JiBpZCwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcyk7CisgICAgZXhwbGljaXQgQ2FtZXJhM0RldmljZShjb25zdCBTdHJpbmc4JiBpZCwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgYm9vbCBsZWdhY3lDbGllbnQgPSBmYWxzZSk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEzRGV2aWNlKCk7CisgICAgLy8gRGVsZXRlIGFuZCBvcHRpb25hbGx5IGNsb3NlIG5hdGl2ZSBoYW5kbGVzIGFuZCBjbGVhciB0aGUgaW5wdXQgdmVjdG9yIGFmdGVyd2FyZAorICAgIHN0YXRpYyB2b2lkIGNsZWFudXBOYXRpdmVIYW5kbGVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gKmhhbmRsZXMsIGJvb2wgY2xvc2VGZCA9IGZhbHNlKTsKKworICAgIHZpcnR1YWwgSVBDVHJhbnNwb3J0IGdldFRyYW5zcG9ydFR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50ZXJmYWNlLT5nZXRUcmFuc3BvcnRUeXBlKCk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQ2FtZXJhRGV2aWNlQmFzZSBpbnRlcmZhY2UKQEAgLTEwMiwxMCArMTAxLDE4IEBACiAKICAgICBtZXRhZGF0YV92ZW5kb3JfaWRfdCBnZXRWZW5kb3JUYWdJZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1WZW5kb3JUYWdJZDsgfQogCisgICAgLy8gV2F0Y2hkb2cgdGhyZWFkCisgICAgc3A8Q2FtZXJhU2VydmljZVdhdGNoZG9nPiBtQ2FtZXJhU2VydmljZVdhdGNoZG9nOworCiAgICAgLy8gVHJhbnNpdGlvbnMgdG8gaWRsZSBzdGF0ZSBvbiBzdWNjZXNzLgotICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gLyptYW5hZ2VyKi8sCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKm1vbml0b3JUYWdzKi8pID0gMDsKKwogICAgIHN0YXR1c190IGRpc2Nvbm5lY3QoKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc3RhcnRXYXRjaGluZ1RhZ3MoY29uc3QgU3RyaW5nOCAmdGFncykgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc3RvcFdhdGNoaW5nVGFncygpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGR1bXBXYXRjaGVkRXZlbnRzVG9WZWN0b3Ioc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZvdXQpIG92ZXJyaWRlOwogICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm9QaHlzaWNhbChjb25zdCBTdHJpbmc4JiBwaHlzaWNhbElkKSBjb25zdCBvdmVycmlkZTsKIApAQCAtMTM3LDcgKzE0NCwxMiBAQAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcyA9IG51bGxwdHIsCiAgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKICAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlLAotICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApIG92ZXJyaWRlOworICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDAsCisgICAgICAgICAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUgPQorICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCwKKyAgICAgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSA9IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgbWlycm9yTW9kZSA9IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX0FVVE8pIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAogICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LApAQCAtMTQ3LDcgKzE1OSwxMiBAQAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcyA9IG51bGxwdHIsCiAgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKICAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlLAotICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApIG92ZXJyaWRlOworICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDAsCisgICAgICAgICAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUgPQorICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCwKKyAgICAgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSA9IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgbWlycm9yTW9kZSA9IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX0FVVE8pIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdHJlYW0oCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBib29sIGlzTXVsdGlSZXNvbHV0aW9uLApAQCAtMTkyLDkgKzIwOSwxMSBAQAogCiAgICAgc3RhdHVzX3QgcHJlcGFyZShpbnQgbWF4Q291bnQsIGludCBzdHJlYW1JZCkgb3ZlcnJpZGU7CiAKLSAgICBzc2l6ZV90IGdldEpwZWdCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IG92ZXJyaWRlOwotICAgIHNzaXplX3QgZ2V0UG9pbnRDbG91ZEJ1ZmZlclNpemUoKSBjb25zdDsKLSAgICBzc2l6ZV90IGdldFJhd09wYXF1ZUJ1ZmZlclNpemUoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGJvb2wgbWF4UmVzb2x1dGlvbikgY29uc3Q7CisgICAgc3NpemVfdCBnZXRKcGVnQnVmZmVyU2l6ZShjb25zdCBDYW1lcmFNZXRhZGF0YSAmaW5mbywgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IG92ZXJyaWRlOworICAgIHNzaXplX3QgZ2V0UG9pbnRDbG91ZEJ1ZmZlclNpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmluZm8pIGNvbnN0OworICAgIHNzaXplX3QgZ2V0UmF3T3BhcXVlQnVmZmVyU2l6ZShjb25zdCBDYW1lcmFNZXRhZGF0YSAmaW5mbywgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBib29sIG1heFJlc29sdXRpb24pIGNvbnN0OwogCiAgICAgLy8gTWV0aG9kcyBjYWxsZWQgYnkgc3ViY2xhc3NlcwogICAgIHZvaWQgICAgICAgICAgICAgbm90aWZ5U3RhdHVzKGJvb2wgaWRsZSk7IC8vIHVwZGF0ZXMgZnJvbSBTdGF0dXNUcmFja2VyCkBAIC0yMjMsOCArMjQyLDEwIEBACiAKICAgICBuc2Vjc190IGdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpIG92ZXJyaWRlOwogCi0gICAgc3RhdHVzX3Qgc3dpdGNoVG9PZmZsaW5lKGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAotICAgICAgICAgICAgLypvdXQqLyBzcDxDYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2U+KiBzZXNzaW9uKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN3aXRjaFRvT2ZmbGluZShjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgLAorICAgICAgICAgICAgLypvdXQqLyBzcDxDYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2U+KiApICBvdmVycmlkZSB7CisgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfTsKIAogICAgIC8vIFJlcXVlc3RCdWZmZXJJbnRlcmZhY2UKICAgICBib29sIHN0YXJ0UmVxdWVzdEJ1ZmZlcigpIG92ZXJyaWRlOwpAQCAtMjc1LDMxICsyOTYsMTEgQEAKICAgICAgKi8KICAgICBzdGF0dXNfdCBzdG9wSW5qZWN0aW9uKCk7CiAKLSAgICAvKioKLSAgICAgKiBIZWxwZXIgZnVuY3Rpb25zIHRvIG1hcCBiZXR3ZWVuIGZyYW1ld29yayBhbmQgSElETCB2YWx1ZXMKLSAgICAgKi8KLSAgICBzdGF0aWMgaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IG1hcFRvUGl4ZWxGb3JtYXQoaW50IGZyYW1ld29ya0Zvcm1hdCk7Ci0gICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3MgbWFwVG9IaWRsRGF0YXNwYWNlKAotICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKTsKLSAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIG1hcFRvQ29uc3VtZXJVc2FnZSh1aW50NjRfdCB1c2FnZSk7Ci0gICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtUm90YXRpb24gbWFwVG9TdHJlYW1Sb3RhdGlvbigKLSAgICAgICAgICAgIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbik7Ci0gICAgLy8gUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaWYgdGhlIHBhc3NlZC1pbiBvcGVyYXRpb24gbW9kZSBpcyBub3QgdmFsaWQuCi0gICAgc3RhdGljIHN0YXR1c190IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCBvcGVyYXRpb25Nb2RlLAotICAgICAgICAgICAgLypvdXQqLyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKTsKLSAgICBzdGF0aWMgaW50IG1hcFRvRnJhbWV3b3JrRm9ybWF0KGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCk7Ci0gICAgc3RhdGljIGFuZHJvaWRfZGF0YXNwYWNlIG1hcFRvRnJhbWV3b3JrRGF0YXNwYWNlKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyk7Ci0gICAgc3RhdGljIHVpbnQ2NF90IG1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZSgKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyB1c2FnZSk7Ci0gICAgc3RhdGljIHVpbnQ2NF90IG1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZSgKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyB1c2FnZSk7Ci0KLSAgcHJpdmF0ZToKKyAgcHJvdGVjdGVkOgogICAgIHN0YXR1c190IGRpc2Nvbm5lY3RJbXBsKCk7CisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZUZ3a09ubHlSZWdpb25LZXlzKENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KTsKIAotICAgIC8vIGludGVybmFsIHR5cGVkZWZzCi0gICAgdXNpbmcgUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKKyAgICBmbG9hdCBnZXRNYXhQcmV2aWV3RnBzKHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSk7CiAKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgICBrRHVtcExvY2tBdHRlbXB0cyAgPSAxMDsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgICBrRHVtcFNsZWVwRHVyYXRpb24gPSAxMDAwMDA7IC8vIDAuMTAgc2VjCkBAIC0zMDcsNyArMzA4LDYgQEAKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCAgICAgICBrTWluV2FybkluZmxpZ2h0RHVyYXRpb24gPSA1MDAwMDAwMDAwOyAvLyA1IHMKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgICBrSW5GbGlnaHRXYXJuTGltaXQgPSAzMDsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgICBrSW5GbGlnaHRXYXJuTGltaXRIaWdoU3BlZWQgPSAyNTY7IC8vIGJhdGNoIHNpemUgMzIgKiBwaXBlIGRlcHRoIDgKLSAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCAgICAgICBrRGVmYXVsdEV4cGVjdGVkRHVyYXRpb24gPSAxMDAwMDAwMDA7IC8vIDEwMCBtcwogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190ICAgICAgIGtNaW5JbmZsaWdodER1cmF0aW9uID0gNTAwMDAwMDAwMDsgLy8gNSBzCiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgICAgICAga0Jhc2VHZXRCdWZmZXJXYWl0ID0gMzAwMDAwMDAwMDsgLy8gMyBzZWMuCiAgICAgLy8gU0NIRURfRklGTyBwcmlvcml0eSBmb3IgcmVxdWVzdCBzdWJtaXNzaW9uIHRocmVhZCBpbiBIRlIgbW9kZQpAQCAtMzE1LDcgKzMxNSw4IEBACiAKICAgICBzdHJ1Y3QgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0VHJpZ2dlcjsKICAgICAvLyBtaW5pbWFsIGpwZWcgYnVmZmVyIHNpemU6IDI1NktCICsgYmxvYiBoZWFkZXIKLSAgICBzdGF0aWMgY29uc3Qgc3NpemVfdCAgICAgICBrTWluSnBlZ0J1ZmZlclNpemUgPSAyNTYgKiAxMDI0ICsgc2l6ZW9mKGNhbWVyYV9qcGVnX2Jsb2JfdCk7CisgICAgc3RhdGljIGNvbnN0IHNzaXplX3QgICAgICAga01pbkpwZWdCdWZmZXJTaXplID0KKyAgICAgICAgICAgIDI1NiAqIDEwMjQgKyBzaXplb2YoYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFCbG9iKTsKICAgICAvLyBDb25zdGFudCB0byB1c2UgZm9yIHN0cmVhbSBJRCB3aGVuIG9uZSBkb2Vzbid0IGV4aXN0CiAgICAgc3RhdGljIGNvbnN0IGludCAgICAgICAgICAgTk9fU1RSRUFNID0gLTE7CiAKQEAgLTMzMiw2ICszMzMsOSBAQAogICAgIC8vIENhbWVyYSBkZXZpY2UgSUQKICAgICBjb25zdCBTdHJpbmc4ICAgICAgICAgICAgICBtSWQ7CiAKKyAgICAvLyBMZWdhY3kgY2FtZXJhIGNsaWVudCBmbGFnCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUxlZ2FjeUNsaWVudDsKKwogICAgIC8vIEN1cnJlbnQgc3RyZWFtIGNvbmZpZ3VyYXRpb24gbW9kZTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBtT3BlcmF0aW5nTW9kZTsKICAgICAvLyBDdXJyZW50IHNlc3Npb24gd2lkZSBwYXJhbWV0ZXJzCkBAIC0zNDMsNjggKzM0Nyw2NSBAQAogICAgIC8vIEZsYWcgaW5kaWNhdGluZyBpcyB0aGUgY3VycmVudCBhY3RpdmUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gaXMgY29uc3RyYWluZWQgaGlnaCBzcGVlZC4KICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb247CiAKLSAgICAvLyBGTVEgdG8gd3JpdGUgcmVzdWx0IG9uLiBNdXN0IGJlIGd1YXJkZWQgYnkgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay4KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gbVJlc3VsdE1ldGFkYXRhUXVldWU7Ci0KICAgICAvKioqKiBTY29wZSBmb3IgbUxvY2sgKioqKi8KIAotICAgIC8qKgotICAgICAqIEFkYXB0ZXIgZm9yIGxlZ2FjeSBIQUwgLyBISURMIEhBTCBpbnRlcmZhY2UgY2FsbHM7IGNhbGxzIGVpdGhlciBpbnRvIGxlZ2FjeSBIQUx2MyBvciB0aGUKLSAgICAgKiBISURMIEhBTHYzIGludGVyZmFjZXMuCi0gICAgICovCiAgICAgY2xhc3MgSGFsSW50ZXJmYWNlIDogcHVibGljIGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1CdWZmZXJGcmVlZExpc3RlbmVyLAogICAgICAgICAgICAgcHVibGljIGNhbWVyYTM6OkJ1ZmZlclJlY29yZHNJbnRlcmZhY2UgewogICAgICAgcHVibGljOgotICAgICAgICBIYWxJbnRlcmZhY2Uoc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gJnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLCBib29sIHN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyk7CisgICAgICAgIEhhbEludGVyZmFjZShib29sIHVzZUhhbEJ1Zk1hbmFnZXIsIGJvb2wgc3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKSA6CisgICAgICAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpLAorICAgICAgICAgICAgICBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCh0cnVlKSwKKyAgICAgICAgICAgICAgbVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyhzdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpCisgICAgICAgICAgICAgICB7fTsKICAgICAgICAgSGFsSW50ZXJmYWNlKGNvbnN0IEhhbEludGVyZmFjZSAmb3RoZXIpOwogICAgICAgICBIYWxJbnRlcmZhY2UoKTsKIAorICAgICAgICB2aXJ0dWFsIElQQ1RyYW5zcG9ydCBnZXRUcmFuc3BvcnRUeXBlKCkgY29uc3QgPSAwOworCiAgICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBjb25zdHJ1Y3RlZCB3aXRoIGEgdmFsaWQgZGV2aWNlIG9yIHNlc3Npb24sIGFuZCBub3QgeWV0IGNsZWFyZWQKLSAgICAgICAgYm9vbCB2YWxpZCgpOworICAgICAgICB2aXJ0dWFsIGJvb2wgdmFsaWQoKSA9IDA7CiAKICAgICAgICAgLy8gUmVzZXQgdGhpcyBIYWxJbnRlcmZhY2Ugb2JqZWN0IChkb2VzIG5vdCBjYWxsIGNsb3NlKCkpCi0gICAgICAgIHZvaWQgY2xlYXIoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsZWFyKCkgPSAwOwogCiAgICAgICAgIC8vIENhbGxzIGludG8gdGhlIEhBTCBpbnRlcmZhY2UKIAogICAgICAgICAvLyBDYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHJlcXVlc3RUZW1wbGF0ZQotICAgICAgICBzdGF0dXNfdCBjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCi0gICAgICAgICAgICAgICAgLypvdXQqLyBjYW1lcmFfbWV0YWRhdGFfdCAqKnJlcXVlc3RUZW1wbGF0ZSk7Ci0gICAgICAgIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNlc3Npb25QYXJhbXMsCi0gICAgICAgICAgICAgICAgLyppbm91dCovIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl90ICpjb25maWcsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyhjYW1lcmFfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8gY2FtZXJhX21ldGFkYXRhX3QgKipyZXF1ZXN0VGVtcGxhdGUpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKiBzZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIC8qaW5vdXQqLyBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdCAqIGNvbmZpZywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzKSA9IDA7CiAKICAgICAgICAgLy8gVGhlIGluamVjdGlvbiBjYW1lcmEgY29uZmlndXJlcyB0aGUgc3RyZWFtcyB0byBoYWwuCi0gICAgICAgIHN0YXR1c190IGNvbmZpZ3VyZUluamVjdGVkU3RyZWFtcygKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVJbmplY3RlZFN0cmVhbXMoCiAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIHNlc3Npb25QYXJhbXMsCiAgICAgICAgICAgICAgICAgLyppbm91dCovIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl90KiBjb25maWcsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcywKLSAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2FtZXJhQ2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2FtZXJhQ2hhcmFjdGVyaXN0aWNzKSA9IDA7CiAKICAgICAgICAgLy8gV2hlbiB0aGUgY2FsbCBzdWNjZWVkcywgdGhlIG93bmVyc2hpcCBvZiBhY3F1aXJlIGZlbmNlcyBpbiByZXF1ZXN0cyBpcyB0cmFuc2ZlcnJlZCB0bwogICAgICAgICAvLyBIYWxJbnRlcmZhY2UuIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIHNlbmQgdGhlIGZlbmNlIHRvCiAgICAgICAgIC8vIEhBTCBwcm9jZXNzIGFuZCBjbG9zZSB0aGUgRkQgaW4gY2FtZXJhc2VydmVyIHByb2Nlc3MuIFdoZW4gdGhlIGNhbGwgZmFpbHMsIHRoZSBvd25lcnNoaXAKICAgICAgICAgLy8gb2YgdGhlIGFjcXVpcmUgZmVuY2Ugc3RpbGwgYmVsb25ncyB0byB0aGUgY2FsbGVyLgotICAgICAgICBzdGF0dXNfdCBwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMoCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKAogICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCo+JiByZXF1ZXN0cywKLSAgICAgICAgICAgICAgICAvKm91dCovdWludDMyX3QqIG51bVJlcXVlc3RQcm9jZXNzZWQpOwotICAgICAgICBzdGF0dXNfdCBmbHVzaCgpOwotICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0gICAgICAgIHN0YXR1c190IGNsb3NlKCk7CisgICAgICAgICAgICAgICAgLypvdXQqL3VpbnQzMl90KiBudW1SZXF1ZXN0UHJvY2Vzc2VkKSA9IDA7CiAKLSAgICAgICAgdm9pZCBzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcyk7Ci0gICAgICAgIGJvb2wgaXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZChDYW1lcmFNZXRhZGF0YSYgb2xkU2Vzc2lvblBhcmFtcywKLSAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSYgbmV3U2Vzc2lvblBhcmFtcyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKSA9IDA7CiAKLSAgICAgICAgLy8gVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgSGFsSW50ZXJmYWNlIHdpbGwgcmV0dXJuIGJ1ZmZlciBtYXBzIG5lZWRlZCBmb3Igb2ZmbGluZQotICAgICAgICAvLyBwcm9jZXNzaW5nLCBhbmQgY2xlYXIgYWxsIGl0cyBpbnRlcm5hbCBidWZmZXIgbWFwcy4KLSAgICAgICAgc3RhdHVzX3Qgc3dpdGNoVG9PZmZsaW5lKAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9oYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OkNhbWVyYU9mZmxpbmVTZXNzaW9uSW5mbyogb2ZmbGluZVNlc3Npb25JbmZvLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9zcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qIG9mZmxpbmVTZXNzaW9uLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9jYW1lcmEzOjpCdWZmZXJSZWNvcmRzKiBidWZmZXJSZWNvcmRzKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQoQ2FtZXJhTWV0YWRhdGEmIG9sZFNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIG5ld1Nlc3Npb25QYXJhbXMpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlcGVhdGluZ1JlcXVlc3RFbmQodWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gJnN0cmVhbUlkcykgPSAwOwogCiAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAvLyBJbXBsZW1lbnRzIEJ1ZmZlclJlY29yZHNJbnRlcmZhY2UKQEAgLTQxMiw2ICs0MTMsOCBAQAogICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgdWludDY0X3Q+IGdldEJ1ZmZlcklkKAogICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcl9oYW5kbGVfdCYgYnVmLCBpbnQgc3RyZWFtSWQpIG92ZXJyaWRlOwogCisgICAgICAgIHVpbnQ2NF90IHJlbW92ZU9uZUJ1ZmZlckNhY2hlKGludCBzdHJlYW1JZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpIG92ZXJyaWRlOworCiAgICAgICAgIHN0YXR1c190IHBvcEluZmxpZ2h0QnVmZmVyKGludDMyX3QgZnJhbWVOdW1iZXIsIGludDMyX3Qgc3RyZWFtSWQsCiAgICAgICAgICAgICAgICAgLypvdXQqLyBidWZmZXJfaGFuZGxlX3QgKipidWZmZXIpIG92ZXJyaWRlOwogCkBAIC00MzMsNDEgKzQzNiwzNSBAQAogCiAgICAgICAgIHZvaWQgb25TdHJlYW1SZUNvbmZpZ3VyZWQoaW50IHN0cmVhbUlkKTsKIAotICAgICAgcHJpdmF0ZToKLSAgICAgICAgLy8gQWx3YXlzIHZhbGlkCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbjsKLSAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuMyBvciBuZXdlcgotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzM6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM18zOwotICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy40IG9yIG5ld2VyCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzQ7Ci0gICAgICAgIC8vIFZhbGlkIGlmIElDYW1lcmFEZXZpY2VTZXNzaW9uIGlzIEAzLjUgb3IgbmV3ZXIKLSAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfNTsKLSAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuNiBvciBuZXdlcgotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM182OwotICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy43IG9yIG5ld2VyCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzc7Ci0KLSAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtUmVxdWVzdE1ldGFkYXRhUXVldWU7Ci0KLSAgICAgICAgLy8gVGhlIG91dHB1dCBISURMIHJlcXVlc3Qgc3RpbGwgZGVwZW5kcyBvbiBpbnB1dCBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QKLSAgICAgICAgLy8gRG8gbm90IGZyZWUgaW5wdXQgY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90IGJlZm9yZSBvdXRwdXQgSElETCByZXF1ZXN0Ci0gICAgICAgIHN0YXR1c190IHdyYXBBc0hpZGxSZXF1ZXN0KGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCogaW4sCi0gICAgICAgICAgICAgICAgLypvdXQqL2hhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIG91dCwKLSAgICAgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBpbmZsaWdodEJ1ZmZlcnMpOwotCi0gICAgICAgIHN0YXR1c190IHB1c2hJbmZsaWdodEJ1ZmZlckxvY2tlZChpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHN0cmVhbUlkLAotICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyKTsKLQotICAgICAgICAvLyBQb3AgaW5mbGlnaHQgYnVmZmVycyBiYXNlZCBvbiBwYWlycyBvZiAoZnJhbWVOdW1iZXIsc3RyZWFtSWQpCi0gICAgICAgIHZvaWQgcG9wSW5mbGlnaHRCdWZmZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4mIGJ1ZmZlcnMpOworICAgICAgcHJvdGVjdGVkOgogCiAgICAgICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBpbnB1dCBjYWNoZXMgbWF0Y2ggd2hhdCB3ZSBoYXZlOyBvdGhlcndpc2UgZmFsc2UKICAgICAgICAgYm9vbCB2ZXJpZnlCdWZmZXJJZHMoaW50MzJfdCBzdHJlYW1JZCwgc3RkOjp2ZWN0b3I8dWludDY0X3Q+JiBpbkJ1Zklkcyk7CiAKLSAgICAgICAgLy8gRGVsZXRlIGFuZCBvcHRpb25hbGx5IGNsb3NlIG5hdGl2ZSBoYW5kbGVzIGFuZCBjbGVhciB0aGUgaW5wdXQgdmVjdG9yIGFmdGVyd2FyZAotICAgICAgICBzdGF0aWMgdm9pZCBjbGVhbnVwTmF0aXZlSGFuZGxlcygKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiAqaGFuZGxlcywgYm9vbCBjbG9zZUZkID0gZmFsc2UpOworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT2ZmbGluZVNlc3Npb25JbmZvVD4KKyAgICAgICAgc3RhdHVzX3QgdmVyaWZ5QnVmZmVyQ2FjaGVzKAorICAgICAgICAgICAgY29uc3QgT2ZmbGluZVNlc3Npb25JbmZvVCAqb2ZmbGluZVNlc3Npb25JbmZvLCBjYW1lcmEzOjpCdWZmZXJSZWNvcmRzICpidWZmZXJSZWNvcmRzKSB7CisgICAgICAgICAgICAvLyBWYWxpZGF0ZSBidWZmZXIgY2FjaGVzCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBzdHJlYW1zOworICAgICAgICAgICAgc3RyZWFtcy5yZXNlcnZlKG9mZmxpbmVTZXNzaW9uSW5mby0+b2ZmbGluZVN0cmVhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBvZmZsaW5lU3RyZWFtIDogb2ZmbGluZVNlc3Npb25JbmZvLT5vZmZsaW5lU3RyZWFtcykgeworICAgICAgICAgICAgICAgIGludDMyX3QgaWQgPSBvZmZsaW5lU3RyZWFtLmlkOworICAgICAgICAgICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgICAgICAgICAvLyBWZXJpZnkgYnVmZmVyIGNhY2hlcworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBidWZJZHMob2ZmbGluZVN0cmVhbS5jaXJjdWxhdGluZ0J1ZmZlcklkcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbGluZVN0cmVhbS5jaXJjdWxhdGluZ0J1ZmZlcklkcy5lbmQoKSk7CisgICAgICAgICAgICAgICAgaWYgKCF2ZXJpZnlCdWZmZXJJZHMoaWQsIGJ1ZklkcykpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBzdHJlYW0gSUQgJWQgYnVmZmVyIGNhY2hlIHJlY29yZHMgbWlzbWF0Y2ghIiwgX19GVU5DVElPTl9fLCBpZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTW92ZSBidWZmZXIgcmVjb3JkcworICAgICAgICAgICAgYnVmZmVyUmVjb3Jkcy0+dGFrZUJ1ZmZlckNhY2hlcyhtQnVmZmVyUmVjb3Jkcywgc3RyZWFtcyk7CisgICAgICAgICAgICBidWZmZXJSZWNvcmRzLT50YWtlSW5mbGlnaHRCdWZmZXJNYXAobUJ1ZmZlclJlY29yZHMpOworICAgICAgICAgICAgYnVmZmVyUmVjb3Jkcy0+dGFrZVJlcXVlc3RlZEJ1ZmZlck1hcChtQnVmZmVyUmVjb3Jkcyk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KIAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJGcmVlZChpbnQgc3RyZWFtSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKSBvdmVycmlkZTsKIApAQCAtNDgzLDcgKzQ4MCw3IEBACiAgICAgICAgIGJvb2wgbUlzUmVjb25maWd1cmF0aW9uUXVlcnlTdXBwb3J0ZWQ7CiAKICAgICAgICAgY29uc3QgYm9vbCBtU3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nOwotICAgIH07CisgICAgfTsgLy8gY2xhc3MgSGFsSW50ZXJmYWNlCiAKICAgICBzcDxIYWxJbnRlcmZhY2U+IG1JbnRlcmZhY2U7CiAKQEAgLTU0Myw2ICs1NDAsNyBAQAogCiAgICAgLyoqKiogRW5kIHNjb3BlIGZvciBtTG9jayAqKioqLwogCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbURldmljZVRpbWVCYXNlSXNSZWFsdGltZTsKICAgICAvLyBUaGUgb2Zmc2V0IGNvbnZlcnRpbmcgZnJvbSBjbG9jayBkb21haW4gb2Ygb3RoZXIgc3Vic3lzdGVtCiAgICAgLy8gKHZpZGVvL2hhcmR3YXJlIGNvbXBvc2VyKSB0byB0aGF0IG9mIGNhbWVyYS4gQXNzdW1wdGlvbiBpcyB0aGF0IHRoaXMKICAgICAvLyBvZmZzZXQgd29uJ3QgY2hhbmdlIGR1cmluZyB0aGUgbGlmZSBjeWNsZSBvZiB0aGUgY2FtZXJhIGRldmljZS4gSW4gb3RoZXIKQEAgLTU3MCwxMCArNTY4LDYgQEAKICAgICAgICAgLy8gb3ZlcnJpZGluZyBvZiBST1RBVEVfQU5EX0NST1AgdmFsdWUgYW5kIGFkanVzdG1lbnQgb2YgY29vcmRpbmF0ZXMKICAgICAgICAgLy8gaW4gc2V2ZXJhbCBvdGhlciBjb250cm9scyBpbiBib3RoIHRoZSByZXF1ZXN0IGFuZCB0aGUgcmVzdWx0CiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3RhdGVBbmRDcm9wQXV0bzsKLSAgICAgICAgLy8gT3JpZ2luYWwgdmFsdWUgb2YgVEVTVF9QQVRURVJOX01PREUgYW5kIERBVEEgc28gdGhhdCB0aGV5IGNhbiBiZQotICAgICAgICAvLyByZXN0b3JlZCB3aGVuIHNlbnNvciBtdXRpbmcgaXMgdHVybmVkIG9mZgotICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZ2luYWxUZXN0UGF0dGVybk1vZGU7Ci0gICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVs0XTsKIAogICAgICAgICAvLyBXaGV0aGVyIHRoaXMgY2FwdHVyZSByZXF1ZXN0IGhhcyBpdHMgem9vbSByYXRpbyBzZXQgdG8gMS4weCBiZWZvcmUKICAgICAgICAgLy8gdGhlIGZyYW1ld29yayBvdmVycmlkZXMgaXQgZm9yIGNhbWVyYSBIQUwgY29uc3VtcHRpb24uCkBAIC01ODEsNyArNTc1LDYgQEAKICAgICAgICAgLy8gVGhlIHN5c3RlbVRpbWUgdGltZXN0YW1wIHdoZW4gdGhlIHJlcXVlc3QgaXMgY3JlYXRlZC4KICAgICAgICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlcXVlc3RUaW1lTnM7CiAKLQogICAgICAgICAvLyBXaGV0aGVyIHRoaXMgY2FwdHVyZSByZXF1ZXN0J3MgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIHVwZGF0ZSBoYXMKICAgICAgICAgLy8gYmVlbiBkb25lLgogICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGlzdG9ydGlvbkNvcnJlY3Rpb25VcGRhdGVkID0gZmFsc2U7CkBAIC02MTQsMzMgKzYwNyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBlYXRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAKLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrCi0gICAgICovCi0KLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCgKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgb3ZlcnJpZGU7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgb3ZlcnJpZGU7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBub3RpZnkoCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnPiYgbXNncykgb3ZlcnJpZGU7Ci0KLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJlcXVlc3RTdHJlYW1CdWZmZXJzKAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAotICAgICAgICAgICAgcmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwotCi0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXR1cm5TdHJlYW1CdWZmZXJzKAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIG92ZXJyaWRlOwotCi0gICAgLy8gSGFuZGxlIG9uZSBub3RpZnkgbWVzc2FnZQotICAgIHZvaWQgbm90aWZ5KGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnJiBtc2cpOwotCiAgICAgLy8gbG9jayB0byBlbnN1cmUgb25seSBvbmUgcHJvY2Vzc0NhcHR1cmVSZXN1bHQgaXMgY2FsbGVkIGF0IGEgdGltZS4KICAgICBNdXRleCBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrOwogCkBAIC02NTgsNiArNjI0LDkgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIENhbWVyYU1ldGFkYXRhIGdldExhdGVzdFJlcXVlc3RMb2NrZWQoKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5qZWN0aW9uQ2FtZXJhSW5pdGlhbGl6ZShjb25zdCBTdHJpbmc4ICZpbmplY3RDYW1JZCwKKyAgICAgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgPSAwOworCiAgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBjdXJyZW50IGRldmljZSBzdGF0dXMgYW5kIHdha2UgYWxsIHdhaXRpbmcgdGhyZWFkcy4KICAgICAgKgpAQCAtOTA2LDE2ICs4NzUsMTEgQEAKICAgICAgICAgdm9pZCBzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcyk7CiAgICAgICAgIHZvaWQgcmVzZXRQaXBlbGluZURyYWluKCk7CiAKLSAgICAgICAgc3RhdHVzX3Qgc3dpdGNoVG9PZmZsaW5lKAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9oYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OkNhbWVyYU9mZmxpbmVTZXNzaW9uSW5mbyogb2ZmbGluZVNlc3Npb25JbmZvLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9zcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qIG9mZmxpbmVTZXNzaW9uLAotICAgICAgICAgICAgICAgIC8qb3V0Ki9jYW1lcmEzOjpCdWZmZXJSZWNvcmRzKiBidWZmZXJSZWNvcmRzKTsKLQogICAgICAgICB2b2lkIGNsZWFyUHJldmlvdXNSZXF1ZXN0KCk7CiAKICAgICAgICAgc3RhdHVzX3Qgc2V0Um90YXRlQW5kQ3JvcEF1dG9CZWhhdmlvcigKICAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9yb3RhdGVfYW5kX2Nyb3BfdCByb3RhdGVBbmRDcm9wVmFsdWUpOworICAgICAgICBzdGF0dXNfdCBzZXRDb21wb3NlclN1cmZhY2UoYm9vbCBjb21wb3NlclN1cmZhY2VQcmVzZW50KTsKIAogICAgICAgICBzdGF0dXNfdCBzZXRDYW1lcmFNdXRlKGludDMyX3QgbXV0ZU1vZGUpOwogCkBAIC05MjUsNyArODg5LDYgQEAKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwogCi0gICAgICBwcml2YXRlOgogICAgICAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCYgZ2V0SWQoY29uc3Qgd3A8Q2FtZXJhM0RldmljZT4gJmRldmljZSk7CiAKICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgIHF1ZXVlVHJpZ2dlckxvY2tlZChSZXF1ZXN0VHJpZ2dlciB0cmlnZ2VyKTsKQEAgLTk5OSw4ICs5NjIsOSBAQAogICAgICAgICAvLyBzZW5kIHJlcXVlc3QgaW4gbU5leHRSZXF1ZXN0cyB0byBIQUwgaW4gYSBiYXRjaC4gUmV0dXJuIHRydWUgPSBzdWNzc2VzcwogICAgICAgICBib29sIHNlbmRSZXF1ZXN0c0JhdGNoKCk7CiAKLSAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBleHBlY3RlZCBtYXhpbXVtIGR1cmF0aW9uIGZvciBhIHJlcXVlc3QKLSAgICAgICAgbnNlY3NfdCBjYWxjdWxhdGVNYXhFeHBlY3RlZER1cmF0aW9uKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyZXF1ZXN0KTsKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBleHBlY3RlZCAobWluaW11bSwgbWF4aW11bSkgZHVyYXRpb24gcmFuZ2UgZm9yIGEgcmVxdWVzdAorICAgICAgICBzdGQ6OnBhaXI8bnNlY3NfdCwgbnNlY3NfdD4gY2FsY3VsYXRlRXhwZWN0ZWREdXJhdGlvblJhbmdlKAorICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyZXF1ZXN0KTsKIAogICAgICAgICAvLyBDaGVjayBhbmQgdXBkYXRlIGxhdGVzdCBzZXNzaW9uIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVxdWVzdCBzZXR0aW5ncy4KICAgICAgICAgYm9vbCB1cGRhdGVTZXNzaW9uUGFyYW1ldGVycyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpOwpAQCAtMTAyNSw2ICs5ODksOCBAQAogCiAgICAgICAgIE11dGV4ICAgICAgICAgICAgICBtUmVxdWVzdExvY2s7CiAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICBtUmVxdWVzdFNpZ25hbDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1SZXF1ZXN0Q2xlYXJpbmc7CisKICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgIG1SZXF1ZXN0U3VibWl0dGVkU2lnbmFsOwogICAgICAgICBSZXF1ZXN0TGlzdCAgICAgICAgbVJlcXVlc3RRdWV1ZTsKICAgICAgICAgUmVxdWVzdExpc3QgICAgICAgIG1SZXBlYXRpbmdSZXF1ZXN0czsKQEAgLTEwNjgsNiArMTAzNCw3IEBACiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICBtQ3VycmVudEFmVHJpZ2dlcklkOwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgbUN1cnJlbnRQcmVDYXB0dXJlVHJpZ2dlcklkOwogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9yb3RhdGVfYW5kX2Nyb3BfdCBtUm90YXRlQW5kQ3JvcE92ZXJyaWRlOworICAgICAgICBib29sICAgICAgICAgICAgICAgbUNvbXBvc2VyT3V0cHV0OwogICAgICAgICBpbnQzMl90ICAgICAgICAgICAgbUNhbWVyYU11dGU7IC8vIDAgPSBubyBtdXRlLCBvdGhlcndpc2UgdGhlIFRFU1RfUEFUVEVSTl9NT0RFIHRvIHVzZQogICAgICAgICBib29sICAgICAgICAgICAgICAgbUNhbWVyYU11dGVDaGFuZ2VkOwogCkBAIC0xMDg5LDYgKzEwNTYsMTQgQEAKICAgICAgICAgY29uc3QgYm9vbCAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyOwogICAgICAgICBjb25zdCBib29sICAgICAgICAgbVN1cHBvcnRDYW1lcmFNdXRlOwogICAgIH07CisKKyAgICB2aXJ0dWFsIHNwPFJlcXVlc3RUaHJlYWQ+IGNyZWF0ZU5ld1JlcXVlc3RUaHJlYWQod3A8Q2FtZXJhM0RldmljZT4gLypwYXJlbnQqLywKKyAgICAgICAgICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiAvKnN0YXR1c1RyYWNrZXIqLywKKyAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IC8qaW50ZXJmYWNlKi8sCisgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPGludDMyX3Q+JiAvKnNlc3Npb25QYXJhbUtleXMqLywKKyAgICAgICAgICAgICAgICBib29sIC8qdXNlSGFsQnVmTWFuYWdlciovLAorICAgICAgICAgICAgICAgIGJvb2wgLypzdXBwb3J0Q2FtZXJhTXV0ZSovKSA9IDA7CisKICAgICBzcDxSZXF1ZXN0VGhyZWFkPiBtUmVxdWVzdFRocmVhZDsKIAogICAgIC8qKgpAQCAtMTEwNiw3ICsxMDgxLDcgQEAKIAogICAgIHN0YXR1c190IHJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0LAotICAgICAgICAgICAgYm9vbCBjYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLAorICAgICAgICAgICAgYm9vbCBjYWxsYmFjaywgbnNlY3NfdCBtaW5FeHBlY3RlZER1cmF0aW9uLCBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24sCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnNldDxTdHJpbmc4Pj4mIHBoeXNpY2FsQ2FtZXJhSWRzLAogICAgICAgICAgICAgYm9vbCBpc1N0aWxsQ2FwdHVyZSwgYm9vbCBpc1pzbENhcHR1cmUsIGJvb2wgcm90YXRlQW5kQ3JvcEF1dG8sCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGNhbWVyYUlkc1dpdGhab29tLCBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcywKQEAgLTEyNDksNyArMTIyNCw5IEBACiAKICAgICB2b2lkIG1vbml0b3JNZXRhZGF0YShUYWdNb25pdG9yOjpldmVudFNvdXJjZSBzb3VyY2UsIGludDY0X3QgZnJhbWVOdW1iZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4mIHBoeXNpY2FsTWV0YWRhdGEpOworICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4mIHBoeXNpY2FsTWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLCB1aW50MzJfdCBudW1PdXRwdXRCdWZmZXJzLAorICAgICAgICAgICAgaW50MzJfdCBpbnB1dFN0cmVhbUlkKTsKIAogICAgIG1ldGFkYXRhX3ZlbmRvcl9pZF90IG1WZW5kb3JUYWdJZDsKIApAQCAtMTM1NSw2ICsxMzMyLDkgQEAKICAgICAvLyBwZXJmb3JtYW5jZSBjbGFzcy4KICAgICBib29sIG1PdmVycmlkZUZvclBlcmZDbGFzczsKIAorICAgIC8vIFRoZSBjdXJyZW50IG1pbmltdW0gZXhwZWN0ZWQgZnJhbWUgZHVyYXRpb24gYmFzZWQgb24gQUVfVEFSR0VUX0ZQU19SQU5HRQorICAgIG5zZWNzX3QgbU1pbkV4cGVjdGVkRHVyYXRpb24gPSAwOworCiAgICAgLy8gSW5qZWN0aW9uIGNhbWVyYSByZWxhdGVkIG1ldGhvZHMuCiAgICAgY2xhc3MgQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKICAgICAgIHB1YmxpYzoKQEAgLTEzNjIsNDQgKzEzNDIsNDYgQEAKIAogICAgICAgICB+Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMoKTsKIAotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBpbmplY3Rpb24gY2FtZXJhIGFuZCBnZW5lcmF0ZSBhbiBoYWwgaW50ZXJmYWNlLgotICAgICAgICBzdGF0dXNfdCBpbmplY3Rpb25Jbml0aWFsaXplKAotICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGluamVjdGVkQ2FtSWQsIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKLSAgICAgICAgICAgICAgICBjb25zdCBzcDwKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yIDo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2spOwotCiAgICAgICAgIC8vIEluamVjdGlvbiBjYW1lcmEgd2lsbCByZXBsYWNlIHRoZSBpbnRlcm5hbCBjYW1lcmEgYW5kIGNvbmZpZ3VyZSBzdHJlYW1zCiAgICAgICAgIC8vIHdoZW4gZGV2aWNlIGlzIElETEUgYW5kIHJlcXVlc3QgdGhyZWFkIGlzIHBhdXNlZC4KICAgICAgICAgc3RhdHVzX3QgaW5qZWN0Q2FtZXJhKAogICAgICAgICAgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiYgaW5qZWN0aW9uQ29uZmlnLAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgaW5qZWN0aW9uQnVmZmVyU2l6ZXMpOworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgaW5qZWN0aW9uQnVmZmVyU2l6ZXMpOwogCiAgICAgICAgIC8vIFN0b3AgdGhlIGluamVjdGlvbiBjYW1lcmEgYW5kIHN3aXRjaCBiYWNrIHRvIGJhY2t1cCBoYWwgaW50ZXJmYWNlLgogICAgICAgICBzdGF0dXNfdCBzdG9wSW5qZWN0aW9uKCk7CiAKICAgICAgICAgYm9vbCBpc0luamVjdGluZygpOwogCisgICAgICAgIGJvb2wgaXNTdHJlYW1Db25maWdDb21wbGV0ZUJ1dE5vdEluamVjdGVkKCk7CisKICAgICAgICAgY29uc3QgU3RyaW5nOCYgZ2V0SW5qZWN0ZWRDYW1JZCgpIGNvbnN0OwogCiAgICAgICAgIHZvaWQgZ2V0SW5qZWN0aW9uQ29uZmlnKC8qb3V0Ki8gY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uKiBpbmplY3Rpb25Db25maWcsCiAgICAgICAgICAgICAgICAgLypvdXQqLyBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4qIGluamVjdGlvbkJ1ZmZlclNpemVzKTsKIAotICAgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gV2hlbiB0aGUgc3RyZWFtaW5nIGNvbmZpZ3VyYXRpb24gaXMgY29tcGxldGVkIGFuZCB0aGUgY2FtZXJhIGRldmljZSBpcyBhY3RpdmUsIGJ1dCB0aGUKKyAgICAgICAgLy8gaW5qZWN0aW9uIGNhbWVyYSBoYXMgbm90IHlldCBiZWVuIGluamVjdGVkLCB0aGUgc3RyZWFtaW5nIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGludGVybmFsCisgICAgICAgIC8vIGNhbWVyYSB3aWxsIGJlIHN0b3JlZCBmaXJzdC4KKyAgICAgICAgdm9pZCBzdG9yZUluamVjdGlvbkNvbmZpZygKKyAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24mIGluamVjdGlvbkNvbmZpZywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGluamVjdGlvbkJ1ZmZlclNpemVzKTsKKworICAgICAgcHJvdGVjdGVkOgogICAgICAgICAvLyBDb25maWd1cmUgdGhlIHN0cmVhbXMgb2YgaW5qZWN0aW9uIGNhbWVyYSwgaXQgbmVlZCB3YWl0IHVudGlsIHRoZQogICAgICAgICAvLyBvdXRwdXQgc3RyZWFtcyBhcmUgY3JlYXRlZCBhbmQgY29uZmlndXJlZCB0byB0aGUgb3JpZ2luYWwgY2FtZXJhIGJlZm9yZQogICAgICAgICAvLyBwcm9jZWVkaW5nLgogICAgICAgICBzdGF0dXNfdCBpbmplY3Rpb25Db25maWd1cmVTdHJlYW1zKAogICAgICAgICAgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiYgaW5qZWN0aW9uQ29uZmlnLAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgaW5qZWN0aW9uQnVmZmVyU2l6ZXMpOworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgaW5qZWN0aW9uQnVmZmVyU2l6ZXMpOwogCiAgICAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIGluamVjdGlvbiBjYW1lcmEgYW5kIGRlbGV0ZSB0aGUgaGFsIGludGVyZmFjZS4KICAgICAgICAgdm9pZCBpbmplY3Rpb25EaXNjb25uZWN0SW1wbCgpOwogCiAgICAgICAgIC8vIFVzZSBpbmplY3Rpb24gY2FtZXJhIGhhbCBpbnRlcmZhY2UgdG8gcmVwbGFjZSBhbmQgYmFja3VwIG9yaWdpbmFsCiAgICAgICAgIC8vIGNhbWVyYSBoYWwgaW50ZXJmYWNlLgotICAgICAgICBzdGF0dXNfdCByZXBsYWNlSGFsSW50ZXJmYWNlKHNwPEhhbEludGVyZmFjZT4gbmV3SGFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgIGJvb2wga2VlcEJhY2t1cCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVwbGFjZUhhbEludGVyZmFjZShzcDxIYWxJbnRlcmZhY2U+IC8qbmV3SGFsSW50ZXJmYWNlKi8sCisgICAgICAgICAgICAgICAgYm9vbCAvKmtlZXBCYWNrdXAqLykgPSAwOwogCiAgICAgICAgIHdwPENhbWVyYTNEZXZpY2U+IG1QYXJlbnQ7CiAKQEAgLTE0MDksOSArMTM5MSwxNiBAQAogICAgICAgICAvLyBHZW5lcmF0ZWQgaW5qZWN0aW9uIGNhbWVyYSBoYWwgaW50ZXJmYWNlLgogICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IG1JbmplY3RlZENhbUhhbEludGVyZmFjZTsKIAorICAgICAgICAvLyBUaGUgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gaXMgY29tcGxldGUsIHRoZSBjYW1lcmEgZGV2aWNlIGlzCisgICAgICAgIC8vIGFjdGl2ZSwgYnV0IHRoZSBpbmplY3Rpb24gY2FtZXJhIGhhcyBub3QgeWV0IGJlZW4gaW5qZWN0ZWQuCisgICAgICAgIGJvb2wgbUlzU3RyZWFtQ29uZmlnQ29tcGxldGVCdXROb3RJbmplY3RlZCA9IGZhbHNlOworCiAgICAgICAgIC8vIENvcHkgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGludGVybmFsIGNhbWVyYS4KICAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uIG1JbmplY3Rpb25Db25maWc7CiAKKyAgICAgICAgLy8gQ29weSB0aGUgc3RyZWFtcyBvZiB0aGUgaW50ZXJuYWwgY2FtZXJhLgorICAgICAgICBWZWN0b3I8Y2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV90Kj4gbUluamVjdGlvblN0cmVhbXM7CisKICAgICAgICAgLy8gQ29weSB0aGUgYnVmZmVyU2l6ZXMgb2YgdGhlIG91dHB1dCBzdHJlYW1zIG9mIHRoZSBpbnRlcm5hbCBjYW1lcmEuCiAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBtSW5qZWN0aW9uQnVmZmVyU2l6ZXM7CiAKQEAgLTE0MjIsNiArMTQxMSwxMCBAQAogICAgICAgICAvLyBUaGUgaW5qZWN0aW9uIGNhbWVyYSBJRC4KICAgICAgICAgU3RyaW5nOCBtSW5qZWN0ZWRDYW1JZDsKICAgICB9OworCisgICAgdmlydHVhbCBzcDxDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcz4KKyAgICAgICAgICAgIGNyZWF0ZUNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKHdwPENhbWVyYTNEZXZpY2U+KSA9IDA7CisKICAgICBzcDxDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcz4gbUluamVjdGlvbk1ldGhvZHM7CiAKIH07IC8vIGNsYXNzIENhbWVyYTNEZXZpY2UKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcy5jcHAKaW5kZXggZjE0NWRhYy4uMDMxYzI1NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcy5jcHAKQEAgLTI2LDggKzI2LDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uOwotCiBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMoCiAgICAgICAgIHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCkKICAgICAgICAgOiBtUGFyZW50KHBhcmVudCkgewpAQCAtMzksOTggKzM3LDEwIEBACiAgICAgaW5qZWN0aW9uRGlzY29ubmVjdEltcGwoKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OmluamVjdGlvbkluaXRpYWxpemUoCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGluamVjdGVkQ2FtSWQsIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKLSAgICAgICAgY29uc3Qgc3A8YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JgotICAgICAgICAgICAgICAgIGNhbGxiYWNrKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtSW5qZWN0aW9uTG9jayk7Ci0KLSAgICBpZiAobWFuYWdlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbWFuYWdlciBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7Ci0gICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogcGFyZW50IGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtSW5qZWN0ZWRDYW1JZCA9IGluamVjdGVkQ2FtSWQ7Ci0gICAgc3A8SUNhbWVyYURldmljZVNlc3Npb24+IHNlc3Npb247Ci0gICAgQVRSQUNFX0JFR0lOKCJJbmplY3Rpb24gQ2FtZXJhSGFsOjpvcGVuU2Vzc2lvbiIpOwotICAgIHN0YXR1c190IHJlcyA9IG1hbmFnZXItPm9wZW5TZXNzaW9uKGluamVjdGVkQ2FtSWQuc3RyaW5nKCksIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLyAmc2Vzc2lvbik7Ci0gICAgQVRSQUNFX0VORCgpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgY291bGQgbm90IG9wZW4gY2FtZXJhIHNlc3Npb246ICVzICglZCkiLAotICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWU7Ci0gICAgYXV0byByZXF1ZXN0UXVldWVSZXQgPQotICAgICAgICBzZXNzaW9uLT5nZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoWyZxdWV1ZV0oY29uc3QgYXV0byYgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgcXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPihkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIGlmICghcXVldWUtPmlzVmFsaWQoKSB8fCBxdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiSW5qZWN0aW9uIGNhbWVyYSBIQUwgcmV0dXJucyBlbXB0eSByZXF1ZXN0IG1ldGFkYXRhIGZtcSwgbm90ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgaXQiKTsKLSAgICAgICAgICAgICAgICBxdWV1ZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgdXNlIHRoZSBxdWV1ZSBvbndhcmRzLgotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICBpZiAoIXJlcXVlc3RRdWV1ZVJldC5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgdHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlcXVlc3QgbWV0YWRhdGEgZm1xOiAiCi0gICAgICAgICAgICAgICAgIiVzLCBub3QgdXNlIGl0IiwgcmVxdWVzdFF1ZXVlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4mIHJlc1F1ZXVlID0gcGFyZW50LT5tUmVzdWx0TWV0YWRhdGFRdWV1ZTsKLSAgICBhdXRvIHJlc3VsdFF1ZXVlUmV0ID0gc2Vzc2lvbi0+Z2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoCi0gICAgICAgIFsmcmVzUXVldWVdKGNvbnN0IGF1dG8mIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIHJlc1F1ZXVlID0gc3RkOjptYWtlX3VuaXF1ZTxSZXN1bHRNZXRhZGF0YVF1ZXVlPihkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIGlmICghcmVzUXVldWUtPmlzVmFsaWQoKSB8fCByZXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiSW5qZWN0aW9uIGNhbWVyYSBIQUwgcmV0dXJucyBlbXB0eSByZXN1bHQgbWV0YWRhdGEgZm1xLCBub3QgdXNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJpdCIpOwotICAgICAgICAgICAgICAgIHJlc1F1ZXVlID0gbnVsbHB0cjsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCB1c2UgdGhlIHJlc1F1ZXVlIG9ud2FyZHMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIGlmICghcmVzdWx0UXVldWVSZXQuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCJJbmplY3Rpb24gY2FtZXJhIHRyYW5zYWN0aW9uIGVycm9yIHdoZW4gZ2V0dGluZyByZXN1bHQgbWV0YWRhdGEgcXVldWUgIgotICAgICAgICAgICAgICAgICJmcm9tIGNhbWVyYSBzZXNzaW9uOiAlcyIsIHJlc3VsdFF1ZXVlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgSUZfQUxPR1YoKSB7Ci0gICAgICAgIHNlc3Npb24tPmludGVyZmFjZUNoYWluKAotICAgICAgICAgICAgICAgIFtdKDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlQ2hhaW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJJbmplY3Rpb24gY2FtZXJhIHNlc3Npb24gaW50ZXJmYWNlIGNoYWluOiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpZmFjZSA6IGludGVyZmFjZUNoYWluKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiAgJXMiLCBpZmFjZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBBTE9HVigiJXM6IEluamVjdGlvbiBjYW1lcmEgaW50ZXJmYWNlID0gbmV3IEhhbEludGVyZmFjZSgpIiwgX19GVU5DVElPTl9fKTsKLSAgICBtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UgPQotICAgICAgICAgICAgbmV3IEhhbEludGVyZmFjZShzZXNzaW9uLCBxdWV1ZSwgcGFyZW50LT5tVXNlSGFsQnVmTWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5tU3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKTsKLSAgICBpZiAobUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OmluamVjdENhbWVyYSgKICAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uJiBpbmplY3Rpb25Db25maWcsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgaW5qZWN0aW9uQnVmZmVyU2l6ZXMpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBpbmplY3Rpb25CdWZmZXJTaXplcykgewogICAgIHN0YXR1c190IHJlcyA9IE5PX0VSUk9SOwotICAgIG1JbmplY3Rpb25Db25maWcgPSBpbmplY3Rpb25Db25maWc7Ci0gICAgbUluamVjdGlvbkJ1ZmZlclNpemVzID0gaW5qZWN0aW9uQnVmZmVyU2l6ZXM7CiAKICAgICBpZiAobUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fKTsKQEAgLTE0OCw3ICs1OCw2IEBACiAgICAgaWYgKHBhcmVudC0+bVN0YXR1cyA9PSBTVEFUVVNfQUNUSVZFKSB7CiAgICAgICAgIEFMT0dWKCIlczogTGV0IHRoZSBkZXZpY2UgYmUgSURMRSBhbmQgdGhlIHJlcXVlc3QgdGhyZWFkIGlzIHBhdXNlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcGFyZW50LT5tUGF1c2VTdGF0ZU5vdGlmeSA9IHRydWU7CiAgICAgICAgIHJlcyA9IHBhcmVudC0+aW50ZXJuYWxQYXVzZUFuZFdhaXRMb2NrZWQobWF4RXhwZWN0ZWREdXJhdGlvbik7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgcGF1c2UgY2FwdHVyZXMgdG8gaW5qZWN0IGNhbWVyYSEiLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTg4LDcgKzk3LDcgQEAKICAgICAgICAgQUxPR1YoIiVzOiBSZXN0YXJ0aW5nIGFjdGl2aXR5IHRvIGluamVjdCBjYW1lcmEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAvLyBSZXVzZSBjdXJyZW50IG9wZXJhdGluZyBtb2RlIGFuZCBzZXNzaW9uIHBhcmFtZXRlcnMgZm9yIG5ldyBzdHJlYW0KICAgICAgICAgLy8gY29uZmlnLgotICAgICAgICBwYXJlbnQtPmludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKFNUQVRVU19BQ1RJVkUpOworICAgICAgICBwYXJlbnQtPmludGVybmFsUmVzdW1lTG9ja2VkKCk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtMjA4LDcgKzExNyw2IEBACiAgICAgaWYgKHBhcmVudC0+bVN0YXR1cyA9PSBTVEFUVVNfQUNUSVZFKSB7CiAgICAgICAgIEFMT0dWKCIlczogTGV0IHRoZSBkZXZpY2UgYmUgSURMRSBhbmQgdGhlIHJlcXVlc3QgdGhyZWFkIGlzIHBhdXNlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcGFyZW50LT5tUGF1c2VTdGF0ZU5vdGlmeSA9IHRydWU7CiAgICAgICAgIHJlcyA9IHBhcmVudC0+aW50ZXJuYWxQYXVzZUFuZFdhaXRMb2NrZWQobWF4RXhwZWN0ZWREdXJhdGlvbik7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgcGF1c2UgY2FwdHVyZXMgdG8gc3RvcCBpbmplY3Rpb24hIiwgX19GVU5DVElPTl9fKTsKQEAgLTIyOSw3ICsxMzcsNyBAQAogICAgICAgICBBTE9HVigiJXM6IFJlc3RhcnRpbmcgYWN0aXZpdHkgdG8gc3RvcCBpbmplY3Rpb24iLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAvLyBSZXVzZSBjdXJyZW50IG9wZXJhdGluZyBtb2RlIGFuZCBzZXNzaW9uIHBhcmFtZXRlcnMgZm9yIG5ldyBzdHJlYW0KICAgICAgICAgLy8gY29uZmlnLgotICAgICAgICBwYXJlbnQtPmludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKFNUQVRVU19BQ1RJVkUpOworICAgICAgICBwYXJlbnQtPmludGVybmFsUmVzdW1lTG9ja2VkKCk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtMjQzLDYgKzE1MSwxMCBAQAogICAgIH0KIH0KIAorYm9vbCBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6aXNTdHJlYW1Db25maWdDb21wbGV0ZUJ1dE5vdEluamVjdGVkKCkgeworICAgIHJldHVybiBtSXNTdHJlYW1Db25maWdDb21wbGV0ZUJ1dE5vdEluamVjdGVkOworfQorCiBjb25zdCBTdHJpbmc4JiBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6Z2V0SW5qZWN0ZWRDYW1JZCgpCiAgICAgICAgIGNvbnN0IHsKICAgICByZXR1cm4gbUluamVjdGVkQ2FtSWQ7CkBAIC0yNjAsMTAgKzE3MiwyMiBAQAogICAgICppbmplY3Rpb25CdWZmZXJTaXplcyA9IG1JbmplY3Rpb25CdWZmZXJTaXplczsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6c3RvcmVJbmplY3Rpb25Db25maWcoCisgICAgICAgIGNvbnN0IGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiYgaW5qZWN0aW9uQ29uZmlnLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGluamVjdGlvbkJ1ZmZlclNpemVzKSB7CisgICAgbUlzU3RyZWFtQ29uZmlnQ29tcGxldGVCdXROb3RJbmplY3RlZCA9IHRydWU7CisgICAgbUluamVjdGlvbkNvbmZpZyA9IGluamVjdGlvbkNvbmZpZzsKKyAgICBtSW5qZWN0aW9uU3RyZWFtcy5jbGVhcigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5qZWN0aW9uQ29uZmlnLm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgbUluamVjdGlvblN0cmVhbXMucHVzaF9iYWNrKGluamVjdGlvbkNvbmZpZy5zdHJlYW1zW2ldKTsKKyAgICB9CisgICAgbUluamVjdGlvbkNvbmZpZy5zdHJlYW1zID0gbUluamVjdGlvblN0cmVhbXMuZWRpdEFycmF5KCk7CisgICAgbUluamVjdGlvbkJ1ZmZlclNpemVzID0gaW5qZWN0aW9uQnVmZmVyU2l6ZXM7Cit9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzOjppbmplY3Rpb25Db25maWd1cmVTdHJlYW1zKAogICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24mIGluamVjdGlvbkNvbmZpZywKLSAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBpbmplY3Rpb25CdWZmZXJTaXplcykgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGluamVjdGlvbkJ1ZmZlclNpemVzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKIApAQCAtMzI2LDcgKzI1MCw2IEBACiAgICAgICAgICAgICBtSW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSk7CiAKICAgICBhdXRvIHJjID0gcGFyZW50LT5tUHJlcGFyZXJUaHJlYWQtPnJlc3VtZSgpOwotCiAgICAgaWYgKHJjICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogSW5qZWN0aW9uIGNhbWVyYSAlczogUHJlcGFyZXIgdGhyZWFkIGZhaWxlZCB0byByZXN1bWUhIiwKICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSk7CkBAIC0zMzksNiArMjYyLDkgQEAKIHZvaWQgQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OmluamVjdGlvbkRpc2Nvbm5lY3RJbXBsKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR0koIiVzOiBJbmplY3Rpb24gY2FtZXJhIGRpc2Nvbm5lY3QiLCBfX0ZVTkNUSU9OX18pOworICAgIG1Jc1N0cmVhbUNvbmZpZ0NvbXBsZXRlQnV0Tm90SW5qZWN0ZWQgPSBmYWxzZTsKKyAgICBtSW5qZWN0aW9uU3RyZWFtcy5jbGVhcigpOworICAgIG1JbmplY3Rpb25Db25maWcuc3RyZWFtcyA9IG51bGxwdHI7CiAKICAgICBtQmFja3VwSGFsSW50ZXJmYWNlID0gbnVsbHB0cjsKICAgICBIYWxJbnRlcmZhY2UqIGludGVyZmFjZSA9IG51bGxwdHI7CkBAIC0zNjUsMjkgKzI5MSw0IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6cmVwbGFjZUhhbEludGVyZmFjZSgKLSAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBuZXdIYWxJbnRlcmZhY2UsIGJvb2wga2VlcEJhY2t1cCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1JbmplY3Rpb25Mb2NrKTsKLSAgICBpZiAobmV3SGFsSW50ZXJmYWNlLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUaGUgbmV3SGFsSW50ZXJmYWNlIGRvZXMgbm90IGV4aXN0LCB0byBzdG9wIHJlcGxhY2luZy4iLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKLSAgICBpZiAocGFyZW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBwYXJlbnQgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGlmIChrZWVwQmFja3VwICYmIG1CYWNrdXBIYWxJbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICBtQmFja3VwSGFsSW50ZXJmYWNlID0gcGFyZW50LT5tSW50ZXJmYWNlOwotICAgIH0gZWxzZSBpZiAoIWtlZXBCYWNrdXApIHsKLSAgICAgICAgbUJhY2t1cEhhbEludGVyZmFjZSA9IG51bGxwdHI7Ci0gICAgfQotICAgIHBhcmVudC0+bUludGVyZmFjZSA9IG5ld0hhbEludGVyZmFjZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQogfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNGYWtlU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0Zha2VTdHJlYW0uY3BwCmluZGV4IDhjYzY4MzMuLjE5YWZkNjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0Zha2VTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0Zha2VTdHJlYW0uY3BwCkBAIC00OCw3ICs0OCw3IEBACiAKIHN0YXR1c190IENhbWVyYTNGYWtlU3RyZWFtOjpyZXR1cm5CdWZmZXJMb2NrZWQoCiAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICYsCi0gICAgICAgIG5zZWNzX3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7CisgICAgICAgIG5zZWNzX3QsIG5zZWNzX3QsIGludDMyX3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRmFrZSBzdHJlYW0gY2Fubm90IHJldHVybiBidWZmZXJzISIsIF9fRlVOQ1RJT05fXywgbUlkKTsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC01Niw4ICs1Niw5IEBACiAKIHN0YXR1c190IENhbWVyYTNGYWtlU3RyZWFtOjpyZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJiwKLSAgICAgICAgICAgIG5zZWNzX3QsCisgICAgICAgICAgICBuc2Vjc190LCBuc2Vjc190LAogICAgICAgICAgICAgYm9vbCwKKyAgICAgICAgICAgIGludDMyX3QsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiopIHsKQEAgLTc1LDcgKzc2LDcgQEAKICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlOjpkdW1wKGZkLCBhcmdzKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OnNldFRyYW5zZm9ybShpbnQpIHsKK3N0YXR1c190IENhbWVyYTNGYWtlU3RyZWFtOjpzZXRUcmFuc2Zvcm0oaW50LCBib29sKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICAvLyBEbyBub3RoaW5nCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRmFrZVN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRmFrZVN0cmVhbS5oCmluZGV4IDkxNGNjYmYuLjhjZWNhYmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0Zha2VTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNGYWtlU3RyZWFtLmgKQEAgLTUyLDcgKzUyLDcgQEAKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgICAgICAgICBzZXRUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSk7CisgICAgc3RhdHVzX3QgICAgICAgICBzZXRUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSwgYm9vbCBtYXlDaGFuZ2VNaXJyb3IpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXRhY2hCdWZmZXIoc3A8R3JhcGhpY0J1ZmZlcj4qIGJ1ZmZlciwgaW50KiBmZW5jZUZkKTsKIApAQCAtMTAwLDYgKzEwMCw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJhdGNoU2l6ZShzaXplX3QgYmF0Y2hTaXplKSBvdmVycmlkZTsKIAorICAgIHZpcnR1YWwgdm9pZCBvbk1pbkR1cmF0aW9uQ2hhbmdlZChuc2Vjc190IC8qZHVyYXRpb24qLykge30KICAgcHJvdGVjdGVkOgogCiAgICAgLyoqCkBAIC0xMDgsNyArMTA5LDkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGludDMyX3QgdHJhbnNmb3JtLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7CkBAIC0xMzQsNyArMTM3LDggQEAKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwgaW50MzJfdCB0cmFuc2Zvcm0sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCmluZGV4IDAyMDRkNDkuLmFkZDE0ODMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcApAQCAtMzQsMTAgKzM0LDEyIEBACiAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAogICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAotICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24pIDoKKyAgICAgICAgaW50IHNldElkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uLCBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUsIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwKKyAgICAgICAgYm9vbCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUsIGludCB0aW1lc3RhbXBCYXNlKSA6CiAgICAgICAgIENhbWVyYTNTdHJlYW0oaWQsIHR5cGUsCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgbWF4U2l6ZSwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24pLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24sCisgICAgICAgICAgICAgICAgZHluYW1pY1JhbmdlUHJvZmlsZSwgc3RyZWFtVXNlQ2FzZSwgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLCB0aW1lc3RhbXBCYXNlKSwKICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQoMCksCiAgICAgICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCgwKSwKICAgICAgICAgbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudCgwKSwKQEAgLTgyLDExICs4NCwxNSBAQAogICAgICAgICAgICAgY2FtZXJhX3N0cmVhbTo6d2lkdGgsIGNhbWVyYV9zdHJlYW06OmhlaWdodCwKICAgICAgICAgICAgIGNhbWVyYV9zdHJlYW06OmZvcm1hdCwgY2FtZXJhX3N0cmVhbTo6ZGF0YV9zcGFjZSk7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBNYXggc2l6ZTogJXp1XG4iLCBtTWF4U2l6ZSk7Ci0gICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBDb21iaW5lZCB1c2FnZTogJSIgUFJJdTY0ICIsIG1heCBIQUwgYnVmZmVyczogJWRcbiIsCisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBDb21iaW5lZCB1c2FnZTogMHglIiBQUkl4NjQgIiwgbWF4IEhBTCBidWZmZXJzOiAlZFxuIiwKICAgICAgICAgICAgIG1Vc2FnZSB8IGNvbnN1bWVyVXNhZ2UsIGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzKTsKICAgICBpZiAoc3RybGVuKGNhbWVyYV9zdHJlYW06OnBoeXNpY2FsX2NhbWVyYV9pZCkgPiAwKSB7CiAgICAgICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgUGh5c2ljYWwgY2FtZXJhIGlkOiAlc1xuIiwgY2FtZXJhX3N0cmVhbTo6cGh5c2ljYWxfY2FtZXJhX2lkKTsKICAgICB9CisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBEeW5hbWljIFJhbmdlIFByb2ZpbGU6IDB4JSIgUFJJeDY0ICJcbiIsCisgICAgICAgICAgICBjYW1lcmFfc3RyZWFtOjpkeW5hbWljX3JhbmdlX3Byb2ZpbGUpOworICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgU3RyZWFtIHVzZSBjYXNlOiAlIiBQUklkNjQgIlxuIiwgY2FtZXJhX3N0cmVhbTo6dXNlX2Nhc2UpOworICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgVGltZXN0YW1wIGJhc2U6ICVkXG4iLCBnZXRUaW1lc3RhbXBCYXNlKCkpOwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRnJhbWVzIHByb2R1Y2VkOiAlZCwgbGFzdCB0aW1lc3RhbXA6ICUiIFBSSWQ2NCAiIG5zXG4iLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1MYXN0VGltZXN0YW1wKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFRvdGFsIGJ1ZmZlcnM6ICV6dSwgY3VycmVudGx5IGRlcXVldWVkOiAlenVcbiIsCkBAIC0yMjQsNyArMjMwLDkgQEAKIHN0YXR1c190IENhbWVyYTNJT1N0cmVhbUJhc2U6OnJldHVybkFueUJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwKICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgIGludDMyX3QgdHJhbnNmb3JtLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgewogICAgIHN0YXR1c190IHJlczsKIApAQCAtMjQxLDcgKzI0OSw4IEBACiAgICAgfQogCiAgICAgc3A8RmVuY2U+IHJlbGVhc2VGZW5jZTsKLSAgICByZXMgPSByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCBvdXRwdXQsIHN1cmZhY2VfaWRzLAorICAgIHJlcyA9IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXAsIHJlYWRvdXRUaW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIHRyYW5zZm9ybSwgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVsZWFzZUZlbmNlKTsKICAgICAvLyBSZXMgbWF5IGJlIGFuIGVycm9yLCBidXQgd2Ugc3RpbGwgd2FudCB0byBkZWNyZW1lbnQgb3VyIG93bmVkIGNvdW50CiAgICAgLy8gdG8gZW5hYmxlIGNsZWFuIHNodXRkb3duLiBTbyB3ZSdsbCBqdXN0IHJldHVybiB0aGUgZXJyb3IgYnV0IG90aGVyd2lzZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAppbmRleCA5MGM4YTdiLi5mMzg5ZDUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaApAQCAtMzcsNyArMzcsMTEgQEAKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCi0gICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlKTsKKyAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELCBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2UsCisgICAgICAgICAgICBpbnQ2NF90IGR5bmFtaWNQcm9maWxlID0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCwKKyAgICAgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQsCisgICAgICAgICAgICBib29sIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSA9IGZhbHNlLAorICAgICAgICAgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9ERUZBVUxUKTsKIAogICBwdWJsaWM6CiAKQEAgLTY3LDEzICs3MSwxNyBAQAogICAgIHN0YXR1c190ICAgICAgICAgcmV0dXJuQW55QnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBpbnQzMl90IHRyYW5zZm9ybSwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgaW50MzJfdCB0cmFuc2Zvcm0sCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KSA9IDA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKaW5kZXggNmQ4MzE3Yi4uOWEzZjdlZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcApAQCAtMTA1LDEyICsxMDUsMTUgQEAKIHN0YXR1c190IENhbWVyYTNJbnB1dFN0cmVhbTo6cmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgaW50MzJfdCAvKnRyYW5zZm9ybSovLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCkgewogCiAgICAgKHZvaWQpdGltZXN0YW1wOworICAgICh2b2lkKXJlYWRvdXRUaW1lc3RhbXA7CiAgICAgKHZvaWQpb3V0cHV0OwogICAgIEFMT0dfQVNTRVJUKCFvdXRwdXQsICJFeHBlY3RlZCBvdXRwdXQgdG8gYmUgZmFsc2UiKTsKIApAQCAtMTc1LDcgKzE3OCw4IEBACiAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCi0gICAgcmV0dXJuIHJldHVybkFueUJ1ZmZlckxvY2tlZChidWZmZXIsIC8qdGltZXN0YW1wKi8wLCAvKm91dHB1dCovZmFsc2UpOworICAgIHJldHVybiByZXR1cm5BbnlCdWZmZXJMb2NrZWQoYnVmZmVyLCAvKnRpbWVzdGFtcCovMCwgLypyZWFkb3V0VGltZXN0YW1wKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXRwdXQqL2ZhbHNlLCAvKnRyYW5zZm9ybSovIC0xKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0lucHV0U3RyZWFtOjpnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyTG9ja2VkKApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKaW5kZXggNDYyMjFkMS4uNWUwNTg3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCkBAIC02MSw3ICs2MSw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBpbnQzMl90IHRyYW5zZm9ybSwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uY3BwCmluZGV4IGE3ZTY0Y2UuLjdjZmEyNTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5jcHAKQEAgLTQ3LDE0ICs0NywxMiBAQAogICAgICAgICBjb25zdCBjYW1lcmEzOjpTdHJlYW1TZXQmIG9mZmxpbmVTdHJlYW1TZXQsCiAgICAgICAgIGNhbWVyYTM6OkJ1ZmZlclJlY29yZHMmJiBidWZmZXJSZWNvcmRzLAogICAgICAgICBjb25zdCBjYW1lcmEzOjpJbkZsaWdodFJlcXVlc3RNYXAmIG9mZmxpbmVSZXFzLAotICAgICAgICBjb25zdCBDYW1lcmEzT2ZmbGluZVN0YXRlcyYgb2ZmbGluZVN0YXRlcywKLSAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+IG9mZmxpbmVTZXNzaW9uKSA6CisgICAgICAgIGNvbnN0IENhbWVyYTNPZmZsaW5lU3RhdGVzJiBvZmZsaW5lU3RhdGVzKSA6CiAgICAgICAgIG1JZChpZCksCiAgICAgICAgIG1JbnB1dFN0cmVhbShpbnB1dFN0cmVhbSksCiAgICAgICAgIG1PdXRwdXRTdHJlYW1zKG9mZmxpbmVTdHJlYW1TZXQpLAogICAgICAgICBtQnVmZmVyUmVjb3JkcyhzdGQ6Om1vdmUoYnVmZmVyUmVjb3JkcykpLAogICAgICAgICBtT2ZmbGluZVJlcXMob2ZmbGluZVJlcXMpLAotICAgICAgICBtU2Vzc2lvbihvZmZsaW5lU2Vzc2lvbiksCiAgICAgICAgIG1UYWdNb25pdG9yKG9mZmxpbmVTdGF0ZXMubVRhZ01vbml0b3IpLAogICAgICAgICBtVmVuZG9yVGFnSWQob2ZmbGluZVN0YXRlcy5tVmVuZG9yVGFnSWQpLAogICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcihvZmZsaW5lU3RhdGVzLm1Vc2VIYWxCdWZNYW5hZ2VyKSwKQEAgLTkwLDQzICs4OCw2IEBACiAgICAgcmV0dXJuIG1JZDsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjppbml0aWFsaXplKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcikgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0KLSAgICBpZiAobVNlc3Npb24gPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IEhJREwgc2Vzc2lvbiBpcyBudWxsISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKLQotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQotICAgICAgICAvLyBzZXR1cCByZXN1bHQgRk1RCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiYgcmVzUXVldWUgPSBtUmVzdWx0TWV0YWRhdGFRdWV1ZTsKLSAgICAgICAgYXV0byByZXN1bHRRdWV1ZVJldCA9IG1TZXNzaW9uLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKLSAgICAgICAgICAgIFsmcmVzUXVldWVdKGNvbnN0IGF1dG8mIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8UmVzdWx0TWV0YWRhdGFRdWV1ZT4oZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiSEFMIHJldHVybnMgZW1wdHkgcmVzdWx0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSBpdCIpOwotICAgICAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHVzZSByZXNRdWV1ZSBvbndhcmRzLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICBpZiAoIXJlc3VsdFF1ZXVlUmV0LmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yIHdoZW4gZ2V0dGluZyByZXN1bHQgbWV0YWRhdGEgcXVldWUgZnJvbSBjYW1lcmEgc2Vzc2lvbjogJXMiLAotICAgICAgICAgICAgICAgICAgICByZXN1bHRRdWV1ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgICAgICB9Ci0gICAgICAgIG1TdGF0dXMgPSBTVEFUVVNfQUNUSVZFOwotICAgIH0KLQotICAgIG1TZXNzaW9uLT5zZXRDYWxsYmFjayh0aGlzKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpkdW1wKGludCAvKmZkKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBpbChtSW50ZXJmYWNlTG9jayk7CkBAIC0xMzUsNiArOTYsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmEzT2ZmbGluZVNlc3Npb246OmRpc2Nvbm5lY3QoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBkaXNjb25uZWN0U2Vzc2lvbigpOwogICAgIHJldHVybiBkaXNjb25uZWN0SW1wbCgpOwogfQogCkBAIC0xNzAsMTAgKzEzMiw2IEBACiAgICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKG1JbnB1dFN0cmVhbSk7CiAgICAgfQogCi0gICAgaWYgKG1TZXNzaW9uICE9IG51bGxwdHIpIHsKLSAgICAgICAgbVNlc3Npb24tPmNsb3NlKCk7Ci0gICAgfQotCiAgICAgRmx1c2hJbmZsaWdodFJlcVN0YXRlcyBzdGF0ZXMgewogICAgICAgICBtSWQsIG1PZmZsaW5lUmVxc0xvY2ssIG1PZmZsaW5lUmVxcywgbVVzZUhhbEJ1Zk1hbmFnZXIsCiAgICAgICAgIGxpc3RlbmVyLCAqdGhpcywgbUJ1ZmZlclJlY29yZHMsICp0aGlzLCBtU2Vzc2lvblN0YXRzQnVpbGRlcn07CkBAIC0xODIsNyArMTQwLDYgQEAKIAogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwotICAgICAgICBtU2Vzc2lvbi5jbGVhcigpOwogICAgICAgICBtT3V0cHV0U3RyZWFtcy5jbGVhcigpOwogICAgICAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKICAgICAgICAgbVN0YXR1cyA9IFNUQVRVU19DTE9TRUQ7CkBAIC0yMzUsMTQ5ICsxOTIsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzT2ZmbGluZVNlc3Npb246OnByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIHsKLSAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwotICAgIH0KLQotICAgIENhcHR1cmVPdXRwdXRTdGF0ZXMgc3RhdGVzIHsKLSAgICAgICAgbUlkLAotICAgICAgICBtT2ZmbGluZVJlcXNMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKLSAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKLSAgICAgICAgbU9mZmxpbmVSZXFzLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAotICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCi0gICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKLSAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCi0gICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKLSAgICAgICAgbVJlc3VsdE1ldGFkYXRhUXVldWUsIG1EaXN0b3J0aW9uTWFwcGVycywgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycywKLSAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAotICAgICAgICBtQnVmZmVyUmVjb3JkcwotICAgIH07Ci0KLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHJlc3VsdCA6IHJlc3VsdHMpIHsKLSAgICAgICAgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoc3RhdGVzLCByZXN1bHQudjNfMiwgcmVzdWx0LnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOwotICAgIH0KLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQotaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzT2ZmbGluZVNlc3Npb246OnByb2Nlc3NDYXB0dXJlUmVzdWx0KAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgewotICAgIC8vIFRPRE86IGNoYW5nZWQgaW1wbCB0byBjYWxsIGludG8gcHJvY2Vzc0NhcHR1cmVSZXN1bHRfM180IGluc3RlYWQ/Ci0gICAgLy8gICAgICAgbWlnaHQgbmVlZCB0byBmaWd1cmUgaG93IHRvIHJlZHVjZSBjb3B5IHRob3VnaC4KLSAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwotICAgIH0KLQotICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+IG5vUGh5c01ldGFkYXRhOwotCi0gICAgQ2FwdHVyZU91dHB1dFN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsCi0gICAgICAgIG1PZmZsaW5lUmVxc0xvY2ssIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAotICAgICAgICBtTGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyLCBtTGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyLAotICAgICAgICBtT2ZmbGluZVJlcXMsIG1PdXRwdXRMb2NrLCBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCi0gICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAotICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKLSAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAotICAgICAgICBtUmVzdWx0TWV0YWRhdGFRdWV1ZSwgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAotICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsCi0gICAgICAgIG1CdWZmZXJSZWNvcmRzCi0gICAgfTsKLQotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2spOwotICAgIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0cykgewotICAgICAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZChzdGF0ZXMsIHJlc3VsdCwgbm9QaHlzTWV0YWRhdGEpOwotICAgIH0KLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQotaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzT2ZmbGluZVNlc3Npb246Om5vdGlmeSgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnPiYgbXNncykgewotICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1TdGF0dXMgIT0gU1RBVFVTX0FDVElWRSkgewotICAgICAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBpbiB3cm9uZyBzdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgbVN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLSAgICAgICAgfQotICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7Ci0gICAgfQotCi0gICAgQ2FwdHVyZU91dHB1dFN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsCi0gICAgICAgIG1PZmZsaW5lUmVxc0xvY2ssIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAotICAgICAgICBtTGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyLCBtTGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyLAotICAgICAgICBtT2ZmbGluZVJlcXMsIG1PdXRwdXRMb2NrLCBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCi0gICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAotICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKLSAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAotICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKLSAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAotICAgICAgICBtUmVzdWx0TWV0YWRhdGFRdWV1ZSwgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAotICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsCi0gICAgICAgIG1CdWZmZXJSZWNvcmRzCi0gICAgfTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIG1zZyA6IG1zZ3MpIHsKLSAgICAgICAgY2FtZXJhMzo6bm90aWZ5KHN0YXRlcywgbXNnKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCi0gICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSB7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBSZXF1ZXN0QnVmZmVyU3RhdGVzIHN0YXRlcyB7Ci0gICAgICAgIG1JZCwgbVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLAotICAgICAgICAqdGhpcywgbUJ1ZmZlclJlY29yZHMsICp0aGlzfTsKLSAgICBjYW1lcmEzOjpyZXF1ZXN0U3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZlJlcXMsIF9oaWRsX2NiKTsKLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQotaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzT2ZmbGluZVNlc3Npb246OnJldHVyblN0cmVhbUJ1ZmZlcnMoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1TdGF0dXMgIT0gU1RBVFVTX0FDVElWRSkgewotICAgICAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBpbiB3cm9uZyBzdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgbVN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFJldHVybkJ1ZmZlclN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIG1CdWZmZXJSZWNvcmRzfTsKLSAgICBjYW1lcmEzOjpyZXR1cm5TdHJlYW1CdWZmZXJzKHN0YXRlcywgYnVmZmVycyk7Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KIHZvaWQgQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpzZXRFcnJvclN0YXRlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uaAppbmRleCA1NTgxOTY0Li5hNzk5NzE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmgKQEAgLTEzMSw3ICsxMzEsNiBAQAogICovCiBjbGFzcyBDYW1lcmEzT2ZmbGluZVNlc3Npb24gOgogICAgICAgICAgICAgcHVibGljIENhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZSwKLSAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrLAogICAgICAgICAgICAgcHVibGljIGNhbWVyYTM6OlNldEVycm9ySW50ZXJmYWNlLAogICAgICAgICAgICAgcHVibGljIGNhbWVyYTM6OkluZmxpZ2h0UmVxdWVzdFVwZGF0ZUludGVyZmFjZSwKICAgICAgICAgICAgIHB1YmxpYyBjYW1lcmEzOjpSZXF1ZXN0QnVmZmVySW50ZXJmYWNlLApAQCAtMTQ0LDEyICsxNDMsMTEgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTM6OlN0cmVhbVNldCYgb2ZmbGluZVN0cmVhbVNldCwKICAgICAgICAgICAgIGNhbWVyYTM6OkJ1ZmZlclJlY29yZHMmJiBidWZmZXJSZWNvcmRzLAogICAgICAgICAgICAgY29uc3QgY2FtZXJhMzo6SW5GbGlnaHRSZXF1ZXN0TWFwJiBvZmZsaW5lUmVxcywKLSAgICAgICAgICAgIGNvbnN0IENhbWVyYTNPZmZsaW5lU3RhdGVzJiBvZmZsaW5lU3RhdGVzLAotICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+IG9mZmxpbmVTZXNzaW9uKTsKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYTNPZmZsaW5lU3RhdGVzJiBvZmZsaW5lU3RhdGVzKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTNPZmZsaW5lU2Vzc2lvbigpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiAvKmxpc3RlbmVyKi8pID0gMDsKIAogICAgIC8qKgogICAgICAqIENhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZSBpbnRlcmZhY2UKQEAgLTE3MSwzOCArMTY5LDcgQEAKICAgICAgKiBFbmQgb2YgQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlIGludGVyZmFjZQogICAgICAqLwogCi0gICAgLyoqCi0gICAgICogSElETCBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgaW50ZXJmYWNlCi0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjawotICAgICAqLwotCi0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcHJvY2Vzc0NhcHR1cmVSZXN1bHQoCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gbm90aWZ5KAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZz4mIG1zZ3MpIG92ZXJyaWRlOwotCi0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXF1ZXN0U3RyZWFtQnVmZmVycygKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKLSAgICAgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKLQotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0dXJuU3RyZWFtQnVmZmVycygKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSBvdmVycmlkZTsKLQotICAgIC8qKgotICAgICAqIEVuZCBvZiBDYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UgaW50ZXJmYWNlCi0gICAgICovCi0KLSAgcHJpdmF0ZToKKyAgcHJvdGVjdGVkOgogICAgIC8vIENhbWVyYSBkZXZpY2UgSUQKICAgICBjb25zdCBTdHJpbmc4IG1JZDsKICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiBtSW5wdXRTdHJlYW07CkBAIC0yMTMsOCArMTgwLDYgQEAKICAgICBzdGQ6Om11dGV4IG1PZmZsaW5lUmVxc0xvY2s7CiAgICAgY2FtZXJhMzo6SW5GbGlnaHRSZXF1ZXN0TWFwIG1PZmZsaW5lUmVxczsKIAotICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPiBtU2Vzc2lvbjsKLQogICAgIFRhZ01vbml0b3IgbVRhZ01vbml0b3I7CiAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgbVZlbmRvclRhZ0lkOwogCkBAIC0yNjksOCArMjM0LDYgQEAKICAgICAvLyBFbmQgb2YgbUxvY2sgcHJvdGVjdCBzY29wZQogCiAgICAgc3RkOjptdXRleCBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrOwotICAgIC8vIEZNUSB0byB3cml0ZSByZXN1bHQgb24uIE11c3QgYmUgZ3VhcmRlZCBieSBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLgotICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtUmVzdWx0TWV0YWRhdGFRdWV1ZTsKIAogICAgIC8vIFRyYWNraW5nIGNhdXNlIG9mIGZhdGFsIGVycm9ycyB3aGVuIGluIFNUQVRVU19FUlJPUgogICAgIFN0cmluZzggbUVycm9yQ2F1c2U7CkBAIC0yODMsNiArMjQ2LDkgQEAKICAgICAvLyBGb3IgY2xpZW50IG1ldGhvZHMgc3VjaCBhcyBkaXNjb25uZWN0L2R1bXAKICAgICBzdGQ6Om11dGV4IG1JbnRlcmZhY2VMb2NrOwogCisgICAgLy8gVGhlIGN1cnJlbnQgbWluaW11bSBleHBlY3RlZCBmcmFtZSBkdXJhdGlvbiBiYXNlZCBvbiBBRV9UQVJHRVRfRlBTX1JBTkdFCisgICAgbnNlY3NfdCBtTWluRXhwZWN0ZWREdXJhdGlvbiA9IDA7CisKICAgICAvLyBTZXRFcnJvckludGVyZmFjZQogICAgIHZvaWQgc2V0RXJyb3JTdGF0ZShjb25zdCBjaGFyICpmbXQsIC4uLikgb3ZlcnJpZGU7CiAgICAgdm9pZCBzZXRFcnJvclN0YXRlTG9ja2VkKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBvdmVycmlkZTsKQEAgLTMwNSw2ICsyNzEsOCBAQAogICAgIHZvaWQgc2V0RXJyb3JTdGF0ZUxvY2tlZFYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpOwogCiAgICAgc3RhdHVzX3QgZGlzY29ubmVjdEltcGwoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdFNlc3Npb24oKSA9IDA7CisKIH07IC8vIGNsYXNzIENhbWVyYTNPZmZsaW5lU2Vzc2lvbgogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0SW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRJbnRlcmZhY2UuaAppbmRleCA4ODE3ODMzLi40MGVlZjFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRJbnRlcmZhY2UuaApAQCAtNTAsNiArNTAsMTAgQEAKICAgICAgICAgLy8gcmV0dXJuIHBhaXIgb2YgKG5ld2x5U2VlbkJ1ZmZlcj8sIGJ1ZmZlcklkKQogICAgICAgICB2aXJ0dWFsIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gZ2V0QnVmZmVySWQoY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYsIGludCBzdHJlYW1JZCkgPSAwOwogCisgICAgICAgIC8vIFJldHVybiB0aGUgcmVtb3ZlZCBidWZmZXIgSUQgaWYgaW5wdXQgY2FjaGUgaXMgZm91bmQuCisgICAgICAgIC8vIE90aGVyd2lzZSByZXR1cm4gQlVGRkVSX0lEX05PX0JVRkZFUgorICAgICAgICB2aXJ0dWFsIHVpbnQ2NF90IHJlbW92ZU9uZUJ1ZmZlckNhY2hlKGludCBzdHJlYW1JZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpID0gMDsKKwogICAgICAgICAvLyBGaW5kIGEgYnVmZmVyX2hhbmRsZV90IGJhc2VkIG9uIGZyYW1lIG51bWJlciBhbmQgc3RyZWFtIElECiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcG9wSW5mbGlnaHRCdWZmZXIoaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCBzdHJlYW1JZCwKICAgICAgICAgICAgICAgICAvKm91dCovIGJ1ZmZlcl9oYW5kbGVfdCAqKmJ1ZmZlcikgPSAwOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKaW5kZXggMDNiNzdmYy4uMWUyMGVlMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCkBAIC0xOCwxNCArMTgsMjAgQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGN0aW1lPgogI2luY2x1ZGUgPGZzdHJlYW0+CiAKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9DYW1lcmFCbG9iLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvQ2FtZXJhQmxvYklkLmg+CisKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIAorI2luY2x1ZGUgPGNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmg+CiAjaW5jbHVkZSAiYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaCIKICNpbmNsdWRlICJDYW1lcmEzT3V0cHV0U3RyZWFtLmgiCiAjaW5jbHVkZSAidXRpbHMvVHJhY2VIRlIuaCIKQEAgLTM5LDE2ICs0NSwyMyBAQAogCiBuYW1lc3BhY2UgY2FtZXJhMyB7CiAKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhQmxvYjsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhQmxvYklkOworCiBDYW1lcmEzT3V0cHV0U3RyZWFtOjpDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwKICAgICAgICAgc3A8U3VyZmFjZT4gY29uc3VtZXIsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKLSAgICAgICAgaW50IHNldElkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uKSA6CisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQsCisgICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiwgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UsIGJvb2wgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLCBpbnQgdGltZXN0YW1wQmFzZSwKKyAgICAgICAgaW50IG1pcnJvck1vZGUpIDoKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHNldElkLCBpc011bHRpUmVzb2x1dGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHNldElkLCBpc011bHRpUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmFuZ2VQcm9maWxlLCBzdHJlYW1Vc2VDYXNlLCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wQmFzZSksCiAgICAgICAgIG1Db25zdW1lcihjb25zdW1lciksCiAgICAgICAgIG1UcmFuc2Zvcm0oMCksCiAgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyKHRydWUpLApAQCAtNTYsNyArNjksOSBAQAogICAgICAgICBtVGltZXN0YW1wT2Zmc2V0KHRpbWVzdGFtcE9mZnNldCksCiAgICAgICAgIG1Db25zdW1lclVzYWdlKDApLAogICAgICAgICBtRHJvcEJ1ZmZlcnMoZmFsc2UpLAotICAgICAgICBtRGVxdWV1ZUJ1ZmZlckxhdGVuY3koa0RlcXVldWVMYXRlbmN5QmluU2l6ZSkgeworICAgICAgICBtTWlycm9yTW9kZShtaXJyb3JNb2RlKSwKKyAgICAgICAgbURlcXVldWVCdWZmZXJMYXRlbmN5KGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUpLAorICAgICAgICBtSVBDVHJhbnNwb3J0KHRyYW5zcG9ydCkgewogCiAgICAgaWYgKG1Db25zdW1lciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ29uc3VtZXIgaXMgTlVMTCEiLCBfX0ZVTkNUSU9OX18pOwpAQCAtNzIsMjAgKzg3LDI0IEBACiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0LAogICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCi0gICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbikgOgorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLCBJUENUcmFuc3BvcnQgdHJhbnNwb3J0LAorICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24sIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSwKKyAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlLCBib29sIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwgaW50IHRpbWVzdGFtcEJhc2UsCisgICAgICAgIGludCBtaXJyb3JNb2RlKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQV9TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LCBtYXhTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SWQsIGlzTXVsdGlSZXNvbHV0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24sIGR5bmFtaWNSYW5nZVByb2ZpbGUsIHN0cmVhbVVzZUNhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLCB0aW1lc3RhbXBCYXNlKSwKICAgICAgICAgbUNvbnN1bWVyKGNvbnN1bWVyKSwKICAgICAgICAgbVRyYW5zZm9ybSgwKSwKICAgICAgICAgbVRyYWNlRmlyc3RCdWZmZXIodHJ1ZSksCi0gICAgICAgIG1Vc2VNb25vVGltZXN0YW1wKGZhbHNlKSwKICAgICAgICAgbVVzZUJ1ZmZlck1hbmFnZXIoZmFsc2UpLAogICAgICAgICBtVGltZXN0YW1wT2Zmc2V0KHRpbWVzdGFtcE9mZnNldCksCiAgICAgICAgIG1Db25zdW1lclVzYWdlKDApLAogICAgICAgICBtRHJvcEJ1ZmZlcnMoZmFsc2UpLAotICAgICAgICBtRGVxdWV1ZUJ1ZmZlckxhdGVuY3koa0RlcXVldWVMYXRlbmN5QmluU2l6ZSkgeworICAgICAgICBtTWlycm9yTW9kZShtaXJyb3JNb2RlKSwKKyAgICAgICAgbURlcXVldWVCdWZmZXJMYXRlbmN5KGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUpLAorICAgICAgICBtSVBDVHJhbnNwb3J0KHRyYW5zcG9ydCkgewogCiAgICAgaWYgKGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX0JMT0IgJiYgZm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfUkFXX09QQVFVRSkgewogICAgICAgICBBTE9HRSgiJXM6IEJhZCBmb3JtYXQgZm9yIHNpemUtb25seSBzdHJlYW06ICVkIiwgX19GVU5DVElPTl9fLApAQCAtMTA3LDExICsxMjYsMTUgQEAKICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAogICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAotICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24pIDoKKyAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCwKKyAgICAgICAgaW50IHNldElkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uLCBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUsCisgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwgYm9vbCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUsIGludCB0aW1lc3RhbXBCYXNlLAorICAgICAgICBpbnQgbWlycm9yTW9kZSkgOgogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCBDQU1FUkFfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc2V0SWQsIGlzTXVsdGlSZXNvbHV0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc2V0SWQsIGlzTXVsdGlSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNSYW5nZVByb2ZpbGUsIHN0cmVhbVVzZUNhc2UsIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBCYXNlKSwKICAgICAgICAgbUNvbnN1bWVyKG51bGxwdHIpLAogICAgICAgICBtVHJhbnNmb3JtKDApLAogICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlcih0cnVlKSwKQEAgLTExOSw3ICsxNDIsOSBAQAogICAgICAgICBtVGltZXN0YW1wT2Zmc2V0KHRpbWVzdGFtcE9mZnNldCksCiAgICAgICAgIG1Db25zdW1lclVzYWdlKGNvbnN1bWVyVXNhZ2UpLAogICAgICAgICBtRHJvcEJ1ZmZlcnMoZmFsc2UpLAotICAgICAgICBtRGVxdWV1ZUJ1ZmZlckxhdGVuY3koa0RlcXVldWVMYXRlbmN5QmluU2l6ZSkgeworICAgICAgICBtTWlycm9yTW9kZShtaXJyb3JNb2RlKSwKKyAgICAgICAgbURlcXVldWVCdWZmZXJMYXRlbmN5KGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUpLAorICAgICAgICBtSVBDVHJhbnNwb3J0KHRyYW5zcG9ydCkgewogICAgIC8vIERlZmVycmVkIGNvbnN1bWVyIG9ubHkgc3VwcG9ydCBwcmV2aWV3IHN1cmZhY2UgZm9ybWF0IG5vdy4KICAgICBpZiAoZm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCkgewogICAgICAgICBBTE9HRSgiJXM6IERlZmVycmVkIGNvbnN1bWVyIG9ubHkgc3VwcG9ydHMgSU1QTEVNRU5UQVRJT05fREVGSU5FRCBmb3JtYXQgbm93ISIsCkBAIC0xNDYsMjEgKzE3MSwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUcmFuc3BvcnQgdHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNldElkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlLCBpbnQ2NF90IHN0cmVhbVVzZUNhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLCBpbnQgdGltZXN0YW1wQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pcnJvck1vZGUpIDoKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgdHlwZSwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY1JhbmdlUHJvZmlsZSwgc3RyZWFtVXNlQ2FzZSwgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcEJhc2UpLAogICAgICAgICBtVHJhbnNmb3JtKDApLAogICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlcih0cnVlKSwKLSAgICAgICAgbVVzZU1vbm9UaW1lc3RhbXAoZmFsc2UpLAogICAgICAgICBtVXNlQnVmZmVyTWFuYWdlcihmYWxzZSksCiAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQodGltZXN0YW1wT2Zmc2V0KSwKICAgICAgICAgbUNvbnN1bWVyVXNhZ2UoY29uc3VtZXJVc2FnZSksCiAgICAgICAgIG1Ecm9wQnVmZmVycyhmYWxzZSksCi0gICAgICAgIG1EZXF1ZXVlQnVmZmVyTGF0ZW5jeShrRGVxdWV1ZUxhdGVuY3lCaW5TaXplKSB7CisgICAgICAgIG1NaXJyb3JNb2RlKG1pcnJvck1vZGUpLAorICAgICAgICBtRGVxdWV1ZUJ1ZmZlckxhdGVuY3koa0RlcXVldWVMYXRlbmN5QmluU2l6ZSksCisgICAgICAgIG1JUENUcmFuc3BvcnQodHJhbnNwb3J0KSB7CiAKICAgICBib29sIG5lZWRzUmVsZWFzZU5vdGlmeSA9IHNldElkID4gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQ7CiAgICAgbUJ1ZmZlclByb2R1Y2VyTGlzdGVuZXIgPSBuZXcgQnVmZmVyUHJvZHVjZXJMaXN0ZW5lcih0aGlzLCBuZWVkc1JlbGVhc2VOb3RpZnkpOwpAQCAtMjYzLDE0ICsyOTUsMTYgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIG5zZWNzX3QgcmVhZG91dFRpbWVzdGFtcCwKKyAgICAgICAgaW50MzJfdCB0cmFuc2Zvcm0sIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKSB7CiAgICAgQVRSQUNFX0hGUl9DQUxMKCk7CiAKICAgICBpZiAobUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID09IDEpIHsKICAgICAgICAgcmV0dXJuUHJlZmV0Y2hlZEJ1ZmZlcnNMb2NrZWQoKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5BbnlCdWZmZXJMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXAsIC8qb3V0cHV0Ki90cnVlLCBzdXJmYWNlX2lkcyk7CisgICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCByZWFkb3V0VGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dHB1dCovdHJ1ZSwgdHJhbnNmb3JtLCBzdXJmYWNlX2lkcyk7CiAKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CkBAIC0yODIsMTAgKzMxNiw4MSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Zml4VXBIaWRsSnBlZ0Jsb2JIZWFkZXIoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW53QnVmZmVyLCBpbnQgZmVuY2UpIHsKKyAgICAvLyBMb2NrIHRoZSBKUEVHIGJ1ZmZlciBmb3IgQ1BVIHJlYWQKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gR3JhcGhpY0J1ZmZlcjo6ZnJvbShhbndCdWZmZXIpOworICAgIHZvaWQqIG1hcHBlZCA9IG51bGxwdHI7CisgICAgYmFzZTo6dW5pcXVlX2ZkIGZlbmNlRmQoZHVwKGZlbmNlKSk7CisgICAgLy8gVXNlIFVTQUdFX1NXX1dSSVRFX1JBUkVMWSBzaW5jZSB3ZSdyZSBnb2luZyB0byByZS13cml0ZSB0aGUgQ2FtZXJhQmxvYgorICAgIC8vIGhlYWRlci4KKyAgICBHcmFwaGljQnVmZmVyTG9ja2VyIGdiTG9ja2VyKGdyYXBoaWNCdWZmZXIpOworICAgIHN0YXR1c190IHJlcyA9CisgICAgICAgICAgICBnYkxvY2tlci5sb2NrQXN5bmMoCisgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OlVTQUdFX1NXX1JFQURfT0ZURU4gfCBHcmFwaGljQnVmZmVyOjpVU0FHRV9TV19XUklURV9SQVJFTFksCisgICAgICAgICAgICAgICAgICAgICZtYXBwZWQsIGZlbmNlRmQuZ2V0KCkpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gbG9jayB0aGUgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICB1aW50OF90ICpoaWRsSGVhZGVyU3RhcnQgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdCo+KG1hcHBlZCkgKyBncmFwaGljQnVmZmVyLT5nZXRXaWR0aCgpIC0gc2l6ZW9mKGNhbWVyYV9qcGVnX2Jsb2JfdCk7CisgICAgLy8gQ2hlY2sgdGhhdCB0aGUganBlZyBidWZmZXIgaXMgYmlnIGVub3VnaCB0byBjb250YWluIEhJREwgY2FtZXJhIGJsb2IKKyAgICBpZiAoaGlkbEhlYWRlclN0YXJ0IDwgc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtYXBwZWQpKSB7CisgICAgICAgIEFMT0dFKCIlcywganBlZyBidWZmZXIgbm90IGxhcmdlIGVub3VnaCB0byBmaXQgSElETCBjYW1lcmEgYmxvYiAlIiBQUkl1MzIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBncmFwaGljQnVmZmVyLT5nZXRXaWR0aCgpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY2FtZXJhX2pwZWdfYmxvYl90ICpoaWRsQmxvYkhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhX2pwZWdfYmxvYl90ICo+KGhpZGxIZWFkZXJTdGFydCk7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBibG9iIGlzIGluZGVlZCB0aGUganBlZyBibG9iIGlkLgorICAgIGlmIChoaWRsQmxvYkhlYWRlci0+anBlZ19ibG9iX2lkICE9IENBTUVSQV9KUEVHX0JMT0JfSUQpIHsKKyAgICAgICAgQUxPR0UoIiVzLCBqcGVnIGJsb2IgaWQgJWQgaXMgbm90IGNvcnJlY3QiLCBfX0ZVTkNUSU9OX18sIGhpZGxCbG9iSGVhZGVyLT5qcGVnX2Jsb2JfaWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFJldHJpZXZlIGlkIGFuZCBibG9iIHNpemUKKyAgICBDYW1lcmFCbG9iSWQgYmxvYklkID0gc3RhdGljX2Nhc3Q8Q2FtZXJhQmxvYklkPihoaWRsQmxvYkhlYWRlci0+anBlZ19ibG9iX2lkKTsKKyAgICB1aW50MzJfdCBibG9iU2l6ZUJ5dGVzID0gaGlkbEJsb2JIZWFkZXItPmpwZWdfc2l6ZTsKKworICAgIGlmIChibG9iU2l6ZUJ5dGVzID4gKGdyYXBoaWNCdWZmZXItPmdldFdpZHRoKCkgLSBzaXplb2YoY2FtZXJhX2pwZWdfYmxvYl90KSkpIHsKKyAgICAgICAgQUxPR0UoIiVzLCBibG9iU2l6ZSBpbiBISURMIGpwZWcgYmxvYiA6ICVkIGlzIGNvcnJ1cHQsIGJ1ZmZlciBzaXplICUiIFBSSXUzMiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgYmxvYlNpemVCeXRlcywgZ3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKSk7CisgICAgfQorCisgICAgdWludDhfdCAqYWlkbEhlYWRlclN0YXJ0ID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihtYXBwZWQpICsgZ3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKSAtIHNpemVvZihDYW1lcmFCbG9iKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIGpwZWcgYnVmZmVyIGlzIGJpZyBlbm91Z2ggdG8gY29udGFpbiBBSURMIGNhbWVyYSBibG9iCisgICAgaWYgKGFpZGxIZWFkZXJTdGFydCA8IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obWFwcGVkKSkgeworICAgICAgICBBTE9HRSgiJXMsIGpwZWcgYnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggdG8gZml0IEFJREwgY2FtZXJhIGJsb2IgJSIgUFJJdTMyLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgZ3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihtYXBwZWQpICsgYmxvYlNpemVCeXRlcyA+IGFpZGxIZWFkZXJTdGFydCkgeworICAgICAgICBBTE9HRSgiJXMsIGpwZWcgYmxvYiB3aXRoIHNpemUgJWQgLCBidWZmZXIgc2l6ZSAlIiBQUkl1MzIgIiBub3QgbGFyZ2UgZW5vdWdoIHRvIGZpdCIKKyAgICAgICAgICAgICAgICAiIEFJREwgY2FtZXJhIGJsb2Igd2l0aG91dCBjb3JydXB0aW5nIGpwZWciLCBfX0ZVTkNUSU9OX18sIGJsb2JTaXplQnl0ZXMsCisgICAgICAgICAgICAgICAgZ3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gRmlsbCBpbiBKUEVHIGhlYWRlcgorICAgIENhbWVyYUJsb2IgYWlkbEhlYWRlciA9IHsKKyAgICAgICAgICAgIC5ibG9iSWQgPSBibG9iSWQsCisgICAgICAgICAgICAuYmxvYlNpemVCeXRlcyA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGJsb2JTaXplQnl0ZXMpCisgICAgfTsKKyAgICBtZW1jcHkoYWlkbEhlYWRlclN0YXJ0LCAmYWlkbEhlYWRlciwgc2l6ZW9mKENhbWVyYUJsb2IpKTsKKyAgICBncmFwaGljQnVmZmVyLT51bmxvY2soKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGludDMyX3QgdHJhbnNmb3JtLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCkgewpAQCAtMzQ1LDI4ICs0NTAsNDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyID0gZmFsc2U7CiAgICAgICAgIH0KLQotICAgICAgICAvKiBDZXJ0YWluIGNvbnN1bWVycyAoc3VjaCBhcyBBdWRpb1NvdXJjZSBvciBIYXJkd2FyZUNvbXBvc2VyKSB1c2UKLSAgICAgICAgICogTU9OT1RPTklDIHRpbWUsIGNhdXNpbmcgdGltZSBtaXNhbGlnbm1lbnQgaWYgY2FtZXJhIHRpbWVzdGFtcCBpcwotICAgICAgICAgKiBpbiBCT09UVElNRS4gRG8gdGhlIGNvbnZlcnNpb24gaWYgbmVjZXNzYXJ5LiAqLwotICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChtQ29uc3VtZXIuZ2V0KCksCi0gICAgICAgICAgICAgICAgbVVzZU1vbm9UaW1lc3RhbXAgPyB0aW1lc3RhbXAgLSBtVGltZXN0YW1wT2Zmc2V0IDogdGltZXN0YW1wKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEVycm9yIHNldHRpbmcgdGltZXN0YW1wOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgdGhpcyBpcyBhIEpQRUcgb3V0cHV0LCBhbmQgaW1hZ2UgZHVtcCBtYXNrIGlzIHNldCwgc2F2ZSBpbWFnZSB0bwotICAgICAgICAvLyBkaXNrLgotICAgICAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CICYmIGdldERhdGFTcGFjZSgpID09IEhBTF9EQVRBU1BBQ0VfVjBfSkZJRiAmJgotICAgICAgICAgICAgICAgIG1JbWFnZUR1bXBNYXNrKSB7Ci0gICAgICAgICAgICBkdW1wSW1hZ2VUb0Rpc2sodGltZXN0YW1wLCBhbndCdWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgIC8vIEZpeCBDYW1lcmFCbG9iIGlkIHR5cGUgZGlzY3JlcGFuY3kgYmV0d2VlbiBISURMIGFuZCBBSURMLCBkZXRhaWxzIDogaHR0cDovL2IvMjI5Njg4ODEwCisgICAgICAgIGlmIChnZXRGb3JtYXQoKSA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IgJiYgZ2V0RGF0YVNwYWNlKCkgPT0gSEFMX0RBVEFTUEFDRV9WMF9KRklGKSB7CisgICAgICAgICAgICBpZiAobUlQQ1RyYW5zcG9ydCA9PSBJUENUcmFuc3BvcnQ6OkhJREwpIHsKKyAgICAgICAgICAgICAgICBmaXhVcEhpZGxKcGVnQmxvYkhlYWRlcihhbndCdWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgSlBFRyBvdXRwdXQsIGFuZCBpbWFnZSBkdW1wIG1hc2sgaXMgc2V0LCBzYXZlIGltYWdlIHRvCisgICAgICAgICAgICAvLyBkaXNrLgorICAgICAgICAgICAgaWYgKG1JbWFnZUR1bXBNYXNrKSB7CisgICAgICAgICAgICAgICAgZHVtcEltYWdlVG9EaXNrKHRpbWVzdGFtcCwgYW53QnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmVzID0gcXVldWVCdWZmZXJUb0NvbnN1bWVyKGN1cnJlbnRDb25zdW1lciwgYW53QnVmZmVyLCBhbndSZWxlYXNlRmVuY2UsIHN1cmZhY2VfaWRzKTsKLSAgICAgICAgaWYgKHNob3VsZExvZ0Vycm9yKHJlcywgc3RhdGUpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRXJyb3IgcXVldWVpbmcgYnVmZmVyIHRvIG5hdGl2ZSB3aW5kb3c6IgotICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBpZiAobVByZXZpZXdGcmFtZVNwYWNlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXMgPSBtUHJldmlld0ZyYW1lU3BhY2VyLT5xdWV1ZVByZXZpZXdCdWZmZXIodGltZXN0YW1wIC0gbVRpbWVzdGFtcE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgcmVhZG91dFRpbWVzdGFtcCAtIG1UaW1lc3RhbXBPZmZzZXQsIHRyYW5zZm9ybSwgYW53QnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBxdWV1aW5nIGJ1ZmZlciB0byBwcmV2aWV3IGJ1ZmZlciBzcGFjZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuc2Vjc190IGNhcHR1cmVUaW1lID0gKG1TeW5jVG9EaXNwbGF5ID8gcmVhZG91dFRpbWVzdGFtcCA6IHRpbWVzdGFtcCkKKyAgICAgICAgICAgICAgICAgICAgLSBtVGltZXN0YW1wT2Zmc2V0OworICAgICAgICAgICAgbnNlY3NfdCBwcmVzZW50VGltZSA9IG1TeW5jVG9EaXNwbGF5ID8KKyAgICAgICAgICAgICAgICAgICAgc3luY1RpbWVzdGFtcFRvRGlzcGxheUxvY2tlZChjYXB0dXJlVGltZSkgOiBjYXB0dXJlVGltZTsKKworICAgICAgICAgICAgc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSwgdHJ1ZS8qbWF5Q2hhbmdlTWlycm9yKi8pOworICAgICAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAobUNvbnN1bWVyLmdldCgpLCBwcmVzZW50VGltZSk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEVycm9yIHNldHRpbmcgdGltZXN0YW1wOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcXVldWVIRFJNZXRhZGF0YShhbndCdWZmZXItPmhhbmRsZSwgY3VycmVudENvbnN1bWVyLCBkeW5hbWljX3JhbmdlX3Byb2ZpbGUpOworCisgICAgICAgICAgICByZXMgPSBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoY3VycmVudENvbnN1bWVyLCBhbndCdWZmZXIsIGFud1JlbGVhc2VGZW5jZSwgc3VyZmFjZV9pZHMpOworICAgICAgICAgICAgaWYgKHNob3VsZExvZ0Vycm9yKHJlcywgc3RhdGUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEVycm9yIHF1ZXVlaW5nIGJ1ZmZlciB0byBuYXRpdmUgd2luZG93OiIKKyAgICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgbUxvY2subG9jaygpOwpAQCAtMzk5LDE0ICs1MjMsMjMgQEAKICAgICAgICAgIiAgICAgIERlcXVldWVCdWZmZXIgbGF0ZW5jeSBoaXN0b2dyYW06Iik7CiB9CiAKLXN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnNldFRyYW5zZm9ybShpbnQgdHJhbnNmb3JtKSB7CitzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpzZXRUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSwgYm9vbCBtYXlDaGFuZ2VNaXJyb3IpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBpZiAobU1pcnJvck1vZGUgIT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTyAmJiBtYXlDaGFuZ2VNaXJyb3IpIHsKKyAgICAgICAgLy8gSWYgdGhlIG1pcnJvcmluZyBtb2RlIGlzIG5vdCBBVVRPLCBkbyBub3QgYWxsb3cgdHJhbnNmb3JtIHVwZGF0ZQorICAgICAgICAvLyB3aGljaCBtYXkgY2hhbmdlIG1pcnJvci4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIHJldHVybiBzZXRUcmFuc2Zvcm1Mb2NrZWQodHJhbnNmb3JtKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6c2V0VHJhbnNmb3JtTG9ja2VkKGludCB0cmFuc2Zvcm0pIHsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIGlmICh0cmFuc2Zvcm0gPT0gLTEpIHJldHVybiByZXM7CisKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtIGluIGVycm9yIHN0YXRlIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNDMyLDcgKzU2NSw3IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgaWYgKChyZXMgPSBjb25maWd1cmVDb25zdW1lclF1ZXVlTG9ja2VkKCkpICE9IE9LKSB7CisgICAgaWYgKChyZXMgPSBjb25maWd1cmVDb25zdW1lclF1ZXVlTG9ja2VkKHRydWUgLyphbGxvd1ByZXZpZXdSZXNwYWNlKi8pKSAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIApAQCAtNDU2LDcgKzU4OSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpjb25maWd1cmVDb25zdW1lclF1ZXVlTG9ja2VkKCkgeworc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Y29uZmlndXJlQ29uc3VtZXJRdWV1ZUxvY2tlZChib29sIGFsbG93UHJldmlld1Jlc3BhY2UpIHsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBtVHJhY2VGaXJzdEJ1ZmZlciA9IHRydWU7CkBAIC01NDIsMTAgKzY3NSw1NiBAQAogICAgIH0KIAogICAgIG1Ub3RhbEJ1ZmZlckNvdW50ID0gbWF4Q29uc3VtZXJCdWZmZXJzICsgY2FtZXJhX3N0cmVhbTo6bWF4X2J1ZmZlcnM7CisKKyAgICBpbnQgdGltZXN0YW1wQmFzZSA9IGdldFRpbWVzdGFtcEJhc2UoKTsKKyAgICBib29sIGlzRGVmYXVsdFRpbWVCYXNlID0gKHRpbWVzdGFtcEJhc2UgPT0KKyAgICAgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQpOworICAgIGlmIChhbGxvd1ByZXZpZXdSZXNwYWNlKSAgeworICAgICAgICBib29sIGZvcmNlQ2hvcmVvZ3JhcGhlciA9ICh0aW1lc3RhbXBCYXNlID09CisgICAgICAgICAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfQ0hPUkVPR1JBUEhFUl9TWU5DRUQpOworICAgICAgICBib29sIGRlZmF1bHRUb0Nob3Jlb2dyYXBoZXIgPSAoaXNEZWZhdWx0VGltZUJhc2UgJiYKKyAgICAgICAgICAgICAgICBpc0NvbnN1bWVkQnlIV0NvbXBvc2VyKCkpOworICAgICAgICBib29sIGRlZmF1bHRUb1NwYWNlciA9IChpc0RlZmF1bHRUaW1lQmFzZSAmJgorICAgICAgICAgICAgICAgIGlzQ29uc3VtZWRCeUhXVGV4dHVyZSgpICYmCisgICAgICAgICAgICAgICAgIWlzQ29uc3VtZWRCeUNQVSgpICYmCisgICAgICAgICAgICAgICAgIWlzVmlkZW9TdHJlYW0oKSk7CisgICAgICAgIGlmIChmb3JjZUNob3Jlb2dyYXBoZXIgfHwgZGVmYXVsdFRvQ2hvcmVvZ3JhcGhlcikgeworICAgICAgICAgICAgbVN5bmNUb0Rpc3BsYXkgPSB0cnVlOworICAgICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQgKz0ga0Rpc3BsYXlTeW5jRXh0cmFCdWZmZXI7CisgICAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdFRvU3BhY2VyKSB7CisgICAgICAgICAgICBtUHJldmlld0ZyYW1lU3BhY2VyID0gbmV3IFByZXZpZXdGcmFtZVNwYWNlcih0aGlzLCBtQ29uc3VtZXIpOworICAgICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQgKys7CisgICAgICAgICAgICByZXMgPSBtUHJldmlld0ZyYW1lU3BhY2VyLT5ydW4oU3RyaW5nODo6Zm9ybWF0KCJQcmV2aWV3U3BhY2VyLSVkIiwgbUlkKS5zdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc3RhcnQgcHJldmlldyBzcGFjZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID0gMDsKICAgICBtRnJhbWVDb3VudCA9IDA7CiAgICAgbUxhc3RUaW1lc3RhbXAgPSAwOwotICAgIG1Vc2VNb25vVGltZXN0YW1wID0gKGlzQ29uc3VtZWRCeUhXQ29tcG9zZXIoKSB8IGlzVmlkZW9TdHJlYW0oKSk7CisKKyAgICBpZiAoaXNEZXZpY2VUaW1lQmFzZVJlYWx0aW1lKCkpIHsKKyAgICAgICAgaWYgKGlzRGVmYXVsdFRpbWVCYXNlICYmICFpc0NvbnN1bWVkQnlIV0NvbXBvc2VyKCkgJiYgIWlzVmlkZW9TdHJlYW0oKSkgeworICAgICAgICAgICAgLy8gRGVmYXVsdCB0aW1lIGJhc2UsIGJ1dCBub3QgaGFyZHdhcmUgY29tcG9zZXIgb3IgdmlkZW8gZW5jb2RlcgorICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wQmFzZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9SRUFMVElNRSB8fAorICAgICAgICAgICAgICAgIHRpbWVzdGFtcEJhc2UgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfU0VOU09SKSB7CisgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiB0aW1lc3RhbXBCYXNlIGlzIENIT1JFT0dSQVBIRVIgU1lOQ0VEIG9yIE1PTk9UT05JQywgbGVhdmUKKyAgICAgICAgLy8gdGltZXN0YW1wIG9mZnNldCBhcyBib290VGltZSAtIG1vbm90b25pY1RpbWUuCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHRpbWVzdGFtcEJhc2UgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfUkVBTFRJTUUpIHsKKyAgICAgICAgICAgIC8vIFJldmVyc2Ugb2Zmc2V0IGZvciBtb25vdG9uaWNUaW1lIC0+IGJvb3RUaW1lCisgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0ID0gLW1UaW1lc3RhbXBPZmZzZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJZiB0aW1lc3RhbXBCYXNlIGlzIERFRkFVTFQsIE1PTk9UT05JQywgU0VOU09SLCBvcgorICAgICAgICAgICAgLy8gQ0hPUkVPR1JBUEhFUl9TWU5DRUQsIHRpbWVzdGFtcCBvZmZzZXQgaXMgMC4KKyAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQgPSAwOworICAgICAgICB9CisgICAgfQogCiAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1Db25zdW1lci5nZXQoKSwKICAgICAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50KTsKQEAgLTc5NCw2ICs5NzMsMTAgQEAKIAogICAgIHJldHVyblByZWZldGNoZWRCdWZmZXJzTG9ja2VkKCk7CiAKKyAgICBpZiAobVByZXZpZXdGcmFtZVNwYWNlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1QcmV2aWV3RnJhbWVTcGFjZXItPnJlcXVlc3RFeGl0KCk7CisgICAgfQorCiAgICAgQUxPR1YoIiVzOiBkaXNjb25uZWN0aW5nIHN0cmVhbSAlZCBmcm9tIG5hdGl2ZSB3aW5kb3ciLCBfX0ZVTkNUSU9OX18sIGdldElkKCkpOwogCiAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChtQ29uc3VtZXIuZ2V0KCksCkBAIC0xMDg3LDYgKzEyNzAsMTcgQEAKICAgICByZXR1cm4gKHVzYWdlICYgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFKSAhPSAwOwogfQogCitib29sIENhbWVyYTNPdXRwdXRTdHJlYW06OmlzQ29uc3VtZWRCeUNQVSgpIGNvbnN0IHsKKyAgICB1aW50NjRfdCB1c2FnZSA9IDA7CisgICAgc3RhdHVzX3QgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZSgmdXNhZ2UpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBnZXR0aW5nIGVuZCBwb2ludCB1c2FnZSBmYWlsZWQ6ICVzICglZCkuIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiAodXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTUFTSykgIT0gMDsKK30KKwogdm9pZCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpkdW1wSW1hZ2VUb0Rpc2sobnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFud0J1ZmZlciwgaW50IGZlbmNlKSB7CiAgICAgLy8gRGVyaXZlciBvdXRwdXQgZmlsZSBuYW1lCkBAIC0xMTYzLDYgKzEzNTcsMTEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgQ2FtZXJhM091dHB1dFN0cmVhbTo6b25NaW5EdXJhdGlvbkNoYW5nZWQobnNlY3NfdCBkdXJhdGlvbikgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBtTWluRXhwZWN0ZWREdXJhdGlvbiA9IGR1cmF0aW9uOworfQorCiB2b2lkIENhbWVyYTNPdXRwdXRTdHJlYW06OnJldHVyblByZWZldGNoZWRCdWZmZXJzTG9ja2VkKCkgewogICAgIHN0ZDo6dmVjdG9yPFN1cmZhY2U6OkJhdGNoQnVmZmVyPiBiYXRjaGVkQnVmZmVyczsKIApAQCAtMTE4MCw2ICsxMzc5LDk5IEBACiAgICAgfQogfQogCituc2Vjc190IENhbWVyYTNPdXRwdXRTdHJlYW06OnN5bmNUaW1lc3RhbXBUb0Rpc3BsYXlMb2NrZWQobnNlY3NfdCB0KSB7CisgICAgUGFyY2VsYWJsZVZzeW5jRXZlbnREYXRhIHBhcmNlbGFibGVWc3luY0V2ZW50RGF0YTsKKyAgICBhdXRvIHJlcyA9IG1EaXNwbGF5RXZlbnRSZWNlaXZlci5nZXRMYXRlc3RWc3luY0V2ZW50RGF0YSgmcGFyY2VsYWJsZVZzeW5jRXZlbnREYXRhKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBnZXR0aW5nIGxhdGVzdCB2c3luYyBldmVudCBkYXRhOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIG1MYXN0Q2FwdHVyZVRpbWUgPSB0OworICAgICAgICBtTGFzdFByZXNlbnRUaW1lID0gdDsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorCisgICAgY29uc3QgVnN5bmNFdmVudERhdGEmIHZzeW5jRXZlbnREYXRhID0gcGFyY2VsYWJsZVZzeW5jRXZlbnREYXRhLnZzeW5jOworICAgIG5zZWNzX3QgY3VycmVudFRpbWUgPSBzeXN0ZW1UaW1lKCk7CisKKyAgICAvLyBSZXNldCBjYXB0dXJlIHRvIHByZXNlbnQgdGltZSBvZmZzZXQgaWY6CisgICAgLy8gLSBNb3JlIHRoYW4gMSBzZWNvbmQgYmV0d2VlbiBmcmFtZXMuCisgICAgLy8gLSBUaGUgZnJhbWUgZHVyYXRpb24gZGV2aWF0ZXMgZnJvbSBtdWx0aXBsZXMgb2YgdnN5bmMgZnJhbWUgaW50ZXJ2YWxzLgorICAgIG5zZWNzX3QgY2FwdHVyZUludGVydmFsID0gdCAtIG1MYXN0Q2FwdHVyZVRpbWU7CisgICAgZmxvYXQgY2FwdHVyZVRvVnN5bmNJbnRlcnZhbFJhdGlvID0gMS4wZiAqIGNhcHR1cmVJbnRlcnZhbCAvIHZzeW5jRXZlbnREYXRhLmZyYW1lSW50ZXJ2YWw7CisgICAgZmxvYXQgcmF0aW9EZXZpYXRpb24gPSBzdGQ6OmZhYnMoCisgICAgICAgICAgICBjYXB0dXJlVG9Wc3luY0ludGVydmFsUmF0aW8gLSBzdGQ6OnJvdW5kZihjYXB0dXJlVG9Wc3luY0ludGVydmFsUmF0aW8pKTsKKyAgICBpZiAoY2FwdHVyZUludGVydmFsID4ga1NwYWNpbmdSZXNldEludGVydmFsTnMgfHwKKyAgICAgICAgICAgIHJhdGlvRGV2aWF0aW9uID49IGtNYXhJbnRlcnZhbFJhdGlvRGV2aWF0aW9uKSB7CisgICAgICAgIG5zZWNzX3QgbWluUHJlc2VudFQgPSBtTGFzdFByZXNlbnRUaW1lICsgdnN5bmNFdmVudERhdGEuZnJhbWVJbnRlcnZhbCAvIDI7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgVnN5bmNFdmVudERhdGE6OmtGcmFtZVRpbWVsaW5lc0xlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvJiB0aW1lbGluZSA9IHZzeW5jRXZlbnREYXRhLmZyYW1lVGltZWxpbmVzW2ldOworICAgICAgICAgICAgaWYgKHRpbWVsaW5lLmRlYWRsaW5lVGltZXN0YW1wID49IGN1cnJlbnRUaW1lICYmCisgICAgICAgICAgICAgICAgICAgIHRpbWVsaW5lLmV4cGVjdGVkUHJlc2VudGF0aW9uVGltZSA+IG1pblByZXNlbnRUKSB7CisgICAgICAgICAgICAgICAgbnNlY3NfdCBwcmVzZW50VCA9IHZzeW5jRXZlbnREYXRhLmZyYW1lVGltZWxpbmVzW2ldLmV4cGVjdGVkUHJlc2VudGF0aW9uVGltZTsKKyAgICAgICAgICAgICAgICBtQ2FwdHVyZVRvUHJlc2VudE9mZnNldCA9IHByZXNlbnRUIC0gdDsKKyAgICAgICAgICAgICAgICBtTGFzdENhcHR1cmVUaW1lID0gdDsKKyAgICAgICAgICAgICAgICBtTGFzdFByZXNlbnRUaW1lID0gcHJlc2VudFQ7CisKKyAgICAgICAgICAgICAgICAvLyBNb3ZlIHRoZSBleHBlY3RlZCBwcmVzZW50YXRpb24gdGltZSBiYWNrIGJ5IDEvMyBvZiBmcmFtZSBpbnRlcnZhbCB0bworICAgICAgICAgICAgICAgIC8vIG1pdGlnYXRlIHRoZSB0aW1lIGRyaWZ0LiBEdWUgdG8gdGltZSBkcmlmdCwgaWYgd2UgZGlyZWN0bHkgdXNlIHRoZQorICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkIHByZXNlbnRhdGlvbiB0aW1lLCBvZnRlbiB0aW1lcyAyIGV4cGVjdGVkIHByZXNlbnRhdGlvbiB0aW1lCisgICAgICAgICAgICAgICAgLy8gZmFsbHMgaW50byB0aGUgc2FtZSBWU1lOQyBpbnRlcnZhbC4KKyAgICAgICAgICAgICAgICByZXR1cm4gcHJlc2VudFQgLSB2c3luY0V2ZW50RGF0YS5mcmFtZUludGVydmFsLzM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuc2Vjc190IGlkZWFsUHJlc2VudFQgPSB0ICsgbUNhcHR1cmVUb1ByZXNlbnRPZmZzZXQ7CisgICAgbnNlY3NfdCBleHBlY3RlZFByZXNlbnRUID0gbUxhc3RQcmVzZW50VGltZTsKKyAgICBuc2Vjc190IG1pbkRpZmYgPSBJTlQ2NF9NQVg7CisgICAgLy8gRGVyaXZlIG1pbmltdW0gaW50ZXJ2YWxzIGJldHdlZW4gcHJlc2VudGF0aW9uIHRpbWVzIGJhc2VkIG9uIG1pbmltYWwKKyAgICAvLyBleHBlY3RlZCBkdXJhdGlvbi4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIFZzeW5jcyBpczoKKyAgICAvLyAtIDAgaWYgbWluRnJhbWVEdXJhdGlvbiBpbiAoMCwgMS41XSAqIHZTeW5jSW50ZXJ2YWwsCisgICAgLy8gLSAxIGlmIG1pbkZyYW1lRHVyYXRpb24gaW4gKDEuNSwgMi41XSAqIHZTeW5jSW50ZXJ2YWwsCisgICAgLy8gLSBhbmQgc28gb24uCisgICAgaW50IG1pblZzeW5jcyA9IChtTWluRXhwZWN0ZWREdXJhdGlvbiAtIHZzeW5jRXZlbnREYXRhLmZyYW1lSW50ZXJ2YWwgLyAyKSAvCisgICAgICAgICAgICB2c3luY0V2ZW50RGF0YS5mcmFtZUludGVydmFsOworICAgIGlmIChtaW5Wc3luY3MgPCAwKSBtaW5Wc3luY3MgPSAwOworICAgIG5zZWNzX3QgbWluSW50ZXJ2YWwgPSBtaW5Wc3luY3MgKiB2c3luY0V2ZW50RGF0YS5mcmFtZUludGVydmFsOworICAgIC8vIEZpbmQgYmVzdCB0aW1lc3RhbXAgaW4gdGhlIHZzeW5jIHRpbWVsaW5lczoKKyAgICAvLyAtIE9ubHkgdXNlIGF0IG1vc3QgMyB0aW1lbGluZXMgdG8gYXZvaWQgbG9uZyBsYXRlbmN5CisgICAgLy8gLSBjbG9zZXN0IHRvIHRoZSBpZGVhbCBwcmVzZW50IHRpbWUsCisgICAgLy8gLSBkZWFkbGluZSB0aW1lc3RhbXAgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHRpbWUsIGFuZAorICAgIC8vIC0gdGhlIGNhbmRpZGF0ZSBwcmVzZW50IHRpbWUgaXMgYXQgbGVhc3QgbWluSW50ZXJ2YWwgaW4gdGhlIGZ1dHVyZQorICAgIC8vICAgY29tcGFyZWQgdG8gbGFzdCBwcmVzZW50IHRpbWUuCisgICAgaW50IG1heFRpbWVsaW5lcyA9IHN0ZDo6bWluKGtNYXhUaW1lbGluZXMsIChpbnQpVnN5bmNFdmVudERhdGE6OmtGcmFtZVRpbWVsaW5lc0xlbmd0aCk7CisgICAgZmxvYXQgYmlhc0ZvclNob3J0RGVsYXkgPSAxLjBmOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4VGltZWxpbmVzOyBpICsrKSB7CisgICAgICAgIGNvbnN0IGF1dG8mIHZzeW5jVGltZSA9IHZzeW5jRXZlbnREYXRhLmZyYW1lVGltZWxpbmVzW2ldOworICAgICAgICBpZiAobWluVnN5bmNzID4gMCkgeworICAgICAgICAgICAgLy8gQmlhcyB0b3dhcmRzIHVzaW5nIHNtYWxsZXIgdGltZWxpbmUgaW5kZXg6CisgICAgICAgICAgICAvLyAgIGkgPSAwOiAgICAgICAgICAgICAgICBiaWFzID0gMQorICAgICAgICAgICAgLy8gICBpID0gbWF4VGltZWxpbmVzLTE6ICAgYmlhcyA9IC0xCisgICAgICAgICAgICBiaWFzRm9yU2hvcnREZWxheSA9IDEuMCAtIDIuMCAqIGkgLyAobWF4VGltZWxpbmVzIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0ZDo6YWJzKHZzeW5jVGltZS5leHBlY3RlZFByZXNlbnRhdGlvblRpbWUgLSBpZGVhbFByZXNlbnRUKSA8IG1pbkRpZmYgJiYKKyAgICAgICAgICAgICAgICB2c3luY1RpbWUuZGVhZGxpbmVUaW1lc3RhbXAgPj0gY3VycmVudFRpbWUgJiYKKyAgICAgICAgICAgICAgICB2c3luY1RpbWUuZXhwZWN0ZWRQcmVzZW50YXRpb25UaW1lID4KKyAgICAgICAgICAgICAgICBtTGFzdFByZXNlbnRUaW1lICsgbWluSW50ZXJ2YWwgKyBiaWFzRm9yU2hvcnREZWxheSAqIGtUaW1lbGluZVRocmVzaG9sZE5zKSB7CisgICAgICAgICAgICBleHBlY3RlZFByZXNlbnRUID0gdnN5bmNUaW1lLmV4cGVjdGVkUHJlc2VudGF0aW9uVGltZTsKKyAgICAgICAgICAgIG1pbkRpZmYgPSBzdGQ6OmFicyh2c3luY1RpbWUuZXhwZWN0ZWRQcmVzZW50YXRpb25UaW1lIC0gaWRlYWxQcmVzZW50VCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUxhc3RDYXB0dXJlVGltZSA9IHQ7CisgICAgbUxhc3RQcmVzZW50VGltZSA9IGV4cGVjdGVkUHJlc2VudFQ7CisKKyAgICAvLyBNb3ZlIHRoZSBleHBlY3RlZCBwcmVzZW50YXRpb24gdGltZSBiYWNrIGJ5IDEvMyBvZiBmcmFtZSBpbnRlcnZhbCB0bworICAgIC8vIG1pdGlnYXRlIHRoZSB0aW1lIGRyaWZ0LiBEdWUgdG8gdGltZSBkcmlmdCwgaWYgd2UgZGlyZWN0bHkgdXNlIHRoZQorICAgIC8vIGV4cGVjdGVkIHByZXNlbnRhdGlvbiB0aW1lLCBvZnRlbiB0aW1lcyAyIGV4cGVjdGVkIHByZXNlbnRhdGlvbiB0aW1lCisgICAgLy8gZmFsbHMgaW50byB0aGUgc2FtZSBWU1lOQyBpbnRlcnZhbC4KKyAgICByZXR1cm4gZXhwZWN0ZWRQcmVzZW50VCAtIHZzeW5jRXZlbnREYXRhLmZyYW1lSW50ZXJ2YWwvMzsKK30KKworYm9vbCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpzaG91bGRMb2dFcnJvcihzdGF0dXNfdCByZXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgcmV0dXJuIHNob3VsZExvZ0Vycm9yKHJlcywgbVN0YXRlKTsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKaW5kZXggYWQwM2I1My4uZTgwNjVjZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKQEAgLTIxLDEyICsyMSwxNSBAQAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9EaXNwbGF5RXZlbnRSZWNlaXZlci5oPgogCisjaW5jbHVkZSAidXRpbHMvSVBDVHJhbnNwb3J0LmgiCiAjaW5jbHVkZSAidXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5oIgogI2luY2x1ZGUgIkNhbWVyYTNTdHJlYW0uaCIKICNpbmNsdWRlICJDYW1lcmEzSU9TdHJlYW1CYXNlLmgiCiAjaW5jbHVkZSAiQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oIgogI2luY2x1ZGUgIkNhbWVyYTNCdWZmZXJNYW5hZ2VyLmgiCisjaW5jbHVkZSAiUHJldmlld0ZyYW1lU3BhY2VyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtODcsOCArOTAsMTMgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKLSAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELCBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2UpOworICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCwKKyAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELCBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2UsCisgICAgICAgICAgICBpbnQ2NF90IGR5bmFtaWNQcm9maWxlID0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCwKKyAgICAgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQsCisgICAgICAgICAgICBib29sIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSA9IGZhbHNlLAorICAgICAgICAgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9ERUZBVUxULAorICAgICAgICAgICAgaW50IG1pcnJvck1vZGUgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpNSVJST1JfTU9ERV9BVVRPKTsKICAgICAvKioKICAgICAgKiBTZXQgdXAgYSBzdHJlYW0gZm9yIGZvcm1hdHMgdGhhdCBoYXZlIGEgdmFyaWFibGUgYnVmZmVyIHNpemUgZm9yIHRoZSBzYW1lCiAgICAgICogZGltZW5zaW9ucywgc3VjaCBhcyBjb21wcmVzc2VkIEpQRUcuCkBAIC05OSw4ICsxMDcsMTMgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCi0gICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQsCisgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgaW50NjRfdCBkeW5hbWljUHJvZmlsZSA9IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQsCisgICAgICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxULAorICAgICAgICAgICAgYm9vbCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUgPSBmYWxzZSwKKyAgICAgICAgICAgIGludCB0aW1lc3RhbXBCYXNlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfREVGQVVMVCwKKyAgICAgICAgICAgIGludCBtaXJyb3JNb2RlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTyk7CiAgICAgLyoqCiAgICAgICogU2V0IHVwIGEgc3RyZWFtIHdpdGggZGVmZXJyZWQgY29uc3VtZXIgZm9yIGZvcm1hdHMgdGhhdCBoYXZlIDIgZGltZW5zaW9ucywgc3VjaCBhcwogICAgICAqIFJBVyBhbmQgWVVWLiBUaGUgY29uc3VtZXIgbXVzdCBiZSBzZXQgYmVmb3JlIHVzaW5nIHRoaXMgc3RyZWFtIGZvciBvdXRwdXQuIEEgdmFsaWQKQEAgLTExMCw4ICsxMjMsMTMgQEAKICAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgICAgIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKLSAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELCBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2UpOworICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCwKKyAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELCBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2UsCisgICAgICAgICAgICBpbnQ2NF90IGR5bmFtaWNQcm9maWxlID0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCwKKyAgICAgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQsCisgICAgICAgICAgICBib29sIGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSA9IGZhbHNlLAorICAgICAgICAgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9ERUZBVUxULAorICAgICAgICAgICAgaW50IG1pcnJvck1vZGUgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpNSVJST1JfTU9ERV9BVVRPKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTNPdXRwdXRTdHJlYW0oKTsKIApAQCAtMTI1LDcgKzE0Myw3IEBACiAgICAgICogU2V0IHRoZSB0cmFuc2Zvcm0gb24gdGhlIG91dHB1dCBzdHJlYW07IG9uZSBvZiB0aGUKICAgICAgKiBIQUxfVFJBTlNGT1JNXyogLyBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV8qIGNvbnN0YW50cy4KICAgICAgKi8KLSAgICBzdGF0dXNfdCAgICAgICAgIHNldFRyYW5zZm9ybShpbnQgdHJhbnNmb3JtKTsKKyAgICBzdGF0dXNfdCAgICAgICAgIHNldFRyYW5zZm9ybShpbnQgdHJhbnNmb3JtLCBib29sIG1heUNoYW5nZU1pcnJvcik7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gaWYgdGhpcyBvdXRwdXQgc3RyZWFtIGlzIGZvciB2aWRlbyBlbmNvZGluZy4KQEAgLTE0Miw2ICsxNjAsMTEgQEAKICAgICBib29sIGlzQ29uc3VtZWRCeUhXVGV4dHVyZSgpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogUmV0dXJuIGlmIHRoaXMgb3V0cHV0IHN0cmVhbSBpcyBjb25zdW1lZCBieSBDUFUuCisgICAgICovCisgICAgYm9vbCBpc0NvbnN1bWVkQnlDUFUoKSBjb25zdDsKKworICAgIC8qKgogICAgICAqIFJldHVybiBpZiB0aGUgY29uc3VtZXIgY29uZmlndXJhdGlvbiBvZiB0aGlzIHN0cmVhbSBpcyBkZWZlcnJlZC4KICAgICAgKi8KICAgICB2aXJ0dWFsIGJvb2wgaXNDb25zdW1lckNvbmZpZ3VyYXRpb25EZWZlcnJlZChzaXplX3Qgc3VyZmFjZV9pZCkgY29uc3Q7CkBAIC0yMjQsMjAgKzI0NywzMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QmF0Y2hTaXplKHNpemVfdCBiYXRjaFNpemUgPSAxKSBvdmVycmlkZTsKIAogICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgc3RyZWFtIG9uIGNoYW5nZSBvZiBtaW4gZnJhbWUgZHVyYXRpb25zLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBvbk1pbkR1cmF0aW9uQ2hhbmdlZChuc2Vjc190IGR1cmF0aW9uKSBvdmVycmlkZTsKKworICAgIC8qKgogICAgICAqIEFwcGx5IFpTTCByZWxhdGVkIGNvbnN1bWVyIHVzYWdlIHF1aXJrLgogICAgICAqLwogICAgIHN0YXRpYyB2b2lkIGFwcGx5WlNMVXNhZ2VRdWlyayhpbnQgZm9ybWF0LCB1aW50NjRfdCAqY29uc3VtZXJVc2FnZSAvKmlub3V0Ki8pOwogCiAgICAgdm9pZCBzZXRJbWFnZUR1bXBNYXNrKGludCBtYXNrKSB7IG1JbWFnZUR1bXBNYXNrID0gbWFzazsgfQorICAgIGJvb2wgc2hvdWxkTG9nRXJyb3Ioc3RhdHVzX3QgcmVzKTsKIAogICBwcm90ZWN0ZWQ6CiAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIGNhbWVyYV9zdHJlYW1fdHlwZV90IHR5cGUsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIElQQ1RyYW5zcG9ydCB0cmFuc3BvcnQsCiAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQgPSAwLAotICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZSk7CisgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgaW50NjRfdCBkeW5hbWljUHJvZmlsZSA9IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQsCisgICAgICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxULAorICAgICAgICAgICAgYm9vbCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUgPSBmYWxzZSwKKyAgICAgICAgICAgIGludCB0aW1lc3RhbXBCYXNlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfREVGQVVMVCwKKyAgICAgICAgICAgIGludCBtaXJyb3JNb2RlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTyk7CiAKICAgICAvKioKICAgICAgKiBOb3RlIHRoYXQgd2UgcmVsZWFzZSB0aGUgbG9jayBicmllZmx5IGluIHRoaXMgZnVuY3Rpb24KQEAgLTI0NSwxNiArMjc5LDE5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBpbnQzMl90IHRyYW5zZm9ybSwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0TG9ja2VkKCk7CisgICAgc3RhdHVzX3QgZml4VXBIaWRsSnBlZ0Jsb2JIZWFkZXIoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW53QnVmZmVyLCBpbnQgZmVuY2UpOwogCiAgICAgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UodWludDY0X3QgKnVzYWdlLAogICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIGNvbnN0OwotICAgIHN0YXR1c190IGNvbmZpZ3VyZUNvbnN1bWVyUXVldWVMb2NrZWQoKTsKKyAgICBzdGF0dXNfdCBjb25maWd1cmVDb25zdW1lclF1ZXVlTG9ja2VkKGJvb2wgYWxsb3dQcmV2aWV3UmVzcGFjZSk7CiAKICAgICAvLyBDb25zdW1lciBhcyB0aGUgb3V0cHV0IG9mIGNhbWVyYSBIQUwKICAgICBzcDxTdXJmYWNlPiBtQ29uc3VtZXI7CkBAIC0yNzcsOSArMzE0LDYgQEAKICAgICAvLyBOYW1lIG9mIFN1cmZhY2UgY29uc3VtZXIKICAgICBTdHJpbmc4ICAgICAgICAgICBtQ29uc3VtZXJOYW1lOwogCi0gICAgLy8gV2hldGhlciBjb25zdW1lciBhc3N1bWVzIE1PTk9UT05JQyB0aW1lc3RhbXAKLSAgICBib29sIG1Vc2VNb25vVGltZXN0YW1wOwotCiAgICAgLyoqCiAgICAgICogR3JhcGhpY0J1ZmZlciBtYW5hZ2VyIHRoaXMgc3RyZWFtIGlzIHJlZ2lzdGVyZWQgdG8uIFVzZWQgdG8gcmVwbGFjZSB0aGUgYnVmZmVyCiAgICAgICogYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gcm9sZSBvZiBCdWZmZXJRdWV1ZS4KQEAgLTI5OCw3ICszMzIsMTEgQEAKICAgICBib29sIG1Vc2VCdWZmZXJNYW5hZ2VyOwogCiAgICAgLyoqCi0gICAgICogVGltZXN0YW1wIG9mZnNldCBmb3IgdmlkZW8gYW5kIGhhcmR3YXJlIGNvbXBvc2VyIGNvbnN1bWVkIHN0cmVhbXMKKyAgICAgKiBPZmZzZXQgdXNlZCB0byBvdmVycmlkZSBjYW1lcmEgSEFMIHByb2R1Y2VkIHRpbWVzdGFtcHMKKyAgICAgKgorICAgICAqIFRoZSBvZmZzZXQgaXMgZmlyc3QgaW5pdGlhbGl6ZWQgdG8gYm9vdFRpbWUgLSBtb25vdG9uaWNUaW1lIGluCisgICAgICogY29uc3RydWN0b3IsIGFuZCBtYXkgbGF0ZXIgYmUgdXBkYXRlZCBiYXNlZCBvbiB0aGUgY2xpZW50J3MgdGltZXN0YW1wQmFzZQorICAgICAqIHNldHRpbmcuCiAgICAgICovCiAgICAgbnNlY3NfdCBtVGltZXN0YW1wT2Zmc2V0OwogCkBAIC0zMjIsNiArMzYwLDggQEAKICAgICBzdGQ6OnZlY3RvcjxTdXJmYWNlOjpCYXRjaEJ1ZmZlcj4gbUJhdGNoZWRCdWZmZXJzOwogICAgIC8vIC0tLS0gRW5kIG9mIG1CYXRjaExvY2sgcHJvdGVjdGVkIHNjb3BlIC0tLS0KIAorICAgIGNvbnN0IGludCBtTWlycm9yTW9kZTsKKwogICAgIC8qKgogICAgICAqIEludGVybmFsIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCiAgICAgICovCkBAIC0zMzIsNyArMzcyLDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLAorICAgICAgICAgICAgaW50MzJfdCB0cmFuc2Zvcm0sIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKICAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKQEAgLTM2NCwxMSArNDA1LDMyIEBACiAKICAgICB2b2lkIHJldHVyblByZWZldGNoZWRCdWZmZXJzTG9ja2VkKCk7CiAKKwogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUgPSA1OyAvLyBpbiBtcwogICAgIENhbWVyYUxhdGVuY3lIaXN0b2dyYW0gbURlcXVldWVCdWZmZXJMYXRlbmN5OworICAgIElQQ1RyYW5zcG9ydCBtSVBDVHJhbnNwb3J0ID0gSVBDVHJhbnNwb3J0OjpJTlZBTElEOwogCiAgICAgaW50IG1JbWFnZUR1bXBNYXNrID0gMDsKIAorICAgIC8vIFJlLXNwYWNlIGZyYW1lcyBieSBvdmVycmlkaW5nIHRpbWVzdGFtcCB0byBhbGlnbiB3aXRoIGRpc3BsYXkgVnN5bmMuCisgICAgLy8gRGVmYXVsdCBpcyBvbiBmb3IgU3VyZmFjZVZpZXcgYm91bmQgc3RyZWFtcy4KKyAgICBuc2Vjc190IG1NaW5FeHBlY3RlZER1cmF0aW9uID0gMDsKKyAgICBib29sIG1TeW5jVG9EaXNwbGF5ID0gZmFsc2U7CisgICAgRGlzcGxheUV2ZW50UmVjZWl2ZXIgbURpc3BsYXlFdmVudFJlY2VpdmVyOworICAgIG5zZWNzX3QgbUxhc3RDYXB0dXJlVGltZSA9IDA7CisgICAgbnNlY3NfdCBtTGFzdFByZXNlbnRUaW1lID0gMDsKKyAgICBuc2Vjc190IG1DYXB0dXJlVG9QcmVzZW50T2Zmc2V0ID0gMDsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrRGlzcGxheVN5bmNFeHRyYUJ1ZmZlciA9IDI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBuc2Vjc190IGtTcGFjaW5nUmVzZXRJbnRlcnZhbE5zID0gNTAwMDAwMDBMTDsgLy8gNTAgbWlsbGlzZWNvbmQKKyAgICBzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga1RpbWVsaW5lVGhyZXNob2xkTnMgPSAxMDAwMDAwTEw7IC8vIDEgbWlsbGlzZWNvbmQKKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtNYXhJbnRlcnZhbFJhdGlvRGV2aWF0aW9uID0gMC4wNWY7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFRpbWVsaW5lcyA9IDM7CisgICAgbnNlY3NfdCBzeW5jVGltZXN0YW1wVG9EaXNwbGF5TG9ja2VkKG5zZWNzX3QgdCk7CisKKyAgICAvLyBSZS1zcGFjZSBmcmFtZXMgYnkgZGVsYXlpbmcgcXVldWVCdWZmZXIgc28gdGhhdCBmcmFtZSBkZWxpdmVyeSBoYXMKKyAgICAvLyB0aGUgc2FtZSBjYWRlbmNlIGFzIGNhcHR1cmUuIERlZmF1bHQgaXMgb24gZm9yIFN1cmZhY2VUZXh0dXJlIGJvdW5kCisgICAgLy8gc3RyZWFtcy4KKyAgICBzcDxQcmV2aWV3RnJhbWVTcGFjZXI+IG1QcmV2aWV3RnJhbWVTcGFjZXI7CiB9OyAvLyBjbGFzcyBDYW1lcmEzT3V0cHV0U3RyZWFtCiAKIH0gLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgKaW5kZXggNDlmOWY2Mi4uYTZkNGI5NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgKQEAgLTM0LDcgKzM0LDcgQEAKICAgICAgKiBTZXQgdGhlIHRyYW5zZm9ybSBvbiB0aGUgb3V0cHV0IHN0cmVhbTsgb25lIG9mIHRoZQogICAgICAqIEhBTF9UUkFOU0ZPUk1fKiAvIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNXyogY29uc3RhbnRzLgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VHJhbnNmb3JtKGludCB0cmFuc2Zvcm0pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRyYW5zZm9ybShpbnQgdHJhbnNmb3JtLCBib29sIG1heUNoYW5nZU1pcnJvcikgPSAwOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGlmIHRoaXMgb3V0cHV0IHN0cmVhbSBpcyBmb3IgdmlkZW8gZW5jb2RpbmcuCkBAIC0xMDgsNiArMTA4LDE0IEBACiAgICAgICogaW5zdGVhZC4KICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJhdGNoU2l6ZShzaXplX3QgYmF0Y2hTaXplID0gMSkgPSAwOworCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBvdXRwdXQgc3RyZWFtIHRoYXQgdGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gaGFzIGNoYW5nZWQuCisgICAgICoKKyAgICAgKiBUaGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSB1cHBlciBib3VuZCBvZgorICAgICAqIEFFX1RBUkdFVF9GUFNfUkFOR0UgaW4gdGhlIGNhcHR1cmUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25NaW5EdXJhdGlvbkNoYW5nZWQobnNlY3NfdCBkdXJhdGlvbikgPSAwOwogfTsKIAogLy8gSGVscGVyIGNsYXNzIHRvIG9yZ2FuaXplIGEgc3luY2hyb25pemVkIG1hcHBpbmcgb2Ygc3RyZWFtIElEcyB0byBzdHJlYW0gaW5zdGFuY2VzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5jcHAKaW5kZXggOWYyMjVkMC4uZWQ2NmRmMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmNwcApAQCAtNDIsMTAgKzQyLDEzIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KICNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CiAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5oIgogCisjaW5jbHVkZSAic3lzdGVtL2NhbWVyYV9tZXRhZGF0YS5oIgorCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOwogCkBAIC0zNzMsNDMgKzM3Niw2IEBACiAgICAgaW5zZXJ0UmVzdWx0TG9ja2VkKHN0YXRlcywgJmNhcHR1cmVSZXN1bHQsIGZyYW1lTnVtYmVyKTsKIH0KIAotLy8gUmVhZGluZyBvbmUgY2FtZXJhIG1ldGFkYXRhIGZyb20gcmVzdWx0IGFyZ3VtZW50IHZpYSBmbXEgb3IgZnJvbSB0aGUgcmVzdWx0Ci0vLyBBc3N1bWluZyB0aGUgZm1xIGlzIHByb3RlY3RlZCBieSBhIGxvY2sgYWxyZWFkeQotc3RhdHVzX3QgcmVhZE9uZUNhbWVyYU1ldGFkYXRhTG9ja2VkKAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4mIGZtcSwKLSAgICAgICAgdWludDY0X3QgZm1xUmVzdWx0U2l6ZSwKLSAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSYgcmVzdWx0TWV0YWRhdGEsCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEmIHJlc3VsdCkgewotICAgIGlmIChmbXFSZXN1bHRTaXplID4gMCkgewotICAgICAgICByZXN1bHRNZXRhZGF0YS5yZXNpemUoZm1xUmVzdWx0U2l6ZSk7Ci0gICAgICAgIGlmIChmbXEgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsgLy8gbG9nZ2VkIGluIGluaXRpYWxpemUoKQotICAgICAgICB9Ci0gICAgICAgIGlmICghZm1xLT5yZWFkKHJlc3VsdE1ldGFkYXRhLmRhdGEoKSwgZm1xUmVzdWx0U2l6ZSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IHJlYWQgY2FtZXJhIG1ldGFkYXRhIGZyb20gZm1xLCBzaXplID0gJSIgUFJJdTY0LAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZtcVJlc3VsdFNpemUpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0TWV0YWRhdGEuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4ocmVzdWx0LmRhdGEoKSksCi0gICAgICAgICAgICAgICAgcmVzdWx0LnNpemUoKSk7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdE1ldGFkYXRhLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHJlczsKLSAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIG1ldGFkYXRhID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVzdWx0TWV0YWRhdGEuZGF0YSgpKTsKLSAgICAgICAgc2l6ZV90IGV4cGVjdGVkX21ldGFkYXRhX3NpemUgPSByZXN1bHRNZXRhZGF0YS5zaXplKCk7Ci0gICAgICAgIGlmICgocmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShtZXRhZGF0YSwgJmV4cGVjdGVkX21ldGFkYXRhX3NpemUpKSAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBieSBjYW1lcmEgc2VydmljZSBmcm9tIEhBTDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIHZvaWQgcmVtb3ZlSW5GbGlnaHRNYXBFbnRyeUxvY2tlZChDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsIGludCBpZHgpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEluRmxpZ2h0UmVxdWVzdE1hcCYgaW5mbGlnaHRNYXAgPSBzdGF0ZXMuaW5mbGlnaHRNYXA7CkBAIC00NjAsMTYgKzQyNiwxNiBAQAogICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKAogICAgICAgICAgICAgc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIsIHN0YXRlcy5saXN0ZW5lciwKICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwLAorICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIC8qdGltZXN0YW1wKi8wLCAvKnJlYWRvdXRUaW1lc3RhbXAqLzAsCiAgICAgICAgICAgICAvKnJlcXVlc3RlZCovdHJ1ZSwgcmVxdWVzdC5yZXF1ZXN0VGltZU5zLCBzdGF0ZXMuc2Vzc2lvblN0YXRzQnVpbGRlciwKICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwKICAgICAgICAgICAgIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsIHJlcXVlc3QucmVzdWx0RXh0cmFzLAotICAgICAgICAgICAgcmVxdWVzdC5lcnJvckJ1ZlN0cmF0ZWd5KTsKKyAgICAgICAgICAgIHJlcXVlc3QuZXJyb3JCdWZTdHJhdGVneSwgcmVxdWVzdC50cmFuc2Zvcm0pOwogCiAgICAgICAgIC8vIE5vdGUgZG93biB0aGUganVzdCBjb21wbGV0ZWQgZnJhbWUgbnVtYmVyCiAgICAgICAgIGlmIChyZXF1ZXN0Lmhhc0lucHV0QnVmZmVyKSB7CiAgICAgICAgICAgICBzdGF0ZXMubGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC56c2xDYXB0dXJlKSB7CisgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC56c2xDYXB0dXJlICYmIHJlcXVlc3Quc3RpbGxDYXB0dXJlKSB7CiAgICAgICAgICAgICBzdGF0ZXMubGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdGF0ZXMubGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOwpAQCAtNTU1LDYgKzUyMSwzMSBAQAogICAgICAgICBpZiAocmVzdWx0LT5wYXJ0aWFsX3Jlc3VsdCAhPSAwKQogICAgICAgICAgICAgcmVxdWVzdC5yZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50ID0gcmVzdWx0LT5wYXJ0aWFsX3Jlc3VsdDsKIAorICAgICAgICBpZiAoKHJlc3VsdC0+cmVzdWx0ICE9IG51bGxwdHIpICYmICFzdGF0ZXMubGVnYWN5Q2xpZW50KSB7CisgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnk7CisgICAgICAgICAgICBhdXRvIHJldCA9IGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KHJlc3VsdC0+cmVzdWx0LAorICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0xPR0lDQUxfTVVMVElfQ0FNRVJBX0FDVElWRV9QSFlTSUNBTF9JRCwgJmVudHJ5KTsKKyAgICAgICAgICAgIGlmICgocmV0ID09IE9LKSAmJiAoZW50cnkuY291bnQgPiAwKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBoeXNpY2FsSWQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KGVudHJ5LmRhdGEudTgpKTsKKyAgICAgICAgICAgICAgICBhdXRvIGRldmljZUluZm8gPSBzdGF0ZXMucGh5c2ljYWxEZXZpY2VJbmZvTWFwLmZpbmQocGh5c2ljYWxJZCk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZUluZm8gIT0gc3RhdGVzLnBoeXNpY2FsRGV2aWNlSW5mb01hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIG9yaWVudGF0aW9uID0gZGV2aWNlSW5mby0+c2Vjb25kLmZpbmQoQU5EUk9JRF9TRU5TT1JfT1JJRU5UQVRJT04pOworICAgICAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24uY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBDYW1lcmFVdGlsczo6Z2V0Um90YXRpb25UcmFuc2Zvcm0oZGV2aWNlSW5mby0+c2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uOjpNSVJST1JfTU9ERV9BVVRPLCAmcmVxdWVzdC50cmFuc2Zvcm0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNhbGN1bGF0ZSBjdXJyZW50IHN0cmVhbSB0cmFuc2Zvcm1hdGlvbjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBQaHlzaWNhbCBkZXZpY2Ugb3JpZW50YXRpb24gYWJzZW50ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFBoeXNpY2FsIGRldmljZSBub3QgZm91bmQgaW4gZGV2aWNlIGluZm8gbWFwIGZvdW5kISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyByZXN1bHQgY2FycmllcyBvbmx5IHBhcnRpYWwgbWV0YWRhdGEKICAgICAgICAgaWYgKHN0YXRlcy51c2VQYXJ0aWFsUmVzdWx0ICYmIHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwpIHsKICAgICAgICAgICAgIGlmIChyZXN1bHQtPnBhcnRpYWxfcmVzdWx0ID4gc3RhdGVzLm51bVBhcnRpYWxSZXN1bHRzIHx8IHJlc3VsdC0+cGFydGlhbF9yZXN1bHQgPCAxKSB7CkBAIC02OTEsMTYyICs2ODIsMTUgQEAKICAgICB9CiB9CiAKLXZvaWQgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoCi0gICAgICAgIENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0JiByZXN1bHQsCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+IHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpIHsKLSAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcjsKLSAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1czsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4mIGZtcSA9IHN0YXRlcy5mbXE7Ci0gICAgQnVmZmVyUmVjb3Jkc0ludGVyZmFjZSYgYnVmZmVyUmVjb3JkcyA9IHN0YXRlcy5idWZmZXJSZWNvcmRzSW50ZjsKLSAgICBjYW1lcmFfY2FwdHVyZV9yZXN1bHQgcjsKLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgci5mcmFtZV9udW1iZXIgPSByZXN1bHQuZnJhbWVOdW1iZXI7Ci0KLSAgICAvLyBSZWFkIGFuZCB2YWxpZGF0ZSB0aGUgcmVzdWx0IG1ldGFkYXRhLgotICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgcmVzdWx0TWV0YWRhdGE7Ci0gICAgcmVzID0gcmVhZE9uZUNhbWVyYU1ldGFkYXRhTG9ja2VkKAotICAgICAgICAgICAgZm1xLCByZXN1bHQuZm1xUmVzdWx0U2l6ZSwKLSAgICAgICAgICAgIHJlc3VsdE1ldGFkYXRhLCByZXN1bHQucmVzdWx0KTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEZhaWxlZCB0byByZWFkIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgci5yZXN1bHQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVzdWx0TWV0YWRhdGEuZGF0YSgpKTsKLQotICAgIC8vIFJlYWQgYW5kIHZhbGlkYXRlIHBoeXNpY2FsIGNhbWVyYSBtZXRhZGF0YQotICAgIHNpemVfdCBwaHlzUmVzdWx0Q291bnQgPSBwaHlzaWNhbENhbWVyYU1ldGFkYXRhLnNpemUoKTsKLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c0NhbUlkcyhwaHlzUmVzdWx0Q291bnQpOwotICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICo+IHBoeUNhbU1ldGFkYXRhcyhwaHlzUmVzdWx0Q291bnQpOwotICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGE+IHBoeXNSZXN1bHRNZXRhZGF0YTsKLSAgICBwaHlzUmVzdWx0TWV0YWRhdGEucmVzaXplKHBoeXNSZXN1bHRDb3VudCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbENhbWVyYU1ldGFkYXRhLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHJlcyA9IHJlYWRPbmVDYW1lcmFNZXRhZGF0YUxvY2tlZChmbXEsIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFbaV0uZm1xTWV0YWRhdGFTaXplLAotICAgICAgICAgICAgICAgIHBoeXNSZXN1bHRNZXRhZGF0YVtpXSwgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YVtpXS5tZXRhZGF0YSk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEZhaWxlZCB0byByZWFkIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIGZvciBjYW1lcmEgJXMiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YVtpXS5waHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHBoeXNDYW1JZHNbaV0gPSBwaHlzaWNhbENhbWVyYU1ldGFkYXRhW2ldLnBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKTsKLSAgICAgICAgcGh5Q2FtTWV0YWRhdGFzW2ldID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KAotICAgICAgICAgICAgICAgIHBoeXNSZXN1bHRNZXRhZGF0YVtpXS5kYXRhKCkpOwotICAgIH0KLSAgICByLm51bV9waHlzY2FtX21ldGFkYXRhID0gcGh5c1Jlc3VsdENvdW50OwotICAgIHIucGh5c2NhbV9pZHMgPSBwaHlzQ2FtSWRzLmRhdGEoKTsKLSAgICByLnBoeXNjYW1fbWV0YWRhdGEgPSBwaHlDYW1NZXRhZGF0YXMuZGF0YSgpOwotCi0gICAgc3RkOjp2ZWN0b3I8Y2FtZXJhX3N0cmVhbV9idWZmZXJfdD4gb3V0cHV0QnVmZmVycyhyZXN1bHQub3V0cHV0QnVmZmVycy5zaXplKCkpOwotICAgIHN0ZDo6dmVjdG9yPGJ1ZmZlcl9oYW5kbGVfdD4gb3V0cHV0QnVmZmVySGFuZGxlcyhyZXN1bHQub3V0cHV0QnVmZmVycy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0Lm91dHB1dEJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgYXV0byYgYkRzdCA9IG91dHB1dEJ1ZmZlcnNbaV07Ci0gICAgICAgIGNvbnN0IFN0cmVhbUJ1ZmZlciAmYlNyYyA9IHJlc3VsdC5vdXRwdXRCdWZmZXJzW2ldOwotCi0gICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IHN0YXRlcy5vdXRwdXRTdHJlYW1zLmdldChiU3JjLnN0cmVhbUlkKTsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBCdWZmZXIgJXp1OiBJbnZhbGlkIG91dHB1dCBzdHJlYW0gaWQgJWQiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgaSwgYlNyYy5zdHJlYW1JZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYkRzdC5zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7Ci0KLSAgICAgICAgYm9vbCBub0J1ZmZlclJldHVybmVkID0gZmFsc2U7Ci0gICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIHN1c3BpY2lvdXMgbW9zdCBvZiB0aGUgdGltZSBidXQgY2FuIGJlIGNvcnJlY3QgZHVyaW5nIGZsdXNoIHdoZXJlIEhBTAotICAgICAgICAgICAgLy8gaGFzIHRvIHJldHVybiBjYXB0dXJlIHJlc3VsdCBiZWZvcmUgYSBidWZmZXIgaXMgcmVxdWVzdGVkCi0gICAgICAgICAgICBpZiAoYlNyYy5idWZmZXJJZCA9PSBCVUZGRVJfSURfTk9fQlVGRkVSKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJTcmMuc3RhdHVzID09IEJ1ZmZlclN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogQnVmZmVyICV6dTogTm8gYnVmZmVySWQgZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIGJTcmMuc3RyZWFtSWQpOwotICAgICAgICAgICAgICAgICAgICAvLyBTdGlsbCBwcm9jZWVkcyBzbyBvdGhlciBidWZmZXJzIGNhbiBiZSByZXR1cm5lZAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBub0J1ZmZlclJldHVybmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChub0J1ZmZlclJldHVybmVkKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gT0s7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlcyA9IGJ1ZmZlclJlY29yZHMucG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJTcmMuYnVmZmVySWQsICZidWZmZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzID0gYnVmZmVyUmVjb3Jkcy5wb3BJbmZsaWdodEJ1ZmZlcihyZXN1bHQuZnJhbWVOdW1iZXIsIGJTcmMuc3RyZWFtSWQsICZidWZmZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogQnVmZmVyICV6dTogTm8gaW4tZmxpZ2h0IGJ1ZmZlciBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIGJTcmMuc3RyZWFtSWQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYkRzdC5idWZmZXIgPSBidWZmZXI7Ci0gICAgICAgIGJEc3Quc3RhdHVzID0gbWFwSGlkbEJ1ZmZlclN0YXR1cyhiU3JjLnN0YXR1cyk7Ci0gICAgICAgIGJEc3QuYWNxdWlyZV9mZW5jZSA9IC0xOwotICAgICAgICBpZiAoYlNyYy5yZWxlYXNlRmVuY2UgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgYkRzdC5yZWxlYXNlX2ZlbmNlID0gLTE7Ci0gICAgICAgIH0gZWxzZSBpZiAoYlNyYy5yZWxlYXNlRmVuY2UtPm51bUZkcyA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAobm9CdWZmZXJSZXR1cm5lZCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZ290IHJlbGVhc2VGZW5jZSB3aXRob3V0IG91dHB1dCBidWZmZXIhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJEc3QucmVsZWFzZV9mZW5jZSA9IGR1cChiU3JjLnJlbGVhc2VGZW5jZS0+ZGF0YVswXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnZhbGlkIHJlbGVhc2UgZmVuY2UgZm9yIGJ1ZmZlciAlenUsIGZkIGNvdW50IGlzICVkLCBub3QgMSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnJlbGVhc2VGZW5jZS0+bnVtRmRzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAgICByLm51bV9vdXRwdXRfYnVmZmVycyA9IG91dHB1dEJ1ZmZlcnMuc2l6ZSgpOwotICAgIHIub3V0cHV0X2J1ZmZlcnMgPSBvdXRwdXRCdWZmZXJzLmRhdGEoKTsKLQotICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgaW5wdXRCdWZmZXI7Ci0gICAgaWYgKHJlc3VsdC5pbnB1dEJ1ZmZlci5zdHJlYW1JZCA9PSAtMSkgewotICAgICAgICByLmlucHV0X2J1ZmZlciA9IG51bGxwdHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHN0YXRlcy5pbnB1dFN0cmVhbS0+Z2V0SWQoKSAhPSByZXN1bHQuaW5wdXRCdWZmZXIuc3RyZWFtSWQpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgaW5wdXQgc3RyZWFtIGlkICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZnJhbWVOdW1iZXIsIHJlc3VsdC5pbnB1dEJ1ZmZlci5zdHJlYW1JZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW5wdXRCdWZmZXIuc3RyZWFtID0gc3RhdGVzLmlucHV0U3RyZWFtLT5hc0hhbFN0cmVhbSgpOwotICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcjsKLSAgICAgICAgcmVzID0gYnVmZmVyUmVjb3Jkcy5wb3BJbmZsaWdodEJ1ZmZlcihyZXN1bHQuZnJhbWVOdW1iZXIsIHJlc3VsdC5pbnB1dEJ1ZmZlci5zdHJlYW1JZCwKLSAgICAgICAgICAgICAgICAmYnVmZmVyKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW5wdXQgYnVmZmVyOiBObyBpbi1mbGlnaHQgYnVmZmVyIGZvciBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgcmVzdWx0LmlucHV0QnVmZmVyLnN0cmVhbUlkKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbnB1dEJ1ZmZlci5idWZmZXIgPSBidWZmZXI7Ci0gICAgICAgIGlucHV0QnVmZmVyLnN0YXR1cyA9IG1hcEhpZGxCdWZmZXJTdGF0dXMocmVzdWx0LmlucHV0QnVmZmVyLnN0YXR1cyk7Ci0gICAgICAgIGlucHV0QnVmZmVyLmFjcXVpcmVfZmVuY2UgPSAtMTsKLSAgICAgICAgaWYgKHJlc3VsdC5pbnB1dEJ1ZmZlci5yZWxlYXNlRmVuY2UgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgaW5wdXRCdWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOwotICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5pbnB1dEJ1ZmZlci5yZWxlYXNlRmVuY2UtPm51bUZkcyA9PSAxKSB7Ci0gICAgICAgICAgICBpbnB1dEJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gZHVwKHJlc3VsdC5pbnB1dEJ1ZmZlci5yZWxlYXNlRmVuY2UtPmRhdGFbMF0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCByZWxlYXNlIGZlbmNlIGZvciBpbnB1dCBidWZmZXIsIGZkIGNvdW50IGlzICVkLCBub3QgMSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCByZXN1bHQuaW5wdXRCdWZmZXIucmVsZWFzZUZlbmNlLT5udW1GZHMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHIuaW5wdXRfYnVmZmVyID0gJmlucHV0QnVmZmVyOwotICAgIH0KLQotICAgIHIucGFydGlhbF9yZXN1bHQgPSByZXN1bHQucGFydGlhbFJlc3VsdDsKLQotICAgIHByb2Nlc3NDYXB0dXJlUmVzdWx0KHN0YXRlcywgJnIpOwotfQotCiB2b2lkIHJldHVybk91dHB1dEJ1ZmZlcnMoCiAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwKICAgICAgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyLAogICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLCBzaXplX3QgbnVtQnVmZmVycywKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgcmVxdWVzdGVkLCBuc2Vjc190IHJlcXVlc3RUaW1lTnMsCi0gICAgICAgIFNlc3Npb25TdGF0c0J1aWxkZXImIHNlc3Npb25TdGF0c0J1aWxkZXIsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKLSAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMsCisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsIGJvb2wgcmVxdWVzdGVkLAorICAgICAgICBuc2Vjc190IHJlcXVlc3RUaW1lTnMsIFNlc3Npb25TdGF0c0J1aWxkZXImIHNlc3Npb25TdGF0c0J1aWxkZXIsCisgICAgICAgIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMsCiAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJmluUmVzdWx0RXh0cmFzLAotICAgICAgICBFUlJPUl9CVUZfU1RSQVRFR1kgZXJyb3JCdWZTdHJhdGVneSkgeworICAgICAgICBFUlJPUl9CVUZfU1RSQVRFR1kgZXJyb3JCdWZTdHJhdGVneSwgaW50MzJfdCB0cmFuc2Zvcm0pIHsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQnVmZmVyczsgaSsrKQogICAgIHsKQEAgLTg4OCwxMiArNzMyLDEyIEBACiAgICAgICAgICAgICAgICAgZXJyb3JCdWZTdHJhdGVneSAhPSBFUlJPUl9CVUZfQ0FDSEUpIHsKICAgICAgICAgICAgIGlmIChpdCAhPSBvdXRwdXRTdXJmYWNlcy5lbmQoKSkgewogICAgICAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc1tpXSwgdGltZXN0YW1wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLCBpdC0+c2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc1tpXSwgdGltZXN0YW1wLCByZWFkb3V0VGltZXN0YW1wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZCwgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsIHRyYW5zZm9ybSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc1tpXSwgdGltZXN0YW1wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc1tpXSwgdGltZXN0YW1wLCByZWFkb3V0VGltZXN0YW1wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsIHRyYW5zZm9ybSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gTm90ZTogc3RyZWFtIG1heSBiZSBkZWFsbG9jYXRlZCBhdCB0aGlzIHBvaW50LCBpZiB0aGlzIGJ1ZmZlciB3YXMKQEAgLTkyMyw5ICs3NjcsOSBAQAogICAgICAgICAgICAgLy8gY2FuY2VsIHRoZSBidWZmZXIKICAgICAgICAgICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3Qgc2IgPSBvdXRwdXRCdWZmZXJzW2ldOwogICAgICAgICAgICAgc2Iuc3RhdHVzID0gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci0gICAgICAgICAgICBzdHJlYW0tPnJldHVybkJ1ZmZlcihzYiwgLyp0aW1lc3RhbXAqLzAsCisgICAgICAgICAgICBzdHJlYW0tPnJldHVybkJ1ZmZlcihzYiwgLyp0aW1lc3RhbXAqLzAsIC8qcmVhZG91dFRpbWVzdGFtcCovMCwKICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wSW5jcmVhc2luZywgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwKLSAgICAgICAgICAgICAgICAgICAgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBpblJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwgdHJhbnNmb3JtKTsKIAogICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhcyA9IGluUmVzdWx0RXh0cmFzOwpAQCAtOTQxLDE0ICs3ODUsMTUgQEAKIHZvaWQgcmV0dXJuQW5kUmVtb3ZlUGVuZGluZ091dHB1dEJ1ZmZlcnMoYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAogICAgICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIsIEluRmxpZ2h0UmVxdWVzdCYgcmVxdWVzdCwKICAgICAgICAgU2Vzc2lvblN0YXRzQnVpbGRlciYgc2Vzc2lvblN0YXRzQnVpbGRlcikgewotICAgIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9ICEocmVxdWVzdC56c2xDYXB0dXJlIHx8IHJlcXVlc3QuaGFzSW5wdXRCdWZmZXIpOworICAgIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9CisgICAgICAgICAgICAhKChyZXF1ZXN0LnpzbENhcHR1cmUgJiYgcmVxdWVzdC5zdGlsbENhcHR1cmUpIHx8IHJlcXVlc3QuaGFzSW5wdXRCdWZmZXIpOwogICAgIHJldHVybk91dHB1dEJ1ZmZlcnModXNlSGFsQnVmTWFuYWdlciwgbGlzdGVuZXIsCiAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCiAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwKLSAgICAgICAgICAgIHJlcXVlc3Quc2h1dHRlclRpbWVzdGFtcCwgLypyZXF1ZXN0ZWQqL3RydWUsCi0gICAgICAgICAgICByZXF1ZXN0LnJlcXVlc3RUaW1lTnMsIHNlc3Npb25TdGF0c0J1aWxkZXIsIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICByZXF1ZXN0LnNodXR0ZXJUaW1lc3RhbXAsIHJlcXVlc3Quc2h1dHRlclJlYWRvdXRUaW1lc3RhbXAsCisgICAgICAgICAgICAvKnJlcXVlc3RlZCovdHJ1ZSwgcmVxdWVzdC5yZXF1ZXN0VGltZU5zLCBzZXNzaW9uU3RhdHNCdWlsZGVyLCB0aW1lc3RhbXBJbmNyZWFzaW5nLAogICAgICAgICAgICAgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywgcmVxdWVzdC5yZXN1bHRFeHRyYXMsCi0gICAgICAgICAgICByZXF1ZXN0LmVycm9yQnVmU3RyYXRlZ3kpOworICAgICAgICAgICAgcmVxdWVzdC5lcnJvckJ1ZlN0cmF0ZWd5LCByZXF1ZXN0LnRyYW5zZm9ybSk7CiAKICAgICAvLyBSZW1vdmUgZXJyb3IgYnVmZmVycyB0aGF0IGFyZSBub3QgY2FjaGVkLgogICAgIGZvciAoYXV0byBpdGVyID0gcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5iZWdpbigpOwpAQCAtMTAwNyw2ICs4NTIsMTQgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgci5zaHV0dGVyVGltZXN0YW1wID0gbXNnLnRpbWVzdGFtcDsKKyAgICAgICAgICAgIHIuc2h1dHRlclJlYWRvdXRUaW1lc3RhbXAgPSBtc2cucmVhZG91dF90aW1lc3RhbXA7CisgICAgICAgICAgICBpZiAoci5taW5FeHBlY3RlZER1cmF0aW9uICE9IHN0YXRlcy5taW5GcmFtZUR1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZXMub3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBhdXRvIG91dHB1dFN0cmVhbSA9IHN0YXRlcy5vdXRwdXRTdHJlYW1zW2ldOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0tPm9uTWluRHVyYXRpb25DaGFuZ2VkKHIubWluRXhwZWN0ZWREdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXRlcy5taW5GcmFtZUR1cmF0aW9uID0gci5taW5FeHBlY3RlZER1cmF0aW9uOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHIuaGFzQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICBBTE9HVlYoIkNhbWVyYSAlczogJXM6IFNodXR0ZXIgZmlyZWQgZm9yIGZyYW1lICVkIChpZCAlZCkgYXQgJSIgUFJJZDY0LAogICAgICAgICAgICAgICAgICAgICBzdGF0ZXMuY2FtZXJhSWQuc3RyaW5nKCksIF9fRlVOQ1RJT05fXywKQEAgLTExNjQsMjg5ICsxMDE3LDYgQEAKICAgICB9CiB9CiAKLXZvaWQgbm90aWZ5KENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpOb3RpZnlNc2cmIG1zZykgewotICAgIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6TXNnVHlwZTsKLSAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkVycm9yQ29kZTsKLQotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgY2FtZXJhX25vdGlmeV9tc2cgbTsKLSAgICBzd2l0Y2ggKG1zZy50eXBlKSB7Ci0gICAgICAgIGNhc2UgTXNnVHlwZTo6RVJST1I6Ci0gICAgICAgICAgICBtLnR5cGUgPSBDQU1FUkFfTVNHX0VSUk9SOwotICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciA9IG1zZy5tc2cuZXJyb3IuZnJhbWVOdW1iZXI7Ci0gICAgICAgICAgICBpZiAobXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkID49IDApIHsKLSAgICAgICAgICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzLm91dHB1dFN0cmVhbXMuZ2V0KG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgZXJyb3Igc3RyZWFtIGlkICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIsIG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IG51bGxwdHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy5tc2cuZXJyb3IuZXJyb3JDb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkVSUk9SX0RFVklDRToKLSAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX0RFVklDRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkVSUk9SX1JFUVVFU1Q6Ci0gICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gQ0FNRVJBX01TR19FUlJPUl9SRVFVRVNUOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6RVJST1JfUkVTVUxUOgotICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQV9NU0dfRVJST1JfUkVTVUxUOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6RVJST1JfQlVGRkVSOgotICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQV9NU0dfRVJST1JfQlVGRkVSOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1zZ1R5cGU6OlNIVVRURVI6Ci0gICAgICAgICAgICBtLnR5cGUgPSBDQU1FUkFfTVNHX1NIVVRURVI7Ci0gICAgICAgICAgICBtLm1lc3NhZ2Uuc2h1dHRlci5mcmFtZV9udW1iZXIgPSBtc2cubXNnLnNodXR0ZXIuZnJhbWVOdW1iZXI7Ci0gICAgICAgICAgICBtLm1lc3NhZ2Uuc2h1dHRlci50aW1lc3RhbXAgPSBtc2cubXNnLnNodXR0ZXIudGltZXN0YW1wOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG5vdGlmeShzdGF0ZXMsICZtKTsKLX0KLQotdm9pZCByZXF1ZXN0U3RyZWFtQnVmZmVycyhSZXF1ZXN0QnVmZmVyU3RhdGVzJiBzdGF0ZXMsCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAotICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjazo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IgX2hpZGxfY2IpIHsKLSAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1czsKLSAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcjsKLSAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3RTdGF0dXM7Ci0gICAgdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJSZXQ7Ci0gICAgdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I7Ci0KLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzdGF0ZXMucmVxQnVmZmVyTG9jayk7Ci0KLSAgICBoYXJkd2FyZTo6aGlkbF92ZWM8U3RyZWFtQnVmZmVyUmV0PiBidWZSZXRzOwotICAgIGlmICghc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXMgZG9lcyBub3Qgc3VwcG9ydCBIQUwgYnVmZmVyIG1hbmFnZW1lbnQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RhdGVzLmNhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBidWZSZXRzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBzdHJlYW1JZHM7Ci0gICAgc3NpemVfdCBzeiA9IHN0cmVhbUlkcy5zZXRDYXBhY2l0eShidWZSZXFzLnNpemUoKSk7Ci0gICAgaWYgKHN6IDwgMCB8fCBzdGF0aWNfY2FzdDxzaXplX3Q+KHN6KSAhPSBidWZSZXFzLnNpemUoKSkgewotICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICV6dSBidWZmZXIgcmVxdWVzdHMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxcy5zaXplKCkpOwotICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGJ1ZlJldHMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGJ1ZlJlcXMuc2l6ZSgpID4gc3RhdGVzLm91dHB1dFN0cmVhbXMuc2l6ZSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogdG9vIG1hbnkgYnVmZmVyIHJlcXVlc3RzICglenUgPiAjIG9mIG91dHB1dCBzdHJlYW1zICV6dSkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxcy5zaXplKCksIHN0YXRlcy5vdXRwdXRTdHJlYW1zLnNpemUoKSk7Ci0gICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgYnVmUmV0cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBmb3IgcmVwZWF0ZWQgc3RyZWFtSWQKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGJ1ZlJlcSA6IGJ1ZlJlcXMpIHsKLSAgICAgICAgaWYgKHN0cmVhbUlkcy5pbmRleE9mKGJ1ZlJlcS5zdHJlYW1JZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkIGFwcGVhciBtdWx0aXBsZSB0aW1lcyBpbiBidWZmZXIgcmVxdWVzdHMiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlJlcS5zdHJlYW1JZCk7Ci0gICAgICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGJ1ZlJldHMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN0cmVhbUlkcy5hZGQoYnVmUmVxLnN0cmVhbUlkKTsKLSAgICB9Ci0KLSAgICBpZiAoIXN0YXRlcy5yZXFCdWZmZXJJbnRmLnN0YXJ0UmVxdWVzdEJ1ZmZlcigpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogcmVxdWVzdCBidWZmZXIgZGlzYWxsb3dlZCB3aGlsZSBjYW1lcmEgc2VydmljZSBpcyBjb25maWd1cmluZyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0NPTkZJR1VSSU5HLCBidWZSZXRzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJ1ZlJldHMucmVzaXplKGJ1ZlJlcXMuc2l6ZSgpKTsKLQotICAgIGJvb2wgYWxsUmVxc1N1Y2NlZWRzID0gdHJ1ZTsKLSAgICBib29sIG9uZVJlcVN1Y2NlZWRzID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZSZXFzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IGF1dG8mIGJ1ZlJlcSA9IGJ1ZlJlcXNbaV07Ci0gICAgICAgIGF1dG8mIGJ1ZlJldCA9IGJ1ZlJldHNbaV07Ci0gICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBidWZSZXEuc3RyZWFtSWQ7Ci0gICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9IHN0YXRlcy5vdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7Ci0gICAgICAgIGlmIChvdXRwdXRTdHJlYW0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBPdXRwdXQgc3RyZWFtIGlkICVkIG5vdCBmb3VuZCEiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKLSAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxTdHJlYW1CdWZmZXJSZXQ+IGVtcHR5QnVmUmV0czsKLSAgICAgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgZW1wdHlCdWZSZXRzKTsKLSAgICAgICAgICAgIHN0YXRlcy5yZXFCdWZmZXJJbnRmLmVuZFJlcXVlc3RCdWZmZXIoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZlJldC5zdHJlYW1JZCA9IHN0cmVhbUlkOwotICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0FiYW5kb25lZCgpKSB7Ci0gICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBhbGxSZXFzU3VjY2VlZHMgPSBmYWxzZTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGhhbmRPdXRCdWZmZXJDb3VudCA9IG91dHB1dFN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKTsKLSAgICAgICAgdWludDMyX3QgbnVtQnVmZmVyc1JlcXVlc3RlZCA9IGJ1ZlJlcS5udW1CdWZmZXJzUmVxdWVzdGVkOwotICAgICAgICBzaXplX3QgdG90YWxIYW5kb3V0ID0gaGFuZE91dEJ1ZmZlckNvdW50ICsgbnVtQnVmZmVyc1JlcXVlc3RlZDsKLSAgICAgICAgdWludDMyX3QgbWF4QnVmZmVycyA9IG91dHB1dFN0cmVhbS0+YXNIYWxTdHJlYW0oKS0+bWF4X2J1ZmZlcnM7Ci0gICAgICAgIGlmICh0b3RhbEhhbmRvdXQgPiBtYXhCdWZmZXJzKSB7Ci0gICAgICAgICAgICAvLyBOb3QgYWJsZSB0byBhbGxvY2F0ZSBlbm91Z2ggYnVmZmVyLiBFeGl0IGVhcmx5IGZvciB0aGlzIHN0cmVhbQotICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRvbyBtdWNoIGJ1ZmZlcnMgZm9yIHN0cmVhbSAlZDogYXQgSEFMOiAlenUgKyByZXF1ZXN0aW5nOiAlZCIKLSAgICAgICAgICAgICAgICAgICAgIiA+IG1heDogJWQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBoYW5kT3V0QnVmZmVyQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNSZXF1ZXN0ZWQsIG1heEJ1ZmZlcnMpOwotICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6Ok1BWF9CVUZGRVJfRVhDRUVERUQpOwotICAgICAgICAgICAgYWxsUmVxc1N1Y2NlZWRzID0gZmFsc2U7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxTdHJlYW1CdWZmZXI+IHRtcFJldEJ1ZmZlcnMobnVtQnVmZmVyc1JlcXVlc3RlZCk7Ci0gICAgICAgIGJvb2wgY3VycmVudFJlcVN1Y2NlZWRzID0gdHJ1ZTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhX3N0cmVhbV9idWZmZXJfdD4gc3RyZWFtQnVmZmVycyhudW1CdWZmZXJzUmVxdWVzdGVkKTsKLSAgICAgICAgc2l6ZV90IG51bUFsbG9jYXRlZEJ1ZmZlcnMgPSAwOwotICAgICAgICBzaXplX3QgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgYiA9IDA7IGIgPCBudW1CdWZmZXJzUmVxdWVzdGVkOyBiKyspIHsKLSAgICAgICAgICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QmIHNiID0gc3RyZWFtQnVmZmVyc1tiXTsKLSAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgbWV0aG9kIGNhbiBydW4gY29uY3VycmVudGx5IHdpdGggcmVxdWVzdCB0aHJlYWQKLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSB3YWl0IGR1cmF0aW9uIGV2ZXJ5dGltZSB3ZSBjYWxsIGdldGJ1ZmZlcgotICAgICAgICAgICAgbnNlY3NfdCB3YWl0RHVyYXRpb24gPSAgc3RhdGVzLnJlcUJ1ZmZlckludGYuZ2V0V2FpdER1cmF0aW9uKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBvdXRwdXRTdHJlYW0tPmdldEJ1ZmZlcigmc2IsIHdhaXREdXJhdGlvbik7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBOT19JTklUIHx8IHJlcyA9PSBERUFEX09CSkVDVCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyLnN0b3BDb3VudGVyKHN0cmVhbUlkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCB8fCByZXMgPT0gTk9fTUVNT1JZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6Tk9fQlVGRkVSX0FWQUlMQUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6VU5LTk9XTl9FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VycmVudFJlcVN1Y2NlZWRzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBudW1BbGxvY2F0ZWRCdWZmZXJzKys7Ci0KLSAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyID0gc2IuYnVmZmVyOwotICAgICAgICAgICAgYXV0byBwYWlyID0gc3RhdGVzLmJ1ZmZlclJlY29yZHNJbnRmLmdldEJ1ZmZlcklkKCpidWZmZXIsIHN0cmVhbUlkKTsKLSAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OwotICAgICAgICAgICAgdWludDY0X3QgYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKLSAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciYgaEJ1ZiA9IHRtcFJldEJ1ZmZlcnNbYl07Ci0KLSAgICAgICAgICAgIGhCdWYuc3RyZWFtSWQgPSBzdHJlYW1JZDsKLSAgICAgICAgICAgIGhCdWYuYnVmZmVySWQgPSBidWZmZXJJZDsKLSAgICAgICAgICAgIGhCdWYuYnVmZmVyID0gKGlzTmV3QnVmZmVyKSA/ICpidWZmZXIgOiBudWxscHRyOwotICAgICAgICAgICAgaEJ1Zi5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOwotICAgICAgICAgICAgaEJ1Zi5yZWxlYXNlRmVuY2UgPSBudWxscHRyOwotCi0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICBpZiAoc2IuYWNxdWlyZV9mZW5jZSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc2IuYWNxdWlyZV9mZW5jZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhCdWYuYWNxdWlyZUZlbmNlLnNldFRvKGFjcXVpcmVGZW5jZSwgLypzaG91bGRPd24qL3RydWUpOwotICAgICAgICAgICAgaEJ1Zi5yZWxlYXNlRmVuY2UgPSBudWxscHRyOwotCi0gICAgICAgICAgICByZXMgPSBzdGF0ZXMuYnVmZmVyUmVjb3Jkc0ludGYucHVzaEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihidWZmZXJJZCwgYnVmZmVyLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBnZXQgcmVnaXN0ZXIgcmVxdWVzdCBidWZmZXJzIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlVOS05PV05fRVJST1IpOwotICAgICAgICAgICAgICAgIGN1cnJlbnRSZXFTdWNjZWVkcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnRSZXFTdWNjZWVkcykgewotICAgICAgICAgICAgYnVmUmV0LnZhbC5idWZmZXJzKHN0ZDo6bW92ZSh0bXBSZXRCdWZmZXJzKSk7Ci0gICAgICAgICAgICBvbmVSZXFTdWNjZWVkcyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhbGxSZXFzU3VjY2VlZHMgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzOyBiKyspIHsKLSAgICAgICAgICAgICAgICBTdHJlYW1CdWZmZXImIGhCdWYgPSB0bXBSZXRCdWZmZXJzW2JdOwotICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyOwotICAgICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IHN0YXRlcy5idWZmZXJSZWNvcmRzSW50Zi5wb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBoQnVmLmJ1ZmZlcklkLCAmYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIiVzOiBwb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIgZmFpbGVkIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgbnVtQWxsb2NhdGVkQnVmZmVyczsgYisrKSB7Ci0gICAgICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCYgc2IgPSBzdHJlYW1CdWZmZXJzW2JdOwotICAgICAgICAgICAgICAgIHNiLmFjcXVpcmVfZmVuY2UgPSAtMTsKLSAgICAgICAgICAgICAgICBzYi5zdGF0dXMgPSBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIsIC8qbGlzdGVuZXIqL251bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbUJ1ZmZlcnMuZGF0YSgpLCBudW1BbGxvY2F0ZWRCdWZmZXJzLCAwLCAvKnJlcXVlc3RlZCovZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIC8qcmVxdWVzdFRpbWVOcyovMCwgc3RhdGVzLnNlc3Npb25TdGF0c0J1aWxkZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgX2hpZGxfY2IoYWxsUmVxc1N1Y2NlZWRzID8gQnVmZmVyUmVxdWVzdFN0YXR1czo6T0sgOgotICAgICAgICAgICAgb25lUmVxU3VjY2VlZHMgPyBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfUEFSVElBTCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9VTktOT1dOLAotICAgICAgICAgICAgYnVmUmV0cyk7Ci0gICAgc3RhdGVzLnJlcUJ1ZmZlckludGYuZW5kUmVxdWVzdEJ1ZmZlcigpOwotfQotCi12b2lkIHJldHVyblN0cmVhbUJ1ZmZlcnMoUmV0dXJuQnVmZmVyU3RhdGVzJiBzdGF0ZXMsCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKLSAgICBpZiAoIXN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzIGRvZXMgbm90IHN1cHBvcnQgSEFMIGJ1ZmZlciBtYW5hZ2VybWVudCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0ZXMuY2FtZXJhSWQuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChjb25zdCBhdXRvJiBidWYgOiBidWZmZXJzKSB7Ci0gICAgICAgIGlmIChidWYuYnVmZmVySWQgPT0gQlVGRkVSX0lEX05PX0JVRkZFUikgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgcmV0dXJuIGEgYnVmZmVyIHdpdGhvdXQgYnVmZmVySWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcjsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RhdGVzLmJ1ZmZlclJlY29yZHNJbnRmLnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihidWYuYnVmZmVySWQsICZidWZmZXIpOwotCi0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGZpbmQgaW4tZmxpZ2h0IGJ1ZmZlciAlIiBQUkl1NjQgIiBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWYuYnVmZmVySWQsIGJ1Zi5zdHJlYW1JZCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3Qgc3RyZWFtQnVmZmVyOwotICAgICAgICBzdHJlYW1CdWZmZXIuYnVmZmVyID0gYnVmZmVyOwotICAgICAgICBzdHJlYW1CdWZmZXIuc3RhdHVzID0gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci0gICAgICAgIHN0cmVhbUJ1ZmZlci5hY3F1aXJlX2ZlbmNlID0gLTE7Ci0gICAgICAgIHN0cmVhbUJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7Ci0KLSAgICAgICAgaWYgKGJ1Zi5yZWxlYXNlRmVuY2UgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSAtMTsKLSAgICAgICAgfSBlbHNlIGlmIChidWYucmVsZWFzZUZlbmNlLT5udW1GZHMgPT0gMSkgewotICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSBkdXAoYnVmLnJlbGVhc2VGZW5jZS0+ZGF0YVswXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcmVsZWFzZSBmZW5jZSwgZmQgY291bnQgaXMgJWQsIG5vdCAxIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWYucmVsZWFzZUZlbmNlLT5udW1GZHMpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBzdGF0ZXMub3V0cHV0U3RyZWFtcy5nZXQoYnVmLnN0cmVhbUlkKTsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IE91dHB1dCBzdHJlYW0gaWQgJWQgbm90IGZvdW5kISIsIF9fRlVOQ1RJT05fXywgYnVmLnN0cmVhbUlkKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN0cmVhbUJ1ZmZlci5zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7Ci0gICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIsIC8qbGlzdGVuZXIqL251bGxwdHIsCi0gICAgICAgICAgICAgICAgJnN0cmVhbUJ1ZmZlciwgLypzaXplKi8xLCAvKnRpbWVzdGFtcCovIDAsIC8qcmVxdWVzdGVkKi9mYWxzZSwKLSAgICAgICAgICAgICAgICAvKnJlcXVlc3RUaW1lTnMqLzAsIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyKTsKLSAgICB9Ci19Ci0KIHZvaWQgZmx1c2hJbmZsaWdodFJlcXVlc3RzKEZsdXNoSW5mbGlnaHRSZXFTdGF0ZXMmIHN0YXRlcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgeyAvLyBGaXJzdCByZXR1cm4gYnVmZmVycyBjYWNoZWQgaW4gaW5GbGlnaHRNYXAKQEAgLTE0NTYsOSArMTAyNiwxMCBAQAogICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycygKICAgICAgICAgICAgICAgICBzdGF0ZXMudXNlSGFsQnVmTWFuYWdlciwgc3RhdGVzLmxpc3RlbmVyLAogICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCwgLypyZXF1ZXN0ZWQqL3RydWUsCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0VGltZU5zLCBzdGF0ZXMuc2Vzc2lvblN0YXRzQnVpbGRlciwgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLAotICAgICAgICAgICAgICAgIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsIHJlcXVlc3QucmVzdWx0RXh0cmFzLCByZXF1ZXN0LmVycm9yQnVmU3RyYXRlZ3kpOworICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAvKnRpbWVzdGFtcCovMCwgLypyZWFkb3V0VGltZXN0YW1wKi8wLAorICAgICAgICAgICAgICAgIC8qcmVxdWVzdGVkKi90cnVlLCByZXF1ZXN0LnJlcXVlc3RUaW1lTnMsIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyLAorICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywgcmVxdWVzdC5yZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgcmVxdWVzdC5lcnJvckJ1ZlN0cmF0ZWd5KTsKICAgICAgICAgICAgIEFMT0dXKCIlczogRnJhbWUgJWQgfCAgVGltZXN0YW1wOiAlIiBQUklkNjQgIiwgbWV0YWRhdGEiCiAgICAgICAgICAgICAgICAgICAgICIgYXJyaXZlZDogJXMsIGJ1ZmZlcnMgbGVmdDogJWQuXG4iLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlcy5pbmZsaWdodE1hcC5rZXlBdChpZHgpLCByZXF1ZXN0LnNodXR0ZXJUaW1lc3RhbXAsCkBAIC0xNTMwLDcgKzExMDEsNyBAQAogICAgICAgICAgICAgICAgIHN3aXRjaCAoaGFsU3RyZWFtLT5zdHJlYW1fdHlwZSkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fT1VUUFVUOgogICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoc3RyZWFtQnVmZmVyLCAvKnRpbWVzdGFtcCovIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyZWFkb3V0VGltZXN0YW1wKi8wLCAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IHJldHVybiBvdXRwdXQgYnVmZmVyIGZvciBmcmFtZSAlZCB0byIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5oCmluZGV4IDE0Mjg4OWEuLmQ2MTA3YzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuaApAQCAtMzgsNzAgKzM4LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyBSZXN1bHRNZXRhZGF0YVF1ZXVlID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47Ci0KIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAotICAgIHR5cGVkZWYgc3RydWN0IGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiB7Ci0gICAgICAgIHVpbnQzMl90IG51bV9zdHJlYW1zOwotICAgICAgICBjYW1lcmFfc3RyZWFtX3QgKipzdHJlYW1zOwotICAgICAgICB1aW50MzJfdCBvcGVyYXRpb25fbW9kZTsKLSAgICAgICAgYm9vbCBpbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uOwotICAgIH0gY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX3Q7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdCBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0IHsKLSAgICAgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyOwotICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc2V0dGluZ3M7Ci0gICAgICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKmlucHV0X2J1ZmZlcjsKLSAgICAgICAgdWludDMyX3QgbnVtX291dHB1dF9idWZmZXJzOwotICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRfYnVmZmVyczsKLSAgICAgICAgdWludDMyX3QgbnVtX3BoeXNjYW1fc2V0dGluZ3M7Ci0gICAgICAgIGNvbnN0IGNoYXIgKipwaHlzY2FtX2lkOwotICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqKnBoeXNjYW1fc2V0dGluZ3M7Ci0gICAgICAgIGludDMyX3QgaW5wdXRfd2lkdGg7Ci0gICAgICAgIGludDMyX3QgaW5wdXRfaGVpZ2h0OwotICAgIH0gY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90OwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QgY2FtZXJhX2NhcHR1cmVfcmVzdWx0IHsKLSAgICAgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyOwotICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmVzdWx0OwotICAgICAgICB1aW50MzJfdCBudW1fb3V0cHV0X2J1ZmZlcnM7Ci0gICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKm91dHB1dF9idWZmZXJzOwotICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICppbnB1dF9idWZmZXI7Ci0gICAgICAgIHVpbnQzMl90IHBhcnRpYWxfcmVzdWx0OwotICAgICAgICB1aW50MzJfdCBudW1fcGh5c2NhbV9tZXRhZGF0YTsKLSAgICAgICAgY29uc3QgY2hhciAqKnBoeXNjYW1faWRzOwotICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqKnBoeXNjYW1fbWV0YWRhdGE7Ci0gICAgfSBjYW1lcmFfY2FwdHVyZV9yZXN1bHRfdDsKLQotICAgIHR5cGVkZWYgc3RydWN0IGNhbWVyYV9zaHV0dGVyX21zZyB7Ci0gICAgICAgIHVpbnQzMl90IGZyYW1lX251bWJlcjsKLSAgICAgICAgdWludDY0X3QgdGltZXN0YW1wOwotICAgIH0gY2FtZXJhX3NodXR0ZXJfbXNnX3Q7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdCBjYW1lcmFfZXJyb3JfbXNnIHsKLSAgICAgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyOwotICAgICAgICBjYW1lcmFfc3RyZWFtX3QgKmVycm9yX3N0cmVhbTsKLSAgICAgICAgaW50IGVycm9yX2NvZGU7Ci0gICAgfSBjYW1lcmFfZXJyb3JfbXNnX3Q7Ci0KLSAgICB0eXBlZGVmIGVudW0gY2FtZXJhX2Vycm9yX21zZ19jb2RlIHsKLSAgICAgICAgQ0FNRVJBX01TR19FUlJPUl9ERVZJQ0UgPSAxLAotICAgICAgICBDQU1FUkFfTVNHX0VSUk9SX1JFUVVFU1QgPSAyLAotICAgICAgICBDQU1FUkFfTVNHX0VSUk9SX1JFU1VMVCA9IDMsCi0gICAgICAgIENBTUVSQV9NU0dfRVJST1JfQlVGRkVSID0gNCwKLSAgICAgICAgQ0FNRVJBX01TR19OVU1fRVJST1JTCi0gICAgfSBjYW1lcmFfZXJyb3JfbXNnX2NvZGVfdDsKLQotICAgIHR5cGVkZWYgc3RydWN0IGNhbWVyYV9ub3RpZnlfbXNnIHsKLSAgICAgICAgaW50IHR5cGU7Ci0KLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgY2FtZXJhX2Vycm9yX21zZ190IGVycm9yOwotICAgICAgICAgICAgY2FtZXJhX3NodXR0ZXJfbXNnX3Qgc2h1dHRlcjsKLSAgICAgICAgfSBtZXNzYWdlOwotICAgIH0gY2FtZXJhX25vdGlmeV9tc2dfdDsKLQogICAgIC8qKgogICAgICAqIEhlbHBlciBtZXRob2RzIHNoYXJlZCBiZXR3ZWVuIENhbWVyYTNEZXZpY2UvQ2FtZXJhM09mZmxpbmVTZXNzaW9uIGZvciBIQUwgY2FsbGJhY2tzCiAgICAgICovCkBAIC0xMTIsMTMgKzUwLDE1IEBACiAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCiAgICAgICAgICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIsIC8vIE9ubHkgbmVlZGVkIHdoZW4gb3V0cHV0U3VyZmFjZXMgaXMgbm90IGVtcHR5CiAgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLAotICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnMsIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHJlcXVlc3RlZCwgbnNlY3NfdCByZXF1ZXN0VGltZU5zLAorICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnMsIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLCBib29sIHJlcXVlc3RlZCwgbnNlY3NfdCByZXF1ZXN0VGltZU5zLAogICAgICAgICAgICAgU2Vzc2lvblN0YXRzQnVpbGRlciYgc2Vzc2lvblN0YXRzQnVpbGRlciwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gdHJ1ZSwKICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZSBvbmx5IG1lYW50IGZvciBzdXJmYWNlIHNoYXJpbmcgdXNlIGNhc2UKICAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzID0gU3VyZmFjZU1hcHt9LAogICAgICAgICAgICAgLy8gVXNlZCB0byBzZW5kIGJ1ZmZlciBlcnJvciBjYWxsYmFjayB3aGVuIGZhaWxpbmcgdG8gcmV0dXJuIGJ1ZmZlcgogICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzID0gQ2FwdHVyZVJlc3VsdEV4dHJhc3t9LAotICAgICAgICAgICAgRVJST1JfQlVGX1NUUkFURUdZIGVycm9yQnVmU3RyYXRlZ3kgPSBFUlJPUl9CVUZfUkVUVVJOKTsKKyAgICAgICAgICAgIEVSUk9SX0JVRl9TVFJBVEVHWSBlcnJvckJ1ZlN0cmF0ZWd5ID0gRVJST1JfQlVGX1JFVFVSTiwKKyAgICAgICAgICAgIGludDMyX3QgdHJhbnNmb3JtID0gLTEpOwogCiAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgb3V0cHV0IGJ1ZmZlcnMgdG8gb3V0cHV0IHN0cmVhbXMsIGFuZAogICAgIC8vIHJlbW92ZSB0aGUgcmV0dXJuZWQgYnVmZmVycyBmcm9tIHRoZSBpbmZsaWdodCByZXF1ZXN0J3MgcGVuZGluZyBidWZmZXJzCkBAIC0xNTMsNyArOTMsNiBAQAogICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB2ZW5kb3JUYWdJZDsKICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGRldmljZUluZm87CiAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+JiBwaHlzaWNhbERldmljZUluZm9NYXA7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiYgZm1xOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGNhbWVyYTM6OkRpc3RvcnRpb25NYXBwZXI+JiBkaXN0b3J0aW9uTWFwcGVyczsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBjYW1lcmEzOjpab29tUmF0aW9NYXBwZXI+JiB6b29tUmF0aW9NYXBwZXJzOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGNhbWVyYTM6OlJvdGF0ZUFuZENyb3BNYXBwZXI+JiByb3RhdGVBbmRDcm9wTWFwcGVyczsKQEAgLTE2NSwxOSArMTA0LDEyIEBACiAgICAgICAgIFNldEVycm9ySW50ZXJmYWNlJiBzZXRFcnJJbnRmOwogICAgICAgICBJbmZsaWdodFJlcXVlc3RVcGRhdGVJbnRlcmZhY2UmIGluZmxpZ2h0SW50ZjsKICAgICAgICAgQnVmZmVyUmVjb3Jkc0ludGVyZmFjZSYgYnVmZmVyUmVjb3Jkc0ludGY7CisgICAgICAgIGJvb2wgbGVnYWN5Q2xpZW50OworICAgICAgICBuc2Vjc190JiBtaW5GcmFtZUR1cmF0aW9uOwogICAgIH07CiAKLSAgICAvLyBIYW5kbGUgb25lIGNhcHR1cmUgcmVzdWx0LiBBc3N1bWUgY2FsbGVycyBob2xkIHRoZSBsb2NrIHRvIHNlcmlhbGl6ZSBhbGwKLSAgICAvLyBwcm9jZXNzQ2FwdHVyZVJlc3VsdCBjYWxscwotICAgIHZvaWQgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoCi0gICAgICAgICAgICBDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQmIHJlc3VsdCwKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiBwaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKLQotICAgIC8vIEhhbmRsZSBvbmUgbm90aWZ5IG1lc3NhZ2UKLSAgICB2b2lkIG5vdGlmeShDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZyYgbXNnKTsKKyAgICB2b2lkIHByb2Nlc3NDYXB0dXJlUmVzdWx0KENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywgY29uc3QgY2FtZXJhX2NhcHR1cmVfcmVzdWx0ICpyZXN1bHQpOworICAgIHZvaWQgbm90aWZ5KENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywgY29uc3QgY2FtZXJhX25vdGlmeV9tc2cgKm1zZyk7CiAKICAgICBzdHJ1Y3QgUmVxdWVzdEJ1ZmZlclN0YXRlcyB7CiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkOwpAQCAtMTkwLDEwICsxMjIsNiBAQAogICAgICAgICBSZXF1ZXN0QnVmZmVySW50ZXJmYWNlJiByZXFCdWZmZXJJbnRmOwogICAgIH07CiAKLSAgICB2b2lkIHJlcXVlc3RTdHJlYW1CdWZmZXJzKFJlcXVlc3RCdWZmZXJTdGF0ZXMmIHN0YXRlcywKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s6OnJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKTsKLQogICAgIHN0cnVjdCBSZXR1cm5CdWZmZXJTdGF0ZXMgewogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZDsKICAgICAgICAgY29uc3QgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyOwpAQCAtMjAyLDkgKzEzMCw2IEBACiAgICAgICAgIEJ1ZmZlclJlY29yZHNJbnRlcmZhY2UmIGJ1ZmZlclJlY29yZHNJbnRmOwogICAgIH07CiAKLSAgICB2b2lkIHJldHVyblN0cmVhbUJ1ZmZlcnMoUmV0dXJuQnVmZmVyU3RhdGVzJiBzdGF0ZXMsCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKTsKLQogICAgIHN0cnVjdCBGbHVzaEluZmxpZ2h0UmVxU3RhdGVzIHsKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQ7CiAgICAgICAgIHN0ZDo6bXV0ZXgmIGluZmxpZ2h0TG9jazsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzVGVtcGxhdGVkLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlsc1RlbXBsYXRlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMDVkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlsc1RlbXBsYXRlZC5oCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19PVVRQVVRfVEVNUExVVElMU19ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX09VVFBVVF9URU1QTFVUSUxTX0gKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NvbW1vbi9OYXRpdmVIYW5kbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvSUNhbWVyYURldmljZVNlc3Npb24uaD4KKworI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFVdGlscy5oPgorI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KKworI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmgiCisKKyNpbmNsdWRlICJzeXN0ZW0vY2FtZXJhX21ldGFkYXRhLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKwordGVtcGxhdGUgPGNsYXNzIEJ1ZmZlclN0YXR1c1R5cGU+CitjYW1lcmFfYnVmZmVyX3N0YXR1c190IG1hcEJ1ZmZlclN0YXR1cyhCdWZmZXJTdGF0dXNUeXBlIHN0YXR1cykgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzVHlwZTo6T0s6IHJldHVybiBDQU1FUkFfQlVGRkVSX1NUQVRVU19PSzsKKyAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXNUeXBlOjpFUlJPUjogcmV0dXJuIENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7Cit9CisKK2lubGluZSB2b2lkIHJlYWRCdWZmZXJGcm9tVmVjKGhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiAmZHN0LAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gJnNyYykgeworICAgIC8vIE5vdCBjbG9uaW5nIGhlcmUgc2luY2UgdGhhdCB3aWxsIGJlIGRvbmUgaW4gcHJvY2Vzc0NhcHR1cmVSZXN1bHQgd2hpbAorICAgIC8vIGFzc2lnbmluZyB0byBDYW1lcmFNZXRhZGF0YS4KKyAgICBkc3Quc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4oc3JjLmRhdGEoKSksIHNyYy5zaXplKCkpOworfQorCitpbmxpbmUgdm9pZCByZWFkQnVmZmVyRnJvbVZlYyhzdGQ6OnZlY3Rvcjx1aW50OF90PiAmZHN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmc3JjKSB7CisgICAgZHN0ID0gc3JjOworfQorCisvLyBSZWFkaW5nIG9uZSBjYW1lcmEgbWV0YWRhdGEgZnJvbSByZXN1bHQgYXJndW1lbnQgdmlhIGZtcSBvciBmcm9tIHRoZSByZXN1bHQKKy8vIEFzc3VtaW5nIHRoZSBmbXEgaXMgcHJvdGVjdGVkIGJ5IGEgbG9jayBhbHJlYWR5Cit0ZW1wbGF0ZSA8Y2xhc3MgRm1xVHlwZSwgY2xhc3MgRm1xUGF5bG9hZFR5cGUsIGNsYXNzIE1ldGFkYXRhVHlwZT4KK3N0YXR1c190IHJlYWRPbmVDYW1lcmFNZXRhZGF0YUxvY2tlZFQoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxGbXFUeXBlPiYgZm1xLAorICAgICAgICB1aW50NjRfdCBmbXFSZXN1bHRTaXplLAorICAgICAgICBNZXRhZGF0YVR5cGUmIHJlc3VsdE1ldGFkYXRhLAorICAgICAgICBjb25zdCBNZXRhZGF0YVR5cGUmIHJlc3VsdCkgeworICAgIGlmIChmbXFSZXN1bHRTaXplID4gMCkgeworICAgICAgICByZXN1bHRNZXRhZGF0YS5yZXNpemUoZm1xUmVzdWx0U2l6ZSk7CisgICAgICAgIGlmIChmbXEgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsgLy8gbG9nZ2VkIGluIGluaXRpYWxpemUoKQorICAgICAgICB9CisgICAgICAgIGlmICghZm1xLT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Rm1xUGF5bG9hZFR5cGUgKj4ocmVzdWx0TWV0YWRhdGEuZGF0YSgpKSwgZm1xUmVzdWx0U2l6ZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IHJlYWQgY2FtZXJhIG1ldGFkYXRhIGZyb20gZm1xLCBzaXplID0gJSIgUFJJdTY0LAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZtcVJlc3VsdFNpemUpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVhZEJ1ZmZlckZyb21WZWMocmVzdWx0TWV0YWRhdGEsIHJlc3VsdCk7CisgICAgfQorCisgICAgaWYgKHJlc3VsdE1ldGFkYXRhLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHN0YXR1c190IHJlczsKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIG1ldGFkYXRhID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVzdWx0TWV0YWRhdGEuZGF0YSgpKTsKKyAgICAgICAgc2l6ZV90IGV4cGVjdGVkX21ldGFkYXRhX3NpemUgPSByZXN1bHRNZXRhZGF0YS5zaXplKCk7CisgICAgICAgIGlmICgocmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShtZXRhZGF0YSwgJmV4cGVjdGVkX21ldGFkYXRhX3NpemUpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBieSBjYW1lcmEgc2VydmljZSBmcm9tIEhBTDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2lubGluZSBib29sIGlzSGFuZGxlTnVsbChjb25zdCBoYXJkd2FyZTo6aGlkbF9oYW5kbGUgJmhhbmRsZSkgeworICAgIHJldHVybiBoYW5kbGUgPT0gbnVsbHB0cjsKK30KKworaW5saW5lIGJvb2wgaXNIYW5kbGVOdWxsKGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSAmaGFuZGxlKSB7CisgICAgcmV0dXJuIChoYW5kbGUuZmRzLnNpemUoKSA9PSAwKSAmJiAoaGFuZGxlLmludHMuc2l6ZSgpID09IDApOworfQorCitpbmxpbmUgc2l6ZV90IG51bUZkc0luSGFuZGxlKGNvbnN0IGhhcmR3YXJlOjpoaWRsX2hhbmRsZSAmaGFuZGxlKSB7CisgICAgcmV0dXJuIGhhbmRsZS0+bnVtRmRzOworfQorCitpbmxpbmUgc2l6ZV90IG51bUZkc0luSGFuZGxlKGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSAmaGFuZGxlKSB7CisgICAgcmV0dXJuIGhhbmRsZS5mZHMuc2l6ZSgpOworfQorCitpbmxpbmUgaW50MzJfdCBnZXRIYW5kbGVGaXJzdEZkKGNvbnN0IGhhcmR3YXJlOjpoaWRsX2hhbmRsZSAmaGFuZGxlKSB7CisgICAgaWYgKGhhbmRsZS0+bnVtRmRzICE9IDEpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaGFuZGxlLT5kYXRhWzBdOworfQorCitpbmxpbmUgaW50MzJfdCBnZXRIYW5kbGVGaXJzdEZkKGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSAmaGFuZGxlKSB7CisgICAgaWYgKGhhbmRsZS5mZHMuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaGFuZGxlLmZkc1swXS5nZXQoKTsKK30KKworaW5saW5lIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiYKK2dldFJlc3VsdE1ldGFkYXRhKGNvbnN0IGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgJnJlc3VsdCkgeworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2lubGluZSBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYKK2dldFJlc3VsdE1ldGFkYXRhKGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhTWV0YWRhdGEgJnJlc3VsdCkgeworICAgIHJldHVybiByZXN1bHQubWV0YWRhdGE7Cit9CisKKy8vIEZtcXBheWxvYWQgdHlwZSBpcyBuZWVkZWQgc2luY2UgQUlETCBnZW5lcmF0ZXMgYW4gZm1xIG9mIHBheWxvYWQgdHlwZSBpbnQ4X3QKKy8vIGZvciBhIGJ5dGUgZm1xIHZzIE1ldGFkYXRhVHlwZSB3aGljaCBpcyB1aW50OF90LiBGb3IgSElETCwgdGhlIHNhbWUgdHlwZSBpcworLy8gZ2VuZXJhdGVkIGZvciBtZXRhZGF0YSBhbmQgZm1xIHBheWxvYWQgOiB1aW50OF90LgordGVtcGxhdGUgPGNsYXNzIFN0YXRlc1R5cGUsIGNsYXNzIENhcHR1cmVSZXN1bHRUeXBlLCBjbGFzcyBQaHlzTWV0YWRhdGFUeXBlLCBjbGFzcyBNZXRhZGF0YVR5cGUsCisgICAgICAgICBjbGFzcyBGbXFUeXBlLCBjbGFzcyBCdWZmZXJTdGF0dXNUeXBlLCBjbGFzcyBGbXFQYXlsb2FkVHlwZSA9IHVpbnQ4X3Q+Cit2b2lkIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkVCgKKyAgICAgICAgU3RhdGVzVHlwZSYgc3RhdGVzLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0VHlwZSYgcmVzdWx0LAorICAgICAgICBjb25zdCBQaHlzTWV0YWRhdGFUeXBlICZwaHlzaWNhbENhbWVyYU1ldGFkYXRhKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEZtcVR5cGU+JiBmbXEgPSBzdGF0ZXMuZm1xOworICAgIEJ1ZmZlclJlY29yZHNJbnRlcmZhY2UmIGJ1ZmZlclJlY29yZHMgPSBzdGF0ZXMuYnVmZmVyUmVjb3Jkc0ludGY7CisgICAgY2FtZXJhX2NhcHR1cmVfcmVzdWx0IHI7CisgICAgc3RhdHVzX3QgcmVzOworICAgIHIuZnJhbWVfbnVtYmVyID0gcmVzdWx0LmZyYW1lTnVtYmVyOworCisgICAgLy8gUmVhZCBhbmQgdmFsaWRhdGUgdGhlIHJlc3VsdCBtZXRhZGF0YS4KKyAgICBNZXRhZGF0YVR5cGUgcmVzdWx0TWV0YWRhdGE7CisgICAgcmVzID0gcmVhZE9uZUNhbWVyYU1ldGFkYXRhTG9ja2VkVDxGbXFUeXBlLCBGbXFQYXlsb2FkVHlwZSwgTWV0YWRhdGFUeXBlPigKKyAgICAgICAgICAgIGZtcSwgcmVzdWx0LmZtcVJlc3VsdFNpemUsCisgICAgICAgICAgICByZXN1bHRNZXRhZGF0YSwgZ2V0UmVzdWx0TWV0YWRhdGEocmVzdWx0LnJlc3VsdCkpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogRmFpbGVkIHRvIHJlYWQgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByLnJlc3VsdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QqPihyZXN1bHRNZXRhZGF0YS5kYXRhKCkpOworCisgICAgLy8gUmVhZCBhbmQgdmFsaWRhdGUgcGh5c2ljYWwgY2FtZXJhIG1ldGFkYXRhCisgICAgc2l6ZV90IHBoeXNSZXN1bHRDb3VudCA9IHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEuc2l6ZSgpOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBwaHlzQ2FtSWRzKHBoeXNSZXN1bHRDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKj4gcGh5Q2FtTWV0YWRhdGFzKHBoeXNSZXN1bHRDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8TWV0YWRhdGFUeXBlPiBwaHlzUmVzdWx0TWV0YWRhdGE7CisgICAgcGh5c1Jlc3VsdE1ldGFkYXRhLnJlc2l6ZShwaHlzUmVzdWx0Q291bnQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5zaXplKCk7IGkrKykgeworICAgICAgICByZXMgPSByZWFkT25lQ2FtZXJhTWV0YWRhdGFMb2NrZWRUPEZtcVR5cGUsIEZtcVBheWxvYWRUeXBlLCBNZXRhZGF0YVR5cGU+KGZtcSwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYU1ldGFkYXRhW2ldLmZtcU1ldGFkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICBwaHlzUmVzdWx0TWV0YWRhdGFbaV0sIGdldFJlc3VsdE1ldGFkYXRhKHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFbaV0ubWV0YWRhdGEpKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogRmFpbGVkIHRvIHJlYWQgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgZm9yIGNhbWVyYSAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYU1ldGFkYXRhW2ldLnBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGh5c0NhbUlkc1tpXSA9IHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFbaV0ucGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpOworICAgICAgICBwaHlDYW1NZXRhZGF0YXNbaV0gPQorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QqPihwaHlzUmVzdWx0TWV0YWRhdGFbaV0uZGF0YSgpKTsKKyAgICB9CisgICAgci5udW1fcGh5c2NhbV9tZXRhZGF0YSA9IHBoeXNSZXN1bHRDb3VudDsKKyAgICByLnBoeXNjYW1faWRzID0gcGh5c0NhbUlkcy5kYXRhKCk7CisgICAgci5waHlzY2FtX21ldGFkYXRhID0gcGh5Q2FtTWV0YWRhdGFzLmRhdGEoKTsKKworICAgIHN0ZDo6dmVjdG9yPGNhbWVyYV9zdHJlYW1fYnVmZmVyX3Q+IG91dHB1dEJ1ZmZlcnMocmVzdWx0Lm91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBzdGQ6OnZlY3RvcjxidWZmZXJfaGFuZGxlX3Q+IG91dHB1dEJ1ZmZlckhhbmRsZXMocmVzdWx0Lm91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdC5vdXRwdXRCdWZmZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1dG8mIGJEc3QgPSBvdXRwdXRCdWZmZXJzW2ldOworICAgICAgICBjb25zdCBhdXRvICZiU3JjID0gcmVzdWx0Lm91dHB1dEJ1ZmZlcnNbaV07CisKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gc3RhdGVzLm91dHB1dFN0cmVhbXMuZ2V0KGJTcmMuc3RyZWFtSWQpOworICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IEludmFsaWQgb3V0cHV0IHN0cmVhbSBpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBiRHN0LnN0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKKworICAgICAgICBib29sIG5vQnVmZmVyUmV0dXJuZWQgPSBmYWxzZTsKKyAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIgPSBudWxscHRyOworICAgICAgICBpZiAoc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgc3VzcGljaW91cyBtb3N0IG9mIHRoZSB0aW1lIGJ1dCBjYW4gYmUgY29ycmVjdCBkdXJpbmcgZmx1c2ggd2hlcmUgSEFMCisgICAgICAgICAgICAvLyBoYXMgdG8gcmV0dXJuIGNhcHR1cmUgcmVzdWx0IGJlZm9yZSBhIGJ1ZmZlciBpcyByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGlmIChiU3JjLmJ1ZmZlcklkID09IEJVRkZFUl9JRF9OT19CVUZGRVIpIHsKKyAgICAgICAgICAgICAgICBpZiAoYlNyYy5zdGF0dXMgPT0gQnVmZmVyU3RhdHVzVHlwZTo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogQnVmZmVyICV6dTogTm8gYnVmZmVySWQgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIGJTcmMuc3RyZWFtSWQpOworICAgICAgICAgICAgICAgICAgICAvLyBTdGlsbCBwcm9jZWVkcyBzbyBvdGhlciBidWZmZXJzIGNhbiBiZSByZXR1cm5lZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub0J1ZmZlclJldHVybmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChub0J1ZmZlclJldHVybmVkKSB7CisgICAgICAgICAgICAgICAgcmVzID0gT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IGJ1ZmZlclJlY29yZHMucG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJTcmMuYnVmZmVySWQsICZidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gYnVmZmVyUmVjb3Jkcy5wb3BJbmZsaWdodEJ1ZmZlcihyZXN1bHQuZnJhbWVOdW1iZXIsIGJTcmMuc3RyZWFtSWQsICZidWZmZXIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogQnVmZmVyICV6dTogTm8gaW4tZmxpZ2h0IGJ1ZmZlciBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIGJTcmMuc3RyZWFtSWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYkRzdC5idWZmZXIgPSBidWZmZXI7CisgICAgICAgIGJEc3Quc3RhdHVzID0gbWFwQnVmZmVyU3RhdHVzPEJ1ZmZlclN0YXR1c1R5cGU+KGJTcmMuc3RhdHVzKTsKKyAgICAgICAgYkRzdC5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgIGlmIChpc0hhbmRsZU51bGwoYlNyYy5yZWxlYXNlRmVuY2UpKSB7CisgICAgICAgICAgICBiRHN0LnJlbGVhc2VfZmVuY2UgPSAtMTsKKyAgICAgICAgfSBlbHNlIGlmIChudW1GZHNJbkhhbmRsZShiU3JjLnJlbGVhc2VGZW5jZSkgPT0gMSkgeworICAgICAgICAgICAgaWYgKG5vQnVmZmVyUmV0dXJuZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGdvdCByZWxlYXNlRmVuY2Ugd2l0aG91dCBvdXRwdXQgYnVmZmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiRHN0LnJlbGVhc2VfZmVuY2UgPSBkdXAoZ2V0SGFuZGxlRmlyc3RGZChiU3JjLnJlbGVhc2VGZW5jZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCByZWxlYXNlIGZlbmNlIGZvciBidWZmZXIgJXp1LCBmZCBjb3VudCBpcyAlZCwgbm90IDEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgaSwgKGludCludW1GZHNJbkhhbmRsZShiU3JjLnJlbGVhc2VGZW5jZSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIHIubnVtX291dHB1dF9idWZmZXJzID0gb3V0cHV0QnVmZmVycy5zaXplKCk7CisgICAgci5vdXRwdXRfYnVmZmVycyA9IG91dHB1dEJ1ZmZlcnMuZGF0YSgpOworCisgICAgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCBpbnB1dEJ1ZmZlcjsKKyAgICBpZiAocmVzdWx0LmlucHV0QnVmZmVyLnN0cmVhbUlkID09IC0xKSB7CisgICAgICAgIHIuaW5wdXRfYnVmZmVyID0gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3RhdGVzLmlucHV0U3RyZWFtLT5nZXRJZCgpICE9IHJlc3VsdC5pbnB1dEJ1ZmZlci5zdHJlYW1JZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCBpbnB1dCBzdHJlYW0gaWQgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5mcmFtZU51bWJlciwgcmVzdWx0LmlucHV0QnVmZmVyLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnB1dEJ1ZmZlci5zdHJlYW0gPSBzdGF0ZXMuaW5wdXRTdHJlYW0tPmFzSGFsU3RyZWFtKCk7CisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyOworICAgICAgICByZXMgPSBidWZmZXJSZWNvcmRzLnBvcEluZmxpZ2h0QnVmZmVyKHJlc3VsdC5mcmFtZU51bWJlciwgcmVzdWx0LmlucHV0QnVmZmVyLnN0cmVhbUlkLAorICAgICAgICAgICAgICAgICZidWZmZXIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnB1dCBidWZmZXI6IE5vIGluLWZsaWdodCBidWZmZXIgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCByZXN1bHQuaW5wdXRCdWZmZXIuc3RyZWFtSWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlucHV0QnVmZmVyLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgaW5wdXRCdWZmZXIuc3RhdHVzID0gbWFwQnVmZmVyU3RhdHVzPEJ1ZmZlclN0YXR1c1R5cGU+KHJlc3VsdC5pbnB1dEJ1ZmZlci5zdGF0dXMpOworICAgICAgICBpbnB1dEJ1ZmZlci5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgIGlmIChpc0hhbmRsZU51bGwocmVzdWx0LmlucHV0QnVmZmVyLnJlbGVhc2VGZW5jZSkpIHsKKyAgICAgICAgICAgIGlucHV0QnVmZmVyLnJlbGVhc2VfZmVuY2UgPSAtMTsKKyAgICAgICAgfSBlbHNlIGlmIChudW1GZHNJbkhhbmRsZShyZXN1bHQuaW5wdXRCdWZmZXIucmVsZWFzZUZlbmNlKSA9PSAxKSB7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gZHVwKGdldEhhbmRsZUZpcnN0RmQocmVzdWx0LmlucHV0QnVmZmVyLnJlbGVhc2VGZW5jZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCByZWxlYXNlIGZlbmNlIGZvciBpbnB1dCBidWZmZXIsIGZkIGNvdW50IGlzICVkLCBub3QgMSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAoaW50KW51bUZkc0luSGFuZGxlKHJlc3VsdC5pbnB1dEJ1ZmZlci5yZWxlYXNlRmVuY2UpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByLmlucHV0X2J1ZmZlciA9ICZpbnB1dEJ1ZmZlcjsKKyAgICB9CisKKyAgICByLnBhcnRpYWxfcmVzdWx0ID0gcmVzdWx0LnBhcnRpYWxSZXN1bHQ7CisKKyAgICBwcm9jZXNzQ2FwdHVyZVJlc3VsdChzdGF0ZXMsICZyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFZlY1N0cmVhbUJ1ZmZlclR5cGU+Cit2b2lkIHJldHVyblN0cmVhbUJ1ZmZlcnNUKFJldHVybkJ1ZmZlclN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBWZWNTdHJlYW1CdWZmZXJUeXBlJiBidWZmZXJzKSB7CisgICAgaWYgKCFzdGF0ZXMudXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlcyBkb2VzIG5vdCBzdXBwb3J0IEhBTCBidWZmZXIgbWFuYWdlcm1lbnQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RhdGVzLmNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgYnVmIDogYnVmZmVycykgeworICAgICAgICBpZiAoYnVmLmJ1ZmZlcklkID09IEJVRkZFUl9JRF9OT19CVUZGRVIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IHJldHVybiBhIGJ1ZmZlciB3aXRob3V0IGJ1ZmZlcklkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXI7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHN0YXRlcy5idWZmZXJSZWNvcmRzSW50Zi5wb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoYnVmLmJ1ZmZlcklkLCAmYnVmZmVyKTsKKworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBmaW5kIGluLWZsaWdodCBidWZmZXIgJSIgUFJJdTY0ICIgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmLmJ1ZmZlcklkLCBidWYuc3RyZWFtSWQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90IHN0cmVhbUJ1ZmZlcjsKKyAgICAgICAgc3RyZWFtQnVmZmVyLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgc3RyZWFtQnVmZmVyLnN0YXR1cyA9IENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICBzdHJlYW1CdWZmZXIuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICBzdHJlYW1CdWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOworCisgICAgICAgIGlmIChpc0hhbmRsZU51bGwoYnVmLnJlbGVhc2VGZW5jZSkpIHsKKyAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7CisgICAgICAgIH0gZWxzZSBpZiAobnVtRmRzSW5IYW5kbGUoYnVmLnJlbGVhc2VGZW5jZSkgPT0gMSkgeworICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSBkdXAoZ2V0SGFuZGxlRmlyc3RGZChidWYucmVsZWFzZUZlbmNlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcmVsZWFzZSBmZW5jZSwgZmQgY291bnQgaXMgJWQsIG5vdCAxIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAoaW50KW51bUZkc0luSGFuZGxlKGJ1Zi5yZWxlYXNlRmVuY2UpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gc3RhdGVzLm91dHB1dFN0cmVhbXMuZ2V0KGJ1Zi5zdHJlYW1JZCk7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBPdXRwdXQgc3RyZWFtIGlkICVkIG5vdCBmb3VuZCEiLCBfX0ZVTkNUSU9OX18sIGJ1Zi5zdHJlYW1JZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW1CdWZmZXIuc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOworICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyLCAvKmxpc3RlbmVyKi9udWxscHRyLAorICAgICAgICAgICAgICAgICZzdHJlYW1CdWZmZXIsIC8qc2l6ZSovMSwgLyp0aW1lc3RhbXAqLyAwLCAvKnJlYWRvdXRUaW1lc3RhbXAqLzAsCisgICAgICAgICAgICAgICAgLypyZXF1ZXN0ZWQqL2ZhbHNlLCAvKnJlcXVlc3RUaW1lTnMqLzAsIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyKTsKKyAgICB9Cit9CisKK30gLy8gY2FtZXJhMworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCmluZGV4IDE1Y2Y3ZjQuLjkyMTVmMjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcApAQCAtMzIsMTEgKzMyLDE1IEBACiAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKLSAgICAgICAgaW50IHNldElkLCBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpIDoKKyAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgSVBDVHJhbnNwb3J0IHRyYW5zcG9ydCwKKyAgICAgICAgaW50IHNldElkLCBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsIGludDY0X3QgZHluYW1pY1Byb2ZpbGUsCisgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwgYm9vbCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUsIGludCB0aW1lc3RhbXBCYXNlLAorICAgICAgICBpbnQgbWlycm9yTW9kZSkgOgogICAgICAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGlkLCBDQU1FUkFfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UsIHRpbWVzdGFtcE9mZnNldCwgc2V0SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwgY29uc3VtZXJVc2FnZSwgdGltZXN0YW1wT2Zmc2V0LCBzZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlzTXVsdGlSZXNvbHV0aW9uKi9mYWxzZSwgZHluYW1pY1Byb2ZpbGUsIHN0cmVhbVVzZUNhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLCB0aW1lc3RhbXBCYXNlLCBtaXJyb3JNb2RlKSwKICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIodXNlSGFsQnVmTWFuYWdlcikgewogICAgIHNpemVfdCBjb25zdW1lckNvdW50ID0gc3RkOjptaW4oc3VyZmFjZXMuc2l6ZSgpLCBrTWF4T3V0cHV0cyk7CiAgICAgaWYgKHN1cmZhY2VzLnNpemUoKSA+IGNvbnN1bWVyQ291bnQpIHsKQEAgLTY3LDcgKzcxLDcgQEAKICAgICB9CiAKICAgICByZXMgPSBtU3RyZWFtU3BsaXR0ZXItPmNvbm5lY3QoaW5pdGlhbFN1cmZhY2VzLCB1c2FnZSwgbVVzYWdlLCBjYW1lcmFfc3RyZWFtOjptYXhfYnVmZmVycywKLSAgICAgICAgICAgIGdldFdpZHRoKCksIGdldEhlaWdodCgpLCBnZXRGb3JtYXQoKSwgJm1Db25zdW1lcik7CisgICAgICAgICAgICBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgZ2V0Rm9ybWF0KCksICZtQ29uc3VtZXIsIGNhbWVyYV9zdHJlYW06OmR5bmFtaWNfcmFuZ2VfcHJvZmlsZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjb25uZWN0IHRvIHN0cmVhbSBzcGxpdHRlcjogJXMoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMjQ3LDcgKzI1MSw3IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgcmVzID0gY29uZmlndXJlQ29uc3VtZXJRdWV1ZUxvY2tlZCgpOworICAgIHJlcyA9IGNvbmZpZ3VyZUNvbnN1bWVyUXVldWVMb2NrZWQoZmFsc2UvKmFsbG93UHJldmlld1Jlc3BhY2UqLyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZUNvbnN1bWVyUXVldWVMb2NrZWQ6ICVzKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICByZXR1cm4gcmVzOwpAQCAtMzg4LDEzICszOTIsMTUgQEAKICAgICAgICAgYm9vbCBzaXplTWlzbWF0Y2ggPSAoKHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmZvSXQud2lkdGgpICE9IGdldFdpZHRoKCkpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzJfdD4gKGluZm9JdC5oZWlnaHQpICE9IGdldEhlaWdodCgpKSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIDogZmFsc2U7Ci0gICAgICAgIGlmICgoaW1nUmVhZGVyVXNhZ2UgJiYgc2l6ZU1pc21hdGNoKSB8fAorICAgICAgICBib29sIGR5bmFtaWNSYW5nZU1pc21hdGNoID0gZHluYW1pY19yYW5nZV9wcm9maWxlICE9IGluZm9JdC5keW5hbWljUmFuZ2VQcm9maWxlOworICAgICAgICBpZiAoKGltZ1JlYWRlclVzYWdlICYmIHNpemVNaXNtYXRjaCkgfHwgZHluYW1pY1JhbmdlTWlzbWF0Y2ggfHwKICAgICAgICAgICAgICAgICAoaW5mb0l0LmZvcm1hdCAhPSBnZXRPcmlnaW5hbEZvcm1hdCgpICYmIGluZm9JdC5mb3JtYXQgIT0gZ2V0Rm9ybWF0KCkpIHx8CiAgICAgICAgICAgICAgICAgKGluZm9JdC5kYXRhU3BhY2UgIT0gZ2V0RGF0YVNwYWNlKCkgJiYKICAgICAgICAgICAgICAgICAgaW5mb0l0LmRhdGFTcGFjZSAhPSBnZXRPcmlnaW5hbERhdGFTcGFjZSgpKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBTaGFyZWQgc3VyZmFjZSBwYXJhbWV0ZXJzIGZvcm1hdDogMHgleCBkYXRhU3BhY2U6IDB4JXggIgotICAgICAgICAgICAgICAgICAgICAiIGRvbid0IG1hdGNoIHNvdXJjZSBzdHJlYW0gZm9ybWF0OiAweCV4ICBkYXRhU3BhY2U6IDB4JXgiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgIGluZm9JdC5mb3JtYXQsIGluZm9JdC5kYXRhU3BhY2UsIGdldEZvcm1hdCgpLCBnZXREYXRhU3BhY2UoKSk7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFNoYXJlZCBzdXJmYWNlIHBhcmFtZXRlcnMgZm9ybWF0OiAweCV4IGRhdGFTcGFjZTogMHgleCBkeW5hbWljIHJhbmdlIDB4JSIKKyAgICAgICAgICAgICAgICAgICAgUFJJeDY0ICIgZG9uJ3QgbWF0Y2ggc291cmNlIHN0cmVhbSBmb3JtYXQ6IDB4JXggIGRhdGFTcGFjZTogMHgleCBkeW5hbWljIgorICAgICAgICAgICAgICAgICAgICAiIHJhbmdlIDB4JSIgUFJJeDY0ICwgX19GVU5DVElPTl9fLCBpbmZvSXQuZm9ybWF0LCBpbmZvSXQuZGF0YVNwYWNlLAorICAgICAgICAgICAgICAgICAgICBpbmZvSXQuZHluYW1pY1JhbmdlUHJvZmlsZSwgZ2V0Rm9ybWF0KCksIGdldERhdGFTcGFjZSgpLCBkeW5hbWljX3JhbmdlX3Byb2ZpbGUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgKaW5kZXggNGI2MzQxYi4uYWFjM2MyYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgKQEAgLTM4LDkgKzM4LDE0IEBACiAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgICAgICBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLCBJUENUcmFuc3BvcnQgdHJhbnNwb3J0LAogICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCi0gICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIgPSBmYWxzZSk7CisgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIgPSBmYWxzZSwKKyAgICAgICAgICAgIGludDY0X3QgZHluYW1pY1Byb2ZpbGUgPSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJELAorICAgICAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlID0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9VU0VfQ0FTRVNfREVGQVVMVCwKKyAgICAgICAgICAgIGJvb2wgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lID0gZmFsc2UsCisgICAgICAgICAgICBpbnQgdGltZXN0YW1wQmFzZSA9IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0RFRkFVTFQsCisgICAgICAgICAgICBpbnQgbWlycm9yTW9kZSA9IE91dHB1dENvbmZpZ3VyYXRpb246Ok1JUlJPUl9NT0RFX0FVVE8pOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbSgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAppbmRleCAwMmI2NTg1Li43YWQ2NjQ5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAic3lzdGVtL3dpbmRvdy5oIgogI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLVN0cmVhbSIKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQogLy8jZGVmaW5lIExPR19OREVCVUcgMApAQCAtMjMsNiArMjUsNyBAQAogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1N0cmVhbS5oIgogI2luY2x1ZGUgImRldmljZTMvU3RhdHVzVHJhY2tlci5oIgogI2luY2x1ZGUgInV0aWxzL1RyYWNlSEZSLmgiCisjaW5jbHVkZSAidWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oIgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIApAQCAtNTEsNyArNTQsOCBAQAogICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKLSAgICAgICAgaW50IHNldElkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uKSA6CisgICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiwgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlLAorICAgICAgICBpbnQ2NF90IHN0cmVhbVVzZUNhc2UsIGJvb2wgZGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lLCBpbnQgdGltZXN0YW1wQmFzZSkgOgogICAgIGNhbWVyYV9zdHJlYW0oKSwKICAgICBtSWQoaWQpLAogICAgIG1TZXRJZChzZXRJZCksCkBAIC03Niw3ICs4MCw5IEBACiAgICAgbU9yaWdpbmFsRGF0YVNwYWNlKGRhdGFTcGFjZSksCiAgICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCksCiAgICAgbUxhc3RUaW1lc3RhbXAoMCksCi0gICAgbUlzTXVsdGlSZXNvbHV0aW9uKGlzTXVsdGlSZXNvbHV0aW9uKSB7CisgICAgbUlzTXVsdGlSZXNvbHV0aW9uKGlzTXVsdGlSZXNvbHV0aW9uKSwKKyAgICBtRGV2aWNlVGltZUJhc2VJc1JlYWx0aW1lKGRldmljZVRpbWVCYXNlSXNSZWFsdGltZSksCisgICAgbVRpbWVzdGFtcEJhc2UodGltZXN0YW1wQmFzZSkgewogCiAgICAgY2FtZXJhX3N0cmVhbTo6c3RyZWFtX3R5cGUgPSB0eXBlOwogICAgIGNhbWVyYV9zdHJlYW06OndpZHRoID0gd2lkdGg7CkBAIC04Nyw2ICs5Myw4IEBACiAgICAgY2FtZXJhX3N0cmVhbTo6bWF4X2J1ZmZlcnMgPSAwOwogICAgIGNhbWVyYV9zdHJlYW06OnBoeXNpY2FsX2NhbWVyYV9pZCA9IG1QaHlzaWNhbENhbWVyYUlkLnN0cmluZygpOwogICAgIGNhbWVyYV9zdHJlYW06OnNlbnNvcl9waXhlbF9tb2Rlc191c2VkID0gc2Vuc29yUGl4ZWxNb2Rlc1VzZWQ7CisgICAgY2FtZXJhX3N0cmVhbTo6ZHluYW1pY19yYW5nZV9wcm9maWxlID0gZHluYW1pY1JhbmdlUHJvZmlsZTsKKyAgICBjYW1lcmFfc3RyZWFtOjp1c2VfY2FzZSA9IHN0cmVhbVVzZUNhc2U7CiAKICAgICBpZiAoKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IgfHwgZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkFXX09QQVFVRSkgJiYKICAgICAgICAgICAgIG1heFNpemUgPT0gMCkgewpAQCAtMTQ3LDYgKzE1NSwxMCBAQAogICAgIHJldHVybiBtT3JpZ2luYWxGb3JtYXQ7CiB9CiAKK2ludDY0X3QgQ2FtZXJhM1N0cmVhbTo6Z2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FtZXJhX3N0cmVhbTo6ZHluYW1pY19yYW5nZV9wcm9maWxlOworfQorCiB2b2lkIENhbWVyYTNTdHJlYW06OnNldERhdGFTcGFjZU92ZXJyaWRlKGJvb2wgZGF0YVNwYWNlT3ZlcnJpZGRlbikgewogICAgIG1EYXRhU3BhY2VPdmVycmlkZGVuID0gZGF0YVNwYWNlT3ZlcnJpZGRlbjsKIH0KQEAgLTE2Nyw2ICsxNzksMTggQEAKICAgICByZXR1cm4gY2FtZXJhX3N0cmVhbTo6bWF4X2J1ZmZlcnM7CiB9CiAKK2ludDY0X3QgQ2FtZXJhM1N0cmVhbTo6Z2V0U3RyZWFtVXNlQ2FzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FtZXJhX3N0cmVhbTo6dXNlX2Nhc2U7Cit9CisKK2ludCBDYW1lcmEzU3RyZWFtOjpnZXRUaW1lc3RhbXBCYXNlKCkgY29uc3QgeworICAgIHJldHVybiBtVGltZXN0YW1wQmFzZTsKK30KKworYm9vbCBDYW1lcmEzU3RyZWFtOjppc0RldmljZVRpbWVCYXNlUmVhbHRpbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1EZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWU7Cit9CisKIHZvaWQgQ2FtZXJhM1N0cmVhbTo6c2V0T2ZmbGluZVByb2Nlc3NpbmdTdXBwb3J0KGJvb2wgc3VwcG9ydCkgewogICAgIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcgPSBzdXBwb3J0OwogfQpAQCAtNTU3LDcgKzU4MSw4IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHJlcGFyZWRCdWZmZXJJZHg7IGkrKykgewogICAgICAgICBtUHJlcGFyZWRCdWZmZXJzLmVkaXRJdGVtQXQoaSkucmVsZWFzZV9mZW5jZSA9IC0xOwogICAgICAgICBtUHJlcGFyZWRCdWZmZXJzLmVkaXRJdGVtQXQoaSkuc3RhdHVzID0gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci0gICAgICAgIHJldHVybkJ1ZmZlckxvY2tlZChtUHJlcGFyZWRCdWZmZXJzW2ldLCAwKTsKKyAgICAgICAgcmV0dXJuQnVmZmVyTG9ja2VkKG1QcmVwYXJlZEJ1ZmZlcnNbaV0sIC8qdGltZXN0YW1wKi8wLCAvKnJlYWRvdXRUaW1lc3RhbXAqLzAsCisgICAgICAgICAgICAgICAgLyp0cmFuc2Zvcm0qLyAtMSk7CiAgICAgfQogICAgIG1QcmVwYXJlZEJ1ZmZlcnMuY2xlYXIoKTsKICAgICBtUHJlcGFyZWRCdWZmZXJJZHggPSAwOwpAQCAtNzEzLDggKzczOCw4IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nLAotICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsIHVpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLCB1aW50NjRfdCBmcmFtZU51bWJlciwgaW50MzJfdCB0cmFuc2Zvcm0pIHsKICAgICBBVFJBQ0VfSEZSX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKQEAgLTc0Myw3ICs3NjgsNyBAQAogICAgICAqCiAgICAgICogRG8gdGhpcyBmb3IgZ2V0QnVmZmVyIGFzIHdlbGwuCiAgICAgICovCi0gICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQnVmZmVyTG9ja2VkKGIsIHRpbWVzdGFtcCwgc3VyZmFjZV9pZHMpOworICAgIHN0YXR1c190IHJlcyA9IHJldHVybkJ1ZmZlckxvY2tlZChiLCB0aW1lc3RhbXAsIHJlYWRvdXRUaW1lc3RhbXAsIHRyYW5zZm9ybSwgc3VyZmFjZV9pZHMpOwogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChiLCAvKmFjcXVpcmVkKi9mYWxzZSwgLypvdXRwdXQqL3RydWUsIHRpbWVzdGFtcCwgZnJhbWVOdW1iZXIpOwogICAgIH0KQEAgLTkzMSw3ICs5NTYsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpyZXR1cm5CdWZmZXJMb2NrZWQoY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190LCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QsIG5zZWNzX3QsIGludDMyX3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7CiAgICAgQUxPR0UoIiVzOiBUaGlzIHR5cGUgb2Ygc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQgb3V0cHV0IiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CkBAIC0xMDc3LDYgKzExMDIsNTIgQEAKICAgICByZXR1cm4gcmVzOwogfQogCit2b2lkIENhbWVyYTNTdHJlYW06OnF1ZXVlSERSTWV0YWRhdGEoYnVmZmVyX2hhbmRsZV90IGJ1ZmZlciwgc3A8QU5hdGl2ZVdpbmRvdz4mIGFudywKKyAgICAgICAgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlKSB7CisgICAgYXV0byYgbWFwcGVyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCk7CisgICAgc3dpdGNoIChkeW5hbWljUmFuZ2VQcm9maWxlKSB7CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9IRFIxMDogeworICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx1aTo6U21wdGUyMDg2PiBzbXB0ZTIwODY7CisgICAgICAgICAgICBhdXRvIHJlcyA9IG1hcHBlci5nZXRTbXB0ZTIwODYoYnVmZmVyLCAmc21wdGUyMDg2KTsKKyAgICAgICAgICAgIGlmICgocmVzID09IE9LKSAmJiBzbXB0ZTIwODYuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBtZXRhVmFsdWUgPSBzbXB0ZTIwODYudmFsdWUoKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX3NtcHRlMjA4Nl9tZXRhZGF0YSBtZXRhID0geworICAgICAgICAgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlSZWQueCA9IG1ldGFWYWx1ZS5wcmltYXJ5UmVkLngsCisgICAgICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeVJlZC55ID0gbWV0YVZhbHVlLnByaW1hcnlSZWQueSwKKyAgICAgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5R3JlZW4ueCA9IG1ldGFWYWx1ZS5wcmltYXJ5R3JlZW4ueCwKKyAgICAgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5R3JlZW4ueSA9IG1ldGFWYWx1ZS5wcmltYXJ5R3JlZW4ueSwKKyAgICAgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5Qmx1ZS54ID0gbWV0YVZhbHVlLnByaW1hcnlCbHVlLngsCisgICAgICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUJsdWUueSA9IG1ldGFWYWx1ZS5wcmltYXJ5Qmx1ZS55LAorICAgICAgICAgICAgICAgICAgICAud2hpdGVQb2ludC54ID0gbWV0YVZhbHVlLndoaXRlUG9pbnQueCwKKyAgICAgICAgICAgICAgICAgICAgLndoaXRlUG9pbnQueSA9IG1ldGFWYWx1ZS53aGl0ZVBvaW50LnksCisgICAgICAgICAgICAgICAgICAgIC5tYXhMdW1pbmFuY2UgPSBtZXRhVmFsdWUubWF4THVtaW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAubWluTHVtaW5hbmNlID0gbWV0YVZhbHVlLm1pbkx1bWluYW5jZX07CisgICAgICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19zbXB0ZTIwODZfbWV0YWRhdGEoYW53LmdldCgpLCAmbWV0YSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBDb3VsZG4ndCByZXRyaWV2ZSBTbXB0ZTIwODYgbWV0YWRhdGEgJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0hEUjEwX1BMVVM6IHsKKyAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHNtcHRlMjA5NF80MDsKKyAgICAgICAgICAgIGF1dG8gcmVzID0gbWFwcGVyLmdldFNtcHRlMjA5NF80MChidWZmZXIsICZzbXB0ZTIwOTRfNDApOworICAgICAgICAgICAgaWYgKChyZXMgPT0gT0spICYmIHNtcHRlMjA5NF80MC5oYXNfdmFsdWUoKSkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfaGRyMTBfcGx1c19tZXRhZGF0YShhbncuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBzbXB0ZTIwOTRfNDAudmFsdWUoKS5zaXplKCksIHNtcHRlMjA5NF80MC52YWx1ZSgpLmRhdGEoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBDb3VsZG4ndCByZXRyaWV2ZSBTbXB0ZTIwOTRfNDAgbWV0YWRhdGEgJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIE5vLW9wCisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKwogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKaW5kZXggNWEzNjRhYi4uZDQyOWU2YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKQEAgLTEzOCw2ICsxMzgsMTAgQEAKICAgICBzdGF0aWMgQ2FtZXJhM1N0cmVhbSogICAgICAgY2FzdChjYW1lcmFfc3RyZWFtICpzdHJlYW0pOwogICAgIHN0YXRpYyBjb25zdCBDYW1lcmEzU3RyZWFtKiBjYXN0KGNvbnN0IGNhbWVyYV9zdHJlYW0gKnN0cmVhbSk7CiAKKyAgICAvLyBRdWV1ZSBjb3JyZXNwb25kaW5nIEhEUiBtZXRhZGF0YSB0byBnaXZlbiBuYXRpdmUgd2luZG93LgorICAgIHN0YXRpYyB2b2lkIHF1ZXVlSERSTWV0YWRhdGEoYnVmZmVyX2hhbmRsZV90IGJ1ZmZlciwgc3A8QU5hdGl2ZVdpbmRvdz4mIGFudywKKyAgICAgICAgICAgIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSk7CisKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHN0cmVhbSdzIElECiAgICAgICovCkBAIC0xNjgsMTEgKzE3MiwxNSBAQAogICAgIHZvaWQgICAgICAgICAgICAgIHNldEZvcm1hdE92ZXJyaWRlKGJvb2wgZm9ybWF0T3ZlcnJpZGVuKTsKICAgICBib29sICAgICAgICAgICAgICBpc0Zvcm1hdE92ZXJyaWRkZW4oKSBjb25zdDsKICAgICBpbnQgICAgICAgICAgICAgICBnZXRPcmlnaW5hbEZvcm1hdCgpIGNvbnN0OworICAgIGludDY0X3QgICAgICAgICAgIGdldER5bmFtaWNSYW5nZVByb2ZpbGUoKSBjb25zdDsKICAgICB2b2lkICAgICAgICAgICAgICBzZXREYXRhU3BhY2VPdmVycmlkZShib29sIGRhdGFTcGFjZU92ZXJyaWRlbik7CiAgICAgYm9vbCAgICAgICAgICAgICAgaXNEYXRhU3BhY2VPdmVycmlkZGVuKCkgY29uc3Q7CiAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZ2V0T3JpZ2luYWxEYXRhU3BhY2UoKSBjb25zdDsKICAgICBpbnQgICAgICAgICAgICAgICBnZXRNYXhIYWxCdWZmZXJzKCkgY29uc3Q7CiAgICAgY29uc3QgU3RyaW5nOCYgICAgcGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0OworICAgIGludDY0X3QgICAgICAgICAgIGdldFN0cmVhbVVzZUNhc2UoKSBjb25zdDsKKyAgICBpbnQgICAgICAgICAgICAgICBnZXRUaW1lc3RhbXBCYXNlKCkgY29uc3Q7CisgICAgYm9vbCAgICAgICAgICAgICAgaXNEZXZpY2VUaW1lQmFzZVJlYWx0aW1lKCkgY29uc3Q7CiAKICAgICB2b2lkICAgICAgICAgICAgICBzZXRPZmZsaW5lUHJvY2Vzc2luZ1N1cHBvcnQoYm9vbCkgb3ZlcnJpZGU7CiAgICAgYm9vbCAgICAgICAgICAgICAgZ2V0T2ZmbGluZVByb2Nlc3NpbmdTdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGU7CkBAIC0zNTIsOSArMzYwLDkgQEAKICAgICAgKiBGb3IgYmlkaXJlY3Rpb25hbCBzdHJlYW1zLCB0aGlzIG1ldGhvZCBhcHBsaWVzIHRvIHRoZSBvdXRwdXQtc2lkZSBidWZmZXJzCiAgICAgICovCiAgICAgc3RhdHVzX3QgICAgICAgICByZXR1cm5CdWZmZXIoY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSwKLSAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lTnVtYmVyID0gMCk7CisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZU51bWJlciA9IDAsIGludDMyX3QgdHJhbnNmb3JtID0gLTEpOwogCiAgICAgLyoqCiAgICAgICogRmlsbCBpbiB0aGUgY2FtZXJhX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKQEAgLTUwMCw3ICs1MDgsOCBAQAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKLSAgICAgICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbik7CisgICAgICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24sIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSwKKyAgICAgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwgYm9vbCBkZXZpY2VUaW1lQmFzZUlzUmVhbHRpbWUsIGludCB0aW1lc3RhbXBCYXNlKTsKIAogICAgIHdwPENhbWVyYTNTdHJlYW1CdWZmZXJGcmVlZExpc3RlbmVyPiBtQnVmZmVyRnJlZWRMaXN0ZW5lcjsKIApAQCAtNTE3LDcgKzUyNiw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJMb2NrZWQoY2FtZXJhX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZChjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLCBpbnQzMl90IHRyYW5zZm9ybSwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyc0xvY2tlZChzdGQ6OnZlY3RvcjxPdXRzdGFuZGluZ0J1ZmZlcj4qKTsKQEAgLTYyMyw2ICs2MzIsOSBAQAogCiAgICAgYm9vbCBtSXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZTsKICAgICBib29sIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcgPSBmYWxzZTsKKworICAgIGJvb2wgbURldmljZVRpbWVCYXNlSXNSZWFsdGltZTsKKyAgICBpbnQgbVRpbWVzdGFtcEJhc2U7CiB9OyAvLyBjbGFzcyBDYW1lcmEzU3RyZWFtCiAKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCmluZGV4IDJkMzM5N2MuLjY4MTJlODkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgiCiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbUJ1ZmZlckZyZWVkTGlzdGVuZXIuaCIKQEAgLTY0LDYgKzY1LDggQEAKICAgICBjb25zdCBjaGFyKiBwaHlzaWNhbF9jYW1lcmFfaWQ7CiAKICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gc2Vuc29yX3BpeGVsX21vZGVzX3VzZWQ7CisgICAgaW50NjRfdCBkeW5hbWljX3JhbmdlX3Byb2ZpbGU7CisgICAgaW50NjRfdCB1c2VfY2FzZTsKIH0gY2FtZXJhX3N0cmVhbV90OwogCiB0eXBlZGVmIHN0cnVjdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciB7CkBAIC0xMDcsMTQgKzExMCw2MSBAQAogICAgICAgICBib29sIGZpbmFsaXplZCA9IGZhbHNlOwogICAgICAgICBib29sIHN1cHBvcnRzT2ZmbGluZSA9IGZhbHNlOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gc2Vuc29yUGl4ZWxNb2Rlc1VzZWQ7CisgICAgICAgIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZTsKKyAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlOworICAgICAgICBpbnQgdGltZXN0YW1wQmFzZTsKKyAgICAgICAgaW50IG1pcnJvck1vZGU7CiAgICAgICAgIE91dHB1dFN0cmVhbUluZm8oKSA6CiAgICAgICAgICAgICB3aWR0aCgtMSksIGhlaWdodCgtMSksIGZvcm1hdCgtMSksIGRhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pLAotICAgICAgICAgICAgY29uc3VtZXJVc2FnZSgwKSB7fQorICAgICAgICAgICAgY29uc3VtZXJVc2FnZSgwKSwKKyAgICAgICAgICAgIGR5bmFtaWNSYW5nZVByb2ZpbGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCksCisgICAgICAgICAgICBzdHJlYW1Vc2VDYXNlKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQpLAorICAgICAgICAgICAgdGltZXN0YW1wQmFzZShPdXRwdXRDb25maWd1cmF0aW9uOjpUSU1FU1RBTVBfQkFTRV9ERUZBVUxUKSwKKyAgICAgICAgICAgIG1pcnJvck1vZGUoT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfQVVUTykge30KICAgICAgICAgT3V0cHV0U3RyZWFtSW5mbyhpbnQgX3dpZHRoLCBpbnQgX2hlaWdodCwgaW50IF9mb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlIF9kYXRhU3BhY2UsCi0gICAgICAgICAgICAgICAgdWludDY0X3QgX2NvbnN1bWVyVXNhZ2UsIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiYgX3NlbnNvclBpeGVsTW9kZXNVc2VkKSA6CisgICAgICAgICAgICAgICAgdWludDY0X3QgX2NvbnN1bWVyVXNhZ2UsIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiYgX3NlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICAgICAgICAgIGludDY0X3QgX2R5bmFtaWNSYW5nZVByb2ZpbGUsIGludCBfc3RyZWFtVXNlQ2FzZSwgaW50IF90aW1lc3RhbXBCYXNlLCBpbnQgX21pcnJvck1vZGUpIDoKICAgICAgICAgICAgIHdpZHRoKF93aWR0aCksIGhlaWdodChfaGVpZ2h0KSwgZm9ybWF0KF9mb3JtYXQpLAogICAgICAgICAgICAgZGF0YVNwYWNlKF9kYXRhU3BhY2UpLCBjb25zdW1lclVzYWdlKF9jb25zdW1lclVzYWdlKSwKLSAgICAgICAgICAgIHNlbnNvclBpeGVsTW9kZXNVc2VkKF9zZW5zb3JQaXhlbE1vZGVzVXNlZCkge30KKyAgICAgICAgICAgIHNlbnNvclBpeGVsTW9kZXNVc2VkKF9zZW5zb3JQaXhlbE1vZGVzVXNlZCksIGR5bmFtaWNSYW5nZVByb2ZpbGUoX2R5bmFtaWNSYW5nZVByb2ZpbGUpLAorICAgICAgICAgICAgc3RyZWFtVXNlQ2FzZShfc3RyZWFtVXNlQ2FzZSksIHRpbWVzdGFtcEJhc2UoX3RpbWVzdGFtcEJhc2UpLCBtaXJyb3JNb2RlKF9taXJyb3JNb2RlKSB7fQorfTsKKworLy8gVXRpbGl0eSBjbGFzcyB0byBsb2NrIGFuZCB1bmxvY2sgYSBHcmFwaGljQnVmZmVyCitjbGFzcyBHcmFwaGljQnVmZmVyTG9ja2VyIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljQnVmZmVyTG9ja2VyKHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcikgOiBfYnVmZmVyKGJ1ZmZlcikge30KKworICAgIHN0YXR1c190IGxvY2tBc3luYyh1aW50MzJfdCB1c2FnZSwgdm9pZCoqIGRzdEJ1ZmZlciwgaW50IGZlbmNlRmQpIHsKKyAgICAgICAgaWYgKF9idWZmZXIgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgICAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICAgICAgaWYgKCFfbG9ja2VkKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSAgX2J1ZmZlci0+bG9ja0FzeW5jKHVzYWdlLCBkc3RCdWZmZXIsIGZlbmNlRmQpOworICAgICAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAgICAgICAgIF9sb2NrZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdHVzX3QgbG9ja0FzeW5jKHZvaWQqKiBkc3RCdWZmZXIsIGludCBmZW5jZUZkKSB7CisgICAgICAgIHJldHVybiBsb2NrQXN5bmMoR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgZHN0QnVmZmVyLCBmZW5jZUZkKTsKKyAgICB9CisKKyAgICB+R3JhcGhpY0J1ZmZlckxvY2tlcigpIHsKKyAgICAgICAgaWYgKF9sb2NrZWQgJiYgX2J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhdXRvIHJlcyA9IF9idWZmZXItPnVubG9jaygpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgdHJ5aW5nIHRvIHVubG9jayBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBfYnVmZmVyOworICAgIGJvb2wgX2xvY2tlZCA9IGZhbHNlOwogfTsKIAogLyoqCkBAIC0xNTQsNiArMjA0LDcgQEAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFdpZHRoKCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0SGVpZ2h0KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgaW50ICAgICAgZ2V0Rm9ybWF0KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50NjRfdCAgZ2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGFuZHJvaWRfZGF0YXNwYWNlIGdldERhdGFTcGFjZSgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9ybWF0T3ZlcnJpZGUoYm9vbCBmb3JtYXRPdmVycmlkZW4pID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaXNGb3JtYXRPdmVycmlkZGVuKCkgY29uc3QgPSAwOwpAQCAtMzU3LDkgKzQwOCw5IEBACiAgICAgICogRm9yIGJpZGlyZWN0aW9uYWwgc3RyZWFtcywgdGhpcyBtZXRob2QgYXBwbGllcyB0byB0aGUgb3V0cHV0LXNpZGUgYnVmZmVycwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyKGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gdHJ1ZSwKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9IHRydWUsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSwKLSAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lTnVtYmVyID0gMCkgPSAwOworICAgICAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIgPSAwLCBpbnQzMl90IHRyYW5zZm9ybSA9IC0xKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmFfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCmluZGV4IDVjNmM1MTguLmZkMjM5NTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKQEAgLTM0LDEzICszNCwxNiBAQAogCiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogCisjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbS5oIgorCiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpjb25uZWN0KGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzaXplX3QsIHNwPFN1cmZhY2U+PiAmc3VyZmFjZXMsCiAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIHVpbnQ2NF90IHByb2R1Y2VyVXNhZ2UsIHNpemVfdCBoYWxNYXhCdWZmZXJzLCB1aW50MzJfdCB3aWR0aCwKLSAgICAgICAgdWludDMyX3QgaGVpZ2h0LCBhbmRyb2lkOjpQaXhlbEZvcm1hdCBmb3JtYXQsIHNwPFN1cmZhY2U+KiBjb25zdW1lcikgeworICAgICAgICB1aW50MzJfdCBoZWlnaHQsIGFuZHJvaWQ6OlBpeGVsRm9ybWF0IGZvcm1hdCwgc3A8U3VyZmFjZT4qIGNvbnN1bWVyLAorICAgICAgICBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChjb25zdW1lciA9PSBudWxscHRyKSB7CiAgICAgICAgIFNQX0xPR0UoIiVzOiBjb25zdW1lciBwb2ludGVyIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOwpAQCAtNjEsNiArNjQsNyBAQAogCiAgICAgbU1heEhhbEJ1ZmZlcnMgPSBoYWxNYXhCdWZmZXJzOwogICAgIG1Db25zdW1lck5hbWUgPSBnZXRVbmlxdWVDb25zdW1lck5hbWUoKTsKKyAgICBtRHluYW1pY1JhbmdlUHJvZmlsZSA9IGR5bmFtaWNSYW5nZVByb2ZpbGU7CiAgICAgLy8gQWRkIG91dHB1dCBzdXJmYWNlcy4gVGhpcyBoYXMgdG8gYmUgYmVmb3JlIGNyZWF0aW5nIGludGVybmFsIGJ1ZmZlciBxdWV1ZQogICAgIC8vIGluIG9yZGVyIHRvIGdldCBtYXggY29uc3VtZXIgc2lkZSBidWZmZXJzLgogICAgIGZvciAoYXV0byAmaXQgOiBzdXJmYWNlcykgewpAQCAtMTM2LDYgKzE0MCw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgbU91dHB1dHMuY2xlYXIoKTsKKyAgICBtT3V0cHV0U3VyZmFjZXMuY2xlYXIoKTsKICAgICBtT3V0cHV0U2xvdHMuY2xlYXIoKTsKICAgICBtQ29uc3VtZXJCdWZmZXJDb3VudC5jbGVhcigpOwogCkBAIC0yNTgsNiArMjYzLDcgQEAKIAogICAgIC8vIEFkZCBuZXcgZW50cnkgaW50byBtT3V0cHV0cwogICAgIG1PdXRwdXRzW3N1cmZhY2VJZF0gPSBnYnA7CisgICAgbU91dHB1dFN1cmZhY2VzW3N1cmZhY2VJZF0gPSBvdXRwdXRRdWV1ZTsKICAgICBtQ29uc3VtZXJCdWZmZXJDb3VudFtzdXJmYWNlSWRdID0gbWF4Q29uc3VtZXJCdWZmZXJzOwogICAgIGlmIChtQ29uc3VtZXJCdWZmZXJDb3VudFtzdXJmYWNlSWRdID4gbU1heEhhbEJ1ZmZlcnMpIHsKICAgICAgICAgU1BfTE9HVygiJXM6IENvbnN1bWVyIGJ1ZmZlciBjb3VudCAlenUgbGFyZ2VyIHRoYW4gbWF4LiBIYWwgYnVmZmVyczogJXp1IiwgX19GVU5DVElPTl9fLApAQCAtMzE2LDYgKzMyMiw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgbU91dHB1dHNbc3VyZmFjZUlkXSA9IG51bGxwdHI7CisgICAgbU91dHB1dFN1cmZhY2VzW3N1cmZhY2VJZF0gPSBudWxscHRyOwogICAgIG1PdXRwdXRTbG90c1tnYnBdID0gbnVsbHB0cjsKICAgICBmb3IgKGNvbnN0IGF1dG8gJmlkIDogcGVuZGluZ0J1ZmZlcklkcykgewogICAgICAgICBkZWNyZW1lbnRCdWZSZWZDb3VudExvY2tlZChpZCwgc3VyZmFjZUlkKTsKQEAgLTM1Niw2ICszNjMsMTQgQEAKICAgICBjb25zdCBCdWZmZXJUcmFja2VyJiB0cmFja2VyID0gKihtQnVmZmVyc1tidWZmZXJJZF0pOwogICAgIGludCBzbG90ID0gZ2V0U2xvdEZvck91dHB1dExvY2tlZChvdXRwdXQsIHRyYWNrZXIuZ2V0QnVmZmVyKCkpOwogCisgICAgaWYgKG1PdXRwdXRTdXJmYWNlc1tzdXJmYWNlSWRdICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gYW53ID0gbU91dHB1dFN1cmZhY2VzW3N1cmZhY2VJZF07CisgICAgICAgIGNhbWVyYTM6OkNhbWVyYTNTdHJlYW06OnF1ZXVlSERSTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCktPmhhbmRsZSwgYW53LCBtRHluYW1pY1JhbmdlUHJvZmlsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU1BfTE9HRSgiJXM6IEludmFsaWQgc3VyZmFjZSBpZDogJXp1ISIsIF9fRlVOQ1RJT05fXywgc3VyZmFjZUlkKTsKKyAgICB9CisKICAgICAvLyBJbiBjYXNlIHRoZSBvdXRwdXQgQnVmZmVyUXVldWUgaGFzIGl0cyBvd24gbG9jaywgaWYgd2UgaG9sZCBzcGxpdHRlciBsb2NrIHdoaWxlIGNhbGxpbmcKICAgICAvLyBxdWV1ZUJ1ZmZlciAod2hpY2ggd2lsbCB0cnkgdG8gYWNxdWlyZSB0aGUgb3V0cHV0IGxvY2spLCB0aGUgb3V0cHV0IGNvdWxkIGJlIGhvbGRpbmcgaXRzCiAgICAgLy8gb3duIGxvY2sgY2FsbGluZyByZWxlYXNlQnVmZmVyICh3aGljaCAgd2lsbCB0cnkgdG8gYWNxdWlyZSB0aGUgc3BsaXR0ZXIgbG9jayksIHJ1bm5pbmcgaW50bwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKaW5kZXggNGViNDU1YS4uMGY3MjhhMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCkBAIC0xOSw2ICsxOSw4IEBACiAKICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisKICNpbmNsdWRlIDxndWkvSUNvbnN1bWVyTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxndWkvQnVmZmVySXRlbUNvbnN1bWVyLmg+CkBAIC01NSw3ICs1Nyw4IEBACiAgICAgLy8gd2l0aCBvdXRwdXQgc3VyZmFjZXMuCiAgICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c2l6ZV90LCBzcDxTdXJmYWNlPj4gJnN1cmZhY2VzLAogICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgdWludDY0X3QgcHJvZHVjZXJVc2FnZSwgc2l6ZV90IGhhbE1heEJ1ZmZlcnMsIHVpbnQzMl90IHdpZHRoLAotICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LCBhbmRyb2lkOjpQaXhlbEZvcm1hdCBmb3JtYXQsIHNwPFN1cmZhY2U+KiBjb25zdW1lcik7CisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsIGFuZHJvaWQ6OlBpeGVsRm9ybWF0IGZvcm1hdCwgc3A8U3VyZmFjZT4qIGNvbnN1bWVyLAorICAgICAgICAgICAgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlKTsKIAogICAgIC8vIGFkZE91dHB1dCBhZGRzIGFuIG91dHB1dCBCdWZmZXJRdWV1ZSB0byB0aGUgc3BsaXR0ZXIuIFRoZSBzcGxpdHRlcgogICAgIC8vIGNvbm5lY3RzIHRvIG91dHB1dFF1ZXVlIGFzIGEgQ1BVIHByb2R1Y2VyLCBhbmQgYW55IGJ1ZmZlcnMgcXVldWVkCkBAIC0yMzIsNiArMjM1LDcgQEAKICAgICB1aW50MzJfdCBtSGVpZ2h0ID0gMDsKICAgICBhbmRyb2lkOjpQaXhlbEZvcm1hdCBtRm9ybWF0ID0gYW5kcm9pZDo6UElYRUxfRk9STUFUX05PTkU7CiAgICAgdWludDY0X3QgbVByb2R1Y2VyVXNhZ2UgPSAwOworICAgIGludCBtRHluYW1pY1JhbmdlUHJvZmlsZSA9IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfU1RBTkRBUkQ7CiAKICAgICAvLyBUaGUgYXR0YWNoQnVmZmVyIGNhbGwgd2lsbCBoYXBwZW4gb24gZGlmZmVyZW50IHRocmVhZCBhY2NvcmRpbmcgdG8gbVVzZUhhbEJ1Zk1hbmFnZXIgYW5kIGhhdmUKICAgICAvLyBkaWZmZXJlbnQgdGltaW5nIGNvbnN0cmFpbnQuCkBAIC0yNTEsNiArMjU1LDkgQEAKICAgICAvL01hcCBzdXJmYWNlIGlkcyAtPiBnYnAgb3V0cHV0cwogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ID4gbU91dHB1dHM7CiAKKyAgICAvL01hcCBzdXJmYWNlIGlkcyAtPiBnYnAgb3V0cHV0cworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHNwPFN1cmZhY2U+PiBtT3V0cHV0U3VyZmFjZXM7CisKICAgICAvL01hcCBzdXJmYWNlIGlkcyAtPiBjb25zdW1lciBidWZmZXIgY291bnQKICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzaXplX3QgPiBtQ29uc3VtZXJCdWZmZXJDb3VudDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKaW5kZXggODlkZDExNS4uMTU4MDdiZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8Y21hdGg+CiAKICNpbmNsdWRlICJkZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuaCIKLSNpbmNsdWRlICJ1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmgiCisjaW5jbHVkZSAidXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hvc3QuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0luRmxpZ2h0UmVxdWVzdC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9JbkZsaWdodFJlcXVlc3QuaAppbmRleCA1MjNhMmM3Li40OTNhOWUyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0luRmxpZ2h0UmVxdWVzdC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvSW5GbGlnaHRSZXF1ZXN0LmgKQEAgLTMwLDYgKzMwLDY3IEBACiAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAordHlwZWRlZiBzdHJ1Y3QgY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uIHsKKyAgICB1aW50MzJfdCBudW1fc3RyZWFtczsKKyAgICBjYW1lcmFfc3RyZWFtX3QgKipzdHJlYW1zOworICAgIHVpbnQzMl90IG9wZXJhdGlvbl9tb2RlOworICAgIGJvb2wgaW5wdXRfaXNfbXVsdGlfcmVzb2x1dGlvbjsKK30gY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IGNhbWVyYV9jYXB0dXJlX3JlcXVlc3QgeworICAgIHVpbnQzMl90IGZyYW1lX251bWJlcjsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc2V0dGluZ3M7CisgICAgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqaW5wdXRfYnVmZmVyOworICAgIHVpbnQzMl90IG51bV9vdXRwdXRfYnVmZmVyczsKKyAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRfYnVmZmVyczsKKyAgICB1aW50MzJfdCBudW1fcGh5c2NhbV9zZXR0aW5nczsKKyAgICBjb25zdCBjaGFyICoqcGh5c2NhbV9pZDsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqKnBoeXNjYW1fc2V0dGluZ3M7CisgICAgaW50MzJfdCBpbnB1dF93aWR0aDsKKyAgICBpbnQzMl90IGlucHV0X2hlaWdodDsKK30gY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90OworCit0eXBlZGVmIHN0cnVjdCBjYW1lcmFfY2FwdHVyZV9yZXN1bHQgeworICAgIHVpbnQzMl90IGZyYW1lX251bWJlcjsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmVzdWx0OworICAgIHVpbnQzMl90IG51bV9vdXRwdXRfYnVmZmVyczsKKyAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRfYnVmZmVyczsKKyAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICppbnB1dF9idWZmZXI7CisgICAgdWludDMyX3QgcGFydGlhbF9yZXN1bHQ7CisgICAgdWludDMyX3QgbnVtX3BoeXNjYW1fbWV0YWRhdGE7CisgICAgY29uc3QgY2hhciAqKnBoeXNjYW1faWRzOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICoqcGh5c2NhbV9tZXRhZGF0YTsKK30gY2FtZXJhX2NhcHR1cmVfcmVzdWx0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGNhbWVyYV9zaHV0dGVyX21zZyB7CisgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyOworICAgIHVpbnQ2NF90IHRpbWVzdGFtcDsKKyAgICB1aW50NjRfdCByZWFkb3V0X3RpbWVzdGFtcDsKK30gY2FtZXJhX3NodXR0ZXJfbXNnX3Q7CisKK3R5cGVkZWYgc3RydWN0IGNhbWVyYV9lcnJvcl9tc2cgeworICAgIHVpbnQzMl90IGZyYW1lX251bWJlcjsKKyAgICBjYW1lcmFfc3RyZWFtX3QgKmVycm9yX3N0cmVhbTsKKyAgICBpbnQgZXJyb3JfY29kZTsKK30gY2FtZXJhX2Vycm9yX21zZ190OworCit0eXBlZGVmIGVudW0gY2FtZXJhX2Vycm9yX21zZ19jb2RlIHsKKyAgICBDQU1FUkFfTVNHX0VSUk9SX0RFVklDRSA9IDEsCisgICAgQ0FNRVJBX01TR19FUlJPUl9SRVFVRVNUID0gMiwKKyAgICBDQU1FUkFfTVNHX0VSUk9SX1JFU1VMVCA9IDMsCisgICAgQ0FNRVJBX01TR19FUlJPUl9CVUZGRVIgPSA0LAorICAgIENBTUVSQV9NU0dfTlVNX0VSUk9SUworfSBjYW1lcmFfZXJyb3JfbXNnX2NvZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2FtZXJhX25vdGlmeV9tc2cgeworICAgIGludCB0eXBlOworCisgICAgdW5pb24geworICAgICAgICBjYW1lcmFfZXJyb3JfbXNnX3QgZXJyb3I7CisgICAgICAgIGNhbWVyYV9zaHV0dGVyX21zZ190IHNodXR0ZXI7CisgICAgfSBtZXNzYWdlOworfSBjYW1lcmFfbm90aWZ5X21zZ190OworCiB0eXBlZGVmIGVudW0gewogICAgIC8vIENhY2hlIHRoZSBidWZmZXJzIHdpdGggU1RBVFVTX0VSUk9SIHdpdGhpbiBJbkZsaWdodFJlcXVlc3QKICAgICBFUlJPUl9CVUZfQ0FDSEUsCkBAIC00MSw5ICsxMDIsMTAgQEAKIH0gRVJST1JfQlVGX1NUUkFURUdZOwogCiBzdHJ1Y3QgSW5GbGlnaHRSZXF1ZXN0IHsKLQogICAgIC8vIFNldCBieSBub3RpZnkoKSBTSFVUVEVSIGNhbGwuCiAgICAgbnNlY3NfdCBzaHV0dGVyVGltZXN0YW1wOworICAgIC8vIFNldCBieSBub3RpZnkoKSBTSFVUVEVSIGNhbGwgd2l0aCByZWFkb3V0IHRpbWUuCisgICAgbnNlY3NfdCBzaHV0dGVyUmVhZG91dFRpbWVzdGFtcDsKICAgICAvLyBTZXQgYnkgcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdCgpLgogICAgIG5zZWNzX3Qgc2Vuc29yVGltZXN0YW1wOwogICAgIGludCAgICAgcmVxdWVzdFN0YXR1czsKQEAgLTgxLDYgKzE0MywxMSBAQAogICAgIC8vIGlzIG5vdCBmb3IgY29uc3RyYWluZWQgaGlnaCBzcGVlZCByZWNvcmRpbmcsIHRoaXMgZmxhZyB3aWxsIGFsc28gYmUgdHJ1ZS4KICAgICBib29sIGhhc0NhbGxiYWNrOwogCisgICAgLy8gTWluaW11bSBleHBlY3RlZCBmcmFtZSBkdXJhdGlvbiBmb3IgdGhpcyByZXF1ZXN0CisgICAgLy8gRm9yIG1hbnVhbCBjYXB0dXJlcywgZXF1YWwgdG8gdGhlIG1heCBvZiByZXF1ZXN0ZWQgZXhwb3N1cmUgdGltZSBhbmQgZnJhbWUgZHVyYXRpb24KKyAgICAvLyBGb3IgYXV0by1leHBvc3VyZSBtb2RlcywgZXF1YWwgdG8gMS8oaGlnaGVyIGVuZCBvZiB0YXJnZXQgRlBTIHJhbmdlKQorICAgIG5zZWNzX3QgbWluRXhwZWN0ZWREdXJhdGlvbjsKKwogICAgIC8vIE1heGltdW0gZXhwZWN0ZWQgZnJhbWUgZHVyYXRpb24gZm9yIHRoaXMgcmVxdWVzdC4KICAgICAvLyBGb3IgbWFudWFsIGNhcHR1cmVzLCBlcXVhbCB0byB0aGUgbWF4IG9mIHJlcXVlc3RlZCBleHBvc3VyZSB0aW1lIGFuZCBmcmFtZSBkdXJhdGlvbgogICAgIC8vIEZvciBhdXRvLWV4cG9zdXJlIG1vZGVzLCBlcXVhbCB0byAxLyhsb3dlciBlbmQgb2YgdGFyZ2V0IEZQUyByYW5nZSkKQEAgLTEyMiw4ICsxODksMTEgQEAKICAgICAvLyBXaGF0IHNoYXJlZCBzdXJmYWNlcyBhbiBvdXRwdXQgc2hvdWxkIGdvIHRvCiAgICAgU3VyZmFjZU1hcCBvdXRwdXRTdXJmYWNlczsKIAotICAgIC8vIFRPRE86IGRlZHVwZQotICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtEZWZhdWx0RXhwZWN0ZWREdXJhdGlvbiA9IDEwMDAwMDAwMDsgLy8gMTAwIG1zCisgICAgLy8gQ3VycmVudCBvdXRwdXQgdHJhbnNmb3JtYXRpb24KKyAgICBpbnQzMl90IHRyYW5zZm9ybTsKKworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtEZWZhdWx0TWluRXhwZWN0ZWREdXJhdGlvbiA9IDMzMzMzMzMzOyAvLyAzMyBtcworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtEZWZhdWx0TWF4RXhwZWN0ZWREdXJhdGlvbiA9IDEwMDAwMDAwMDsgLy8gMTAwIG1zCiAKICAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yIG5lZWRlZCBieSBLZXllZFZlY3RvcgogICAgIEluRmxpZ2h0UmVxdWVzdCgpIDoKQEAgLTEzNCwxNyArMjA0LDE5IEBACiAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdCgwKSwKICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKSwKICAgICAgICAgICAgIGhhc0NhbGxiYWNrKHRydWUpLAotICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihrRGVmYXVsdEV4cGVjdGVkRHVyYXRpb24pLAorICAgICAgICAgICAgbWluRXhwZWN0ZWREdXJhdGlvbihrRGVmYXVsdE1pbkV4cGVjdGVkRHVyYXRpb24pLAorICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihrRGVmYXVsdE1heEV4cGVjdGVkRHVyYXRpb24pLAogICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKICAgICAgICAgICAgIGVycm9yQnVmU3RyYXRlZ3koRVJST1JfQlVGX0NBQ0hFKSwKICAgICAgICAgICAgIHN0aWxsQ2FwdHVyZShmYWxzZSksCiAgICAgICAgICAgICB6c2xDYXB0dXJlKGZhbHNlKSwKICAgICAgICAgICAgIHJvdGF0ZUFuZENyb3BBdXRvKGZhbHNlKSwKLSAgICAgICAgICAgIHJlcXVlc3RUaW1lTnMoMCkgeworICAgICAgICAgICAgcmVxdWVzdFRpbWVOcygwKSwKKyAgICAgICAgICAgIHRyYW5zZm9ybSgtMSkgewogICAgIH0KIAogICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMsIGJvb2wgaGFzSW5wdXQsCi0gICAgICAgICAgICBib29sIGhhc0FwcENhbGxiYWNrLCBuc2Vjc190IG1heER1cmF0aW9uLAorICAgICAgICAgICAgYm9vbCBoYXNBcHBDYWxsYmFjaywgbnNlY3NfdCBtaW5EdXJhdGlvbiwgbnNlY3NfdCBtYXhEdXJhdGlvbiwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c2V0PFN0cmluZzg+PiYgcGh5c2ljYWxDYW1lcmFJZFNldCwgYm9vbCBpc1N0aWxsQ2FwdHVyZSwKICAgICAgICAgICAgIGJvb2wgaXNac2xDYXB0dXJlLCBib29sIHJvdGF0ZUFuZENyb3BBdXRvLCBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGlkc1dpdGhab29tLAogICAgICAgICAgICAgbnNlY3NfdCByZXF1ZXN0TnMsIGNvbnN0IFN1cmZhY2VNYXAmIG91dFN1cmZhY2VzID0gU3VyZmFjZU1hcHt9KSA6CkBAIC0xNTYsNiArMjI4LDcgQEAKICAgICAgICAgICAgIHJlc3VsdEV4dHJhcyhleHRyYXMpLAogICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoaGFzSW5wdXQpLAogICAgICAgICAgICAgaGFzQ2FsbGJhY2soaGFzQXBwQ2FsbGJhY2spLAorICAgICAgICAgICAgbWluRXhwZWN0ZWREdXJhdGlvbihtaW5EdXJhdGlvbiksCiAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uKG1heER1cmF0aW9uKSwKICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YShmYWxzZSksCiAgICAgICAgICAgICBlcnJvckJ1ZlN0cmF0ZWd5KEVSUk9SX0JVRl9DQUNIRSksCkBAIC0xNjUsNyArMjM4LDggQEAKICAgICAgICAgICAgIHJvdGF0ZUFuZENyb3BBdXRvKHJvdGF0ZUFuZENyb3BBdXRvKSwKICAgICAgICAgICAgIGNhbWVyYUlkc1dpdGhab29tKGlkc1dpdGhab29tKSwKICAgICAgICAgICAgIHJlcXVlc3RUaW1lTnMocmVxdWVzdE5zKSwKLSAgICAgICAgICAgIG91dHB1dFN1cmZhY2VzKG91dFN1cmZhY2VzKSB7CisgICAgICAgICAgICBvdXRwdXRTdXJmYWNlcyhvdXRTdXJmYWNlcyksCisgICAgICAgICAgICB0cmFuc2Zvcm0oLTEpIHsKICAgICB9CiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1ByZXZpZXdGcmFtZVNwYWNlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1ByZXZpZXdGcmFtZVNwYWNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzOTUwMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvUHJldmlld0ZyYW1lU3BhY2VyLmNwcApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1QcmV2aWV3RnJhbWVTcGFjZXIiCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiUHJldmlld0ZyYW1lU3BhY2VyLmgiCisjaW5jbHVkZSAiQ2FtZXJhM091dHB1dFN0cmVhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworUHJldmlld0ZyYW1lU3BhY2VyOjpQcmV2aWV3RnJhbWVTcGFjZXIod3A8Q2FtZXJhM091dHB1dFN0cmVhbT4gcGFyZW50LCBzcDxTdXJmYWNlPiBjb25zdW1lcikgOgorICAgICAgICBtUGFyZW50KHBhcmVudCksCisgICAgICAgIG1Db25zdW1lcihjb25zdW1lcikgeworfQorCitQcmV2aWV3RnJhbWVTcGFjZXI6On5QcmV2aWV3RnJhbWVTcGFjZXIoKSB7Cit9CisKK3N0YXR1c190IFByZXZpZXdGcmFtZVNwYWNlcjo6cXVldWVQcmV2aWV3QnVmZmVyKG5zZWNzX3QgdGltZXN0YW1wLCBuc2Vjc190IHJlYWRvdXRUaW1lc3RhbXAsCisgICAgICAgIGludDMyX3QgdHJhbnNmb3JtLCBBTmF0aXZlV2luZG93QnVmZmVyKiBhbndCdWZmZXIsIGludCByZWxlYXNlRmVuY2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgbVBlbmRpbmdCdWZmZXJzLmVtcGxhY2UodGltZXN0YW1wLCByZWFkb3V0VGltZXN0YW1wLCB0cmFuc2Zvcm0sIGFud0J1ZmZlciwgcmVsZWFzZUZlbmNlKTsKKyAgICBBTE9HVigiJXM6IG1QZW5kaW5nQnVmZmVycyBzaXplICV6dSwgdGltZXN0YW1wICUiIFBSSWQ2NCAiLCByZWFkb3V0VGltZSAlIiBQUklkNjQsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1QZW5kaW5nQnVmZmVycy5zaXplKCksIHRpbWVzdGFtcCwgcmVhZG91dFRpbWVzdGFtcCk7CisKKyAgICBtQnVmZmVyQ29uZC5zaWduYWwoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgUHJldmlld0ZyYW1lU3BhY2VyOjp0aHJlYWRMb29wKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBpZiAobVBlbmRpbmdCdWZmZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIG1CdWZmZXJDb25kLndhaXRSZWxhdGl2ZShtTG9jaywga1dhaXREdXJhdGlvbik7CisgICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG5zZWNzX3QgY3VycmVudFRpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgYXV0byBidWZmZXIgPSBtUGVuZGluZ0J1ZmZlcnMuZnJvbnQoKTsKKyAgICBuc2Vjc190IHJlYWRvdXRJbnRlcnZhbCA9IGJ1ZmZlci5yZWFkb3V0VGltZXN0YW1wIC0gbUxhc3RDYW1lcmFSZWFkb3V0VGltZTsKKyAgICAvLyBJZiB0aGUgcmVhZG91dCBpbnRlcnZhbCBleGNlZWRzIHRocmVzaG9sZCwgZGlyZWN0bHkgcXVldWUKKyAgICAvLyBjYWNoZWQgYnVmZmVyLgorICAgIGlmIChyZWFkb3V0SW50ZXJ2YWwgPj0ga0ZyYW1lSW50ZXJ2YWxUaHJlc2hvbGQpIHsKKyAgICAgICAgbVBlbmRpbmdCdWZmZXJzLnBvcCgpOworICAgICAgICBxdWV1ZUJ1ZmZlclRvQ2xpZW50TG9ja2VkKGJ1ZmZlciwgY3VycmVudFRpbWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBDYWNoZSB0aGUgZnJhbWUgdG8gbWF0Y2ggcmVhZG91dCB0aW1lIGludGVydmFsLCBmb3IgdXAgdG8gMzNtcworICAgIG5zZWNzX3QgZXhwZWN0ZWRRdWV1ZVRpbWUgPSBtTGFzdENhbWVyYVByZXNlbnRUaW1lICsgcmVhZG91dEludGVydmFsOworICAgIG5zZWNzX3QgZnJhbWVXYWl0VGltZSA9IHN0ZDo6bWluKGtNYXhGcmFtZVdhaXRUaW1lLCBleHBlY3RlZFF1ZXVlVGltZSAtIGN1cnJlbnRUaW1lKTsKKyAgICBpZiAoZnJhbWVXYWl0VGltZSA+IDAgJiYgbVBlbmRpbmdCdWZmZXJzLnNpemUoKSA8IDIpIHsKKyAgICAgICAgbUJ1ZmZlckNvbmQud2FpdFJlbGF0aXZlKG1Mb2NrLCBmcmFtZVdhaXRUaW1lKTsKKyAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50VGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiByZWFkb3V0SW50ZXJ2YWwgJSIgUFJJZDY0ICIsIHF1ZXVlSW50ZXJ2YWwgJSIgUFJJZDY0ICIsIHdhaXRlZCBmb3IgJSIgUFJJZDY0CisgICAgICAgICAgICAiLCB0aW1lc3RhbXAgJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sIHJlYWRvdXRJbnRlcnZhbCwKKyAgICAgICAgICAgIGN1cnJlbnRUaW1lIC0gbUxhc3RDYW1lcmFQcmVzZW50VGltZSwgZnJhbWVXYWl0VGltZSwgYnVmZmVyLnRpbWVzdGFtcCk7CisgICAgbVBlbmRpbmdCdWZmZXJzLnBvcCgpOworICAgIHF1ZXVlQnVmZmVyVG9DbGllbnRMb2NrZWQoYnVmZmVyLCBjdXJyZW50VGltZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUHJldmlld0ZyYW1lU3BhY2VyOjpyZXF1ZXN0RXhpdCgpIHsKKyAgICAvLyBDYWxsIHBhcmVudCB0byBzZXQgdXAgc2h1dGRvd24KKyAgICBUaHJlYWQ6OnJlcXVlc3RFeGl0KCk7CisgICAgLy8gRXhpdCBmcm9tIG90aGVyIHBvc3NpYmxlIHdhaXQKKyAgICBtQnVmZmVyQ29uZC5zaWduYWwoKTsKK30KKwordm9pZCBQcmV2aWV3RnJhbWVTcGFjZXI6OnF1ZXVlQnVmZmVyVG9DbGllbnRMb2NrZWQoCisgICAgICAgIGNvbnN0IEJ1ZmZlckhvbGRlciYgYnVmZmVySG9sZGVyLCBuc2Vjc190IGN1cnJlbnRUaW1lKSB7CisgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlczogUGFyZW50IGNhbWVyYTMgb3V0cHV0IHN0cmVhbSB3YXMgZGVzdHJveWVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBhcmVudC0+c2V0VHJhbnNmb3JtKGJ1ZmZlckhvbGRlci50cmFuc2Zvcm0sIHRydWUvKm1heUNoYW5nZU1pcnJvciovKTsKKworICAgIHN0YXR1c190IHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1Db25zdW1lci5nZXQoKSwgYnVmZmVySG9sZGVyLnRpbWVzdGFtcCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFByZXZpZXcgU3RyZWFtOiBFcnJvciBzZXR0aW5nIHRpbWVzdGFtcDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisKKyAgICBDYW1lcmEzU3RyZWFtOjpxdWV1ZUhEUk1ldGFkYXRhKGJ1ZmZlckhvbGRlci5hbndCdWZmZXIuZ2V0KCktPmhhbmRsZSwgbUNvbnN1bWVyLAorICAgICAgICAgICAgcGFyZW50LT5nZXREeW5hbWljUmFuZ2VQcm9maWxlKCkpOworCisgICAgcmVzID0gbUNvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihtQ29uc3VtZXIuZ2V0KCksIGJ1ZmZlckhvbGRlci5hbndCdWZmZXIuZ2V0KCksCisgICAgICAgICAgICBidWZmZXJIb2xkZXIucmVsZWFzZUZlbmNlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIGNsb3NlKGJ1ZmZlckhvbGRlci5yZWxlYXNlRmVuY2UpOworICAgICAgICBpZiAocGFyZW50LT5zaG91bGRMb2dFcnJvcihyZXMpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBxdWV1ZSBidWZmZXIgdG8gY2xpZW50OiAlcyglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgbUxhc3RDYW1lcmFQcmVzZW50VGltZSA9IGN1cnJlbnRUaW1lOworICAgIG1MYXN0Q2FtZXJhUmVhZG91dFRpbWUgPSBidWZmZXJIb2xkZXIucmVhZG91dFRpbWVzdGFtcDsKK30KKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvUHJldmlld0ZyYW1lU3BhY2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1ByZXZpZXdGcmFtZVNwYWNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNjU3NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1ByZXZpZXdGcmFtZVNwYWNlci5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19QUkVWSUVXRlJBTUVTUEFDRVJfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfUFJFVklFV0ZSQU1FU1BBQ0VSX0gKKworI2luY2x1ZGUgPHF1ZXVlPgorCisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworY2xhc3MgQ2FtZXJhM091dHB1dFN0cmVhbTsKKworLyoqKgorICogUHJldmlldyBzdHJlYW0gc3BhY2VyIGZvciBiZXR0ZXIgZnJhbWUgc3BhY2luZworICoKKyAqIFRoZSBpZGVhbCB2aWV3ZmluZGVyIHVzZXIgZXhwZXJpZW5jZSBpcyB0aGF0IGZyYW1lcyBhcmUgcHJlc2VudGVkIHRvIHRoZQorICogdXNlciBpbiB0aGUgc2FtZSBjYWRlbmNlIGFzIG91dHB1dGVkIGJ5IHRoZSBjYW1lcmEgc2Vuc29yLiBIb3dldmVyLCB0aGUKKyAqIHByb2Nlc3NpbmcgbGF0ZW5jeSBiZXR3ZWVuIGZyYW1lcyBjb3VsZCB2YXJ5LCBkdWUgdG8gZmFjdG9ycyBzdWNoCisgKiBhcyBDUFUgbG9hZCwgZGlmZmVyZW5jZXMgaW4gcmVxdWVzdCBzZXR0aW5ncywgZXRjLiBUaGlzIGZyYW1lIHByb2Nlc3NpbmcKKyAqIGxhdGVuY3kgcmVzdWx0cyBpbiB2YXJpYXRpb24gaW4gcHJlc2VudGF0aW9uIG9mIGZyYW1lcyB0byB0aGUgdXNlci4KKyAqCisgKiBUaGUgUHJldmlld0ZyYW1lU3BhY2VyIGltcHJvdmVzIHRoZSB2aWV3ZmluZGVyIHVzZXIgZXhwZXJpZW5jZSBieToKKyAqIC0gQ2FjaGUgdGhlIGZyYW1lIGJ1ZmZlcnMgaWYgdGhlIGludGVydmFscyBiZXR3ZWVuIHF1ZXVlQnVmZmVyIGlzIHNob3J0ZXIKKyAqICAgdGhhbiB0aGUgY2FtZXJhIHJlYWRvdXQgaW50ZXJ2YWxzLgorICogLSBRdWV1ZSBmcmFtZSBidWZmZXJzIGluIHRoZSBzYW1lIGNhZGVuY2UgYXMgdGhlIGNhbWVyYSByZWFkb3V0IHRpbWUuCisgKiAtIE1haW50YWluIGF0IG1vc3QgMSBxdWV1ZS1hYmxlIGJ1ZmZlci4gSWYgdGhlIDJuZCBwcmV2aWV3IGJ1ZmZlciBiZWNvbWVzCisgKiAgIGF2YWlsYWJsZSwgcXVldWUgdGhlIG9sZGVzdCBjYWNoZWQgYnVmZmVyIHRvIHRoZSBidWZmZXIgcXVldWUuCisgKi8KK2NsYXNzIFByZXZpZXdGcmFtZVNwYWNlciA6IHB1YmxpYyBUaHJlYWQgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgUHJldmlld0ZyYW1lU3BhY2VyKHdwPENhbWVyYTNPdXRwdXRTdHJlYW0+IHBhcmVudCwgc3A8U3VyZmFjZT4gY29uc3VtZXIpOworICAgIHZpcnR1YWwgflByZXZpZXdGcmFtZVNwYWNlcigpOworCisgICAgLy8gUXVldWUgcHJldmlldyBidWZmZXIgbG9jYWxseQorICAgIHN0YXR1c190IHF1ZXVlUHJldmlld0J1ZmZlcihuc2Vjc190IHRpbWVzdGFtcCwgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wLAorICAgICAgICAgICAgaW50MzJfdCB0cmFuc2Zvcm0sIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFud0J1ZmZlciwgaW50IHJlbGVhc2VGZW5jZSk7CisKKyAgICBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIHJlcXVlc3RFeGl0KCkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBzdHJ1Y3R1cmUgaG9sZGluZyBjYWNoZWQgcHJldmlldyBidWZmZXIgaW5mbworICAgIHN0cnVjdCBCdWZmZXJIb2xkZXIgeworICAgICAgICBuc2Vjc190IHRpbWVzdGFtcDsKKyAgICAgICAgbnNlY3NfdCByZWFkb3V0VGltZXN0YW1wOworICAgICAgICBpbnQzMl90IHRyYW5zZm9ybTsKKyAgICAgICAgc3A8QU5hdGl2ZVdpbmRvd0J1ZmZlcj4gYW53QnVmZmVyOworICAgICAgICBpbnQgcmVsZWFzZUZlbmNlOworCisgICAgICAgIEJ1ZmZlckhvbGRlcihuc2Vjc190IHQsIG5zZWNzX3QgcmVhZG91dFQsIGludDMyX3QgdHIsIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFud2IsIGludCByZikgOgorICAgICAgICAgICAgICAgIHRpbWVzdGFtcCh0KSwgcmVhZG91dFRpbWVzdGFtcChyZWFkb3V0VCksIHRyYW5zZm9ybSh0ciksIGFud0J1ZmZlcihhbndiKSwKKyAgICAgICAgICAgICAgICByZWxlYXNlRmVuY2UocmYpIHt9CisgICAgfTsKKworICAgIHZvaWQgcXVldWVCdWZmZXJUb0NsaWVudExvY2tlZChjb25zdCBCdWZmZXJIb2xkZXImIGJ1ZmZlckhvbGRlciwgbnNlY3NfdCBjdXJyZW50VGltZSk7CisKKyAgICB3cDxDYW1lcmEzT3V0cHV0U3RyZWFtPiBtUGFyZW50OworICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1Db25zdW1lcjsKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworICAgIENvbmRpdGlvbiBtQnVmZmVyQ29uZDsKKworICAgIHN0ZDo6cXVldWU8QnVmZmVySG9sZGVyPiBtUGVuZGluZ0J1ZmZlcnM7CisgICAgbnNlY3NfdCBtTGFzdENhbWVyYVJlYWRvdXRUaW1lID0gMDsKKyAgICBuc2Vjc190IG1MYXN0Q2FtZXJhUHJlc2VudFRpbWUgPSAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgbnNlY3NfdCBrV2FpdER1cmF0aW9uID0gNTAwMDAwMExMOyAvLyA1MG1zCisgICAgc3RhdGljIGNvbnN0ZXhwciBuc2Vjc190IGtGcmFtZUludGVydmFsVGhyZXNob2xkID0gODAwMDAwMDBMTDsgLy8gODBtcworICAgIHN0YXRpYyBjb25zdGV4cHIgbnNlY3NfdCBrTWF4RnJhbWVXYWl0VGltZSA9IDMzMzMzMzMzTEw7IC8vIDMzbXMKK307CisKK307IC8vbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1pvb21SYXRpb01hcHBlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1pvb21SYXRpb01hcHBlci5jcHAKaW5kZXggN2VjMDk1Ni4uMjdiMDBjOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9ab29tUmF0aW9NYXBwZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvWm9vbVJhdGlvTWFwcGVyLmNwcApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAogI2luY2x1ZGUgImRldmljZTMvWm9vbVJhdGlvTWFwcGVyLmgiCi0jaW5jbHVkZSAidXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oIgorI2luY2x1ZGUgInV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIb3N0LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM0RldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1NTIwZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM0RldmljZS5jcHAKQEAgLTAsMCArMSwxNTgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBaWRsQ2FtZXJhMy1EZXZpY2UiCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBMT0dfTk5ERUJVRyAwICAvLyBQZXItZnJhbWUgdmVyYm9zZSBsb2dnaW5nCisKKyNpZmRlZiBMT0dfTk5ERUJVRworI2RlZmluZSBBTE9HVlYoLi4uKSBBTE9HVihfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIEFMT0dWViguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKy8vIENvbnZlbmllbmNlIG1hY3JvIGZvciB0cmFuc2llbnQgZXJyb3JzCisjZGVmaW5lIENMT0dFKGZtdCwgLi4uKSBBTE9HRSgiQ2FtZXJhICVzOiAlczogIiBmbXQsIG1JZC5zdHJpbmcoKSwgX19GVU5DVElPTl9fLCBcCisgICAgICAgICAgICAjI19fVkFfQVJHU19fKQorCisjZGVmaW5lIENMT0dXKGZtdCwgLi4uKSBBTE9HVygiQ2FtZXJhICVzOiAlczogIiBmbXQsIG1JZC5zdHJpbmcoKSwgX19GVU5DVElPTl9fLCBcCisgICAgICAgICAgICAjI19fVkFfQVJHU19fKQorCisvLyBDb252ZW5pZW5jZSBtYWNyb3MgZm9yIHRyYW5zaXRpb25pbmcgdG8gdGhlIGVycm9yIHN0YXRlCisjZGVmaW5lIFNFVF9FUlIoZm10LCAuLi4pIHNldEVycm9yU3RhdGUoICAgXAorICAgICIlczogIiBmbXQsIF9fRlVOQ1RJT05fXywgICAgICAgICAgICAgIFwKKyAgICAjI19fVkFfQVJHU19fKQorI2RlZmluZSBTRVRfRVJSX0woZm10LCAuLi4pIHNldEVycm9yU3RhdGVMb2NrZWQoIFwKKyAgICAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICAgICAgICAgICAgICAgICAgICBcCisgICAgIyNfX1ZBX0FSR1NfXykKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvSUNhbWVyYUluamVjdGlvblNlc3Npb24uaD4KKyNpbmNsdWRlIDxhaWRsY29tbW9uc3VwcG9ydC9OYXRpdmVIYW5kbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaD4KKworI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRyYWNlcy5oIgorI2luY2x1ZGUgIm1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0Zha2VTdHJlYW0uaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCIKKyNpbmNsdWRlICJkZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPdXRwdXRVdGlscy5oIgorI2luY2x1ZGUgImRldmljZTMvYWlkbC9BaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmgiCisjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCisjaW5jbHVkZSAidXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oIgorI2luY2x1ZGUgInV0aWxzL1RyYWNlSEZSLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5oIgorCisjaW5jbHVkZSAiLi4vLi4vY29tbW9uL2FpZGwvQWlkbFByb3ZpZGVySW5mby5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiQWlkbENhbWVyYTNEZXZpY2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7Cit1c2luZyBuYW1lc3BhY2UgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU7Cit1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjptZXRhZGF0YTo6U2Vuc29yUGl4ZWxNb2RlOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6bWV0YWRhdGE6OlJlcXVlc3RBdmFpbGFibGVEeW5hbWljUmFuZ2VQcm9maWxlc01hcDsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6Om1ldGFkYXRhOjpTY2FsZXJBdmFpbGFibGVTdHJlYW1Vc2VDYXNlczsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitSZXF1ZXN0QXZhaWxhYmxlRHluYW1pY1JhbmdlUHJvZmlsZXNNYXAKK21hcFRvQWlkbER5bmFtaWNQcm9maWxlKGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXF1ZXN0QXZhaWxhYmxlRHluYW1pY1JhbmdlUHJvZmlsZXNNYXA+KGR5bmFtaWNSYW5nZVByb2ZpbGUpOworfQorCithaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6UGl4ZWxGb3JtYXQgQWlkbENhbWVyYTNEZXZpY2U6Om1hcFRvQWlkbFBpeGVsRm9ybWF0KAorICAgICAgICBpbnQgZnJhbWV3b3JrRm9ybWF0KSB7CisgICAgcmV0dXJuIChhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6UGl4ZWxGb3JtYXQpIGZyYW1ld29ya0Zvcm1hdDsKK30KKworYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OkRhdGFzcGFjZSBBaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9BaWRsRGF0YXNwYWNlKAorICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpIHsKKyAgICByZXR1cm4gKGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpEYXRhc3BhY2UpZGF0YVNwYWNlOworfQorCithaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6QnVmZmVyVXNhZ2UgQWlkbENhbWVyYTNEZXZpY2U6Om1hcFRvQWlkbENvbnN1bWVyVXNhZ2UoCisgICAgICAgIHVpbnQ2NF90IHVzYWdlKSB7CisgICAgcmV0dXJuIChhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6QnVmZmVyVXNhZ2UpdXNhZ2U7Cit9CisKK2FpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtUm90YXRpb24KK0FpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0FpZGxTdHJlYW1Sb3RhdGlvbihjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pIHsKKyAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7CisgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl8wOgorICAgICAgICAgICAgcmV0dXJuIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzA7CisgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl85MDoKKyAgICAgICAgICAgIHJldHVybiBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl85MDsKKyAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzE4MDoKKyAgICAgICAgICAgIHJldHVybiBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8xODA7CisgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl8yNzA6CisgICAgICAgICAgICByZXR1cm4gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMjcwOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFVua25vd24gc3RyZWFtIHJvdGF0aW9uICVkIiwgX19GVU5DVElPTl9fLCByb3RhdGlvbik7CisgICAgcmV0dXJuIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzA7Cit9CisKK3N0YXR1c190IEFpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0FpZGxTdHJlYW1Db25maWd1cmF0aW9uTW9kZSgKKyAgICAgICAgY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCBvcGVyYXRpb25Nb2RlLAorICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKSB7CisgICAgdXNpbmcgU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgPQorICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKKyAgICBpZiAobW9kZSA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmIChvcGVyYXRpb25Nb2RlIDwgQ0FNRVJBX1ZFTkRPUl9TVFJFQU1fQ09ORklHVVJBVElPTl9NT0RFX1NUQVJUKSB7CisgICAgICAgIHN3aXRjaChvcGVyYXRpb25Nb2RlKSB7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERToKKyAgICAgICAgICAgICAgICAqbW9kZSA9IFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpOT1JNQUxfTU9ERTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9DT05GSUdVUkFUSU9OX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERToKKyAgICAgICAgICAgICAgICAqbW9kZSA9IFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBzdHJlYW0gY29uZmlndXJhdGlvbiBtb2RlICVkIiwgX19GVU5DVElPTl9fLCBvcGVyYXRpb25Nb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm1vZGUgPSBzdGF0aWNfY2FzdDxTdHJlYW1Db25maWd1cmF0aW9uTW9kZT4ob3BlcmF0aW9uTW9kZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworaW50IEFpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0ZyYW1ld29ya0Zvcm1hdCgKKyAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihwaXhlbEZvcm1hdCk7Cit9CisKK2FuZHJvaWRfZGF0YXNwYWNlIEFpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0ZyYW1ld29ya0RhdGFzcGFjZSgKKyAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OkRhdGFzcGFjZSBkYXRhU3BhY2UpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KGRhdGFTcGFjZSk7Cit9CisKK3VpbnQ2NF90IEFpZGxDYW1lcmEzRGV2aWNlOjptYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2UoCisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpCdWZmZXJVc2FnZSB1c2FnZSkgeworICAgIHJldHVybiAodWludDY0X3QpdXNhZ2U7Cit9CisKK3VpbnQ2NF90IEFpZGxDYW1lcmEzRGV2aWNlOjptYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2UoCisgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OkJ1ZmZlclVzYWdlIHVzYWdlKSB7CisgICAgcmV0dXJuICh1aW50NjRfdCl1c2FnZTsKK30KKworQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxDYW1lcmEzRGV2aWNlKGNvbnN0IFN0cmluZzgmIGlkLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAorICAgICAgICAgICAgYm9vbCBsZWdhY3lDbGllbnQpIDogQ2FtZXJhM0RldmljZShpZCwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIGxlZ2FjeUNsaWVudCkgeworICAgICAgICBtQ2FsbGJhY2tzID0gbmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPEFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3M+KHRoaXMpOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIEFMT0dWKCIlczogSW5pdGlhbGl6aW5nIEFJREwgZGV2aWNlIGZvciBjYW1lcmEgJXMiLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CisgICAgaWYgKG1TdGF0dXMgIT0gU1RBVFVTX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgQ0xPR0UoIkFscmVhZHkgaW5pdGlhbGl6ZWQhIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG1hbmFnZXIgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gc2Vzc2lvbjsKKyAgICBBVFJBQ0VfQkVHSU4oIkNhbWVyYUhhbDo6b3BlblNlc3Npb24iKTsKKyAgICBzdGF0dXNfdCByZXMgPSBtYW5hZ2VyLT5vcGVuQWlkbFNlc3Npb24obUlkLnN0cmluZygpLCBtQ2FsbGJhY2tzLAorICAgICAgICAgICAgLypvdXQqLyAmc2Vzc2lvbik7CisgICAgQVRSQUNFX0VORCgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgU0VUX0VSUl9MKCJDb3VsZCBub3Qgb3BlbiBjYW1lcmEgc2Vzc2lvbjogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyKSB7CisgICAgICBTRVRfRVJSKCJTZXNzaW9uIGlmYWNlIHJldHVybmVkIGlzIG51bGwiKTsKKyAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmVzID0gbWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKG1JZC5zdHJpbmcoKSwgbU92ZXJyaWRlRm9yUGVyZkNsYXNzLCAmbURldmljZUluZm8pOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgU0VUX0VSUl9MKCJDb3VsZCBub3QgcmV0cmlldmUgY2FtZXJhIGNoYXJhY3RlcmlzdGljczogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBzZXNzaW9uLT5jbG9zZSgpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBtU3VwcG9ydE5hdGl2ZVpvb21SYXRpbyA9IG1hbmFnZXItPnN1cHBvcnROYXRpdmVab29tUmF0aW8obUlkLnN0cmluZygpKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICBib29sIGlzTG9naWNhbCA9IG1hbmFnZXItPmlzTG9naWNhbENhbWVyYShtSWQuc3RyaW5nKCksICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgaWYgKGlzTG9naWNhbCkgeworICAgICAgICBmb3IgKGF1dG8mIHBoeXNpY2FsSWQgOiBwaHlzaWNhbENhbWVyYUlkcykgeworICAgICAgICAgICAgLy8gRG8gbm90IG92ZXJyaWRlIGNoYXJhY3RlcmlzdGljcyBmb3IgcGh5c2ljYWwgY2FtZXJhcworICAgICAgICAgICAgcmVzID0gbWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbElkLCAvKm92ZXJyaWRlRm9yUGVyZkNsYXNzKi9mYWxzZSwgJm1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiQ291bGQgbm90IHJldHJpZXZlIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3M6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxJZC5jX3N0cigpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLT5jbG9zZSgpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgdXNlUHJlY29ycmVjdEFycmF5ID0KKyAgICAgICAgICAgICAgICAgICAgRGlzdG9ydGlvbk1hcHBlcjo6aXNEaXN0b3J0aW9uU3VwcG9ydGVkKG1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pOworICAgICAgICAgICAgaWYgKHVzZVByZWNvcnJlY3RBcnJheSkgeworICAgICAgICAgICAgICAgIHJlcyA9IG1EaXN0b3J0aW9uTWFwcGVyc1twaHlzaWNhbElkXS5zZXR1cFN0YXRpY0luZm8oCisgICAgICAgICAgICAgICAgICAgICAgICBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiVW5hYmxlIHRvIHJlYWQgY2FtZXJhICVzJ3MgY2FsaWJyYXRpb24gZmllbGRzIGZvciBkaXN0b3J0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ycmVjdGlvbiIsIHBoeXNpY2FsSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtWm9vbVJhdGlvTWFwcGVyc1twaHlzaWNhbElkXSA9IFpvb21SYXRpb01hcHBlcigKKyAgICAgICAgICAgICAgICAgICAgJm1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0sCisgICAgICAgICAgICAgICAgICAgIG1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvLCB1c2VQcmVjb3JyZWN0QXJyYXkpOworCisgICAgICAgICAgICBpZiAoU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6aXNVbHRyYUhpZ2hSZXNvbHV0aW9uU2Vuc29yKAorICAgICAgICAgICAgICAgICAgICBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKSkgeworICAgICAgICAgICAgICAgIG1VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXJzW3BoeXNpY2FsSWRdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcihtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQcmVjb3JyZWN0QXJyYXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEFpZGxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWU7CisgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6Ok1RRGVzY3JpcHRvcjwKKyAgICAgICAgICAgIGludDhfdCwgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6OlN5bmNocm9uaXplZFJlYWRXcml0ZT4gZGVzYzsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlcXVlc3RRdWV1ZVJldCA9IHNlc3Npb24tPmdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgmZGVzYyk7CisgICAgaWYgKCFyZXF1ZXN0UXVldWVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvciB3aGVuIGdldHRpbmcgcmVzdWx0IG1ldGFkYXRhIHF1ZXVlIGZyb20gY2FtZXJhIHNlc3Npb246ICVzIiwKKyAgICAgICAgICAgICAgICByZXF1ZXN0UXVldWVSZXQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChyZXF1ZXN0UXVldWVSZXQpOworICAgIH0KKyAgICBxdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8QWlkbFJlcXVlc3RNZXRhZGF0YVF1ZXVlPihkZXNjKTsKKyAgICBpZiAoIXF1ZXVlLT5pc1ZhbGlkKCkgfHwgcXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJIQUwgcmV0dXJucyBlbXB0eSByZXN1bHQgbWV0YWRhdGEgZm1xLCBub3QgdXNlIGl0Iik7CisgICAgICAgIHF1ZXVlID0gbnVsbHB0cjsKKyAgICAgICAgLy8gRG9uJ3QgdXNlIHJlc1F1ZXVlIG9ud2FyZHMuCisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEFpZGxSZXN1bHRNZXRhZGF0YVF1ZXVlPiYgcmVzUXVldWUgPSBtUmVzdWx0TWV0YWRhdGFRdWV1ZTsKKyAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6TVFEZXNjcmlwdG9yPAorICAgICAgICBpbnQ4X3QsIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IHJlc0Rlc2M7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVzdWx0UXVldWVSZXQgPSBzZXNzaW9uLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgmcmVzRGVzYyk7CisgICAgaWYgKCFyZXN1bHRRdWV1ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yIHdoZW4gZ2V0dGluZyByZXN1bHQgbWV0YWRhdGEgcXVldWUgZnJvbSBjYW1lcmEgc2Vzc2lvbjogJXMiLAorICAgICAgICAgICAgICAgIHJlc3VsdFF1ZXVlUmV0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBBaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1QocmVzdWx0UXVldWVSZXQpOworICAgIH0KKyAgICByZXNRdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8QWlkbFJlc3VsdE1ldGFkYXRhUXVldWU+KHJlc0Rlc2MpOworICAgIGlmICghcmVzUXVldWUtPmlzVmFsaWQoKSB8fCByZXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIkhBTCByZXR1cm5zIGVtcHR5IHJlc3VsdCBtZXRhZGF0YSBmbXEsIG5vdCB1c2UgaXQiKTsKKyAgICAgICAgcmVzUXVldWUgPSBudWxscHRyOworICAgICAgICAvLyBEb24ndCB1c2UgcmVzUXVldWUgb253YXJkcy4KKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgYnVmTWdyTW9kZSA9CisgICAgICAgICAgICBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfSU5GT19TVVBQT1JURURfQlVGRkVSX01BTkFHRU1FTlRfVkVSU0lPTik7CisgICAgaWYgKGJ1Zk1nck1vZGUuY291bnQgPiAwKSB7CisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyID0gKGJ1Zk1nck1vZGUuZGF0YS51OFswXSA9PQorICAgICAgICAgICAgICAgIEFORFJPSURfSU5GT19TVVBQT1JURURfQlVGRkVSX01BTkFHRU1FTlRfVkVSU0lPTl9ISURMX0RFVklDRV8zXzUpOworICAgIH0KKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGNhcGFiaWxpdGllcyA9IG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwYWJpbGl0aWVzLmNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gY2FwYWJpbGl0aWVzLmRhdGEudThbaV07CisgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX09GRkxJTkVfUFJPQ0VTU0lORykgeworICAgICAgICAgICAgbVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtSW50ZXJmYWNlID0gbmV3IEFpZGxIYWxJbnRlcmZhY2Uoc2Vzc2lvbiwgcXVldWUsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtU3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKTsKKworICAgIHN0ZDo6c3RyaW5nIHByb3ZpZGVyVHlwZTsKKyAgICBtVmVuZG9yVGFnSWQgPSBtYW5hZ2VyLT5nZXRQcm92aWRlclRhZ0lkTG9ja2VkKG1JZC5zdHJpbmcoKSk7CisgICAgbVRhZ01vbml0b3IuaW5pdGlhbGl6ZShtVmVuZG9yVGFnSWQpOworICAgIGlmICghbW9uaXRvclRhZ3MuaXNFbXB0eSgpKSB7CisgICAgICAgIG1UYWdNb25pdG9yLnBhcnNlVGFnc1RvTW9uaXRvcihTdHJpbmc4KG1vbml0b3JUYWdzKSk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBhYmlsaXRpZXMuY291bnQ7IGkrKykgeworICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBjYXBhYmlsaXRpZXMuZGF0YS51OFtpXTsKKyAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSkgeworICAgICAgICAgICAgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpbml0aWFsaXplQ29tbW9uTG9ja2VkKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgeworICAgIHNwPEFpZGxDYW1lcmEzRGV2aWNlPiBwID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHAgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgUGFyZW50IEFpZGxDYW1lcmFEZXZpY2Ugbm90IGFsaXZlLCBjYW4ndCBwcm9jZXNzIGNhbGxiYWNrcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisgICAgcmV0dXJuIHAtPnByb2Nlc3NDYXB0dXJlUmVzdWx0KHJlc3VsdHMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbENhbWVyYURldmljZUNhbGxiYWNrczo6bm90aWZ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjYW1lcmE6OmRldmljZTo6Tm90aWZ5TXNnPiYgbXNncykgeworICAgIHNwPEFpZGxDYW1lcmEzRGV2aWNlPiBwID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHAgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgUGFyZW50IEFpZGxDYW1lcmFEZXZpY2Ugbm90IGFsaXZlLCBjYW4ndCBwcm9jZXNzIGNhbGxiYWNrcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisgICAgcmV0dXJuIHAtPm5vdGlmeShtc2dzKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbENhbWVyYTNEZXZpY2U6OnByb2Nlc3NDYXB0dXJlUmVzdWx0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7CisgICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgZ3JhYiBtTG9jaywgYnV0IHRoYXQgY2FuIGxlYWQgdG8gZGVhZGxvY2ssIGFuZAorICAgIC8vIGl0J3Mgbm90IHN1cGVyIGltcG9ydGFudCB0byBnZXQgdXAgdG8gZGF0ZSB2YWx1ZSBvZiBtU3RhdHVzIGZvciB0aGlzCisgICAgLy8gd2FybmluZyBwcmludCwgaGVuY2Ugc2tpcHBpbmcgdGhlIGxvY2sgaGVyZQorICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19FUlJPUikgeworICAgICAgICAvLyBQZXIgQVBJIGNvbnRyYWN0LCBIQUwgc2hvdWxkIGFjdCBhcyBjbG9zZWQgYWZ0ZXIgZGV2aWNlIGVycm9yCisgICAgICAgIC8vIEJ1dCBtU3RhdHVzIGNhbiBiZSBzZXQgdG8gZXJyb3IgYnkgZnJhbWV3b3JrIGFzIHdlbGwsIHNvIGp1c3QgbG9nCisgICAgICAgIC8vIGEgd2FybmluZyBoZXJlLgorICAgICAgICBBTE9HVygiJXM6IHJlY2VpdmVkIGNhcHR1cmUgcmVzdWx0IGluIGVycm9yIHN0YXRlLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCisgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobU91dHB1dExvY2spOworICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgfQorCisgICAgaWYgKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudHJ5TG9jaygpICE9IE9LKSB7CisgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbjsgaXQgaW5kaWNhdGVzIGEgd3JvbmcgY2xpZW50IGltcGxlbWVudGF0aW9uCisgICAgICAgIC8vIHRoYXQgZG9lc24ndCBmb2xsb3cgdGhlIGNvbnRyYWN0LiBCdXQsIHdlIGNhbiBiZSB0b2xlcmFudCBoZXJlLgorICAgICAgICBBTE9HRSgiJXM6IGNhbGxiYWNrIG92ZXJsYXBwZWQhIHdhaXRpbmcgMXMuLi4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGlmIChtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnRpbWVkTG9jaygxMDAwMDAwMDAwIC8qIDFzICovKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgYWNxdWlyZSBsb2NrIGluIDFzLCBkcm9wcGluZyByZXN1bHRzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIC8vIHJlYWxseSBkb24ndCBrbm93IHdoYXQgdG8gZG8sIHNvIGJhaWwgb3V0LgorICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgICAgICB9CisgICAgfQorICAgIEFpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICAgeworICAgICAgICBtSWQsCisgICAgICAgIG1JbkZsaWdodExvY2ssIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAorICAgICAgICBtTGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyLCBtTGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyLAorICAgICAgICBtSW5GbGlnaHRNYXAsIG1PdXRwdXRMb2NrLCBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCisgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKKyAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAorICAgICAgICBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCisgICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLAorICAgICAgICAqdGhpcywgKihtSW50ZXJmYWNlKSwgbUxlZ2FjeUNsaWVudCwgbU1pbkV4cGVjdGVkRHVyYXRpb259LCBtUmVzdWx0TWV0YWRhdGFRdWV1ZQorICAgIH07CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJlc3VsdCA6IHJlc3VsdHMpIHsKKyAgICAgICAgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoc3RhdGVzLCByZXN1bHQsIHJlc3VsdC5waHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKKyAgICB9CisgICAgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay51bmxvY2soKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzRGV2aWNlOjpub3RpZnkoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpOb3RpZnlNc2c+JiBtc2dzKSB7CisgICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgZ3JhYiBtTG9jaywgYnV0IHRoYXQgY2FuIGxlYWQgdG8gZGVhZGxvY2ssIGFuZAorICAgIC8vIGl0J3Mgbm90IHN1cGVyIGltcG9ydGFudCB0byBnZXQgdXAgdG8gZGF0ZSB2YWx1ZSBvZiBtU3RhdHVzIGZvciB0aGlzCisgICAgLy8gd2FybmluZyBwcmludCwgaGVuY2Ugc2tpcHBpbmcgdGhlIGxvY2sgaGVyZQorICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19FUlJPUikgeworICAgICAgICAvLyBQZXIgQVBJIGNvbnRyYWN0LCBIQUwgc2hvdWxkIGFjdCBhcyBjbG9zZWQgYWZ0ZXIgZGV2aWNlIGVycm9yCisgICAgICAgIC8vIEJ1dCBtU3RhdHVzIGNhbiBiZSBzZXQgdG8gZXJyb3IgYnkgZnJhbWV3b3JrIGFzIHdlbGwsIHNvIGp1c3QgbG9nCisgICAgICAgIC8vIGEgd2FybmluZyBoZXJlLgorICAgICAgICBBTE9HVygiJXM6IHJlY2VpdmVkIG5vdGlmeSBtZXNzYWdlIGluIGVycm9yIHN0YXRlLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCisgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobU91dHB1dExvY2spOworICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgfQorCisgICAgQWlkbENhcHR1cmVPdXRwdXRTdGF0ZXMgc3RhdGVzIHsKKyAgICAgIHsgbUlkLAorICAgICAgICBtSW5GbGlnaHRMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKKyAgICAgICAgbUluRmxpZ2h0TWFwLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKKyAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywKKyAgICAgICAgKnRoaXMsICoobUludGVyZmFjZSksIG1MZWdhY3lDbGllbnQsIG1NaW5FeHBlY3RlZER1cmF0aW9ufSwgbVJlc3VsdE1ldGFkYXRhUXVldWUKKyAgICB9OworICAgIGZvciAoY29uc3QgYXV0byYgbXNnIDogbXNncykgeworICAgICAgICBjYW1lcmEzOjpub3RpZnkoc3RhdGVzLCBtc2cpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OnN3aXRjaFRvT2ZmbGluZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHN0cmVhbXNUb0tlZXAsCisgICAgICAgIC8qb3V0Ki8gc3A8Q2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlPiogc2Vzc2lvbikgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKworICAgIGJvb2wgaGFzSW5wdXRTdHJlYW0gPSBtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cjsKKyAgICBpbnQzMl90IGlucHV0U3RyZWFtSWQgPSBoYXNJbnB1dFN0cmVhbSA/IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSA6IC0xOworICAgIGJvb2wgaW5wdXRTdHJlYW1TdXBwb3J0c09mZmxpbmUgPSBoYXNJbnB1dFN0cmVhbSA/CisgICAgICAgICAgICBtSW5wdXRTdHJlYW0tPmdldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydCgpIDogZmFsc2U7CisgICAgYXV0byBvdXRwdXRTdHJlYW1JZHMgPSBtT3V0cHV0U3RyZWFtcy5nZXRTdHJlYW1JZHMoKTsKKyAgICBhdXRvIHN0cmVhbUlkcyA9IG91dHB1dFN0cmVhbUlkczsKKyAgICBpZiAoaGFzSW5wdXRTdHJlYW0pIHsKKyAgICAgICAgc3RyZWFtSWRzLnB1c2hfYmFjayhtSW5wdXRTdHJlYW0tPmdldElkKCkpOworICAgIH0KKworICAgIC8vIENoZWNrIGFsbCBzdHJlYW1zIGluIHN0cmVhbXNUb0tlZXAgc3VwcG9ydHMgb2ZmbGluZSBtb2RlCisgICAgZm9yIChhdXRvIGlkIDogc3RyZWFtc1RvS2VlcCkgeworICAgICAgICBpZiAoc3RkOjpmaW5kKHN0cmVhbUlkcy5iZWdpbigpLCBzdHJlYW1JZHMuZW5kKCksIGlkKSA9PSBzdHJlYW1JZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBzdHJlYW0gSUQgJWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gaW5wdXRTdHJlYW1JZCkgeworICAgICAgICAgICAgaWYgKCFpbnB1dFN0cmVhbVN1cHBvcnRzT2ZmbGluZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogaW5wdXQgc3RyZWFtICVkIGNhbm5vdCBiZSBzd2l0Y2hlZCB0byBvZmZsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoaWQpOworICAgICAgICAgICAgaWYgKCFzdHJlYW0tPmdldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBvdXRwdXQgc3RyZWFtICVkIGNhbm5vdCBiZSBzd2l0Y2hlZCB0byBvZmZsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gVE9ETzogYmxvY2sgc3VyZmFjZSBzaGFyaW5nIGFuZCBzdXJmYWNlIGdyb3VwIHN0cmVhbXMgdW50aWwgd2UgY2FuIHN1cHBvcnQgdGhlbQorCisgICAgLy8gU3RvcCByZXBlYXRpbmcgcmVxdWVzdCwgd2FpdCB1bnRpbCBhbGwgcmVtYWluaW5nIHJlcXVlc3RzIGFyZSBzdWJtaXR0ZWQsIHRoZW4gY2FsbCBpbnRvCisgICAgLy8gSEFMIHN3aXRjaFRvT2ZmbGluZQorICAgIGNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFPZmZsaW5lU2Vzc2lvbkluZm8gb2ZmbGluZVNlc3Npb25JbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxjYW1lcmE6OmRldmljZTo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPiBvZmZsaW5lU2Vzc2lvbjsKKyAgICBjYW1lcmEzOjpCdWZmZXJSZWNvcmRzIGJ1ZmZlclJlY29yZHM7CisgICAgc3RhdHVzX3QgcmV0ID0gc3RhdGljX2Nhc3Q8QWlkbFJlcXVlc3RUaHJlYWQgKj4obVJlcXVlc3RUaHJlYWQuZ2V0KCkpLT5zd2l0Y2hUb09mZmxpbmUoCisgICAgICAgICAgICBzdHJlYW1zVG9LZWVwLCAmb2ZmbGluZVNlc3Npb25JbmZvLCAmb2ZmbGluZVNlc3Npb24sICZidWZmZXJSZWNvcmRzKTsKKworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgU0VUX0VSUigiU3dpdGNoIHRvIG9mZmxpbmUgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJldCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYm9vbCBzdWNjID0gbVJlcXVlc3RCdWZmZXJTTS5vblN3aXRjaFRvT2ZmbGluZVN1Y2Nlc3MoKTsKKyAgICBpZiAoIXN1Y2MpIHsKKyAgICAgICAgU0VUX0VSUigiSEFMIG11c3Qgbm90IGJlIGNhbGxpbmcgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgY2FsbCIpOworICAgICAgICAvLyBUT0RPOiBibG9jayBBTEwgY2FsbGJhY2tzIGZyb20gSEFMIHRpbGwgYXBwIGNvbmZpZ3VyZWQgbmV3IHN0cmVhbXM/CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIFZlcmlmeSBvZmZsaW5lU2Vzc2lvbkluZm8KKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBvZmZsaW5lU3RyZWFtSWRzOworICAgIG9mZmxpbmVTdHJlYW1JZHMucmVzZXJ2ZShvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVN0cmVhbXMuc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gb2ZmbGluZVN0cmVhbSA6IG9mZmxpbmVTZXNzaW9uSW5mby5vZmZsaW5lU3RyZWFtcykgeworICAgICAgICAvLyB2ZXJpZnkgc3RyZWFtIElEcworICAgICAgICBpbnQzMl90IGlkID0gb2ZmbGluZVN0cmVhbS5pZDsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChzdHJlYW1JZHMuYmVnaW4oKSwgc3RyZWFtSWRzLmVuZCgpLCBpZCkgPT0gc3RyZWFtSWRzLmVuZCgpKSB7CisgICAgICAgICAgICBTRVRfRVJSKCJzdHJlYW0gSUQgJWQgbm90IGZvdW5kISIsIGlkKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2hlbiBub3QgdXNpbmcgSEFMIGJ1ZiBtYW5hZ2VyLCBvbmx5IGFsbG93IHN0cmVhbXMgcmVxdWVzdGVkIGJ5IGFwcCB0byBiZSBwcmVzZXJ2ZWQKKyAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChzdHJlYW1zVG9LZWVwLmJlZ2luKCksIHN0cmVhbXNUb0tlZXAuZW5kKCksIGlkKSA9PSBzdHJlYW1zVG9LZWVwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUigic3RyZWFtIElEICVkIG11c3Qgbm90IGJlIHN3aXRjaGVkIHRvIG9mZmxpbmUhIiwgaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb2ZmbGluZVN0cmVhbUlkcy5wdXNoX2JhY2soaWQpOworICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSAoaWQgPT0gaW5wdXRTdHJlYW1JZCkgPworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+PihtSW5wdXRTdHJlYW0pIDoKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPj4obU91dHB1dFN0cmVhbXMuZ2V0KGlkKSk7CisgICAgICAgIC8vIFZlcmlmeSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgYnVmZmVycworICAgICAgICBpZiAoc3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpICE9ICh1aW50MzJfdClvZmZsaW5lU3RyZWFtLm51bU91dHN0YW5kaW5nQnVmZmVycykgeworICAgICAgICAgICAgU0VUX0VSUigiT2ZmbGluZSBzdHJlYW0gJWQgIyBvZiByZW1haW5pbmcgYnVmZmVyIG1pc21hdGNoOiAoJXp1LCVkKSAoc2VydmljZS9IQUwpIiwKKyAgICAgICAgICAgICAgICAgICAgaWQsIHN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSwgb2ZmbGluZVN0cmVhbS5udW1PdXRzdGFuZGluZ0J1ZmZlcnMpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWZXJpZnkgYWxsIHN0cmVhbXMgdG8gYmUgZGVsZXRlZCBkb24ndCBoYXZlIGFueSBvdXRzdGFuZGluZyBidWZmZXJzCisgICAgaWYgKGhhc0lucHV0U3RyZWFtICYmIHN0ZDo6ZmluZChvZmZsaW5lU3RyZWFtSWRzLmJlZ2luKCksIG9mZmxpbmVTdHJlYW1JZHMuZW5kKCksCisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW1JZCkgPT0gb2ZmbGluZVN0cmVhbUlkcy5lbmQoKSkgeworICAgICAgICBpZiAobUlucHV0U3RyZWFtLT5oYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSkgeworICAgICAgICAgICAgU0VUX0VSUigiSW5wdXQgc3RyZWFtICVkIHN0aWxsIGhhcyAlenUgb3V0c3RhbmRpbmcgYnVmZmVyISIsCisgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtSWQsIG1JbnB1dFN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgb3V0U3RyZWFtSWQgOiBvdXRwdXRTdHJlYW1JZHMpIHsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChvZmZsaW5lU3RyZWFtSWRzLmJlZ2luKCksIG9mZmxpbmVTdHJlYW1JZHMuZW5kKCksCisgICAgICAgICAgICAgICAgb3V0U3RyZWFtSWQpID09IG9mZmxpbmVTdHJlYW1JZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGF1dG8gb3V0U3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KG91dFN0cmVhbUlkKTsKKyAgICAgICAgICAgIGlmIChvdXRTdHJlYW0tPmhhc091dHN0YW5kaW5nQnVmZmVycygpKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUigiT3V0cHV0IHN0cmVhbSAlZCBzdGlsbCBoYXMgJXp1IG91dHN0YW5kaW5nIGJ1ZmZlciEiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RyZWFtSWQsIG91dFN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJbkZsaWdodFJlcXVlc3RNYXAgb2ZmbGluZVJlcXM7CisgICAgLy8gVmVyaWZ5IGluZmxpZ2h0IHJlcXVlc3RzIGFuZCB0aGVpciBwZW5kaW5nIGJ1ZmZlcnMKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1JbkZsaWdodExvY2spOworICAgICAgICBmb3IgKGF1dG8gb2ZmbGluZVJlcSA6IG9mZmxpbmVTZXNzaW9uSW5mby5vZmZsaW5lUmVxdWVzdHMpIHsKKyAgICAgICAgICAgIGludCBpZHggPSBtSW5GbGlnaHRNYXAuaW5kZXhPZktleShvZmZsaW5lUmVxLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBTRVRfRVJSKCJPZmZsaW5lIHJlcXVlc3QgZnJhbWUgbnVtYmVyICVkIG5vdCBmb3VuZCEiLCBvZmZsaW5lUmVxLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgYXV0byYgaW5mbGlnaHRSZXEgPSBtSW5GbGlnaHRNYXAudmFsdWVBdChpZHgpOworICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgc3BlY2lmaWMgc3RyZWFtIElEcworICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnNMZWZ0ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmZsaWdodFJlcS5udW1CdWZmZXJzTGVmdCk7CisgICAgICAgICAgICBpZiAobnVtQnVmZmVyc0xlZnQgIT0gb2ZmbGluZVJlcS5wZW5kaW5nU3RyZWFtcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBTRVRfRVJSKCJPZmZsaW5lIHJlcXVlc3QgIyBvZiByZW1haW5pbmcgYnVmZmVyIG1pc21hdGNoOiAoJWQsJWQpIChzZXJ2aWNlL0hBTCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mbGlnaHRSZXEubnVtQnVmZmVyc0xlZnQsIG9mZmxpbmVSZXEucGVuZGluZ1N0cmVhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZmxpbmVSZXFzLmFkZChvZmZsaW5lUmVxLmZyYW1lTnVtYmVyLCBpbmZsaWdodFJlcSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDcmVhdGUgQ2FtZXJhM09mZmxpbmVTZXNzaW9uIGFuZCB0cmFuc2ZlciBvYmplY3Qgb3duZXJzaGlwCisgICAgLy8gICAoc3RyZWFtcywgaW5mbGlnaHQgcmVxdWVzdHMsIGJ1ZmZlciBjYWNoZXMpCisgICAgY2FtZXJhMzo6U3RyZWFtU2V0IG9mZmxpbmVTdHJlYW1TZXQ7CisgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbT4gaW5wdXRTdHJlYW07CisgICAgZm9yIChhdXRvIG9mZmxpbmVTdHJlYW0gOiBvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVN0cmVhbXMpIHsKKyAgICAgICAgaW50MzJfdCBpZCA9IG9mZmxpbmVTdHJlYW0uaWQ7CisgICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0ciAmJiBpZCA9PSBtSW5wdXRTdHJlYW0tPmdldElkKCkpIHsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbUlucHV0U3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2ZmbGluZVN0cmVhbVNldC5hZGQoaWQsIG1PdXRwdXRTdHJlYW1zLmdldChpZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETzogY2hlY2sgaWYgd2UgbmVlZCB0byBsb2NrIGJlZm9yZSBjb3B5aW5nIHN0YXRlcworICAgIC8vICAgICAgIHRob3VnaCB0ZWNobmljYWxseSBubyBvdGhlciB0aHJlYWQgc2hvdWxkIGJlIHRhbGtpbmcgdG8gQ2FtZXJhM0RldmljZSBhdCB0aGlzIHBvaW50CisgICAgQ2FtZXJhM09mZmxpbmVTdGF0ZXMgb2ZmbGluZVN0YXRlcygKKyAgICAgICAgICAgIG1UYWdNb25pdG9yLCBtVmVuZG9yVGFnSWQsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdCwgbU51bVBhcnRpYWxSZXN1bHRzLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsIG1EaXN0b3J0aW9uTWFwcGVycywKKyAgICAgICAgICAgIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMpOworCisgICAgKnNlc3Npb24gPSBuZXcgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbihtSWQsIGlucHV0U3RyZWFtLCBvZmZsaW5lU3RyZWFtU2V0LAorICAgICAgICAgICAgc3RkOjptb3ZlKGJ1ZmZlclJlY29yZHMpLCBvZmZsaW5lUmVxcywgb2ZmbGluZVN0YXRlcywgb2ZmbGluZVNlc3Npb24pOworCisgICAgLy8gRGVsZXRlIGFsbCBzdHJlYW1zIHRoYXQgaGFzIGJlZW4gdHJhbnNmZXJyZWQgdG8gb2ZmbGluZSBzZXNzaW9uCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGZvciAoYXV0byBvZmZsaW5lU3RyZWFtIDogb2ZmbGluZVNlc3Npb25JbmZvLm9mZmxpbmVTdHJlYW1zKSB7CisgICAgICAgIGludDMyX3QgaWQgPSBvZmZsaW5lU3RyZWFtLmlkOworICAgICAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGxwdHIgJiYgaWQgPT0gbUlucHV0U3RyZWFtLT5nZXRJZCgpKSB7CisgICAgICAgICAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZShpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBkaXNjb25uZWN0IGFsbCBvdGhlciBzdHJlYW1zIGFuZCBzd2l0Y2ggdG8gVU5DT05GSUdVUkVEIHN0YXRlCisgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldCA9IG1JbnB1dFN0cmVhbS0+ZGlzY29ubmVjdCgpOworICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICBTRVRfRVJSX0woImRpc2Nvbm5lY3QgaW5wdXQgc3RyZWFtIGZhaWxlZCEiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIHN0cmVhbUlkIDogbU91dHB1dFN0cmVhbXMuZ2V0U3RyZWFtSWRzKCkpIHsKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICAgICAgcmV0ID0gc3RyZWFtLT5kaXNjb25uZWN0KCk7CisgICAgICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgIFNFVF9FUlJfTCgiZGlzY29ubmVjdCBvdXRwdXQgc3RyZWFtICVkIGZhaWxlZCEiLCBzdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1JbnB1dFN0cmVhbS5jbGVhcigpOworICAgIG1PdXRwdXRTdHJlYW1zLmNsZWFyKCk7CisgICAgbU5lZWRDb25maWcgPSB0cnVlOworICAgIGludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKFNUQVRVU19VTkNPTkZJR1VSRUQpOworICAgIG1PcGVyYXRpbmdNb2RlID0gTk9fTU9ERTsKKyAgICBtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24gPSBmYWxzZTsKKyAgICBtUmVxdWVzdFRocmVhZC0+Y2xlYXJQcmV2aW91c1JlcXVlc3QoKTsKKworICAgIHJldHVybiBPSzsKKyAgICAvLyBUTyBiZSBkb25lIGJ5IENhbWVyYURldmljZUNsaWVudC9DYW1lcmEzT2ZmbGluZVNlc3Npb24KKyAgICAvLyByZWdpc3RlciB0aGUgb2ZmbGluZSBjbGllbnQgdG8gY2FtZXJhIHNlcnZpY2UKKyAgICAvLyBTZXR1cCByZXN1bHQgcGFzc3RoaW5nIHRocmVhZHMgZXRjCisgICAgLy8gSW5pdGlhbGl6ZSBvZmZsaW5lIHNlc3Npb24gc28gSEFMIGNhbiBzdGFydCBzZW5kaW5nIGNhbGxiYWNrIHRvIGl0IChyZXN1bHQgRm1xKQorICAgIC8vIFRPRE86IGNoZWNrIGhvdyBtYW55IG9uSWRsZSBjYWxsYmFjayB3aWxsIGJlIHNlbnQKKyAgICAvLyBKYXZhIHNpZGUgdG8gbWFrZSBzdXJlIHRoZSBDYW1lcmFDYXB0dXJlU2Vzc2lvbiBpcyBwcm9wZXJseSBjbG9zZWQKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3M6OnJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyUmV0Piogb3V0QnVmZmVycywKKyAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0U3RhdHVzKiBzdGF0dXMpIHsKKworICAgIHNwPEFpZGxDYW1lcmEzRGV2aWNlPiBwID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHAgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgUGFyZW50IEFpZGxDYW1lcmFEZXZpY2Ugbm90IGFsaXZlLCBjYW4ndCBwcm9jZXNzIGNhbGxiYWNrcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisgICAgcmV0dXJuIHAtPnJlcXVlc3RTdHJlYW1CdWZmZXJzKGJ1ZlJlcXMsIG91dEJ1ZmZlcnMsIHN0YXR1cyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzRGV2aWNlOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4qIG91dEJ1ZmZlcnMsCisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdFN0YXR1cyogc3RhdHVzKSB7CisKKyAgICBSZXF1ZXN0QnVmZmVyU3RhdGVzIHN0YXRlcyB7CisgICAgICAgIG1JZCwgbVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsCisgICAgICAgIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCAqdGhpcywgKihtSW50ZXJmYWNlKSwgKnRoaXN9OworICAgIGNhbWVyYTM6OnJlcXVlc3RTdHJlYW1CdWZmZXJzKHN0YXRlcywgYnVmUmVxcywgb3V0QnVmZmVycywgc3RhdHVzKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpyZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgeworICAgIHNwPEFpZGxDYW1lcmEzRGV2aWNlPiBwID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHAgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgUGFyZW50IEFpZGxDYW1lcmFEZXZpY2Ugbm90IGFsaXZlLCBjYW4ndCBwcm9jZXNzIGNhbGxiYWNrcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisgICAgcmV0dXJuIHAtPnJldHVyblN0cmVhbUJ1ZmZlcnMoYnVmZmVycyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzRGV2aWNlOjpyZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgeworICAgIFJldHVybkJ1ZmZlclN0YXRlcyBzdGF0ZXMgeworICAgICAgICBtSWQsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtT3V0cHV0U3RyZWFtcywgIG1TZXNzaW9uU3RhdHNCdWlsZGVyLAorICAgICAgICAqKG1JbnRlcmZhY2UpfTsKKyAgICBjYW1lcmEzOjpyZXR1cm5TdHJlYW1CdWZmZXJzKHN0YXRlcywgYnVmZmVycyk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCitBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6QWlkbEhhbEludGVyZmFjZSgKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAmc2Vzc2lvbiwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBaWRsUmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLCBib29sIHN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZykgOgorICAgICAgICBIYWxJbnRlcmZhY2UodXNlSGFsQnVmTWFuYWdlciwgc3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKSwKKyAgICAgICAgbUFpZGxTZXNzaW9uKHNlc3Npb24pLAorICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUocXVldWUpIHsgfQorCitBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6QWlkbEhhbEludGVyZmFjZSgKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VTZXNzaW9uPgorICAgICAgICAgICAgICAgICAgICAmZGV2aWNlU2Vzc2lvbiwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFJbmplY3Rpb25TZXNzaW9uPgorICAgICAgICAgICAgICAgICAgICAmaW5qZWN0aW9uU2Vzc2lvbiwgc3RkOjpzaGFyZWRfcHRyPEFpZGxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWUsCisgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsIGJvb2wgc3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKSA6CisgICAgICAgIEhhbEludGVyZmFjZSh1c2VIYWxCdWZNYW5hZ2VyLCBzdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpLAorICAgICAgICBtQWlkbFNlc3Npb24oZGV2aWNlU2Vzc2lvbiksCisgICAgICAgIG1BaWRsSW5qZWN0aW9uU2Vzc2lvbihpbmplY3Rpb25TZXNzaW9uKSwKKyAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKHF1ZXVlKSB7IH0KKworYm9vbCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6dmFsaWQoKSB7CisgICAgcmV0dXJuIChtQWlkbFNlc3Npb24gIT0gbnVsbHB0cik7Cit9CisKK3ZvaWQgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OmNsZWFyKCkgeworICAgIG1BaWRsU2Vzc2lvbi5yZXNldCgpOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6Zmx1c2goKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6Zmx1c2giKTsKKyAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIGF1dG8gZXJyID0gbUFpZGxTZXNzaW9uLT5mbHVzaCgpOworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJlcyA9IEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChlcnIpOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsSGFsSW50ZXJmYWNlOjpkdW1wKGludCAvKmZkKi8pIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpkdW1wIik7CisgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICAvLyBIYW5kbGVkIGJ5IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6ZHVtcAorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6cmVwZWF0aW5nUmVxdWVzdEVuZCh1aW50MzJfdCBmcmFtZU51bWJlciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gJnN0cmVhbUlkcykgeworICAgIEFUUkFDRV9OQU1FKCJBaWRsQ2FtZXJhSGFsOjpyZXBlYXRpbmdSZXF1ZXN0RW5kIik7CisgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICBhdXRvIGVyciA9IG1BaWRsU2Vzc2lvbi0+cmVwZWF0aW5nUmVxdWVzdEVuZChmcmFtZU51bWJlciwgc3RyZWFtSWRzKTsKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gQWlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKGVycik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6Y2xvc2UoKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6Y2xvc2UoKSIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgYXV0byBlcnIgPSBtQWlkbFNlc3Npb24tPmNsb3NlKCk7CisgICAgLy8gSW50ZXJmYWNlIHdpbGwgYmUgZGVhZCBzaG9ydGx5IGFueXdheSwgc28gZG9uJ3QgbG9nIGVycm9ycworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICByZXMgPSBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsSGFsSW50ZXJmYWNlOjpzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcykgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OnNpZ25hbFBpcGVsaW5lRHJhaW4iKTsKKyAgICBpZiAoIXZhbGlkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBvbiBpbnZhbGlkIGNhbWVyYSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBlcnIgPSBtQWlkbFNlc3Npb24tPnNpZ25hbFN0cmVhbUZsdXNoKHN0cmVhbUlkcywgbU5leHRTdHJlYW1Db25maWdDb3VudGVyIC0gMSk7CisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworYm9vbCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6aXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZCgKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIG9sZFNlc3Npb25QYXJhbXMsIENhbWVyYU1ldGFkYXRhJiBuZXdTZXNzaW9uUGFyYW1zKSB7CisgICAgLy8gV2UgZG8gcmVjb25maWd1cmF0aW9uIGJ5IGRlZmF1bHQ7CisgICAgYm9vbCByZXF1aXJlZCA9IHRydWU7CisgICAgaWYgKG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkKSB7CisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FtZXJhTWV0YWRhdGEgb2xkUGFyYW1zLCBuZXdQYXJhbXM7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBvbGRTZXNzaW9uTWV0YSA9IGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPigKKyAgICAgICAgICAgICAgICBvbGRTZXNzaW9uUGFyYW1zLmdldEFuZExvY2soKSk7CisgICAgICAgIHVpbnQ4X3QgKm9sZFNlc3Npb25CeXRlUCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG9sZFNlc3Npb25NZXRhKTsKKworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogbmV3U2Vzc2lvbk1ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCisgICAgICAgICAgICAgICAgbmV3U2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCkpOworICAgICAgICB1aW50OF90ICpuZXdTZXNzaW9uQnl0ZVAgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihuZXdTZXNzaW9uTWV0YSk7CisgICAgICAgIC8vIHN0ZDo6dmVjdG9yIGhhcyBubyBzZXRUb0V4dGVybmFsLCBzbyB3ZSBoYWN2ZSB0byBjb3B5CisgICAgICAgIG9sZFBhcmFtcy5tZXRhZGF0YS5hc3NpZ24ob2xkU2Vzc2lvbkJ5dGVQLAorICAgICAgICAgICAgICAgIG9sZFNlc3Npb25CeXRlUCArIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShvbGRTZXNzaW9uTWV0YSkpOworICAgICAgICBuZXdQYXJhbXMubWV0YWRhdGEuYXNzaWduKG5ld1Nlc3Npb25CeXRlUCwKKyAgICAgICAgICAgICAgICBuZXdTZXNzaW9uQnl0ZVAgKyBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUobmV3U2Vzc2lvbk1ldGEpKTsKKyAgICAgICAgYXV0byBlcnIgPSBtQWlkbFNlc3Npb24tPmlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQob2xkUGFyYW1zLCBuZXdQYXJhbXMsICZyZXF1aXJlZCk7CisgICAgICAgIG9sZFNlc3Npb25QYXJhbXMudW5sb2NrKG9sZFNlc3Npb25NZXRhKTsKKyAgICAgICAgbmV3U2Vzc2lvblBhcmFtcy51bmxvY2sobmV3U2Vzc2lvbk1ldGEpOworICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBiaW5kZXIgZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlcXVpcmVkOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncygKKyAgICAgICAgY2FtZXJhX3JlcXVlc3RfdGVtcGxhdGVfdCB0ZW1wbGF0ZUlkLAorICAgICAgICAvKm91dCovIGNhbWVyYV9tZXRhZGF0YV90ICoqcmVxdWVzdFRlbXBsYXRlKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUFpZGxIYWw6OmNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MiKTsKKyAgICB1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlJlcXVlc3RUZW1wbGF0ZTsKKyAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIFJlcXVlc3RUZW1wbGF0ZSBpZDsKKyAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYU1ldGFkYXRhIHJlcXVlc3Q7CisgICAgc3dpdGNoICh0ZW1wbGF0ZUlkKSB7CisgICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX1BSRVZJRVc6CisgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6UFJFVklFVzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9TVElMTF9DQVBUVVJFOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlNUSUxMX0NBUFRVUkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfVklERU9fUkVDT1JEOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlZJREVPX1JFQ09SRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9WSURFT19TTkFQU0hPVDoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpWSURFT19TTkFQU0hPVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlpFUk9fU0hVVFRFUl9MQUc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfTUFOVUFMOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6Ok1BTlVBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gVW5rbm93biB0ZW1wbGF0ZSBJRCwgb3IgdGhpcyBIQUwgaXMgdG9vIG9sZCB0byBzdXBwb3J0IGl0CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBhdXRvIGVyciA9IG1BaWRsU2Vzc2lvbi0+Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyhpZCwgJnJlcXVlc3QpOworCisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChlcnIpOworICAgIH0KKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGEgKnIgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlcXVlc3QubWV0YWRhdGEuZGF0YSgpKTsKKyAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gcmVxdWVzdC5tZXRhZGF0YS5zaXplKCk7CisgICAgaW50IHJldCA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUociwgJmV4cGVjdGVkU2l6ZSk7CisgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAqcmVxdWVzdFRlbXBsYXRlID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKHIpOworICAgICAgICBpZiAoKnJlcXVlc3RUZW1wbGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjbG9uZSBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OmNvbmZpZ3VyZVN0cmVhbXMoCisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNlc3Npb25QYXJhbXMsCisgICAgICAgIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiAqY29uZmlnLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzKSB7CisgICAgdXNpbmcgY2FtZXJhOjpkZXZpY2U6OlN0cmVhbVR5cGU7CisgICAgdXNpbmcgY2FtZXJhOjpkZXZpY2U6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOworCisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6Y29uZmlndXJlU3RyZWFtcyIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgLy8gQ29udmVydCBzdHJlYW0gY29uZmlnIHRvIEFJREwKKyAgICBzdGQ6OnNldDxpbnQ+IGFjdGl2ZVN0cmVhbXM7CisgICAgY2FtZXJhOjpkZXZpY2U6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGNhbWVyYTo6ZGV2aWNlOjpTdHJlYW0gJmRzdCA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXTsKKyAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV90ICpzcmMgPSBjb25maWctPnN0cmVhbXNbaV07CisKKyAgICAgICAgQ2FtZXJhM1N0cmVhbSogY2FtM3N0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3Qoc3JjKTsKKyAgICAgICAgY2FtM3N0cmVhbS0+c2V0QnVmZmVyRnJlZWRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgaW50IHN0cmVhbUlkID0gY2FtM3N0cmVhbS0+Z2V0SWQoKTsKKyAgICAgICAgU3RyZWFtVHlwZSBzdHJlYW1UeXBlOworICAgICAgICBzd2l0Y2ggKHNyYy0+c3RyZWFtX3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9PVVRQVVQ6CisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6Ok9VVFBVVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9JTlBVVDoKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gU3RyZWFtVHlwZTo6SU5QVVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBVbnN1cHBvcnRlZCBzdHJlYW0gdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBjb25maWctPnN0cmVhbXNbaV0tPnN0cmVhbV90eXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGRzdC5pZCA9IHN0cmVhbUlkOworICAgICAgICBkc3Quc3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CisgICAgICAgIGRzdC53aWR0aCA9IHNyYy0+d2lkdGg7CisgICAgICAgIGRzdC5oZWlnaHQgPSBzcmMtPmhlaWdodDsKKyAgICAgICAgZHN0LnVzYWdlID0gbWFwVG9BaWRsQ29uc3VtZXJVc2FnZShjYW0zc3RyZWFtLT5nZXRVc2FnZSgpKTsKKyAgICAgICAgZHN0LnJvdGF0aW9uID0gbWFwVG9BaWRsU3RyZWFtUm90YXRpb24oKGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCkgc3JjLT5yb3RhdGlvbik7CisgICAgICAgIGRzdC5mb3JtYXQgPSBtYXBUb0FpZGxQaXhlbEZvcm1hdChjYW0zc3RyZWFtLT5pc0Zvcm1hdE92ZXJyaWRkZW4oKSA/CisgICAgICAgICAgICAgICAgICAgIGNhbTNzdHJlYW0tPmdldE9yaWdpbmFsRm9ybWF0KCkgOiBzcmMtPmZvcm1hdCk7CisgICAgICAgIGRzdC5kYXRhU3BhY2UgPSBtYXBUb0FpZGxEYXRhc3BhY2UoY2FtM3N0cmVhbS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCkgPworICAgICAgICAgICAgICAgICAgICBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbERhdGFTcGFjZSgpIDogc3JjLT5kYXRhX3NwYWNlKTsKKworICAgICAgICBkc3QuYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemVzW2ldOworICAgICAgICBpZiAoc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZHN0LnBoeXNpY2FsQ2FtZXJhSWQgPSBzcmMtPnBoeXNpY2FsX2NhbWVyYV9pZDsKKyAgICAgICAgfQorICAgICAgICBkc3QuZ3JvdXBJZCA9IGNhbTNzdHJlYW0tPmdldEhhbFN0cmVhbUdyb3VwSWQoKTsKKyAgICAgICAgZHN0LnNlbnNvclBpeGVsTW9kZXNVc2VkLnJlc2l6ZShzcmMtPnNlbnNvcl9waXhlbF9tb2Rlc191c2VkLnNpemUoKSk7CisgICAgICAgIHNpemVfdCBqID0gMDsKKyAgICAgICAgZm9yIChpbnQgbW9kZSA6IHNyYy0+c2Vuc29yX3BpeGVsX21vZGVzX3VzZWQpIHsKKyAgICAgICAgICAgIGRzdC5zZW5zb3JQaXhlbE1vZGVzVXNlZFtqKytdID0gc3RhdGljX2Nhc3Q8U2Vuc29yUGl4ZWxNb2RlPihtb2RlKTsKKyAgICAgICAgfQorICAgICAgICBkc3QuZHluYW1pY1JhbmdlUHJvZmlsZSA9IG1hcFRvQWlkbER5bmFtaWNQcm9maWxlKHNyYy0+ZHluYW1pY19yYW5nZV9wcm9maWxlKTsKKyAgICAgICAgZHN0LnVzZUNhc2UgPSBzdGF0aWNfY2FzdDxTY2FsZXJBdmFpbGFibGVTdHJlYW1Vc2VDYXNlcz4oc3JjLT51c2VfY2FzZSk7CisgICAgICAgIGFjdGl2ZVN0cmVhbXMuaW5zZXJ0KHN0cmVhbUlkKTsKKyAgICAgICAgLy8gQ3JlYXRlIEJ1ZmZlciBJRCBtYXAgaWYgbmVjZXNzYXJ5CisgICAgICAgIG1CdWZmZXJSZWNvcmRzLnRyeUNyZWF0ZUJ1ZmZlckNhY2hlKHN0cmVhbUlkKTsKKyAgICB9CisgICAgLy8gcmVtb3ZlIEJ1ZmZlcklkTWFwIGZvciBkZWxldGVkIHN0cmVhbXMKKyAgICBtQnVmZmVyUmVjb3Jkcy5yZW1vdmVJbmFjdGl2ZUJ1ZmZlckNhY2hlcyhhY3RpdmVTdHJlYW1zKTsKKworICAgIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIG9wZXJhdGlvbk1vZGU7CisgICAgcmVzID0gbWFwVG9BaWRsU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgICAgICAgICAoY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCkgY29uZmlnLT5vcGVyYXRpb25fbW9kZSwKKyAgICAgICAgICAgIC8qb3V0Ki8gJm9wZXJhdGlvbk1vZGUpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKKyAgICBzaXplX3Qgc2Vzc2lvblBhcmFtU2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzZXNzaW9uUGFyYW1zKTsKKyAgICB1aW50OF90ICpzZXNzaW9uUGFyYW1QID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihzZXNzaW9uUGFyYW1zKSk7CisKKyAgICAvLyBzdGQ6OnZlY3RvciBoYXMgbm8gc2V0VG9FeHRlcm5hbCwgc28gd2UgaGF2ZSB0byBjb3B5CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zZXNzaW9uUGFyYW1zLm1ldGFkYXRhLmFzc2lnbigKKyAgICAgICAgICAgICAgICBzZXNzaW9uUGFyYW1QLCBzZXNzaW9uUGFyYW1QICsgc2Vzc2lvblBhcmFtU2l6ZSk7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKKworICAgIC8vIEludm9rZSBjb25maWd1cmVTdHJlYW1zCisgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OkhhbFN0cmVhbT4gZmluYWxDb25maWd1cmF0aW9uOworCisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1Db25maWdDb3VudGVyID0gbU5leHRTdHJlYW1Db25maWdDb3VudGVyKys7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5tdWx0aVJlc29sdXRpb25JbnB1dEltYWdlID0gY29uZmlnLT5pbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uOworICAgIGF1dG8gZXJyID0gbUFpZGxTZXNzaW9uLT5jb25maWd1cmVTdHJlYW1zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24sICZmaW5hbENvbmZpZ3VyYXRpb24pOworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBBaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1QoZXJyKTsKKyAgICB9CisKKyAgICAvLyBBbmQgY29udmVydCBvdXRwdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb24gZnJvbSBBSURMCisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3QgKmRzdCA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaW50IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChkc3QpLT5nZXRJZCgpOworCisgICAgICAgIC8vIFN0YXJ0IHNjYW4gYXQgaSwgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBzdHJlYW0gb3JkZXIgbWF0Y2hlcworICAgICAgICBzaXplX3QgcmVhbElkeCA9IGk7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgc2l6ZV90IGhhbFN0cmVhbUNvdW50ID0gZmluYWxDb25maWd1cmF0aW9uLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgaGFsU3RyZWFtQ291bnQ7IGlkeCsrKSB7CisgICAgICAgICAgICBpZiAoZmluYWxDb25maWd1cmF0aW9uW3JlYWxJZHhdLmlkID09IHN0cmVhbUlkKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhbElkeCA9IChyZWFsSWR4ID49IGhhbFN0cmVhbUNvdW50IC0gMSkgPyAwIDogcmVhbElkeCArIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgbm90IGZvdW5kIGluIHN0cmVhbSBjb25maWd1cmF0aW9uIHJlc3BvbnNlIGZyb20gSEFMIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgY2FtZXJhOjpkZXZpY2U6OkhhbFN0cmVhbSAmc3JjID0gZmluYWxDb25maWd1cmF0aW9uW3JlYWxJZHhdOworCisgICAgICAgIENhbWVyYTNTdHJlYW0qIGRzdFN0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3QoZHN0KTsKKyAgICAgICAgaW50IG92ZXJyaWRlRm9ybWF0ID0gbWFwVG9GcmFtZXdvcmtGb3JtYXQoc3JjLm92ZXJyaWRlRm9ybWF0KTsKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2Ugb3ZlcnJpZGVEYXRhU3BhY2UgPSBtYXBUb0ZyYW1ld29ya0RhdGFzcGFjZShzcmMub3ZlcnJpZGVEYXRhU3BhY2UpOworCisgICAgICAgIGRzdFN0cmVhbS0+c2V0T2ZmbGluZVByb2Nlc3NpbmdTdXBwb3J0KHNyYy5zdXBwb3J0T2ZmbGluZSk7CisKKyAgICAgICAgaWYgKGRzdFN0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKSAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0Rm9ybWF0T3ZlcnJpZGUoZmFsc2UpOworICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXREYXRhU3BhY2VPdmVycmlkZShmYWxzZSk7CisgICAgICAgICAgICBpZiAoZHN0LT5mb3JtYXQgIT0gb3ZlcnJpZGVGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRm9ybWF0IG92ZXJyaWRlIG5vdCBhbGxvd2VkIGZvciBmb3JtYXQgMHgleCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkLCBkc3QtPmZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZHN0LT5kYXRhX3NwYWNlICE9IG92ZXJyaWRlRGF0YVNwYWNlKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IERhdGFTcGFjZSBvdmVycmlkZSBub3QgYWxsb3dlZCBmb3IgZm9ybWF0IDB4JXgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgZHN0LT5mb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9vbCBuZWVkRm9ybWF0T3ZlcnJpZGUgPQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0uZm9ybWF0ICE9IHNyYy5vdmVycmlkZUZvcm1hdDsKKyAgICAgICAgICAgIGJvb2wgbmVlZERhdGFzcGFjZU92ZXJyaWRlID0KKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldLmRhdGFTcGFjZSAhPSBzcmMub3ZlcnJpZGVEYXRhU3BhY2U7CisgICAgICAgICAgICAvLyBPdmVycmlkZSBhbGxvd2VkIHdpdGggSU1QTEVNRU5UQVRJT05fREVGSU5FRAorICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRGb3JtYXRPdmVycmlkZShuZWVkRm9ybWF0T3ZlcnJpZGUpOworICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXREYXRhU3BhY2VPdmVycmlkZShuZWVkRGF0YXNwYWNlT3ZlcnJpZGUpOworICAgICAgICAgICAgZHN0LT5mb3JtYXQgPSBvdmVycmlkZUZvcm1hdDsKKyAgICAgICAgICAgIGRzdC0+ZGF0YV9zcGFjZSA9IG92ZXJyaWRlRGF0YVNwYWNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRzdC0+c3RyZWFtX3R5cGUgPT0gQ0FNRVJBX1NUUkVBTV9JTlBVVCkgeworICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludDY0X3Q+KHNyYy5wcm9kdWNlclVzYWdlKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IElOUFVUIHN0cmVhbXMgbXVzdCBoYXZlIDAgZm9yIHByb2R1Y2VyIHVzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0VXNhZ2UoCisgICAgICAgICAgICAgICAgICAgIG1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZShzcmMuY29uc3VtZXJVc2FnZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gT1VUUFVUCisgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50NjRfdD4oc3JjLmNvbnN1bWVyVXNhZ2UpICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogT1VUUFVUIHN0cmVhbXMgbXVzdCBoYXZlIDAgZm9yIGNvbnN1bWVyIHVzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0VXNhZ2UoCisgICAgICAgICAgICAgICAgICAgIG1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZShzcmMucHJvZHVjZXJVc2FnZSkpOworICAgICAgICB9CisgICAgICAgIGRzdC0+bWF4X2J1ZmZlcnMgPSBzcmMubWF4QnVmZmVyczsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6QWlkbEhhbEludGVyZmFjZTo6Y29uZmlndXJlSW5qZWN0ZWRTdHJlYW1zKAorICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogc2Vzc2lvblBhcmFtcywgY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uKiBjb25maWcsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjYW1lcmFDaGFyYWN0ZXJpc3RpY3MpIHsKKyAgICB1c2luZyBjYW1lcmE6OmRldmljZTo6U3RyZWFtVHlwZTsKKyAgICB1c2luZyBjYW1lcmE6OmRldmljZTo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU7CisKKyAgICBBVFJBQ0VfTkFNRSgiSW5qZWN0aW9uQ2FtZXJhSGFsOjpjb25maWd1cmVTdHJlYW1zIik7CisgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBpZiAoY29uZmlnLT5pbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uKSB7CisgICAgICAgIEFMT0dFKCIlczogSW5qZWN0aW9uIGNhbWVyYSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IG11bHRpLXJlc29sdXRpb24gaW5wdXQgIgorICAgICAgICAgICAgICAgICJzdHJlYW0iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIENvbnZlcnQgc3RyZWFtIGNvbmZpZyB0byBBSURMCisgICAgc3RkOjpzZXQ8aW50PiBhY3RpdmVTdHJlYW1zOworICAgIGNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb247CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBjYW1lcmE6OmRldmljZTo6U3RyZWFtJiBkc3QgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnN0cmVhbXNbaV07CisgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fdCogc3JjID0gY29uZmlnLT5zdHJlYW1zW2ldOworCisgICAgICAgIENhbWVyYTNTdHJlYW0qIGNhbTNzdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYyk7CisgICAgICAgIGNhbTNzdHJlYW0tPnNldEJ1ZmZlckZyZWVkTGlzdGVuZXIodGhpcyk7CisgICAgICAgIGludCBzdHJlYW1JZCA9IGNhbTNzdHJlYW0tPmdldElkKCk7CisgICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtVHlwZTsKKyAgICAgICAgc3dpdGNoIChzcmMtPnN0cmVhbV90eXBlKSB7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fT1VUUFVUOgorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpPVVRQVVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fSU5QVVQ6CisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6OklOUFVUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogVW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgY29uZmlnLT5zdHJlYW1zW2ldLT5zdHJlYW1fdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGRzdC5pZCA9IHN0cmVhbUlkOworICAgICAgICBkc3Quc3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CisgICAgICAgIGRzdC53aWR0aCA9IHNyYy0+d2lkdGg7CisgICAgICAgIGRzdC5oZWlnaHQgPSBzcmMtPmhlaWdodDsKKyAgICAgICAgZHN0LnVzYWdlID0gbWFwVG9BaWRsQ29uc3VtZXJVc2FnZShjYW0zc3RyZWFtLT5nZXRVc2FnZSgpKTsKKyAgICAgICAgZHN0LnJvdGF0aW9uID0gbWFwVG9BaWRsU3RyZWFtUm90YXRpb24oKGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdClzcmMtPnJvdGF0aW9uKTsKKyAgICAgICAgZHN0LmZvcm1hdCA9CisgICAgICAgICAgICBtYXBUb0FpZGxQaXhlbEZvcm1hdChjYW0zc3RyZWFtLT5pc0Zvcm1hdE92ZXJyaWRkZW4oKSA/IGNhbTNzdHJlYW0tPmdldE9yaWdpbmFsRm9ybWF0KCkKKyAgICAgICAgICAgICAgICAgICAgOiBzcmMtPmZvcm1hdCk7CisgICAgICAgIGRzdC5kYXRhU3BhY2UgPQorICAgICAgICAgICAgbWFwVG9BaWRsRGF0YXNwYWNlKGNhbTNzdHJlYW0tPmlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpID8KKyAgICAgICAgICAgICAgICAgICAgY2FtM3N0cmVhbS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKSA6IHNyYy0+ZGF0YV9zcGFjZSk7CisgICAgICAgIGRzdC5idWZmZXJTaXplID0gYnVmZmVyU2l6ZXNbaV07CisgICAgICAgIGlmIChzcmMtPnBoeXNpY2FsX2NhbWVyYV9pZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBkc3QucGh5c2ljYWxDYW1lcmFJZCA9IHNyYy0+cGh5c2ljYWxfY2FtZXJhX2lkOworICAgICAgICB9CisgICAgICAgIGRzdC5ncm91cElkID0gY2FtM3N0cmVhbS0+Z2V0SGFsU3RyZWFtR3JvdXBJZCgpOworICAgICAgICBkc3Quc2Vuc29yUGl4ZWxNb2Rlc1VzZWQucmVzaXplKHNyYy0+c2Vuc29yX3BpeGVsX21vZGVzX3VzZWQuc2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICBmb3IgKGludCBtb2RlIDogc3JjLT5zZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZCkgeworICAgICAgICAgICAgZHN0LnNlbnNvclBpeGVsTW9kZXNVc2VkW2orK10gPSBzdGF0aWNfY2FzdDxTZW5zb3JQaXhlbE1vZGU+KG1vZGUpOworICAgICAgICB9CisgICAgICAgIGFjdGl2ZVN0cmVhbXMuaW5zZXJ0KHN0cmVhbUlkKTsKKyAgICAgICAgLy8gQ3JlYXRlIEJ1ZmZlciBJRCBtYXAgaWYgbmVjZXNzYXJ5CisgICAgICAgIG1CdWZmZXJSZWNvcmRzLnRyeUNyZWF0ZUJ1ZmZlckNhY2hlKHN0cmVhbUlkKTsKKyAgICB9CisgICAgLy8gcmVtb3ZlIEJ1ZmZlcklkTWFwIGZvciBkZWxldGVkIHN0cmVhbXMKKyAgICBtQnVmZmVyUmVjb3Jkcy5yZW1vdmVJbmFjdGl2ZUJ1ZmZlckNhY2hlcyhhY3RpdmVTdHJlYW1zKTsKKworICAgIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIG9wZXJhdGlvbk1vZGU7CisgICAgcmVzID0gbWFwVG9BaWRsU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgICAgICAgICAoY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCljb25maWctPm9wZXJhdGlvbl9tb2RlLAorICAgICAgICAgICAgLypvdXQqLyAmb3BlcmF0aW9uTW9kZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOworICAgIHNpemVfdCBzZXNzaW9uUGFyYW1TaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHNlc3Npb25QYXJhbXMpOworICAgIHVpbnQ4X3QgKnNlc3Npb25QYXJhbVAgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHNlc3Npb25QYXJhbXMpKTsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24uc2Vzc2lvblBhcmFtcy5tZXRhZGF0YS5hc3NpZ24oCisgICAgICAgICAgICBzZXNzaW9uUGFyYW1QLCBzZXNzaW9uUGFyYW1QICsgc2Vzc2lvblBhcmFtU2l6ZSk7CisKKyAgICAvLyBTZWUgd2hpY2ggdmVyc2lvbiBvZiBIQUwgd2UgaGF2ZQorICAgIGlmIChtQWlkbEluamVjdGlvblNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIrKzsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5tdWx0aVJlc29sdXRpb25JbnB1dEltYWdlID0gY29uZmlnLT5pbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uOworCisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiByYXdNZXRhZGF0YSA9IGNhbWVyYUNoYXJhY3RlcmlzdGljcy5nZXRBbmRMb2NrKCk7CisgICAgICAgIHVpbnQ4X3QgKmFpZGxDaGFyc1AgPQorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihyYXdNZXRhZGF0YSkpOworICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYU1ldGFkYXRhIGFpZGxDaGFyczsKKyAgICAgICAgYWlkbENoYXJzLm1ldGFkYXRhLmFzc2lnbihhaWRsQ2hhcnNQLCBhaWRsQ2hhcnNQICsgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJhd01ldGFkYXRhKSk7CisgICAgICAgIGNhbWVyYUNoYXJhY3RlcmlzdGljcy51bmxvY2socmF3TWV0YWRhdGEpOworCisgICAgICAgIGF1dG8gZXJyID0gbUFpZGxJbmplY3Rpb25TZXNzaW9uLT5jb25maWd1cmVJbmplY3Rpb25TdHJlYW1zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgYWlkbENoYXJzKTsKKyAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gQWlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKGVycik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IG1BaWRsSW5qZWN0aW9uU2Vzc2lvbiA9PSBudWxscHRyLCB0aGUgaW5qZWN0aW9uIG5vdCBzdXBwb3J0ZWQgIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxIYWxJbnRlcmZhY2U6OnByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cygKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90Kj4mIHJlcXVlc3RzLC8qb3V0Ki91aW50MzJfdCogbnVtUmVxdWVzdFByb2Nlc3NlZCkgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OnByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cyIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OkNhcHR1cmVSZXF1ZXN0PiBjYXB0dXJlUmVxdWVzdHM7CisgICAgc2l6ZV90IGJhdGNoU2l6ZSA9IHJlcXVlc3RzLnNpemUoKTsKKyAgICBpZiAoYmF0Y2hTaXplID4gSU5UX01BWCkgeworICAgICAgICBBTE9HRSgiJXMgYmF0Y2hTaXplICV6dSA+IElOVF9NQVgsIGFpZGwgaW50ZXJmYWNlIGNhbm5vdCBoYW5kbGUgYmF0Y2ggc2l6ZSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGNhcHR1cmVSZXF1ZXN0cy5yZXNpemUoYmF0Y2hTaXplKTsKKyAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiBoYW5kbGVzQ3JlYXRlZDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+IGluZmxpZ2h0QnVmZmVyczsKKworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKKyAgICAgICByZXMgPSB3cmFwQXNBaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNbaV0sCisgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQsIC8qb3V0Ki8maW5mbGlnaHRCdWZmZXJzKTsKKworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBtQnVmZmVyUmVjb3Jkcy5wb3BJbmZsaWdodEJ1ZmZlcnMoaW5mbGlnaHRCdWZmZXJzKTsKKyAgICAgICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlckNhY2hlPiBjYWNoZXNUb1JlbW92ZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1GcmVlZEJ1ZmZlcnNMb2NrKTsKKyAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogbUZyZWVkQnVmZmVycykgeworICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSBtaWdodCBoYXZlIGJlZW4gcmVtb3ZlZCBzaW5jZSBvbkJ1ZmZlckZyZWVkCisgICAgICAgICAgICBpZiAobUJ1ZmZlclJlY29yZHMuaXNTdHJlYW1DYWNoZWQocGFpci5maXJzdCkpIHsKKyAgICAgICAgICAgICAgICBjYWNoZXNUb1JlbW92ZS5wdXNoX2JhY2soe3BhaXIuZmlyc3QsIHN0YXRpY19jYXN0PGludDY0X3Q+KHBhaXIuc2Vjb25kKX0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1GcmVlZEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB9CisKKyAgICAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9IDA7CisKKyAgICAvLyBXcml0ZSBtZXRhZGF0YSB0byBGTVEuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiYXRjaFNpemU7IGkrKykgeworICAgICAgICBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QqIHJlcXVlc3QgPSByZXF1ZXN0c1tpXTsKKyAgICAgICAgY2FtZXJhOjpkZXZpY2U6OkNhcHR1cmVSZXF1ZXN0KiBjYXB0dXJlUmVxdWVzdDsKKyAgICAgICAgY2FwdHVyZVJlcXVlc3QgPSAmY2FwdHVyZVJlcXVlc3RzW2ldOworCisgICAgICAgIGlmIChyZXF1ZXN0LT5zZXR0aW5ncyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzaXplX3Qgc2V0dGluZ3NTaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJlcXVlc3QtPnNldHRpbmdzKTsKKyAgICAgICAgICAgIGlmIChtUmVxdWVzdE1ldGFkYXRhUXVldWUgIT0gbnVsbHB0ciAmJiBtUmVxdWVzdE1ldGFkYXRhUXVldWUtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGludDhfdCo+KHJlcXVlc3QtPnNldHRpbmdzKSwgc2V0dGluZ3NTaXplKSkgeworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5zZXR0aW5ncy5tZXRhZGF0YS5yZXNpemUoMCk7CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmZtcVNldHRpbmdzU2l6ZSA9IHNldHRpbmdzU2l6ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogY291bGRuJ3QgdXRpbGl6ZSBmbXEsIGZhbGxiYWNrIHRvIGh3YmluZGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWludDhfdCAqc2V0dGluZ3NQID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVxdWVzdC0+c2V0dGluZ3MpKTsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2V0dGluZ3NTaXplID0gIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyZXF1ZXN0LT5zZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPnNldHRpbmdzLm1ldGFkYXRhLmFzc2lnbihzZXR0aW5nc1AsIHNldHRpbmdzUCArIHNldHRpbmdzU2l6ZSk7CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmZtcVNldHRpbmdzU2l6ZSA9IDB1OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQSBudWxsIHJlcXVlc3Qgc2V0dGluZ3MgbWFwcyB0byBhIHNpemUtMCBDYW1lcmFNZXRhZGF0YQorICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPnNldHRpbmdzLm1ldGFkYXRhLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5mbXFTZXR0aW5nc1NpemUgPSAwdTsKKyAgICAgICAgfQorCisgICAgICAgIGNhcHR1cmVSZXF1ZXN0IC0+aW5wdXRXaWR0aCA9IHJlcXVlc3QtPmlucHV0X3dpZHRoOworICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRIZWlnaHQgPSByZXF1ZXN0LT5pbnB1dF9oZWlnaHQ7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZz4mIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPQorICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5waHlzaWNhbENhbWVyYVNldHRpbmdzOworICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzLnJlc2l6ZShyZXF1ZXN0LT5udW1fcGh5c2NhbV9zZXR0aW5ncyk7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3M7IGorKykgeworICAgICAgICAgICAgaWYgKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3MgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHNpemVfdCBzZXR0aW5nc1NpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSk7CisgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyICYmIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQ4X3QqPihyZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzW2pdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nc1NpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uc2V0dGluZ3MubWV0YWRhdGEucmVzaXplKDApOworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLmZtcVNldHRpbmdzU2l6ZSA9IHNldHRpbmdzU2l6ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogY291bGRuJ3QgdXRpbGl6ZSBmbXEsIGZhbGxiYWNrIHRvIGh3YmluZGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwaHlzaWNhbFNldHRpbmdzUCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSkpOworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLm1ldGFkYXRhLmFzc2lnbihwaHlzaWNhbFNldHRpbmdzUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFNldHRpbmdzUCArIHNldHRpbmdzU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uZm1xU2V0dGluZ3NTaXplID0gMHU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLmZtcVNldHRpbmdzU2l6ZSA9IDB1OworICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uc2V0dGluZ3MubWV0YWRhdGEucmVzaXplKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5waHlzaWNhbENhbWVyYUlkID0gcmVxdWVzdC0+cGh5c2NhbV9pZFtqXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgbnVtUmVxdWVzdHMgPSAwOworICAgIGF1dG8gcmV0UyA9IG1BaWRsU2Vzc2lvbi0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KGNhcHR1cmVSZXF1ZXN0cywgY2FjaGVzVG9SZW1vdmUsCisgICAgICAgICAgICAmbnVtUmVxdWVzdHMpOworICAgIGlmICghcmV0Uy5pc09rKCkpIHsKKyAgICAgICAgcmVzID0gQWlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKHJldFMpOworICAgIH0KKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIGlmIChudW1SZXF1ZXN0cyA8IDApIHsKKyAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obnVtUmVxdWVzdHMpOworICAgICAgICB9CisKKyAgICB9CisgICAgaWYgKHJlcyA9PSBPSyAmJiAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9PSBiYXRjaFNpemUpIHsKKyAgICAgICAgaWYgKG1BaWRsU2Vzc2lvbi0+aXNSZW1vdGUoKSkgeworICAgICAgICAgICAgLy8gT25seSBjbG9zZSBhY3F1aXJlIGZlbmNlIEZEcyB3aGVuIHRoZSBBSURMIHRyYW5zYWN0aW9uIHN1Y2NlZWRzIChzbyB0aGUgRkRzIGhhdmUgYmVlbgorICAgICAgICAgICAgLy8gc2VudCB0byBjYW1lcmEgSEFMIHByb2Nlc3NlcykKKyAgICAgICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCwgLypjbG9zZUZkKi90cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEluIHBhc3N0aHJvdWdoIG1vZGUgdGhlIEZEcyBhcmUgbm93IG93bmVkIGJ5IEhBTAorICAgICAgICAgICAgY2xlYW51cE5hdGl2ZUhhbmRsZXMoJmhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlcyBFcnJvciB3aXRoIHByb2Nlc3NDYXB0dXJlUmVxdWVzdCAlcyAiLCBfX0ZVTkNUSU9OX18sIHJldFMuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgbUJ1ZmZlclJlY29yZHMucG9wSW5mbGlnaHRCdWZmZXJzKGluZmxpZ2h0QnVmZmVycyk7CisgICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsSGFsSW50ZXJmYWNlOjp3cmFwQXNBaWRsUmVxdWVzdChjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QqIHJlcXVlc3QsCisgICAgICAgIC8qb3V0Ki9jYW1lcmE6OmRldmljZTo6Q2FwdHVyZVJlcXVlc3QqIGNhcHR1cmVSZXF1ZXN0LAorICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkLAorICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiogaW5mbGlnaHRCdWZmZXJzKSB7CisgICAgdXNpbmcgY2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclN0YXR1czsKKyAgICB1c2luZyBjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyOworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKGNhcHR1cmVSZXF1ZXN0ID09IG51bGxwdHIgfHwgaGFuZGxlc0NyZWF0ZWQgPT0gbnVsbHB0ciB8fCBpbmZsaWdodEJ1ZmZlcnMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNhcHR1cmVSZXF1ZXN0ICglcCksIGhhbmRsZXNDcmVhdGVkICglcCksIGFuZCBpbmZsaWdodEJ1ZmZlcnMoJXApICIKKyAgICAgICAgICAgICAgICAibXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXywgY2FwdHVyZVJlcXVlc3QsIGhhbmRsZXNDcmVhdGVkLCBpbmZsaWdodEJ1ZmZlcnMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciA9IHJlcXVlc3QtPmZyYW1lX251bWJlcjsKKworICAgIGNhcHR1cmVSZXF1ZXN0LT5mbXFTZXR0aW5nc1NpemUgPSAwOworCisgICAgeworICAgICAgICBpZiAocmVxdWVzdC0+aW5wdXRfYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+c3RyZWFtKS0+Z2V0SWQoKTsKKyAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWYgPSAqKHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+YnVmZmVyKTsKKyAgICAgICAgICAgIGF1dG8gcGFpciA9IGdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOworICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICB1aW50NjRfdCBidWZmZXJJZCA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLnN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYnVmZmVySWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5idWZmZXIgPQorICAgICAgICAgICAgICAgICAgICAoaXNOZXdCdWZmZXIpID8gY2FtZXJhMzo6ZHVwVG9BaWRsSWZOb3ROdWxsKGJ1ZikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSgpOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAocmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5hY3F1aXJlX2ZlbmNlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKKyAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UtPmRhdGFbMF0gPSByZXF1ZXN0LT5pbnB1dF9idWZmZXItPmFjcXVpcmVfZmVuY2U7CisgICAgICAgICAgICAgICAgaGFuZGxlc0NyZWF0ZWQtPnB1c2hfYmFjayhhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZHVwaW5nIGhlcmUgaXMgb2theSwgaW4gYWlkbCBvd25lcnNoaXAgaXMgbm90IGdpdmVuIHRvIGFpZGxfaGFuZGxlCisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYWNxdWlyZUZlbmNlID0gY2FtZXJhMzo6ZHVwVG9BaWRsSWZOb3ROdWxsKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIucmVsZWFzZUZlbmNlID0KKyAgICAgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlKCk7CisKKyAgICAgICAgICAgIG1CdWZmZXJSZWNvcmRzLnB1c2hJbmZsaWdodEJ1ZmZlcihjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5pbnB1dF9idWZmZXItPmJ1ZmZlcik7CisgICAgICAgICAgICBpbmZsaWdodEJ1ZmZlcnMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuc3RyZWFtSWQgPSAtMTsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5idWZmZXJJZCA9IEJVRkZFUl9JRF9OT19CVUZGRVI7CisgICAgICAgIH0KKworICAgICAgICBjYXB0dXJlUmVxdWVzdC0+b3V0cHV0QnVmZmVycy5yZXNpemUocmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnM7IGkrKykgeworICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqc3JjID0gcmVxdWVzdC0+b3V0cHV0X2J1ZmZlcnMgKyBpOworICAgICAgICAgICAgU3RyZWFtQnVmZmVyICZkc3QgPSBjYXB0dXJlUmVxdWVzdC0+b3V0cHV0QnVmZmVyc1tpXTsKKyAgICAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYy0+c3RyZWFtKS0+Z2V0SWQoKTsKKyAgICAgICAgICAgIGlmIChzcmMtPmJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZiA9ICooc3JjLT5idWZmZXIpOworICAgICAgICAgICAgICAgIGF1dG8gcGFpciA9IGdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBpc05ld0J1ZmZlciA/CisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzOjpkdXBUb0FpZGxJZk5vdE51bGwoYnVmKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSgpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBpZiAoc3JjLT5hY3F1aXJlX2ZlbmNlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHNyYy0+YWNxdWlyZV9mZW5jZTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlc0NyZWF0ZWQtPnB1c2hfYmFjayhhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkc3QuYWNxdWlyZUZlbmNlID0gY2FtZXJhMzo6ZHVwVG9BaWRsSWZOb3ROdWxsKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgLy8gSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IHBhdGgKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBCVUZGRVJfSURfTk9fQlVGRkVSOworICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgICAgICAgICBkc3QuYWNxdWlyZUZlbmNlID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IHNlbmQgYSBudWxsIGJ1ZmZlciBpbiBjYXB0dXJlIHJlcXVlc3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0LnN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgICAgICBkc3Quc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKKyAgICAgICAgICAgIGRzdC5yZWxlYXNlRmVuY2UgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUoKTsKKworICAgICAgICAgICAgLy8gT3V0cHV0IGJ1ZmZlcnMgYXJlIGVtcHR5IHdoZW4gdXNpbmcgSEFMIGJ1ZmZlciBtYW5hZ2VyCisgICAgICAgICAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclJlY29yZHMucHVzaEluZmxpZ2h0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCwgc3JjLT5idWZmZXIpOworICAgICAgICAgICAgICAgIGluZmxpZ2h0QnVmZmVycy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsSGFsSW50ZXJmYWNlOjpzd2l0Y2hUb09mZmxpbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAorICAgICAgICAvKm91dCovYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYW1lcmFPZmZsaW5lU2Vzc2lvbkluZm8qCisgICAgICAgICAgICAgICAgb2ZmbGluZVNlc3Npb25JbmZvLAorICAgICAgICAvKm91dCovc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPioKKyAgICAgICAgICAgICAgICBvZmZsaW5lU2Vzc2lvbiwKKyAgICAgICAgLypvdXQqL2NhbWVyYTM6OkJ1ZmZlclJlY29yZHMqIGJ1ZmZlclJlY29yZHMpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpzd2l0Y2hUb09mZmxpbmUiKTsKKyAgICBpZiAoIXZhbGlkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBvbiBpbnZhbGlkIGNhbWVyYSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKG9mZmxpbmVTZXNzaW9uSW5mbyA9PSBudWxscHRyIHx8IG9mZmxpbmVTZXNzaW9uID09IG51bGxwdHIgfHwgYnVmZmVyUmVjb3JkcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogb3V0cHV0IGFyZ3VtZW50cyBtdXN0IG5vdCBiZSBudWxsISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBhdXRvIGVyciA9IG1BaWRsU2Vzc2lvbi0+c3dpdGNoVG9PZmZsaW5lKHN0cmVhbXNUb0tlZXAsIG9mZmxpbmVTZXNzaW9uSW5mbywgb2ZmbGluZVNlc3Npb24pOworCisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIEFpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChlcnIpOworICAgIH0KKworICAgIHJldHVybiB2ZXJpZnlCdWZmZXJDYWNoZXMob2ZmbGluZVNlc3Npb25JbmZvLCBidWZmZXJSZWNvcmRzKTsKK30KKworQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxSZXF1ZXN0VGhyZWFkOjpBaWRsUmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCisgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKKyAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgIGJvb2wgc3VwcG9ydENhbWVyYU11dGUpIDoKKyAgICAgICAgICBSZXF1ZXN0VGhyZWFkKHBhcmVudCwgc3RhdHVzVHJhY2tlciwgaW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzLCB1c2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgc3VwcG9ydENhbWVyYU11dGUpIHt9CisKK3N0YXR1c190IEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsUmVxdWVzdFRocmVhZDo6c3dpdGNoVG9PZmZsaW5lKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKKyAgICAgICAgLypvdXQqL2NhbWVyYTo6ZGV2aWNlOjpDYW1lcmFPZmZsaW5lU2Vzc2lvbkluZm8qIG9mZmxpbmVTZXNzaW9uSW5mbywKKyAgICAgICAgLypvdXQqL3N0ZDo6c2hhcmVkX3B0cjxjYW1lcmE6OmRldmljZTo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPiogb2ZmbGluZVNlc3Npb24sCisgICAgICAgIC8qb3V0Ki9jYW1lcmEzOjpCdWZmZXJSZWNvcmRzKiBidWZmZXJSZWNvcmRzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKKyAgICBjbGVhclJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKC8qbGFzdEZyYW1lTnVtYmVyKi9udWxscHRyKTsKKworICAgIC8vIFdhaXQgdW50aWwgcmVxdWVzdCB0aHJlYWQgaXMgZnVsbHkgc3RvcHBlZAorICAgIC8vIFRCRDogY2hlY2sgaWYgcmVxdWVzdCB0aHJlYWQgaXMgYmVpbmcgcGF1c2VkIGJ5IG90aGVyIEFQSXMgKHNob3VsZG4ndCBiZSkKKworICAgIC8vIFdlIGNvdWxkIGFsc28gY2hlY2sgZm9yIG1SZXBlYXRpbmdSZXF1ZXN0cy5lbXB0eSgpLCBidXQgdGhlIEFQSSBpbnRlcmZhY2UKKyAgICAvLyBpcyBzZXJpYWxpemVkIGJ5IENhbWVyYTNEZXZpY2U6Om1JbnRlcmZhY2VMb2NrIHNvIG5vIG9uZSBzaG91bGQgYmUgYWJsZSB0byBzdWJtaXQgYW55CisgICAgLy8gbmV3IHJlcXVlc3RzIGR1cmluZyB0aGUgY2FsbDsgaGVuY2Ugc2tpcCB0aGF0IGNoZWNrLgorICAgIGJvb2wgcXVldWVFbXB0eSA9IG1OZXh0UmVxdWVzdHMuZW1wdHkoKSAmJiBtUmVxdWVzdFF1ZXVlLmVtcHR5KCk7CisgICAgd2hpbGUgKCFxdWV1ZUVtcHR5KSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1SZXF1ZXN0U3VibWl0dGVkU2lnbmFsLndhaXRSZWxhdGl2ZShtUmVxdWVzdExvY2ssIGtSZXF1ZXN0U3VibWl0VGltZW91dCk7CisgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHJlcXVlc3QgdGhyZWFkIGZhaWxlZCB0byBzdWJtaXQgb25lIHJlcXVlc3Qgd2l0aGluIHRpbWVvdXQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHJlcXVlc3QgdGhyZWFkIGZhaWxlZCB0byBzdWJtaXQgYSByZXF1ZXN0OiAlcyAoJWQpISIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIHF1ZXVlRW1wdHkgPSBtTmV4dFJlcXVlc3RzLmVtcHR5KCkgJiYgbVJlcXVlc3RRdWV1ZS5lbXB0eSgpOworICAgIH0KKyAgICByZXR1cm4gKHN0YXRpY19jYXN0PEFpZGxIYWxJbnRlcmZhY2UgKj4obUludGVyZmFjZS5nZXQoKSkpLT5zd2l0Y2hUb09mZmxpbmUoCisgICAgICAgICAgICBzdHJlYW1zVG9LZWVwLCBvZmZsaW5lU2Vzc2lvbkluZm8sIG9mZmxpbmVTZXNzaW9uLCBidWZmZXJSZWNvcmRzKTsKK30KKworc3RhdHVzX3QgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6aW5qZWN0aW9uSW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5qZWN0ZWRDYW1JZCwgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mY2FsbGJhY2spIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1JbmplY3Rpb25Mb2NrKTsKKworICAgIGlmIChtYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBtYW5hZ2VyIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwYXJlbnQgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChwYXJlbnQtPmdldFRyYW5zcG9ydFR5cGUoKSAhPSBJUENUcmFuc3BvcnQ6OkFJREwpIHsKKyAgICAgICAgQUxPR0UoIiVzIFBhcmVudCB0cmFuc3BvcnQgbm90IEFJREwgZm9yIGluamVjdGVkIGNhbWVyYSBpZCAlcywgYWJvcnRpbmciLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICBpbmplY3RlZENhbUlkLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1JbmplY3RlZENhbUlkID0gaW5qZWN0ZWRDYW1JZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFJbmplY3Rpb25TZXNzaW9uPiBpbmplY3Rpb25TZXNzaW9uOworICAgIEFUUkFDRV9CRUdJTigiSW5qZWN0aW9uIENhbWVyYUhhbDo6b3BlblNlc3Npb24iKTsKKyAgICBzdGF0dXNfdCByZXMgPSBtYW5hZ2VyLT5vcGVuQWlkbEluamVjdGlvblNlc3Npb24oaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSwgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovICZpbmplY3Rpb25TZXNzaW9uKTsKKyAgICBBVFJBQ0VfRU5EKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiSW5qZWN0aW9uIGNhbWVyYSBjb3VsZCBub3Qgb3BlbiBjYW1lcmEgc2Vzc2lvbjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZVNlc3Npb24+IGRldmljZVNlc3Npb24gPSBudWxscHRyOworICAgIGF1dG8gcmV0ID0gaW5qZWN0aW9uU2Vzc2lvbi0+Z2V0Q2FtZXJhRGV2aWNlU2Vzc2lvbigmZGV2aWNlU2Vzc2lvbik7CisgICAgaWYgKCFyZXQuaXNPaygpIHx8IGRldmljZVNlc3Npb24gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgQ2FtZXJhIGluamVjdGlvbiBzZXNzaW9uIGNvdWxkbid0IHJldHVybiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBBaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1QocmV0KTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QWlkbFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZTsKKyAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6TVFEZXNjcmlwdG9yPAorICAgICAgICAgICAgaW50OF90LCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6U3luY2hyb25pemVkUmVhZFdyaXRlPiBkZXNjOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVxdWVzdFF1ZXVlUmV0ID0gZGV2aWNlU2Vzc2lvbi0+Z2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlKCZkZXNjKTsKKyAgICBpZiAoIXJlcXVlc3RRdWV1ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgdHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSBmcm9tIGNhbWVyYSIKKyAgICAgICAgICAgICAgICAiIHNlc3Npb246ICVzIiwgcmVxdWVzdFF1ZXVlUmV0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBBaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1QocmVxdWVzdFF1ZXVlUmV0KTsKKyAgICB9CisgICAgcXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPEFpZGxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4oZGVzYyk7CisgICAgaWYgKCFxdWV1ZS0+aXNWYWxpZCgpIHx8IHF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICBBTE9HRSgiSEFMIHJldHVybnMgZW1wdHkgcmVzdWx0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSBpdCIpOworICAgICAgICBxdWV1ZSA9IG51bGxwdHI7CisgICAgICAgIC8vIERvbid0IHVzZSByZXNRdWV1ZSBvbndhcmRzLgorICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxBaWRsUmVzdWx0TWV0YWRhdGFRdWV1ZT4mIHJlc1F1ZXVlID0gbUluamVjdGlvblJlc3VsdE1ldGFkYXRhUXVldWU7CisgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6Ok1RRGVzY3JpcHRvcjwKKyAgICAgICAgaW50OF90LCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6U3luY2hyb25pemVkUmVhZFdyaXRlPiByZXNEZXNjOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlc3VsdFF1ZXVlUmV0ID0gZGV2aWNlU2Vzc2lvbi0+Z2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoJnJlc0Rlc2MpOworICAgIGlmICghcmVzdWx0UXVldWVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvciB3aGVuIGdldHRpbmcgcmVzdWx0IG1ldGFkYXRhIHF1ZXVlIGZyb20gY2FtZXJhIHNlc3Npb246ICVzIiwKKyAgICAgICAgICAgICAgICByZXN1bHRRdWV1ZVJldC5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm4gQWlkbFByb3ZpZGVySW5mbzo6bWFwVG9TdGF0dXNUKHJlc3VsdFF1ZXVlUmV0KTsKKyAgICB9CisgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPEFpZGxSZXN1bHRNZXRhZGF0YVF1ZXVlPihyZXNEZXNjKTsKKyAgICBpZiAoIXJlc1F1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJIQUwgcmV0dXJucyBlbXB0eSByZXN1bHQgbWV0YWRhdGEgZm1xLCBub3QgdXNlIGl0Iik7CisgICAgICAgIHJlc1F1ZXVlID0gbnVsbHB0cjsKKyAgICAgICAgLy8gRG9uJ3QgdXNlIHJlc1F1ZXVlIG9ud2FyZHMuCisgICAgfQorCisgICAgQUxPR1YoIiVzOiBJbmplY3Rpb24gY2FtZXJhIGludGVyZmFjZSA9IG5ldyBIYWxJbnRlcmZhY2UoKSIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UgPQorICAgICAgICAgICAgbmV3IEFpZGxIYWxJbnRlcmZhY2UoZGV2aWNlU2Vzc2lvbiwgaW5qZWN0aW9uU2Vzc2lvbiwgcXVldWUsIHBhcmVudC0+bVVzZUhhbEJ1Zk1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+bVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyk7CisgICAgaWYgKG1JbmplY3RlZENhbUhhbEludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogbUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFpZGxDYW1lcmEzRGV2aWNlOjpBaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OnJlcGxhY2VIYWxJbnRlcmZhY2UoCisgICAgICAgIHNwPEhhbEludGVyZmFjZT4gbmV3SGFsSW50ZXJmYWNlLCBib29sIGtlZXBCYWNrdXApIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtSW5qZWN0aW9uTG9jayk7CisgICAgaWYgKG5ld0hhbEludGVyZmFjZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogVGhlIG5ld0hhbEludGVyZmFjZSBkb2VzIG5vdCBleGlzdCwgdG8gc3RvcCByZXBsYWNpbmcuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogcGFyZW50IGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKHBhcmVudC0+Z2V0VHJhbnNwb3J0VHlwZSgpICE9IElQQ1RyYW5zcG9ydDo6QUlETCB8fAorICAgICAgICAgICAgbmV3SGFsSW50ZXJmYWNlLT5nZXRUcmFuc3BvcnRUeXBlKCkgIT0gSVBDVHJhbnNwb3J0OjpBSURMKSB7CisgICAgICAgIEFMT0dFKCIlcyBQYXJlbnQgdHJhbnNwb3J0IG5vdCBBSURMIGZvciByZXBsYWNpbmcgaGFsIGludGVyZmFjZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBBaWRsQ2FtZXJhM0RldmljZSAqYWlkbFBhcmVudCA9IHN0YXRpY19jYXN0PEFpZGxDYW1lcmEzRGV2aWNlICo+KHBhcmVudC5nZXQoKSk7CisgICAgaWYgKGtlZXBCYWNrdXApIHsKKyAgICAgICAgaWYgKG1CYWNrdXBIYWxJbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUJhY2t1cEhhbEludGVyZmFjZSA9IHBhcmVudC0+bUludGVyZmFjZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJhY2t1cFJlc3VsdE1ldGFkYXRhUXVldWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUJhY2t1cFJlc3VsdE1ldGFkYXRhUXVldWUgPSBzdGQ6Om1vdmUoYWlkbFBhcmVudC0+bVJlc3VsdE1ldGFkYXRhUXVldWUpOworICAgICAgICAgICAgYWlkbFBhcmVudC0+bVJlc3VsdE1ldGFkYXRhUXVldWUgPSBzdGQ6Om1vdmUobUluamVjdGlvblJlc3VsdE1ldGFkYXRhUXVldWUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUJhY2t1cEhhbEludGVyZmFjZSA9IG51bGxwdHI7CisgICAgICAgIGFpZGxQYXJlbnQtPm1SZXN1bHRNZXRhZGF0YVF1ZXVlID0gc3RkOjptb3ZlKG1CYWNrdXBSZXN1bHRNZXRhZGF0YVF1ZXVlKTsKKyAgICAgICAgbUJhY2t1cFJlc3VsdE1ldGFkYXRhUXVldWUgPSBudWxscHRyOworICAgIH0KKyAgICBwYXJlbnQtPm1JbnRlcmZhY2UgPSBuZXdIYWxJbnRlcmZhY2U7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM0RldmljZTo6aW5qZWN0aW9uQ2FtZXJhSW5pdGlhbGl6ZShjb25zdCBTdHJpbmc4ICZpbmplY3RlZENhbUlkLAorICAgICAgICAgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyKSB7CisgICAgICAgIHJldHVybiAoc3RhdGljX2Nhc3Q8QWlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzICo+CisgICAgICAgICAgICAgICAgICAgIChtSW5qZWN0aW9uTWV0aG9kcy5nZXQoKSkpLT5pbmplY3Rpb25Jbml0aWFsaXplKGluamVjdGVkQ2FtSWQsIG1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4obUNhbGxiYWNrcykpOworfTsKKworc3A8Q2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZD4gQWlkbENhbWVyYTNEZXZpY2U6OmNyZWF0ZU5ld1JlcXVlc3RUaHJlYWQoCisgICAgICAgICAgICAgICAgd3A8Q2FtZXJhM0RldmljZT4gcGFyZW50LCBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAorICAgICAgICAgICAgICAgIHNwPENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZT4gaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCisgICAgICAgICAgICAgICAgYm9vbCBzdXBwb3J0Q2FtZXJhTXV0ZSkgeworICAgIHJldHVybiBuZXcgQWlkbFJlcXVlc3RUaHJlYWQocGFyZW50LCBzdGF0dXNUcmFja2VyLCBpbnRlcmZhY2UsIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgICAgICB1c2VIYWxCdWZNYW5hZ2VyLCBzdXBwb3J0Q2FtZXJhTXV0ZSk7Cit9OworCitzcDxDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcz4KK0FpZGxDYW1lcmEzRGV2aWNlOjpjcmVhdGVDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQpIHsKKyAgICByZXR1cm4gbmV3IEFpZGxDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyhwYXJlbnQpOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNEZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjBhN2ViCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzRGV2aWNlLmgKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19BSURMQ0FNRVJBM0RFVklDRV9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19BSURMQ0FNRVJBM0RFVklDRV9ICisKKyNpbmNsdWRlICIuLi9DYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiQWlkbENhbWVyYTNPdXRwdXRVdGlscy5oIgorI2luY2x1ZGUgPGZtcS9BaWRsTWVzc2FnZVF1ZXVlLmg+CisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9CbkNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvSUNhbWVyYURldmljZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0lDYW1lcmFJbmplY3Rpb25TZXNzaW9uLmg+CituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyA6OmFuZHJvaWQ6OkFpZGxNZXNzYWdlUXVldWU7CisKKy8qKgorICogQ2FtZXJhRGV2aWNlIGZvciBBSURMIEhBTCBkZXZpY2VzLgorICovCitjbGFzcyBBaWRsQ2FtZXJhM0RldmljZSA6CisgICAgICAgICAgICBwdWJsaWMgQ2FtZXJhM0RldmljZSB7CisgIHB1YmxpYzoKKworICAgIHVzaW5nIEFpZGxSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IEFpZGxNZXNzYWdlUXVldWU8aW50OF90LCBTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OworICAgIGNsYXNzIEFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3M7CisgICAgZnJpZW5kIGNsYXNzIEFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3M7CisgICAgZXhwbGljaXQgQWlkbENhbWVyYTNEZXZpY2UoY29uc3QgU3RyaW5nOCYgaWQsIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgICAgICBib29sIGxlZ2FjeUNsaWVudCA9IGZhbHNlKTsKKworICAgIHZpcnR1YWwgfkFpZGxDYW1lcmEzRGV2aWNlKCkgeyB9CisKKyAgICBzdGF0aWMgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlBpeGVsRm9ybWF0IG1hcFRvQWlkbFBpeGVsRm9ybWF0KAorICAgICAgICAgICAgaW50IGZyYW1ld29ya0Zvcm1hdCk7CisgICAgc3RhdGljIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpEYXRhc3BhY2UgbWFwVG9BaWRsRGF0YXNwYWNlKAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKTsKKyAgICBzdGF0aWMgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OkJ1ZmZlclVzYWdlIG1hcFRvQWlkbENvbnN1bWVyVXNhZ2UoCisgICAgICAgICAgICB1aW50NjRfdCB1c2FnZSk7CisgICAgc3RhdGljIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtUm90YXRpb24KKyAgICAgICAgICAgIG1hcFRvQWlkbFN0cmVhbVJvdGF0aW9uKGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbik7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgbWFwVG9BaWRsU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgICAgICAgICBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90IG9wZXJhdGlvbk1vZGUsCisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKTsKKworICAgIHN0YXRpYyBpbnQgbWFwVG9GcmFtZXdvcmtGb3JtYXQoCisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCk7CisgICAgc3RhdGljIGFuZHJvaWRfZGF0YXNwYWNlIG1hcFRvRnJhbWV3b3JrRGF0YXNwYWNlKAorICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OkRhdGFzcGFjZSk7CisgICAgc3RhdGljIHVpbnQ2NF90IG1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZSgKKyAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpCdWZmZXJVc2FnZSB1c2FnZSk7CisgICAgc3RhdGljIHVpbnQ2NF90IG1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZSgKKyAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpCdWZmZXJVc2FnZSB1c2FnZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN3aXRjaFRvT2ZmbGluZShjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgLypzdHJlYW1zVG9LZWVwKi8sCisgICAgICAgICAgICAvKm91dCovIHNwPENhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZT4qIC8qc2Vzc2lvbiovKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgb3ZlcnJpZGU7CisgICAgY2xhc3MgQWlkbEhhbEludGVyZmFjZSA6IHB1YmxpYyBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2UgeworICAgICBwdWJsaWM6CisgICAgICAgIEFpZGxIYWxJbnRlcmZhY2Uoc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBaWRsUmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwgYm9vbCBzdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpOworICAgICAgICBBaWRsSGFsSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VTZXNzaW9uPgorICAgICAgICAgICAgICAgICAgICAmZGV2aWNlU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8CisgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbj4gJmluamVjdGlvblNlc3Npb24sCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEFpZGxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWUsCisgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLCBib29sIHN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyk7CisKKyAgICAgICAgdmlydHVhbCBJUENUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0VHlwZSgpIGNvbnN0IG92ZXJyaWRlIHtyZXR1cm4gSVBDVHJhbnNwb3J0OjpBSURMOyB9CisKKworICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgY29uc3RydWN0ZWQgd2l0aCBhIHZhbGlkIGRldmljZSBvciBzZXNzaW9uLCBhbmQgbm90IHlldCBjbGVhcmVkCisgICAgICAgIHZpcnR1YWwgYm9vbCB2YWxpZCgpIG92ZXJyaWRlOworCisgICAgICAgIC8vIFJlc2V0IHRoaXMgSGFsSW50ZXJmYWNlIG9iamVjdCAoZG9lcyBub3QgY2FsbCBjbG9zZSgpKQorICAgICAgICB2aXJ0dWFsIHZvaWQgY2xlYXIoKSBvdmVycmlkZTsKKworICAgICAgICAvLyBDYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHJlcXVlc3RUZW1wbGF0ZQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MoY2FtZXJhX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgICAgICAvKm91dCovIGNhbWVyYV9tZXRhZGF0YV90ICoqcmVxdWVzdFRlbXBsYXRlKSBvdmVycmlkZTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICAgICAgLyppbm91dCovIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl90ICpjb25maWcsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcykgb3ZlcnJpZGU7CisgICAgICAgIC8vIFRoZSBpbmplY3Rpb24gY2FtZXJhIGNvbmZpZ3VyZXMgdGhlIHN0cmVhbXMgdG8gaGFsLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZUluamVjdGVkU3RyZWFtcygKKyAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogc2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgICAgICAvKmlub3V0Ki8gY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX3QqIGNvbmZpZywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzLAorICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjYW1lcmFDaGFyYWN0ZXJpc3RpY3MpIG92ZXJyaWRlOworCisgICAgICAgIC8vIFdoZW4gdGhlIGNhbGwgc3VjY2VlZHMsIHRoZSBvd25lcnNoaXAgb2YgYWNxdWlyZSBmZW5jZXMgaW4gcmVxdWVzdHMgaXMgdHJhbnNmZXJyZWQgdG8KKyAgICAgICAgLy8gSGFsSW50ZXJmYWNlLiBNb3JlIHNwZWNpZmljYWxseSwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBzZW5kIHRoZSBmZW5jZSB0bworICAgICAgICAvLyBIQUwgcHJvY2VzcyBhbmQgY2xvc2UgdGhlIEZEIGluIGNhbWVyYXNlcnZlciBwcm9jZXNzLiBXaGVuIHRoZSBjYWxsIGZhaWxzLCB0aGUgb3duZXJzaGlwCisgICAgICAgIC8vIG9mIHRoZSBhY3F1aXJlIGZlbmNlIHN0aWxsIGJlbG9uZ3MgdG8gdGhlIGNhbGxlci4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90Kj4mIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgIC8qb3V0Ki91aW50MzJfdCogbnVtUmVxdWVzdFByb2Nlc3NlZCkgb3ZlcnJpZGU7CisKKyAgICAgICAgLy8gQ2FsbHMgaW50byB0aGUgSEFMIGludGVyZmFjZQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcykgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKENhbWVyYU1ldGFkYXRhJiBvbGRTZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhJiBuZXdTZXNzaW9uUGFyYW1zKSBvdmVycmlkZTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlcGVhdGluZ1JlcXVlc3RFbmQodWludDMyX3QgLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICYpIG92ZXJyaWRlOworCisgICAgICAgIHN0YXR1c190IHN3aXRjaFRvT2ZmbGluZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHN0cmVhbXNUb0tlZXAsCisgICAgICAgIC8qb3V0Ki9haWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYU9mZmxpbmVTZXNzaW9uSW5mbyoKKyAgICAgICAgICAgICAgICBvZmZsaW5lU2Vzc2lvbkluZm8sCisgICAgICAgIC8qb3V0Ki9zdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+KgorICAgICAgICAgICAgICAgIG9mZmxpbmVTZXNzaW9uLAorICAgICAgICAvKm91dCovY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyogYnVmZmVyUmVjb3Jkcyk7CisKKyAgICAgcHJpdmF0ZToKKworICAgICAgICAvLyBBbHdheXMgdmFsaWQKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZVNlc3Npb24+CisgICAgICAgICAgICAgICAgbUFpZGxTZXNzaW9uID0gbnVsbHB0cjsKKyAgICAgICAgLy9WYWxpZCBmb3IgaW5qZWN0aW9uIHNlc3Npb25zCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFJbmplY3Rpb25TZXNzaW9uPgorICAgICAgICAgICAgICAgIG1BaWRsSW5qZWN0aW9uU2Vzc2lvbiA9IG51bGxwdHI7CisKKyAgICAgICAgc3RhdHVzX3Qgd3JhcEFzQWlkbFJlcXVlc3QoY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAorICAgICAgICAgICAgICAgIC8qb3V0Ki9haWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhcHR1cmVSZXF1ZXN0KiBjYXB0dXJlUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkLAorICAgICAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBpbmZsaWdodEJ1ZmZlcnMpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBaWRsUmVxdWVzdE1ldGFkYXRhUXVldWU+IG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZTsKKyAgICB9OyAvLyBjbGFzcyBBaWRsSGFsSW50ZXJmYWNlCisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VDYWxsYmFjaworICAgICAqLworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHByb2Nlc3NDYXB0dXJlUmVzdWx0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cyk7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgbm90aWZ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpOb3RpZnlNc2c+JiBtc2dzKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyUmV0Piogb3V0QnVmZmVycywKKyAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdFN0YXR1cyogc3RhdHVzKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJldHVyblN0cmVhbUJ1ZmZlcnMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpOworCisgICAgY2xhc3MgQWlkbFJlcXVlc3RUaHJlYWQgOiBwdWJsaWMgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZCB7CisgICAgICBwdWJsaWM6CisgICAgICAgIEFpZGxSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKKyAgICAgICAgICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAorICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCisgICAgICAgICAgICAgICAgYm9vbCBzdXBwb3J0Q2FtZXJhTXV0ZSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3dpdGNoVG9PZmZsaW5lKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAorICAgICAgICAgICAgICAgIC8qb3V0Ki9haWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhbWVyYU9mZmxpbmVTZXNzaW9uSW5mbyoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxpbmVTZXNzaW9uSW5mbywKKyAgICAgICAgICAgICAgICAvKm91dCovc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+KgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsaW5lU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAvKm91dCovY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyogYnVmZmVyUmVjb3Jkcyk7CisgICAgfTsgLy8gY2xhc3MgQWlkbFJlcXVlc3RUaHJlYWQKKworICAgIGNsYXNzIEFpZGxDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyA6IHB1YmxpYyBDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyB7CisgICAgIHB1YmxpYzoKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgaW5qZWN0aW9uIGNhbWVyYSBhbmQgZ2VuZXJhdGUgYW4gaGFsIGludGVyZmFjZS4KKyAgICAgICAgc3RhdHVzX3QgaW5qZWN0aW9uSW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBpbmplY3RlZENhbUlkLCBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPAorICAgICAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mCisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKTsKKyAgICAgICAgQWlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCkgOgorICAgICAgICAgICAgICAgIENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKHBhcmVudCkgeyB9OworICAgICAgICB+QWlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKCkge30KKyAgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gQmFja3VwIG9mIHRoZSBvcmlnaW5hbCBjYW1lcmEgaGFsIHJlc3VsdCBGTVEuCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBaWRsUmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUJhY2t1cFJlc3VsdE1ldGFkYXRhUXVldWU7CisKKyAgICAgICAgLy8gRk1RIHdyaXRlcyB0aGUgcmVzdWx0IGZvciB0aGUgaW5qZWN0aW9uIGNhbWVyYS4gTXVzdCBiZSBndWFyZGVkIGJ5CisgICAgICAgIC8vIG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2suCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBaWRsUmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUluamVjdGlvblJlc3VsdE1ldGFkYXRhUXVldWU7CisKKyAgICAgICAgLy8gVXNlIGluamVjdGlvbiBjYW1lcmEgaGFsIGludGVyZmFjZSB0byByZXBsYWNlIGFuZCBiYWNrdXAgb3JpZ2luYWwKKyAgICAgICAgLy8gY2FtZXJhIGhhbCBpbnRlcmZhY2UuCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVwbGFjZUhhbEludGVyZmFjZShzcDxIYWxJbnRlcmZhY2U+IG5ld0hhbEludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBib29sIGtlZXBCYWNrdXApIG92ZXJyaWRlOworICAgIH07CisKKyAgICAvLyBXZSBuZWVkIGEgc2VwYXJhdGUgY2xhc3Mgd2hpY2ggaW5oZXJpdHMgZnJvbSBBSURMIElDYW1lcmFEZXZpY2VDYWxsYmFja3MKKyAgICAvLyBzaW5jZSB3ZSB1c2UgdGhlIG5kayBiYWNrZW5kIGZvciBBSURMIEhBTCBpbnRlcmZhY2VzLiBUaGUgbmRrIGJhY2tlbmQgb2YKKyAgICAvLyBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIGRvZXNuJ3Qgc3VwcG9ydCBzcDw+IChzaW5jZSBpdCBkb2Vzbid0IGluaGVyaXQKKyAgICAvLyBmcm9tIFJlZkJhc2UpLgorICAgIC8vIEFzIGEgcmVzdWx0IHdlIGNhbid0IHdyaXRlIHNwPENhbWVyYTNEZXZpY2U+ID0gbmV3IEFpZGxDYW1lcmEzRGV2aWNlKC4uLikuCisgICAgLy8gSXQgc3VwcG9ydHMgc3RkOjpzaGFyZWRfcHRyIGluc3RlYWQuIE90aGVyIHJlZmVyZW5jZXMgdG8KKyAgICAvLyBDYW1lcmEzRGV2aWNlIGluIGNhbWVyYXNlcnZlciB1c2Ugc3A8PiB3aWRlbHksIHNvIHRvIGtlZXAgc3VwcG9ydGluZworICAgIC8vIHRoYXQsIHdlIGNyZWF0ZSBhIG5ldyBjbGFzcyB3aGljaCB3aWxsIGJlIG1hbmFnZWQgdGhyb3VnaCBzdGQ6OnNoYXJlZF9wdHIKKyAgICAvLyBpbnRlcm5hbGx5IGJ5IEFpZGxDYW1lcmEzRGV2aWNlLgorICAgIGNsYXNzIEFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MgOgorICAgICAgICAgICAgcHVibGljIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Qm5DYW1lcmFEZXZpY2VDYWxsYmFjayB7CisgICAgICBwdWJsaWM6CisKKyAgICAgICAgQWlkbENhbWVyYURldmljZUNhbGxiYWNrcyh3cDxBaWRsQ2FtZXJhM0RldmljZT4gcGFyZW50KSA6IG1QYXJlbnQocGFyZW50KSAgeyB9CisgICAgICAgIH5BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKCkgeyB9CisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHByb2Nlc3NDYXB0dXJlUmVzdWx0KAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgb3ZlcnJpZGU7CisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG5vdGlmeSgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Tm90aWZ5TXNnPiYgbXNncykgb3ZlcnJpZGU7CisKKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8CisgICAgICAgICAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyUmV0Piogb3V0QnVmZmVycywKKyAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXMqIHN0YXR1cykgb3ZlcnJpZGU7CisKKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgb3ZlcnJpZGU7CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB3cDxBaWRsQ2FtZXJhM0RldmljZT4gbVBhcmVudCA9IG51bGxwdHI7CisgICAgfTsKKworICBwcml2YXRlOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5qZWN0aW9uQ2FtZXJhSW5pdGlhbGl6ZShjb25zdCBTdHJpbmc4ICZpbmplY3RDYW1JZCwKKyAgICAgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHNwPFJlcXVlc3RUaHJlYWQ+IGNyZWF0ZU5ld1JlcXVlc3RUaHJlYWQod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50LAorICAgICAgICAgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCisgICAgICAgICAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwKKyAgICAgICAgICAgICAgICBib29sIHN1cHBvcnRDYW1lcmFNdXRlKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3A8Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM+CisgICAgICAgICAgICBjcmVhdGVDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyh3cDxDYW1lcmEzRGV2aWNlPikgb3ZlcnJpZGU7CisKKyAgICAvLyBGTVEgdG8gd3JpdGUgcmVzdWx0IG9uLiBNdXN0IGJlIGd1YXJkZWQgYnkgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QWlkbFJlc3VsdE1ldGFkYXRhUXVldWU+IG1SZXN1bHRNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxBaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBtQ2FsbGJhY2tzID0gbnVsbHB0cjsKKworCit9OyAvLyBjbGFzcyBBaWRsQ2FtZXJhM0RldmljZQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzY3MTlkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uY3BwCkBAIC0wLDAgKzEsMjQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBaWRsQ2FtZXJhMy1PZmZMblNzbiIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorLy8jZGVmaW5lIExPR19OTkRFQlVHIDAgIC8vIFBlci1mcmFtZSB2ZXJib3NlIGxvZ2dpbmcKKworI2lmZGVmIExPR19OTkRFQlVHCisjZGVmaW5lIEFMT0dWViguLi4pIEFMT0dWKF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKworI2luY2x1ZGUgImRldmljZTMvYWlkbC9BaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRyYWNlcy5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKK3VzaW5nIG5hbWVzcGFjZSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisKK0FpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246On5BaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiBUZWFyaW5nIGRvd24gYWlkbCBvZmZsaW5lIHNlc3Npb24gZm9yIGNhbWVyYSBpZCAlcyIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKKyAgICBBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpkaXNjb25uZWN0U2Vzc2lvbigpOworfQorCitzdGF0dXNfdCBBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjppbml0aWFsaXplKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBpZiAobVNlc3Npb24gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEFJREwgc2Vzc2lvbiBpcyBudWxsISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKworICAgICAgICAvLyBzZXR1cCByZXN1bHQgRk1RCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBaWRsUmVzdWx0TWV0YWRhdGFRdWV1ZT4mIHJlc1F1ZXVlID0gbVJlc3VsdE1ldGFkYXRhUXVldWU7CisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpNUURlc2NyaXB0b3I8CisgICAgICAgICAgICBpbnQ4X3QsIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IGRlc2M7CisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlc3VsdFF1ZXVlUmV0ID0gbVNlc3Npb24tPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKCZkZXNjKTsKKyAgICAgICAgaWYgKCFyZXN1bHRRdWV1ZVJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvciB3aGVuIGdldHRpbmcgcmVzdWx0IG1ldGFkYXRhIHF1ZXVlIGZyb20gY2FtZXJhIHNlc3Npb246ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0UXVldWVSZXQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgICAgICByZXNRdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8QWlkbFJlc3VsdE1ldGFkYXRhUXVldWU+KGRlc2MpOworICAgICAgICBpZiAoIXJlc1F1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSEFMIHJldHVybnMgZW1wdHkgcmVzdWx0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSBpdCIpOworICAgICAgICAgICAgcmVzUXVldWUgPSBudWxscHRyOworICAgICAgICAgICAgLy8gRG9uJ3QgdXNlIHJlc1F1ZXVlIG9ud2FyZHMuCisgICAgICAgIH0KKworICAgICAgICBtU3RhdHVzID0gU1RBVFVTX0FDVElWRTsKKyAgICB9CisKKyAgICBtU2Vzc2lvbi0+c2V0Q2FsbGJhY2sobUNhbGxiYWNrcyk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246OkFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3M6OnByb2Nlc3NDYXB0dXJlUmVzdWx0KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjYW1lcmE6OmRldmljZTo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIHsKKyAgICBzcDxBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uPiBwID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHAgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgUGFyZW50IEFpZGxDYW1lcmFEZXZpY2Ugbm90IGFsaXZlLCBjYW4ndCBwcm9jZXNzIGNhbGxiYWNrcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisgICAgcmV0dXJuIHAtPnByb2Nlc3NDYXB0dXJlUmVzdWx0KHJlc3VsdHMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7CisgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICAgICAgfQorICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgfQorCisgICAgQWlkbENhcHR1cmVPdXRwdXRTdGF0ZXMgc3RhdGVzIHsKKyAgICAgIHttSWQsCisgICAgICAgIG1PZmZsaW5lUmVxc0xvY2ssIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAorICAgICAgICBtTGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyLCBtTGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyLAorICAgICAgICBtT2ZmbGluZVJlcXMsIG1PdXRwdXRMb2NrLCBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCisgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKKyAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAorICAgICAgICBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCisgICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLAorICAgICAgICAqdGhpcywgbUJ1ZmZlclJlY29yZHMsIC8qbGVnYWN5Q2xpZW50Ki8gZmFsc2UsIG1NaW5FeHBlY3RlZER1cmF0aW9ufSwgbVJlc3VsdE1ldGFkYXRhUXVldWUKKyAgICB9OworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jayk7CisgICAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzKSB7CisgICAgICAgIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKHN0YXRlcywgcmVzdWx0LCByZXN1bHQucGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6QWlkbENhbWVyYURldmljZUNhbGxiYWNrczo6bm90aWZ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjYW1lcmE6OmRldmljZTo6Tm90aWZ5TXNnPiYgbXNncykgeworICAgIHNwPEFpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24+IHAgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBQYXJlbnQgQWlkbENhbWVyYURldmljZSBub3QgYWxpdmUsIGNhbid0IHByb2Nlc3MgY2FsbGJhY2tzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKyAgICByZXR1cm4gcC0+bm90aWZ5KG1zZ3MpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpub3RpZnkoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpOb3RpZnlNc2c+JiBtc2dzKSB7CisgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICAgICAgfQorICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgfQorCisgICAgQWlkbENhcHR1cmVPdXRwdXRTdGF0ZXMgc3RhdGVzIHsKKyAgICAgIHttSWQsCisgICAgICAgIG1PZmZsaW5lUmVxc0xvY2ssIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAorICAgICAgICBtTGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyLCBtTGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyLAorICAgICAgICBtT2ZmbGluZVJlcXMsIG1PdXRwdXRMb2NrLCBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCisgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKKyAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAorICAgICAgICBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCisgICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLAorICAgICAgICAqdGhpcywgbUJ1ZmZlclJlY29yZHMsIC8qbGVnYWN5Q2xpZW50Ki8gZmFsc2UsIG1NaW5FeHBlY3RlZER1cmF0aW9ufSwgbVJlc3VsdE1ldGFkYXRhUXVldWUKKyAgICB9OworICAgIGZvciAoY29uc3QgYXV0byYgbXNnIDogbXNncykgeworICAgICAgICBjYW1lcmEzOjpub3RpZnkoc3RhdGVzLCBtc2cpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246OkFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3M6OnJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXJSZXQ+KiBidWZmZXJzLAorICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdFN0YXR1cyogc3RhdHVzKSB7CisgICAgc3A8QWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbj4gcCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIFBhcmVudCBBaWRsQ2FtZXJhRGV2aWNlIG5vdCBhbGl2ZSwgY2FuJ3QgcHJvY2VzcyBjYWxsYmFja3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIHJldHVybiBwLT5yZXF1ZXN0U3RyZWFtQnVmZmVycyhidWZSZXFzLCBidWZmZXJzLCBzdGF0dXMpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyUmV0PiogYnVmZmVycywKKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXMqIHN0YXR1cykgeworCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgICAgICB9CisgICAgfQorCisgICAgUmVxdWVzdEJ1ZmZlclN0YXRlcyBzdGF0ZXMgeworICAgICAgICBtSWQsIG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jaywgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwKKyAgICAgICAgKnRoaXMsIG1CdWZmZXJSZWNvcmRzLCAqdGhpc307CisgICAgY2FtZXJhMzo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoc3RhdGVzLCBidWZSZXFzLCBidWZmZXJzLCBzdGF0dXMpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6QWlkbENhbWVyYURldmljZUNhbGxiYWNrczo6cmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKKyAgICBzcDxBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uPiBwID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHAgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgUGFyZW50IEFpZGxDYW1lcmFEZXZpY2Ugbm90IGFsaXZlLCBjYW4ndCBwcm9jZXNzIGNhbGxiYWNrcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisgICAgcmV0dXJuIHAtPnJldHVyblN0cmVhbUJ1ZmZlcnMoYnVmZmVycyk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIEFpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246OnJldHVyblN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgICAgICB9CisgICAgfQorCisgICAgUmV0dXJuQnVmZmVyU3RhdGVzIHN0YXRlcyB7CisgICAgICAgIG1JZCwgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwKKyAgICAgICAgbUJ1ZmZlclJlY29yZHN9OworCisgICAgY2FtZXJhMzo6cmV0dXJuU3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZmZlcnMpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKwordm9pZCBBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpkaXNjb25uZWN0U2Vzc2lvbigpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICBpZiAobVNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgbVNlc3Npb24tPmNsb3NlKCk7CisgIH0KKyAgbVNlc3Npb24ucmVzZXQoKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZGUyYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQUlETF9DQU1FUkEzT0ZGTElORVNFU1NJT05fSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQUlETF9DQU1FUkEzT0ZGTElORVNFU1NJT05fSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisKKyNpbmNsdWRlICJBaWRsQ2FtZXJhM091dHB1dFV0aWxzLmgiCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvQm5DYW1lcmFEZXZpY2VDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0lDYW1lcmFPZmZsaW5lU2Vzc2lvbi5oPgorCisjaW5jbHVkZSA8Zm1xL0FpZGxNZXNzYWdlUXVldWUuaD4KKworI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UuaCIKKworI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIgorI2luY2x1ZGUgInV0aWxzL1RhZ01vbml0b3IuaCIKKyNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGNhbWVyYTMgeworCitjbGFzcyBDYW1lcmEzU3RyZWFtOworY2xhc3MgQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZTsKK2NsYXNzIENhbWVyYTNTdHJlYW1JbnRlcmZhY2U7CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKKworLyoqCisgKiBBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uIGZvciBvZmZsaW5lIHNlc3Npb24gZGVmaW5lZCBpbiBBSURMIElDYW1lcmFPZmZsaW5lU2Vzc2lvbgorICovCitjbGFzcyBBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uIDoKKyAgICAgICAgICAgIHB1YmxpYyBDYW1lcmEzT2ZmbGluZVNlc3Npb24geworICBwdWJsaWM6CisKKyAgICB2aXJ0dWFsIH5BaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUod3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYURldmljZUNhbGxiYWNrCisgICAgICovCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcHJvY2Vzc0NhcHR1cmVSZXN1bHQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBub3RpZnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6Ok5vdGlmeU1zZz4mIG1zZ3MpOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyUmV0Piogb3V0QnVmZmVycywKKyAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdFN0YXR1cyogc3RhdHVzKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJldHVyblN0cmVhbUJ1ZmZlcnMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpOworCisgICAgLy8gU2VlIGV4cGxhbmF0aW9uIGZvciB3aHkgd2UgbmVlZCBhIHNlcGFyYXRlIGNsYXNzIGZvciB0aGlzIGluCisgICAgLy8gQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MgaW4gQWlkbENhbWVyYTNEZXZpY2UuaAorICAgIGNsYXNzIEFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MgOgorICAgICAgICAgICAgcHVibGljIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Qm5DYW1lcmFEZXZpY2VDYWxsYmFjayB7CisgICAgICBwdWJsaWM6CisKKyAgICAgICAgQWlkbENhbWVyYURldmljZUNhbGxiYWNrcyh3cDxBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uPiBwYXJlbnQpIDogbVBhcmVudChwYXJlbnQpICB7IH0KKyAgICAgICAgfkFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MoKSB7fQorICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBub3RpZnkoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8CisgICAgICAgICAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6Ok5vdGlmeU1zZz4mIG1zZ3MpIG92ZXJyaWRlOworCisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4qIG91dF9idWZmZXJzLAorICAgICAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdFN0YXR1cyogX2FpZGxfcmV0dXJuCisgICAgICAgICAgICAgICAgKSBvdmVycmlkZTsKKworICAgICAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSBvdmVycmlkZTsKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHdwPEFpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24+IG1QYXJlbnQgPSBudWxscHRyOworICAgIH07CisKKyAgICAvLyBpbml0aWFsaXplIGJ5IENhbWVyYTNEZXZpY2UuCisgICAgZXhwbGljaXQgQWlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbihjb25zdCBTdHJpbmc4JiBpZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW0+JiBpbnB1dFN0cmVhbSwKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYTM6OlN0cmVhbVNldCYgb2ZmbGluZVN0cmVhbVNldCwKKyAgICAgICAgICAgIGNhbWVyYTM6OkJ1ZmZlclJlY29yZHMmJiBidWZmZXJSZWNvcmRzLAorICAgICAgICAgICAgY29uc3QgY2FtZXJhMzo6SW5GbGlnaHRSZXF1ZXN0TWFwJiBvZmZsaW5lUmVxcywKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYTNPZmZsaW5lU3RhdGVzJiBvZmZsaW5lU3RhdGVzLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPgorICAgICAgICAgICAgICAgICAgICBvZmZsaW5lU2Vzc2lvbikgOgorICAgICAgQ2FtZXJhM09mZmxpbmVTZXNzaW9uKGlkLCBpbnB1dFN0cmVhbSwgb2ZmbGluZVN0cmVhbVNldCwgc3RkOjptb3ZlKGJ1ZmZlclJlY29yZHMpLAorICAgICAgICAgICAgICBvZmZsaW5lUmVxcywgb2ZmbGluZVN0YXRlcyksCisgICAgICBtU2Vzc2lvbihvZmZsaW5lU2Vzc2lvbikgeworICAgICAgICBtQ2FsbGJhY2tzID0gbmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPEFpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3M+KHRoaXMpOworICAgICAgfTsKKworICAgIC8qKgorICAgICAqIEVuZCBvZiBDYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UgaW50ZXJmYWNlCisgICAgICovCisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpJQ2FtZXJhT2ZmbGluZVNlc3Npb24+IG1TZXNzaW9uOworICAgIC8vIEZNUSB0byB3cml0ZSByZXN1bHQgb24uIE11c3QgYmUgZ3VhcmRlZCBieSBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxBaWRsUmVzdWx0TWV0YWRhdGFRdWV1ZT4gbVJlc3VsdE1ldGFkYXRhUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QWlkbENhbWVyYURldmljZUNhbGxiYWNrcz4gbUNhbGxiYWNrczsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0U2Vzc2lvbigpIG92ZXJyaWRlOworCit9OyAvLyBjbGFzcyBBaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT3V0cHV0VXRpbHMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT3V0cHV0VXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZWViZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPdXRwdXRVdGlscy5jcHAKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFpZGxDYW1lcmEzLU91dHB1dFV0aWxzIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisvLyNkZWZpbmUgTE9HX05OREVCVUcgMCAgLy8gUGVyLWZyYW1lIHZlcmJvc2UgbG9nZ2luZworCisjaWZkZWYgTE9HX05OREVCVUcKKyNkZWZpbmUgQUxPR1ZWKC4uLikgQUxPR1YoX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBBTE9HVlYoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCisvLyBDb252ZW5pZW5jZSBtYWNyb3MgZm9yIHRyYW5zaXRpb25pbmcgdG8gdGhlIGVycm9yIHN0YXRlCisjZGVmaW5lIFNFVF9FUlIoZm10LCAuLi4pIHN0YXRlcy5zZXRFcnJJbnRmLnNldEVycm9yU3RhdGUoICAgXAorICAgICIlczogIiBmbXQsIF9fRlVOQ1RJT05fXywgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICMjX19WQV9BUkdTX18pCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8YWlkbGNvbW1vbnN1cHBvcnQvTmF0aXZlSGFuZGxlLmg+CisKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KKyNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CisKKyNpbmNsdWRlICJkZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPdXRwdXRVdGlscy5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzVGVtcGxhdGVkLmgiCisKKyNpbmNsdWRlICJzeXN0ZW0vY2FtZXJhX21ldGFkYXRhLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKwordm9pZCBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZCgKKyAgICAgICAgQWlkbENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgY29uc3QgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVzdWx0JiByZXN1bHQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4KKyAgICAgICAgICAgICAgICAmcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSkgeworICAgIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkVDxBaWRsQ2FwdHVyZU91dHB1dFN0YXRlcywKKyAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVzdWx0LAorICAgICAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+LAorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiwgQWlkbFJlc3VsdE1ldGFkYXRhUXVldWUsCisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyU3RhdHVzLCBpbnQ4X3Q+KHN0YXRlcywgcmVzdWx0LAorICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworfQorCit2b2lkIG5vdGlmeShDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsCisgICAgICAgIGNvbnN0IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Tm90aWZ5TXNnJiBtc2cpIHsKKworICAgIHVzaW5nIEVycm9yQ29kZSA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6RXJyb3JDb2RlOworICAgIHVzaW5nIFRhZyA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6Tm90aWZ5TXNnOjpUYWc7CisKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGNhbWVyYV9ub3RpZnlfbXNnIG07CisKKyAgICBzd2l0Y2ggKG1zZy5nZXRUYWcoKSkgeworICAgICAgICBjYXNlIFRhZzo6ZXJyb3I6CisgICAgICAgICAgICBtLnR5cGUgPSBDQU1FUkFfTVNHX0VSUk9SOworICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciA9IG1zZy5nZXQ8VGFnOjplcnJvcj4oKS5mcmFtZU51bWJlcjsKKyAgICAgICAgICAgIGlmIChtc2cuZ2V0PFRhZzo6ZXJyb3I+KCkuZXJyb3JTdHJlYW1JZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlcy5vdXRwdXRTdHJlYW1zLmdldChtc2cuZ2V0PFRhZzo6ZXJyb3I+KCkuZXJyb3JTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgZXJyb3Igc3RyZWFtIGlkICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIsIG1zZy5nZXQ8VGFnOjplcnJvcj4oKS5lcnJvclN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3Jfc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3Jfc3RyZWFtID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAobXNnLmdldDxUYWc6OmVycm9yPigpLmVycm9yQ29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpFUlJPUl9ERVZJQ0U6CisgICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gQ0FNRVJBX01TR19FUlJPUl9ERVZJQ0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpFUlJPUl9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQV9NU0dfRVJST1JfUkVRVUVTVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkVSUk9SX1JFU1VMVDoKKyAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX1JFU1VMVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkVSUk9SX0JVRkZFUjoKKyAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX0JVRkZFUjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUYWc6OnNodXR0ZXI6CisgICAgICAgICAgICBtLnR5cGUgPSBDQU1FUkFfTVNHX1NIVVRURVI7CisgICAgICAgICAgICBtLm1lc3NhZ2Uuc2h1dHRlci5mcmFtZV9udW1iZXIgPSBtc2cuZ2V0PFRhZzo6c2h1dHRlcj4oKS5mcmFtZU51bWJlcjsKKyAgICAgICAgICAgIG0ubWVzc2FnZS5zaHV0dGVyLnRpbWVzdGFtcCA9IG1zZy5nZXQ8VGFnOjpzaHV0dGVyPigpLnRpbWVzdGFtcDsKKyAgICAgICAgICAgIG0ubWVzc2FnZS5zaHV0dGVyLnJlYWRvdXRfdGltZXN0YW1wID0gbXNnLmdldDxUYWc6OnNodXR0ZXI+KCkucmVhZG91dFRpbWVzdGFtcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBub3RpZnkoc3RhdGVzLCAmbSk7Cit9CisKKworLy8gVGhlIGJ1ZmZlcnMgcmVxdWVzdGVkIHRocm91Z2ggdGhpcyBjYWxsIGFyZSBub3QgdGllZCB0byBhbnkgQ2FwdHVyZVJlcXVlc3QgaW4KKy8vIHBhcnRpY3VsYXIuIFRoZXkgbWF5IHVzZWQgYnkgdGhlIGhhbCBmb3IgYSBwYXJ0aWN1bGFyIGZyYW1lJ3Mgb3V0cHV0IGJ1ZmZlcgorLy8gb3IgZm9yIGl0cyBpbnRlcm5hbCB1c2UgYXMgd2VsbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgaGFsIGRvZXMgdXNlIGFueSBidWZmZXIKKy8vIGZyb20gdGhlIHJlcXVlc3RlZCBsaXN0IGhlcmUsIGZvciBhIHBhcnRpY3VsYXIgZnJhbWUncyBvdXRwdXQgYnVmZmVyLCB0aGUKKy8vIGJ1ZmZlciB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIHByb2Nlc3NDYXB0dXJlUmVzdWx0IGNhbGwgY29ycmVzcG9uZGluZyB0bworLy8gdGhlIGZyYW1lLiBUaGUgb3RoZXIgYnVmZmVycyB3aWxsIGJlIHJldHVybmVkIHRocm91Z2ggcmV0dXJuU3RyZWFtQnVmZmVycy4KKy8vIFRoZSBidWZmZXJzIHJldHVybmVkIHZpYSByZXR1cm5TdHJlYW1CdWZmZXJzIHdpbGwgbm90IGhhdmUgYSB2YWxpZAorLy8gdGltZXN0YW1wKDApIGFuZCB3aWxsIGJlIGRyb3BwZWQgYnkgdGhlIGJ1ZmZlcnF1ZXVlLgordm9pZCByZXF1ZXN0U3RyZWFtQnVmZmVycyhSZXF1ZXN0QnVmZmVyU3RhdGVzJiBzdGF0ZXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXJSZXQ+KiBvdXRCdWZmZXJzLAorICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdFN0YXR1cyogc3RhdHVzKSB7CisgICAgdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJTdGF0dXM7CisgICAgdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXI7CisgICAgdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0U3RhdHVzOworICAgIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyUmV0OworICAgIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOworICAgIHVzaW5nIFRhZyA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyc1ZhbDo6VGFnOworICAgIGlmIChvdXRCdWZmZXJzID09IG51bGxwdHIgfHwgc3RhdHVzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIG91dEJ1ZmZlcnMgLyBidWZmZXIgc3RhdHVzIG51bGxwdHIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHN0YXRlcy5yZXFCdWZmZXJMb2NrKTsKKyAgICBzdGQ6OnZlY3RvcjxTdHJlYW1CdWZmZXJSZXQ+IGJ1ZlJldHM7CisgICAgb3V0QnVmZmVycy0+Y2xlYXIoKTsKKyAgICBpZiAoIXN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzIGRvZXMgbm90IHN1cHBvcnQgSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0YXRlcy5jYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgICpzdGF0dXMgPSBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTb3J0ZWRWZWN0b3I8aW50MzJfdD4gc3RyZWFtSWRzOworICAgIHNzaXplX3Qgc3ogPSBzdHJlYW1JZHMuc2V0Q2FwYWNpdHkoYnVmUmVxcy5zaXplKCkpOworICAgIGlmIChzeiA8IDAgfHwgc3RhdGljX2Nhc3Q8c2l6ZV90PihzeikgIT0gYnVmUmVxcy5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAlenUgYnVmZmVyIHJlcXVlc3RzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlJlcXMuc2l6ZSgpKTsKKyAgICAgICAgKnN0YXR1cyA9IEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChidWZSZXFzLnNpemUoKSA+IHN0YXRlcy5vdXRwdXRTdHJlYW1zLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiJXM6IHRvbyBtYW55IGJ1ZmZlciByZXF1ZXN0cyAoJXp1ID4gIyBvZiBvdXRwdXQgc3RyZWFtcyAlenUpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlJlcXMuc2l6ZSgpLCBzdGF0ZXMub3V0cHV0U3RyZWFtcy5zaXplKCkpOworICAgICAgICAqc3RhdHVzID0gQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIHJlcGVhdGVkIHN0cmVhbUlkCisgICAgZm9yIChjb25zdCBhdXRvJiBidWZSZXEgOiBidWZSZXFzKSB7CisgICAgICAgIGlmIChzdHJlYW1JZHMuaW5kZXhPZihidWZSZXEuc3RyZWFtSWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gYnVmZmVyIHJlcXVlc3RzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZSZXEuc3RyZWFtSWQpOworICAgICAgICAgICAgKnN0YXR1cyA9IEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUzsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW1JZHMuYWRkKGJ1ZlJlcS5zdHJlYW1JZCk7CisgICAgfQorCisgICAgaWYgKCFzdGF0ZXMucmVxQnVmZmVySW50Zi5zdGFydFJlcXVlc3RCdWZmZXIoKSkgeworICAgICAgICBBTE9HRSgiJXM6IHJlcXVlc3QgYnVmZmVyIGRpc2FsbG93ZWQgd2hpbGUgY2FtZXJhIHNlcnZpY2UgaXMgY29uZmlndXJpbmciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICpzdGF0dXMgPSBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfQ09ORklHVVJJTkc7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBidWZSZXRzLnJlc2l6ZShidWZSZXFzLnNpemUoKSk7CisKKyAgICBib29sIGFsbFJlcXNTdWNjZWVkcyA9IHRydWU7CisgICAgYm9vbCBvbmVSZXFTdWNjZWVkcyA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmUmVxcy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBhdXRvJiBidWZSZXEgPSBidWZSZXFzW2ldOworICAgICAgICBhdXRvJiBidWZSZXQgPSBidWZSZXRzW2ldOworICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gYnVmUmVxLnN0cmVhbUlkOworICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBzdGF0ZXMub3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgICAgICBpZiAob3V0cHV0U3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogT3V0cHV0IHN0cmVhbSBpZCAlZCBub3QgZm91bmQhIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJlYW1CdWZmZXJSZXQ+IGVtcHR5QnVmUmV0czsKKyAgICAgICAgICAgICpzdGF0dXMgPSBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfQ09ORklHVVJJTkc7CisgICAgICAgICAgICBzdGF0ZXMucmVxQnVmZmVySW50Zi5lbmRSZXF1ZXN0QnVmZmVyKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBidWZSZXQuc3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNBYmFuZG9uZWQoKSkgeworICAgICAgICAgICAgYnVmUmV0LnZhbC5zZXQ8VGFnOjplcnJvcj4oU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpTVFJFQU1fRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIGFsbFJlcXNTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgaGFuZE91dEJ1ZmZlckNvdW50ID0gb3V0cHV0U3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpOworICAgICAgICB1aW50MzJfdCBudW1CdWZmZXJzUmVxdWVzdGVkID0gYnVmUmVxLm51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7CisgICAgICAgIHNpemVfdCB0b3RhbEhhbmRvdXQgPSBoYW5kT3V0QnVmZmVyQ291bnQgKyBudW1CdWZmZXJzUmVxdWVzdGVkOworICAgICAgICB1aW50MzJfdCBtYXhCdWZmZXJzID0gb3V0cHV0U3RyZWFtLT5hc0hhbFN0cmVhbSgpLT5tYXhfYnVmZmVyczsKKyAgICAgICAgaWYgKHRvdGFsSGFuZG91dCA+IG1heEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIC8vIE5vdCBhYmxlIHRvIGFsbG9jYXRlIGVub3VnaCBidWZmZXIuIEV4aXQgZWFybHkgZm9yIHRoaXMgc3RyZWFtCisgICAgICAgICAgICBBTE9HRSgiJXM6IHJlcXVlc3QgdG9vIG11Y2ggYnVmZmVycyBmb3Igc3RyZWFtICVkOiBhdCBIQUw6ICV6dSArIHJlcXVlc3Rpbmc6ICVkIgorICAgICAgICAgICAgICAgICAgICAiID4gbWF4OiAlZCIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIGhhbmRPdXRCdWZmZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgbnVtQnVmZmVyc1JlcXVlc3RlZCwgbWF4QnVmZmVycyk7CisgICAgICAgICAgICBidWZSZXQudmFsLnNldDxUYWc6OmVycm9yPihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6Ok1BWF9CVUZGRVJfRVhDRUVERUQpOworICAgICAgICAgICAgYWxsUmVxc1N1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmVhbUJ1ZmZlcj4gdG1wUmV0QnVmZmVycyhudW1CdWZmZXJzUmVxdWVzdGVkKTsKKyAgICAgICAgYm9vbCBjdXJyZW50UmVxU3VjY2VlZHMgPSB0cnVlOworICAgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmFfc3RyZWFtX2J1ZmZlcl90PiBzdHJlYW1CdWZmZXJzKG51bUJ1ZmZlcnNSZXF1ZXN0ZWQpOworICAgICAgICBzdGQ6OnZlY3RvcjxidWZmZXJfaGFuZGxlX3Q+IG5ld0J1ZmZlcnM7CisgICAgICAgIHNpemVfdCBudW1BbGxvY2F0ZWRCdWZmZXJzID0gMDsKKyAgICAgICAgc2l6ZV90IG51bVB1c2hlZEluZmxpZ2h0QnVmZmVycyA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgbnVtQnVmZmVyc1JlcXVlc3RlZDsgYisrKSB7CisgICAgICAgICAgICBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90JiBzYiA9IHN0cmVhbUJ1ZmZlcnNbYl07CisgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIG1ldGhvZCBjYW4gcnVuIGNvbmN1cnJlbnRseSB3aXRoIHJlcXVlc3QgdGhyZWFkCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgd2FpdCBkdXJhdGlvbiBldmVyeXRpbWUgd2UgY2FsbCBnZXRidWZmZXIKKyAgICAgICAgICAgIG5zZWNzX3Qgd2FpdER1cmF0aW9uID0gIHN0YXRlcy5yZXFCdWZmZXJJbnRmLmdldFdhaXREdXJhdGlvbigpOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gb3V0cHV0U3RyZWFtLT5nZXRCdWZmZXIoJnNiLCB3YWl0RHVyYXRpb24pOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gTk9fSU5JVCB8fCByZXMgPT0gREVBRF9PQkpFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5zZXQ8VGFnOjplcnJvcj4oU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpTVFJFQU1fRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVzLnNlc3Npb25TdGF0c0J1aWxkZXIuc3RvcENvdW50ZXIoc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUIHx8IHJlcyA9PSBOT19NRU1PUlkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuc2V0PFRhZzo6ZXJyb3I+KFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6Tk9fQlVGRkVSX0FWQUlMQUJMRSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZSZXQudmFsLnNldDxUYWc6OmVycm9yPihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6Ok1BWF9CVUZGRVJfRVhDRUVERUQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5zZXQ8VGFnOjplcnJvcj4oU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJyZW50UmVxU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bUFsbG9jYXRlZEJ1ZmZlcnMrKzsKKworICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIgPSBzYi5idWZmZXI7CisgICAgICAgICAgICBhdXRvIHBhaXIgPSBzdGF0ZXMuYnVmZmVyUmVjb3Jkc0ludGYuZ2V0QnVmZmVySWQoKmJ1ZmZlciwgc3RyZWFtSWQpOworICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICB1aW50NjRfdCBidWZmZXJJZCA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgU3RyZWFtQnVmZmVyJiBoQnVmID0gdG1wUmV0QnVmZmVyc1tiXTsKKworICAgICAgICAgICAgaEJ1Zi5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgaEJ1Zi5idWZmZXJJZCA9IGJ1ZmZlcklkOworCisgICAgICAgICAgICBoQnVmLmJ1ZmZlciA9IChpc05ld0J1ZmZlcikgPyBjYW1lcmEzOjpkdXBUb0FpZGxJZk5vdE51bGwoKmJ1ZmZlcikgOgorICAgICAgICAgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgICAgIGhCdWYuc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKKyAgICAgICAgICAgIGhCdWYucmVsZWFzZUZlbmNlID0gIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSgpOworICAgICAgICAgICAgaWYgKGlzTmV3QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgbmV3QnVmZmVycy5wdXNoX2JhY2soKmJ1ZmZlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChzYi5hY3F1aXJlX2ZlbmNlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKKyAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UtPmRhdGFbMF0gPSBzYi5hY3F1aXJlX2ZlbmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9tYWtlVG9BaWRsIHBhc3NlcyBvd25lcnNoaXAgdG8gYWlkbCBOYXRpdmVIYW5kbGUgbWFkZS4gT3duZXJzaGlwCisgICAgICAgICAgICAvL2lzIHBhc3NlZCA6IHNlZSBzeXN0ZW0vd2luZG93LmggOiBkZXF1ZXVlQnVmZmVyCisgICAgICAgICAgICBoQnVmLmFjcXVpcmVGZW5jZSA9IG1ha2VUb0FpZGxJZk5vdE51bGwoYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgIGlmIChhY3F1aXJlRmVuY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoQnVmLnJlbGVhc2VGZW5jZSA9ICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUoKTsKKworICAgICAgICAgICAgcmVzID0gc3RhdGVzLmJ1ZmZlclJlY29yZHNJbnRmLnB1c2hJbmZsaWdodFJlcXVlc3RCdWZmZXIoYnVmZmVySWQsIGJ1ZmZlciwgc3RyZWFtSWQpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgZ2V0IHJlZ2lzdGVyIHJlcXVlc3QgYnVmZmVycyBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuc2V0PFRhZzo6ZXJyb3I+KFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6VU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICAgICAgY3VycmVudFJlcVN1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1QdXNoZWRJbmZsaWdodEJ1ZmZlcnMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VycmVudFJlcVN1Y2NlZWRzKSB7CisgICAgICAgICAgICBidWZSZXQudmFsLnNldDxUYWc6OmJ1ZmZlcnM+KHN0ZDo6bW92ZSh0bXBSZXRCdWZmZXJzKSk7CisgICAgICAgICAgICBvbmVSZXFTdWNjZWVkcyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhbGxSZXFzU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzOyBiKyspIHsKKyAgICAgICAgICAgICAgICBTdHJlYW1CdWZmZXImIGhCdWYgPSB0bXBSZXRCdWZmZXJzW2JdOworICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyOworICAgICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IHN0YXRlcy5idWZmZXJSZWNvcmRzSW50Zi5wb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBoQnVmLmJ1ZmZlcklkLCAmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIiVzOiBwb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIgZmFpbGVkIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgbnVtQWxsb2NhdGVkQnVmZmVyczsgYisrKSB7CisgICAgICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCYgc2IgPSBzdHJlYW1CdWZmZXJzW2JdOworICAgICAgICAgICAgICAgIHNiLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICBzYi5zdGF0dXMgPSBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbUJ1ZmZlcnMuZGF0YSgpLCBudW1BbGxvY2F0ZWRCdWZmZXJzLCAwLAorICAgICAgICAgICAgICAgICAgICAwLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgMCwgc3RhdGVzLnNlc3Npb25TdGF0c0J1aWxkZXIpOworICAgICAgICAgICAgZm9yIChhdXRvIGJ1ZiA6IG5ld0J1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZXMuYnVmZmVyUmVjb3Jkc0ludGYucmVtb3ZlT25lQnVmZmVyQ2FjaGUoc3RyZWFtSWQsIGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqc3RhdHVzID0gYWxsUmVxc1N1Y2NlZWRzID8gQnVmZmVyUmVxdWVzdFN0YXR1czo6T0sgOgorICAgICAgICAgICAgb25lUmVxU3VjY2VlZHMgPyBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfUEFSVElBTCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9VTktOT1dOLAorICAgIC8vIFRyYW5zZmVyIG93bmVyc2hpcCBvZiBidWZmZXIgZmRzIHRvIG91dEJ1ZmZlcnMKKyAgICAqb3V0QnVmZmVycyA9IHN0ZDo6bW92ZShidWZSZXRzKTsKKworICAgIHN0YXRlcy5yZXFCdWZmZXJJbnRmLmVuZFJlcXVlc3RCdWZmZXIoKTsKK30KKwordm9pZCByZXR1cm5TdHJlYW1CdWZmZXJzKFJldHVybkJ1ZmZlclN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKKyAgICByZXR1cm5TdHJlYW1CdWZmZXJzVChzdGF0ZXMsIGJ1ZmZlcnMpOworfQorCit9IC8vIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvYWlkbC9BaWRsQ2FtZXJhM091dHB1dFV0aWxzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPdXRwdXRVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OTU2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNPdXRwdXRVdGlscy5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQUlETF9DQU1FUkEzX09VVFBVVF9VVElMU19ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19BSURMX0NBTUVSQTNfT1VUUFVUX1VUSUxTX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisKKyNpbmNsdWRlIDxhaWRsY29tbW9uc3VwcG9ydC9OYXRpdmVIYW5kbGUuaD4KKyNpbmNsdWRlIDxmbXEvQWlkbE1lc3NhZ2VRdWV1ZS5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0NhbWVyYURldmljZUJhc2UuaD4KKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlL0lDYW1lcmFEZXZpY2UuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlICJkZXZpY2UzL0J1ZmZlclV0aWxzLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9JbkZsaWdodFJlcXVlc3QuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTdHJlYW0uaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5oIgorI2luY2x1ZGUgInV0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuaCIKKyNpbmNsdWRlICJ1dGlscy9UYWdNb25pdG9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6OlN5bmNocm9uaXplZFJlYWRXcml0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6QWlkbE1lc3NhZ2VRdWV1ZTsKKwordXNpbmcgQWlkbFJlc3VsdE1ldGFkYXRhUXVldWUgPSBBaWRsTWVzc2FnZVF1ZXVlPGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPjsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKyAgICBpbmxpbmUgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlIGR1cFRvQWlkbElmTm90TnVsbCgKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgpIHsKKyAgICAgICAgaWYgKG5oID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZHVwVG9BaWRsKG5oKTsKKyAgICB9CisKKyAgICBpbmxpbmUgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlIG1ha2VUb0FpZGxJZk5vdE51bGwoCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oKSB7CisgICAgICAgIGlmIChuaCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ha2VUb0FpZGwobmgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2RzIHNoYXJlZCBiZXR3ZWVuIEFpZGxDYW1lcmEzRGV2aWNlL0FpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24gZm9yIEhBTCBjYWxsYmFja3MKKyAgICAgKi8KKworICAgIC8vIENhbWVyYTNEZXZpY2UvQ2FtZXJhM09mZmxpbmVTZXNzaW9uIGludGVybmFsIHN0YXRlcyB1c2VkIGluIG5vdGlmeS9wcm9jZXNzQ2FwdHVyZVJlc3VsdAorICAgIC8vIGNhbGxiYWNrcworICAgIHN0cnVjdCBBaWRsQ2FwdHVyZU91dHB1dFN0YXRlcyA6IHB1YmxpYyBDYXB0dXJlT3V0cHV0U3RhdGVzIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFpZGxSZXN1bHRNZXRhZGF0YVF1ZXVlPiYgZm1xOworICAgIH07CisKKyAgICAvLyBIYW5kbGUgb25lIGNhcHR1cmUgcmVzdWx0LiBBc3N1bWUgY2FsbGVycyBob2xkIHRoZSBsb2NrIHRvIHNlcmlhbGl6ZSBhbGwKKyAgICAvLyBwcm9jZXNzQ2FwdHVyZVJlc3VsdCBjYWxscworICAgIHZvaWQgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoCisgICAgICAgICAgICBBaWRsQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLAorICAgICAgICAgICAgY29uc3QgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpDYXB0dXJlUmVzdWx0JiByZXN1bHQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+CisgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKKworICAgIHZvaWQgbm90aWZ5KENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywKKyAgICAgICAgY29uc3QgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpOb3RpZnlNc2cmIG1zZywKKyAgICAgICAgYm9vbCBoYXNSZWFkb3V0VGltZSwgdWludDY0X3QgcmVhZG91dFRpbWUpOworCisgICAgdm9pZCBub3RpZnkoQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6Ok5vdGlmeU1zZyYgbXNnKTsKKworICAgIHZvaWQgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoUmVxdWVzdEJ1ZmZlclN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICBzdGQ6OnZlY3Rvcjw6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyUmV0Piogb3V0X2J1ZmZlcnMsCisgICAgICAgIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0U3RhdHVzKiBfYWlkbF9yZXR1cm4pOworCisgICAgdm9pZCByZXR1cm5TdHJlYW1CdWZmZXJzKFJldHVybkJ1ZmZlclN0YXRlcyYgc3RhdGVzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpOworCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNEZXZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzRGV2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmI0MjZjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzRGV2aWNlLmNwcApAQCAtMCwwICsxLDE4NTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkhpZGxDYW1lcmEzLURldmljZSIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorLy8jZGVmaW5lIExPR19OTkRFQlVHIDAgIC8vIFBlci1mcmFtZSB2ZXJib3NlIGxvZ2dpbmcKKworI2lmZGVmIExPR19OTkRFQlVHCisjZGVmaW5lIEFMT0dWViguLi4pIEFMT0dWKF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworLy8gQ29udmVuaWVuY2UgbWFjcm8gZm9yIHRyYW5zaWVudCBlcnJvcnMKKyNkZWZpbmUgQ0xPR0UoZm10LCAuLi4pIEFMT0dFKCJDYW1lcmEgJXM6ICVzOiAiIGZtdCwgbUlkLnN0cmluZygpLCBfX0ZVTkNUSU9OX18sIFwKKyAgICAgICAgICAgICMjX19WQV9BUkdTX18pCisKKy8vIENvbnZlbmllbmNlIG1hY3JvcyBmb3IgdHJhbnNpdGlvbmluZyB0byB0aGUgZXJyb3Igc3RhdGUKKyNkZWZpbmUgU0VUX0VSUihmbXQsIC4uLikgc2V0RXJyb3JTdGF0ZSggICBcCisgICAgIiVzOiAiIGZtdCwgX19GVU5DVElPTl9fLCAgICAgICAgICAgICAgXAorICAgICMjX19WQV9BUkdTX18pCisjZGVmaW5lIFNFVF9FUlJfTChmbXQsIC4uLikgc2V0RXJyb3JTdGF0ZUxvY2tlZCggXAorICAgICIlczogIiBmbXQsIF9fRlVOQ1RJT05fXywgICAgICAgICAgICAgICAgICAgIFwKKyAgICAjI19fVkFfQVJHU19fKQorCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjcvSUNhbWVyYUluamVjdGlvblNlc3Npb24uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaD4KKworI2luY2x1ZGUgImRldmljZTMvaGlkbC9IaWRsQ2FtZXJhM091dHB1dFV0aWxzLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uaCIKKyNpbmNsdWRlICJ1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSGlkbC5oIgorI2luY2x1ZGUgInV0aWxzL1RyYWNlSEZSLmgiCisKKyNpbmNsdWRlICIuLi8uLi9jb21tb24vaGlkbC9IaWRsUHJvdmlkZXJJbmZvLmgiCisjaW5jbHVkZSAiSGlkbENhbWVyYTNEZXZpY2UuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx0dXBsZT4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjptZXRhZGF0YTo6VjNfNjo6Q2FtZXJhTWV0YWRhdGFFbnVtQW5kcm9pZFNlbnNvclBpeGVsTW9kZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgSGlkbENhbWVyYTNEZXZpY2U6Om1hcFRvUGl4ZWxGb3JtYXQoCisgICAgICAgIGludCBmcmFtZXdvcmtGb3JtYXQpIHsKKyAgICByZXR1cm4gKGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCkgZnJhbWV3b3JrRm9ybWF0OworfQorCitEYXRhc3BhY2VGbGFncyBIaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9IaWRsRGF0YXNwYWNlKAorICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpIHsKKyAgICByZXR1cm4gZGF0YVNwYWNlOworfQorCitCdWZmZXJVc2FnZUZsYWdzIEhpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0NvbnN1bWVyVXNhZ2UoCisgICAgICAgIHVpbnQ2NF90IHVzYWdlKSB7CisgICAgcmV0dXJuIHVzYWdlOworfQorCitTdHJlYW1Sb3RhdGlvbiBIaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9TdHJlYW1Sb3RhdGlvbihjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pIHsKKyAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7CisgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl8wOgorICAgICAgICAgICAgcmV0dXJuIFN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8wOworICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fOTA6CisgICAgICAgICAgICByZXR1cm4gU3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzkwOworICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fMTgwOgorICAgICAgICAgICAgcmV0dXJuIFN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8xODA7CisgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl8yNzA6CisgICAgICAgICAgICByZXR1cm4gU3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzI3MDsKKyAgICB9CisgICAgQUxPR0UoIiVzOiBVbmtub3duIHN0cmVhbSByb3RhdGlvbiAlZCIsIF9fRlVOQ1RJT05fXywgcm90YXRpb24pOworICAgIHJldHVybiBTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMDsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6Om1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgICAgIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Qgb3BlcmF0aW9uTW9kZSwgU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgKm1vZGUpIHsKKyAgICBpZiAobW9kZSA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmIChvcGVyYXRpb25Nb2RlIDwgQ0FNRVJBX1ZFTkRPUl9TVFJFQU1fQ09ORklHVVJBVElPTl9NT0RFX1NUQVJUKSB7CisgICAgICAgIHN3aXRjaChvcGVyYXRpb25Nb2RlKSB7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERToKKyAgICAgICAgICAgICAgICAqbW9kZSA9IFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpOT1JNQUxfTU9ERTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9DT05GSUdVUkFUSU9OX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERToKKyAgICAgICAgICAgICAgICAqbW9kZSA9IFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBzdHJlYW0gY29uZmlndXJhdGlvbiBtb2RlICVkIiwgX19GVU5DVElPTl9fLCBvcGVyYXRpb25Nb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm1vZGUgPSBzdGF0aWNfY2FzdDxTdHJlYW1Db25maWd1cmF0aW9uTW9kZT4ob3BlcmF0aW9uTW9kZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworaW50IEhpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0ZyYW1ld29ya0Zvcm1hdCgKKyAgICAgICAgaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihwaXhlbEZvcm1hdCk7Cit9CisKK2FuZHJvaWRfZGF0YXNwYWNlIEhpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0ZyYW1ld29ya0RhdGFzcGFjZSgKKyAgICAgICAgRGF0YXNwYWNlRmxhZ3MgZGF0YVNwYWNlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihkYXRhU3BhY2UpOworfQorCit1aW50NjRfdCBIaWRsQ2FtZXJhM0RldmljZTo6bWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICBCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKSB7CisgICAgcmV0dXJuIHVzYWdlOworfQorCit1aW50NjRfdCBIaWRsQ2FtZXJhM0RldmljZTo6bWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICBCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKSB7CisgICAgcmV0dXJuIHVzYWdlOworfQorCitzdGF0dXNfdCBIaWRsQ2FtZXJhM0RldmljZTo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIEFMT0dWKCIlczogSW5pdGlhbGl6aW5nIEhJREwgZGV2aWNlIGZvciBjYW1lcmEgJXMiLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CisgICAgaWYgKG1TdGF0dXMgIT0gU1RBVFVTX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgQ0xPR0UoIkFscmVhZHkgaW5pdGlhbGl6ZWQhIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG1hbmFnZXIgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgc3A8SUNhbWVyYURldmljZVNlc3Npb24+IHNlc3Npb247CisgICAgQVRSQUNFX0JFR0lOKCJDYW1lcmFIYWw6Om9wZW5TZXNzaW9uIik7CisgICAgc3RhdHVzX3QgcmVzID0gbWFuYWdlci0+b3BlbkhpZGxTZXNzaW9uKG1JZC5zdHJpbmcoKSwgdGhpcywKKyAgICAgICAgICAgIC8qb3V0Ki8gJnNlc3Npb24pOworICAgIEFUUkFDRV9FTkQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlJfTCgiQ291bGQgbm90IG9wZW4gY2FtZXJhIHNlc3Npb246ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXMgPSBtYW5hZ2VyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MobUlkLnN0cmluZygpLCBtT3ZlcnJpZGVGb3JQZXJmQ2xhc3MsICZtRGV2aWNlSW5mbyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTRVRfRVJSX0woIkNvdWxkIG5vdCByZXRyaWV2ZSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHNlc3Npb24tPmNsb3NlKCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIG1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvID0gbWFuYWdlci0+c3VwcG9ydE5hdGl2ZVpvb21SYXRpbyhtSWQuc3RyaW5nKCkpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOworICAgIGJvb2wgaXNMb2dpY2FsID0gbWFuYWdlci0+aXNMb2dpY2FsQ2FtZXJhKG1JZC5zdHJpbmcoKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICBpZiAoaXNMb2dpY2FsKSB7CisgICAgICAgIGZvciAoYXV0byYgcGh5c2ljYWxJZCA6IHBoeXNpY2FsQ2FtZXJhSWRzKSB7CisgICAgICAgICAgICAvLyBEbyBub3Qgb3ZlcnJpZGUgY2hhcmFjdGVyaXN0aWNzIGZvciBwaHlzaWNhbCBjYW1lcmFzCisgICAgICAgICAgICByZXMgPSBtYW5hZ2VyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsSWQsIC8qb3ZlcnJpZGVGb3JQZXJmQ2xhc3MqL2ZhbHNlLCAmbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJDb3VsZCBub3QgcmV0cmlldmUgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbElkLmNfc3RyKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIHNlc3Npb24tPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCB1c2VQcmVjb3JyZWN0QXJyYXkgPQorICAgICAgICAgICAgICAgICAgICBEaXN0b3J0aW9uTWFwcGVyOjppc0Rpc3RvcnRpb25TdXBwb3J0ZWQobVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSk7CisgICAgICAgICAgICBpZiAodXNlUHJlY29ycmVjdEFycmF5KSB7CisgICAgICAgICAgICAgICAgcmVzID0gbURpc3RvcnRpb25NYXBwZXJzW3BoeXNpY2FsSWRdLnNldHVwU3RhdGljSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJVbmFibGUgdG8gcmVhZCBjYW1lcmEgJXMncyBjYWxpYnJhdGlvbiBmaWVsZHMgZm9yIGRpc3RvcnRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JyZWN0aW9uIiwgcGh5c2ljYWxJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1ab29tUmF0aW9NYXBwZXJzW3BoeXNpY2FsSWRdID0gWm9vbVJhdGlvTWFwcGVyKAorICAgICAgICAgICAgICAgICAgICAmbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSwKKyAgICAgICAgICAgICAgICAgICAgbVN1cHBvcnROYXRpdmVab29tUmF0aW8sIHVzZVByZWNvcnJlY3RBcnJheSk7CisKKyAgICAgICAgICAgIGlmIChTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjppc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IoCisgICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pKSB7CisgICAgICAgICAgICAgICAgbVVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcnNbcGh5c2ljYWxJZF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uTWFwcGVyKG1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVByZWNvcnJlY3RBcnJheSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlOworICAgIGF1dG8gcmVxdWVzdFF1ZXVlUmV0ID0gc2Vzc2lvbi0+Z2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlKAorICAgICAgICBbJnF1ZXVlXShjb25zdCBhdXRvJiBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICBxdWV1ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVxdWVzdE1ldGFkYXRhUXVldWU+KGRlc2NyaXB0b3IpOworICAgICAgICAgICAgaWYgKCFxdWV1ZS0+aXNWYWxpZCgpIHx8IHF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJIQUwgcmV0dXJucyBlbXB0eSByZXF1ZXN0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSBpdCIpOworICAgICAgICAgICAgICAgIHF1ZXVlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAvLyBkb24ndCB1c2UgdGhlIHF1ZXVlIG9ud2FyZHMuCisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIGlmICghcmVxdWVzdFF1ZXVlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlcXVlc3QgbWV0YWRhdGEgZm1xOiAlcywgbm90IHVzZSBpdCIsCisgICAgICAgICAgICAgICAgcmVxdWVzdFF1ZXVlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4mIHJlc1F1ZXVlID0gbVJlc3VsdE1ldGFkYXRhUXVldWU7CisgICAgYXV0byByZXN1bHRRdWV1ZVJldCA9IHNlc3Npb24tPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAorICAgICAgICBbJnJlc1F1ZXVlXShjb25zdCBhdXRvJiBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICByZXNRdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8UmVzdWx0TWV0YWRhdGFRdWV1ZT4oZGVzY3JpcHRvcik7CisgICAgICAgICAgICBpZiAoIXJlc1F1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkhBTCByZXR1cm5zIGVtcHR5IHJlc3VsdCBtZXRhZGF0YSBmbXEsIG5vdCB1c2UgaXQiKTsKKyAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgdXNlIHRoZSByZXNRdWV1ZSBvbndhcmRzLgorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBpZiAoIXJlc3VsdFF1ZXVlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSBmcm9tIGNhbWVyYSBzZXNzaW9uOiAlcyIsCisgICAgICAgICAgICAgICAgcmVzdWx0UXVldWVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBJRl9BTE9HVigpIHsKKyAgICAgICAgc2Vzc2lvbi0+aW50ZXJmYWNlQ2hhaW4oW10oCisgICAgICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZz4gaW50ZXJmYWNlQ2hhaW4pIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiU2Vzc2lvbiBpbnRlcmZhY2UgY2hhaW46Iik7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpZmFjZSA6IGludGVyZmFjZUNoYWluKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgICVzIiwgaWZhY2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGJ1Zk1nck1vZGUgPQorICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT04pOworICAgIGlmIChidWZNZ3JNb2RlLmNvdW50ID4gMCkgeworICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIgPSAoYnVmTWdyTW9kZS5kYXRhLnU4WzBdID09CisgICAgICAgICAgICBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT05fSElETF9ERVZJQ0VfM181KTsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBjYXBhYmlsaXRpZXMgPSBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcGFiaWxpdGllcy5jb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGNhcGFiaWxpdGllcy5kYXRhLnU4W2ldOworICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19PRkZMSU5FX1BST0NFU1NJTkcpIHsKKyAgICAgICAgICAgIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgbUludGVyZmFjZSA9IG5ldyBIaWRsSGFsSW50ZXJmYWNlKHNlc3Npb24sIHF1ZXVlLCBtVXNlSGFsQnVmTWFuYWdlciwgbVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyk7CisKKyAgICBzdGQ6OnN0cmluZyBwcm92aWRlclR5cGU7CisgICAgbVZlbmRvclRhZ0lkID0gbWFuYWdlci0+Z2V0UHJvdmlkZXJUYWdJZExvY2tlZChtSWQuc3RyaW5nKCkpOworICAgIG1UYWdNb25pdG9yLmluaXRpYWxpemUobVZlbmRvclRhZ0lkKTsKKyAgICBpZiAoIW1vbml0b3JUYWdzLmlzRW1wdHkoKSkgeworICAgICAgICBtVGFnTW9uaXRvci5wYXJzZVRhZ3NUb01vbml0b3IoU3RyaW5nOChtb25pdG9yVGFncykpOworICAgIH0KKworICAgIC8vIE1ldGFkYXRhIHRhZ3MgbmVlZHMgZml4dXAgZm9yIG1vbm9jaHJvbWUgY2FtZXJhIGRldmljZSB2ZXJzaW9uIGxlc3MKKyAgICAvLyB0aGFuIDMuNS4KKyAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb257MCwwfTsKKyAgICBJUENUcmFuc3BvcnQgdHJhbnNwb3J0ID0gSVBDVHJhbnNwb3J0OjpISURMOworICAgIHJlcyA9IG1hbmFnZXItPmdldEhpZ2hlc3RTdXBwb3J0ZWRWZXJzaW9uKG1JZC5zdHJpbmcoKSwgJm1heFZlcnNpb24sICZ0cmFuc3BvcnQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBpbiBnZXR0aW5nIGNhbWVyYSBkZXZpY2UgdmVyc2lvbiBpZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaW50IGRldmljZVZlcnNpb24gPSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oCisgICAgICAgICAgICBtYXhWZXJzaW9uLmdldF9tYWpvcigpLCBtYXhWZXJzaW9uLmdldF9taW5vcigpKTsKKworICAgIGJvb2wgaXNNb25vY2hyb21lID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBhYmlsaXRpZXMuY291bnQ7IGkrKykgeworICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBjYXBhYmlsaXRpZXMuZGF0YS51OFtpXTsKKyAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSkgeworICAgICAgICAgICAgaXNNb25vY2hyb21lID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MgPSAoaXNNb25vY2hyb21lICYmIGRldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNSk7CisKKyAgICByZXR1cm4gaW5pdGlhbGl6ZUNvbW1vbkxvY2tlZCgpOworfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmEzRGV2aWNlOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSB7CisgICAgUmVxdWVzdEJ1ZmZlclN0YXRlcyBzdGF0ZXMgeworICAgICAgICBtSWQsIG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jaywgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwKKyAgICAgICAgKnRoaXMsICptSW50ZXJmYWNlLCAqdGhpc307CisgICAgY2FtZXJhMzo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoc3RhdGVzLCBidWZSZXFzLCBfaGlkbF9jYik7CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gSGlkbENhbWVyYTNEZXZpY2U6OnJldHVyblN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKKyAgICBSZXR1cm5CdWZmZXJTdGF0ZXMgc3RhdGVzIHsKKyAgICAgICAgbUlkLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCAqbUludGVyZmFjZX07CisgICAgY2FtZXJhMzo6cmV0dXJuU3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZmZlcnMpOworICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmEzRGV2aWNlOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7CisgICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgZ3JhYiBtTG9jaywgYnV0IHRoYXQgY2FuIGxlYWQgdG8gZGVhZGxvY2ssIGFuZAorICAgIC8vIGl0J3Mgbm90IHN1cGVyIGltcG9ydGFudCB0byBnZXQgdXAgdG8gZGF0ZSB2YWx1ZSBvZiBtU3RhdHVzIGZvciB0aGlzCisgICAgLy8gd2FybmluZyBwcmludCwgaGVuY2Ugc2tpcHBpbmcgdGhlIGxvY2sgaGVyZQorICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19FUlJPUikgeworICAgICAgICAvLyBQZXIgQVBJIGNvbnRyYWN0LCBIQUwgc2hvdWxkIGFjdCBhcyBjbG9zZWQgYWZ0ZXIgZGV2aWNlIGVycm9yCisgICAgICAgIC8vIEJ1dCBtU3RhdHVzIGNhbiBiZSBzZXQgdG8gZXJyb3IgYnkgZnJhbWV3b3JrIGFzIHdlbGwsIHNvIGp1c3QgbG9nCisgICAgICAgIC8vIGEgd2FybmluZyBoZXJlLgorICAgICAgICBBTE9HVygiJXM6IHJlY2VpdmVkIGNhcHR1cmUgcmVzdWx0IGluIGVycm9yIHN0YXRlLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCisgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobU91dHB1dExvY2spOworICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgfQorCisgICAgaWYgKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudHJ5TG9jaygpICE9IE9LKSB7CisgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbjsgaXQgaW5kaWNhdGVzIGEgd3JvbmcgY2xpZW50IGltcGxlbWVudGF0aW9uCisgICAgICAgIC8vIHRoYXQgZG9lc24ndCBmb2xsb3cgdGhlIGNvbnRyYWN0LiBCdXQsIHdlIGNhbiBiZSB0b2xlcmFudCBoZXJlLgorICAgICAgICBBTE9HRSgiJXM6IGNhbGxiYWNrIG92ZXJsYXBwZWQhIHdhaXRpbmcgMXMuLi4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGlmIChtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnRpbWVkTG9jaygxMDAwMDAwMDAwIC8qIDFzICovKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgYWNxdWlyZSBsb2NrIGluIDFzLCBkcm9wcGluZyByZXN1bHRzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIC8vIHJlYWxseSBkb24ndCBrbm93IHdoYXQgdG8gZG8sIHNvIGJhaWwgb3V0LgorICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgSGlkbENhcHR1cmVPdXRwdXRTdGF0ZXMgc3RhdGVzIHsKKyAgICAgICB7CisgICAgICAgIG1JZCwKKyAgICAgICAgbUluRmxpZ2h0TG9jaywgbUxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIsCisgICAgICAgIG1MYXN0Q29tcGxldGVkUmVwcm9jZXNzRnJhbWVOdW1iZXIsIG1MYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXIsCisgICAgICAgIG1JbkZsaWdodE1hcCwgbU91dHB1dExvY2ssICBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCisgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKKyAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAorICAgICAgICBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCisgICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywKKyAgICAgICAgKm1JbnRlcmZhY2UsIG1MZWdhY3lDbGllbnQsIG1NaW5FeHBlY3RlZER1cmF0aW9ufSwgbVJlc3VsdE1ldGFkYXRhUXVldWUKKyAgICB9OworCisgICAgLy9IaWRsQ2FwdHVyZU91dHB1dFN0YXRlcyBoaWRsU3RhdGVzIHsKKyAgICAvL30KKworICAgIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0cykgeworICAgICAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZChzdGF0ZXMsIHJlc3VsdC52M18yLCByZXN1bHQucGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgfQorICAgIG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudW5sb2NrKCk7CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKKy8vIE9ubHkgb25lIHByb2Nlc3NDYXB0dXJlUmVzdWx0IHNob3VsZCBiZSBjYWxsZWQgYXQgYSB0aW1lLCBzbworLy8gdGhlIGxvY2tzIHdvbid0IGJsb2NrLiBUaGUgbG9ja3MgYXJlIHByZXNlbnQgaGVyZSBzaW1wbHkgdG8gZW5mb3JjZSB0aGlzLgoraGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM0RldmljZTo6cHJvY2Vzc0NhcHR1cmVSZXN1bHQoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7CisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4gbm9QaHlzTWV0YWRhdGE7CisKKyAgICAvLyBJZGVhbGx5IHdlIHNob3VsZCBncmFiIG1Mb2NrLCBidXQgdGhhdCBjYW4gbGVhZCB0byBkZWFkbG9jaywgYW5kCisgICAgLy8gaXQncyBub3Qgc3VwZXIgaW1wb3J0YW50IHRvIGdldCB1cCB0byBkYXRlIHZhbHVlIG9mIG1TdGF0dXMgZm9yIHRoaXMKKyAgICAvLyB3YXJuaW5nIHByaW50LCBoZW5jZSBza2lwcGluZyB0aGUgbG9jayBoZXJlCisgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX0VSUk9SKSB7CisgICAgICAgIC8vIFBlciBBUEkgY29udHJhY3QsIEhBTCBzaG91bGQgYWN0IGFzIGNsb3NlZCBhZnRlciBkZXZpY2UgZXJyb3IKKyAgICAgICAgLy8gQnV0IG1TdGF0dXMgY2FuIGJlIHNldCB0byBlcnJvciBieSBmcmFtZXdvcmsgYXMgd2VsbCwgc28ganVzdCBsb2cKKyAgICAgICAgLy8gYSB3YXJuaW5nIGhlcmUuCisgICAgICAgIEFMT0dXKCIlczogcmVjZWl2ZWQgY2FwdHVyZSByZXN1bHQgaW4gZXJyb3Igc3RhdGUuIiwgX19GVU5DVElPTl9fKTsKKyAgICB9CisKKyAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChtT3V0cHV0TG9jayk7CisgICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICB9CisKKyAgICBpZiAobVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay50cnlMb2NrKCkgIT0gT0spIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuOyBpdCBpbmRpY2F0ZXMgYSB3cm9uZyBjbGllbnQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgLy8gdGhhdCBkb2Vzbid0IGZvbGxvdyB0aGUgY29udHJhY3QuIEJ1dCwgd2UgY2FuIGJlIHRvbGVyYW50IGhlcmUuCisgICAgICAgIEFMT0dFKCIlczogY2FsbGJhY2sgb3ZlcmxhcHBlZCEgd2FpdGluZyAxcy4uLiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgaWYgKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudGltZWRMb2NrKDEwMDAwMDAwMDAgLyogMXMgKi8pICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBhY3F1aXJlIGxvY2sgaW4gMXMsIGRyb3BwaW5nIHJlc3VsdHMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgLy8gcmVhbGx5IGRvbid0IGtub3cgd2hhdCB0byBkbywgc28gYmFpbCBvdXQuCisgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEhpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICB7bUlkLAorICAgICAgICBtSW5GbGlnaHRMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKKyAgICAgICAgbUluRmxpZ2h0TWFwLCBtT3V0cHV0TG9jaywgIG1SZXN1bHRRdWV1ZSwgbVJlc3VsdFNpZ25hbCwKKyAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtVXNlUGFydGlhbFJlc3VsdCwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAorICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMsIG1WZW5kb3JUYWdJZCwgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsCisgICAgICAgIG1EaXN0b3J0aW9uTWFwcGVycywgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycywKKyAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAorICAgICAgICAqbUludGVyZmFjZSwgbUxlZ2FjeUNsaWVudCwgbU1pbkV4cGVjdGVkRHVyYXRpb259LCBtUmVzdWx0TWV0YWRhdGFRdWV1ZQorICAgIH07CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJlc3VsdCA6IHJlc3VsdHMpIHsKKyAgICAgICAgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoc3RhdGVzLCByZXN1bHQsIG5vUGh5c01ldGFkYXRhKTsKKyAgICB9CisgICAgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay51bmxvY2soKTsKKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM0RldmljZTo6bm90aWZ5KAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpOb3RpZnlNc2c+JiBtc2dzKSB7CisgICAgcmV0dXJuIG5vdGlmeUhlbHBlcjxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZz4obXNncyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE5vdGlmeU1zZ1R5cGU+CitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmEzRGV2aWNlOjpub3RpZnlIZWxwZXIoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxOb3RpZnlNc2dUeXBlPiYgbXNncykgeworICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIGdyYWIgbUxvY2ssIGJ1dCB0aGF0IGNhbiBsZWFkIHRvIGRlYWRsb2NrLCBhbmQKKyAgICAvLyBpdCdzIG5vdCBzdXBlciBpbXBvcnRhbnQgdG8gZ2V0IHVwIHRvIGRhdGUgdmFsdWUgb2YgbVN0YXR1cyBmb3IgdGhpcworICAgIC8vIHdhcm5pbmcgcHJpbnQsIGhlbmNlIHNraXBwaW5nIHRoZSBsb2NrIGhlcmUKKyAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfRVJST1IpIHsKKyAgICAgICAgLy8gUGVyIEFQSSBjb250cmFjdCwgSEFMIHNob3VsZCBhY3QgYXMgY2xvc2VkIGFmdGVyIGRldmljZSBlcnJvcgorICAgICAgICAvLyBCdXQgbVN0YXR1cyBjYW4gYmUgc2V0IHRvIGVycm9yIGJ5IGZyYW1ld29yayBhcyB3ZWxsLCBzbyBqdXN0IGxvZworICAgICAgICAvLyBhIHdhcm5pbmcgaGVyZS4KKyAgICAgICAgQUxPR1coIiVzOiByZWNlaXZlZCBub3RpZnkgbWVzc2FnZSBpbiBlcnJvciBzdGF0ZS4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1PdXRwdXRMb2NrKTsKKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIH0KKworICAgIEhpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICB7bUlkLAorICAgICAgICBtSW5GbGlnaHRMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKKyAgICAgICAgbUluRmxpZ2h0TWFwLCBtT3V0cHV0TG9jaywgIG1SZXN1bHRRdWV1ZSwgbVJlc3VsdFNpZ25hbCwKKyAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtVXNlUGFydGlhbFJlc3VsdCwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAorICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMsIG1WZW5kb3JUYWdJZCwgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsCisgICAgICAgIG1EaXN0b3J0aW9uTWFwcGVycywgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycywKKyAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAorICAgICAgICAqbUludGVyZmFjZSwgbUxlZ2FjeUNsaWVudCwgbU1pbkV4cGVjdGVkRHVyYXRpb259LCBtUmVzdWx0TWV0YWRhdGFRdWV1ZQorICAgIH07CisgICAgZm9yIChjb25zdCBhdXRvJiBtc2cgOiBtc2dzKSB7CisgICAgICAgIGNhbWVyYTM6Om5vdGlmeShzdGF0ZXMsIG1zZyk7CisgICAgfQorICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCitzdGF0dXNfdCBIaWRsQ2FtZXJhM0RldmljZTo6c3dpdGNoVG9PZmZsaW5lKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKKyAgICAgICAgLypvdXQqLyBzcDxDYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2U+KiBzZXNzaW9uKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogc2Vzc2lvbiBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworCisgICAgYm9vbCBoYXNJbnB1dFN0cmVhbSA9IG1JbnB1dFN0cmVhbSAhPSBudWxscHRyOworICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCA9IGhhc0lucHV0U3RyZWFtID8gbUlucHV0U3RyZWFtLT5nZXRJZCgpIDogLTE7CisgICAgYm9vbCBpbnB1dFN0cmVhbVN1cHBvcnRzT2ZmbGluZSA9IGhhc0lucHV0U3RyZWFtID8KKyAgICAgICAgICAgIG1JbnB1dFN0cmVhbS0+Z2V0T2ZmbGluZVByb2Nlc3NpbmdTdXBwb3J0KCkgOiBmYWxzZTsKKyAgICBhdXRvIG91dHB1dFN0cmVhbUlkcyA9IG1PdXRwdXRTdHJlYW1zLmdldFN0cmVhbUlkcygpOworICAgIGF1dG8gc3RyZWFtSWRzID0gb3V0cHV0U3RyZWFtSWRzOworICAgIGlmIChoYXNJbnB1dFN0cmVhbSkgeworICAgICAgICBzdHJlYW1JZHMucHVzaF9iYWNrKG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgYWxsIHN0cmVhbXMgaW4gc3RyZWFtc1RvS2VlcCBzdXBwb3J0cyBvZmZsaW5lIG1vZGUKKyAgICBmb3IgKGF1dG8gaWQgOiBzdHJlYW1zVG9LZWVwKSB7CisgICAgICAgIGlmIChzdGQ6OmZpbmQoc3RyZWFtSWRzLmJlZ2luKCksIHN0cmVhbUlkcy5lbmQoKSwgaWQpID09IHN0cmVhbUlkcy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIHN0cmVhbSBJRCAlZCIsIF9fRlVOQ1RJT05fXywgaWQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBpbnB1dFN0cmVhbUlkKSB7CisgICAgICAgICAgICBpZiAoIWlucHV0U3RyZWFtU3VwcG9ydHNPZmZsaW5lKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnB1dCBzdHJlYW0gJWQgY2Fubm90IGJlIHN3aXRjaGVkIHRvIG9mZmxpbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChpZCk7CisgICAgICAgICAgICBpZiAoIXN0cmVhbS0+Z2V0T2ZmbGluZVByb2Nlc3NpbmdTdXBwb3J0KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IG91dHB1dCBzdHJlYW0gJWQgY2Fubm90IGJlIHN3aXRjaGVkIHRvIG9mZmxpbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBUT0RPOiBibG9jayBzdXJmYWNlIHNoYXJpbmcgYW5kIHN1cmZhY2UgZ3JvdXAgc3RyZWFtcyB1bnRpbCB3ZSBjYW4gc3VwcG9ydCB0aGVtCisKKyAgICAvLyBTdG9wIHJlcGVhdGluZyByZXF1ZXN0LCB3YWl0IHVudGlsIGFsbCByZW1haW5pbmcgcmVxdWVzdHMgYXJlIHN1Ym1pdHRlZCwgdGhlbiBjYWxsIGludG8KKyAgICAvLyBIQUwgc3dpdGNoVG9PZmZsaW5lCisgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpDYW1lcmFPZmZsaW5lU2Vzc2lvbkluZm8gb2ZmbGluZVNlc3Npb25JbmZvOworICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPiBvZmZsaW5lU2Vzc2lvbjsKKyAgICBjYW1lcmEzOjpCdWZmZXJSZWNvcmRzIGJ1ZmZlclJlY29yZHM7CisgICAgc3RhdHVzX3QgcmV0ID0gc3RhdGljX2Nhc3Q8SGlkbFJlcXVlc3RUaHJlYWQgKj4obVJlcXVlc3RUaHJlYWQuZ2V0KCkpLT5zd2l0Y2hUb09mZmxpbmUoCisgICAgICAgICAgICBzdHJlYW1zVG9LZWVwLCAmb2ZmbGluZVNlc3Npb25JbmZvLCAmb2ZmbGluZVNlc3Npb24sICZidWZmZXJSZWNvcmRzKTsKKworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgU0VUX0VSUigiU3dpdGNoIHRvIG9mZmxpbmUgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJldCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYm9vbCBzdWNjID0gbVJlcXVlc3RCdWZmZXJTTS5vblN3aXRjaFRvT2ZmbGluZVN1Y2Nlc3MoKTsKKyAgICBpZiAoIXN1Y2MpIHsKKyAgICAgICAgU0VUX0VSUigiSEFMIG11c3Qgbm90IGJlIGNhbGxpbmcgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgY2FsbCIpOworICAgICAgICAvLyBUT0RPOiBibG9jayBBTEwgY2FsbGJhY2tzIGZyb20gSEFMIHRpbGwgYXBwIGNvbmZpZ3VyZWQgbmV3IHN0cmVhbXM/CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIFZlcmlmeSBvZmZsaW5lU2Vzc2lvbkluZm8KKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBvZmZsaW5lU3RyZWFtSWRzOworICAgIG9mZmxpbmVTdHJlYW1JZHMucmVzZXJ2ZShvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVN0cmVhbXMuc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gb2ZmbGluZVN0cmVhbSA6IG9mZmxpbmVTZXNzaW9uSW5mby5vZmZsaW5lU3RyZWFtcykgeworICAgICAgICAvLyB2ZXJpZnkgc3RyZWFtIElEcworICAgICAgICBpbnQzMl90IGlkID0gb2ZmbGluZVN0cmVhbS5pZDsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChzdHJlYW1JZHMuYmVnaW4oKSwgc3RyZWFtSWRzLmVuZCgpLCBpZCkgPT0gc3RyZWFtSWRzLmVuZCgpKSB7CisgICAgICAgICAgICBTRVRfRVJSKCJzdHJlYW0gSUQgJWQgbm90IGZvdW5kISIsIGlkKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2hlbiBub3QgdXNpbmcgSEFMIGJ1ZiBtYW5hZ2VyLCBvbmx5IGFsbG93IHN0cmVhbXMgcmVxdWVzdGVkIGJ5IGFwcCB0byBiZSBwcmVzZXJ2ZWQKKyAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChzdHJlYW1zVG9LZWVwLmJlZ2luKCksIHN0cmVhbXNUb0tlZXAuZW5kKCksIGlkKSA9PSBzdHJlYW1zVG9LZWVwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUigic3RyZWFtIElEICVkIG11c3Qgbm90IGJlIHN3aXRjaGVkIHRvIG9mZmxpbmUhIiwgaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb2ZmbGluZVN0cmVhbUlkcy5wdXNoX2JhY2soaWQpOworICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSAoaWQgPT0gaW5wdXRTdHJlYW1JZCkgPworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+PihtSW5wdXRTdHJlYW0pIDoKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPj4obU91dHB1dFN0cmVhbXMuZ2V0KGlkKSk7CisgICAgICAgIC8vIFZlcmlmeSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgYnVmZmVycworICAgICAgICBpZiAoc3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpICE9IG9mZmxpbmVTdHJlYW0ubnVtT3V0c3RhbmRpbmdCdWZmZXJzKSB7CisgICAgICAgICAgICBTRVRfRVJSKCJPZmZsaW5lIHN0cmVhbSAlZCAjIG9mIHJlbWFpbmluZyBidWZmZXIgbWlzbWF0Y2g6ICglenUsJWQpIChzZXJ2aWNlL0hBTCkiLAorICAgICAgICAgICAgICAgICAgICBpZCwgc3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpLCBvZmZsaW5lU3RyZWFtLm51bU91dHN0YW5kaW5nQnVmZmVycyk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZlcmlmeSBhbGwgc3RyZWFtcyB0byBiZSBkZWxldGVkIGRvbid0IGhhdmUgYW55IG91dHN0YW5kaW5nIGJ1ZmZlcnMKKyAgICBpZiAoaGFzSW5wdXRTdHJlYW0gJiYgc3RkOjpmaW5kKG9mZmxpbmVTdHJlYW1JZHMuYmVnaW4oKSwgb2ZmbGluZVN0cmVhbUlkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbUlkKSA9PSBvZmZsaW5lU3RyZWFtSWRzLmVuZCgpKSB7CisgICAgICAgIGlmIChtSW5wdXRTdHJlYW0tPmhhc091dHN0YW5kaW5nQnVmZmVycygpKSB7CisgICAgICAgICAgICBTRVRfRVJSKCJJbnB1dCBzdHJlYW0gJWQgc3RpbGwgaGFzICV6dSBvdXRzdGFuZGluZyBidWZmZXIhIiwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW1JZCwgbUlucHV0U3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiBvdXRTdHJlYW1JZCA6IG91dHB1dFN0cmVhbUlkcykgeworICAgICAgICBpZiAoc3RkOjpmaW5kKG9mZmxpbmVTdHJlYW1JZHMuYmVnaW4oKSwgb2ZmbGluZVN0cmVhbUlkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICBvdXRTdHJlYW1JZCkgPT0gb2ZmbGluZVN0cmVhbUlkcy5lbmQoKSkgeworICAgICAgICAgICAgYXV0byBvdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQob3V0U3RyZWFtSWQpOworICAgICAgICAgICAgaWYgKG91dFN0cmVhbS0+aGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkpIHsKKyAgICAgICAgICAgICAgICBTRVRfRVJSKCJPdXRwdXQgc3RyZWFtICVkIHN0aWxsIGhhcyAlenUgb3V0c3RhbmRpbmcgYnVmZmVyISIsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHJlYW1JZCwgb3V0U3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEluRmxpZ2h0UmVxdWVzdE1hcCBvZmZsaW5lUmVxczsKKyAgICAvLyBWZXJpZnkgaW5mbGlnaHQgcmVxdWVzdHMgYW5kIHRoZWlyIHBlbmRpbmcgYnVmZmVycworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobUluRmxpZ2h0TG9jayk7CisgICAgICAgIGZvciAoYXV0byBvZmZsaW5lUmVxIDogb2ZmbGluZVNlc3Npb25JbmZvLm9mZmxpbmVSZXF1ZXN0cykgeworICAgICAgICAgICAgaW50IGlkeCA9IG1JbkZsaWdodE1hcC5pbmRleE9mS2V5KG9mZmxpbmVSZXEuZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgIFNFVF9FUlIoIk9mZmxpbmUgcmVxdWVzdCBmcmFtZSBudW1iZXIgJWQgbm90IGZvdW5kISIsIG9mZmxpbmVSZXEuZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBhdXRvJiBpbmZsaWdodFJlcSA9IG1JbkZsaWdodE1hcC52YWx1ZUF0KGlkeCk7CisgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBzcGVjaWZpYyBzdHJlYW0gSURzCisgICAgICAgICAgICBzaXplX3QgbnVtQnVmZmVyc0xlZnQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGluZmxpZ2h0UmVxLm51bUJ1ZmZlcnNMZWZ0KTsKKyAgICAgICAgICAgIGlmIChudW1CdWZmZXJzTGVmdCAhPSBvZmZsaW5lUmVxLnBlbmRpbmdTdHJlYW1zLnNpemUoKSkgeworICAgICAgICAgICAgICAgIFNFVF9FUlIoIk9mZmxpbmUgcmVxdWVzdCAjIG9mIHJlbWFpbmluZyBidWZmZXIgbWlzbWF0Y2g6ICglZCwlZCkgKHNlcnZpY2UvSEFMKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZsaWdodFJlcS5udW1CdWZmZXJzTGVmdCwgb2ZmbGluZVJlcS5wZW5kaW5nU3RyZWFtcy5zaXplKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2ZmbGluZVJlcXMuYWRkKG9mZmxpbmVSZXEuZnJhbWVOdW1iZXIsIGluZmxpZ2h0UmVxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENyZWF0ZSBDYW1lcmEzT2ZmbGluZVNlc3Npb24gYW5kIHRyYW5zZmVyIG9iamVjdCBvd25lcnNoaXAKKyAgICAvLyAgIChzdHJlYW1zLCBpbmZsaWdodCByZXF1ZXN0cywgYnVmZmVyIGNhY2hlcykKKyAgICBjYW1lcmEzOjpTdHJlYW1TZXQgb2ZmbGluZVN0cmVhbVNldDsKKyAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiBpbnB1dFN0cmVhbTsKKyAgICBmb3IgKGF1dG8gb2ZmbGluZVN0cmVhbSA6IG9mZmxpbmVTZXNzaW9uSW5mby5vZmZsaW5lU3RyZWFtcykgeworICAgICAgICBpbnQzMl90IGlkID0gb2ZmbGluZVN0cmVhbS5pZDsKKyAgICAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyICYmIGlkID09IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSkgeworICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBtSW5wdXRTdHJlYW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvZmZsaW5lU3RyZWFtU2V0LmFkZChpZCwgbU91dHB1dFN0cmVhbXMuZ2V0KGlkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIHRvIGxvY2sgYmVmb3JlIGNvcHlpbmcgc3RhdGVzCisgICAgLy8gICAgICAgdGhvdWdoIHRlY2huaWNhbGx5IG5vIG90aGVyIHRocmVhZCBzaG91bGQgYmUgdGFsa2luZyB0byBDYW1lcmEzRGV2aWNlIGF0IHRoaXMgcG9pbnQKKyAgICBDYW1lcmEzT2ZmbGluZVN0YXRlcyBvZmZsaW5lU3RhdGVzKAorICAgICAgICAgICAgbVRhZ01vbml0b3IsIG1WZW5kb3JUYWdJZCwgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKKyAgICAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTnVtUGFydGlhbFJlc3VsdHMsIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwgbURpc3RvcnRpb25NYXBwZXJzLAorICAgICAgICAgICAgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycyk7CisKKyAgICAqc2Vzc2lvbiA9IG5ldyBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uKG1JZCwgaW5wdXRTdHJlYW0sIG9mZmxpbmVTdHJlYW1TZXQsCisgICAgICAgICAgICBzdGQ6Om1vdmUoYnVmZmVyUmVjb3JkcyksIG9mZmxpbmVSZXFzLCBvZmZsaW5lU3RhdGVzLCBvZmZsaW5lU2Vzc2lvbik7CisKKyAgICAvLyBEZWxldGUgYWxsIHN0cmVhbXMgdGhhdCBoYXMgYmVlbiB0cmFuc2ZlcnJlZCB0byBvZmZsaW5lIHNlc3Npb24KKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgZm9yIChhdXRvIG9mZmxpbmVTdHJlYW0gOiBvZmZsaW5lU2Vzc2lvbkluZm8ub2ZmbGluZVN0cmVhbXMpIHsKKyAgICAgICAgaW50MzJfdCBpZCA9IG9mZmxpbmVTdHJlYW0uaWQ7CisgICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0ciAmJiBpZCA9PSBtSW5wdXRTdHJlYW0tPmdldElkKCkpIHsKKyAgICAgICAgICAgIG1JbnB1dFN0cmVhbS5jbGVhcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlKGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGRpc2Nvbm5lY3QgYWxsIG90aGVyIHN0cmVhbXMgYW5kIHN3aXRjaCB0byBVTkNPTkZJR1VSRUQgc3RhdGUKKyAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0ID0gbUlucHV0U3RyZWFtLT5kaXNjb25uZWN0KCk7CisgICAgICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgIFNFVF9FUlJfTCgiZGlzY29ubmVjdCBpbnB1dCBzdHJlYW0gZmFpbGVkISIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gc3RyZWFtSWQgOiBtT3V0cHV0U3RyZWFtcy5nZXRTdHJlYW1JZHMoKSkgeworICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgICAgICByZXQgPSBzdHJlYW0tPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgU0VUX0VSUl9MKCJkaXNjb25uZWN0IG91dHB1dCBzdHJlYW0gJWQgZmFpbGVkISIsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgbUlucHV0U3RyZWFtLmNsZWFyKCk7CisgICAgbU91dHB1dFN0cmVhbXMuY2xlYXIoKTsKKyAgICBtTmVlZENvbmZpZyA9IHRydWU7CisgICAgaW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU1RBVFVTX1VOQ09ORklHVVJFRCk7CisgICAgbU9wZXJhdGluZ01vZGUgPSBOT19NT0RFOworICAgIG1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbiA9IGZhbHNlOworICAgIG1SZXF1ZXN0VGhyZWFkLT5jbGVhclByZXZpb3VzUmVxdWVzdCgpOworCisgICAgcmV0dXJuIE9LOworICAgIC8vIFRPIGJlIGRvbmUgYnkgQ2FtZXJhRGV2aWNlQ2xpZW50L0NhbWVyYTNPZmZsaW5lU2Vzc2lvbgorICAgIC8vIHJlZ2lzdGVyIHRoZSBvZmZsaW5lIGNsaWVudCB0byBjYW1lcmEgc2VydmljZQorICAgIC8vIFNldHVwIHJlc3VsdCBwYXNzdGhpbmcgdGhyZWFkcyBldGMKKyAgICAvLyBJbml0aWFsaXplIG9mZmxpbmUgc2Vzc2lvbiBzbyBIQUwgY2FuIHN0YXJ0IHNlbmRpbmcgY2FsbGJhY2sgdG8gaXQgKHJlc3VsdCBGbXEpCisgICAgLy8gVE9ETzogY2hlY2sgaG93IG1hbnkgb25JZGxlIGNhbGxiYWNrIHdpbGwgYmUgc2VudAorICAgIC8vIEphdmEgc2lkZSB0byBtYWtlIHN1cmUgdGhlIENhbWVyYUNhcHR1cmVTZXNzaW9uIGlzIHByb3Blcmx5IGNsb3NlZAorfQorCitzcDxDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkPiBIaWRsQ2FtZXJhM0RldmljZTo6Y3JlYXRlTmV3UmVxdWVzdFRocmVhZCgKKyAgICAgICAgICAgICAgICB3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwKKyAgICAgICAgICAgICAgICBib29sIHN1cHBvcnRDYW1lcmFNdXRlKSB7CisgICAgICAgIHJldHVybiBuZXcgSGlkbFJlcXVlc3RUaHJlYWQocGFyZW50LCBzdGF0dXNUcmFja2VyLCBpbnRlcmZhY2UsIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgICAgICAgICAgdXNlSGFsQnVmTWFuYWdlciwgc3VwcG9ydENhbWVyYU11dGUpOworfTsKKworc3A8Q2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM+CitIaWRsQ2FtZXJhM0RldmljZTo6Y3JlYXRlQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50KSB7CisgICAgcmV0dXJuIG5ldyBIaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMocGFyZW50KTsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OmluamVjdGlvbkNhbWVyYUluaXRpYWxpemUoY29uc3QgU3RyaW5nOCAmaW5qZWN0ZWRDYW1JZCwKKyAgICAgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgeworICAgICAgICByZXR1cm4gKHN0YXRpY19jYXN0PEhpZGxDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyAqPigKKyAgICAgICAgICAgICAgICBtSW5qZWN0aW9uTWV0aG9kcy5nZXQoKSkpLT5pbmplY3Rpb25Jbml0aWFsaXplKGluamVjdGVkQ2FtSWQsIG1hbmFnZXIsIHRoaXMpOworfTsKKworCitIaWRsQ2FtZXJhM0RldmljZTo6SGlkbEhhbEludGVyZmFjZTo6SGlkbEhhbEludGVyZmFjZSgKKyAgICAgICAgICAgIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwgYm9vbCBzdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpIDoKKyAgICAgICAgSGFsSW50ZXJmYWNlKHVzZUhhbEJ1Zk1hbmFnZXIsIHN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyksCisgICAgICAgIG1IaWRsU2Vzc2lvbihzZXNzaW9uKSwKKyAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKHF1ZXVlKSB7CisgICAgLy8gQ2hlY2sgd2l0aCBoYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIgaWYgd2UgY2FuIGRvd25jYXN0IHRoZXNlIGludGVyZmFjZXMKKyAgICAvLyBTb21ld2hhdCBleHBlbnNpdmUsIHNvIGNhY2hlIHRoZSByZXN1bHRzIGF0IHN0YXJ0dXAKKyAgICBhdXRvIGNhc3RSZXN1bHRfM183ID0gZGV2aWNlOjpWM183OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKKyAgICBpZiAoY2FzdFJlc3VsdF8zXzcuaXNPaygpKSB7CisgICAgICAgIG1IaWRsU2Vzc2lvbl8zXzcgPSBjYXN0UmVzdWx0XzNfNzsKKyAgICB9CisgICAgYXV0byBjYXN0UmVzdWx0XzNfNiA9IGRldmljZTo6VjNfNjo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CisgICAgaWYgKGNhc3RSZXN1bHRfM182LmlzT2soKSkgeworICAgICAgICBtSGlkbFNlc3Npb25fM182ID0gY2FzdFJlc3VsdF8zXzY7CisgICAgfQorICAgIGF1dG8gY2FzdFJlc3VsdF8zXzUgPSBkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOworICAgIGlmIChjYXN0UmVzdWx0XzNfNS5pc09rKCkpIHsKKyAgICAgICAgbUhpZGxTZXNzaW9uXzNfNSA9IGNhc3RSZXN1bHRfM181OworICAgIH0KKyAgICBhdXRvIGNhc3RSZXN1bHRfM180ID0gZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKKyAgICBpZiAoY2FzdFJlc3VsdF8zXzQuaXNPaygpKSB7CisgICAgICAgIG1IaWRsU2Vzc2lvbl8zXzQgPSBjYXN0UmVzdWx0XzNfNDsKKyAgICB9CisgICAgYXV0byBjYXN0UmVzdWx0XzNfMyA9IGRldmljZTo6VjNfMzo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CisgICAgaWYgKGNhc3RSZXN1bHRfM18zLmlzT2soKSkgeworICAgICAgICBtSGlkbFNlc3Npb25fM18zID0gY2FzdFJlc3VsdF8zXzM7CisgICAgfQorfQorCitib29sIEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjp2YWxpZCgpIHsKKyAgICByZXR1cm4gKG1IaWRsU2Vzc2lvbiAhPSBudWxscHRyKTsKK30KKwordm9pZCBIaWRsQ2FtZXJhM0RldmljZTo6SGlkbEhhbEludGVyZmFjZTo6Y2xlYXIoKSB7CisgICAgbUhpZGxTZXNzaW9uXzNfNy5jbGVhcigpOworICAgIG1IaWRsU2Vzc2lvbl8zXzYuY2xlYXIoKTsKKyAgICBtSGlkbFNlc3Npb25fM181LmNsZWFyKCk7CisgICAgbUhpZGxTZXNzaW9uXzNfNC5jbGVhcigpOworICAgIG1IaWRsU2Vzc2lvbl8zXzMuY2xlYXIoKTsKKyAgICBtSGlkbFNlc3Npb24uY2xlYXIoKTsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OmNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MoCisgICAgICAgIGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlX3QgdGVtcGxhdGVJZCwKKyAgICAgICAgLypvdXQqLyBjYW1lcmFfbWV0YWRhdGFfdCAqKnJlcXVlc3RUZW1wbGF0ZSkgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIaWRsSGFsOjpjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzIik7CisgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXM7CisKKyAgICBhdXRvIHJlcXVlc3RDYWxsYmFjayA9IFsmc3RhdHVzLCAmcmVxdWVzdFRlbXBsYXRlXQorICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEmIHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YSAqciA9CisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVxdWVzdC5kYXRhKCkpOworICAgICAgICAgICAgICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSByZXF1ZXN0LnNpemUoKTsKKyAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IE9LIHx8IHJldCA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICpyZXF1ZXN0VGVtcGxhdGUgPSBjbG9uZV9jYW1lcmFfbWV0YWRhdGEocik7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcmVxdWVzdFRlbXBsYXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNsb25lIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6SU5URVJOQUxfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6SU5URVJOQUxfRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gZXJyOworICAgIFJlcXVlc3RUZW1wbGF0ZSBpZDsKKyAgICBzd2l0Y2ggKHRlbXBsYXRlSWQpIHsKKyAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfUFJFVklFVzoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpQUkVWSUVXOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX1NUSUxMX0NBUFRVUkU6CisgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6U1RJTExfQ0FQVFVSRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9WSURFT19SRUNPUkQ6CisgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6VklERU9fUkVDT1JEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX1ZJREVPX1NOQVBTSE9UOgorICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6OlZJREVPX1NOQVBTSE9UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUc6CisgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6WkVST19TSFVUVEVSX0xBRzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9NQU5VQUw6CisgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6TUFOVUFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBVbmtub3duIHRlbXBsYXRlIElELCBvciB0aGlzIEhBTCBpcyB0b28gb2xkIHRvIHN1cHBvcnQgaXQKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGVyciA9IG1IaWRsU2Vzc2lvbi0+Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyhpZCwgcmVxdWVzdENhbGxiYWNrKTsKKworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJlcyA9IERFQURfT0JKRUNUOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IEhpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK2Jvb2wgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OmlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQoCisgICAgICAgIENhbWVyYU1ldGFkYXRhJiBvbGRTZXNzaW9uUGFyYW1zLCBDYW1lcmFNZXRhZGF0YSYgbmV3U2Vzc2lvblBhcmFtcykgeworICAgIC8vIFdlIGRvIHJlY29uZmlndXJhdGlvbiBieSBkZWZhdWx0OworICAgIGJvb2wgcmV0ID0gdHJ1ZTsKKyAgICBpZiAoKG1IaWRsU2Vzc2lvbl8zXzUgIT0gbnVsbHB0cikgJiYgbUlzUmVjb25maWd1cmF0aW9uUXVlcnlTdXBwb3J0ZWQpIHsKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+IG9sZFBhcmFtcywgbmV3UGFyYW1zOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogb2xkU2Vzc2lvTWV0YSA9IGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPigKKyAgICAgICAgICAgICAgICBvbGRTZXNzaW9uUGFyYW1zLmdldEFuZExvY2soKSk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBuZXdTZXNzaW9NZXRhID0gY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KAorICAgICAgICAgICAgICAgIG5ld1Nlc3Npb25QYXJhbXMuZ2V0QW5kTG9jaygpKTsKKyAgICAgICAgb2xkUGFyYW1zLnNldFRvRXh0ZXJuYWwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ob2xkU2Vzc2lvTWV0YSksCisgICAgICAgICAgICAgICAgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKG9sZFNlc3Npb01ldGEpKTsKKyAgICAgICAgbmV3UGFyYW1zLnNldFRvRXh0ZXJuYWwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4obmV3U2Vzc2lvTWV0YSksCisgICAgICAgICAgICAgICAgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKG5ld1Nlc3Npb01ldGEpKTsKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXMgY2FsbFN0YXR1czsKKyAgICAgICAgYm9vbCByZXF1aXJlZDsKKyAgICAgICAgYXV0byBoaWRsQ2IgPSBbJmNhbGxTdGF0dXMsICZyZXF1aXJlZF0gKGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsCisgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlZEZsYWcpIHsKKyAgICAgICAgICAgIGNhbGxTdGF0dXMgPSBzOworICAgICAgICAgICAgcmVxdWlyZWQgPSByZXF1aXJlZEZsYWc7CisgICAgICAgIH07CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNS0+aXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZChvbGRQYXJhbXMsIG5ld1BhcmFtcywgaGlkbENiKTsKKyAgICAgICAgb2xkU2Vzc2lvblBhcmFtcy51bmxvY2sob2xkU2Vzc2lvTWV0YSk7CisgICAgICAgIG5ld1Nlc3Npb25QYXJhbXMudW5sb2NrKG5ld1Nlc3Npb01ldGEpOworICAgICAgICBpZiAoZXJyLmlzT2soKSkgeworICAgICAgICAgICAgc3dpdGNoIChjYWxsU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1czo6T0s6CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHJlcXVpcmVkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzOjpNRVRIT0RfTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgbUlzUmVjb25maWd1cmF0aW9uUXVlcnlTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBSZWNvbmZpZ3VyYXRpb24gcXVlcnkgZmFpbGVkOiAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbFN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgYmluZGVyIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OmNvbmZpZ3VyZVN0cmVhbXMoCisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uUGFyYW1zLAorICAgICAgICBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24gKmNvbmZpZywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcykgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmNvbmZpZ3VyZVN0cmVhbXMiKTsKKyAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIGlmIChjb25maWctPmlucHV0X2lzX211bHRpX3Jlc29sdXRpb24gJiYgbUhpZGxTZXNzaW9uXzNfNyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgbXVsdGktcmVzb2x1dGlvbiBpbnB1dCBzdHJlYW0iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIENvbnZlcnQgc3RyZWFtIGNvbmZpZyB0byBISURMCisgICAgc3RkOjpzZXQ8aW50PiBhY3RpdmVTdHJlYW1zOworICAgIGRldmljZTo6VjNfMjo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yOworICAgIGRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180OworICAgIGRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183OworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGRldmljZTo6VjNfMjo6U3RyZWFtICZkc3QzXzIgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV07CisgICAgICAgIGRldmljZTo6VjNfNDo6U3RyZWFtICZkc3QzXzQgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LnN0cmVhbXNbaV07CisgICAgICAgIGRldmljZTo6VjNfNzo6U3RyZWFtICZkc3QzXzcgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbXNbaV07CisgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fdCAqc3JjID0gY29uZmlnLT5zdHJlYW1zW2ldOworCisgICAgICAgIENhbWVyYTNTdHJlYW0qIGNhbTNzdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYyk7CisgICAgICAgIGNhbTNzdHJlYW0tPnNldEJ1ZmZlckZyZWVkTGlzdGVuZXIodGhpcyk7CisgICAgICAgIGludCBzdHJlYW1JZCA9IGNhbTNzdHJlYW0tPmdldElkKCk7CisgICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtVHlwZTsKKyAgICAgICAgc3dpdGNoIChzcmMtPnN0cmVhbV90eXBlKSB7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fT1VUUFVUOgorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpPVVRQVVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fSU5QVVQ6CisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6OklOUFVUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogVW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgY29uZmlnLT5zdHJlYW1zW2ldLT5zdHJlYW1fdHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkc3QzXzIuaWQgPSBzdHJlYW1JZDsKKyAgICAgICAgZHN0M18yLnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOworICAgICAgICBkc3QzXzIud2lkdGggPSBzcmMtPndpZHRoOworICAgICAgICBkc3QzXzIuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisgICAgICAgIGRzdDNfMi51c2FnZSA9IG1hcFRvQ29uc3VtZXJVc2FnZShjYW0zc3RyZWFtLT5nZXRVc2FnZSgpKTsKKyAgICAgICAgZHN0M18yLnJvdGF0aW9uID0gbWFwVG9TdHJlYW1Sb3RhdGlvbigoY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90KSBzcmMtPnJvdGF0aW9uKTsKKyAgICAgICAgLy8gRm9yIEhpZGxTZXNzaW9uIHZlcnNpb24gMy41IG9yIG5ld2VyLCB0aGUgZm9ybWF0IGFuZCBkYXRhU3BhY2Ugc2VudAorICAgICAgICAvLyB0byBIQUwgYXJlIG9yaWdpbmFsLCBub3QgdGhlIG92ZXJyaWRkZW4gb25lcy4KKyAgICAgICAgaWYgKG1IaWRsU2Vzc2lvbl8zXzUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZHN0M18yLmZvcm1hdCA9IG1hcFRvUGl4ZWxGb3JtYXQoY2FtM3N0cmVhbS0+aXNGb3JtYXRPdmVycmlkZGVuKCkgPworICAgICAgICAgICAgICAgICAgICBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbEZvcm1hdCgpIDogc3JjLT5mb3JtYXQpOworICAgICAgICAgICAgZHN0M18yLmRhdGFTcGFjZSA9IG1hcFRvSGlkbERhdGFzcGFjZShjYW0zc3RyZWFtLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKSA/CisgICAgICAgICAgICAgICAgICAgIGNhbTNzdHJlYW0tPmdldE9yaWdpbmFsRGF0YVNwYWNlKCkgOiBzcmMtPmRhdGFfc3BhY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0M18yLmZvcm1hdCA9IG1hcFRvUGl4ZWxGb3JtYXQoc3JjLT5mb3JtYXQpOworICAgICAgICAgICAgZHN0M18yLmRhdGFTcGFjZSA9IG1hcFRvSGlkbERhdGFzcGFjZShzcmMtPmRhdGFfc3BhY2UpOworICAgICAgICB9CisgICAgICAgIGRzdDNfNC52M18yID0gZHN0M18yOworICAgICAgICBkc3QzXzQuYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemVzW2ldOworICAgICAgICBpZiAoc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZHN0M180LnBoeXNpY2FsQ2FtZXJhSWQgPSBzcmMtPnBoeXNpY2FsX2NhbWVyYV9pZDsKKyAgICAgICAgfQorICAgICAgICBkc3QzXzcudjNfNCA9IGRzdDNfNDsKKyAgICAgICAgZHN0M183Lmdyb3VwSWQgPSBjYW0zc3RyZWFtLT5nZXRIYWxTdHJlYW1Hcm91cElkKCk7CisgICAgICAgIGRzdDNfNy5zZW5zb3JQaXhlbE1vZGVzVXNlZC5yZXNpemUoc3JjLT5zZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZC5zaXplKCkpOworICAgICAgICBzaXplX3QgaiA9IDA7CisgICAgICAgIGZvciAoaW50IG1vZGUgOiBzcmMtPnNlbnNvcl9waXhlbF9tb2Rlc191c2VkKSB7CisgICAgICAgICAgICBkc3QzXzcuc2Vuc29yUGl4ZWxNb2Rlc1VzZWRbaisrXSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYU1ldGFkYXRhRW51bUFuZHJvaWRTZW5zb3JQaXhlbE1vZGU+KG1vZGUpOworICAgICAgICB9CisgICAgICAgIGlmIChzcmMtPmR5bmFtaWNfcmFuZ2VfcHJvZmlsZSAhPQorICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJEKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IG5vbi1zdGFuZGFyZCBkeW5hbWljIHJhbmdlIHByb2ZpbGVzOiAlIiBQUkl4NjQsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3JjLT5keW5hbWljX3JhbmdlX3Byb2ZpbGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjLT51c2VfY2FzZSAhPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxUKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IG5vbi1kZWZhdWx0IHN0cmVhbSB1c2UgY2FzZSAlIiBQUklkNjQgIiEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNyYy0+dXNlX2Nhc2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBhY3RpdmVTdHJlYW1zLmluc2VydChzdHJlYW1JZCk7CisgICAgICAgIC8vIENyZWF0ZSBCdWZmZXIgSUQgbWFwIGlmIG5lY2Vzc2FyeQorICAgICAgICBtQnVmZmVyUmVjb3Jkcy50cnlDcmVhdGVCdWZmZXJDYWNoZShzdHJlYW1JZCk7CisgICAgfQorICAgIC8vIHJlbW92ZSBCdWZmZXJJZE1hcCBmb3IgZGVsZXRlZCBzdHJlYW1zCisgICAgbUJ1ZmZlclJlY29yZHMucmVtb3ZlSW5hY3RpdmVCdWZmZXJDYWNoZXMoYWN0aXZlU3RyZWFtcyk7CisKKyAgICBTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpb25Nb2RlOworICAgIHJlcyA9IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgICAgICAgICAoY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCkgY29uZmlnLT5vcGVyYXRpb25fbW9kZSwKKyAgICAgICAgICAgIC8qb3V0Ki8gJm9wZXJhdGlvbk1vZGUpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180Lm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7CisgICAgc2l6ZV90IHNlc3Npb25QYXJhbVNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUoc2Vzc2lvblBhcmFtcyk7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5zZXNzaW9uUGFyYW1zLnNldFRvRXh0ZXJuYWwoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oc2Vzc2lvblBhcmFtcykpLAorICAgICAgICAgICAgc2Vzc2lvblBhcmFtU2l6ZSk7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zZXNzaW9uUGFyYW1zLnNldFRvRXh0ZXJuYWwoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oc2Vzc2lvblBhcmFtcykpLAorICAgICAgICAgICAgc2Vzc2lvblBhcmFtU2l6ZSk7CisKKyAgICAvLyBJbnZva2UgY29uZmlndXJlU3RyZWFtcworICAgIGRldmljZTo6VjNfMzo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb247CisgICAgZGV2aWNlOjpWM180OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjNfNDsKKyAgICBkZXZpY2U6OlYzXzY6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uM182OworICAgIGNvbW1vbjo6VjFfMDo6U3RhdHVzIHN0YXR1czsKKworICAgIGF1dG8gY29uZmlnU3RyZWFtMzRDYiA9IFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uM180XQorICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbjNfNCA9IGhhbENvbmZpZ3VyYXRpb247CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgIH07CisKKyAgICBhdXRvIGNvbmZpZ1N0cmVhbTM2Q2IgPSBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbjNfNl0KKyAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzY6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24mIGhhbENvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24zXzYgPSBoYWxDb25maWd1cmF0aW9uOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICB9OworCisgICAgYXV0byBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM0ID0gWyZmaW5hbENvbmZpZ3VyYXRpb24sICZmaW5hbENvbmZpZ3VyYXRpb24zXzRdCisgICAgICAgICAgICAoaGFyZHdhcmU6OlJldHVybjx2b2lkPiYgZXJyKSAtPiBzdGF0dXNfdCB7CisgICAgICAgICAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldID0gZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXNbaV0udjNfMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfTsKKworICAgIGF1dG8gcG9zdHByb2NDb25maWdTdHJlYW0zNiA9IFsmZmluYWxDb25maWd1cmF0aW9uLCAmZmluYWxDb25maWd1cmF0aW9uM182XQorICAgICAgICAgICAgKGhhcmR3YXJlOjpSZXR1cm48dm9pZD4mIGVycikgLT4gc3RhdHVzX3QgeworICAgICAgICAgICAgICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGZpbmFsQ29uZmlndXJhdGlvbjNfNi5zdHJlYW1zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb24zXzYuc3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXSA9IGZpbmFsQ29uZmlndXJhdGlvbjNfNi5zdHJlYW1zW2ldLnYzXzQudjNfMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfTsKKworICAgIGlmIChtSGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIiVzOiB2My43IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcuc3RyZWFtQ29uZmlnQ291bnRlciA9IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlcisrOworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183Lm11bHRpUmVzb2x1dGlvbklucHV0SW1hZ2UgPSBjb25maWctPmlucHV0X2lzX211bHRpX3Jlc29sdXRpb247CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNy0+Y29uZmlndXJlU3RyZWFtc18zXzcoCisgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNywgY29uZmlnU3RyZWFtMzZDYik7CisgICAgICAgIHJlcyA9IHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzYoZXJyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobUhpZGxTZXNzaW9uXzNfNiAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlczogdjMuNiBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZXZpY2U6OlYzXzU6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNTsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNS52M180ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNS5zdHJlYW1Db25maWdDb3VudGVyID0gbU5leHRTdHJlYW1Db25maWdDb3VudGVyKys7CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNi0+Y29uZmlndXJlU3RyZWFtc18zXzYoCisgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNSwgY29uZmlnU3RyZWFtMzZDYik7CisgICAgICAgIHJlcyA9IHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzYoZXJyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobUhpZGxTZXNzaW9uXzNfNSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlczogdjMuNSBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZXZpY2U6OlYzXzU6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNTsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNS52M180ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNS5zdHJlYW1Db25maWdDb3VudGVyID0gbU5leHRTdHJlYW1Db25maWdDb3VudGVyKys7CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNS0+Y29uZmlndXJlU3RyZWFtc18zXzUoCisgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNSwgY29uZmlnU3RyZWFtMzRDYik7CisgICAgICAgIHJlcyA9IHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQoZXJyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobUhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuNCBmb3IgdGhlIGNhbGwKKyAgICAgICAgQUxPR1YoIiVzOiB2My40IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNC0+Y29uZmlndXJlU3RyZWFtc18zXzQoCisgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNCwgY29uZmlnU3RyZWFtMzRDYik7CisgICAgICAgIHJlcyA9IHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQoZXJyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobUhpZGxTZXNzaW9uXzNfMyAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuMyBmb3IgdGhlIGNhbGwKKyAgICAgICAgQUxPR1YoIiVzOiB2My4zIGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfMy0+Y29uZmlndXJlU3RyZWFtc18zXzMocmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMiwKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uXQorICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfMzo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbiA9IGhhbENvbmZpZ3VyYXRpb247CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdlIGRvbid0OyB1c2UgdjMuMiBjYWxsIGFuZCBjb25zdHJ1Y3QgYSB2My4zIEhhbFN0cmVhbUNvbmZpZ3VyYXRpb24KKyAgICAgICAgQUxPR1YoIiVzOiB2My4yIGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uXzNfMjsKKyAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb24tPmNvbmZpZ3VyZVN0cmVhbXMocmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMiwKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbl8zXzJdCisgICAgICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IEhhbFN0cmVhbUNvbmZpZ3VyYXRpb24mIGhhbENvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uXzNfMiA9IGhhbENvbmZpZ3VyYXRpb247CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb25fM18yLnN0cmVhbXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb25fM18yLnN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldLnYzXzIgPSBmaW5hbENvbmZpZ3VyYXRpb25fM18yLnN0cmVhbXNbaV07CisgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXS5vdmVycmlkZURhdGFTcGFjZSA9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtc1tpXS5kYXRhU3BhY2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSyApIHsKKyAgICAgICAgcmV0dXJuIEhpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIH0KKworICAgIC8vIEFuZCBjb252ZXJ0IG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbiBmcm9tIEhJREwKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fdCAqZHN0ID0gY29uZmlnLT5zdHJlYW1zW2ldOworICAgICAgICBpbnQgc3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KGRzdCktPmdldElkKCk7CisKKyAgICAgICAgLy8gU3RhcnQgc2NhbiBhdCBpLCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHN0cmVhbSBvcmRlciBtYXRjaGVzCisgICAgICAgIHNpemVfdCByZWFsSWR4ID0gaTsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBzaXplX3QgaGFsU3RyZWFtQ291bnQgPSBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IGhhbFN0cmVhbUNvdW50OyBpZHgrKykgeworICAgICAgICAgICAgaWYgKGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW3JlYWxJZHhdLnYzXzIuaWQgPT0gc3RyZWFtSWQpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWFsSWR4ID0gKHJlYWxJZHggPj0gaGFsU3RyZWFtQ291bnQgLSAxKSA/IDAgOiByZWFsSWR4ICsgMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCBub3QgZm91bmQgaW4gc3RyZWFtIGNvbmZpZ3VyYXRpb24gcmVzcG9uc2UgZnJvbSBIQUwiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBkZXZpY2U6OlYzXzM6OkhhbFN0cmVhbSAmc3JjID0gZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbcmVhbElkeF07CisgICAgICAgIGRldmljZTo6VjNfNjo6SGFsU3RyZWFtICZzcmNfMzYgPSBmaW5hbENvbmZpZ3VyYXRpb24zXzYuc3RyZWFtc1tyZWFsSWR4XTsKKworICAgICAgICBDYW1lcmEzU3RyZWFtKiBkc3RTdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KGRzdCk7CisgICAgICAgIGludCBvdmVycmlkZUZvcm1hdCA9IG1hcFRvRnJhbWV3b3JrRm9ybWF0KHNyYy52M18yLm92ZXJyaWRlRm9ybWF0KTsKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2Ugb3ZlcnJpZGVEYXRhU3BhY2UgPSBtYXBUb0ZyYW1ld29ya0RhdGFzcGFjZShzcmMub3ZlcnJpZGVEYXRhU3BhY2UpOworCisgICAgICAgIGlmIChtSGlkbFNlc3Npb25fM182ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0T2ZmbGluZVByb2Nlc3NpbmdTdXBwb3J0KHNyY18zNi5zdXBwb3J0T2ZmbGluZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZHN0U3RyZWFtLT5nZXRPcmlnaW5hbEZvcm1hdCgpICE9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCkgeworICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRGb3JtYXRPdmVycmlkZShmYWxzZSk7CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldERhdGFTcGFjZU92ZXJyaWRlKGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChkc3QtPmZvcm1hdCAhPSBvdmVycmlkZUZvcm1hdCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBGb3JtYXQgb3ZlcnJpZGUgbm90IGFsbG93ZWQgZm9yIGZvcm1hdCAweCV4IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIGRzdC0+Zm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkc3QtPmRhdGFfc3BhY2UgIT0gb3ZlcnJpZGVEYXRhU3BhY2UpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRGF0YVNwYWNlIG92ZXJyaWRlIG5vdCBhbGxvd2VkIGZvciBmb3JtYXQgMHgleCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkLCBkc3QtPmZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sIG5lZWRGb3JtYXRPdmVycmlkZSA9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtc1tpXS5mb3JtYXQgIT0gc3JjLnYzXzIub3ZlcnJpZGVGb3JtYXQ7CisgICAgICAgICAgICBib29sIG5lZWREYXRhc3BhY2VPdmVycmlkZSA9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtc1tpXS5kYXRhU3BhY2UgIT0gc3JjLm92ZXJyaWRlRGF0YVNwYWNlOworICAgICAgICAgICAgLy8gT3ZlcnJpZGUgYWxsb3dlZCB3aXRoIElNUExFTUVOVEFUSU9OX0RFRklORUQKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0Rm9ybWF0T3ZlcnJpZGUobmVlZEZvcm1hdE92ZXJyaWRlKTsKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0RGF0YVNwYWNlT3ZlcnJpZGUobmVlZERhdGFzcGFjZU92ZXJyaWRlKTsKKyAgICAgICAgICAgIGRzdC0+Zm9ybWF0ID0gb3ZlcnJpZGVGb3JtYXQ7CisgICAgICAgICAgICBkc3QtPmRhdGFfc3BhY2UgPSBvdmVycmlkZURhdGFTcGFjZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkc3QtPnN0cmVhbV90eXBlID09IENBTUVSQV9TVFJFQU1fSU5QVVQpIHsKKyAgICAgICAgICAgIGlmIChzcmMudjNfMi5wcm9kdWNlclVzYWdlICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogSU5QVVQgc3RyZWFtcyBtdXN0IGhhdmUgMCBmb3IgcHJvZHVjZXIgdXNhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRVc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKHNyYy52M18yLmNvbnN1bWVyVXNhZ2UpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE9VVFBVVAorICAgICAgICAgICAgaWYgKHNyYy52M18yLmNvbnN1bWVyVXNhZ2UgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBPVVRQVVQgc3RyZWFtcyBtdXN0IGhhdmUgMCBmb3IgY29uc3VtZXIgdXNhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRVc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKHNyYy52M18yLnByb2R1Y2VyVXNhZ2UpKTsKKyAgICAgICAgfQorICAgICAgICBkc3QtPm1heF9idWZmZXJzID0gc3JjLnYzXzIubWF4QnVmZmVyczsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBIaWRsQ2FtZXJhM0RldmljZTo6SGlkbEhhbEludGVyZmFjZTo6Y29uZmlndXJlSW5qZWN0ZWRTdHJlYW1zKAorICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogc2Vzc2lvblBhcmFtcywgY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uKiBjb25maWcsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjYW1lcmFDaGFyYWN0ZXJpc3RpY3MpIHsKKyAgICBBVFJBQ0VfTkFNRSgiSW5qZWN0aW9uQ2FtZXJhSGFsOjpjb25maWd1cmVTdHJlYW1zIik7CisgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBpZiAoY29uZmlnLT5pbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uKSB7CisgICAgICAgIEFMT0dFKCIlczogSW5qZWN0aW9uIGNhbWVyYSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IG11bHRpLXJlc29sdXRpb24gaW5wdXQgIgorICAgICAgICAgICAgICAgICJzdHJlYW0iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIENvbnZlcnQgc3RyZWFtIGNvbmZpZyB0byBISURMCisgICAgc3RkOjpzZXQ8aW50PiBhY3RpdmVTdHJlYW1zOworICAgIGRldmljZTo6VjNfMjo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yOworICAgIGRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180OworICAgIGRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183OworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGRldmljZTo6VjNfMjo6U3RyZWFtJiBkc3QzXzIgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV07CisgICAgICAgIGRldmljZTo6VjNfNDo6U3RyZWFtJiBkc3QzXzQgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LnN0cmVhbXNbaV07CisgICAgICAgIGRldmljZTo6VjNfNzo6U3RyZWFtJiBkc3QzXzcgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbXNbaV07CisgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fdCogc3JjID0gY29uZmlnLT5zdHJlYW1zW2ldOworCisgICAgICAgIENhbWVyYTNTdHJlYW0qIGNhbTNzdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYyk7CisgICAgICAgIGNhbTNzdHJlYW0tPnNldEJ1ZmZlckZyZWVkTGlzdGVuZXIodGhpcyk7CisgICAgICAgIGludCBzdHJlYW1JZCA9IGNhbTNzdHJlYW0tPmdldElkKCk7CisgICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtVHlwZTsKKyAgICAgICAgc3dpdGNoIChzcmMtPnN0cmVhbV90eXBlKSB7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fT1VUUFVUOgorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpPVVRQVVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fSU5QVVQ6CisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6OklOUFVUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogVW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgY29uZmlnLT5zdHJlYW1zW2ldLT5zdHJlYW1fdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGRzdDNfMi5pZCA9IHN0cmVhbUlkOworICAgICAgICBkc3QzXzIuc3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CisgICAgICAgIGRzdDNfMi53aWR0aCA9IHNyYy0+d2lkdGg7CisgICAgICAgIGRzdDNfMi5oZWlnaHQgPSBzcmMtPmhlaWdodDsKKyAgICAgICAgZHN0M18yLnVzYWdlID0gbWFwVG9Db25zdW1lclVzYWdlKGNhbTNzdHJlYW0tPmdldFVzYWdlKCkpOworICAgICAgICBkc3QzXzIucm90YXRpb24gPQorICAgICAgICAgICAgICAgIG1hcFRvU3RyZWFtUm90YXRpb24oKGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdClzcmMtPnJvdGF0aW9uKTsKKyAgICAgICAgLy8gRm9yIEhpZGxTZXNzaW9uIHZlcnNpb24gMy41IG9yIG5ld2VyLCB0aGUgZm9ybWF0IGFuZCBkYXRhU3BhY2Ugc2VudAorICAgICAgICAvLyB0byBIQUwgYXJlIG9yaWdpbmFsLCBub3QgdGhlIG92ZXJyaWRkZW4gb25lcy4KKyAgICAgICAgaWYgKG1IaWRsU2Vzc2lvbl8zXzUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZHN0M18yLmZvcm1hdCA9IG1hcFRvUGl4ZWxGb3JtYXQoY2FtM3N0cmVhbS0+aXNGb3JtYXRPdmVycmlkZGVuKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbEZvcm1hdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3JjLT5mb3JtYXQpOworICAgICAgICAgICAgZHN0M18yLmRhdGFTcGFjZSA9CisgICAgICAgICAgICAgICAgICAgIG1hcFRvSGlkbERhdGFzcGFjZShjYW0zc3RyZWFtLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbERhdGFTcGFjZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNyYy0+ZGF0YV9zcGFjZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3QzXzIuZm9ybWF0ID0gbWFwVG9QaXhlbEZvcm1hdChzcmMtPmZvcm1hdCk7CisgICAgICAgICAgICBkc3QzXzIuZGF0YVNwYWNlID0gbWFwVG9IaWRsRGF0YXNwYWNlKHNyYy0+ZGF0YV9zcGFjZSk7CisgICAgICAgIH0KKyAgICAgICAgZHN0M180LnYzXzIgPSBkc3QzXzI7CisgICAgICAgIGRzdDNfNC5idWZmZXJTaXplID0gYnVmZmVyU2l6ZXNbaV07CisgICAgICAgIGlmIChzcmMtPnBoeXNpY2FsX2NhbWVyYV9pZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBkc3QzXzQucGh5c2ljYWxDYW1lcmFJZCA9IHNyYy0+cGh5c2ljYWxfY2FtZXJhX2lkOworICAgICAgICB9CisgICAgICAgIGRzdDNfNy52M180ID0gZHN0M180OworICAgICAgICBkc3QzXzcuZ3JvdXBJZCA9IGNhbTNzdHJlYW0tPmdldEhhbFN0cmVhbUdyb3VwSWQoKTsKKyAgICAgICAgZHN0M183LnNlbnNvclBpeGVsTW9kZXNVc2VkLnJlc2l6ZShzcmMtPnNlbnNvcl9waXhlbF9tb2Rlc191c2VkLnNpemUoKSk7CisgICAgICAgIHNpemVfdCBqID0gMDsKKyAgICAgICAgZm9yIChpbnQgbW9kZSA6IHNyYy0+c2Vuc29yX3BpeGVsX21vZGVzX3VzZWQpIHsKKyAgICAgICAgICAgIGRzdDNfNy5zZW5zb3JQaXhlbE1vZGVzVXNlZFtqKytdID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhTWV0YWRhdGFFbnVtQW5kcm9pZFNlbnNvclBpeGVsTW9kZT4obW9kZSk7CisgICAgICAgIH0KKyAgICAgICAgYWN0aXZlU3RyZWFtcy5pbnNlcnQoc3RyZWFtSWQpOworICAgICAgICAvLyBDcmVhdGUgQnVmZmVyIElEIG1hcCBpZiBuZWNlc3NhcnkKKyAgICAgICAgbUJ1ZmZlclJlY29yZHMudHJ5Q3JlYXRlQnVmZmVyQ2FjaGUoc3RyZWFtSWQpOworICAgIH0KKyAgICAvLyByZW1vdmUgQnVmZmVySWRNYXAgZm9yIGRlbGV0ZWQgc3RyZWFtcworICAgIG1CdWZmZXJSZWNvcmRzLnJlbW92ZUluYWN0aXZlQnVmZmVyQ2FjaGVzKGFjdGl2ZVN0cmVhbXMpOworCisgICAgU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW9uTW9kZTsKKyAgICByZXMgPSBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgICAgICAgICAgKGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3QpY29uZmlnLT5vcGVyYXRpb25fbW9kZSwKKyAgICAgICAgICAgIC8qb3V0Ki8gJm9wZXJhdGlvbk1vZGUpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKKyAgICBzaXplX3Qgc2Vzc2lvblBhcmFtU2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzZXNzaW9uUGFyYW1zKTsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183Lm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcuc2Vzc2lvblBhcmFtcy5zZXRUb0V4dGVybmFsKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHNlc3Npb25QYXJhbXMpKSwKKyAgICAgICAgICAgIHNlc3Npb25QYXJhbVNpemUpOworCisgICAgLy8gU2VlIHdoaWNoIHZlcnNpb24gb2YgSEFMIHdlIGhhdmUKKyAgICBpZiAobUhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcuc3RyZWFtQ29uZmlnQ291bnRlciA9IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlcisrOworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183Lm11bHRpUmVzb2x1dGlvbklucHV0SW1hZ2UgPQorICAgICAgICAgICAgICAgIGNvbmZpZy0+aW5wdXRfaXNfbXVsdGlfcmVzb2x1dGlvbjsKKworICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogcmF3TWV0YWRhdGEgPSBjYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZ2V0QW5kTG9jaygpOworICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgaGlkbENoYXJzID0ge307CisgICAgICAgIGhpZGxDaGFycy5zZXRUb0V4dGVybmFsKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihyYXdNZXRhZGF0YSkpLAorICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyYXdNZXRhZGF0YSkpOworICAgICAgICBjYW1lcmFDaGFyYWN0ZXJpc3RpY3MudW5sb2NrKHJhd01ldGFkYXRhKTsKKworICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OklDYW1lcmFJbmplY3Rpb25TZXNzaW9uPgorICAgICAgICAgICAgICAgIGhpZGxJbmplY3Rpb25TZXNzaW9uXzNfNzsKKyAgICAgICAgYXV0byBjYXN0SW5qZWN0aW9uUmVzdWx0XzNfNyA9CisgICAgICAgICAgICAgICAgZGV2aWNlOjpWM183OjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uXzNfNyk7CisgICAgICAgIGlmIChjYXN0SW5qZWN0aW9uUmVzdWx0XzNfNy5pc09rKCkpIHsKKyAgICAgICAgICAgIGhpZGxJbmplY3Rpb25TZXNzaW9uXzNfNyA9IGNhc3RJbmplY3Rpb25SZXN1bHRfM183OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGNhc3RJbmplY3Rpb25SZXN1bHRfM183LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGVyciA9IGhpZGxJbmplY3Rpb25TZXNzaW9uXzNfNy0+Y29uZmlndXJlSW5qZWN0aW9uU3RyZWFtcygKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LCBoaWRsQ2hhcnMpOworICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogbUhpZGxTZXNzaW9uXzNfNyBkb2VzIG5vdCBleGlzdCwgdGhlIGxvd2VzdCB2ZXJzaW9uIG9mIGluamVjdGlvbiAiCisgICAgICAgICAgICAgICAgInNlc3Npb24gaXMgMy43IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjp3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QqIHJlcXVlc3QsCisgICAgICAgIC8qb3V0Ki9kZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0KiBjYXB0dXJlUmVxdWVzdCwKKyAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCwKKyAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIGluZmxpZ2h0QnVmZmVycykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKGNhcHR1cmVSZXF1ZXN0ID09IG51bGxwdHIgfHwgaGFuZGxlc0NyZWF0ZWQgPT0gbnVsbHB0ciB8fCBpbmZsaWdodEJ1ZmZlcnMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNhcHR1cmVSZXF1ZXN0ICglcCksIGhhbmRsZXNDcmVhdGVkICglcCksIGFuZCBpbmZsaWdodEJ1ZmZlcnMoJXApICIKKyAgICAgICAgICAgICAgICAibXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXywgY2FwdHVyZVJlcXVlc3QsIGhhbmRsZXNDcmVhdGVkLCBpbmZsaWdodEJ1ZmZlcnMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciA9IHJlcXVlc3QtPmZyYW1lX251bWJlcjsKKworICAgIGNhcHR1cmVSZXF1ZXN0LT5mbXFTZXR0aW5nc1NpemUgPSAwOworCisgICAgeworICAgICAgICBpZiAocmVxdWVzdC0+aW5wdXRfYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+c3RyZWFtKS0+Z2V0SWQoKTsKKyAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWYgPSAqKHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+YnVmZmVyKTsKKyAgICAgICAgICAgIGF1dG8gcGFpciA9IGdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOworICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICB1aW50NjRfdCBidWZmZXJJZCA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLnN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYnVmZmVySWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5idWZmZXIgPSAoaXNOZXdCdWZmZXIpID8gYnVmIDogbnVsbHB0cjsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgaWYgKHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+YWNxdWlyZV9mZW5jZSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gcmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5hY3F1aXJlX2ZlbmNlOworICAgICAgICAgICAgICAgIGhhbmRsZXNDcmVhdGVkLT5wdXNoX2JhY2soYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5hY3F1aXJlRmVuY2UgPSBhY3F1aXJlRmVuY2U7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKKworICAgICAgICAgICAgbUJ1ZmZlclJlY29yZHMucHVzaEluZmxpZ2h0QnVmZmVyKGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQsCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+YnVmZmVyKTsKKyAgICAgICAgICAgIGluZmxpZ2h0QnVmZmVycy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5zdHJlYW1JZCA9IC0xOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLmJ1ZmZlcklkID0gQlVGRkVSX0lEX05PX0JVRkZFUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5vdXRwdXRCdWZmZXJzLnJlc2l6ZShyZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVyczsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICpzcmMgPSByZXF1ZXN0LT5vdXRwdXRfYnVmZmVycyArIGk7CisgICAgICAgICAgICBTdHJlYW1CdWZmZXIgJmRzdCA9IGNhcHR1cmVSZXF1ZXN0LT5vdXRwdXRCdWZmZXJzW2ldOworICAgICAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IENhbWVyYTNTdHJlYW06OmNhc3Qoc3JjLT5zdHJlYW0pLT5nZXRJZCgpOworICAgICAgICAgICAgaWYgKHNyYy0+YnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmID0gKihzcmMtPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgYXV0byBwYWlyID0gZ2V0QnVmZmVySWQoYnVmLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlcklkID0gcGFpci5zZWNvbmQ7CisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlciA9IGlzTmV3QnVmZmVyID8gYnVmIDogbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgaWYgKHNyYy0+YWNxdWlyZV9mZW5jZSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UtPmRhdGFbMF0gPSBzcmMtPmFjcXVpcmVfZmVuY2U7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXNDcmVhdGVkLT5wdXNoX2JhY2soYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IGFjcXVpcmVGZW5jZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBIQUwgYnVmZmVyIG1hbmFnZW1lbnQgcGF0aAorICAgICAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IEJVRkZFUl9JRF9OT19CVUZGRVI7CisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IHNlbmQgYSBudWxsIGJ1ZmZlciBpbiBjYXB0dXJlIHJlcXVlc3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0LnN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgICAgICBkc3Quc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKKyAgICAgICAgICAgIGRzdC5yZWxlYXNlRmVuY2UgPSBudWxscHRyOworCisgICAgICAgICAgICAvLyBPdXRwdXQgYnVmZmVycyBhcmUgZW1wdHkgd2hlbiB1c2luZyBIQUwgYnVmZmVyIG1hbmFnZXIKKyAgICAgICAgICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyUmVjb3Jkcy5wdXNoSW5mbGlnaHRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkLCBzcmMtPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaW5mbGlnaHRCdWZmZXJzLT5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OmZsdXNoKCkgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmZsdXNoIik7CisgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbi0+Zmx1c2goKTsKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXMgPSBERUFEX09CSkVDVDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMgPSBIaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1QoZXJyKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBIaWRsQ2FtZXJhM0RldmljZTo6SGlkbEhhbEludGVyZmFjZTo6ZHVtcChpbnQgLypmZCovKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6ZHVtcCIpOworICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgLy8gSGFuZGxlZCBieSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmR1bXAKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OnJlcGVhdGluZ1JlcXVlc3RFbmQodWludDMyX3QgLypmcmFtZU51bWJlciovLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAmLypzdHJlYW1JZHMqLykgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OnJlcGVhdGluZ1JlcXVlc3RFbmQiKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjpjbG9zZSgpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpjbG9zZSgpIik7CisgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbi0+Y2xvc2UoKTsKKyAgICAvLyBJbnRlcmZhY2Ugd2lsbCBiZSBkZWFkIHNob3J0bHkgYW55d2F5LCBzbyBkb24ndCBsb2cgZXJyb3JzCisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIHJlcyA9IERFQURfT0JKRUNUOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxIYWxJbnRlcmZhY2U6OnNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6c2lnbmFsUGlwZWxpbmVEcmFpbiIpOworICAgIGlmICghdmFsaWQoKSB8fCBtSGlkbFNlc3Npb25fM181ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBvbiBpbnZhbGlkIGNhbWVyYSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5zaWduYWxTdHJlYW1GbHVzaChzdHJlYW1JZHMsIG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlciAtIDEpOworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsSGFsSW50ZXJmYWNlOjpwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMoCisgICAgICAgIHN0ZDo6dmVjdG9yPGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCo+JiByZXF1ZXN0cywvKm91dCovdWludDMyX3QqIG51bVJlcXVlc3RQcm9jZXNzZWQpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMiKTsKKyAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIHNwPGRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb24+IGhpZGxTZXNzaW9uXzNfNDsKKyAgICBzcDxkZXZpY2U6OlYzXzc6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBoaWRsU2Vzc2lvbl8zXzc7CisgICAgYXV0byBjYXN0UmVzdWx0XzNfNyA9IGRldmljZTo6VjNfNzo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CisgICAgaWYgKGNhc3RSZXN1bHRfM183LmlzT2soKSkgeworICAgICAgICBoaWRsU2Vzc2lvbl8zXzcgPSBjYXN0UmVzdWx0XzNfNzsKKyAgICB9CisgICAgYXV0byBjYXN0UmVzdWx0XzNfNCA9IGRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CisgICAgaWYgKGNhc3RSZXN1bHRfM180LmlzT2soKSkgeworICAgICAgICBoaWRsU2Vzc2lvbl8zXzQgPSBjYXN0UmVzdWx0XzNfNDsKKyAgICB9CisKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdD4gY2FwdHVyZVJlcXVlc3RzOworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXF1ZXN0PiBjYXB0dXJlUmVxdWVzdHNfM180OworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxkZXZpY2U6OlYzXzc6OkNhcHR1cmVSZXF1ZXN0PiBjYXB0dXJlUmVxdWVzdHNfM183OworICAgIHNpemVfdCBiYXRjaFNpemUgPSByZXF1ZXN0cy5zaXplKCk7CisgICAgaWYgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7CisgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzcucmVzaXplKGJhdGNoU2l6ZSk7CisgICAgfSBlbHNlIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgeworICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM180LnJlc2l6ZShiYXRjaFNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNhcHR1cmVSZXF1ZXN0cy5yZXNpemUoYmF0Y2hTaXplKTsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gaGFuZGxlc0NyZWF0ZWQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiBpbmZsaWdodEJ1ZmZlcnM7CisKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgaSsrKSB7CisgICAgICAgIGlmIChoaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzXzNfN1tpXS52M180LnYzXzIsCisgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQsIC8qb3V0Ki8maW5mbGlnaHRCdWZmZXJzKTsKKyAgICAgICAgfSBlbHNlIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS52M18yLAorICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkLCAvKm91dCovJmluZmxpZ2h0QnVmZmVycyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNbaV0sCisgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQsIC8qb3V0Ki8maW5mbGlnaHRCdWZmZXJzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBtQnVmZmVyUmVjb3Jkcy5wb3BJbmZsaWdodEJ1ZmZlcnMoaW5mbGlnaHRCdWZmZXJzKTsKKyAgICAgICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8ZGV2aWNlOjpWM18yOjpCdWZmZXJDYWNoZT4gY2FjaGVzVG9SZW1vdmU7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtRnJlZWRCdWZmZXJzTG9jayk7CisgICAgICAgIGZvciAoYXV0byYgcGFpciA6IG1GcmVlZEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzdHJlYW0gbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2Ugb25CdWZmZXJGcmVlZAorICAgICAgICAgICAgaWYgKG1CdWZmZXJSZWNvcmRzLmlzU3RyZWFtQ2FjaGVkKHBhaXIuZmlyc3QpKSB7CisgICAgICAgICAgICAgICAgY2FjaGVzVG9SZW1vdmUucHVzaF9iYWNrKHtwYWlyLmZpcnN0LCBwYWlyLnNlY29uZH0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1GcmVlZEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6SU5URVJOQUxfRVJST1I7CisgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSAwOworCisgICAgLy8gV3JpdGUgbWV0YWRhdGEgdG8gRk1RLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKKyAgICAgICAgY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0ID0gcmVxdWVzdHNbaV07CisgICAgICAgIGRldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIGNhcHR1cmVSZXF1ZXN0OworICAgICAgICBpZiAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0ID0gJmNhcHR1cmVSZXF1ZXN0c18zXzdbaV0udjNfNC52M18yOworICAgICAgICB9IGVsc2UgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdCA9ICZjYXB0dXJlUmVxdWVzdHNfM180W2ldLnYzXzI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdCA9ICZjYXB0dXJlUmVxdWVzdHNbaV07CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVxdWVzdC0+c2V0dGluZ3MgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2l6ZV90IHNldHRpbmdzU2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyZXF1ZXN0LT5zZXR0aW5ncyk7CisgICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIgJiYgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmVxdWVzdC0+c2V0dGluZ3MpLCBzZXR0aW5nc1NpemUpKSB7CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPnNldHRpbmdzLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gc2V0dGluZ3NTaXplOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBjb3VsZG4ndCB1dGlsaXplIGZtcSwgZmFsbGJhY2sgdG8gaHdiaW5kZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+c2V0dGluZ3Muc2V0VG9FeHRlcm5hbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+c2V0dGluZ3MpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyZXF1ZXN0LT5zZXR0aW5ncykpOworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5mbXFTZXR0aW5nc1NpemUgPSAwdTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEEgbnVsbCByZXF1ZXN0IHNldHRpbmdzIG1hcHMgdG8gYSBzaXplLTAgQ2FtZXJhTWV0YWRhdGEKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5zZXR0aW5ncy5yZXNpemUoMCk7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gMHU7CisgICAgICAgIH0KKworICAgICAgICAvLyBoaWRsIHNlc3Npb24gMy43IHNwZWNpZmljIGhhbmRsaW5nLgorICAgICAgICBpZiAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzdbaV0uaW5wdXRXaWR0aCA9IHJlcXVlc3QtPmlucHV0X3dpZHRoOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfN1tpXS5pbnB1dEhlaWdodCA9IHJlcXVlc3QtPmlucHV0X2hlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhpZGwgc2Vzc2lvbiAzLjcgYW5kIDMuNCBzcGVjaWZpYyBoYW5kbGluZy4KKyAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyIHx8IGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYVNldHRpbmc+JiBwaHlzaWNhbENhbWVyYVNldHRpbmdzID0KKyAgICAgICAgICAgICAgICAgICAgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSA/CisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzdbaV0udjNfNC5waHlzaWNhbENhbWVyYVNldHRpbmdzIDoKKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS5waHlzaWNhbENhbWVyYVNldHRpbmdzOworICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5yZXNpemUocmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3MpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByZXF1ZXN0LT5udW1fcGh5c2NhbV9zZXR0aW5nczsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3MgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2V0dGluZ3NTaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pOworICAgICAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIgJiYgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uc2V0dGluZ3MucmVzaXplKDApOworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5mbXFTZXR0aW5nc1NpemUgPSBzZXR0aW5nc1NpemU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNvdWxkbid0IHV0aWxpemUgZm1xLCBmYWxsYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLnNldFRvRXh0ZXJuYWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzW2pdKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzW2pdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLmZtcVNldHRpbmdzU2l6ZSA9IDB1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5mbXFTZXR0aW5nc1NpemUgPSAwdTsKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5zZXR0aW5ncy5yZXNpemUoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0ucGh5c2ljYWxDYW1lcmFJZCA9IHJlcXVlc3QtPnBoeXNjYW1faWRbal07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBoYXJkd2FyZTo6ZGV0YWlsczo6cmV0dXJuX3N0YXR1cyBlcnI7CisgICAgYXV0byByZXN1bHRDYWxsYmFjayA9CisgICAgICAgIFsmc3RhdHVzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZF0gKGF1dG8gcywgdWludDMyX3QgbikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSBuOworICAgICAgICB9OworICAgIGlmIChoaWRsU2Vzc2lvbl8zXzcgIT0gbnVsbHB0cikgeworICAgICAgICBlcnIgPSBoaWRsU2Vzc2lvbl8zXzctPnByb2Nlc3NDYXB0dXJlUmVxdWVzdF8zXzcoY2FwdHVyZVJlcXVlc3RzXzNfNywgY2FjaGVzVG9SZW1vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayk7CisgICAgfSBlbHNlIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgeworICAgICAgICBlcnIgPSBoaWRsU2Vzc2lvbl8zXzQtPnByb2Nlc3NDYXB0dXJlUmVxdWVzdF8zXzQoY2FwdHVyZVJlcXVlc3RzXzNfNCwgY2FjaGVzVG9SZW1vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gbUhpZGxTZXNzaW9uLT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3QoY2FwdHVyZVJlcXVlc3RzLCBjYWNoZXNUb1JlbW92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOworICAgIH0KKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6Q0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzID09IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSyAmJiAqbnVtUmVxdWVzdFByb2Nlc3NlZCAhPSBiYXRjaFNpemUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QgcmV0dXJucyBPSyBidXQgcHJvY2Vzc2VkICVkLyV6dSByZXF1ZXN0cyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAqbnVtUmVxdWVzdFByb2Nlc3NlZCwgYmF0Y2hTaXplKTsKKyAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgIH0KKworICAgIHJlcyA9IEhpZGxQcm92aWRlckluZm86Om1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgaWYgKG1IaWRsU2Vzc2lvbi0+aXNSZW1vdGUoKSkgeworICAgICAgICAgICAgLy8gT25seSBjbG9zZSBhY3F1aXJlIGZlbmNlIEZEcyB3aGVuIHRoZSBISURMIHRyYW5zYWN0aW9uIHN1Y2NlZWRzIChzbyB0aGUgRkRzIGhhdmUgYmVlbgorICAgICAgICAgICAgLy8gc2VudCB0byBjYW1lcmEgSEFMIHByb2Nlc3NlcykKKyAgICAgICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCwgLypjbG9zZUZkKi90cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEluIHBhc3N0aHJvdWdoIG1vZGUgdGhlIEZEcyBhcmUgbm93IG93bmVkIGJ5IEhBTAorICAgICAgICAgICAgY2xlYW51cE5hdGl2ZUhhbmRsZXMoJmhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1CdWZmZXJSZWNvcmRzLnBvcEluZmxpZ2h0QnVmZmVycyhpbmZsaWdodEJ1ZmZlcnMpOworICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBIaWRsQ2FtZXJhM0RldmljZTo6SGlkbEhhbEludGVyZmFjZTo6c3dpdGNoVG9PZmZsaW5lKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKKyAgICAgICAgLypvdXQqL2hhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvKiBvZmZsaW5lU2Vzc2lvbkluZm8sCisgICAgICAgIC8qb3V0Ki9zcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qIG9mZmxpbmVTZXNzaW9uLAorICAgICAgICAvKm91dCovY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyogYnVmZmVyUmVjb3JkcykgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OnN3aXRjaFRvT2ZmbGluZSIpOworICAgIGlmICghdmFsaWQoKSB8fCBtSGlkbFNlc3Npb25fM182ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBvbiBpbnZhbGlkIGNhbWVyYSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKG9mZmxpbmVTZXNzaW9uSW5mbyA9PSBudWxscHRyIHx8IG9mZmxpbmVTZXNzaW9uID09IG51bGxwdHIgfHwgYnVmZmVyUmVjb3JkcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogb3V0cHV0IGFyZ3VtZW50cyBtdXN0IG5vdCBiZSBudWxsISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6SU5URVJOQUxfRVJST1I7CisgICAgYXV0byByZXN1bHRDYWxsYmFjayA9CisgICAgICAgIFsmc3RhdHVzLCAmb2ZmbGluZVNlc3Npb25JbmZvLCAmb2ZmbGluZVNlc3Npb25dIChhdXRvIHMsIGF1dG8gaW5mbywgYXV0byBzZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAqb2ZmbGluZVNlc3Npb25JbmZvID0gaW5mbzsKKyAgICAgICAgICAgICAgICAqb2ZmbGluZVNlc3Npb24gPSBzZXNzaW9uOworICAgICAgICB9OworICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNi0+c3dpdGNoVG9PZmZsaW5lKHN0cmVhbXNUb0tlZXAsIHJlc3VsdENhbGxiYWNrKTsKKworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXQgPSBIaWRsUHJvdmlkZXJJbmZvOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIHZlcmlmeUJ1ZmZlckNhY2hlcyhvZmZsaW5lU2Vzc2lvbkluZm8sIGJ1ZmZlclJlY29yZHMpOworfQorCitIaWRsQ2FtZXJhM0RldmljZTo6SGlkbFJlcXVlc3RUaHJlYWQ6OkhpZGxSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKKyAgICAgICAgICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAorICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCisgICAgICAgICAgICAgICAgYm9vbCBzdXBwb3J0Q2FtZXJhTXV0ZSkgOgorICAgICAgICAgIFJlcXVlc3RUaHJlYWQocGFyZW50LCBzdGF0dXNUcmFja2VyLCBpbnRlcmZhY2UsIHNlc3Npb25QYXJhbUtleXMsIHVzZUhhbEJ1Zk1hbmFnZXIsCisgICAgICAgICAgICAgICAgICBzdXBwb3J0Q2FtZXJhTXV0ZSkge30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxSZXF1ZXN0VGhyZWFkOjpzd2l0Y2hUb09mZmxpbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAorICAgICAgICAvKm91dCovaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpDYW1lcmFPZmZsaW5lU2Vzc2lvbkluZm8qIG9mZmxpbmVTZXNzaW9uSW5mbywKKyAgICAgICAgLypvdXQqL3NwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPiogb2ZmbGluZVNlc3Npb24sCisgICAgICAgIC8qb3V0Ki9jYW1lcmEzOjpCdWZmZXJSZWNvcmRzKiBidWZmZXJSZWNvcmRzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKKyAgICBjbGVhclJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKC8qbGFzdEZyYW1lTnVtYmVyKi9udWxscHRyKTsKKworICAgIC8vIFdhaXQgdW50aWwgcmVxdWVzdCB0aHJlYWQgaXMgZnVsbHkgc3RvcHBlZAorICAgIC8vIFRCRDogY2hlY2sgaWYgcmVxdWVzdCB0aHJlYWQgaXMgYmVpbmcgcGF1c2VkIGJ5IG90aGVyIEFQSXMgKHNob3VsZG4ndCBiZSkKKworICAgIC8vIFdlIGNvdWxkIGFsc28gY2hlY2sgZm9yIG1SZXBlYXRpbmdSZXF1ZXN0cy5lbXB0eSgpLCBidXQgdGhlIEFQSSBpbnRlcmZhY2UKKyAgICAvLyBpcyBzZXJpYWxpemVkIGJ5IENhbWVyYTNEZXZpY2U6Om1JbnRlcmZhY2VMb2NrIHNvIG5vIG9uZSBzaG91bGQgYmUgYWJsZSB0byBzdWJtaXQgYW55CisgICAgLy8gbmV3IHJlcXVlc3RzIGR1cmluZyB0aGUgY2FsbDsgaGVuY2Ugc2tpcCB0aGF0IGNoZWNrLgorICAgIGJvb2wgcXVldWVFbXB0eSA9IG1OZXh0UmVxdWVzdHMuZW1wdHkoKSAmJiBtUmVxdWVzdFF1ZXVlLmVtcHR5KCk7CisgICAgd2hpbGUgKCFxdWV1ZUVtcHR5KSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1SZXF1ZXN0U3VibWl0dGVkU2lnbmFsLndhaXRSZWxhdGl2ZShtUmVxdWVzdExvY2ssIGtSZXF1ZXN0U3VibWl0VGltZW91dCk7CisgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHJlcXVlc3QgdGhyZWFkIGZhaWxlZCB0byBzdWJtaXQgb25lIHJlcXVlc3Qgd2l0aGluIHRpbWVvdXQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHJlcXVlc3QgdGhyZWFkIGZhaWxlZCB0byBzdWJtaXQgYSByZXF1ZXN0OiAlcyAoJWQpISIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIHF1ZXVlRW1wdHkgPSBtTmV4dFJlcXVlc3RzLmVtcHR5KCkgJiYgbVJlcXVlc3RRdWV1ZS5lbXB0eSgpOworICAgIH0KKyAgICByZXR1cm4gKHN0YXRpY19jYXN0PEhpZGxIYWxJbnRlcmZhY2UgKj4obUludGVyZmFjZS5nZXQoKSkpLT5zd2l0Y2hUb09mZmxpbmUoCisgICAgICAgICAgICBzdHJlYW1zVG9LZWVwLCBvZmZsaW5lU2Vzc2lvbkluZm8sIG9mZmxpbmVTZXNzaW9uLCBidWZmZXJSZWNvcmRzKTsKK30KKworc3RhdHVzX3QgSGlkbENhbWVyYTNEZXZpY2U6OkhpZGxDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6aW5qZWN0aW9uSW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5qZWN0ZWRDYW1JZCwgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBzcDxhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mCisgICAgICAgICAgICAgICAgY2FsbGJhY2spIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1JbmplY3Rpb25Mb2NrKTsKKworICAgIGlmIChtYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBtYW5hZ2VyIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwYXJlbnQgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1JbmplY3RlZENhbUlkID0gaW5qZWN0ZWRDYW1JZDsKKyAgICBzcDxJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gc2Vzc2lvbjsKKyAgICBBVFJBQ0VfQkVHSU4oIkluamVjdGlvbiBDYW1lcmFIYWw6Om9wZW5TZXNzaW9uIik7CisgICAgc3RhdHVzX3QgcmVzID0gbWFuYWdlci0+b3BlbkhpZGxTZXNzaW9uKGluamVjdGVkQ2FtSWQuc3RyaW5nKCksIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLyAmc2Vzc2lvbik7CisgICAgQVRSQUNFX0VORCgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgY291bGQgbm90IG9wZW4gY2FtZXJhIHNlc3Npb246ICVzICglZCkiLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWU7CisgICAgYXV0byByZXF1ZXN0UXVldWVSZXQgPQorICAgICAgICBzZXNzaW9uLT5nZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoWyZxdWV1ZV0oY29uc3QgYXV0byYgZGVzY3JpcHRvcikgeworICAgICAgICAgICAgcXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPihkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIGlmICghcXVldWUtPmlzVmFsaWQoKSB8fCBxdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW5qZWN0aW9uIGNhbWVyYSBIQUwgcmV0dXJucyBlbXB0eSByZXF1ZXN0IG1ldGFkYXRhIGZtcSwgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgaXQiKTsKKyAgICAgICAgICAgICAgICBxdWV1ZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgLy8gZG9uJ3QgdXNlIHRoZSBxdWV1ZSBvbndhcmRzLgorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBpZiAoIXJlcXVlc3RRdWV1ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgdHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlcXVlc3QgbWV0YWRhdGEgZm1xOiAiCisgICAgICAgICAgICAgICAgIiVzLCBub3QgdXNlIGl0IiwgcmVxdWVzdFF1ZXVlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4mIHJlc1F1ZXVlID0gbUluamVjdGlvblJlc3VsdE1ldGFkYXRhUXVldWU7CisgICAgYXV0byByZXN1bHRRdWV1ZVJldCA9IHNlc3Npb24tPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAorICAgICAgICBbJnJlc1F1ZXVlXShjb25zdCBhdXRvJiBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICByZXNRdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8UmVzdWx0TWV0YWRhdGFRdWV1ZT4oZGVzY3JpcHRvcik7CisgICAgICAgICAgICBpZiAoIXJlc1F1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgSEFMIHJldHVybnMgZW1wdHkgcmVzdWx0IG1ldGFkYXRhIGZtcSwgbm90IHVzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiaXQiKTsKKyAgICAgICAgICAgICAgICByZXNRdWV1ZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgdXNlIHRoZSByZXNRdWV1ZSBvbndhcmRzLgorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBpZiAoIXJlc3VsdFF1ZXVlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiSW5qZWN0aW9uIGNhbWVyYSB0cmFuc2FjdGlvbiBlcnJvciB3aGVuIGdldHRpbmcgcmVzdWx0IG1ldGFkYXRhIHF1ZXVlICIKKyAgICAgICAgICAgICAgICAiZnJvbSBjYW1lcmEgc2Vzc2lvbjogJXMiLCByZXN1bHRRdWV1ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIElGX0FMT0dWKCkgeworICAgICAgICBzZXNzaW9uLT5pbnRlcmZhY2VDaGFpbigKKyAgICAgICAgICAgICAgICBbXSg6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZUNoYWluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiSW5qZWN0aW9uIGNhbWVyYSBzZXNzaW9uIGludGVyZmFjZSBjaGFpbjoiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaWZhY2UgOiBpbnRlcmZhY2VDaGFpbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgICVzIiwgaWZhY2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBJbmplY3Rpb24gY2FtZXJhIGludGVyZmFjZSA9IG5ldyBIYWxJbnRlcmZhY2UoKSIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UgPQorICAgICAgICAgICAgbmV3IEhpZGxIYWxJbnRlcmZhY2Uoc2Vzc2lvbiwgcXVldWUsIHBhcmVudC0+bVVzZUhhbEJ1Zk1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+bVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyk7CisgICAgaWYgKG1JbmplY3RlZENhbUhhbEludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogbUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzRGV2aWNlOjpIaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OnJlcGxhY2VIYWxJbnRlcmZhY2UoCisgICAgICAgIHNwPEhhbEludGVyZmFjZT4gbmV3SGFsSW50ZXJmYWNlLCBib29sIGtlZXBCYWNrdXApIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtSW5qZWN0aW9uTG9jayk7CisgICAgaWYgKG5ld0hhbEludGVyZmFjZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogVGhlIG5ld0hhbEludGVyZmFjZSBkb2VzIG5vdCBleGlzdCwgdG8gc3RvcCByZXBsYWNpbmcuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogcGFyZW50IGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG5ld0hhbEludGVyZmFjZS0+Z2V0VHJhbnNwb3J0VHlwZSgpICE9IElQQ1RyYW5zcG9ydDo6SElETCkgeworICAgICAgICBBTE9HRSgiJXMgUmVwbGFjaW5nIEhJREwgSGFsSW50ZXJmYWNlIHdpdGggYW5vdGhlciB0cmFuc3BvcnQgdW5zdXBwb3J0ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgSGlkbENhbWVyYTNEZXZpY2UgKmhpZGxQYXJlbnQgPSBzdGF0aWNfY2FzdDxIaWRsQ2FtZXJhM0RldmljZSAqPihwYXJlbnQuZ2V0KCkpOworICAgIGlmIChrZWVwQmFja3VwKSB7CisgICAgICAgIGlmIChtQmFja3VwSGFsSW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1CYWNrdXBIYWxJbnRlcmZhY2UgPSBwYXJlbnQtPm1JbnRlcmZhY2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1CYWNrdXBSZXN1bHRNZXRhZGF0YVF1ZXVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1CYWNrdXBSZXN1bHRNZXRhZGF0YVF1ZXVlID0gc3RkOjptb3ZlKGhpZGxQYXJlbnQtPm1SZXN1bHRNZXRhZGF0YVF1ZXVlKTsKKyAgICAgICAgICAgIGhpZGxQYXJlbnQtPm1SZXN1bHRNZXRhZGF0YVF1ZXVlID0gc3RkOjptb3ZlKG1JbmplY3Rpb25SZXN1bHRNZXRhZGF0YVF1ZXVlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1CYWNrdXBIYWxJbnRlcmZhY2UgPSBudWxscHRyOworICAgICAgICBoaWRsUGFyZW50LT5tUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IHN0ZDo6bW92ZShtQmFja3VwUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisgICAgICAgIG1CYWNrdXBSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICB9CisgICAgcGFyZW50LT5tSW50ZXJmYWNlID0gbmV3SGFsSW50ZXJmYWNlOworCisgICAgcmV0dXJuIE9LOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNEZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTk4ZmUwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzRGV2aWNlLmgKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19ISURMQ0FNRVJBM0RFVklDRV9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19ISURMQ0FNRVJBM0RFVklDRV9ICisKKyNpbmNsdWRlICIuLi9DYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiSGlkbENhbWVyYTNPdXRwdXRVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKworLyoqCisgKiBDYW1lcmFEZXZpY2UgZm9yIEhJREwgSEFMIGRldmljZXMgd2l0aCB2ZXJzaW9uIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wIG9yIGhpZ2hlci4KKyAqLworY2xhc3MgSGlkbENhbWVyYTNEZXZpY2UgOgorICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2ssCisgICAgICAgICAgICBwdWJsaWMgQ2FtZXJhM0RldmljZSB7CisgIHB1YmxpYzoKKworICAgZXhwbGljaXQgSGlkbENhbWVyYTNEZXZpY2UoY29uc3QgU3RyaW5nOCYgaWQsIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgICAgYm9vbCBsZWdhY3lDbGllbnQgPSBmYWxzZSkgOiBDYW1lcmEzRGV2aWNlKGlkLCBvdmVycmlkZUZvclBlcmZDbGFzcywgbGVnYWN5Q2xpZW50KSB7IH0KKworICAgIHZpcnR1YWwgfkhpZGxDYW1lcmEzRGV2aWNlKCkge30KKworICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9ucyB0byBtYXAgYmV0d2VlbiBmcmFtZXdvcmsgYW5kIEhJREwgdmFsdWVzCisgICAgICovCisgICAgc3RhdGljIGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBtYXBUb1BpeGVsRm9ybWF0KGludCBmcmFtZXdvcmtGb3JtYXQpOworICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzIG1hcFRvSGlkbERhdGFzcGFjZSgKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSk7CisgICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyBtYXBUb0NvbnN1bWVyVXNhZ2UodWludDY0X3QgdXNhZ2UpOworICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uIG1hcFRvU3RyZWFtUm90YXRpb24oCisgICAgICAgICAgICBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOworICAgIC8vIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZSBwYXNzZWQtaW4gb3BlcmF0aW9uIG1vZGUgaXMgbm90IHZhbGlkLgorICAgIHN0YXRpYyBzdGF0dXNfdCBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Qgb3BlcmF0aW9uTW9kZSwKKyAgICAgICAgICAgIC8qb3V0Ki8gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSk7CisgICAgc3RhdGljIGludCBtYXBUb0ZyYW1ld29ya0Zvcm1hdChoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgcGl4ZWxGb3JtYXQpOworICAgIHN0YXRpYyBhbmRyb2lkX2RhdGFzcGFjZSBtYXBUb0ZyYW1ld29ya0RhdGFzcGFjZSgKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3MpOworICAgIHN0YXRpYyB1aW50NjRfdCBtYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2UoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOworICAgIHN0YXRpYyB1aW50NjRfdCBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2UoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOworCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrCisgICAgICovCisKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCgKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgb3ZlcnJpZGU7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgb3ZlcnJpZGU7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBub3RpZnkoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnPiYgbXNncykgb3ZlcnJpZGU7CisKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICAgICAgcmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIG92ZXJyaWRlOworCisgICAgLy8gSGFuZGxlIG9uZSBub3RpZnkgbWVzc2FnZQorICAgIHZvaWQgbm90aWZ5KGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnJiBtc2cpOworCisgICAgc3RhdHVzX3Qgc3dpdGNoVG9PZmZsaW5lKGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAorICAgICAgICAgICAgLypvdXQqLyBzcDxDYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2U+KiBzZXNzaW9uKSBvdmVycmlkZTsKKworICAgIHVzaW5nIFJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47CisKKyAgICBjbGFzcyBIaWRsSGFsSW50ZXJmYWNlIDogcHVibGljIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZSB7CisgICAgIHB1YmxpYzoKKyAgICAgICAgSGlkbEhhbEludGVyZmFjZShzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAmc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsIGJvb2wgc3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKTsKKworICAgICAgICB2aXJ0dWFsIElQQ1RyYW5zcG9ydCBnZXRUcmFuc3BvcnRUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gSVBDVHJhbnNwb3J0OjpISURMOyB9CisgICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBjb25zdHJ1Y3RlZCB3aXRoIGEgdmFsaWQgZGV2aWNlIG9yIHNlc3Npb24sIGFuZCBub3QgeWV0IGNsZWFyZWQKKyAgICAgICAgdmlydHVhbCBib29sIHZhbGlkKCkgb3ZlcnJpZGU7CisKKyAgICAgICAgLy8gUmVzZXQgdGhpcyBIYWxJbnRlcmZhY2Ugb2JqZWN0IChkb2VzIG5vdCBjYWxsIGNsb3NlKCkpCisgICAgICAgIHZpcnR1YWwgdm9pZCBjbGVhcigpIG92ZXJyaWRlOworCisgICAgICAgIC8vIENhbGxzIGludG8gdGhlIEhBTCBpbnRlcmZhY2UKKworICAgICAgICAvLyBDYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHJlcXVlc3RUZW1wbGF0ZQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MoY2FtZXJhX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgICAgICAvKm91dCovIGNhbWVyYV9tZXRhZGF0YV90ICoqcmVxdWVzdFRlbXBsYXRlKSBvdmVycmlkZTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICAgICAgLyppbm91dCovIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl90ICpjb25maWcsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcykgb3ZlcnJpZGU7CisKKyAgICAgICAgLy8gVGhlIGluamVjdGlvbiBjYW1lcmEgY29uZmlndXJlcyB0aGUgc3RyZWFtcyB0byBoYWwuCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlSW5qZWN0ZWRTdHJlYW1zKAorICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBzZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIC8qaW5vdXQqLyBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdCogY29uZmlnLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMsCisgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNhbWVyYUNoYXJhY3RlcmlzdGljcykgb3ZlcnJpZGU7CisKKyAgICAgICAgLy8gV2hlbiB0aGUgY2FsbCBzdWNjZWVkcywgdGhlIG93bmVyc2hpcCBvZiBhY3F1aXJlIGZlbmNlcyBpbiByZXF1ZXN0cyBpcyB0cmFuc2ZlcnJlZCB0bworICAgICAgICAvLyBIYWxJbnRlcmZhY2UuIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIHNlbmQgdGhlIGZlbmNlIHRvCisgICAgICAgIC8vIEhBTCBwcm9jZXNzIGFuZCBjbG9zZSB0aGUgRkQgaW4gY2FtZXJhc2VydmVyIHByb2Nlc3MuIFdoZW4gdGhlIGNhbGwgZmFpbHMsIHRoZSBvd25lcnNoaXAKKyAgICAgICAgLy8gb2YgdGhlIGFjcXVpcmUgZmVuY2Ugc3RpbGwgYmVsb25ncyB0byB0aGUgY2FsbGVyLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cygKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QqPiYgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgLypvdXQqL3VpbnQzMl90KiBudW1SZXF1ZXN0UHJvY2Vzc2VkKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpIG92ZXJyaWRlOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcykgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKENhbWVyYU1ldGFkYXRhJiBvbGRTZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhJiBuZXdTZXNzaW9uUGFyYW1zKSBvdmVycmlkZTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlcGVhdGluZ1JlcXVlc3RFbmQodWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gJnN0cmVhbUlkcykgb3ZlcnJpZGU7CisKKyAgICAgICAgc3RhdHVzX3Qgc3dpdGNoVG9PZmZsaW5lKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgc3RyZWFtc1RvS2VlcCwKKyAgICAgICAgLypvdXQqL2hhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6Q2FtZXJhT2ZmbGluZVNlc3Npb25JbmZvKiBvZmZsaW5lU2Vzc2lvbkluZm8sCisgICAgICAgIC8qb3V0Ki9zcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qIG9mZmxpbmVTZXNzaW9uLAorICAgICAgICAvKm91dCovY2FtZXJhMzo6QnVmZmVyUmVjb3JkcyogYnVmZmVyUmVjb3Jkcyk7CisKKyAgICAgcHJpdmF0ZToKKworICAgICAgICAvLyBBbHdheXMgdmFsaWQKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uOworICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy4zIG9yIG5ld2VyCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMzo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzM7CisgICAgICAgIC8vIFZhbGlkIGlmIElDYW1lcmFEZXZpY2VTZXNzaW9uIGlzIEAzLjQgb3IgbmV3ZXIKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfNDsKKyAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuNSBvciBuZXdlcgorICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM181OworICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy42IG9yIG5ld2VyCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzY7CisgICAgICAgIC8vIFZhbGlkIGlmIElDYW1lcmFEZXZpY2VTZXNzaW9uIGlzIEAzLjcgb3IgbmV3ZXIKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfNzsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZTsKKworICAgICAgICAvLyBUaGUgb3V0cHV0IEhJREwgcmVxdWVzdCBzdGlsbCBkZXBlbmRzIG9uIGlucHV0IGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdAorICAgICAgICAvLyBEbyBub3QgZnJlZSBpbnB1dCBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QgYmVmb3JlIG91dHB1dCBISURMIHJlcXVlc3QKKyAgICAgICAgc3RhdHVzX3Qgd3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90KiBpbiwKKyAgICAgICAgICAgICAgICAvKm91dCovaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogb3V0LAorICAgICAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQsCisgICAgICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIGluZmxpZ2h0QnVmZmVycyk7CisgICAgfTsgLy8gY2xhc3MgSGlkbEhhbEludGVyZmFjZQorCisgICAgY2xhc3MgSGlkbFJlcXVlc3RUaHJlYWQgOiBwdWJsaWMgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZCB7CisgICAgICBwdWJsaWM6CisgICAgICAgIEhpZGxSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKKyAgICAgICAgICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAorICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCisgICAgICAgICAgICAgICAgYm9vbCBzdXBwb3J0Q2FtZXJhTXV0ZSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3dpdGNoVG9PZmZsaW5lKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzdHJlYW1zVG9LZWVwLAorICAgICAgICAgICAgICAgIC8qb3V0Ki9oYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OkNhbWVyYU9mZmxpbmVTZXNzaW9uSW5mbyogb2ZmbGluZVNlc3Npb25JbmZvLAorICAgICAgICAgICAgICAgIC8qb3V0Ki9zcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzY6OklDYW1lcmFPZmZsaW5lU2Vzc2lvbj4qIG9mZmxpbmVTZXNzaW9uLAorICAgICAgICAgICAgICAgIC8qb3V0Ki9jYW1lcmEzOjpCdWZmZXJSZWNvcmRzKiBidWZmZXJSZWNvcmRzKTsKKyAgICB9OyAvLyBjbGFzcyBIaWRsUmVxdWVzdFRocmVhZAorCisgICAgY2xhc3MgSGlkbENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzIDogcHVibGljIENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzIHsKKyAgICAgcHVibGljOgorICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBpbmplY3Rpb24gY2FtZXJhIGFuZCBnZW5lcmF0ZSBhbiBoYWwgaW50ZXJmYWNlLgorICAgICAgICBzdGF0dXNfdCBpbmplY3Rpb25Jbml0aWFsaXplKAorICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGluamVjdGVkQ2FtSWQsIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKKyAgICAgICAgICAgICAgICBjb25zdCBzcDwKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yIDo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2spOworICAgICAgICBIaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50KSA6CisgICAgICAgICAgICAgICAgQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMocGFyZW50KSB7IH07CisgICAgICAgIH5IaWRsQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMoKSB7fQorICAgICBwcml2YXRlOgorICAgICAgICAvLyBCYWNrdXAgb2YgdGhlIG9yaWdpbmFsIGNhbWVyYSBoYWwgcmVzdWx0IEZNUS4KKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+IG1CYWNrdXBSZXN1bHRNZXRhZGF0YVF1ZXVlOworCisgICAgICAgIC8vIEZNUSB3cml0ZXMgdGhlIHJlc3VsdCBmb3IgdGhlIGluamVjdGlvbiBjYW1lcmEuIE11c3QgYmUgZ3VhcmRlZCBieQorICAgICAgICAvLyBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLgorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUluamVjdGlvblJlc3VsdE1ldGFkYXRhUXVldWU7CisKKyAgICAgICAgLy8gVXNlIGluamVjdGlvbiBjYW1lcmEgaGFsIGludGVyZmFjZSB0byByZXBsYWNlIGFuZCBiYWNrdXAgb3JpZ2luYWwKKyAgICAgICAgLy8gY2FtZXJhIGhhbCBpbnRlcmZhY2UuCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVwbGFjZUhhbEludGVyZmFjZShzcDxIYWxJbnRlcmZhY2U+IG5ld0hhbEludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBib29sIGtlZXBCYWNrdXApIG92ZXJyaWRlOworICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb3RpZnlNc2dUeXBlPgorICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gbm90aWZ5SGVscGVyKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPE5vdGlmeU1zZ1R5cGU+JiBtc2dzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5qZWN0aW9uQ2FtZXJhSW5pdGlhbGl6ZShjb25zdCBTdHJpbmc4ICZpbmplY3RDYW1JZCwKKyAgICAgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHNwPFJlcXVlc3RUaHJlYWQ+IGNyZWF0ZU5ld1JlcXVlc3RUaHJlYWQod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50LAorICAgICAgICAgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCisgICAgICAgICAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwKKyAgICAgICAgICAgICAgICBib29sIHN1cHBvcnRDYW1lcmFNdXRlKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3A8Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM+CisgICAgICAgICAgICBjcmVhdGVDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcyh3cDxDYW1lcmEzRGV2aWNlPikgb3ZlcnJpZGU7CisKKyAgICAvLyBGTVEgdG8gd3JpdGUgcmVzdWx0IG9uLiBNdXN0IGJlIGd1YXJkZWQgYnkgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gbVJlc3VsdE1ldGFkYXRhUXVldWU7CisKK307IC8vIGNsYXNzIEhpZGxDYW1lcmEzRGV2aWNlCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOTdmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5jcHAKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkhpZGwtQ2FtZXJhMy1PZmZMblNzbiIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorCisjaW5jbHVkZSAiZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24uaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCIKKyNpbmNsdWRlICJkZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPdXRwdXRVdGlscy5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVHJhY2VzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6fkhpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24oKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiJXM6IFRlYXJpbmcgZG93biBoaWRsIG9mZmxpbmUgc2Vzc2lvbiBmb3IgY2FtZXJhIGlkICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOworICAgIEhpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246OmRpc2Nvbm5lY3RTZXNzaW9uKCk7Cit9CisKK3N0YXR1c190IEhpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246OmluaXRpYWxpemUod3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIGlmIChtU2Vzc2lvbiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogSElETCBzZXNzaW9uIGlzIG51bGwhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworCisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworCisgICAgICAgIC8vIHNldHVwIHJlc3VsdCBGTVEKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+JiByZXNRdWV1ZSA9IG1SZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgICAgICBhdXRvIHJlc3VsdFF1ZXVlUmV0ID0gbVNlc3Npb24tPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAorICAgICAgICAgICAgWyZyZXNRdWV1ZV0oY29uc3QgYXV0byYgZGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgIHJlc1F1ZXVlID0gc3RkOjptYWtlX3VuaXF1ZTxSZXN1bHRNZXRhZGF0YVF1ZXVlPihkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlc1F1ZXVlLT5pc1ZhbGlkKCkgfHwgcmVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJIQUwgcmV0dXJucyBlbXB0eSByZXN1bHQgbWV0YWRhdGEgZm1xLCBub3QgdXNlIGl0Iik7CisgICAgICAgICAgICAgICAgICAgIHJlc1F1ZXVlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgdXNlIHJlc1F1ZXVlIG9ud2FyZHMuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghcmVzdWx0UXVldWVSZXQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSBmcm9tIGNhbWVyYSBzZXNzaW9uOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFF1ZXVlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICAgICAgbVN0YXR1cyA9IFNUQVRVU19BQ1RJVkU7CisgICAgfQorCisgICAgbVNlc3Npb24tPnNldENhbGxiYWNrKHRoaXMpOworCisgICAgcmV0dXJuIE9LOworfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246OnByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCgKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIHsKKyAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIH0KKworICAgIEhpZGxDYXB0dXJlT3V0cHV0U3RhdGVzIHN0YXRlcyB7CisgICAgICB7bUlkLAorICAgICAgICBtT2ZmbGluZVJlcXNMb2NrLCBtTGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlciwKKyAgICAgICAgbUxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlciwgbUxhc3RDb21wbGV0ZWRac2xGcmFtZU51bWJlciwKKyAgICAgICAgbU9mZmxpbmVSZXFzLCBtT3V0cHV0TG9jaywgbVJlc3VsdFF1ZXVlLCBtUmVzdWx0U2lnbmFsLAorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIsCisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKKyAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsCisgICAgICAgIG1CdWZmZXJSZWNvcmRzLCAvKmxlZ2FjeUNsaWVudCovIGZhbHNlLCBtTWluRXhwZWN0ZWREdXJhdGlvbn0sIG1SZXN1bHRNZXRhZGF0YVF1ZXVlCisgICAgfTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2spOworICAgIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0cykgeworICAgICAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZChzdGF0ZXMsIHJlc3VsdC52M18yLCByZXN1bHQucGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgfQorICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246OnByb2Nlc3NDYXB0dXJlUmVzdWx0KAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgeworICAgIC8vIFRPRE86IGNoYW5nZWQgaW1wbCB0byBjYWxsIGludG8gcHJvY2Vzc0NhcHR1cmVSZXN1bHRfM180IGluc3RlYWQ/CisgICAgLy8gICAgICAgbWlnaHQgbmVlZCB0byBmaWd1cmUgaG93IHRvIHJlZHVjZSBjb3B5IHRob3VnaC4KKyAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIH0KKworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+IG5vUGh5c01ldGFkYXRhOworCisgICAgSGlkbENhcHR1cmVPdXRwdXRTdGF0ZXMgc3RhdGVzIHsKKyAgICAgIHttSWQsCisgICAgICAgIG1PZmZsaW5lUmVxc0xvY2ssIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAorICAgICAgICBtTGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyLCBtTGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyLAorICAgICAgICBtT2ZmbGluZVJlcXMsIG1PdXRwdXRMb2NrLCBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCisgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKKyAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAorICAgICAgICBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCisgICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywKKyAgICAgICAgbUJ1ZmZlclJlY29yZHMsIC8qbGVnYWN5Q2xpZW50Ki8gZmFsc2UsIG1NaW5FeHBlY3RlZER1cmF0aW9ufSwgbVJlc3VsdE1ldGFkYXRhUXVldWUKKyAgICB9OworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jayk7CisgICAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzKSB7CisgICAgICAgIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKHN0YXRlcywgcmVzdWx0LCBub1BoeXNNZXRhZGF0YSk7CisgICAgfQorICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb246Om5vdGlmeSgKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnPiYgbXNncykgeworICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1TdGF0dXMgIT0gU1RBVFVTX0FDVElWRSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBpbiB3cm9uZyBzdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgbVN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgfQorCisgICAgSGlkbENhcHR1cmVPdXRwdXRTdGF0ZXMgc3RhdGVzIHsKKyAgICAgIHttSWQsCisgICAgICAgIG1PZmZsaW5lUmVxc0xvY2ssIG1MYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyLAorICAgICAgICBtTGFzdENvbXBsZXRlZFJlcHJvY2Vzc0ZyYW1lTnVtYmVyLCBtTGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyLAorICAgICAgICBtT2ZmbGluZVJlcXMsIG1PdXRwdXRMb2NrLCBtUmVzdWx0UXVldWUsIG1SZXN1bHRTaWduYWwsCisgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLAorICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKKyAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAorICAgICAgICBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCisgICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywKKyAgICAgICAgbUJ1ZmZlclJlY29yZHMsIC8qbGVnYWN5Q2xpZW50Ki8gZmFsc2UsIG1NaW5FeHBlY3RlZER1cmF0aW9ufSwgbVJlc3VsdE1ldGFkYXRhUXVldWUKKyAgICB9OworICAgIGZvciAoY29uc3QgYXV0byYgbXNnIDogbXNncykgeworICAgICAgICBjYW1lcmEzOjpub3RpZnkoc3RhdGVzLCBtc2cpOworICAgIH0KKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSB7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBSZXF1ZXN0QnVmZmVyU3RhdGVzIHN0YXRlcyB7CisgICAgICAgIG1JZCwgbVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLAorICAgICAgICAqdGhpcywgbUJ1ZmZlclJlY29yZHMsICp0aGlzfTsKKyAgICBjYW1lcmEzOjpyZXF1ZXN0U3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZlJlcXMsIF9oaWRsX2NiKTsKKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uOjpyZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtU3RhdHVzICE9IFNUQVRVU19BQ1RJVkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBSZXR1cm5CdWZmZXJTdGF0ZXMgc3RhdGVzIHsKKyAgICAgICAgbUlkLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBtQnVmZmVyUmVjb3Jkc307CisKKyAgICBjYW1lcmEzOjpyZXR1cm5TdHJlYW1CdWZmZXJzKHN0YXRlcywgYnVmZmVycyk7CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK3ZvaWQgSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbjo6ZGlzY29ubmVjdFNlc3Npb24oKSB7CisgIC8vIFRPRE86IE1ha2Ugc3VyZSB0aGlzIGxvY2tpbmcgaXMgY29ycmVjdC4KKyAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICBpZiAobVNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgbVNlc3Npb24tPmNsb3NlKCk7CisgIH0KKyAgbVNlc3Npb24uY2xlYXIoKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5N2NjNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfSElETF9DQU1FUkEzT0ZGTElORVNFU1NJT05fSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfSElETF9DQU1FUkEzT0ZGTElORVNFU1NJT05fSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy42L0lDYW1lcmFPZmZsaW5lU2Vzc2lvbi5oPgorCisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorCisjaW5jbHVkZSAiSGlkbENhbWVyYTNPdXRwdXRVdGlscy5oIgorI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UuaCIKKworI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIgorI2luY2x1ZGUgImRldmljZTMvSW5GbGlnaHRSZXF1ZXN0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGNhbWVyYTMgeworCitjbGFzcyBDYW1lcmEzU3RyZWFtOworY2xhc3MgQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZTsKK2NsYXNzIENhbWVyYTNTdHJlYW1JbnRlcmZhY2U7CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKKworLyoqCisgKiBIaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uIGZvciBvZmZsaW5lIHNlc3Npb24gZGVmaW5lZCBpbiBISURMIElDYW1lcmFPZmZsaW5lU2Vzc2lvbkAzLjYgb3IgaGlnaGVyCisgKi8KK2NsYXNzIEhpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24gOgorICAgICAgICAgICAgcHVibGljIENhbWVyYTNPZmZsaW5lU2Vzc2lvbiwKKyAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrIHsKKyAgcHVibGljOgorCisgICAgLy8gaW5pdGlhbGl6ZSBieSBDYW1lcmEzRGV2aWNlLgorICAgIGV4cGxpY2l0IEhpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24oY29uc3QgU3RyaW5nOCYgaWQsCisgICAgICAgICAgICBjb25zdCBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiYgaW5wdXRTdHJlYW0sCisgICAgICAgICAgICBjb25zdCBjYW1lcmEzOjpTdHJlYW1TZXQmIG9mZmxpbmVTdHJlYW1TZXQsCisgICAgICAgICAgICBjYW1lcmEzOjpCdWZmZXJSZWNvcmRzJiYgYnVmZmVyUmVjb3JkcywKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYTM6OkluRmxpZ2h0UmVxdWVzdE1hcCYgb2ZmbGluZVJlcXMsCisgICAgICAgICAgICBjb25zdCBDYW1lcmEzT2ZmbGluZVN0YXRlcyYgb2ZmbGluZVN0YXRlcywKKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPiBvZmZsaW5lU2Vzc2lvbikgOgorICAgICAgQ2FtZXJhM09mZmxpbmVTZXNzaW9uKGlkLCBpbnB1dFN0cmVhbSwgb2ZmbGluZVN0cmVhbVNldCwgc3RkOjptb3ZlKGJ1ZmZlclJlY29yZHMpLAorICAgICAgICAgICAgICBvZmZsaW5lUmVxcywgb2ZmbGluZVN0YXRlcyksCisgICAgICBtU2Vzc2lvbihvZmZsaW5lU2Vzc2lvbikge307CisKKyAgICB2aXJ0dWFsIH5IaWRsQ2FtZXJhM09mZmxpbmVTZXNzaW9uKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUod3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEhJREwgSUNhbWVyYURldmljZUNhbGxiYWNrIGludGVyZmFjZQorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrCisgICAgICovCisKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCgKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgb3ZlcnJpZGU7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgb3ZlcnJpZGU7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBub3RpZnkoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnPiYgbXNncykgb3ZlcnJpZGU7CisKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICAgICAgcmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogRW5kIG9mIENhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZSBpbnRlcmZhY2UKKyAgICAgKi8KKworICBwcml2YXRlOgorICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNjo6SUNhbWVyYU9mZmxpbmVTZXNzaW9uPiBtU2Vzc2lvbjsKKyAgICAvLyBGTVEgdG8gd3JpdGUgcmVzdWx0IG9uLiBNdXN0IGJlIGd1YXJkZWQgYnkgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gbVJlc3VsdE1ldGFkYXRhUXVldWU7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdFNlc3Npb24oKSBvdmVycmlkZTsKK307IC8vIGNsYXNzIENhbWVyYTNPZmZsaW5lU2Vzc2lvbgorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM091dHB1dFV0aWxzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM091dHB1dFV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjBjZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzT3V0cHV0VXRpbHMuY3BwCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJIaWRsQ2FtZXJhMy1PdXRwdXRVdGlscyIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorLy8gQ29udmVuaWVuY2UgbWFjcm9zIGZvciB0cmFuc2l0aW9uaW5nIHRvIHRoZSBlcnJvciBzdGF0ZQorI2RlZmluZSBTRVRfRVJSKGZtdCwgLi4uKSBzdGF0ZXMuc2V0RXJySW50Zi5zZXRFcnJvclN0YXRlKCAgIFwKKyAgICAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAjI19fVkFfQVJHU19fKQorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvSUNhbWVyYURldmljZVNlc3Npb24uaD4KKworI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFVdGlscy5oPgorI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KKworI2luY2x1ZGUgImRldmljZTMvaGlkbC9IaWRsQ2FtZXJhM091dHB1dFV0aWxzLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzT3V0cHV0VXRpbHMuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlsc1RlbXBsYXRlZC5oIgorCisjaW5jbHVkZSAic3lzdGVtL2NhbWVyYV9tZXRhZGF0YS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK3ZvaWQgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoCisgICAgICAgIEhpZGxDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0LAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiAmcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSkgeworICAgIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkVDxIaWRsQ2FwdHVyZU91dHB1dFN0YXRlcywKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0LAorICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiwKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+LCBSZXN1bHRNZXRhZGF0YVF1ZXVlLAorICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1cz4oc3RhdGVzLCByZXN1bHQsIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworfQorCit2b2lkIG5vdGlmeShDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnJiBtc2cpIHsKKworICAgIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6TXNnVHlwZTsKKyAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkVycm9yQ29kZTsKKworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgY2FtZXJhX25vdGlmeV9tc2cgbTsKKyAgICBzd2l0Y2ggKG1zZy50eXBlKSB7CisgICAgICAgIGNhc2UgTXNnVHlwZTo6RVJST1I6CisgICAgICAgICAgICBtLnR5cGUgPSBDQU1FUkFfTVNHX0VSUk9SOworICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciA9IG1zZy5tc2cuZXJyb3IuZnJhbWVOdW1iZXI7CisgICAgICAgICAgICBpZiAobXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkID49IDApIHsKKyAgICAgICAgICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzLm91dHB1dFN0cmVhbXMuZ2V0KG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgZXJyb3Igc3RyZWFtIGlkICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIsIG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy5tc2cuZXJyb3IuZXJyb3JDb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkVSUk9SX0RFVklDRToKKyAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX0RFVklDRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkVSUk9SX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gQ0FNRVJBX01TR19FUlJPUl9SRVFVRVNUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6RVJST1JfUkVTVUxUOgorICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQV9NU0dfRVJST1JfUkVTVUxUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6RVJST1JfQlVGRkVSOgorICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQV9NU0dfRVJST1JfQlVGRkVSOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1zZ1R5cGU6OlNIVVRURVI6CisgICAgICAgICAgICBtLnR5cGUgPSBDQU1FUkFfTVNHX1NIVVRURVI7CisgICAgICAgICAgICBtLm1lc3NhZ2Uuc2h1dHRlci5mcmFtZV9udW1iZXIgPSBtc2cubXNnLnNodXR0ZXIuZnJhbWVOdW1iZXI7CisgICAgICAgICAgICBtLm1lc3NhZ2Uuc2h1dHRlci50aW1lc3RhbXAgPSBtc2cubXNnLnNodXR0ZXIudGltZXN0YW1wOworICAgICAgICAgICAgbS5tZXNzYWdlLnNodXR0ZXIucmVhZG91dF90aW1lc3RhbXAgPSAwTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgbm90aWZ5KHN0YXRlcywgJm0pOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0VG9BaWRsKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgaGlkbEJ1ZlJlcXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdD4gJmFpZGxCdWZSZXFzKSB7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGFpZGxCdWZSZXFzLnJlc2l6ZShoaWRsQnVmUmVxcy5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmaGlkbEJ1ZlJlcSA6IGhpZGxCdWZSZXFzKSB7CisgICAgICAgIGFpZGxCdWZSZXFzW2ldLnN0cmVhbUlkID0gaGlkbEJ1ZlJlcS5zdHJlYW1JZDsKKyAgICAgICAgYWlkbEJ1ZlJlcXNbaV0ubnVtQnVmZmVyc1JlcXVlc3RlZCA9IGhpZGxCdWZSZXEubnVtQnVmZmVyc1JlcXVlc3RlZDsKKyAgICAgICAgaSsrOworICAgIH0KK30KKworc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yCitjb252ZXJ0VG9IaWRsKGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yIGFFcnJvcikgeworICAgIHVzaW5nIEFFcnJvciA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOworICAgIHVzaW5nIEhFcnJvciA9IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOworCisgICAgc3dpdGNoKGFFcnJvcikgeworICAgICAgICBjYXNlIEFFcnJvcjo6Tk9fQlVGRkVSX0FWQUlMQUJMRToKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3I6Ok5PX0JVRkZFUl9BVkFJTEFCTEU7CisgICAgICAgIGNhc2UgQUVycm9yOjpNQVhfQlVGRkVSX0VYQ0VFREVEOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvcjo6TUFYX0JVRkZFUl9FWENFRURFRDsKKyAgICAgICAgY2FzZSBBRXJyb3I6OlNUUkVBTV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yOjpTVFJFQU1fRElTQ09OTkVDVEVEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvcjo6VU5LTk9XTl9FUlJPUjsKKyAgICB9Cit9CisKK3N0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3RTdGF0dXMKK2NvbnZlcnRUb0hpZGwoY29uc3QgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJSZXF1ZXN0U3RhdHVzICZhQnVmU3RhdHVzKSB7CisgICAgdXNpbmcgQVN0YXR1cyA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6QnVmZmVyUmVxdWVzdFN0YXR1czsKKyAgICB1c2luZyBIU3RhdHVzID0gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0U3RhdHVzOworICAgIHN3aXRjaCAoYUJ1ZlN0YXR1cykgeworICAgICAgICBjYXNlIEFTdGF0dXM6Ok9LOgorICAgICAgICAgICAgcmV0dXJuIEhTdGF0dXM6Ok9LOworICAgICAgICBjYXNlIEFTdGF0dXM6OkZBSUxFRF9QQVJUSUFMOgorICAgICAgICAgICAgcmV0dXJuIEhTdGF0dXM6OkZBSUxFRF9QQVJUSUFMOworICAgICAgICBjYXNlIEFTdGF0dXM6OkZBSUxFRF9DT05GSUdVUklORzoKKyAgICAgICAgICAgIHJldHVybiBIU3RhdHVzOjpGQUlMRURfQ09ORklHVVJJTkc7CisgICAgICAgIGNhc2UgQVN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTOgorICAgICAgICAgICAgcmV0dXJuIEhTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUzsKKyAgICAgICAgY2FzZSBBU3RhdHVzOjpGQUlMRURfVU5LTk9XTjoKKyAgICAgICAgICAgIHJldHVybiBIU3RhdHVzOjpGQUlMRURfVU5LTk9XTjsKKyAgICB9CisgICAgcmV0dXJuIEhTdGF0dXM6OkZBSUxFRF9VTktOT1dOOworfQorCitzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJTdGF0dXMKK2NvbnZlcnRUb0hpZGwoY29uc3QgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJTdGF0dXMgJmFCdWZTdGF0dXMpIHsKKyAgICB1c2luZyBBU3RhdHVzID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpCdWZmZXJTdGF0dXM7CisgICAgdXNpbmcgSFN0YXR1cyA9IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzOworICAgIHN3aXRjaCAoYUJ1ZlN0YXR1cykgeworICAgICAgICBjYXNlIEFTdGF0dXM6Ok9LOgorICAgICAgICAgICAgcmV0dXJuIEhTdGF0dXM6Ok9LOworICAgICAgICBjYXNlIEFTdGF0dXM6OkVSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEhTdGF0dXM6OkVSUk9SOworICAgIH0KKyAgICByZXR1cm4gSFN0YXR1czo6RVJST1I7Cit9CisKK3N0YXRpYyBuYXRpdmVfaGFuZGxlX3QgKmNvbnZlcnRUb0hpZGwoY29uc3QgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlICZhaCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90ICo+ICZoYW5kbGVzQ3JlYXRlZCkgeworICAgIGlmIChpc0hhbmRsZU51bGwoYWgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBuYXRpdmVfaGFuZGxlX3QgKm5oID0gbWFrZUZyb21BaWRsKGFoKTsKKyAgICBoYW5kbGVzQ3JlYXRlZC5lbXBsYWNlX2JhY2sobmgpOworICAgIHJldHVybiBuaDsKK30KKworc3RhdGljIHZvaWQgY29udmVydFRvSGlkbCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1CdWZmZXI+ICZhQnVmZmVycywKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJzVmFsICZoQnVmZmVyc1ZhbCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90ICo+ICZoYW5kbGVzQ3JlYXRlZCkgeworICAgIHVzaW5nIEhTdHJlYW1CdWZmZXIgPSBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcjsKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8SFN0cmVhbUJ1ZmZlcj4gdG1wQnVmZmVycyhhQnVmZmVycy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmFCdWYgOiBhQnVmZmVycykgeworICAgICAgICB0bXBCdWZmZXJzW2ldLnN0YXR1cyA9IGNvbnZlcnRUb0hpZGwoYUJ1Zi5zdGF0dXMpOworICAgICAgICB0bXBCdWZmZXJzW2ldLnN0cmVhbUlkID0gYUJ1Zi5zdHJlYW1JZDsKKyAgICAgICAgdG1wQnVmZmVyc1tpXS5idWZmZXJJZCA9IGFCdWYuYnVmZmVySWQ7CisgICAgICAgIHRtcEJ1ZmZlcnNbaV0uYnVmZmVyID0gY29udmVydFRvSGlkbChhQnVmLmJ1ZmZlciwgaGFuZGxlc0NyZWF0ZWQpOworICAgICAgICB0bXBCdWZmZXJzW2ldLmFjcXVpcmVGZW5jZSA9IGNvbnZlcnRUb0hpZGwoYUJ1Zi5hY3F1aXJlRmVuY2UsIGhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgdG1wQnVmZmVyc1tpXS5yZWxlYXNlRmVuY2UgPSBjb252ZXJ0VG9IaWRsKGFCdWYucmVsZWFzZUZlbmNlLCBoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgaEJ1ZmZlcnNWYWwuYnVmZmVycyhzdGQ6Om1vdmUodG1wQnVmZmVycykpOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0VG9IaWRsKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4gJmFpZGxCdWZSZXRzLAorICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJSZXQ+ICZoaWRsQnVmUmV0cywKKyAgICAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90ICo+ICZoYW5kbGVzQ3JlYXRlZCkgeworICAgIHNpemVfdCBpID0gMDsKKyAgICB1c2luZyBUYWcgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlcnNWYWw6OlRhZzsKKyAgICBoaWRsQnVmUmV0cy5yZXNpemUoYWlkbEJ1ZlJldHMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmFpZGxCdWZSZXQgOiBhaWRsQnVmUmV0cykgeworICAgICAgICBhdXRvICZoaWRsQnVmUmV0ID0gaGlkbEJ1ZlJldHNbaV07CisgICAgICAgIGhpZGxCdWZSZXQuc3RyZWFtSWQgPSBhaWRsQnVmUmV0LnN0cmVhbUlkOworICAgICAgICBzd2l0Y2goYWlkbEJ1ZlJldC52YWwuZ2V0VGFnKCkpIHsKKyAgICAgICAgICBjYXNlIFRhZzo6ZXJyb3I6CisgICAgICAgICAgICAgIGhpZGxCdWZSZXQudmFsLmVycm9yKGNvbnZlcnRUb0hpZGwoYWlkbEJ1ZlJldC52YWwuZ2V0PFRhZzo6ZXJyb3I+KCkpKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBUYWc6OmJ1ZmZlcnM6CisgICAgICAgICAgICAgIGNvbnZlcnRUb0hpZGwoYWlkbEJ1ZlJldC52YWwuZ2V0PFRhZzo6YnVmZmVycz4oKSwgaGlkbEJ1ZlJldC52YWwsIGhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KK30KKworLy8gVGhlIGJ1ZmZlcnMgcmVxdWVzdGVkIHRocm91Z2ggdGhpcyBjYWxsIGFyZSBub3QgdGllZCB0byBhbnkgQ2FwdHVyZVJlcXVlc3QgaW4KKy8vIHBhcnRpY3VsYXIuIFRoZXkgbWF5IHVzZWQgYnkgdGhlIGhhbCBmb3IgYSBwYXJ0aWN1bGFyIGZyYW1lJ3Mgb3V0cHV0IGJ1ZmZlcgorLy8gb3IgZm9yIGl0cyBpbnRlcm5hbCB1c2UgYXMgd2VsbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgaGFsIGRvZXMgdXNlIGFueSBidWZmZXIKKy8vIGZyb20gdGhlIHJlcXVlc3RlZCBsaXN0IGhlcmUsIGZvciBhIHBhcnRpY3VsYXIgZnJhbWUncyBvdXRwdXQgYnVmZmVyLCB0aGUKKy8vIGJ1ZmZlciB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIHByb2Nlc3NDYXB0dXJlUmVzdWx0IGNhbGwgY29ycmVzcG9uZGluZyB0bworLy8gdGhlIGZyYW1lLiBUaGUgb3RoZXIgYnVmZmVycyB3aWxsIGJlIHJldHVybmVkIHRocm91Z2ggcmV0dXJuU3RyZWFtQnVmZmVycy4KKy8vIFRoZSBidWZmZXJzIHJldHVybmVkIHZpYSByZXR1cm5TdHJlYW1CdWZmZXJzIHdpbGwgbm90IGhhdmUgYSB2YWxpZAorLy8gdGltZXN0YW1wKDApIGFuZCB3aWxsIGJlIGRyb3BwZWQgYnkgdGhlIGJ1ZmZlcnF1ZXVlLgordm9pZCByZXF1ZXN0U3RyZWFtQnVmZmVycyhSZXF1ZXN0QnVmZmVyU3RhdGVzJiBzdGF0ZXMsCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjazo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IgX2hpZGxfY2IpIHsKKyAgIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzOworICAgIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQnVmZmVyOworICAgIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdFN0YXR1czsKKyAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OlN0cmVhbUJ1ZmZlclJldDsKKyAgICB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OlN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjsKKyAgICBzdGQ6OnZlY3RvcjxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3Q+IGFpZGxCdWZSZXFzOworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OlN0cmVhbUJ1ZmZlclJldD4gaGlkbEJ1ZlJldHM7CisgICAgY29udmVydFRvQWlkbChidWZSZXFzLCBhaWRsQnVmUmVxcyk7CisgICAgc3RkOjp2ZWN0b3I8OjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbUJ1ZmZlclJldD4gYWlkbEJ1ZlJldHM7CisgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OkJ1ZmZlclJlcXVlc3RTdGF0dXMgYWlkbEJ1ZlJldFN0YXR1czsKKworICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzKHN0YXRlcywgYWlkbEJ1ZlJlcXMsICZhaWRsQnVmUmV0cywgJmFpZGxCdWZSZXRTdGF0dXMpOworICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCAqPiBoYW5kbGVzQ3JlYXRlZDsKKyAgICBjb252ZXJ0VG9IaWRsKGFpZGxCdWZSZXRzLCBoaWRsQnVmUmV0cywgaGFuZGxlc0NyZWF0ZWQpOworICAgIF9oaWRsX2NiKGNvbnZlcnRUb0hpZGwoYWlkbEJ1ZlJldFN0YXR1cyksIGhpZGxCdWZSZXRzKTsKKyAgICBDYW1lcmEzRGV2aWNlOjpjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQpOworfQorCit2b2lkIHJldHVyblN0cmVhbUJ1ZmZlcnMoUmV0dXJuQnVmZmVyU3RhdGVzJiBzdGF0ZXMsCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKKyAgICByZXR1cm5TdHJlYW1CdWZmZXJzVChzdGF0ZXMsIGJ1ZmZlcnMpOworfQorCit9IC8vIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvaGlkbC9IaWRsQ2FtZXJhM091dHB1dFV0aWxzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPdXRwdXRVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNmNiYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNPdXRwdXRVdGlscy5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19ISURMX0NBTUVSQTNfT1VUUFVUX1VUSUxTX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0hJRExfQ0FNRVJBM19PVVRQVVRfVVRJTFNfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKworI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgorCisjaW5jbHVkZSAiZGV2aWNlMy9CdWZmZXJVdGlscy5oIgorI2luY2x1ZGUgImRldmljZTMvSW5GbGlnaHRSZXF1ZXN0LmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBSZXN1bHRNZXRhZGF0YVF1ZXVlID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47CisKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2RzIHNoYXJlZCBiZXR3ZWVuIEhpZGxDYW1lcmEzRGV2aWNlL0hpZGxDYW1lcmEzT2ZmbGluZVNlc3Npb24gZm9yIEhBTCBjYWxsYmFja3MKKyAgICAgKi8KKyAgICAvLyBDYW1lcmEzRGV2aWNlL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbiBpbnRlcm5hbCBzdGF0ZXMgdXNlZCBpbiBub3RpZnkvcHJvY2Vzc0NhcHR1cmVSZXN1bHQKKyAgICAvLyBjYWxsYmFja3MKKyAgICBzdHJ1Y3QgSGlkbENhcHR1cmVPdXRwdXRTdGF0ZXMgOiBwdWJsaWMgQ2FwdHVyZU91dHB1dFN0YXRlcyB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiYgZm1xOworICAgIH07CisKKyAgICAvLyBIYW5kbGUgb25lIGNhcHR1cmUgcmVzdWx0LiBBc3N1bWUgY2FsbGVycyBob2xkIHRoZSBsb2NrIHRvIHNlcmlhbGl6ZSBhbGwKKyAgICAvLyBwcm9jZXNzQ2FwdHVyZVJlc3VsdCBjYWxscworICAgIHZvaWQgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoCisgICAgICAgICAgICBIaWRsQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0JiByZXN1bHQsCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisKKyAgICAvLyBIYW5kbGUgb25lIG5vdGlmeSBtZXNzYWdlCisgICAgdm9pZCBub3RpZnkoQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpOb3RpZnlNc2cmIG1zZyk7CisgICAgdm9pZCByZXF1ZXN0U3RyZWFtQnVmZmVycyhSZXF1ZXN0QnVmZmVyU3RhdGVzJiBzdGF0ZXMsCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrOjpyZXF1ZXN0U3RyZWFtQnVmZmVyc19jYgorICAgICAgICAgICAgICAgICAgICBfaGlkbF9jYik7CisgICAgdm9pZCByZXR1cm5TdHJlYW1CdWZmZXJzKFJldHVybkJ1ZmZlclN0YXRlcyYgc3RhdGVzLAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycyk7CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwCmluZGV4IGYwNjM1MDYuLjMzOTJkYjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcApAQCAtMTYsNyArMTYsNyBAQAogI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYS5oPgogCiAjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+Ci0jaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisjaW5jbHVkZSA8aGlkbC9VdGlscy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgZnJhbWV3b3JrcyB7CkBAIC0zNCw3ICszNCw3IEBACiAKIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKGNvbnN0IHNwPEhhbEludGVyZmFjZT4mIGJhc2UpIDogQ0Jhc2UoYmFzZSkgeyB9CiAKLWJvb2wgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjppbml0aWFsaXplTG9vcGVyKCkgeworYm9vbCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OmluaXRpYWxpemVMb29wZXIoaW50IHZuZGtWZXJzaW9uKSB7CiAgICAgbUNiTG9vcGVyID0gbmV3IEFMb29wZXI7CiAgICAgbUNiTG9vcGVyLT5zZXROYW1lKCJjcy1sb29wZXIiKTsKICAgICBzdGF0dXNfdCBlcnIgPSBtQ2JMb29wZXItPnN0YXJ0KC8qcnVuT25DYWxsaW5nVGhyZWFkKi8gZmFsc2UsIC8qY2FuQ2FsbEphdmEqLyBmYWxzZSwKQEAgLTQzLDcgKzQzLDcgQEAKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzdGFydCBjYW1lcmEgZGV2aWNlIGNhbGxiYWNrIGxvb3BlciIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcih0aGlzKTsKKyAgICBtSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIodGhpcywgdm5ka1ZlcnNpb24pOwogICAgIG1DYkxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTE0NCw2ICsxNDQsMTIgQEAKIAogICAgIC8vIENvbnZlcnQgTWV0YWRhdGEgaW50byBIQ2FtZXJhTWV0YWRhdGE7CiAgICAgRm1xU2l6ZU9yTWV0YWRhdGEgaFJlc3VsdDsKKyAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmZpbHRlclZuZGtLZXlzOworICAgIGlmIChmaWx0ZXJWbmRrS2V5cyhtVm5ka1ZlcnNpb24sIHJlc3VsdCwgLyppc1N0YXRpYyovZmFsc2UpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogZmlsdGVyaW5nIHZuZGsga2V5cyBmcm9tIHJlc3VsdCBmYWlsZWQsIG5vdCBzZW5kaW5nIG9uUmVzdWx0UmVjZWl2ZWQgY2FsbGJhY2siLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhID0gcmVzdWx0LmdldEFuZExvY2soKTsKICAgICBjb252ZXJ0ZXItPmNvbnZlcnRSZXN1bHRNZXRhZGF0YVRvSGlkbChyYXdNZXRhZGF0YSwgJmhSZXN1bHQpOwogICAgIHJlc3VsdC51bmxvY2socmF3TWV0YWRhdGEpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaAppbmRleCBkYmY1MjBhLi4xNTIwMDJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaApAQCAtNjEsNyArNjEsNyBAQAogCiAgICAgfkgyQkNhbWVyYURldmljZUNhbGxiYWNrcygpOwogCi0gICAgYm9vbCBpbml0aWFsaXplTG9vcGVyKCk7CisgICAgYm9vbCBpbml0aWFsaXplTG9vcGVyKGludCB2bmRrVmVyc2lvbik7CiAKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uRGV2aWNlRXJyb3IoaW50MzJfdCBlcnJvckNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CkBAIC0xMDMsMTAgKzEwMywxMiBAQAogICAgIHN0cnVjdCBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKLSAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlcihIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MgKmNvbnZlcnRlcikgOiBtQ29udmVydGVyKGNvbnZlcnRlcikgeyB9CisgICAgICAgICAgICBDYWxsYmFja0hhbmRsZXIoSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzICpjb252ZXJ0ZXIsIGludCB2bmRrVmVyc2lvbikgOgorICAgICAgICAgICAgICAgICAgICBtQ29udmVydGVyKGNvbnZlcnRlciksIG1WbmRrVmVyc2lvbih2bmRrVmVyc2lvbikgeyB9CiAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICB2b2lkIHByb2Nlc3NSZXN1bHRNZXNzYWdlKHNwPFJlc3VsdFdyYXBwZXI+ICZyZXN1bHRXcmFwcGVyKTsKICAgICAgICAgICAgIHdwPEgyQkNhbWVyYURldmljZUNhbGxiYWNrcz4gbUNvbnZlcnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICBpbnQgbVZuZGtWZXJzaW9uID0gLTE7CiAgICAgICAgICAgICBNdXRleCBtTWV0YWRhdGFRdWV1ZUxvY2s7CiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAKaW5kZXggOGU2MTllMS4uYWRkOTEyMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwCkBAIC0xNSw3ICsxNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgotI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorI2luY2x1ZGUgPGhpZGwvVXRpbHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGZyYW1ld29ya3MgewpAQCAtNzAsNiArNzAsMTEgQEAKICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQogCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6b25Ub3JjaFN0cmVuZ3RoTGV2ZWxDaGFuZ2VkKAorICAgIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmLCBpbnQzMl90KSB7CisgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKwogfSAvLyBpbXBsZW1lbnRhdGlvbgogfSAvLyBWMl8wCiB9IC8vIGNvbW1vbgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaAppbmRleCA3MTQ4MDM1Li43ZWY0MTNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaApAQCAtNTQsNiArNTQsOCBAQAogCiAgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKAogICAgICAgICAgICAgaW50MzJfdCBzdGF0dXMsIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGNhbWVyYUlkKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgb25Ub3JjaFN0cmVuZ3RoTGV2ZWxDaGFuZ2VkKAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgY2FtZXJhSWQsIGludDMyX3QgbmV3U3RyZW5ndGhMZXZlbCkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKCkgewogICAgICAgICAvLyBUT0RPOiBubyBpbXBsZW1lbnRhdGlvbiB5ZXQuCiAgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAKaW5kZXggMjUwOWU2Yy4uMjZlODEzYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAKQEAgLTIwLDggKzIwLDggQEAKICNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogCiAjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+Ci0jaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CiAjaW5jbHVkZSA8aGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGhpZGwvVXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL3R5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggN2QxYjNjZi4uNjVhMDMwMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAKQEAgLTE0LDEzICsxNCwxMyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAKLSNpbmNsdWRlIDxoaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmg+Ci0KLSNpbmNsdWRlIDxoaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmg+CiAjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CiAjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxoaWRsL1V0aWxzLmg+CiAKICNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CiAKQEAgLTM0LDYgKzM0LDcgQEAKIHVzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIaWRsQ2FtZXJhU2VydmljZTsKIHVzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbDsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6ZmlsdGVyVm5ka0tleXM7CiB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OkIySFN0YXR1czsKIHVzaW5nIGhhcmR3YXJlOjpWb2lkOwogCkBAIC01Myw2ICs1NCwxMCBAQAogICAgIHJldHVybiBnSGlkbENhbWVyYVNlcnZpY2U7CiB9CiAKK0hpZGxDYW1lcmFTZXJ2aWNlOjpIaWRsQ2FtZXJhU2VydmljZShhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjcykgOiBtQWlkbElDYW1lcmFTZXJ2aWNlKGNzKSB7CisgICAgbVZuZGtWZXJzaW9uID0gYmFzZTo6R2V0SW50UHJvcGVydHkoInJvLnZuZGsudmVyc2lvbiIsIF9fQU5EUk9JRF9BUElfRlVUVVJFX18pOworfTsKKwogUmV0dXJuPHZvaWQ+CiBIaWRsQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzX2NiIF9oaWRsX2NiKSB7CkBAIC03Nyw2ICs4MiwxMSBAQAogICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGhpZGxNZXRhZGF0YSk7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQorICAgIGlmIChmaWx0ZXJWbmRrS2V5cyhtVm5ka1ZlcnNpb24sIGNhbWVyYU1ldGFkYXRhKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBmaWx0ZXIgdm5kayBtZXRhZGF0YSBrZXlzIGZvciB2ZXJzaW9uICVkIiwgX19GVU5DVElPTl9fLCBtVm5ka1ZlcnNpb24pOworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCBoaWRsTWV0YWRhdGEpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPSBjYW1lcmFNZXRhZGF0YS5nZXRBbmRMb2NrKCk7CiAgICAgY29udmVydFRvSGlkbChyYXdNZXRhZGF0YSwgJmhpZGxNZXRhZGF0YSk7CiAgICAgX2hpZGxfY2Ioc3RhdHVzLCBoaWRsTWV0YWRhdGEpOwpAQCAtOTcsNyArMTA3LDcgQEAKICAgICAvLyBDcmVhdGUgYSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrIG9iamVjdCB3aGljaCBpbnRlcm5hbGx5CiAgICAgLy8gY2FsbHMgY2FsbGJhY2sgZnVuY3Rpb25zIHBhc3NlZCB0aHJvdWdoIGhDYWxsYmFjay4KICAgICBzcDxIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGh5YnJpZENhbGxiYWNrcyA9IG5ldyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoaENhbGxiYWNrKTsKLSAgICBpZiAoIWh5YnJpZENhbGxiYWNrcy0+aW5pdGlhbGl6ZUxvb3BlcigpKSB7CisgICAgaWYgKCFoeWJyaWRDYWxsYmFja3MtPmluaXRpYWxpemVMb29wZXIobVZuZGtWZXJzaW9uKSkgewogICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGhhbmRsZSBjYWxsYmFja3Mgb24gZGV2aWNlLCBjYW5ub3QgY29ubmVjdCIpOwogICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCBudWxscHRyKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKQEAgLTI3OSw2ICsyODksOSBAQAogICAgICAgICBzaXplX3QgbnVtU2VjdGlvbnMgPSBzZWN0aW9uTmFtZXMtPnNpemUoKTsKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8SFZlbmRvclRhZz4+IHRhZ3NCeVNlY3Rpb24obnVtU2VjdGlvbnMpOwogICAgICAgICBpbnQgdGFnQ291bnQgPSBkZXNjLT5nZXRUYWdDb3VudCgpOworICAgICAgICBpZiAodGFnQ291bnQgPD0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHRhZ3ModGFnQ291bnQpOwogICAgICAgICBkZXNjLT5nZXRUYWdBcnJheSh0YWdzLmRhdGEoKSk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnQ291bnQ7IGkrKykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oCmluZGV4IDg2YTdjZWMuLjFjODE0NWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmgKQEAgLTc1LDcgKzc1LDcgQEAKICAgICBzdGF0aWMgc3A8SGlkbENhbWVyYVNlcnZpY2U+IGdldEluc3RhbmNlKGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2UgKmNzKTsKIAogcHJpdmF0ZToKLSAgICBIaWRsQ2FtZXJhU2VydmljZShhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjcykgOiBtQWlkbElDYW1lcmFTZXJ2aWNlKGNzKSB7IH07CisgICAgSGlkbENhbWVyYVNlcnZpY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpOwogCiAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IHNlYXJjaExpc3RlbmVyQ2FjaGVMb2NrZWQoCiAgICAgICAgIHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGxpc3RlbmVyLCAvKnJlbW92ZUlmRm91bmQqLyBib29sIHNob3VsZFJlbW92ZSA9IGZhbHNlKTsKQEAgLTk1LDYgKzk1LDcgQEAKICAgICB1c2luZyBISUxpc3RlbmVycyA9CiAgICAgICAgIHN0ZDo6cGFpcjxzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiwgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4+OwogICAgIHN0ZDo6bGlzdDxISUxpc3RlbmVycz4gbUxpc3RlbmVyczsKKyAgICBpbnQgbVZuZGtWZXJzaW9uID0gLTE7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL1V0aWxzLmNwcApzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuY3BwCnJlbmFtZSB0byBzZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL1V0aWxzLmNwcAppbmRleCA1OTcxNDdiLi4wNTdhNmU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvVXRpbHMuY3BwCkBAIC0xNCw3ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisjaW5jbHVkZSA8aGlkbC9VdGlscy5oPgorI2luY2x1ZGUgPGhpZGwvVm5ka1ZlcnNpb25NZXRhZGF0YVRhZ3MuaD4KICNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oPgpAQCAtMjk3LDYgKzI5OCwzMSBAQAogICAgIHJldHVybiBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3M7CiB9CiAKK3N0YXR1c190IGZpbHRlclZuZGtLZXlzKGludCB2bmRrVmVyc2lvbiwgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhLCBib29sIGlzU3RhdGljKSB7CisgICAgaWYgKHZuZGtWZXJzaW9uID09IF9fQU5EUk9JRF9BUElfRlVUVVJFX18pIHsKKyAgICAgICAgLy8gVk5ESyB2ZXJzaW9uIGluIHJvLnZuZGsudmVyc2lvbiBpcyBhIHZlcnNpb24gY29kZS1uYW1lIHRoYXQKKyAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgdmVyc2lvbi4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBjb25zdCBhdXRvICZhcGlMZXZlbFRvS2V5cyA9CisgICAgICAgICAgICBpc1N0YXRpYyA/IHN0YXRpY19hcGlfbGV2ZWxfdG9fa2V5cyA6IGR5bmFtaWNfYXBpX2xldmVsX3RvX2tleXM7CisgICAgLy8gRmluZCB0aGUgdm5kayB2ZXJzaW9ucyBhYm92ZSB0aGUgZ2l2ZW4gdm5kayB2ZXJzaW9uLiBBbGwgdGhlIHZuZGsKKyAgICAvLyB2ZXJzaW9ucyBhYm92ZSB0aGUgZ2l2ZW4gb25lLCBuZWVkIHRvIGhhdmUgdGhlaXIga2V5cyBmaWx0ZXJlZCBmcm9tIHRoZQorICAgIC8vIG1ldGFkYXRhIGluIG9yZGVyIHRvIGF2b2lkIG1ldGFkYXRhIGludmFsaWRhdGlvbi4KKyAgICBhdXRvIGl0ID0gYXBpTGV2ZWxUb0tleXMudXBwZXJfYm91bmQodm5ka1ZlcnNpb24pOworICAgIHdoaWxlIChpdCAhPSBhcGlMZXZlbFRvS2V5cy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmtleSA6IGl0LT5zZWNvbmQpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IG1ldGFkYXRhLmVyYXNlKGtleSk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIG1ldGFkYXRhIGtleSAlZCBjb3VsZCBub3QgYmUgZXJhc2VkIiwgX19GVU5DVElPTl9fLCBrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaXQrKzsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiB9IC8vY29udmVyc2lvbgogfSAvLyB1dGlscwogfSAvL2NhbWVyYXNlcnZpY2UKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9VdGlscy5oCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5oCnJlbmFtZSB0byBzZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL1V0aWxzLmgKaW5kZXggODJmZmM0OC4uZTZkNDM5MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9VdGlscy5oCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhLmg+CiAjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KQEAgLTk2LDYgKzk3LDggQEAKIAogSFN0YXR1cyBCMkhTdGF0dXMoY29uc3QgYmluZGVyOjpTdGF0dXMgJmJTdGF0dXMpOwogCitzdGF0dXNfdCBmaWx0ZXJWbmRrS2V5cyhpbnQgdm5ka192ZXJzaW9uLCBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEsIGJvb2wgaXNTdGF0aWMgPSB0cnVlKTsKKwogfSAvLyBjb252ZXJzaW9uCiB9IC8vIHV0aWxzCiB9IC8vIGNhbWVyYXNlcnZpY2UKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvVm5ka1ZlcnNpb25NZXRhZGF0YVRhZ3MuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvVm5ka1ZlcnNpb25NZXRhZGF0YVRhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzM3N2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9WbmRrVmVyc2lvbk1ldGFkYXRhVGFncy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNwcmFnbWEgb25jZQorLyoqCisgKiAhIERvIG5vdCBlZGl0IHRoaXMgZmlsZSBkaXJlY3RseSAhCisgKgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB2bmRrX2NhbWVyYV9tZXRhZGF0YV90YWdzLm1ha28uIFRvIGJlIGluY2x1ZGVkIGluIGxpYmNhbWVyYXNlcnZpY2UKKyAqIG9ubHkgYnkgaGlkbC9VdGlscy5jcHAuCisgKi8KKworLyoqCisgKiBBUEkgbGV2ZWwgdG8gc3RhdGljIGtleXMgbWFwcGluZy4gVG8gYmUgdXNlZCBmb3IgZmlsdGVyaW5nIG91dCBrZXlzIGRlcGVuZGluZyBvbiB2bmRrIHZlcnNpb24KKyAqIHVzZWQgYnkgdmVuZG9yIGNsaWVudHMuCisgKi8KK3N0ZDo6bWFwPGludCwgc3RkOjp2ZWN0b3I8Y2FtZXJhX21ldGFkYXRhX3RhZz4+IHN0YXRpY19hcGlfbGV2ZWxfdG9fa2V5c3sKKyAgICAgIHszMCwgeworICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9BVkFJTEFCTEVfRVhURU5ERURfU0NFTkVfTU9ERV9NQVhfU0laRVMsCisgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1pPT01fUkFUSU9fUkFOR0UsCisgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JPVEFURV9BTkRfQ1JPUF9NT0RFUywKKyAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQVZBSUxBQkxFX0VYVEVOREVEX1NDRU5FX01PREVfWk9PTV9SQVRJT19SQU5HRVMsCisgICAgICAgIH0gfSwKKyAgICAgIHszMSwgeworICAgICAgICAgIEFORFJPSURfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfU0VOU09SX0lORk9fUElYRUxfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04sCisgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9JTlBVVF9PVVRQVVRfRk9STUFUU19NQVBfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQVZBSUxBQkxFX0hJR0hfU1BFRURfVklERU9fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04sCisgICAgICAgICAgQU5EUk9JRF9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTl9NQVhJTVVNX1JFU09MVVRJT04sCisgICAgICAgICAgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfU0NBTEVSX1BIWVNJQ0FMX0NBTUVSQV9NVUxUSV9SRVNPTFVUSU9OX1NUUkVBTV9DT05GSUdVUkFUSU9OUywKKyAgICAgICAgICBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfU0NBTEVSX01VTFRJX1JFU09MVVRJT05fU1RSRUFNX1NVUFBPUlRFRCwKKyAgICAgICAgICBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfTEVOU19ESVNUT1JUSU9OX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NDQUxFUl9ERUZBVUxUX1NFQ1VSRV9JTUFHRV9TSVpFLAorICAgICAgICAgIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICBBTkRST0lEX1NFTlNPUl9PUEFRVUVfUkFXX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgIEFORFJPSURfU0VOU09SX0lORk9fQklOTklOR19GQUNUT1IsCisgICAgICAgIH0gfSwKKyAgICAgIHszMiwgeworICAgICAgICAgIEFORFJPSURfSU5GT19ERVZJQ0VfU1RBVEVfT1JJRU5UQVRJT05TLAorICAgICAgICB9IH0sCisgICAgICB7MzMsIHsKKyAgICAgICAgICBBTkRST0lEX0ZMQVNIX0lORk9fU1RSRU5HVEhfREVGQVVMVF9MRVZFTCwKKyAgICAgICAgICBBTkRST0lEX0FVVE9NT1RJVkVfTEVOU19GQUNJTkcsCisgICAgICAgICAgQU5EUk9JRF9BVVRPTU9USVZFX0xPQ0FUSU9OLAorICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9SRUNPTU1FTkRFRF9URU5fQklUX0RZTkFNSUNfUkFOR0VfUFJPRklMRSwKKyAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFUywKKyAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQLAorICAgICAgICAgIEFORFJPSURfRkxBU0hfSU5GT19TVFJFTkdUSF9NQVhJTVVNX0xFVkVMLAorICAgICAgICB9IH0sCit9OworCisvKioKKyAqIEFQSSBsZXZlbCB0byBkeW5hbWljIGtleXMgbWFwcGluZy4gVG8gYmUgdXNlZCBmb3IgZmlsdGVyaW5nIG91dCBrZXlzIGRlcGVuZGluZyBvbiB2bmRrIHZlcnNpb24KKyAqIHVzZWQgYnkgdmVuZG9yIGNsaWVudHMuCisgKi8KK3N0ZDo6bWFwPGludCwgc3RkOjp2ZWN0b3I8Y2FtZXJhX21ldGFkYXRhX3RhZz4+IGR5bmFtaWNfYXBpX2xldmVsX3RvX2tleXN7CisgICAgICB7MzAsIHsKKyAgICAgICAgICBBTkRST0lEX0NPTlRST0xfWk9PTV9SQVRJTywKKyAgICAgICAgICBBTkRST0lEX1NDQUxFUl9ST1RBVEVfQU5EX0NST1AsCisgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX0VYVEVOREVEX1NDRU5FX01PREUsCisgICAgICAgIH0gIH0sCisgICAgICB7MzEsIHsKKyAgICAgICAgICBBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFLAorICAgICAgICAgIEFORFJPSURfU0VOU09SX1JBV19CSU5OSU5HX0ZBQ1RPUl9VU0VELAorICAgICAgICB9ICB9LAorfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9saWJjYW1lcmFzZXJ2aWNlX2Z1enplci9BbmRyb2lkLmJwCmluZGV4IDNkNzRmMGIuLmU0M2I5MWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvbGliY2FtZXJhc2VydmljZV9mdXp6ZXIvQW5kcm9pZC5icApAQCAtNTIsNiArNTIsNyBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi41IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjciLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXItVjEtbmRrIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zIiwKQEAgLTY1LDUgKzY2LDEwIEBACiAgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCiAgICAgICAgIF0sCiAgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgICAgIGxpYmZ1enplcl9vcHRpb25zOiBbCisgICAgICAgICAgICAvL2Jhc2VkIG9uIGIvMTg3MzYwODY2CisgICAgICAgICAgICAidGltZW91dD03NzAiLAorICAgICAgICBdLAorCiAgICAgfSwKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL2NhbWVyYV9zZXJ2aWNlX2Z1enplci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9saWJjYW1lcmFzZXJ2aWNlX2Z1enplci9jYW1lcmFfc2VydmljZV9mdXp6ZXIuY3BwCmluZGV4IGU0NmJmNzQuLjk3ZDdiZjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL2NhbWVyYV9zZXJ2aWNlX2Z1enplci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvbGliY2FtZXJhc2VydmljZV9mdXp6ZXIvY2FtZXJhX3NlcnZpY2VfZnV6emVyLmNwcApAQCAtNDY2LDYgKzQ2NiwxMiBAQAogICAgICAgICAvLyBObyBvcAogICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgfQorCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblRvcmNoU3RyZW5ndGhMZXZlbENoYW5nZWQoY29uc3QgU3RyaW5nMTYmIC8qY2FtZXJhSWQqLywKKyAgICAgICAgICAgIGludDMyX3QgLyp0b3JjaFN0cmVuZ3RoKi8pIHsKKyAgICAgICAgLy8gTm8gb3AKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH0KIH07CiAKIGNsYXNzIFRlc3RDYW1lcmFEZXZpY2VDYWxsYmFja3MgOiBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTI6OkJuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTY1NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTI1IEBACisvLyBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfc2VydmljZXNfY2FtZXJhX2xpYmNhbWVyYXNlcnZpY2VfbGljZW5zZSIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImNhbWVyYXNlcnZpY2VfdGVzdCIsCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgInN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIiwKKyAgICAgICAgImV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW5jbHVkZXMiLAorICAgICAgICAiZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbnRlcm5hbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjYW1lcmFzZXJ2aWNlIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJqcGVnIiwKKyAgICAgICAgImxpYmV4aWYiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi41IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjciLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXItVjEtbmRrIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjciLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJnbW9jayIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkNhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwIiwKKyAgICAgICAgIkNsaWVudE1hbmFnZXJUZXN0LmNwcCIsCisgICAgICAgICJEZXB0aFByb2Nlc3NvclRlc3QuY3BwIiwKKyAgICAgICAgIkRpc3RvcnRpb25NYXBwZXJUZXN0LmNwcCIsCisgICAgICAgICJFeGlmVXRpbHNUZXN0LmNwcCIsCisgICAgICAgICJOVjEyQ29tcHJlc3Nvci5jcHAiLAorICAgICAgICAiUm90YXRlQW5kQ3JvcE1hcHBlclRlc3QuY3BwIiwKKyAgICAgICAgIlpvb21SYXRpb1Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKKworfQorCitjY190ZXN0X2hvc3QgeworICAgIG5hbWU6ICJjYW1lcmFzZXJ2aWNlX3Rlc3RfaG9zdCIsCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvY2FtZXJhL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEiLAorICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9iaW5kZXIvaW5jbHVkZV9hY3Rpdml0eW1hbmFnZXIiCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhY3Rpdml0eV9tYW5hZ2VyX3Byb2NzdGF0ZV9haWRsLWNwcCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGliZHluYW1pY19kZXB0aCIsCisgICAgICAgICJsaWJleGlmIiwKKyAgICAgICAgImxpYmpwZWciLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmNhbWVyYV9jbGllbnRfaG9zdCIsCisgICAgICAgICJsaWJjYW1lcmFzZXJ2aWNlX2RldmljZV9pbmRlcGVuZGVudCIsCisgICAgICAgICJsaWJnbW9jayIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkNsaWVudE1hbmFnZXJUZXN0LmNwcCIsCisgICAgICAgICJEZXB0aFByb2Nlc3NvclRlc3QuY3BwIiwKKyAgICAgICAgIkRpc3RvcnRpb25NYXBwZXJUZXN0LmNwcCIsCisgICAgICAgICJFeGlmVXRpbHNUZXN0LmNwcCIsCisgICAgICAgICJOVjEyQ29tcHJlc3Nvci5jcHAiLAorICAgICAgICAiUm90YXRlQW5kQ3JvcE1hcHBlclRlc3QuY3BwIiwKKyAgICAgICAgIlpvb21SYXRpb1Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKKworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNWFkNzkuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gJChjYWxsIGFsbC1jcHAtZmlsZXMtdW5kZXIsIC4pCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmJhc2UgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGliY2FtZXJhc2VydmljZSBcCi0gICAgbGliaGlkbGJhc2UgXAotICAgIGxpYmxvZyBcCi0gICAgbGliY2FtZXJhX2NsaWVudCBcCi0gICAgbGliY2FtZXJhX21ldGFkYXRhIFwKLSAgICBsaWJ1aSBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmpwZWcgXAotICAgIGxpYmV4aWYgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi41IFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjYgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNyBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNyBcCi0gICAgYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscwotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJnbW9jawotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCi0gICAgZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbmNsdWRlcyBcCi0gICAgZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbnRlcm5hbCBcCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKLQotTE9DQUxfU0FOSVRJWkUgOj0gYWRkcmVzcwotCi1MT0NBTF9NT0RVTEU6PSBjYW1lcmFzZXJ2aWNlX3Rlc3QKLUxPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS8uLi9OT1RJQ0UKLUxPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gZGV2aWNlLXRlc3RzCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwCmluZGV4IGE3NGZkOWQuLmU5ZjY5NzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwCkBAIC0yMTIsNyArMjEyLDcgQEAKICAqIFNpbXBsZSB0ZXN0IHZlcnNpb24gb2YgdGhlIGludGVyYWN0aW9uIHByb3h5LCB0byB1c2UgdG8gaW5qZWN0IG9uUmVnaXN0ZXJlZCBjYWxscyB0byB0aGUKICAqIENhbWVyYVByb3ZpZGVyTWFuYWdlcgogICovCi1zdHJ1Y3QgVGVzdEludGVyYWN0aW9uUHJveHkgOiBwdWJsaWMgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSB7CitzdHJ1Y3QgVGVzdEludGVyYWN0aW9uUHJveHkgOiBwdWJsaWMgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpIaWRsU2VydmljZUludGVyYWN0aW9uUHJveHkgewogICAgIHNwPGhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTm90aWZpY2F0aW9uPiBtTWFuYWdlck5vdGlmaWNhdGlvbkludGVyZmFjZTsKICAgICBzcDxUZXN0SUNhbWVyYVByb3ZpZGVyPiBtVGVzdENhbWVyYVByb3ZpZGVyOwogCkBAIC0yNjksMTEgKzI2OSwxMyBAQAogICAgIH5UZXN0U3RhdHVzTGlzdGVuZXIoKSB7fQogCiAgICAgdm9pZCBvbkRldmljZVN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCAmLAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMpIG92ZXJyaWRlIHt9CisgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMpIG92ZXJyaWRlIHt9CiAgICAgdm9pZCBvbkRldmljZVN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCAmLCBjb25zdCBTdHJpbmc4ICYsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cykgb3ZlcnJpZGUge30KKyAgICAgICAgICAgIENhbWVyYURldmljZVN0YXR1cykgb3ZlcnJpZGUge30KICAgICB2b2lkIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzggJiwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzKSBvdmVycmlkZSB7fQorICAgICAgICAgICAgVG9yY2hNb2RlU3RhdHVzKSBvdmVycmlkZSB7fQorICAgIHZvaWQgb25Ub3JjaFN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCAmLAorICAgICAgICAgICAgVG9yY2hNb2RlU3RhdHVzLCBTeXN0ZW1DYW1lcmFLaW5kKSBvdmVycmlkZSB7fQogICAgIHZvaWQgb25OZXdQcm92aWRlclJlZ2lzdGVyZWQoKSBvdmVycmlkZSB7fQogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRXhpZlV0aWxzVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9FeGlmVXRpbHNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGU0YmYyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRXhpZlV0aWxzVGVzdC5jcHAKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRXhpZlV0aWxzVGVzdCIKKworI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgIi4uL3V0aWxzL0V4aWZVdGlscy5oIgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6OkV4aWZVdGlsczsKK3VzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6OkV4aWZPcmllbnRhdGlvbjsKK3VzaW5nIGFuZHJvaWQ6OkNhbWVyYU1ldGFkYXRhOworCit1aW50MzJfdCBrSW1hZ2VXaWR0aCA9IDE5MjA7Cit1aW50MzJfdCBrSW1hZ2VIZWlnaHQgPSAxNDQwOworRXhpZk9yaWVudGF0aW9uIGtFeGlmT3JpZW50YXRpb24gPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUzsKKworLy8gVGVzdCB0aGF0IHNldEZyb21NZXRhZGF0YSB3b3JrcyBjb3JyZWN0bHksIHdpdGhvdXQgZXJyb3JzLgorVEVTVChFeGlmVXRpbHNUZXN0LCBTZXRGcm9tTWV0YWRhdGFUZXN0KSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZVdGlscz4gdXRpbHMoRXhpZlV0aWxzOjpjcmVhdGUoKSk7CisgICAgdWludDhfdCBpbnZhbGlkU2Vuc29yUGl4ZWxNb2RlID0gMjsKKyAgICB1aW50OF90IHZhbGlkU2Vuc29yUGl4ZWxNb2RlID0gQU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUOworICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgIC8vIEVtcHR5IHN0YXRpY0luZm8KKyAgICBDYW1lcmFNZXRhZGF0YSBzdGF0aWNJbmZvOworICAgIEFTU0VSVF9UUlVFKHV0aWxzLT5pbml0aWFsaXplRW1wdHkoKSk7CisgICAgQVNTRVJUX1RSVUUoCisgICAgICAgICAgICBtZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERSwgJmludmFsaWRTZW5zb3JQaXhlbE1vZGUsIDEpID09IGFuZHJvaWQ6Ok9LKTsKKyAgICBBU1NFUlRfRkFMU0UodXRpbHMtPnNldEZyb21NZXRhZGF0YShtZXRhZGF0YSwgc3RhdGljSW5mbywga0ltYWdlV2lkdGgsIGtJbWFnZUhlaWdodCkpOworICAgIEFTU0VSVF9UUlVFKAorICAgICAgICAgICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfU0VOU09SX1BJWEVMX01PREUsICZ2YWxpZFNlbnNvclBpeGVsTW9kZSwgMSkgPT0gYW5kcm9pZDo6T0spOworICAgIEFTU0VSVF9UUlVFKHV0aWxzLT5zZXRGcm9tTWV0YWRhdGEobWV0YWRhdGEsIHN0YXRpY0luZm8sIGtJbWFnZVdpZHRoLCBrSW1hZ2VIZWlnaHQpKTsKKyAgICBBU1NFUlRfVFJVRSh1dGlscy0+c2V0SW1hZ2VXaWR0aChrSW1hZ2VXaWR0aCkpOworICAgIEFTU0VSVF9UUlVFKHV0aWxzLT5zZXRJbWFnZUhlaWdodChrSW1hZ2VIZWlnaHQpKTsKKyAgICBBU1NFUlRfVFJVRSh1dGlscy0+c2V0T3JpZW50YXRpb25WYWx1ZShrRXhpZk9yaWVudGF0aW9uKSk7CisgICAgQVNTRVJUX1RSVUUodXRpbHMtPmdlbmVyYXRlQXBwMSgpKTsKKyAgICBjb25zdCB1aW50OF90KiBleGlmQnVmZmVyID0gdXRpbHMtPmdldEFwcDFCdWZmZXIoKTsKKyAgICBBU1NFUlRfTkUoZXhpZkJ1ZmZlciwgbnVsbHB0cik7CisgICAgc2l6ZV90IGV4aWZCdWZmZXJTaXplID0gdXRpbHMtPmdldEFwcDFMZW5ndGgoKTsKKyAgICBBU1NFUlRfVFJVRShleGlmQnVmZmVyU2l6ZSAhPSAwKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5oCmluZGV4IGVlMjJkNWUuLmE5NTk4NzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvTlYxMkNvbXByZXNzb3IuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8c2V0am1wLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KIGV4dGVybiAiQyIgewogI2luY2x1ZGUgPGpwZWdsaWIuaD4KICNpbmNsdWRlIDxqZXJyb3IuaD4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL2hvd190b19ydW4udHh0IGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvaG93X3RvX3J1bi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyMzllMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL2hvd190b19ydW4udHh0CkBAIC0wLDAgKzEsNSBAQAorYWRiIHJvb3QgJiYKK20gY2FtZXJhc2VydmljZV90ZXN0ICYmCithZGIgcHVzaCAkQU5EUk9JRF9QUk9EVUNUX09VVC9kYXRhL25hdGl2ZXRlc3QvY2FtZXJhc2VydmljZV90ZXN0L2NhbWVyYXNlcnZpY2VfdGVzdCBcCisgICAgL2RhdGEvbmF0aXZldGVzdC9jYW1lcmFzZXJ2aWNlX3Rlc3QvYXJtNjQvY2FtZXJhc2VydmljZV90ZXN0ICYmCithZGIgc2hlbGwgL2RhdGEvbmF0aXZldGVzdC9jYW1lcmFzZXJ2aWNlX3Rlc3QvYXJtNjQvY2FtZXJhc2VydmljZV90ZXN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmNwcAppbmRleCA3NjkyN2MwLi42OTE3NWNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmNwcApAQCAtNjYsMTAgKzY2LDExIEBACiAgICAgfQogfQogCi12b2lkIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OkNhbWVyYVNlc3Npb25TdGF0c1dyYXBwZXI6Om9uQWN0aXZlKCkgewordm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyOjpvbkFjdGl2ZShmbG9hdCBtYXhQcmV2aWV3RnBzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCiAgICAgbVNlc3Npb25TdGF0cy5tTmV3Q2FtZXJhU3RhdGUgPSBDYW1lcmFTZXNzaW9uU3RhdHM6OkNBTUVSQV9TVEFURV9BQ1RJVkU7CisgICAgbVNlc3Npb25TdGF0cy5tTWF4UHJldmlld0ZwcyA9IG1heFByZXZpZXdGcHM7CiAgICAgdXBkYXRlUHJveHlEZXZpY2VTdGF0ZShtU2Vzc2lvblN0YXRzKTsKIAogICAgIC8vIFJlc2V0IG1DcmVhdGlvbkR1cmF0aW9uIHRvIC0xIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gMXN0IHNlc3Npb24KQEAgLTc5LDYgKzgwLDcgQEAKIAogdm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyOjpvbklkbGUoCiAgICAgICAgIGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsIGJvb2wgZGV2aWNlRXJyb3IsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB1c2VyVGFnLCBpbnQzMl90IHZpZGVvU3RhYmlsaXphdGlvbk1vZGUsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCkBAIC04Niw2ICs4OCw4IEBACiAgICAgbVNlc3Npb25TdGF0cy5tUmVxdWVzdENvdW50ID0gcmVxdWVzdENvdW50OwogICAgIG1TZXNzaW9uU3RhdHMubVJlc3VsdEVycm9yQ291bnQgPSByZXN1bHRFcnJvckNvdW50OwogICAgIG1TZXNzaW9uU3RhdHMubURldmljZUVycm9yID0gZGV2aWNlRXJyb3I7CisgICAgbVNlc3Npb25TdGF0cy5tVXNlclRhZyA9IFN0cmluZzE2KHVzZXJUYWcuY19zdHIoKSk7CisgICAgbVNlc3Npb25TdGF0cy5tVmlkZW9TdGFiaWxpemF0aW9uTW9kZSA9IHZpZGVvU3RhYmlsaXphdGlvbk1vZGU7CiAgICAgbVNlc3Npb25TdGF0cy5tU3RyZWFtU3RhdHMgPSBzdHJlYW1TdGF0czsKICAgICB1cGRhdGVQcm94eURldmljZVN0YXRlKG1TZXNzaW9uU3RhdHMpOwogCkBAIC0xMjAsMTMgKzEyNCwxMiBAQAogICAgIHByb3h5QmluZGVyLT5waW5nRm9yVXNlclVwZGF0ZSgpOwogfQogCi1ib29sIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmlzUm90YXRlQW5kQ3JvcE92ZXJyaWRlTmVlZGVkKAotICAgICAgICBTdHJpbmcxNiBwYWNrYWdlTmFtZSwgaW50IHNlbnNvck9yaWVudGF0aW9uLCBpbnQgbGVuc0ZhY2luZykgeworaW50IENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmdldFJvdGF0ZUFuZENyb3BPdmVycmlkZShTdHJpbmcxNiBwYWNrYWdlTmFtZSwgaW50IGxlbnNGYWNpbmcsCisgICAgICAgIGludCB1c2VySWQpIHsKICAgICBzcDxJQ2FtZXJhU2VydmljZVByb3h5PiBwcm94eUJpbmRlciA9IGdldENhbWVyYVNlcnZpY2VQcm94eSgpOwogICAgIGlmIChwcm94eUJpbmRlciA9PSBudWxscHRyKSByZXR1cm4gdHJ1ZTsKLSAgICBib29sIHJldCA9IHRydWU7Ci0gICAgYXV0byBzdGF0dXMgPSBwcm94eUJpbmRlci0+aXNSb3RhdGVBbmRDcm9wT3ZlcnJpZGVOZWVkZWQocGFja2FnZU5hbWUsIHNlbnNvck9yaWVudGF0aW9uLAotICAgICAgICAgICAgbGVuc0ZhY2luZywgJnJldCk7CisgICAgaW50IHJldCA9IDA7CisgICAgYXV0byBzdGF0dXMgPSBwcm94eUJpbmRlci0+Z2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKHBhY2thZ2VOYW1lLCBsZW5zRmFjaW5nLCB1c2VySWQsICZyZXQpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBkdXJpbmcgdG9wIGFjdGl2aXR5IG9yaWVudGF0aW9uIHF1ZXJ5OiAlcyIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLmNfc3RyKCkpOwpAQCAtMTU5LDcgKzE2Miw3IEBACiAgICAgc2Vzc2lvblN0YXRzLT5vblN0cmVhbUNvbmZpZ3VyZWQob3BlcmF0aW5nTW9kZSwgaW50ZXJuYWxDb25maWcsIGxhdGVuY3lNcyk7CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nQWN0aXZlKGNvbnN0IFN0cmluZzgmIGlkKSB7Cit2b2lkIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ0FjdGl2ZShjb25zdCBTdHJpbmc4JiBpZCwgZmxvYXQgbWF4UHJldmlld0ZwcykgewogICAgIHN0ZDo6c2hhcmVkX3B0cjxDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyPiBzZXNzaW9uU3RhdHM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC0xNzIsMTEgKzE3NSwxMiBAQAogICAgIH0KIAogICAgIEFMT0dWKCIlczogaWQgJXMiLCBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCkpOwotICAgIHNlc3Npb25TdGF0cy0+b25BY3RpdmUoKTsKKyAgICBzZXNzaW9uU3RhdHMtPm9uQWN0aXZlKG1heFByZXZpZXdGcHMpOwogfQogCiB2b2lkIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ0lkbGUoY29uc3QgU3RyaW5nOCYgaWQsCiAgICAgICAgIGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsIGJvb2wgZGV2aWNlRXJyb3IsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB1c2VyVGFnLCBpbnQzMl90IHZpZGVvU3RhYmlsaXphdGlvbk1vZGUsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKSB7CiAgICAgc3RkOjpzaGFyZWRfcHRyPENhbWVyYVNlc3Npb25TdGF0c1dyYXBwZXI+IHNlc3Npb25TdGF0czsKICAgICB7CkBAIC0xOTAsOCArMTk0LDkgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEFMT0dWKCIlczogaWQgJXMsIHJlcXVlc3RDb3VudCAlIiBQUklkNjQgIiwgcmVzdWx0RXJyb3JDb3VudCAlIiBQUklkNjQgIiwgZGV2aWNlRXJyb3IgJWQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCByZXF1ZXN0Q291bnQsIHJlc3VsdEVycm9yQ291bnQsIGRldmljZUVycm9yKTsKKyAgICBBTE9HVigiJXM6IGlkICVzLCByZXF1ZXN0Q291bnQgJSIgUFJJZDY0ICIsIHJlc3VsdEVycm9yQ291bnQgJSIgUFJJZDY0ICIsIGRldmljZUVycm9yICVkIgorICAgICAgICAgICAgIiwgdXNlclRhZyAlcywgdmlkZW9TdGFiaWxpemF0aW9uTW9kZSAlZCIsIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgcmVxdWVzdENvdW50LAorICAgICAgICAgICAgcmVzdWx0RXJyb3JDb3VudCwgZGV2aWNlRXJyb3IsIHVzZXJUYWcuY19zdHIoKSwgdmlkZW9TdGFiaWxpemF0aW9uTW9kZSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJlYW1TdGF0cy5zaXplKCk7IGkrKykgewogICAgICAgICBBTE9HVigiJXM6IHN0cmVhbVN0YXRzWyV6dV06IHcgJWQgaCAlZCwgcmVxdWVzdGVkQ291bnQgJSIgUFJJZDY0ICIsIGRyb3BDb3VudCAlIgogICAgICAgICAgICAgICAgIFBSSWQ2NCAiLCBzdGFydFRpbWVNcyAlZCIgLApAQCAtMjAwLDcgKzIwNSw4IEBACiAgICAgICAgICAgICAgICAgc3RyZWFtU3RhdHNbaV0ubVN0YXJ0TGF0ZW5jeU1zKTsKICAgICB9CiAKLSAgICBzZXNzaW9uU3RhdHMtPm9uSWRsZShyZXF1ZXN0Q291bnQsIHJlc3VsdEVycm9yQ291bnQsIGRldmljZUVycm9yLCBzdHJlYW1TdGF0cyk7CisgICAgc2Vzc2lvblN0YXRzLT5vbklkbGUocmVxdWVzdENvdW50LCByZXN1bHRFcnJvckNvdW50LCBkZXZpY2VFcnJvciwgdXNlclRhZywKKyAgICAgICAgICAgIHZpZGVvU3RhYmlsaXphdGlvbk1vZGUsIHN0cmVhbVN0YXRzKTsKIH0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpsb2dPcGVuKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgZmFjaW5nLApAQCAtMjU2LDQgKzI2MiwxNiBAQAogICAgIHNlc3Npb25TdGF0cy0+b25DbG9zZShsYXRlbmN5TXMpOwogfQogCitib29sIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmlzQ2FtZXJhRGlzYWJsZWQoKSB7CisgICAgc3A8SUNhbWVyYVNlcnZpY2VQcm94eT4gcHJveHlCaW5kZXIgPSBnZXRDYW1lcmFTZXJ2aWNlUHJveHkoKTsKKyAgICBpZiAocHJveHlCaW5kZXIgPT0gbnVsbHB0cikgcmV0dXJuIHRydWU7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBhdXRvIHN0YXR1cyA9IHByb3h5QmluZGVyLT5pc0NhbWVyYURpc2FibGVkKCZyZXQpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBkdXJpbmcgY2FtZXJhIGRpc2FibGVkIHF1ZXJ5OiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5oCmluZGV4IGFkOWRiNjguLmUzNGE4ZjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmgKQEAgLTQ4LDggKzQ4LDkgQEAKICAgICAgICAgdm9pZCBvbk9wZW4oKTsKICAgICAgICAgdm9pZCBvbkNsb3NlKGludDMyX3QgbGF0ZW5jeU1zKTsKICAgICAgICAgdm9pZCBvblN0cmVhbUNvbmZpZ3VyZWQoaW50IG9wZXJhdGluZ01vZGUsIGJvb2wgaW50ZXJuYWxSZWNvbmZpZywgaW50MzJfdCBsYXRlbmN5TXMpOwotICAgICAgICB2b2lkIG9uQWN0aXZlKCk7CisgICAgICAgIHZvaWQgb25BY3RpdmUoZmxvYXQgbWF4UHJldmlld0Zwcyk7CiAgICAgICAgIHZvaWQgb25JZGxlKGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsIGJvb2wgZGV2aWNlRXJyb3IsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVzZXJUYWcsIGludDMyX3QgdmlkZW9TdGFiaWxpemF0aW9uTW9kZSwKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+JiBzdHJlYW1TdGF0cyk7CiAgICAgfTsKIApAQCAtODEsMTkgKzgyLDIyIEBACiAgICAgICAgICAgICBpbnQzMl90IGxhdGVuY3lNcyk7CiAKICAgICAvLyBTZXNzaW9uIHN0YXRlIGJlY29tZXMgYWN0aXZlCi0gICAgc3RhdGljIHZvaWQgbG9nQWN0aXZlKGNvbnN0IFN0cmluZzgmIGlkKTsKKyAgICBzdGF0aWMgdm9pZCBsb2dBY3RpdmUoY29uc3QgU3RyaW5nOCYgaWQsIGZsb2F0IG1heFByZXZpZXdGcHMpOwogCiAgICAgLy8gU2Vzc2lvbiBzdGF0ZSBiZWNvbWVzIGlkbGUKICAgICBzdGF0aWMgdm9pZCBsb2dJZGxlKGNvbnN0IFN0cmluZzgmIGlkLAogICAgICAgICAgICAgaW50NjRfdCByZXF1ZXN0Q291bnQsIGludDY0X3QgcmVzdWx0RXJyb3JDb3VudCwgYm9vbCBkZXZpY2VFcnJvciwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB1c2VyVGFnLCBpbnQzMl90IHZpZGVvU3RhYmlsaXphdGlvbk1vZGUsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+JiBzdHJlYW1TdGF0cyk7CiAKICAgICAvLyBQaW5nIGNhbWVyYSBzZXJ2aWNlIHByb3h5IGZvciB1c2VyIHVwZGF0ZQogICAgIHN0YXRpYyB2b2lkIHBpbmdDYW1lcmFTZXJ2aWNlUHJveHkoKTsKIAotICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgdG9wIGFjdGl2aXR5IG5lZWRzIGEgcm90YXRlIGFuZCBjcm9wIG92ZXJyaWRlLgotICAgIHN0YXRpYyBib29sIGlzUm90YXRlQW5kQ3JvcE92ZXJyaWRlTmVlZGVkKFN0cmluZzE2IHBhY2thZ2VOYW1lLCBpbnQgc2Vuc29yT3JpZW50YXRpb24sCi0gICAgICAgICAgICBpbnQgbGVuc0ZhY2luZyk7CisgICAgLy8gUmV0dXJuIHRoZSBjdXJyZW50IHRvcCBhY3Rpdml0eSByb3RhdGUgYW5kIGNyb3Agb3ZlcnJpZGUuCisgICAgc3RhdGljIGludCBnZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUoU3RyaW5nMTYgcGFja2FnZU5hbWUsIGludCBsZW5zRmFjaW5nLCBpbnQgdXNlcklkKTsKKworICAgIC8vIERldGVjdCBpZiB0aGUgY2FtZXJhIGlzIGRpc2FibGVkIGJ5IGRldmljZSBwb2xpY3kuCisgICAgc3RhdGljIGJvb2wgaXNDYW1lcmFEaXNhYmxlZCgpOwogfTsKIAogfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUcmFjZXMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcAppbmRleCAwMTk4NjkwLi4wY2Q0ZjVkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUcmFjZXMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRyYWNlcy5jcHAKQEAgLTY0LDcgKzY0LDcgQEAKICAgICBBVFJBQ0VfRU5EKCk7CiB9CiAKLXN0YXR1c190IENhbWVyYVRyYWNlczo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpIHsKK3N0YXR1c190IENhbWVyYVRyYWNlczo6ZHVtcChpbnQgZmQpIHsKICAgICBBTE9HVigiJXM6IGZkID0gJWQiLCBfX0ZVTkNUSU9OX18sIGZkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0ltcGwudHJhY2VzTG9jayk7CiAgICAgTGlzdDxQcm9jZXNzQ2FsbFN0YWNrPiYgcGNzTGlzdCA9IHNJbXBsLnBjc0xpc3Q7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUcmFjZXMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRyYWNlcy5oCmluZGV4IDEzY2ExNmQuLjcxZmEzMzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRyYWNlcy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRyYWNlcy5oCkBAIC00Miw3ICs0Miw3IEBACiAgICAgICoKICAgICAgKiA8cD5FYWNoIGxpbmUgaXMgaW5kZW50ZWQgYnkgRFVNUF9JTkRFTlQgc3BhY2VzLjwvcD4KICAgICAgKi8KLSAgICBzdGF0aWMgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgIHN0YXRpYyBzdGF0dXNfdCBkdW1wKGludCBmZCk7CiAKIHByaXZhdGU6CiAgICAgZW51bSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DbGllbnRNYW5hZ2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DbGllbnRNYW5hZ2VyLmgKaW5kZXggZDE2NDg4NS4uMDc0Yzg0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2xpZW50TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NsaWVudE1hbmFnZXIuaApAQCAtNTI3LDEyICs1MjcsNyBAQAogICAgICAgICBpZiAoIXJldHVybkluY29tcGF0aWJsZUNsaWVudHMpIHsKICAgICAgICAgICAgIC8vIEZpbmQgZXZpY3RlZCBjbGllbnRzCiAKLSAgICAgICAgICAgIGlmIChjb25mbGljdGluZyAmJiBjdXJQcmlvcml0eSA8IHByaW9yaXR5KSB7Ci0gICAgICAgICAgICAgICAgLy8gUHJlLWV4aXN0aW5nIGNvbmZsaWN0aW5nIGNsaWVudCB3aXRoIGhpZ2hlciBwcmlvcml0eSBleGlzdHMKLSAgICAgICAgICAgICAgICBldmljdExpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBldmljdExpc3QucHVzaF9iYWNrKGNsaWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV2aWN0TGlzdDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmxpY3RpbmcgJiYgb3duZXIgPT0gY3VyT3duZXIpIHsKKyAgICAgICAgICAgIGlmIChjb25mbGljdGluZyAmJiBvd25lciA9PSBjdXJPd25lcikgewogICAgICAgICAgICAgICAgIC8vIFByZS1leGlzdGluZyBjb25mbGljdGluZyBjbGllbnQgd2l0aCB0aGUgc2FtZSBjbGllbnQgb3duZXIgZXhpc3RzCiAgICAgICAgICAgICAgICAgLy8gT3BlbiB0aGUgc2FtZSBkZXZpY2UgdHdpY2UgLT4gbW9zdCByZWNlbnQgb3BlbiB3aW5zCiAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGxldCB0aGUgZXhpc3RpbmcgY2xpZW50IHdpbnMgdG8gYXZvaWQgYmVoYXZpb3JzIGRpZmZlcmVuY2UKQEAgLTU0Niw2ICs1NDEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgZXZpY3RMaXN0LnB1c2hfYmFjayhjbGllbnQpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZpY3RMaXN0OwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmxpY3RpbmcgJiYgY3VyUHJpb3JpdHkgPCBwcmlvcml0eSkgeworICAgICAgICAgICAgICAgIC8vIFByZS1leGlzdGluZyBjb25mbGljdGluZyBjbGllbnQgd2l0aCBoaWdoZXIgcHJpb3JpdHkgZXhpc3RzCisgICAgICAgICAgICAgICAgZXZpY3RMaXN0LmNsZWFyKCk7CisgICAgICAgICAgICAgICAgZXZpY3RMaXN0LnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICAgICAgICAgIHJldHVybiBldmljdExpc3Q7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZsaWN0aW5nIHx8ICgodG90YWxDb3N0ID4gbU1heENvc3QgJiYgY3VyQ29zdCA+IDApICYmCiAgICAgICAgICAgICAgICAgICAgIChjdXJQcmlvcml0eSA+PSBwcmlvcml0eSkgJiYKICAgICAgICAgICAgICAgICAgICAgIShoaWdoZXN0UHJpb3JpdHlPd25lciA9PSBvd25lciAmJiBvd25lciA9PSBjdXJPd25lcikpKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmNwcAppbmRleCA0ODU3MDVjLi4yMWYwMmRiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0V4aWZVdGlscy5jcHAKQEAgLTkyMCw3ICs5MjAsNyBAQAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBzZW5zb3JQaXhlbE1vZGVFbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERSk7CiAgICAgaWYgKHNlbnNvclBpeGVsTW9kZUVudHJ5LmNvdW50ICE9IDApIHsKICAgICAgICAgc2Vuc29yUGl4ZWxNb2RlID0gc2Vuc29yUGl4ZWxNb2RlRW50cnkuZGF0YS51OFswXTsKLSAgICAgICAgaWYgKHNlbnNvclBpeGVsTW9kZSAhPSBBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFQgfHwKKyAgICAgICAgaWYgKHNlbnNvclBpeGVsTW9kZSAhPSBBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFQgJiYKICAgICAgICAgICAgIHNlbnNvclBpeGVsTW9kZSAhPSBBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTikgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0IHNlbnNvciBwaXhlbCBtb2RlIGlzIG5vdCBvbmUgb2YgdGhlIHZhbGlkIHZhbHVlcyAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzZW5zb3JQaXhlbE1vZGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQuYWlkbCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0lQQ1RyYW5zcG9ydC5oCnNpbWlsYXJpdHkgaW5kZXggNzMlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0LmFpZGwKcmVuYW1lIHRvIHNlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0lQQ1RyYW5zcG9ydC5oCmluZGV4IGEyY2JmNjIuLmI4ZTgwYWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0LmFpZGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvSVBDVHJhbnNwb3J0LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMSArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0lQQ19IXworI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfSVBDX0hfCiAKLS8qKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIEF1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQgewotICAgIGludCBzZXNzaW9uOwotfQorZW51bSBjbGFzcyBJUENUcmFuc3BvcnQgOiB1aW50MzJfdCB7CisgIEhJREwgPSAwLAorICBBSURMID0gMSwKKyAgSU5WQUxJRCA9IDIKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmNwcAppbmRleCBhMjM5YzgxLi4yZWIyZDU1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmNwcApAQCAtMTMsNzEgKzEzLDI3IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgIlNlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaCIKICNpbmNsdWRlICIuLi9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmgiCiAjaW5jbHVkZSAiLi4vYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmgiCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKKyNpbmNsdWRlICJjb21tb24vSGFsQ29udmVyc2lvbnNUZW1wbGF0ZWQuaCIKICNpbmNsdWRlICIuLi9DYW1lcmFTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9haWRsL0FpZGxDYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9oaWRsL0hpZGxDYW1lcmEzRGV2aWNlLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgiCisjaW5jbHVkZSAic3lzdGVtL2dyYXBoaWNzLWJhc2UtdjEuMS5oIgogCiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpPdXRwdXRTdHJlYW1JbmZvOwogdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbzsKIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6Om1ldGFkYXRhOjpWM182OjpDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgY2FtZXJhMyB7CiAKLWludDMyX3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6UEVSRl9DTEFTU19MRVZFTCA9Ci0gICAgICAgIHByb3BlcnR5X2dldF9pbnQzMigicm8ub2RtLmJ1aWxkLm1lZGlhX3BlcmZvcm1hbmNlX2NsYXNzIiwgMCk7Ci0KLWJvb2wgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6SVNfUEVSRl9DTEFTUyA9IChQRVJGX0NMQVNTX0xFVkVMID09IFNES19WRVJTSU9OX1MpOwotCi1jYW1lcmEzOjpTaXplIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldE1heEpwZWdSZXNvbHV0aW9uKGNvbnN0IENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwKLSAgICAgICAgYm9vbCB1bHRyYUhpZ2hSZXNvbHV0aW9uKSB7Ci0gICAgaW50MzJfdCBtYXhKcGVnV2lkdGggPSAwLCBtYXhKcGVnSGVpZ2h0ID0gMDsKLSAgICBjb25zdCBpbnQgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDQ7Ci0gICAgY29uc3QgaW50IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMDsKLSAgICBjb25zdCBpbnQgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDE7Ci0gICAgY29uc3QgaW50IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMjsKLSAgICBjb25zdCBpbnQgU1RSRUFNX0lTX0lOUFVUX09GRlNFVCA9IDM7Ci0KLSAgICBpbnQzMl90IHNjYWxlclNpemVzVGFnID0gdWx0cmFIaWdoUmVzb2x1dGlvbiA/Ci0gICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiA6Ci0gICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlM7Ci0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlU3RyZWFtQ29uZmlncyA9Ci0gICAgICAgICAgICBtZXRhZGF0YS5maW5kKHNjYWxlclNpemVzVGFnKTsKLSAgICBpZiAoYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudCA9PSAwIHx8Ci0gICAgICAgICAgICBhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50ICUgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBjYW1lcmEzOjpTaXplKDAsIDApOwotICAgIH0KLQotICAgIC8vIEdldCBtYXgganBlZyBzaXplIChhcmVhLXdpc2UpLgotICAgIGZvciAoc2l6ZV90IGk9IDA7IGkgPCBhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50OyBpKz0gU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSkgewotICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKLSAgICAgICAgaW50MzJfdCB3aWR0aCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOwotICAgICAgICBpbnQzMl90IGhlaWdodCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKLSAgICAgICAgaW50MzJfdCBpc0lucHV0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07Ci0gICAgICAgIGlmIChpc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUCi0gICAgICAgICAgICAgICAgJiYgZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQiAmJgotICAgICAgICAgICAgICAgICh3aWR0aCAqIGhlaWdodCA+IG1heEpwZWdXaWR0aCAqIG1heEpwZWdIZWlnaHQpKSB7Ci0gICAgICAgICAgICBtYXhKcGVnV2lkdGggPSB3aWR0aDsKLSAgICAgICAgICAgIG1heEpwZWdIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gY2FtZXJhMzo6U2l6ZShtYXhKcGVnV2lkdGgsIG1heEpwZWdIZWlnaHQpOwotfQotCi1zaXplX3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0VUhSTWF4SnBlZ0J1ZmZlclNpemUoY2FtZXJhMzo6U2l6ZSB1aHJNYXhKcGVnU2l6ZSwKLSAgICAgICAgY2FtZXJhMzo6U2l6ZSBkZWZhdWx0TWF4SnBlZ1NpemUsIHNpemVfdCBkZWZhdWx0TWF4SnBlZ0J1ZmZlclNpemUpIHsKLSAgICByZXR1cm4gKHVock1heEpwZWdTaXplLndpZHRoICogdWhyTWF4SnBlZ1NpemUuaGVpZ2h0KSAvCi0gICAgICAgICAgICAoZGVmYXVsdE1heEpwZWdTaXplLndpZHRoICogZGVmYXVsdE1heEpwZWdTaXplLmhlaWdodCkgKiBkZWZhdWx0TWF4SnBlZ0J1ZmZlclNpemU7Ci19Ci0KIHZvaWQgU3RyZWFtQ29uZmlndXJhdGlvbjo6Z2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoCiAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZzdGF0aWNJbmZvLCBpbnQgY29uZmlndXJhdGlvbiwKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc3RkOjp2ZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4+ICpzY20pIHsKQEAgLTEyNiw2NSArODIsNTcgQEAKICAgICBnZXRTdHJlYW1Db25maWd1cmF0aW9ucyhzdGF0aWNJbmZvLCBoZWljS2V5LCBzY20pOwogfQogCi1pbnQzMl90IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldEFwcHJvcHJpYXRlTW9kZVRhZyhpbnQzMl90IGRlZmF1bHRUYWcsIGJvb2wgbWF4UmVzb2x1dGlvbikgewotICAgIGlmICghbWF4UmVzb2x1dGlvbikgewotICAgICAgICByZXR1cm4gZGVmYXVsdFRhZzsKK25hbWVzcGFjZSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzIHsKKworaW50MzJfdCBQRVJGX0NMQVNTX0xFVkVMID0KKyAgICAgICAgcHJvcGVydHlfZ2V0X2ludDMyKCJyby5vZG0uYnVpbGQubWVkaWFfcGVyZm9ybWFuY2VfY2xhc3MiLCAwKTsKKworYm9vbCBJU19QRVJGX0NMQVNTID0gKFBFUkZfQ0xBU1NfTEVWRUwgPj0gU0RLX1ZFUlNJT05fUyk7CisKK2NhbWVyYTM6OlNpemUgZ2V0TWF4SnBlZ1Jlc29sdXRpb24oY29uc3QgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhLAorICAgICAgICBib29sIHVsdHJhSGlnaFJlc29sdXRpb24pIHsKKyAgICBpbnQzMl90IG1heEpwZWdXaWR0aCA9IDAsIG1heEpwZWdIZWlnaHQgPSAwOworICAgIGNvbnN0IGludCBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFID0gNDsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAwOworICAgIGNvbnN0IGludCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMTsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0hFSUdIVF9PRkZTRVQgPSAyOworICAgIGNvbnN0IGludCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKKworICAgIGludDMyX3Qgc2NhbGVyU2l6ZXNUYWcgPSB1bHRyYUhpZ2hSZXNvbHV0aW9uID8KKyAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OIDoKKyAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUzsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTdHJlYW1Db25maWdzID0KKyAgICAgICAgICAgIG1ldGFkYXRhLmZpbmQoc2NhbGVyU2l6ZXNUYWcpOworICAgIGlmIChhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50ID09IDAgfHwKKyAgICAgICAgICAgIGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQgJSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGNhbWVyYTM6OlNpemUoMCwgMCk7CiAgICAgfQotICAgIHN3aXRjaCAoZGVmYXVsdFRhZykgewotICAgICAgICBjYXNlIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlM6Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlM6Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlM6Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKLSAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKLSAgICAgICAgY2FzZSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVEFMTF9EVVJBVElPTlM6Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKLSAgICAgICAgY2FzZSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUzoKLSAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVEFMTF9EVVJBVElPTlM6Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlM6Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX01JTl9GUkFNRV9EVVJBVElPTlM6Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX01JTl9GUkFNRV9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOwotICAgICAgICBjYXNlIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlM6Ci0gICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9TRU5TT1JfT1BBUVVFX1JBV19TSVpFOgotICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfU0VOU09SX09QQVFVRV9SQVdfU0laRV9NQVhJTVVNX1JFU09MVVRJT047Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTjoKLSAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OX01BWElNVU1fUkVTT0xVVElPTjsKLSAgICAgICAgY2FzZSBBTkRST0lEX0xFTlNfRElTVE9SVElPTjoKLSAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0xFTlNfRElTVE9SVElPTl9NQVhJTVVNX1JFU09MVVRJT047Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFRhZyAlZCBkb2Vzbid0IGhhdmUgYSBtYXhpbXVtIHJlc29sdXRpb24gY291bnRlcnBhcnQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRUYWcpOwotICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgLy8gR2V0IG1heCBqcGVnIHNpemUgKGFyZWEtd2lzZSkuCisgICAgZm9yIChzaXplX3QgaT0gMDsgaSA8IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICAgIGludDMyX3QgZm9ybWF0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IHdpZHRoID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IGlzSW5wdXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgaWYgKGlzSW5wdXQgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQKKyAgICAgICAgICAgICAgICAmJiBmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CICYmCisgICAgICAgICAgICAgICAgKHdpZHRoICogaGVpZ2h0ID4gbWF4SnBlZ1dpZHRoICogbWF4SnBlZ0hlaWdodCkpIHsKKyAgICAgICAgICAgIG1heEpwZWdXaWR0aCA9IHdpZHRoOworICAgICAgICAgICAgbWF4SnBlZ0hlaWdodCA9IGhlaWdodDsKKyAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gY2FtZXJhMzo6U2l6ZShtYXhKcGVnV2lkdGgsIG1heEpwZWdIZWlnaHQpOwogfQogCi1ib29sIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldEFycmF5V2lkdGhBbmRIZWlnaHQoY29uc3QgQ2FtZXJhTWV0YWRhdGEgKmRldmljZUluZm8sCi0gICAgICAgIGludDMyX3QgYXJyYXlUYWcsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIHsKLSAgICBpZiAod2lkdGggPT0gbnVsbHB0ciB8fCBoZWlnaHQgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IHdpZHRoIC8gaGVpZ2h0IG51bGxwdHIiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OwotICAgIGVudHJ5ID0gZGV2aWNlSW5mby0+ZmluZChhcnJheVRhZyk7Ci0gICAgaWYgKGVudHJ5LmNvdW50ICE9IDQpIHJldHVybiBmYWxzZTsKLSAgICAqd2lkdGggPSBlbnRyeS5kYXRhLmkzMlsyXTsKLSAgICAqaGVpZ2h0ID0gZW50cnkuZGF0YS5pMzJbM107Ci0gICAgcmV0dXJuIHRydWU7CitzaXplX3QgZ2V0VUhSTWF4SnBlZ0J1ZmZlclNpemUoY2FtZXJhMzo6U2l6ZSB1aHJNYXhKcGVnU2l6ZSwKKyAgICAgICAgY2FtZXJhMzo6U2l6ZSBkZWZhdWx0TWF4SnBlZ1NpemUsIHNpemVfdCBkZWZhdWx0TWF4SnBlZ0J1ZmZlclNpemUpIHsKKyAgICByZXR1cm4gKHVock1heEpwZWdTaXplLndpZHRoICogdWhyTWF4SnBlZ1NpemUuaGVpZ2h0KSAvCisgICAgICAgICAgICAoZGVmYXVsdE1heEpwZWdTaXplLndpZHRoICogZGVmYXVsdE1heEpwZWdTaXplLmhlaWdodCkgKiBkZWZhdWx0TWF4SnBlZ0J1ZmZlclNpemU7CiB9CiAKIFN0cmVhbUNvbmZpZ3VyYXRpb25QYWlyCi1TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRTdHJlYW1Db25maWd1cmF0aW9uUGFpcihjb25zdCBDYW1lcmFNZXRhZGF0YSAmc3RhdGljSW5mbykgeworZ2V0U3RyZWFtQ29uZmlndXJhdGlvblBhaXIoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8pIHsKICAgICBjYW1lcmEzOjpTdHJlYW1Db25maWd1cmF0aW9uUGFpciBzdHJlYW1Db25maWd1cmF0aW9uUGFpcjsKICAgICBjYW1lcmEzOjpTdHJlYW1Db25maWd1cmF0aW9uOjpnZXRTdHJlYW1Db25maWd1cmF0aW9ucyhzdGF0aWNJbmZvLCBmYWxzZSwKICAgICAgICAgICAgICZzdHJlYW1Db25maWd1cmF0aW9uUGFpci5tRGVmYXVsdFN0cmVhbUNvbmZpZ3VyYXRpb25NYXApOwpAQCAtMTkzLDEzICsxNDEsMTMgQEAKICAgICByZXR1cm4gc3RyZWFtQ29uZmlndXJhdGlvblBhaXI7CiB9CiAKLWludDY0X3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6ZXVjbGlkRGlzdFNxdWFyZShpbnQzMl90IHgwLCBpbnQzMl90IHkwLCBpbnQzMl90IHgxLCBpbnQzMl90IHkxKSB7CitpbnQ2NF90IGV1Y2xpZERpc3RTcXVhcmUoaW50MzJfdCB4MCwgaW50MzJfdCB5MCwgaW50MzJfdCB4MSwgaW50MzJfdCB5MSkgewogICAgIGludDY0X3QgZDAgPSB4MCAtIHgxOwogICAgIGludDY0X3QgZDEgPSB5MCAtIHkxOwogICAgIHJldHVybiBkMCAqIGQwICsgZDEgKiBkMTsKIH0KIAotYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpyb3VuZEJ1ZmZlckRpbWVuc2lvbk5lYXJlc3QoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCitib29sIHJvdW5kQnVmZmVyRGltZW5zaW9uTmVhcmVzdChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKICAgICAgICAgaW50MzJfdCBmb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8sIGJvb2wgbWF4UmVzb2x1dGlvbiwgLypvdXQqL2ludDMyX3QqIG91dFdpZHRoLAogICAgICAgICAvKm91dCovaW50MzJfdCogb3V0SGVpZ2h0KSB7CkBAIC0yNjAsNyArMjA4LDgxIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6aXNQdWJsaWNGb3JtYXQoaW50MzJfdCBmb3JtYXQpCisvL2NoZWNrIGlmIGZvcm1hdCBpcyAxMC1iaXQgY29tcGF0aWJsZQorYm9vbCBpczEwYml0Q29tcGF0aWJsZUZvcm1hdChpbnQzMl90IGZvcm1hdCkgeworICAgIHN3aXRjaChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl9QMDEwOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIGlzRHluYW1pY1JhbmdlUHJvZmlsZVN1cHBvcnRlZChpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvKSB7CisgICAgaWYgKGR5bmFtaWNSYW5nZVByb2ZpbGUgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCkgeworICAgICAgICAvLyBTdXBwb3J0ZWQgYnkgZGVmYXVsdAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgYm9vbCBpczEwYml0RHluYW1pY1JhbmdlU3VwcG9ydGVkID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgKytpKSB7CisgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5LmRhdGEudThbaV07CisgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0RZTkFNSUNfUkFOR0VfVEVOX0JJVCkgeworICAgICAgICAgICAgaXMxMGJpdER5bmFtaWNSYW5nZVN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghaXMxMGJpdER5bmFtaWNSYW5nZVN1cHBvcnRlZCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3dpdGNoIChkeW5hbWljUmFuZ2VQcm9maWxlKSB7CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9IRFIxMF9QTFVTOgorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfSERSMTA6CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ITEcxMDoKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl8xMEJfSERSX09FTToKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl8xMEJfSERSX09FTV9QTzoKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl8xMEJfSERSX1JFRjoKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl8xMEJfSERSX1JFRl9QTzoKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl84Ql9IRFJfT0VNOgorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfRE9MQllfVklTSU9OXzhCX0hEUl9PRU1fUE86CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fOEJfSERSX1JFRjoKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0RPTEJZX1ZJU0lPTl84Ql9IRFJfUkVGX1BPOgorICAgICAgICAgICAgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IDMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZHluYW1pY1JhbmdlUHJvZmlsZSA9PSBlbnRyeS5kYXRhLmk2NFtpXSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vY2hlY2sgaWYgZm9ybWF0IGlzIDEwLWJpdCBjb21wYXRpYmxlCitib29sIGlzMTBiaXREeW5hbWljUmFuZ2VQcm9maWxlKGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSkgeworICAgIHN3aXRjaCAoZHluYW1pY1JhbmdlUHJvZmlsZSkgeworICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfSERSMTBfUExVUzoKKyAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX0hEUjEwOgorICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfRFlOQU1JQ19SQU5HRV9QUk9GSUxFU19NQVBfSExHMTA6CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9PRU06CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9PRU1fUE86CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9SRUY6CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9ET0xCWV9WSVNJT05fMTBCX0hEUl9SRUZfUE86CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgaXNQdWJsaWNGb3JtYXQoaW50MzJfdCBmb3JtYXQpCiB7CiAgICAgc3dpdGNoKGZvcm1hdCkgewogICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OgpAQCAtMjg3LDExICszMDksMzQgQEAKICAgICB9CiB9CiAKLWJpbmRlcjo6U3RhdHVzIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNyZWF0ZVN1cmZhY2VGcm9tR2JwKAorYm9vbCBpc1N0cmVhbVVzZUNhc2VTdXBwb3J0ZWQoaW50NjRfdCBzdHJlYW1Vc2VDYXNlLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZGV2aWNlSW5mbykgeworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVN0cmVhbVVzZUNhc2VzID0KKyAgICAgICAgICAgIGRldmljZUluZm8uZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFUyk7CisKKyAgICBpZiAoYXZhaWxhYmxlU3RyZWFtVXNlQ2FzZXMuY291bnQgPT0gMCAmJgorICAgICAgICAgICAgc3RyZWFtVXNlQ2FzZSA9PSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19ERUZBVUxUKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBBbGxvdyB2ZW5kb3Igc3RyZWFtIHVzZSBjYXNlIHVuY29uZGl0aW9uYWxseS4KKyAgICBpZiAoc3RyZWFtVXNlQ2FzZSA+PSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX1VTRV9DQVNFU19WRU5ET1JfU1RBUlQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVTdHJlYW1Vc2VDYXNlcy5jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChhdmFpbGFibGVTdHJlYW1Vc2VDYXNlcy5kYXRhLmk2NFtpXSA9PSBzdHJlYW1Vc2VDYXNlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2JpbmRlcjo6U3RhdHVzIGNyZWF0ZVN1cmZhY2VGcm9tR2JwKAogICAgICAgICBPdXRwdXRTdHJlYW1JbmZvJiBzdHJlYW1JbmZvLCBib29sIGlzU3RyZWFtSW5mb1ZhbGlkLAogICAgICAgICBzcDxTdXJmYWNlPiYgc3VyZmFjZSwgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwKICAgICAgICAgY29uc3QgU3RyaW5nOCAmbG9naWNhbENhbWVyYUlkLCBjb25zdCBDYW1lcmFNZXRhZGF0YSAmcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkKXsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLCBpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUsCisgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwgaW50IHRpbWVzdGFtcEJhc2UsIGludCBtaXJyb3JNb2RlKSB7CiAgICAgLy8gYnVmZmVyUHJvZHVjZXIgbXVzdCBiZSBub24tbnVsbAogICAgIGlmIChnYnAgPT0gbnVsbHB0cikgewogICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBTdXJmYWNlIGlzIE5VTEwiLCBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpOwpAQCAtMzg5LDYgKzQzNCw0MyBAQAogICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CiAgICAgfQorICAgIGlmICghU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6aXNEeW5hbWljUmFuZ2VQcm9maWxlU3VwcG9ydGVkKGR5bmFtaWNSYW5nZVByb2ZpbGUsCisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSkpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRHluYW1pYyByYW5nZSBwcm9maWxlIDB4JSIgUFJJeDY0CisgICAgICAgICAgICAgICAgIiBub3Qgc3VwcG9ydGVkLGZhaWxlZCB0byBjcmVhdGUgb3V0cHV0IHN0cmVhbSIsIGxvZ2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBkeW5hbWljUmFuZ2VQcm9maWxlKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAoU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6aXMxMGJpdER5bmFtaWNSYW5nZVByb2ZpbGUoZHluYW1pY1JhbmdlUHJvZmlsZSkgJiYKKyAgICAgICAgICAgICFTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjppczEwYml0Q29tcGF0aWJsZUZvcm1hdChmb3JtYXQpKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IE5vIDEwLWJpdCBzdXBwb3J0ZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGggIgorICAgICAgICAgICAgICAgICJmb3JtYXQgJSN4IGRlZmluZWQgYW5kIHByb2ZpbGUgJSIgUFJJeDY0ICIsIGZhaWxlZCB0byBjcmVhdGUgb3V0cHV0IHN0cmVhbSIsCisgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBmb3JtYXQsIGR5bmFtaWNSYW5nZVByb2ZpbGUpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorICAgIGlmICghU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6aXNTdHJlYW1Vc2VDYXNlU3VwcG9ydGVkKHN0cmVhbVVzZUNhc2UsCisgICAgICAgICAgICBwaHlzaWNhbENhbWVyYU1ldGFkYXRhKSkgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBzdHJlYW0gdXNlIGNhc2UgJSIgUFJJZDY0ICIgbm90IHN1cHBvcnRlZCwiCisgICAgICAgICAgICAgICAgIiBmYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBzdHJlYW0iLCBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCksIHN0cmVhbVVzZUNhc2UpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorICAgIGlmICh0aW1lc3RhbXBCYXNlIDwgT3V0cHV0Q29uZmlndXJhdGlvbjo6VElNRVNUQU1QX0JBU0VfREVGQVVMVCB8fAorICAgICAgICAgICAgdGltZXN0YW1wQmFzZSA+IE91dHB1dENvbmZpZ3VyYXRpb246OlRJTUVTVEFNUF9CQVNFX0NIT1JFT0dSQVBIRVJfU1lOQ0VEKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IGludmFsaWQgdGltZXN0YW1wIGJhc2UgJWQiLAorICAgICAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwgdGltZXN0YW1wQmFzZSk7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICB9CisgICAgaWYgKG1pcnJvck1vZGUgPCBPdXRwdXRDb25maWd1cmF0aW9uOjpNSVJST1JfTU9ERV9BVVRPIHx8CisgICAgICAgICAgICBtaXJyb3JNb2RlID4gT3V0cHV0Q29uZmlndXJhdGlvbjo6TUlSUk9SX01PREVfVikgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBpbnZhbGlkIG1pcnJvcmluZyBtb2RlICVkIiwKKyAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCksIG1pcnJvck1vZGUpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQogCiAgICAgaWYgKCFpc1N0cmVhbUluZm9WYWxpZCkgewogICAgICAgICBzdHJlYW1JbmZvLndpZHRoID0gd2lkdGg7CkBAIC0zOTcsNiArNDc5LDEwIEBACiAgICAgICAgIHN0cmVhbUluZm8uZGF0YVNwYWNlID0gZGF0YVNwYWNlOwogICAgICAgICBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UgPSBjb25zdW1lclVzYWdlOwogICAgICAgICBzdHJlYW1JbmZvLnNlbnNvclBpeGVsTW9kZXNVc2VkID0gb3ZlcnJpZGRlblNlbnNvclBpeGVsTW9kZXM7CisgICAgICAgIHN0cmVhbUluZm8uZHluYW1pY1JhbmdlUHJvZmlsZSA9IGR5bmFtaWNSYW5nZVByb2ZpbGU7CisgICAgICAgIHN0cmVhbUluZm8uc3RyZWFtVXNlQ2FzZSA9IHN0cmVhbVVzZUNhc2U7CisgICAgICAgIHN0cmVhbUluZm8udGltZXN0YW1wQmFzZSA9IHRpbWVzdGFtcEJhc2U7CisgICAgICAgIHN0cmVhbUluZm8ubWlycm9yTW9kZSA9IG1pcnJvck1vZGU7CiAgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICB9CiAgICAgaWYgKHdpZHRoICE9IHN0cmVhbUluZm8ud2lkdGgpIHsKQEAgLTQzNywxMTQgKzUyMyw0OSBAQAogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAotdm9pZCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjptYXBTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCit2b2lkIG1hcFN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKICAgICAgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgU3RyaW5nOCBwaHlzaWNhbElkLAotICAgICAgICAgICAgaW50MzJfdCBncm91cElkLCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbSAqc3RyZWFtIC8qb3V0Ki8pIHsKKyAgICAgICAgICAgIGludDMyX3QgZ3JvdXBJZCwgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW0gKnN0cmVhbSAvKm91dCovKSB7CiAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzdHJlYW0tPnYzXzQudjNfMi5zdHJlYW1UeXBlID0gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1UeXBlOjpPVVRQVVQ7Ci0gICAgc3RyZWFtLT52M180LnYzXzIud2lkdGggPSBzdHJlYW1JbmZvLndpZHRoOwotICAgIHN0cmVhbS0+djNfNC52M18yLmhlaWdodCA9IHN0cmVhbUluZm8uaGVpZ2h0OwotICAgIHN0cmVhbS0+djNfNC52M18yLmZvcm1hdCA9IENhbWVyYTNEZXZpY2U6Om1hcFRvUGl4ZWxGb3JtYXQoc3RyZWFtSW5mby5mb3JtYXQpOworICAgIHN0cmVhbS0+c3RyZWFtVHlwZSA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtVHlwZTo6T1VUUFVUOworICAgIHN0cmVhbS0+d2lkdGggPSBzdHJlYW1JbmZvLndpZHRoOworICAgIHN0cmVhbS0+aGVpZ2h0ID0gc3RyZWFtSW5mby5oZWlnaHQ7CisgICAgc3RyZWFtLT5mb3JtYXQgPSBBaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9BaWRsUGl4ZWxGb3JtYXQoc3RyZWFtSW5mby5mb3JtYXQpOwogICAgIGF1dG8gdSA9IHN0cmVhbUluZm8uY29uc3VtZXJVc2FnZTsKICAgICBjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtOjphcHBseVpTTFVzYWdlUXVpcmsoc3RyZWFtSW5mby5mb3JtYXQsICZ1KTsKLSAgICBzdHJlYW0tPnYzXzQudjNfMi51c2FnZSA9IENhbWVyYTNEZXZpY2U6Om1hcFRvQ29uc3VtZXJVc2FnZSh1KTsKLSAgICBzdHJlYW0tPnYzXzQudjNfMi5kYXRhU3BhY2UgPSBDYW1lcmEzRGV2aWNlOjptYXBUb0hpZGxEYXRhc3BhY2Uoc3RyZWFtSW5mby5kYXRhU3BhY2UpOwotICAgIHN0cmVhbS0+djNfNC52M18yLnJvdGF0aW9uID0gQ2FtZXJhM0RldmljZTo6bWFwVG9TdHJlYW1Sb3RhdGlvbihyb3RhdGlvbik7Ci0gICAgc3RyZWFtLT52M180LnYzXzIuaWQgPSAtMTsgLy8gSW52YWxpZCBzdHJlYW0gaWQKLSAgICBzdHJlYW0tPnYzXzQucGh5c2ljYWxDYW1lcmFJZCA9IHN0ZDo6c3RyaW5nKHBoeXNpY2FsSWQuc3RyaW5nKCkpOwotICAgIHN0cmVhbS0+djNfNC5idWZmZXJTaXplID0gMDsKKyAgICBzdHJlYW0tPnVzYWdlID0gQWlkbENhbWVyYTNEZXZpY2U6Om1hcFRvQWlkbENvbnN1bWVyVXNhZ2UodSk7CisgICAgc3RyZWFtLT5kYXRhU3BhY2UgPSBBaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9BaWRsRGF0YXNwYWNlKHN0cmVhbUluZm8uZGF0YVNwYWNlKTsKKyAgICBzdHJlYW0tPnJvdGF0aW9uID0gQWlkbENhbWVyYTNEZXZpY2U6Om1hcFRvQWlkbFN0cmVhbVJvdGF0aW9uKHJvdGF0aW9uKTsKKyAgICBzdHJlYW0tPmlkID0gLTE7IC8vIEludmFsaWQgc3RyZWFtIGlkCisgICAgc3RyZWFtLT5waHlzaWNhbENhbWVyYUlkID0gc3RkOjpzdHJpbmcocGh5c2ljYWxJZC5zdHJpbmcoKSk7CisgICAgc3RyZWFtLT5idWZmZXJTaXplID0gMDsKICAgICBzdHJlYW0tPmdyb3VwSWQgPSBncm91cElkOwogICAgIHN0cmVhbS0+c2Vuc29yUGl4ZWxNb2Rlc1VzZWQucmVzaXplKHN0cmVhbUluZm8uc2Vuc29yUGl4ZWxNb2Rlc1VzZWQuc2l6ZSgpKTsKICAgICBzaXplX3QgaWR4ID0gMDsKKyAgICB1c2luZyBTZW5zb3JQaXhlbE1vZGUgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjptZXRhZGF0YTo6U2Vuc29yUGl4ZWxNb2RlOwogICAgIGZvciAoYXV0byBtb2RlIDogc3RyZWFtSW5mby5zZW5zb3JQaXhlbE1vZGVzVXNlZCkgewogICAgICAgICBzdHJlYW0tPnNlbnNvclBpeGVsTW9kZXNVc2VkW2lkeCsrXSA9Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhTWV0YWRhdGFFbnVtQW5kcm9pZFNlbnNvclBpeGVsTW9kZT4obW9kZSk7CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2Vuc29yUGl4ZWxNb2RlPihtb2RlKTsKICAgICB9Ci19Ci0KLWJpbmRlcjo6U3RhdHVzIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNoZWNrUGh5c2ljYWxDYW1lcmFJZCgKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwaHlzaWNhbENhbWVyYUlkcywgY29uc3QgU3RyaW5nOCAmcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgY29uc3QgU3RyaW5nOCAmbG9naWNhbENhbWVyYUlkKSB7Ci0gICAgaWYgKHBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwotICAgIH0KLSAgICBpZiAoc3RkOjpmaW5kKHBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksIHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLAotICAgICAgICBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKSA9PSBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSkgewotICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBDYW1lcmEgZG9lc24ndCBzdXBwb3J0IHBoeXNpY2FsQ2FtZXJhSWQgJXMuIiwKLSAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCksIHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpOwotICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKLX0KLQotYmluZGVyOjpTdGF0dXMgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y2hlY2tTdXJmYWNlVHlwZShzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzLAotICAgICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIsIGludCBzdXJmYWNlVHlwZSkgIHsKLSAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID4gTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pIHsKLSAgICAgICAgQUxPR0UoIiVzOiBHcmFwaGljQnVmZmVyUHJvZHVjZXIgY291bnQgJXp1IGZvciBzdHJlYW0gZXhjZWVkcyBsaW1pdCBvZiAlZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBudW1CdWZmZXJQcm9kdWNlcnMsIE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiU3VyZmFjZSBjb3VudCBpcyB0b28gaGlnaCIpOwotICAgIH0gZWxzZSBpZiAoKG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwKSAmJiAoIWRlZmVycmVkQ29uc3VtZXIpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTnVtYmVyIG9mIGNvbnN1bWVycyBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJObyB2YWxpZCBjb25zdW1lcnMuIik7Ci0gICAgfQotCi0gICAgYm9vbCB2YWxpZFN1cmZhY2VUeXBlID0gKChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB8fAotICAgICAgICAgICAgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1RFWFRVUkUpKTsKLQotICAgIGlmIChkZWZlcnJlZENvbnN1bWVyICYmICF2YWxpZFN1cmZhY2VUeXBlKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVGFyZ2V0IHN1cmZhY2UgaGFzIGludmFsaWQgc3VyZmFjZVR5cGUgPSAlZC4iLCBfX0ZVTkNUSU9OX18sIHN1cmZhY2VUeXBlKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiVGFyZ2V0IFN1cmZhY2UgaXMgaW52YWxpZCIpOwotICAgIH0KLQotICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKLX0KLQotYmluZGVyOjpTdGF0dXMgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y2hlY2tPcGVyYXRpbmdNb2RlKGludCBvcGVyYXRpbmdNb2RlLAotICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmc3RhdGljSW5mbywgY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQpIHsKLSAgICBpZiAob3BlcmF0aW5nTW9kZSA8IDApIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCi0gICAgICAgICAgICAiQ2FtZXJhICVzOiBJbnZhbGlkIG9wZXJhdGluZyBtb2RlICVkIHJlcXVlc3RlZCIsIGNhbWVyYUlkLnN0cmluZygpLCBvcGVyYXRpbmdNb2RlKTsKLSAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkID0gKG9wZXJhdGluZ01vZGUgPT0gSUNhbWVyYURldmljZVVzZXI6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSk7Ci0gICAgaWYgKGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOwotICAgICAgICBib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWRTdXBwb3J0ZWQgPSBmYWxzZTsKLSAgICAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5LmRhdGEudThbaV07Ci0gICAgICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19DT05TVFJBSU5FRF9ISUdIX1NQRUVEX1ZJREVPKSB7Ci0gICAgICAgICAgICAgICAgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZFN1cHBvcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpc0NvbnN0cmFpbmVkSGlnaFNwZWVkU3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBUcnkgdG8gY3JlYXRlIGEgY29uc3RyYWluZWQgaGlnaCBzcGVlZCBjb25maWd1cmF0aW9uIG9uIGEgZGV2aWNlIgotICAgICAgICAgICAgICAgICIgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaXQuIiwgY2FtZXJhSWQuc3RyaW5nKCkpOwotICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB1c2luZyBEeW5hbWljUmFuZ2VQcm9maWxlID0KKyAgICAgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6Om1ldGFkYXRhOjpSZXF1ZXN0QXZhaWxhYmxlRHluYW1pY1JhbmdlUHJvZmlsZXNNYXA7CisgICAgc3RyZWFtLT5keW5hbWljUmFuZ2VQcm9maWxlID0gc3RhdGljX2Nhc3Q8RHluYW1pY1JhbmdlUHJvZmlsZT4oc3RyZWFtSW5mby5keW5hbWljUmFuZ2VQcm9maWxlKTsKKyAgICB1c2luZyBTdHJlYW1Vc2VDYXNlcyA9CisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjptZXRhZGF0YTo6U2NhbGVyQXZhaWxhYmxlU3RyZWFtVXNlQ2FzZXM7CisgICAgc3RyZWFtLT51c2VDYXNlID0gc3RhdGljX2Nhc3Q8U3RyZWFtVXNlQ2FzZXM+KHN0cmVhbUluZm8uc3RyZWFtVXNlQ2FzZSk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzCi1TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbigKK2NvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKAogICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgc2Vzc2lvbkNvbmZpZ3VyYXRpb24sCiAgICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8sCiAgICAgICAgIG1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBoeXNpY2FsQ2FtZXJhSWRzLAotICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ3VyYXRpb24sCisgICAgICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlndXJhdGlvbiwKICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgYm9vbCAqZWFybHlFeGl0KSB7Ci0KKyAgICB1c2luZyBTZW5zb3JQaXhlbE1vZGUgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjptZXRhZGF0YTo6U2Vuc29yUGl4ZWxNb2RlOwogICAgIGF1dG8gb3BlcmF0aW5nTW9kZSA9IHNlc3Npb25Db25maWd1cmF0aW9uLmdldE9wZXJhdGluZ01vZGUoKTsKICAgICBiaW5kZXI6OlN0YXR1cyByZXMgPSBjaGVja09wZXJhdGluZ01vZGUob3BlcmF0aW5nTW9kZSwgZGV2aWNlSW5mbywgbG9naWNhbENhbWVyYUlkKTsKICAgICBpZiAoIXJlcy5pc09rKCkpIHsKQEAgLTU1Nyw3ICs1NzgsNyBAQAogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CiAgICAgfQogICAgICplYXJseUV4aXQgPSBmYWxzZTsKLSAgICBhdXRvIHJldCA9IENhbWVyYTNEZXZpY2U6Om1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgYXV0byByZXQgPSBBaWRsQ2FtZXJhM0RldmljZTo6bWFwVG9BaWRsU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90PiAob3BlcmF0aW5nTW9kZSksCiAgICAgICAgICAgICAvKm91dCovICZzdHJlYW1Db25maWd1cmF0aW9uLm9wZXJhdGlvbk1vZGUpOwogICAgIGlmIChyZXQgIT0gT0spIHsKQEAgLTU3OCwxOSArNTk5LDMxIEBACiAgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShzdHJlYW1Db3VudCk7CiAgICAgc2l6ZV90IHN0cmVhbUlkeCA9IDA7CiAgICAgaWYgKGlzSW5wdXRWYWxpZCkgewotICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8Q2FtZXJhTWV0YWRhdGFFbnVtQW5kcm9pZFNlbnNvclBpeGVsTW9kZT4gZGVmYXVsdFNlbnNvclBpeGVsTW9kZXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPFNlbnNvclBpeGVsTW9kZT4gZGVmYXVsdFNlbnNvclBpeGVsTW9kZXM7CiAgICAgICAgIGRlZmF1bHRTZW5zb3JQaXhlbE1vZGVzLnJlc2l6ZSgxKTsKICAgICAgICAgZGVmYXVsdFNlbnNvclBpeGVsTW9kZXNbMF0gPQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYU1ldGFkYXRhRW51bUFuZHJvaWRTZW5zb3JQaXhlbE1vZGU+KAotICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUKTsKLSAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSA9IHt7ey8qc3RyZWFtSWQqLzAsCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1UeXBlOjpJTlBVVCwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4gKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0V2lkdGgoKSksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEhlaWdodCgpKSwKLSAgICAgICAgICAgICAgICBDYW1lcmEzRGV2aWNlOjptYXBUb1BpeGVsRm9ybWF0KHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0Rm9ybWF0KCkpLAotICAgICAgICAgICAgICAgIC8qdXNhZ2UqLyAwLCBIQUxfREFUQVNQQUNFX1VOS05PV04sCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMH0sCi0gICAgICAgICAgICAgICAgLypwaHlzaWNhbElkKi8gbnVsbHB0ciwgLypidWZmZXJTaXplKi8wfSwgLypncm91cElkKi8tMSwgZGVmYXVsdFNlbnNvclBpeGVsTW9kZXN9OworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFNlbnNvclBpeGVsTW9kZT4oQU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUKTsKKyAgICAgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW0gc3RyZWFtOworICAgICAgICBzdHJlYW0uaWQgPSAwOworICAgICAgICBzdHJlYW0uc3RyZWFtVHlwZSA9ICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlN0cmVhbVR5cGU6OklOUFVUOworICAgICAgICBzdHJlYW0ud2lkdGggPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4gKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0V2lkdGgoKSk7CisgICAgICAgIHN0cmVhbS5oZWlnaHQgPSAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEhlaWdodCgpKTsKKyAgICAgICAgc3RyZWFtLmZvcm1hdCA9CisgICAgICAgICAgICAgICAgQWlkbENhbWVyYTNEZXZpY2U6OkFpZGxDYW1lcmEzRGV2aWNlOjptYXBUb0FpZGxQaXhlbEZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0Rm9ybWF0KCkpOworICAgICAgICBzdHJlYW0udXNhZ2UgPSBzdGF0aWNfY2FzdDxhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6QnVmZmVyVXNhZ2U+KDApOworICAgICAgICBzdHJlYW0uZGF0YVNwYWNlID0KKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OkRhdGFzcGFjZT4oCisgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9VTktOT1dOKTsKKyAgICAgICAgc3RyZWFtLnJvdGF0aW9uID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMDsKKyAgICAgICAgc3RyZWFtLmJ1ZmZlclNpemUgPSAwOworICAgICAgICBzdHJlYW0uZ3JvdXBJZCA9IC0xOworICAgICAgICBzdHJlYW0uc2Vuc29yUGl4ZWxNb2Rlc1VzZWQgPSBkZWZhdWx0U2Vuc29yUGl4ZWxNb2RlczsKKyAgICAgICAgdXNpbmcgRHluYW1pY1JhbmdlUHJvZmlsZSA9CisgICAgICAgICAgICBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjptZXRhZGF0YTo6UmVxdWVzdEF2YWlsYWJsZUR5bmFtaWNSYW5nZVByb2ZpbGVzTWFwOworICAgICAgICBzdHJlYW0uZHluYW1pY1JhbmdlUHJvZmlsZSA9CisgICAgICAgICAgICBEeW5hbWljUmFuZ2VQcm9maWxlOjpBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0RZTkFNSUNfUkFOR0VfUFJPRklMRVNfTUFQX1NUQU5EQVJEOworICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdID0gc3RyZWFtOwogICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLm11bHRpUmVzb2x1dGlvbklucHV0SW1hZ2UgPQogICAgICAgICAgICAgICAgIHNlc3Npb25Db25maWd1cmF0aW9uLmlucHV0SXNNdWx0aVJlc29sdXRpb24oKTsKICAgICB9CkBAIC02MDEsNiArNjM0LDcgQEAKICAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyID0gaXQuaXNEZWZlcnJlZCgpOwogICAgICAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQgPSBTdHJpbmc4KGl0LmdldFBoeXNpY2FsQ2FtZXJhSWQoKSk7CiAKKyAgICAgICAgaW50NjRfdCBkeW5hbWljUmFuZ2VQcm9maWxlID0gaXQuZ2V0RHluYW1pY1JhbmdlUHJvZmlsZSgpOwogICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBzZW5zb3JQaXhlbE1vZGVzVXNlZCA9IGl0LmdldFNlbnNvclBpeGVsTW9kZXNVc2VkKCk7CiAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZwaHlzaWNhbERldmljZUluZm8gPSBnZXRNZXRhZGF0YShwaHlzaWNhbENhbWVyYUlkLAogICAgICAgICAgICAgICAgIG92ZXJyaWRlRm9yUGVyZkNsYXNzKTsKQEAgLTYyMiw2ICs2NTYsOSBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogCisgICAgICAgIGludDY0X3Qgc3RyZWFtVXNlQ2FzZSA9IGl0LmdldFN0cmVhbVVzZUNhc2UoKTsKKyAgICAgICAgaW50IHRpbWVzdGFtcEJhc2UgPSBpdC5nZXRUaW1lc3RhbXBCYXNlKCk7CisgICAgICAgIGludCBtaXJyb3JNb2RlID0gaXQuZ2V0TWlycm9yTW9kZSgpOwogICAgICAgICBpZiAoZGVmZXJyZWRDb25zdW1lcikgewogICAgICAgICAgICAgc3RyZWFtSW5mby53aWR0aCA9IGl0LmdldFdpZHRoKCk7CiAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCA9IGl0LmdldEhlaWdodCgpOwpAQCAtNjMyLDYgKzY2OSw3IEBACiAgICAgICAgICAgICBpZiAoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVklFVykgewogICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uY29uc3VtZXJVc2FnZSB8PSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19DT01QT1NFUjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbUluZm8uZHluYW1pY1JhbmdlUHJvZmlsZSA9IGl0LmdldER5bmFtaWNSYW5nZVByb2ZpbGUoKTsKICAgICAgICAgICAgIGlmIChjaGVja0FuZE92ZXJyaWRlU2Vuc29yUGl4ZWxNb2Rlc1VzZWQoc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCiAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uZm9ybWF0LCBzdHJlYW1JbmZvLndpZHRoLAogICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCwgbWV0YWRhdGFDaG9zZW4sIGZhbHNlIC8qZmxleGlibGVDb25zdW1lciovLApAQCAtNjQxLDYgKzY3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWZlcnJlZCBzdXJmYWNlIHNlbnNvciBwaXhlbCBtb2RlcyBub3QgdmFsaWQiKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbUluZm8uc3RyZWFtVXNlQ2FzZSA9IHN0cmVhbVVzZUNhc2U7CiAgICAgICAgICAgICBtYXBTdHJlYW1JbmZvKHN0cmVhbUluZm8sIGNhbWVyYTM6OkNBTUVSQV9TVFJFQU1fUk9UQVRJT05fMCwgcGh5c2ljYWxDYW1lcmFJZCwgZ3JvdXBJZCwKICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOwogICAgICAgICAgICAgaXNTdHJlYW1JbmZvVmFsaWQgPSB0cnVlOwpAQCAtNjUzLDcgKzY5Miw4IEBACiAgICAgICAgIGZvciAoYXV0byYgYnVmZmVyUHJvZHVjZXIgOiBidWZmZXJQcm9kdWNlcnMpIHsKICAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CiAgICAgICAgICAgICByZXMgPSBjcmVhdGVTdXJmYWNlRnJvbUdicChzdHJlYW1JbmZvLCBpc1N0cmVhbUluZm9WYWxpZCwgc3VyZmFjZSwgYnVmZmVyUHJvZHVjZXIsCi0gICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZCwgbWV0YWRhdGFDaG9zZW4sIHNlbnNvclBpeGVsTW9kZXNVc2VkKTsKKyAgICAgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLCBtZXRhZGF0YUNob3Nlbiwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIGR5bmFtaWNSYW5nZVByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbVVzZUNhc2UsIHRpbWVzdGFtcEJhc2UsIG1pcnJvck1vZGUpOwogCiAgICAgICAgICAgICBpZiAoIXJlcy5pc09rKCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTcxMSw2ICs3NTEsNzggQEAKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiB9CiAKK2JpbmRlcjo6U3RhdHVzIGNoZWNrUGh5c2ljYWxDYW1lcmFJZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwaHlzaWNhbENhbWVyYUlkcywgY29uc3QgU3RyaW5nOCAmcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgY29uc3QgU3RyaW5nOCAmbG9naWNhbENhbWVyYUlkKSB7CisgICAgaWYgKHBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH0KKyAgICBpZiAoc3RkOjpmaW5kKHBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksIHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLAorICAgICAgICBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKSA9PSBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBDYW1lcmEgZG9lc24ndCBzdXBwb3J0IHBoeXNpY2FsQ2FtZXJhSWQgJXMuIiwKKyAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCksIHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgY2hlY2tTdXJmYWNlVHlwZShzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzLAorICAgICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIsIGludCBzdXJmYWNlVHlwZSkgIHsKKyAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID4gTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBHcmFwaGljQnVmZmVyUHJvZHVjZXIgY291bnQgJXp1IGZvciBzdHJlYW0gZXhjZWVkcyBsaW1pdCBvZiAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBudW1CdWZmZXJQcm9kdWNlcnMsIE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiU3VyZmFjZSBjb3VudCBpcyB0b28gaGlnaCIpOworICAgIH0gZWxzZSBpZiAoKG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwKSAmJiAoIWRlZmVycmVkQ29uc3VtZXIpKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVtYmVyIG9mIGNvbnN1bWVycyBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJObyB2YWxpZCBjb25zdW1lcnMuIik7CisgICAgfQorCisgICAgYm9vbCB2YWxpZFN1cmZhY2VUeXBlID0gKChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB8fAorICAgICAgICAgICAgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1RFWFRVUkUpKTsKKworICAgIGlmIChkZWZlcnJlZENvbnN1bWVyICYmICF2YWxpZFN1cmZhY2VUeXBlKSB7CisgICAgICAgIEFMT0dFKCIlczogVGFyZ2V0IHN1cmZhY2UgaGFzIGludmFsaWQgc3VyZmFjZVR5cGUgPSAlZC4iLCBfX0ZVTkNUSU9OX18sIHN1cmZhY2VUeXBlKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiVGFyZ2V0IFN1cmZhY2UgaXMgaW52YWxpZCIpOworICAgIH0KKworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgY2hlY2tPcGVyYXRpbmdNb2RlKGludCBvcGVyYXRpbmdNb2RlLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmc3RhdGljSW5mbywgY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQpIHsKKyAgICBpZiAob3BlcmF0aW5nTW9kZSA8IDApIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAiQ2FtZXJhICVzOiBJbnZhbGlkIG9wZXJhdGluZyBtb2RlICVkIHJlcXVlc3RlZCIsIGNhbWVyYUlkLnN0cmluZygpLCBvcGVyYXRpbmdNb2RlKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkID0gKG9wZXJhdGluZ01vZGUgPT0gSUNhbWVyYURldmljZVVzZXI6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSk7CisgICAgaWYgKGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgICAgICBib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWRTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5LmRhdGEudThbaV07CisgICAgICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19DT05TVFJBSU5FRF9ISUdIX1NQRUVEX1ZJREVPKSB7CisgICAgICAgICAgICAgICAgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZFN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpc0NvbnN0cmFpbmVkSGlnaFNwZWVkU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKKyAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBUcnkgdG8gY3JlYXRlIGEgY29uc3RyYWluZWQgaGlnaCBzcGVlZCBjb25maWd1cmF0aW9uIG9uIGEgZGV2aWNlIgorICAgICAgICAgICAgICAgICIgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaXQuIiwgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKwogc3RhdGljIGJvb2wgaW5TdHJlYW1Db25maWd1cmF0aW9uTWFwKGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc3RkOjp2ZWN0b3I8Y2FtZXJhMzo6U3RyZWFtQ29uZmlndXJhdGlvbj4+ICZzbSkgewogICAgIGF1dG8gc2NzID0gc20uZmluZChmb3JtYXQpOwpAQCAtNzI5LDcgKzg0MSw3IEBACiAgICAgcmV0dXJuIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PihzZW5zb3JQaXhlbE1vZGVzVXNlZC5iZWdpbigpLCBzZW5zb3JQaXhlbE1vZGVzVXNlZC5lbmQoKSk7CiB9CiAKLXN0YXR1c190IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNoZWNrQW5kT3ZlcnJpZGVTZW5zb3JQaXhlbE1vZGVzVXNlZCgKK3N0YXR1c190IGNoZWNrQW5kT3ZlcnJpZGVTZW5zb3JQaXhlbE1vZGVzVXNlZCgKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLCBpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZzdGF0aWNJbmZvLCBib29sIGZsZXhpYmxlQ29uc3VtZXIsCiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAqb3ZlcnJpZGRlblNlbnNvclBpeGVsTW9kZXNVc2VkKSB7CkBAIC03OTUsNDQgKzkwNyw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1ib29sIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcihjb25zdCBDYW1lcmFNZXRhZGF0YSAmZGV2aWNlSW5mbykgewotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5Q2FwOwotICAgIGVudHJ5Q2FwID0gZGV2aWNlSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKLSAgICAvLyBHbyB0aHJvdWdoIHRoZSBjYXBhYmlsaXRpZXMgYW5kIGNoZWNrIGlmIGl0IGhhcwotICAgIC8vIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5Q2FwLmNvdW50OyArK2kpIHsKLSAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gZW50cnlDYXAuZGF0YS51OFtpXTsKLSAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRIQUxTdHJlYW1Db21iaW5hdGlvbkZyb21WMzdUb1YzNCgKLSAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWdWMzQsCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlnVjM3KSB7Ci0gICAgaWYgKHN0cmVhbUNvbmZpZ1YzNy5tdWx0aVJlc29sdXRpb25JbnB1dEltYWdlKSB7Ci0gICAgICAgIC8vIElDYW1lcmFEZXZpY2Ugb2xkZXIgdGhhbiAzLjcgZG9lc24ndCBzdXBwb3J0IG11bHRpLXJlc29sdXRpb24gaW5wdXQgaW1hZ2UuCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdHJlYW1Db25maWdWMzQuc3RyZWFtcy5yZXNpemUoc3RyZWFtQ29uZmlnVjM3LnN0cmVhbXMuc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmVhbUNvbmZpZ1YzNy5zdHJlYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChzdHJlYW1Db25maWdWMzcuc3RyZWFtc1tpXS5ncm91cElkICE9IC0xKSB7Ci0gICAgICAgICAgICAvLyBJQ2FtZXJhRGV2aWNlIG9sZGVyIHRoYW4gMy43IGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aS1yZXNvbHV0aW9uIG91dHB1dAotICAgICAgICAgICAgLy8gaW1hZ2UKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBzdHJlYW1Db25maWdWMzQuc3RyZWFtc1tpXSA9IHN0cmVhbUNvbmZpZ1YzNy5zdHJlYW1zW2ldLnYzXzQ7Ci0gICAgfQotICAgIHN0cmVhbUNvbmZpZ1YzNC5vcGVyYXRpb25Nb2RlID0gc3RyZWFtQ29uZmlnVjM3Lm9wZXJhdGlvbk1vZGU7Ci0gICAgc3RyZWFtQ29uZmlnVjM0LnNlc3Npb25QYXJhbXMgPSBzdHJlYW1Db25maWdWMzcuc2Vzc2lvblBhcmFtczsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OnRhcmdldFBlcmZDbGFzc1ByaW1hcnlDYW1lcmEoCitib29sIHRhcmdldFBlcmZDbGFzc1ByaW1hcnlDYW1lcmEoCiAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkLAogICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbikgewogICAgIGJvb2wgaXNQZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhID0KQEAgLTg0MCw1ICs5MTUsNiBAQAogICAgIHJldHVybiB0YXJnZXRTZGtWZXJzaW9uID49IFNES19WRVJTSU9OX1MgJiYgaXNQZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhOwogfQogCit9IC8vIG5hbWVzcGFjZSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzCiB9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmgKaW5kZXggMTkyZTI0MS4uYTEyN2M3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaApAQCAtMjEsMTUgKzIxLDE4IEBACiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU3VibWl0SW5mby5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjcvdHlwZXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS9JQ2FtZXJhRGV2aWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjcvSUNhbWVyYURldmljZVNlc3Npb24uaD4KIAogI2luY2x1ZGUgPGRldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0lQQ1RyYW5zcG9ydC5oPgogCiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN0ZGludC5oPgogCisjaW5jbHVkZSAiU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hvc3QuaCIKKwogLy8gQ29udmVuaWVuY2UgbWV0aG9kcyBmb3IgY29uc3RydWN0aW5nIGJpbmRlcjo6U3RhdHVzIG9iamVjdHMgZm9yIGVycm9yIHJldHVybnMKIAogI2RlZmluZSBTVEFUVVNfRVJST1IoZXJyb3JDb2RlLCBlcnJvclN0cmluZykgXApAQCAtNDQsNyArNDcsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNhbWVyYTMgewogCi10eXBlZGVmIHN0ZDo6ZnVuY3Rpb248Q2FtZXJhTWV0YWRhdGEgKGNvbnN0IFN0cmluZzggJiwgaW50IHRhcmdldFNka1ZlcnNpb24pPiBtZXRhZGF0YUdldHRlcjsKK3R5cGVkZWYgc3RkOjpmdW5jdGlvbjxDYW1lcmFNZXRhZGF0YSAoY29uc3QgU3RyaW5nOCAmLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzKT4gbWV0YWRhdGFHZXR0ZXI7CiAKIGNsYXNzIFN0cmVhbUNvbmZpZ3VyYXRpb24gewogcHVibGljOgpAQCAtNjksOTYgKzcyLDkyIEBACiAgICAgICAgICAgICBtTWF4aW11bVJlc29sdXRpb25TdHJlYW1Db25maWd1cmF0aW9uTWFwOwogfTsKIAotY2xhc3MgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscyB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIGNhbWVyYTM6OlNpemUgZ2V0TWF4SnBlZ1Jlc29sdXRpb24oY29uc3QgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhLAotICAgICAgICAgICAgYm9vbCB1bHRyYUhpZ2hSZXNvbHV0aW9uKTsKK25hbWVzcGFjZSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzIHsKIAotICAgIHN0YXRpYyBzaXplX3QgZ2V0VUhSTWF4SnBlZ0J1ZmZlclNpemUoY2FtZXJhMzo6U2l6ZSB1aHJNYXhKcGVnU2l6ZSwKLSAgICAgICAgICAgIGNhbWVyYTM6OlNpemUgZGVmYXVsdE1heEpwZWdTaXplLCBzaXplX3QgZGVmYXVsdE1heEpwZWdCdWZmZXJTaXplKTsKK2NhbWVyYTM6OlNpemUgZ2V0TWF4SnBlZ1Jlc29sdXRpb24oY29uc3QgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhLAorICAgICAgICBib29sIHVsdHJhSGlnaFJlc29sdXRpb24pOwogCi0gICAgc3RhdGljIGludDY0X3QgZXVjbGlkRGlzdFNxdWFyZShpbnQzMl90IHgwLCBpbnQzMl90IHkwLCBpbnQzMl90IHgxLCBpbnQzMl90IHkxKTsKK3NpemVfdCBnZXRVSFJNYXhKcGVnQnVmZmVyU2l6ZShjYW1lcmEzOjpTaXplIHVock1heEpwZWdTaXplLAorICAgICAgICBjYW1lcmEzOjpTaXplIGRlZmF1bHRNYXhKcGVnU2l6ZSwgc2l6ZV90IGRlZmF1bHRNYXhKcGVnQnVmZmVyU2l6ZSk7CiAKLSAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IGRpbWVuc2lvbnMgZm9yIGEgZ2l2ZW4gZm9ybWF0IGluIGF2YWlsYWJsZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2l0aAotICAgIC8vIGEgd2lkdGggPD0gUk9VTkRJTkdfV0lEVEhfQ0FQCi0gICAgc3RhdGljIGJvb2wgcm91bmRCdWZmZXJEaW1lbnNpb25OZWFyZXN0KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGZvcm1hdCwKLSAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8sIGJvb2wgbWF4UmVzb2x1dGlvbiwKLSAgICAgICAgICAgIC8qb3V0Ki9pbnQzMl90KiBvdXRXaWR0aCwgLypvdXQqL2ludDMyX3QqIG91dEhlaWdodCk7CitpbnQ2NF90IGV1Y2xpZERpc3RTcXVhcmUoaW50MzJfdCB4MCwgaW50MzJfdCB5MCwgaW50MzJfdCB4MSwgaW50MzJfdCB5MSk7CiAKLSAgICBzdGF0aWMgYm9vbCBnZXRBcnJheVdpZHRoQW5kSGVpZ2h0KGNvbnN0IENhbWVyYU1ldGFkYXRhICpkZXZpY2VJbmZvLCBpbnQzMl90IGFycmF5VGFnLAotICAgICAgICAgICAgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCk7CisvLyBGaW5kIHRoZSBjbG9zZXN0IGRpbWVuc2lvbnMgZm9yIGEgZ2l2ZW4gZm9ybWF0IGluIGF2YWlsYWJsZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2l0aAorLy8gYSB3aWR0aCA8PSBST1VORElOR19XSURUSF9DQVAKK2Jvb2wgcm91bmRCdWZmZXJEaW1lbnNpb25OZWFyZXN0KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbywgYm9vbCBtYXhSZXNvbHV0aW9uLAorICAgICAgICAvKm91dCovaW50MzJfdCogb3V0V2lkdGgsIC8qb3V0Ki9pbnQzMl90KiBvdXRIZWlnaHQpOwogCi0gICAgLy9jaGVjayBpZiBmb3JtYXQgaXMgbm90IGN1c3RvbSBmb3JtYXQKLSAgICBzdGF0aWMgYm9vbCBpc1B1YmxpY0Zvcm1hdChpbnQzMl90IGZvcm1hdCk7CisvLyBjaGVjayBpZiBmb3JtYXQgaXMgbm90IGN1c3RvbSBmb3JtYXQKK2Jvb2wgaXNQdWJsaWNGb3JtYXQoaW50MzJfdCBmb3JtYXQpOwogCi0gICAgLy8gQ3JlYXRlIGEgU3VyZmFjZSBmcm9tIGFuIElHcmFwaGljQnVmZmVyUHJvZHVjZXIuIFJldHVybnMgZXJyb3IgaWYKLSAgICAvLyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyJ3MgcHJvcGVydHkgZG9lc24ndCBtYXRjaCB3aXRoIHN0cmVhbUluZm8KLSAgICBzdGF0aWMgYmluZGVyOjpTdGF0dXMgY3JlYXRlU3VyZmFjZUZyb21HYnAoCisvLyBDcmVhdGUgYSBTdXJmYWNlIGZyb20gYW4gSUdyYXBoaWNCdWZmZXJQcm9kdWNlci4gUmV0dXJucyBlcnJvciBpZgorLy8gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcidzIHByb3BlcnR5IGRvZXNuJ3QgbWF0Y2ggd2l0aCBzdHJlYW1JbmZvCitiaW5kZXI6OlN0YXR1cyBjcmVhdGVTdXJmYWNlRnJvbUdicCgKICAgICAgICAgY2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbyYgc3RyZWFtSW5mbywgYm9vbCBpc1N0cmVhbUluZm9WYWxpZCwKICAgICAgICAgc3A8U3VyZmFjZT4mIHN1cmZhY2UsIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsCiAgICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCk7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgIGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSwKKyAgICAgICAgaW50NjRfdCBzdHJlYW1Vc2VDYXNlLCBpbnQgdGltZXN0YW1wQmFzZSwgaW50IG1pcnJvck1vZGUpOwogCi0gICAgc3RhdGljIHZvaWQgbWFwU3RyZWFtSW5mbyhjb25zdCBjYW1lcmEzOjpPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAotICAgICAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBTdHJpbmc4IHBoeXNpY2FsSWQsIGludDMyX3QgZ3JvdXBJZCwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtICpzdHJlYW0gLypvdXQqLyk7CisvL2NoZWNrIGlmIGZvcm1hdCBpcyAxMC1iaXQgb3V0cHV0IGNvbXBhdGlibGUKK2Jvb2wgaXMxMGJpdENvbXBhdGlibGVGb3JtYXQoaW50MzJfdCBmb3JtYXQpOwogCi0gICAgLy8gQ2hlY2sgdGhhdCB0aGUgcGh5c2ljYWxDYW1lcmFJZCBwYXNzZWQgaW4gaXMgc3Bwb3J0ZWQgYnkgdGhlIGNhbWVyYQotICAgIC8vIGRldmljZS4KLSAgICBzdGF0aWMgYmluZGVyOjpTdGF0dXMgY2hlY2tQaHlzaWNhbENhbWVyYUlkKAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBoeXNpY2FsQ2FtZXJhSWRzLCBjb25zdCBTdHJpbmc4ICZwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICBjb25zdCBTdHJpbmc4ICZsb2dpY2FsQ2FtZXJhSWQpOworLy8gY2hlY2sgaWYgdGhlIGR5bmFtaWMgcmFuZ2UgcmVxdWlyZXMgMTAtYml0IG91dHB1dAorYm9vbCBpczEwYml0RHluYW1pY1JhbmdlUHJvZmlsZShpbnQ2NF90IGR5bmFtaWNSYW5nZVByb2ZpbGUpOwogCi0gICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIGNoZWNrU3VyZmFjZVR5cGUoc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycywKLSAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyLCBpbnQgc3VyZmFjZVR5cGUpOworLy8gQ2hlY2sgaWYgdGhlIGRldmljZSBzdXBwb3J0cyBhIGdpdmVuIGR5bmFtaWNSYW5nZVByb2ZpbGUKK2Jvb2wgaXNEeW5hbWljUmFuZ2VQcm9maWxlU3VwcG9ydGVkKGludDY0X3QgZHluYW1pY1JhbmdlUHJvZmlsZSwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY01ldGEpOwogCi0gICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIGNoZWNrT3BlcmF0aW5nTW9kZShpbnQgb3BlcmF0aW5nTW9kZSwKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8sIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkKTsKK2Jvb2wgaXNTdHJlYW1Vc2VDYXNlU3VwcG9ydGVkKGludDY0X3Qgc3RyZWFtVXNlQ2FzZSwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8pOwogCi0gICAgLy8gdXRpbGl0eSBmdW5jdGlvbiB0byBjb252ZXJ0IEFJREwgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gdG8gSElETAotICAgIC8vIHN0cmVhbUNvbmZpZ3VyYXRpb24uIEFsc28gY2hlY2tzIGZvciB2YWxpZGl0eSBvZiBTZXNzaW9uQ29uZmlndXJhdGlvbiBhbmQKLSAgICAvLyByZXR1cm5zIGEgbm9uLW9rIGJpbmRlcjo6U3RhdHVzIGlmIHRoZSBwYXNzZWQgaW4gc2Vzc2lvbiBjb25maWd1cmF0aW9uCi0gICAgLy8gaXNuJ3QgdmFsaWQuCi0gICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzCi0gICAgY29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb24oY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIHNlc3Npb25Db25maWd1cmF0aW9uLAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvLAotICAgICAgICAgICAgbWV0YWRhdGFHZXR0ZXIgZ2V0TWV0YWRhdGEsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmcGh5c2ljYWxDYW1lcmFJZHMsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBib29sICplYXJseUV4aXQpOwordm9pZCBtYXBTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCisgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgU3RyaW5nOCBwaHlzaWNhbElkLAorICAgICAgICBpbnQzMl90IGdyb3VwSWQsIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtICpzdHJlYW0gLypvdXQqLyk7CiAKLSAgICAvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBWM183OjpTdHJlYW1Db25maWd1cmF0aW9uIHRvCi0gICAgLy8gVjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbi4gUmV0dXJuIGZhbHNlIGlmIHRoZSBvcmlnaW5hbCBWM183IGNvbmZpZ3VyYXRpb24gY2Fubm90Ci0gICAgLy8gYmUgdXNlZCBieSBvbGRlciB2ZXJzaW9uIEhBTC4KLSAgICBzdGF0aWMgYm9vbCBjb252ZXJ0SEFMU3RyZWFtQ29tYmluYXRpb25Gcm9tVjM3VG9WMzQoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ1YzNCwKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlnVjM3KTsKKy8vIENoZWNrIHRoYXQgdGhlIHBoeXNpY2FsQ2FtZXJhSWQgcGFzc2VkIGluIGlzIHNwcG9ydGVkIGJ5IHRoZSBjYW1lcmEKKy8vIGRldmljZS4KK2JpbmRlcjo6U3RhdHVzIGNoZWNrUGh5c2ljYWxDYW1lcmFJZCgKK2NvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmcGh5c2ljYWxDYW1lcmFJZHMsIGNvbnN0IFN0cmluZzggJnBoeXNpY2FsQ2FtZXJhSWQsCitjb25zdCBTdHJpbmc4ICZsb2dpY2FsQ2FtZXJhSWQpOwogCi0gICAgc3RhdGljIFN0cmVhbUNvbmZpZ3VyYXRpb25QYWlyIGdldFN0cmVhbUNvbmZpZ3VyYXRpb25QYWlyKGNvbnN0IENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSk7CitiaW5kZXI6OlN0YXR1cyBjaGVja1N1cmZhY2VUeXBlKHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMsCitib29sIGRlZmVycmVkQ29uc3VtZXIsIGludCBzdXJmYWNlVHlwZSk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3QgY2hlY2tBbmRPdmVycmlkZVNlbnNvclBpeGVsTW9kZXNVc2VkKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLCBpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmc3RhdGljSW5mbywgYm9vbCBmbGV4aWJsZUNvbnN1bWVyLAotICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICpvdmVycmlkZGVuU2Vuc29yUGl4ZWxNb2Rlc1VzZWQpOworYmluZGVyOjpTdGF0dXMgY2hlY2tPcGVyYXRpbmdNb2RlKGludCBvcGVyYXRpbmdNb2RlLAorY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8sIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkKTsKIAotICAgIHN0YXRpYyBib29sIGlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcihjb25zdCBDYW1lcmFNZXRhZGF0YSAmZGV2aWNlSW5mbyk7CitiaW5kZXI6OlN0YXR1cworY29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb24oCisgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIHNlc3Npb25Db25maWd1cmF0aW9uLAorICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8sCisgICAgbWV0YWRhdGFHZXR0ZXIgZ2V0TWV0YWRhdGEsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmcGh5c2ljYWxDYW1lcmFJZHMsCisgICAgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWd1cmF0aW9uLAorICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIGJvb2wgKmVhcmx5RXhpdCk7CiAKLSAgICBzdGF0aWMgaW50MzJfdCBnZXRBcHByb3ByaWF0ZU1vZGVUYWcoaW50MzJfdCBkZWZhdWx0VGFnLCBib29sIG1heFJlc29sdXRpb24gPSBmYWxzZSk7CitTdHJlYW1Db25maWd1cmF0aW9uUGFpciBnZXRTdHJlYW1Db25maWd1cmF0aW9uUGFpcihjb25zdCBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEpOwogCi0gICAgc3RhdGljIGJvb2wgdGFyZ2V0UGVyZkNsYXNzUHJpbWFyeUNhbWVyYSgKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgcGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkLAotICAgICAgICAgICAgaW50MzJfdCB0YXJnZXRTZGtWZXJzaW9uKTsKK3N0YXR1c190IGNoZWNrQW5kT3ZlcnJpZGVTZW5zb3JQaXhlbE1vZGVzVXNlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLCBpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZzdGF0aWNJbmZvLCBib29sIGZsZXhpYmxlQ29uc3VtZXIsCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAqb3ZlcnJpZGRlblNlbnNvclBpeGVsTW9kZXNVc2VkKTsKIAotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNID0gNDsKK2Jvb2wgdGFyZ2V0UGVyZkNsYXNzUHJpbWFyeUNhbWVyYSgKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLCBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQsCisgICAgICAgIGludDMyX3QgdGFyZ2V0U2RrVmVyc2lvbik7CiAKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBST1VORElOR19XSURUSF9DQVAgPSAxOTIwOworY29uc3RleHByIGludDMyX3QgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0gPSA0OwogCi0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgU0RLX1ZFUlNJT05fUyA9IDMxOwotICAgIHN0YXRpYyBpbnQzMl90IFBFUkZfQ0xBU1NfTEVWRUw7Ci0gICAgc3RhdGljIGJvb2wgSVNfUEVSRl9DTEFTUzsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBQRVJGX0NMQVNTX0pQRUdfVEhSRVNIX1cgPSAxOTIwOwotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFBFUkZfQ0xBU1NfSlBFR19USFJFU0hfSCA9IDEwODA7Ci19OworY29uc3RleHByIGludDMyX3QgUk9VTkRJTkdfV0lEVEhfQ0FQID0gMTkyMDsKIAorY29uc3RleHByIGludDMyX3QgU0RLX1ZFUlNJT05fUyA9IDMxOworZXh0ZXJuIGludDMyX3QgUEVSRl9DTEFTU19MRVZFTDsKK2V4dGVybiBib29sIElTX1BFUkZfQ0xBU1M7Citjb25zdGV4cHIgaW50MzJfdCBQRVJGX0NMQVNTX0pQRUdfVEhSRVNIX1cgPSAxOTIwOworY29uc3RleHByIGludDMyX3QgUEVSRl9DTEFTU19KUEVHX1RIUkVTSF9IID0gMTA4MDsKKworfSAvLyBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzCiB9IC8vIGNhbWVyYTMKIH0gLy8gYW5kcm9pZAorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIaWRsLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTZmODMyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hpZGwuY3BwCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlICJTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmgiCisjaW5jbHVkZSAiU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hpZGwuaCIKKworI2luY2x1ZGUgIi4uL0NhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL2FpZGwvQWlkbENhbWVyYTNEZXZpY2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL2hpZGwvSGlkbENhbWVyYTNEZXZpY2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCIKKwordXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbzsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6Om1ldGFkYXRhOjpWM182OjpDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK25hbWVzcGFjZSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzIHsKKworc3RhdHVzX3QKK2NvbnZlcnRBaWRsVG9IaWRsMzdTdHJlYW1Db21iaW5hdGlvbigKKyAgICAgICAgY29uc3QgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpTdHJlYW1Db25maWd1cmF0aW9uICZhaWRsLAorICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmhpZGwpIHsKKyAgICBoaWRsLm9wZXJhdGlvbk1vZGUgPQorICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlPihhaWRsLm9wZXJhdGlvbk1vZGUpOworICAgIGlmIChhaWRsLnN0cmVhbUNvbmZpZ0NvdW50ZXIgPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGhpZGwuc3RyZWFtQ29uZmlnQ291bnRlciA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhaWRsLnN0cmVhbUNvbmZpZ0NvdW50ZXIpOworICAgIGhpZGwubXVsdGlSZXNvbHV0aW9uSW5wdXRJbWFnZSA9IGFpZGwubXVsdGlSZXNvbHV0aW9uSW5wdXRJbWFnZTsKKyAgICBoaWRsLnNlc3Npb25QYXJhbXMgPSBhaWRsLnNlc3Npb25QYXJhbXMubWV0YWRhdGE7CisgICAgaGlkbC5zdHJlYW1zLnJlc2l6ZShhaWRsLnN0cmVhbXMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW0gOiBhaWRsLnN0cmVhbXMpIHsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludD4oc3RyZWFtLmR5bmFtaWNSYW5nZVByb2ZpbGUpICE9CisgICAgICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9EWU5BTUlDX1JBTkdFX1BST0ZJTEVTX01BUF9TVEFOREFSRCkgeworICAgICAgICAgICAgQUxPR0UoIiVzICBEeW5hbWljIHJhbmdlIHByb2ZpbGUgJSIgUFJJZDY0ICIgbm90IHN1cHBvcnRlZCBieSBISURMIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZHluYW1pY1JhbmdlUHJvZmlsZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludD4oc3RyZWFtLnVzZUNhc2UpICE9IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fVVNFX0NBU0VTX0RFRkFVTFQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBTdHJlYW0gdXNlIGNhc2UgJSIgUFJJZDY0ICJub3Qgc3VwcG9ydGVkIGJ5IEhJREwiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS51c2VDYXNlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICAvLyBoaWRsIHYzXzcKKyAgICAgICAgaGlkbC5zdHJlYW1zW2ldLmdyb3VwSWQgPSBzdHJlYW0uZ3JvdXBJZDsKKyAgICAgICAgaGlkbC5zdHJlYW1zW2ldLnNlbnNvclBpeGVsTW9kZXNVc2VkLnJlc2l6ZShzdHJlYW0uc2Vuc29yUGl4ZWxNb2Rlc1VzZWQuc2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJm1vZGUgOiBzdHJlYW0uc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpIHsKKyAgICAgICAgICAgIGhpZGwuc3RyZWFtc1tpXS5zZW5zb3JQaXhlbE1vZGVzVXNlZFtqXSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYU1ldGFkYXRhRW51bUFuZHJvaWRTZW5zb3JQaXhlbE1vZGU+KG1vZGUpOworICAgICAgICAgICAgaisrOworICAgICAgICB9CisKKyAgICAgICAgLy9oaWRsIHYzXzQKKyAgICAgICAgaGlkbC5zdHJlYW1zW2ldLnYzXzQucGh5c2ljYWxDYW1lcmFJZCA9IHN0cmVhbS5waHlzaWNhbENhbWVyYUlkOworCisgICAgICAgIGlmIChzdHJlYW0uYnVmZmVyU2l6ZSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaGlkbC5zdHJlYW1zW2ldLnYzXzQuYnVmZmVyU2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHJlYW0uYnVmZmVyU2l6ZSk7CisKKyAgICAgICAgLy8gaGlsZCB2M18yCisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS52M180LnYzXzIuaWQgPSBzdHJlYW0uaWQ7CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS52M180LnYzXzIuZm9ybWF0ID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQ+KHN0cmVhbS5mb3JtYXQpOworCisgICAgICAgIGlmIChzdHJlYW0ud2lkdGggPCAwIHx8IHN0cmVhbS5oZWlnaHQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS52M180LnYzXzIud2lkdGggPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyZWFtLndpZHRoKTsKKyAgICAgICAgaGlkbC5zdHJlYW1zW2ldLnYzXzQudjNfMi5oZWlnaHQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyZWFtLmhlaWdodCk7CisgICAgICAgIGhpZGwuc3RyZWFtc1tpXS52M180LnYzXzIudXNhZ2UgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncz4oc3RyZWFtLnVzYWdlKTsKKyAgICAgICAgaGlkbC5zdHJlYW1zW2ldLnYzXzQudjNfMi5zdHJlYW1UeXBlID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVR5cGU+KHN0cmVhbS5zdHJlYW1UeXBlKTsKKyAgICAgICAgaGlkbC5zdHJlYW1zW2ldLnYzXzQudjNfMi5kYXRhU3BhY2UgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3M+KHN0cmVhbS5kYXRhU3BhY2UpOworICAgICAgICBoaWRsLnN0cmVhbXNbaV0udjNfNC52M18yLnJvdGF0aW9uID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uPihzdHJlYW0ucm90YXRpb24pOworICAgICAgICBpKys7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworYmluZGVyOjpTdGF0dXMKK2NvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKAorICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgc2Vzc2lvbkNvbmZpZ3VyYXRpb24sCisgICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8sCisgICAgICAgIG1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBoeXNpY2FsQ2FtZXJhSWRzLAorICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ3VyYXRpb24sCisgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIGJvb2wgKmVhcmx5RXhpdCkgeworICAgIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6U3RyZWFtQ29uZmlndXJhdGlvbiBhaWRsU3RyZWFtQ29uZmlndXJhdGlvbjsKKyAgICBhdXRvIHJldCA9IGNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKHNlc3Npb25Db25maWd1cmF0aW9uLCBsb2dpY2FsQ2FtZXJhSWQsIGRldmljZUluZm8sCisgICAgICAgICAgICBnZXRNZXRhZGF0YSwgcGh5c2ljYWxDYW1lcmFJZHMsIGFpZGxTdHJlYW1Db25maWd1cmF0aW9uLCBvdmVycmlkZUZvclBlcmZDbGFzcywKKyAgICAgICAgICAgIGVhcmx5RXhpdCk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChlYXJseUV4aXQgIT0gbnVsbHB0ciAmJiAqZWFybHlFeGl0KSB7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICBpZiAoY29udmVydEFpZGxUb0hpZGwzN1N0cmVhbUNvbWJpbmF0aW9uKGFpZGxTdHJlYW1Db25maWd1cmF0aW9uLCBzdHJlYW1Db25maWd1cmF0aW9uKSAhPSBPSykgeworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgIkludmFsaWQgQUlETC0+SElETDMuNyBjb252ZXJzaW9uIik7CisgICAgfQorCisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitib29sIGNvbnZlcnRIQUxTdHJlYW1Db21iaW5hdGlvbkZyb21WMzdUb1YzNCgKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWdWMzQsCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlnVjM3KSB7CisgICAgaWYgKHN0cmVhbUNvbmZpZ1YzNy5tdWx0aVJlc29sdXRpb25JbnB1dEltYWdlKSB7CisgICAgICAgIC8vIElDYW1lcmFEZXZpY2Ugb2xkZXIgdGhhbiAzLjcgZG9lc24ndCBzdXBwb3J0IG11bHRpLXJlc29sdXRpb24gaW5wdXQgaW1hZ2UuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdHJlYW1Db25maWdWMzQuc3RyZWFtcy5yZXNpemUoc3RyZWFtQ29uZmlnVjM3LnN0cmVhbXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmVhbUNvbmZpZ1YzNy5zdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChzdHJlYW1Db25maWdWMzcuc3RyZWFtc1tpXS5ncm91cElkICE9IC0xKSB7CisgICAgICAgICAgICAvLyBJQ2FtZXJhRGV2aWNlIG9sZGVyIHRoYW4gMy43IGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aS1yZXNvbHV0aW9uIG91dHB1dAorICAgICAgICAgICAgLy8gaW1hZ2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW1Db25maWdWMzQuc3RyZWFtc1tpXSA9IHN0cmVhbUNvbmZpZ1YzNy5zdHJlYW1zW2ldLnYzXzQ7CisgICAgfQorICAgIHN0cmVhbUNvbmZpZ1YzNC5vcGVyYXRpb25Nb2RlID0gc3RyZWFtQ29uZmlnVjM3Lm9wZXJhdGlvbk1vZGU7CisgICAgc3RyZWFtQ29uZmlnVjM0LnNlc3Npb25QYXJhbXMgPSBzdHJlYW1Db25maWdWMzcuc2Vzc2lvblBhcmFtczsKKworICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSGlkbC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDdhYmUwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsc0hpZGwuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9TRVNTSU9OX0NPTkZJR1VSQVRJT05fVVRJTFNfSElETF9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfU0VTU0lPTl9DT05GSUdVUkFUSU9OX1VUSUxTX0hJRExfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjcvSUNhbWVyYURldmljZVNlc3Npb24uaD4KKworI2luY2x1ZGUgPHV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaD4KKworLy8gQ29udmVuaWVuY2UgbWV0aG9kcyBmb3IgY29uc3RydWN0aW5nIGJpbmRlcjo6U3RhdHVzIG9iamVjdHMgZm9yIGVycm9yIHJldHVybnMKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCituYW1lc3BhY2UgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscyB7CisKKy8vIHV0aWxpdHkgZnVuY3Rpb24gdG8gY29udmVydCBBSURMIFNlc3Npb25Db25maWd1cmF0aW9uIHRvIEhJREwKKy8vIHN0cmVhbUNvbmZpZ3VyYXRpb24uIEFsc28gY2hlY2tzIGZvciB2YWxpZGl0eSBvZiBTZXNzaW9uQ29uZmlndXJhdGlvbiBhbmQKKy8vIHJldHVybnMgYSBub24tb2sgYmluZGVyOjpTdGF0dXMgaWYgdGhlIHBhc3NlZCBpbiBzZXNzaW9uIGNvbmZpZ3VyYXRpb24KKy8vIGlzbid0IHZhbGlkLgorYmluZGVyOjpTdGF0dXMKK2NvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBzZXNzaW9uQ29uZmlndXJhdGlvbiwKKyAgICAgICAgY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvLAorICAgICAgICBtZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwaHlzaWNhbENhbWVyYUlkcywKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWd1cmF0aW9uLAorICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBib29sICplYXJseUV4aXQpOworCisvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBWM183OjpTdHJlYW1Db25maWd1cmF0aW9uIHRvCisvLyBWM180OjpTdHJlYW1Db25maWd1cmF0aW9uLiBSZXR1cm4gZmFsc2UgaWYgdGhlIG9yaWdpbmFsIFYzXzcgY29uZmlndXJhdGlvbiBjYW5ub3QKKy8vIGJlIHVzZWQgYnkgb2xkZXIgdmVyc2lvbiBIQUwuCitib29sIGNvbnZlcnRIQUxTdHJlYW1Db21iaW5hdGlvbkZyb21WMzdUb1YzNCgKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWdWMzQsCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlnVjM3KTsKK30gLy8gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscworfSAvLyBjYW1lcmEzCit9IC8vIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSG9zdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSG9zdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmZGM2MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIb3N0LmNwcApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlNlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIb3N0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKK25hbWVzcGFjZSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzIHsKKworaW50MzJfdCBnZXRBcHByb3ByaWF0ZU1vZGVUYWcoaW50MzJfdCBkZWZhdWx0VGFnLCBib29sIG1heFJlc29sdXRpb24pIHsKKyAgICBpZiAoIW1heFJlc29sdXRpb24pIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRUYWc7CisgICAgfQorICAgIHN3aXRjaCAoZGVmYXVsdFRhZykgeworICAgICAgICBjYXNlIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlM6CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlM6CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlM6CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVEFMTF9EVVJBVElPTlM6CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUzoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVEFMTF9EVVJBVElPTlM6CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlM6CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX01JTl9GUkFNRV9EVVJBVElPTlM6CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX01JTl9GUkFNRV9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlM6CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9TRU5TT1JfT1BBUVVFX1JBV19TSVpFOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfU0VOU09SX09QQVFVRV9SQVdfU0laRV9NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX0xFTlNfRElTVE9SVElPTjoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0xFTlNfRElTVE9SVElPTl9NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRhZyAlZCBkb2Vzbid0IGhhdmUgYSBtYXhpbXVtIHJlc29sdXRpb24gY291bnRlcnBhcnQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRUYWcpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK2Jvb2wgaXNVbHRyYUhpZ2hSZXNvbHV0aW9uU2Vuc29yKGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvKSB7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnlDYXA7CisgICAgZW50cnlDYXAgPSBkZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgIC8vIEdvIHRocm91Z2ggdGhlIGNhcGFiaWxpdGllcyBhbmQgY2hlY2sgaWYgaXQgaGFzCisgICAgLy8gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlDYXAuY291bnQ7ICsraSkgeworICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeUNhcC5kYXRhLnU4W2ldOworICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgZ2V0QXJyYXlXaWR0aEFuZEhlaWdodChjb25zdCBDYW1lcmFNZXRhZGF0YSAqZGV2aWNlSW5mbywKKyAgICAgICAgaW50MzJfdCBhcnJheVRhZywgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgeworICAgIGlmICh3aWR0aCA9PSBudWxscHRyIHx8IGhlaWdodCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogd2lkdGggLyBoZWlnaHQgbnVsbHB0ciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnk7CisgICAgZW50cnkgPSBkZXZpY2VJbmZvLT5maW5kKGFycmF5VGFnKTsKKyAgICBpZiAoZW50cnkuY291bnQgIT0gNCkgcmV0dXJuIGZhbHNlOworICAgICp3aWR0aCA9IGVudHJ5LmRhdGEuaTMyWzJdOworICAgICpoZWlnaHQgPSBlbnRyeS5kYXRhLmkzMlszXTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHNIb3N0LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YjFlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzSG9zdC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX1NFU1NJT05fQ09ORklHVVJBVElPTl9VVElMU19IT1NUX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9TRVNTSU9OX0NPTkZJR1VSQVRJT05fVVRJTFNfSE9TVF9ICisKKyNpbmNsdWRlICJjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworbmFtZXNwYWNlIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHMgeworCitib29sIGlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcihjb25zdCBDYW1lcmFNZXRhZGF0YSAmZGV2aWNlSW5mbyk7CisKK2ludDMyX3QgZ2V0QXBwcm9wcmlhdGVNb2RlVGFnKGludDMyX3QgZGVmYXVsdFRhZywgYm9vbCBtYXhSZXNvbHV0aW9uID0gZmFsc2UpOworCitib29sIGdldEFycmF5V2lkdGhBbmRIZWlnaHQoY29uc3QgQ2FtZXJhTWV0YWRhdGEgKmRldmljZUluZm8sIGludDMyX3QgYXJyYXlUYWcsCisgICAgICAgIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpOworCit9IC8vIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHMKK30gLy8gY2FtZXJhMworfSAvLyBhbmRyb2lkCisKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvblN0YXRzQnVpbGRlci5jcHAKaW5kZXggN2E3NzA3Yy4uYzNhYWM3MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvblN0YXRzQnVpbGRlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvblN0YXRzQnVpbGRlci5jcHAKQEAgLTYwLDYgKzYwLDcgQEAKICAgICBtRXJyb3JSZXN1bHRDb3VudCA9IDA7CiAgICAgbUNvdW50ZXJTdG9wcGVkID0gZmFsc2U7CiAgICAgbURldmljZUVycm9yID0gZmFsc2U7CisgICAgbVVzZXJUYWcuY2xlYXIoKTsKICAgICBmb3IgKGF1dG8mIHN0cmVhbVN0YXRzIDogbVN0YXRzTWFwKSB7CiAgICAgICAgIFN0cmVhbVN0YXRzJiBzdHJlYW1TdGF0ID0gc3RyZWFtU3RhdHMuc2Vjb25kOwogICAgICAgICBzdHJlYW1TdGF0Lm1SZXF1ZXN0ZWRGcmFtZUNvdW50ID0gMDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuaAppbmRleCBjMjNhYmI2Li4yOTM2NTMxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvblN0YXRzQnVpbGRlci5oCkBAIC04NCw2ICs4NCw3IEBACiAgICAgaW50NjRfdCBtRXJyb3JSZXN1bHRDb3VudDsKICAgICBib29sIG1Db3VudGVyU3RvcHBlZDsKICAgICBib29sIG1EZXZpY2VFcnJvcjsKKyAgICBzdGQ6OnN0cmluZyBtVXNlclRhZzsKICAgICAvLyBNYXAgZnJvbSBzdHJlYW0gaWQgdG8gc3RyZWFtIHN0YXRpc3RpY3MKICAgICBzdGQ6Om1hcDxpbnQsIFN0cmVhbVN0YXRzPiBtU3RhdHNNYXA7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAppbmRleCAyNjJmOTYyLi40NjFmNWU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgorI2luY2x1ZGUgPGRldmljZTMvQ2FtZXJhM1N0cmVhbS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTExMiwxMSArMTEzLDE1IEBACiAgICAgbUxhc3RNb25pdG9yZWRSZXN1bHRWYWx1ZXMuY2xlYXIoKTsKICAgICBtTGFzdE1vbml0b3JlZFBoeXNpY2FsUmVxdWVzdEtleXMuY2xlYXIoKTsKICAgICBtTGFzdE1vbml0b3JlZFBoeXNpY2FsUmVzdWx0S2V5cy5jbGVhcigpOworICAgIG1MYXN0U3RyZWFtSWRzLmNsZWFyKCk7CisgICAgbUxhc3RJbnB1dFN0cmVhbUlkID0gLTE7CiB9CiAKIHZvaWQgVGFnTW9uaXRvcjo6bW9uaXRvck1ldGFkYXRhKGV2ZW50U291cmNlIHNvdXJjZSwgaW50NjRfdCBmcmFtZU51bWJlciwgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKLSAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4mIHBoeXNpY2FsTWV0YWRhdGEpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4mIHBoeXNpY2FsTWV0YWRhdGEsCisgICAgICAgIGNvbnN0IGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKm91dHB1dEJ1ZmZlcnMsIHVpbnQzMl90IG51bU91dHB1dEJ1ZmZlcnMsCisgICAgICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCkgewogICAgIGlmICghbU1vbml0b3JpbmdFbmFibGVkKSByZXR1cm47CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTW9uaXRvck11dGV4KTsKQEAgLTEyNCwxOSArMTI5LDI3IEBACiAgICAgaWYgKHRpbWVzdGFtcCA9PSAwKSB7CiAgICAgICAgIHRpbWVzdGFtcCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfQk9PVFRJTUUpOwogICAgIH0KLQorICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiBvdXRwdXRTdHJlYW1JZHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1PdXRwdXRCdWZmZXJzOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqc3JjID0gb3V0cHV0QnVmZmVycyArIGk7CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBjYW1lcmEzOjpDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYy0+c3RyZWFtKS0+Z2V0SWQoKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtSWRzLmVtcGxhY2Uoc3RyZWFtSWQpOworICAgIH0KICAgICBzdGQ6OnN0cmluZyBlbXB0eUlkOwogICAgIGZvciAoYXV0byB0YWcgOiBtTW9uaXRvcmVkVGFnTGlzdCkgewotICAgICAgICBtb25pdG9yU2luZ2xlTWV0YWRhdGEoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBlbXB0eUlkLCB0YWcsIG1ldGFkYXRhKTsKKyAgICAgICAgbW9uaXRvclNpbmdsZU1ldGFkYXRhKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgZW1wdHlJZCwgdGFnLCBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW1JZHMsIGlucHV0U3RyZWFtSWQpOwogCiAgICAgICAgIGZvciAoYXV0byYgbSA6IHBoeXNpY2FsTWV0YWRhdGEpIHsKLSAgICAgICAgICAgIG1vbml0b3JTaW5nbGVNZXRhZGF0YShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIG0uZmlyc3QsIHRhZywgbS5zZWNvbmQpOworICAgICAgICAgICAgbW9uaXRvclNpbmdsZU1ldGFkYXRhKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgbS5maXJzdCwgdGFnLCBtLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLCBpbnB1dFN0cmVhbUlkKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogdm9pZCBUYWdNb25pdG9yOjptb25pdG9yU2luZ2xlTWV0YWRhdGEoZXZlbnRTb3VyY2Ugc291cmNlLCBpbnQ2NF90IGZyYW1lTnVtYmVyLCBuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkLCB1aW50MzJfdCB0YWcsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQsIHVpbnQzMl90IHRhZywgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJm91dHB1dFN0cmVhbUlkcywgaW50MzJfdCBpbnB1dFN0cmVhbUlkKSB7CiAKICAgICBDYW1lcmFNZXRhZGF0YSAmbGFzdFZhbHVlcyA9IChzb3VyY2UgPT0gUkVRVUVTVCkgPwogICAgICAgICAgICAgKGNhbWVyYUlkLmVtcHR5KCkgPyBtTGFzdE1vbml0b3JlZFJlcXVlc3RWYWx1ZXMgOgpAQCAtMTc3LDEzICsxOTAsMjIgQEAKICAgICAgICAgICAgIC8vIE5vIGxhc3QgZW50cnksIHNvIGFsd2F5cyBjb25zaWRlciB0byBiZSBkaWZmZXJlbnQKICAgICAgICAgICAgIGlzRGlmZmVyZW50ID0gdHJ1ZTsKICAgICAgICAgfQotCisgICAgICAgIC8vIEFsc28gbW9uaXRvciB3aGVuIHRoZSBzdHJlYW0gaWRzIGNoYW5nZSwgdGhpcyBoZWxwcyB2aXN1YWxseSBzZWUgd2hhdAorICAgICAgICAvLyBtb25pdG9yZWQgbWV0YWRhdGEgdmFsdWVzIGFyZSBmb3IgY2FwdHVyZSByZXF1ZXN0cyB3aXRoIGRpZmZlcmVudAorICAgICAgICAvLyBzdHJlYW0gaWRzLgorICAgICAgICBpZiAoc291cmNlID09IFJFUVVFU1QgJiYKKyAgICAgICAgICAgICAgICAoaW5wdXRTdHJlYW1JZCAhPSBtTGFzdElucHV0U3RyZWFtSWQgfHwgb3V0cHV0U3RyZWFtSWRzICE9IG1MYXN0U3RyZWFtSWRzKSkgeworICAgICAgICAgICAgbUxhc3RJbnB1dFN0cmVhbUlkID0gaW5wdXRTdHJlYW1JZDsKKyAgICAgICAgICAgIG1MYXN0U3RyZWFtSWRzID0gb3V0cHV0U3RyZWFtSWRzOworICAgICAgICAgICAgaXNEaWZmZXJlbnQgPSB0cnVlOworICAgICAgICB9CiAgICAgICAgIGlmIChpc0RpZmZlcmVudCkgewogICAgICAgICAgICAgQUxPR1YoIiVzOiBUYWcgJXMgY2hhbmdlZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgIGdldF9sb2NhbF9jYW1lcmFfbWV0YWRhdGFfdGFnX25hbWVfdmVuZG9yX2lkKAogICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcsIG1WZW5kb3JUYWdJZCkpOwogICAgICAgICAgICAgbGFzdFZhbHVlcy51cGRhdGUoZW50cnkpOwotICAgICAgICAgICAgbU1vbml0b3JpbmdFdmVudHMuZW1wbGFjZShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIGVudHJ5LCBjYW1lcmFJZCk7CisgICAgICAgICAgICBtTW9uaXRvcmluZ0V2ZW50cy5lbXBsYWNlKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgZW50cnksIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW1JZHMsIGlucHV0U3RyZWFtSWQpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChsYXN0RW50cnkuY291bnQgPiAwKSB7CiAgICAgICAgIC8vIFZhbHVlIGhhcyBiZWVuIHJlbW92ZWQKQEAgLTE5NSw3ICsyMTcsMTAgQEAKICAgICAgICAgZW50cnkudHlwZSA9IGdldF9sb2NhbF9jYW1lcmFfbWV0YWRhdGFfdGFnX3R5cGVfdmVuZG9yX2lkKHRhZywKICAgICAgICAgICAgICAgICBtVmVuZG9yVGFnSWQpOwogICAgICAgICBlbnRyeS5jb3VudCA9IDA7Ci0gICAgICAgIG1Nb25pdG9yaW5nRXZlbnRzLmVtcGxhY2Uoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBlbnRyeSwgY2FtZXJhSWQpOworICAgICAgICBtTGFzdElucHV0U3RyZWFtSWQgPSBpbnB1dFN0cmVhbUlkOworICAgICAgICBtTGFzdFN0cmVhbUlkcyA9IG91dHB1dFN0cmVhbUlkczsKKyAgICAgICAgbU1vbml0b3JpbmdFdmVudHMuZW1wbGFjZShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIGVudHJ5LCBjYW1lcmFJZCwgb3V0cHV0U3RyZWFtSWRzLAorICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtSWQpOwogICAgIH0KIH0KIApAQCAtMjE0LDM3ICsyMzksNTkgQEAKICAgICB9IGVsc2UgewogICAgICAgICBkcHJpbnRmKGZkLCAiICAgICBUYWcgbW9uaXRvcmluZyBkaXNhYmxlZCAoZW5hYmxlIHdpdGggLW0gPG5hbWUxLC4uLG5hbWVOPilcbiIpOwogICAgIH0KLSAgICBpZiAobU1vbml0b3JpbmdFdmVudHMuc2l6ZSgpID4gMCkgewotICAgICAgICBkcHJpbnRmKGZkLCAiICAgICBNb25pdG9yZWQgdGFnIGV2ZW50IGxvZzpcbiIpOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGV2ZW50IDogbU1vbml0b3JpbmdFdmVudHMpIHsKLSAgICAgICAgICAgIGludCBpbmRlbnRhdGlvbiA9IChldmVudC5zb3VyY2UgPT0gUkVRVUVTVCkgPyAxNSA6IDMwOwotICAgICAgICAgICAgZHByaW50ZihmZCwgIiAgICAgICAgZiVkOiUiIFBSSWQ2NCAibnM6JSpzJSpzJXMuJXM6ICIsCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50LmZyYW1lTnVtYmVyLCBldmVudC50aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgIDIsIGV2ZW50LmNhbWVyYUlkLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgIGluZGVudGF0aW9uLAotICAgICAgICAgICAgICAgICAgICBldmVudC5zb3VyY2UgPT0gUkVRVUVTVCA/ICJSRVE6IiA6ICJSRVM6IiwKLSAgICAgICAgICAgICAgICAgICAgZ2V0X2xvY2FsX2NhbWVyYV9tZXRhZGF0YV9zZWN0aW9uX25hbWVfdmVuZG9yX2lkKGV2ZW50LnRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVuZG9yVGFnSWQpLAotICAgICAgICAgICAgICAgICAgICBnZXRfbG9jYWxfY2FtZXJhX21ldGFkYXRhX3RhZ19uYW1lX3ZlbmRvcl9pZChldmVudC50YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZlbmRvclRhZ0lkKSk7Ci0gICAgICAgICAgICBpZiAoZXZlbnQubmV3RGF0YS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICIgKFJlbW92ZWQpXG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJpbnREYXRhKGZkLCBldmVudC5uZXdEYXRhLmRhdGEoKSwgZXZlbnQudGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudHlwZSwgZXZlbnQubmV3RGF0YS5zaXplKCkgLyBjYW1lcmFfbWV0YWRhdGFfdHlwZV9zaXplW2V2ZW50LnR5cGVdLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50YXRpb24gKyAxOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CiAKKyAgICBpZiAobU1vbml0b3JpbmdFdmVudHMuc2l6ZSgpID09IDApIHsgcmV0dXJuOyB9CisKKyAgICBkcHJpbnRmKGZkLCAiICAgICBNb25pdG9yZWQgdGFnIGV2ZW50IGxvZzpcbiIpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGV2ZW50U3RyczsKKyAgICBkdW1wTW9uaXRvcmVkVGFnRXZlbnRzVG9WZWN0b3JMb2NrZWQoZXZlbnRTdHJzKTsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZldmVudFN0ciA6IGV2ZW50U3RycykgeworICAgICAgICBkcHJpbnRmKGZkLCAiICAgICAgICAlcyIsIGV2ZW50U3RyLmNfc3RyKCkpOworICAgIH0KIH0KIAotLy8gVE9ETzogQ29uc29saWRhdGUgd2l0aCBwcmludERhdGEgZnJvbSBjYW1lcmFfbWV0YWRhdGEuaAordm9pZCBUYWdNb25pdG9yOjpnZXRMYXRlc3RNb25pdG9yZWRUYWdFdmVudHMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZvdXQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTW9uaXRvck11dGV4KTsKKyAgICBkdW1wTW9uaXRvcmVkVGFnRXZlbnRzVG9WZWN0b3JMb2NrZWQob3V0KTsKK30KKwordm9pZCBUYWdNb25pdG9yOjpkdW1wTW9uaXRvcmVkVGFnRXZlbnRzVG9WZWN0b3JMb2NrZWQoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZ2ZWMpIHsKKyAgICBpZiAobU1vbml0b3JpbmdFdmVudHMuc2l6ZSgpID09IDApIHsgcmV0dXJuOyB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGV2ZW50IDogbU1vbml0b3JpbmdFdmVudHMpIHsKKyAgICAgICAgaW50IGluZGVudGF0aW9uID0gKGV2ZW50LnNvdXJjZSA9PSBSRVFVRVNUKSA/IDE1IDogMzA7CisgICAgICAgIFN0cmluZzggZXZlbnRTdHJpbmcgPSBTdHJpbmc4Ojpmb3JtYXQoImYlZDolIiBQUklkNjQgIm5zOiUqcyUqcyVzLiVzOiAiLAorICAgICAgICAgICAgICAgIGV2ZW50LmZyYW1lTnVtYmVyLCBldmVudC50aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgMiwgZXZlbnQuY2FtZXJhSWQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICBldmVudC5zb3VyY2UgPT0gUkVRVUVTVCA/ICJSRVE6IiA6ICJSRVM6IiwKKyAgICAgICAgICAgICAgICBnZXRfbG9jYWxfY2FtZXJhX21ldGFkYXRhX3NlY3Rpb25fbmFtZV92ZW5kb3JfaWQoZXZlbnQudGFnLCBtVmVuZG9yVGFnSWQpLAorICAgICAgICAgICAgICAgIGdldF9sb2NhbF9jYW1lcmFfbWV0YWRhdGFfdGFnX25hbWVfdmVuZG9yX2lkKGV2ZW50LnRhZywgbVZlbmRvclRhZ0lkKSk7CisgICAgICAgIGlmIChldmVudC5uZXdEYXRhLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBldmVudFN0cmluZyArPSAiIChSZW1vdmVkKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBldmVudFN0cmluZyArPSBnZXRFdmVudERhdGFTdHJpbmcoZXZlbnQubmV3RGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC50YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQubmV3RGF0YS5zaXplKCkgLyBjYW1lcmFfbWV0YWRhdGFfdHlwZV9zaXplW2V2ZW50LnR5cGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50YXRpb24gKyAxOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Lm91dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmlucHV0U3RyZWFtSWQpOworICAgICAgICB9CisgICAgICAgIHZlYy5lbXBsYWNlX2JhY2soZXZlbnRTdHJpbmcuc3RyaW5nKCkpOworICAgIH0KK30KIAogI2RlZmluZSBDQU1FUkFfTUVUQURBVEFfRU5VTV9TVFJJTkdfTUFYX1NJWkUgMjkKIAotdm9pZCBUYWdNb25pdG9yOjpwcmludERhdGEoaW50IGZkLCBjb25zdCB1aW50OF90ICpkYXRhX3B0ciwgdWludDMyX3QgdGFnLAotICAgICAgICBpbnQgdHlwZSwgaW50IGNvdW50LCBpbnQgaW5kZW50YXRpb24pIHsKK1N0cmluZzggVGFnTW9uaXRvcjo6Z2V0RXZlbnREYXRhU3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGRhdGFfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4mIG91dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCkgewogICAgIHN0YXRpYyBpbnQgdmFsdWVzX3Blcl9saW5lW05VTV9UWVBFU10gPSB7CiAgICAgICAgIFtUWVBFX0JZVEVdICAgICA9IDE2LAogICAgICAgICBbVFlQRV9JTlQzMl0gICAgPSA4LApAQCAtMjUzLDYgKzMwMCw3IEBACiAgICAgICAgIFtUWVBFX0RPVUJMRV0gICA9IDQsCiAgICAgICAgIFtUWVBFX1JBVElPTkFMXSA9IDQsCiAgICAgfTsKKwogICAgIHNpemVfdCB0eXBlX3NpemUgPSBjYW1lcmFfbWV0YWRhdGFfdHlwZV9zaXplW3R5cGVdOwogICAgIGNoYXIgdmFsdWVfc3RyaW5nX3RtcFtDQU1FUkFfTUVUQURBVEFfRU5VTV9TVFJJTkdfTUFYX1NJWkVdOwogICAgIHVpbnQzMl90IHZhbHVlOwpAQCAtMjYwLDEwICszMDgsMTEgQEAKICAgICBpbnQgbGluZXMgPSBjb3VudCAvIHZhbHVlc19wZXJfbGluZVt0eXBlXTsKICAgICBpZiAoY291bnQgJSB2YWx1ZXNfcGVyX2xpbmVbdHlwZV0gIT0gMCkgbGluZXMrKzsKIAorICAgIFN0cmluZzggcmV0dXJuU3RyID0gU3RyaW5nOCgpOwogICAgIGludCBpbmRleCA9IDA7CiAgICAgaW50IGosIGs7CiAgICAgZm9yIChqID0gMDsgaiA8IGxpbmVzOyBqKyspIHsKLSAgICAgICAgZHByaW50ZihmZCwgIiUqc1siLCAoaiAhPSAwKSA/IGluZGVudGF0aW9uICsgNCA6IDAsICIiKTsKKyAgICAgICAgcmV0dXJuU3RyLmFwcGVuZEZvcm1hdCgiJSpzWyIsIChqICE9IDApID8gaW5kZW50YXRpb24gKyA0IDogMCwgIiIpOwogICAgICAgICBmb3IgKGsgPSAwOwogICAgICAgICAgICAgIGsgPCB2YWx1ZXNfcGVyX2xpbmVbdHlwZV0gJiYgY291bnQgPiAwOwogICAgICAgICAgICAgIGsrKywgY291bnQtLSwgaW5kZXggKz0gdHlwZV9zaXplKSB7CkBAIC0yNzYsMTAgKzMyNSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3N0cmluZ190bXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2YWx1ZV9zdHJpbmdfdG1wKSkKICAgICAgICAgICAgICAgICAgICAgICAgID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJXMgIiwgdmFsdWVfc3RyaW5nX3RtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5TdHIgKz0gdmFsdWVfc3RyaW5nX3RtcDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICIlaGh1ICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooZGF0YV9wdHIgKyBpbmRleCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyLmFwcGVuZEZvcm1hdCgiJWhodSIsICooZGF0YV9wdHIgKyBpbmRleCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9JTlQzMjoKQEAgLTI5MCw0OSArMzM4LDU3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3N0cmluZ190bXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2YWx1ZV9zdHJpbmdfdG1wKSkKICAgICAgICAgICAgICAgICAgICAgICAgID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJXMgIiwgdmFsdWVfc3RyaW5nX3RtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5TdHIgKz0gdmFsdWVfc3RyaW5nX3RtcDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICIlIiBQUklkMzIgIiAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QqKShkYXRhX3B0ciArIGluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5TdHIuYXBwZW5kRm9ybWF0KCIlIiBQUklkMzIgIiAiLCAqKGludDMyX3QqKShkYXRhX3B0ciArIGluZGV4KSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJTAuOGYgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGZsb2F0KikoZGF0YV9wdHIgKyBpbmRleCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5TdHIuYXBwZW5kRm9ybWF0KCIlMC44ZiIsICooZmxvYXQqKShkYXRhX3B0ciArIGluZGV4KSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9JTlQ2NDoKLSAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIiUiIFBSSWQ2NCAiICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQ2NF90KikoZGF0YV9wdHIgKyBpbmRleCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5TdHIuYXBwZW5kRm9ybWF0KCIlIiBQUklkNjQgIiAiLCAqKGludDY0X3QqKShkYXRhX3B0ciArIGluZGV4KSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICIlMC44ZiAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICooZG91YmxlKikoZGF0YV9wdHIgKyBpbmRleCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5TdHIuYXBwZW5kRm9ybWF0KCIlMC44ZiAiLCAqKGRvdWJsZSopKGRhdGFfcHRyICsgaW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX1JBVElPTkFMOiB7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtZXJhdG9yID0gKihpbnQzMl90KikoZGF0YV9wdHIgKyBpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGVub21pbmF0b3IgPSAqKGludDMyX3QqKShkYXRhX3B0ciArIGluZGV4ICsgNCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICIoJWQgLyAlZCkgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyLmFwcGVuZEZvcm1hdCgiKCVkIC8gJWQpICIsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIj8/PyAiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyICs9ICI/Pz8gIjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBkcHJpbnRmKGZkLCAiXVxuIik7CisgICAgICAgIHJldHVyblN0ciArPSAiXSAiOworICAgICAgICBpZiAoIW91dHB1dFN0cmVhbUlkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm5TdHIgKz0gIm91dHB1dCBzdHJlYW0gaWRzOiAiOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZpZCA6IG91dHB1dFN0cmVhbUlkcykgeworICAgICAgICAgICAgICAgIHJldHVyblN0ci5hcHBlbmRGb3JtYXQoIiAlZCAiLCBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0U3RyZWFtSWQgIT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVyblN0ci5hcHBlbmRGb3JtYXQoImlucHV0IHN0cmVhbSBpZDogJWQiLCBpbnB1dFN0cmVhbUlkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm5TdHIgKz0gIlxuIjsKICAgICB9CisgICAgcmV0dXJuIHJldHVyblN0cjsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIFRhZ01vbml0b3I6Ok1vbml0b3JFdmVudDo6TW9uaXRvckV2ZW50KGV2ZW50U291cmNlIHNyYywgdWludDMyX3QgZnJhbWVOdW1iZXIsIG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICBjb25zdCBUICZ2YWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKSA6CisgICAgICAgIGNvbnN0IFQgJnZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmb3V0cHV0U3RyZWFtSWRzLAorICAgICAgICBpbnQzMl90IGlucHV0U3RyZWFtSWQpIDoKICAgICAgICAgc291cmNlKHNyYyksCiAgICAgICAgIGZyYW1lTnVtYmVyKGZyYW1lTnVtYmVyKSwKICAgICAgICAgdGltZXN0YW1wKHRpbWVzdGFtcCksCiAgICAgICAgIHRhZyh2YWx1ZS50YWcpLAogICAgICAgICB0eXBlKHZhbHVlLnR5cGUpLAogICAgICAgICBuZXdEYXRhKHZhbHVlLmRhdGEudTgsIHZhbHVlLmRhdGEudTggKyBjYW1lcmFfbWV0YWRhdGFfdHlwZV9zaXplW3ZhbHVlLnR5cGVdICogdmFsdWUuY291bnQpLAotICAgICAgICBjYW1lcmFJZChjYW1lcmFJZCkgeworICAgICAgICBjYW1lcmFJZChjYW1lcmFJZCksIG91dHB1dFN0cmVhbUlkcyhvdXRwdXRTdHJlYW1JZHMpLCBpbnB1dFN0cmVhbUlkKGlucHV0U3RyZWFtSWQpIHsKIH0KIAogVGFnTW9uaXRvcjo6TW9uaXRvckV2ZW50Ojp+TW9uaXRvckV2ZW50KCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5oCmluZGV4IDQxM2Y1MDIuLjA4OGQ2ZmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmgKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhX21ldGFkYXRhLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2NhbWVyYV92ZW5kb3JfdGFncy5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGRldmljZTMvSW5GbGlnaHRSZXF1ZXN0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjYsMTkgKzY3LDM1IEBACiAgICAgLy8gU2NhbiB0aHJvdWdoIHRoZSBtZXRhZGF0YSBhbmQgdXBkYXRlIHRoZSBtb25pdG9yaW5nIGluZm9ybWF0aW9uCiAgICAgdm9pZCBtb25pdG9yTWV0YWRhdGEoZXZlbnRTb3VyY2Ugc291cmNlLCBpbnQ2NF90IGZyYW1lTnVtYmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+JiBwaHlzaWNhbE1ldGFkYXRhKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+JiBwaHlzaWNhbE1ldGFkYXRhLAorICAgICAgICAgICAgY29uc3QgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0QnVmZmVycyA9IG51bGxwdHIsCisgICAgICAgICAgICB1aW50MzJfdCBudW1PdXRwdXRCdWZmZXJzID0gMCwgaW50MzJfdCBpbnB1dFN0cmVhbUlkID0gLTEpOwogCiAgICAgLy8gRHVtcCBjdXJyZW50IGV2ZW50IGxvZyB0byB0aGUgcHJvdmlkZWQgZmQKICAgICB2b2lkIGR1bXBNb25pdG9yZWRNZXRhZGF0YShpbnQgZmQpOwogCi0gIHByaXZhdGU6CisgICAgLy8gRHVtcHMgdGhlIGxhdGVzdCBtb25pdG9yZWQgVGFnIGV2ZW50cyB0byB0aGUgcGFzc2VkIHZlY3Rvci4KKyAgICAvLyBOT1RFOiBUaGUgZXZlbnRzIGFyZSBhcHBlbmRlZCB0byB0aGUgdmVjdG9yIGluIHJldmVyc2VyIGNocm9ub2xvZ2ljYWwgb3JkZXIKKyAgICAvLyAoaS5lLiBtb3N0IHJlY2VudCBmaXJzdCkKKyAgICB2b2lkIGdldExhdGVzdE1vbml0b3JlZFRhZ0V2ZW50cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm91dCk7CiAKLSAgICBzdGF0aWMgdm9pZCBwcmludERhdGEoaW50IGZkLCBjb25zdCB1aW50OF90ICpkYXRhX3B0ciwgdWludDMyX3QgdGFnLAotICAgICAgICAgICAgaW50IHR5cGUsIGludCBjb3VudCwgaW50IGluZGVudGF0aW9uKTsKKyAgcHJpdmF0ZToKKyAgICAvLyBEdW1wcyBtb25pdG9yZWQgdGFnIGV2ZW50cyB0byB0aGUgcGFzc2VkIHZlY3RvciB3aXRob3V0IGFjcXVpcmluZworICAgIC8vIG1Nb25pdG9yTXV0ZXguIG1Nb25pdG9yTXV0ZXggbXVzdCBiZSBhY3F1aXJlZCBiZWZvcmUgY2FsbGluZyB0aGlzCisgICAgLy8gZnVuY3Rpb24uCisgICAgdm9pZCBkdW1wTW9uaXRvcmVkVGFnRXZlbnRzVG9WZWN0b3JMb2NrZWQoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZvdXQpOworCisgICAgc3RhdGljIFN0cmluZzggZ2V0RXZlbnREYXRhU3RyaW5nKGNvbnN0IHVpbnQ4X3QgKmRhdGFfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGFnLCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmb3V0cHV0U3RyZWFtSWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbnB1dFN0cmVhbUlkKTsKIAogICAgIHZvaWQgbW9uaXRvclNpbmdsZU1ldGFkYXRhKFRhZ01vbml0b3I6OmV2ZW50U291cmNlIHNvdXJjZSwgaW50NjRfdCBmcmFtZU51bWJlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQsIHVpbnQzMl90IHRhZywKLSAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSk7CisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmb3V0cHV0U3RyZWFtSWRzLAorICAgICAgICAgICAgaW50MzJfdCBpbnB1dFN0cmVhbUlkKTsKIAogICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1Nb25pdG9yaW5nRW5hYmxlZDsKICAgICBzdGQ6Om11dGV4IG1Nb25pdG9yTXV0ZXg7CkBAIC05Myw2ICsxMTAsOSBAQAogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+IG1MYXN0TW9uaXRvcmVkUGh5c2ljYWxSZXF1ZXN0S2V5czsKICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiBtTGFzdE1vbml0b3JlZFBoeXNpY2FsUmVzdWx0S2V5czsKIAorICAgIGludDMyX3QgbUxhc3RJbnB1dFN0cmVhbUlkID0gLTE7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+IG1MYXN0U3RyZWFtSWRzOworCiAgICAgLyoqCiAgICAgICogQSBtb25pdG9yaW5nIGV2ZW50CiAgICAgICogU3RvcmVzIGEgbmV3IG1ldGFkYXRhIGZpZWxkIHZhbHVlIGFuZCB0aGUgdGltZXN0YW1wIGF0IHdoaWNoIGl0IGNoYW5nZWQuCkBAIC0xMDEsNyArMTIxLDggQEAKICAgICBzdHJ1Y3QgTW9uaXRvckV2ZW50IHsKICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICAgICAgTW9uaXRvckV2ZW50KGV2ZW50U291cmNlIHNyYywgdWludDMyX3QgZnJhbWVOdW1iZXIsIG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICAgICAgICAgIGNvbnN0IFQgJm5ld1ZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQpOworICAgICAgICAgICAgICAgIGNvbnN0IFQgJm5ld1ZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZvdXRwdXRTdHJlYW1JZHMsIGludDMyX3QgaW5wdXRTdHJlYW1JZCk7CiAgICAgICAgIH5Nb25pdG9yRXZlbnQoKTsKIAogICAgICAgICBldmVudFNvdXJjZSBzb3VyY2U7CkBAIC0xMTEsNiArMTMyLDggQEAKICAgICAgICAgdWludDhfdCB0eXBlOwogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBuZXdEYXRhOwogICAgICAgICBzdGQ6OnN0cmluZyBjYW1lcmFJZDsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+IG91dHB1dFN0cmVhbUlkczsKKyAgICAgICAgaW50MzJfdCBpbnB1dFN0cmVhbUlkID0gMTsKICAgICB9OwogCiAgICAgLy8gQSByaW5nIGJ1ZmZlciBmb3IgdHJhY2tpbmcgdGhlIGxhc3Qga01heE1vbml0b3JFdmVudHMgbWV0YWRhdGEgY2hhbmdlcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCmluZGV4IGJmNGQ1MjQuLjQ0ODhlZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAKQEAgLTE5LDYgKzE5LDcgQEAKICAgICBuYW1lOiAibWVkaWFzd2NvZGVjIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWyJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIl0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJtYWluX3N3Y29kZWNzZXJ2aWNlLmNwcCIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL09XTkVSUyBiL3NlcnZpY2VzL21lZGlhY29kZWMvT1dORVJTCmluZGV4IGM3MTZjY2UuLjM0NTNhNzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvT1dORVJTCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvT1dORVJTCkBAIC0xLDIgKzEsMyBAQAogamVmZnZAZ29vZ2xlLmNvbQotbWFyY29uZUBnb29nbGUuY29tCitlc3NpY2tAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wLXNlcnZpY2UucmMgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMC1zZXJ2aWNlLnJjCmluZGV4IDNlZjlhODUuLjg0NWU1Y2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wLXNlcnZpY2UucmMKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAtc2VydmljZS5yYwpAQCAtMyw0ICszLDQgQEAKICAgICB1c2VyIG1lZGlhY29kZWMKICAgICBncm91cCBjYW1lcmEgZHJtcnBjIG1lZGlhZHJtCiAgICAgaW9wcmlvIHJ0IDQKLSAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCisgICAgdGFza19wcm9maWxlcyBQcm9jZXNzQ2FwYWNpdHlIaWdoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwCmluZGV4IDY5NmI5NjcuLjEyY2MzMmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwCkBAIC03LDkgKzcsMTUgQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19tZWRpYWNvZGVjX2xpY2Vuc2UiXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisKICAgICBzcmNzOiBbCiAgICAgICAgICJDb2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcCIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9mdXp6ZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2FmYmYxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX21lZGlhY29kZWNfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfc2VydmljZXNfbWVkaWFjb2RlY19saWNlbnNlIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJjb2RlY1NlcnZpY2VSZWdpc3RyYW50X2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAiY29kZWNTZXJ2aWNlUmVnaXN0cmFudF9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyIsCisgICAgXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL1JFQURNRS5tZCBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZmEwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL1JFQURNRS5tZApAQCAtMCwwICsxLDU2IEBACisjIEZ1enplciBmb3IgbGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudAorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgbGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudCBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUgbGlicmFyeSBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBub3QgaGFyZGNvZGVkLCBidXQgaW5zdGVhZCBzZWxlY3RlZCBiYXNlZCBvbgoraW5jb21pbmcgZGF0YS4gVGhpcyBlbnN1cmVzIG1vcmUgY29kZSBwYXRocyBhcmUgcmVhY2hlZCBieSB0aGUgZnV6emVyLgorCitsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIEMyU3RyaW5nIChwYXJhbWV0ZXIgbmFtZTogYGMyU3RyaW5nYCkKKzIuIFdpZHRoIChwYXJhbWV0ZXIgbmFtZTogYHdpZHRoYCkKKzMuIEhlaWdodCAocGFyYW1ldGVyIG5hbWU6IGBoZWlnaHRgKQorNC4gU2FtcGxpbmdSYXRlIChwYXJhbWV0ZXIgbmFtZTogYHNhbXBsaW5nUmF0ZWApCis1LiBDaGFubmVscyAocGFyYW1ldGVyIG5hbWU6IGBjaGFubmVsc2ApCis2LiBTdHJlYW0gKHBhcmFtZXRlciBuYW1lOiBgc3RyZWFtYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBjMlN0cmluZ2AgfGBTdHJpbmdgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGB3aWR0aGAgfGBVSU5UMzJfTUlOYCB0byBgVUlOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYGhlaWdodGAgfGBVSU5UMzJfTUlOYCB0byBgVUlOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYHNhbXBsaW5nUmF0ZWAgfGBVSU5UMzJfTUlOYCB0byBgVUlOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYGNoYW5uZWxzYCB8YFVJTlQzMl9NSU5gIHRvIGBVSU5UMzJfTUFYYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfCBgc3RyZWFtYCB8YFVJTlQzMl9NSU5gIHRvIGBVSU5UMzJfTUFYYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorCitUaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gaXMgYWx3YXlzIGRldGVybWluaXN0aWMgZm9yIGFueSBnaXZlbiBpbnB1dC4KKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIGxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQgbW9kdWxlLgorVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiB0b2xlcmF0ZXMgYW55IGtpbmQgb2YgaW5wdXQgKGVtcHR5LCBodWdlLAorbWFsZm9ybWVkLCBldGMpIGFuZCBkb2VzbnQgYGV4aXQoKWAgb24gYW55IGlucHV0IGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlCitjaGFuY2Ugb2YgaWRlbnRpZnlpbmcgdnVsbmVyYWJpbGl0aWVzLgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBjb2RlY1NlcnZpY2VSZWdpc3RyYW50X2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgY29kZWNTZXJ2aWNlUmVnaXN0cmFudF9mdXp6ZXIKK2BgYAorIyMjIyBTdGVwcyB0byBydW4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6LyR7VEFSR0VUX0FSQ0h9L2NvZGVjU2VydmljZVJlZ2lzdHJhbnRfZnV6emVyL2NvZGVjU2VydmljZVJlZ2lzdHJhbnRfZnV6emVyCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL2NvZGVjU2VydmljZVJlZ2lzdHJhbnRfZnV6emVyLmNwcCBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9mdXp6ZXIvY29kZWNTZXJ2aWNlUmVnaXN0cmFudF9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OTgzZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvZnV6emVyL2NvZGVjU2VydmljZVJlZ2lzdHJhbnRfZnV6emVyLmNwcApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiLi4vQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAiCisjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjb25zdGV4cHIgY2hhciBrU2VydmljZU5hbWVbXSA9ICJzb2Z0d2FyZSI7CisKK2NsYXNzIENvZGVjU2VydmljZVJlZ2lzdHJhbnRGdXp6ZXIgeworcHVibGljOgorICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICB+Q29kZWNTZXJ2aWNlUmVnaXN0cmFudEZ1enplcigpIHsKKyAgICBkZWxldGUgbUgyQzI7CisgICAgaWYgKG1JbnB1dFNpemUpIHsKKyAgICAgIGRlbGV0ZSBtSW5wdXRTaXplOworICAgIH0KKyAgICBpZiAobVNhbXBsZVJhdGVJbmZvKSB7CisgICAgICBkZWxldGUgbVNhbXBsZVJhdGVJbmZvOworICAgIH0KKyAgICBpZiAobUNoYW5uZWxDb3VudEluZm8pIHsKKyAgICAgIGRlbGV0ZSBtQ2hhbm5lbENvdW50SW5mbzsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBpbml0SDJDMkNvbXBvbmVudFN0b3JlKCk7CisgIHZvaWQgaW52b2tlSDJDMkNvbXBvbmVudFN0b3JlKCk7CisgIHZvaWQgaW52b2tlQ29uZmlnU00oKTsKKyAgdm9pZCBpbnZva2VRdWVyeVNNKCk7CisgIEgyQzJDb21wb25lbnRTdG9yZSAqbUgyQzIgPSBudWxscHRyOworICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQgKm1JbnB1dFNpemUgPSBudWxscHRyOworICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgKm1TYW1wbGVSYXRlSW5mbyA9IG51bGxwdHI7CisgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0ICptQ2hhbm5lbENvdW50SW5mbyA9IG51bGxwdHI7CisgIEMyUGFyYW06OkluZGV4IG1JbmRleCA9IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICBDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dCBtRnJhbWVSYXRlOworICBGdXp6ZWREYXRhUHJvdmlkZXIgKm1GRFAgPSBudWxscHRyOworfTsKKwordm9pZCBDb2RlY1NlcnZpY2VSZWdpc3RyYW50RnV6emVyOjppbml0SDJDMkNvbXBvbmVudFN0b3JlKCkgeworICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOworICBzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlID0KKyAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKKyAgaWYgKCFzdG9yZSkgeworICAgIHJldHVybjsKKyAgfQorICBhbmRyb2lkOjpzcDxWMV8xOjpJQ29tcG9uZW50U3RvcmU+IHN0b3JlVjFfMSA9CisgICAgICBuZXcgVjFfMTo6dXRpbHM6OkNvbXBvbmVudFN0b3JlKHN0b3JlKTsKKyAgaWYgKHN0b3JlVjFfMS0+cmVnaXN0ZXJBc1NlcnZpY2Uoc3RyaW5nKGtTZXJ2aWNlTmFtZSkpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgcmV0dXJuOworICB9CisgIHN0cmluZyBjb25zdCBwcmVmZXJyZWRTdG9yZU5hbWUgPSBzdHJpbmcoa1NlcnZpY2VOYW1lKTsKKyAgc3A8SUNvbXBvbmVudFN0b3JlPiBwcmVmZXJyZWRTdG9yZSA9CisgICAgICBJQ29tcG9uZW50U3RvcmU6OmdldFNlcnZpY2UocHJlZmVycmVkU3RvcmVOYW1lLmNfc3RyKCkpOworICBtSDJDMiA9IG5ldyBIMkMyQ29tcG9uZW50U3RvcmUocHJlZmVycmVkU3RvcmUpOworfQorCit2b2lkIENvZGVjU2VydmljZVJlZ2lzdHJhbnRGdXp6ZXI6Omludm9rZUNvbmZpZ1NNKCkgeworICB2ZWN0b3I8QzJQYXJhbSAqPiBjb25maWdQYXJhbXM7CisgIHVpbnQzMl90IHdpZHRoID0gbUZEUC0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICB1aW50MzJfdCBoZWlnaHQgPSBtRkRQLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgdWludDMyX3QgY2hhbm5lbHMgPSBtRkRQLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgIGlmIChtRkRQLT5Db25zdW1lQm9vbCgpKSB7CisgICAgbUlucHV0U2l6ZSA9IG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQoMHUsIHdpZHRoLCBoZWlnaHQpOworICAgIGNvbmZpZ1BhcmFtcy5wdXNoX2JhY2sobUlucHV0U2l6ZSk7CisgIH0gZWxzZSB7CisgICAgaWYgKG1GRFAtPkNvbnN1bWVCb29sKCkpIHsKKyAgICAgIG1TYW1wbGVSYXRlSW5mbyA9IG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIHNhbXBsaW5nUmF0ZSk7CisgICAgICBjb25maWdQYXJhbXMucHVzaF9iYWNrKG1TYW1wbGVSYXRlSW5mbyk7CisgICAgfQorICAgIGlmIChtRkRQLT5Db25zdW1lQm9vbCgpKSB7CisgICAgICBtQ2hhbm5lbENvdW50SW5mbyA9IG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgY2hhbm5lbHMpOworICAgICAgY29uZmlnUGFyYW1zLnB1c2hfYmFjayhtQ2hhbm5lbENvdW50SW5mbyk7CisgICAgfQorICB9CisgIHZlY3Rvcjx1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICBtSDJDMi0+Y29uZmlnX3NtKGNvbmZpZ1BhcmFtcywgJmZhaWx1cmVzKTsKK30KKwordm9pZCBDb2RlY1NlcnZpY2VSZWdpc3RyYW50RnV6emVyOjppbnZva2VRdWVyeVNNKCkgeworICB2ZWN0b3I8QzJQYXJhbSAqPiBzdGFja1BhcmFtczsKKyAgdmVjdG9yPEMyUGFyYW06OkluZGV4PiBoZWFwUGFyYW1JbmRpY2VzOworICBpZiAobUZEUC0+Q29uc3VtZUJvb2woKSkgeworICAgIHN0YWNrUGFyYW1zID0ge307CisgICAgaGVhcFBhcmFtSW5kaWNlcyA9IHt9OworICB9IGVsc2UgeworICAgIHVpbnQzMl90IHN0cmVhbSA9IG1GRFAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgICBtRnJhbWVSYXRlLnNldFN0cmVhbShzdHJlYW0pOworICAgIHN0YWNrUGFyYW1zLnB1c2hfYmFjaygmbUZyYW1lUmF0ZSk7CisgICAgaGVhcFBhcmFtSW5kaWNlcy5wdXNoX2JhY2sobUluZGV4KTsKKyAgfQorICB2ZWN0b3I8dW5pcXVlX3B0cjxDMlBhcmFtPj4gaGVhcFBhcmFtczsKKyAgbUgyQzItPnF1ZXJ5X3NtKHN0YWNrUGFyYW1zLCBoZWFwUGFyYW1JbmRpY2VzLCAmaGVhcFBhcmFtcyk7Cit9CisKK3ZvaWQgQ29kZWNTZXJ2aWNlUmVnaXN0cmFudEZ1enplcjo6aW52b2tlSDJDMkNvbXBvbmVudFN0b3JlKCkgeworICBpbml0SDJDMkNvbXBvbmVudFN0b3JlKCk7CisgIHNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgc2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZXJmYWNlOworICBzdHJpbmcgYzJTdHJpbmcgPSBtRkRQLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCk7CisgIG1IMkMyLT5jcmVhdGVDb21wb25lbnQoYzJTdHJpbmcsICZjb21wb25lbnQpOworICBtSDJDMi0+Y3JlYXRlSW50ZXJmYWNlKGMyU3RyaW5nLCAmaW50ZXJmYWNlKTsKKyAgaW52b2tlQ29uZmlnU00oKTsKKyAgaW52b2tlUXVlcnlTTSgpOworCisgIHZlY3RvcjxzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gcGFyYW1zOworICBtSDJDMi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoJnBhcmFtcyk7CisKKyAgQzJTdG9yZUlvblVzYWdlSW5mbyB1c2FnZUluZm87CisgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gcXVlcnkgPSB7CisgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKAorICAgICAgICAgIEMyUGFyYW1GaWVsZDo6TWFrZSh1c2FnZUluZm8sIHVzYWdlSW5mby51c2FnZSkpLAorICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQb3NzaWJsZSgKKyAgICAgICAgICBDMlBhcmFtRmllbGQ6Ok1ha2UodXNhZ2VJbmZvLCB1c2FnZUluZm8uY2FwYWNpdHkpKSwKKyAgfTsKKyAgbUgyQzItPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKHF1ZXJ5KTsKKworICBtSDJDMi0+Z2V0TmFtZSgpOworICBzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHBhcmFtUmVmbGVjdG9yID0gbUgyQzItPmdldFBhcmFtUmVmbGVjdG9yKCk7CisgIGlmIChwYXJhbVJlZmxlY3RvcikgeworICAgIHBhcmFtUmVmbGVjdG9yLT5kZXNjcmliZShDMkNvbXBvbmVudERvbWFpblNldHRpbmc6OkNPUkVfSU5ERVgpOworICB9CisgIG1IMkMyLT5saXN0Q29tcG9uZW50cygpOworICBzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gc3JjOworICBzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0OworICBtSDJDMi0+Y29weUJ1ZmZlcihzcmMsIGRzdCk7Cit9CisKK3ZvaWQgQ29kZWNTZXJ2aWNlUmVnaXN0cmFudEZ1enplcjo6cHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBtRkRQID0gbmV3IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgaW52b2tlSDJDMkNvbXBvbmVudFN0b3JlKCk7CisgIC8qKiBSZWdpc3RlckNvZGVjU2VydmljZXMgaXMgY2FsbGVkIGhlcmUgdG8gaW1wcm92ZSBjb2RlIGNvdmVyYWdlICovCisgIC8qKiBhcyBjdXJyZW50bHkgaXQgaXMgbm90IGNhbGxlZCBieSBjb2RlY1NlcnZpY2VSZWdpc3RyYW50ICAgICAgICovCisgIFJlZ2lzdGVyQ29kZWNTZXJ2aWNlcygpOworICBkZWxldGUgbUZEUDsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBDb2RlY1NlcnZpY2VSZWdpc3RyYW50RnV6emVyIGNvZGVjU2VydmljZVJlZ2lzdHJhbnRGdXp6ZXI7CisgIGNvZGVjU2VydmljZVJlZ2lzdHJhbnRGdXp6ZXIucHJvY2VzcyhkYXRhLCBzaXplKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm0ucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtLnBvbGljeQppbmRleCA5MDU4ZjEwLi40MWVmY2UwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm0ucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybS5wb2xpY3kKQEAgLTg0LDUgKzg0LDYgQEAKIGdldGdpZDMyOiAxCiBnZXRlZ2lkMzI6IDEKIGdldGdyb3VwczMyOiAxCitzeXNpbmZvOiAxCiAKIEBpbmNsdWRlIC9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMvZXRjL3NlY2NvbXBfcG9saWN5L2NvZGVfY292ZXJhZ2UuYXJtLnBvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtNjQucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtNjQucG9saWN5CmluZGV4IDdmZjg1OGIuLjQzMTdjY2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybTY0LnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kKQEAgLTc4LDYgKzc4LDcgQEAKIGdldGdpZDogMQogZ2V0ZWdpZDogMQogZ2V0Z3JvdXBzOiAxCitzeXNpbmZvOiAxCiAKICMgQW5kcm9pZCBwcm9maWxlciAoaGVhcHByb2ZkLCB0cmFjZWRfcGVyZikgYWRkaXRpb25zLCB3aGVyZSBub3QgYWxyZWFkeQogIyBjb3ZlcmVkIGJ5IHRoZSByZXN0IG9mIHRoZSBmaWxlLCBvciBieSBidWlsdGluIG1pbmlqYWlsIGFsbG93LWxpc3Rpbmcgb2YKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL09XTkVSUyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL09XTkVSUwppbmRleCBjNzE2Y2NlLi4yYTc3OWMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9PV05FUlMKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvT1dORVJTCkBAIC0xLDIgKzEsMyBAQAogamVmZnZAZ29vZ2xlLmNvbQotbWFyY29uZUBnb29nbGUuY29tCitlc3NpY2tAZ29vZ2xlLmNvbQorYXF1aWxlc2NhbnRhQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL1RFU1RfTUFQUElORyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTY2ZWViCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsNyBAQAoreworICAgICJwcmVzdWJtaXQiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJuYW1lIjogIkN0c01lZGlhVHJhbnNjb2RpbmdUZXN0Q2FzZXMiCisgICAgICAgIH0KKyAgICBdCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tZWRpYWV4dHJhY3Rvci5yYyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21lZGlhZXh0cmFjdG9yLnJjCmluZGV4IDVmYzI5NDEuLjRmYjUwZDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21lZGlhZXh0cmFjdG9yLnJjCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21lZGlhZXh0cmFjdG9yLnJjCkBAIC0zLDQgKzMsNCBAQAogICAgIHVzZXIgbWVkaWFleAogICAgIGdyb3VwIGRybXJwYyBtZWRpYWRybQogICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKaW5kZXggY2ZjNGM0MC4uODA4OGVmMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCkBAIC0yNiw2ICsyNiw3IEBACiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm5ibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmRyb2lkLmJwCmluZGV4IDU5ODkxODEuLjExNTM0YmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmRyb2lkLmJwCkBAIC0xMTQsNiArMTE0LDcgQEAKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibWVkaWFtZXRyaWNzc2VydmljZS1haWRsLWNwcCIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlsc19oZWFkZXJzIiwKQEAgLTE0OCw3ICsxNDksOCBAQAogICAgICAgICAic3RhdHNkX21lZGlhcGFyc2VyLmNwcCIsCiAgICAgICAgICJzdGF0c2RfbnVwbGF5ZXIuY3BwIiwKICAgICAgICAgInN0YXRzZF9yZWNvcmRlci5jcHAiLAotICAgICAgICAiU3RyaW5nVXRpbHMuY3BwIgorICAgICAgICAiU3RyaW5nVXRpbHMuY3BwIiwKKyAgICAgICAgIlZhbGlkYXRlSWQuY3BwIiwKICAgICBdLAogCiAgICAgcHJvdG86IHsKQEAgLTE3MSw2ICsxNzMsNyBAQAogICAgICAgICAibGlic3RhdHNwdWxsIiwKICAgICAgICAgImxpYnN0YXRzc29ja2V0IiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpAQCAtMTc4LDExICsxODEsMjIgQEAKICAgICAgICAgImxpYnN0YXRzc29ja2V0IiwKICAgICBdLAogCisgICAgLy8gd2l0aGluIHRoZSBsaWJyYXJ5LCB3ZSB1c2UgInh4eC5oIgorICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlIiwKKyAgICBdLAorCisgICAgLy8gZXh0ZXJuYWwgcGFydGllcyB1c2UgPG1lZGlhbWV0cmljc3NlcnZpY2UveHh4Lmg+CisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKwogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJwbGF0Zm9ybXByb3RvcyIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAic3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUiLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW9faGVhZGVycyIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzX2hlYWRlcnMiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9BbmFseXRpY3MuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvQW5hbHl0aWNzLmNwcAppbmRleCA0NWM5ZjU2Li45OWUzNjkxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9BbmFseXRpY3MuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb0FuYWx5dGljcy5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgIkF1ZGlvQW5hbHl0aWNzLmgiCiAKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+ICAgICAgICAvLyBlcnJvciBjb2RlcwogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+ICAgIC8vIGNsb2NrIGNvbnZlcnNpb25zCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxzdGF0c2xvZy5oPiAgICAgICAgICAgICAvLyBzdGF0c2QKQEAgLTI5LDYgKzMwLDcgQEAKICNpbmNsdWRlICJBdWRpb1R5cGVzLmgiICAgICAgICAgICAvLyBzdHJpbmcgdG8gaW50IGNvbnZlcnNpb25zCiAjaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIiAgLy8gcGFja2FnZSBpbmZvCiAjaW5jbHVkZSAiU3RyaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJWYWxpZGF0ZUlkLmgiCiAKICNkZWZpbmUgUFJPUF9BVURJT19BTkFMWVRJQ1NfQ0xPVURfRU5BQkxFRCAicGVyc2lzdC5hdWRpby5hbmFseXRpY3MuY2xvdWQuZW5hYmxlZCIKIApAQCAtNjMsNiArNjUsNTAgQEAKICAgICB9CiB9CiAKKy8vIFRoZSBzdGF0dXMgdmFyaWFibGUgY29udGFpbnMgc3RhdHVzX3QgY29kZXMgd2hpY2ggYXJlIHVzZWQgYnkKKy8vIHRoZSBjb3JlIGF1ZGlvIGZyYW1ld29yay4gV2UgYWxzbyBjb25zaWRlciBBQXVkaW8gc3RhdHVzIGNvZGVzLgorLy8KKy8vIENvbXBhcmUgd2l0aCBtZWRpYW1ldHJpY3M6OnN0YXR1c1RvU3RhdHVzU3RyaW5nCisvLworaW5saW5lIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBleHRlbmRlZFN0YXR1c1RvU3RhdHVzU3RyaW5nKHN0YXR1c190IHN0YXR1cykgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBCQURfVkFMVUU6ICAgICAgICAgICAvLyBzdGF0dXNfdAorICAgIGNhc2UgQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ6CisgICAgY2FzZSBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ6CisgICAgY2FzZSBBQVVESU9fRVJST1JfSU5WQUxJRF9SQVRFOgorICAgIGNhc2UgQUFVRElPX0VSUk9SX05VTEw6CisgICAgY2FzZSBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOgorICAgICAgICByZXR1cm4gQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9BUkdVTUVOVDsKKyAgICBjYXNlIERFQURfT0JKRUNUOiAgICAgICAgIC8vIHN0YXR1c190CisgICAgY2FzZSBGQUlMRURfVFJBTlNBQ1RJT046ICAvLyBzdGF0dXNfdAorICAgIGNhc2UgQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRDoKKyAgICBjYXNlIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRToKKyAgICBjYXNlIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOgorICAgICAgICByZXR1cm4gQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9JTzsKKyAgICBjYXNlIE5PX01FTU9SWTogICAgICAgICAgIC8vIHN0YXR1c190CisgICAgY2FzZSBBQVVESU9fRVJST1JfTk9fRlJFRV9IQU5ETEVTOgorICAgIGNhc2UgQUFVRElPX0VSUk9SX05PX01FTU9SWToKKyAgICAgICAgcmV0dXJuIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfTUVNT1JZOworICAgIGNhc2UgUEVSTUlTU0lPTl9ERU5JRUQ6ICAgLy8gc3RhdHVzX3QKKyAgICAgICAgcmV0dXJuIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfU0VDVVJJVFk7CisgICAgY2FzZSBJTlZBTElEX09QRVJBVElPTjogICAvLyBzdGF0dXNfdAorICAgIGNhc2UgTk9fSU5JVDogICAgICAgICAgICAgLy8gc3RhdHVzX3QKKyAgICBjYXNlIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOgorICAgIGNhc2UgQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOgorICAgIGNhc2UgQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ6CisgICAgICAgIHJldHVybiBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1NUQVRFOworICAgIGNhc2UgV09VTERfQkxPQ0s6ICAgICAgICAgLy8gc3RhdHVzX3QKKyAgICBjYXNlIEFBVURJT19FUlJPUl9USU1FT1VUOgorICAgIGNhc2UgQUFVRElPX0VSUk9SX1dPVUxEX0JMT0NLOgorICAgICAgICByZXR1cm4gQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9USU1FT1VUOworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChzdGF0dXMgPj0gMCkgcmV0dXJuIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfT0s7IC8vIG5vbi1uZWdhdGl2ZSB2YWx1ZXMgIk9LIgorICAgICAgICBbW2ZhbGx0aHJvdWdoXV07ICAgICAgICAgICAgLy8gbmVnYXRpdmUgdmFsdWVzIGFyZSBlcnJvci4KKyAgICBjYXNlIFVOS05PV05fRVJST1I6ICAgICAgIC8vIHN0YXR1c190CisgICAgICAgIHJldHVybiBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1VOS05PV047CisgICAgfQorfQorCiBzdGF0aWMgY29uc3RleHByIGNvbnN0IGF1dG8gTE9HX0xFVkVMID0gYW5kcm9pZDo6YmFzZTo6VkVSQk9TRTsKIAogc3RhdGljIGNvbnN0ZXhwciBpbnQgUFJFVklPVVNfU1RBVEVfRVhQSVJFX1NFQyA9IDYwICogNjA7IC8vIDEgaG91ci4KQEAgLTEyOSw2ICsxNzUsMzkgQEAKICAgICAibG9nX3Nlc3Npb25faWQiLAogfTsKIAorc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICogY29uc3QgQXVkaW9SZWNvcmRTdGF0dXNGaWVsZHNbXSB7CisgICAgIm1lZGlhbWV0cmljc19hdWRpb3JlY29yZHN0YXR1c19yZXBvcnRlZCIsCisgICAgInN0YXR1cyIsCisgICAgImRlYnVnX21lc3NhZ2UiLAorICAgICJzdGF0dXNfc3ViY29kZSIsCisgICAgInVpZCIsCisgICAgImV2ZW50IiwKKyAgICAiaW5wdXRfZmxhZ3MiLAorICAgICJzb3VyY2UiLAorICAgICJlbmNvZGluZyIsCisgICAgImNoYW5uZWxfbWFzayIsCisgICAgImJ1ZmZlcl9mcmFtZV9jb3VudCIsCisgICAgInNhbXBsZV9yYXRlIiwKK307CisKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvVHJhY2tTdGF0dXNGaWVsZHNbXSB7CisgICAgIm1lZGlhbWV0cmljc19hdWRpb3RyYWNrc3RhdHVzX3JlcG9ydGVkIiwKKyAgICAic3RhdHVzIiwKKyAgICAiZGVidWdfbWVzc2FnZSIsCisgICAgInN0YXR1c19zdWJjb2RlIiwKKyAgICAidWlkIiwKKyAgICAiZXZlbnQiLAorICAgICJvdXRwdXRfZmxhZ3MiLAorICAgICJjb250ZW50X3R5cGUiLAorICAgICJ1c2FnZSIsCisgICAgImVuY29kaW5nIiwKKyAgICAiY2hhbm5lbF9tYXNrIiwKKyAgICAiYnVmZmVyX2ZyYW1lX2NvdW50IiwKKyAgICAic2FtcGxlX3JhdGUiLAorICAgICJzcGVlZCIsCisgICAgInBpdGNoIiwKK307CisKIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvRGV2aWNlQ29ubmVjdGlvbkZpZWxkc1tdID0gewogICAgICJtZWRpYW1ldHJpY3NfYXVkaW9kZXZpY2Vjb25uZWN0aW9uX3JlcG9ydGVkIiwKICAgICAiaW5wdXRfZGV2aWNlcyIsCkBAIC0yMTgsMzMgKzI5NywzNSBAQAogICAgIEFMT0dEKCIlcyIsIF9fZnVuY19fKTsKIAogICAgIC8vIEFkZCBhY3Rpb24gdG8gc2F2ZSBBbmFseXRpY3NTdGF0ZSBpZiBhdWRpb3NlcnZlciBpcyByZXN0YXJ0ZWQuCi0gICAgLy8gVGhpcyB0cmlnZ2VycyBvbiBhbiBpdGVtIG9mICJhdWRpby5mbGluZ2VyIgotICAgIC8vIHdpdGggYSBwcm9wZXJ0eSAiZXZlbnQiIHNldCB0byAiQXVkaW9GbGluZ2VyIiAodGhlIGNvbnN0cnVjdG9yKS4KKyAgICAvLyBUaGlzIHRyaWdnZXJzIG9uIEF1ZGlvRmxpbmdlciBvciBBdWRpb1BvbGljeSBjdG9ycyBhbmQgb25GaXJzdFJlZiwKKyAgICAvLyBhcyB3ZWxsIGFzIFRpbWVDaGVjayBldmVudHMuCiAgICAgbUFjdGlvbnMuYWRkQWN0aW9uKAogICAgICAgICBBTUVESUFNRVRSSUNTX0tFWV9BVURJT19GTElOR0VSICIuIiBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsCiAgICAgICAgIHN0ZDo6c3RyaW5nKEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9DVE9SKSwKICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxBbmFseXRpY3NBY3Rpb25zOjpGdW5jdGlvbj4oCiAgICAgICAgICAgICBbdGhpc10oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6SXRlbT4gJml0ZW0pewotICAgICAgICAgICAgICAgIEFMT0dXKCIoa2V5PSVzKSBBdWRpb2ZsaW5nZXIgY29uc3RydWN0b3IgZXZlbnQgZGV0ZWN0ZWQiLCBpdGVtLT5nZXRLZXkoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBtUHJldmlvdXNBbmFseXRpY3NTdGF0ZS5zZXQoc3RkOjptYWtlX3NoYXJlZDxBbmFseXRpY3NTdGF0ZT4oCi0gICAgICAgICAgICAgICAgICAgICAgICAqbUFuYWx5dGljc1N0YXRlLmdldCgpKSk7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZTogZ2V0IHJldHVybnMgc2hhcmVkX3B0ciB0ZW1wLCB3aG9zZSBsaWZldGltZSBpcyBleHRlbmRlZAotICAgICAgICAgICAgICAgIC8vIHRvIGVuZCBvZiBmdWxsIGV4cHJlc3Npb24uCi0gICAgICAgICAgICAgICAgbUFuYWx5dGljc1N0YXRlLT5jbGVhcigpOyAgLy8gVE9ETzogZmlsdGVyIHRoZSBhbmFseXRpY3Mgc3RhdGUuCi0gICAgICAgICAgICAgICAgLy8gUGVyaGFwcyByZXBvcnQgdGhpcy4KLQotICAgICAgICAgICAgICAgIC8vIFNldCB1cCBhIHRpbWVyIHRvIGV4cGlyZSB0aGUgcHJldmlvdXMgYXVkaW8gc3RhdGUgdG8gc2F2ZSBzcGFjZS4KLSAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHRyYW5zYWN0aW9uIGxvZyBzaXplIGFzIGEgY29va2llIHRvIHNlZSBpZiBpdCBpcyB0aGUKLSAgICAgICAgICAgICAgICAvLyBzYW1lIGFzIGJlZm9yZS4gIEEgYmVuaWduIHJhY2UgaXMgcG9zc2libGUgd2hlcmUgYSBzdGF0ZSBpcyBjbGVhcmVkIGVhcmx5LgotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gbVByZXZpb3VzQW5hbHl0aWNzU3RhdGUtPnRyYW5zYWN0aW9uTG9nKCkuc2l6ZSgpOwotICAgICAgICAgICAgICAgIG1UaW1lZEFjdGlvbi5wb3N0SW4oCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c2Vjb25kcyhQUkVWSU9VU19TVEFURV9FWFBJUkVfU0VDKSwgW3RoaXMsIHNpemVdKCl7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUHJldmlvdXNBbmFseXRpY3NTdGF0ZS0+dHJhbnNhY3Rpb25Mb2coKS5zaXplKCkgPT0gc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImV4cGlyaW5nIHByZXZpb3VzIGF1ZGlvIHN0YXRlIGFmdGVyICVkIHNlY29uZHMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFVklPVVNfU1RBVEVfRVhQSVJFX1NFQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNBbmFseXRpY3NTdGF0ZS0+Y2xlYXIoKTsgIC8vIHJlbW92ZXMgZGF0YSBmcm9tIHRoZSBzdGF0ZS4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIG1IZWFsdGgub25BdWRpb1NlcnZlclN0YXJ0KEhlYWx0aDo6TW9kdWxlOjpBVURJT0ZMSU5HRVIsIGl0ZW0pOworICAgICAgICAgICAgfSkpOworICAgIG1BY3Rpb25zLmFkZEFjdGlvbigKKyAgICAgICAgQU1FRElBTUVUUklDU19LRVlfQVVESU9fUE9MSUNZICIuIiBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsCisgICAgICAgIHN0ZDo6c3RyaW5nKEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9DVE9SKSwKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxBbmFseXRpY3NBY3Rpb25zOjpGdW5jdGlvbj4oCisgICAgICAgICAgICBbdGhpc10oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6SXRlbT4gJml0ZW0peworICAgICAgICAgICAgICAgIG1IZWFsdGgub25BdWRpb1NlcnZlclN0YXJ0KEhlYWx0aDo6TW9kdWxlOjpBVURJT1BPTElDWSwgaXRlbSk7CisgICAgICAgICAgICB9KSk7CisgICAgbUFjdGlvbnMuYWRkQWN0aW9uKAorICAgICAgICBBTUVESUFNRVRSSUNTX0tFWV9BVURJT19GTElOR0VSICIuIiBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsCisgICAgICAgIHN0ZDo6c3RyaW5nKEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9USU1FT1VUKSwKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxBbmFseXRpY3NBY3Rpb25zOjpGdW5jdGlvbj4oCisgICAgICAgICAgICBbdGhpc10oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6SXRlbT4gJml0ZW0peworICAgICAgICAgICAgICAgIG1IZWFsdGgub25BdWRpb1NlcnZlclRpbWVvdXQoSGVhbHRoOjpNb2R1bGU6OkFVRElPRkxJTkdFUiwgaXRlbSk7CisgICAgICAgICAgICB9KSk7CisgICAgbUFjdGlvbnMuYWRkQWN0aW9uKAorICAgICAgICBBTUVESUFNRVRSSUNTX0tFWV9BVURJT19QT0xJQ1kgIi4iIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwKKyAgICAgICAgc3RkOjpzdHJpbmcoQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1RJTUVPVVQpLAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEFuYWx5dGljc0FjdGlvbnM6OkZ1bmN0aW9uPigKKyAgICAgICAgICAgIFt0aGlzXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpJdGVtPiAmaXRlbSl7CisgICAgICAgICAgICAgICAgbUhlYWx0aC5vbkF1ZGlvU2VydmVyVGltZW91dChIZWFsdGg6Ok1vZHVsZTo6QVVESU9QT0xJQ1ksIGl0ZW0pOwogICAgICAgICAgICAgfSkpOwogCiAgICAgLy8gSGFuZGxlIGxlZ2FjeSBhYXVkaW8gcGxheWJhY2sgc3RyZWFtIHN0YXRpc3RpY3MKQEAgLTM5MSwxMSArNDcyLDE1IEBACiB7CiAgICAgaWYgKCFzdGFydHNXaXRoKGl0ZW0tPmdldEtleSgpLCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU8pKSByZXR1cm4gQkFEX1ZBTFVFOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1BbmFseXRpY3NTdGF0ZS0+c3VibWl0KGl0ZW0sIGlzVHJ1c3RlZCk7CisKKyAgICAvLyBTdGF0dXMgaXMgc2VsZWN0aXZlbHkgYXV0aGVudGljYXRlZC4KKyAgICBwcm9jZXNzU3RhdHVzKGl0ZW0pOworCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsgIC8vIG1heSBub3QgYmUgcGVybWl0dGVkLgogCiAgICAgLy8gT25seSBpZiB0aGUgaXRlbSB3YXMgc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCAocGVybWlzc2lvbikKICAgICAvLyBkbyB3ZSBjaGVjayB0cmlnZ2VyZWQgYWN0aW9ucy4KLSAgICBjaGVja0FjdGlvbnMoaXRlbSk7CisgICAgcHJvY2Vzc0FjdGlvbnMoaXRlbSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC00MjksNyArNTE0LDcgQEAKICAgICByZXR1cm4geyBzcy5zdHIoKSwgbGluZXMgLSBsbCB9OwogfQogCi12b2lkIEF1ZGlvQW5hbHl0aWNzOjpjaGVja0FjdGlvbnMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0pCit2b2lkIEF1ZGlvQW5hbHl0aWNzOjpwcm9jZXNzQWN0aW9ucyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSkKIHsKICAgICBhdXRvIGFjdGlvbnMgPSBtQWN0aW9ucy5nZXRBY3Rpb25zRm9ySXRlbShpdGVtKTsgLy8gaW50ZXJuYWxseSBsb2NrZWQuCiAgICAgLy8gRXhlY3V0ZSBhY3Rpb25zIHdpdGggbm8gbG9jayBoZWxkLgpAQCAtNDM4LDYgKzUyMywyMDIgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9BbmFseXRpY3M6OnByb2Nlc3NTdGF0dXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0pCit7CisgICAgaW50MzJfdCBzdGF0dXM7CisgICAgaWYgKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX1NUQVRVUywgJnN0YXR1cykpIHJldHVybjsKKworICAgIC8vIEFueSByZWNvcmQgd2l0aCBhIHN0YXR1cyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQgdG8gYSBoZWF0IG1hcC4KKyAgICAvLyBTdGFuZGFyZCBpbmZvcm1hdGlvbi4KKyAgICBjb25zdCBhdXRvIGtleSA9IGl0ZW0tPmdldEtleSgpOworICAgIGNvbnN0IGF1dG8gdWlkID0gaXRlbS0+Z2V0VWlkKCk7CisKKyAgICAvLyBmcm9tIGF1ZGlvLnRyYWNrLjEwIC0+ICBwcmVmaXggPSBhdWRpby50cmFjaywgc3VmZml4ID0gMTAKKyAgICAvLyBmcm9tIGF1ZGlvLnRyYWNrLmVycm9yIC0+IHByZWZpeCA9IGF1ZGlvLnRyYWNrLCBzdWZmaXggPSBlcnJvcgorICAgIGNvbnN0IGF1dG8gW3ByZWZpeEtleSwgc3VmZml4S2V5XSA9IHN0cmluZ3V0aWxzOjpzcGxpdFByZWZpeEtleShrZXkpOworCisgICAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKKyAgICBpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU01FU1NBR0UsICZtZXNzYWdlKTsgLy8gb3B0aW9uYWwKKworICAgIGludDMyX3Qgc3ViQ29kZSA9IDA7IC8vIG5vdCB1c2VkCisgICAgKHZvaWQpaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNTVUJDT0RFLCAmc3ViQ29kZSk7IC8vIG9wdGlvbmFsCisKKyAgICBzdGQ6OnN0cmluZyBldmVudFN0cjsgLy8gb3B0aW9uYWwKKyAgICBpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCAmZXZlbnRTdHIpOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RhdHVzU3RyaW5nID0gZXh0ZW5kZWRTdGF0dXNUb1N0YXR1c1N0cmluZyhzdGF0dXMpOworCisgICAgLy8gQWRkIHRvIHRoZSBoZWF0IG1hcCAtIHdlIGF1dG9tYXRpY2FsbHkgdHJhY2sgZXZlcnkgaXRlbSdzIHN0YXR1cyB0byBzZWUKKyAgICAvLyB0aGUgdHlwZXMgb2YgZXJyb3JzIGFuZCB0aGUgZnJlcXVlbmN5IG9mIGVycm9ycy4KKyAgICBtSGVhdE1hcC5hZGQocHJlZml4S2V5LCBzdWZmaXhLZXksIGV2ZW50U3RyLCBzdGF0dXNTdHJpbmcsIHVpZCwgbWVzc2FnZSwgc3ViQ29kZSk7CisKKyAgICAvLyBDZXJ0YWluIGtleXMvZXZlbnQgcGFpcnMgYXJlIHNlbnQgdG8gc3RhdHNkLiAgSWYgd2UgZ2V0IGEgbWF0Y2ggKHRydWUpIHdlIHJldHVybiBlYXJseS4KKyAgICBpZiAocmVwb3J0QXVkaW9SZWNvcmRTdGF0dXMoaXRlbSwga2V5LCBldmVudFN0ciwgc3RhdHVzU3RyaW5nLCB1aWQsIG1lc3NhZ2UsIHN1YkNvZGUpKSByZXR1cm47CisgICAgaWYgKHJlcG9ydEF1ZGlvVHJhY2tTdGF0dXMoaXRlbSwga2V5LCBldmVudFN0ciwgc3RhdHVzU3RyaW5nLCB1aWQsIG1lc3NhZ2UsIHN1YkNvZGUpKSByZXR1cm47Cit9CisKK2Jvb2wgQXVkaW9BbmFseXRpY3M6OnJlcG9ydEF1ZGlvUmVjb3JkU3RhdHVzKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIGV2ZW50U3RyLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RhdHVzU3RyaW5nLCB1aWRfdCB1aWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLAorICAgICAgICBpbnQzMl90IHN1YkNvZGUpIGNvbnN0Cit7CisgICAgLy8gTm90ZSB0aGF0IHRoZSBwcmVmaXhlcyBvZnRlbiBlbmQgd2l0aCBhICcuJyBzbyB3ZSB1c2Ugc3RhcnRzV2l0aC4KKyAgICBpZiAoIXN0YXJ0c1dpdGgoa2V5LCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fUkVDT1JEKSkgcmV0dXJuIGZhbHNlOworICAgIGlmIChldmVudFN0ciA9PSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfQ1JFQVRFKSB7CisgICAgICAgIGNvbnN0IGludCBhdG9tX3N0YXR1cyA9IHR5cGVzOjpsb29rdXA8dHlwZXM6OlNUQVRVUywgaW50MzJfdD4oc3RhdHVzU3RyaW5nKTsKKworICAgICAgICAvLyBjdXJyZW50bHkgd2Ugb25seSBzZW5kIGNyZWF0ZSBzdGF0dXMgZXZlbnRzLgorICAgICAgICBjb25zdCBpbnQzMl90IGV2ZW50ID0gYW5kcm9pZDo6dXRpbDo6CisgICAgICAgICAgICAgICAgTUVESUFNRVRSSUNTX0FVRElPX1JFQ09SRF9TVEFUVVNfUkVQT1JURURfX0VWRU5UX19BVURJT19SRUNPUkRfRVZFTlRfQ1JFQVRFOworCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZmllbGRzIHNob3VsZCBhbGwgYmUgcHJlc2VudCBpbiBhIGNyZWF0ZSBldmVudC4KKyAgICAgICAgc3RkOjpzdHJpbmcgZmxhZ3NTdHI7CisgICAgICAgIEFMT0dEX0lGKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX09SSUdJTkFMRkxBR1MsICZmbGFnc1N0ciksCisgICAgICAgICAgICAgICAgIiVzOiAlcyBtaXNzaW5nICVzIGZpZWxkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1JFQ09SRCwgQU1FRElBTUVUUklDU19QUk9QX09SSUdJTkFMRkxBR1MpOworICAgICAgICBjb25zdCBhdXRvIGZsYWdzID0gdHlwZXM6Omxvb2t1cDx0eXBlczo6SU5QVVRfRkxBRywgaW50MzJfdD4oZmxhZ3NTdHIpOworCisgICAgICAgIC8vIEFNRURJQU1FVFJJQ1NfUFJPUF9TRVNTSU9OSUQgb21pdHRlZCBmcm9tIGF0b20KKworICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VTdHI7CisgICAgICAgIEFMT0dEX0lGKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX1NPVVJDRSwgJnNvdXJjZVN0ciksCisgICAgICAgICAgICAgICAgIiVzOiAlcyBtaXNzaW5nICVzIGZpZWxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1JFQ09SRCwgQU1FRElBTUVUUklDU19QUk9QX1NPVVJDRSk7CisgICAgICAgIGNvbnN0IGludDMyX3Qgc291cmNlID0gdHlwZXM6Omxvb2t1cDx0eXBlczo6U09VUkNFX1RZUEUsIGludDMyX3Q+KHNvdXJjZVN0cik7CisKKyAgICAgICAgLy8gQU1FRElBTUVUUklDU19QUk9QX1NFTEVDVEVEREVWSUNFSUQgb21pdHRlZCBmcm9tIGF0b20KKworICAgICAgICBzdGQ6OnN0cmluZyBlbmNvZGluZ1N0cjsKKyAgICAgICAgQUxPR0RfSUYoIWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfRU5DT0RJTkcsICZlbmNvZGluZ1N0ciksCisgICAgICAgICAgICAgICAgIiVzOiAlcyBtaXNzaW5nICVzIGZpZWxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1JFQ09SRCwgQU1FRElBTUVUUklDU19QUk9QX0VOQ09ESU5HKTsKKyAgICAgICAgY29uc3QgYXV0byBlbmNvZGluZyA9IHR5cGVzOjpsb29rdXA8dHlwZXM6OkVOQ09ESU5HLCBpbnQzMl90PihlbmNvZGluZ1N0cik7CisKKyAgICAgICAgaW50MzJfdCBjaGFubmVsTWFzayA9IDA7CisgICAgICAgIEFMT0dEX0lGKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX0NIQU5ORUxNQVNLLCAmY2hhbm5lbE1hc2spLAorICAgICAgICAgICAgICAgICIlczogJXMgbWlzc2luZyAlcyBmaWVsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19SRUNPUkQsIEFNRURJQU1FVFJJQ1NfUFJPUF9DSEFOTkVMTUFTSyk7CisgICAgICAgIGludDMyX3QgZnJhbWVDb3VudCA9IDA7CisgICAgICAgIEFMT0dEX0lGKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX0ZSQU1FQ09VTlQsICZmcmFtZUNvdW50KSwKKyAgICAgICAgICAgICAgICAiJXM6ICVzIG1pc3NpbmcgJXMgZmllbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fUkVDT1JELCBBTUVESUFNRVRSSUNTX1BST1BfRlJBTUVDT1VOVCk7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IDA7CisgICAgICAgIEFMT0dEX0lGKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX1NBTVBMRVJBVEUsICZzYW1wbGVSYXRlKSwKKyAgICAgICAgICAgICAgICAiJXM6ICVzIG1pc3NpbmcgJXMgZmllbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fUkVDT1JELCBBTUVESUFNRVRSSUNTX1BST1BfU0FNUExFUkFURSk7CisKKyAgICAgICAgY29uc3QgYXV0byBbIHJlc3VsdCwgc3RyIF0gPSBzZW5kVG9TdGF0c2QoQXVkaW9SZWNvcmRTdGF0dXNGaWVsZHMsCisgICAgICAgICAgICAgICAgQ09ORElUSU9OKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19BVURJT1JFQ09SRFNUQVRVU19SRVBPUlRFRCkKKyAgICAgICAgICAgICAgICAsIGF0b21fc3RhdHVzCisgICAgICAgICAgICAgICAgLCBtZXNzYWdlLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAsIHN1YkNvZGUKKyAgICAgICAgICAgICAgICAsIHVpZAorICAgICAgICAgICAgICAgICwgZXZlbnQKKyAgICAgICAgICAgICAgICAsIGZsYWdzCisgICAgICAgICAgICAgICAgLCBzb3VyY2UKKyAgICAgICAgICAgICAgICAsIGVuY29kaW5nCisgICAgICAgICAgICAgICAgLCAoaW50NjRfdCljaGFubmVsTWFzaworICAgICAgICAgICAgICAgICwgZnJhbWVDb3VudAorICAgICAgICAgICAgICAgICwgc2FtcGxlUmF0ZQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIEFMT0dWKCIlczogc3RhdHNkICVzIiwgX19mdW5jX18sIHN0ci5jX3N0cigpKTsKKyAgICAgICAgbVN0YXRzZExvZy0+bG9nKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19BVURJT1JFQ09SRFNUQVRVU19SRVBPUlRFRCwgc3RyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb0FuYWx5dGljczo6cmVwb3J0QXVkaW9UcmFja1N0YXR1cygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudFN0ciwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0YXR1c1N0cmluZywgdWlkX3QgdWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKKyAgICAgICAgaW50MzJfdCBzdWJDb2RlKSBjb25zdAoreworICAgIC8vIE5vdGUgdGhhdCB0aGUgcHJlZml4ZXMgb2Z0ZW4gZW5kIHdpdGggYSAnLicgc28gd2UgdXNlIHN0YXJ0c1dpdGguCisgICAgaWYgKCFzdGFydHNXaXRoKGtleSwgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1RSQUNLKSkgcmV0dXJuIGZhbHNlOworICAgIGlmIChldmVudFN0ciA9PSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfQ1JFQVRFKSB7CisgICAgICAgIGNvbnN0IGludCBhdG9tX3N0YXR1cyA9IHR5cGVzOjpsb29rdXA8dHlwZXM6OlNUQVRVUywgaW50MzJfdD4oc3RhdHVzU3RyaW5nKTsKKworICAgICAgICAvLyBjdXJyZW50bHkgd2Ugb25seSBzZW5kIGNyZWF0ZSBzdGF0dXMgZXZlbnRzLgorICAgICAgICBjb25zdCBpbnQzMl90IGV2ZW50ID0gYW5kcm9pZDo6dXRpbDo6CisgICAgICAgICAgICAgICAgTUVESUFNRVRSSUNTX0FVRElPX1RSQUNLX1NUQVRVU19SRVBPUlRFRF9fRVZFTlRfX0FVRElPX1RSQUNLX0VWRU5UX0NSRUFURTsKKworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBzaG91bGQgYWxsIGJlIHByZXNlbnQgaW4gYSBjcmVhdGUgZXZlbnQuCisgICAgICAgIHN0ZDo6c3RyaW5nIGZsYWdzU3RyOworICAgICAgICBBTE9HRF9JRighaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9PUklHSU5BTEZMQUdTLCAmZmxhZ3NTdHIpLAorICAgICAgICAgICAgICAgICIlczogJXMgbWlzc2luZyAlcyBmaWVsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19UUkFDSywgQU1FRElBTUVUUklDU19QUk9QX09SSUdJTkFMRkxBR1MpOworICAgICAgICBjb25zdCBhdXRvIGZsYWdzID0gdHlwZXM6Omxvb2t1cDx0eXBlczo6T1VUUFVUX0ZMQUcsIGludDMyX3Q+KGZsYWdzU3RyKTsKKworICAgICAgICAvLyBBTUVESUFNRVRSSUNTX1BST1BfU0VTU0lPTklEIG9taXR0ZWQgZnJvbSBhdG9tCisKKyAgICAgICAgc3RkOjpzdHJpbmcgY29udGVudFR5cGVTdHI7CisgICAgICAgIEFMT0dEX0lGKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX0NPTlRFTlRUWVBFLCAmY29udGVudFR5cGVTdHIpLAorICAgICAgICAgICAgICAgICIlczogJXMgbWlzc2luZyAlcyBmaWVsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19UUkFDSywgQU1FRElBTUVUUklDU19QUk9QX0NPTlRFTlRUWVBFKTsKKyAgICAgICAgY29uc3QgYXV0byBjb250ZW50VHlwZSA9IHR5cGVzOjpsb29rdXA8dHlwZXM6OkNPTlRFTlRfVFlQRSwgaW50MzJfdD4oY29udGVudFR5cGVTdHIpOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHVzYWdlU3RyOworICAgICAgICBBTE9HRF9JRighaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9VU0FHRSwgJnVzYWdlU3RyKSwKKyAgICAgICAgICAgICAgICAiJXM6ICVzIG1pc3NpbmcgJXMgZmllbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fVFJBQ0ssIEFNRURJQU1FVFJJQ1NfUFJPUF9VU0FHRSk7CisgICAgICAgIGNvbnN0IGF1dG8gdXNhZ2UgPSB0eXBlczo6bG9va3VwPHR5cGVzOjpVU0FHRSwgaW50MzJfdD4odXNhZ2VTdHIpOworCisgICAgICAgIC8vIEFNRURJQU1FVFJJQ1NfUFJPUF9TRUxFQ1RFRERFVklDRUlEIG9taXR0ZWQgZnJvbSBhdG9tCisKKyAgICAgICAgc3RkOjpzdHJpbmcgZW5jb2RpbmdTdHI7CisgICAgICAgIEFMT0dEX0lGKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX0VOQ09ESU5HLCAmZW5jb2RpbmdTdHIpLAorICAgICAgICAgICAgICAgICIlczogJXMgbWlzc2luZyAlcyBmaWVsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19UUkFDSywgQU1FRElBTUVUUklDU19QUk9QX0VOQ09ESU5HKTsKKyAgICAgICAgY29uc3QgYXV0byBlbmNvZGluZyA9IHR5cGVzOjpsb29rdXA8dHlwZXM6OkVOQ09ESU5HLCBpbnQzMl90PihlbmNvZGluZ1N0cik7CisKKyAgICAgICAgaW50MzJfdCBjaGFubmVsTWFzayA9IDA7CisgICAgICAgIEFMT0dEX0lGKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX0NIQU5ORUxNQVNLLCAmY2hhbm5lbE1hc2spLAorICAgICAgICAgICAgICAgICIlczogJXMgbWlzc2luZyAlcyBmaWVsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19UUkFDSywgQU1FRElBTUVUUklDU19QUk9QX0NIQU5ORUxNQVNLKTsKKyAgICAgICAgaW50MzJfdCBmcmFtZUNvdW50ID0gMDsKKyAgICAgICAgQUxPR0RfSUYoIWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfRlJBTUVDT1VOVCwgJmZyYW1lQ291bnQpLAorICAgICAgICAgICAgICAgICIlczogJXMgbWlzc2luZyAlcyBmaWVsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19UUkFDSywgQU1FRElBTUVUUklDU19QUk9QX0ZSQU1FQ09VTlQpOworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAwOworICAgICAgICBBTE9HRF9JRighaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TQU1QTEVSQVRFLCAmc2FtcGxlUmF0ZSksCisgICAgICAgICAgICAgICAgIiVzOiAlcyBtaXNzaW5nICVzIGZpZWxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1RSQUNLLCBBTUVESUFNRVRSSUNTX1BST1BfU0FNUExFUkFURSk7CisgICAgICAgIGRvdWJsZSBzcGVlZCA9IDAuZjsgIC8vIGRlZmF1bHQgaXMgMS5mCisgICAgICAgIEFMT0dEX0lGKCFpdGVtLT5nZXQoQU1FRElBTUVUUklDU19QUk9QX1BMQVlCQUNLX1NQRUVELCAmc3BlZWQpLAorICAgICAgICAgICAgICAgICIlczogJXMgbWlzc2luZyAlcyBmaWVsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sCisgICAgICAgICAgICAgICAgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1RSQUNLLCBBTUVESUFNRVRSSUNTX1BST1BfUExBWUJBQ0tfU1BFRUQpOworICAgICAgICBkb3VibGUgcGl0Y2ggPSAwLmY7ICAvLyBkZWZhdWx0IGlzIDEuZgorICAgICAgICBBTE9HRF9JRighaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9QTEFZQkFDS19QSVRDSCwgJnBpdGNoKSwKKyAgICAgICAgICAgICAgICAiJXM6ICVzIG1pc3NpbmcgJXMgZmllbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19UUkFDSywgQU1FRElBTUVUUklDU19QUk9QX1BMQVlCQUNLX1BJVENIKTsKKyAgICAgICAgY29uc3QgYXV0byBbIHJlc3VsdCwgc3RyIF0gPSBzZW5kVG9TdGF0c2QoQXVkaW9UcmFja1N0YXR1c0ZpZWxkcywKKyAgICAgICAgICAgICAgICBDT05ESVRJT04oYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPVFJBQ0tTVEFUVVNfUkVQT1JURUQpCisgICAgICAgICAgICAgICAgLCBhdG9tX3N0YXR1cworICAgICAgICAgICAgICAgICwgbWVzc2FnZS5jX3N0cigpCisgICAgICAgICAgICAgICAgLCBzdWJDb2RlCisgICAgICAgICAgICAgICAgLCB1aWQKKyAgICAgICAgICAgICAgICAsIGV2ZW50CisgICAgICAgICAgICAgICAgLCBmbGFncworICAgICAgICAgICAgICAgICwgY29udGVudFR5cGUKKyAgICAgICAgICAgICAgICAsIHVzYWdlCisgICAgICAgICAgICAgICAgLCBlbmNvZGluZworICAgICAgICAgICAgICAgICwgKGludDY0X3QpY2hhbm5lbE1hc2sKKyAgICAgICAgICAgICAgICAsIGZyYW1lQ291bnQKKyAgICAgICAgICAgICAgICAsIHNhbXBsZVJhdGUKKyAgICAgICAgICAgICAgICAsIChmbG9hdClzcGVlZAorICAgICAgICAgICAgICAgICwgKGZsb2F0KXBpdGNoCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgQUxPR1YoIiVzOiBzdGF0c2QgJXMiLCBfX2Z1bmNfXywgc3RyLmNfc3RyKCkpOworICAgICAgICBtU3RhdHNkTG9nLT5sb2coYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPVFJBQ0tTVEFUVVNfUkVQT1JURUQsIHN0cik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIC8vIEhFTFBFUiBNRVRIT0RTCiAKIHN0ZDo6c3RyaW5nIEF1ZGlvQW5hbHl0aWNzOjpnZXRUaHJlYWRGcm9tVHJhY2soY29uc3Qgc3RkOjpzdHJpbmcmIHRyYWNrKSBjb25zdApAQCAtNTYzLDcgKzg0NCw3IEBACiAgICAgICAgIGNvbnN0IGF1dG8gZmxhZ3NGb3JTdGF0cyA9IHR5cGVzOjpsb29rdXA8dHlwZXM6OklOUFVUX0ZMQUcsIHNob3J0X2VudW1fdHlwZV90PihmbGFncyk7CiAgICAgICAgIGNvbnN0IGF1dG8gc291cmNlRm9yU3RhdHMgPSB0eXBlczo6bG9va3VwPHR5cGVzOjpTT1VSQ0VfVFlQRSwgc2hvcnRfZW51bV90eXBlX3Q+KHNvdXJjZSk7CiAgICAgICAgIC8vIEFuZHJvaWQgUwotICAgICAgICBjb25zdCBhdXRvIGxvZ1Nlc3Npb25JZEZvclN0YXRzID0gc3RyaW5ndXRpbHM6OnNhbml0aXplTG9nU2Vzc2lvbklkKGxvZ1Nlc3Npb25JZCk7CisgICAgICAgIGNvbnN0IGF1dG8gbG9nU2Vzc2lvbklkRm9yU3RhdHMgPSBWYWxpZGF0ZUlkOjpnZXQoKS0+dmFsaWRhdGVJZChsb2dTZXNzaW9uSWQpOwogCiAgICAgICAgIExPRyhMT0dfTEVWRUwpIDw8ICJrZXk6IiA8PCBrZXkKICAgICAgICAgICAgICAgPDwgIiBpZDoiIDw8IGlkCkBAIC03MTgsNyArOTk5LDcgQEAKICAgICAgICAgICAgICAgICAgdHlwZXM6Omxvb2t1cDx0eXBlczo6VFJBQ0tfVFJBSVRTLCBzaG9ydF9lbnVtX3R5cGVfdD4odHJhaXRzKTsKICAgICAgICAgY29uc3QgYXV0byB1c2FnZUZvclN0YXRzID0gdHlwZXM6Omxvb2t1cDx0eXBlczo6VVNBR0UsIHNob3J0X2VudW1fdHlwZV90Pih1c2FnZSk7CiAgICAgICAgIC8vIEFuZHJvaWQgUwotICAgICAgICBjb25zdCBhdXRvIGxvZ1Nlc3Npb25JZEZvclN0YXRzID0gc3RyaW5ndXRpbHM6OnNhbml0aXplTG9nU2Vzc2lvbklkKGxvZ1Nlc3Npb25JZCk7CisgICAgICAgIGNvbnN0IGF1dG8gbG9nU2Vzc2lvbklkRm9yU3RhdHMgPSBWYWxpZGF0ZUlkOjpnZXQoKS0+dmFsaWRhdGVJZChsb2dTZXNzaW9uSWQpOwogCiAgICAgICAgIExPRyhMT0dfTEVWRUwpIDw8ICJrZXk6IiA8PCBrZXkKICAgICAgICAgICAgICAgPDwgIiBpZDoiIDw8IGlkCkBAIC05NjcsMTAgKzEyNDgsMTAgQEAKICAgICAgICAgaWYgKGNoYW5uZWxNYXNrICE9IDApIHsKICAgICAgICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAxOiAvLyBPdXRwdXQsIGtlZXAgc3luYyB3aXRoIEF1ZGlvVHlwZXMjZ2V0QUF1ZGlvRGlyZWN0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gKGludDMyX3QpYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAyOiAvLyBJbnB1dCwga2VlcCBzeW5jIHdpdGggQXVkaW9UeXBlcyNnZXRBQXVkaW9EaXJlY3Rpb24oKQotICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IChpbnQzMl90KWF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkludmFsaWQgZGlyZWN0aW9uICVkIiwgZGlyZWN0aW9uKTsKQEAgLTExMTEsNCArMTM5MiwxMzggQEAKICAgICB9CiB9CiAKKy8vIENyZWF0ZSBuZXcgc3RhdGUsIHR5cGljYWxseSBvY2N1cnMgYWZ0ZXIgYW4gQXVkaW9GbGluZ2VyIGN0b3IgZXZlbnQuCit2b2lkIEF1ZGlvQW5hbHl0aWNzOjpuZXdTdGF0ZSgpCit7CisgICAgbVByZXZpb3VzQW5hbHl0aWNzU3RhdGUuc2V0KHN0ZDo6bWFrZV9zaGFyZWQ8QW5hbHl0aWNzU3RhdGU+KAorICAgICAgICAgICAgKm1BbmFseXRpY3NTdGF0ZS5nZXQoKSkpOworICAgIC8vIE5vdGU6IGdldCByZXR1cm5zIHNoYXJlZF9wdHIgdGVtcCwgd2hvc2UgbGlmZXRpbWUgaXMgZXh0ZW5kZWQKKyAgICAvLyB0byBlbmQgb2YgZnVsbCBleHByZXNzaW9uLgorICAgIG1BbmFseXRpY3NTdGF0ZS0+Y2xlYXIoKTsgIC8vIFRPRE86IGZpbHRlciB0aGUgYW5hbHl0aWNzIHN0YXRlLgorICAgIC8vIFBlcmhhcHMgcmVwb3J0IHRoaXMuCisKKyAgICAvLyBTZXQgdXAgYSB0aW1lciB0byBleHBpcmUgdGhlIHByZXZpb3VzIGF1ZGlvIHN0YXRlIHRvIHNhdmUgc3BhY2UuCisgICAgLy8gVXNlIHRoZSB0cmFuc2FjdGlvbiBsb2cgc2l6ZSBhcyBhIGNvb2tpZSB0byBzZWUgaWYgaXQgaXMgdGhlCisgICAgLy8gc2FtZSBhcyBiZWZvcmUuICBBIGJlbmlnbiByYWNlIGlzIHBvc3NpYmxlIHdoZXJlIGEgc3RhdGUgaXMgY2xlYXJlZCBlYXJseS4KKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IG1QcmV2aW91c0FuYWx5dGljc1N0YXRlLT50cmFuc2FjdGlvbkxvZygpLnNpemUoKTsKKyAgICBtVGltZWRBY3Rpb24ucG9zdEluKAorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnNlY29uZHMoUFJFVklPVVNfU1RBVEVfRVhQSVJFX1NFQyksIFt0aGlzLCBzaXplXSgpeworICAgICAgICBpZiAobVByZXZpb3VzQW5hbHl0aWNzU3RhdGUtPnRyYW5zYWN0aW9uTG9nKCkuc2l6ZSgpID09IHNpemUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJleHBpcmluZyBwcmV2aW91cyBhdWRpbyBzdGF0ZSBhZnRlciAlZCBzZWNvbmRzLiIsCisgICAgICAgICAgICAgICAgICAgIFBSRVZJT1VTX1NUQVRFX0VYUElSRV9TRUMpOworICAgICAgICAgICAgbVByZXZpb3VzQW5hbHl0aWNzU3RhdGUtPmNsZWFyKCk7ICAvLyByZW1vdmVzIGRhdGEgZnJvbSB0aGUgc3RhdGUuCisgICAgICAgIH0KKyAgICB9KTsKK30KKwordm9pZCBBdWRpb0FuYWx5dGljczo6SGVhbHRoOjpvbkF1ZGlvU2VydmVyU3RhcnQoTW9kdWxlIG1vZHVsZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6SXRlbT4gJml0ZW0pCit7CisgICAgY29uc3QgYXV0byBub3dUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CisgICAgaWYgKG1vZHVsZSA9PSBNb2R1bGU6OkFVRElPRkxJTkdFUikgeworICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgICAgICAgICAvLyByZXNldCBzdGF0ZSBvbiBBdWRpb0ZsaW5nZXIgY29uc3RydWN0aW9uLgorICAgICAgICAgICAgLy8gQXVkaW9Qb2xpY3kgaXMgY3JlYXRlZCBhZnRlciBBdWRpb0ZsaW5nZXIuCisgICAgICAgICAgICBtQXVkaW9GbGluZ2VyQ3RvclRpbWUgPSBub3dUaW1lOworICAgICAgICAgICAgbVNpbXBsZUxvZy5sb2coIkF1ZGlvRmxpbmdlciBjdG9yIik7CisgICAgICAgIH0KKyAgICAgICAgbUF1ZGlvQW5hbHl0aWNzLm5ld1N0YXRlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1vZHVsZSA9PSBNb2R1bGU6OkFVRElPUE9MSUNZKSB7CisgICAgICAgIC8vIEEgc3RhcnQgZXZlbnQgb2NjdXJzIHdoZW4gYXVkaW9zZXJ2ZXIKKyAgICAgICAgLy8KKyAgICAgICAgLy8gKDEpIFN0YXJ0cyB0aGUgZmlyc3QgdGltZQorICAgICAgICAvLyAoMikgUmVzdGFydHMgYmVjYXVzZSBvZiB0aGUgVGltZUNoZWNrIHdhdGNoZG9nCisgICAgICAgIC8vICgzKSBSZXN0YXJ0cyBub3QgYmVjYXVzZSBvZiB0aGUgVGltZUNoZWNrIHdhdGNoZG9nLgorICAgICAgICBpbnQ2NF90IGV4ZWN1dGlvblRpbWVOcyA9IDA7CisgICAgICAgICh2b2lkKWl0ZW0tPmdldChBTUVESUFNRVRSSUNTX1BST1BfRVhFQ1VUSU9OVElNRU5TLCAmZXhlY3V0aW9uVGltZU5zKTsKKyAgICAgICAgY29uc3QgZmxvYXQgbG9hZFRpbWVNcyA9IGV4ZWN1dGlvblRpbWVOcyAqIDFlLTZmOworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobUxvY2spOworICAgICAgICBjb25zdCBpbnQ2NF90IHJlc3RhcnRzID0gbVN0YXJ0Q291bnQ7CisgICAgICAgIGlmIChtU3RvcENvdW50ID09IG1TdGFydENvdW50KSB7CisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lDdG9yVGltZSA9IG5vd1RpbWU7CisgICAgICAgICAgICArK21TdGFydENvdW50OworICAgICAgICAgICAgaWYgKG1TdG9wQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vICgxKSBGaXJzdCB0aW1lIGluaXRpYWxpemF0aW9uLgorICAgICAgICAgICAgICAgIEFMT0dXKCIlczogKGtleT0lcykgQXVkaW9Qb2xpY3kgY3RvciwgbG9hZFRpbWVNczolZiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaXRlbS0+Z2V0S2V5KCkuY19zdHIoKSwgbG9hZFRpbWVNcyk7CisgICAgICAgICAgICAgICAgbVNpbXBsZUxvZy5sb2coIkF1ZGlvUG9saWN5IGN0b3IsIGxvYWRUaW1lTXM6JWYiLCBsb2FkVGltZU1zKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gKDIpIFByZXZpb3VzIGZhaWx1cmUgY2F1Z2h0IGR1ZSB0byBUaW1lQ2hlY2suICBXZSBrbm93IGhvdyBsb25nIHJlc3RhcnQgdGFrZXMuCisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgcmVzdGFydE1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxmbG9hdCwgc3RkOjptaWxsaT4+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyQ3RvclRpbWUgLSBtU3RvcFRpbWUpLmNvdW50KCk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiAoa2V5PSVzKSBBdWRpb1BvbGljeSBjdG9yLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAicmVzdGFydHM6JWxsZCByZXN0YXJ0TXM6JWYgbG9hZFRpbWVNczolZiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaXRlbS0+Z2V0S2V5KCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpcmVzdGFydHMsIHJlc3RhcnRNcywgbG9hZFRpbWVNcyk7CisgICAgICAgICAgICAgICAgbVNpbXBsZUxvZy5sb2coIkF1ZGlvUG9saWN5IGN0b3IgcmVzdGFydHM6JWxsZCByZXN0YXJ0TXM6JWYgbG9hZFRpbWVNczolZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXJlc3RhcnRzLCByZXN0YXJ0TXMsIGxvYWRUaW1lTXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gKDMpIFByZXZpb3VzIGZhaWx1cmUgaXMgTk9UIGR1ZSB0byBUaW1lQ2hlY2ssIHNvIHdlIGRvbid0IGtub3cgdGhlIHJlc3RhcnQgdGltZS4KKyAgICAgICAgICAgIC8vIEhvd2V2ZXIgd2UgY2FuIGVzdGltYXRlIHRoZSB1cHRpbWUgZnJvbSB0aGUgZGVsdGEgdGltZSBmcm9tIHByZXZpb3VzIGN0b3IuCisgICAgICAgICAgICBjb25zdCBmbG9hdCB1cHRpbWVNcyA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxmbG9hdCwgc3RkOjptaWxsaT4+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vd1RpbWUgLSBtQXVkaW9GbGluZ2VyQ3RvclRpbWUpLmNvdW50KCk7CisgICAgICAgICAgICBtU3RvcENvdW50ID0gbVN0YXJ0Q291bnQ7CisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lDdG9yVGltZSA9IG5vd1RpbWU7CisgICAgICAgICAgICArK21TdGFydENvdW50OworCisgICAgICAgICAgICBBTE9HVygiJXM6IChrZXk9JXMpIEF1ZGlvUG9saWN5IGN0b3IgYWZ0ZXIgdW5jYXVnaHQgZmFpbHVyZSwgIgorICAgICAgICAgICAgICAgICAgICAibVN0YXJ0Q291bnQ6JWxsZCBtU3RvcENvdW50OiVsbGQgdXB0aW1lTXM6JWYgbG9hZFRpbWVNczolZiIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBpdGVtLT5nZXRLZXkoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1TdGFydENvdW50LCAobG9uZyBsb25nKW1TdG9wQ291bnQsIHVwdGltZU1zLCBsb2FkVGltZU1zKTsKKyAgICAgICAgICAgIG1TaW1wbGVMb2cubG9nKCJBdWRpb1BvbGljeSBjdG9yIGFmdGVyIHVuY2F1Z2h0IGZhaWx1cmUsICIKKyAgICAgICAgICAgICAgICAgICAgInJlc3RhcnRzOiVsbGQgdXB0aW1lTXM6JWYgbG9hZFRpbWVNczolZiIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpcmVzdGFydHMsIHVwdGltZU1zLCBsb2FkVGltZU1zKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0FuYWx5dGljczo6SGVhbHRoOjpvbkF1ZGlvU2VydmVyVGltZW91dChNb2R1bGUgbW9kdWxlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpJdGVtPiAmaXRlbSkKK3sKKyAgICBzdGQ6OnN0cmluZyBtb2R1bGVOYW1lID0gZ2V0TW9kdWxlTmFtZShtb2R1bGUpOworICAgIGludDY0X3QgbWV0aG9kQ29kZXt9OworICAgIHN0ZDo6c3RyaW5nIG1ldGhvZE5hbWU7CisgICAgKHZvaWQpaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9NRVRIT0RDT0RFLCAmbWV0aG9kQ29kZSk7CisgICAgKHZvaWQpaXRlbS0+Z2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9NRVRIT0ROQU1FLCAmbWV0aG9kTmFtZSk7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQgbGcobUxvY2spOworICAgIGlmIChtU3RvcENvdW50ID49IG1TdGFydENvdW50KSB7CisgICAgICAgIEFMT0dEKCIlczogKGtleT0lcykgJXMgdGltZW91dCAlcyglbGxkKSAiCisgICAgICAgICAgICAidW5tYXRjaGVkIG1TdG9wQ291bnQoJWxsZCkgPj0gbVN0YXJ0Q291bnQoJWxsZCksIGlnbm9yaW5nIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBpdGVtLT5nZXRLZXkoKS5jX3N0cigpLCBtb2R1bGVOYW1lLmNfc3RyKCksCisgICAgICAgICAgICBtZXRob2ROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpbWV0aG9kQ29kZSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpbVN0b3BDb3VudCwgKGxvbmcgbG9uZyltU3RhcnRDb3VudCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBpbnQ2NF90IHJlc3RhcnRzID0gbVN0YXJ0Q291bnQgLSAxOworICAgICsrbVN0b3BDb3VudDsKKyAgICBtU3RvcFRpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKKyAgICBjb25zdCBmbG9hdCB1cHRpbWVNcyA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxmbG9hdCwgc3RkOjptaWxsaT4+KAorICAgICAgICAgICAgbVN0b3BUaW1lIC0gbUF1ZGlvRmxpbmdlckN0b3JUaW1lKS5jb3VudCgpOworICAgIEFMT0dXKCIlczogKGtleT0lcykgJXMgdGltZW91dCAlcyglbGxkKSByZXN0YXJ0czolbGxkIHVwdGltZU1zOiVmIiwKKyAgICAgICAgIF9fZnVuY19fLCBpdGVtLT5nZXRLZXkoKS5jX3N0cigpLCBtb2R1bGVOYW1lLmNfc3RyKCksCisgICAgICAgICBtZXRob2ROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpbWV0aG9kQ29kZSwKKyAgICAgICAgIChsb25nIGxvbmcpcmVzdGFydHMsIHVwdGltZU1zKTsKKyAgICBtU2ltcGxlTG9nLmxvZygiJXMgdGltZW91dCAlcyglbGxkKSByZXN0YXJ0czolbGxkIHVwdGltZU1zOiVmIiwKKyAgICAgICAgICAgIG1vZHVsZU5hbWUuY19zdHIoKSwgbWV0aG9kTmFtZS5jX3N0cigpLCAobG9uZyBsb25nKW1ldGhvZENvZGUsCisgICAgICAgICAgICAobG9uZyBsb25nKXJlc3RhcnRzLCB1cHRpbWVNcyk7Cit9CisKK3N0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50MzJfdD4gQXVkaW9BbmFseXRpY3M6OkhlYWx0aDo6ZHVtcCgKKyAgICAgICAgaW50MzJfdCBsaW5lcywgY29uc3QgY2hhciAqcHJlZml4KSBjb25zdAoreworICAgIHN0ZDo6bG9ja19ndWFyZCBsZyhtTG9jayk7CisgICAgc3RkOjpzdHJpbmcgcyA9IG1TaW1wbGVMb2cuZHVtcFRvU3RyaW5nKHByZWZpeCA9PSBudWxscHRyID8gIiIgOiBwcmVmaXgsIGxpbmVzKTsKKyAgICBzaXplX3QgbiA9IHN0ZDo6Y291bnQocy5iZWdpbigpLCBzLmVuZCgpLCAnXG4nKTsKKyAgICByZXR1cm4geyBzLCBuIH07Cit9CisKKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWFtZXRyaWNzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1Bvd2VyVXNhZ2UuY3BwCmluZGV4IGFiNzRjOGUuLjU3ODdlOWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1Bvd2VyVXNhZ2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1Bvd2VyVXNhZ2UuY3BwCkBAIC00NSw2ICs0NSwxMCBAQAogI2RlZmluZSBBVURJT19QT1dFUl9VU0FHRV9QUk9QX0RVUkFUSU9OX05TICAgICJkdXJhdGlvbk5zIiAvLyBpbnQ2NAogI2RlZmluZSBBVURJT19QT1dFUl9VU0FHRV9QUk9QX1RZUEUgICAgICAgICAgICJ0eXBlIiAgICAgICAvLyBpbnQzMgogI2RlZmluZSBBVURJT19QT1dFUl9VU0FHRV9QUk9QX1ZPTFVNRSAgICAgICAgICJ2b2x1bWUiICAgICAvLyBkb3VibGUKKyNkZWZpbmUgQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NSU5fVk9MVU1FX0RVUkFUSU9OX05TICJtaW5Wb2x1bWVEdXJhdGlvbk5zIiAvLyBpbnQ2NAorI2RlZmluZSBBVURJT19QT1dFUl9VU0FHRV9QUk9QX01JTl9WT0xVTUUgICAgICAgICAgICAgIm1pblZvbHVtZSIgICAgICAgICAgIC8vIGRvdWJsZQorI2RlZmluZSBBVURJT19QT1dFUl9VU0FHRV9QUk9QX01BWF9WT0xVTUVfRFVSQVRJT05fTlMgIm1heFZvbHVtZUR1cmF0aW9uTnMiIC8vIGludDY0CisjZGVmaW5lIEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUFYX1ZPTFVNRSAgICAgICAgICAgICAibWF4Vm9sdW1lIiAgICAgICAgICAgLy8gZG91YmxlCiAKIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYW1ldHJpY3MgewogCkBAIC0xNDEsMTMgKzE0NSwzNCBAQAogICAgIGRvdWJsZSB2b2x1bWU7CiAgICAgaWYgKCFpdGVtLT5nZXREb3VibGUoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9WT0xVTUUsICZ2b2x1bWUpKSByZXR1cm47CiAKKyAgICBpbnQ2NF90IG1pbl92b2x1bWVfZHVyYXRpb25fbnM7CisgICAgaWYgKCFpdGVtLT5nZXRJbnQ2NChBVURJT19QT1dFUl9VU0FHRV9QUk9QX01JTl9WT0xVTUVfRFVSQVRJT05fTlMsICZtaW5fdm9sdW1lX2R1cmF0aW9uX25zKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZG91YmxlIG1pbl92b2x1bWU7CisgICAgaWYgKCFpdGVtLT5nZXREb3VibGUoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NSU5fVk9MVU1FLCAmbWluX3ZvbHVtZSkpIHJldHVybjsKKworICAgIGludDY0X3QgbWF4X3ZvbHVtZV9kdXJhdGlvbl9uczsKKyAgICBpZiAoIWl0ZW0tPmdldEludDY0KEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUFYX1ZPTFVNRV9EVVJBVElPTl9OUywgJm1heF92b2x1bWVfZHVyYXRpb25fbnMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkb3VibGUgbWF4X3ZvbHVtZTsKKyAgICBpZiAoIWl0ZW0tPmdldERvdWJsZShBVURJT19QT1dFUl9VU0FHRV9QUk9QX01BWF9WT0xVTUUsICZtYXhfdm9sdW1lKSkgcmV0dXJuOworCiAgICAgY29uc3QgaW50MzJfdCBkdXJhdGlvbl9zZWNzID0gKGludDMyX3QpKGR1cmF0aW9uX25zIC8gTkFOT1NfUEVSX1NFQ09ORCk7Ci0gICAgY29uc3QgZmxvYXQgYXZlcmFnZV92b2x1bWUgPSAoZmxvYXQpdm9sdW1lOworICAgIGNvbnN0IGludDMyX3QgbWluX3ZvbHVtZV9kdXJhdGlvbl9zZWNzID0gKGludDMyX3QpKG1pbl92b2x1bWVfZHVyYXRpb25fbnMgLyBOQU5PU19QRVJfU0VDT05EKTsKKyAgICBjb25zdCBpbnQzMl90IG1heF92b2x1bWVfZHVyYXRpb25fc2VjcyA9IChpbnQzMl90KShtYXhfdm9sdW1lX2R1cmF0aW9uX25zIC8gTkFOT1NfUEVSX1NFQ09ORCk7CiAgICAgY29uc3QgaW50IHJlc3VsdCA9IGFuZHJvaWQ6OnV0aWw6OnN0YXRzX3dyaXRlKGFuZHJvaWQ6OnV0aWw6OkFVRElPX1BPV0VSX1VTQUdFX0RBVEFfUkVQT1JURUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25fc2VjcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZV92b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fdm9sdW1lX2R1cmF0aW9uX3NlY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCltaW5fdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdm9sdW1lX2R1cmF0aW9uX3NlY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCltYXhfdm9sdW1lKTsKIAogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGxvZzsKICAgICBsb2cgPDwgInJlc3VsdDoiIDw8IHJlc3VsdCA8PCAiIHsiCkBAIC0xNTUsMTcgKzE4MCw0MyBAQAogICAgICAgICAgICAgPDwgYW5kcm9pZDo6dXRpbDo6QVVESU9fUE9XRVJfVVNBR0VfREFUQV9SRVBPUlRFRAogICAgICAgICAgICAgPDwgIiBhdWRpb19kZXZpY2U6IiA8PCBhdWRpb19kZXZpY2UKICAgICAgICAgICAgIDw8ICIgZHVyYXRpb25fc2VjczoiIDw8IGR1cmF0aW9uX3NlY3MKLSAgICAgICAgICAgIDw8ICIgYXZlcmFnZV92b2x1bWU6IiA8PCBhdmVyYWdlX3ZvbHVtZQorICAgICAgICAgICAgPDwgIiBhdmVyYWdlX3ZvbHVtZToiIDw8IChmbG9hdCl2b2x1bWUKICAgICAgICAgICAgIDw8ICIgdHlwZToiIDw8IHR5cGUKKyAgICAgICAgICAgIDw8ICIgbWluX3ZvbHVtZV9kdXJhdGlvbl9zZWNzOiIgPDwgbWluX3ZvbHVtZV9kdXJhdGlvbl9zZWNzCisgICAgICAgICAgICA8PCAiIG1pbl92b2x1bWU6IiA8PCAoZmxvYXQpbWluX3ZvbHVtZQorICAgICAgICAgICAgPDwgIiBtYXhfdm9sdW1lX2R1cmF0aW9uX3NlY3M6IiA8PCBtYXhfdm9sdW1lX2R1cmF0aW9uX3NlY3MKKyAgICAgICAgICAgIDw8ICIgbWF4X3ZvbHVtZToiIDw8IChmbG9hdCltYXhfdm9sdW1lCiAgICAgICAgICAgICA8PCAiIH0iOwogICAgIG1TdGF0c2RMb2ctPmxvZyhhbmRyb2lkOjp1dGlsOjpBVURJT19QT1dFUl9VU0FHRV9EQVRBX1JFUE9SVEVELCBsb2cuc3RyKCkpOwogfQogCit2b2lkIEF1ZGlvUG93ZXJVc2FnZTo6dXBkYXRlTWluTWF4Vm9sdW1lQW5kRHVyYXRpb24oCisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cl9tYXhfdm9sdW1lX2R1cmF0aW9uX25zLCBjb25zdCBkb3VibGUgY3VyX21heF92b2x1bWUsCisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cl9taW5fdm9sdW1lX2R1cmF0aW9uX25zLCBjb25zdCBkb3VibGUgY3VyX21pbl92b2x1bWUsCisgICAgICAgICAgICBpbnQ2NF90JiBmX21heF92b2x1bWVfZHVyYXRpb25fbnMsIGRvdWJsZSYgZl9tYXhfdm9sdW1lLAorICAgICAgICAgICAgaW50NjRfdCYgZl9taW5fdm9sdW1lX2R1cmF0aW9uX25zLCBkb3VibGUmIGZfbWluX3ZvbHVtZSkKK3sKKyAgICBpZiAoZl9taW5fdm9sdW1lID4gY3VyX21pbl92b2x1bWUpIHsKKyAgICAgICAgZl9taW5fdm9sdW1lID0gY3VyX21pbl92b2x1bWU7CisgICAgICAgIGZfbWluX3ZvbHVtZV9kdXJhdGlvbl9ucyA9IGN1cl9taW5fdm9sdW1lX2R1cmF0aW9uX25zOworICAgIH0gZWxzZSBpZiAoZl9taW5fdm9sdW1lID09IGN1cl9taW5fdm9sdW1lKSB7CisgICAgICAgIGZfbWluX3ZvbHVtZV9kdXJhdGlvbl9ucyArPSBjdXJfbWluX3ZvbHVtZV9kdXJhdGlvbl9uczsKKyAgICB9CisgICAgaWYgKGZfbWF4X3ZvbHVtZSA8IGN1cl9tYXhfdm9sdW1lKSB7CisgICAgICAgIGZfbWF4X3ZvbHVtZSA9IGN1cl9tYXhfdm9sdW1lOworICAgICAgICBmX21heF92b2x1bWVfZHVyYXRpb25fbnMgPSBjdXJfbWF4X3ZvbHVtZV9kdXJhdGlvbl9uczsKKyAgICB9IGVsc2UgaWYgKGZfbWF4X3ZvbHVtZSA9PSBjdXJfbWF4X3ZvbHVtZSkgeworICAgICAgICBmX21heF92b2x1bWVfZHVyYXRpb25fbnMgKz0gY3VyX21heF92b2x1bWVfZHVyYXRpb25fbnM7CisgICAgfQorfQorCiBib29sIEF1ZGlvUG93ZXJVc2FnZTo6c2F2ZUFzSXRlbV9sKAotICAgICAgICBpbnQzMl90IGRldmljZSwgaW50NjRfdCBkdXJhdGlvbl9ucywgaW50MzJfdCB0eXBlLCBkb3VibGUgYXZlcmFnZV92b2wpCisgICAgICAgIGludDMyX3QgZGV2aWNlLCBpbnQ2NF90IGR1cmF0aW9uX25zLCBpbnQzMl90IHR5cGUsIGRvdWJsZSBhdmVyYWdlX3ZvbCwKKyAgICAgICAgaW50NjRfdCBtYXhfdm9sdW1lX2R1cmF0aW9uX25zLCBkb3VibGUgbWF4X3ZvbHVtZSwKKyAgICAgICAgaW50NjRfdCBtaW5fdm9sdW1lX2R1cmF0aW9uX25zLCBkb3VibGUgbWluX3ZvbHVtZSkKIHsKICAgICBBTE9HVigiJXM6ICglI3gsICVkLCAlbGxkLCAlZikiLCBfX2Z1bmNfXywgZGV2aWNlLCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWR1cmF0aW9uX25zLCBhdmVyYWdlX3ZvbCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWR1cmF0aW9uX25zLCBhdmVyYWdlX3ZvbCk7CiAgICAgaWYgKGR1cmF0aW9uX25zID09IDApIHsKICAgICAgICAgcmV0dXJuIHRydWU7IC8vIHNraXAgZHVyYXRpb24gMCB1c2FnZQogICAgIH0KQEAgLTE5MywxMCArMjQ0LDM2IEBACiAgICAgICAgICAgICBpdGVtLT5zZXREb3VibGUoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9WT0xVTUUsIGZpbmFsX3ZvbHVtZSk7CiAgICAgICAgICAgICBpdGVtLT5zZXRUaW1lc3RhbXAoc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSkpOwogCi0gICAgICAgICAgICBBTE9HVigiJXM6IHVwZGF0ZSAoJSN4LCAlZCwgJWxsZCwgJWYpIC0tPiAoJWxsZCwgJWYpIiwgX19mdW5jX18sCisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG1heC9taW4gdm9sdW1lIGFuZCBkdXJhdGlvbgorICAgICAgICAgICAgaW50NjRfdCBmaW5hbF9taW5fdm9sdW1lX2R1cmF0aW9uX25zOworICAgICAgICAgICAgaW50NjRfdCBmaW5hbF9tYXhfdm9sdW1lX2R1cmF0aW9uX25zOworICAgICAgICAgICAgZG91YmxlIGZpbmFsX21pbl92b2x1bWU7CisgICAgICAgICAgICBkb3VibGUgZmluYWxfbWF4X3ZvbHVtZTsKKworICAgICAgICAgICAgaXRlbS0+Z2V0SW50NjQoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NSU5fVk9MVU1FX0RVUkFUSU9OX05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbmFsX21pbl92b2x1bWVfZHVyYXRpb25fbnMpOworICAgICAgICAgICAgaXRlbS0+Z2V0RG91YmxlKEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUlOX1ZPTFVNRSwgJmZpbmFsX21pbl92b2x1bWUpOworICAgICAgICAgICAgaXRlbS0+Z2V0SW50NjQoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NQVhfVk9MVU1FX0RVUkFUSU9OX05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbmFsX21heF92b2x1bWVfZHVyYXRpb25fbnMpOworICAgICAgICAgICAgaXRlbS0+Z2V0RG91YmxlKEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUFYX1ZPTFVNRSwgJmZpbmFsX21heF92b2x1bWUpOworICAgICAgICAgICAgdXBkYXRlTWluTWF4Vm9sdW1lQW5kRHVyYXRpb24obWF4X3ZvbHVtZV9kdXJhdGlvbl9ucywgbWF4X3ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl92b2x1bWVfZHVyYXRpb25fbnMsIG1pbl92b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbF9tYXhfdm9sdW1lX2R1cmF0aW9uX25zLCBmaW5hbF9tYXhfdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfbWluX3ZvbHVtZV9kdXJhdGlvbl9ucywgZmluYWxfbWluX3ZvbHVtZSk7CisgICAgICAgICAgICBpdGVtLT5zZXRJbnQ2NChBVURJT19QT1dFUl9VU0FHRV9QUk9QX01JTl9WT0xVTUVfRFVSQVRJT05fTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbF9taW5fdm9sdW1lX2R1cmF0aW9uX25zKTsKKyAgICAgICAgICAgIGl0ZW0tPnNldERvdWJsZShBVURJT19QT1dFUl9VU0FHRV9QUk9QX01JTl9WT0xVTUUsIGZpbmFsX21pbl92b2x1bWUpOworICAgICAgICAgICAgaXRlbS0+c2V0SW50NjQoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NQVhfVk9MVU1FX0RVUkFUSU9OX05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfbWF4X3ZvbHVtZV9kdXJhdGlvbl9ucyk7CisgICAgICAgICAgICBpdGVtLT5zZXREb3VibGUoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NQVhfVk9MVU1FLCBmaW5hbF9tYXhfdm9sdW1lKTsKKworICAgICAgICAgICAgQUxPR1YoIiVzOiB1cGRhdGUgKCUjeCwgJWQsICVsbGQsICVmKSAtLT4gKCVsbGQsICVmKSBtaW4oJWxsZCwgJWYpIG1heCglbGxkLCAlZikiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICBkZXZpY2UsIHR5cGUsCiAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWl0ZW1fZHVyYXRpb25fbnMsIGl0ZW1fdm9sdW1lLAotICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylmaW5hbF9kdXJhdGlvbl9ucywgZmluYWxfdm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZmluYWxfZHVyYXRpb25fbnMsIGZpbmFsX3ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZmluYWxfbWluX3ZvbHVtZV9kdXJhdGlvbl9ucywgZmluYWxfbWluX3ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZmluYWxfbWF4X3ZvbHVtZV9kdXJhdGlvbl9ucywgZmluYWxfbWF4X3ZvbHVtZSk7CiAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC0yMDgsMTIgKzI4NSwxOCBAQAogICAgIHNpdGVtLT5zZXRJbnQ2NChBVURJT19QT1dFUl9VU0FHRV9QUk9QX0RVUkFUSU9OX05TLCBkdXJhdGlvbl9ucyk7CiAgICAgc2l0ZW0tPnNldEludDMyKEFVRElPX1BPV0VSX1VTQUdFX1BST1BfVFlQRSwgdHlwZSk7CiAgICAgc2l0ZW0tPnNldERvdWJsZShBVURJT19QT1dFUl9VU0FHRV9QUk9QX1ZPTFVNRSwgYXZlcmFnZV92b2wpOworICAgIHNpdGVtLT5zZXRJbnQ2NChBVURJT19QT1dFUl9VU0FHRV9QUk9QX01JTl9WT0xVTUVfRFVSQVRJT05fTlMsIG1pbl92b2x1bWVfZHVyYXRpb25fbnMpOworICAgIHNpdGVtLT5zZXREb3VibGUoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NSU5fVk9MVU1FLCBtaW5fdm9sdW1lKTsKKyAgICBzaXRlbS0+c2V0SW50NjQoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9NQVhfVk9MVU1FX0RVUkFUSU9OX05TLCBtYXhfdm9sdW1lX2R1cmF0aW9uX25zKTsKKyAgICBzaXRlbS0+c2V0RG91YmxlKEFVRElPX1BPV0VSX1VTQUdFX1BST1BfTUFYX1ZPTFVNRSwgbWF4X3ZvbHVtZSk7CiAgICAgbUl0ZW1zLmVtcGxhY2VfYmFjayhzaXRlbSk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgQXVkaW9Qb3dlclVzYWdlOjpzYXZlQXNJdGVtc19sKAotICAgICAgICBpbnQzMl90IGRldmljZSwgaW50NjRfdCBkdXJhdGlvbl9ucywgaW50MzJfdCB0eXBlLCBkb3VibGUgYXZlcmFnZV92b2wpCisgICAgICAgIGludDMyX3QgZGV2aWNlLCBpbnQ2NF90IGR1cmF0aW9uX25zLCBpbnQzMl90IHR5cGUsIGRvdWJsZSBhdmVyYWdlX3ZvbCwKKyAgICAgICAgaW50NjRfdCBtYXhfdm9sdW1lX2R1cmF0aW9uLCBkb3VibGUgbWF4X3ZvbHVtZSwKKyAgICAgICAgaW50NjRfdCBtaW5fdm9sdW1lX2R1cmF0aW9uLCBkb3VibGUgbWluX3ZvbHVtZSkKIHsKICAgICBBTE9HVigiJXM6ICglI3gsICVkLCAlbGxkLCAlZikiLCBfX2Z1bmNfXywgZGV2aWNlLCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWR1cmF0aW9uX25zLCBhdmVyYWdlX3ZvbCApOwpAQCAtMjMyLDcgKzMxNSw5IEBACiAgICAgICAgIGludDMyX3QgdG1wX2RldmljZSA9IGRldmljZV9iaXRzICYgLWRldmljZV9iaXRzOyAvLyBnZXQgbG93ZXN0IGJpdAogICAgICAgICBkZXZpY2VfYml0cyBePSB0bXBfZGV2aWNlOyAgLy8gY2xlYXIgbG93ZXN0IGJpdAogICAgICAgICB0bXBfZGV2aWNlIHw9IGlucHV0X2JpdDsgICAgLy8gcmVzdG9yZSBpbnB1dCBiaXQKLSAgICAgICAgcmV0ID0gc2F2ZUFzSXRlbV9sKHRtcF9kZXZpY2UsIGR1cmF0aW9uX25zLCB0eXBlLCBhdmVyYWdlX3ZvbCk7CisgICAgICAgIHJldCA9IHNhdmVBc0l0ZW1fbCh0bXBfZGV2aWNlLCBkdXJhdGlvbl9ucywgdHlwZSwgYXZlcmFnZV92b2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdm9sdW1lX2R1cmF0aW9uLCBtYXhfdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3ZvbHVtZV9kdXJhdGlvbiwgbWluX3ZvbHVtZSk7CiAKICAgICAgICAgQUxPR1YoIiVzOiBkZXZpY2UgJSN4IHJlY29yZGVkLCByZW1haW5pbmcgZGV2aWNlX2JpdHMgPSAlI3giLCBfX2Z1bmNfXywKICAgICAgICAgICAgIHRtcF9kZXZpY2UsIGRldmljZV9iaXRzKTsKQEAgLTI1MCw5ICszMzUsMjggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBkb3VibGUgZGV2aWNlVm9sdW1lID0gMS47Ci0gICAgaWYgKGlzVHJhY2sgJiYgIWl0ZW0tPmdldERvdWJsZShBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFVk9MVU1FLCAmZGV2aWNlVm9sdW1lKSkgewotICAgICAgICByZXR1cm47CisgICAgaW50NjRfdCBtYXhWb2x1bWVEdXJhdGlvbk5zID0gMDsKKyAgICBkb3VibGUgbWF4Vm9sdW1lID0gQU1FRElBTUVUUklDU19JTklUSUFMX01BWF9WT0xVTUU7CisgICAgaW50NjRfdCBtaW5Wb2x1bWVEdXJhdGlvbk5zID0gMDsKKyAgICBkb3VibGUgbWluVm9sdW1lID0gQU1FRElBTUVUUklDU19JTklUSUFMX01JTl9WT0xVTUU7CisgICAgaWYgKGlzVHJhY2spIHsKKyAgICAgICAgaWYgKCFpdGVtLT5nZXREb3VibGUoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRVZPTFVNRSwgJmRldmljZVZvbHVtZSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWl0ZW0tPmdldEludDY0KEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VNQVhWT0xVTUVEVVJBVElPTk5TLCAmbWF4Vm9sdW1lRHVyYXRpb25OcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWl0ZW0tPmdldERvdWJsZShBTUVESUFNRVRSSUNTX1BST1BfREVWSUNFTUFYVk9MVU1FLCAmbWF4Vm9sdW1lKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghaXRlbS0+Z2V0SW50NjQoQU1FRElBTUVUUklDU19QUk9QX0RFVklDRU1JTlZPTFVNRURVUkFUSU9OTlMsICZtaW5Wb2x1bWVEdXJhdGlvbk5zKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghaXRlbS0+Z2V0RG91YmxlKEFNRURJQU1FVFJJQ1NfUFJPUF9ERVZJQ0VNSU5WT0xVTUUsICZtaW5Wb2x1bWUpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICB9CisKICAgICBpbnQzMl90IHR5cGUgPSAwOwogICAgIHN0ZDo6c3RyaW5nIHR5cGVfc3RyaW5nOwogICAgIGlmICgoaXNUcmFjayAmJiBtQXVkaW9BbmFseXRpY3MtPm1BbmFseXRpY3NTdGF0ZS0+dGltZU1hY2hpbmUoKS5nZXQoCkBAIC0yODUsNyArMzg5LDggQEAKICAgICAgICAgQUxPR1YoImRldmljZSA9ICVzID0+ICVkIiwgZGV2aWNlX3N0cmluZ3MuY19zdHIoKSwgZGV2aWNlKTsKICAgICB9CiAgICAgc3RkOjpsb2NrX2d1YXJkIGwobUxvY2spOwotICAgIHNhdmVBc0l0ZW1zX2woZGV2aWNlLCBkZXZpY2VUaW1lTnMsIHR5cGUsIGRldmljZVZvbHVtZSk7CisgICAgc2F2ZUFzSXRlbXNfbChkZXZpY2UsIGRldmljZVRpbWVOcywgdHlwZSwgZGV2aWNlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgbWF4Vm9sdW1lRHVyYXRpb25OcywgbWF4Vm9sdW1lLCBtaW5Wb2x1bWVEdXJhdGlvbk5zLCBtaW5Wb2x1bWUpOwogfQogCiB2b2lkIEF1ZGlvUG93ZXJVc2FnZTo6Y2hlY2tNb2RlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtKQpAQCAtMjk5LDEwICs0MDQsMTcgQEAKICAgICBpZiAobU1vZGUgPT0gIkFVRElPX01PREVfSU5fQ0FMTCIpIHsgLy8gbGVhdmluZyBjYWxsIG1vZGUKICAgICAgICAgY29uc3QgaW50NjRfdCBlbmRDYWxsTnMgPSBpdGVtLT5nZXRUaW1lc3RhbXAoKTsKICAgICAgICAgY29uc3QgaW50NjRfdCBkdXJhdGlvbk5zID0gZW5kQ2FsbE5zIC0gbURldmljZVRpbWVOczsKKyAgICAgICAgY29uc3QgaW50NjRfdCB2b2x1bWVEdXJhdGlvbk5zID0gZW5kQ2FsbE5zIC0gbVZvbHVtZVRpbWVOczsKICAgICAgICAgaWYgKGR1cmF0aW9uTnMgPiAwKSB7CiAgICAgICAgICAgICBtRGV2aWNlVm9sdW1lID0gKG1EZXZpY2VWb2x1bWUgKiBkb3VibGUobVZvbHVtZVRpbWVOcyAtIG1EZXZpY2VUaW1lTnMpICsKLSAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKGVuZENhbGxOcyAtIG1Wb2x1bWVUaW1lTnMpKSAvIChkb3VibGUpZHVyYXRpb25OczsKLSAgICAgICAgICAgIHNhdmVBc0l0ZW1zX2wobVByaW1hcnlEZXZpY2UsIGR1cmF0aW9uTnMsIFZPSUNFX0NBTExfVFlQRSwgbURldmljZVZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Wb2ljZVZvbHVtZSAqIGRvdWJsZSh2b2x1bWVEdXJhdGlvbk5zKSkgLyAoZG91YmxlKWR1cmF0aW9uTnM7CisgICAgICAgICAgICB1cGRhdGVNaW5NYXhWb2x1bWVBbmREdXJhdGlvbih2b2x1bWVEdXJhdGlvbk5zLCBtVm9pY2VWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZUR1cmF0aW9uTnMsIG1Wb2ljZVZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbU1heFZvaWNlVm9sdW1lRHVyYXRpb25OcywgbU1heFZvaWNlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTWluVm9pY2VWb2x1bWVEdXJhdGlvbk5zLCBtTWluVm9pY2VWb2x1bWUpOworICAgICAgICAgICAgc2F2ZUFzSXRlbXNfbChtUHJpbWFyeURldmljZSwgZHVyYXRpb25OcywgVk9JQ0VfQ0FMTF9UWVBFLCBtRGV2aWNlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTWF4Vm9pY2VWb2x1bWVEdXJhdGlvbk5zLCBtTWF4Vm9pY2VWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1NaW5Wb2ljZVZvbHVtZUR1cmF0aW9uTnMsIG1NaW5Wb2ljZVZvbHVtZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gIkFVRElPX01PREVfSU5fQ0FMTCIpIHsgLy8gZW50ZXJpbmcgY2FsbCBtb2RlCiAgICAgICAgIG1TdGFydENhbGxOcyA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOyAvLyBhZHZpc29yeSBvbmx5CkBAIC0zMjcsMTAgKzQzOSwxNSBAQAogICAgIGlmIChtTW9kZSA9PSAiQVVESU9fTU9ERV9JTl9DQUxMIikgewogICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVOcyA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOwogICAgICAgICBjb25zdCBpbnQ2NF90IGR1cmF0aW9uTnMgPSB0aW1lTnMgLSBtRGV2aWNlVGltZU5zOworICAgICAgICBjb25zdCBpbnQ2NF90IHZvbHVtZUR1cmF0aW9uTnMgPSB0aW1lTnMgLSBtVm9sdW1lVGltZU5zOwogICAgICAgICBpZiAoZHVyYXRpb25OcyA+IDApIHsKICAgICAgICAgICAgIG1EZXZpY2VWb2x1bWUgPSAobURldmljZVZvbHVtZSAqIGRvdWJsZShtVm9sdW1lVGltZU5zIC0gbURldmljZVRpbWVOcykgKwotICAgICAgICAgICAgICAgICAgICBtVm9pY2VWb2x1bWUgKiBkb3VibGUodGltZU5zIC0gbVZvbHVtZVRpbWVOcykpIC8gKGRvdWJsZSlkdXJhdGlvbk5zOworICAgICAgICAgICAgICAgICAgICBtVm9pY2VWb2x1bWUgKiBkb3VibGUodm9sdW1lRHVyYXRpb25OcykpIC8gKGRvdWJsZSlkdXJhdGlvbk5zOwogICAgICAgICAgICAgbVZvbHVtZVRpbWVOcyA9IHRpbWVOczsKKyAgICAgICAgICAgIHVwZGF0ZU1pbk1heFZvbHVtZUFuZER1cmF0aW9uKHZvbHVtZUR1cmF0aW9uTnMsIG1Wb2ljZVZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lRHVyYXRpb25OcywgbVZvaWNlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTWF4Vm9pY2VWb2x1bWVEdXJhdGlvbk5zLCBtTWF4Vm9pY2VWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1NaW5Wb2ljZVZvbHVtZUR1cmF0aW9uTnMsIG1NaW5Wb2ljZVZvbHVtZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgQUxPR1YoIiVzOiBuZXcgdm9pY2Ugdm9sdW1lOiVsZiAgb2xkIHZvaWNlIHZvbHVtZTolbGYiLCBfX2Z1bmNfXywgdm9pY2VWb2x1bWUsIG1Wb2ljZVZvbHVtZSk7CkBAIC0zNTgsMTUgKzQ3NSwyNiBAQAogICAgICAgICAvLyBTYXZlIHN0YXRpc3RpY3MKICAgICAgICAgY29uc3QgaW50NjRfdCBlbmREZXZpY2VOcyA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOwogICAgICAgICBjb25zdCBpbnQ2NF90IGR1cmF0aW9uTnMgPSBlbmREZXZpY2VOcyAtIG1EZXZpY2VUaW1lTnM7CisgICAgICAgIGNvbnN0IGludDY0X3Qgdm9sdW1lRHVyYXRpb25OcyA9IGVuZERldmljZU5zIC0gbVZvbHVtZVRpbWVOczsKICAgICAgICAgaWYgKGR1cmF0aW9uTnMgPiAwKSB7CiAgICAgICAgICAgICBtRGV2aWNlVm9sdW1lID0gKG1EZXZpY2VWb2x1bWUgKiBkb3VibGUobVZvbHVtZVRpbWVOcyAtIG1EZXZpY2VUaW1lTnMpICsKLSAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKGVuZERldmljZU5zIC0gbVZvbHVtZVRpbWVOcykpIC8gKGRvdWJsZSlkdXJhdGlvbk5zOwotICAgICAgICAgICAgc2F2ZUFzSXRlbXNfbChtUHJpbWFyeURldmljZSwgZHVyYXRpb25OcywgVk9JQ0VfQ0FMTF9UWVBFLCBtRGV2aWNlVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKHZvbHVtZUR1cmF0aW9uTnMpKSAvIChkb3VibGUpZHVyYXRpb25OczsKKyAgICAgICAgICAgIHVwZGF0ZU1pbk1heFZvbHVtZUFuZER1cmF0aW9uKHZvbHVtZUR1cmF0aW9uTnMsIG1Wb2ljZVZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lRHVyYXRpb25OcywgbVZvaWNlVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTWF4Vm9pY2VWb2x1bWVEdXJhdGlvbk5zLCBtTWF4Vm9pY2VWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1NaW5Wb2ljZVZvbHVtZUR1cmF0aW9uTnMsIG1NaW5Wb2ljZVZvbHVtZSk7CisgICAgICAgICAgICBzYXZlQXNJdGVtc19sKG1QcmltYXJ5RGV2aWNlLCBkdXJhdGlvbk5zLCBWT0lDRV9DQUxMX1RZUEUsIG1EZXZpY2VWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXhWb2ljZVZvbHVtZUR1cmF0aW9uTnMsIG1NYXhWb2ljZVZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbU1pblZvaWNlVm9sdW1lRHVyYXRpb25OcywgbU1pblZvaWNlVm9sdW1lKTsKICAgICAgICAgfQogICAgICAgICAvLyByZXNldCBzdGF0aXN0aWNzCiAgICAgICAgIG1EZXZpY2VWb2x1bWUgPSAwOwogICAgICAgICBtRGV2aWNlVGltZU5zID0gZW5kRGV2aWNlTnM7CiAgICAgICAgIG1Wb2x1bWVUaW1lTnMgPSBlbmREZXZpY2VOczsKKyAgICAgICAgbU1heFZvaWNlVm9sdW1lID0gQU1FRElBTUVUUklDU19JTklUSUFMX01BWF9WT0xVTUU7CisgICAgICAgIG1NaW5Wb2ljZVZvbHVtZSA9IEFNRURJQU1FVFJJQ1NfSU5JVElBTF9NSU5fVk9MVU1FOworICAgICAgICBtTWF4Vm9pY2VWb2x1bWVEdXJhdGlvbk5zID0gMDsKKyAgICAgICAgbU1pblZvaWNlVm9sdW1lRHVyYXRpb25OcyA9IDA7CiAgICAgfQogICAgIEFMT0dWKCIlczogbmV3IHByaW1hcnkgZGV2aWNlOiUjeCAgb2xkIHByaW1hcnkgZGV2aWNlOiUjeCIsIF9fZnVuY19fLCBkZXZpY2UsIG1QcmltYXJ5RGV2aWNlKTsKICAgICBtUHJpbWFyeURldmljZSA9IGRldmljZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1R5cGVzLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1R5cGVzLmNwcAppbmRleCA4MzhjZGQ1Li42ZTI0YTU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9UeXBlcy5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvVHlwZXMuY3BwCkBAIC0xNSw4ICsxNSwxMCBAQAogICovCiAKICNpbmNsdWRlICJBdWRpb1R5cGVzLmgiCisjaW5jbHVkZSAiTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmgiCiAjaW5jbHVkZSAiU3RyaW5nVXRpbHMuaCIKICNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+IC8vIHJlcXVpcmVzIGxpYm1lZGlhX2hlbHBlciB0byBnZXQgdGhlIEF1ZGlvIGNvZGUuCisjaW5jbHVkZSA8c3RhdHNsb2cuaD4gICAgICAgICAgICAvLyBzdGF0c2QKIAogbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6dHlwZXMgewogCkBAIC0xMjYsNiArMTI4LDkgQEAKICAgICAgICAgeyJBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUIiwgICAgICAgICAgICAgICAxTEwgPDwgMzF9LAogICAgICAgICB7IkFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVIiLCAgICAgICAgICAgICAgIDFMTCA8PCAzMn0sCiAgICAgICAgIHsiQVVESU9fREVWSUNFX09VVF9IRE1JX0VBUkMiLCAgICAgICAgICAgICAgICAgMUxMIDw8IDMzfSwKKyAgICAgICAgLy8gUyB2YWx1ZXMgYWJvdmUKKyAgICAgICAgeyJBVURJT19ERVZJQ0VfT1VUX0JMRV9CUk9BRENBU1QiLCAgICAgICAgICAgICAxTEwgPDwgMzR9LAorICAgICAgICAvLyBUIHZhbHVlcyBhYm92ZQogICAgIH07CiAgICAgcmV0dXJuIG1hcDsKIH0KQEAgLTE0Myw2ICsxNDgsOCBAQAogICAgICAgICB7Ik1NQVBfUExBWUJBQ0siLCA1fSwgICAgICAgICAgLy8gVGhyZWFkIGNsYXNzIGZvciBNTUFQIHBsYXliYWNrIHN0cmVhbQogICAgICAgICB7Ik1NQVBfQ0FQVFVSRSIsICA2fSwgICAgICAgICAgLy8gVGhyZWFkIGNsYXNzIGZvciBNTUFQIGNhcHR1cmUgc3RyZWFtCiAgICAgICAgIC8vIFIgdmFsdWVzIGFib3ZlLgorICAgICAgICB7IlNQQVRJQUxJWkVSIiwgICA3fSwgICAgICAgICAgLy8gVGhyZWFkIGNsYXNzIGZvciBTcGF0aWFsaXplclRocmVhZAorICAgICAgICAvLyBTIHZhbHVlcyBhYm92ZS4KICAgICB9OwogICAgIHJldHVybiBtYXA7CiB9CkBAIC0xOTAsNiArMTk3LDMxIEBACiAgICAgcmV0dXJuIG1hcDsKIH0KIAorY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBpbnQzMl90PiYgZ2V0U3RhdHVzTWFwKCkgeworICAgIC8vIERPIE5PVCBNT0RJRlkgVkFMVUVTKE9LIHRvIGFkZCBuZXcgb25lcykuCisgICAgc3RhdGljIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgaW50MzJfdD4gbWFwIHsKKyAgICAgICAgeyIiLAorICAgICAgICAgICAgdXRpbDo6TUVESUFNRVRSSUNTX0FVRElPX1RSQUNLX1NUQVRVU19SRVBPUlRFRF9fU1RBVFVTX19OT19FUlJPUn0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX09LLAorICAgICAgICAgICAgdXRpbDo6TUVESUFNRVRSSUNTX0FVRElPX1RSQUNLX1NUQVRVU19SRVBPUlRFRF9fU1RBVFVTX19OT19FUlJPUn0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX0FSR1VNRU5ULAorICAgICAgICAgICAgdXRpbDo6TUVESUFNRVRSSUNTX0FVRElPX1RSQUNLX1NUQVRVU19SRVBPUlRFRF9fU1RBVFVTX19FUlJPUl9BUkdVTUVOVH0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX0lPLAorICAgICAgICAgICAgdXRpbDo6TUVESUFNRVRSSUNTX0FVRElPX1RSQUNLX1NUQVRVU19SRVBPUlRFRF9fU1RBVFVTX19FUlJPUl9JT30sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX01FTU9SWSwKKyAgICAgICAgICAgIHV0aWw6Ok1FRElBTUVUUklDU19BVURJT19UUkFDS19TVEFUVVNfUkVQT1JURURfX1NUQVRVU19fRVJST1JfTUVNT1JZfSwKKyAgICAgICAge0FNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfU0VDVVJJVFksCisgICAgICAgICAgICB1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9fVFJBQ0tfU1RBVFVTX1JFUE9SVEVEX19TVEFUVVNfX0VSUk9SX1NFQ1VSSVRZfSwKKyAgICAgICAge0FNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfU1RBVEUsCisgICAgICAgICAgICB1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9fVFJBQ0tfU1RBVFVTX1JFUE9SVEVEX19TVEFUVVNfX0VSUk9SX1NUQVRFfSwKKyAgICAgICAge0FNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfVElNRU9VVCwKKyAgICAgICAgICAgIHV0aWw6Ok1FRElBTUVUUklDU19BVURJT19UUkFDS19TVEFUVVNfUkVQT1JURURfX1NUQVRVU19fRVJST1JfVElNRU9VVH0sCisgICAgICAgIHtBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX1VOS05PV04sCisgICAgICAgICAgICB1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9fVFJBQ0tfU1RBVFVTX1JFUE9SVEVEX19TVEFUVVNfX0VSUk9SX1VOS05PV059LAorICAgIH07CisgICAgcmV0dXJuIG1hcDsKK30KKwogLy8gSGVscGVyOiBDcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgaW50MzIgZnJvbSBzdHJpbmcgZmxhZ3Mgc3BsaXQgd2l0aCAnfCcuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHJhaXRzPgogaW50MzJfdCBpbnQzMkZyb21GbGFncyhjb25zdCBzdGQ6OnN0cmluZyAmZmxhZ3MpCkBAIC00MzEsNiArNDYzLDE3IEBACiB9CiAKIHRlbXBsYXRlIDw+CitpbnQzMl90IGxvb2t1cDxTVEFUVVM+KGNvbnN0IHN0ZDo6c3RyaW5nICZzdGF0dXMpCit7CisgICAgYXV0byYgbWFwID0gZ2V0U3RhdHVzTWFwKCk7CisgICAgYXV0byBpdCA9IG1hcC5maW5kKHN0YXR1cyk7CisgICAgaWYgKGl0ID09IG1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gdXRpbDo6TUVESUFNRVRSSUNTX0FVRElPX1RSQUNLX1NUQVRVU19SRVBPUlRFRF9fU1RBVFVTX19FUlJPUl9VTktOT1dOOworICAgIH0KKyAgICByZXR1cm4gaXQtPnNlY29uZDsKK30KKwordGVtcGxhdGUgPD4KIGludDMyX3QgbG9va3VwPFRIUkVBRF9UWVBFPihjb25zdCBzdGQ6OnN0cmluZyAmdGhyZWFkVHlwZSkKIHsKICAgICBhdXRvJiBtYXAgPSBnZXRBdWRpb1RocmVhZFR5cGVNYXAoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3NTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3NTZXJ2aWNlLmNwcAppbmRleCAxZDY0ODc4Li5mZjE2YjllIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL01lZGlhTWV0cmljc1NlcnZpY2UuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJNZWRpYU1ldHJpY3NTZXJ2aWNlLmgiCisjaW5jbHVkZSAiVmFsaWRhdGVJZC5oIgogI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgogCiAjaW5jbHVkZSA8cHdkLmg+IC8vZ2V0cHd1aWQKQEAgLTIwNCw2ICsyMDUsMTUgQEAKICAgICAvLyBub3cgYXR0YWNoIGVpdGhlciB0aGUgaXRlbSBvciBpdHMgZHVwIHRvIGEgY29uc3Qgc2hhcmVkIHBvaW50ZXIKICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiBzaXRlbShyZWxlYXNlID8gaXRlbSA6IGl0ZW0tPmR1cCgpKTsKIAorICAgIC8vIHJlZ2lzdGVyIGxvZyBzZXNzaW9uIGlkcyB3aXRoIHNpbmdsZXRvbi4KKyAgICBpZiAoc3RhcnRzV2l0aChpdGVtLT5nZXRLZXkoKSwgIm1ldHJpY3MubWFuYWdlciIpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxvZ1Nlc3Npb25JZDsKKyAgICAgICAgaWYgKGl0ZW0tPmdldCgibG9nU2Vzc2lvbklkIiwgJmxvZ1Nlc3Npb25JZCkKKyAgICAgICAgICAgICAgICAmJiBtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjppc0xvZ1Nlc3Npb25JZChsb2dTZXNzaW9uSWQuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIG1lZGlhbWV0cmljczo6VmFsaWRhdGVJZDo6Z2V0KCktPnJlZ2lzdGVySWQobG9nU2Vzc2lvbklkKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgICh2b2lkKW1BdWRpb0FuYWx5dGljcy5zdWJtaXQoc2l0ZW0sIGlzVHJ1c3RlZCk7CiAKICAgICAodm9pZClkdW1wMlN0YXRzZChzaXRlbSwgbVN0YXRzZExvZyk7ICAvLyBmYWlsdXJlIHNob3VsZCBiZSBsb2dnZWQgaW4gZnVuY3Rpb24uCkBAIC0zMDksOCArMzE5LDI4IEBACiAgICAgICAgICAgICAgICAgcmVzdWx0IDw8ICItLSBzb21lIGxpbmVzIG1heSBiZSB0cnVuY2F0ZWQgLS1cbiI7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgaGVhdExpbmVzVG9EdW1wID0gYWxsID8gSU5UMzJfTUFYIDogMjA7CisgICAgICAgICAgICBjb25zdCBhdXRvIFsgaGVhdER1bXBTdHJpbmcsIGhlYXRMaW5lc10gPQorICAgICAgICAgICAgICAgICAgICBtQXVkaW9BbmFseXRpY3MuZHVtcEhlYXRNYXAoaGVhdExpbmVzVG9EdW1wKTsKKyAgICAgICAgICAgIHJlc3VsdCA8PCAiXG4iIDw8IGhlYXREdW1wU3RyaW5nOworICAgICAgICAgICAgaWYgKGhlYXRMaW5lcyA9PSBoZWF0TGluZXNUb0R1bXApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPDwgIi0tIHNvbWUgbGluZXMgbWF5IGJlIHRydW5jYXRlZCAtLVxuIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBoZWFsdGhMaW5lc1RvRHVtcCA9IGFsbCA/IElOVDMyX01BWCA6IDE1OworICAgICAgICAgICAgcmVzdWx0IDw8ICJcbkhlYWx0aCBNZXNzYWdlIExvZzoiOworICAgICAgICAgICAgY29uc3QgYXV0byBbIGhlYWx0aER1bXBTdHJpbmcsIGhlYWx0aExpbmVzIF0gPQorICAgICAgICAgICAgICAgICAgICBtQXVkaW9BbmFseXRpY3MuZHVtcEhlYWx0aChoZWFsdGhMaW5lc1RvRHVtcCk7CisgICAgICAgICAgICByZXN1bHQgPDwgIlxuIiA8PCBoZWFsdGhEdW1wU3RyaW5nOworICAgICAgICAgICAgaWYgKGhlYWx0aExpbmVzID09IGhlYWx0aExpbmVzVG9EdW1wKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0IDw8ICItLSBzb21lIGxpbmVzIG1heSBiZSB0cnVuY2F0ZWQgLS1cbiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdCA8PCAiXG5Mb2dTZXNzaW9uSWQ6XG4iCisgICAgICAgICAgICAgICAgICAgPDwgbWVkaWFtZXRyaWNzOjpWYWxpZGF0ZUlkOjpnZXQoKS0+ZHVtcCgpOworCiAgICAgICAgICAgICAvLyBEdW1wIHRoZSBzdGF0c2QgYXRvbXMgd2Ugc2VudCBvdXQuCi0gICAgICAgICAgICByZXN1bHQgPDwgIlN0YXRzZCBhdG9tczpcbiIKKyAgICAgICAgICAgIHJlc3VsdCA8PCAiXG5TdGF0c2QgYXRvbXM6XG4iCiAgICAgICAgICAgICAgICAgICAgPDwgbVN0YXRzZExvZy0+ZHVtcFRvU3RyaW5nKCIgICIgLyogcHJlZml4ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsID8gU1RBVFNEX0xPR19MSU5FU19NQVggOiBTVEFUU0RfTE9HX0xJTkVTX0RVTVApOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvVmFsaWRhdGVJZC5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvVmFsaWRhdGVJZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjODU5MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9WYWxpZGF0ZUlkLmNwcApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYU1ldHJpY3NTZXJ2aWNlIiAgLy8gbm90IFZhbGlkYXRlSWQKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlZhbGlkYXRlSWQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhbWV0cmljcyB7CisKK3N0ZDo6c3RyaW5nIFZhbGlkYXRlSWQ6OmR1bXAoKSBjb25zdAoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8ICJFbnRyaWVzOiIgPDwgbUlkU2V0LnNpemUoKSA8PCAiICBJbnZhbGlkSWRzOiIgPDwgbUludmFsaWRJZHMgPDwgIlxuIjsKKyAgICBzcyA8PCBtSWRTZXQuZHVtcCgxMCk7CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIFZhbGlkYXRlSWQ6OnJlZ2lzdGVySWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKQoreworICAgIGlmIChpZC5lbXB0eSgpKSByZXR1cm47CisgICAgaWYgKCFtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjppc0xvZ1Nlc3Npb25JZChpZC5jX3N0cigpKSkgeworICAgICAgICBBTE9HVygiJXM6IHJlamVjdGluZyBtYWxmb3JtZWQgaWQgJXMiLCBfX2Z1bmNfXywgaWQuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIiVzOiByZWdpc3RlcmluZyAlcyIsIF9fZnVuY19fLCBpZC5jX3N0cigpKTsKKyAgICBtSWRTZXQuYWRkKGlkKTsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcmIFZhbGlkYXRlSWQ6OnZhbGlkYXRlSWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKQoreworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBlbXB0eXt9OworICAgIGlmIChpZC5lbXB0eSgpKSByZXR1cm4gZW1wdHk7CisKKyAgICAvLyByZWplY3QgYmVjYXVzZSB0aGUgaWQgaXMgbWFsZm9ybWVkCisgICAgaWYgKCFtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjppc0xvZ1Nlc3Npb25JZChpZC5jX3N0cigpKSkgeworICAgICAgICBBTE9HVygiJXM6IHJlamVjdGluZyBtYWxmb3JtZWQgaWQgJXMiLCBfX2Z1bmNfXywgaWQuY19zdHIoKSk7CisgICAgICAgICsrbUludmFsaWRJZHM7CisgICAgICAgIHJldHVybiBlbXB0eTsKKyAgICB9CisKKyAgICAvLyByZWplY3QgYmVjYXVzZSB0aGUgaWQgaXMgdW5yZWdpc3RlcmVkCisgICAgaWYgKCFtSWRTZXQuY2hlY2soaWQpKSB7CisgICAgICAgIEFMT0dXKCIlczogcmVqZWN0aW5nIHVucmVnaXN0ZXJlZCBpZCAlcyIsIF9fZnVuY19fLCBpZC5jX3N0cigpKTsKKyAgICAgICAgKyttSW52YWxpZElkczsKKyAgICAgICAgcmV0dXJuIGVtcHR5OworICAgIH0KKyAgICByZXR1cm4gaWQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhbWV0cmljcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9BbmRyb2lkLmJwCmluZGV4IGIwM2U1MTguLjg0ZDQ5NGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTU2LDExICs1NiwxMSBAQAogICAgICAgICAibGlic3RhdHNzb2NrZXQiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibWVkaWFtZXRyaWNzc2VydmljZS1haWRsLWNwcCIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MiLAotICAgICAgICAic3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUiLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBmdXp6X2NvbmZpZzogewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9tZWRpYW1ldHJpY3Nfc2VydmljZV9mdXp6ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9tZWRpYW1ldHJpY3Nfc2VydmljZV9mdXp6ZXIuY3BwCmluZGV4IDhiMGI0NzkuLjQzMzMzMmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvbWVkaWFtZXRyaWNzX3NlcnZpY2VfZnV6emVyLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL21lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplci5jcHAKQEAgLTE5LDE1ICsxOSwxNCBAQAogICovCiAjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYW1ldHJpY3NzZXJ2aWNlL0F1ZGlvVHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYW1ldHJpY3NzZXJ2aWNlL01lZGlhTWV0cmljc1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYW1ldHJpY3NzZXJ2aWNlL1N0cmluZ1V0aWxzLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKLSNpbmNsdWRlICJBdWRpb1R5cGVzLmgiCi0jaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgotI2luY2x1ZGUgIlN0cmluZ1V0aWxzLmgiCi0KIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiAvLyBsb3cgd2F0ZXIgbWFyawpAQCAtNDgsNiArNDcsNyBAQAogICAgIHZvaWQgaW52b2tlQXVkaW9BbmFseXRpY3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHZvaWQgaW52b2tlVGltZWRBY3Rpb24oY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHZvaWQgcHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RkOjphdG9taWNfaW50IG1WYWx1ZSA9IDA7CiB9OwogCiB2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZVN0YXJ0c1dpdGgoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKQEAgLTM0MiwxMSArMzQyLDEwIEBACiB2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZVRpbWVkQWN0aW9uKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKICAgICBhbmRyb2lkOjptZWRpYW1ldHJpY3M6OlRpbWVkQWN0aW9uIHRpbWVkQWN0aW9uOwotICAgIHN0ZDo6YXRvbWljX2ludCB2YWx1ZSA9IDA7CiAKICAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CiAgICAgICAgIHRpbWVkQWN0aW9uLnBvc3RJbihzdGQ6OmNocm9ubzo6c2Vjb25kcyhmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZ2YWx1ZV0geyArK3ZhbHVlOyB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzXSB7ICsrbVZhbHVlOyB9KTsKICAgICAgICAgdGltZWRBY3Rpb24uc2l6ZSgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmFseXRpY3NBY3Rpb25zLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0FuYWx5dGljc0FjdGlvbnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL0FuYWx5dGljc0FjdGlvbnMuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9BbmFseXRpY3NBY3Rpb25zLmgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BbmFseXRpY3NTdGF0ZS5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9BbmFseXRpY3NTdGF0ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQW5hbHl0aWNzU3RhdGUuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9BbmFseXRpY3NTdGF0ZS5oCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9BbmFseXRpY3MuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvQXVkaW9BbmFseXRpY3MuaApzaW1pbGFyaXR5IGluZGV4IDY2JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9BbmFseXRpY3MuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9BdWRpb0FuYWx5dGljcy5oCmluZGV4IDJiNDFhOTUuLjVlZThjMzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb0FuYWx5dGljcy5oCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvQXVkaW9BbmFseXRpY3MuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgIkFuYWx5dGljc0FjdGlvbnMuaCIKICNpbmNsdWRlICJBbmFseXRpY3NTdGF0ZS5oIgogI2luY2x1ZGUgIkF1ZGlvUG93ZXJVc2FnZS5oIgorI2luY2x1ZGUgIkhlYXRNYXAuaCIKICNpbmNsdWRlICJTdGF0c2RMb2cuaCIKICNpbmNsdWRlICJUaW1lZEFjdGlvbi5oIgogI2luY2x1ZGUgIldyYXAuaCIKQEAgLTczLDExICs3NCwzMiBAQAogICAgIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50MzJfdD4gZHVtcCgKICAgICAgICAgICAgIGludDMyX3QgbGluZXMgPSBJTlQzMl9NQVgsIGludDY0X3Qgc2luY2VOcyA9IDAsIGNvbnN0IGNoYXIgKnByZWZpeCA9IG51bGxwdHIpIGNvbnN0OwogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBhaXIgY29uc2lzdGluZyBvZiB0aGUgZHVtcCBzdHJpbmcgYW5kIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIHN0cmluZy4KKyAgICAgKgorICAgICAqIEhlYXRNYXAgZHVtcC4KKyAgICAgKi8KKyAgICBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludDMyX3Q+IGR1bXBIZWF0TWFwKGludDMyX3QgbGluZXMgPSBJTlQzMl9NQVgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1IZWF0TWFwLmR1bXAobGluZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwYWlyIGNvbnNpc3Rpbmcgb2YgdGhlIGR1bXAgc3RyaW5nIGFuZCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBIZWFsdGggZHVtcC4KKyAgICAgKi8KKyAgICBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludDMyX3Q+IGR1bXBIZWFsdGgoaW50MzJfdCBsaW5lcyA9IElOVDMyX01BWCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUhlYWx0aC5kdW1wKGxpbmVzKTsKKyAgICB9CisKICAgICB2b2lkIGNsZWFyKCkgewogICAgICAgICAvLyB1bmRlcmx5aW5nIHN0YXRlIGlzIGxvY2tlZC4KICAgICAgICAgbVByZXZpb3VzQW5hbHl0aWNzU3RhdGUtPmNsZWFyKCk7CiAgICAgICAgIG1BbmFseXRpY3NTdGF0ZS0+Y2xlYXIoKTsKIAorICAgICAgICAvLyBDbGVhcnMgdGhlIHN0YXR1cyBtYXAKKyAgICAgICAgbUhlYXRNYXAuY2xlYXIoKTsKKwogICAgICAgICAvLyBDbGVhciBwb3dlciB1c2FnZSBzdGF0ZS4KICAgICAgICAgbUF1ZGlvUG93ZXJVc2FnZS5jbGVhcigpOwogICAgIH0KQEAgLTk2LDExICsxMTgsMzEgQEAKICAgICAgKi8KIAogICAgIC8qKgotICAgICAqIENoZWNrcyBmb3IgYW55IHBlbmRpbmcgYWN0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIGl0ZW0uCisgICAgICogUHJvY2Vzc2VzIGFueSBwZW5kaW5nIGFjdGlvbnMgZm9yIGEgcGFydGljdWxhciBpdGVtLgogICAgICAqCiAgICAgICogXHBhcmFtIGl0ZW0gdG8gY2hlY2sgYWdhaW5zdCB0aGUgY3VycmVudCBBbmFseXRpY3NBY3Rpb25zLgogICAgICAqLwotICAgIHZvaWQgY2hlY2tBY3Rpb25zKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtKTsKKyAgICB2b2lkIHByb2Nlc3NBY3Rpb25zKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBzdGF0dXMgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBpdGVtLgorICAgICAqCisgICAgICogXHBhcmFtIGl0ZW0gdG8gY2hlY2sgYWdhaW5zdCBmb3Igc3RhdHVzIGhhbmRsaW5nCisgICAgICovCisgICAgdm9pZCBwcm9jZXNzU3RhdHVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtKTsKKworICAgIC8vIFNwZWNpZmljIHJlcG9ydGluZyBtZXRob2RzCisgICAgYm9vbCByZXBvcnRBdWRpb1JlY29yZFN0YXR1cygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIGV2ZW50U3RyLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0YXR1c1N0cmluZywgdWlkX3QgdWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKKyAgICAgICAgICAgIGludDMyX3Qgc3ViQ29kZSkgY29uc3Q7CisKKyAgICBib29sIHJlcG9ydEF1ZGlvVHJhY2tTdGF0dXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudFN0ciwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdGF0dXNTdHJpbmcsIHVpZF90IHVpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCisgICAgICAgICAgICBpbnQzMl90IHN1YkNvZGUpIGNvbnN0OwogCiAgICAgLy8gSEVMUEVSIE1FVEhPRFMKICAgICAvKioKQEAgLTEyNCw2ICsxNjYsOSBAQAogICAgIFRpbWVkQWN0aW9uIG1UaW1lZEFjdGlvbjsgLy8gbG9ja2VkIGludGVybmFsbHkKICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdHNkTG9nPiBtU3RhdHNkTG9nOyAvLyBsb2NrZWQgaW50ZXJuYWxseSwgb2sgZm9yIG11bHRpcGxlIHRocmVhZHMuCiAKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrSGVhdEVudHJpZXMgPSAxMDA7CisgICAgSGVhdE1hcCBtSGVhdE1hcHtrSGVhdEVudHJpZXN9OyAvLyBsb2NrZWQgaW50ZXJuYWxseSwgb2sgZm9yIG11bHRpcGxlIHRocmVhZHMuCisKICAgICAvLyBEZXZpY2VVc2UgaXMgYSBuZXN0ZWQgY2xhc3Mgd2hpY2ggaGFuZGxlcyBhdWRpbyBkZXZpY2UgdXNhZ2UgYWNjb3VudGluZy4KICAgICAvLyBXZSBkZWZpbmUgdGhpcyBjbGFzcyBhdCB0aGUgZW5kIHRvIGVuc3VyZSBwcmlvciB2YXJpYWJsZXMgYWxsIHByb3Blcmx5IGNvbnN0cnVjdGVkLgogICAgIC8vIFRPRE86IFRyYWNrIC8gVGhyZWFkIGludGVyYWN0aW9uCkBAIC0yMTEsNiArMjU2LDY3IEBACiAgICAgICAgIEF1ZGlvQW5hbHl0aWNzICZtQXVkaW9BbmFseXRpY3M7CiAgICAgfSBtQUF1ZGlvU3RyZWFtSW5mb3sqdGhpc307CiAKKyAgICAvLyBDcmVhdGUgbmV3IHN0YXRlLCB0eXBpY2FsbHkgb2NjdXJzIGFmdGVyIGFuIEF1ZGlvRmxpbmdlciBjdG9yIGV2ZW50LgorICAgIHZvaWQgbmV3U3RhdGUoKTsKKworICAgIC8vIEhlYWx0aCBpcyBhIG5lc3RlZCBjbGFzcyB0aGF0IHRyYWNrcyBhdWRpb3NlcnZlciBoZWFsdGggcHJvcGVydGllcworICAgIGNsYXNzIEhlYWx0aCB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBIZWFsdGgoQXVkaW9BbmFseXRpY3MgJmF1ZGlvQW5hbHl0aWNzKQorICAgICAgICAgICAgOiBtQXVkaW9BbmFseXRpY3MoYXVkaW9BbmFseXRpY3MpIHt9CisKKyAgICAgICAgZW51bSBjbGFzcyBNb2R1bGUgeworICAgICAgICAgICAgQVVESU9GTElOR0VSLAorICAgICAgICAgICAgQVVESU9QT0xJQ1ksCisgICAgICAgIH07CisKKyAgICAgICAgY29uc3QgY2hhciAqZ2V0TW9kdWxlTmFtZShNb2R1bGUgbW9kdWxlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1vZHVsZSkgeworICAgICAgICAgICAgICAgIGNhc2UgTW9kdWxlOjpBVURJT0ZMSU5HRVI6IHJldHVybiAiQXVkaW9GbGluZ2VyIjsKKyAgICAgICAgICAgICAgICBjYXNlIE1vZHVsZTo6QVVESU9QT0xJQ1k6IHJldHVybiAiQXVkaW9Qb2xpY3kiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbGxlZCB3aGVuIHdlIGJlbGlldmUgYXVkaW9zZXJ2ZXIgc3RhcnRzIChBdWRpb0ZsaW5nZXIgY3RvcikKKyAgICAgICAgdm9pZCBvbkF1ZGlvU2VydmVyU3RhcnQoTW9kdWxlIG1vZHVsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpJdGVtPiAmaXRlbSk7CisKKyAgICAgICAgLy8gQ2FsbGVkIHdoZW4gd2UgYmVsaWV2ZSBhdWRpb3NlcnZlciBjcmFzaGVzIChUaW1lQ2hlY2sgdGltZW91dHMpLgorICAgICAgICB2b2lkIG9uQXVkaW9TZXJ2ZXJUaW1lb3V0KE1vZHVsZSBtb2R1bGUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6SXRlbT4gJml0ZW0pOworCisgICAgICAgIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50MzJfdD4gZHVtcCgKKyAgICAgICAgICAgICAgICBpbnQzMl90IGxpbmVzID0gSU5UMzJfTUFYLCBjb25zdCBjaGFyICpwcmVmaXggPSBudWxscHRyKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIEF1ZGlvQW5hbHl0aWNzJiBtQXVkaW9BbmFseXRpY3M7CisKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Mb2NrOworCisgICAgICAgIC8vIExpZmUgY3ljbGUgb2YgQXVkaW9TZXJ2ZXIKKyAgICAgICAgLy8gbUF1ZGlvRmxpbmdlckN0b3JUaW1lCisgICAgICAgIC8vIG1BdWRpb1BvbGljeUN0b3JUaW1lCisgICAgICAgIC8vIG1BdWRpb1BvbGljeUN0b3JEb25lVGltZQorICAgICAgICAvLyAuLi4KKyAgICAgICAgLy8gcG9zc2libHkgbVN0b3BUaW1lICAoaWYgVGltZUNoZWNrIHRocmVhZCkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVXBUaW1lIGlzIG1lYXN1cmVkIGZyb20gbVN0b3BUaW1lIC0gbUF1ZGlvRmxpbmdlckN0b3JUaW1lLgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgc3RvcCBldmVudHMgY29tZSBmcm9tIFRpbWVDaGVjayB0aW1lb3V0IGFib3J0cy4gIFRoZXJlIG1heSBiZSBvdGhlcgorICAgICAgICAvLyB1bmNhdWdodCBzaWduYWxzLCBlLmcuIFNJR1NFR1YsIHRoYXQgY2F1c2UgbWlzc2luZyBzdG9wIGV2ZW50cy4KKyAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBtQXVkaW9GbGluZ2VyQ3RvclRpbWUgR1VBUkRFRF9CWShtTG9jayk7CisgICAgICAgIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgbUF1ZGlvUG9saWN5Q3RvclRpbWUgR1VBUkRFRF9CWShtTG9jayk7CisgICAgICAgIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgbUF1ZGlvUG9saWN5Q3RvckRvbmVUaW1lIEdVQVJERURfQlkobUxvY2spOworICAgICAgICBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IG1TdG9wVGltZSBHVUFSREVEX0JZKG1Mb2NrKTsKKworICAgICAgICAvLyBtU3RhcnRDb3VudCBhbmQgbVN0b3BDb3VudCB0cmFjayB0aGUgYXVkaW9zZXJ2ZXIgc3RhcnQgYW5kIHN0b3AgZXZlbnRzLgorICAgICAgICBpbnQ2NF90IG1TdGFydENvdW50IEdVQVJERURfQlkobUxvY2spID0gMDsKKyAgICAgICAgaW50NjRfdCBtU3RvcENvdW50IEdVQVJERURfQlkobUxvY2spID0gMDsKKworICAgICAgICBTaW1wbGVMb2cgbVNpbXBsZUxvZyBHVUFSREVEX0JZKG1Mb2NrKSB7NjR9OworICAgIH0gbUhlYWx0aHsqdGhpc307CisKICAgICBBdWRpb1Bvd2VyVXNhZ2UgbUF1ZGlvUG93ZXJVc2FnZTsKIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1Bvd2VyVXNhZ2UuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvQXVkaW9Qb3dlclVzYWdlLmgKc2ltaWxhcml0eSBpbmRleCA4MCUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvUG93ZXJVc2FnZS5oCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0F1ZGlvUG93ZXJVc2FnZS5oCmluZGV4IDcwMjE5MDIuLmI3MjE1ZTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1Bvd2VyVXNhZ2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0F1ZGlvUG93ZXJVc2FnZS5oCkBAIC0yNiw2ICsyNiw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYW1ldHJpY3MgewogCisKIGNsYXNzIEF1ZGlvQW5hbHl0aWNzOwogCiBjbGFzcyBBdWRpb1Bvd2VyVXNhZ2UgewpAQCAtODMsMTMgKzg0LDIxIEBACiAgICAgc3RhdGljIGJvb2wgZGV2aWNlRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlX3N0cmluZywgaW50MzJfdCYgZGV2aWNlKTsKICAgICBzdGF0aWMgaW50MzJfdCBkZXZpY2VGcm9tU3RyaW5nUGFpcnMoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9zdHJpbmdzKTsKIHByaXZhdGU6Ci0gICAgYm9vbCBzYXZlQXNJdGVtX2woaW50MzJfdCBkZXZpY2UsIGludDY0X3QgZHVyYXRpb24sIGludDMyX3QgdHlwZSwgZG91YmxlIGF2ZXJhZ2Vfdm9sKQotICAgICAgICAgUkVRVUlSRVMobUxvY2spOworICAgIGJvb2wgc2F2ZUFzSXRlbV9sKGludDMyX3QgZGV2aWNlLCBpbnQ2NF90IGR1cmF0aW9uLCBpbnQzMl90IHR5cGUsIGRvdWJsZSBhdmVyYWdlX3ZvbCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1heF92b2x1bWVfZHVyYXRpb24sIGRvdWJsZSBtYXhfdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluX3ZvbHVtZV9kdXJhdGlvbiwgZG91YmxlIG1pbl92b2x1bWUpCisgICAgICAgICAgICAgICAgICAgICAgUkVRVUlSRVMobUxvY2spOwogICAgIHZvaWQgc2VuZEl0ZW0oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0pIGNvbnN0OwogICAgIHZvaWQgY29sbGVjdCgpOwotICAgIGJvb2wgc2F2ZUFzSXRlbXNfbChpbnQzMl90IGRldmljZSwgaW50NjRfdCBkdXJhdGlvbiwgaW50MzJfdCB0eXBlLCBkb3VibGUgYXZlcmFnZV92b2wpCi0gICAgICAgICBSRVFVSVJFUyhtTG9jayk7Ci0KKyAgICBib29sIHNhdmVBc0l0ZW1zX2woaW50MzJfdCBkZXZpY2UsIGludDY0X3QgZHVyYXRpb24sIGludDMyX3QgdHlwZSwgZG91YmxlIGF2ZXJhZ2Vfdm9sLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWF4X3ZvbHVtZV9kdXJhdGlvbiwgZG91YmxlIG1heF92b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtaW5fdm9sdW1lX2R1cmF0aW9uLCBkb3VibGUgbWluX3ZvbHVtZSkKKyAgICAgICAgICAgICAgICAgICAgICBSRVFVSVJFUyhtTG9jayk7CisgICAgdm9pZCB1cGRhdGVNaW5NYXhWb2x1bWVBbmREdXJhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgY3VyX21heF92b2x1bWVfZHVyYXRpb25fbnMsIGNvbnN0IGRvdWJsZSBjdXJfbWF4X3ZvbHVtZSwKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgY3VyX21pbl92b2x1bWVfZHVyYXRpb25fbnMsIGNvbnN0IGRvdWJsZSBjdXJfbWluX3ZvbHVtZSwKKyAgICAgICAgICAgIGludDY0X3QmIGZfbWF4X3ZvbHVtZV9kdXJhdGlvbl9ucywgZG91YmxlJiBmX21heF92b2x1bWUsCisgICAgICAgICAgICBpbnQ2NF90JiBmX21pbl92b2x1bWVfZHVyYXRpb25fbnMsIGRvdWJsZSYgZl9taW5fdm9sdW1lKTsKICAgICBBdWRpb0FuYWx5dGljcyAqIGNvbnN0IG1BdWRpb0FuYWx5dGljczsKICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdHNkTG9nPiBtU3RhdHNkTG9nOyAgLy8gbVN0YXRzZExvZyBpcyBpbnRlcm5hbGx5IGxvY2tlZAogICAgIGNvbnN0IGJvb2wgbURpc2FibGVkOwpAQCAtMTAwLDYgKzEwOSwxMCBAQAogCiAgICAgZG91YmxlIG1Wb2ljZVZvbHVtZSBHVUFSREVEX0JZKG1Mb2NrKSA9IDAuOwogICAgIGRvdWJsZSBtRGV2aWNlVm9sdW1lIEdVQVJERURfQlkobUxvY2spID0gMC47CisgICAgZG91YmxlIG1NYXhWb2ljZVZvbHVtZSBHVUFSREVEX0JZKG1Mb2NrKSA9IEFNRURJQU1FVFJJQ1NfSU5JVElBTF9NQVhfVk9MVU1FOworICAgIGRvdWJsZSBtTWluVm9pY2VWb2x1bWUgR1VBUkRFRF9CWShtTG9jaykgPSBBTUVESUFNRVRSSUNTX0lOSVRJQUxfTUlOX1ZPTFVNRTsKKyAgICBpbnQ2NF90IG1NYXhWb2ljZVZvbHVtZUR1cmF0aW9uTnMgR1VBUkRFRF9CWShtTG9jaykgPSAwOworICAgIGludDY0X3QgbU1pblZvaWNlVm9sdW1lRHVyYXRpb25OcyBHVUFSREVEX0JZKG1Mb2NrKSA9IDA7CiAgICAgaW50NjRfdCBtU3RhcnRDYWxsTnMgR1VBUkRFRF9CWShtTG9jaykgPSAwOyAvLyBhZHZpc29yeSBvbmx5CiAgICAgaW50NjRfdCBtVm9sdW1lVGltZU5zIEdVQVJERURfQlkobUxvY2spID0gMDsKICAgICBpbnQ2NF90IG1EZXZpY2VUaW1lTnMgR1VBUkRFRF9CWShtTG9jaykgPSAwOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvVHlwZXMuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvQXVkaW9UeXBlcy5oCnNpbWlsYXJpdHkgaW5kZXggOTIlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1R5cGVzLmgKcmVuYW1lIHRvIHNlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvQXVkaW9UeXBlcy5oCmluZGV4IDQzOTRkNzkuLjVkYmZmOWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1R5cGVzLmgKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9BdWRpb1R5cGVzLmgKQEAgLTM5LDYgKzM5LDEwIEBACiB9OwogCiAvLyBFbnVtZXJhdGlvbiBmb3IgYWxsIHRoZSBzdHJpbmcgdHJhbnNsYXRpb25zIHRvIGludGVnZXJzIChnZW5lcmFsbHkgaW50MzJfdCkgdW5sZXNzIG5vdGVkLgorLy8gVGhpcyBpcyB1c2VkIHRvIGluZGV4IHRoZSB0ZW1wbGF0ZSBtZXRob2QgYmVsb3c6CisvLyB0ZW1wbGF0ZSA8QXVkaW9FbnVtQ2F0ZWdvcnkgQywgdHlwZW5hbWUgVCwgdHlwZW5hbWUgUz4gIFQgbG9va3VwKGNvbnN0IFMgJnN0cik7CisvLworLy8gT2theSB0byBrZWVwIEF1ZGlvRW51bUNhdGVnb3J5IGFscGhhYmV0aWNhbCBhbmQgYWRkIG5ldyB0cmFuc2xhdGlvbnMgaW4gdGhlIG1pZGRsZS4KIGVudW0gQXVkaW9FbnVtQ2F0ZWdvcnkgewogICAgIEFBVURJT19ESVJFQ1RJT04sCiAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREUsCkBAIC01MSw2ICs1NSw3IEBACiAgICAgT1VUUFVUX0RFVklDRSwgLy8gaW50NjRfdAogICAgIE9VVFBVVF9GTEFHLAogICAgIFNPVVJDRV9UWVBFLAorICAgIFNUQVRVUywKICAgICBTVFJFQU1fVFlQRSwKICAgICBUSFJFQURfVFlQRSwKICAgICBUUkFDS19UUkFJVFMsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0hlYXRNYXAuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvSGVhdE1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MDUwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0hlYXRNYXAuaApAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJNZWRpYU1ldHJpY3NDb25zdGFudHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhbWV0cmljcyB7CisKKy8qKgorICogSGVhdERhdGEgYWNjdW11bGF0ZXMgc3RhdGlzdGljcyBvbiB0aGUgc3RhdHVzIHJlcG9ydGVkIGZvciBhIGdpdmVuIGtleS4KKyAqCisgKiBIZWF0RGF0YSBpcyBhIGhlbHBlciBjbGFzcyB1c2VkIGJ5IEhlYXRNYXAgdG8gcmVwcmVzZW50IHN0YXRpc3RpY3MuICBXZSBleHBvc2UgaXQKKyAqIGhlcmUgZm9yIHRlc3RpbmcgcHVycG9zZXMgY3VycmVudGx5LgorICoKKyAqIE5vdGU6IFRoaXMgY2xhc3MgaXMgbm90IHRocmVhZCBzYWZlLCBzbyBtdXR1YWwgZXhjbHVzaW9uIHNob3VsZCBiZSBvYnRhaW5lZCBieSB0aGUgY2FsbGVyCisgKiB3aGljaCBpbiB0aGlzIGNhc2UgaXMgSGVhdE1hcC4gIEhlYXRNYXAgZ2V0RGF0YSgpIHJldHVybnMgYSBsb2NhbCBjb3B5IG9mIEhlYXREYXRhLCBzbyB1c2UKKyAqIG9mIHRoYXQgaXMgdGhyZWFkLXNhZmUuCisgKi8KK2NsYXNzIEhlYXREYXRhIHsKKyAgICAvKiBIZWF0RGF0YSBmb3IgYSBrZXkgaXMgc3RvcmVkIGluIGEgbWFwIGJhc2VkIG9uIHRoZSBldmVudCAoZS5nLiAic3RhcnQiLCAicGF1c2UiLCBjcmVhdGUpCisgICAgICogYW5kIHRoZW4gYW5vdGhlciBtYXAgYmFzZWQgb24gdGhlIHN0YXR1cyAoZS5nLiAib2siLCAiYXJndW1lbnQiLCAic3RhdGUiKS4KKyAgICAgKi8KKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZyAvKiBldmVudCAqLywKKyAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZyAvKiBzdGF0dXMgbmFtZSAqLywgc2l6ZV90IC8qIGNvdW50LCBub256ZXJvICovPj4gbU1hcDsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIEFkZCBzdGF0dXMgZGF0YS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzdWZmaXggIChpZ25vcmVkKSB0aGUgc3VmZml4IHRvIHRoZSBrZXkgdGhhdCB3YXMgc3RyaXBwZWQsIGlmIGFueS4KKyAgICAgKiBccGFyYW0gZXZlbnQgICAgICAgICAgICAgdGhlIGV2ZW50IChlLmcuIGNyZWF0ZSwgc3RhcnQsIHBhdXNlLCBzdG9wLCBldGMuKS4KKyAgICAgKiBccGFyYW0gdWlkICAgICAoaWdub3JlZCkgdGhlIHVpZCBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLgorICAgICAqIFxwYXJhbSBtZXNzYWdlIChpZ25vcmVkKSB0aGUgc3RhdHVzIG1lc3NhZ2UsIGlmIGFueS4KKyAgICAgKiBccGFyYW0gc3ViQ29kZSAoaWdub3JlZCkgdGhlIHN0YXR1cyBzdWJjb2RlLCBpZiBhbnkuCisgICAgICovCisgICAgdm9pZCBhZGQoY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCwgY29uc3Qgc3RkOjpzdHJpbmcmIGV2ZW50LCBjb25zdCBzdGQ6OnN0cmluZyYgc3RhdHVzLAorICAgICAgICAgICAgdWlkX3QgdWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwgaW50MzJfdCBzdWJDb2RlKSB7CisgICAgICAgIC8vIFBlcmhhcHMgdGhlcmUgY291bGQgYmUgYSBtb3JlIGRldGFpbGVkIHByaW50LgorICAgICAgICAodm9pZClzdWZmaXg7CisgICAgICAgICh2b2lkKXVpZDsKKyAgICAgICAgKHZvaWQpbWVzc2FnZTsKKyAgICAgICAgKHZvaWQpc3ViQ29kZTsKKyAgICAgICAgKyttTWFwW2V2ZW50XVtzdGF0dXNdOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZXZlbnQgbmFtZXMgd2l0aCBzdGF0dXMuICovCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTWFwLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZGVxdWUgd2l0aCBwYWlycyBpbmRpY2F0aW5nIHRoZSBjb3VudCBvZiBPa3MgYW5kIEVycm9ycy4KKyAgICAgKiBUaGUgZmlyc3QgcGFpciBpcyB0b3RhbCwgdGhlIG90aGVyIHBhaXJzIGFyZSBpbiBvcmRlciBvZiBtTWFwLgorICAgICAqCisgICAgICogRXhhbXBsZSByZXR1cm4gdmFsdWUgb2Yge29rLCBlcnJvcn0gcGFpcnM6CisgICAgICogICAgIHRvdGFsICAgICBrZXkxICAgICAga2V5MgorICAgICAqIHsgeyAyLCAxIH0sIHsgMSwgMCB9LCB7IDEsIDEgfSB9CisgICAgICovCisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8c2l6ZV90IC8qIG9rcyAqLywgc2l6ZV90IC8qIGVycm9ycyAqLz4+IGhlYXRDb3VudCgpIGNvbnN0IHsKKyAgICAgICAgc2l6ZV90IHRvdGFsT2sgPSAwOworICAgICAgICBzaXplX3QgdG90YWxFcnJvciA9IDA7CisgICAgICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHNpemVfdCAvKiBva3MgKi8sIHNpemVfdCAvKiBlcnJvcnMgKi8+PiBoZWF0OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmV2ZW50UGFpciA6IG1NYXApIHsKKyAgICAgICAgICAgIHNpemVfdCBvayA9IDA7CisgICAgICAgICAgICBzaXplX3QgZXJyb3IgPSAwOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZbbmFtZSwgY291bnRdIDogZXZlbnRQYWlyLnNlY29uZCkgeworICAgICAgICAgICAgICAgIGlmIChuYW1lID09IEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVNfVkFMVUVfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgb2sgKz0gY291bnQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgKz0gY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdG90YWxPayArPSBvazsKKyAgICAgICAgICAgIHRvdGFsRXJyb3IgKz0gZXJyb3I7CisgICAgICAgICAgICBoZWF0LmVtcGxhY2VfYmFjayhvaywgZXJyb3IpOworICAgICAgICB9CisgICAgICAgIGhlYXQuZW1wbGFjZV9mcm9udCh0b3RhbE9rLCB0b3RhbEVycm9yKTsKKyAgICAgICAgcmV0dXJuIGhlYXQ7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIGVycm9yIGZyYWN0aW9uIGZyb20gYSBwYWlyIDxva3MsIGVycm9ycz4sIGEgZmxvYXQgYmV0d2VlbiAwLmYgdG8gMS5mLiAqLworICAgIHN0YXRpYyBmbG9hdCBmcmFjdGlvbihjb25zdCBzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+JiBjb3VudCkgeworICAgICAgICByZXR1cm4gKGZsb2F0KWNvdW50LnNlY29uZCAvIChjb3VudC5maXJzdCArIGNvdW50LnNlY29uZCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIEhlYXRNYXAgaW5mb3JtYXRpb24gaW4gYSBzaW5nbGUgbGluZSBzdHJpbmcuICovCisgICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0IHsKKyAgICAgICAgY29uc3QgYXV0byBoZWF0ID0gaGVhdENvdW50KCk7CisgICAgICAgIGF1dG8gaXQgPSBoZWF0LmJlZ2luKCk7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICBzcyA8PCAieyAiOworICAgICAgICBmbG9hdCBlcnJvckZyYWN0aW9uID0gZnJhY3Rpb24oKml0KyspOworICAgICAgICBpZiAoZXJyb3JGcmFjdGlvbiA+IDAuZikgeworICAgICAgICAgICAgc3MgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnNldHByZWNpc2lvbigyKSA8PCBlcnJvckZyYWN0aW9uIDw8ICIgIjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmV2ZW50UGFpciA6IG1NYXApIHsKKyAgICAgICAgICAgIHNzIDw8IGV2ZW50UGFpci5maXJzdCA8PCAiOiB7ICI7CisgICAgICAgICAgICBlcnJvckZyYWN0aW9uID0gZnJhY3Rpb24oKml0KyspOworICAgICAgICAgICAgaWYgKGVycm9yRnJhY3Rpb24gPiAwLmYpIHsKKyAgICAgICAgICAgICAgICBzcyA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDIpIDw8IGVycm9yRnJhY3Rpb24gPDwgIiAiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZbbmFtZSwgY291bnRdOiBldmVudFBhaXIuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgc3MgPDwgIlsgIiA8PCBuYW1lIDw8ICIgOiAiIDw8IGNvdW50IDw8ICIgXSAiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3MgPDwgIn0gIjsKKyAgICAgICAgfQorICAgICAgICBzcyA8PCAiIH0iOworICAgICAgICByZXR1cm4gc3Muc3RyKCk7CisgICAgfQorfTsKKworLyoqCisgKiBIZWF0TWFwIGlzIGEgdGhyZWFkLXNhZmUgY29sbGVjdGlvbiB0aGF0IGNvdW50cyBhY3Rpdml0eSBvZiBzdGF0dXMgZXJyb3JzIHBlciBrZXkuCisgKgorICogVGhlIGNsYXNzaWMgaGVhdCBtYXAgaXMgYSAyRCBwaWN0dXJlIHdpdGggaW50ZW5zaXR5IHNob3duIGJ5IGNvbG9yLgorICogSGVyZSB3ZSBhY2N1bXVsYXRlIHRoZSBzdGF0dXMgcmVzdWx0cyBmcm9tIGtleXMgdG8gc2VlIGlmIHRoZXJlIGFyZSBjb25zaXN0ZW50CisgKiBmYWlsdXJlcyBpbiB0aGUgc3lzdGVtLgorICoKKyAqIFRPRE8oYi8yMTA4NTU1NTUpOiBIZWF0bWFwIGltcHJvdmVtZW50cy4KKyAqICAgMSkgaGVhdCBkZWNheXMgaW4gaW50ZW5zaXR5IGluIHRpbWUgZm9yIHBhc3QgZXZlbnRzLCBjdXJyZW50bHkgd2UgZG9uJ3QgZGVjYXkuCisgKi8KKworY2xhc3MgSGVhdE1hcCB7CisgICAgY29uc3Qgc2l6ZV90IG1NYXhTaXplOworICAgIG11dGFibGUgc3RkOjptdXRleCBtTG9jazsKKyAgICBzaXplX3QgbVJlamVjdGVkIEdVQVJERURfQlkobUxvY2spID0gMDsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSGVhdERhdGE+IG1NYXAgR1VBUkRFRF9CWShtTG9jayk7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgSGVhdE1hcC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtYXhTaXplIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IGFyZSB0cmFja2VkLgorICAgICAqLworICAgIGV4cGxpY2l0IEhlYXRNYXAoc2l6ZV90IG1heFNpemUpIDogbU1heFNpemUobWF4U2l6ZSkgeworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cy4gKi8KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGwobUxvY2spOworICAgICAgICByZXR1cm4gbU1hcC5zaXplKCk7CisgICAgfQorCisgICAgLyoqIENsZWFycyBlcnJvciBoaXN0b3J5LiAqLworICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIG1NYXAuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBudW1iZXIgb2Yga2V5cyByZWplY3RlZCBkdWUgdG8gc3BhY2UuICovCisgICAgc2l6ZV90IHJlamVjdGVkKCkgY29uc3QgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbChtTG9jayk7CisgICAgICAgIHJldHVybiBtUmVqZWN0ZWQ7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBoZWF0IGRhdGEgYXNzb2NpYXRlZCB3aXRoIGtleS4gKi8KKyAgICBIZWF0RGF0YSBnZXREYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGwobUxvY2spOworICAgICAgICByZXR1cm4gbU1hcC5jb3VudChrZXkpID09IDAgPyBIZWF0RGF0YXt9IDogbU1hcC5hdChrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgZW50cnkuCisgICAgICogXHBhcmFtIGtleSAgICAgICAgICAgICAgIHRoZSBrZXkgY2F0ZWdvcnkgKGUuZy4gYXVkaW8udHJhY2spLgorICAgICAqIFxwYXJhbSBzdWZmaXggIChpZ25vcmVkKSB0aGUgc3VmZml4IHRvIHRoZSBrZXkgdGhhdCB3YXMgc3RyaXBwZWQsIGlmIGFueS4KKyAgICAgKiBccGFyYW0gZXZlbnQgICAgICAgICAgICAgdGhlIGV2ZW50IChlLmcuIGNyZWF0ZSwgc3RhcnQsIHBhdXNlLCBzdG9wLCBldGMuKS4KKyAgICAgKiBccGFyYW0gdWlkICAgICAoaWdub3JlZCkgdGhlIHVpZCBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLgorICAgICAqIFxwYXJhbSBtZXNzYWdlIChpZ25vcmVkKSB0aGUgc3RhdHVzIG1lc3NhZ2UsIGlmIGFueS4KKyAgICAgKiBccGFyYW0gc3ViQ29kZSAoaWdub3JlZCkgdGhlIHN0YXR1cyBzdWJjb2RlLCBpZiBhbnkuCisgICAgICovCisgICAgdm9pZCBhZGQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCwgY29uc3Qgc3RkOjpzdHJpbmcmIGV2ZW50LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0YXR1cywgdWlkX3QgdWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwgaW50MzJfdCBzdWJDb2RlKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsKG1Mb2NrKTsKKworICAgICAgICAvLyBIYXJkIGxpbWl0IG9uIGhlYXQgbWFwIGVudHJpZXMuCisgICAgICAgIC8vIFRPRE86IGhhdmUgYmV0dGVyIEdDLgorICAgICAgICBpZiAobU1hcC5zaXplKCkgPT0gbU1heFNpemUgJiYgbU1hcC5jb3VudChrZXkpID09IDApIHsKKyAgICAgICAgICAgICsrbVJlamVjdGVkOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1NYXBba2V5XS5hZGQoc3VmZml4LCBldmVudCwgc3RhdHVzLCB1aWQsIG1lc3NhZ2UsIHN1YkNvZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwYWlyIGNvbnNpc3Rpbmcgb2YgdGhlIGR1bXAgc3RyaW5nIGFuZCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBzdHJpbmcuCisgICAgICovCisgICAgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBpbnQzMl90PiBkdW1wKGludDMyX3QgbGluZXMgPSBJTlQzMl9NQVgpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgIGludDMyX3QgbGwgPSBsaW5lczsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGwobUxvY2spOworICAgICAgICBpZiAobGwgPiAwKSB7CisgICAgICAgICAgICBzcyA8PCAiRXJyb3IgSGVhdCBNYXAgKHJlamVjdGVkOiAiIDw8IG1SZWplY3RlZCA8PCAiKTpcbiI7CisgICAgICAgICAgICAtLWxsOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IHJlc3RyaWN0aW9uIGlzIGltcGxlbWVudGVkIGFscGhhYmV0aWNhbGx5IG5vdCBvbiBwcmlvcml0eS4KKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBbbmFtZSwgZGF0YV0gOiBtTWFwKSB7CisgICAgICAgICAgICBpZiAobGwgPD0gMCkgYnJlYWs7CisgICAgICAgICAgICBzcyA8PCBuYW1lIDw8ICI6ICIgPDwgZGF0YS5kdW1wKCkgPDwgIlxuIjsKKyAgICAgICAgICAgIC0tbGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHsgc3Muc3RyKCksIGxpbmVzIC0gbGwgfTsKKyAgICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYW1ldHJpY3MKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvTHJ1U2V0LmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0xydVNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMGFiNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL0xydVNldC5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhbWV0cmljcyB7CisKKy8qKgorICogTHJ1U2V0IGtlZXBzIGEgc2V0IG9mIHRoZSBsYXN0ICJTaXplIiBlbGVtZW50cyBhZGRlZCBvciBhY2Nlc3NlZC4KKyAqCisgKiAoTHJ1IHN0YW5kcyBmb3IgbGVhc3QtcmVjZW50bHktdXNlZCBldmljdGlvbiBwb2xpY3kpLgorICoKKyAqIFJ1bnMgaW4gTygxKSB0aW1lIGZvciBhZGQsIHJlbW92ZSwgYW5kIGNoZWNrLiAgSW50ZXJuYWxseSBpbXBsZW1lbnRlZAorICogd2l0aCBhbiB1bm9yZGVyZWRfbWFwIGFuZCBhIGxpc3QuICBJbiBvcmRlciB0byByZW1vdmUgZWxlbWVudHMsCisgKiBhIGxpc3QgaXRlcmF0b3IgaXMgc3RvcmVkIGluIHRoZSB1bm9yZGVyZWRfbWFwCisgKiAobm90aW5nIHRoYXQgc3RkOjpsaXN0OjplcmFzZSgpIGNvbnRyYWN0dWFsbHkKKyAqIGRvZXMgbm90IGFmZmVjdCBpdGVyYXRvcnMgb3RoZXIgdGhhbiB0aGUgb25lIGVyYXNlZCkuCisgKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBMcnVTZXQgeworICAgIGNvbnN0IHNpemVfdCBtTWF4U2l6ZTsKKyAgICBzdGQ6Omxpc3Q8VD4gbUFjY2Vzc09yZGVyOyAgICAgICAgICAgICAgICAgLy8gZnJvbnQgaXMgdGhlIG1vc3QgcmVjZW50LCBiYWNrIGlzIHRoZSBvbGRlc3QuCisgICAgLy8gaXRlbSBUIHdpdGggaXRzIGFjY2VzcyBvcmRlciBpdGVyYXRvci4KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8VCwgdHlwZW5hbWUgc3RkOjpsaXN0PFQ+OjppdGVyYXRvcj4gbU1hcDsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBMcnVTZXQgd2hpY2ggY2hlY2tzIHdoZXRoZXIgdGhlIGVsZW1lbnQgd2FzCisgICAgICogYWNjZXNzZWQgb3IgYWRkZWQgcmVjZW50bHkuCisgICAgICoKKyAgICAgKiBUaGUgcGFyYW1ldGVyIG1heFNpemUgaXMgdXNlZCB0byBjYXAgZ3Jvd3RoIG9mIExydVNldDsKKyAgICAgKiBldmljdGlvbiBpcyBiYXNlZCBvbiBsZWFzdCByZWNlbnRseSB1c2VkIExSVS4KKyAgICAgKiBJZiBtYXhTaXplIGlzIHplcm8sIHRoZSBMcnVTZXQgY29udGFpbnMgbm8gZWxlbWVudHMKKyAgICAgKiBhbmQgY2hlY2soKSBhbHdheXMgcmV0dXJucyBmYWxzZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtYXhTaXplIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IGFyZSB0cmFja2VkLgorICAgICAqLworICAgIGV4cGxpY2l0IExydVNldChzaXplX3QgbWF4U2l6ZSkgOiBtTWF4U2l6ZShtYXhTaXplKSB7fQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIExydVNldC4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCBtYXhTaXplLgorICAgICAqLworICAgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU1hcC5zaXplKCk7CisgICAgfQorCisgICAgLyoqIENsZWFycyB0aGUgY29udGFpbmVyIGNvbnRlbnRzLiAqLworICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG1NYXAuY2xlYXIoKTsKKyAgICAgICAgbUFjY2Vzc09yZGVyLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgYSBzdHJpbmcgZHVtcCBvZiB0aGUgbGFzdCBuIGVudHJpZXMuICovCisgICAgc3RkOjpzdHJpbmcgZHVtcChzaXplX3QgbikgY29uc3QgeworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgYXV0byBpdCA9IG1BY2Nlc3NPcmRlci5jYmVnaW4oKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuICYmIGl0ICE9IG1BY2Nlc3NPcmRlci5jZW5kKCk7ICsraSkgeworICAgICAgICAgICAgc3MgPDwgKml0KysgPDwgIlxuIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3Muc3RyKCk7CisgICAgfQorCisgICAgLyoqIEFkZHMgYSBuZXcgaXRlbSB0byB0aGUgc2V0LiAqLworICAgIHZvaWQgYWRkKGNvbnN0IFQmIHQpIHsKKyAgICAgICAgaWYgKG1NYXhTaXplID09IDApIHJldHVybjsKKyAgICAgICAgYXV0byBpdCA9IG1NYXAuZmluZCh0KTsKKyAgICAgICAgaWYgKGl0ICE9IG1NYXAuZW5kKCkpIHsgLy8gYWxyZWFkeSBleGlzdHMuCisgICAgICAgICAgICBtQWNjZXNzT3JkZXIuZXJhc2UoaXQtPnNlY29uZCk7ICAvLyBtb3ZlLXRvLWZyb250IG9uIHRoZSBjaHJvbm9sb2dpY2FsbHkgb3JkZXJlZCBsaXN0LgorICAgICAgICB9IGVsc2UgaWYgKG1BY2Nlc3NPcmRlci5zaXplKCkgPj0gbU1heFNpemUpIHsKKyAgICAgICAgICAgIGNvbnN0IFQgbGFzdCA9IG1BY2Nlc3NPcmRlci5iYWNrKCk7CisgICAgICAgICAgICBtQWNjZXNzT3JkZXIucG9wX2JhY2soKTsKKyAgICAgICAgICAgIG1NYXAuZXJhc2UobGFzdCk7CisgICAgICAgIH0KKyAgICAgICAgbUFjY2Vzc09yZGVyLnB1c2hfZnJvbnQodCk7CisgICAgICAgIG1NYXBbdF0gPSBtQWNjZXNzT3JkZXIuYmVnaW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIHQgaXRlbSB0byBiZSByZW1vdmVkLgorICAgICAqIFxyZXR1cm4gZmFsc2UgaWYgdGhlIGl0ZW0gZG9lc24ndCBleGlzdC4KKyAgICAgKi8KKyAgICBib29sIHJlbW92ZShjb25zdCBUJiB0KSB7CisgICAgICAgIGF1dG8gaXQgPSBtTWFwLmZpbmQodCk7CisgICAgICAgIGlmIChpdCA9PSBtTWFwLmVuZCgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIG1BY2Nlc3NPcmRlci5lcmFzZShpdC0+c2Vjb25kKTsKKyAgICAgICAgbU1hcC5lcmFzZShpdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdCBpcyBwcmVzZW50IChhbmQgbW92ZXMgdGhlIGFjY2VzcyBvcmRlciBvZiB0IHRvIHRoZSBmcm9udCkuICovCisgICAgYm9vbCBjaGVjayhjb25zdCBUJiB0KSB7IC8vIG5vdCBjb25zdCwgYXMgaXQgYWRqdXN0cyB0aGUgbGVhc3QtcmVjZW50bHktdXNlZCBvcmRlci4KKyAgICAgICAgYXV0byBpdCA9IG1NYXAuZmluZCh0KTsKKyAgICAgICAgaWYgKGl0ID09IG1NYXAuZW5kKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgbUFjY2Vzc09yZGVyLmVyYXNlKGl0LT5zZWNvbmQpOworICAgICAgICBtQWNjZXNzT3JkZXIucHVzaF9mcm9udChpdC0+Zmlyc3QpOworICAgICAgICBpdC0+c2Vjb25kID0gbUFjY2Vzc09yZGVyLmJlZ2luKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhbWV0cmljcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL01lZGlhTWV0cmljc1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvTWVkaWFNZXRyaWNzU2VydmljZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzU2VydmljZS5oCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL01lZGlhTWV0cmljc1NlcnZpY2UuaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL1N0YXRzZExvZy5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9TdGF0c2RMb2cuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL1N0YXRzZExvZy5oCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL1N0YXRzZExvZy5oCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvU3RyaW5nVXRpbHMuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvU3RyaW5nVXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDgzJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvU3RyaW5nVXRpbHMuaApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9TdHJpbmdVdGlscy5oCmluZGV4IDAxMDM0ZDkuLmE1NmY1YjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9TdHJpbmdVdGlscy5oCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvU3RyaW5nVXRpbHMuaApAQCAtMTY3LDQgKzE2Nyw0MSBAQAogICAgIHJldHVybiBzcy5zdHIoKTsKIH0KIAorLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyBpcyBub24tbnVsbCwgbm90IGVtcHR5LCBhbmQgY29udGFpbnMgb25seSBkaWdpdHMuCisgKi8KK2lubGluZSBjb25zdGV4cHIgYm9vbCBpc051bWVyaWMoY29uc3QgY2hhciAqcykKK3sKKyAgICBpZiAocyA9PSBudWxscHRyIHx8ICpzID09IDApIHJldHVybiBmYWxzZTsKKyAgICBkbyB7CisgICAgICAgIGlmICghaXNkaWdpdCgqcykpIHJldHVybiBmYWxzZTsKKyAgICB9IHdoaWxlICgqKytzICE9IDApOworICAgIHJldHVybiB0cnVlOyAgLy8gYWxsIGRpZ2l0cworfQorCisvKioKKyAqIEV4dHJhY3RzIG91dCB0aGUgcHJlZml4IGZyb20gdGhlIGtleSwgcmV0dXJuaW5nIGEgcGFpciBvZiBwcmVmaXgsIHN1ZmZpeC4KKyAqCisgKiBVc3VhbGx5IHRoZSBrZXkgaXMgc29tZXRoaW5nIGxpa2U6CisgKiBQcmVmaXguKElEKQorICogICB3aGVyZSBJRCBpcyBhbiBpbnRlZ2VyLAorICogICAgICAgICAgICAgICBvciAiZXJyb3IiIGlmIHRoZSBpZCB3YXMgbm90IHJldHVybmVkIGJlY2F1c2Ugb2YgZmFpbHVyZSwKKyAqICAgICAgICAgICAgICAgb3IgInN0YXR1cyIgaWYgZ2VuZXJhbCBzdGF0dXMuCisgKgorICogRXhhbXBsZTogYXVkaW8udHJhY2suMTAgICAgIC0+IHByZWZpeCA9IGF1ZGlvLnRyYWNrLCBzdWZmaXggPSAxMAorICogICAgICAgICAgYXVkaW8udHJhY2suZXJyb3IgIC0+IHByZWZpeCA9IGF1ZGlvLnRyYWNrLCBzdWZmaXggPSBlcnJvcgorICogICAgICAgICAgYXVkaW8udHJhY2suc3RhdHVzIC0+IHByZWZpeCA9IGF1ZGlvLnRyYWNrLCBzdWZmaXggPSBzdGF0dXMKKyAqICAgICAgICAgIGF1ZGlvLm11dGUgICAgICAgICAtPiBwcmVmaXggPSBhdWRpby5tdXRlLCAgc3VmZml4ID0gIiIKKyAqLworaW5saW5lIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZyAvKiBwcmVmaXggKi8sCisgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIC8qIHN1ZmZpeCAqLz4gc3BsaXRQcmVmaXhLZXkoY29uc3Qgc3RkOjpzdHJpbmcgJmtleSkKK3sKKyAgICBjb25zdCBzaXplX3Qgc3BsaXQgPSBrZXkucmZpbmQoJy4nKTsKKyAgICBjb25zdCBjaGFyKiBzdWZmaXggPSBrZXkuY19zdHIoKSArIHNwbGl0ICsgMTsKKyAgICBpZiAoKnN1ZmZpeCAmJiAoIXN0cmNtcChzdWZmaXgsICJlcnJvciIpIHx8ICFzdHJjbXAoc3VmZml4LCAic3RhdHVzIikgfHwgaXNOdW1lcmljKHN1ZmZpeCkpKSB7CisgICAgICAgIHJldHVybiB7IGtleS5zdWJzdHIoMCwgc3BsaXQpLCBzdWZmaXggfTsKKyAgICB9CisgICAgcmV0dXJuIHsga2V5LCAiIiB9OworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvVGltZU1hY2hpbmUuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvVGltZU1hY2hpbmUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL1RpbWVNYWNoaW5lLmgKcmVuYW1lIHRvIHNlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvVGltZU1hY2hpbmUuaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL1RpbWVkQWN0aW9uLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL1RpbWVkQWN0aW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL21lZGlhbWV0cmljcy9UaW1lZEFjdGlvbi5oCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL1RpbWVkQWN0aW9uLmgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9UcmFuc2FjdGlvbkxvZy5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9UcmFuc2FjdGlvbkxvZy5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIHNlcnZpY2VzL21lZGlhbWV0cmljcy9UcmFuc2FjdGlvbkxvZy5oCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL1RyYW5zYWN0aW9uTG9nLmgKaW5kZXggMGNhNDYzOS4uZmQ0MjUxOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL1RyYW5zYWN0aW9uTG9nLmgKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9UcmFuc2FjdGlvbkxvZy5oCkBAIC0xNTgsNyArMTU4LDcgQEAKICAgICAgICAgICAgICAgICArK2l0KSB7CiAgICAgICAgICAgICBpZiAobGwgPD0gMCkgYnJlYWs7CiAgICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGxwdHIgJiYgIXN0YXJ0c1dpdGgoaXQtPmZpcnN0LCBwcmVmaXgpKSBicmVhazsKLSAgICAgICAgICAgIGF1dG8gW3MsIGxdID0gZHVtcE1hcFRpbWVJdGVtKGl0LT5zZWNvbmQsIGxsIC0gMSwgc2luY2VOcywgcHJlZml4KTsKKyAgICAgICAgICAgIHN0ZDo6dGllKHMsIGwpID0gZHVtcE1hcFRpbWVJdGVtKGl0LT5zZWNvbmQsIGxsIC0gMSwgc2luY2VOcywgcHJlZml4KTsKICAgICAgICAgICAgIGlmIChsID09IDApIGNvbnRpbnVlOyAvLyBkb24ndCBzaG93IGVtcHR5IGdyb3VwcyAoZHVlIHRvIHNpbmNlTnMpLgogICAgICAgICAgICAgc3MgPDwgIiAiIDw8IGl0LT5maXJzdCA8PCAiXG4iIDw8IHM7CiAgICAgICAgICAgICBsbCAtPSBsICsgMTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvVmFsaWRhdGVJZC5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9WYWxpZGF0ZUlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2YjM5YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvVmFsaWRhdGVJZC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkxydVNldC5oIgorI2luY2x1ZGUgIlN0cmluZ1V0aWxzLmgiCisjaW5jbHVkZSAiV3JhcC5oIgorCituYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWFtZXRyaWNzIHsKKworLyoKKyAqIFZhbGlkYXRlSWQgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBsb2cgc2Vzc2lvbiBpZCBpcyBwcm9wZXJseSBmb3JtZWQKKyAqIGFuZCBoYXMgYmVlbiByZWdpc3RlcmVkIChpLmUuIGZyb20gdGhlIEphdmEgTWVkaWFNZXRyaWNzTWFuYWdlclNlcnZpY2UpLgorICoKKyAqIFRoZSBkZWZhdWx0IG1lbW9yeSB3aW5kb3cgdG8gdHJhY2sgcmVnaXN0ZXJlZCBpZHMgaXMgc2V0IHRvIFNJTkdMRVRPTl9MUlVfU0VUX1NJWkUuCisgKgorICogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkLXNhZmUsIGJ1dCB0aGUgc2luZ2xldG9uIHJldHVybmVkIGJ5IGdldCgpIHVzZXMgTG9ja1dyYXA8PgorICogdG8gZW5zdXJlIHRocmVhZC1zYWZldHkuCisgKi8KK2NsYXNzIFZhbGlkYXRlSWQgeworICAgIG1lZGlhbWV0cmljczo6THJ1U2V0PHN0ZDo6c3RyaW5nPiBtSWRTZXQ7CisgICAgc2l6ZV90IG1JbnZhbGlkSWRzID0gMDsgIC8vIGNvdW50IGludmFsaWQgaWRzIGVuY291bnRlcmVkLgorcHVibGljOgorICAgIC8qKiBDcmVhdGVzIGEgVmFsaWRhdGVJZCBvYmplY3Qgd2l0aCBzaXplIG1lbW9yeSB3aW5kb3cuICovCisgICAgZXhwbGljaXQgVmFsaWRhdGVJZChzaXplX3Qgc2l6ZSkgOiBtSWRTZXR7c2l6ZX0ge30KKworICAgIC8qKiBSZXR1cm5zIGEgc3RyaW5nIGR1bXAgb2YgcmVjZW50IGNvbnRlbnRzIGFuZCBzdGF0cy4gKi8KKyAgICBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgdGhlIGlkIHN0cmluZy4KKyAgICAgKgorICAgICAqIElmIGlkIHN0cmluZyBpcyBtYWxmb3JtZWQgKG5vdCAxNiBCYXNlNjRVcmwgY2hhcnMpLCBpdCBpcyBpZ25vcmVkLgorICAgICAqIE9uY2UgcmVnaXN0ZXJlZCwgY2FsbGluZyB2YWxpZGF0ZUlkKCkgd2lsbCByZXR1cm4gaWQgKGluc3RlYWQgb2YgdGhlIGVtcHR5IHN0cmluZykuCisgICAgICogVmFsaWRhdGVJZCBtYXkgImZvcmdldCIgdGhlIGlkIGFmdGVyIG5vdCBlbmNvdW50ZXJpbmcgaXQgd2l0aGluIHRoZSBwYXN0IE4gaWRzLAorICAgICAqIHdoZXJlIE4gaXMgdGhlIHNpemUgc2V0IGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIHBhcmFtIGlkIHN0cmluZyAoZnJvbSBNZWRpYU1ldHJpY3NNYW5hZ2VyU2VydmljZSkuCisgICAgICovCisgICAgdm9pZCByZWdpc3RlcklkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgaWQgc3RyaW5nIGlzIG1hbGZvcm1lZCAobm90IDE2IEJhc2U2NFVybCBjaGFycykKKyAgICAgKiBvciBpZiBpZCBzdHJpbmcgaGFzIG5vdCBiZWVuIHNlZW4gKGluIHRoZSByZWNlbnQgc2l6ZSBpZHMpOworICAgICAqIG90aGVyd2lzZSBpdCByZXR1cm5zIHRoZSBzYW1lIGlkIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpZCBzdHJpbmcgKHRvIGJlIHNlbnQgdG8gc3RhdHNkKS4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsaWRhdGVJZChjb25zdCBzdGQ6OnN0cmluZyYgaWQpOworCisgICAgLyoqIFNpbmdsZXRvbiBzZXQgc2l6ZSAqLworICAgIHN0YXRpYyBpbmxpbmUgY29uc3RleHByIHNpemVfdCBTSU5HTEVUT05fTFJVX1NFVF9TSVpFID0gMjAwMDsKKworICAgIHVzaW5nIExvY2tlZFZhbGlkYXRlSWQgPSBtZWRpYW1ldHJpY3M6OkxvY2tXcmFwPFZhbGlkYXRlSWQ+OworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzaW5nbGV0b24gbG9ja2VkIFZhbGlkYXRlSWQgb2JqZWN0IHRoYXQgaXMgdGhyZWFkLXNhZmUgdXNpbmcgTG9ja1dyYXA8Pi4KKyAgICAgKgorICAgICAqIFRoZSBTaW5nbGV0b24gVmFsaWRhdGVJZCBvYmplY3QgaXMgY3JlYXRlZCB3aXRoIHNpemUgTFJVX1NFVF9TSVpFIChkdXJpbmcgZmlyc3QgY2FsbCkuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBMb2NrZWRWYWxpZGF0ZUlkJiBnZXQoKSB7CisgICAgICAgIHN0YXRpYyBMb2NrZWRWYWxpZGF0ZUlkIHByaXZhdGVTZXR7U0lOR0xFVE9OX0xSVV9TRVRfU0laRX07CisgICAgICAgIHJldHVybiBwcml2YXRlU2V0OworICAgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhbWV0cmljcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL1dyYXAuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvV3JhcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvV3JhcC5oCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL1dyYXAuaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL2NsZWFuZXIuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhbWV0cmljc3NlcnZpY2UvY2xlYW5lci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvY2xlYW5lci5oCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL2NsZWFuZXIuaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL2lmYWNlX3N0YXRzZC5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWFtZXRyaWNzc2VydmljZS9pZmFjZV9zdGF0c2QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvbWVkaWFtZXRyaWNzL2lmYWNlX3N0YXRzZC5oCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYW1ldHJpY3NzZXJ2aWNlL2lmYWNlX3N0YXRzZC5oCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvbWFpbl9tZWRpYW1ldHJpY3MuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL21haW5fbWVkaWFtZXRyaWNzLmNwcAppbmRleCAzYTY2NTM4Li40NTVkNjdhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvbWFpbl9tZWRpYW1ldHJpY3MuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9tYWluX21lZGlhbWV0cmljcy5jcHAKQEAgLTE4LDExICsxOCwxMCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgotCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYW1ldHJpY3NzZXJ2aWNlL01lZGlhTWV0cmljc1NlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL0xpbWl0UHJvY2Vzc01lbW9yeS5oPgogCiBpbnQgbWFpbihpbnQgYXJnYyBfX3VudXNlZCwgY2hhciAqKmFyZ3YpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2F1ZGlvcmVjb3JkLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW9yZWNvcmQuY3BwCmluZGV4IDQxZWZjYWEuLmE3YjA0NWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW9yZWNvcmQuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW9yZWNvcmQuY3BwCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8c3RhdHNsb2cuaD4KIAogI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIKLSNpbmNsdWRlICJTdHJpbmdVdGlscy5oIgorI2luY2x1ZGUgIlZhbGlkYXRlSWQuaCIKICNpbmNsdWRlICJmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvbWVzc2FnZS9tZWRpYW1ldHJpY3NfbWVzc2FnZS5wYi5oIgogI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgogCkBAIC04MCwxNiArODAsMjAgQEAKICAgICB9CiAKICAgICBpbnQ2NF90IGNyZWF0ZWRfbWlsbGlzID0gLTE7CisgICAgLy8gbm90IGN1cnJlbnRseSBzZW50IGZyb20gY2xpZW50LgogICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5jcmVhdGVkTXMiLCAmY3JlYXRlZF9taWxsaXMpKSB7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NyZWF0ZWRfbWlsbGlzKGNyZWF0ZWRfbWlsbGlzKTsKICAgICB9CiAKICAgICBpbnQ2NF90IGR1cmF0aW9uX21pbGxpcyA9IC0xOwotICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5kdXJhdGlvbk1zIiwgJmR1cmF0aW9uX21pbGxpcykpIHsKKyAgICBkb3VibGUgZHVyYXRpb25NcyA9IDAuOworICAgIGlmIChpdGVtLT5nZXREb3VibGUoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZHVyYXRpb25NcyIsICZkdXJhdGlvbk1zKSkgeworICAgICAgICBkdXJhdGlvbl9taWxsaXMgPSAoaW50NjRfdClkdXJhdGlvbk1zOwogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9kdXJhdGlvbl9taWxsaXMoZHVyYXRpb25fbWlsbGlzKTsKICAgICB9CiAKICAgICBpbnQzMl90IGNvdW50ID0gLTE7CisgICAgLy8gbm90IGN1cnJlbnRseSBzZW50IGZyb20gY2xpZW50LiAgKHNlZSBzdGFydCBjb3VudCBpbnN0ZWFkKS4KICAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQubiIsICZjb3VudCkpIHsKICAgICAgICAgbWV0cmljc19wcm90by5zZXRfY291bnQoY291bnQpOwogICAgIH0KQEAgLTEyOSw3ICsxMzMsNyBAQAogICAgIH0KIAogICAgIGludDY0X3Qgc3RhcnRfY291bnQgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuc3RhcnRjb3VudCIsICZzdGFydF9jb3VudCkpIHsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuc3RhcnRDb3VudCIsICZzdGFydF9jb3VudCkpIHsKICAgICAgICAgbWV0cmljc19wcm90by5zZXRfc3RhcnRfY291bnQoc3RhcnRfY291bnQpOwogICAgIH0KIApAQCAtMTQzLDggKzE0Nyw3IEBACiAgICAgLy8gbG9nX3Nlc3Npb25faWQgKHN0cmluZykKICAgICBzdGQ6OnN0cmluZyBsb2dTZXNzaW9uSWQ7CiAgICAgKHZvaWQpaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmxvZ1Nlc3Npb25JZCIsICZsb2dTZXNzaW9uSWQpOwotICAgIGNvbnN0IGF1dG8gbG9nX3Nlc3Npb25faWQgPQotICAgICAgICAgICAgbWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6c2FuaXRpemVMb2dTZXNzaW9uSWQobG9nU2Vzc2lvbklkKTsKKyAgICBjb25zdCBhdXRvIGxvZ19zZXNzaW9uX2lkID0gbWVkaWFtZXRyaWNzOjpWYWxpZGF0ZUlkOjpnZXQoKS0+dmFsaWRhdGVJZChsb2dTZXNzaW9uSWQpOwogCiAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKICAgICBpbnQgcmVzdWx0ID0gYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPUkVDT1JEX1JFUE9SVEVELApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9hdWRpb3RyYWNrLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW90cmFjay5jcHAKaW5kZXggNTk2MjdhZS4uNjc1MTRlOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9hdWRpb3RyYWNrLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2F1ZGlvdHJhY2suY3BwCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8c3RhdHNsb2cuaD4KIAogI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIKLSNpbmNsdWRlICJTdHJpbmdVdGlscy5oIgorI2luY2x1ZGUgIlZhbGlkYXRlSWQuaCIKICNpbmNsdWRlICJmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvbWVzc2FnZS9tZWRpYW1ldHJpY3NfbWVzc2FnZS5wYi5oIgogI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgogCkBAIC01Niw1MiArNTYsNDcgQEAKICAgICAvLyBmbGVzaCBvdXQgdGhlIHByb3RvYnVmIHdlJ2xsIGhhbmQgb2ZmIHdpdGggb3VyIGRhdGEKICAgICAvLwogCi0gICAgLy8gc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrU3RyZWFtVHlwZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5zdHJlYW10eXBlIjsKKyAgICAvLyBEbyBub3QgY2hhbmdlIHRoaXMgd2l0aG91dCBjaGFuZ2luZyBBdWRpb1RyYWNrLmNwcCBjb2xsZWN0aW9uLgorCiAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHN0cmVhbVR5cGU7CiAgICAgc3RkOjpzdHJpbmcgc3RyZWFtX3R5cGU7CiAgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnN0cmVhbXR5cGUiLCAmc3RyZWFtX3R5cGUpKSB7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3N0cmVhbV90eXBlKHN0cmVhbV90eXBlKTsKICAgICB9CiAKLSAgICAvLyBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tDb250ZW50VHlwZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay50eXBlIjsKICAgICAvLyBvcHRpb25hbCBzdHJpbmcgY29udGVudFR5cGU7CiAgICAgc3RkOjpzdHJpbmcgY29udGVudF90eXBlOwogICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay50eXBlIiwgJmNvbnRlbnRfdHlwZSkpIHsKICAgICAgICAgbWV0cmljc19wcm90by5zZXRfY29udGVudF90eXBlKGNvbnRlbnRfdHlwZSk7CiAgICAgfQogCi0gICAgLy8gc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrVXNhZ2VbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudXNhZ2UiOwogICAgIC8vIG9wdGlvbmFsIHN0cmluZyB0cmFja1VzYWdlOwogICAgIHN0ZDo6c3RyaW5nIHRyYWNrX3VzYWdlOwogICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay51c2FnZSIsICZ0cmFja191c2FnZSkpIHsKICAgICAgICAgbWV0cmljc19wcm90by5zZXRfdHJhY2tfdXNhZ2UodHJhY2tfdXNhZ2UpOwogICAgIH0KIAotICAgIC8vIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1NhbXBsZVJhdGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suc2FtcGxlcmF0ZSI7Ci0gICAgLy8gb3B0aW9uYWwgaW50MzIgc2FtcGxlcmF0ZTsKKyAgICAvLyBvcHRpb25hbCBpbnQzMiBzYW1wbGVSYXRlOwogICAgIGludDMyX3Qgc2FtcGxlX3JhdGUgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5zYW1wbGVyYXRlIiwgJnNhbXBsZV9yYXRlKSkgeworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnNhbXBsZVJhdGUiLCAmc2FtcGxlX3JhdGUpKSB7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3NhbXBsZV9yYXRlKHNhbXBsZV9yYXRlKTsKICAgICB9CiAKLSAgICAvLyBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tDaGFubmVsTWFza1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5jaGFubmVsbWFzayI7CiAgICAgLy8gb3B0aW9uYWwgaW50NjQgY2hhbm5lbE1hc2s7CiAgICAgaW50NjRfdCBjaGFubmVsX21hc2sgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5jaGFubmVsbWFzayIsICZjaGFubmVsX21hc2spKSB7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suY2hhbm5lbE1hc2siLCAmY2hhbm5lbF9tYXNrKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jaGFubmVsX21hc2soY2hhbm5lbF9tYXNrKTsKICAgICB9CiAKLSAgICAvLyBOQjogVGhlc2UgYXJlIG5vdCB5ZXQgZXhwb3NlZCBhcyBwdWJsaWMgSmF2YSBBUEkgY29uc3RhbnRzLgotICAgIC8vIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1VuZGVycnVuRnJhbWVzW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnVuZGVycnVuZnJhbWVzIjsKLSAgICAvLyBvcHRpb25hbCBpbnQzMiB1bmRlcnJ1bmZyYW1lczsKKyAgICAvLyBvcHRpb25hbCBpbnQzMiB1bmRlcnJ1bkZyYW1lczsKICAgICBpbnQzMl90IHVuZGVycnVuX2ZyYW1lcyA9IC0xOwotICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnVuZGVycnVuZnJhbWVzIiwgJnVuZGVycnVuX2ZyYW1lcykpIHsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay51bmRlcnJ1bkZyYW1lcyIsICZ1bmRlcnJ1bl9mcmFtZXMpKSB7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3VuZGVycnVuX2ZyYW1lcyh1bmRlcnJ1bl9mcmFtZXMpOwogICAgIH0KIAotICAgIC8vIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1N0YXJ0dXBHbGl0Y2hbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suZ2xpdGNoLnN0YXJ0dXAiOwotICAgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0dXBnbGl0Y2g7CisgICAgLy8gb3B0aW9uYWwgaW50MzIgZ2xpdGNoLnN0YXJ0dXA7CiAgICAgaW50MzJfdCBzdGFydHVwX2dsaXRjaCA9IC0xOworICAgIC8vIE5vdCBjdXJyZW50bHkgc2VudCBmcm9tIGNsaWVudC4KICAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5nbGl0Y2guc3RhcnR1cCIsICZzdGFydHVwX2dsaXRjaCkpIHsKICAgICAgICAgbWV0cmljc19wcm90by5zZXRfc3RhcnR1cF9nbGl0Y2goc3RhcnR1cF9nbGl0Y2gpOwogICAgIH0KQEAgLTEzNyw4ICsxMzIsNyBAQAogICAgIC8vIGxvZ19zZXNzaW9uX2lkIChzdHJpbmcpCiAgICAgc3RkOjpzdHJpbmcgbG9nU2Vzc2lvbklkOwogICAgICh2b2lkKWl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmxvZ1Nlc3Npb25JZCIsICZsb2dTZXNzaW9uSWQpOwotICAgIGNvbnN0IGF1dG8gbG9nX3Nlc3Npb25faWQgPQotICAgICAgICAgICAgbWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6c2FuaXRpemVMb2dTZXNzaW9uSWQobG9nU2Vzc2lvbklkKTsKKyAgICBjb25zdCBhdXRvIGxvZ19zZXNzaW9uX2lkID0gbWVkaWFtZXRyaWNzOjpWYWxpZGF0ZUlkOjpnZXQoKS0+dmFsaWRhdGVJZChsb2dTZXNzaW9uSWQpOwogCiAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKICAgICBpbnQgcmVzdWx0ID0gYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPVFJBQ0tfUkVQT1JURUQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2NvZGVjLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfY29kZWMuY3BwCmluZGV4IDQ2Y2JkYzguLmE3MzdiYTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfY29kZWMuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfY29kZWMuY3BwCkBAIC0zNCw3ICszNCw3IEBACiAKICNpbmNsdWRlICJjbGVhbmVyLmgiCiAjaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgotI2luY2x1ZGUgIlN0cmluZ1V0aWxzLmgiCisjaW5jbHVkZSAiVmFsaWRhdGVJZC5oIgogI2luY2x1ZGUgImZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9tZXNzYWdlL21lZGlhbWV0cmljc19tZXNzYWdlLnBiLmgiCiAjaW5jbHVkZSAiaWZhY2Vfc3RhdHNkLmgiCiAKQEAgLTIyOCwxMCArMjI4LDEwIEBACiAKICAgICBzdGQ6OnN0cmluZyBzZXNzaW9uSWQ7CiAgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxvZy1zZXNzaW9uLWlkIiwgJnNlc3Npb25JZCkpIHsKLSAgICAgICAgc2Vzc2lvbklkID0gbWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6c2FuaXRpemVMb2dTZXNzaW9uSWQoc2Vzc2lvbklkKTsKKyAgICAgICAgc2Vzc2lvbklkID0gbWVkaWFtZXRyaWNzOjpWYWxpZGF0ZUlkOjpnZXQoKS0+dmFsaWRhdGVJZChzZXNzaW9uSWQpOwogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sb2dfc2Vzc2lvbl9pZChzZXNzaW9uSWQpOwogICAgIH0KLSAgICBBU3RhdHNFdmVudF93cml0ZVN0cmluZyhldmVudCwgY29kZWMuY19zdHIoKSk7CisgICAgQVN0YXRzRXZlbnRfd3JpdGVTdHJpbmcoZXZlbnQsIHNlc3Npb25JZC5jX3N0cigpKTsKIAogICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gLTE7CiAgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY2hhbm5lbENvdW50IiwgJmNoYW5uZWxDb3VudCkpIHsKQEAgLTM5MCw2ICszOTAsNjAgQEAKICAgICB9CiAgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgcXBCTWF4T3JpKTsKIAorICAgIGludDMyX3QgY29uZmlnQ29sb3JTdGFuZGFyZCA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNvbmZpZy1jb2xvci1zdGFuZGFyZCIsICZjb25maWdDb2xvclN0YW5kYXJkKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jb25maWdfY29sb3Jfc3RhbmRhcmQoY29uZmlnQ29sb3JTdGFuZGFyZCk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIGNvbmZpZ0NvbG9yU3RhbmRhcmQpOworCisgICAgaW50MzJfdCBjb25maWdDb2xvclJhbmdlID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY29uZmlnLWNvbG9yLXJhbmdlIiwgJmNvbmZpZ0NvbG9yUmFuZ2UpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NvbmZpZ19jb2xvcl9yYW5nZShjb25maWdDb2xvclJhbmdlKTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgY29uZmlnQ29sb3JSYW5nZSk7CisKKyAgICBpbnQzMl90IGNvbmZpZ0NvbG9yVHJhbnNmZXIgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jb25maWctY29sb3ItdHJhbnNmZXIiLCAmY29uZmlnQ29sb3JUcmFuc2ZlcikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfY29uZmlnX2NvbG9yX3RyYW5zZmVyKGNvbmZpZ0NvbG9yVHJhbnNmZXIpOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBjb25maWdDb2xvclRyYW5zZmVyKTsKKworICAgIGludDMyX3QgcGFyc2VkQ29sb3JTdGFuZGFyZCA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnBhcnNlZC1jb2xvci1zdGFuZGFyZCIsICZwYXJzZWRDb2xvclN0YW5kYXJkKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9wYXJzZWRfY29sb3Jfc3RhbmRhcmQocGFyc2VkQ29sb3JTdGFuZGFyZCk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIHBhcnNlZENvbG9yU3RhbmRhcmQpOworCisgICAgaW50MzJfdCBwYXJzZWRDb2xvclJhbmdlID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucGFyc2VkLWNvbG9yLXJhbmdlIiwgJnBhcnNlZENvbG9yUmFuZ2UpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3BhcnNlZF9jb2xvcl9yYW5nZShwYXJzZWRDb2xvclJhbmdlKTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgcGFyc2VkQ29sb3JSYW5nZSk7CisKKyAgICBpbnQzMl90IHBhcnNlZENvbG9yVHJhbnNmZXIgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5wYXJzZWQtY29sb3ItdHJhbnNmZXIiLCAmcGFyc2VkQ29sb3JUcmFuc2ZlcikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcGFyc2VkX2NvbG9yX3RyYW5zZmVyKHBhcnNlZENvbG9yVHJhbnNmZXIpOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBwYXJzZWRDb2xvclRyYW5zZmVyKTsKKworICAgIGludDMyX3QgaGRyU3RhdGljSW5mbyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmhkci1zdGF0aWMtaW5mbyIsICZoZHJTdGF0aWNJbmZvKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9oZHJfc3RhdGljX2luZm8oaGRyU3RhdGljSW5mbyk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIGhkclN0YXRpY0luZm8pOworCisgICAgaW50MzJfdCBoZHIxMFBsdXNJbmZvID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuaGRyMTAtcGx1cy1pbmZvIiwgJmhkcjEwUGx1c0luZm8pKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2hkcjEwX3BsdXNfaW5mbyhoZHIxMFBsdXNJbmZvKTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgaGRyMTBQbHVzSW5mbyk7CisKKyAgICBpbnQzMl90IGhkckZvcm1hdD0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuaGRyLWZvcm1hdCIsICZoZHJGb3JtYXQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2hkcl9mb3JtYXQoaGRyRm9ybWF0KTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgaGRyRm9ybWF0KTsKKwogICAgIGludCBlcnIgPSBBU3RhdHNFdmVudF93cml0ZShldmVudCk7CiAgICAgaWYgKGVyciA8IDApIHsKICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gd3JpdGUgY29kZWMgbWV0cmljcyB0byBzdGF0c2QgKCVkKSIsIGVycik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2RybS5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2RybS5jcHAKaW5kZXggMjg3ZmI4ZC4uZTA2YTYwNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9kcm0uY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfZHJtLmNwcApAQCAtMTcxLDcgKzE3MSw3IEBACiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmKHN0ci5sZW5ndGgoKSAvIDQgKiAzLCAwKTsKICAgICBzaXplX3Qgc2l6ZSA9IGJ1Zi5zaXplKCk7CiAgICAgaWYgKGRlY29kZUJhc2U2NChidWYuZGF0YSgpLCAmc2l6ZSwgc3RyLmNfc3RyKCkpICYmIHNpemUgPD0gYnVmLnNpemUoKSkgewotICAgICAgICBidWYuZXJhc2UoYnVmLmJlZ2luKCkgKyBzaXplLCBidWYuZW5kKCkpOworICAgICAgICBidWYuZXJhc2UoYnVmLmJlZ2luKCkgKyAocHRyZGlmZl90KXNpemUsIGJ1Zi5lbmQoKSk7CiAgICAgICAgIHJldHVybiBidWY7CiAgICAgfQogICAgIHJldHVybiB7fTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfZXh0cmFjdG9yLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfZXh0cmFjdG9yLmNwcAppbmRleCBiY2YyZTBhLi5hOGJmZWFhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2V4dHJhY3Rvci5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9leHRyYWN0b3IuY3BwCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8c3RhdHNsb2cuaD4KIAogI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIKLSNpbmNsdWRlICJTdHJpbmdVdGlscy5oIgorI2luY2x1ZGUgIlZhbGlkYXRlSWQuaCIKICNpbmNsdWRlICJmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvbWVzc2FnZS9tZWRpYW1ldHJpY3NfbWVzc2FnZS5wYi5oIgogI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgogCkBAIC04Niw3ICs4Niw3IEBACiAKICAgICBzdGQ6OnN0cmluZyBsb2dfc2Vzc2lvbl9pZDsKICAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLmxvZ1Nlc3Npb25JZCIsICZsb2dfc2Vzc2lvbl9pZCkpIHsKLSAgICAgICAgbG9nX3Nlc3Npb25faWQgPSBtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjpzYW5pdGl6ZUxvZ1Nlc3Npb25JZChsb2dfc2Vzc2lvbl9pZCk7CisgICAgICAgIGxvZ19zZXNzaW9uX2lkID0gbWVkaWFtZXRyaWNzOjpWYWxpZGF0ZUlkOjpnZXQoKS0+dmFsaWRhdGVJZChsb2dfc2Vzc2lvbl9pZCk7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2xvZ19zZXNzaW9uX2lkKGxvZ19zZXNzaW9uX2lkKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfbWVkaWFwYXJzZXIuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9tZWRpYXBhcnNlci5jcHAKaW5kZXggOTIxYjMyMC4uNjdjYTg3NGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfbWVkaWFwYXJzZXIuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfbWVkaWFwYXJzZXIuY3BwCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8c3RhdHNsb2cuaD4KIAogI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIKLSNpbmNsdWRlICJTdHJpbmdVdGlscy5oIgorI2luY2x1ZGUgIlZhbGlkYXRlSWQuaCIKICNpbmNsdWRlICJmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvZW51bXMvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgogI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgogCkBAIC04MSw3ICs4MSw3IEBACiAKICAgICBzdGQ6OnN0cmluZyBsb2dTZXNzaW9uSWQ7CiAgICAgaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGFyc2VyLmxvZ1Nlc3Npb25JZCIsICZsb2dTZXNzaW9uSWQpOwotICAgIGxvZ1Nlc3Npb25JZCA9IG1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OnNhbml0aXplTG9nU2Vzc2lvbklkKGxvZ1Nlc3Npb25JZCk7CisgICAgbG9nU2Vzc2lvbklkID0gbWVkaWFtZXRyaWNzOjpWYWxpZGF0ZUlkOjpnZXQoKS0+dmFsaWRhdGVJZChsb2dTZXNzaW9uSWQpOwogCiAgICAgaW50IHJlc3VsdCA9IGFuZHJvaWQ6OnV0aWw6OnN0YXRzX3dyaXRlKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19NRURJQVBBUlNFUl9SRVBPUlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBfbmFub3MsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX3JlY29yZGVyLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfcmVjb3JkZXIuY3BwCmluZGV4IGIyOWFkNzMuLjVmNTRhNjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfcmVjb3JkZXIuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfcmVjb3JkZXIuY3BwCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8c3RhdHNsb2cuaD4KIAogI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIKLSNpbmNsdWRlICJTdHJpbmdVdGlscy5oIgorI2luY2x1ZGUgIlZhbGlkYXRlSWQuaCIKICNpbmNsdWRlICJmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvbWVzc2FnZS9tZWRpYW1ldHJpY3NfbWVzc2FnZS5wYi5oIgogI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgogCkBAIC01OSw3ICs1OSw3IEBACiAgICAgLy8gc3RyaW5nIGtSZWNvcmRlckxvZ1Nlc3Npb25JZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIubG9nLXNlc3Npb24taWQiOwogICAgIHN0ZDo6c3RyaW5nIGxvZ19zZXNzaW9uX2lkOwogICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5sb2ctc2Vzc2lvbi1pZCIsICZsb2dfc2Vzc2lvbl9pZCkpIHsKLSAgICAgICAgbG9nX3Nlc3Npb25faWQgPSBtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjpzYW5pdGl6ZUxvZ1Nlc3Npb25JZChsb2dfc2Vzc2lvbl9pZCk7CisgICAgICAgIGxvZ19zZXNzaW9uX2lkID0gbWVkaWFtZXRyaWNzOjpWYWxpZGF0ZUlkOjpnZXQoKS0+dmFsaWRhdGVJZChsb2dfc2Vzc2lvbl9pZCk7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2xvZ19zZXNzaW9uX2lkKGxvZ19zZXNzaW9uX2lkKTsKICAgICB9CiAgICAgLy8gc3RyaW5nIGtSZWNvcmRlckF1ZGlvTWltZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8ubWltZSI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvdGVzdHMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDNiYWY3MzkuLmY0NmZiYWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zMyw2ICszMyw3IEBACiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgIm1lZGlhbWV0cmljc3NlcnZpY2UtYWlkbC1jcHAiLAorICAgICAgICAicGFja2FnZW1hbmFnZXJfYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3Rlc3RzL21lZGlhbWV0cmljc190ZXN0cy5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvdGVzdHMvbWVkaWFtZXRyaWNzX3Rlc3RzLmNwcAppbmRleCAyMzM2ZDZmLi5iYzdiNDdiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvdGVzdHMvbWVkaWFtZXRyaWNzX3Rlc3RzLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvdGVzdHMvbWVkaWFtZXRyaWNzX3Rlc3RzLmNwcApAQCAtMTcsMTggKzE3LDE4IEBACiAjZGVmaW5lIExPR19UQUcgIm1lZGlhbWV0cmljc190ZXN0cyIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhbWV0cmljc3NlcnZpY2UvQXVkaW9UeXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhbWV0cmljc3NlcnZpY2UvTWVkaWFNZXRyaWNzU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhbWV0cmljc3NlcnZpY2UvU3RyaW5nVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYW1ldHJpY3NzZXJ2aWNlL1ZhbGlkYXRlSWQuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAotI2luY2x1ZGUgIkF1ZGlvVHlwZXMuaCIKLSNpbmNsdWRlICJTdHJpbmdVdGlscy5oIgotCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogc3RhdGljIHNpemVfdCBjb3VudE5ld2xpbmVzKGNvbnN0IGNoYXIgKnMpIHsKQEAgLTExMjcsMyArMTEyNywxNjkgQEAKICAgIHZhbGlkSWQyWzNdID0gJyEnOwogICAgQVNTRVJUX0VRKCIiLCBtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjpzYW5pdGl6ZUxvZ1Nlc3Npb25JZCh2YWxpZElkMikpOwogfQorCitURVNUKG1lZGlhbWV0cmljc190ZXN0cywgTHJ1U2V0KSB7CisgICAgY29uc3RleHByIHNpemVfdCBMUlVfU0VUX1NJWkUgPSAyOworICAgIG1lZGlhbWV0cmljczo6THJ1U2V0PHN0ZDo6c3RyaW5nPiBscnVTZXQoTFJVX1NFVF9TSVpFKTsKKworICAgIC8vIHRlc3QgYWRkaW5nIGEgY291cGxlIHN0cmluZ3MuCisgICAgbHJ1U2V0LmFkZCgiYWJjIik7CisgICAgQVNTRVJUX0VRKDF1LCBscnVTZXQuc2l6ZSgpKTsKKyAgICBBU1NFUlRfVFJVRShscnVTZXQuY2hlY2soImFiYyIpKTsKKyAgICBscnVTZXQuYWRkKCJkZWYiKTsKKyAgICBBU1NFUlRfRVEoMnUsIGxydVNldC5zaXplKCkpOworCisgICAgLy8gbm93IGFkZGluZyB0aGUgdGhpcmQgc3RyaW5nIGNhdXNlcyBldmljdGlvbiBvZiB0aGUgb2xkZXN0LgorICAgIGxydVNldC5hZGQoImdoaSIpOworICAgIEFTU0VSVF9GQUxTRShscnVTZXQuY2hlY2soImFiYyIpKTsKKyAgICBBU1NFUlRfVFJVRShscnVTZXQuY2hlY2soImdoaSIpKTsKKyAgICBBU1NFUlRfVFJVRShscnVTZXQuY2hlY2soImRlZiIpKTsgIC8vICJkZWYiIGlzIG1vc3QgcmVjZW50LgorICAgIEFTU0VSVF9FUSgydSwgbHJ1U2V0LnNpemUoKSk7ICAgICAgLy8gImFiYyIgaXMgY29ycmVjdGx5IGRpc2NhcmRlZC4KKworICAgIC8vIGFkZGluZyBhbm90aGVyIHN0cmluZyB3aWxsIGV2aWN0IHRoZSBvbGRlc3QuCisgICAgbHJ1U2V0LmFkZCgiZm9vIik7CisgICAgQVNTRVJUX0ZBTFNFKGxydVNldC5jaGVjaygiZ2hpIikpOyAvLyBub3RlOiAiZ2hpIiBkaXNjYXJkZWQgd2hlbiAiZm9vIiBhZGRlZC4KKyAgICBBU1NFUlRfVFJVRShscnVTZXQuY2hlY2soImZvbyIpKTsKKyAgICBBU1NFUlRfVFJVRShscnVTZXQuY2hlY2soImRlZiIpKTsKKworICAgIC8vIG1hbnVhbCByZW1vdmluZyBvZiBhIHN0cmluZyB3b3JrcywgdG9vLgorICAgIEFTU0VSVF9UUlVFKGxydVNldC5yZW1vdmUoImRlZiIpKTsKKyAgICBBU1NFUlRfRkFMU0UobHJ1U2V0LmNoZWNrKCJkZWYiKSk7IC8vIHdlIG1hbnVhbGx5IHJlbW92ZWQgImRlZiIuCisgICAgQVNTRVJUX1RSVUUobHJ1U2V0LmNoZWNrKCJmb28iKSk7ICAvLyAiZm9vIiBpcyBzdGlsbCB0aGVyZS4KKyAgICBBU1NFUlRfRVEoMXUsIGxydVNldC5zaXplKCkpOworCisgICAgLy8geW91IGNhbid0IHJlbW92ZSBhIHN0cmluZyB0aGF0IGhhcyBub3QgYmVlbiBhZGRlZC4KKyAgICBBU1NFUlRfRkFMU0UobHJ1U2V0LnJlbW92ZSgiYmFyIikpOyAvLyBOb3RlOiAiYmFyIiBkb2Vzbid0IGV4aXN0LCBzbyByZW1vdmUgcmV0dXJucyBmYWxzZS4KKyAgICBBU1NFUlRfRVEoMXUsIGxydVNldC5zaXplKCkpOworCisgICAgbHJ1U2V0LmFkZCgiZm9vIik7ICAgLy8gYWRkaW5nICJmb28iICh3aGljaCBhbHJlYWR5IGV4aXN0cykgZG9lc24ndCBjaGFuZ2Ugc2l6ZS4KKyAgICBBU1NFUlRfRVEoMXUsIGxydVNldC5zaXplKCkpOworICAgIGxydVNldC5hZGQoImJhciIpOyAgIC8vIGFkZCAiYmFyIgorICAgIEFTU0VSVF9FUSgydSwgbHJ1U2V0LnNpemUoKSk7CisgICAgbHJ1U2V0LmFkZCgiZ2xvcnAiKTsgLy8gYWRkICJnbG9ycCIgZXZpY3RzICJmb28iLgorICAgIEFTU0VSVF9FUSgydSwgbHJ1U2V0LnNpemUoKSk7CisgICAgQVNTRVJUX1RSVUUobHJ1U2V0LmNoZWNrKCJiYXIiKSk7CisgICAgQVNTRVJUX1RSVUUobHJ1U2V0LmNoZWNrKCJnbG9ycCIpKTsKKyAgICBBU1NFUlRfRkFMU0UobHJ1U2V0LmNoZWNrKCJmb28iKSk7Cit9CisKK1RFU1QobWVkaWFtZXRyaWNzX3Rlc3RzLCBMcnVTZXQwKSB7CisgICAgY29uc3RleHByIHNpemVfdCBMUlVfU0VUX1NJWkUgPSAwOworICAgIG1lZGlhbWV0cmljczo6THJ1U2V0PHN0ZDo6c3RyaW5nPiBscnVTZXQoTFJVX1NFVF9TSVpFKTsKKworICAgIGxydVNldC5hZGQoImEiKTsKKyAgICBBU1NFUlRfRVEoMHUsIGxydVNldC5zaXplKCkpOworICAgIEFTU0VSVF9GQUxTRShscnVTZXQuY2hlY2soImEiKSk7CisgICAgQVNTRVJUX0ZBTFNFKGxydVNldC5yZW1vdmUoImEiKSk7IC8vIG5ldmVyIGFkZGVkLgorICAgIEFTU0VSVF9FUSgwdSwgbHJ1U2V0LnNpemUoKSk7Cit9CisKKy8vIFJldHVybnMgYSAxNiBCYXNlNjRVcmwgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZQorLy8gKHdpdGggbGVhZGluZyAwcykgZS5nLiAwMDAwMDAwMDAwMDAwMDAwLCAwMDAwMDAwMDAwMDAwMDAxLCAwMDAwMDAwMDAwMDAwMDAyLCAuLi4KK3N0YXRpYyBzdGQ6OnN0cmluZyBnZW5lcmF0ZUlkKHNpemVfdCB2YWx1ZSkKK3sKKyAgICBjaGFyIGlkWzE2ICsgMV07IC8vIHRvIGJlIGZpbGxlZCB3aXRoIDE2IEJhc2U2NFVybCBjaGFycyAoYW5kIHplcm8gdGVybWluYXRpb24pCisgICAgY2hhciAqc3B0ciA9IGlkICsgMTY7IC8vIHN0YXJ0IGF0IHRoZSBlbmQuCisgICAgKnNwdHItLSA9IDA7IC8vIHplcm8gdGVybWluYXRlLgorICAgIC8vIG91dHB1dCB0aGUgZGlnaXRzIGZyb20gbGVhc3Qgc2lnbmlmaWNhbnQgdG8gbW9zdCBzaWduaWZpY2FudC4KKyAgICB3aGlsZSAodmFsdWUpIHsKKyAgICAgICAgKnNwdHItLSA9IHZhbHVlICUgMTA7CisgICAgICAgIHZhbHVlIC89IDEwOworICAgIH0KKyAgICAvLyBhZGQgbGVhZGluZyAwJ3MKKyAgICB3aGlsZSAoc3B0ciA+IGlkKSB7CisgICAgICAgICpzcHRyLS0gPSAnMCc7CisgICAgfQorICAgIHJldHVybiBzdGQ6OnN0cmluZyhpZCk7Cit9CisKK1RFU1QobWVkaWFtZXRyaWNzX3Rlc3RzLCBWYWxpZGF0ZUlkKSB7CisgICAgY29uc3RleHByIHNpemVfdCBMUlVfU0VUX1NJWkUgPSAzOworICAgIGNvbnN0ZXhwciBzaXplX3QgSURTID0gMTA7CisgICAgc3RhdGljX2Fzc2VydChJRFMgPiBMUlVfU0VUX1NJWkUpOyAgLy8gSURTIG11c3QgYmUgZ3JlYXRlciB0aGFuIExSVV9TRVRfU0laRS4KKyAgICBtZWRpYW1ldHJpY3M6OlZhbGlkYXRlSWQgdmFsaWRhdGVJZChMUlVfU0VUX1NJWkUpOworCisKKyAgICAvLyByZWdpc3RlciBJRHMgYXMgaW50ZWdlciBzdHJpbmdzIGNvdW50aW5nIGZyb20gMC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IElEUzsgKytpKSB7CisgICAgICAgIHZhbGlkYXRlSWQucmVnaXN0ZXJJZChnZW5lcmF0ZUlkKGkpKTsKKyAgICB9CisKKyAgICAvLyBvbmx5IHRoZSBsYXN0IExSVV9TRVRfU0laRSBleGlzdC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IElEUyAtIExSVV9TRVRfU0laRTsgKytpKSB7CisgICAgICAgIEFTU0VSVF9FUSgiIiwgdmFsaWRhdGVJZC52YWxpZGF0ZUlkKGdlbmVyYXRlSWQoaSkpKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IElEUyAtIExSVV9TRVRfU0laRTsgaSA8IElEUzsgKytpKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGlkID0gZ2VuZXJhdGVJZChpKTsKKyAgICAgICAgQVNTRVJUX0VRKGlkLCB2YWxpZGF0ZUlkLnZhbGlkYXRlSWQoaWQpKTsKKyAgICB9Cit9CisKK1RFU1QobWVkaWFtZXRyaWNzX3Rlc3RzLCBTdGF0dXNDb252ZXJzaW9uKSB7CisgICAgY29uc3RleHByIHN0YXR1c190IHN0YXR1c2VzW10gPSB7CisgICAgICAgIE5PX0VSUk9SLAorICAgICAgICBCQURfVkFMVUUsCisgICAgICAgIERFQURfT0JKRUNULAorICAgICAgICBOT19NRU1PUlksCisgICAgICAgIFBFUk1JU1NJT05fREVOSUVELAorICAgICAgICBJTlZBTElEX09QRVJBVElPTiwKKyAgICAgICAgV09VTERfQkxPQ0ssCisgICAgICAgIFVOS05PV05fRVJST1IsCisgICAgfTsKKworICAgIGF1dG8gcm91bmRUcmlwID0gW10oc3RhdHVzX3Qgc3RhdHVzKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjptZWRpYW1ldHJpY3M6OnN0YXR1c1N0cmluZ1RvU3RhdHVzKAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6c3RhdHVzVG9TdGF0dXNTdHJpbmcoc3RhdHVzKSk7CisgICAgfTsKKworICAgIC8vIFByaW1hcnkgc3RhdHVzIGVycm9yIGNhdGVnb3JpZXMuCisgICAgZm9yIChjb25zdCBhdXRvIHN0YXR1cyA6IHN0YXR1c2VzKSB7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIHJvdW5kVHJpcChzdGF0dXMpKTsKKyAgICB9CisKKyAgICAvLyBTdGF0dXMgZXJyb3JzIHNwZWNpYWxseSBjb25zaWRlcmVkLgorICAgIEFTU0VSVF9FUShERUFEX09CSkVDVCwgcm91bmRUcmlwKEZBSUxFRF9UUkFOU0FDVElPTikpOworfQorCitURVNUKG1lZGlhbWV0cmljc190ZXN0cywgSGVhdE1hcCkgeworICAgIGNvbnN0ZXhwciBzaXplX3QgU0laRSA9IDI7CisgICAgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpIZWF0TWFwIGhlYXRNYXB7U0laRX07CisgICAgY29uc3RleHByIHVpZF90IFVJRCA9IDA7CisgICAgY29uc3RleHByIGludDMyX3QgU1VCQ09ERSA9IDE7CisKKyAgICBBU1NFUlRfRVEoKHNpemVfdCkwLCBoZWF0TWFwLnNpemUoKSk7CisgICAgaGVhdE1hcC5hZGQoInNvbWVLZXkiLCAic29tZVN1ZmZpeCIsICJzb21lRXZlbnQiLAorICAgICAgICAgICAgQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9PSywgVUlELCAibWVzc2FnZSIsIFNVQkNPREUpOworICAgIEFTU0VSVF9FUSgoc2l6ZV90KTEsIGhlYXRNYXAuc2l6ZSgpKTsKKyAgICBoZWF0TWFwLmFkZCgic29tZUtleSIsICJzb21lU3VmZml4IiwgInNvbWVFdmVudCIsCisgICAgICAgICAgICBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX09LLCBVSUQsICJtZXNzYWdlIiwgU1VCQ09ERSk7CisgICAgaGVhdE1hcC5hZGQoInNvbWVLZXkiLCAic29tZVN1ZmZpeCIsICJhbm90aGVyRXZlbnQiLAorICAgICAgICAgICAgQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9BUkdVTUVOVCwgVUlELCAibWVzc2FnZSIsIFNVQkNPREUpOworICAgIEFTU0VSVF9FUSgoc2l6ZV90KTEsIGhlYXRNYXAuc2l6ZSgpKTsKKyAgICBoZWF0TWFwLmFkZCgiYW5vdGhlcktleSIsICJzb21lU3VmZml4IiwgInNvbWVFdmVudCIsCisgICAgICAgICAgICBBTUVESUFNRVRSSUNTX1BST1BfU1RBVFVTX1ZBTFVFX09LLCBVSUQsICJtZXNzYWdlIiwgU1VCQ09ERSk7CisgICAgQVNTRVJUX0VRKChzaXplX3QpMiwgaGVhdE1hcC5zaXplKCkpOworICAgIEFTU0VSVF9FUSgoc2l6ZV90KTAsIGhlYXRNYXAucmVqZWN0ZWQoKSk7CisKKyAgICBoZWF0TWFwLmFkZCgidGhpcmRLZXkiLCAic29tZVN1ZmZpeCIsICJzb21lRXZlbnQiLAorICAgICAgICAgICAgQU1FRElBTUVUUklDU19QUk9QX1NUQVRVU19WQUxVRV9PSywgVUlELCAibWVzc2FnZSIsIFNVQkNPREUpOworICAgIEFTU0VSVF9FUSgoc2l6ZV90KTIsIGhlYXRNYXAuc2l6ZSgpKTsKKyAgICBBU1NFUlRfRVEoKHNpemVfdCkxLCBoZWF0TWFwLnJlamVjdGVkKCkpOworCisgICAgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpIZWF0RGF0YSBoZWF0RGF0YSA9IGhlYXRNYXAuZ2V0RGF0YSgic29tZUtleSIpOworICAgIEFTU0VSVF9FUSgoc2l6ZV90KTIsIGhlYXREYXRhLnNpemUoKSk7CisgICAgYXV0byBjb3VudCA9IGhlYXREYXRhLmhlYXRDb3VudCgpOworICAgIEFTU0VSVF9FUSgoc2l6ZV90KTMsIGNvdW50LnNpemUoKSk7IC8vIHBhaXJzIGluIG9yZGVyIHsgdG90YWwsICJhbm90aGVyRXZlbnQiLCAic29tZUV2ZW50IiB9CisgICAgLy8gY2hlY2sgdG90YWwgdmFsdWUKKyAgICBBU1NFUlRfRVEoKHNpemVfdCkyLCBjb3VudFswXS5maXJzdCk7ICAvLyBPSworICAgIEFTU0VSVF9FUSgoc2l6ZV90KTEsIGNvdW50WzBdLnNlY29uZCk7IC8vIEVSUk9SOworICAgIC8vIGZpcnN0IGtleSAiYW5vdGhlckV2ZW50IgorICAgIEFTU0VSVF9FUSgoc2l6ZV90KTAsIGNvdW50WzFdLmZpcnN0KTsgIC8vIE9LCisgICAgQVNTRVJUX0VRKChzaXplX3QpMSwgY291bnRbMV0uc2Vjb25kKTsgLy8gRVJST1I7CisgICAgLy8gc2Vjb25kIGtleSAic29tZUV2ZW50IgorICAgIEFTU0VSVF9FUSgoc2l6ZV90KTIsIGNvdW50WzJdLmZpcnN0KTsgIC8vIE9LCisgICAgQVNTRVJUX0VRKChzaXplX3QpMCwgY291bnRbMl0uc2Vjb25kKTsgLy8gRVJST1I7CisKKyAgICBoZWF0TWFwLmNsZWFyKCk7CisgICAgQVNTRVJUX0VRKChzaXplX3QpMCwgaGVhdE1hcC5zaXplKCkpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAKaW5kZXggZjMxMjAyYi4uNWQ4MDc0NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwCkBAIC05MCw3ICs5MCw3IEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJyZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLVYxLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJyZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLVYxLW5kayIsCiAgICAgXSwKIAogICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0lNZWRpYVJlc291cmNlTW9uaXRvci5oIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvSU1lZGlhUmVzb3VyY2VNb25pdG9yLmgKaW5kZXggZjkyZDU1Ny4uNGRkODdlMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvSU1lZGlhUmVzb3VyY2VNb25pdG9yLmgKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvSU1lZGlhUmVzb3VyY2VNb25pdG9yLmgKQEAgLTMyLDYgKzMyLDcgQEAKICAgICBlbnVtIHsKICAgICAgICAgVFlQRV9WSURFT19DT0RFQyA9IDAsCiAgICAgICAgIFRZUEVfQVVESU9fQ09ERUMgPSAxLAorICAgICAgICBUWVBFX0lNQUdFX0NPREVDID0gMiwKICAgICB9OwogCiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVJlc291cmNlR3JhbnRlZCgvKmluKi8gaW50MzJfdCBwaWQsIC8qaW4qLyBjb25zdCBpbnQzMl90IHR5cGUpID0gMDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggOTUzNjg2Yi4uYjQ2MTBiYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKQEAgLTUxLDggKzUxLDggQEAKIAogY2xhc3MgRGVhdGhOb3RpZmllciA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKLSAgICBEZWF0aE5vdGlmaWVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiAmc2VydmljZSwKLSAgICAgICAgICAgIGludCBwaWQsIGludDY0X3QgY2xpZW50SWQpOworICAgIERlYXRoTm90aWZpZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+ICZzZXJ2aWNlLCBpbnQgcGlkLAorICAgICAgICAgICAgaW50NjRfdCBjbGllbnRJZCk7CiAKICAgICB2aXJ0dWFsIH5EZWF0aE5vdGlmaWVyKCkge30KIApAQCAtMTMwLDI3ICsxMzAsNDggQEAKICAgICByZXR1cm4gaXRlbXNTdHI7CiB9CiAKLXN0YXRpYyBib29sIGhhc1Jlc291cmNlVHlwZShNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsIGNvbnN0IFJlc291cmNlTGlzdCYgcmVzb3VyY2VzKSB7CitzdGF0aWMgYm9vbCBoYXNSZXNvdXJjZVR5cGUoTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLCBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUsCisgICAgICAgIE1lZGlhUmVzb3VyY2VQYXJjZWwgcmVzb3VyY2UpIHsKKyAgICBpZiAodHlwZSAhPSByZXNvdXJjZS50eXBlKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAvLyBDb2RlYyBzdWJ0eXBlcyAoZS5nLiB2aWRlbyB2cy4gYXVkaW8pIGFyZSBlYWNoIGNvbnNpZGVyZWQgc2VwYXJhdGUgcmVzb3VyY2VzLCBzbworICAgICAgICAvLyBjb21wYXJlIHRoZSBzdWJ0eXBlcyBhcyB3ZWxsLgorICAgICAgICBjYXNlIE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtTZWN1cmVDb2RlYzoKKyAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWM6CisgICAgICAgICAgICBpZiAocmVzb3VyY2Uuc3ViVHlwZSA9PSBzdWJUeXBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gTm9uLWNvZGVjIHJlc291cmNlcyBhcmUgbm90IHNlZ3JlZ2F0ZWQgYnkgdGhlIHN1YnR5cGUgKGUuZy4gdmlkZW8gdnMuIGF1ZGlvKS4KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGhhc1Jlc291cmNlVHlwZShNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSwKKyAgICAgICAgY29uc3QgUmVzb3VyY2VMaXN0JiByZXNvdXJjZXMpIHsKICAgICBmb3IgKGF1dG8gaXQgPSByZXNvdXJjZXMuYmVnaW4oKTsgaXQgIT0gcmVzb3VyY2VzLmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgIGlmIChpdC0+c2Vjb25kLnR5cGUgPT0gdHlwZSkgeworICAgICAgICBpZiAoaGFzUmVzb3VyY2VUeXBlKHR5cGUsIHN1YlR5cGUsIGl0LT5zZWNvbmQpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBib29sIGhhc1Jlc291cmNlVHlwZShNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsIGNvbnN0IFJlc291cmNlSW5mb3MmIGluZm9zKSB7CitzdGF0aWMgYm9vbCBoYXNSZXNvdXJjZVR5cGUoTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLCBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUsCisgICAgICAgIGNvbnN0IFJlc291cmNlSW5mb3MmIGluZm9zKSB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoaGFzUmVzb3VyY2VUeXBlKHR5cGUsIGluZm9zW2ldLnJlc291cmNlcykpIHsKKyAgICAgICAgaWYgKGhhc1Jlc291cmNlVHlwZSh0eXBlLCBzdWJUeXBlLCBpbmZvc1tpXS5yZXNvdXJjZXMpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBSZXNvdXJjZUluZm9zJiBnZXRSZXNvdXJjZUluZm9zRm9yRWRpdCgKLSAgICAgICAgaW50IHBpZCwKLSAgICAgICAgUGlkUmVzb3VyY2VJbmZvc01hcCYgbWFwKSB7CitzdGF0aWMgUmVzb3VyY2VJbmZvcyYgZ2V0UmVzb3VyY2VJbmZvc0ZvckVkaXQoaW50IHBpZCwgUGlkUmVzb3VyY2VJbmZvc01hcCYgbWFwKSB7CiAgICAgc3NpemVfdCBpbmRleCA9IG1hcC5pbmRleE9mS2V5KHBpZCk7CiAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgICAvLyBuZXcgcGlkCkBAIC0xNjEsMTEgKzE4Miw4IEBACiAgICAgcmV0dXJuIG1hcC5lZGl0VmFsdWVGb3IocGlkKTsKIH0KIAotc3RhdGljIFJlc291cmNlSW5mbyYgZ2V0UmVzb3VyY2VJbmZvRm9yRWRpdCgKLSAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICBpbnQ2NF90IGNsaWVudElkLAotICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgUmVzb3VyY2VJbmZvcyYgaW5mb3MpIHsKK3N0YXRpYyBSZXNvdXJjZUluZm8mIGdldFJlc291cmNlSW5mb0ZvckVkaXQodWlkX3QgdWlkLCBpbnQ2NF90IGNsaWVudElkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwgUmVzb3VyY2VJbmZvcyYgaW5mb3MpIHsKICAgICBzc2l6ZV90IGluZGV4ID0gaW5mb3MuaW5kZXhPZktleShjbGllbnRJZCk7CiAKICAgICBpZiAoaW5kZXggPCAwKSB7CkBAIC0xODgsMTcgKzIwNiwyNCBAQAogICAgIGlmIChiaW5kZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxJTWVkaWFSZXNvdXJjZU1vbml0b3I+IHNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJTWVkaWFSZXNvdXJjZU1vbml0b3I+KGJpbmRlcik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2VzW2ldLnN1YlR5cGUgPT0gTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a0F1ZGlvQ29kZWMpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLT5ub3RpZnlSZXNvdXJjZUdyYW50ZWQocGlkLCBJTWVkaWFSZXNvdXJjZU1vbml0b3I6OlRZUEVfQVVESU9fQ09ERUMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZXNbaV0uc3ViVHlwZSA9PSBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVmlkZW9Db2RlYykgewotICAgICAgICAgICAgICAgIHNlcnZpY2UtPm5vdGlmeVJlc291cmNlR3JhbnRlZChwaWQsIElNZWRpYVJlc291cmNlTW9uaXRvcjo6VFlQRV9WSURFT19DT0RFQyk7CisgICAgICAgICAgICBzd2l0Y2ggKHJlc291cmNlc1tpXS5zdWJUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprQXVkaW9Db2RlYzoKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+bm90aWZ5UmVzb3VyY2VHcmFudGVkKHBpZCwgSU1lZGlhUmVzb3VyY2VNb25pdG9yOjpUWVBFX0FVRElPX0NPREVDKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVmlkZW9Db2RlYzoKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+bm90aWZ5UmVzb3VyY2VHcmFudGVkKHBpZCwgSU1lZGlhUmVzb3VyY2VNb25pdG9yOjpUWVBFX1ZJREVPX0NPREVDKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprSW1hZ2VDb2RlYzoKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+bm90aWZ5UmVzb3VyY2VHcmFudGVkKHBpZCwgSU1lZGlhUmVzb3VyY2VNb25pdG9yOjpUWVBFX0lNQUdFX0NPREVDKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVW5zcGVjaWZpZWRTdWJUeXBlOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotYmluZGVyX3N0YXR1c190IFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmR1bXAoCi0gICAgICAgIGludCBmZCwgY29uc3QgY2hhcioqIC8qYXJncyovLCB1aW50MzJfdCAvKm51bUFyZ3MqLykgeworYmluZGVyX3N0YXR1c190IFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBjaGFyKiogLyphcmdzKi8sIHVpbnQzMl90IC8qbnVtQXJncyovKSB7CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKQEAgLTI3NSw4ICszMDAsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RydWN0IFN5c3RlbUNhbGxiYWNrSW1wbCA6Ci0gICAgICAgIHB1YmxpYyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpTeXN0ZW1DYWxsYmFja0ludGVyZmFjZSB7CitzdHJ1Y3QgU3lzdGVtQ2FsbGJhY2tJbXBsIDogcHVibGljIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OlN5c3RlbUNhbGxiYWNrSW50ZXJmYWNlIHsKICAgICBTeXN0ZW1DYWxsYmFja0ltcGwoKSA6IG1DbGllbnRUb2tlbihuZXcgQkJpbmRlcigpKSB7fQogCiAgICAgdmlydHVhbCB2b2lkIG5vdGVTdGFydFZpZGVvKGludCB1aWQpIG92ZXJyaWRlIHsKQEAgLTMwMyw4ICszMjcsNyBAQAogUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6UmVzb3VyY2VNYW5hZ2VyU2VydmljZSgpCiAgICAgOiBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKG5ldyBQcm9jZXNzSW5mbygpLCBuZXcgU3lzdGVtQ2FsbGJhY2tJbXBsKCkpIHt9CiAKLVJlc291cmNlTWFuYWdlclNlcnZpY2U6OlJlc291cmNlTWFuYWdlclNlcnZpY2UoCi0gICAgICAgIGNvbnN0IHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiAmcHJvY2Vzc0luZm8sCitSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKGNvbnN0IHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiAmcHJvY2Vzc0luZm8sCiAgICAgICAgIGNvbnN0IHNwPFN5c3RlbUNhbGxiYWNrSW50ZXJmYWNlPiAmc3lzdGVtUmVzb3VyY2UpCiAgICAgOiBtUHJvY2Vzc0luZm8ocHJvY2Vzc0luZm8pLAogICAgICAgbVN5c3RlbUNCKHN5c3RlbVJlc291cmNlKSwKQEAgLTM2Miw4ICszODUsOCBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6b25GaXJzdEFkZGVkKAotICAgICAgICBjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsJiByZXNvdXJjZSwgY29uc3QgUmVzb3VyY2VJbmZvJiBjbGllbnRJbmZvKSB7Cit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Om9uRmlyc3RBZGRlZChjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsJiByZXNvdXJjZSwKKyAgICAgICAgY29uc3QgUmVzb3VyY2VJbmZvJiBjbGllbnRJbmZvKSB7CiAgICAgLy8gZmlyc3QgdGltZSBhZGRlZAogICAgIGlmIChyZXNvdXJjZS50eXBlID09IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtDcHVCb29zdAogICAgICAmJiByZXNvdXJjZS5zdWJUeXBlID09IE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGUpIHsKQEAgLTM4MCw4ICs0MDMsOCBAQAogICAgIH0KIH0KIAotdm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpvbkxhc3RSZW1vdmVkKAotICAgICAgICBjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsJiByZXNvdXJjZSwgY29uc3QgUmVzb3VyY2VJbmZvJiBjbGllbnRJbmZvKSB7Cit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Om9uTGFzdFJlbW92ZWQoY29uc3QgTWVkaWFSZXNvdXJjZVBhcmNlbCYgcmVzb3VyY2UsCisgICAgICAgIGNvbnN0IFJlc291cmNlSW5mbyYgY2xpZW50SW5mbykgewogICAgIGlmIChyZXNvdXJjZS50eXBlID09IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtDcHVCb29zdAogICAgICAgICAgICAgJiYgcmVzb3VyY2Uuc3ViVHlwZSA9PSBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVW5zcGVjaWZpZWRTdWJUeXBlCiAgICAgICAgICAgICAmJiBtQ3B1Qm9vc3RDb3VudCA+IDApIHsKQEAgLTM5NCw4ICs0MTcsOCBAQAogICAgIH0KIH0KIAotdm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjptZXJnZVJlc291cmNlcygKLSAgICAgICAgTWVkaWFSZXNvdXJjZVBhcmNlbCYgcjEsIGNvbnN0IE1lZGlhUmVzb3VyY2VQYXJjZWwmIHIyKSB7Cit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Om1lcmdlUmVzb3VyY2VzKE1lZGlhUmVzb3VyY2VQYXJjZWwmIHIxLAorICAgICAgICBjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsJiByMikgewogICAgIC8vIFRoZSByZXNvdXJjZSBlbnRyeSBvbiByZWNvcmQgaXMgbWFpbnRhaW5lZCB0byBiZSBpbiBbMCxJTlQ2NF9NQVhdLgogICAgIC8vIENsYW1wIGlmIG1lcmdpbmcgaW4gdGhlIG5ldyByZXNvdXJjZSB2YWx1ZSBjYXVzZXMgaXQgdG8gZ28gb3V0IG9mIGJvdW5kLgogICAgIC8vIE5vdGUgdGhhdCB0aGUgbmV3IHJlc291cmNlIHZhbHVlIGNvdWxkIGJlIG5lZ2F0aXZlLCBlZy5Ecm1TZXNzaW9uLCB0aGUKQEAgLTQxMSwxMCArNDM0LDcgQEAKICAgICB9CiB9CiAKLVN0YXR1cyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjphZGRSZXNvdXJjZSgKLSAgICAgICAgaW50MzJfdCBwaWQsCi0gICAgICAgIGludDMyX3QgdWlkLAotICAgICAgICBpbnQ2NF90IGNsaWVudElkLAorU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmFkZFJlc291cmNlKGludDMyX3QgcGlkLCBpbnQzMl90IHVpZCwgaW50NjRfdCBjbGllbnRJZCwKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+JiByZXNvdXJjZXMpIHsKICAgICBTdHJpbmc4IGxvZyA9IFN0cmluZzg6OmZvcm1hdCgiYWRkUmVzb3VyY2UocGlkICVkLCBjbGllbnRJZCAlbGxkLCByZXNvdXJjZXMgJXMpIiwKQEAgLTQyMiwxMSArNDQyLDExIEBACiAgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmICghbVByb2Nlc3NJbmZvLT5pc1ZhbGlkUGlkKHBpZCkpIHsKKyAgICBpZiAoIW1Qcm9jZXNzSW5mby0+aXNQaWRVaWRUcnVzdGVkKHBpZCwgdWlkKSkgewogICAgICAgICBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgICAgICBBTE9HVygiJXMgY2FsbGVkIHdpdGggdW50cnVzdGVkIHBpZCAlZCwgdXNpbmcgY2FsbGluZyBwaWQgJWQsIHVpZCAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBwaWQsIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpOworICAgICAgICBBTE9HVygiJXMgY2FsbGVkIHdpdGggdW50cnVzdGVkIHBpZCAlZCBvciB1aWQgJWQsIHVzaW5nIGNhbGxpbmcgcGlkICVkLCB1aWQgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcGlkLCB1aWQsIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpOwogICAgICAgICBwaWQgPSBjYWxsaW5nUGlkOwogICAgICAgICB1aWQgPSBjYWxsaW5nVWlkOwogICAgIH0KQEAgLTQ2Myw3ICs0ODMsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChpbmZvLmNvb2tpZSA9PSAwICYmIGNsaWVudCAhPSBudWxscHRyKSB7Ci0gICAgICAgIGluZm8uY29va2llID0gYWRkQ29va2llQW5kTGlua19sKGNsaWVudC0+YXNCaW5kZXIoKSwKKyAgICAgICAgaW5mby5jb29raWUgPSBhZGRDb29raWVBbmRMaW5rX2woY2xpZW50LAogICAgICAgICAgICAgICAgIG5ldyBEZWF0aE5vdGlmaWVyKHJlZjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPigpLCBwaWQsIGNsaWVudElkKSk7CiAgICAgfQogICAgIGlmIChtT2JzZXJ2ZXJTZXJ2aWNlICE9IG51bGxwdHIgJiYgIXJlc291cmNlQWRkZWQuZW1wdHkoKSkgewpAQCAtNDczLDE1ICs0OTMsMTQgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6cmVtb3ZlUmVzb3VyY2UoCi0gICAgICAgIGludDMyX3QgcGlkLCBpbnQ2NF90IGNsaWVudElkLAorU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlbW92ZVJlc291cmNlKGludDMyX3QgcGlkLCBpbnQ2NF90IGNsaWVudElkLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiYgcmVzb3VyY2VzKSB7CiAgICAgU3RyaW5nOCBsb2cgPSBTdHJpbmc4Ojpmb3JtYXQoInJlbW92ZVJlc291cmNlKHBpZCAlZCwgY2xpZW50SWQgJWxsZCwgcmVzb3VyY2VzICVzKSIsCiAgICAgICAgICAgICBwaWQsIChsb25nIGxvbmcpIGNsaWVudElkLCBnZXRTdHJpbmcocmVzb3VyY2VzKS5zdHJpbmcoKSk7CiAgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmICghbVByb2Nlc3NJbmZvLT5pc1ZhbGlkUGlkKHBpZCkpIHsKKyAgICBpZiAoIW1Qcm9jZXNzSW5mby0+aXNQaWRUcnVzdGVkKHBpZCkpIHsKICAgICAgICAgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgQUxPR1coIiVzIGNhbGxlZCB3aXRoIHVudHJ1c3RlZCBwaWQgJWQsIHVzaW5nIGNhbGxpbmcgcGlkICVkIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIHBpZCwgY2FsbGluZ1BpZCk7CkBAIC01NDksNyArNTY4LDcgQEAKICAgICBtU2VydmljZUxvZy0+YWRkKGxvZyk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKGNoZWNrVmFsaWQgJiYgIW1Qcm9jZXNzSW5mby0+aXNWYWxpZFBpZChwaWQpKSB7CisgICAgaWYgKGNoZWNrVmFsaWQgJiYgIW1Qcm9jZXNzSW5mby0+aXNQaWRUcnVzdGVkKHBpZCkpIHsKICAgICAgICAgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgQUxPR1coIiVzIGNhbGxlZCB3aXRoIHVudHJ1c3RlZCBwaWQgJWQsIHVzaW5nIGNhbGxpbmcgcGlkICVkIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIHBpZCwgY2FsbGluZ1BpZCk7CkBAIC01NzMsNyArNTkyLDcgQEAKICAgICAgICAgb25MYXN0UmVtb3ZlZChpdC0+c2Vjb25kLCBpbmZvKTsKICAgICB9CiAKLSAgICByZW1vdmVDb29raWVBbmRVbmxpbmtfbChpbmZvLmNsaWVudC0+YXNCaW5kZXIoKSwgaW5mby5jb29raWUpOworICAgIHJlbW92ZUNvb2tpZUFuZFVubGlua19sKGluZm8uY2xpZW50LCBpbmZvLmNvb2tpZSk7CiAKICAgICBpZiAobU9ic2VydmVyU2VydmljZSAhPSBudWxscHRyICYmICFpbmZvLnJlc291cmNlcy5lbXB0eSgpKSB7CiAgICAgICAgIG1PYnNlcnZlclNlcnZpY2UtPm9uUmVzb3VyY2VSZW1vdmVkKGluZm8udWlkLCBwaWQsIGluZm8ucmVzb3VyY2VzKTsKQEAgLTU4MywyMiArNjAyLDE5IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotdm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRDbGllbnRGb3JSZXNvdXJjZV9sKAotICAgICAgICBpbnQgY2FsbGluZ1BpZCwgY29uc3QgTWVkaWFSZXNvdXJjZVBhcmNlbCAqcmVzLAordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRDbGllbnRGb3JSZXNvdXJjZV9sKGludCBjYWxsaW5nUGlkLCBjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsICpyZXMsCiAgICAgICAgIFZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4+ICpjbGllbnRzKSB7CiAgICAgaWYgKHJlcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudDsKLSAgICBpZiAoZ2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woY2FsbGluZ1BpZCwgcmVzLT50eXBlLCAmY2xpZW50KSkgeworICAgIGlmIChnZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbChjYWxsaW5nUGlkLCByZXMtPnR5cGUsIHJlcy0+c3ViVHlwZSwgJmNsaWVudCkpIHsKICAgICAgICAgY2xpZW50cy0+cHVzaF9iYWNrKGNsaWVudCk7CiAgICAgfQogfQogCi1TdGF0dXMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6cmVjbGFpbVJlc291cmNlKAotICAgICAgICBpbnQzMl90IGNhbGxpbmdQaWQsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+JiByZXNvdXJjZXMsCi0gICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgeworU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlY2xhaW1SZXNvdXJjZShpbnQzMl90IGNhbGxpbmdQaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+JiByZXNvdXJjZXMsIGJvb2wqIF9haWRsX3JldHVybikgewogICAgIFN0cmluZzggbG9nID0gU3RyaW5nODo6Zm9ybWF0KCJyZWNsYWltUmVzb3VyY2UoY2FsbGluZ1BpZCAlZCwgcmVzb3VyY2VzICVzKSIsCiAgICAgICAgICAgICBjYWxsaW5nUGlkLCBnZXRTdHJpbmcocmVzb3VyY2VzKS5zdHJpbmcoKSk7CiAgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOwpAQCAtNjA3LDcgKzYyMyw3IEBACiAgICAgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gY2xpZW50czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzVmFsaWRQaWQoY2FsbGluZ1BpZCkpIHsKKyAgICAgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzUGlkVHJ1c3RlZChjYWxsaW5nUGlkKSkgewogICAgICAgICAgICAgcGlkX3QgYWN0dWFsQ2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgICAgIEFMT0dXKCIlcyBjYWxsZWQgd2l0aCB1bnRydXN0ZWQgcGlkICVkLCB1c2luZyBhY3R1YWwgY2FsbGluZyBwaWQgJWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQsIGFjdHVhbENhbGxpbmdQaWQpOwpAQCAtNjE4LDM0ICs2MzQsNDMgQEAKICAgICAgICAgY29uc3QgTWVkaWFSZXNvdXJjZVBhcmNlbCAqZ3JhcGhpY01lbW9yeSA9IE5VTEw7CiAgICAgICAgIGNvbnN0IE1lZGlhUmVzb3VyY2VQYXJjZWwgKmRybVNlc3Npb24gPSBOVUxMOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlID0gcmVzb3VyY2VzW2ldLnR5cGU7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2VzW2ldLnR5cGUgPT0gTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjKSB7Ci0gICAgICAgICAgICAgICAgc2VjdXJlQ29kZWMgPSAmcmVzb3VyY2VzW2ldOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtOb25TZWN1cmVDb2RlYykgewotICAgICAgICAgICAgICAgIG5vblNlY3VyZUNvZGVjID0gJnJlc291cmNlc1tpXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBNZWRpYVJlc291cmNlOjpUeXBlOjprR3JhcGhpY01lbW9yeSkgewotICAgICAgICAgICAgICAgIGdyYXBoaWNNZW1vcnkgPSAmcmVzb3VyY2VzW2ldOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtEcm1TZXNzaW9uKSB7Ci0gICAgICAgICAgICAgICAgZHJtU2Vzc2lvbiA9ICZyZXNvdXJjZXNbaV07CisgICAgICAgICAgICBzd2l0Y2ggKHJlc291cmNlc1tpXS50eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWM6CisgICAgICAgICAgICAgICAgICAgIHNlY3VyZUNvZGVjID0gJnJlc291cmNlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWM6CisgICAgICAgICAgICAgICAgICAgIG5vblNlY3VyZUNvZGVjID0gJnJlc291cmNlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpUeXBlOjprR3JhcGhpY01lbW9yeToKKyAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY01lbW9yeSA9ICZyZXNvdXJjZXNbaV07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0RybVNlc3Npb246CisgICAgICAgICAgICAgICAgICAgIGRybVNlc3Npb24gPSAmcmVzb3VyY2VzW2ldOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIGZpcnN0IHBhc3MgdG8gaGFuZGxlIHNlY3VyZS9ub24tc2VjdXJlIGNvZGVjIGNvbmZsaWN0CiAgICAgICAgIGlmIChzZWN1cmVDb2RlYyAhPSBOVUxMKSB7CiAgICAgICAgICAgICBpZiAoIW1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFnZXRBbGxDbGllbnRzX2woY2FsbGluZ1BpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLCAmY2xpZW50cykpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldEFsbENsaWVudHNfbChjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlQ29kZWMtPnN1YlR5cGUsICZjbGllbnRzKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghbVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFnZXRBbGxDbGllbnRzX2woY2FsbGluZ1BpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjLCAmY2xpZW50cykpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldEFsbENsaWVudHNfbChjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlQ29kZWMtPnN1YlR5cGUsICZjbGllbnRzKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAobm9uU2VjdXJlQ29kZWMgIT0gTlVMTCkgewogICAgICAgICAgICAgaWYgKCFtU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWdldEFsbENsaWVudHNfbChjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWMsICZjbGllbnRzKSkgeworICAgICAgICAgICAgICAgIGlmICghZ2V0QWxsQ2xpZW50c19sKGNhbGxpbmdQaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtTZWN1cmVDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vblNlY3VyZUNvZGVjLT5zdWJUeXBlLCAmY2xpZW50cykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC02NzEsMjEgKzY5NiwyMSBAQAogICAgICAgICBpZiAoY2xpZW50cy5zaXplKCkgPT0gMCkgewogICAgICAgICAgICAgLy8gaWYgd2UgYXJlIGhlcmUsIHJ1biB0aGUgZm91cnRoIHBhc3MgdG8gZnJlZSBvbmUgY29kZWMgd2l0aCB0aGUgZGlmZmVyZW50IHR5cGUuCiAgICAgICAgICAgICBpZiAoc2VjdXJlQ29kZWMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2UgdGVtcChNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWMsIDEpOworICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2UgdGVtcChNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWMsIHNlY3VyZUNvZGVjLT5zdWJUeXBlLCAxKTsKICAgICAgICAgICAgICAgICBnZXRDbGllbnRGb3JSZXNvdXJjZV9sKGNhbGxpbmdQaWQsICZ0ZW1wLCAmY2xpZW50cyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobm9uU2VjdXJlQ29kZWMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2UgdGVtcChNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWMsIDEpOworICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2UgdGVtcChNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWMsIG5vblNlY3VyZUNvZGVjLT5zdWJUeXBlLCAxKTsKICAgICAgICAgICAgICAgICBnZXRDbGllbnRGb3JSZXNvdXJjZV9sKGNhbGxpbmdQaWQsICZ0ZW1wLCAmY2xpZW50cyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAqX2FpZGxfcmV0dXJuID0gcmVjbGFpbUludGVybmFsKGNsaWVudHMpOworICAgICpfYWlkbF9yZXR1cm4gPSByZWNsYWltVW5jb25kaXRpb25hbGx5RnJvbShjbGllbnRzKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1ib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlY2xhaW1JbnRlcm5hbCgKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6cmVjbGFpbVVuY29uZGl0aW9uYWxseUZyb20oCiAgICAgICAgIGNvbnN0IFZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4+ICZjbGllbnRzKSB7CiAgICAgaWYgKGNsaWVudHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzA3LDYgKzczMiw3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIGludCBmYWlsZWRDbGllbnRQaWQgPSAtMTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwpAQCAtNzIxLDIwICs3NDcsMjEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgICAgICBmYWlsZWRDbGllbnRQaWQgPSBtTWFwLmtleUF0KGkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgIEFMT0dWKCJkaWRuJ3QgZmluZCBmYWlsZWQgY2xpZW50Iik7CisgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWNsYWltIHJlc291cmNlcyBmcm9tIGNsaWVudCB3aXRoIHBpZCAlZCIsIGZhaWxlZENsaWVudFBpZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlY2xhaW0gcmVzb3VyY2VzIGZyb20gdW5sb2NhdGVhYmxlIGNsaWVudCIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1TdGF0dXMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6b3ZlcnJpZGVQaWQoCi0gICAgICAgIGludCBvcmlnaW5hbFBpZCwKLSAgICAgICAgaW50IG5ld1BpZCkgeworU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Om92ZXJyaWRlUGlkKGludCBvcmlnaW5hbFBpZCwgaW50IG5ld1BpZCkgewogICAgIFN0cmluZzggbG9nID0gU3RyaW5nODo6Zm9ybWF0KCJvdmVycmlkZVBpZChvcmlnaW5hbFBpZCAlZCwgbmV3UGlkICVkKSIsCiAgICAgICAgICAgICBvcmlnaW5hbFBpZCwgbmV3UGlkKTsKICAgICBtU2VydmljZUxvZy0+YWRkKGxvZyk7CkBAIC03NjMsOSArNzkwLDcgQEAKIH0KIAogU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Om92ZXJyaWRlUHJvY2Vzc0luZm8oCi0gICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50LAotICAgICAgICBpbnQgcGlkLAotICAgICAgICBpbnQgcHJvY1N0YXRlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwgaW50IHBpZCwgaW50IHByb2NTdGF0ZSwKICAgICAgICAgaW50IG9vbVNjb3JlKSB7CiAgICAgU3RyaW5nOCBsb2cgPSBTdHJpbmc4Ojpmb3JtYXQoIm92ZXJyaWRlUHJvY2Vzc0luZm8ocGlkICVkLCBwcm9jU3RhdGUgJWQsIG9vbVNjb3JlICVkKSIsCiAgICAgICAgICAgICBwaWQsIHByb2NTdGF0ZSwgb29tU2NvcmUpOwpAQCAtNzkxLDcgKzgxNiw3IEBACiAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihCQURfVkFMVUUpOwogICAgIH0KIAotICAgIHVpbnRwdHJfdCBjb29raWUgPSBhZGRDb29raWVBbmRMaW5rX2woY2xpZW50LT5hc0JpbmRlcigpLAorICAgIHVpbnRwdHJfdCBjb29raWUgPSBhZGRDb29raWVBbmRMaW5rX2woY2xpZW50LAogICAgICAgICAgICAgbmV3IE92ZXJyaWRlUHJvY2Vzc0luZm9EZWF0aE5vdGlmaWVyKHJlZjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPigpLCBwaWQpKTsKIAogICAgIG1Qcm9jZXNzSW5mb092ZXJyaWRlTWFwLmVtcGxhY2UocGlkLCBQcm9jZXNzSW5mb092ZXJyaWRle2Nvb2tpZSwgY2xpZW50fSk7CkBAIC04MDAsMjMgKzgyNSwyOCBAQAogfQogCiB1aW50cHRyX3QgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6YWRkQ29va2llQW5kTGlua19sKAotICAgICAgICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXIsIGNvbnN0IHNwPERlYXRoTm90aWZpZXI+JiBub3RpZmllcikgeworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwgY29uc3Qgc3A8RGVhdGhOb3RpZmllcj4mIG5vdGlmaWVyKSB7CisgICAgaWYgKGNsaWVudCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7c0Nvb2tpZUxvY2t9OwogCiAgICAgdWludHB0cl90IGNvb2tpZTsKICAgICAvLyBOZWVkIHRvIHNraXAgY29va2llIDAgKGlmIGl0IHdyYXBzIGFyb3VuZCkuIFJlc291cmNlSW5mbyBoYXMgY29va2llIGluaXRpYWxpemVkIHRvIDAKICAgICAvLyBpbmRpY2F0aW5nIHRoZSBkZWF0aCBub3RpZmllciBpcyBub3QgY3JlYXRlZCB5ZXQuCiAgICAgd2hpbGUgKChjb29raWUgPSArK3NDb29raWVDb3VudGVyKSA9PSAwKTsKLSAgICBBSUJpbmRlcl9saW5rVG9EZWF0aChiaW5kZXIuZ2V0KCksIG1EZWF0aFJlY2lwaWVudC5nZXQoKSwgKHZvaWQqKWNvb2tpZSk7CisgICAgQUlCaW5kZXJfbGlua1RvRGVhdGgoY2xpZW50LT5hc0JpbmRlcigpLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksICh2b2lkKiljb29raWUpOwogICAgIHNDb29raWVUb0RlYXRoTm90aWZpZXJNYXAuZW1wbGFjZShjb29raWUsIG5vdGlmaWVyKTsKIAogICAgIHJldHVybiBjb29raWU7CiB9CiAKIHZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6cmVtb3ZlQ29va2llQW5kVW5saW5rX2woCi0gICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlciwgdWludHB0cl90IGNvb2tpZSkgeworICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+JiBjbGllbnQsIHVpbnRwdHJfdCBjb29raWUpIHsKICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7c0Nvb2tpZUxvY2t9OwotICAgIEFJQmluZGVyX3VubGlua1RvRGVhdGgoYmluZGVyLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksICh2b2lkKiljb29raWUpOworICAgIGlmIChjbGllbnQgIT0gbnVsbHB0cikgeworICAgICAgICBBSUJpbmRlcl91bmxpbmtUb0RlYXRoKGNsaWVudC0+YXNCaW5kZXIoKS5nZXQoKSwgbURlYXRoUmVjaXBpZW50LmdldCgpLCAodm9pZCopY29va2llKTsKKyAgICB9CiAgICAgc0Nvb2tpZVRvRGVhdGhOb3RpZmllck1hcC5lcmFzZShjb29raWUpOwogfQogCkBAIC04MzQsNyArODY0LDcgQEAKIAogICAgIG1Qcm9jZXNzSW5mby0+cmVtb3ZlUHJvY2Vzc0luZm9PdmVycmlkZShwaWQpOwogCi0gICAgcmVtb3ZlQ29va2llQW5kVW5saW5rX2woaXQtPnNlY29uZC5jbGllbnQtPmFzQmluZGVyKCksIGl0LT5zZWNvbmQuY29va2llKTsKKyAgICByZW1vdmVDb29raWVBbmRVbmxpbmtfbChpdC0+c2Vjb25kLmNsaWVudCwgaXQtPnNlY29uZC5jb29raWUpOwogCiAgICAgbVByb2Nlc3NJbmZvT3ZlcnJpZGVNYXAuZXJhc2UocGlkKTsKIH0KQEAgLTg0Niw3ICs4NzYsNyBAQAogICAgIG1TZXJ2aWNlTG9nLT5hZGQobG9nKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoIW1Qcm9jZXNzSW5mby0+aXNWYWxpZFBpZChwaWQpKSB7CisgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzUGlkVHJ1c3RlZChwaWQpKSB7CiAgICAgICAgIHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgIEFMT0dXKCIlcyBjYWxsZWQgd2l0aCB1bnRydXN0ZWQgcGlkICVkLCB1c2luZyBjYWxsaW5nIHBpZCAlZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBwaWQsIGNhbGxpbmdQaWQpOwpAQCAtODc4LDcgKzkwOCw3IEBACiAgICAgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gY2xpZW50czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzVmFsaWRQaWQocGlkKSkgeworICAgICAgICBpZiAoIW1Qcm9jZXNzSW5mby0+aXNQaWRUcnVzdGVkKHBpZCkpIHsKICAgICAgICAgICAgIHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgICAgICBBTE9HVygiJXMgY2FsbGVkIHdpdGggdW50cnVzdGVkIHBpZCAlZCwgdXNpbmcgY2FsbGluZyBwaWQgJWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgIHBpZCwgY2FsbGluZ1BpZCk7CkBAIC04ODksMTYgKzkxOSwzNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtHcmFwaGljTWVtb3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlOjprRHJtU2Vzc2lvbn0pIHsKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQ7Ci0gICAgICAgICAgICBpZiAoZ2V0QmlnZ2VzdENsaWVudF9sKHBpZCwgdHlwZSwgJmNsaWVudCwgdHJ1ZSAvKiBwZW5kaW5nUmVtb3ZhbE9ubHkgKi8pKSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50cy5hZGQoY2xpZW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIC8vIENvZGVjIHJlc291cmNlcyBhcmUgc2VncmVnYXRlZCBieSBhdWRpbywgdmlkZW8gYW5kIGltYWdlIGRvbWFpbnMuCisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWM6CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWM6CisgICAgICAgICAgICAgICAgICAgIGZvciAoTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlIDoge01lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtBdWRpb0NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVmlkZW9Db2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a0ltYWdlQ29kZWN9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEJpZ2dlc3RDbGllbnRQZW5kaW5nUmVtb3ZhbF9sKHBpZCwgdHlwZSwgc3ViVHlwZSwgJmNsaWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRzLmFkZChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8vIE5vbi1jb2RlYyByZXNvdXJjZXMgYXJlIHNoYXJlZCBieSBhdWRpbywgdmlkZW8gYW5kIGltYWdlIGNvZGVjcyAobm8gc3VidHlwZSkuCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldEJpZ2dlc3RDbGllbnRQZW5kaW5nUmVtb3ZhbF9sKHBpZCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVW5zcGVjaWZpZWRTdWJUeXBlLCAmY2xpZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50cy5hZGQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIGlmICghY2xpZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgIHJlY2xhaW1JbnRlcm5hbChjbGllbnRzKTsKKyAgICAgICAgcmVjbGFpbVVuY29uZGl0aW9uYWxseUZyb20oY2xpZW50cyk7CiAgICAgfQogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CkBAIC05MTUsMTQgKzk2MywxMyBAQAogICAgIHJldHVybiBtUHJvY2Vzc0luZm8tPmdldFByaW9yaXR5KG5ld1BpZCwgcHJpb3JpdHkpOwogfQogCi1ib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmdldEFsbENsaWVudHNfbCgKLSAgICAgICAgaW50IGNhbGxpbmdQaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwKLSAgICAgICAgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gKmNsaWVudHMpIHsKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0QWxsQ2xpZW50c19sKGludCBjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsCisgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSwgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gKmNsaWVudHMpIHsKICAgICBWZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiB0ZW1wOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1hcC5zaXplKCk7ICsraSkgewogICAgICAgICBSZXNvdXJjZUluZm9zICZpbmZvcyA9IG1NYXAuZWRpdFZhbHVlQXQoaSk7CiAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5mb3Muc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgIGlmIChoYXNSZXNvdXJjZVR5cGUodHlwZSwgaW5mb3Nbal0ucmVzb3VyY2VzKSkgeworICAgICAgICAgICAgaWYgKGhhc1Jlc291cmNlVHlwZSh0eXBlLCBzdWJUeXBlLCBpbmZvc1tqXS5yZXNvdXJjZXMpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFpc0NhbGxpbmdQcmlvcml0eUhpZ2hlcl9sKGNhbGxpbmdQaWQsIG1NYXAua2V5QXQoaSkpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgaGlnaGVyL2VxdWFsIHByaW9yaXR5IHByb2Nlc3Mgb3ducyB0aGUgcmVzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCBjYW4ndCBiZSBmdWxmaWxsZWQuCkBAIC05NDIsOCArOTg5LDggQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbCgKLSAgICAgICAgaW50IGNhbGxpbmdQaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woaW50IGNhbGxpbmdQaWQsCisgICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlLAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gKmNsaWVudCkgewogICAgIGludCBsb3dlc3RQcmlvcml0eVBpZDsKICAgICBpbnQgbG93ZXN0UHJpb3JpdHk7CkBAIC05NTEsNyArOTk4LDcgQEAKIAogICAgIC8vIEJlZm9yZSBsb29raW5nIGludG8gb3RoZXIgcHJvY2Vzc2VzLCBjaGVjayBpZiB3ZSBoYXZlIGNsaWVudHMgbWFya2VkIGZvcgogICAgIC8vIHBlbmRpbmcgcmVtb3ZhbCBpbiB0aGUgc2FtZSBwcm9jZXNzLgotICAgIGlmIChnZXRCaWdnZXN0Q2xpZW50X2woY2FsbGluZ1BpZCwgdHlwZSwgY2xpZW50LCB0cnVlIC8qIHBlbmRpbmdSZW1vdmFsT25seSAqLykpIHsKKyAgICBpZiAoZ2V0QmlnZ2VzdENsaWVudFBlbmRpbmdSZW1vdmFsX2woY2FsbGluZ1BpZCwgdHlwZSwgc3ViVHlwZSwgY2xpZW50KSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKCFnZXRQcmlvcml0eV9sKGNhbGxpbmdQaWQsICZjYWxsaW5nUHJpb3JpdHkpKSB7CkBAIC05NTksNyArMTAwNiw3IEBACiAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgaWYgKCFnZXRMb3dlc3RQcmlvcml0eVBpZF9sKHR5cGUsICZsb3dlc3RQcmlvcml0eVBpZCwgJmxvd2VzdFByaW9yaXR5KSkgeworICAgIGlmICghZ2V0TG93ZXN0UHJpb3JpdHlQaWRfbCh0eXBlLCBzdWJUeXBlLCAmbG93ZXN0UHJpb3JpdHlQaWQsICZsb3dlc3RQcmlvcml0eSkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAobG93ZXN0UHJpb3JpdHkgPD0gY2FsbGluZ1ByaW9yaXR5KSB7CkBAIC05NjgsMTQgKzEwMTUsMTQgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghZ2V0QmlnZ2VzdENsaWVudF9sKGxvd2VzdFByaW9yaXR5UGlkLCB0eXBlLCBjbGllbnQpKSB7CisgICAgaWYgKCFnZXRCaWdnZXN0Q2xpZW50X2wobG93ZXN0UHJpb3JpdHlQaWQsIHR5cGUsIHN1YlR5cGUsIGNsaWVudCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRMb3dlc3RQcmlvcml0eVBpZF9sKAotICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsIGludCAqbG93ZXN0UHJpb3JpdHlQaWQsIGludCAqbG93ZXN0UHJpb3JpdHkpIHsKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0TG93ZXN0UHJpb3JpdHlQaWRfbChNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsCisgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSwgaW50ICpsb3dlc3RQcmlvcml0eVBpZCwgaW50ICpsb3dlc3RQcmlvcml0eSkgewogICAgIGludCBwaWQgPSAtMTsKICAgICBpbnQgcHJpb3JpdHkgPSAtMTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NYXAuc2l6ZSgpOyArK2kpIHsKQEAgLTk4Myw3ICsxMDMwLDcgQEAKICAgICAgICAgICAgIC8vIG5vIGNsaWVudCBvbiB0aGlzIHByb2Nlc3MuCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBpZiAoIWhhc1Jlc291cmNlVHlwZSh0eXBlLCBtTWFwLnZhbHVlQXQoaSkpKSB7CisgICAgICAgIGlmICghaGFzUmVzb3VyY2VUeXBlKHR5cGUsIHN1YlR5cGUsIG1NYXAudmFsdWVBdChpKSkpIHsKICAgICAgICAgICAgIC8vIGRvZXNuJ3QgaGF2ZSB0aGUgcmVxdWVzdGVkIHJlc291cmNlIHR5cGUKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CkBAIC0xMDIxLDggKzEwNjgsMTMgQEAKICAgICByZXR1cm4gKGNhbGxpbmdQaWRQcmlvcml0eSA8IHByaW9yaXR5KTsKIH0KIAotYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRCaWdnZXN0Q2xpZW50X2woCi0gICAgICAgIGludCBwaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICpjbGllbnQsCitib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmdldEJpZ2dlc3RDbGllbnRQZW5kaW5nUmVtb3ZhbF9sKGludCBwaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwKKyAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlLCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gKmNsaWVudCkgeworICAgIHJldHVybiBnZXRCaWdnZXN0Q2xpZW50X2wocGlkLCB0eXBlLCBzdWJUeXBlLCBjbGllbnQsIHRydWUgLyogcGVuZGluZ1JlbW92YWxPbmx5ICovKTsKK30KKworYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRCaWdnZXN0Q2xpZW50X2woaW50IHBpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLAorICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUsIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiAqY2xpZW50LAogICAgICAgICBib29sIHBlbmRpbmdSZW1vdmFsT25seSkgewogICAgIHNzaXplX3QgaW5kZXggPSBtTWFwLmluZGV4T2ZLZXkocGlkKTsKICAgICBpZiAoaW5kZXggPCAwKSB7CkBAIC0xMDQxLDcgKzEwOTMsNyBAQAogICAgICAgICB9CiAgICAgICAgIGZvciAoYXV0byBpdCA9IHJlc291cmNlcy5iZWdpbigpOyBpdCAhPSByZXNvdXJjZXMuZW5kKCk7IGl0KyspIHsKICAgICAgICAgICAgIGNvbnN0IE1lZGlhUmVzb3VyY2VQYXJjZWwgJnJlc291cmNlID0gaXQtPnNlY29uZDsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZS50eXBlID09IHR5cGUpIHsKKyAgICAgICAgICAgIGlmIChoYXNSZXNvdXJjZVR5cGUodHlwZSwgc3ViVHlwZSwgcmVzb3VyY2UpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlLnZhbHVlID4gbGFyZ2VzdFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgIGxhcmdlc3RWYWx1ZSA9IHJlc291cmNlLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICBjbGllbnRUZW1wID0gaW5mb3NbaV0uY2xpZW50OwpAQCAtMTA1Miw4ICsxMTA0LDggQEAKIAogICAgIGlmIChjbGllbnRUZW1wID09IE5VTEwpIHsKICAgICAgICAgQUxPR0VfSUYoIXBlbmRpbmdSZW1vdmFsT25seSwKLSAgICAgICAgICAgICAgICAgImdldEJpZ2dlc3RDbGllbnRfbDogY2FuJ3QgZmluZCByZXNvdXJjZSB0eXBlICVzIGZvciBwaWQgJWQiLAotICAgICAgICAgICAgICAgICBhc1N0cmluZyh0eXBlKSwgcGlkKTsKKyAgICAgICAgICAgICAgICAgImdldEJpZ2dlc3RDbGllbnRfbDogY2FuJ3QgZmluZCByZXNvdXJjZSB0eXBlICVzIGFuZCBzdWJ0eXBlICVzIGZvciBwaWQgJWQiLAorICAgICAgICAgICAgICAgICBhc1N0cmluZyh0eXBlKSwgYXNTdHJpbmcoc3ViVHlwZSksIHBpZCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaAppbmRleCA5YzI2MzZlLi5jNjM2YTBmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCkBAIC03NywyNiArNzcsMTkgQEAKICAgICAgICAgICAgIGludCAvKmZkKi8sIGNvbnN0IGNoYXIqKiAvKmFyZ3MqLywgdWludDMyX3QgLypudW1BcmdzKi8pOwogCiAgICAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSgpOwotICAgIGV4cGxpY2l0IFJlc291cmNlTWFuYWdlclNlcnZpY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxQcm9jZXNzSW5mb0ludGVyZmFjZT4gJnByb2Nlc3NJbmZvLAorICAgIGV4cGxpY2l0IFJlc291cmNlTWFuYWdlclNlcnZpY2UoY29uc3Qgc3A8UHJvY2Vzc0luZm9JbnRlcmZhY2U+ICZwcm9jZXNzSW5mbywKICAgICAgICAgICAgIGNvbnN0IHNwPFN5c3RlbUNhbGxiYWNrSW50ZXJmYWNlPiAmc3lzdGVtUmVzb3VyY2UpOwogICAgIHZpcnR1YWwgflJlc291cmNlTWFuYWdlclNlcnZpY2UoKTsKLSAgICB2b2lkIHNldE9ic2VydmVyU2VydmljZSgKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU9ic2VydmVyU2VydmljZT4mIG9ic2VydmVyU2VydmljZSk7CisgICAgdm9pZCBzZXRPYnNlcnZlclNlcnZpY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlPiYgb2JzZXJ2ZXJTZXJ2aWNlKTsKIAogICAgIC8vIElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIGludGVyZmFjZQogICAgIFN0YXR1cyBjb25maWcoY29uc3Qgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBvbGljeVBhcmNlbD4mIHBvbGljaWVzKSBvdmVycmlkZTsKIAotICAgIFN0YXR1cyBhZGRSZXNvdXJjZSgKLSAgICAgICAgICAgIGludDMyX3QgcGlkLAotICAgICAgICAgICAgaW50MzJfdCB1aWQsCi0gICAgICAgICAgICBpbnQ2NF90IGNsaWVudElkLAorICAgIFN0YXR1cyBhZGRSZXNvdXJjZShpbnQzMl90IHBpZCwgaW50MzJfdCB1aWQsIGludDY0X3QgY2xpZW50SWQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+JiByZXNvdXJjZXMpIG92ZXJyaWRlOwogCi0gICAgU3RhdHVzIHJlbW92ZVJlc291cmNlKAotICAgICAgICAgICAgaW50MzJfdCBwaWQsCi0gICAgICAgICAgICBpbnQ2NF90IGNsaWVudElkLAorICAgIFN0YXR1cyByZW1vdmVSZXNvdXJjZShpbnQzMl90IHBpZCwgaW50NjRfdCBjbGllbnRJZCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+JiByZXNvdXJjZXMpIG92ZXJyaWRlOwogCiAgICAgU3RhdHVzIHJlbW92ZUNsaWVudChpbnQzMl90IHBpZCwgaW50NjRfdCBjbGllbnRJZCkgb3ZlcnJpZGU7CkBAIC0xMDQsMjAgKzk3LDEzIEBACiAgICAgLy8gVHJpZXMgdG8gcmVjbGFpbSByZXNvdXJjZSBmcm9tIHByb2Nlc3NlcyB3aXRoIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIGNhbGxpbmcgcHJvY2VzcwogICAgIC8vIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlcy4KICAgICAvLyBSZXR1cm5zIHRydWUgaWYgYW55IHJlc291cmNlIGhhcyBiZWVuIHJlY2xhaW1lZCwgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCi0gICAgU3RhdHVzIHJlY2xhaW1SZXNvdXJjZSgKLSAgICAgICAgICAgIGludDMyX3QgY2FsbGluZ1BpZCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+JiByZXNvdXJjZXMsCisgICAgU3RhdHVzIHJlY2xhaW1SZXNvdXJjZShpbnQzMl90IGNhbGxpbmdQaWQsIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+JiByZXNvdXJjZXMsCiAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogCi0gICAgU3RhdHVzIG92ZXJyaWRlUGlkKAotICAgICAgICAgICAgaW50IG9yaWdpbmFsUGlkLAotICAgICAgICAgICAgaW50IG5ld1BpZCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIG92ZXJyaWRlUGlkKGludCBvcmlnaW5hbFBpZCwgaW50IG5ld1BpZCkgb3ZlcnJpZGU7CiAKLSAgICBTdGF0dXMgb3ZlcnJpZGVQcm9jZXNzSW5mbygKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgaW50IHBpZCwKLSAgICAgICAgICAgIGludCBwcm9jU3RhdGUsCi0gICAgICAgICAgICBpbnQgb29tU2NvcmUpIG92ZXJyaWRlOworICAgIFN0YXR1cyBvdmVycmlkZVByb2Nlc3NJbmZvKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50LCBpbnQgcGlkLAorICAgICAgICAgICAgaW50IHByb2NTdGF0ZSwgaW50IG9vbVNjb3JlKSBvdmVycmlkZTsKIAogICAgIFN0YXR1cyBtYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwoaW50MzJfdCBwaWQsIGludDY0X3QgY2xpZW50SWQpIG92ZXJyaWRlOwogCkBAIC0xMzIsMzAgKzExOCwzNCBAQAogCiAgICAgLy8gUmVjbGFpbXMgcmVzb3VyY2VzIGZyb20gfGNsaWVudHN8LiBSZXR1cm5zIHRydWUgaWYgcmVjbGFpbSBzdWNjZWVkZWQKICAgICAvLyBmb3IgYWxsIGNsaWVudHMuCi0gICAgYm9vbCByZWNsYWltSW50ZXJuYWwoCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiAmY2xpZW50cyk7CisgICAgYm9vbCByZWNsYWltVW5jb25kaXRpb25hbGx5RnJvbShjb25zdCBWZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiAmY2xpZW50cyk7CiAKICAgICAvLyBHZXRzIHRoZSBsaXN0IG9mIGFsbCB0aGUgY2xpZW50cyB3aG8gb3duIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZS4KICAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIGFueSBjbGllbnQgYmVsb25ncyB0byBhIHByb2Nlc3Mgd2l0aCBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUKICAgICAvLyBjYWxsaW5nIHByb2Nlc3MuIFRoZSBjbGllbnRzIHdpbGwgcmVtYWluIHVuY2hhbmdlZCBpZiByZXR1cm5zIGZhbHNlLgotICAgIGJvb2wgZ2V0QWxsQ2xpZW50c19sKGludCBjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsCisgICAgYm9vbCBnZXRBbGxDbGllbnRzX2woaW50IGNhbGxpbmdQaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlLAogICAgICAgICAgICAgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gKmNsaWVudHMpOwogCiAgICAgLy8gR2V0cyB0aGUgY2xpZW50IHdobyBvd25zIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlIGZyb20gbG93ZXN0IHBvc3NpYmxlIHByaW9yaXR5IHByb2Nlc3MuCiAgICAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgY2FsbGluZyBwcm9jZXNzIHByaW9yaXR5IGlzIG5vdCBoaWdoZXIgdGhhbiB0aGUgbG93ZXN0IHByb2Nlc3MKICAgICAvLyBwcmlvcml0eS4gVGhlIGNsaWVudCB3aWxsIHJlbWFpbiB1bmNoYW5nZWQgaWYgcmV0dXJucyBmYWxzZS4KICAgICBib29sIGdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKGludCBjYWxsaW5nUGlkLCBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gKmNsaWVudCk7CisgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUsIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiAqY2xpZW50KTsKIAogICAgIC8vIEdldHMgbG93ZXN0IHByaW9yaXR5IHByb2Nlc3MgdGhhdCBoYXMgdGhlIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlLgogICAgIC8vIFJldHVybnMgZmFsc2UgaWYgZmFpbGVkLiBUaGUgb3V0cHV0IHBhcmFtZXRlcnMgd2lsbCByZW1haW4gdW5jaGFuZ2VkIGlmIGZhaWxlZC4KLSAgICBib29sIGdldExvd2VzdFByaW9yaXR5UGlkX2woTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLCBpbnQgKnBpZCwgaW50ICpwcmlvcml0eSk7CisgICAgYm9vbCBnZXRMb3dlc3RQcmlvcml0eVBpZF9sKE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlLCBpbnQgKnBpZCwKKyAgICAgICAgICAgICAgICBpbnQgKnByaW9yaXR5KTsKIAogICAgIC8vIEdldHMgdGhlIGNsaWVudCB3aG8gb3ducyBiaWdnZXN0IHBpZWNlIG9mIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlIGZyb20gcGlkLgotICAgIC8vIFJldHVybnMgZmFsc2UgaWYgZmFpbGVkLiBUaGUgY2xpZW50IHdpbGwgcmVtYWluIHVuY2hhbmdlZCBpZiBmYWlsZWQuCi0gICAgYm9vbCBnZXRCaWdnZXN0Q2xpZW50X2woaW50IHBpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLAorICAgIC8vIFJldHVybnMgZmFsc2Ugd2l0aCBubyBjaGFuZ2UgdG8gY2xpZW50IGlmIHRoZXJlIGFyZSBubyBjbGllbnRzIGhvbGRpaW5nIHJlc291cmNlcyBvZiB0aGlzaQorICAgIC8vIHR5cGUuCisgICAgYm9vbCBnZXRCaWdnZXN0Q2xpZW50X2woaW50IHBpZCwgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLCBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YlR5cGUsCiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gKmNsaWVudCwKICAgICAgICAgICAgIGJvb2wgcGVuZGluZ1JlbW92YWxPbmx5ID0gZmFsc2UpOworICAgIC8vIFNhbWUgbWV0aG9kIGFzIGFib3ZlLCBidXQgd2l0aCBwZW5kaW5nUmVtb3ZhbE9ubHkgYXMgdHJ1ZS4KKyAgICBib29sIGdldEJpZ2dlc3RDbGllbnRQZW5kaW5nUmVtb3ZhbF9sKGludCBwaWQsIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSwgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICpjbGllbnQpOwogCiAgICAgYm9vbCBpc0NhbGxpbmdQcmlvcml0eUhpZ2hlcl9sKGludCBjYWxsaW5nUGlkLCBpbnQgcGlkKTsKIApAQCAtMTc2LDggKzE2NiwxMCBAQAogICAgIHZvaWQgcmVtb3ZlUHJvY2Vzc0luZm9PdmVycmlkZShpbnQgcGlkKTsKIAogICAgIHZvaWQgcmVtb3ZlUHJvY2Vzc0luZm9PdmVycmlkZV9sKGludCBwaWQpOwotICAgIHVpbnRwdHJfdCBhZGRDb29raWVBbmRMaW5rX2woOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyLCBjb25zdCBzcDxEZWF0aE5vdGlmaWVyPiYgbm90aWZpZXIpOwotICAgIHZvaWQgcmVtb3ZlQ29va2llQW5kVW5saW5rX2woOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyLCB1aW50cHRyX3QgY29va2llKTsKKyAgICB1aW50cHRyX3QgYWRkQ29va2llQW5kTGlua19sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGVhdGhOb3RpZmllcj4mIG5vdGlmaWVyKTsKKyAgICB2b2lkIHJlbW92ZUNvb2tpZUFuZFVubGlua19sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGNvb2tpZSk7CiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogICAgIHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiBtUHJvY2Vzc0luZm87CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVN1YlR5cGUuYWlkbCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlU3ViVHlwZS5haWRsCmluZGV4IGFmMmJhNjguLjcyYTA1NTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlU3ViVHlwZS5haWRsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlU3ViVHlwZS5haWRsCkBAIC0yNiw0ICsyNiw1IEBACiAgICAga1Vuc3BlY2lmaWVkU3ViVHlwZSA9IDAsCiAgICAga0F1ZGlvQ29kZWMgPSAxLAogICAgIGtWaWRlb0NvZGVjID0gMiwKKyAgICBrSW1hZ2VDb2RlYyA9IDMsCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9mdXp6ZXIvbWVkaWFyZXNvdXJjZW1hbmFnZXJfZnV6emVyLmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2Z1enplci9tZWRpYXJlc291cmNlbWFuYWdlcl9mdXp6ZXIuY3BwCmluZGV4IDY2OTBiMTYuLmU0YWFlYTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2Z1enplci9tZWRpYXJlc291cmNlbWFuYWdlcl9mdXp6ZXIuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2Z1enplci9tZWRpYXJlc291cmNlbWFuYWdlcl9mdXp6ZXIuY3BwCkBAIC03MSw3ICs3MSw4IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkUGlkKGludCAvKiBwaWQgKi8pIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXNQaWRUcnVzdGVkKGludCAvKiBwaWQgKi8pIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXNQaWRVaWRUcnVzdGVkKGludCAvKiBwaWQgKi8sIGludCAvKiB1aWQgKi8pIHsgcmV0dXJuIHRydWU7IH0KICAgICB2aXJ0dWFsIGJvb2wgb3ZlcnJpZGVQcm9jZXNzSW5mbyhpbnQgLyogcGlkICovLCBpbnQgLypwcm9jU3RhdGUqLywgaW50IC8qb29tU2NvcmUqLykgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0yMjYsMzMgKzIyNywzMSBAQAogICAgICAgICBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oa01pblRocmVhZFBhaXJzLCBrTWF4VGhyZWFkUGFpcnMpOwogICAgIC8vIE1ha2UgZXZlbiBudW1iZXIgb2YgdGhyZWFkcwogICAgIHNpemVfdCBudW1UaHJlYWRzID0gbnVtVGhyZWFkUGFpcnMgKiAyOwotICAgIHJlc291cmNlVGhyZWFkQXJncyB0aHJlYWRBcmdzOwotICAgIHZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiBtZWRpYVJlc291cmNlOworICAgIHJlc291cmNlVGhyZWFkQXJncyB0aHJlYWRBcmdzW251bVRocmVhZFBhaXJzXTsKKyAgICB2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gbWVkaWFSZXNvdXJjZVtudW1UaHJlYWRQYWlyc107CiAgICAgcHRocmVhZF90IHB0W251bVRocmVhZHNdOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1UaHJlYWRzIC0gMTsgaSArPSAyKSB7Ci0gICAgICAgIHRocmVhZEFyZ3MucGlkID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7Ci0gICAgICAgIHRocmVhZEFyZ3MudWlkID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgZm9yIChpbnQgayA9IDA7IGsgPCBudW1UaHJlYWRQYWlyczsgKytrKSB7CisgICAgICAgIHRocmVhZEFyZ3Nba10ucGlkID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgICAgIHRocmVhZEFyZ3Nba10udWlkID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CiAgICAgICAgIGludDMyX3QgbWVkaWFSZXNvdXJjZVR5cGUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KAogICAgICAgICAgICAga01pblJlc291cmNlVHlwZSwga01heFJlc291cmNlVHlwZSk7CiAgICAgICAgIGludDMyX3QgbWVkaWFSZXNvdXJjZVN1YlR5cGUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KAogICAgICAgICAgICAga01pblJlc291cmNlVHlwZSwga01heFJlc291cmNlVHlwZSk7CiAgICAgICAgIHVpbnQ2NF90IG1lZGlhUmVzb3VyY2VWYWx1ZSA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKTsKLSAgICAgICAgdGhyZWFkQXJncy5zZXJ2aWNlID0gbVNlcnZpY2U7CisgICAgICAgIHRocmVhZEFyZ3Nba10uc2VydmljZSA9IG1TZXJ2aWNlOwogICAgICAgICBzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IHRlc3RDbGllbnQgPQotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4odGhyZWFkQXJncy5waWQsIG1TZXJ2aWNlKTsKLSAgICAgICAgdGhyZWFkQXJncy50ZXN0Q2xpZW50ID0gdGVzdENsaWVudDsKLSAgICAgICAgdGhyZWFkQXJncy50ZXN0Q2xpZW50SWQgPSBnZXRJZCh0ZXN0Q2xpZW50KTsKLSAgICAgICAgbWVkaWFSZXNvdXJjZS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShzdGF0aWNfY2FzdDxNZWRSZXNUeXBlPihtZWRpYVJlc291cmNlVHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkUmVzU3ViVHlwZT4obWVkaWFSZXNvdXJjZVN1YlR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhUmVzb3VyY2VWYWx1ZSkpOwotICAgICAgICB0aHJlYWRBcmdzLm1lZGlhUmVzb3VyY2UgPSBtZWRpYVJlc291cmNlOwotICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmcHRbaV0sIG51bGxwdHIsIGFkZFJlc291cmNlLCAmdGhyZWFkQXJncyk7Ci0gICAgICAgIHB0aHJlYWRfY3JlYXRlKCZwdFtpICsgMV0sIG51bGxwdHIsIHJlbW92ZVJlc291cmNlLCAmdGhyZWFkQXJncyk7Ci0gICAgICAgIG1lZGlhUmVzb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50Pih0aHJlYWRBcmdzW2tdLnBpZCwgbVNlcnZpY2UpOworICAgICAgICB0aHJlYWRBcmdzW2tdLnRlc3RDbGllbnQgPSB0ZXN0Q2xpZW50OworICAgICAgICB0aHJlYWRBcmdzW2tdLnRlc3RDbGllbnRJZCA9IGdldElkKHRlc3RDbGllbnQpOworICAgICAgICBtZWRpYVJlc291cmNlW2tdLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKHN0YXRpY19jYXN0PE1lZFJlc1R5cGU+KG1lZGlhUmVzb3VyY2VUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRSZXNTdWJUeXBlPihtZWRpYVJlc291cmNlU3ViVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFSZXNvdXJjZVZhbHVlKSk7CisgICAgICAgIHRocmVhZEFyZ3Nba10ubWVkaWFSZXNvdXJjZSA9IG1lZGlhUmVzb3VyY2Vba107CisgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZwdFsyICoga10sIG51bGxwdHIsIGFkZFJlc291cmNlLCAmdGhyZWFkQXJnc1trXSk7CisgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZwdFsyICogayArIDFdLCBudWxscHRyLCByZW1vdmVSZXNvdXJjZSwgJnRocmVhZEFyZ3Nba10pOwogICAgIH0KIAotICAgIGZvciAoaSA9IDA7IGkgPCBudW1UaHJlYWRzOyArK2kpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRocmVhZHM7ICsraSkgewogICAgICAgICBwdGhyZWFkX2pvaW4ocHRbaV0sIG51bGxwdHIpOwogICAgIH0KIApAQCAtMjY1LDE0ICsyNjQsMTQgQEAKICAgICBpbnQzMl90IG1lZGlhUmVzb3VyY2VTdWJUeXBlID0KICAgICAgICAgbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PihrTWluUmVzb3VyY2VUeXBlLCBrTWF4UmVzb3VyY2VUeXBlKTsKICAgICB1aW50NjRfdCBtZWRpYVJlc291cmNlVmFsdWUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCk7Ci0gICAgbWVkaWFSZXNvdXJjZS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShzdGF0aWNfY2FzdDxNZWRSZXNUeXBlPihtZWRpYVJlc291cmNlVHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRSZXNTdWJUeXBlPihtZWRpYVJlc291cmNlU3ViVHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVJlc291cmNlVmFsdWUpKTsKKyAgICB2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gbWVkaWFSZXM7CisgICAgbWVkaWFSZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2Uoc3RhdGljX2Nhc3Q8TWVkUmVzVHlwZT4obWVkaWFSZXNvdXJjZVR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZFJlc1N1YlR5cGU+KG1lZGlhUmVzb3VyY2VTdWJUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVJlc291cmNlVmFsdWUpKTsKICAgICBib29sIHJlc3VsdDsKLSAgICBtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKHBpZFplcm8sIG1lZGlhUmVzb3VyY2UsICZyZXN1bHQpOwotICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShwaWRaZXJvLCBnZXRJZCh0ZXN0Q2xpZW50KSwgbWVkaWFSZXNvdXJjZSk7CisgICAgbVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShwaWRaZXJvLCBtZWRpYVJlcywgJnJlc3VsdCk7CisgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKHBpZFplcm8sIGdldElkKHRlc3RDbGllbnQpLCBtZWRpYVJlcyk7CiAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChwaWRaZXJvLCBnZXRJZCh0ZXN0Q2xpZW50KSk7Ci0gICAgbWVkaWFSZXNvdXJjZS5jbGVhcigpOwogfQogCiB2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2VGdXp6ZXI6OnNldFNlcnZpY2VMb2coKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAKaW5kZXggZWM0YmE1OC4uNjE4NjI2ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5icApAQCAtNTYsNyArNTYsNyBAQAogICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKLSAgICAgICAgInJlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UtVjEtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgInJlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UtVjEtbmRrIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdFV0aWxzLmggYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0VXRpbHMuaAppbmRleCA4ZTI5MzEyLi41YmY0NGNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0VXRpbHMuaAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0VXRpbHMuaApAQCAtNDYsNyArNDYsMTEgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIGlzVmFsaWRQaWQoaW50IC8qIHBpZCAqLykgeworICAgIHZpcnR1YWwgYm9vbCBpc1BpZFRydXN0ZWQoaW50IC8qIHBpZCAqLykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNQaWRVaWRUcnVzdGVkKGludCAvKiBwaWQgKi8sIGludCAvKiB1aWQgKi8pIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC0xMTksMTEgKzEyMywxMSBAQAogCiBzdHJ1Y3QgVGVzdENsaWVudCA6IHB1YmxpYyBCblJlc291cmNlTWFuYWdlckNsaWVudCB7CiAgICAgVGVzdENsaWVudChpbnQgcGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gJnNlcnZpY2UpCi0gICAgICAgIDogbVJlY2xhaW1lZChmYWxzZSksIG1QaWQocGlkKSwgbVNlcnZpY2Uoc2VydmljZSkge30KKyAgICAgICAgOiBtUGlkKHBpZCksIG1TZXJ2aWNlKHNlcnZpY2UpIHt9CiAKICAgICBTdGF0dXMgcmVjbGFpbVJlc291cmNlKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgewogICAgICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KG1QaWQsIGdldElkKHJlZjxUZXN0Q2xpZW50PigpKSk7Ci0gICAgICAgIG1SZWNsYWltZWQgPSB0cnVlOworICAgICAgICBtV2FzUmVjbGFpbVJlc291cmNlQ2FsbGVkID0gdHJ1ZTsKICAgICAgICAgKl9haWRsX3JldHVybiA9IHRydWU7CiAgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgfQpAQCAtMTMzLDE4ICsxMzcsMTYgQEAKICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICB9CiAKLSAgICBib29sIHJlY2xhaW1lZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1SZWNsYWltZWQ7Ci0gICAgfQotCi0gICAgdm9pZCByZXNldCgpIHsKLSAgICAgICAgbVJlY2xhaW1lZCA9IGZhbHNlOworICAgIGJvb2wgY2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkgeworICAgICAgICBib29sIHdhc1JlY2xhaW1SZXNvdXJjZUNhbGxlZCA9IG1XYXNSZWNsYWltUmVzb3VyY2VDYWxsZWQ7CisgICAgICAgIG1XYXNSZWNsYWltUmVzb3VyY2VDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHdhc1JlY2xhaW1SZXNvdXJjZUNhbGxlZDsKICAgICB9CiAKICAgICB2aXJ0dWFsIH5UZXN0Q2xpZW50KCkge30KIAogcHJpdmF0ZToKLSAgICBib29sIG1SZWNsYWltZWQ7CisgICAgYm9vbCBtV2FzUmVjbGFpbVJlc291cmNlQ2FsbGVkID0gZmFsc2U7CiAgICAgaW50IG1QaWQ7CiAgICAgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+IG1TZXJ2aWNlOwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRlc3RDbGllbnQpOwpAQCAtMTY2LDE0ICsxNjgsMzAgQEAKICAgICByZXR1cm4gbGhzLnR5cGUgPT0gcmhzLnR5cGUgJiYgbGhzLmFyZyA9PSByaHMuYXJnOwogfQogCi0jZGVmaW5lIENIRUNLX1NUQVRVU19UUlVFKGNvbmRpdGlvbikgXAotICAgIEVYUEVDVF9UUlVFKChjb25kaXRpb24pLmlzT2soKSAmJiAocmVzdWx0KSkKKy8vIFRoZSBjb25kaXRpb24gaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGEgc3RhdHVzIGJ1dCBhbHNvIHVwZGF0ZSB0aGUgbG9jYWwKKy8vIHJlc3VsdCB2YXJpYWJsZS4KKyNkZWZpbmUgQ0hFQ0tfU1RBVFVTX1RSVUUoY29uZGl0aW9uVGhhdFVwZGF0ZXNSZXN1bHQpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsgXAorICAgICAgICBFWFBFQ1RfVFJVRSgoY29uZGl0aW9uVGhhdFVwZGF0ZXNSZXN1bHQpLmlzT2soKSk7IFwKKyAgICAgICAgRVhQRUNUX1RSVUUocmVzdWx0KTsgXAorICAgIH0gd2hpbGUoZmFsc2UpCiAKLSNkZWZpbmUgQ0hFQ0tfU1RBVFVTX0ZBTFNFKGNvbmRpdGlvbikgXAotICAgIEVYUEVDVF9UUlVFKChjb25kaXRpb24pLmlzT2soKSAmJiAhKHJlc3VsdCkpCisvLyBUaGUgY29uZGl0aW9uIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhIHN0YXR1cyBidXQgYWxzbyB1cGRhdGUgdGhlIGxvY2FsCisvLyByZXN1bHQgdmFyaWFibGUuCisjZGVmaW5lIENIRUNLX1NUQVRVU19GQUxTRShjb25kaXRpb25UaGF0VXBkYXRlc1Jlc3VsdCkgXAorICAgIGRvIHsgXAorICAgICAgICBib29sIHJlc3VsdCA9IHRydWU7IFwKKyAgICAgICAgRVhQRUNUX1RSVUUoKGNvbmRpdGlvblRoYXRVcGRhdGVzUmVzdWx0KS5pc09rKCkpOyBcCisgICAgICAgIEVYUEVDVF9GQUxTRShyZXN1bHQpOyBcCisgICAgfSB3aGlsZShmYWxzZSkKIAogY2xhc3MgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3RCYXNlIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CiBwdWJsaWM6CisgICAgc3RhdGljIFRlc3RDbGllbnQqIHRvVGVzdENsaWVudChzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gdGVzdENsaWVudCkgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGVzdENsaWVudCo+KHRlc3RDbGllbnQuZ2V0KCkpOworICAgIH0KKwogICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0QmFzZSgpCiAgICAgICAgIDogbVN5c3RlbUNCKG5ldyBUZXN0U3lzdGVtQ2FsbGJhY2soKSksCiAgICAgICAgICAgbVNlcnZpY2UoOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4oCkBAIC0xODMsNiArMjAxLDEwIEBACiAgICAgICAgICAgbVRlc3RDbGllbnQzKDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KGtUZXN0UGlkMiwgbVNlcnZpY2UpKSB7CiAgICAgfQogCisgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNyZWF0ZVRlc3RDbGllbnQoaW50IHBpZCkgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4ocGlkLCBtU2VydmljZSk7CisgICAgfQorCiAgICAgc3A8VGVzdFN5c3RlbUNhbGxiYWNrPiBtU3lzdGVtQ0I7CiAgICAgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+IG1TZXJ2aWNlOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBtVGVzdENsaWVudDE7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAKaW5kZXggYTAyOWQ0NS4uODczOWMzYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcApAQCAtMjUsMjIgKzI1LDYwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0IDogcHVibGljIFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0QmFzZSB7Citwcml2YXRlOgorICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIGNyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZShpbnQgYW1vdW50ID0gMSkgeworICAgICAgICByZXR1cm4gTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWMsCisgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVmlkZW9Db2RlYywgYW1vdW50KTsKKyAgICB9CisKKyAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoaW50IGFtb3VudCA9IDEpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjLAorICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1ZpZGVvQ29kZWMsIGFtb3VudCk7CisgICAgfQorCisgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgICAgIHJldHVybiBNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtTZWN1cmVDb2RlYywKKyAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtBdWRpb0NvZGVjLCBhbW91bnQpOworICAgIH0KKworICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIGNyZWF0ZU5vblNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZShpbnQgYW1vdW50ID0gMSkgeworICAgICAgICByZXR1cm4gTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWMsCisgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprQXVkaW9Db2RlYywgYW1vdW50KTsKKyAgICB9CisKKyAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBjcmVhdGVTZWN1cmVJbWFnZUNvZGVjUmVzb3VyY2UoaW50IGFtb3VudCA9IDEpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLAorICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a0ltYWdlQ29kZWMsIGFtb3VudCk7CisgICAgfQorCisgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlTm9uU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgICAgIHJldHVybiBNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtOb25TZWN1cmVDb2RlYywKKyAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtJbWFnZUNvZGVjLCBhbW91bnQpOworICAgIH0KKworICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIGNyZWF0ZUdyYXBoaWNNZW1vcnlSZXNvdXJjZShpbnQgYW1vdW50ID0gMSkgeworICAgICAgICByZXR1cm4gTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprR3JhcGhpY01lbW9yeSwKKyAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGUsIGFtb3VudCk7CisgICAgfQorCisgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlRHJtU2Vzc2lvblJlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgICAgIHJldHVybiBNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtEcm1TZXNzaW9uLAorICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZSwgYW1vdW50KTsKKyAgICB9CisKKyAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBjcmVhdGVCYXR0ZXJ5UmVzb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtCYXR0ZXJ5LAorICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZSwgMSk7CisgICAgfQorCisgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlQ3B1Qm9vc3RSZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0NwdUJvb3N0LAorICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZSwgMSk7CisgICAgfQorCiBwdWJsaWM6CiAgICAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QoKSA6IFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0QmFzZSgpIHt9CiAKLSAgICB2b2lkIHZlcmlmeUNsaWVudHMoYm9vbCBjMSwgYm9vbCBjMiwgYm9vbCBjMykgewotICAgICAgICBUZXN0Q2xpZW50ICpjbGllbnQxID0gc3RhdGljX2Nhc3Q8VGVzdENsaWVudCo+KG1UZXN0Q2xpZW50MS5nZXQoKSk7Ci0gICAgICAgIFRlc3RDbGllbnQgKmNsaWVudDIgPSBzdGF0aWNfY2FzdDxUZXN0Q2xpZW50Kj4obVRlc3RDbGllbnQyLmdldCgpKTsKLSAgICAgICAgVGVzdENsaWVudCAqY2xpZW50MyA9IHN0YXRpY19jYXN0PFRlc3RDbGllbnQqPihtVGVzdENsaWVudDMuZ2V0KCkpOwotCi0gICAgICAgIEVYUEVDVF9FUShjMSwgY2xpZW50MS0+cmVjbGFpbWVkKCkpOwotICAgICAgICBFWFBFQ1RfRVEoYzIsIGNsaWVudDItPnJlY2xhaW1lZCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKGMzLCBjbGllbnQzLT5yZWNsYWltZWQoKSk7Ci0KLSAgICAgICAgY2xpZW50MS0+cmVzZXQoKTsKLSAgICAgICAgY2xpZW50Mi0+cmVzZXQoKTsKLSAgICAgICAgY2xpZW50My0+cmVzZXQoKTsKLSAgICB9CiAKICAgICAvLyB0ZXN0IHNldCB1cAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjY4LDcgKzMwNiw2IEBACiAKICAgICB2b2lkIHRlc3RPdmVycmlkZVBpZCgpIHsKIAotICAgICAgICBib29sIHJlc3VsdDsKICAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOwogICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLCAxKSk7CiAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprR3JhcGhpY01lbW9yeSwgMTUwKSk7CkBAIC0yOTMsOCArMzMwLDYgQEAKICAgICB9CiAKICAgICB2b2lkIHRlc3RNYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwoKSB7Ci0gICAgICAgIGJvb2wgcmVzdWx0OwotCiAgICAgICAgIHsKICAgICAgICAgICAgIGFkZFJlc291cmNlKCk7CiAgICAgICAgICAgICBtU2VydmljZS0+bVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjID0gdHJ1ZTsKQEAgLTMwNywxMyArMzQyLDE3IEBACiAKICAgICAgICAgICAgIC8vIG5vIGxvd2VyIHByaW9yaXR5IGNsaWVudAogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa1Rlc3RQaWQyLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDIpKTsKIAogICAgICAgICAgICAgLy8gY2xpZW50IG1hcmtlZCBmb3IgcGVuZGluZyByZW1vdmFsIGZyb20gdGhlIHNhbWUgcHJvY2VzcyBnb3QgcmVjbGFpbWVkCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtUZXN0UGlkMiwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2xpZW50IDMgd2hpY2ggc3RpbGwgbGVmdAogICAgICAgICAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MykpOwpAQCAtMzMxLDExICszNzAsMTUgQEAKICAgICAgICAgICAgIC8vIGNsaWVudCBtYXJrZWQgZm9yIHBlbmRpbmcgcmVtb3ZhbCBmcm9tIHRoZSBzYW1lIHByb2Nlc3MgZ290IHJlY2xhaW1lZAogICAgICAgICAgICAgLy8gZmlyc3QsIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSBsb3dlciBwcmlvcml0eSBwcm9jZXNzCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtUZXN0UGlkMiwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gbG93ZXIgcHJpb3JpdHkgY2xpZW50IGdvdCByZWNsYWltZWQKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa1Rlc3RQaWQyLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSh0cnVlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjbGVhbiB1cCBjbGllbnQgMyB3aGljaCBzdGlsbCBsZWZ0CiAgICAgICAgICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSk7CkBAIC0zNDksMTcgKzM5MiwyMyBAQAogCiAgICAgICAgICAgICAvLyBjbGllbnQgbWFya2VkIGZvciBwZW5kaW5nIHJlbW92YWwgZ290IHJlY2xhaW1lZAogICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZXNGcm9tQ2xpZW50c1BlbmRpbmdSZW1vdmFsKGtUZXN0UGlkMikuaXNPaygpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSh0cnVlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBObyBtb3JlIGNsaWVudHMgbWFya2VkIGZvciByZW1vdmFsCiAgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlc0Zyb21DbGllbnRzUGVuZGluZ1JlbW92YWwoa1Rlc3RQaWQyKS5pc09rKCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MykpOwogCiAgICAgICAgICAgICAvLyBjbGllbnQgbWFya2VkIGZvciBwZW5kaW5nIHJlbW92YWwgZ290IHJlY2xhaW1lZAogICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZXNGcm9tQ2xpZW50c1BlbmRpbmdSZW1vdmFsKGtUZXN0UGlkMikuaXNPaygpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgdG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSh0cnVlLCB0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjbGVhbiB1cCBjbGllbnQgMSB3aGljaCBzdGlsbCBsZWZ0CiAgICAgICAgICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KGtUZXN0UGlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSk7CkBAIC0zODQsMTQgKzQzMywxNSBAQAogCiAgICAgdm9pZCB0ZXN0R2V0QWxsQ2xpZW50cygpIHsKICAgICAgICAgYWRkUmVzb3VyY2UoKTsKLQogICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUgPSBNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWM7CisgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSA9IE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGU7CisKICAgICAgICAgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiA+IGNsaWVudHM7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0QWxsQ2xpZW50c19sKGtMb3dQcmlvcml0eVBpZCwgdHlwZSwgJmNsaWVudHMpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRBbGxDbGllbnRzX2woa0xvd1ByaW9yaXR5UGlkLCB0eXBlLCBzdWJUeXBlLCAmY2xpZW50cykpOwogICAgICAgICAvLyBzb21lIGhpZ2hlciBwcmlvcml0eSBwcm9jZXNzIChlLmcuIGtUZXN0UGlkMikgb3ducyB0aGUgcmVzb3VyY2UsIHNvIGdldEFsbENsaWVudHNfbAogICAgICAgICAvLyB3aWxsIGZhaWwuCi0gICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0QWxsQ2xpZW50c19sKGtNaWRQcmlvcml0eVBpZCwgdHlwZSwgJmNsaWVudHMpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldEFsbENsaWVudHNfbChrSGlnaFByaW9yaXR5UGlkLCB0eXBlLCAmY2xpZW50cykpOworICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmdldEFsbENsaWVudHNfbChrTWlkUHJpb3JpdHlQaWQsIHR5cGUsIHN1YlR5cGUsICZjbGllbnRzKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRBbGxDbGllbnRzX2woa0hpZ2hQcmlvcml0eVBpZCwgdHlwZSwgc3ViVHlwZSwgJmNsaWVudHMpKTsKIAogICAgICAgICBFWFBFQ1RfRVEoMnUsIGNsaWVudHMuc2l6ZSgpKTsKICAgICAgICAgLy8gKE9LIHRvIHJlcXVpcmUgb3JkZXJpbmcgaW4gY2xpZW50c1tdLCBhcyB0aGUgcGlkIG1hcCBpcyBzb3J0ZWQpCkBAIC00MDAsNyArNDUwLDYgQEAKICAgICB9CiAKICAgICB2b2lkIHRlc3RSZWNsYWltUmVzb3VyY2VTZWN1cmUoKSB7Ci0gICAgICAgIGJvb2wgcmVzdWx0OwogICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CiAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWMsIDEpKTsKICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtHcmFwaGljTWVtb3J5LCAxNTApKTsKQEAgLTQxNywxMSArNDY2LDE1IEBACiAKICAgICAgICAgICAgIC8vIHJlY2xhaW0gYWxsIHNlY3VyZSBjb2RlY3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gb25lIGxhcmdlc3QgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBub3RoaW5nIGxlZnQKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwpAQCAtNDM5LDcgKzQ5Miw5IEBACiAKICAgICAgICAgICAgIC8vIHJlY2xhaW0gYWxsIHNlY3VyZSBhbmQgbm9uLXNlY3VyZSBjb2RlY3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIHRydWUgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBub3RoaW5nIGxlZnQKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwpAQCAtNDU4LDE1ICs1MTMsMjEgQEAKIAogICAgICAgICAgICAgLy8gcmVjbGFpbSBhbGwgbm9uLXNlY3VyZSBjb2RlY3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBvbmUgbGFyZ2VzdCBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyh0cnVlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gYW5vdGhlciBsYXJnZXN0IGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gbm90aGluZyBsZWZ0CiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKQEAgLTQ4MywxNSArNTQ0LDIxIEBACiAKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7CiAgICAgICAgICAgICAvLyBvbmUgbGFyZ2VzdCBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzIGdvdCByZWNsYWltZWQKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBub3RoaW5nIGxlZnQKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwpAQCAtNTA4LDIwICs1NzUsMjUgQEAKIAogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKICAgICAgICAgICAgIC8vIHNlY3VyZSBjb2RlYyBmcm9tIGxvd2VzdCBwcm9jZXNzIGdvdCByZWNsYWltZWQKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgc2VjdXJlIGNvZGVjIGZyb20gbG93ZXN0IHByb2Nlc3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gbm8gbW9yZSBzZWN1cmUgY29kZWMsIG5vbi1zZWN1cmUgY29kZWMgd2lsbCBiZSByZWNsYWltZWQuCiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIHRlc3RSZWNsYWltUmVzb3VyY2VOb25TZWN1cmUoKSB7Ci0gICAgICAgIGJvb2wgcmVzdWx0OwogICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CiAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlOjprTm9uU2VjdXJlQ29kZWMsIDEpKTsKICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtHcmFwaGljTWVtb3J5LCAxNTApKTsKQEAgLTUzNywxMSArNjA5LDE1IEBACiAKICAgICAgICAgICAgIC8vIHJlY2xhaW0gYWxsIHNlY3VyZSBjb2RlY3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gb25lIGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MSktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gbm90aGluZyBsZWZ0CiAgICAgICAgICAgICBDSEVDS19TVEFUVVNfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKQEAgLTU1OCwxNSArNjM0LDIxIEBACiAKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7CiAgICAgICAgICAgICAvLyBvbmUgbGFyZ2VzdCBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzIGdvdCByZWNsYWltZWQKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKLSAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQzKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOwogCiAgICAgICAgICAgICAvLyBub3RoaW5nIGxlZnQKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcywgJnJlc3VsdCkpOwpAQCAtNTgyLDExICs2NjQsMTUgQEAKIAogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMsICZyZXN1bHQpKTsKICAgICAgICAgICAgIC8vIG9uZSBub24gc2VjdXJlIGNvZGVjIGZyb20gbG93ZXN0IHByb2Nlc3MgZ290IHJlY2xhaW1lZAotICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDEpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQyKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDMpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CiAKICAgICAgICAgICAgIC8vIG5vIG1vcmUgbm9uLXNlY3VyZSBjb2RlYywgc2VjdXJlIGNvZGVjIGZyb20gbG93ZXN0IHByaW9yaXR5IHByb2Nlc3Mgd2lsbCBiZSByZWNsYWltZWQKICAgICAgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzLCAmcmVzdWx0KSk7Ci0gICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChtVGVzdENsaWVudDIpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MyktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKIAogICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2xpZW50IDMgd2hpY2ggc3RpbGwgbGVmdAogICAgICAgICAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MykpOwpAQCAtNTk1LDEzICs2ODEsMTcgQEAKIAogICAgIHZvaWQgdGVzdEdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudCgpIHsKICAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlID0gTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0dyYXBoaWNNZW1vcnk7CisgICAgICAgIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3ViVHlwZSA9IE1lZGlhUmVzb3VyY2U6OlN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGU7CiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQ7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woa0hpZ2hQcmlvcml0eVBpZCwgdHlwZSwgJmNsaWVudCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKGtIaWdoUHJpb3JpdHlQaWQsIHR5cGUsIHN1YlR5cGUsCisgICAgICAgICAgICAgICAgJmNsaWVudCkpOwogCiAgICAgICAgIGFkZFJlc291cmNlKCk7CiAKLSAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbChrTG93UHJpb3JpdHlQaWQsIHR5cGUsICZjbGllbnQpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKGtIaWdoUHJpb3JpdHlQaWQsIHR5cGUsICZjbGllbnQpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbChrTG93UHJpb3JpdHlQaWQsIHR5cGUsIHN1YlR5cGUsCisgICAgICAgICAgICAgICAgJmNsaWVudCkpOworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woa0hpZ2hQcmlvcml0eVBpZCwgdHlwZSwgc3ViVHlwZSwKKyAgICAgICAgICAgICAgICAmY2xpZW50KSk7CiAKICAgICAgICAgLy8ga1Rlc3RQaWQxIGlzIHRoZSBsb3dlc3QgcHJpb3JpdHkgcHJvY2VzcyB3aXRoIE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtHcmFwaGljTWVtb3J5LgogICAgICAgICAvLyBtVGVzdENsaWVudDEgaGFzIHRoZSBsYXJnZXN0IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtHcmFwaGljTWVtb3J5IHdpdGhpbiBrVGVzdFBpZDEuCkBAIC02MTQsMzUgKzcwNCwyNSBAQAogICAgICAgICBUZXN0UHJvY2Vzc0luZm8gcHJvY2Vzc0luZm87CiAKICAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlID0gTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0dyYXBoaWNNZW1vcnk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlQaWRfbCh0eXBlLCAmcGlkLCAmcHJpb3JpdHkpKTsKKyAgICAgICAgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJUeXBlID0gTWVkaWFSZXNvdXJjZTo6U3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eVBpZF9sKHR5cGUsIHN1YlR5cGUsICZwaWQsICZwcmlvcml0eSkpOwogCiAgICAgICAgIGFkZFJlc291cmNlKCk7CiAKLSAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5UGlkX2wodHlwZSwgJnBpZCwgJnByaW9yaXR5KSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eVBpZF9sKHR5cGUsIHN1YlR5cGUsICZwaWQsICZwcmlvcml0eSkpOwogICAgICAgICBFWFBFQ1RfRVEoa1Rlc3RQaWQxLCBwaWQpOwogICAgICAgICBpbnQgcHJpb3JpdHkxOwogICAgICAgICBwcm9jZXNzSW5mby5nZXRQcmlvcml0eShrVGVzdFBpZDEsICZwcmlvcml0eTEpOwogICAgICAgICBFWFBFQ1RfRVEocHJpb3JpdHkxLCBwcmlvcml0eSk7CiAKICAgICAgICAgdHlwZSA9IE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtOb25TZWN1cmVDb2RlYzsKLSAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5UGlkX2wodHlwZSwgJnBpZCwgJnByaW9yaXR5KSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eVBpZF9sKHR5cGUsIHN1YlR5cGUsICZwaWQsICZwcmlvcml0eSkpOwogICAgICAgICBFWFBFQ1RfRVEoa1Rlc3RQaWQyLCBwaWQpOwogICAgICAgICBpbnQgcHJpb3JpdHkyOwogICAgICAgICBwcm9jZXNzSW5mby5nZXRQcmlvcml0eShrVGVzdFBpZDIsICZwcmlvcml0eTIpOwogICAgICAgICBFWFBFQ1RfRVEocHJpb3JpdHkyLCBwcmlvcml0eSk7CiAgICAgfQogCi0gICAgdm9pZCB0ZXN0R2V0QmlnZ2VzdENsaWVudCgpIHsKLSAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlID0gTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0dyYXBoaWNNZW1vcnk7Ci0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQ7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0QmlnZ2VzdENsaWVudF9sKGtUZXN0UGlkMiwgdHlwZSwgJmNsaWVudCkpOwotCi0gICAgICAgIGFkZFJlc291cmNlKCk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldEJpZ2dlc3RDbGllbnRfbChrVGVzdFBpZDIsIHR5cGUsICZjbGllbnQpKTsKLSAgICAgICAgRVhQRUNUX0VRKG1UZXN0Q2xpZW50MiwgY2xpZW50KTsKLSAgICB9Ci0KICAgICB2b2lkIHRlc3RJc0NhbGxpbmdQcmlvcml0eUhpZ2hlcigpIHsKICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5pc0NhbGxpbmdQcmlvcml0eUhpZ2hlcl9sKDEwMSwgMTAwKSk7CiAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+aXNDYWxsaW5nUHJpb3JpdHlIaWdoZXJfbCgxMDAsIDEwMCkpOwpAQCAtNzI1LDYgKzgwNSwzNjEgQEAKICAgICAgICAgRVhQRUNUX0VRKDR1LCBtU3lzdGVtQ0ItPmV2ZW50Q291bnQoKSk7CiAgICAgICAgIEVYUEVDVF9FUShFdmVudFR5cGU6OkNQVVNFVF9ESVNBQkxFLCBtU3lzdGVtQ0ItPmxhc3RFdmVudFR5cGUoKSk7CiAgICAgfQorCisgICAgdm9pZCB0ZXN0UmVjbGFpbVJlc291cmNlc193aXRoVmlkZW9Db2RlY19yZWNsYWltc09ubHlWaWRlb0NvZGVjKCkgeworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGF1ZGlvSW1hZ2VUZXN0Q2xpZW50ID0gbVRlc3RDbGllbnQxOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIHZpZGVvVGVzdENsaWVudCA9IG1UZXN0Q2xpZW50MjsKKworICAgICAgICAvLyBDcmVhdGUgYW4gYXVkaW8gYW5kIGltYWdlIGNvZGVjIHJlc291cmNlCisgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IGF1ZGlvSW1hZ2VSZXNvdXJjZXM7CisgICAgICAgIGF1ZGlvSW1hZ2VSZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgpKTsKKyAgICAgICAgYXVkaW9JbWFnZVJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKCkpOworICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa0xvd1ByaW9yaXR5UGlkLCBrVGVzdFVpZDEsIGdldElkKGF1ZGlvSW1hZ2VUZXN0Q2xpZW50KSwKKyAgICAgICAgICAgICAgICBhdWRpb0ltYWdlVGVzdENsaWVudCwgYXVkaW9JbWFnZVJlc291cmNlcyk7CisKKyAgICAgICAgLy8gRmFpbCB0byByZWNsYWltIGEgdmlkZW8gY29kZWMgcmVzb3VyY2UKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVjbGFpbVJlc291cmNlczsKKyAgICAgICAgcmVjbGFpbVJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCkpOworICAgICAgICBDSEVDS19TVEFUVVNfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZWNsYWltUmVzb3VyY2VzLCAmcmVzdWx0KSk7CisKKyAgICAgICAgLy8gTm93IGFkZCBhIHZpZGVvIGNvZGVjIHJlc291cmNlCisgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHZpZGVvUmVzb3VyY2VzOworICAgICAgICB2aWRlb1Jlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCkpOworICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa0xvd1ByaW9yaXR5UGlkLCBrVGVzdFVpZDEsIGdldElkKHZpZGVvVGVzdENsaWVudCksIHZpZGVvVGVzdENsaWVudCwKKyAgICAgICAgICAgICAgICB2aWRlb1Jlc291cmNlcyk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG5ld2x5LWNyZWF0ZWQgdmlkZW8gY29kZWMgcmVzb3VyY2UgY2FuIGJlIHJlY2xhaW1lZAorICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlY2xhaW1SZXNvdXJjZXMsICZyZXN1bHQpKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgYXVkaW8gYW5kIGltYWdlIHJlc291cmNlcyBhcmUgdW50b3VjaGVkCisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQoYXVkaW9JbWFnZVRlc3RDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIC8vIEJ1dCB0aGUgdmlkZW8gcmVzb3VyY2Ugd2FzIHJlY2xhaW1lZAorICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQodmlkZW9UZXN0Q2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgIH0KKworICAgIHZvaWQgdGVzdFJlY2xhaW1SZXNvdXJjZXNfd2l0aEF1ZGlvQ29kZWNfcmVjbGFpbXNPbmx5QXVkaW9Db2RlYygpIHsKKyAgICAgICAgY29uc3QgYXV0byAmIHZpZGVvSW1hZ2VUZXN0Q2xpZW50ID0gbVRlc3RDbGllbnQxOworICAgICAgICBjb25zdCBhdXRvICYgYXVkaW9UZXN0Q2xpZW50ID0gbVRlc3RDbGllbnQyOworCisgICAgICAgIC8vIENyZWF0ZSBhIHZpZGVvIGFuZCBhdWRpbyBjb2RlYyByZXNvdXJjZQorICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiB2aWRlb0ltYWdlUmVzb3VyY2VzOworICAgICAgICB2aWRlb0ltYWdlUmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKSk7CisgICAgICAgIHZpZGVvSW1hZ2VSZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUltYWdlQ29kZWNSZXNvdXJjZSgpKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwga1Rlc3RVaWQxLCBnZXRJZCh2aWRlb0ltYWdlVGVzdENsaWVudCksCisgICAgICAgICAgICAgICAgdmlkZW9JbWFnZVRlc3RDbGllbnQsIHZpZGVvSW1hZ2VSZXNvdXJjZXMpOworCisgICAgICAgIC8vIEZhaWwgdG8gcmVjbGFpbSBhbiBhdWRpbyBjb2RlYyByZXNvdXJjZQorICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZWNsYWltUmVzb3VyY2VzOworICAgICAgICByZWNsYWltUmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKSk7CisgICAgICAgIENIRUNLX1NUQVRVU19GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlY2xhaW1SZXNvdXJjZXMsICZyZXN1bHQpKTsKKworICAgICAgICAvLyBOb3cgYWRkIGFuIGF1ZGlvIGNvZGVjIHJlc291cmNlCisgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IGF1ZGlvUmVzb3VyY2VzOworICAgICAgICBhdWRpb1Jlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKCkpOworICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa0xvd1ByaW9yaXR5UGlkLCBrVGVzdFVpZDIsIGdldElkKGF1ZGlvVGVzdENsaWVudCksIGF1ZGlvVGVzdENsaWVudCwKKyAgICAgICAgICAgICAgICBhdWRpb1Jlc291cmNlcyk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG5ld2x5LWNyZWF0ZWQgYXVkaW8gY29kZWMgcmVzb3VyY2UgY2FuIGJlIHJlY2xhaW1lZAorICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlY2xhaW1SZXNvdXJjZXMsICZyZXN1bHQpKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgdmlkZW8gYW5kIGltYWdlIHJlc291cmNlcyBhcmUgdW50b3VjaGVkCisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQodmlkZW9JbWFnZVRlc3RDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIC8vIEJ1dCB0aGUgYXVkaW8gcmVzb3VyY2Ugd2FzIHJlY2xhaW1lZAorICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQoYXVkaW9UZXN0Q2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgIH0KKworICAgIHZvaWQgdGVzdFJlY2xhaW1SZXNvdXJjZXNfd2l0aEltYWdlQ29kZWNfcmVjbGFpbXNPbmx5SW1hZ2VDb2RlYygpIHsKKyAgICAgICAgY29uc3QgYXV0byAmIHZpZGVvQXVkaW9UZXN0Q2xpZW50ID0gbVRlc3RDbGllbnQxOworICAgICAgICBjb25zdCBhdXRvICYgaW1hZ2VUZXN0Q2xpZW50ID0gbVRlc3RDbGllbnQyOworCisgICAgICAgIC8vIENyZWF0ZSBhIHZpZGVvIGFuZCBhdWRpbyBjb2RlYyByZXNvdXJjZQorICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiB2aWRlb0F1ZGlvUmVzb3VyY2VzOworICAgICAgICB2aWRlb0F1ZGlvUmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKSk7CisgICAgICAgIHZpZGVvQXVkaW9SZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgpKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwga1Rlc3RVaWQxLCBnZXRJZCh2aWRlb0F1ZGlvVGVzdENsaWVudCksCisgICAgICAgICAgICAgICAgdmlkZW9BdWRpb1Rlc3RDbGllbnQsIHZpZGVvQXVkaW9SZXNvdXJjZXMpOworCisgICAgICAgIC8vIEZhaWwgdG8gcmVjbGFpbSBhbiBpbWFnZSBjb2RlYyByZXNvdXJjZQorICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZWNsYWltUmVzb3VyY2VzOworICAgICAgICByZWNsYWltUmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVJbWFnZUNvZGVjUmVzb3VyY2UoKSk7CisgICAgICAgIENIRUNLX1NUQVRVU19GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlY2xhaW1SZXNvdXJjZXMsICZyZXN1bHQpKTsKKworICAgICAgICAvLyBOb3cgYWRkIGFuIGltYWdlIGNvZGVjIHJlc291cmNlCisgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IGltYWdlUmVzb3VyY2VzOworICAgICAgICBpbWFnZVJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKCkpOworICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa0xvd1ByaW9yaXR5UGlkLCBrVGVzdFVpZDIsIGdldElkKGltYWdlVGVzdENsaWVudCksIGltYWdlVGVzdENsaWVudCwKKyAgICAgICAgICAgICAgICBpbWFnZVJlc291cmNlcyk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG5ld2x5LWNyZWF0ZWQgaW1hZ2UgY29kZWMgcmVzb3VyY2UgY2FuIGJlIHJlY2xhaW1lZAorICAgICAgICBDSEVDS19TVEFUVVNfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlY2xhaW1SZXNvdXJjZXMsICZyZXN1bHQpKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgdmlkZW8gYW5kIGF1ZGlvIHJlc291cmNlcyBhcmUgdW50b3VjaGVkCisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobVRlc3RDbGllbnQxKS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAvLyBCdXQgdGhlIGltYWdlIHJlc291cmNlIHdhcyByZWNsYWltZWQKKyAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG1UZXN0Q2xpZW50MiktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RSZWNsYWltUmVzb3VyY2VzX3doZW5QYXJ0aWFsUmVzb3VyY2VNYXRjaF9yZWNsYWltcygpIHsKKyAgICAgICAgY29uc3QgaW50IG9ubHlVaWQgPSBrVGVzdFVpZDE7CisgICAgICAgIGNvbnN0IGF1dG8gb25seUNsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQoa0xvd1ByaW9yaXR5UGlkKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiBvd25lZFJlc291cmNlczsKKyAgICAgICAgb3duZWRSZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpKTsKKyAgICAgICAgb3duZWRSZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZUdyYXBoaWNNZW1vcnlSZXNvdXJjZSgxMDApKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwgb25seVVpZCwgZ2V0SWQob25seUNsaWVudCksIG9ubHlDbGllbnQsCisgICAgICAgICAgICAgICAgb3duZWRSZXNvdXJjZXMpOworCisgICAgICAgIC8vIFJlY2xhaW0gYW4gaW1hZ2UgY29kZWMgaW5zdGVhZCBvZiB0aGUgdmlkZW8gY29kZWMgdGhhdCBpcyBvd25lZCwgYnV0IGFsc28gcmVjbGFpbQorICAgICAgICAvLyBncmFwaGljcyBtZW1vcnksIHdoaWNoIHdpbGwgdHJpZ2dlciB0aGUgcmVjbGFpbS4KKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVjbGFpbVJlc291cmNlczsKKyAgICAgICAgcmVjbGFpbVJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKCkpOworICAgICAgICByZWNsYWltUmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVHcmFwaGljTWVtb3J5UmVzb3VyY2UoMTAwKSk7CisgICAgICAgIENIRUNLX1NUQVRVU19UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVjbGFpbVJlc291cmNlcywgJnJlc3VsdCkpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSB2aWRlbyBjb2RlYyByZXNvdXJjZXMgKGluY2x1ZGluZyB0aGUgbmVlZGVkIGdyYXBoaWMgbWVtb3J5KSBpcyByZWNsYWltZWQKKyAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KG9ubHlDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgfQorCisgICAgdm9pZCB0ZXN0UmVjbGFpbVJlc291cmNlc0Zyb21NYXJrZWRDbGllbnRzX3JlbW92ZXNCaWdnZXN0TWFya2VkQ2xpZW50Rm9yU29tZVJlc291cmNlcygpIHsKKyAgICAgICAgLy8gdGhpcyB0ZXN0IG9ubHkgdXNlcyBvbmUgcGlkIGFuZCBvbmUgdWlkCisgICAgICAgIGNvbnN0IGludCBvbmx5UGlkID0ga1Rlc3RQaWQxOworICAgICAgICBjb25zdCBpbnQgb25seVVpZCA9IGtUZXN0VWlkMTsKKworICAgICAgICAvLyBzZWN1cmUgdmlkZW8gY29kZWMKKyAgICAgICAgY29uc3QgYXV0byBzbWFsbFNlY3VyZVZpZGVvTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZVNlY3VyZVZpZGVvTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZXN0U2VjdXJlVmlkZW9BY3RpdmVDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgxKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQoc21hbGxTZWN1cmVWaWRlb01hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIHNtYWxsU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKDIpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChsYXJnZVNlY3VyZVZpZGVvTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VTZWN1cmVWaWRlb01hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVTZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoMykpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlc3RTZWN1cmVWaWRlb0FjdGl2ZUNsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlc3RTZWN1cmVWaWRlb0FjdGl2ZUNsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKHNtYWxsU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQpKTsKKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChsYXJnZVNlY3VyZVZpZGVvTWFya2VkQ2xpZW50KSk7CisgICAgICAgIC8vIGRvbid0IG1hcmsgdGhlIGxhcmdlc3QgY2xpZW50CisKKyAgICAgICAgLy8gbm9uLXNlY3VyZSB2aWRlbyBjb2RlYworICAgICAgICBjb25zdCBhdXRvIHNtYWxsTm9uU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlTm9uU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlc3ROb25TZWN1cmVWaWRlb0FjdGl2ZUNsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKDEpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChzbWFsbE5vblNlY3VyZVZpZGVvTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgc21hbGxOb25TZWN1cmVWaWRlb01hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoMikpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlTm9uU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBsYXJnZU5vblNlY3VyZVZpZGVvTWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgzKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VzdE5vblNlY3VyZVZpZGVvQWN0aXZlQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VzdE5vblNlY3VyZVZpZGVvQWN0aXZlQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICB9CisgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwob25seVBpZCwgZ2V0SWQoc21hbGxOb25TZWN1cmVWaWRlb01hcmtlZENsaWVudCkpOworICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKGxhcmdlTm9uU2VjdXJlVmlkZW9NYXJrZWRDbGllbnQpKTsKKyAgICAgICAgLy8gZG9uJ3QgbWFyayB0aGUgbGFyZ2VzdCBjbGllbnQKKworICAgICAgICAvLyBzZWN1cmUgYXVkaW8gY29kZWMKKyAgICAgICAgY29uc3QgYXV0byBzbWFsbFNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZVNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZXN0U2VjdXJlQXVkaW9BY3RpdmVDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZVNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgxKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQoc21hbGxTZWN1cmVBdWRpb01hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIHNtYWxsU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKDIpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChsYXJnZVNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VTZWN1cmVBdWRpb01hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVTZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoMykpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlc3RTZWN1cmVWaWRlb0FjdGl2ZUNsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlc3RTZWN1cmVWaWRlb0FjdGl2ZUNsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKHNtYWxsU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQpKTsKKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChsYXJnZVNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50KSk7CisgICAgICAgIC8vIGRvbid0IG1hcmsgdGhlIGxhcmdlc3QgY2xpZW50CisKKyAgICAgICAgLy8gbm9uLXNlY3VyZSBhdWRpbyBjb2RlYworICAgICAgICBjb25zdCBhdXRvIHNtYWxsTm9uU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlTm9uU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlc3ROb25TZWN1cmVBdWRpb0FjdGl2ZUNsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKDEpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChzbWFsbE5vblNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgc21hbGxOb25TZWN1cmVBdWRpb01hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoMikpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlTm9uU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBsYXJnZU5vblNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgzKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VzdE5vblNlY3VyZUF1ZGlvQWN0aXZlQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VzdE5vblNlY3VyZUF1ZGlvQWN0aXZlQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICB9CisgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwob25seVBpZCwgZ2V0SWQoc21hbGxOb25TZWN1cmVBdWRpb01hcmtlZENsaWVudCkpOworICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKGxhcmdlTm9uU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQpKTsKKyAgICAgICAgLy8gZG9uJ3QgbWFyayB0aGUgbGFyZ2VzdCBjbGllbnQKKworICAgICAgICAvLyBzZWN1cmUgaW1hZ2UgY29kZWMKKyAgICAgICAgY29uc3QgYXV0byBzbWFsbFNlY3VyZUltYWdlTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZVNlY3VyZUltYWdlTWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZXN0U2VjdXJlSW1hZ2VBY3RpdmVDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZVNlY3VyZUltYWdlQ29kZWNSZXNvdXJjZSgxKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQoc21hbGxTZWN1cmVJbWFnZU1hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIHNtYWxsU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKDIpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChsYXJnZVNlY3VyZUltYWdlTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VTZWN1cmVJbWFnZU1hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVTZWN1cmVJbWFnZUNvZGVjUmVzb3VyY2UoMykpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlc3RTZWN1cmVJbWFnZUFjdGl2ZUNsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlc3RTZWN1cmVJbWFnZUFjdGl2ZUNsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKHNtYWxsU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQpKTsKKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChsYXJnZVNlY3VyZUltYWdlTWFya2VkQ2xpZW50KSk7CisgICAgICAgIC8vIGRvbid0IG1hcmsgdGhlIGxhcmdlc3QgY2xpZW50CisKKyAgICAgICAgLy8gbm9uLXNlY3VyZSBpbWFnZSBjb2RlYworICAgICAgICBjb25zdCBhdXRvIHNtYWxsTm9uU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlTm9uU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlc3ROb25TZWN1cmVJbWFnZUFjdGl2ZUNsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlTm9uU2VjdXJlSW1hZ2VDb2RlY1Jlc291cmNlKDEpKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChzbWFsbE5vblNlY3VyZUltYWdlTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgc21hbGxOb25TZWN1cmVJbWFnZU1hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVJbWFnZUNvZGVjUmVzb3VyY2UoMikpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKGxhcmdlTm9uU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBsYXJnZU5vblNlY3VyZUltYWdlTWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZU5vblNlY3VyZUltYWdlQ29kZWNSZXNvdXJjZSgzKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VzdE5vblNlY3VyZUltYWdlQWN0aXZlQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VzdE5vblNlY3VyZUltYWdlQWN0aXZlQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICB9CisgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwob25seVBpZCwgZ2V0SWQoc21hbGxOb25TZWN1cmVJbWFnZU1hcmtlZENsaWVudCkpOworICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKGxhcmdlTm9uU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQpKTsKKyAgICAgICAgLy8gZG9uJ3QgbWFyayB0aGUgbGFyZ2VzdCBjbGllbnQKKworICAgICAgICAvLyBncmFwaGljIG1lbW9yeQorICAgICAgICBjb25zdCBhdXRvIHNtYWxsR3JhcGhpY01lbW9yeU1hcmtlZENsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIGNvbnN0IGF1dG8gbGFyZ2VHcmFwaGljTWVtb3J5TWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgY29uc3QgYXV0byBsYXJnZXN0R3JhcGhpY01lbW9yeUFjdGl2ZUNsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soY3JlYXRlR3JhcGhpY01lbW9yeVJlc291cmNlKDEwMCkpOworICAgICAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKG9ubHlQaWQsIG9ubHlVaWQsIGdldElkKHNtYWxsR3JhcGhpY01lbW9yeU1hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIHNtYWxsR3JhcGhpY01lbW9yeU1hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVHcmFwaGljTWVtb3J5UmVzb3VyY2UoMjAwKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VHcmFwaGljTWVtb3J5TWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VHcmFwaGljTWVtb3J5TWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZUdyYXBoaWNNZW1vcnlSZXNvdXJjZSgzMDApKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShvbmx5UGlkLCBvbmx5VWlkLCBnZXRJZChsYXJnZXN0R3JhcGhpY01lbW9yeUFjdGl2ZUNsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGxhcmdlc3RHcmFwaGljTWVtb3J5QWN0aXZlQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICB9CisgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwob25seVBpZCwgZ2V0SWQoc21hbGxHcmFwaGljTWVtb3J5TWFya2VkQ2xpZW50KSk7CisgICAgICAgIG1TZXJ2aWNlLT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwob25seVBpZCwgZ2V0SWQobGFyZ2VHcmFwaGljTWVtb3J5TWFya2VkQ2xpZW50KSk7CisgICAgICAgIC8vIGRvbid0IG1hcmsgdGhlIGxhcmdlc3QgY2xpZW50CisKKyAgICAgICAgLy8gRFJNIHNlc3Npb24KKyAgICAgICAgY29uc3QgYXV0byBzbWFsbERybVNlc3Npb25NYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICBjb25zdCBhdXRvIGxhcmdlRHJtU2Vzc2lvbk1hcmtlZENsaWVudCA9IGNyZWF0ZVRlc3RDbGllbnQob25seVBpZCk7CisgICAgICAgIGNvbnN0IGF1dG8gbGFyZ2VzdERybVNlc3Npb25BY3RpdmVDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZURybVNlc3Npb25SZXNvdXJjZSgxKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQoc21hbGxEcm1TZXNzaW9uTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgc21hbGxEcm1TZXNzaW9uTWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZURybVNlc3Npb25SZXNvdXJjZSgyKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VEcm1TZXNzaW9uTWFya2VkQ2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgbGFyZ2VEcm1TZXNzaW9uTWFya2VkQ2xpZW50LCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZURybVNlc3Npb25SZXNvdXJjZSgzKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQobGFyZ2VzdERybVNlc3Npb25BY3RpdmVDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBsYXJnZXN0RHJtU2Vzc2lvbkFjdGl2ZUNsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKHNtYWxsRHJtU2Vzc2lvbk1hcmtlZENsaWVudCkpOworICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKGxhcmdlRHJtU2Vzc2lvbk1hcmtlZENsaWVudCkpOworICAgICAgICAvLyBkb24ndCBtYXJrIHRoZSBsYXJnZXN0IGNsaWVudAorCisgICAgICAgIC8vIGJhdHRlcnkKKyAgICAgICAgY29uc3QgYXV0byBiYXR0ZXJ5TWFya2VkQ2xpZW50ID0gY3JlYXRlVGVzdENsaWVudChvbmx5UGlkKTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVCYXR0ZXJ5UmVzb3VyY2UoKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQoYmF0dGVyeU1hcmtlZENsaWVudCksCisgICAgICAgICAgICAgICAgICAgIGJhdHRlcnlNYXJrZWRDbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgIH0KKyAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChvbmx5UGlkLCBnZXRJZChiYXR0ZXJ5TWFya2VkQ2xpZW50KSk7CisKKyAgICAgICAgLy8gQ1BVIGJvb3N0CisgICAgICAgIGNvbnN0IGF1dG8gY3B1Qm9vc3RNYXJrZWRDbGllbnQgPSBjcmVhdGVUZXN0Q2xpZW50KG9ubHlQaWQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisgICAgICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKGNyZWF0ZUNwdUJvb3N0UmVzb3VyY2UoKSk7CisgICAgICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uob25seVBpZCwgb25seVVpZCwgZ2V0SWQoY3B1Qm9vc3RNYXJrZWRDbGllbnQpLAorICAgICAgICAgICAgICAgICAgICBjcHVCb29zdE1hcmtlZENsaWVudCwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKG9ubHlQaWQsIGdldElkKGNwdUJvb3N0TWFya2VkQ2xpZW50KSk7CisKKyAgICAgICAgLy8gbm93IHdlIGV4cGVjdCB0aGF0IHdlIG9ubHkgcmVjbGFpbSByZXNvdXJjZXMgZnJvbSB0aGUgYmlnZ2VzdCBtYXJrZWQgY2xpZW50CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2VzRnJvbUNsaWVudHNQZW5kaW5nUmVtb3ZhbChvbmx5UGlkKS5pc09rKCkpOworICAgICAgICAvLyBzZWN1cmUgdmlkZW8gY29kZWMKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChzbWFsbFNlY3VyZVZpZGVvTWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobGFyZ2VTZWN1cmVWaWRlb01hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChsYXJnZXN0U2VjdXJlVmlkZW9BY3RpdmVDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIC8vIG5vbi1zZWN1cmUgdmlkZW8gY29kZWMKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChzbWFsbE5vblNlY3VyZVZpZGVvTWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0b1Rlc3RDbGllbnQobGFyZ2VOb25TZWN1cmVWaWRlb01hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChsYXJnZXN0Tm9uU2VjdXJlVmlkZW9BY3RpdmVDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIC8vIHNlY3VyZSBhdWRpbyBjb2RlYworICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KHNtYWxsU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChsYXJnZVNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KGxhcmdlc3RTZWN1cmVBdWRpb0FjdGl2ZUNsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgLy8gbm9uLXNlY3VyZSBhdWRpbyBjb2RlYworICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KHNtYWxsTm9uU2VjdXJlQXVkaW9NYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChsYXJnZU5vblNlY3VyZUF1ZGlvTWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KGxhcmdlc3ROb25TZWN1cmVBdWRpb0FjdGl2ZUNsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgLy8gc2VjdXJlIGltYWdlIGNvZGVjCisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQoc21hbGxTZWN1cmVJbWFnZU1hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KGxhcmdlU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobGFyZ2VzdFNlY3VyZUltYWdlQWN0aXZlQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAvLyBub24tc2VjdXJlIGltYWdlIGNvZGVjCisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQoc21hbGxOb25TZWN1cmVJbWFnZU1hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KGxhcmdlTm9uU2VjdXJlSW1hZ2VNYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobGFyZ2VzdE5vblNlY3VyZUltYWdlQWN0aXZlQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAvLyBncmFwaGljIG1lbW9yeQorICAgICAgICBFWFBFQ1RfRkFMU0UodG9UZXN0Q2xpZW50KHNtYWxsR3JhcGhpY01lbW9yeU1hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodG9UZXN0Q2xpZW50KGxhcmdlR3JhcGhpY01lbW9yeU1hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChsYXJnZXN0R3JhcGhpY01lbW9yeUFjdGl2ZUNsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICAgICAgLy8gRFJNIHNlc3Npb24KKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChzbWFsbERybVNlc3Npb25NYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHRvVGVzdENsaWVudChsYXJnZURybVNlc3Npb25NYXJrZWRDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0b1Rlc3RDbGllbnQobGFyZ2VzdERybVNlc3Npb25BY3RpdmVDbGllbnQpLT5jaGVja0lmUmVjbGFpbWVkQW5kUmVzZXQoKSk7CisgICAgICAgIC8vIGJhdHRlcnkgaXMgbm90IGV4cGVjdGVkIHRvIGJlIHJlY2xhaW1lZCB3aGVuIG1hcmtlZCBhcyBwZW5kaW5nIHJlbW92YWwKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChiYXR0ZXJ5TWFya2VkQ2xpZW50KS0+Y2hlY2tJZlJlY2xhaW1lZEFuZFJlc2V0KCkpOworICAgICAgICAvLyBDUFUgYm9vc3QgaXMgbm90IGV4cGVjdGVkIHRvIGJlIHJlY2xhaW1lZCB3aGVuIG1hcmtlZCBhcyBwZW5kaW5nIHJlbW92YWwKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHRvVGVzdENsaWVudChjcHVCb29zdE1hcmtlZENsaWVudCktPmNoZWNrSWZSZWNsYWltZWRBbmRSZXNldCgpKTsKKyAgICB9CiB9OwogCiBURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIGNvbmZpZykgewpAQCAtNzY4LDE5ICsxMjAzLDE1IEBACiAgICAgdGVzdEdldExvd2VzdFByaW9yaXR5UGlkKCk7CiB9CiAKLVRFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgZ2V0QmlnZ2VzdENsaWVudF9sKSB7Ci0gICAgdGVzdEdldEJpZ2dlc3RDbGllbnQoKTsKLX0KLQogVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCBpc0NhbGxpbmdQcmlvcml0eUhpZ2hlcl9sKSB7CiAgICAgdGVzdElzQ2FsbGluZ1ByaW9yaXR5SGlnaGVyKCk7CiB9CiAKLVRFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgdGVzdEJhdHRlcnlTdGF0cykgeworVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCBiYXR0ZXJ5U3RhdHMpIHsKICAgICB0ZXN0QmF0dGVyeVN0YXRzKCk7CiB9CiAKLVRFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgdGVzdENwdXNldEJvb3N0KSB7CitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIGNwdXNldEJvb3N0KSB7CiAgICAgdGVzdENwdXNldEJvb3N0KCk7CiB9CiAKQEAgLTc5Miw0ICsxMjIzLDI1IEBACiAgICAgdGVzdE1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbCgpOwogfQogCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIHJlY2xhaW1SZXNvdXJjZXNfd2l0aFZpZGVvQ29kZWNfcmVjbGFpbXNPbmx5VmlkZW9Db2RlYykgeworICAgIHRlc3RSZWNsYWltUmVzb3VyY2VzX3dpdGhWaWRlb0NvZGVjX3JlY2xhaW1zT25seVZpZGVvQ29kZWMoKTsKK30KKworVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCByZWNsYWltUmVzb3VyY2VzX3dpdGhBdWRpb0NvZGVjX3JlY2xhaW1zT25seUF1ZGlvQ29kZWMpIHsKKyAgICB0ZXN0UmVjbGFpbVJlc291cmNlc193aXRoQXVkaW9Db2RlY19yZWNsYWltc09ubHlBdWRpb0NvZGVjKCk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgcmVjbGFpbVJlc291cmNlc193aXRoSW1hZ2VDb2RlY19yZWNsYWltc09ubHlJbWFnZUNvZGVjKSB7CisgICAgdGVzdFJlY2xhaW1SZXNvdXJjZXNfd2l0aEltYWdlQ29kZWNfcmVjbGFpbXNPbmx5SW1hZ2VDb2RlYygpOworfQorCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIHJlY2xhaW1SZXNvdXJjZXNfd2hlblBhcnRpYWxSZXNvdXJjZU1hdGNoX3JlY2xhaW1zKSB7CisgICAgdGVzdFJlY2xhaW1SZXNvdXJjZXNfd2hlblBhcnRpYWxSZXNvdXJjZU1hdGNoX3JlY2xhaW1zKCk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwKKyAgICAgICAgcmVjbGFpbVJlc291cmNlc0Zyb21NYXJrZWRDbGllbnRzX3JlbW92ZXNCaWdnZXN0TWFya2VkQ2xpZW50Rm9yU29tZVJlc291cmNlcykgeworICAgIHRlc3RSZWNsYWltUmVzb3VyY2VzRnJvbU1hcmtlZENsaWVudHNfcmVtb3Zlc0JpZ2dlc3RNYXJrZWRDbGllbnRGb3JTb21lUmVzb3VyY2VzKCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdC5jcHAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlX3Rlc3QuY3BwCmluZGV4IGFjZDlkZjEuLjAwMzU2OWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdC5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU9ic2VydmVyU2VydmljZV90ZXN0LmNwcApAQCAtMTE2LDYgKzExNiwyNiBAQAogCiBjb25zdCBFdmVudFRyYWNrZXI6OkV2ZW50IEV2ZW50VHJhY2tlcjo6Tm9FdmVudDsKIAorc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLAorICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVmlkZW9Db2RlYywgYW1vdW50KTsKK30KKworc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjLAorICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprVmlkZW9Db2RlYywgYW1vdW50KTsKK30KKworc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a1NlY3VyZUNvZGVjLAorICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprQXVkaW9Db2RlYywgYW1vdW50KTsKK30KKworc3RhdGljIE1lZGlhUmVzb3VyY2UgY3JlYXRlTm9uU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKGludCBhbW91bnQgPSAxKSB7CisgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZTo6a05vblNlY3VyZUNvZGVjLAorICAgICAgICBNZWRpYVJlc291cmNlOjpTdWJUeXBlOjprQXVkaW9Db2RlYywgYW1vdW50KTsKK30KKwogLy8gT3BlcmF0b3JzIGZvciBHVGVzdCBtYWNyb3MuCiBib29sIG9wZXJhdG9yPT0oY29uc3QgRXZlbnRUcmFja2VyOjpFdmVudCYgbGhzLCBjb25zdCBFdmVudFRyYWNrZXI6OkV2ZW50JiByaHMpIHsKICAgICByZXR1cm4gbGhzLnR5cGUgPT0gcmhzLnR5cGUgJiYgbGhzLnVpZCA9PSByaHMudWlkICYmIGxocy5waWQgPT0gcmhzLnBpZCAmJgpAQCAtMjMzLDMwICsyNTMsMzAgQEAKIAogICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKICAgICAvLyBBZGQgc2VjdXJlIHZpZGVvIGNvZGVjLgotICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pfTsKKyAgICByZXNvdXJjZXMgPSB7Y3JlYXRlU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCl9OwogICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDEsIGtUZXN0VWlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSwgbVRlc3RDbGllbnQxLCByZXNvdXJjZXMpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDEsIGtUZXN0UGlkMSwgb2JzZXJ2YWJsZXMxKSk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQxLCBrVGVzdFBpZDEsIG9ic2VydmFibGVzMSkpOwogCiAgICAgLy8gQWRkIG5vbi1zZWN1cmUgdmlkZW8gY29kZWMuCi0gICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKX07CiAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDIpLCBtVGVzdENsaWVudDIsIHJlc291cmNlcyk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CiAKICAgICAvLyBBZGQgc2VjdXJlICYgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MuCi0gICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVTZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCl9OwogICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGtUZXN0VWlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgbVRlc3RDbGllbnQzLCByZXNvdXJjZXMpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMxKSk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczIpKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMykpOwogCiAgICAgLy8gQWRkIGFkZGl0aW9uYWwgYXVkaW8gY29kZWNzLCBzaG91bGQgYmUgaWdub3JlZC4KLSAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLykpOwotICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKSk7CisgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVTZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKSk7CisgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKSk7CiAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMSwga1Rlc3RVaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCBtVGVzdENsaWVudDEsIHJlc291cmNlcyk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMSwga1Rlc3RQaWQxLCBvYnNlcnZhYmxlczEpKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQxLCBrVGVzdFBpZDEsIG9ic2VydmFibGVzMikpOwpAQCAtMjc2LDkgKzI5Niw5IEBACiAKICAgICAvLyBBZGQgbXVsdGlwbGUgc2VjdXJlICYgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MuCiAgICAgLy8gTXVsdGlwbGUgZW50cmllcyBvZiB0aGUgc2FtZSB0eXBlIHNob3VsZCBiZSBtZXJnZWQsIGNvdW50IHNob3VsZCBiZSBwcm9wYWdhdGVkIGNvcnJlY3RseS4KLSAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovLCAzIC8qY291bnQqLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVTZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgY3JlYXRlU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCksCisgICAgICAgICAgICAgICAgIGNyZWF0ZU5vblNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgzKX07CiAgICAgb2JzZXJ2YWJsZXMxID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMn19OwogICAgIG9ic2VydmFibGVzMiA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIDN9fTsKICAgICBvYnNlcnZhYmxlczMgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjLCAyfSwKQEAgLTMwMCw3ICszMjAsNyBAQAogCiAgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOwogICAgIC8vIEFkZCBzZWN1cmUgdmlkZW8gY29kZWMgdG8gY2xpZW50MS4KLSAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKX07CisgICAgcmVzb3VyY2VzID0ge2NyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpfTsKICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQxLCBrVGVzdFVpZDEsIGdldElkKG1UZXN0Q2xpZW50MSksIG1UZXN0Q2xpZW50MSwgcmVzb3VyY2VzKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQxLCBrVGVzdFBpZDEsIG9ic2VydmFibGVzMSkpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CkBAIC0zMjIsNyArMzQyLDcgQEAKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOwogCiAgICAgLy8gQWRkIG5vbi1zZWN1cmUgdmlkZW8gY29kZWMgdG8gY2xpZW50Mi4KLSAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKX07CisgICAgcmVzb3VyY2VzID0ge2NyZWF0ZU5vblNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpfTsKICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQyLCBrVGVzdFVpZDIsIGdldElkKG1UZXN0Q2xpZW50MiksIG1UZXN0Q2xpZW50MiwgcmVzb3VyY2VzKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CkBAIC0zNDQsMjQgKzM2NCwyNCBAQAogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CiAKICAgICAvLyBBZGQgc2VjdXJlICYgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MsIHBsdXMgYXVkaW8gY29kZWNzICh0aGF0J3MgaWdub3JlZCkuCi0gICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAxIC8qdmlkZW8qLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLyksCi0gICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVTZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgY3JlYXRlTm9uU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCksCisgICAgICAgICAgICAgICAgIGNyZWF0ZVNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgpLAorICAgICAgICAgICAgICAgICBjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKX07CiAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCBtVGVzdENsaWVudDMsIHJlc291cmNlcyk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczEpKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMzKSk7CiAgICAgLy8gUmVtb3ZlIG9uZSBhdWRpbyBjb2RlYywgc2hvdWxkIGhhdmUgbm8gZXZlbnQuCi0gICAgcmVzb3VyY2VzID0ge01lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVTZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKX07CiAgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgcmVzb3VyY2VzKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKICAgICAvLyBSZW1vdmUgdGhlIG90aGVyIGF1ZGlvIGNvZGVjIGFuZCB0aGUgc2VjdXJlIHZpZGVvIGNvZGVjLCBvbmx5IHNlY3VyZSB2aWRlbyBjb2RlYwogICAgIC8vIHJlbW92YWwgc2hvdWxkIGJlIHJlcG9ydGVkLgotICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMCAvKnZpZGVvKi8pLAotICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pfTsKKyAgICByZXNvdXJjZXMgPSB7Y3JlYXRlTm9uU2VjdXJlQXVkaW9Db2RlY1Jlc291cmNlKCksCisgICAgICAgICAgICAgICAgIGNyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpfTsKICAgICBtU2VydmljZS0+cmVtb3ZlUmVzb3VyY2Uoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCByZXNvdXJjZXMpOwogICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6SWRsZShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMxKSk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKQEAgLTM4NiwxMCArNDA2LDEwIEBACiAKICAgICAvLyBBZGQgbXVsdGlwbGUgc2VjdXJlICYgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MsIHBsdXMgYXVkaW8gY29kZWNzICh0aGF0J3MgaWdub3JlZCkuCiAgICAgLy8gKFJlc291cmNlTWFuYWdlciB3aWxsIG1lcmdlIHRoZXNlIGludGVybmFsbHkuKQotICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pLAotICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8sIDQgLypjb3VudCovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKX07CisgICAgcmVzb3VyY2VzID0ge2NyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpLAorICAgICAgICAgICAgICAgICBjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoNCksCisgICAgICAgICAgICAgICAgIGNyZWF0ZVNlY3VyZUF1ZGlvQ29kZWNSZXNvdXJjZSgpLAorICAgICAgICAgICAgICAgICBjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKX07CiAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCBtVGVzdENsaWVudDMsIHJlc291cmNlcyk7CiAgICAgb2JzZXJ2YWJsZXMxID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMX19OwogICAgIG9ic2VydmFibGVzMiA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIDR9fTsKQEAgLTQwMCwxMCArNDIwLDEwIEBACiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczMpKTsKICAgICAvLyBSZW1vdmUgb25lIGF1ZGlvIGNvZGVjLCAyIHNlY3VyZSB2aWRlbyBjb2RlY3MgYW5kIDIgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MuCiAgICAgLy8gMSBzZWN1cmUgdmlkZW8gY29kZWMgcmVtb3ZhbCBhbmQgMiBub24tc2VjdXJlIHZpZGVvIGNvZGVjIHJlbW92YWxzIHNob3VsZCBiZSByZXBvcnRlZC4KLSAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovLCAyIC8qY291bnQqLyl9OworICAgIHJlc291cmNlcyA9IHtjcmVhdGVOb25TZWN1cmVBdWRpb0NvZGVjUmVzb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgY3JlYXRlU2VjdXJlVmlkZW9Db2RlY1Jlc291cmNlKCksCisgICAgICAgICAgICAgICAgIGNyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpLAorICAgICAgICAgICAgICAgICBjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoMil9OwogICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MyksIHJlc291cmNlcyk7CiAgICAgb2JzZXJ2YWJsZXMxID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMX19OwogICAgIG9ic2VydmFibGVzMiA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIDJ9fTsKQEAgLTQ0Myw4ICs0NjMsOCBAQAogICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKIAogICAgIC8vIEFkZCBzZWN1cmUgJiBub24tc2VjdXJlIHZpZGVvIGNvZGVjcy4KLSAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKLSAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKX07CisgICAgcmVzb3VyY2VzID0ge2NyZWF0ZVNlY3VyZVZpZGVvQ29kZWNSZXNvdXJjZSgpLAorICAgICAgICAgICAgICAgICBjcmVhdGVOb25TZWN1cmVWaWRlb0NvZGVjUmVzb3VyY2UoKX07CiAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCBtVGVzdENsaWVudDMsIHJlc291cmNlcyk7CiAgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczEpKTsKICAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCmluZGV4IGE5ZmQxNGYuLmZhNWViNGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC04MCw3ICs4MCw3IEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGNiMTgwZWMuLmFlMTM2NTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTM0LDggKzM0LDggQEAKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKLSAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGsiLAorICAgICAgICAicmVzb3VyY2VtYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgICAgICJsaWJtZWRpYXRyYW5zY29kaW5nc2VydmljZSIsCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9NZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RIZWxwZXIuaCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0SGVscGVyLmgKaW5kZXggMGNiMmZhZC4uOGUxN2Y1NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9NZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RIZWxwZXIuaAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL01lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdEhlbHBlci5oCkBAIC0yNTksOSArMjU5LDcgQEAKIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBmYWlsID0gZmFsc2U7CiAKLXN0cnVjdCBUZXN0Q2xpZW50Q2FsbGJhY2sgOiBwdWJsaWMgQm5UcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBFdmVudFRyYWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8VGVzdENsaWVudENhbGxiYWNrPiB7CitzdHJ1Y3QgVGVzdENsaWVudENhbGxiYWNrIDogcHVibGljIEJuVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaywgcHVibGljIEV2ZW50VHJhY2tlciB7CiAgICAgVGVzdENsaWVudENhbGxiYWNrKGNvbnN0IGNoYXIqIHBhY2thZ2VOYW1lLCBpbnQzMl90IGlkKQogICAgICAgICAgIDogbUNsaWVudElkKGlkKSwgbUNsaWVudFBpZChQSUQoaWQpKSwgbUNsaWVudFVpZChVSUQoaWQpKSwgbVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKSB7CiAgICAgICAgIEFMT0dJKCJUZXN0Q2xpZW50Q2FsbGJhY2sgJWQgY3JlYXRlZDogcGlkICVkLCB1aWQgJWQiLCBpZCwgUElEKGlkKSwgVUlEKGlkKSk7CkBAIC0zNDgsOCArMzQ2LDggQEAKICAgICAgICAgQUxPR0QoInJlZ2lzdGVyaW5nICVzIHdpdGggdWlkICVkIiwgcGFja2FnZU5hbWUsIG1DbGllbnRVaWQpOwogCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IGNsaWVudDsKLSAgICAgICAgU3RhdHVzIHN0YXR1cyA9Ci0gICAgICAgICAgICAgICAgc2VydmljZS0+cmVnaXN0ZXJDbGllbnQoc2hhcmVkX2Zyb21fdGhpcygpLCBrQ2xpZW50TmFtZSwgcGFja2FnZU5hbWUsICZjbGllbnQpOworICAgICAgICBTdGF0dXMgc3RhdHVzID0gc2VydmljZS0+cmVnaXN0ZXJDbGllbnQocmVmPFRlc3RDbGllbnRDYWxsYmFjaz4oKSwga0NsaWVudE5hbWUsIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsaWVudCk7CiAKICAgICAgICAgbUNsaWVudCA9IHN0YXR1cy5pc09rKCkgPyBjbGllbnQgOiBudWxscHRyOwogICAgICAgICByZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWluaWphaWwvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQuYnAKaW5kZXggM2E4OWUxMi4uZGVjYzVmZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWluaWphaWwvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9taW5pamFpbC9BbmRyb2lkLmJwCkBAIC0yOCwxNyArMjgsMTEgQEAKICAgICBkZWZhdWx0czogWyJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX2RlZmF1bHRzIl0sCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCi19CisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKIAotLy8gQnkgYWRkaW5nICJ2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlIiB0byAibGliYXZzZXJ2aWNlc19taW5pamFpbCIsIHdlIGRvbid0Ci0vLyBuZWVkIHRvIGhhdmUgImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiBhbnkgbG9uZ2VyLgotLy8gImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiB3aWxsIGJlIHJlbW92ZWQsIG9uY2Ugd2UgcmVwbGFjZSBpdCB3aXRoCi0vLyAibGliYXZzZXJ2aWNlc19taW5pamFpbCIgaW4gYWxsIHZlbmRvciBtb2R1bGVzLiAoYi8xNDYzMTM3MTApCi1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiwKLSAgICB2ZW5kb3I6IHRydWUsCi0gICAgZGVmYXVsdHM6IFsibGliYXZzZXJ2aWNlc19taW5pamFpbF9kZWZhdWx0cyJdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9taW5pamFpbC9PV05FUlMgYi9zZXJ2aWNlcy9taW5pamFpbC9PV05FUlMKaW5kZXggMTlmNGY5Zi4uOWViZjQxZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWluaWphaWwvT1dORVJTCisrKyBiL3NlcnZpY2VzL21pbmlqYWlsL09XTkVSUwpAQCAtMSwyICsxLDIgQEAKIGpvcmdlbG9AZ29vZ2xlLmNvbQotbWFyY29uZUBnb29nbGUuY29tCitlc3NpY2tAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvQ29tbWFuZFF1ZXVlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NvbW1hbmRRdWV1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkMThiMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NvbW1hbmRRdWV1ZS5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb0NvbW1hbmRRdWV1ZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGNocm9ubz4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQUF1ZGlvQ29tbWFuZFF1ZXVlLmgiCisKK25hbWVzcGFjZSBhYXVkaW8geworCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQ29tbWFuZFF1ZXVlOjpzZW5kQ29tbWFuZChzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvQ29tbWFuZD4gY29tbWFuZCkgeworICAgIHsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgIGlmICghbVJ1bm5pbmcpIHsKKyAgICAgICAgICAgIEFMT0dFKCJUcmllZCB0byBzZW5kIGNvbW1hbmQgd2hpbGUgaXQgd2FzIG5vdCBydW5uaW5nIik7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgICAgIH0KKyAgICAgICAgbUNvbW1hbmRzLnB1c2goY29tbWFuZCk7CisgICAgICAgIG1XYWl0V29ya0NvbmQubm90aWZ5X29uZSgpOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX2xvY2sgX2NsKGNvbW1hbmQtPmxvY2spOworICAgIGFuZHJvaWQ6OmJhc2U6OlNjb3BlZExvY2tBc3NlcnRpb24gbG9ja0Fzc2VydGlvbihjb21tYW5kLT5sb2NrKTsKKyAgICBBTE9HVigiU2VuZGluZyBjb21tYW5kICVkLCB3YWl0IGZvciByZXBseSglZCkgd2l0aCB0aW1lb3V0ICVqZCIsCisgICAgICAgICAgIGNvbW1hbmQtPm9wZXJhdGlvbkNvZGUsIGNvbW1hbmQtPmlzV2FpdGluZ0ZvclJlcGx5LCBjb21tYW5kLT50aW1lb3V0TmFub3NlY29uZHMpOworICAgIC8vIGBtV2FpdEZvclJlcGx5YCBpcyBmaXJzdCBpbml0aWFsaXplZCB3aGVuIHRoZSBjb21tYW5kIGlzIGNvbnN0cnVjdGVkLiBJdCB3aWxsIGJlIGZsaXBwZWQKKyAgICAvLyB3aGVuIHRoZSBjb21tYW5kIGlzIGNvbXBsZXRlZC4KKyAgICBhdXRvIHRpbWVvdXRFeHBpcmUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKQorICAgICAgICAgICAgKyBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMoY29tbWFuZC0+dGltZW91dE5hbm9zZWNvbmRzKTsKKyAgICB3aGlsZSAoY29tbWFuZC0+aXNXYWl0aW5nRm9yUmVwbHkpIHsKKyAgICAgICAgaWYgKGNvbW1hbmQtPmNvbmRpdGlvblZhcmlhYmxlLndhaXRfdW50aWwoX2NsLCB0aW1lb3V0RXhwaXJlKQorICAgICAgICAgICAgICAgID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KSB7CisgICAgICAgICAgICBBTE9HRCgiQ29tbWFuZCAlZCB0aW1lIG91dCIsIGNvbW1hbmQtPm9wZXJhdGlvbkNvZGUpOworICAgICAgICAgICAgY29tbWFuZC0+cmVzdWx0ID0gQUFVRElPX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgICBjb21tYW5kLT5pc1dhaXRpbmdGb3JSZXBseSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJDb21tYW5kICVkIHNlbnQgd2l0aCByZXN1bHQgYXMgJWQiLCBjb21tYW5kLT5vcGVyYXRpb25Db2RlLCBjb21tYW5kLT5yZXN1bHQpOworICAgIHJldHVybiBjb21tYW5kLT5yZXN1bHQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxBQXVkaW9Db21tYW5kPiBBQXVkaW9Db21tYW5kUXVldWU6OndhaXRGb3JDb21tYW5kKGludDY0X3QgdGltZW91dE5hbm9zKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb0NvbW1hbmQ+IGNvbW1hbmQ7CisgICAgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6U2NvcGVkTG9ja0Fzc2VydGlvbiBsb2NrQXNzZXJ0aW9uKG1Mb2NrKTsKKyAgICAgICAgaWYgKHRpbWVvdXROYW5vcyA+PSAwKSB7CisgICAgICAgICAgICBtV2FpdFdvcmtDb25kLndhaXRfZm9yKF9sLCBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHModGltZW91dE5hbm9zKSwgW3RoaXNdKCkgeworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlNjb3BlZExvY2tBc3NlcnRpb24gbG9ja0Fzc2VydGlvbihtTG9jayk7CisgICAgICAgICAgICAgICAgcmV0dXJuICFtUnVubmluZyB8fCAhbUNvbW1hbmRzLmVtcHR5KCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1XYWl0V29ya0NvbmQud2FpdChfbCwgW3RoaXNdKCkgeworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlNjb3BlZExvY2tBc3NlcnRpb24gbG9ja0Fzc2VydGlvbihtTG9jayk7CisgICAgICAgICAgICAgICAgcmV0dXJuICFtUnVubmluZyB8fCAhbUNvbW1hbmRzLmVtcHR5KCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1Db21tYW5kcy5lbXB0eSgpICYmIG1SdW5uaW5nKSB7CisgICAgICAgICAgICBjb21tYW5kID0gbUNvbW1hbmRzLmZyb250KCk7CisgICAgICAgICAgICBtQ29tbWFuZHMucG9wKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvbW1hbmQ7Cit9CisKK3ZvaWQgQUF1ZGlvQ29tbWFuZFF1ZXVlOjpzdGFydFdhaXRpbmcoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgbVJ1bm5pbmcgPSB0cnVlOworfQorCit2b2lkIEFBdWRpb0NvbW1hbmRRdWV1ZTo6c3RvcFdhaXRpbmcoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICAvLyBDbGVhciBhbGwgY29tbWFuZHMgaW4gdGhlIHF1ZXVlIGFzIHRoZSBjb21tYW5kIHRocmVhZCBpcyBzdG9wcGVkLgorICAgIHdoaWxlICghbUNvbW1hbmRzLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBjb21tYW5kID0gbUNvbW1hbmRzLmZyb250KCk7CisgICAgICAgIG1Db21tYW5kcy5wb3AoKTsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBfY2woY29tbWFuZC0+bG9jayk7CisgICAgICAgIC8vIElmIHRoZSBjb21tYW5kIGlzIHdhaXRpbmcgZm9yIHJlc3VsdCwgcmV0dXJucyBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURQorICAgICAgICAvLyBhcyB0aGVyZSBpcyBubyB0aHJlYWQgd2FpdGluZyBmb3IgdGhlIGNvbW1hbmQuCisgICAgICAgIGlmIChjb21tYW5kLT5pc1dhaXRpbmdGb3JSZXBseSkgeworICAgICAgICAgICAgY29tbWFuZC0+cmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgICAgICAgICBjb21tYW5kLT5pc1dhaXRpbmdGb3JSZXBseSA9IGZhbHNlOworICAgICAgICAgICAgY29tbWFuZC0+Y29uZGl0aW9uVmFyaWFibGUubm90aWZ5X29uZSgpOworICAgICAgICB9CisgICAgfQorICAgIG1XYWl0V29ya0NvbmQubm90aWZ5X29uZSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBhYXVkaW8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9Db21tYW5kUXVldWUuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NvbW1hbmRRdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDQyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9Db21tYW5kUXVldWUuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHF1ZXVlPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KKworbmFtZXNwYWNlIGFhdWRpbyB7CisKK3R5cGVkZWYgaW50MzJfdCBhYXVkaW9fY29tbWFuZF9vcGNvZGU7CisKK2NsYXNzIEFBdWRpb0NvbW1hbmRQYXJhbSB7CitwdWJsaWM6CisgICAgQUF1ZGlvQ29tbWFuZFBhcmFtKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgfkFBdWRpb0NvbW1hbmRQYXJhbSgpID0gZGVmYXVsdDsKK307CisKK2NsYXNzIEFBdWRpb0NvbW1hbmQgeworcHVibGljOgorICAgIGV4cGxpY2l0IEFBdWRpb0NvbW1hbmQoCisgICAgICAgICAgICBhYXVkaW9fY29tbWFuZF9vcGNvZGUgb3BDb2RlLCBzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvQ29tbWFuZFBhcmFtPiBwYXJhbSA9IG51bGxwdHIsCisgICAgICAgICAgICBib29sIHdhaXRGb3JSZXBseSA9IGZhbHNlLCBpbnQ2NF90IHRpbWVvdXROYW5vcyA9IDApCisgICAgICAgICAgICA6IG9wZXJhdGlvbkNvZGUob3BDb2RlKSwgcGFyYW1ldGVyKHBhcmFtKSwgaXNXYWl0aW5nRm9yUmVwbHkod2FpdEZvclJlcGx5KSwKKyAgICAgICAgICAgICAgdGltZW91dE5hbm9zZWNvbmRzKHRpbWVvdXROYW5vcykgeyB9CisgICAgdmlydHVhbCB+QUF1ZGlvQ29tbWFuZCgpID0gZGVmYXVsdDsKKworICAgIHN0ZDo6bXV0ZXggbG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBjb25kaXRpb25WYXJpYWJsZTsKKworICAgIGNvbnN0IGFhdWRpb19jb21tYW5kX29wY29kZSBvcGVyYXRpb25Db2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxBQXVkaW9Db21tYW5kUGFyYW0+IHBhcmFtZXRlcjsKKyAgICBib29sIGlzV2FpdGluZ0ZvclJlcGx5IEdVQVJERURfQlkobG9jayk7CisgICAgY29uc3QgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHM7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCBHVUFSREVEX0JZKGxvY2spID0gQUFVRElPX09LOworfTsKKworY2xhc3MgQUF1ZGlvQ29tbWFuZFF1ZXVlIHsKK3B1YmxpYzoKKyAgICBBQXVkaW9Db21tYW5kUXVldWUoKSA9IGRlZmF1bHQ7CisgICAgfkFBdWRpb0NvbW1hbmRRdWV1ZSgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb21tYW5kIHF1ZXVlLiBUaGUgcmV0dXJuIHdpbGwgYmUgd2FpdGluZyBmb3IgYSBzcGVjaWZpZWQgdGltZW91dAorICAgICAqIHBlcmlvZCBpbmRpY2F0ZWQgYnkgdGhlIGNvbW1hbmQgaWYgaXQgaXMgcmVxdWlyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgY29tbWFuZCB0byBzZW5kIHRvIHRoZSBjb21tYW5kIHF1ZXVlLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBzZW5kaW5nIHRoZSBjb21tYW5kIG9yIHRoZSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBjb21tYW5kIGlmIGNvbW1hbmQKKyAgICAgKiAgICAgICAgIG5lZWQgdG8gd2FpdCBmb3IgYSByZXBseS4gSWYgdGltZW91dCBoYXBwZW5zLCBBQVVESU9fRVJST1JfVElNRU9VVCB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBzZW5kQ29tbWFuZChzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvQ29tbWFuZD4gY29tbWFuZCk7CisKKyAgICAvKioKKyAgICAgKiBXYWl0IGZvciBuZXh0IGF2YWlsYWJsZSBjb21tYW5kIE9SIHVudGlsIHRoZSB0aW1lb3V0IGlzIGV4cGlyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZW91dE5hbm9zIHRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgbmV4dCBjb21tYW5kICgwIG1lYW5zIHJldHVybiBpbW1lZGlhdGVseSBpbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgYW55IGNhc2UpLCBuZWdhdGl2ZSB0byB3YWl0IGZvcmV2ZXIuCisgICAgICogQHJldHVybiB0aGUgbmV4dCBhdmFpbGFibGUgY29tbWFuZCBpZiBhbnkgb3IgYSBudWxscHRyIHdoZW4gdGhlcmUgaXMgbm9uZS4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvQ29tbWFuZD4gd2FpdEZvckNvbW1hbmQoaW50NjRfdCB0aW1lb3V0TmFub3MgPSAtMSk7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCB3YWl0aW5nIGZvciBjb21tYW5kcy4gQ29tbWFuZHMgY2FuIG9ubHkgYmUgcHVzaGVkIGludG8gdGhlIGNvbW1hbmQgcXVldWUgYWZ0ZXIgaXQKKyAgICAgKiBzdGFydHMgd2FpdGluZy4KKyAgICAgKi8KKyAgICB2b2lkIHN0YXJ0V2FpdGluZygpOworCisgICAgLyoqCisgICAgICogRm9yY2Ugc3RvcCB3YWl0aW5nIGZvciBuZXh0IGNvbW1hbmQKKyAgICAgKi8KKyAgICB2b2lkIHN0b3BXYWl0aW5nKCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtV2FpdFdvcmtDb25kOworCisgICAgc3RkOjpxdWV1ZTxzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvQ29tbWFuZD4+IG1Db21tYW5kcyBHVUFSREVEX0JZKG1Mb2NrKTsKKyAgICBib29sIG1SdW5uaW5nIEdVQVJERURfQlkobUxvY2spID0gZmFsc2U7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhYXVkaW8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCmluZGV4IDQwYTY2NGUuLjI2NzliMmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCkBAIC0yODAsNiArMjgwLDIyIEBACiAgICAgQUlETF9SRVRVUk4oc2VydmljZVN0cmVhbS0+dW5yZWdpc3RlckF1ZGlvVGhyZWFkKGNsaWVudFRocmVhZElkKSk7CiB9CiAKK1N0YXR1cyBBQXVkaW9TZXJ2aWNlOjpleGl0U3RhbmRieShpbnQzMl90IHN0cmVhbUhhbmRsZSwgRW5kcG9pbnQqIGVuZHBvaW50LCBpbnQzMl90ICpfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZV92PGFhdWRpb19yZXN1bHRfdCwgc3RkOjpkZWNheV90PHR5cGVvZigqX2FpZGxfcmV0dXJuKT4+KTsKKworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImdldFN0cmVhbURlc2NyaXB0aW9uKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUlETF9SRVRVUk4oQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFKTsKKyAgICB9CisgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgZW5kcG9pbnRQYXJjZWxhYmxlOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5leGl0U3RhbmRieSgmZW5kcG9pbnRQYXJjZWxhYmxlKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAqZW5kcG9pbnQgPSBzdGQ6Om1vdmUoZW5kcG9pbnRQYXJjZWxhYmxlKS5wYXJjZWxhYmxlKCk7CisgICAgfQorICAgIEFJRExfUkVUVVJOKHJlc3VsdCk7Cit9CisKIGJvb2wgQUF1ZGlvU2VydmljZTo6aXNDYWxsZXJJblNlcnZpY2UoKSB7CiAgICAgcGlkX3QgY2xpZW50UGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChtQXVkaW9DbGllbnQuYXR0cmlidXRpb25Tb3VyY2UucGlkKSk7CiAgICAgdWlkX3QgY2xpZW50VWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChtQXVkaW9DbGllbnQuYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmgKaW5kZXggN2MxYjc5Ni4uMGExMTFmYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuaApAQCAtODIsNiArODIsOSBAQAogICAgIGJpbmRlcjo6U3RhdHVzIHVucmVnaXN0ZXJBdWRpb1RocmVhZChpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCBjbGllbnRUaHJlYWRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAorICAgIGJpbmRlcjo6U3RhdHVzIGV4aXRTdGFuZGJ5KGludDMyX3Qgc3RyZWFtSGFuZGxlLCA6OmFhdWRpbzo6RW5kcG9pbnQqIGVuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcAppbmRleCAxM2RkM2QzLi5iNTViNjAxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKQEAgLTU5LDcgKzU5LDkgQEAKICAgICByZXN1bHQgPDwgIiAgICBEZXZpY2UgSWQ6ICAgICAgICAgICAgIiA8PCBnZXREZXZpY2VJZCgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgU2FtcGxlIFJhdGU6ICAgICAgICAgICIgPDwgZ2V0U2FtcGxlUmF0ZSgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgQ2hhbm5lbCBDb3VudDogICAgICAgICIgPDwgZ2V0U2FtcGxlc1BlckZyYW1lKCkgPDwgIlxuIjsKLSAgICByZXN1bHQgPDwgIiAgICBGb3JtYXQ6ICAgICAgICAgICAgICAgIiA8PCBnZXRGb3JtYXQoKSA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIENoYW5uZWwgTWFzazogICAgICAgICAweCIgPDwgc3RkOjpoZXggPDwgZ2V0Q2hhbm5lbE1hc2soKSA8PCBzdGQ6OmRlYyA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIEZvcm1hdDogICAgICAgICAgICAgICAiIDw8IGdldEZvcm1hdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAoIiA8PCBhdWRpb19mb3JtYXRfdG9fc3RyaW5nKGdldEZvcm1hdCgpKSA8PCAiKVxuIjsKICAgICByZXN1bHQgPDwgIiAgICBGcmFtZXMgUGVyIEJ1cnN0OiAgICAgIiA8PCBtRnJhbWVzUGVyQnVyc3QgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBVc2FnZTogICAgICAgICAgICAgICAgIiA8PCBnZXRVc2FnZSgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgQ29udGVudFR5cGU6ICAgICAgICAgICIgPDwgZ2V0Q29udGVudFR5cGUoKSA8PCAiXG4iOwpAQCAtMTY0LDYgKzE2NiwxMCBAQAogICAgICAgICBjb25maWd1cmF0aW9uLmdldFNhbXBsZXNQZXJGcmFtZSgpICE9IGdldFNhbXBsZXNQZXJGcmFtZSgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0Q2hhbm5lbE1hc2soKSAhPSBBQVVESU9fVU5TUEVDSUZJRUQgJiYKKyAgICAgICAgY29uZmlndXJhdGlvbi5nZXRDaGFubmVsTWFzaygpICE9IGdldENoYW5uZWxNYXNrKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMTg4LDcgKzE5NCw5IEBACiAgICAgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgewogICAgICAgICBmbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oQVVESU9fRkxBR19MT1dfTEFURU5DWQogICAgICAgICAgICAgICAgIHwgQUF1ZGlvQ29udmVydF9hbGxvd0NhcHR1cmVQb2xpY3lUb0F1ZGlvRmxhZ3NNYXNrKAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmdldFNwYXRpYWxpemF0aW9uQmVoYXZpb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+aXNDb250ZW50U3BhdGlhbGl6ZWQoKSkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PihBVURJT19GTEFHX0xPV19MQVRFTkNZCiAgICAgICAgICAgICAgICAgfCBBQXVkaW9Db252ZXJ0X3ByaXZhY3lTZW5zaXRpdmVUb0F1ZGlvRmxhZ3NNYXNrKHBhcmFtcy0+aXNQcml2YWN5U2Vuc2l0aXZlKCkpKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKaW5kZXggYTdmNjNkMy4uOTIwMDRjNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKQEAgLTc3LDYgKzc3LDE2IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgfQogCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RhbmRieSgpIHsKKyAgICAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludDo6c3RhbmRieSgpIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSIpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgIH0KKworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGV4aXRTdGFuZGJ5KEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKSB7CisgICAgICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OmV4aXRTdGFuZGJ5KCkgQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFIik7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQHBhcmFtIHBvc2l0aW9uRnJhbWVzCiAgICAgICogQHBhcmFtIHRpbWVOYW5vcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcAppbmRleCBiYzc2OWYwLi45NWJkNGJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcApAQCAtNjYsOCArNjYsNyBAQAogICAgICAgICAgICAgICAgIGdldEZyYW1lc1BlckJ1cnN0KCksIHRpbWVvdXROYW5vcyk7CiAgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgQUxPR0QoIiVzKCkgcmVhZCgpIHJldHVybmVkIEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAvLyBXZSBkbyBub3QgbmVlZCB0aGUgcmV0dXJuZWQgdmVjdG9yLgotICAgICAgICAgICAgKHZvaWQpIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6ZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CisgICAgICAgICAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmhhbmRsZURpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtc0FzeW5jKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gZ2V0RnJhbWVzUGVyQnVyc3QoKSkgewogICAgICAgICAgICAgQUxPR1coImNhbGxiYWNrTG9vcCgpIHJlYWQgJWQgLyAlZCIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCmluZGV4IGEwODA5OGMuLjNmMThiOTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCkBAIC04MCwxNiArODAsMTYgQEAKIAogICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7CiAKLSAgICAvLyBGTE9BVCBpcyBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGJ5IHRoZSBIQUwgc28gYXNrIGZvciBhIDMyLWJpdC4KLSAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAvLyBUT0RPIHJlbW92ZSB0aGVzZSBsb2dzIHdoZW4gZmluaXNoZWQgZGVidWdnaW5nLgotICAgICAgICBBTE9HRCgiJXMoKSBjaGFuZ2UgZm9ybWF0IGZyb20gJWQgdG8gMzJfQklUIiwgX19mdW5jX18sIGF1ZGlvRm9ybWF0KTsKLSAgICAgICAgYXVkaW9Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDsKLSAgICB9Ci0KICAgICByZXN1bHQgPSBvcGVuV2l0aEZvcm1hdChhdWRpb0Zvcm1hdCk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHJldHVybiByZXN1bHQ7CiAKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSAmJiBhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIEFMT0dEKCIlcygpIEZMT0FUIGZhaWxlZCwgcGVyaGFwcyBkdWUgdG8gZm9ybWF0LiBUcnkgYWdhaW4gd2l0aCAzMl9CSVQiLCBfX2Z1bmNfXyk7CisgICAgICAgIGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ7CisgICAgICAgIHJlc3VsdCA9IG9wZW5XaXRoRm9ybWF0KGF1ZGlvRm9ybWF0KTsKKyAgICB9CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHJldHVybiByZXN1bHQ7CisKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSAmJiBhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzMyX0JJVCkgewogICAgICAgICBBTE9HRCgiJXMoKSAzMl9CSVQgZmFpbGVkLCBwZXJoYXBzIGR1ZSB0byBmb3JtYXQuIFRyeSBhZ2FpbiB3aXRoIDI0X0JJVF9QQUNLRUQiLCBfX2Z1bmNfXyk7CiAgICAgICAgIGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOwpAQCAtMTI2LDIwICsxMjYsMTUgQEAKICAgICB9CiAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gYWF1ZGlvU2FtcGxlUmF0ZTsKIAotICAgIGludDMyX3QgYWF1ZGlvU2FtcGxlc1BlckZyYW1lID0gZ2V0U2FtcGxlc1BlckZyYW1lKCk7Ci0KICAgICBjb25zdCBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKCk7CiAKKyAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gQUF1ZGlvX2dldENoYW5uZWxNYXNrRm9yT3BlbigKKyAgICAgICAgICAgIGdldENoYW5uZWxNYXNrKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCk7CisKICAgICBpZiAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7Ci0gICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSAoYWF1ZGlvU2FtcGxlc1BlckZyYW1lID09IEFBVURJT19VTlNQRUNJRklFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChhYXVkaW9TYW1wbGVzUGVyRnJhbWUpOwogICAgICAgICBtSGFyZHdhcmVUaW1lT2Zmc2V0TmFub3MgPSBPVVRQVVRfRVNUSU1BVEVEX0hBUkRXQVJFX09GRlNFVF9OQU5PUzsgLy8gZnJhbWVzIGF0IERBQyBsYXRlcgogCiAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgewotICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gIChhYXVkaW9TYW1wbGVzUGVyRnJhbWUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KGFhdWRpb1NhbXBsZXNQZXJGcmFtZSk7CiAgICAgICAgIG1IYXJkd2FyZVRpbWVPZmZzZXROYW5vcyA9IElOUFVUX0VTVElNQVRFRF9IQVJEV0FSRV9PRkZTRVRfTkFOT1M7IC8vIGZyYW1lcyBhdCBBREMgZWFybGllcgogCiAgICAgfSBlbHNlIHsKQEAgLTE4OCw3MSArMTgzLDM5IEBACiAgICAgICAgICAgICA/IEFBVURJT19TRVNTSU9OX0lEX05PTkUKICAgICAgICAgICAgIDogKGFhdWRpb19zZXNzaW9uX2lkX3QpIHNlc3Npb25JZDsKICAgICBzZXRTZXNzaW9uSWQoYWN0dWFsU2Vzc2lvbklkKTsKLSAgICBBTE9HRCgiJXMoKSBkZXZpY2VJZCA9ICVkLCBzZXNzaW9uSWQgPSAlZCIsIF9fZnVuY19fLCBnZXREZXZpY2VJZCgpLCBnZXRTZXNzaW9uSWQoKSk7CisKKyAgICBBTE9HRCgiJXMoZm9ybWF0ID0gMHglWCkgZGV2aWNlSWQgPSAlZCwgc2Vzc2lvbklkID0gJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBhdWRpb0Zvcm1hdCwgZ2V0RGV2aWNlSWQoKSwgZ2V0U2Vzc2lvbklkKCkpOwogCiAgICAgLy8gQ3JlYXRlIE1NQVAvTk9JUlEgYnVmZmVyLgotICAgIGludDMyX3QgbWluU2l6ZUZyYW1lcyA9IGdldEJ1ZmZlckNhcGFjaXR5KCk7Ci0gICAgaWYgKG1pblNpemVGcmFtZXMgPD0gMCkgeyAvLyB6ZXJvIHdpbGwgZ2V0IHJlamVjdGVkCi0gICAgICAgIG1pblNpemVGcmFtZXMgPSBBQVVESU9fQlVGRkVSX0NBUEFDSVRZX01JTjsKLSAgICB9Ci0gICAgc3RhdHVzID0gbU1tYXBTdHJlYW0tPmNyZWF0ZU1tYXBCdWZmZXIobWluU2l6ZUZyYW1lcywgJm1NbWFwQnVmZmVyaW5mbyk7Ci0gICAgYm9vbCBpc0J1ZmZlclNoYXJlYWJsZSA9IG1NbWFwQnVmZmVyaW5mby5mbGFncyAmIEFVRElPX01NQVBfQVBQTElDQVRJT05fU0hBUkVBQkxFOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzKCkgLSBjcmVhdGVNbWFwQnVmZmVyKCkgZmFpbGVkIHdpdGggc3RhdHVzICVkICVzIiwKLSAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywgc3RyZXJyb3IoLXN0YXR1cykpOwotICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgcmVzdWx0ID0gY3JlYXRlTW1hcEJ1ZmZlcigmbUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBnb3RvIGVycm9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIGNyZWF0ZU1tYXBCdWZmZXIoKSBidWZmZXJfc2l6ZSA9ICVkIGZyLCBidXJzdF9zaXplICVkIGZyIgotICAgICAgICAgICAgICAgICAgICAgICIsIFNoYXJhYmxlIEZEOiAlcyIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLAotICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVmZmVyX3NpemVfZnJhbWVzLAotICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXMsCi0gICAgICAgICAgICAgIGlzQnVmZmVyU2hhcmVhYmxlID8gIlllcyIgOiAiTm8iKTsKLSAgICB9Ci0KLSAgICBzZXRCdWZmZXJDYXBhY2l0eShtTW1hcEJ1ZmZlcmluZm8uYnVmZmVyX3NpemVfZnJhbWVzKTsKLSAgICBpZiAoIWlzQnVmZmVyU2hhcmVhYmxlKSB7Ci0gICAgICAgIC8vIEV4Y2x1c2l2ZSBtb2RlIGNhbiBvbmx5IGJlIHVzZWQgYnkgdGhlIHNlcnZpY2UgYmVjYXVzZSB0aGUgRkQgY2Fubm90IGJlIHNoYXJlZC4KLSAgICAgICAgaW50MzJfdCBhdWRpb1NlcnZpY2VVaWQgPQotICAgICAgICAgICAgVkFMVUVfT1JfRkFUQUwobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChnZXR1aWQoKSkpOwotICAgICAgICBpZiAoKG1NbWFwQ2xpZW50LmF0dHJpYnV0aW9uU291cmNlLnVpZCAhPSBhdWRpb1NlcnZpY2VVaWQpICYmCi0gICAgICAgICAgICBnZXRTaGFyaW5nTW9kZSgpID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMoKSAtIGV4Y2x1c2l2ZSBGRCBjYW5ub3QgYmUgdXNlZCBieSBjbGllbnQiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJlYW0gYW5kIHBhc3MgaXQgYmFjayB0byB0aGUgY2FsbGVyLgotICAgIHNldFNhbXBsZXNQZXJGcmFtZSgoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKQotICAgICAgICAgICAgICAgICAgICAgICA/IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWcuY2hhbm5lbF9tYXNrKQotICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNvbmZpZy5jaGFubmVsX21hc2spKTsKKyAgICBzZXRDaGFubmVsTWFzayhBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0NoYW5uZWxNYXNrKAorICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzaywgZ2V0RGlyZWN0aW9uKCkgPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCwKKyAgICAgICAgICAgIEFBdWRpb19pc0NoYW5uZWxJbmRleE1hc2soY29uZmlnLmNoYW5uZWxfbWFzaykpKTsKIAotICAgIC8vIEFBdWRpbyBjcmVhdGVzIGEgY29weSBvZiB0aGlzIEZEIGFuZCByZXRhaW5zIG93bmVyc2hpcCBvZiB0aGUgY29weS4KLSAgICAvLyBBc3N1bWUgdGhhdCBBdWRpb0ZsaW5nZXIgd2lsbCBjbG9zZSB0aGUgb3JpZ2luYWwgc2hhcmVkX21lbW9yeV9mZC4KLSAgICBtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3IucmVzZXQoZHVwKG1NbWFwQnVmZmVyaW5mby5zaGFyZWRfbWVtb3J5X2ZkKSk7Ci0gICAgaWYgKG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvci5nZXQoKSA9PSAtMSkgewotICAgICAgICBBTE9HRSgiJXMoKSAtIGNvdWxkIG5vdCBkdXAgc2hhcmVkX21lbW9yeV9mZCIsIF9fZnVuY19fKTsKLSAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVEVSTkFMOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLSAgICAvLyBDYWxsIHRvIEhBTCB0byBtYWtlIHN1cmUgdGhlIHRyYW5zcG9ydCBGRCB3YXMgYWJsZSB0byBiZSBjbG9zZWQgYnkgYmluZGVyLgotICAgIC8vIFRoaXMgaXMgYSB0cmlja3kgd29ya2Fyb3VuZCBmb3IgYSBwcm9ibGVtIGluIEJpbmRlci4KLSAgICAvLyBUT0RPOltiLzE5MjA0ODg0Ml0gV2hlbiB0aGF0IHByb2JsZW0gaXMgZml4ZWQgd2UgbWF5IGJlIGFibGUgdG8gcmVtb3ZlIG9yIGNoYW5nZSB0aGlzIGNvZGUuCi0gICAgc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gcG9zaXRpb247Ci0gICAgbU1tYXBTdHJlYW0tPmdldE1tYXBQb3NpdGlvbigmcG9zaXRpb24pOwotCi0gICAgbUZyYW1lc1BlckJ1cnN0ID0gbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzOwogICAgIHNldEZvcm1hdChjb25maWcuZm9ybWF0KTsKICAgICBzZXRTYW1wbGVSYXRlKGNvbmZpZy5zYW1wbGVfcmF0ZSk7CiAKLSAgICBBTE9HRCgiJXMoKSBhY3R1YWwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkIgotICAgICAgICAgICIsIGRldmljZUlkID0gJWQsIGNhcGFjaXR5ID0gJWRcbiIsCi0gICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGRldmljZUlkLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKKyAgICAvLyBJZiB0aGUgcG9zaXRpb24gaXMgbm90IHVwZGF0ZWQgd2hpbGUgdGhlIHRpbWVzdGFtcCBpcyB1cGRhdGVkIGZvciBtb3JlIHRoYW4gYSBjZXJ0YWluIGFtb3VudCwKKyAgICAvLyB0aGUgdGltZXN0YW1wIHJlcG9ydGVkIGZyb20gdGhlIEhBTCBtYXkgbm90IGJlIGFjY3VyYXRlLiBIZXJlLCBhIHRpbWVzdGFtcCBncmFjZSBwZXJpb2QgaXMKKyAgICAvLyBzZXQgYXMgNSBidXJzdCBzaXplLiBXZSBtYXkgd2FudCB0byB1cGRhdGUgdGhpcyB2YWx1ZSBpZiB0aGVyZSBpcyBhbnkgcmVwb3J0IGZyb20gT0VNcyBzYXlpbmcKKyAgICAvLyB0aGF0IGlzIHRvbyBzaG9ydC4KKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrVGltZXN0YW1wR3JhY2VCdXJzdENvdW50ID0gNTsKKyAgICBtVGltZXN0YW1wR3JhY2VQZXJpb2RNcyA9ICgoaW50NjRfdCkga1RpbWVzdGFtcEdyYWNlQnVyc3RDb3VudCAqIG1GcmFtZXNQZXJCdXJzdAorICAgICAgICAgICAgKiBBQVVESU9fTUlMTElTX1BFUl9TRUNPTkQpIC8gZ2V0U2FtcGxlUmF0ZSgpOwogCi0gICAgQUxPR0QoIiVzKCkgZm9ybWF0ID0gMHglMDh4LCBmcmFtZSBzaXplID0gJWQsIGJ1cnN0IHNpemUgPSAlZCIsCi0gICAgICAgICAgX19mdW5jX18sIGdldEZvcm1hdCgpLCBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCksIG1GcmFtZXNQZXJCdXJzdCk7CisgICAgQUxPR0QoIiVzKCkgZ290IHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZCBjaGFubmVsTWFzayA9ICUjeCwgZGV2aWNlSWQgPSAlZCwgY2FwYWNpdHkgPSAlZFxuIiwKKyAgICAgICAgICBfX2Z1bmNfXywgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZ2V0Q2hhbm5lbE1hc2soKSwKKyAgICAgICAgICBkZXZpY2VJZCwgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CisKKyAgICBBTE9HRCgiJXMoKSBnb3QgZm9ybWF0ID0gMHglWCA9ICVzLCBmcmFtZSBzaXplID0gJWQsIGJ1cnN0IHNpemUgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIGdldEZvcm1hdCgpLCBhdWRpb19mb3JtYXRfdG9fc3RyaW5nKGdldEZvcm1hdCgpKSwKKyAgICAgICAgICBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCksIG1GcmFtZXNQZXJCdXJzdCk7CiAKICAgICByZXR1cm4gcmVzdWx0OwogCkBAIC0zMjAsNiArMjgzLDMyIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0YW5kYnkoKSB7CisgICAgaWYgKG1NbWFwU3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOworICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQobU1tYXBTdHJlYW0tPnN0YW5kYnkoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmV4aXRTdGFuZGJ5KEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKSB7CisgICAgaWYgKG1NbWFwU3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOworICAgIH0KKyAgICBtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3IucmVzZXQoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gY3JlYXRlTW1hcEJ1ZmZlcigmbUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICBpbnQzMl90IGJ5dGVzUGVyRnJhbWUgPSBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCk7CisgICAgICAgIGludDMyX3QgY2FwYWNpdHlJbkJ5dGVzID0gZ2V0QnVmZmVyQ2FwYWNpdHkoKSAqIGJ5dGVzUGVyRnJhbWU7CisgICAgICAgIGludCBmZEluZGV4ID0gcGFyY2VsYWJsZS0+YWRkRmlsZURlc2NyaXB0b3IobUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yLCBjYXBhY2l0eUluQnl0ZXMpOworICAgICAgICBwYXJjZWxhYmxlLT5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0dXBNZW1vcnkoZmRJbmRleCwgMCwgY2FwYWNpdHlJbkJ5dGVzKTsKKyAgICAgICAgcGFyY2VsYWJsZS0+bURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldEJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSk7CisgICAgICAgIHBhcmNlbGFibGUtPm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRGcmFtZXNQZXJCdXJzdChtRnJhbWVzUGVyQnVyc3QpOworICAgICAgICBwYXJjZWxhYmxlLT5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0Q2FwYWNpdHlJbkZyYW1lcyhnZXRCdWZmZXJDYXBhY2l0eSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogLy8gR2V0IGZyZWUtcnVubmluZyBEU1Agb3IgRE1BIGhhcmR3YXJlIHBvc2l0aW9uIGZyb20gdGhlIEhBTC4KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgewpAQCAtNDA2LDMwICszOTUsMTUwIEBACiAvKioKICAqIEdldCBhbiBpbW11dGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEgcXVldWUgZnJvbSB0aGUgSEFMLgogICovCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Z2V0RG93bkRhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpnZXREb3duRGF0YURlc2NyaXB0aW9uKAorICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkKIHsKICAgICAvLyBHYXRoZXIgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgcXVldWUgYmFzZWQgb24gSEFMIGluZm8uCiAgICAgaW50MzJfdCBieXRlc1BlckZyYW1lID0gY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpOwogICAgIGludDMyX3QgY2FwYWNpdHlJbkJ5dGVzID0gZ2V0QnVmZmVyQ2FwYWNpdHkoKSAqIGJ5dGVzUGVyRnJhbWU7Ci0gICAgaW50IGZkSW5kZXggPSBwYXJjZWxhYmxlLmFkZEZpbGVEZXNjcmlwdG9yKG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvciwgY2FwYWNpdHlJbkJ5dGVzKTsKLSAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXR1cE1lbW9yeShmZEluZGV4LCAwLCBjYXBhY2l0eUluQnl0ZXMpOwotICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldEJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSk7Ci0gICAgcGFyY2VsYWJsZS5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0RnJhbWVzUGVyQnVyc3QobUZyYW1lc1BlckJ1cnN0KTsKLSAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRDYXBhY2l0eUluRnJhbWVzKGdldEJ1ZmZlckNhcGFjaXR5KCkpOworICAgIGludCBmZEluZGV4ID0gcGFyY2VsYWJsZS0+YWRkRmlsZURlc2NyaXB0b3IobUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yLCBjYXBhY2l0eUluQnl0ZXMpOworICAgIHBhcmNlbGFibGUtPm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXR1cE1lbW9yeShmZEluZGV4LCAwLCBjYXBhY2l0eUluQnl0ZXMpOworICAgIHBhcmNlbGFibGUtPm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRCeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpOworICAgIHBhcmNlbGFibGUtPm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRGcmFtZXNQZXJCdXJzdChtRnJhbWVzUGVyQnVyc3QpOworICAgIHBhcmNlbGFibGUtPm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRDYXBhY2l0eUluRnJhbWVzKGdldEJ1ZmZlckNhcGFjaXR5KCkpOwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpnZXRFeHRlcm5hbFBvc2l0aW9uKHVpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykKIHsKLSAgICBpZiAoIW1FeHRlcm5hbFBvc2l0aW9uU3VwcG9ydGVkKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICBpZiAobUhhbEV4dGVybmFsUG9zaXRpb25TdGF0dXMgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHJldHVybiBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1czsKICAgICB9Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbU1tYXBTdHJlYW0tPmdldEV4dGVybmFsUG9zaXRpb24ocG9zaXRpb25GcmFtZXMsIHRpbWVOYW5vcyk7Ci0gICAgaWYgKHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICAvLyBnZXRFeHRlcm5hbFBvc2l0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIFNldCBtRXh0ZXJuYWxQb3NpdGlvblN1cHBvcnRlZCBhcyBmYWxzZQorICAgIHVpbnQ2NF90IHRlbXBQb3NpdGlvbkZyYW1lczsKKyAgICBpbnQ2NF90IHRlbXBUaW1lTmFub3M7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU1tYXBTdHJlYW0tPmdldEV4dGVybmFsUG9zaXRpb24oJnRlbXBQb3NpdGlvbkZyYW1lcywgJnRlbXBUaW1lTmFub3MpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgLy8gZ2V0RXh0ZXJuYWxQb3NpdGlvbiByZXBvcnRzIGVycm9yLiBUaGUgSEFMIG1heSBub3Qgc3VwcG9ydCB0aGUgQVBJLiBDYWNoZSB0aGUgcmVzdWx0CiAgICAgICAgIC8vIHNvIHRoYXQgdGhlIGNhbGwgd2lsbCBub3QgZ28gdG8gdGhlIEhBTCBuZXh0IHRpbWUuCi0gICAgICAgIG1FeHRlcm5hbFBvc2l0aW9uU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIG1IYWxFeHRlcm5hbFBvc2l0aW9uU3RhdHVzID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1IYWxFeHRlcm5hbFBvc2l0aW9uU3RhdHVzOwogICAgIH0KLSAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKKworICAgIC8vIElmIHRoZSBIQUwga2VlcHMgcmVwb3J0aW5nIHRoZSBzYW1lIHBvc2l0aW9uIG9yIHRpbWVzdGFtcCwgdGhlIEhBTCBtYXkgYmUgaGF2aW5nIHNvbWUgaXNzdWVzCisgICAgLy8gdG8gcmVwb3J0IGNvcnJlY3QgZXh0ZXJuYWwgcG9zaXRpb24uIEluIHRoYXQgY2FzZSwgd2Ugd2lsbCBub3QgdHJ1c3QgdGhlIHZhbHVlcyByZXBvcnRlZCBmcm9tCisgICAgLy8gdGhlIEhBTC4gSWRlYWxseSwgd2UgbWF5IHdhbnQgdG8gc3RvcCBxdWVyeWluZyBleHRlcm5hbCBwb3NpdGlvbiBpZiB0aGUgSEFMIGNhbm5vdCByZXBvcnQKKyAgICAvLyBjb3JyZWN0IHBvc2l0aW9uIHdpdGhpbiBhIHBlcmlvZC4gQnV0IGl0IG1heSBub3QgYmUgYSBnb29kIGlkZWEgdG8gZ2V0IHN5c3RlbSB0aW1lIHRvbyBvZnRlbi4KKyAgICAvLyBJbiB0aGF0IGNhc2UsIGEgbWF4aW11bSBudW1iZXIgb2YgZnJvemVuIGV4dGVybmFsIHBvc2l0aW9uIGlzIGRlZmluZWQgc28gdGhhdCBpZiB0aGUKKyAgICAvLyBjb3VudCBvZiB0aGUgc2FtZSB0aW1lc3RhbXAgb3IgcG9zaXRpb24gaXMgcmVwb3J0ZWQgYnkgdGhlIEhBTCBjb250aW51b3VzbHksIHRoZSB2YWx1ZXMgZnJvbQorICAgIC8vIHRoZSBIQUwgd2lsbCBubyBsb25nZXIgYmUgdHJ1c3RlZC4KKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrTWF4RnJvemVuQ291bnQgPSAyMDsKKyAgICAvLyBJZiB0aGUgSEFMIHZlcnNpb24gaXMgbGVzcyB0aGFuIDcuMCwgdGhlIGdldFByZXNlbnRhdGlvblBvc2l0aW9uIGlzIGFuIG9wdGlvbmFsIEFQSS4KKyAgICAvLyBJZiB0aGUgSEFMIHZlcnNpb24gaXMgNy4wIG9yIGxhdGVyLCB0aGUgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24gaXMgYSBtYW5kYXRvcnkgQVBJLgorICAgIC8vIEluIHRoYXQgY2FzZSwgZXZlbiB0aGUgcmV0dXJuZWQgc3RhdHVzIGlzIE5PX0VSUk9SLCBpdCBkb2Vzbid0IGluZGljYXRlIHRoZSByZXR1cm5lZAorICAgIC8vIHBvc2l0aW9uIGlzIGEgdmFsaWQgb25lLiBEbyBhIHNpbXBsZSB2YWxpZGF0aW9uLCB3aGljaCBpcyBjaGVja2luZyBpZiB0aGUgcG9zaXRpb24gaXMKKyAgICAvLyBmb3J3YXJkIHdpdGhpbiBoYWxmIGEgc2Vjb25kIG9yIG5vdCwgaGVyZSBzbyB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiBlcnJvciBpZgorICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZhaWxzLiBOb3RlIHRoYXQgd2UgZG9uJ3Qgb25seSBhcHBseSB0aGlzIHZhbGlkYXRpb24gbG9naWMgdG8gSEFMIEFQSQorICAgIC8vIGxlc3MgdGhhbiA3LjAuIFRoZSByZWFzb24gaXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5jZSB0aGUgSEFMIGlzIG5vdCByZXBvcnRpbmcgdGhlCisgICAgLy8gdGltZXN0YW1wIGFuZCBwb3NpdGlvbiBjb3JyZWN0bHkuCisgICAgaWYgKG1MYXN0UG9zaXRpb25GcmFtZXMgPiB0ZW1wUG9zaXRpb25GcmFtZXMpIHsKKyAgICAgICAgLy8gSWYgdGhlIHBvc2l0aW9uIGlzIGdvaW5nIGJhY2t3YXJkcywgdGhlcmUgbXVzdCBiZSBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgSEFMLgorICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIGRvIG5vdCB0cnVzdCB0aGUgdmFsdWVzIHJlcG9ydGVkIGJ5IHRoZSBIQUwuCisgICAgICAgIEFMT0dXKCIlcyBwb3NpdGlvbiBpcyBnb2luZyBiYWNrd2FyZHMsIGxhc3QgcG9zaXRpb24oJWpkKSBjdXJyZW50IHBvc2l0aW9uKCVqZCkiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbUxhc3RQb3NpdGlvbkZyYW1lcywgdGVtcFBvc2l0aW9uRnJhbWVzKTsKKyAgICAgICAgbUhhbEV4dGVybmFsUG9zaXRpb25TdGF0dXMgPSBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgICAgIHJldHVybiBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1czsKKyAgICB9IGVsc2UgaWYgKG1MYXN0UG9zaXRpb25GcmFtZXMgPT0gdGVtcFBvc2l0aW9uRnJhbWVzKSB7CisgICAgICAgIGlmICh0ZW1wVGltZU5hbm9zIC0gbVRpbWVzdGFtcE5hbm9zRm9yTGFzdFBvc2l0aW9uID4KKyAgICAgICAgICAgICAgICBBQVVESU9fTkFOT1NfUEVSX01JTExJU0VDT05EICogbVRpbWVzdGFtcEdyYWNlUGVyaW9kTXMpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcywgdGhlIHJlcG9ydGVkIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkIHdpdGhpbiAlZCBtc2VjLiAiCisgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBleHRlcm5hbCBwb3NpdGlvbiBhcyBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18sIG1UaW1lc3RhbXBHcmFjZVBlcmlvZE1zKTsKKyAgICAgICAgICAgIG1IYWxFeHRlcm5hbFBvc2l0aW9uU3RhdHVzID0gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgICAgICAgICAgcmV0dXJuIG1IYWxFeHRlcm5hbFBvc2l0aW9uU3RhdHVzOworICAgICAgICB9CisgICAgICAgIG1Gcm96ZW5Qb3NpdGlvbkNvdW50Kys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUZyb3plblBvc2l0aW9uQ291bnQgPSAwOworICAgIH0KKworICAgIGlmIChtVGltZXN0YW1wTmFub3NGb3JMYXN0UG9zaXRpb24gPiB0ZW1wVGltZU5hbm9zKSB7CisgICAgICAgIC8vIElmIHRoZSB0aW1lc3RhbXAgaXMgZ29pbmcgYmFja3dhcmRzLCB0aGVyZSBtdXN0IGJlIHNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSBIQUwuCisgICAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgZG8gbm90IHRydXN0IHRoZSB2YWx1ZXMgcmVwb3J0ZWQgYnkgdGhlIEhBTC4KKyAgICAgICAgQUxPR1coIiVzIHRpbWVzdGFtcCBpcyBnb2luZyBiYWNrd2FyZHMsIGxhc3QgdGltZXN0YW1wKCVqZCksIGN1cnJlbnQgdGltZXN0YW1wKCVqZCkiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbVRpbWVzdGFtcE5hbm9zRm9yTGFzdFBvc2l0aW9uLCB0ZW1wVGltZU5hbm9zKTsKKyAgICAgICAgbUhhbEV4dGVybmFsUG9zaXRpb25TdGF0dXMgPSBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgICAgIHJldHVybiBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1czsKKyAgICB9IGVsc2UgaWYgKG1UaW1lc3RhbXBOYW5vc0Zvckxhc3RQb3NpdGlvbiA9PSB0ZW1wVGltZU5hbm9zKSB7CisgICAgICAgIG1Gcm96ZW5UaW1lc3RhbXBDb3VudCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Gcm96ZW5UaW1lc3RhbXBDb3VudCA9IDA7CisgICAgfQorCisgICAgaWYgKG1Gcm96ZW5UaW1lc3RhbXBDb3VudCArIG1Gcm96ZW5Qb3NpdGlvbkNvdW50ID4ga01heEZyb3plbkNvdW50KSB7CisgICAgICAgIEFMT0dXKCIlcyB0b28gbWFueSBmcm96ZW4gZXh0ZXJuYWwgcG9zaXRpb24gZnJvbSBIQUwuIiwgX19mdW5jX18pOworICAgICAgICBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1cyA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKKyAgICAgICAgcmV0dXJuIG1IYWxFeHRlcm5hbFBvc2l0aW9uU3RhdHVzOworICAgIH0KKworICAgIG1MYXN0UG9zaXRpb25GcmFtZXMgPSB0ZW1wUG9zaXRpb25GcmFtZXM7CisgICAgbVRpbWVzdGFtcE5hbm9zRm9yTGFzdFBvc2l0aW9uID0gdGVtcFRpbWVOYW5vczsKKworICAgIC8vIE9ubHkgdXBkYXRlIHRoZSB0aW1lc3RhbXAgYW5kIHBvc2l0aW9uIHdoZW4gdGhleSBsb29rcyB2YWxpZC4KKyAgICAqcG9zaXRpb25GcmFtZXMgPSB0ZW1wUG9zaXRpb25GcmFtZXM7CisgICAgKnRpbWVOYW5vcyA9IHRlbXBUaW1lTmFub3M7CisgICAgcmV0dXJuIG1IYWxFeHRlcm5hbFBvc2l0aW9uU3RhdHVzOworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Y3JlYXRlTW1hcEJ1ZmZlcigKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkKiBmaWxlRGVzY3JpcHRvcikKK3sKKyAgICBtZW1zZXQoJm1NbWFwQnVmZmVyaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvKSk7CisgICAgaW50MzJfdCBtaW5TaXplRnJhbWVzID0gZ2V0QnVmZmVyQ2FwYWNpdHkoKTsKKyAgICBpZiAobWluU2l6ZUZyYW1lcyA8PSAwKSB7IC8vIHplcm8gd2lsbCBnZXQgcmVqZWN0ZWQKKyAgICAgICAgbWluU2l6ZUZyYW1lcyA9IEFBVURJT19CVUZGRVJfQ0FQQUNJVFlfTUlOOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcihtaW5TaXplRnJhbWVzLCAmbU1tYXBCdWZmZXJpbmZvKTsKKyAgICBib29sIGlzQnVmZmVyU2hhcmVhYmxlID0gbU1tYXBCdWZmZXJpbmZvLmZsYWdzICYgQVVESU9fTU1BUF9BUFBMSUNBVElPTl9TSEFSRUFCTEU7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXMoKSAtIGNyZWF0ZU1tYXBCdWZmZXIoKSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQgJXMiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzLCBzdHJlcnJvcigtc3RhdHVzKSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIiVzKCkgY3JlYXRlTW1hcEJ1ZmZlcigpIGJ1ZmZlcl9zaXplID0gJWQgZnIsIGJ1cnN0X3NpemUgJWQgZnIiCisgICAgICAgICAgICAgICAgICAgICAgIiwgU2hhcmFibGUgRkQ6ICVzIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sCisgICAgICAgICAgICAgIG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMsCisgICAgICAgICAgICAgIG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lcywKKyAgICAgICAgICAgICAgaXNCdWZmZXJTaGFyZWFibGUgPyAiWWVzIiA6ICJObyIpOworICAgIH0KKworICAgIHNldEJ1ZmZlckNhcGFjaXR5KG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMpOworICAgIGlmICghaXNCdWZmZXJTaGFyZWFibGUpIHsKKyAgICAgICAgLy8gRXhjbHVzaXZlIG1vZGUgY2FuIG9ubHkgYmUgdXNlZCBieSB0aGUgc2VydmljZSBiZWNhdXNlIHRoZSBGRCBjYW5ub3QgYmUgc2hhcmVkLgorICAgICAgICBpbnQzMl90IGF1ZGlvU2VydmljZVVpZCA9CisgICAgICAgICAgICBWQUxVRV9PUl9GQVRBTChsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KGdldHVpZCgpKSk7CisgICAgICAgIGlmICgobU1tYXBDbGllbnQuYXR0cmlidXRpb25Tb3VyY2UudWlkICE9IGF1ZGlvU2VydmljZVVpZCkgJiYKKyAgICAgICAgICAgIGdldFNoYXJpbmdNb2RlKCkgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcygpIC0gZXhjbHVzaXZlIEZEIGNhbm5vdCBiZSB1c2VkIGJ5IGNsaWVudCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBQXVkaW8gY3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBGRCBhbmQgcmV0YWlucyBvd25lcnNoaXAgb2YgdGhlIGNvcHkuCisgICAgLy8gQXNzdW1lIHRoYXQgQXVkaW9GbGluZ2VyIHdpbGwgY2xvc2UgdGhlIG9yaWdpbmFsIHNoYXJlZF9tZW1vcnlfZmQuCisgICAgZmlsZURlc2NyaXB0b3ItPnJlc2V0KGR1cChtTW1hcEJ1ZmZlcmluZm8uc2hhcmVkX21lbW9yeV9mZCkpOworICAgIGlmIChmaWxlRGVzY3JpcHRvci0+Z2V0KCkgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgLSBjb3VsZCBub3QgZHVwIHNoYXJlZF9tZW1vcnlfZmQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgfQorCisgICAgLy8gQ2FsbCB0byBIQUwgdG8gbWFrZSBzdXJlIHRoZSB0cmFuc3BvcnQgRkQgd2FzIGFibGUgdG8gYmUgY2xvc2VkIGJ5IGJpbmRlci4KKyAgICAvLyBUaGlzIGlzIGEgdHJpY2t5IHdvcmthcm91bmQgZm9yIGEgcHJvYmxlbSBpbiBCaW5kZXIuCisgICAgLy8gVE9ETzpbYi8xOTIwNDg4NDJdIFdoZW4gdGhhdCBwcm9ibGVtIGlzIGZpeGVkIHdlIG1heSBiZSBhYmxlIHRvIHJlbW92ZSBvciBjaGFuZ2UgdGhpcyBjb2RlLgorICAgIHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uIHBvc2l0aW9uOworICAgIG1NbWFwU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oJnBvc2l0aW9uKTsKKworICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lczsKKworICAgIHJldHVybiBBQVVESU9fT0s7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmgKaW5kZXggNWE1Mzg4NS4uM2U3ZjJjNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaApAQCAtNjQsNiArNjQsMTAgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSAgb3ZlcnJpZGU7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhbmRieSgpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGV4aXRTdGFuZGJ5KEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKSBvdmVycmlkZTsKKwogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGdldFRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBvdmVycmlkZTsKQEAgLTc5LDcgKzgzLDcgQEAKICAgICB2b2lkIG9uUm91dGluZ0NoYW5nZWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SGFuZGxlKSBvdmVycmlkZTsKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgIGFhdWRpb19yZXN1bHRfdCBnZXREb3duRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RG93bkRhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSk7CiAKICAgICBpbnQ2NF90IGdldEhhcmR3YXJlVGltZU9mZnNldE5hbm9zKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUhhcmR3YXJlVGltZU9mZnNldE5hbm9zOwpAQCAtOTEsNiArOTUsOCBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW5XaXRoRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0KTsKIAorICAgIGFhdWRpb19yZXN1bHRfdCBjcmVhdGVNbWFwQnVmZmVyKGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCogZmlsZURlc2NyaXB0b3IpOworCiAgICAgTW9ub3RvbmljQ291bnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1RyYW5zZmVycmVkOwogCiAgICAgLy8gSW50ZXJmYWNlIHRvIHRoZSBBdWRpb0ZsaW5nZXIgTU1BUCBzdXBwb3J0LgpAQCAtMTA2LDcgKzExMiwxMiBAQAogCiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhcmR3YXJlVGltZU9mZnNldE5hbm9zID0gMDsgLy8gVE9ETyBnZXQgZnJvbSBIQUwKIAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FeHRlcm5hbFBvc2l0aW9uU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFsRXh0ZXJuYWxQb3NpdGlvblN0YXR1cyA9IEFBVURJT19PSzsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFBvc2l0aW9uRnJhbWVzID0gMDsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wTmFub3NGb3JMYXN0UG9zaXRpb24gPSAwOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBHcmFjZVBlcmlvZE1zOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gcm96ZW5Qb3NpdGlvbkNvdW50ID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJvemVuVGltZXN0YW1wQ291bnQgPSAwOwogCiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCmluZGV4IDRlNDYwMzMuLjJhNTkzOWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CiAKICNpbmNsdWRlICJBQXVkaW9FbmRwb2ludE1hbmFnZXIuaCIKQEAgLTUxLDcgKzUyLDcgQEAKICAgICAgICAgbU1peGVyLmFsbG9jYXRlKGdldFN0cmVhbUludGVybmFsKCktPmdldFNhbXBsZXNQZXJGcmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Z2V0RnJhbWVzUGVyQnVyc3QoKSk7CiAKLSAgICAgICAgaW50MzJfdCBidXJzdHNQZXJCdWZmZXIgPSBBQXVkaW9Qcm9wZXJ0eV9nZXRNaXhlckJ1cnN0cygpOworICAgICAgICBpbnQzMl90IGJ1cnN0c1BlckJ1ZmZlciA9IEF1ZGlvU3lzdGVtOjpnZXRBQXVkaW9NaXhlckJ1cnN0Q291bnQoKTsKICAgICAgICAgaWYgKGJ1cnN0c1BlckJ1ZmZlciA9PSAwKSB7CiAgICAgICAgICAgICBtTGF0ZW5jeVR1bmluZ0VuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgYnVyc3RzUGVyQnVmZmVyID0gQlVSU1RTX1BFUl9CVUZGRVJfREVGQVVMVDsKQEAgLTE0Niw4ICsxNDcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpLCB0aW1lb3V0TmFub3MpOwogICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpIHsKICAgICAgICAgICAgIEFMT0dEKCIlcygpIHdyaXRlKCkgcmV0dXJuZWQgQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBuZWVkIHRoZSByZXR1cm5lZCB2ZWN0b3IuCi0gICAgICAgICAgICAodm9pZCkgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKKyAgICAgICAgICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6aGFuZGxlRGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zQXN5bmMoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSBnZXRGcmFtZXNQZXJCdXJzdCgpKSB7CiAgICAgICAgICAgICBBTE9HVygiY2FsbGJhY2tMb29wKCkgd3JvdGUgJWQgLyAlZCIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcAppbmRleCA1ZmJjYWRiLi5kZDQyMWZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKQEAgLTc4LDcgKzc4LDcgQEAKICAgICByZXN1bHQgPSBtU3RyZWFtSW50ZXJuYWwtPm9wZW4oYnVpbGRlcik7CiAKICAgICBzZXRTYW1wbGVSYXRlKG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2FtcGxlUmF0ZSgpKTsKLSAgICBzZXRTYW1wbGVzUGVyRnJhbWUobVN0cmVhbUludGVybmFsLT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CisgICAgc2V0Q2hhbm5lbE1hc2sobVN0cmVhbUludGVybmFsLT5nZXRDaGFubmVsTWFzaygpKTsKICAgICBzZXREZXZpY2VJZChtU3RyZWFtSW50ZXJuYWwtPmdldERldmljZUlkKCkpOwogICAgIHNldFNlc3Npb25JZChtU3RyZWFtSW50ZXJuYWwtPmdldFNlc3Npb25JZCgpKTsKICAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7IC8vIGZvcmNlIGZvciBtaXhlcgpAQCAtMjE0LDMgKzIxNCwxMiBAQAogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQorCit2b2lkIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6aGFuZGxlRGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zQXN5bmMoKSB7CisgICAgYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPiBob2xkRW5kcG9pbnQodGhpcyk7CisgICAgc3RkOjp0aHJlYWQgYXN5bmNUYXNrKFtob2xkRW5kcG9pbnRdKCkgeworICAgICAgICAvLyBXZSBkbyBub3QgbmVlZCB0aGUgcmV0dXJuZWQgdmVjdG9yLgorICAgICAgICBob2xkRW5kcG9pbnQtPmRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOworICAgIH0pOworICAgIGFzeW5jVGFzay5kZXRhY2goKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKaW5kZXggODM1NzU2Ny4uM2U3NjBjNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKQEAgLTY5LDYgKzY5LDggQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgICBzdG9wU2hhcmluZ1RocmVhZCgpOwogCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtc0FzeW5jKCk7CisKICAgICAvLyBBbiBNTUFQIHN0cmVhbSB0aGF0IGlzIHNoYXJlZCBieSBtdWx0aXBsZSBjbGllbnRzLgogICAgIGFuZHJvaWQ6OnNwPEF1ZGlvU3RyZWFtSW50ZXJuYWw+IG1TdHJlYW1JbnRlcm5hbDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCmluZGV4IDM0ZGRkNGQuLjlmNDhmODAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKQEAgLTM0LDIwICszNCwyMyBAQAogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oIgotI2luY2x1ZGUgIlRpbWVzdGFtcFNjaGVkdWxlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOyAgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiAKIHVzaW5nIGNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CiAKK3N0YXRpYyBjb25zdCBpbnQ2NF90IFRJTUVPVVRfTkFOT1MgPSAzTEwgKiAxMDAwICogMTAwMCAqIDEwMDA7CisvLyBJZiB0aGUgc3RyZWFtIGlzIGlkbGUgZm9yIG1vcmUgdGhhbiBgSURMRV9USU1FT1VUX05BTk9TYCwgdGhlIHN0cmVhbSB3aWxsIGJlIHB1dCBpbnRvIHN0YW5kYnkuCitzdGF0aWMgY29uc3QgaW50NjRfdCBJRExFX1RJTUVPVVRfTkFOT1MgPSAzZTk7CisKIC8qKgogICogQmFzZSBjbGFzcyBmb3Igc3RyZWFtcyBpbiB0aGUgc2VydmljZS4KICAqIEByZXR1cm4KICAqLwogCiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoQUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKQotICAgICAgICA6IG1UaW1lc3RhbXBUaHJlYWQoIkFBVGltZSIpCisgICAgICAgIDogbUNvbW1hbmRUaHJlYWQoIkFBQ29tbWFuZCIpCiAgICAgICAgICwgbUF0b21pY1N0cmVhbVRpbWVzdGFtcCgpCiAgICAgICAgICwgbUF1ZGlvU2VydmljZShhdWRpb1NlcnZpY2UpIHsKICAgICBtTW1hcENsaWVudC5hdHRyaWJ1dGlvblNvdXJjZSA9IEF0dHJpYnV0aW9uU291cmNlU3RhdGUoKTsKQEAgLTcwLDEwICs3MywxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQpLAogICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZpY2Ugc3RyZWFtICVwIHN0aWxsIG9wZW4sIHN0YXRlID0gJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgZ2V0U3RhdGUoKSk7CisKKyAgICAvLyBTdG9wIHRoZSBjb21tYW5kIHRocmVhZCBiZWZvcmUgZGVzdHJveWluZy4KKyAgICBpZiAobVRocmVhZEVuYWJsZWQpIHsKKyAgICAgICAgbVRocmVhZEVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgbUNvbW1hbmRRdWV1ZS5zdG9wV2FpdGluZygpOworICAgICAgICBtQ29tbWFuZFRocmVhZC5zdG9wKCk7CisgICAgfQogfQogCiBzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcEhlYWRlcigpIHsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoIiAgICBUICAgSGFuZGxlICAgVUlkICAgUG9ydCBSdW4gU3RhdGUgRm9ybWF0IEJ1cnN0IENoYW4gQ2FwYWNpdHkiKTsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoCisgICAgICAgICAgICAiICAgIFQgICBIYW5kbGUgICBVSWQgICBQb3J0IFJ1biBTdGF0ZSBGb3JtYXQgQnVyc3QgQ2hhbiBNYXNrICAgICBDYXBhY2l0eSIpOwogfQogCiBzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcCgpIGNvbnN0IHsKQEAgLTg4LDYgKzk5LDcgQEAKICAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDcpIDw8IGdldEZvcm1hdCgpOwogICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNikgPDwgbUZyYW1lc1BlckJ1cnN0OwogICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNSkgPDwgZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgcmVzdWx0IDw8IHN0ZDo6c2V0dyg4KSA8PCBzdGQ6OmhleCA8PCBnZXRDaGFubmVsTWFzaygpIDw8IHN0ZDo6ZGVjOwogICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoOSkgPDwgZ2V0QnVmZmVyQ2FwYWNpdHkoKTsKIAogICAgIHJldHVybiByZXN1bHQuc3RyKCk7CkBAIC0xNjQsMTYgKzE3NiwzNiBAQAogICAgICAgICBtRnJhbWVzUGVyQnVyc3QgPSBtU2VydmljZUVuZHBvaW50LT5nZXRGcmFtZXNQZXJCdXJzdCgpOwogICAgICAgICBjb3B5RnJvbSgqbVNlcnZpY2VFbmRwb2ludCk7CiAgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHRoaXMgb2JqZWN0IGRvZXMgbm90IGdldCBkZWxldGVkIGJlZm9yZSB0aGUgcnVuKCkgbWV0aG9kCisgICAgLy8gY2FuIHByb3RlY3QgaXQgYnkgbWFraW5nIGEgc3Ryb25nIHBvaW50ZXIuCisgICAgbUNvbW1hbmRRdWV1ZS5zdGFydFdhaXRpbmcoKTsKKyAgICBtVGhyZWFkRW5hYmxlZCA9IHRydWU7CisgICAgaW5jU3Ryb25nKG51bGxwdHIpOyAvLyBTZWUgcnVuKCkgbWV0aG9kLgorICAgIHJlc3VsdCA9IG1Db21tYW5kVGhyZWFkLnN0YXJ0KHRoaXMpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIGRlY1N0cm9uZyhudWxscHRyKTsgLy8gcnVuKCkgY2FuJ3QgZG8gaXQgc28gd2UgaGF2ZSB0byBkbyBpdCBoZXJlLgorICAgICAgICBnb3RvIGVycm9yOworICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogCiBlcnJvcjoKLSAgICBjbG9zZSgpOworICAgIGNsb3NlQW5kQ2xlYXIoKTsKKyAgICBtVGhyZWFkRW5hYmxlZCA9IGZhbHNlOworICAgIG1Db21tYW5kUXVldWUuc3RvcFdhaXRpbmcoKTsKKyAgICBtQ29tbWFuZFRocmVhZC5zdG9wKCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpjbG9zZSgpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIGNsb3NlX2woKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc2VuZENvbW1hbmQoQ0xPU0UsIG51bGxwdHIsIHRydWUgLyp3YWl0Rm9yUmVwbHkqLywgVElNRU9VVF9OQU5PUyk7CisKKyAgICAvLyBTdG9wIHRoZSBjb21tYW5kIHRocmVhZCBhcyB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KKyAgICBtVGhyZWFkRW5hYmxlZCA9IGZhbHNlOworICAgIG1Db21tYW5kUXVldWUuc3RvcFdhaXRpbmcoKTsKKyAgICBtQ29tbWFuZFRocmVhZC5zdG9wKCk7CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmNsb3NlX2woKSB7CkBAIC0xODEsMjkgKzIxMywxMCBAQAogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KIAotICAgIC8vIFRoaXMgd2lsbCBjYWxsIHN0b3BUaW1lc3RhbXBUaHJlYWQoKSBhbmQgYWxzbyBzdG9wIHRoZSBzdHJlYW0sCi0gICAgLy8ganVzdCBpbiBjYXNlIGl0IHdhcyBub3QgYWxyZWFkeSBzdG9wcGVkLgorICAgIC8vIFRoaXMgd2lsbCBzdG9wIHRoZSBzdHJlYW0sIGp1c3QgaW4gY2FzZSBpdCB3YXMgbm90IGFscmVhZHkgc3RvcHBlZC4KICAgICBzdG9wX2woKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7Ci0gICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnRXZWFrLnByb21vdGUoKTsKLSAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgewotICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKLSAgICB9IGVsc2UgewotICAgICAgICBlbmRwb2ludC0+dW5yZWdpc3RlclN0cmVhbSh0aGlzKTsKLSAgICAgICAgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyICZlbmRwb2ludE1hbmFnZXIgPSBBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGVuZHBvaW50TWFuYWdlci5jbG9zZUVuZHBvaW50KGVuZHBvaW50KTsKLQotICAgICAgICAvLyBBQXVkaW9TZXJ2aWNlOjpjbG9zZVN0cmVhbSgpIHByZXZlbnRzIHR3byB0aHJlYWRzIGZyb20gY2xvc2luZyBhdCB0aGUgc2FtZSB0aW1lLgotICAgICAgICBtU2VydmljZUVuZHBvaW50LmNsZWFyKCk7IC8vIGVuZHBvaW50IHdpbGwgaG9sZCB0aGUgcG9pbnRlciBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zLgotICAgIH0KLQotICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKTsKLQotICAgIG1lZGlhbWV0cmljczo6TG9nSXRlbShtTWV0cmljc0lkKQotICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0NMT1NFKQotICAgICAgICAucmVjb3JkKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gY2xvc2VBbmRDbGVhcigpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnN0YXJ0RGV2aWNlKCkgewpAQCAtMjIyLDggKzIzNSwxMCBAQAogICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgogICovCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnN0YXJ0KCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoU1RBUlQsIG51bGxwdHIsIHRydWUgLyp3YWl0Rm9yUmVwbHkqLywgVElNRU9VVF9OQU5PUyk7Cit9CiAKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RhcnRfbCgpIHsKICAgICBjb25zdCBpbnQ2NF90IGJlZ2luTnMgPSBBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAKQEAgLTIzNCw2ICsyNDksMTIgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIAorICAgIGlmIChtU3RhbmRieSkgeworICAgICAgICBBTE9HVygiJXMoKSB0aGUgc3RyZWFtIGlzIHN0YW5kYnksIHJldHVybiBFUlJPUl9TVEFOREJZLCAiCisgICAgICAgICAgICAgICJleHBlY3RpbmcgdGhlIGNsaWVudCBjYWxsIGV4aXRTdGFuZGJ5IGJlZm9yZSBzdGFydCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9TVEFOREJZOworICAgIH0KKwogICAgIG1lZGlhbWV0cmljczo6RGVmZXIgZGVmZXIoWyZdIHsKICAgICAgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKG1NZXRyaWNzSWQpCiAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1NUQVJUKQpAQCAtMjU5LDE1ICsyODAsNiBAQAogICAgIC8vIFRoaXMgc2hvdWxkIGhhcHBlbiBhdCB0aGUgZW5kIG9mIHRoZSBzdGFydC4KICAgICBzZW5kU2VydmljZUV2ZW50KEFBVURJT19TRVJWSUNFX0VWRU5UX1NUQVJURUQpOwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCk7Ci0gICAgbVRocmVhZEVuYWJsZWQuc3RvcmUodHJ1ZSk7Ci0gICAgLy8gTWFrZSBzdXJlIHRoaXMgb2JqZWN0IGRvZXMgbm90IGdldCBkZWxldGVkIGJlZm9yZSB0aGUgcnVuKCkgbWV0aG9kCi0gICAgLy8gY2FuIHByb3RlY3QgaXQgYnkgbWFraW5nIGEgc3Ryb25nIHBvaW50ZXIuCi0gICAgaW5jU3Ryb25nKG51bGxwdHIpOyAvLyBTZWUgcnVuKCkgbWV0aG9kLgotICAgIHJlc3VsdCA9IG1UaW1lc3RhbXBUaHJlYWQuc3RhcnQodGhpcyk7Ci0gICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgZGVjU3Ryb25nKG51bGxwdHIpOyAvLyBydW4oKSBjYW4ndCBkbyBpdCBzbyB3ZSBoYXZlIHRvIGRvIGl0IGhlcmUuCi0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKIApAQCAtMjc3LDggKzI4OSw3IEBACiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cGF1c2UoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwotICAgIHJldHVybiBwYXVzZV9sKCk7CisgICAgcmV0dXJuIHNlbmRDb21tYW5kKFBBVVNFLCBudWxscHRyLCB0cnVlIC8qd2FpdEZvclJlcGx5Ki8sIFRJTUVPVVRfTkFOT1MpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnBhdXNlX2woKSB7CkBAIC0yOTYsMTIgKzMwNyw2IEBACiAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVMsIChpbnQzMl90KXJlc3VsdCkKICAgICAgICAgICAgIC5yZWNvcmQoKTsgfSk7CiAKLSAgICByZXN1bHQgPSBzdG9wVGltZXN0YW1wVGhyZWFkKCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgZGlzY29ubmVjdF9sKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCiAgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnRXZWFrLnByb21vdGUoKTsKICAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXMoKSBoYXMgbm8gZW5kcG9pbnQiLCBfX2Z1bmNfXyk7CkBAIC0zMjAsOCArMzI1LDcgQEAKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdG9wKCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gc3RvcF9sKCk7CisgICAgcmV0dXJuIHNlbmRDb21tYW5kKFNUT1AsIG51bGxwdHIsIHRydWUgLyp3YWl0Rm9yUmVwbHkqLywgVElNRU9VVF9OQU5PUyk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RvcF9sKCkgewpAQCAtMzQxLDEyICszNDUsNiBAQAogCiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORyk7CiAKLSAgICAvLyBUZW1wb3JhcmlseSB1bmxvY2sgYmVjYXVzZSB3ZSBhcmUgam9pbmluZyB0aGUgdGltZXN0YW1wIHRocmVhZCBhbmQgaXQgbWF5IHRyeQotICAgIC8vIHRvIGFjcXVpcmUgbUxvY2suCi0gICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgcmVzdWx0ID0gc3RvcFRpbWVzdGFtcFRocmVhZCgpOwotICAgIG1Mb2NrLmxvY2soKTsKLQogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIGRpc2Nvbm5lY3RfbCgpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMzcxLDE3ICszNjksMTEgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnN0b3BUaW1lc3RhbXBUaHJlYWQoKSB7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICAvLyBjbGVhciBmbGFnIHRoYXQgdGVsbHMgdGhyZWFkIHRvIGxvb3AKLSAgICBpZiAobVRocmVhZEVuYWJsZWQuZXhjaGFuZ2UoZmFsc2UpKSB7Ci0gICAgICAgIHJlc3VsdCA9IG1UaW1lc3RhbXBUaHJlYWQuc3RvcCgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpmbHVzaCgpIHsKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoRkxVU0gsIG51bGxwdHIsIHRydWUgLyp3YWl0Rm9yUmVwbHkqLywgVElNRU9VVF9OQU5PUyk7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Zmx1c2goKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpmbHVzaF9sKCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9faXNGbHVzaEFsbG93ZWQoZ2V0U3RhdGUoKSk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTQwMiw0OCArMzk0LDEyMiBAQAogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKLS8vIGltcGxlbWVudCBSdW5uYWJsZSwgcGVyaW9kaWNhbGx5IHNlbmQgdGltZXN0YW1wcyB0byBjbGllbnQKKy8vIGltcGxlbWVudCBSdW5uYWJsZSwgcGVyaW9kaWNhbGx5IHNlbmQgdGltZXN0YW1wcyB0byBjbGllbnQgYW5kIHByb2Nlc3MgY29tbWFuZHMgZnJvbSBxdWV1ZS4KIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cnVuKCkgewotICAgIEFMT0dEKCIlcygpICVzIGVudGVyaW5nID4+Pj4+Pj4+Pj4+Pj4+IFRJTUVTVEFNUFMiLCBfX2Z1bmNfXywgZ2V0VHlwZVRleHQoKSk7CisgICAgQUxPR0QoIiVzKCkgJXMgZW50ZXJpbmcgPj4+Pj4+Pj4+Pj4+Pj4gQ09NTUFORFMiLCBfX2Z1bmNfXywgZ2V0VHlwZVRleHQoKSk7CiAgICAgLy8gSG9sZCBvbnRvIHRoZSByZWYgY291bnRlZCBzdHJlYW0gdW50aWwgdGhlIGVuZC4KICAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gaG9sZFN0cmVhbSh0aGlzKTsKICAgICBUaW1lc3RhbXBTY2hlZHVsZXIgdGltZXN0YW1wU2NoZWR1bGVyOworICAgIGludDY0X3QgbmV4dFRpbWU7CisgICAgaW50NjRfdCBzdGFuZGJ5VGltZSA9IEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkgKyBJRExFX1RJTUVPVVRfTkFOT1M7CiAgICAgLy8gQmFsYW5jZSB0aGUgaW5jU3Ryb25nIGZyb20gd2hlbiB0aGUgdGhyZWFkIHdhcyBsYXVuY2hlZC4KICAgICBob2xkU3RyZWFtLT5kZWNTdHJvbmcobnVsbHB0cik7CiAKLSAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc2V0QnVyc3RQZXJpb2QobUZyYW1lc1BlckJ1cnN0LCBnZXRTYW1wbGVSYXRlKCkpOwotICAgIHRpbWVzdGFtcFNjaGVkdWxlci5zdGFydChBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKLSAgICBpbnQ2NF90IG5leHRUaW1lID0gdGltZXN0YW1wU2NoZWR1bGVyLm5leHRBYnNvbHV0ZVRpbWUoKTsKKyAgICAvLyBUYWtpbmcgbUxvY2sgd2hpbGUgc3RhcnRpbmcgdGhlIHRocmVhZC4gQWxsIHRoZSBvcGVyYXRpb24gbXVzdCBiZSBhYmxlIHRvCisgICAgLy8gcnVuIHdpdGggaG9sZGluZyB0aGUgbG9jay4KKyAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKwogICAgIGludDMyX3QgbG9vcENvdW50ID0gMDsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwotICAgIHdoaWxlKG1UaHJlYWRFbmFibGVkLmxvYWQoKSkgeworICAgIHdoaWxlIChtVGhyZWFkRW5hYmxlZC5sb2FkKCkpIHsKICAgICAgICAgbG9vcENvdW50Kys7Ci0gICAgICAgIGlmIChBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpID49IG5leHRUaW1lKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBzZW5kQ3VycmVudFRpbWVzdGFtcCgpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSB0aW1lc3RhbXAgdGhyZWFkIGdvdCByZXN1bHQgPSAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vcyA9IC0xOworICAgICAgICBpZiAoaXNSdW5uaW5nKCkgfHwgKGlzSWRsZV9sKCkgJiYgIWlzU3RhbmRieV9sKCkpKSB7CisgICAgICAgICAgICB0aW1lb3V0TmFub3MgPSAoaXNSdW5uaW5nKCkgPyBuZXh0VGltZSA6IHN0YW5kYnlUaW1lKSAtIEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCk7CisgICAgICAgICAgICB0aW1lb3V0TmFub3MgPSBzdGQ6Om1heDxpbnQ2NF90PigwLCB0aW1lb3V0TmFub3MpOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBjb21tYW5kID0gbUNvbW1hbmRRdWV1ZS53YWl0Rm9yQ29tbWFuZCh0aW1lb3V0TmFub3MpOworICAgICAgICBpZiAoIW1UaHJlYWRFbmFibGVkKSB7CisgICAgICAgICAgICAvLyBCcmVhayB0aGUgbG9vcCBpZiB0aGUgdGhyZWFkIGlzIGRpc2FibGVkLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNSdW5uaW5nKCkgJiYgQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSA+PSBuZXh0VGltZSkgeworICAgICAgICAgICAgLy8gSXQgaXMgdGltZSB0byB1cGRhdGUgdGltZXN0YW1wLgorICAgICAgICAgICAgaWYgKHNlbmRDdXJyZW50VGltZXN0YW1wX2woKSAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlbmQgY3VycmVudCB0aW1lc3RhbXAsIHN0b3AgdXBkYXRpbmcgdGltZXN0YW1wIik7CisgICAgICAgICAgICAgICAgZGlzY29ubmVjdF9sKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5leHRUaW1lID0gdGltZXN0YW1wU2NoZWR1bGVyLm5leHRBYnNvbHV0ZVRpbWUoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5leHRUaW1lID0gdGltZXN0YW1wU2NoZWR1bGVyLm5leHRBYnNvbHV0ZVRpbWUoKTsKLSAgICAgICAgfSBlbHNlICB7Ci0gICAgICAgICAgICAvLyBTbGVlcCB1bnRpbCBpdCBpcyB0aW1lIHRvIHNlbmQgdGhlIG5leHQgdGltZXN0YW1wLgotICAgICAgICAgICAgLy8gVE9ETyBXYWl0IGZvciBhIHNpZ25hbCB3aXRoIGEgdGltZW91dCBzbyB0aGF0IHdlIGNhbiBzdG9wIG1vcmUgcXVpY2tseS4KLSAgICAgICAgICAgIEF1ZGlvQ2xvY2s6OnNsZWVwVW50aWxOYW5vVGltZShuZXh0VGltZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzSWRsZV9sKCkgJiYgQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSA+PSBzdGFuZGJ5VGltZSkgeworICAgICAgICAgICAgc3RhbmRieV9sKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IF9jb21tYW5kTG9jayhjb21tYW5kLT5sb2NrKTsKKyAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZC0+b3BlcmF0aW9uQ29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPnJlc3VsdCA9IHN0YXJ0X2woKTsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wU2NoZWR1bGVyLnNldEJ1cnN0UGVyaW9kKG1GcmFtZXNQZXJCdXJzdCwgZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wU2NoZWR1bGVyLnN0YXJ0KEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOworICAgICAgICAgICAgICAgICAgICBuZXh0VGltZSA9IHRpbWVzdGFtcFNjaGVkdWxlci5uZXh0QWJzb2x1dGVUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUEFVU0U6CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPnJlc3VsdCA9IHBhdXNlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhbmRieVRpbWUgPSBBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpICsgSURMRV9USU1FT1VUX05BTk9TOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUT1A6CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPnJlc3VsdCA9IHN0b3BfbCgpOworICAgICAgICAgICAgICAgICAgICBzdGFuZGJ5VGltZSA9IEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkgKyBJRExFX1RJTUVPVVRfTkFOT1M7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRkxVU0g6CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPnJlc3VsdCA9IGZsdXNoX2woKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTE9TRToKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+cmVzdWx0ID0gY2xvc2VfbCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RfbCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJFR0lTVEVSX0FVRElPX1RIUkVBRDogeworICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckF1ZGlvVGhyZWFkUGFyYW0gKnBhcmFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmVnaXN0ZXJBdWRpb1RocmVhZFBhcmFtICopIGNvbW1hbmQtPnBhcmFtZXRlci5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+cmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSA9PSBudWxscHRyID8gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVnaXN0ZXJBdWRpb1RocmVhZF9sKHBhcmFtLT5tT3duZXJQaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+bUNsaWVudFRocmVhZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPm1Qcmlvcml0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFVOUkVHSVNURVJfQVVESU9fVEhSRUFEOiB7CisgICAgICAgICAgICAgICAgICAgIFVucmVnaXN0ZXJBdWRpb1RocmVhZFBhcmFtICpwYXJhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVucmVnaXN0ZXJBdWRpb1RocmVhZFBhcmFtICopIGNvbW1hbmQtPnBhcmFtZXRlci5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+cmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSA9PSBudWxscHRyID8gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5yZWdpc3RlckF1ZGlvVGhyZWFkX2wocGFyYW0tPm1DbGllbnRUaHJlYWRJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdFVF9ERVNDUklQVElPTjogeworICAgICAgICAgICAgICAgICAgICBHZXREZXNjcmlwdGlvblBhcmFtICpwYXJhbSA9IChHZXREZXNjcmlwdGlvblBhcmFtICopIGNvbW1hbmQtPnBhcmFtZXRlci5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+cmVzdWx0ID0gcGFyYW0gPT0gbnVsbHB0ciA/IEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0RGVzY3JpcHRpb25fbChwYXJhbS0+bVBhcmNlbGFibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFWElUX1NUQU5EQlk6IHsKKyAgICAgICAgICAgICAgICAgICAgRXhpdFN0YW5kYnlQYXJhbSAqcGFyYW0gPSAoRXhpdFN0YW5kYnlQYXJhbSAqKSBjb21tYW5kLT5wYXJhbWV0ZXIuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPnJlc3VsdCA9IHBhcmFtID09IG51bGxwdHIgPyBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZXhpdFN0YW5kYnlfbChwYXJhbS0+bVBhcmNlbGFibGUpOworICAgICAgICAgICAgICAgICAgICBzdGFuZGJ5VGltZSA9IEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkgKyBJRExFX1RJTUVPVVRfTkFOT1M7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjb21tYW5kIG9wIGNvZGU6ICVkIiwgY29tbWFuZC0+b3BlcmF0aW9uQ29kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbW1hbmQtPmlzV2FpdGluZ0ZvclJlcGx5KSB7CisgICAgICAgICAgICAgICAgY29tbWFuZC0+aXNXYWl0aW5nRm9yUmVwbHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb21tYW5kLT5jb25kaXRpb25WYXJpYWJsZS5ub3RpZnlfb25lKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgLy8gVGhpcyB3YXMgbW92ZWQgZnJvbSB0aGUgY2FsbHMgaW4gc3RvcF9sKCkgYW5kIHBhdXNlX2woKSwgd2hpY2ggY291bGQgY2F1c2UgYSBkZWFkbG9jawotICAgIC8vIGlmIGl0IHJlc3VsdGVkIGluIGEgY2FsbCB0byBkaXNjb25uZWN0LgotICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7Ci0gICAgICAgICh2b2lkKSBzZW5kQ3VycmVudFRpbWVzdGFtcCgpOwotICAgIH0KLSAgICBBTE9HRCgiJXMoKSAlcyBleGl0aW5nIGFmdGVyICVkIGxvb3BzIDw8PDw8PDw8PDw8PDw8IFRJTUVTVEFNUFMiLAorICAgIEFMT0dEKCIlcygpICVzIGV4aXRpbmcgYWZ0ZXIgJWQgbG9vcHMgPDw8PDw8PDw8PDw8PDwgQ09NTUFORFMiLAogICAgICAgICAgIF9fZnVuY19fLCBnZXRUeXBlVGV4dCgpLCBsb29wQ291bnQpOwogfQogCiB2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpkaXNjb25uZWN0KCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKLSAgICBkaXNjb25uZWN0X2woKTsKKyAgICBzZW5kQ29tbWFuZChESVNDT05ORUNUKTsKIH0KIAogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZGlzY29ubmVjdF9sKCkgewpAQCAtNDU5LDE1ICs1MjUsMjEgQEAKICAgICB9CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cmVnaXN0ZXJBdWRpb1RocmVhZChwaWRfdCBjbGllbnRUaHJlYWRJZCwKLSAgICAgICAgaW50IHByaW9yaXR5KSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpyZWdpc3RlckF1ZGlvVGhyZWFkKHBpZF90IGNsaWVudFRocmVhZElkLCBpbnQgcHJpb3JpdHkpIHsKKyAgICBjb25zdCBwaWRfdCBvd25lclBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsgLy8gVE9ETyByZXZpZXcKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoUkVHSVNURVJfQVVESU9fVEhSRUFELAorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxSZWdpc3RlckF1ZGlvVGhyZWFkUGFyYW0+KG93bmVyUGlkLCBjbGllbnRUaHJlYWRJZCwgcHJpb3JpdHkpLAorICAgICAgICAgICAgdHJ1ZSAvKndhaXRGb3JSZXBseSovLAorICAgICAgICAgICAgVElNRU9VVF9OQU5PUyk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cmVnaXN0ZXJBdWRpb1RocmVhZF9sKAorICAgICAgICBwaWRfdCBvd25lclBpZCwgcGlkX3QgY2xpZW50VGhyZWFkSWQsIGludCBwcmlvcml0eSkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgaWYgKGdldFJlZ2lzdGVyZWRUaHJlYWQoKSAhPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6SUxMRUdBTF9USFJFQURfSUQpIHsKICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OnJlZ2lzdGVyQXVkaW9UaHJlYWQoKSwgdGhyZWFkIGFscmVhZHkgcmVnaXN0ZXJlZCIpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBwaWRfdCBvd25lclBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsgLy8gVE9ETyByZXZpZXcKICAgICAgICAgc2V0UmVnaXN0ZXJlZFRocmVhZChjbGllbnRUaHJlYWRJZCk7CiAgICAgICAgIGludCBlcnIgPSBhbmRyb2lkOjpyZXF1ZXN0UHJpb3JpdHkob3duZXJQaWQsIGNsaWVudFRocmVhZElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LCB0cnVlIC8qIGlzRm9yQXBwICovKTsKQEAgLTQ4MSw3ICs1NTMsMTMgQEAKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjp1bnJlZ2lzdGVyQXVkaW9UaHJlYWQocGlkX3QgY2xpZW50VGhyZWFkSWQpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIHNlbmRDb21tYW5kKFVOUkVHSVNURVJfQVVESU9fVEhSRUFELAorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxVbnJlZ2lzdGVyQXVkaW9UaHJlYWRQYXJhbT4oY2xpZW50VGhyZWFkSWQpLAorICAgICAgICAgICAgdHJ1ZSAvKndhaXRGb3JSZXBseSovLAorICAgICAgICAgICAgVElNRU9VVF9OQU5PUyk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6dW5yZWdpc3RlckF1ZGlvVGhyZWFkX2wocGlkX3QgY2xpZW50VGhyZWFkSWQpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIGlmIChnZXRSZWdpc3RlcmVkVGhyZWFkKCkgIT0gY2xpZW50VGhyZWFkSWQpIHsKICAgICAgICAgQUxPR0UoIiVzKCksIHdyb25nIHRocmVhZCIsIF9fZnVuY19fKTsKQEAgLTU1MCw3ICs2MjgsNyBAQAogICAgIHJldHVybiBzZW5kU2VydmljZUV2ZW50KEFBVURJT19TRVJWSUNFX0VWRU5UX1hSVU4sIChpbnQ2NF90KSB4UnVuQ291bnQpOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnNlbmRDdXJyZW50VGltZXN0YW1wKCkgeworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzZW5kQ3VycmVudFRpbWVzdGFtcF9sKCkgewogICAgIEFBdWRpb1NlcnZpY2VNZXNzYWdlIGNvbW1hbmQ7CiAgICAgLy8gSXQgaXMgbm90IHdvcnRoIGZpbGxpbmcgdXAgdGhlIHF1ZXVlIHdpdGggdGltZXN0YW1wcy4KICAgICAvLyBUaGF0IGNhbiBjYXVzZSB0aGUgc3RyZWFtIHRvIGdldCBzdXNwZW5kZWQuCkBAIC01NjAsOCArNjM4LDggQEAKICAgICB9CiAKICAgICAvLyBTZW5kIGEgdGltZXN0YW1wIGZvciB0aGUgY2xvY2sgbW9kZWwuCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oJmNvbW1hbmQudGltZXN0YW1wLnBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kLnRpbWVzdGFtcC50aW1lc3RhbXApOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uX2woJmNvbW1hbmQudGltZXN0YW1wLnBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmQudGltZXN0YW1wLnRpbWVzdGFtcCk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgQUxPR1YoIiVzKCkgU0VSVklDRSAgJThsbGQgYXQgJWxsZCIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAobG9uZyBsb25nKSBjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKQEAgLTU3MSw4ICs2NDksOCBAQAogCiAgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICAvLyBTZW5kIGEgaGFyZHdhcmUgdGltZXN0YW1wIGZvciBwcmVzZW50YXRpb24gdGltZS4KLSAgICAgICAgICAgIHJlc3VsdCA9IGdldEhhcmR3YXJlVGltZXN0YW1wKCZjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kLnRpbWVzdGFtcC50aW1lc3RhbXApOworICAgICAgICAgICAgcmVzdWx0ID0gZ2V0SGFyZHdhcmVUaW1lc3RhbXBfbCgmY29tbWFuZC50aW1lc3RhbXAucG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kLnRpbWVzdGFtcC50aW1lc3RhbXApOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgICAgICAgICBBTE9HVigiJXMoKSBIQVJEV0FSRSAlOGxsZCBhdCAlbGxkIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgY29tbWFuZC50aW1lc3RhbXAucG9zaXRpb24sCkBAIC01OTQsNyArNjcyLDE0IEBACiAgKiB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHVuZGVybHlpbmcgSEFMIG9yIFNlcnZpY2UuCiAgKi8KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Z2V0RGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIHNlbmRDb21tYW5kKAorICAgICAgICAgICAgR0VUX0RFU0NSSVBUSU9OLAorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxHZXREZXNjcmlwdGlvblBhcmFtPigmcGFyY2VsYWJsZSksCisgICAgICAgICAgICB0cnVlIC8qd2FpdEZvclJlcGx5Ki8sCisgICAgICAgICAgICBUSU1FT1VUX05BTk9TKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpnZXREZXNjcmlwdGlvbl9sKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKSB7CiAgICAgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXBNZXNzYWdlUXVldWVMb2NrKTsKICAgICAgICAgaWYgKG1VcE1lc3NhZ2VRdWV1ZSA9PSBudWxscHRyKSB7CkBAIC02MDMsMTEgKzY4OCw1MCBAQAogICAgICAgICB9CiAgICAgICAgIC8vIEdhdGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgbWVzc2FnZSBxdWV1ZS4KICAgICAgICAgbVVwTWVzc2FnZVF1ZXVlLT5maWxsUGFyY2VsYWJsZShwYXJjZWxhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmNlbGFibGUubVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyY2VsYWJsZS0+bVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSk7CiAgICAgfQotICAgIHJldHVybiBnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbihwYXJjZWxhYmxlKTsKKyAgICByZXR1cm4gZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb25fbChwYXJjZWxhYmxlKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpleGl0U3RhbmRieShBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAqcGFyY2VsYWJsZSkgeworICAgIGF1dG8gY29tbWFuZCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QUF1ZGlvQ29tbWFuZD4oCisgICAgICAgICAgICBFWElUX1NUQU5EQlksCisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEV4aXRTdGFuZGJ5UGFyYW0+KHBhcmNlbGFibGUpLAorICAgICAgICAgICAgdHJ1ZSAvKndhaXRGb3JSZXBseSovLAorICAgICAgICAgICAgVElNRU9VVF9OQU5PUyk7CisgICAgcmV0dXJuIG1Db21tYW5kUXVldWUuc2VuZENvbW1hbmQoY29tbWFuZCk7CiB9CiAKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9uVm9sdW1lQ2hhbmdlZChmbG9hdCB2b2x1bWUpIHsKICAgICBzZW5kU2VydmljZUV2ZW50KEFBVURJT19TRVJWSUNFX0VWRU5UX1ZPTFVNRSwgdm9sdW1lKTsKIH0KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzZW5kQ29tbWFuZChhYXVkaW9fY29tbWFuZF9vcGNvZGUgb3BDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvQ29tbWFuZFBhcmFtPiBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3YWl0Rm9yUmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zKSB7CisgICAgcmV0dXJuIG1Db21tYW5kUXVldWUuc2VuZENvbW1hbmQoc3RkOjptYWtlX3NoYXJlZDxBQXVkaW9Db21tYW5kPigKKyAgICAgICAgICAgIG9wQ29kZSwgcGFyYW0sIHdhaXRGb3JSZXBseSwgdGltZW91dE5hbm9zKSk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Y2xvc2VBbmRDbGVhcigpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50V2Vhay5wcm9tb3RlKCk7CisgICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW5kcG9pbnQtPnVucmVnaXN0ZXJTdHJlYW0odGhpcyk7CisgICAgICAgIEFBdWRpb0VuZHBvaW50TWFuYWdlciAmZW5kcG9pbnRNYW5hZ2VyID0gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgICAgICBlbmRwb2ludE1hbmFnZXIuY2xvc2VFbmRwb2ludChlbmRwb2ludCk7CisKKyAgICAgICAgLy8gQUF1ZGlvU2VydmljZTo6Y2xvc2VTdHJlYW0oKSBwcmV2ZW50cyB0d28gdGhyZWFkcyBmcm9tIGNsb3NpbmcgYXQgdGhlIHNhbWUgdGltZS4KKyAgICAgICAgbVNlcnZpY2VFbmRwb2ludC5jbGVhcigpOyAvLyBlbmRwb2ludCB3aWxsIGhvbGQgdGhlIHBvaW50ZXIgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICB9CisKKyAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCk7CisKKyAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0obU1ldHJpY3NJZCkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9DTE9TRSkKKyAgICAgICAgLnJlY29yZCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaAppbmRleCA5NzY5OTZkLi5iMmJhNzI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKQEAgLTMzLDggKzMzLDEwIEBACiAjaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0F1ZGlvQ2xvY2suaCIKIAotI2luY2x1ZGUgIlNoYXJlZFJpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJBQXVkaW9Db21tYW5kUXVldWUuaCIKICNpbmNsdWRlICJBQXVkaW9UaHJlYWQuaCIKKyNpbmNsdWRlICJTaGFyZWRSaW5nQnVmZmVyLmgiCisjaW5jbHVkZSAiVGltZXN0YW1wU2NoZWR1bGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKICAgICBjbGFzcyBBQXVkaW9TZXJ2aWNlOwpAQCAtMTE0LDYgKzExNiwxMSBAQAogICAgICAqLwogICAgIGFhdWRpb19yZXN1bHRfdCBmbHVzaCgpIEVYQ0xVREVTKG1Mb2NrKTsKIAorICAgIC8qKgorICAgICAqIEV4aXQgc3RhbmRieSBtb2RlLiBUaGUgTU1BUCBidWZmZXIgd2lsbCBiZSByZWFsbG9jYXRlZC4KKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3QgZXhpdFN0YW5kYnkoQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgKnBhcmNlbGFibGUpIEVYQ0xVREVTKG1Mb2NrKTsKKwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSBfX3VudXNlZCkgewpAQCAtMjM1LDEwICsyNDIsNDYgQEAKICAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKTsKIAorICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydF9sKCkgUkVRVUlSRVMobUxvY2spOwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlX2woKSBSRVFVSVJFUyhtTG9jayk7CiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcGF1c2VfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdG9wX2woKSBSRVFVSVJFUyhtTG9jayk7CiAgICAgdm9pZCBkaXNjb25uZWN0X2woKSBSRVFVSVJFUyhtTG9jayk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGZsdXNoX2woKSBSRVFVSVJFUyhtTG9jayk7CisKKyAgICBjbGFzcyBSZWdpc3RlckF1ZGlvVGhyZWFkUGFyYW0gOiBwdWJsaWMgQUF1ZGlvQ29tbWFuZFBhcmFtIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFJlZ2lzdGVyQXVkaW9UaHJlYWRQYXJhbShwaWRfdCBvd25lclBpZCwgcGlkX3QgY2xpZW50VGhyZWFkSWQsIGludCBwcmlvcml0eSkKKyAgICAgICAgICAgICAgICA6IEFBdWRpb0NvbW1hbmRQYXJhbSgpLCBtT3duZXJQaWQob3duZXJQaWQpLAorICAgICAgICAgICAgICAgICAgbUNsaWVudFRocmVhZElkKGNsaWVudFRocmVhZElkKSwgbVByaW9yaXR5KHByaW9yaXR5KSB7IH0KKyAgICAgICAgflJlZ2lzdGVyQXVkaW9UaHJlYWRQYXJhbSgpID0gZGVmYXVsdDsKKworICAgICAgICBwaWRfdCBtT3duZXJQaWQ7CisgICAgICAgIHBpZF90IG1DbGllbnRUaHJlYWRJZDsKKyAgICAgICAgaW50IG1Qcmlvcml0eTsKKyAgICB9OworICAgIGFhdWRpb19yZXN1bHRfdCByZWdpc3RlckF1ZGlvVGhyZWFkX2woCisgICAgICAgICAgICBwaWRfdCBvd25lclBpZCwgcGlkX3QgY2xpZW50VGhyZWFkSWQsIGludCBwcmlvcml0eSkgUkVRVUlSRVMobUxvY2spOworCisgICAgY2xhc3MgVW5yZWdpc3RlckF1ZGlvVGhyZWFkUGFyYW0gOiBwdWJsaWMgQUF1ZGlvQ29tbWFuZFBhcmFtIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFVucmVnaXN0ZXJBdWRpb1RocmVhZFBhcmFtKHBpZF90IGNsaWVudFRocmVhZElkKQorICAgICAgICAgICAgICAgIDogQUF1ZGlvQ29tbWFuZFBhcmFtKCksIG1DbGllbnRUaHJlYWRJZChjbGllbnRUaHJlYWRJZCkgeyB9CisgICAgICAgIH5VbnJlZ2lzdGVyQXVkaW9UaHJlYWRQYXJhbSgpID0gZGVmYXVsdDsKKworICAgICAgICBwaWRfdCBtQ2xpZW50VGhyZWFkSWQ7CisgICAgfTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlckF1ZGlvVGhyZWFkX2wocGlkX3QgY2xpZW50VGhyZWFkSWQpIFJFUVVJUkVTKG1Mb2NrKTsKKworICAgIGNsYXNzIEdldERlc2NyaXB0aW9uUGFyYW0gOiBwdWJsaWMgQUF1ZGlvQ29tbWFuZFBhcmFtIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEdldERlc2NyaXB0aW9uUGFyYW0oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIHBhcmNlbGFibGUpCisgICAgICAgICAgICAgICAgOiBBQXVkaW9Db21tYW5kUGFyYW0oKSwgbVBhcmNlbGFibGUocGFyY2VsYWJsZSkgeyB9CisgICAgICAgIH5HZXREZXNjcmlwdGlvblBhcmFtKCkgPSBkZWZhdWx0OworCisgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBtUGFyY2VsYWJsZTsKKyAgICB9OworICAgIGFhdWRpb19yZXN1bHRfdCBnZXREZXNjcmlwdGlvbl9sKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKSBSRVFVSVJFUyhtTG9jayk7CiAKICAgICB2b2lkIHNldFN0YXRlKGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSk7CiAKQEAgLTI1MCw3ICsyOTMsNyBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHdyaXRlVXBNZXNzYWdlUXVldWUoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKmNvbW1hbmQpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNlbmRDdXJyZW50VGltZXN0YW1wKCkgRVhDTFVERVMobUxvY2spOworICAgIGFhdWRpb19yZXN1bHRfdCBzZW5kQ3VycmVudFRpbWVzdGFtcF9sKCkgUkVRVUlSRVMobUxvY2spOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHNlbmRYUnVuQ291bnQoaW50MzJfdCB4UnVuQ291bnQpOwogCkBAIC0yNTksMTEgKzMwMiwxMyBAQAogICAgICAqIEBwYXJhbSB0aW1lTmFub3MKICAgICAgKiBAcmV0dXJuIEFBVURJT19PSyBvciBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUgb3Igb3RoZXIgbmVnYXRpdmUgZXJyb3IKICAgICAgKi8KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpID0gMDsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uX2woCisgICAgICAgICAgICBpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXRIYXJkd2FyZVRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSA9IDA7CisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0SGFyZHdhcmVUaW1lc3RhbXBfbChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgPSAwOworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldEF1ZGlvRGF0YURlc2NyaXB0aW9uX2woQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIHBhcmNlbGFibGUpID0gMDsKKwogCiAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90ICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEOwogCkBAIC0yNzQsMTQgKzMxOSw1MyBAQAogICAgICAgICBtRGlzY29ubmVjdGVkID0gZmxhZzsKICAgICB9CiAKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdGFuZGJ5X2woKSBSRVFVSVJFUyhtTG9jaykgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgIH0KKyAgICBjbGFzcyBFeGl0U3RhbmRieVBhcmFtIDogcHVibGljIEFBdWRpb0NvbW1hbmRQYXJhbSB7CisgICAgcHVibGljOgorICAgICAgICBFeGl0U3RhbmRieVBhcmFtKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKQorICAgICAgICAgICAgICAgIDogQUF1ZGlvQ29tbWFuZFBhcmFtKCksIG1QYXJjZWxhYmxlKHBhcmNlbGFibGUpIHsgfQorICAgICAgICB+RXhpdFN0YW5kYnlQYXJhbSgpID0gZGVmYXVsdDsKKworICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogbVBhcmNlbGFibGU7CisgICAgfTsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBleGl0U3RhbmRieV9sKAorICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIHBhcmNlbGFibGUgX191bnVzZWQpIFJFUVVJUkVTKG1Mb2NrKSB7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfQorICAgIGJvb2wgaXNTdGFuZGJ5X2woKSBjb25zdCBSRVFVSVJFUyhtTG9jaykgeworICAgICAgICByZXR1cm4gbVN0YW5kYnk7CisgICAgfQorICAgIHZvaWQgc2V0U3RhbmRieV9sKGJvb2wgc3RhbmRieSkgUkVRVUlSRVMobUxvY2spIHsKKyAgICAgICAgbVN0YW5kYnkgPSBzdGFuZGJ5OworICAgIH0KKworICAgIGJvb2wgaXNJZGxlX2woKSBjb25zdCBSRVFVSVJFUyhtTG9jaykgeworICAgICAgICByZXR1cm4gbVN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTiB8fCBtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQKKyAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVEOworICAgIH0KKwogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgIG1SZWdpc3RlcmVkQ2xpZW50VGhyZWFkID0gSUxMRUdBTF9USFJFQURfSUQ7CiAKICAgICBzdGQ6Om11dGV4ICAgICAgICAgICAgICBtVXBNZXNzYWdlUXVldWVMb2NrOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxTaGFyZWRSaW5nQnVmZmVyPiBtVXBNZXNzYWdlUXVldWU7CiAKLSAgICBBQXVkaW9UaHJlYWQgICAgICAgICAgICBtVGltZXN0YW1wVGhyZWFkOwotICAgIC8vIFRoaXMgaXMgdXNlZCBieSBvbmUgdGhyZWFkIHRvIHRlbGwgYW5vdGhlciB0aHJlYWQgdG8gZXhpdC4gU28gaXQgbXVzdCBiZSBhdG9taWMuCisgICAgZW51bSA6IGludDMyX3QgeworICAgICAgICBTVEFSVCwKKyAgICAgICAgUEFVU0UsCisgICAgICAgIFNUT1AsCisgICAgICAgIEZMVVNILAorICAgICAgICBDTE9TRSwKKyAgICAgICAgRElTQ09OTkVDVCwKKyAgICAgICAgUkVHSVNURVJfQVVESU9fVEhSRUFELAorICAgICAgICBVTlJFR0lTVEVSX0FVRElPX1RIUkVBRCwKKyAgICAgICAgR0VUX0RFU0NSSVBUSU9OLAorICAgICAgICBFWElUX1NUQU5EQlksCisgICAgfTsKKyAgICBBQXVkaW9UaHJlYWQgICAgICAgICAgICBtQ29tbWFuZFRocmVhZDsKICAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICBtVGhyZWFkRW5hYmxlZHtmYWxzZX07CisgICAgQUF1ZGlvQ29tbWFuZFF1ZXVlICAgICAgbUNvbW1hbmRRdWV1ZTsKIAogICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdCA9IDA7CiAgICAgYW5kcm9pZDo6QXVkaW9DbGllbnQgICAgbU1tYXBDbGllbnQ7IC8vIHNldCBpbiBvcGVuLCB1c2VkIGluIE1NQVAgc3RhcnQoKQpAQCAtMzE1LDYgKzM5OSwxMyBAQAogICAgIGFhdWRpb19yZXN1bHRfdCBzZW5kU2VydmljZUV2ZW50KGFhdWRpb19zZXJ2aWNlX2V2ZW50X3QgZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRhdGFEb3VibGUpOwogCisgICAgYWF1ZGlvX3Jlc3VsdF90IHNlbmRDb21tYW5kKGFhdWRpb19jb21tYW5kX29wY29kZSBvcENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBQXVkaW9Db21tYW5kUGFyYW0+IHBhcmFtID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3YWl0Rm9yUmVwbHkgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0TmFub3MgPSAwKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZUFuZENsZWFyKCk7CisKICAgICAvKioKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHF1ZXVlIGlzIGdldHRpbmcgZnVsbC4KICAgICAgKi8KQEAgLTMzMyw5ICs0MjQsMTMgQEAKIAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1EaXNjb25uZWN0ZWQgR1VBUkRFRF9CWShtTG9jaykge2ZhbHNlfTsKIAorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5IEdVQVJERURfQlkobUxvY2spID0gZmFsc2U7CisKIHByb3RlY3RlZDoKICAgICAvLyBMb2NraW5nIG9yZGVyIGlzIGltcG9ydGFudC4KICAgICAvLyBBY3F1aXJlIG1Mb2NrIGJlZm9yZSBhY3F1aXJpbmcgQUF1ZGlvU2VydmljZUVuZHBvaW50OjptTG9ja1N0cmVhbXMKKyAgICAvLyBUaGUgbG9jayB3aWxsIGJlIGhlbGQgYnkgdGhlIGNvbW1hbmQgdGhyZWFkLiBBbGwgb3BlcmF0aW9ucyBuZWVkaW5nIHRoZSBsb2NrIG11c3QgcnVuIGZyb20KKyAgICAvLyB0aGUgY29tbWFuZCB0aHJlYWQuCiAgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgbUxvY2s7IC8vIFByZXZlbnQgc3RhcnQvc3RvcC9jbG9zZSBldGNldGVyYSBmcm9tIGNvbGxpZGluZwogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCmluZGV4IDU3ZGMxYWIuLmVjOWIyZTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKQEAgLTExNyw2ICsxMTcsMzUgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OnN0YW5kYnlfbCgpIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOworICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpIGhhcyBubyBlbmRwb2ludCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZW5kcG9pbnQtPnN0YW5kYnkoKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICBzZXRTdGFuZGJ5X2wodHJ1ZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6ZXhpdFN0YW5kYnlfbChBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkgeworICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50V2Vhay5wcm9tb3RlKCk7CisgICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgaGFzIG5vIGVuZHBvaW50IiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBlbmRwb2ludC0+ZXhpdFN0YW5kYnkocGFyY2VsYWJsZSk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgc2V0U3RhbmRieV9sKGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXMgZmFpbGVkLCByZXN1bHQgJWQsIGRpc2Nvbm5lY3Rpbmcgc3RyZWFtLiIsIF9fZnVuY19fLCByZXN1bHQpOworICAgICAgICBkaXNjb25uZWN0X2woKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpzdGFydENsaWVudChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgewpAQCAtMTQxLDcgKzE3MCw3IEBACiB9CiAKIC8vIEdldCBmcmVlLXJ1bm5pbmcgRFNQIG9yIERNQSBoYXJkd2FyZSBwb3NpdGlvbiBmcm9tIHRoZSBIQUwuCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmdldEZyZWVSdW5uaW5nUG9zaXRpb25fbChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgewogICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50V2Vhay5wcm9tb3RlKCk7CiAgICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKQEAgLTE1OCwxNiArMTg3LDE1IEBACiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOwogICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCk7CiAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFKSB7Ci0gICAgICAgIGRpc2Nvbm5lY3QoKTsKKyAgICAgICAgZGlzY29ubmVjdF9sKCk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8vIEdldCB0aW1lc3RhbXAgZnJvbSBwcmVzZW50YXRpb24gcG9zaXRpb24uCiAvLyBJZiBpdCBmYWlscywgZ2V0IHRpbWVzdGFtcCB0aGF0IHdhcyB3cml0dGVuIGJ5IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oKQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpnZXRIYXJkd2FyZVRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Z2V0SGFyZHdhcmVUaW1lc3RhbXBfbChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKLQogICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50V2Vhay5wcm9tb3RlKCk7CiAgICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzKCkgaGFzIG5vIGVuZHBvaW50IiwgX19mdW5jX18pOwpAQCAtMTc2LDE3ICsyMDQsMTcgQEAKICAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQPiBzZXJ2aWNlRW5kcG9pbnRNTUFQID0KICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAgKj4oZW5kcG9pbnQuZ2V0KCkpOwogCi0gICAgLy8gRGlzYWJsZSB0aGlzIGNvZGUgdGVtcG9yYXJpbHkgYmVjYXVzZSB0aGUgSEFMIGlzIG5vdCByZXR1cm5pbmcKLSAgICAvLyBhIHVzZWZ1bCByZXN1bHQuCi0jaWYgMAogICAgIHVpbnQ2NF90IHBvc2l0aW9uOwotICAgIGlmIChzZXJ2aWNlRW5kcG9pbnRNTUFQLT5nZXRFeHRlcm5hbFBvc2l0aW9uKCZwb3NpdGlvbiwgdGltZU5hbm9zKSA9PSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0QoIiVzKCkgZ2V0RXh0ZXJuYWxQb3NpdGlvbigpIHNheXMgcG9zID0gJSIgUFJJaTY0ICIsIHRpbWUgPSAlIiBQUklpNjQsCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VFbmRwb2ludE1NQVAtPmdldEV4dGVybmFsUG9zaXRpb24oJnBvc2l0aW9uLCB0aW1lTmFub3MpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIEFMT0dWKCIlcygpIGdldEV4dGVybmFsUG9zaXRpb24oKSBzYXlzIHBvcyA9ICUiIFBSSWk2NCAiLCB0aW1lID0gJSIgUFJJaTY0LAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwb3NpdGlvbiwgKnRpbWVOYW5vcyk7CiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IChpbnQ2NF90KSBwb3NpdGlvbjsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKLSAgICB9IGVsc2UKLSNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCIlcygpIGdldEV4dGVybmFsUG9zaXRpb24oKSByZXR1cm5zIGVycm9yICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CisgICAgfQorCiAgICAgaWYgKG1BdG9taWNTdHJlYW1UaW1lc3RhbXAuaXNWYWxpZCgpKSB7CiAgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljU3RyZWFtVGltZXN0YW1wLnJlYWQoKTsKICAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCk7CkBAIC0xOTgsOCArMjI2LDggQEAKIH0KIAogLy8gR2V0IGFuIGltbXV0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YSBxdWV1ZSBmcm9tIHRoZSBIQUwuCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmdldEF1ZGlvRGF0YURlc2NyaXB0aW9uKAotICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Z2V0QXVkaW9EYXRhRGVzY3JpcHRpb25fbCgKKyAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUqIHBhcmNlbGFibGUpCiB7CiAgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnRXZWFrLnByb21vdGUoKTsKICAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgKaW5kZXggNjY3NDY1YS4uY2Q4YzkxZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oCkBAIC03MSwxMiArNzEsMTggQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wX2woKSBSRVFVSVJFUyhtTG9jaykgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCBzdGFuZGJ5X2woKSBSRVFVSVJFUyhtTG9jaykgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKLSAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgRVhDTFVERVMobUxvY2spIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCBleGl0U3RhbmRieV9sKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKSBSRVFVSVJFUyhtTG9jaykgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0SGFyZHdhcmVUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEF1ZGlvRGF0YURlc2NyaXB0aW9uX2woCisgICAgICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkgUkVRVUlSRVMobUxvY2spIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb25fbChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKKyAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgUkVRVUlSRVMobUxvY2spIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEhhcmR3YXJlVGltZXN0YW1wX2woCisgICAgICAgICAgICBpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBSRVFVSVJFUyhtTG9jaykgb3ZlcnJpZGU7CiAKICAgICAvKioKICAgICAgKiBEZXZpY2Ugc3BlY2lmaWMgc3RhcnR1cC4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAKaW5kZXggYzY2NWNkYS4uMDRmY2Q2ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAKQEAgLTE2NCwxMSArMTY0LDExIEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgc2V0U2FtcGxlc1BlckZyYW1lKGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7Ci0gICAgaWYgKGdldFNhbXBsZXNQZXJGcmFtZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBzZXRTYW1wbGVzUGVyRnJhbWUoZW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKKyAgICBzZXRDaGFubmVsTWFzayhjb25maWd1cmF0aW9uSW5wdXQuZ2V0Q2hhbm5lbE1hc2soKSk7CisgICAgaWYgKGdldENoYW5uZWxNYXNrKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIHNldENoYW5uZWxNYXNrKGVuZHBvaW50LT5nZXRDaGFubmVsTWFzaygpKTsKICAgICB9IGVsc2UgaWYgKGdldFNhbXBsZXNQZXJGcmFtZSgpICE9IGVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSkgewotICAgICAgICBBTE9HRCgiJXMoKSBtU2FtcGxlc1BlckZyYW1lID0gJWQsIG5lZWQgJWQiLAorICAgICAgICBBTE9HRCgiJXMoKSBtU2FtcGxlc1BlckZyYW1lID0gJSN4LCBuZWVkICUjeCIsCiAgICAgICAgICAgICAgIF9fZnVuY19fLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICAgICAgZ290byBlcnJvcjsKQEAgLTIxMSw4ICsyMTEsOCBAQAogLyoqCiAgKiBHZXQgYW4gaW1tdXRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhIHF1ZXVlIGNyZWF0ZWQgYnkgdGhpcyBzZXJ2aWNlLgogICovCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Z2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oCi0gICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKQorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmdldEF1ZGlvRGF0YURlc2NyaXB0aW9uX2woCisgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBwYXJjZWxhYmxlKQogewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGF1ZGlvRGF0YVF1ZXVlTG9jayk7CiAgICAgaWYgKG1BdWRpb0RhdGFRdWV1ZSA9PSBudWxscHRyKSB7CkBAIC0yMjEsOCArMjIxLDggQEAKICAgICB9CiAgICAgLy8gR2F0aGVyIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIHF1ZXVlLgogICAgIG1BdWRpb0RhdGFRdWV1ZS0+ZmlsbFBhcmNlbGFibGUocGFyY2VsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlKTsKLSAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRGcmFtZXNQZXJCdXJzdChnZXRGcmFtZXNQZXJCdXJzdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmNlbGFibGUtPm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZSk7CisgICAgcGFyY2VsYWJsZS0+bURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldEZyYW1lc1BlckJ1cnN0KGdldEZyYW1lc1BlckJ1cnN0KCkpOwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKQEAgLTIzMSw4ICsyMzEsOCBAQAogfQogCiAvLyBHZXQgdGltZXN0YW1wIHRoYXQgd2FzIHdyaXR0ZW4gYnkgbWl4ZXIgb3IgZGlzdHJpYnV0b3IuCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgeworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmdldEZyZWVSdW5uaW5nUG9zaXRpb25fbChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CiAgICAgLy8gVE9ETyBHZXQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwKICAgICBpZiAobUF0b21pY1N0cmVhbVRpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKICAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNTdHJlYW1UaW1lc3RhbXAucmVhZCgpOwpAQCAtMjQ1LDggKzI0NSw4IEBACiB9CiAKIC8vIEdldCB0aW1lc3RhbXAgZnJvbSBsb3dlciBsZXZlbCBzZXJ2aWNlLgotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmdldEhhcmR3YXJlVGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgeworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmdldEhhcmR3YXJlVGltZXN0YW1wX2woaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKIAogICAgIGludDY0X3QgcG9zaXRpb24gPSAwOwogICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50V2Vhay5wcm9tb3RlKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgKaW5kZXggNGZhZTViNC4uNzhmOTc4NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaApAQCAtODgsMTEgKzg4LDE0IEBACiAKIHByb3RlY3RlZDoKIAotICAgIGFhdWRpb19yZXN1bHRfdCBnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgb3ZlcnJpZGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEF1ZGlvRGF0YURlc2NyaXB0aW9uX2woCisgICAgICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogcGFyY2VsYWJsZSkgUkVRVUlSRVMobUxvY2spIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb25fbCgKKyAgICAgICAgICAgIGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIFJFUVVJUkVTKG1Mb2NrKSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBnZXRIYXJkd2FyZVRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0SGFyZHdhcmVUaW1lc3RhbXBfbCgKKyAgICAgICAgICAgIGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIFJFUVVJUkVTKG1Mb2NrKSBvdmVycmlkZTsKIAogICAgIC8qKgogICAgICAqIEBwYXJhbSByZXF1ZXN0ZWRDYXBhY2l0eUZyYW1lcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5jcHAKaW5kZXggNjg0OTZhYy4uNTQ5ZmE1OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuY3BwCkBAIC0xNiw5ICsxNiwxMCBAQAogCiAjZGVmaW5lIExPR19UQUcgIkFBdWRpb1RocmVhZCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KICNpbmNsdWRlIDx1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oPgpAQCAtMzgsNyArMzksNyBAQAogfQogCiBBQXVkaW9UaHJlYWQ6On5BQXVkaW9UaHJlYWQoKSB7Ci0gICAgQUxPR0VfSUYocHRocmVhZF9lcXVhbChwdGhyZWFkX3NlbGYoKSwgbVRocmVhZCksCisgICAgQUxPR0VfSUYobVRocmVhZC5nZXRfaWQoKSA9PSBzdGQ6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKSwKICAgICAgICAgICAgICIlcygpIGRlc3RydWN0b3IgcnVubmluZyBpbiB0aHJlYWQiLCBfX2Z1bmNfXyk7CiAgICAgQUxPR0VfSUYobUhhc1RocmVhZCwgIiVzKCkgdGhyZWFkIG5ldmVyIGpvaW5lZCIsIF9fZnVuY19fKTsKIH0KQEAgLTYwLDMyICs2MSwxNiBAQAogICAgIH0KIH0KIAotLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBuZXcgdGhyZWFkIGNyZWF0ZWQgYnkgY3JlYXRlVGhyZWFkX2woKS4KLS8vIEl0IGNvbnZlcnRzIHRoZSAnQycgZnVuY3Rpb24gY2FsbCB0byBhIEMrKyBtZXRob2QgY2FsbC4KLXN0YXRpYyB2b2lkICogQUF1ZGlvVGhyZWFkX2ludGVybmFsVGhyZWFkUHJvYyh2b2lkICphcmcpIHsKLSAgICBBQXVkaW9UaHJlYWQgKmFhdWRpb1RocmVhZCA9IChBQXVkaW9UaHJlYWQgKikgYXJnOwotICAgIGFhdWRpb1RocmVhZC0+ZGlzcGF0Y2goKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLX0KLQogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1RocmVhZDo6c3RhcnQoUnVubmFibGUgKnJ1bm5hYmxlKSB7CiAgICAgaWYgKG1IYXNUaHJlYWQpIHsKICAgICAgICAgQUxPR0UoInN0YXJ0KCkgLSBtSGFzVGhyZWFkIGFscmVhZHkgdHJ1ZSIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQotICAgIC8vIG1SdW5uYWJsZSB3aWxsIGJlIHJlYWQgYnkgdGhlIG5ldyB0aHJlYWQgd2hlbiBpdCBzdGFydHMuCi0gICAgLy8gcHRocmVhZF9jcmVhdGUoKSBmb3JjZXMgYSBtZW1vcnkgc3luY2hyb25pemF0aW9uIHNvIG1SdW5uYWJsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGF0b21pYy4KKyAgICAvLyBtUnVubmFibGUgd2lsbCBiZSByZWFkIGJ5IHRoZSBuZXcgdGhyZWFkIHdoZW4gaXQgc3RhcnRzLiBBIHN0ZDo6dGhyZWFkIGlzIGNyZWF0ZWQuCiAgICAgbVJ1bm5hYmxlID0gcnVubmFibGU7Ci0gICAgaW50IGVyciA9IHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCBudWxscHRyLCBBQXVkaW9UaHJlYWRfaW50ZXJuYWxUaHJlYWRQcm9jLCB0aGlzKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgQUxPR0UoInN0YXJ0KCkgLSBwdGhyZWFkX2NyZWF0ZSgpIHJldHVybmVkICVkICVzIiwgZXJyLCBzdHJlcnJvcihlcnIpKTsKLSAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KC1lcnIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBlcnIgPSBwdGhyZWFkX3NldG5hbWVfbnAobVRocmVhZCwgbU5hbWUpOwotICAgICAgICBBTE9HV19JRigoZXJyICE9IDApLCAiQ291bGQgbm90IHNldCBuYW1lIG9mIEFBdWRpb1RocmVhZC4gZXJyID0gJWQiLCBlcnIpOwotICAgICAgICBtSGFzVGhyZWFkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKLSAgICB9CisgICAgbUhhc1RocmVhZCA9IHRydWU7CisgICAgbVRocmVhZCA9IHN0ZDo6dGhyZWFkKCZBQXVkaW9UaHJlYWQ6OmRpc3BhdGNoLCB0aGlzKTsKKyAgICByZXR1cm4gQUFVRElPX09LOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvVGhyZWFkOjpzdG9wKCkgewpAQCAtOTMsMTggKzc4LDE4IEBACiAgICAgICAgIEFMT0dFKCJzdG9wKCkgYnV0IG5vIHRocmVhZCBydW5uaW5nIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSB0aHJlYWQgaXMgdHJ5aW5nIHRvIHN0b3AgaXRzZWxmLgotICAgIGlmIChwdGhyZWFkX2VxdWFsKHB0aHJlYWRfc2VsZigpLCBtVGhyZWFkKSkgewotICAgICAgICBBTE9HRSgiJXMoKSBhdHRlbXB0IHRvIHB0aHJlYWRfam9pbigpIGZyb20gbGF1bmNoZWQgdGhyZWFkISIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKLSAgICB9CiAKLSAgICBpbnQgZXJyID0gcHRocmVhZF9qb2luKG1UaHJlYWQsIG51bGxwdHIpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICBBTE9HRSgic3RvcCgpIC0gcHRocmVhZF9qb2luKCkgcmV0dXJuZWQgJWQgJXMiLCBlcnIsIHN0cmVycm9yKGVycikpOwotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoLWVycik7Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAobVRocmVhZC5nZXRfaWQoKSA9PSBzdGQ6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKSkgeworICAgICAgICAvLyBUaGUgdGhyZWFkIG11c3Qgbm90IGJlIGpvaW5lZCBieSBpdHNlbGYuCisgICAgICAgIEFMT0dFKCIlcygpIGF0dGVtcHQgdG8gam9pbigpIGZyb20gbGF1bmNoZWQgdGhyZWFkISIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKKyAgICB9IGVsc2UgaWYgKG1UaHJlYWQuam9pbmFibGUoKSkgeworICAgICAgICAvLyBEb3VibGUgY2hlY2sgaWYgdGhlIHRocmVhZCBpcyBqb2luYWJsZSB0byBhdm9pZCBleGNlcHRpb24gd2hlbiBjYWxsaW5nIGpvaW4uCisgICAgICAgIG1UaHJlYWQuam9pbigpOwogICAgICAgICBtSGFzVGhyZWFkID0gZmFsc2U7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgdGhlIHRocmVhZCBpcyBub3Qgam9pbmFibGUiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaAppbmRleCAwOGE4YTk4Li5iMjc3NGUwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBBQVVESU9fVEhSRUFEX0gKIAogI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8dGhyZWFkPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCkBAIC0zNyw3ICszNyw2IEBACiAKIC8qKgogICogQWJzdHJhY3Rpb24gZm9yIGEgaG9zdCBkZXBlbmRlbnQgdGhyZWFkLgotICogVE9ETyBDb25zaWRlciB1c2luZyBBbmRyb2lkICJUaHJlYWQiIGNsYXNzIG9yIHN0ZDo6dGhyZWFkIGluc3RlYWQuCiAgKi8KIGNsYXNzIEFBdWRpb1RocmVhZAogewpAQCAtNzMsNyArNzIsNyBAQAogCiAgICAgUnVubmFibGUgICAgKm1SdW5uYWJsZSA9IG51bGxwdHI7CiAgICAgYm9vbCAgICAgICAgIG1IYXNUaHJlYWQgPSBmYWxzZTsKLSAgICBwdGhyZWFkX3QgICAgbVRocmVhZCA9IHt9OworICAgIHN0ZDo6dGhyZWFkICBtVGhyZWFkOwogCiAgICAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQzMl90PiBtTmV4dFRocmVhZEluZGV4OwogICAgIGNoYXIgICAgICAgICBtTmFtZVsxNl07IC8vIG1heCBsZW5ndGggZm9yIGEgcHRocmVhZF9uYW1lCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLmJwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5icAppbmRleCA0YzU4MDQwLi44MGU0Mjk2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQuYnAKQEAgLTI3LDYgKzI3LDcgQEAKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkFBdWRpb0NsaWVudFRyYWNrZXIuY3BwIiwKKyAgICAgICAgIkFBdWRpb0NvbW1hbmRRdWV1ZS5jcHAiLAogICAgICAgICAiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcCIsCiAgICAgICAgICJBQXVkaW9NaXhlci5jcHAiLAogICAgICAgICAiQUF1ZGlvU2VydmljZS5jcHAiLApAQCAtNjgsNiArNjksOCBAQAogICAgICAgICAiYWF1ZGlvLWFpZGwtY3BwIiwKICAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCisgICAgICAgICJwYWNrYWdlbWFuYWdlcl9haWRsLWNwcCIsCisgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi50eXBlcy1WMS1jcHAiLAogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRSaW5nQnVmZmVyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZFJpbmdCdWZmZXIuY3BwCmluZGV4IGMxZDRlMTYuLmZkMmE0NTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZFJpbmdCdWZmZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZFJpbmdCdWZmZXIuY3BwCkBAIC04NSw5ICs4NSw5IEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotdm9pZCBTaGFyZWRSaW5nQnVmZmVyOjpmaWxsUGFyY2VsYWJsZShBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmZW5kcG9pbnRQYXJjZWxhYmxlLAordm9pZCBTaGFyZWRSaW5nQnVmZmVyOjpmaWxsUGFyY2VsYWJsZShBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSogZW5kcG9pbnRQYXJjZWxhYmxlLAogICAgICAgICAgICAgICAgICAgICBSaW5nQnVmZmVyUGFyY2VsYWJsZSAmcmluZ0J1ZmZlclBhcmNlbGFibGUpIHsKLSAgICBpbnQgZmRJbmRleCA9IGVuZHBvaW50UGFyY2VsYWJsZS5hZGRGaWxlRGVzY3JpcHRvcihtRmlsZURlc2NyaXB0b3IsIG1TaGFyZWRNZW1vcnlTaXplSW5CeXRlcyk7CisgICAgaW50IGZkSW5kZXggPSBlbmRwb2ludFBhcmNlbGFibGUtPmFkZEZpbGVEZXNjcmlwdG9yKG1GaWxlRGVzY3JpcHRvciwgbVNoYXJlZE1lbW9yeVNpemVJbkJ5dGVzKTsKICAgICByaW5nQnVmZmVyUGFyY2VsYWJsZS5zZXR1cE1lbW9yeShmZEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIQVJFRF9SSU5HQlVGRkVSX0RBVEFfT0ZGU0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhTWVtb3J5U2l6ZUluQnl0ZXMsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRSaW5nQnVmZmVyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRSaW5nQnVmZmVyLmgKaW5kZXggYzNhOWJiNy4uY2ZmMTI2MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZFJpbmdCdWZmZXIuaApAQCAtNDUsNyArNDUsNyBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGFsbG9jYXRlKGFuZHJvaWQ6OmZpZm9fZnJhbWVzX3QgYnl0ZXNQZXJGcmFtZSwgYW5kcm9pZDo6Zmlmb19mcmFtZXNfdCBjYXBhY2l0eUluRnJhbWVzKTsKIAotICAgIHZvaWQgZmlsbFBhcmNlbGFibGUoQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJmVuZHBvaW50UGFyY2VsYWJsZSwKKyAgICB2b2lkIGZpbGxQYXJjZWxhYmxlKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKiBlbmRwb2ludFBhcmNlbGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBSaW5nQnVmZmVyUGFyY2VsYWJsZSAmcmluZ0J1ZmZlclBhcmNlbGFibGUpOwogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9mdXp6ZXIvUkVBRE1FLm1kIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvZnV6emVyL1JFQURNRS5tZAppbmRleCAwMGI4NWRmLi5hZTdhZjNlYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvZnV6emVyL1JFQURNRS5tZAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0xNSw3ICsxNSw3IEBACiA0LiBJblNlcnZpY2UKIDUuIERldmljZUlkCiA2LiBTYW1wbGVSYXRlCi03LiBTYW1wbGVzUGVyRnJhbWUKKzcuIENoYW5uZWxNYXNrCiA4LiBEaXJlY3Rpb24KIDkuIFNoYXJpbmdNb2RlCiAxMC4gVXNhZ2UKQEAgLTMxLDcgKzMxLDcgQEAKIHwgYEluU2VydmljZWAgICB8IGBib29sYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKIHwgYERldmljZUlkYCAgIHwgYElOVDMyX01JTmAgdG8gYElOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8CiB8IGBTYW1wbGVSYXRlYCAgIHwgYElOVDMyX01JTmAgdG8gYElOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Ci18IGBTYW1wbGVzUGVyRnJhbWVgIHwgYElOVDMyX01JTmAgdG8gYElOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBDaGFubmVsTWFza2AgfCBgQUFVRElPX1VOU1BFQ0lGSUVEYCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMWAsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzJgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18zYCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNGAsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzVgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS182YCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfN2AsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzhgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS185YCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTBgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMWAsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEyYCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTNgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNGAsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE1YCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTZgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xN2AsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE4YCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTlgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMGAsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIxYCwgYEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjJgLCBgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yM2AsIGBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzI0YCwgYEFBVURJT19DSEFOTkVMX01PTk9gLCBgQUFVRElPX0NIQU5ORUxfU1RFUkVPYCwgYEFBVURJT19DSEFOTkVMX0ZST05UX0JBQ0tgLCBgQUFVRElPX0NIQU5ORUxfMlBPSU5UMFBPSU5UMmAsIGBBQVVESU9fQ0hBTk5FTF8yUE9JTlQxUE9JTlQyYCwgYEFBVURJT19DSEFOTkVMXzNQT0lOVDBQT0lOVDJgLCBgQUFVRElPX0NIQU5ORUxfM1BPSU5UMVBPSU5UMmAsIGBBQVVESU9fQ0hBTk5FTF81UE9JTlQxYCwgYEFBVURJT19DSEFOTkVMX01PTk9gLCBgQUFVRElPX0NIQU5ORUxfU1RFUkVPYCwgYEFBVURJT19DSEFOTkVMXzJQT0lOVDFgLCBgQUFVRElPX0NIQU5ORUxfVFJJYCwgYEFBVURJT19DSEFOTkVMX1RSSV9CQUNLYCwgYEFBVURJT19DSEFOTkVMXzNQT0lOVDFgLCBgQUFVRElPX0NIQU5ORUxfMlBPSU5UMFBPSU5UMmAsIGBBQVVESU9fQ0hBTk5FTF8yUE9JTlQxUE9JTlQyYCwgYEFBVURJT19DSEFOTkVMXzNQT0lOVDBQT0lOVDJgLCBgQUFVRElPX0NIQU5ORUxfM1BPSU5UMVBPSU5UMmAsIGBBQVVESU9fQ0hBTk5FTF9RVUFEYCwgYEFBVURJT19DSEFOTkVMX1FVQURfU0lERWAsIGBBQVVESU9fQ0hBTk5FTF9TVVJST1VORGAsIGBBQVVESU9fQ0hBTk5FTF9QRU5UQWAsIGBBQVVESU9fQ0hBTk5FTF81UE9JTlQxYCwgYEFBVURJT19DSEFOTkVMXzVQT0lOVDFfU0lERWAsIGBBQVVESU9fQ0hBTk5FTF81UE9JTlQxUE9JTlQyYCwgYEFBVURJT19DSEFOTkVMXzVQT0lOVDFQT0lOVDRgLCBgQUFVRElPX0NIQU5ORUxfNlBPSU5UMWAsIGBBQVVESU9fQ0hBTk5FTF83UE9JTlQxYCwgYEFBVURJT19DSEFOTkVMXzdQT0lOVDFQT0lOVDJgLCBgQUFVRElPX0NIQU5ORUxfN1BPSU5UMVBPSU5UNGAsIGBBQVVESU9fQ0hBTk5FTF85UE9JTlQxUE9JTlQ0YCwgYEFBVURJT19DSEFOTkVMXzlQT0lOVDFQT0lOVDZgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAogfCBgRGlyZWN0aW9uYCB8IGBBQVVESU9fRElSRUNUSU9OX09VVFBVVGAsIGBBQVVESU9fRElSRUNUSU9OX0lOUFVUYCB8IFZhbHVlIGNob3NlbiBmcm9tIHZhbGlkIHZhbHVlcyBieSBvYnRhaW5pbmcgaW5kZXggZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAogfCBgU2hhcmluZ01vZGVgIHwgYEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFYCwgYEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEYCB8IFZhbHVlIGNob3NlbiBmcm9tIHZhbGlkIHZhbHVlcyBieSBvYnRhaW5pbmcgaW5kZXggZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAogfCBgVXNhZ2VgIHwgYEFBVURJT19VU0FHRV9NRURJQWAsIGBBQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTmAsIGBBQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HYCwgYEFBVURJT19VU0FHRV9BTEFSTWAsIGBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OYCwgYEFBVURJT19VU0FHRV9OT1RJRklDQVRJT05fUklOR1RPTkVgLCBgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVGAsIGBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZYCwgYEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0VgLCBgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OYCwgYEFBVURJT19VU0FHRV9HQU1FYCwgYEFBVURJT19VU0FHRV9BU1NJU1RBTlRgLCBgQUFVRElPX1NZU1RFTV9VU0FHRV9FTUVSR0VOQ1lgLCBgQUFVRElPX1NZU1RFTV9VU0FHRV9TQUZFVFlgLCBgQUFVRElPX1NZU1RFTV9VU0FHRV9WRUhJQ0xFX1NUQVRVU2AsIGBBQVVESU9fU1lTVEVNX1VTQUdFX0FOTk9VTkNFTUVOVGAgfCBWYWx1ZSBjaG9zZW4gZnJvbSB2YWxpZCB2YWx1ZXMgYnkgb2J0YWluaW5nIGluZGV4IGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL2Z1enplci9vYm9lc2VydmljZV9mdXp6ZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvZnV6emVyL29ib2VzZXJ2aWNlX2Z1enplci5jcHAKaW5kZXggNGJjNjYxYy4uNWU0ODk1NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvZnV6emVyL29ib2VzZXJ2aWNlX2Z1enplci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvZnV6emVyL29ib2VzZXJ2aWNlX2Z1enplci5jcHAKQEAgLTY4LDEwICs2OCw3MSBAQAogICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVU5QUk9DRVNTRUQsICAgICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUEVSRk9STUFOQ0UsCiB9OwogCithYXVkaW9fY2hhbm5lbF9tYXNrX3Qga0FBdWRpb0NoYW5uZWxNYXNrc1tdID0geworICAgIEFBVURJT19VTlNQRUNJRklFRCwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMywKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzQsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS181LAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNiwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzcsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS184LAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEwLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTEsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMiwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEzLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTQsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE2LAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTcsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xOCwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE5LAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjAsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIyLAorICAgIEFBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjMsCisgICAgQUFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yNCwKKyAgICBBQVVESU9fQ0hBTk5FTF9NT05PLAorICAgIEFBVURJT19DSEFOTkVMX1NURVJFTywKKyAgICBBQVVESU9fQ0hBTk5FTF9GUk9OVF9CQUNLLAorICAgIEFBVURJT19DSEFOTkVMXzJQT0lOVDBQT0lOVDIsCisgICAgQUFVRElPX0NIQU5ORUxfMlBPSU5UMVBPSU5UMiwKKyAgICBBQVVESU9fQ0hBTk5FTF8zUE9JTlQwUE9JTlQyLAorICAgIEFBVURJT19DSEFOTkVMXzNQT0lOVDFQT0lOVDIsCisgICAgQUFVRElPX0NIQU5ORUxfNVBPSU5UMSwKKyAgICBBQVVESU9fQ0hBTk5FTF9NT05PLAorICAgIEFBVURJT19DSEFOTkVMX1NURVJFTywKKyAgICBBQVVESU9fQ0hBTk5FTF8yUE9JTlQxLAorICAgIEFBVURJT19DSEFOTkVMX1RSSSwKKyAgICBBQVVESU9fQ0hBTk5FTF9UUklfQkFDSywKKyAgICBBQVVESU9fQ0hBTk5FTF8zUE9JTlQxLAorICAgIEFBVURJT19DSEFOTkVMXzJQT0lOVDBQT0lOVDIsCisgICAgQUFVRElPX0NIQU5ORUxfMlBPSU5UMVBPSU5UMiwKKyAgICBBQVVESU9fQ0hBTk5FTF8zUE9JTlQwUE9JTlQyLAorICAgIEFBVURJT19DSEFOTkVMXzNQT0lOVDFQT0lOVDIsCisgICAgQUFVRElPX0NIQU5ORUxfUVVBRCwKKyAgICBBQVVESU9fQ0hBTk5FTF9RVUFEX1NJREUsCisgICAgQUFVRElPX0NIQU5ORUxfU1VSUk9VTkQsCisgICAgQUFVRElPX0NIQU5ORUxfUEVOVEEsCisgICAgQUFVRElPX0NIQU5ORUxfNVBPSU5UMSwKKyAgICBBQVVESU9fQ0hBTk5FTF81UE9JTlQxX1NJREUsCisgICAgQUFVRElPX0NIQU5ORUxfNVBPSU5UMVBPSU5UMiwKKyAgICBBQVVESU9fQ0hBTk5FTF81UE9JTlQxUE9JTlQ0LAorICAgIEFBVURJT19DSEFOTkVMXzZQT0lOVDEsCisgICAgQUFVRElPX0NIQU5ORUxfN1BPSU5UMSwKKyAgICBBQVVESU9fQ0hBTk5FTF83UE9JTlQxUE9JTlQyLAorICAgIEFBVURJT19DSEFOTkVMXzdQT0lOVDFQT0lOVDQsCisgICAgQUFVRElPX0NIQU5ORUxfOVBPSU5UMVBPSU5UNCwKKyAgICBBQVVESU9fQ0hBTk5FTF85UE9JTlQxUE9JTlQ2LAorfTsKKwogY29uc3Qgc2l6ZV90IGtOdW1BQXVkaW9Gb3JtYXRzID0gc3RkOjpzaXplKGtBQXVkaW9Gb3JtYXRzKTsKIGNvbnN0IHNpemVfdCBrTnVtQUF1ZGlvVXNhZ2VzID0gc3RkOjpzaXplKGtBQXVkaW9Vc2FnZXMpOwogY29uc3Qgc2l6ZV90IGtOdW1BQXVkaW9Db250ZW50VHlwZXMgPSBzdGQ6OnNpemUoa0FBdWRpb0NvbnRlbnRUeXBlcyk7CiBjb25zdCBzaXplX3Qga051bUFBdWRpb0lucHV0UHJlc2V0cyA9IHN0ZDo6c2l6ZShrQUF1ZGlvSW5wdXRQcmVzZXRzKTsKK2NvbnN0IHNpemVfdCBrTnVtQUF1ZGlvQ2hhbm5lbE1hc2tzID0gc3RkOjpzaXplKGtBQXVkaW9DaGFubmVsTWFza3MpOwogCiBjbGFzcyBGdXp6QUF1ZGlvQ2xpZW50IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSwgcHVibGljIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgewogICAgcHVibGljOgpAQCAtMTE5LDYgKzE4MCwxMSBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgIH0KIAorICAgIGFhdWRpb19yZXN1bHRfdCBleGl0U3RhbmRieShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlIFVOVVNFRF9QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUgVU5VU0VEX1BBUkFNKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfQorCiAgICAgdm9pZCBvblN0cmVhbUNoYW5nZShhYXVkaW9faGFuZGxlX3QgaGFuZGxlLCBpbnQzMl90IG9wY29kZSwgaW50MzJfdCB2YWx1ZSkge30KIAogICAgIGludCBnZXREZWF0aENvdW50KCkgeyByZXR1cm4gbURlYXRoQ291bnQ7IH0KQEAgLTMwNSw3ICszNzEsMTEgQEAKIAogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldERldmljZUlkKGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CiAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2FtcGxlUmF0ZShmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOwotICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNhbXBsZXNQZXJGcmFtZShmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldENoYW5uZWxNYXNrKChhYXVkaW9fY2hhbm5lbF9tYXNrX3QpKAorICAgICAgICBmZHAuQ29uc3VtZUJvb2woKQorICAgICAgICAgICAgPyBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkKKyAgICAgICAgICAgIDoga0FBdWRpb0NoYW5uZWxNYXNrc1tmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PigKKyAgICAgICAgICAgICAgICAgICAgMCwga051bUFBdWRpb0NoYW5uZWxNYXNrcyAtIDEpXSkpOwogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldERpcmVjdGlvbigKICAgICAgICAgZmRwLkNvbnN1bWVCb29sKCkgPyBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZmRwLkNvbnN1bWVCb29sKCkgPyBBQVVESU9fRElSRUNUSU9OX09VVFBVVCA6IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyLy5jbGFuZy1mb3JtYXQgYi9zZXJ2aWNlcy90dW5lci8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNGNjODgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsMzMgQEAKKy0tLQorQmFzZWRPblN0eWxlOiBHb29nbGUKK0FsbG93U2hvcnRGdW5jdGlvbnNPbkFTaW5nbGVMaW5lOiBJbmxpbmUKK0FsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lOiB0cnVlCitBbGxvd1Nob3J0TG9vcHNPbkFTaW5nbGVMaW5lOiB0cnVlCitCaW5QYWNrQXJndW1lbnRzOiB0cnVlCitCaW5QYWNrUGFyYW1ldGVyczogdHJ1ZQorQ29tbWVudFByYWdtYXM6IE5PTElOVDouKgorQ29udGludWF0aW9uSW5kZW50V2lkdGg6IDgKK0Rlcml2ZVBvaW50ZXJBbGlnbm1lbnQ6IGZhbHNlCitJbmRlbnRXaWR0aDogNAorUG9pbnRlckFsaWdubWVudDogTGVmdAorVGFiV2lkdGg6IDQKKworIyBEZXZpYXRpb25zIGZyb20gdGhlIGFib3ZlIGZpbGU6CisjICJEb24ndCBpbmRlbnQgdGhlIHNlY3Rpb24gbGFiZWwiCitBY2Nlc3NNb2RpZmllck9mZnNldDogLTQKKyMgIkVhY2ggbGluZSBvZiB0ZXh0IGluIHlvdXIgY29kZSBzaG91bGQgYmUgYXQgbW9zdCAxMDAgY29sdW1ucyBsb25nLiIKK0NvbHVtbkxpbWl0OiAxMDAKKyMgIkNvbnN0cnVjdG9yIGluaXRpYWxpemVyIGxpc3RzIGNhbiBiZSBhbGwgb24gb25lIGxpbmUgb3Igd2l0aCBzdWJzZXF1ZW50CisjIGxpbmVzIGluZGVudGVkIGVpZ2h0IHNwYWNlcy4iLiBjbGFuZy1mb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCBoYXZpbmcgdGhlIGNvbG9uCisjIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIG5hbWUsIHNvIHRoaXMgaXMgdGhlIGJlc3QKKyMgYXBwcm94aW1hdGlvbiBvZiB0aGF0IHJ1bGUsIHdoaWNoIG1ha2VzIGFsbCBlbnRyaWVzIGluIHRoZSBsaXN0IChleGNlcHQgdGhlCisjIGZpcnN0IG9uZSkgaGF2ZSBhbiBlaWdodCBzcGFjZSBpbmRlbnRhdGlvbi4KK0NvbnN0cnVjdG9ySW5pdGlhbGl6ZXJJbmRlbnRXaWR0aDogNgorIyBUaGVyZSBpcyBub3RoaW5nIGluIGdvL2Ryb2lkY3Bwc3R5bGUgYWJvdXQgY2FzZSBsYWJlbHMsIGJ1dCB0aGVyZSBzZWVtcyB0byBiZQorIyBtb3JlIGNvZGUgdGhhdCBkb2VzIG5vdCBpbmRlbnQgdGhlIGNhc2UgbGFiZWxzIGluIGZyYW1ld29ya3MvYmFzZS4KK0luZGVudENhc2VMYWJlbHM6IGZhbHNlCisjIFRoZXJlIGhhdmUgYmVlbiBzb21lIGJ1Z3MgaW4gd2hpY2ggc3Vic2VxdWVudCBmb3JtYXR0aW5nIG9wZXJhdGlvbnMgaW50cm9kdWNlCisjIHdlaXJkIGNvbW1lbnQganVtcHMuCitSZWZsb3dDb21tZW50czogZmFsc2UKKyMgQW5kcm9pZCBkb2VzIHN1cHBvcnQgQysrMTEgbm93LgorU3RhbmRhcmQ6IENwcDExClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL3R1bmVyL0FuZHJvaWQuYnAKaW5kZXggY2QxMWM4OC4uNWMxZGRhMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy90dW5lci9BbmRyb2lkLmJwCkBAIC03LDMzICs3LDE1IEBACiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAogfQogCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJ0dl90dW5lcl9haWRsIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvKi5haWRsIiwKLSAgICBdLAotICAgIHBhdGg6ICJhaWRsIiwKLX0KLQotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAidHZfdHVuZXJfZnJvbnRlbmRfaW5mbyIsCi0gICAgc3JjczogWwotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJbmZvLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmQqQ2FwYWJpbGl0aWVzLmFpZGwiLAotICAgIF0sCi0gICAgcGF0aDogImFpZGwiLAotfQotCiBhaWRsX2ludGVyZmFjZSB7CiAgICAgbmFtZTogInR2X3R1bmVyX2FpZGxfaW50ZXJmYWNlIiwKICAgICB1bnN0YWJsZTogdHJ1ZSwKICAgICBsb2NhbF9pbmNsdWRlX2RpcjogImFpZGwiLAotICAgIHNyY3M6IFsKLSAgICAgICAgIjp0dl90dW5lcl9haWRsIiwKLSAgICBdLAorICAgIHNyY3M6IFsiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyLyouYWlkbCJdLAogICAgIGltcG9ydHM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLVYyIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLmZtcS1WMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLVYxIiwKICAgICBdLAogCiAgICAgYmFja2VuZDogewpAQCAtNDksMzcgKzMxLDE4IEBACiAgICAgfSwKIH0KIAotYWlkbF9pbnRlcmZhY2UgewotICAgIG5hbWU6ICJ0dl90dW5lcl9mcm9udGVuZF9pbmZvX2FpZGxfaW50ZXJmYWNlIiwKLSAgICB1bnN0YWJsZTogdHJ1ZSwKLSAgICBsb2NhbF9pbmNsdWRlX2RpcjogImFpZGwiLAotICAgIHNyY3M6IFsKLSAgICAgICAgIjp0dl90dW5lcl9mcm9udGVuZF9pbmZvIiwKLSAgICBdLAotCi0gICAgYmFja2VuZDogewotICAgICAgICBqYXZhOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgICAgICB9LAotICAgICAgICBjcHA6IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgICAgIH0sCi0gICAgICAgIG5kazogewotICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICAgICAgfSwKLSAgICB9LAotfQotCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlidHVuZXJzZXJ2aWNlIiwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIlR1bmVyKi5jcHAiLAorICAgICAgICAiaGlkbC9UdW5lciouY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXJAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXJAMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXItVjEtbmRrIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmJpbmRlcl9uZGsiLApAQCAtODksMTMgKzUyLDEzIEBACiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAidHZfdHVuZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKLSAgICAgICAgInR2X3R1bmVyX3Jlc291cmNlX21hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKLSAgICAgICAgInR2X3R1bmVyX3Jlc291cmNlX21hbmFnZXJfYWlkbF9pbnRlcmZhY2UtY3BwIiwKKyAgICAgICAgInBhY2thZ2VtYW5hZ2VyX2FpZGwtY3BwIiwKKyAgICAgICAgInR2X3R1bmVyX2FpZGxfaW50ZXJmYWNlLW5kayIsCisgICAgICAgICJ0dl90dW5lcl9yZXNvdXJjZV9tYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEtVjEtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLmZtcS1WMS1uZGsiLAogICAgICAgICAibGliYWlkbGNvbW1vbnN1cHBvcnQiLAogICAgIF0sCiAKQEAgLTEyMiwxOCArODUsMTUgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS50di50dW5lckAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS50di50dW5lckAxLjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci1WMS1uZGsiLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliZm1xIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ0dW5lcnNlcnZpY2UiLAogICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAidHZfdHVuZXJfcmVzb3VyY2VfbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAotICAgICAgICAidHZfdHVuZXJfcmVzb3VyY2VfbWFuYWdlcl9haWRsX2ludGVyZmFjZS1jcHAiLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAidHZfdHVuZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgInR2X3R1bmVyX2FpZGxfaW50ZXJmYWNlLW5kayIsCisgICAgICAgICJ0dl90dW5lcl9yZXNvdXJjZV9tYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5kayIsCiAgICAgXSwKIAogICAgIGluaXRfcmM6IFsibWVkaWF0dW5lci5yYyJdLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvT1dORVJTIGIvc2VydmljZXMvdHVuZXIvT1dORVJTCmluZGV4IDBjZWI4ZTguLmJmOWZlMzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL09XTkVSUworKysgYi9zZXJ2aWNlcy90dW5lci9PV05FUlMKQEAgLTEsMiArMSwyIEBACi1uY2hhbGtvQGdvb2dsZS5jb20KK2hnY2hlbkBnb29nbGUuY29tCiBxdXhpYW5nZmFuZ0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lckRlbXV4LmNwcCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVtdXguY3BwCmluZGV4IDExMjIzNjguLmE2ZjNhMmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVtdXguY3BwCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVtdXguY3BwCkBAIC0xNiwyMyArMTYsMzIgQEAKIAogI2RlZmluZSBMT0dfVEFHICJUdW5lckRlbXV4IgogCi0jaW5jbHVkZSAiVHVuZXJEdnIuaCIKICNpbmNsdWRlICJUdW5lckRlbXV4LmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSUR2ci5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRHZyQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSUZpbHRlci5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRmlsdGVyQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSVRpbWVGaWx0ZXIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVzdWx0Lmg+CisKKyNpbmNsdWRlICJUdW5lckR2ci5oIgogI2luY2x1ZGUgIlR1bmVyVGltZUZpbHRlci5oIgogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4QWxwRmlsdGVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJNYWluVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eElwRmlsdGVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhNbXRwRmlsdGVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhUbHZGaWx0ZXJUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RHZyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRHZyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRHZyQ2FsbGJhY2s7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OklGaWx0ZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OklGaWx0ZXJDYWxsYmFjazsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SVRpbWVGaWx0ZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlc3VsdDsKIAorbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgewogCi1UdW5lckRlbXV4OjpUdW5lckRlbXV4KHNwPElEZW11eD4gZGVtdXgsIGludCBpZCkgeworVHVuZXJEZW11eDo6VHVuZXJEZW11eChzaGFyZWRfcHRyPElEZW11eD4gZGVtdXgsIGludCBpZCkgewogICAgIG1EZW11eCA9IGRlbXV4OwogICAgIG1EZW11eElkID0gaWQ7CiB9CkBAIC00MSwxOTIgKzUwLDE0MyBAQAogICAgIG1EZW11eCA9IG51bGxwdHI7CiB9CiAKLVN0YXR1cyBUdW5lckRlbXV4OjpzZXRGcm9udGVuZERhdGFTb3VyY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kPiYgZnJvbnRlbmQpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRGVtdXg6OnNldEZyb250ZW5kRGF0YVNvdXJjZSgKKyAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZD4mIGluX2Zyb250ZW5kKSB7CiAgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKICAgICBpbnQgZnJvbnRlbmRJZDsKLSAgICBmcm9udGVuZC0+Z2V0RnJvbnRlbmRJZCgmZnJvbnRlbmRJZCk7Ci0gICAgUmVzdWx0IHJlcyA9IG1EZW11eC0+c2V0RnJvbnRlbmREYXRhU291cmNlKGZyb250ZW5kSWQpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIGluX2Zyb250ZW5kLT5nZXRGcm9udGVuZElkKCZmcm9udGVuZElkKTsKKworICAgIHJldHVybiBtRGVtdXgtPnNldEZyb250ZW5kRGF0YVNvdXJjZShmcm9udGVuZElkKTsKIH0KIAotU3RhdHVzIFR1bmVyRGVtdXg6Om9wZW5GaWx0ZXIoCi0gICAgICAgIGludCB0eXBlLCBpbnQgc3ViVHlwZSwgaW50IGJ1ZmZlclNpemUsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGNiLAotICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiogX2FpZGxfcmV0dXJuKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlbXV4OjpzZXRGcm9udGVuZERhdGFTb3VyY2VCeUlkKGludCBmcm9udGVuZElkKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbURlbXV4LT5zZXRGcm9udGVuZERhdGFTb3VyY2UoZnJvbnRlbmRJZCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRGVtdXg6Om9wZW5GaWx0ZXIoY29uc3QgRGVtdXhGaWx0ZXJUeXBlJiBpbl90eXBlLCBpbnQzMl90IGluX2J1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIHNoYXJlZF9wdHI8SUZpbHRlcj4gZmlsdGVyOworICAgIHNoYXJlZF9wdHI8VHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrPiBmaWx0ZXJDYiA9CisgICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s+KGluX2NiKTsKKyAgICBzaGFyZWRfcHRyPElGaWx0ZXJDYWxsYmFjaz4gY2IgPSBmaWx0ZXJDYjsKKyAgICBhdXRvIHN0YXR1cyA9IG1EZW11eC0+b3BlbkZpbHRlcihpbl90eXBlLCBpbl9idWZmZXJTaXplLCBjYiwgJmZpbHRlcik7CisgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyRmlsdGVyPihmaWx0ZXIsIGZpbHRlckNiLCBpbl90eXBlKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlbXV4OjpvcGVuVGltZUZpbHRlcihzaGFyZWRfcHRyPElUdW5lclRpbWVGaWx0ZXI+KiBfYWlkbF9yZXR1cm4pIHsKICAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBEZW11eEZpbHRlck1haW5UeXBlIG1haW5UeXBlID0gc3RhdGljX2Nhc3Q8RGVtdXhGaWx0ZXJNYWluVHlwZT4odHlwZSk7Ci0gICAgRGVtdXhGaWx0ZXJUeXBlIGZpbHRlclR5cGUgewotICAgICAgICAubWFpblR5cGUgPSBtYWluVHlwZSwKLSAgICB9OwotCi0gICAgc3dpdGNoKG1haW5UeXBlKSB7Ci0gICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJNYWluVHlwZTo6VFM6Ci0gICAgICAgICAgICBmaWx0ZXJUeXBlLnN1YlR5cGUudHNGaWx0ZXJUeXBlKHN0YXRpY19jYXN0PERlbXV4VHNGaWx0ZXJUeXBlPihzdWJUeXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEZW11eEZpbHRlck1haW5UeXBlOjpNTVRQOgotICAgICAgICAgICAgZmlsdGVyVHlwZS5zdWJUeXBlLm1tdHBGaWx0ZXJUeXBlKHN0YXRpY19jYXN0PERlbXV4TW10cEZpbHRlclR5cGU+KHN1YlR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERlbXV4RmlsdGVyTWFpblR5cGU6OklQOgotICAgICAgICAgICAgZmlsdGVyVHlwZS5zdWJUeXBlLmlwRmlsdGVyVHlwZShzdGF0aWNfY2FzdDxEZW11eElwRmlsdGVyVHlwZT4oc3ViVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJNYWluVHlwZTo6VExWOgotICAgICAgICAgICAgZmlsdGVyVHlwZS5zdWJUeXBlLnRsdkZpbHRlclR5cGUoc3RhdGljX2Nhc3Q8RGVtdXhUbHZGaWx0ZXJUeXBlPihzdWJUeXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEZW11eEZpbHRlck1haW5UeXBlOjpBTFA6Ci0gICAgICAgICAgICBmaWx0ZXJUeXBlLnN1YlR5cGUuYWxwRmlsdGVyVHlwZShzdGF0aWNfY2FzdDxEZW11eEFscEZpbHRlclR5cGU+KHN1YlR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBSZXN1bHQgc3RhdHVzOwotICAgIHNwPElGaWx0ZXI+IGZpbHRlclNwOwotICAgIHNwPElGaWx0ZXJDYWxsYmFjaz4gY2JTcCA9IG5ldyBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2soY2IpOwotICAgIG1EZW11eC0+b3BlbkZpbHRlcihmaWx0ZXJUeXBlLCBidWZmZXJTaXplLCBjYlNwLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRmlsdGVyPiYgZmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgZmlsdGVyU3AgPSBmaWx0ZXI7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gcjsKLSAgICAgICAgICAgIH0pOwotICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICBzaGFyZWRfcHRyPElUaW1lRmlsdGVyPiBmaWx0ZXI7CisgICAgYXV0byBzdGF0dXMgPSBtRGVtdXgtPm9wZW5UaW1lRmlsdGVyKCZmaWx0ZXIpOworICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lclRpbWVGaWx0ZXI+KGZpbHRlcik7CiAgICAgfQogCi0gICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyRmlsdGVyPihmaWx0ZXJTcCwgdHlwZSwgc3ViVHlwZSk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1TdGF0dXMgVHVuZXJEZW11eDo6b3BlblRpbWVGaWx0ZXIoc2hhcmVkX3B0cjxJVHVuZXJUaW1lRmlsdGVyPiogX2FpZGxfcmV0dXJuKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlbXV4OjpnZXRBdlN5bmNId0lkKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgdHVuZXJGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgewogICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZC4iKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgc3A8SVRpbWVGaWx0ZXI+IGZpbHRlclNwOwotICAgIG1EZW11eC0+b3BlblRpbWVGaWx0ZXIoWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJVGltZUZpbHRlcj4mIGZpbHRlcikgewotICAgICAgICBmaWx0ZXJTcCA9IGZpbHRlcjsKLSAgICAgICAgc3RhdHVzID0gcjsKLSAgICB9KTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgfQotCi0gICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyVGltZUZpbHRlcj4oZmlsdGVyU3ApOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgc2hhcmVkX3B0cjxJRmlsdGVyPiBoYWxGaWx0ZXIgPSAoc3RhdGljX2Nhc3Q8VHVuZXJGaWx0ZXIqPih0dW5lckZpbHRlci5nZXQoKSkpLT5nZXRIYWxGaWx0ZXIoKTsKKyAgICByZXR1cm4gbURlbXV4LT5nZXRBdlN5bmNId0lkKGhhbEZpbHRlciwgX2FpZGxfcmV0dXJuKTsKIH0KIAotU3RhdHVzIFR1bmVyRGVtdXg6OmdldEF2U3luY0h3SWQoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiB0dW5lckZpbHRlciwgaW50KiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRGVtdXg6OmdldEF2U3luY1RpbWUoaW50MzJfdCBhdlN5bmNId0lkLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKICAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICB1aW50MzJfdCBhdlN5bmNId0lkOwotICAgIFJlc3VsdCByZXM7Ci0gICAgc3A8SUZpbHRlcj4gaGFsRmlsdGVyID0gc3RhdGljX2Nhc3Q8VHVuZXJGaWx0ZXIqPih0dW5lckZpbHRlci5nZXQoKSktPmdldEhhbEZpbHRlcigpOwotICAgIG1EZW11eC0+Z2V0QXZTeW5jSHdJZChoYWxGaWx0ZXIsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQzMl90IGlkKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gcjsKLSAgICAgICAgICAgICAgICBhdlN5bmNId0lkID0gaWQ7Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotCi0gICAgKl9haWRsX3JldHVybiA9IChpbnQpYXZTeW5jSHdJZDsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtRGVtdXgtPmdldEF2U3luY1RpbWUoYXZTeW5jSHdJZCwgX2FpZGxfcmV0dXJuKTsKIH0KIAotU3RhdHVzIFR1bmVyRGVtdXg6OmdldEF2U3luY1RpbWUoaW50IGF2U3luY0h3SWQsIGludDY0X3QqIF9haWRsX3JldHVybikgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEZW11eDo6b3BlbkR2cihEdnJUeXBlIGluX2R2YlR5cGUsIGludDMyX3QgaW5fYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJEdnJDYWxsYmFjaz4mIGluX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckR2cj4qIF9haWRsX3JldHVybikgewogICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZC4iKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIHVpbnQ2NF90IHRpbWU7Ci0gICAgUmVzdWx0IHJlczsKLSAgICBtRGVtdXgtPmdldEF2U3luY1RpbWUoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGF2U3luY0h3SWQpLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCB0cykgewotICAgICAgICAgICAgICAgIHJlcyA9IHI7Ci0gICAgICAgICAgICAgICAgdGltZSA9IHRzOwotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIHNoYXJlZF9wdHI8SUR2ckNhbGxiYWNrPiBjYWxsYmFjayA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyRHZyOjpEdnJDYWxsYmFjaz4oaW5fY2IpOworICAgIHNoYXJlZF9wdHI8SUR2cj4gaGFsRHZyOworICAgIGF1dG8gcmVzID0gbURlbXV4LT5vcGVuRHZyKGluX2R2YlR5cGUsIGluX2J1ZmZlclNpemUsIGNhbGxiYWNrLCAmaGFsRHZyKTsKKyAgICBpZiAocmVzLmlzT2soKSkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJEdnI+KGhhbER2ciwgaW5fZHZiVHlwZSk7CiAgICAgfQogCi0gICAgKl9haWRsX3JldHVybiA9IChpbnQ2NF90KXRpbWU7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gcmVzOwogfQogCi1TdGF0dXMgVHVuZXJEZW11eDo6b3BlbkR2cihpbnQgZHZyVHlwZSwgaW50IGJ1ZmZlclNpemUsIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+JiBjYiwKLSAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEdnI+KiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRGVtdXg6OmNvbm5lY3RDaUNhbShpbnQzMl90IGNpQ2FtSWQpIHsKICAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzOwotICAgIHNwPElEdnJDYWxsYmFjaz4gY2FsbGJhY2sgPSBuZXcgVHVuZXJEdnI6OkR2ckNhbGxiYWNrKGNiKTsKLSAgICBzcDxJRHZyPiBoaWRsRHZyOwotICAgIG1EZW11eC0+b3BlbkR2cihzdGF0aWNfY2FzdDxEdnJUeXBlPihkdnJUeXBlKSwgYnVmZmVyU2l6ZSwgY2FsbGJhY2ssCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElEdnI+JiBkdnIpIHsKLSAgICAgICAgICAgICAgICBoaWRsRHZyID0gZHZyOwotICAgICAgICAgICAgICAgIHJlcyA9IHI7Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICAqX2FpZGxfcmV0dXJuID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLQotICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckR2cj4oaGlkbER2ciwgZHZyVHlwZSk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbURlbXV4LT5jb25uZWN0Q2lDYW0oY2lDYW1JZCk7CiB9CiAKLVN0YXR1cyBUdW5lckRlbXV4Ojpjb25uZWN0Q2lDYW0oaW50IGNpQ2FtSWQpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRGVtdXg6OmRpc2Nvbm5lY3RDaUNhbSgpIHsKICAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzID0gbURlbXV4LT5jb25uZWN0Q2lDYW0oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNpQ2FtSWQpKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1EZW11eC0+ZGlzY29ubmVjdENpQ2FtKCk7CiB9CiAKLVN0YXR1cyBUdW5lckRlbXV4OjpkaXNjb25uZWN0Q2lDYW0oKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckRlbXV4OjpjbG9zZSgpIHsKICAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzID0gbURlbXV4LT5kaXNjb25uZWN0Q2lDYW0oKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgYXV0byByZXMgPSBtRGVtdXgtPmNsb3NlKCk7CisgICAgbURlbXV4ID0gbnVsbHB0cjsKKworICAgIHJldHVybiByZXM7CiB9CiAKLVN0YXR1cyBUdW5lckRlbXV4OjpjbG9zZSgpIHsKLSAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Ci0gICAgfQotCi0gICAgUmVzdWx0IHJlcyA9IG1EZW11eC0+Y2xvc2UoKTsKLSAgICBtRGVtdXggPSBOVUxMOwotCi0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQorfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lckRlbXV4LmggYi9zZXJ2aWNlcy90dW5lci9UdW5lckRlbXV4LmgKaW5kZXggMmE5ODM2Yi4uY2RiM2FhMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvVHVuZXJEZW11eC5oCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVtdXguaApAQCAtMTcsNTIgKzE3LDU1IEBACiAjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJERU1VWF9ICiAjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJERU1VWF9ICiAKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSURlbXV4Lmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJEZW11eC5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lUdW5lci5oPgogCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6Qm5UdW5lckRlbXV4OwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJEdnI7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckR2ckNhbGxiYWNrOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGaWx0ZXI7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZpbHRlckNhbGxiYWNrOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGcm9udGVuZDsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyVGltZUZpbHRlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SURlbXV4OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRHZyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRHZyQ2FsbGJhY2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklUaW1lRmlsdGVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkR2clR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OklEZW11eDsKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAorbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgewogCiBjbGFzcyBUdW5lckRlbXV4IDogcHVibGljIEJuVHVuZXJEZW11eCB7CiAKIHB1YmxpYzoKLSAgICBUdW5lckRlbXV4KHNwPElEZW11eD4gZGVtdXgsIGludCBkZW11eElkKTsKKyAgICBUdW5lckRlbXV4KHNoYXJlZF9wdHI8SURlbXV4PiBkZW11eCwgaW50IGRlbXV4SWQpOwogICAgIHZpcnR1YWwgflR1bmVyRGVtdXgoKTsKLSAgICBTdGF0dXMgc2V0RnJvbnRlbmREYXRhU291cmNlKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+JiBmcm9udGVuZCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIG9wZW5GaWx0ZXIoCi0gICAgICAgIGludCBtYWluVHlwZSwgaW50IHN1YnR5cGUsIGludCBidWZmZXJTaXplLCBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgY2IsCi0gICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgb3BlblRpbWVGaWx0ZXIoc2hhcmVkX3B0cjxJVHVuZXJUaW1lRmlsdGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0QXZTeW5jSHdJZChjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIHR1bmVyRmlsdGVyLCBpbnQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldEF2U3luY1RpbWUoaW50IGF2U3luY0h3SWQsIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIG9wZW5EdnIoCi0gICAgICAgIGludCBkdmJUeXBlLCBpbnQgYnVmZmVyU2l6ZSwgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJEdnJDYWxsYmFjaz4mIGNiLAotICAgICAgICBzaGFyZWRfcHRyPElUdW5lckR2cj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGNvbm5lY3RDaUNhbShpbnQgY2lDYW1JZCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGRpc2Nvbm5lY3RDaUNhbSgpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0RnJvbnRlbmREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZD4mIGluX2Zyb250ZW5kKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRGcm9udGVuZERhdGFTb3VyY2VCeUlkKGludCBmcm9udGVuZElkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuRmlsdGVyKGNvbnN0IERlbXV4RmlsdGVyVHlwZSYgaW5fdHlwZSwgaW50MzJfdCBpbl9idWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5UaW1lRmlsdGVyKHNoYXJlZF9wdHI8SVR1bmVyVGltZUZpbHRlcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0QXZTeW5jSHdJZChjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX3R1bmVyRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRBdlN5bmNUaW1lKGludDMyX3QgaW5fYXZTeW5jSHdJZCwgaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuRHZyKER2clR5cGUgaW5fZHZiVHlwZSwgaW50MzJfdCBpbl9idWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJEdnJDYWxsYmFjaz4mIGluX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEdnI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNvbm5lY3RDaUNhbShpbnQzMl90IGluX2NpQ2FtSWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGRpc2Nvbm5lY3RDaUNhbSgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CiAKICAgICBpbnQgZ2V0SWQoKSB7IHJldHVybiBtRGVtdXhJZDsgfQogCiBwcml2YXRlOgotICAgIHNwPElEZW11eD4gbURlbXV4OworICAgIHNoYXJlZF9wdHI8SURlbXV4PiBtRGVtdXg7CiAgICAgaW50IG1EZW11eElkOwogfTsKIAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCiAKICNlbmRpZiAvLyBBTkRST0lEX01FRElBX1RVTkVSREVNVVhfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJEZXNjcmFtYmxlci5jcHAgYi9zZXJ2aWNlcy90dW5lci9UdW5lckRlc2NyYW1ibGVyLmNwcAppbmRleCBiN2FlMTY3Li43MGFlZTIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckRlc2NyYW1ibGVyLmNwcAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckRlc2NyYW1ibGVyLmNwcApAQCAtMTYsMTcgKzE2LDI3IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiVHVuZXJEZXNjcmFtYmxlciIKIAotI2luY2x1ZGUgIlR1bmVyRmlsdGVyLmgiCi0jaW5jbHVkZSAiVHVuZXJEZW11eC5oIgogI2luY2x1ZGUgIlR1bmVyRGVzY3JhbWJsZXIuaCIKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZXN1bHQ7CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lGaWx0ZXIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVzdWx0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJUdW5lckRlbXV4LmgiCisjaW5jbHVkZSAiVHVuZXJGaWx0ZXIuaCIKKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRmlsdGVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAotVHVuZXJEZXNjcmFtYmxlcjo6VHVuZXJEZXNjcmFtYmxlcihzcDxJRGVzY3JhbWJsZXI+IGRlc2NyYW1ibGVyKSB7CitUdW5lckRlc2NyYW1ibGVyOjpUdW5lckRlc2NyYW1ibGVyKHNoYXJlZF9wdHI8SURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcikgewogICAgIG1EZXNjcmFtYmxlciA9IGRlc2NyYW1ibGVyOwogfQogCkBAIC0zNCw5MSArNDQsNzQgQEAKICAgICBtRGVzY3JhbWJsZXIgPSBudWxscHRyOwogfQogCi1TdGF0dXMgVHVuZXJEZXNjcmFtYmxlcjo6c2V0RGVtdXhTb3VyY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUdW5lckRlbXV4PiYgZGVtdXgpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OnNldERlbXV4U291cmNlKAorICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckRlbXV4PiYgaW5fdHVuZXJEZW11eCkgewogICAgIGlmIChtRGVzY3JhbWJsZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSURlc2NyYW1ibGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EZXNjcmFtYmxlci0+c2V0RGVtdXhTb3VyY2Uoc3RhdGljX2Nhc3Q8VHVuZXJEZW11eCo+KGRlbXV4LmdldCgpKS0+Z2V0SWQoKSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1EZXNjcmFtYmxlci0+c2V0RGVtdXhTb3VyY2UoKHN0YXRpY19jYXN0PFR1bmVyRGVtdXgqPihpbl90dW5lckRlbXV4LmdldCgpKSktPmdldElkKCkpOwogfQogCi1TdGF0dXMgVHVuZXJEZXNjcmFtYmxlcjo6c2V0S2V5VG9rZW4oY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBrZXlUb2tlbikgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEZXNjcmFtYmxlcjo6c2V0S2V5VG9rZW4oY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBpbl9rZXlUb2tlbikgewogICAgIGlmIChtRGVzY3JhbWJsZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSURlc2NyYW1ibGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EZXNjcmFtYmxlci0+c2V0S2V5VG9rZW4oa2V5VG9rZW4pOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtRGVzY3JhbWJsZXItPnNldEtleVRva2VuKGluX2tleVRva2VuKTsKIH0KIAotU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OmFkZFBpZChjb25zdCBUdW5lckRlbXV4UGlkJiBwaWQsCi0gICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OmFkZFBpZCgKKyAgICAgICAgY29uc3QgRGVtdXhQaWQmIGluX3BpZCwgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9vcHRpb25hbFNvdXJjZUZpbHRlcikgewogICAgIGlmIChtRGVzY3JhbWJsZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSURlc2NyYW1ibGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgc3A8SUZpbHRlcj4gaGFsRmlsdGVyID0gKG9wdGlvbmFsU291cmNlRmlsdGVyID09IE5VTEwpCi0gICAgICAgICAgICA/IE5VTEwgOiBzdGF0aWNfY2FzdDxUdW5lckZpbHRlcio+KG9wdGlvbmFsU291cmNlRmlsdGVyLmdldCgpKS0+Z2V0SGFsRmlsdGVyKCk7Ci0gICAgUmVzdWx0IHJlcyA9IG1EZXNjcmFtYmxlci0+YWRkUGlkKGdldEhpZGxEZW11eFBpZChwaWQpLCBoYWxGaWx0ZXIpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHNoYXJlZF9wdHI8SUZpbHRlcj4gaGFsRmlsdGVyID0KKyAgICAgICAgICAgIChpbl9vcHRpb25hbFNvdXJjZUZpbHRlciA9PSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA/IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgOiBzdGF0aWNfY2FzdDxUdW5lckZpbHRlcio+KGluX29wdGlvbmFsU291cmNlRmlsdGVyLmdldCgpKS0+Z2V0SGFsRmlsdGVyKCk7CisKKyAgICByZXR1cm4gbURlc2NyYW1ibGVyLT5hZGRQaWQoaW5fcGlkLCBoYWxGaWx0ZXIpOwogfQogCi1TdGF0dXMgVHVuZXJEZXNjcmFtYmxlcjo6cmVtb3ZlUGlkKGNvbnN0IFR1bmVyRGVtdXhQaWQmIHBpZCwKLSAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBvcHRpb25hbFNvdXJjZUZpbHRlcikgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEZXNjcmFtYmxlcjo6cmVtb3ZlUGlkKAorICAgICAgICBjb25zdCBEZW11eFBpZCYgaW5fcGlkLCBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX29wdGlvbmFsU291cmNlRmlsdGVyKSB7CiAgICAgaWYgKG1EZXNjcmFtYmxlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRGVzY3JhbWJsZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBzcDxJRmlsdGVyPiBoYWxGaWx0ZXIgPSAob3B0aW9uYWxTb3VyY2VGaWx0ZXIgPT0gTlVMTCkKLSAgICAgICAgICAgID8gTlVMTCA6IHN0YXRpY19jYXN0PFR1bmVyRmlsdGVyKj4ob3B0aW9uYWxTb3VyY2VGaWx0ZXIuZ2V0KCkpLT5nZXRIYWxGaWx0ZXIoKTsKLSAgICBSZXN1bHQgcmVzID0gbURlc2NyYW1ibGVyLT5yZW1vdmVQaWQoZ2V0SGlkbERlbXV4UGlkKHBpZCksIGhhbEZpbHRlcik7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgc2hhcmVkX3B0cjxJRmlsdGVyPiBoYWxGaWx0ZXIgPQorICAgICAgICAgICAgKGluX29wdGlvbmFsU291cmNlRmlsdGVyID09IG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgID8gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICA6IHN0YXRpY19jYXN0PFR1bmVyRmlsdGVyKj4oaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIuZ2V0KCkpLT5nZXRIYWxGaWx0ZXIoKTsKKworICAgIHJldHVybiBtRGVzY3JhbWJsZXItPnJlbW92ZVBpZChpbl9waWQsIGhhbEZpbHRlcik7CiB9CiAKLVN0YXR1cyBUdW5lckRlc2NyYW1ibGVyOjpjbG9zZSgpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OmNsb3NlKCkgewogICAgIGlmIChtRGVzY3JhbWJsZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSURlc2NyYW1ibGVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXMgPSBtRGVzY3JhbWJsZXItPmNsb3NlKCk7Ci0gICAgbURlc2NyYW1ibGVyID0gTlVMTDsKKyAgICBhdXRvIHJlcyA9IG1EZXNjcmFtYmxlci0+Y2xvc2UoKTsKKyAgICBtRGVzY3JhbWJsZXIgPSBudWxscHRyOwogCi0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiByZXM7CiB9CiAKLURlbXV4UGlkIFR1bmVyRGVzY3JhbWJsZXI6OmdldEhpZGxEZW11eFBpZChjb25zdCBUdW5lckRlbXV4UGlkJiBwaWQpIHsKLSAgICBEZW11eFBpZCBoaWRsUGlkOwotICAgIHN3aXRjaCAocGlkLmdldFRhZygpKSB7Ci0gICAgICAgIGNhc2UgVHVuZXJEZW11eFBpZDo6dFBpZDogewotICAgICAgICAgICAgaGlkbFBpZC50UGlkKCh1aW50MTZfdClwaWQuZ2V0PFR1bmVyRGVtdXhQaWQ6OnRQaWQ+KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckRlbXV4UGlkOjptbXRwUGlkOiB7Ci0gICAgICAgICAgICBoaWRsUGlkLm1tdHBQaWQoKHVpbnQxNl90KXBpZC5nZXQ8VHVuZXJEZW11eFBpZDo6bW10cFBpZD4oKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaGlkbFBpZDsKLX0KK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJEZXNjcmFtYmxlci5oIGIvc2VydmljZXMvdHVuZXIvVHVuZXJEZXNjcmFtYmxlci5oCmluZGV4IDE5NzBmYjcuLmIxZDVmYjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVzY3JhbWJsZXIuaAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckRlc2NyYW1ibGVyLmgKQEAgLTE3LDM4ICsxNyw0MyBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSREVTQ1JBTUJMRVJfSAogI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSREVTQ1JBTUJMRVJfSAogCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lEZXNjcmFtYmxlci5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyRGVzY3JhbWJsZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JVHVuZXIuaD4KIAotdXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OkJuVHVuZXJEZXNjcmFtYmxlcjsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRGVtdXg7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZpbHRlcjsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJEZW11eFBpZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhQaWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklEZXNjcmFtYmxlcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhQaWQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OklEZXNjcmFtYmxlcjsKIAordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgewogCiBjbGFzcyBUdW5lckRlc2NyYW1ibGVyIDogcHVibGljIEJuVHVuZXJEZXNjcmFtYmxlciB7CiAKIHB1YmxpYzoKLSAgICBUdW5lckRlc2NyYW1ibGVyKHNwPElEZXNjcmFtYmxlcj4gZGVzY3JhbWJsZXIpOworICAgIFR1bmVyRGVzY3JhbWJsZXIoc2hhcmVkX3B0cjxJRGVzY3JhbWJsZXI+IGRlc2NyYW1ibGVyKTsKICAgICB2aXJ0dWFsIH5UdW5lckRlc2NyYW1ibGVyKCk7Ci0gICAgU3RhdHVzIHNldERlbXV4U291cmNlKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRGVtdXg+JiBkZW11eCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldEtleVRva2VuKGNvbnN0IHZlY3Rvcjx1aW50OF90PiYga2V5VG9rZW4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBhZGRQaWQoY29uc3QgVHVuZXJEZW11eFBpZCYgcGlkLAotICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBvcHRpb25hbFNvdXJjZUZpbHRlcikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHJlbW92ZVBpZChjb25zdCBUdW5lckRlbXV4UGlkJiBwaWQsCi0gICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIG9wdGlvbmFsU291cmNlRmlsdGVyKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldERlbXV4U291cmNlKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRGVtdXg+JiBpbl90dW5lckRlbXV4KSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRLZXlUb2tlbihjb25zdCB2ZWN0b3I8dWludDhfdD4mIGluX2tleVRva2VuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBhZGRQaWQoY29uc3QgRGVtdXhQaWQmIGluX3BpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9vcHRpb25hbFNvdXJjZUZpbHRlcikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVtb3ZlUGlkKAorICAgICAgICAgICAgY29uc3QgRGVtdXhQaWQmIGluX3BpZCwKKyAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6Ci0gICAgRGVtdXhQaWQgZ2V0SGlkbERlbXV4UGlkKGNvbnN0IFR1bmVyRGVtdXhQaWQmIHBpZCk7Ci0KLSAgICBzcDxJRGVzY3JhbWJsZXI+IG1EZXNjcmFtYmxlcjsKKyAgICBzaGFyZWRfcHRyPElEZXNjcmFtYmxlcj4gbURlc2NyYW1ibGVyOwogfTsKIAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCiAKICNlbmRpZiAvLyBBTkRST0lEX01FRElBX1RVTkVSREVTQ1JBTUJMRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJEdnIuY3BwIGIvc2VydmljZXMvdHVuZXIvVHVuZXJEdnIuY3BwCmluZGV4IGRiNGUwN2IuLjg3NzZmN2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRHZyLmNwcAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckR2ci5jcHAKQEAgLTE2LDE5NCArMTYsMTUyIEBACiAKICNkZWZpbmUgTE9HX1RBRyAiVHVuZXJEdnIiCiAKLSNpbmNsdWRlIDxmbXEvQ29udmVydE1RRGVzY3JpcHRvcnMuaD4KICNpbmNsdWRlICJUdW5lckR2ci5oIgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjaW5jbHVkZSAiVHVuZXJGaWx0ZXIuaCIKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEYXRhRm9ybWF0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZXN1bHQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlc3VsdDsKIAorbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgewogCi1UdW5lckR2cjo6VHVuZXJEdnIoc3A8SUR2cj4gZHZyLCBpbnQgdHlwZSkgeworVHVuZXJEdnI6OlR1bmVyRHZyKHNoYXJlZF9wdHI8SUR2cj4gZHZyLCBEdnJUeXBlIHR5cGUpIHsKICAgICBtRHZyID0gZHZyOwotICAgIG1UeXBlID0gc3RhdGljX2Nhc3Q8RHZyVHlwZT4odHlwZSk7CisgICAgbVR5cGUgPSB0eXBlOwogfQogCiBUdW5lckR2cjo6flR1bmVyRHZyKCkgewotICAgIG1EdnIgPSBOVUxMOworICAgIG1EdnIgPSBudWxscHRyOwogfQogCi1TdGF0dXMgVHVuZXJEdnI6OmdldFF1ZXVlRGVzYyhBaWRsTVFEZXNjKiBfYWlkbF9yZXR1cm4pIHsKLSAgICBpZiAobUR2ciA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckR2cjo6Z2V0UXVldWVEZXNjKEFpZGxNUURlc2MqIF9haWRsX3JldHVybikgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBNUURlc2MgZHZyTVFEZXNjOwotICAgIFJlc3VsdCByZXM7Ci0gICAgbUR2ci0+Z2V0UXVldWVEZXNjKFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjJiBkZXNjKSB7Ci0gICAgICAgIGR2ck1RRGVzYyA9IGRlc2M7Ci0gICAgICAgIHJlcyA9IHI7Ci0gICAgfSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLQotICAgIEFpZGxNUURlc2MgYWlkbE1RRGVzYzsKLSAgICB1bnNhZmVIaWRsVG9BaWRsTVFEZXNjcmlwdG9yPHVpbnQ4X3QsIGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPigKLSAgICAgICAgICAgICAgICBkdnJNUURlc2MsICAmYWlkbE1RRGVzYyk7Ci0gICAgKl9haWRsX3JldHVybiA9IG1vdmUoYWlkbE1RRGVzYyk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbUR2ci0+Z2V0UXVldWVEZXNjKF9haWRsX3JldHVybik7CiB9CiAKLVN0YXR1cyBUdW5lckR2cjo6Y29uZmlndXJlKGNvbnN0IFR1bmVyRHZyU2V0dGluZ3MmIHNldHRpbmdzKSB7Ci0gICAgaWYgKG1EdnIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEdnI6OmNvbmZpZ3VyZShjb25zdCBEdnJTZXR0aW5ncyYgaW5fc2V0dGluZ3MpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EdnItPmNvbmZpZ3VyZShnZXRIaWRsRHZyU2V0dGluZ3NGcm9tQWlkbChzZXR0aW5ncykpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtRHZyLT5jb25maWd1cmUoaW5fc2V0dGluZ3MpOwogfQogCi1TdGF0dXMgVHVuZXJEdnI6OmF0dGFjaEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGZpbHRlcikgewotICAgIGlmIChtRHZyID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRHZyOjphdHRhY2hGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9maWx0ZXIpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgSVR1bmVyRmlsdGVyKiB0dW5lckZpbHRlciA9IGZpbHRlci5nZXQoKTsKLSAgICBzcDxJRmlsdGVyPiBoaWRsRmlsdGVyID0gc3RhdGljX2Nhc3Q8VHVuZXJGaWx0ZXIqPih0dW5lckZpbHRlciktPmdldEhhbEZpbHRlcigpOwotICAgIGlmIChoaWRsRmlsdGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIGlmIChpbl9maWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlQpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzID0gbUR2ci0+YXR0YWNoRmlsdGVyKGhpZGxGaWx0ZXIpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIHNoYXJlZF9wdHI8SUZpbHRlcj4gaGFsRmlsdGVyID0gKHN0YXRpY19jYXN0PFR1bmVyRmlsdGVyKj4oaW5fZmlsdGVyLmdldCgpKSktPmdldEhhbEZpbHRlcigpOworICAgIGlmIChoYWxGaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlQpKTsKICAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKworICAgIHJldHVybiBtRHZyLT5hdHRhY2hGaWx0ZXIoaGFsRmlsdGVyKTsKIH0KIAotU3RhdHVzIFR1bmVyRHZyOjpkZXRhY2hGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBmaWx0ZXIpIHsKLSAgICBpZiAobUR2ciA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckR2cjo6ZGV0YWNoRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fZmlsdGVyKSB7CisgICAgaWYgKG1EdnIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUR2ciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIElUdW5lckZpbHRlciogdHVuZXJGaWx0ZXIgPSBmaWx0ZXIuZ2V0KCk7Ci0gICAgc3A8SUZpbHRlcj4gaGlkbEZpbHRlciA9IHN0YXRpY19jYXN0PFR1bmVyRmlsdGVyKj4odHVuZXJGaWx0ZXIpLT5nZXRIYWxGaWx0ZXIoKTsKLSAgICBpZiAoaGlkbEZpbHRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlQpKTsKKyAgICBpZiAoaW5fZmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1EdnItPmRldGFjaEZpbHRlcihoaWRsRmlsdGVyKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICBzaGFyZWRfcHRyPElGaWx0ZXI+IGhhbEZpbHRlciA9IChzdGF0aWNfY2FzdDxUdW5lckZpbHRlcio+KGluX2ZpbHRlci5nZXQoKSkpLT5nZXRIYWxGaWx0ZXIoKTsKKyAgICBpZiAoaGFsRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CiAgICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisKKyAgICByZXR1cm4gbUR2ci0+ZGV0YWNoRmlsdGVyKGhhbEZpbHRlcik7CiB9CiAKLVN0YXR1cyBUdW5lckR2cjo6c3RhcnQoKSB7Ci0gICAgaWYgKG1EdnIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEdnI6OnN0YXJ0KCkgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzID0gbUR2ci0+c3RhcnQoKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbUR2ci0+c3RhcnQoKTsKIH0KIAotU3RhdHVzIFR1bmVyRHZyOjpzdG9wKCkgewotICAgIGlmIChtRHZyID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRHZyOjpzdG9wKCkgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzID0gbUR2ci0+c3RvcCgpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtRHZyLT5zdG9wKCk7CiB9CiAKLVN0YXR1cyBUdW5lckR2cjo6Zmx1c2goKSB7Ci0gICAgaWYgKG1EdnIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEdnI6OmZsdXNoKCkgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzID0gbUR2ci0+Zmx1c2goKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbUR2ci0+Zmx1c2goKTsKIH0KIAotU3RhdHVzIFR1bmVyRHZyOjpjbG9zZSgpIHsKLSAgICBpZiAobUR2ciA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckR2cjo6Y2xvc2UoKSB7CisgICAgaWYgKG1EdnIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUR2ciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXMgPSBtRHZyLT5jbG9zZSgpOwotICAgIG1EdnIgPSBOVUxMOworICAgIGF1dG8gc3RhdHVzID0gbUR2ci0+Y2xvc2UoKTsKKyAgICBtRHZyID0gbnVsbHB0cjsKIAotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1EdnJTZXR0aW5ncyBUdW5lckR2cjo6Z2V0SGlkbER2clNldHRpbmdzRnJvbUFpZGwoVHVuZXJEdnJTZXR0aW5ncyBzZXR0aW5ncykgewotICAgIER2clNldHRpbmdzIHM7Ci0gICAgc3dpdGNoIChtVHlwZSkgewotICAgICAgICBjYXNlIER2clR5cGU6OlBMQVlCQUNLOiB7Ci0gICAgICAgICAgICBzLnBsYXliYWNrKHsKLSAgICAgICAgICAgICAgICAuc3RhdHVzTWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNldHRpbmdzLnN0YXR1c01hc2spLAotICAgICAgICAgICAgICAgIC5sb3dUaHJlc2hvbGQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0dGluZ3MubG93VGhyZXNob2xkKSwKLSAgICAgICAgICAgICAgICAuaGlnaFRocmVzaG9sZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXR0aW5ncy5oaWdoVGhyZXNob2xkKSwKLSAgICAgICAgICAgICAgICAuZGF0YUZvcm1hdCA9IHN0YXRpY19jYXN0PERhdGFGb3JtYXQ+KHNldHRpbmdzLmRhdGFGb3JtYXQpLAotICAgICAgICAgICAgICAgIC5wYWNrZXRTaXplID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oc2V0dGluZ3MucGFja2V0U2l6ZSksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRHZyVHlwZTo6UkVDT1JEOiB7Ci0gICAgICAgICAgICBzLnJlY29yZCh7Ci0gICAgICAgICAgICAgICAgLnN0YXR1c01hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5zdGF0dXNNYXNrKSwKLSAgICAgICAgICAgICAgICAubG93VGhyZXNob2xkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNldHRpbmdzLmxvd1RocmVzaG9sZCksCi0gICAgICAgICAgICAgICAgLmhpZ2hUaHJlc2hvbGQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0dGluZ3MuaGlnaFRocmVzaG9sZCksCi0gICAgICAgICAgICAgICAgLmRhdGFGb3JtYXQgPSBzdGF0aWNfY2FzdDxEYXRhRm9ybWF0PihzZXR0aW5ncy5kYXRhRm9ybWF0KSwKLSAgICAgICAgICAgICAgICAucGFja2V0U2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNldHRpbmdzLnBhY2tldFNpemUpLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBzOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLyBJRHZyQ2FsbGJhY2sgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotUmV0dXJuPHZvaWQ+IFR1bmVyRHZyOjpEdnJDYWxsYmFjazo6b25SZWNvcmRTdGF0dXMoY29uc3QgUmVjb3JkU3RhdHVzIHN0YXR1cykgewotICAgIGlmIChtVHVuZXJEdnJDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIG1UdW5lckR2ckNhbGxiYWNrLT5vblJlY29yZFN0YXR1cyhzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEdnI6OkR2ckNhbGxiYWNrOjpvblJlY29yZFN0YXR1cyhjb25zdCBSZWNvcmRTdGF0dXMgc3RhdHVzKSB7CisgICAgaWYgKG1UdW5lckR2ckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVR1bmVyRHZyQ2FsbGJhY2stPm9uUmVjb3JkU3RhdHVzKHN0YXR1cyk7CiAgICAgfQotICAgIHJldHVybiBWb2lkKCk7CisgICAgcmV0dXJuIG5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKIH0KIAotUmV0dXJuPHZvaWQ+IFR1bmVyRHZyOjpEdnJDYWxsYmFjazo6b25QbGF5YmFja1N0YXR1cyhjb25zdCBQbGF5YmFja1N0YXR1cyBzdGF0dXMpIHsKLSAgICBpZiAobVR1bmVyRHZyQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICBtVHVuZXJEdnJDYWxsYmFjay0+b25QbGF5YmFja1N0YXR1cyhzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJEdnI6OkR2ckNhbGxiYWNrOjpvblBsYXliYWNrU3RhdHVzKGNvbnN0IFBsYXliYWNrU3RhdHVzIHN0YXR1cykgeworICAgIGlmIChtVHVuZXJEdnJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckR2ckNhbGxiYWNrLT5vblBsYXliYWNrU3RhdHVzKHN0YXR1cyk7CiAgICAgfQotICAgIHJldHVybiBWb2lkKCk7CisgICAgcmV0dXJuIG5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKIH0KKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lckR2ci5oIGIvc2VydmljZXMvdHVuZXIvVHVuZXJEdnIuaAppbmRleCBhNTA4ZTk5Li4xODU0ZDA4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckR2ci5oCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRHZyLmgKQEAgLTE3LDgxICsxNyw3MSBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSRFZSX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkRWUl9ICiAKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvQm5EdnJDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EdnJTZXR0aW5ncy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EdnJUeXBlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lEdnIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUGxheWJhY2tTdGF0dXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVjb3JkU3RhdHVzLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJEdnIuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JVHVuZXIuaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CiAKLSNpbmNsdWRlIDxUdW5lckZpbHRlci5oPgorI2luY2x1ZGUgIlR1bmVyRmlsdGVyLmgiCiAKLXVzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6OkdyYW50b3JEZXNjcmlwdG9yOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6Ok1RRGVzY3JpcHRvcjsKIHVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OkJuVHVuZXJEdnI7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckR2ckNhbGxiYWNrOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGaWx0ZXI7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRHZyU2V0dGluZ3M7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkR2clNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEdnJUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRHZyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRHZyQ2FsbGJhY2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlBsYXliYWNrU3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZWNvcmRTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkJuRHZyQ2FsbGJhY2s7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkR2clNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEdnJUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRHZyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpQbGF5YmFja1N0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6UmVjb3JkU3RhdHVzOwogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCituYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CiAKLXVzaW5nIE1RRGVzYyA9IE1RRGVzY3JpcHRvclN5bmM8dWludDhfdD47CiB1c2luZyBBaWRsTVFEZXNjID0gTVFEZXNjcmlwdG9yPGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPjsKIAogY2xhc3MgVHVuZXJEdnIgOiBwdWJsaWMgQm5UdW5lckR2ciB7CiAKIHB1YmxpYzoKLSAgICBUdW5lckR2cihzcDxJRHZyPiBkdnIsIGludCB0eXBlKTsKKyAgICBUdW5lckR2cihzaGFyZWRfcHRyPElEdnI+IGR2ciwgRHZyVHlwZSB0eXBlKTsKICAgICB+VHVuZXJEdnIoKTsKIAotICAgIFN0YXR1cyBnZXRRdWV1ZURlc2MoQWlkbE1RRGVzYyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRRdWV1ZURlc2MoQWlkbE1RRGVzYyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjb25maWd1cmUoY29uc3QgRHZyU2V0dGluZ3MmIGluX3NldHRpbmdzKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBhdHRhY2hGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9maWx0ZXIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGRldGFjaEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX2ZpbHRlcikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RhcnQoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdG9wKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZmx1c2goKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOwogCi0gICAgU3RhdHVzIGNvbmZpZ3VyZShjb25zdCBUdW5lckR2clNldHRpbmdzJiBzZXR0aW5ncykgb3ZlcnJpZGU7Ci0KLSAgICBTdGF0dXMgYXR0YWNoRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgZmlsdGVyKSBvdmVycmlkZTsKLQotICAgIFN0YXR1cyBkZXRhY2hGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBmaWx0ZXIpIG92ZXJyaWRlOwotCi0gICAgU3RhdHVzIHN0YXJ0KCkgb3ZlcnJpZGU7Ci0KLSAgICBTdGF0dXMgc3RvcCgpIG92ZXJyaWRlOwotCi0gICAgU3RhdHVzIGZsdXNoKCkgb3ZlcnJpZGU7Ci0KLSAgICBTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKLQotICAgIHN0cnVjdCBEdnJDYWxsYmFjayA6IHB1YmxpYyBJRHZyQ2FsbGJhY2sgeworICAgIHN0cnVjdCBEdnJDYWxsYmFjayA6IHB1YmxpYyBCbkR2ckNhbGxiYWNrIHsKICAgICAgICAgRHZyQ2FsbGJhY2soY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJEdnJDYWxsYmFjaz4gdHVuZXJEdnJDYWxsYmFjaykKLSAgICAgICAgICAgICAgICA6IG1UdW5lckR2ckNhbGxiYWNrKHR1bmVyRHZyQ2FsbGJhY2spIHt9OworICAgICAgICAgICAgICA6IG1UdW5lckR2ckNhbGxiYWNrKHR1bmVyRHZyQ2FsbGJhY2spe307CiAKLSAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25SZWNvcmRTdGF0dXMoY29uc3QgUmVjb3JkU3RhdHVzIHN0YXR1cyk7Ci0gICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uUGxheWJhY2tTdGF0dXMoY29uc3QgUGxheWJhY2tTdGF0dXMgc3RhdHVzKTsKKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb25SZWNvcmRTdGF0dXMoY29uc3QgUmVjb3JkU3RhdHVzIHN0YXR1cykgb3ZlcnJpZGU7CisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uUGxheWJhY2tTdGF0dXMoY29uc3QgUGxheWJhY2tTdGF0dXMgc3RhdHVzKSBvdmVycmlkZTsKIAotICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEdnJDYWxsYmFjaz4gbVR1bmVyRHZyQ2FsbGJhY2s7CisgICAgcHJpdmF0ZToKKyAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEdnJDYWxsYmFjaz4gbVR1bmVyRHZyQ2FsbGJhY2s7CiAgICAgfTsKIAogcHJpdmF0ZToKLSAgICBEdnJTZXR0aW5ncyBnZXRIaWRsRHZyU2V0dGluZ3NGcm9tQWlkbChUdW5lckR2clNldHRpbmdzIHNldHRpbmdzKTsKLQotICAgIHNwPElEdnI+IG1EdnI7CisgICAgc2hhcmVkX3B0cjxJRHZyPiBtRHZyOwogICAgIER2clR5cGUgbVR5cGU7CiB9OwogCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKIAogI2VuZGlmIC8vIEFORFJPSURfTUVESUFfVFVORVJEVlJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJGaWx0ZXIuY3BwIGIvc2VydmljZXMvdHVuZXIvVHVuZXJGaWx0ZXIuY3BwCmluZGV4IDAzOWZkMzEuLmU4Yzc3NjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRmlsdGVyLmNwcAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckZpbHRlci5jcHAKQEAgLTE4LDg5MyArMTgsNDY5IEBACiAKICNpbmNsdWRlICJUdW5lckZpbHRlci5oIgogCi11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyU2VjdGlvbkNvbmRpdGlvbjsKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVzdWx0Lmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEFscExlbmd0aFR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyTWFpblR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4SXBBZGRyZXNzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eE1tdHBGaWx0ZXJUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eE1tdHBQaWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4UmVjb3JkU2NJbmRleFR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4U3RyZWFtSWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4VHNGaWx0ZXJUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkF1ZGlvU3RyZWFtVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6Q29uc3RhbnQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OlZpZGVvU3RyZWFtVHlwZTsKKyNpbmNsdWRlICJUdW5lckhlbHBlci5oIgorI2luY2x1ZGUgIlR1bmVyU2VydmljZS5oIgogCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlc3VsdDsKKworbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCit1c2luZyA6OmFuZHJvaWQ6OklQQ1RocmVhZFN0YXRlOwogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi1UdW5lckZpbHRlcjo6VHVuZXJGaWx0ZXIoCi0gICAgICAgIHNwPElGaWx0ZXI+IGZpbHRlciwgaW50IG1haW5UeXBlLCBpbnQgc3ViVHlwZSkgewotICAgIG1GaWx0ZXIgPSBmaWx0ZXI7Ci0gICAgbUZpbHRlcl8xXzEgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklGaWx0ZXI6OmNhc3RGcm9tKGZpbHRlcik7Ci0gICAgbU1haW5UeXBlID0gbWFpblR5cGU7Ci0gICAgbVN1YlR5cGUgPSBzdWJUeXBlOwotfQorVHVuZXJGaWx0ZXI6OlR1bmVyRmlsdGVyKHNoYXJlZF9wdHI8SUZpbHRlcj4gZmlsdGVyLCBzaGFyZWRfcHRyPEZpbHRlckNhbGxiYWNrPiBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZW11eEZpbHRlclR5cGUgdHlwZSkKKyAgICAgIDogbUZpbHRlcihmaWx0ZXIpLAorICAgICAgICBtVHlwZSh0eXBlKSwKKyAgICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgICBtU2hhcmVkKGZhbHNlKSwKKyAgICAgICAgbUNsaWVudFBpZCgtMSksCisgICAgICAgIG1GaWx0ZXJDYWxsYmFjayhjYikge30KIAogVHVuZXJGaWx0ZXI6On5UdW5lckZpbHRlcigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIG1GaWx0ZXIgPSBudWxscHRyOwotICAgIG1GaWx0ZXJfMV8xID0gbnVsbHB0cjsKIH0KIAotU3RhdHVzIFR1bmVyRmlsdGVyOjpnZXRRdWV1ZURlc2MoQWlkbE1RRGVzYyogX2FpZGxfcmV0dXJuKSB7Ci0gICAgaWYgKG1GaWx0ZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKLSAgICB9Ci0KLSAgICBNUURlc2MgZmlsdGVyTVFEZXNjOwotICAgIFJlc3VsdCByZXM7Ci0gICAgbUZpbHRlci0+Z2V0UXVldWVEZXNjKFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjJiBkZXNjKSB7Ci0gICAgICAgIGZpbHRlck1RRGVzYyA9IGRlc2M7Ci0gICAgICAgIHJlcyA9IHI7Ci0gICAgfSk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLQotICAgIEFpZGxNUURlc2MgYWlkbE1RRGVzYzsKLSAgICB1bnNhZmVIaWRsVG9BaWRsTVFEZXNjcmlwdG9yPHVpbnQ4X3QsIGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPigKLSAgICAgICAgICAgICAgICBmaWx0ZXJNUURlc2MsICAmYWlkbE1RRGVzYyk7Ci0gICAgKl9haWRsX3JldHVybiA9IG1vdmUoYWlkbE1RRGVzYyk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIFR1bmVyRmlsdGVyOjpnZXRJZChpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpnZXRRdWV1ZURlc2MoQWlkbE1RRGVzYyogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlczsKLSAgICBtRmlsdGVyLT5nZXRJZChbJl0oUmVzdWx0IHIsIHVpbnQzMl90IGZpbHRlcklkKSB7Ci0gICAgICAgIHJlcyA9IHI7Ci0gICAgICAgIG1JZCA9IGZpbHRlcklkOwotICAgIH0pOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICAgICAgaW50MzJfdCBjYWxsaW5nUGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIGlmIChjYWxsaW5nUGlkID09IG1DbGllbnRQaWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgaW4gd3JvbmcgcHJvY2VzcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgICAgIH0KICAgICB9Ci0gICAgKl9haWRsX3JldHVybiA9IG1JZDsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworCisgICAgcmV0dXJuIG1GaWx0ZXItPmdldFF1ZXVlRGVzYyhfYWlkbF9yZXR1cm4pOwogfQogCi1TdGF0dXMgVHVuZXJGaWx0ZXI6OmdldElkNjRCaXQoaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7Ci0gICAgaWYgKG1GaWx0ZXJfMV8xID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIklGaWx0ZXJfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwotICAgIH0KLQotICAgIFJlc3VsdCByZXM7Ci0gICAgbUZpbHRlcl8xXzEtPmdldElkNjRCaXQoWyZdKFJlc3VsdCByLCB1aW50NjRfdCBmaWx0ZXJJZCkgewotICAgICAgICByZXMgPSByOwotICAgICAgICBtSWQ2NEJpdCA9IGZpbHRlcklkOwotICAgIH0pOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICAqX2FpZGxfcmV0dXJuID0gbUlkNjRCaXQ7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIFR1bmVyRmlsdGVyOjpjb25maWd1cmUoY29uc3QgVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uJiBjb25maWcpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpnZXRJZChpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBEZW11eEZpbHRlclNldHRpbmdzIHNldHRpbmdzOwotICAgIHN3aXRjaCAoY29uZmlnLmdldFRhZygpKSB7Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uOjp0czogewotICAgICAgICAgICAgZ2V0SGlkbFRzU2V0dGluZ3MoY29uZmlnLCBzZXR0aW5ncyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbjo6bW10cDogewotICAgICAgICAgICAgZ2V0SGlkbE1tdHBTZXR0aW5ncyhjb25maWcsIHNldHRpbmdzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uOjppcDogewotICAgICAgICAgICAgZ2V0SGlkbElwU2V0dGluZ3MoY29uZmlnLCBzZXR0aW5ncyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbjo6dGx2OiB7Ci0gICAgICAgICAgICBnZXRIaWRsVGx2U2V0dGluZ3MoY29uZmlnLCBzZXR0aW5ncyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbjo6YWxwOiB7Ci0gICAgICAgICAgICBnZXRIaWRsQWxwU2V0dGluZ3MoY29uZmlnLCBzZXR0aW5ncyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXItPmNvbmZpZ3VyZShzZXR0aW5ncyk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIGF1dG8gc3RhdHVzID0gbUZpbHRlci0+Z2V0SWQoJm1JZCk7CisgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG1JZDsKICAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1TdGF0dXMgVHVuZXJGaWx0ZXI6OmNvbmZpZ3VyZU1vbml0b3JFdmVudChpbnQgbW9uaXRvckV2ZW50VHlwZSkgewotICAgIGlmIChtRmlsdGVyXzFfMSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJJRmlsdGVyXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKLSAgICB9Ci0KLSAgICBSZXN1bHQgcmVzID0gbUZpbHRlcl8xXzEtPmNvbmZpZ3VyZU1vbml0b3JFdmVudChtb25pdG9yRXZlbnRUeXBlKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBUdW5lckZpbHRlcjo6Y29uZmlndXJlSXBGaWx0ZXJDb250ZXh0SWQoaW50IGNpZCkgewotICAgIGlmIChtRmlsdGVyXzFfMSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJJRmlsdGVyXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKLSAgICB9Ci0KLSAgICBSZXN1bHQgcmVzID0gbUZpbHRlcl8xXzEtPmNvbmZpZ3VyZUlwQ2lkKGNpZCk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgVHVuZXJGaWx0ZXI6OmNvbmZpZ3VyZUF2U3RyZWFtVHlwZShpbnQgYXZTdHJlYW1UeXBlKSB7Ci0gICAgaWYgKG1GaWx0ZXJfMV8xID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIklGaWx0ZXJfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwotICAgIH0KLQotICAgIEF2U3RyZWFtVHlwZSB0eXBlOwotICAgIGlmICghZ2V0SGlkbEF2U3RyZWFtVHlwZShhdlN0cmVhbVR5cGUsIHR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKLSAgICB9Ci0KLSAgICBSZXN1bHQgcmVzID0gbUZpbHRlcl8xXzEtPmNvbmZpZ3VyZUF2U3RyZWFtVHlwZSh0eXBlKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBUdW5lckZpbHRlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGZpbHRlcikgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OmdldElkNjRCaXQoaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgSVR1bmVyRmlsdGVyKiB0dW5lckZpbHRlciA9IGZpbHRlci5nZXQoKTsKLSAgICBzcDxJRmlsdGVyPiBoaWRsRmlsdGVyID0gc3RhdGljX2Nhc3Q8VHVuZXJGaWx0ZXIqPih0dW5lckZpbHRlciktPmdldEhhbEZpbHRlcigpOwotICAgIFJlc3VsdCByZXMgPSBtRmlsdGVyLT5zZXREYXRhU291cmNlKGhpZGxGaWx0ZXIpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotdm9pZCBUdW5lckZpbHRlcjo6Z2V0SGlkbFRzU2V0dGluZ3MoCi0gICAgICAgIGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnLCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgewotICAgIGF1dG8gdHNDb25mID0gY29uZmlnLmdldDxUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246OnRzPigpOwotICAgIERlbXV4VHNGaWx0ZXJTZXR0aW5ncyB0c3sKLSAgICAgICAgLnRwaWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4odHNDb25mLnRwaWQpLAotICAgIH07Ci0KLSAgICBUdW5lckZpbHRlclNldHRpbmdzIHR1bmVyU2V0dGluZ3MgPSB0c0NvbmYuZmlsdGVyU2V0dGluZ3M7Ci0gICAgc3dpdGNoICh0dW5lclNldHRpbmdzLmdldFRhZygpKSB7Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6YXY6IHsKLSAgICAgICAgICAgIHRzLmZpbHRlclNldHRpbmdzLmF2KGdldEF2U2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjpzZWN0aW9uOiB7Ci0gICAgICAgICAgICB0cy5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldFNlY3Rpb25TZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OnBlc0RhdGE6IHsKLSAgICAgICAgICAgIHRzLmZpbHRlclNldHRpbmdzLnBlc0RhdGEoZ2V0UGVzRGF0YVNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6cmVjb3JkOiB7Ci0gICAgICAgICAgICB0cy5maWx0ZXJTZXR0aW5ncy5yZWNvcmQoZ2V0UmVjb3JkU2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgdHMuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBzZXR0aW5ncy50cyh0cyk7Ci19Ci0KLXZvaWQgVHVuZXJGaWx0ZXI6OmdldEhpZGxNbXRwU2V0dGluZ3MoCi0gICAgICAgIGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnLCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgewotICAgIGF1dG8gbW10cENvbmYgPSBjb25maWcuZ2V0PFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbjo6bW10cD4oKTsKLSAgICBEZW11eE1tdHBGaWx0ZXJTZXR0aW5ncyBtbXRwewotICAgICAgICAubW10cFBpZCA9IHN0YXRpY19jYXN0PERlbXV4TW10cFBpZD4obW10cENvbmYubW10cFBpZCksCi0gICAgfTsKLQotICAgIFR1bmVyRmlsdGVyU2V0dGluZ3MgdHVuZXJTZXR0aW5ncyA9IG1tdHBDb25mLmZpbHRlclNldHRpbmdzOwotICAgIHN3aXRjaCAodHVuZXJTZXR0aW5ncy5nZXRUYWcoKSkgewotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OmF2OiB7Ci0gICAgICAgICAgICBtbXRwLmZpbHRlclNldHRpbmdzLmF2KGdldEF2U2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjpzZWN0aW9uOiB7Ci0gICAgICAgICAgICBtbXRwLmZpbHRlclNldHRpbmdzLnNlY3Rpb24oZ2V0U2VjdGlvblNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6cGVzRGF0YTogewotICAgICAgICAgICAgbW10cC5maWx0ZXJTZXR0aW5ncy5wZXNEYXRhKGdldFBlc0RhdGFTZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OnJlY29yZDogewotICAgICAgICAgICAgbW10cC5maWx0ZXJTZXR0aW5ncy5yZWNvcmQoZ2V0UmVjb3JkU2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjpkb3dubG9hZDogewotICAgICAgICAgICAgbW10cC5maWx0ZXJTZXR0aW5ncy5kb3dubG9hZChnZXREb3dubG9hZFNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIG1tdHAuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBzZXR0aW5ncy5tbXRwKG1tdHApOwotfQotCi12b2lkIFR1bmVyRmlsdGVyOjpnZXRIaWRsSXBTZXR0aW5ncygKLSAgICAgICAgY29uc3QgVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uJiBjb25maWcsIERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKSB7Ci0gICAgYXV0byBpcENvbmYgPSBjb25maWcuZ2V0PFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbjo6aXA+KCk7Ci0gICAgRGVtdXhJcEFkZHJlc3MgaXBBZGRyewotICAgICAgICAuc3JjUG9ydCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihpcENvbmYuaXBBZGRyLnNyY1BvcnQpLAotICAgICAgICAuZHN0UG9ydCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihpcENvbmYuaXBBZGRyLmRzdFBvcnQpLAotICAgIH07Ci0KLSAgICBpcENvbmYuaXBBZGRyLnNyY0lwQWRkcmVzcy5pc0lwVjYKLSAgICAgICAgICAgID8gaXBBZGRyLnNyY0lwQWRkcmVzcy52NihnZXRJcFY2QWRkcmVzcyhpcENvbmYuaXBBZGRyLnNyY0lwQWRkcmVzcykpCi0gICAgICAgICAgICA6IGlwQWRkci5zcmNJcEFkZHJlc3MudjQoZ2V0SXBWNEFkZHJlc3MoaXBDb25mLmlwQWRkci5zcmNJcEFkZHJlc3MpKTsKLSAgICBpcENvbmYuaXBBZGRyLmRzdElwQWRkcmVzcy5pc0lwVjYKLSAgICAgICAgICAgID8gaXBBZGRyLmRzdElwQWRkcmVzcy52NihnZXRJcFY2QWRkcmVzcyhpcENvbmYuaXBBZGRyLmRzdElwQWRkcmVzcykpCi0gICAgICAgICAgICA6IGlwQWRkci5kc3RJcEFkZHJlc3MudjQoZ2V0SXBWNEFkZHJlc3MoaXBDb25mLmlwQWRkci5kc3RJcEFkZHJlc3MpKTsKLSAgICBEZW11eElwRmlsdGVyU2V0dGluZ3MgaXB7Ci0gICAgICAgIC5pcEFkZHIgPSBpcEFkZHIsCi0gICAgfTsKLQotICAgIFR1bmVyRmlsdGVyU2V0dGluZ3MgdHVuZXJTZXR0aW5ncyA9IGlwQ29uZi5maWx0ZXJTZXR0aW5nczsKLSAgICBzd2l0Y2ggKHR1bmVyU2V0dGluZ3MuZ2V0VGFnKCkpIHsKLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjpzZWN0aW9uOiB7Ci0gICAgICAgICAgICBpcC5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldFNlY3Rpb25TZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OmlzUGFzc3Rocm91Z2g6IHsKLSAgICAgICAgICAgIGlwLmZpbHRlclNldHRpbmdzLmJQYXNzdGhyb3VnaCh0dW5lclNldHRpbmdzLmlzUGFzc3Rocm91Z2gpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgaXAuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBzZXR0aW5ncy5pcChpcCk7Ci19Ci0KLWhpZGxfYXJyYXk8dWludDhfdCwgSVBfVjZfTEVOR1RIPiBUdW5lckZpbHRlcjo6Z2V0SXBWNkFkZHJlc3MoVHVuZXJEZW11eElwQWRkcmVzcyBhZGRyKSB7Ci0gICAgaGlkbF9hcnJheTx1aW50OF90LCBJUF9WNl9MRU5HVEg+IGlwOwotICAgIGlmIChhZGRyLmFkZHIuc2l6ZSgpICE9IElQX1Y2X0xFTkdUSCkgewotICAgICAgICByZXR1cm4gaXA7Ci0gICAgfQotICAgIGNvcHkoYWRkci5hZGRyLmJlZ2luKCksIGFkZHIuYWRkci5lbmQoKSwgaXAuZGF0YSgpKTsKLSAgICByZXR1cm4gaXA7Ci19Ci0KLWhpZGxfYXJyYXk8dWludDhfdCwgSVBfVjRfTEVOR1RIPiBUdW5lckZpbHRlcjo6Z2V0SXBWNEFkZHJlc3MoVHVuZXJEZW11eElwQWRkcmVzcyBhZGRyKSB7Ci0gICAgaGlkbF9hcnJheTx1aW50OF90LCBJUF9WNF9MRU5HVEg+IGlwOwotICAgIGlmIChhZGRyLmFkZHIuc2l6ZSgpICE9IElQX1Y0X0xFTkdUSCkgewotICAgICAgICByZXR1cm4gaXA7Ci0gICAgfQotICAgIGNvcHkoYWRkci5hZGRyLmJlZ2luKCksIGFkZHIuYWRkci5lbmQoKSwgaXAuZGF0YSgpKTsKLSAgICByZXR1cm4gaXA7Ci19Ci0KLXZvaWQgVHVuZXJGaWx0ZXI6OmdldEhpZGxUbHZTZXR0aW5ncygKLSAgICAgICAgY29uc3QgVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uJiBjb25maWcsIERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKSB7Ci0gICAgYXV0byB0bHZDb25mID0gY29uZmlnLmdldDxUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246OnRsdj4oKTsKLSAgICBEZW11eFRsdkZpbHRlclNldHRpbmdzIHRsdnsKLSAgICAgICAgLnBhY2tldFR5cGUgPSBzdGF0aWNfY2FzdDx1aW50OF90Pih0bHZDb25mLnBhY2tldFR5cGUpLAotICAgICAgICAuaXNDb21wcmVzc2VkSXBQYWNrZXQgPSB0bHZDb25mLmlzQ29tcHJlc3NlZElwUGFja2V0LAotICAgIH07Ci0KLSAgICBUdW5lckZpbHRlclNldHRpbmdzIHR1bmVyU2V0dGluZ3MgPSB0bHZDb25mLmZpbHRlclNldHRpbmdzOwotICAgIHN3aXRjaCAodHVuZXJTZXR0aW5ncy5nZXRUYWcoKSkgewotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OnNlY3Rpb246IHsKLSAgICAgICAgICAgIHRsdi5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldFNlY3Rpb25TZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OmlzUGFzc3Rocm91Z2g6IHsKLSAgICAgICAgICAgIHRsdi5maWx0ZXJTZXR0aW5ncy5iUGFzc3Rocm91Z2godHVuZXJTZXR0aW5ncy5pc1Bhc3N0aHJvdWdoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIHRsdi5maWx0ZXJTZXR0aW5ncy5ub2luaXQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHNldHRpbmdzLnRsdih0bHYpOwotfQotCi12b2lkIFR1bmVyRmlsdGVyOjpnZXRIaWRsQWxwU2V0dGluZ3MoCi0gICAgICAgIGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnLCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgewotICAgIGF1dG8gYWxwQ29uZiA9IGNvbmZpZy5nZXQ8VHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uOjphbHA+KCk7Ci0gICAgRGVtdXhBbHBGaWx0ZXJTZXR0aW5ncyBhbHB7Ci0gICAgICAgIC5wYWNrZXRUeXBlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oYWxwQ29uZi5wYWNrZXRUeXBlKSwKLSAgICAgICAgLmxlbmd0aFR5cGUgPSBzdGF0aWNfY2FzdDxEZW11eEFscExlbmd0aFR5cGU+KGFscENvbmYubGVuZ3RoVHlwZSksCi0gICAgfTsKLQotICAgIFR1bmVyRmlsdGVyU2V0dGluZ3MgdHVuZXJTZXR0aW5ncyA9IGFscENvbmYuZmlsdGVyU2V0dGluZ3M7Ci0gICAgc3dpdGNoICh0dW5lclNldHRpbmdzLmdldFRhZygpKSB7Ci0gICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogewotICAgICAgICAgICAgYWxwLmZpbHRlclNldHRpbmdzLnNlY3Rpb24oZ2V0U2VjdGlvblNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGFscC5maWx0ZXJTZXR0aW5ncy5ub2luaXQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHNldHRpbmdzLmFscChhbHApOwotfQotCi1EZW11eEZpbHRlckF2U2V0dGluZ3MgVHVuZXJGaWx0ZXI6OmdldEF2U2V0dGluZ3MoY29uc3QgVHVuZXJGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgICBEZW11eEZpbHRlckF2U2V0dGluZ3MgYXYgewotICAgICAgICAuaXNQYXNzdGhyb3VnaCA9IHNldHRpbmdzLmdldDxUdW5lckZpbHRlclNldHRpbmdzOjphdj4oKS5pc1Bhc3N0aHJvdWdoLAotICAgIH07Ci0gICAgcmV0dXJuIGF2OwotfQotCi1EZW11eEZpbHRlclNlY3Rpb25TZXR0aW5ncyBUdW5lckZpbHRlcjo6Z2V0U2VjdGlvblNldHRpbmdzKGNvbnN0IFR1bmVyRmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKSB7Ci0gICAgYXV0byBzID0gc2V0dGluZ3MuZ2V0PFR1bmVyRmlsdGVyU2V0dGluZ3M6OnNlY3Rpb24+KCk7Ci0gICAgRGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3Mgc2VjdGlvbnsKLSAgICAgICAgLmlzQ2hlY2tDcmMgPSBzLmlzQ2hlY2tDcmMsCi0gICAgICAgIC5pc1JlcGVhdCA9IHMuaXNSZXBlYXQsCi0gICAgICAgIC5pc1JhdyA9IHMuaXNSYXcsCi0gICAgfTsKLQotICAgIHN3aXRjaCAocy5jb25kaXRpb24uZ2V0VGFnKCkpIHsKLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb246OnNlY3Rpb25CaXRzOiB7Ci0gICAgICAgICAgICBhdXRvIHNlY3Rpb25CaXRzID0gcy5jb25kaXRpb24uZ2V0PFR1bmVyRmlsdGVyU2VjdGlvbkNvbmRpdGlvbjo6c2VjdGlvbkJpdHM+KCk7Ci0gICAgICAgICAgICB2ZWN0b3I8dWludDhfdD4gZmlsdGVyKHNlY3Rpb25CaXRzLmZpbHRlci5iZWdpbigpLCBzZWN0aW9uQml0cy5maWx0ZXIuZW5kKCkpOwotICAgICAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IG1hc2soc2VjdGlvbkJpdHMubWFzay5iZWdpbigpLCBzZWN0aW9uQml0cy5tYXNrLmVuZCgpKTsKLSAgICAgICAgICAgIHZlY3Rvcjx1aW50OF90PiBtb2RlKHNlY3Rpb25CaXRzLm1vZGUuYmVnaW4oKSwgc2VjdGlvbkJpdHMubW9kZS5lbmQoKSk7Ci0gICAgICAgICAgICBzZWN0aW9uLmNvbmRpdGlvbi5zZWN0aW9uQml0cyh7Ci0gICAgICAgICAgICAgICAgLmZpbHRlciA9IGZpbHRlciwKLSAgICAgICAgICAgICAgICAubWFzayA9IG1hc2ssCi0gICAgICAgICAgICAgICAgLm1vZGUgPSBtb2RlLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2VjdGlvbkNvbmRpdGlvbjo6dGFibGVJbmZvOiB7Ci0gICAgICAgICAgICBhdXRvIHRhYmxlSW5mbyA9IHMuY29uZGl0aW9uLmdldDxUdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb246OnRhYmxlSW5mbz4oKTsKLSAgICAgICAgICAgIHNlY3Rpb24uY29uZGl0aW9uLnRhYmxlSW5mbyh7Ci0gICAgICAgICAgICAgICAgLnRhYmxlSWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4odGFibGVJbmZvLnRhYmxlSWQpLAotICAgICAgICAgICAgICAgIC52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHRhYmxlSW5mby52ZXJzaW9uKSwKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNlY3Rpb247Ci19Ci0KLURlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzIFR1bmVyRmlsdGVyOjpnZXRQZXNEYXRhU2V0dGluZ3MoY29uc3QgVHVuZXJGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgICBEZW11eEZpbHRlclBlc0RhdGFTZXR0aW5ncyBwZXN7Ci0gICAgICAgIC5zdHJlYW1JZCA9IHN0YXRpY19jYXN0PERlbXV4U3RyZWFtSWQ+KAotICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZpbHRlclNldHRpbmdzOjpwZXNEYXRhPigpLnN0cmVhbUlkKSwKLSAgICAgICAgLmlzUmF3ID0gc2V0dGluZ3MuZ2V0PFR1bmVyRmlsdGVyU2V0dGluZ3M6OnBlc0RhdGE+KCkuaXNSYXcsCi0gICAgfTsKLSAgICByZXR1cm4gcGVzOwotfQotCi1EZW11eEZpbHRlclJlY29yZFNldHRpbmdzIFR1bmVyRmlsdGVyOjpnZXRSZWNvcmRTZXR0aW5ncyhjb25zdCBUdW5lckZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgewotICAgIGF1dG8gciA9IHNldHRpbmdzLmdldDxUdW5lckZpbHRlclNldHRpbmdzOjpyZWNvcmQ+KCk7Ci0gICAgRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyByZWNvcmR7Ci0gICAgICAgIC50c0luZGV4TWFzayA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyLnRzSW5kZXhNYXNrKSwKLSAgICAgICAgLnNjSW5kZXhUeXBlID0gc3RhdGljX2Nhc3Q8RGVtdXhSZWNvcmRTY0luZGV4VHlwZT4oci5zY0luZGV4VHlwZSksCi0gICAgfTsKLQotICAgIHN3aXRjaCAoci5zY0luZGV4TWFzay5nZXRUYWcoKSkgewotICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2NJbmRleE1hc2s6OnNjOiB7Ci0gICAgICAgICAgICByZWNvcmQuc2NJbmRleE1hc2suc2Moc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAotICAgICAgICAgICAgICAgICAgICByLnNjSW5kZXhNYXNrLmdldDxUdW5lckZpbHRlclNjSW5kZXhNYXNrOjpzYz4oKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZpbHRlclNjSW5kZXhNYXNrOjpzY0hldmM6IHsKLSAgICAgICAgICAgIHJlY29yZC5zY0luZGV4TWFzay5zY0hldmMoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAotICAgICAgICAgICAgICAgICAgICByLnNjSW5kZXhNYXNrLmdldDxUdW5lckZpbHRlclNjSW5kZXhNYXNrOjpzY0hldmM+KCkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZWNvcmQ7Ci19Ci0KLURlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5ncyBUdW5lckZpbHRlcjo6Z2V0RG93bmxvYWRTZXR0aW5ncyhjb25zdCBUdW5lckZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgewotICAgIERlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5ncyBkb3dubG9hZCB7Ci0gICAgICAgIC5kb3dubG9hZElkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAotICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZpbHRlclNldHRpbmdzOjpkb3dubG9hZD4oKS5kb3dubG9hZElkKSwKLSAgICB9OwotICAgIHJldHVybiBkb3dubG9hZDsKLX0KLQotU3RhdHVzIFR1bmVyRmlsdGVyOjpnZXRBdlNoYXJlZEhhbmRsZUluZm8oVHVuZXJGaWx0ZXJTaGFyZWRIYW5kbGVJbmZvKiBfYWlkbF9yZXR1cm4pIHsKLSAgICBpZiAobUZpbHRlcl8xXzEgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiSUZpbHRlcl8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzOwotICAgIG1GaWx0ZXJfMV8xLT5nZXRBdlNoYXJlZEhhbmRsZShbJl0oUmVzdWx0IHIsIGhpZGxfaGFuZGxlIGF2TWVtb3J5LCB1aW50NjRfdCBhdk1lbVNpemUpIHsKLSAgICAgICAgcmVzID0gcjsKLSAgICAgICAgaWYgKHJlcyA9PSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgICAgIFR1bmVyRmlsdGVyU2hhcmVkSGFuZGxlSW5mbyBpbmZvewotICAgICAgICAgICAgICAgIC5oYW5kbGUgPSBkdXBUb0FpZGwoYXZNZW1vcnkpLAotICAgICAgICAgICAgICAgIC5zaXplID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oYXZNZW1TaXplKSwKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAqX2FpZGxfcmV0dXJuID0gbW92ZShpbmZvKTsKKyAgICBhdXRvIHN0YXR1cyA9IG1GaWx0ZXItPmdldElkNjRCaXQoJm1JZDY0Qml0KTsKKyAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gbUlkNjRCaXQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpjb25maWd1cmUoY29uc3QgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgaW5fc2V0dGluZ3MpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIHJldHVybiBtRmlsdGVyLT5jb25maWd1cmUoaW5fc2V0dGluZ3MpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6Y29uZmlndXJlTW9uaXRvckV2ZW50KGludDMyX3QgbW9uaXRvckV2ZW50VHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1GaWx0ZXItPmNvbmZpZ3VyZU1vbml0b3JFdmVudChtb25pdG9yRXZlbnRUeXBlKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OmNvbmZpZ3VyZUlwRmlsdGVyQ29udGV4dElkKGludDMyX3QgY2lkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUZpbHRlci0+Y29uZmlndXJlSXBDaWQoY2lkKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OmNvbmZpZ3VyZUF2U3RyZWFtVHlwZShjb25zdCBBdlN0cmVhbVR5cGUmIGluX2F2U3RyZWFtVHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgcmV0dXJuIG1GaWx0ZXItPmNvbmZpZ3VyZUF2U3RyZWFtVHlwZShpbl9hdlN0cmVhbVR5cGUpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGZpbHRlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChmaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlQpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIHNoYXJlZF9wdHI8SUZpbHRlcj4gaGFsRmlsdGVyID0gc3RhdGljX2Nhc3Q8VHVuZXJGaWx0ZXIqPihmaWx0ZXIuZ2V0KCkpLT5nZXRIYWxGaWx0ZXIoKTsKKyAgICByZXR1cm4gbUZpbHRlci0+c2V0RGF0YVNvdXJjZShoYWxGaWx0ZXIpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6Z2V0QXZTaGFyZWRIYW5kbGUoTmF0aXZlSGFuZGxlKiBvdXRfYXZNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUZpbHRlci0+Z2V0QXZTaGFyZWRIYW5kbGUob3V0X2F2TWVtb3J5LCBfYWlkbF9yZXR1cm4pOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6cmVsZWFzZUF2SGFuZGxlKGNvbnN0IE5hdGl2ZUhhbmRsZSYgaW5faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGluX2F2RGF0YUlkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUZpbHRlci0+cmVsZWFzZUF2SGFuZGxlKGluX2hhbmRsZSwgaW5fYXZEYXRhSWQpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6c3RhcnQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgICAgIGludDMyX3QgY2FsbGluZ1BpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBpZiAoY2FsbGluZ1BpZCA9PSBtQ2xpZW50UGlkKSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIGluIHdyb25nIHByb2Nlc3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgICAgICB9CisgICAgfQorCisgICAgYXV0byByZXMgPSBtRmlsdGVyLT5zdGFydCgpOworICAgIGlmIChyZXMuaXNPaygpKSB7CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OnN0b3AoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgICAgIGludDMyX3QgY2FsbGluZ1BpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBpZiAoY2FsbGluZ1BpZCA9PSBtQ2xpZW50UGlkKSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIGluIHdyb25nIHByb2Nlc3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgICAgICB9CisgICAgfQorCisgICAgYXV0byByZXMgPSBtRmlsdGVyLT5zdG9wKCk7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHJldHVybiByZXM7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpmbHVzaCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICAgICAgaW50MzJfdCBjYWxsaW5nUGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIGlmIChjYWxsaW5nUGlkID09IG1DbGllbnRQaWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgaW4gd3JvbmcgcHJvY2VzcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbUZpbHRlci0+Zmx1c2goKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OmNsb3NlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgICAgICBpbnQzMl90IGNhbGxpbmdQaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgaWYgKGNhbGxpbmdQaWQgPT0gbUNsaWVudFBpZCkgeworICAgICAgICAgICAgaWYgKG1GaWx0ZXJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbUZpbHRlckNhbGxiYWNrLT5zZW5kU2hhcmVkRmlsdGVyU3RhdHVzKFNUQVRVU19JTkFDQ0VTU0lCTEUpOworICAgICAgICAgICAgICAgIG1GaWx0ZXJDYWxsYmFjay0+ZGV0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFR1bmVyU2VydmljZTo6Z2V0VHVuZXJTZXJ2aWNlKCktPnJlbW92ZVNoYXJlZEZpbHRlcih0aGlzLT5yZWY8VHVuZXJGaWx0ZXI+KCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX2FpZGxfcmV0dXJuID0gTlVMTDsKKyAgICAgICAgICAgIC8vIENhbGxpbmcgZnJvbSBzaGFyZWQgcHJvY2VzcywgZG8gbm90IHJlYWxseSBjbG9zZSB0aGlzIGZpbHRlci4KKyAgICAgICAgICAgIGlmIChtRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1GaWx0ZXJDYWxsYmFjay0+ZGV0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiAgICAgICAgIH0KLSAgICB9KTsKLQotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKICAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKworICAgIGlmIChtRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPmRldGFjaENhbGxiYWNrcygpOworICAgIH0KKyAgICBhdXRvIHJlcyA9IG1GaWx0ZXItPmNsb3NlKCk7CisgICAgbUZpbHRlciA9IG51bGxwdHI7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtU2hhcmVkID0gZmFsc2U7CisgICAgbUNsaWVudFBpZCA9IC0xOworCisgICAgcmV0dXJuIHJlczsKIH0KIAotU3RhdHVzIFR1bmVyRmlsdGVyOjpyZWxlYXNlQXZIYW5kbGUoCi0gICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlJiBoYW5kbGUsIGludDY0X3QgYXZEYXRhSWQpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjphY3F1aXJlU2hhcmVkRmlsdGVyVG9rZW4oc3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzID0gbUZpbHRlci0+cmVsZWFzZUF2SGFuZGxlKGhpZGxfaGFuZGxlKG1ha2VGcm9tQWlkbChoYW5kbGUpKSwgYXZEYXRhSWQpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICBpZiAobVNoYXJlZCB8fCBtU3RhcnRlZCkgeworICAgICAgICBBTE9HRCgiY3JlYXRlIFNoYXJlZEZpbHRlciBpbiB3cm9uZyBzdGF0ZSIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKICAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKworICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgIG1DbGllbnRQaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICBzdHJpbmcgdG9rZW4gPSBUdW5lclNlcnZpY2U6OmdldFR1bmVyU2VydmljZSgpLT5hZGRGaWx0ZXJUb1NoYXJlZCh0aGlzLT5yZWY8VHVuZXJGaWx0ZXI+KCkpOworICAgIF9haWRsX3JldHVybi0+YXNzaWduKHRva2VuKTsKKyAgICBtU2hhcmVkID0gdHJ1ZTsKKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIFR1bmVyRmlsdGVyOjpzdGFydCgpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpmcmVlU2hhcmVkRmlsdGVyVG9rZW4oY29uc3Qgc3RyaW5nJiAvKiBpbl9maWx0ZXJUb2tlbiAqLykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KLSAgICBSZXN1bHQgcmVzID0gbUZpbHRlci0+c3RhcnQoKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisKKyAgICBpZiAoIW1TaGFyZWQpIHsKKyAgICAgICAgLy8gVGhlIGZpbHRlciBpcyBub3Qgc2hhcmVkIG9yIHRoZSBzaGFyZWQgZmlsdGVyIGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOwogICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworCisgICAgaWYgKG1GaWx0ZXJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1GaWx0ZXJDYWxsYmFjay0+c2VuZFNoYXJlZEZpbHRlclN0YXR1cyhTVEFUVVNfSU5BQ0NFU1NJQkxFKTsKKyAgICAgICAgbUZpbHRlckNhbGxiYWNrLT5kZXRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjaygpOworICAgIH0KKworICAgIFR1bmVyU2VydmljZTo6Z2V0VHVuZXJTZXJ2aWNlKCktPnJlbW92ZVNoYXJlZEZpbHRlcih0aGlzLT5yZWY8VHVuZXJGaWx0ZXI+KCkpOworICAgIG1TaGFyZWQgPSBmYWxzZTsKKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKIH0KIAotU3RhdHVzIFR1bmVyRmlsdGVyOjpzdG9wKCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OmdldEZpbHRlclR5cGUoRGVtdXhGaWx0ZXJUeXBlKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9Ci0gICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXItPnN0b3AoKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisKKyAgICAqX2FpZGxfcmV0dXJuID0gbVR5cGU7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOwogfQogCi1TdGF0dXMgVHVuZXJGaWx0ZXI6OmZsdXNoKCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGaWx0ZXI6OnNldERlbGF5SGludChjb25zdCBGaWx0ZXJEZWxheUhpbnQmIGluX2hpbnQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9Ci0gICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXItPmZsdXNoKCk7Ci0gICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworCisgICAgcmV0dXJuIG1GaWx0ZXItPnNldERlbGF5SGludChpbl9oaW50KTsKIH0KIAotU3RhdHVzIFR1bmVyRmlsdGVyOjpjbG9zZSgpIHsKLSAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwotICAgIH0KLSAgICBSZXN1bHQgcmVzID0gbUZpbHRlci0+Y2xvc2UoKTsKLSAgICBtRmlsdGVyID0gTlVMTDsKLSAgICBtRmlsdGVyXzFfMSA9IE5VTEw7Ci0KLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Citib29sIFR1bmVyRmlsdGVyOjppc1NoYXJlZEZpbHRlckFsbG93ZWQoaW50IGNhbGxpbmdQaWQpIHsKKyAgICByZXR1cm4gbVNoYXJlZCAmJiBtQ2xpZW50UGlkICE9IGNhbGxpbmdQaWQ7CiB9CiAKLXNwPElGaWx0ZXI+IFR1bmVyRmlsdGVyOjpnZXRIYWxGaWx0ZXIoKSB7Cit2b2lkIFR1bmVyRmlsdGVyOjphdHRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgaW5fY2IpIHsKKyAgICBpZiAobUZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUZpbHRlckNhbGxiYWNrLT5hdHRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjayhpbl9jYik7CisgICAgfQorfQorCitzaGFyZWRfcHRyPElGaWx0ZXI+IFR1bmVyRmlsdGVyOjpnZXRIYWxGaWx0ZXIoKSB7CiAgICAgcmV0dXJuIG1GaWx0ZXI7CiB9CiAKLWJvb2wgVHVuZXJGaWx0ZXI6OmlzQXVkaW9GaWx0ZXIoKSB7Ci0gICAgcmV0dXJuIChtTWFpblR5cGUgPT0gKGludClEZW11eEZpbHRlck1haW5UeXBlOjpUUwotICAgICAgICAgICAgICAgICAgICAmJiBtU3ViVHlwZSA9PSAoaW50KURlbXV4VHNGaWx0ZXJUeXBlOjpBVURJTykKLSAgICAgICAgICAgIHx8IChtTWFpblR5cGUgPT0gKGludClEZW11eEZpbHRlck1haW5UeXBlOjpNTVRQCi0gICAgICAgICAgICAgICAgICAgICYmIG1TdWJUeXBlID09IChpbnQpRGVtdXhNbXRwRmlsdGVyVHlwZTo6QVVESU8pOwotfQotCi1ib29sIFR1bmVyRmlsdGVyOjppc1ZpZGVvRmlsdGVyKCkgewotICAgIHJldHVybiAobU1haW5UeXBlID09IChpbnQpRGVtdXhGaWx0ZXJNYWluVHlwZTo6VFMKLSAgICAgICAgICAgICAgICAgICAgJiYgbVN1YlR5cGUgPT0gKGludClEZW11eFRzRmlsdGVyVHlwZTo6VklERU8pCi0gICAgICAgICAgICB8fCAobU1haW5UeXBlID09IChpbnQpRGVtdXhGaWx0ZXJNYWluVHlwZTo6TU1UUAotICAgICAgICAgICAgICAgICAgICAmJiBtU3ViVHlwZSA9PSAoaW50KURlbXV4TW10cEZpbHRlclR5cGU6OlZJREVPKTsKLX0KLQotYm9vbCBUdW5lckZpbHRlcjo6Z2V0SGlkbEF2U3RyZWFtVHlwZShpbnQgYXZTdHJlYW1UeXBlLCBBdlN0cmVhbVR5cGUmIHR5cGUpIHsKLSAgICBpZiAoaXNBdWRpb0ZpbHRlcigpKSB7Ci0gICAgICAgIHR5cGUuYXVkaW8oc3RhdGljX2Nhc3Q8QXVkaW9TdHJlYW1UeXBlPihhdlN0cmVhbVR5cGUpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKGlzVmlkZW9GaWx0ZXIoKSkgewotICAgICAgICB0eXBlLnZpZGVvKHN0YXRpY19jYXN0PFZpZGVvU3RyZWFtVHlwZT4oYXZTdHJlYW1UeXBlKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQogLy8vLy8vLy8vLy8vLy8vIEZpbHRlckNhbGxiYWNrIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVJldHVybjx2b2lkPiBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6Om9uRmlsdGVyU3RhdHVzKERlbXV4RmlsdGVyU3RhdHVzIHN0YXR1cykgewotICAgIGlmIChtVHVuZXJGaWx0ZXJDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIG1UdW5lckZpbHRlckNhbGxiYWNrLT5vbkZpbHRlclN0YXR1cygoaW50KXN0YXR1cyk7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6Om9uRmlsdGVyU3RhdHVzKERlbXV4RmlsdGVyU3RhdHVzIHN0YXR1cykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKKyAgICBpZiAobVR1bmVyRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJGaWx0ZXJDYWxsYmFjay0+b25GaWx0ZXJTdGF0dXMoc3RhdHVzKTsKICAgICB9Ci0gICAgcmV0dXJuIFZvaWQoKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CiAKLVJldHVybjx2b2lkPiBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6Om9uRmlsdGVyRXZlbnQoY29uc3QgRGVtdXhGaWx0ZXJFdmVudCYgZmlsdGVyRXZlbnQpIHsKLSAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+IGVtcHR5RXZlbnRzRXh0OwotICAgIERlbXV4RmlsdGVyRXZlbnRFeHQgZW1wdHlGaWx0ZXJFdmVudEV4dCB7Ci0gICAgICAgICAgICAuZXZlbnRzID0gZW1wdHlFdmVudHNFeHQsCi0gICAgfTsKLSAgICBvbkZpbHRlckV2ZW50XzFfMShmaWx0ZXJFdmVudCwgZW1wdHlGaWx0ZXJFdmVudEV4dCk7Ci0gICAgcmV0dXJuIFZvaWQoKTsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6b25GaWx0ZXJFdmVudCgKKyAgICAgICAgY29uc3QgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiBldmVudHMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgaWYgKG1UdW5lckZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVR1bmVyRmlsdGVyQ2FsbGJhY2stPm9uRmlsdGVyRXZlbnQoZXZlbnRzKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOwogfQogCi1SZXR1cm48dm9pZD4gVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpvbkZpbHRlckV2ZW50XzFfMShjb25zdCBEZW11eEZpbHRlckV2ZW50JiBmaWx0ZXJFdmVudCwKLSAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJFdmVudEV4dCYgZmlsdGVyRXZlbnRFeHQpIHsKLSAgICBpZiAobVR1bmVyRmlsdGVyQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+IGV2ZW50cyA9IGZpbHRlckV2ZW50LmV2ZW50czsKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiBldmVudHNFeHQgPSBmaWx0ZXJFdmVudEV4dC5ldmVudHM7Ci0gICAgICAgIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiB0dW5lckV2ZW50OwotCi0gICAgICAgIGdldEFpZGxGaWx0ZXJFdmVudChldmVudHMsIGV2ZW50c0V4dCwgdHVuZXJFdmVudCk7Ci0gICAgICAgIG1UdW5lckZpbHRlckNhbGxiYWNrLT5vbkZpbHRlckV2ZW50KHR1bmVyRXZlbnQpOwotICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8gRmlsdGVyQ2FsbGJhY2sgSGVscGVyIE1ldGhvZHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotdm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldEFpZGxGaWx0ZXJFdmVudCh2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCi0gICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwKLSAgICAgICAgdmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiB0dW5lckV2ZW50KSB7Ci0gICAgaWYgKGV2ZW50cy5lbXB0eSgpICYmICFldmVudHNFeHQuZW1wdHkoKSkgewotICAgICAgICBhdXRvIGV2ZW50RXh0ID0gZXZlbnRzRXh0WzBdOwotICAgICAgICBzd2l0Y2ggKGV2ZW50RXh0LmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgY2FzZSBEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjptb25pdG9yRXZlbnQ6IHsKLSAgICAgICAgICAgICAgICBnZXRNb25pdG9yRXZlbnQoZXZlbnRzRXh0LCB0dW5lckV2ZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnN0YXJ0SWQ6IHsKLSAgICAgICAgICAgICAgICBnZXRSZXN0YXJ0RXZlbnQoZXZlbnRzRXh0LCB0dW5lckV2ZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghZXZlbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgYXV0byBldmVudCA9IGV2ZW50c1swXTsKLSAgICAgICAgc3dpdGNoIChldmVudC5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6bWVkaWE6IHsKLSAgICAgICAgICAgICAgICBnZXRNZWRpYUV2ZW50KGV2ZW50cywgdHVuZXJFdmVudCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnNlY3Rpb246IHsKLSAgICAgICAgICAgICAgICBnZXRTZWN0aW9uRXZlbnQoZXZlbnRzLCB0dW5lckV2ZW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6cGVzOiB7Ci0gICAgICAgICAgICAgICAgZ2V0UGVzRXZlbnQoZXZlbnRzLCB0dW5lckV2ZW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6dHNSZWNvcmQ6IHsKLSAgICAgICAgICAgICAgICBnZXRUc1JlY29yZEV2ZW50KGV2ZW50cywgZXZlbnRzRXh0LCB0dW5lckV2ZW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6bW10cFJlY29yZDogewotICAgICAgICAgICAgICAgIGdldE1tdHBSZWNvcmRFdmVudChldmVudHMsIGV2ZW50c0V4dCwgdHVuZXJFdmVudCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmRvd25sb2FkOiB7Ci0gICAgICAgICAgICAgICAgZ2V0RG93bmxvYWRFdmVudChldmVudHMsIHR1bmVyRXZlbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjppcFBheWxvYWQ6IHsKLSAgICAgICAgICAgICAgICBnZXRJcFBheWxvYWRFdmVudChldmVudHMsIHR1bmVyRXZlbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjp0ZW1pOiB7Ci0gICAgICAgICAgICAgICAgZ2V0VGVtaUV2ZW50KGV2ZW50cywgdHVuZXJFdmVudCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK3ZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpzZW5kU2hhcmVkRmlsdGVyU3RhdHVzKGludDMyX3Qgc3RhdHVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOworICAgIGlmIChtVHVuZXJGaWx0ZXJDYWxsYmFjayAhPSBudWxscHRyICYmIG1PcmlnaW5hbENhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVR1bmVyRmlsdGVyQ2FsbGJhY2stPm9uRmlsdGVyU3RhdHVzKHN0YXRpY19jYXN0PERlbXV4RmlsdGVyU3RhdHVzPihzdGF0dXMpKTsKICAgICB9CiB9CiAKLXZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRNZWRpYUV2ZW50KAotICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7Ci0gICAgZm9yIChEZW11eEZpbHRlckV2ZW50OjpFdmVudCBlIDogZXZlbnRzKSB7Ci0gICAgICAgIERlbXV4RmlsdGVyTWVkaWFFdmVudCBtZWRpYUV2ZW50ID0gZS5tZWRpYSgpOwotICAgICAgICBUdW5lckZpbHRlck1lZGlhRXZlbnQgdHVuZXJNZWRpYTsKK3ZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjphdHRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOworICAgIG1PcmlnaW5hbENhbGxiYWNrID0gbVR1bmVyRmlsdGVyQ2FsbGJhY2s7CisgICAgbVR1bmVyRmlsdGVyQ2FsbGJhY2sgPSBpbl9jYjsKK30KIAotICAgICAgICB0dW5lck1lZGlhLnN0cmVhbUlkID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KG1lZGlhRXZlbnQuc3RyZWFtSWQpOwotICAgICAgICB0dW5lck1lZGlhLmlzUHRzUHJlc2VudCA9IG1lZGlhRXZlbnQuaXNQdHNQcmVzZW50OwotICAgICAgICB0dW5lck1lZGlhLnB0cyA9IHN0YXRpY19jYXN0PGxvbmc+KG1lZGlhRXZlbnQucHRzKTsKLSAgICAgICAgdHVuZXJNZWRpYS5kYXRhTGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50PihtZWRpYUV2ZW50LmRhdGFMZW5ndGgpOwotICAgICAgICB0dW5lck1lZGlhLm9mZnNldCA9IHN0YXRpY19jYXN0PGludD4obWVkaWFFdmVudC5vZmZzZXQpOwotICAgICAgICB0dW5lck1lZGlhLmlzU2VjdXJlTWVtb3J5ID0gbWVkaWFFdmVudC5pc1NlY3VyZU1lbW9yeTsKLSAgICAgICAgdHVuZXJNZWRpYS5hdkRhdGFJZCA9IHN0YXRpY19jYXN0PGxvbmc+KG1lZGlhRXZlbnQuYXZEYXRhSWQpOwotICAgICAgICB0dW5lck1lZGlhLm1wdVNlcXVlbmNlTnVtYmVyID0gc3RhdGljX2Nhc3Q8aW50PihtZWRpYUV2ZW50Lm1wdVNlcXVlbmNlTnVtYmVyKTsKLSAgICAgICAgdHVuZXJNZWRpYS5pc1Blc1ByaXZhdGVEYXRhID0gbWVkaWFFdmVudC5pc1Blc1ByaXZhdGVEYXRhOwotCi0gICAgICAgIGlmIChtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuZ2V0RGlzY3JpbWluYXRvcigpID09Ci0gICAgICAgICAgICAgICAgRGVtdXhGaWx0ZXJNZWRpYUV2ZW50OjpFeHRyYU1ldGFEYXRhOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF1ZGlvKSB7Ci0gICAgICAgICAgICB0dW5lck1lZGlhLmlzQXVkaW9FeHRyYU1ldGFEYXRhID0gdHJ1ZTsKLSAgICAgICAgICAgIHR1bmVyTWVkaWEuYXVkaW8gPSB7Ci0gICAgICAgICAgICAgICAgLmFkRmFkZSA9IHN0YXRpY19jYXN0PGludDhfdD4oCi0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS5hZEZhZGUpLAotICAgICAgICAgICAgICAgIC5hZFBhbiA9IHN0YXRpY19jYXN0PGludDhfdD4oCi0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS5hZFBhbiksCi0gICAgICAgICAgICAgICAgLnZlcnNpb25UZXh0VGFnID0gc3RhdGljX2Nhc3Q8aW50OF90PigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5hdWRpbygpLnZlcnNpb25UZXh0VGFnKSwKLSAgICAgICAgICAgICAgICAuYWRHYWluQ2VudGVyID0gc3RhdGljX2Nhc3Q8aW50OF90PigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5hdWRpbygpLmFkR2FpbkNlbnRlciksCi0gICAgICAgICAgICAgICAgLmFkR2FpbkZyb250ID0gc3RhdGljX2Nhc3Q8aW50OF90PigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5hdWRpbygpLmFkR2FpbkZyb250KSwKLSAgICAgICAgICAgICAgICAuYWRHYWluU3Vycm91bmQgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KAotICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmF1ZGlvKCkuYWRHYWluU3Vycm91bmQpLAotICAgICAgICAgICAgfTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHR1bmVyTWVkaWEuaXNBdWRpb0V4dHJhTWV0YURhdGEgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZWRpYUV2ZW50LmF2TWVtb3J5LmdldE5hdGl2ZUhhbmRsZSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHR1bmVyTWVkaWEuYXZNZW1vcnkgPSBkdXBUb0FpZGwobWVkaWFFdmVudC5hdk1lbW9yeS5nZXROYXRpdmVIYW5kbGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBUdW5lckZpbHRlckV2ZW50IHR1bmVyRXZlbnQ7Ci0gICAgICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6Om1lZGlhPihtb3ZlKHR1bmVyTWVkaWEpKTsKLSAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKHR1bmVyRXZlbnQpKTsKK3ZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpkZXRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjaygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgaWYgKG1UdW5lckZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIgJiYgbU9yaWdpbmFsQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJGaWx0ZXJDYWxsYmFjayA9IG1PcmlnaW5hbENhbGxiYWNrOworICAgICAgICBtT3JpZ2luYWxDYWxsYmFjayA9IG51bGxwdHI7CiAgICAgfQogfQogCi12b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0U2VjdGlvbkV2ZW50KAotICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7Ci0gICAgZm9yIChEZW11eEZpbHRlckV2ZW50OjpFdmVudCBlIDogZXZlbnRzKSB7Ci0gICAgICAgIERlbXV4RmlsdGVyU2VjdGlvbkV2ZW50IHNlY3Rpb25FdmVudCA9IGUuc2VjdGlvbigpOwotICAgICAgICBUdW5lckZpbHRlclNlY3Rpb25FdmVudCB0dW5lclNlY3Rpb247Ci0KLSAgICAgICAgdHVuZXJTZWN0aW9uLnRhYmxlSWQgPSBzdGF0aWNfY2FzdDxjaGFyMTZfdD4oc2VjdGlvbkV2ZW50LnRhYmxlSWQpOwotICAgICAgICB0dW5lclNlY3Rpb24udmVyc2lvbiA9IHN0YXRpY19jYXN0PGNoYXIxNl90PihzZWN0aW9uRXZlbnQudmVyc2lvbik7Ci0gICAgICAgIHR1bmVyU2VjdGlvbi5zZWN0aW9uTnVtID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KHNlY3Rpb25FdmVudC5zZWN0aW9uTnVtKTsKLSAgICAgICAgdHVuZXJTZWN0aW9uLmRhdGFMZW5ndGggPSBzdGF0aWNfY2FzdDxjaGFyMTZfdD4oc2VjdGlvbkV2ZW50LmRhdGFMZW5ndGgpOwotCi0gICAgICAgIFR1bmVyRmlsdGVyRXZlbnQgdHVuZXJFdmVudDsKLSAgICAgICAgdHVuZXJFdmVudC5zZXQ8VHVuZXJGaWx0ZXJFdmVudDo6c2VjdGlvbj4obW92ZSh0dW5lclNlY3Rpb24pKTsKLSAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKHR1bmVyRXZlbnQpKTsKLSAgICB9Cit2b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6ZGV0YWNoQ2FsbGJhY2tzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKKyAgICBtT3JpZ2luYWxDYWxsYmFjayA9IG51bGxwdHI7CisgICAgbVR1bmVyRmlsdGVyQ2FsbGJhY2sgPSBudWxscHRyOwogfQogCi12b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0UGVzRXZlbnQoCi0gICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgdmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpIHsKLSAgICBmb3IgKERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50IGUgOiBldmVudHMpIHsKLSAgICAgICAgRGVtdXhGaWx0ZXJQZXNFdmVudCBwZXNFdmVudCA9IGUucGVzKCk7Ci0gICAgICAgIFR1bmVyRmlsdGVyUGVzRXZlbnQgdHVuZXJQZXM7Ci0KLSAgICAgICAgdHVuZXJQZXMuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDxjaGFyMTZfdD4ocGVzRXZlbnQuc3RyZWFtSWQpOwotICAgICAgICB0dW5lclBlcy5kYXRhTGVuZ3RoID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KHBlc0V2ZW50LmRhdGFMZW5ndGgpOwotICAgICAgICB0dW5lclBlcy5tcHVTZXF1ZW5jZU51bWJlciA9IHN0YXRpY19jYXN0PGludD4ocGVzRXZlbnQubXB1U2VxdWVuY2VOdW1iZXIpOwotCi0gICAgICAgIFR1bmVyRmlsdGVyRXZlbnQgdHVuZXJFdmVudDsKLSAgICAgICAgdHVuZXJFdmVudC5zZXQ8VHVuZXJGaWx0ZXJFdmVudDo6cGVzPihtb3ZlKHR1bmVyUGVzKSk7Ci0gICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZSh0dW5lckV2ZW50KSk7Ci0gICAgfQotfQotCi12b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0VHNSZWNvcmRFdmVudCh2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCi0gICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwgdmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5zaXplKCk7IGkrKykgewotICAgICAgICBUdW5lckZpbHRlclRzUmVjb3JkRXZlbnQgdHVuZXJUc1JlY29yZDsKLSAgICAgICAgRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50IHRzUmVjb3JkRXZlbnQgPSBldmVudHNbaV0udHNSZWNvcmQoKTsKLQotICAgICAgICBUdW5lckZpbHRlclNjSW5kZXhNYXNrIHNjSW5kZXhNYXNrOwotICAgICAgICBpZiAodHNSZWNvcmRFdmVudC5zY0luZGV4TWFzay5nZXREaXNjcmltaW5hdG9yKCkKLSAgICAgICAgICAgICAgICA9PSBEZW11eEZpbHRlclRzUmVjb3JkRXZlbnQ6OlNjSW5kZXhNYXNrOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnNjKSB7Ci0gICAgICAgICAgICBzY0luZGV4TWFzay5zZXQ8VHVuZXJGaWx0ZXJTY0luZGV4TWFzazo6c2M+KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHRzUmVjb3JkRXZlbnQuc2NJbmRleE1hc2suc2MoKSkpOwotICAgICAgICB9IGVsc2UgaWYgKHRzUmVjb3JkRXZlbnQuc2NJbmRleE1hc2suZ2V0RGlzY3JpbWluYXRvcigpCi0gICAgICAgICAgICAgICAgPT0gRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50OjpTY0luZGV4TWFzazo6aGlkbF9kaXNjcmltaW5hdG9yOjpzY0hldmMpIHsKLSAgICAgICAgICAgIHNjSW5kZXhNYXNrLnNldDxUdW5lckZpbHRlclNjSW5kZXhNYXNrOjpzY0hldmM+KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHRzUmVjb3JkRXZlbnQuc2NJbmRleE1hc2suc2NIZXZjKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0c1JlY29yZEV2ZW50LnBpZC5nZXREaXNjcmltaW5hdG9yKCkgPT0gRGVtdXhQaWQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6dFBpZCkgewotICAgICAgICAgICAgdHVuZXJUc1JlY29yZC5waWQgPSBzdGF0aWNfY2FzdDxjaGFyMTZfdD4odHNSZWNvcmRFdmVudC5waWQudFBpZCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHR1bmVyVHNSZWNvcmQucGlkID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KENvbnN0YW50OjpJTlZBTElEX1RTX1BJRCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0dW5lclRzUmVjb3JkLnNjSW5kZXhNYXNrID0gc2NJbmRleE1hc2s7Ci0gICAgICAgIHR1bmVyVHNSZWNvcmQudHNJbmRleE1hc2sgPSBzdGF0aWNfY2FzdDxpbnQ+KHRzUmVjb3JkRXZlbnQudHNJbmRleE1hc2spOwotICAgICAgICB0dW5lclRzUmVjb3JkLmJ5dGVOdW1iZXIgPSBzdGF0aWNfY2FzdDxsb25nPih0c1JlY29yZEV2ZW50LmJ5dGVOdW1iZXIpOwotCi0gICAgICAgIGlmIChldmVudHNFeHQuc2l6ZSgpID4gaSAmJiBldmVudHNFeHRbaV0uZ2V0RGlzY3JpbWluYXRvcigpID09Ci0gICAgICAgICAgICAgICAgICAgIERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRzUmVjb3JkKSB7Ci0gICAgICAgICAgICB0dW5lclRzUmVjb3JkLmlzRXh0ZW5kZWQgPSB0cnVlOwotICAgICAgICAgICAgdHVuZXJUc1JlY29yZC5wdHMgPSBzdGF0aWNfY2FzdDxsb25nPihldmVudHNFeHRbaV0udHNSZWNvcmQoKS5wdHMpOwotICAgICAgICAgICAgdHVuZXJUc1JlY29yZC5maXJzdE1iSW5TbGljZSA9IHN0YXRpY19jYXN0PGludD4oZXZlbnRzRXh0W2ldLnRzUmVjb3JkKCkuZmlyc3RNYkluU2xpY2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHVuZXJUc1JlY29yZC5pc0V4dGVuZGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBUdW5lckZpbHRlckV2ZW50IHR1bmVyRXZlbnQ7Ci0gICAgICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6OnRzUmVjb3JkPihtb3ZlKHR1bmVyVHNSZWNvcmQpKTsKLSAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKHR1bmVyRXZlbnQpKTsKLSAgICB9Ci19Ci0KLXZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRNbXRwUmVjb3JkRXZlbnQodmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAotICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgVHVuZXJGaWx0ZXJNbXRwUmVjb3JkRXZlbnQgdHVuZXJNbXRwUmVjb3JkOwotICAgICAgICBEZW11eEZpbHRlck1tdHBSZWNvcmRFdmVudCBtbXRwUmVjb3JkRXZlbnQgPSBldmVudHNbaV0ubW10cFJlY29yZCgpOwotCi0gICAgICAgIHR1bmVyTW10cFJlY29yZC5zY0hldmNJbmRleE1hc2sgPSBzdGF0aWNfY2FzdDxpbnQ+KG1tdHBSZWNvcmRFdmVudC5zY0hldmNJbmRleE1hc2spOwotICAgICAgICB0dW5lck1tdHBSZWNvcmQuYnl0ZU51bWJlciA9IHN0YXRpY19jYXN0PGxvbmc+KG1tdHBSZWNvcmRFdmVudC5ieXRlTnVtYmVyKTsKLQotICAgICAgICBpZiAoZXZlbnRzRXh0LnNpemUoKSA+IGkgJiYgZXZlbnRzRXh0W2ldLmdldERpc2NyaW1pbmF0b3IoKSA9PQotICAgICAgICAgICAgICAgICAgICBEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjptbXRwUmVjb3JkKSB7Ci0gICAgICAgICAgICB0dW5lck1tdHBSZWNvcmQuaXNFeHRlbmRlZCA9IHRydWU7Ci0gICAgICAgICAgICB0dW5lck1tdHBSZWNvcmQucHRzID0gc3RhdGljX2Nhc3Q8bG9uZz4oZXZlbnRzRXh0W2ldLm1tdHBSZWNvcmQoKS5wdHMpOwotICAgICAgICAgICAgdHVuZXJNbXRwUmVjb3JkLm1wdVNlcXVlbmNlTnVtYmVyID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihldmVudHNFeHRbaV0ubW10cFJlY29yZCgpLm1wdVNlcXVlbmNlTnVtYmVyKTsKLSAgICAgICAgICAgIHR1bmVyTW10cFJlY29yZC5maXJzdE1iSW5TbGljZSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oZXZlbnRzRXh0W2ldLm1tdHBSZWNvcmQoKS5maXJzdE1iSW5TbGljZSk7Ci0gICAgICAgICAgICB0dW5lck1tdHBSZWNvcmQudHNJbmRleE1hc2sgPSBzdGF0aWNfY2FzdDxpbnQ+KGV2ZW50c0V4dFtpXS5tbXRwUmVjb3JkKCkudHNJbmRleE1hc2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHVuZXJNbXRwUmVjb3JkLmlzRXh0ZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFR1bmVyRmlsdGVyRXZlbnQgdHVuZXJFdmVudDsKLSAgICAgICAgdHVuZXJFdmVudC5zZXQ8VHVuZXJGaWx0ZXJFdmVudDo6bW10cFJlY29yZD4obW92ZSh0dW5lck1tdHBSZWNvcmQpKTsKLSAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKHR1bmVyRXZlbnQpKTsKLSAgICB9Ci19Ci0KLXZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXREb3dubG9hZEV2ZW50KAotICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7Ci0gICAgZm9yIChEZW11eEZpbHRlckV2ZW50OjpFdmVudCBlIDogZXZlbnRzKSB7Ci0gICAgICAgIERlbXV4RmlsdGVyRG93bmxvYWRFdmVudCBkb3dubG9hZEV2ZW50ID0gZS5kb3dubG9hZCgpOwotICAgICAgICBUdW5lckZpbHRlckRvd25sb2FkRXZlbnQgdHVuZXJEb3dubG9hZDsKLQotICAgICAgICB0dW5lckRvd25sb2FkLml0ZW1JZCA9IHN0YXRpY19jYXN0PGludD4oZG93bmxvYWRFdmVudC5pdGVtSWQpOwotICAgICAgICB0dW5lckRvd25sb2FkLml0ZW1GcmFnbWVudEluZGV4ID0gc3RhdGljX2Nhc3Q8aW50Pihkb3dubG9hZEV2ZW50Lml0ZW1GcmFnbWVudEluZGV4KTsKLSAgICAgICAgdHVuZXJEb3dubG9hZC5tcHVTZXF1ZW5jZU51bWJlciA9IHN0YXRpY19jYXN0PGludD4oZG93bmxvYWRFdmVudC5tcHVTZXF1ZW5jZU51bWJlcik7Ci0gICAgICAgIHR1bmVyRG93bmxvYWQubGFzdEl0ZW1GcmFnbWVudEluZGV4ID0gc3RhdGljX2Nhc3Q8aW50Pihkb3dubG9hZEV2ZW50Lmxhc3RJdGVtRnJhZ21lbnRJbmRleCk7Ci0gICAgICAgIHR1bmVyRG93bmxvYWQuZGF0YUxlbmd0aCA9IHN0YXRpY19jYXN0PGNoYXIxNl90Pihkb3dubG9hZEV2ZW50LmRhdGFMZW5ndGgpOwotCi0gICAgICAgIFR1bmVyRmlsdGVyRXZlbnQgdHVuZXJFdmVudDsKLSAgICAgICAgdHVuZXJFdmVudC5zZXQ8VHVuZXJGaWx0ZXJFdmVudDo6ZG93bmxvYWQ+KG1vdmUodHVuZXJEb3dubG9hZCkpOwotICAgICAgICByZXMucHVzaF9iYWNrKG1vdmUodHVuZXJFdmVudCkpOwotICAgIH0KLX0KLQotdm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldElwUGF5bG9hZEV2ZW50KAotICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7Ci0gICAgZm9yIChEZW11eEZpbHRlckV2ZW50OjpFdmVudCBlIDogZXZlbnRzKSB7Ci0gICAgICAgIERlbXV4RmlsdGVySXBQYXlsb2FkRXZlbnQgaXBQYXlsb2FkRXZlbnQgPSBlLmlwUGF5bG9hZCgpOwotICAgICAgICBUdW5lckZpbHRlcklwUGF5bG9hZEV2ZW50IHR1bmVySXBQYXlsb2FkOwotCi0gICAgICAgIHR1bmVySXBQYXlsb2FkLmRhdGFMZW5ndGggPSBzdGF0aWNfY2FzdDxjaGFyMTZfdD4oaXBQYXlsb2FkRXZlbnQuZGF0YUxlbmd0aCk7Ci0KLSAgICAgICAgVHVuZXJGaWx0ZXJFdmVudCB0dW5lckV2ZW50OwotICAgICAgICB0dW5lckV2ZW50LnNldDxUdW5lckZpbHRlckV2ZW50OjppcFBheWxvYWQ+KG1vdmUodHVuZXJJcFBheWxvYWQpKTsKLSAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKHR1bmVyRXZlbnQpKTsKLSAgICB9Ci19Ci0KLXZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRUZW1pRXZlbnQoCi0gICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgdmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpIHsKLSAgICBmb3IgKERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50IGUgOiBldmVudHMpIHsKLSAgICAgICAgRGVtdXhGaWx0ZXJUZW1pRXZlbnQgdGVtaUV2ZW50ID0gZS50ZW1pKCk7Ci0gICAgICAgIFR1bmVyRmlsdGVyVGVtaUV2ZW50IHR1bmVyVGVtaTsKLQotICAgICAgICB0dW5lclRlbWkucHRzID0gc3RhdGljX2Nhc3Q8bG9uZz4odGVtaUV2ZW50LnB0cyk7Ci0gICAgICAgIHR1bmVyVGVtaS5kZXNjclRhZyA9IHN0YXRpY19jYXN0PGludDhfdD4odGVtaUV2ZW50LmRlc2NyVGFnKTsKLSAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IGRlc2NyRGF0YSA9IHRlbWlFdmVudC5kZXNjckRhdGE7Ci0gICAgICAgIHR1bmVyVGVtaS5kZXNjckRhdGEucmVzaXplKGRlc2NyRGF0YS5zaXplKCkpOwotICAgICAgICBjb3B5KGRlc2NyRGF0YS5iZWdpbigpLCBkZXNjckRhdGEuZW5kKCksIHR1bmVyVGVtaS5kZXNjckRhdGEuYmVnaW4oKSk7Ci0KLSAgICAgICAgVHVuZXJGaWx0ZXJFdmVudCB0dW5lckV2ZW50OwotICAgICAgICB0dW5lckV2ZW50LnNldDxUdW5lckZpbHRlckV2ZW50Ojp0ZW1pPihtb3ZlKHR1bmVyVGVtaSkpOwotICAgICAgICByZXMucHVzaF9iYWNrKG1vdmUodHVuZXJFdmVudCkpOwotICAgIH0KLX0KLQotdm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldE1vbml0b3JFdmVudCgKLSAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LCB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcykgewotICAgIERlbXV4RmlsdGVyTW9uaXRvckV2ZW50IG1vbml0b3JFdmVudCA9IGV2ZW50c0V4dFswXS5tb25pdG9yRXZlbnQoKTsKLSAgICBUdW5lckZpbHRlck1vbml0b3JFdmVudCB0dW5lck1vbml0b3I7Ci0KLSAgICBzd2l0Y2ggKG1vbml0b3JFdmVudC5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgY2FzZSBEZW11eEZpbHRlck1vbml0b3JFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzY3JhbWJsaW5nU3RhdHVzOiB7Ci0gICAgICAgICAgICB0dW5lck1vbml0b3Iuc2V0PFR1bmVyRmlsdGVyTW9uaXRvckV2ZW50OjpzY3JhbWJsaW5nU3RhdHVzPigKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihtb25pdG9yRXZlbnQuc2NyYW1ibGluZ1N0YXR1cygpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERlbXV4RmlsdGVyTW9uaXRvckV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmNpZDogewotICAgICAgICAgICAgdHVuZXJNb25pdG9yLnNldDxUdW5lckZpbHRlck1vbml0b3JFdmVudDo6Y2lkPihzdGF0aWNfY2FzdDxpbnQ+KG1vbml0b3JFdmVudC5jaWQoKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBUdW5lckZpbHRlckV2ZW50IHR1bmVyRXZlbnQ7Ci0gICAgdHVuZXJFdmVudC5zZXQ8VHVuZXJGaWx0ZXJFdmVudDo6bW9uaXRvcj4obW92ZSh0dW5lck1vbml0b3IpKTsKLSAgICByZXMucHVzaF9iYWNrKG1vdmUodHVuZXJFdmVudCkpOwotfQotCi12b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0UmVzdGFydEV2ZW50KAotICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7Ci0gICAgVHVuZXJGaWx0ZXJFdmVudCB0dW5lckV2ZW50OwotICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6OnN0YXJ0SWQ+KHN0YXRpY19jYXN0PGludD4oZXZlbnRzRXh0WzBdLnN0YXJ0SWQoKSkpOwotICAgIHJlcy5wdXNoX2JhY2sobW92ZSh0dW5lckV2ZW50KSk7Ci19Cit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRmlsdGVyLmggYi9zZXJ2aWNlcy90dW5lci9UdW5lckZpbHRlci5oCmluZGV4IGZmNDcyOGMuLjkzZDg4OTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRmlsdGVyLmgKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJGaWx0ZXIuaApAQCAtMTcsMTc2ICsxNywxMDggQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkZJTFRFUl9ICiAjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJGSUxURVJfSAogCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0F2U3RyZWFtVHlwZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9CbkZpbHRlckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyRXZlbnQuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJTZXR0aW5ncy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlclN0YXR1cy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlclR5cGUuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRmlsdGVyRGVsYXlIaW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lGaWx0ZXIuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lckZpbHRlci5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGaWx0ZXJDYWxsYmFjay5oPgotI2luY2x1ZGUgPGFpZGxjb21tb25zdXBwb3J0L05hdGl2ZUhhbmRsZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lUdW5lci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4xL0lGaWx0ZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMS9JRmlsdGVyQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMS90eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8Zm1xL0NvbnZlcnRNUURlc2NyaXB0b3JzLmg+Ci0jaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAKLXVzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGU7CiB1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6TVFEZXNjcmlwdG9yOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6OlN5bmNocm9uaXplZFJlYWRXcml0ZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6QXZTdHJlYW1UeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpCbkZpbHRlckNhbGxiYWNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlckV2ZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGaWx0ZXJEZWxheUhpbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OklGaWx0ZXI7CiB1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OkJuVHVuZXJGaWx0ZXI7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZpbHRlckNhbGxiYWNrOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckRlbXV4SXBBZGRyZXNzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlckNvbmZpZ3VyYXRpb247Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyRG93bmxvYWRFdmVudDsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJJcFBheWxvYWRFdmVudDsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJFdmVudDsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJNZWRpYUV2ZW50OwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlck1tdHBSZWNvcmRFdmVudDsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJNb25pdG9yRXZlbnQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyUGVzRXZlbnQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyU2NJbmRleE1hc2s7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyU2VjdGlvbkV2ZW50OwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclNoYXJlZEhhbmRsZUluZm87Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyU2V0dGluZ3M7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyVGVtaUV2ZW50OwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclRzUmVjb3JkRXZlbnQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4QWxwRmlsdGVyU2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyQXZTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJEb3dubG9hZEV2ZW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVySXBQYXlsb2FkRXZlbnQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyRXZlbnQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyTWVkaWFFdmVudDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJNbXRwUmVjb3JkRXZlbnQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclBlc0V2ZW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclJlY29yZFNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclNlY3Rpb25FdmVudDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyU2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyU3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclRlbWlFdmVudDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eElwRmlsdGVyU2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4TW10cEZpbHRlclNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRsdkZpbHRlclNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyU2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4UGlkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRmlsdGVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpBdlN0cmVhbVR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkRlbXV4RmlsdGVyRXZlbnRFeHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkRlbXV4RmlsdGVyTW9uaXRvckV2ZW50OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpEZW11eEZpbHRlclRzUmVjb3JkRXZlbnRFeHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklGaWx0ZXJDYWxsYmFjazsKK3VzaW5nIDo6YW5kcm9pZDo6TXV0ZXg7CiAKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAotdXNpbmcgTVFEZXNjID0gTVFEZXNjcmlwdG9yU3luYzx1aW50OF90PjsKIHVzaW5nIEFpZGxNUURlc2MgPSBNUURlc2NyaXB0b3I8aW50OF90LCBTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwogCi1jb25zdCBzdGF0aWMgaW50IElQX1Y0X0xFTkdUSCA9IDQ7Ci1jb25zdCBzdGF0aWMgaW50IElQX1Y2X0xFTkdUSCA9IDE2OwotCiBjbGFzcyBUdW5lckZpbHRlciA6IHB1YmxpYyBCblR1bmVyRmlsdGVyIHsKIAogcHVibGljOgotICAgIFR1bmVyRmlsdGVyKHNwPElGaWx0ZXI+IGZpbHRlciwgaW50IG1haW5UeXBlLCBpbnQgc3ViVHlwKTsKLSAgICB2aXJ0dWFsIH5UdW5lckZpbHRlcigpOwotICAgIFN0YXR1cyBnZXRJZChpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBnZXRJZDY0Qml0KGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldFF1ZXVlRGVzYyhBaWRsTVFEZXNjKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBjb25maWd1cmUoY29uc3QgVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uJiBjb25maWcpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBjb25maWd1cmVNb25pdG9yRXZlbnQoaW50IG1vbml0b3JFdmVudFR5cGUpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBjb25maWd1cmVJcEZpbHRlckNvbnRleHRJZChpbnQgY2lkKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgY29uZmlndXJlQXZTdHJlYW1UeXBlKGludCBhdlN0cmVhbVR5cGUpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBnZXRBdlNoYXJlZEhhbmRsZUluZm8oVHVuZXJGaWx0ZXJTaGFyZWRIYW5kbGVJbmZvKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyByZWxlYXNlQXZIYW5kbGUoY29uc3QgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpOYXRpdmVIYW5kbGUmIGhhbmRsZSwKLSAgICAgICAgICAgIGludDY0X3QgYXZEYXRhSWQpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzZXREYXRhU291cmNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBmaWx0ZXIpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzdGFydCgpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzdG9wKCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGZsdXNoKCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7Ci0gICAgc3A8SUZpbHRlcj4gZ2V0SGFsRmlsdGVyKCk7CisgICAgY2xhc3MgRmlsdGVyQ2FsbGJhY2sgOiBwdWJsaWMgQm5GaWx0ZXJDYWxsYmFjayB7CisgICAgcHVibGljOgorICAgICAgICBGaWx0ZXJDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgdHVuZXJGaWx0ZXJDYWxsYmFjaykKKyAgICAgICAgICAgICAgOiBtVHVuZXJGaWx0ZXJDYWxsYmFjayh0dW5lckZpbHRlckNhbGxiYWNrKSwgbU9yaWdpbmFsQ2FsbGJhY2sobnVsbHB0cil7fTsKIAotICAgIHN0cnVjdCBGaWx0ZXJDYWxsYmFjayA6IHB1YmxpYyBJRmlsdGVyQ2FsbGJhY2sgewotICAgICAgICBGaWx0ZXJDYWxsYmFjayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+IHR1bmVyRmlsdGVyQ2FsbGJhY2spCi0gICAgICAgICAgICAgICAgOiBtVHVuZXJGaWx0ZXJDYWxsYmFjayh0dW5lckZpbHRlckNhbGxiYWNrKSB7fTsKKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb25GaWx0ZXJFdmVudChjb25zdCB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIGV2ZW50cykgb3ZlcnJpZGU7CisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRmlsdGVyU3RhdHVzKERlbXV4RmlsdGVyU3RhdHVzIHN0YXR1cykgb3ZlcnJpZGU7CiAKLSAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25GaWx0ZXJFdmVudChjb25zdCBEZW11eEZpbHRlckV2ZW50JiBmaWx0ZXJFdmVudCk7Ci0gICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRmlsdGVyRXZlbnRfMV8xKGNvbnN0IERlbXV4RmlsdGVyRXZlbnQmIGZpbHRlckV2ZW50LAotICAgICAgICAgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyRXZlbnRFeHQmIGZpbHRlckV2ZW50RXh0KTsKLSAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25GaWx0ZXJTdGF0dXMoRGVtdXhGaWx0ZXJTdGF0dXMgc3RhdHVzKTsKKyAgICAgICAgdm9pZCBzZW5kU2hhcmVkRmlsdGVyU3RhdHVzKGludDMyX3Qgc3RhdHVzKTsKKyAgICAgICAgdm9pZCBhdHRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgaW5fY2IpOworICAgICAgICB2b2lkIGRldGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKCk7CisgICAgICAgIHZvaWQgZGV0YWNoQ2FsbGJhY2tzKCk7CiAKLSAgICAgICAgdm9pZCBnZXRBaWRsRmlsdGVyRXZlbnQoc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHR1bmVyRXZlbnQpOwotCi0gICAgICAgIHZvaWQgZ2V0TWVkaWFFdmVudCgKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgc3RkOjp2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcyk7Ci0gICAgICAgIHZvaWQgZ2V0U2VjdGlvbkV2ZW50KAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLCBzdGQ6OnZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKTsKLSAgICAgICAgdm9pZCBnZXRQZXNFdmVudCgKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgc3RkOjp2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcyk7Ci0gICAgICAgIHZvaWQgZ2V0VHNSZWNvcmRFdmVudCgKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKTsKLSAgICAgICAgdm9pZCBnZXRNbXRwUmVjb3JkRXZlbnQoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcyk7Ci0gICAgICAgIHZvaWQgZ2V0RG93bmxvYWRFdmVudCgKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgc3RkOjp2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcyk7Ci0gICAgICAgIHZvaWQgZ2V0SXBQYXlsb2FkRXZlbnQoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOwotICAgICAgICB2b2lkIGdldFRlbWlFdmVudCgKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgc3RkOjp2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcyk7Ci0gICAgICAgIHZvaWQgZ2V0TW9uaXRvckV2ZW50KAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOwotICAgICAgICB2b2lkIGdldFJlc3RhcnRFdmVudCgKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKTsKLQotICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+IG1UdW5lckZpbHRlckNhbGxiYWNrOworICAgIHByaXZhdGU6CisgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+IG1UdW5lckZpbHRlckNhbGxiYWNrOworICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiBtT3JpZ2luYWxDYWxsYmFjazsKKyAgICAgICAgTXV0ZXggbUNhbGxiYWNrTG9jazsKICAgICB9OwogCisgICAgVHVuZXJGaWx0ZXIoc2hhcmVkX3B0cjxJRmlsdGVyPiBmaWx0ZXIsIHNoYXJlZF9wdHI8RmlsdGVyQ2FsbGJhY2s+IGNiLCBEZW11eEZpbHRlclR5cGUgdHlwZSk7CisgICAgdmlydHVhbCB+VHVuZXJGaWx0ZXIoKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldElkKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0SWQ2NEJpdChpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFF1ZXVlRGVzYyhBaWRsTVFEZXNjKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNvbmZpZ3VyZShjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBpbl9zZXR0aW5ncykgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY29uZmlndXJlTW9uaXRvckV2ZW50KGludDMyX3QgaW5fbW9uaXRvckV2ZW50VHlwZXMpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNvbmZpZ3VyZUlwRmlsdGVyQ29udGV4dElkKGludDMyX3QgaW5fY2lkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjb25maWd1cmVBdlN0cmVhbVR5cGUoY29uc3QgQXZTdHJlYW1UeXBlJiBpbl9hdlN0cmVhbVR5cGUpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEF2U2hhcmVkSGFuZGxlKE5hdGl2ZUhhbmRsZSogb3V0X2F2TWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVsZWFzZUF2SGFuZGxlKGNvbnN0IE5hdGl2ZUhhbmRsZSYgaW5faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGluX2F2RGF0YUlkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXREYXRhU291cmNlKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fZmlsdGVyKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdGFydCgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0b3AoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBmbHVzaCgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgYWNxdWlyZVNoYXJlZEZpbHRlclRva2VuKHN0cmluZyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBmcmVlU2hhcmVkRmlsdGVyVG9rZW4oY29uc3Qgc3RyaW5nJiBpbl9maWx0ZXJUb2tlbikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0RmlsdGVyVHlwZShEZW11eEZpbHRlclR5cGUqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0RGVsYXlIaW50KGNvbnN0IEZpbHRlckRlbGF5SGludCYgaW5faGludCkgb3ZlcnJpZGU7CisKKyAgICBib29sIGlzU2hhcmVkRmlsdGVyQWxsb3dlZChpbnQzMl90IHBpZCk7CisgICAgdm9pZCBhdHRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgaW5fY2IpOworICAgIHNoYXJlZF9wdHI8SUZpbHRlcj4gZ2V0SGFsRmlsdGVyKCk7CisKIHByaXZhdGU6Ci0gICAgRGVtdXhGaWx0ZXJBdlNldHRpbmdzIGdldEF2U2V0dGluZ3MoY29uc3QgVHVuZXJGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOwotICAgIERlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzIGdldFNlY3Rpb25TZXR0aW5ncyhjb25zdCBUdW5lckZpbHRlclNldHRpbmdzJiBzZXR0aW5ncyk7Ci0gICAgRGVtdXhGaWx0ZXJQZXNEYXRhU2V0dGluZ3MgZ2V0UGVzRGF0YVNldHRpbmdzKGNvbnN0IFR1bmVyRmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKTsKLSAgICBEZW11eEZpbHRlclJlY29yZFNldHRpbmdzIGdldFJlY29yZFNldHRpbmdzKGNvbnN0IFR1bmVyRmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKTsKLSAgICBEZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3MgZ2V0RG93bmxvYWRTZXR0aW5ncyhjb25zdCBUdW5lckZpbHRlclNldHRpbmdzJiBzZXR0aW5ncyk7Ci0KLSAgICBib29sIGlzQXVkaW9GaWx0ZXIoKTsKLSAgICBib29sIGlzVmlkZW9GaWx0ZXIoKTsKLSAgICBib29sIGdldEhpZGxBdlN0cmVhbVR5cGUoaW50IGF2U3RyZWFtVHlwZSwgQXZTdHJlYW1UeXBlJiB0eXBlKTsKLQotICAgIHZvaWQgZ2V0SGlkbFRzU2V0dGluZ3MoCi0gICAgICAgIGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnLCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncyk7Ci0gICAgdm9pZCBnZXRIaWRsTW10cFNldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOwotICAgIHZvaWQgZ2V0SGlkbElwU2V0dGluZ3MoCi0gICAgICAgIGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnLCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncyk7Ci0gICAgdm9pZCBnZXRIaWRsVGx2U2V0dGluZ3MoCi0gICAgICAgIGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnLCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncyk7Ci0gICAgdm9pZCBnZXRIaWRsQWxwU2V0dGluZ3MoCi0gICAgICAgIGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnLCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncyk7Ci0KLSAgICBoaWRsX2FycmF5PHVpbnQ4X3QsIElQX1Y0X0xFTkdUSD4gZ2V0SXBWNEFkZHJlc3MoVHVuZXJEZW11eElwQWRkcmVzcyBhZGRyKTsKLSAgICBoaWRsX2FycmF5PHVpbnQ4X3QsIElQX1Y2X0xFTkdUSD4gZ2V0SXBWNkFkZHJlc3MoVHVuZXJEZW11eElwQWRkcmVzcyBhZGRyKTsKLQotICAgIHNwPElGaWx0ZXI+IG1GaWx0ZXI7Ci0gICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJRmlsdGVyPiBtRmlsdGVyXzFfMTsKKyAgICBzaGFyZWRfcHRyPElGaWx0ZXI+IG1GaWx0ZXI7CiAgICAgaW50MzJfdCBtSWQ7CiAgICAgaW50NjRfdCBtSWQ2NEJpdDsKLSAgICBpbnQgbU1haW5UeXBlOwotICAgIGludCBtU3ViVHlwZTsKKyAgICBEZW11eEZpbHRlclR5cGUgbVR5cGU7CisgICAgYm9vbCBtU3RhcnRlZDsKKyAgICBib29sIG1TaGFyZWQ7CisgICAgaW50MzJfdCBtQ2xpZW50UGlkOworICAgIHNoYXJlZF9wdHI8RmlsdGVyQ2FsbGJhY2s+IG1GaWx0ZXJDYWxsYmFjazsKKyAgICBNdXRleCBtTG9jazsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAogCiAjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkZJTFRFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lckZyb250ZW5kLmNwcCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRnJvbnRlbmQuY3BwCmluZGV4IDc0YjU1MTkuLjUxMTYzMDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRnJvbnRlbmQuY3BwCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRnJvbnRlbmQuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEwODEgKzE0LDIwOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJUdW5lckZyb250ZW5kIgogCiAjaW5jbHVkZSAiVHVuZXJGcm9udGVuZC5oIgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgorCiAjaW5jbHVkZSAiVHVuZXJMbmIuaCIKIAotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kQXRzYzNQbHBTZXR0aW5nczsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZFNjYW5BdHNjM1BscEluZm87Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRTdGF0dXNBdHNjM1BscEluZm87Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEFuYWxvZ1NpZlN0YW5kYXJkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEFuYWxvZ1R5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzY01vZHVsYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNCYW5kd2lkdGg7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNDb2RlUmF0ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM0RlbW9kT3V0cHV0Rm9ybWF0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzRmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzTW9kdWxhdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM1RpbWVJbnRlcmxlYXZlTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJjQW5uZXg7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZiY01vZHVsYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZiY091dGVyRmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YmNTcGVjdHJhbEludmVyc2lvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzTW9kdWxhdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzUGlsb3Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1JvbGxvZmY7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1NldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnNTdGFuZGFyZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzVmNtTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0QmFuZHdpZHRoOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRDb2RlcmF0ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0Q29uc3RlbGxhdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0R3VhcmRJbnRlcnZhbDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0SGllcmFyY2h5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRQbHBNb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0U3RhbmRhcmQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidFRyYW5zbWlzc2lvbk1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSW5uZXJGZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnMzQ29kZXJhdGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnMzTW9kdWxhdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RiczNSb2xsb2ZmOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzM1NldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzQ29kZXJhdGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnNNb2R1bGF0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzUm9sbG9mZjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2Ric1NldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzU3RyZWFtSWRUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0QmFuZHdpZHRoOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0Q29kZXJhdGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnRHdWFyZEludGVydmFsOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0TW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RidE1vZHVsYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnRTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNjYW5BdHNjM1BscEluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kU2NhblR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kU3RhdHVzVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZEFuYWxvZ0FmdEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kQmFuZHdpZHRoOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZENhYmxlVGltZUludGVybGVhdmVNb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER2YmNCYW5kd2lkdGg7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYkJhbmR3aWR0aDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdG1iQ29kZVJhdGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYkd1YXJkSW50ZXJ2YWw7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYk1vZHVsYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYlRpbWVJbnRlcmxlYXZlTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdG1iVHJhbnNtaXNzaW9uTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdmJzU2NhblR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kR3VhcmRJbnRlcnZhbDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRJbnRlcmxlYXZlTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRNb2R1bGF0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZFJvbGxPZmY7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRTcGVjdHJhbEludmVyc2lvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRTdGF0dXNUeXBlRXh0MV8xOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7CiAKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKIAotVHVuZXJGcm9udGVuZDo6VHVuZXJGcm9udGVuZChzcDxJRnJvbnRlbmQ+IGZyb250ZW5kLCBpbnQgaWQpIHsKK1R1bmVyRnJvbnRlbmQ6OlR1bmVyRnJvbnRlbmQoc2hhcmVkX3B0cjxJRnJvbnRlbmQ+IGZyb250ZW5kLCBpbnQgaWQpIHsKICAgICBtRnJvbnRlbmQgPSBmcm9udGVuZDsKLSAgICBtRnJvbnRlbmRfMV8xID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJRnJvbnRlbmQ6OmNhc3RGcm9tKG1Gcm9udGVuZCk7CiAgICAgbUlkID0gaWQ7CiB9CiAKIFR1bmVyRnJvbnRlbmQ6On5UdW5lckZyb250ZW5kKCkgewotICAgIG1Gcm9udGVuZCA9IE5VTEw7Ci0gICAgbUZyb250ZW5kXzFfMSA9IE5VTEw7CisgICAgbUZyb250ZW5kID0gbnVsbHB0cjsKICAgICBtSWQgPSAtMTsKIH0KIAotU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnNldENhbGxiYWNrKAorOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6c2V0Q2FsbGJhY2soCiAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmRDYWxsYmFjaz4mIHR1bmVyRnJvbnRlbmRDYWxsYmFjaykgewotICAgIGlmIChtRnJvbnRlbmQgPT0gTlVMTCkgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgaWYgKHR1bmVyRnJvbnRlbmRDYWxsYmFjayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlQpKTsKKyAgICBpZiAodHVuZXJGcm9udGVuZENhbGxiYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CiAgICAgfQogCi0gICAgc3A8SUZyb250ZW5kQ2FsbGJhY2s+IGZyb250ZW5kQ2FsbGJhY2sgPSBuZXcgRnJvbnRlbmRDYWxsYmFjayh0dW5lckZyb250ZW5kQ2FsbGJhY2spOwotICAgIFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmQtPnNldENhbGxiYWNrKGZyb250ZW5kQ2FsbGJhY2spOwotICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIHNoYXJlZF9wdHI8SUZyb250ZW5kQ2FsbGJhY2s+IGZyb250ZW5kQ2FsbGJhY2sgPQorICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8RnJvbnRlbmRDYWxsYmFjaz4odHVuZXJGcm9udGVuZENhbGxiYWNrKTsKKyAgICByZXR1cm4gbUZyb250ZW5kLT5zZXRDYWxsYmFjayhmcm9udGVuZENhbGxiYWNrKTsKIH0KIAotU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnR1bmUoY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBzZXR0aW5ncykgewotICAgIGlmIChtRnJvbnRlbmQgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6dHVuZShjb25zdCBGcm9udGVuZFNldHRpbmdzJiBzZXR0aW5ncykgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHN0YXR1czsKLSAgICBGcm9udGVuZFNldHRpbmdzIGZyb250ZW5kU2V0dGluZ3MgPSBnZXRIaWRsRnJvbnRlbmRTZXR0aW5ncyhzZXR0aW5ncyk7Ci0gICAgaWYgKHNldHRpbmdzLmlzRXh0ZW5kZWQpIHsKLSAgICAgICAgaWYgKG1Gcm9udGVuZF8xXzEgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIklGcm9udGVuZF8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwotICAgICAgICB9Ci0gICAgICAgIEZyb250ZW5kU2V0dGluZ3NFeHQxXzEgZnJvbnRlbmRTZXR0aW5nc0V4dCA9IGdldEhpZGxGcm9udGVuZFNldHRpbmdzRXh0KHNldHRpbmdzKTsKLSAgICAgICAgc3RhdHVzID0gbUZyb250ZW5kXzFfMS0+dHVuZV8xXzEoZnJvbnRlbmRTZXR0aW5ncywgZnJvbnRlbmRTZXR0aW5nc0V4dCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gbUZyb250ZW5kLT50dW5lKGZyb250ZW5kU2V0dGluZ3MpOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIHJldHVybiBtRnJvbnRlbmQtPnR1bmUoc2V0dGluZ3MpOwogfQogCi1TdGF0dXMgVHVuZXJGcm9udGVuZDo6c3RvcFR1bmUoKSB7Ci0gICAgaWYgKG1Gcm9udGVuZCA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZyb250ZW5kOjpzdG9wVHVuZSgpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmQtPnN0b3BUdW5lKCk7Ci0gICAgaWYgKHN0YXR1cyA9PSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgcmV0dXJuIG1Gcm9udGVuZC0+c3RvcFR1bmUoKTsKIH0KIAotU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnNjYW4oY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBzZXR0aW5ncywgaW50IGZyb250ZW5kU2NhblR5cGUpIHsKLSAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnNjYW4oY29uc3QgRnJvbnRlbmRTZXR0aW5ncyYgc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyb250ZW5kU2NhblR5cGUgZnJvbnRlbmRTY2FuVHlwZSkgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHN0YXR1czsKLSAgICBGcm9udGVuZFNldHRpbmdzIGZyb250ZW5kU2V0dGluZ3MgPSBnZXRIaWRsRnJvbnRlbmRTZXR0aW5ncyhzZXR0aW5ncyk7Ci0gICAgaWYgKHNldHRpbmdzLmlzRXh0ZW5kZWQpIHsKLSAgICAgICAgaWYgKG1Gcm9udGVuZF8xXzEgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIklGcm9udGVuZF8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwotICAgICAgICB9Ci0gICAgICAgIEZyb250ZW5kU2V0dGluZ3NFeHQxXzEgZnJvbnRlbmRTZXR0aW5nc0V4dCA9IGdldEhpZGxGcm9udGVuZFNldHRpbmdzRXh0KHNldHRpbmdzKTsKLSAgICAgICAgc3RhdHVzID0gbUZyb250ZW5kXzFfMS0+c2Nhbl8xXzEoZnJvbnRlbmRTZXR0aW5ncywKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZFNjYW5UeXBlPihmcm9udGVuZFNjYW5UeXBlKSwgZnJvbnRlbmRTZXR0aW5nc0V4dCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gbUZyb250ZW5kLT5zY2FuKAotICAgICAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3MsIHN0YXRpY19jYXN0PEZyb250ZW5kU2NhblR5cGU+KGZyb250ZW5kU2NhblR5cGUpKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICByZXR1cm4gbUZyb250ZW5kLT5zY2FuKHNldHRpbmdzLCBmcm9udGVuZFNjYW5UeXBlKTsKIH0KIAotU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnN0b3BTY2FuKCkgewotICAgIGlmIChtRnJvbnRlbmQgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6c3RvcFNjYW4oKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kLT5zdG9wU2NhbigpOwotICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIHJldHVybiBtRnJvbnRlbmQtPnN0b3BTY2FuKCk7CiB9CiAKLVN0YXR1cyBUdW5lckZyb250ZW5kOjpzZXRMbmIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJMbmI+JiBsbmIpIHsKLSAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnNldExuYihjb25zdCBzaGFyZWRfcHRyPElUdW5lckxuYj4mIGxuYikgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHN0YXR1cyA9IG1Gcm9udGVuZC0+c2V0TG5iKHN0YXRpY19jYXN0PFR1bmVyTG5iKj4obG5iLmdldCgpKS0+Z2V0SWQoKSk7Ci0gICAgaWYgKHN0YXR1cyA9PSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICBpZiAobG5iID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CiAgICAgfQogCi0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIHJldHVybiBtRnJvbnRlbmQtPnNldExuYihzdGF0aWNfY2FzdDxUdW5lckxuYio+KGxuYi5nZXQoKSktPmdldElkKCkpOwogfQogCi1TdGF0dXMgVHVuZXJGcm9udGVuZDo6c2V0TG5hKGJvb2wgYkVuYWJsZSkgewotICAgIGlmIChtRnJvbnRlbmQgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6bGlua0NpQ2FtVG9Gcm9udGVuZChpbnQzMl90IGNpQ2FtSWQsIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHN0YXR1cyA9IG1Gcm9udGVuZC0+c2V0TG5hKGJFbmFibGUpOwotICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIHJldHVybiBtRnJvbnRlbmQtPmxpbmtDaUNhbShjaUNhbUlkLCBfYWlkbF9yZXR1cm4pOwogfQogCi1TdGF0dXMgVHVuZXJGcm9udGVuZDo6bGlua0NpQ2FtVG9Gcm9udGVuZChpbnQgY2lDYW1JZCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7Ci0gICAgaWYgKG1Gcm9udGVuZF8xXzEgPT0gTlVMTCkgewotICAgICAgICBBTE9HRCgiSUZyb250ZW5kXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKLSAgICB9Ci0KLSAgICBpbnQgbHRzSWQ7Ci0gICAgUmVzdWx0IHN0YXR1czsKLSAgICBtRnJvbnRlbmRfMV8xLT5saW5rQ2lDYW0oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNpQ2FtSWQpLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50MzJfdCBpZCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHI7Ci0gICAgICAgICAgICAgICAgbHRzSWQgPSBpZDsKLSAgICAgICAgICAgIH0pOwotCi0gICAgaWYgKHN0YXR1cyA9PSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgKl9haWRsX3JldHVybiA9IGx0c0lkOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKLX0KLQotU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnVubGlua0NpQ2FtVG9Gcm9udGVuZChpbnQgY2lDYW1JZCkgewotICAgIGlmIChtRnJvbnRlbmRfMV8xID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0QoIklGcm9udGVuZF8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Ci0gICAgfQotCi0gICAgUmVzdWx0IHN0YXR1cyA9IG1Gcm9udGVuZF8xXzEtPnVubGlua0NpQ2FtKGNpQ2FtSWQpOwotICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOwotfQotCi1TdGF0dXMgVHVuZXJGcm9udGVuZDo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1Gcm9udGVuZCA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZyb250ZW5kOjp1bmxpbmtDaUNhbVRvRnJvbnRlbmQoaW50MzJfdCBjaUNhbUlkKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kLT5jbG9zZSgpOwotICAgIG1Gcm9udGVuZCA9IE5VTEw7Ci0gICAgbUZyb250ZW5kXzFfMSA9IE5VTEw7Ci0KLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1Gcm9udGVuZC0+dW5saW5rQ2lDYW0oY2lDYW1JZCk7CiB9CiAKLVN0YXR1cyBUdW5lckZyb250ZW5kOjpnZXRTdGF0dXMoY29uc3QgdmVjdG9yPGludDMyX3Q+JiBzdGF0dXNUeXBlcywKLSAgICAgICAgdmVjdG9yPFR1bmVyRnJvbnRlbmRTdGF0dXM+KiBfYWlkbF9yZXR1cm4pIHsKLSAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OmNsb3NlKCkgeworICAgIGlmIChtRnJvbnRlbmQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlczsKLSAgICB2ZWN0b3I8RnJvbnRlbmRTdGF0dXM+IHN0YXR1czsKLSAgICB2ZWN0b3I8RnJvbnRlbmRTdGF0dXNUeXBlPiB0eXBlczsKLSAgICBmb3IgKGF1dG8gcyA6IHN0YXR1c1R5cGVzKSB7Ci0gICAgICAgIHR5cGVzLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxGcm9udGVuZFN0YXR1c1R5cGU+KHMpKTsKLSAgICB9CisgICAgYXV0byByZXMgPSBtRnJvbnRlbmQtPmNsb3NlKCk7CisgICAgbUZyb250ZW5kID0gbnVsbHB0cjsKIAotICAgIG1Gcm9udGVuZC0+Z2V0U3RhdHVzKHR5cGVzLCBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEZyb250ZW5kU3RhdHVzPiYgcykgewotICAgICAgICByZXMgPSByOwotICAgICAgICBzdGF0dXMgPSBzOwotICAgIH0pOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0KLSAgICBnZXRBaWRsRnJvbnRlbmRTdGF0dXMoc3RhdHVzLCAqX2FpZGxfcmV0dXJuKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiByZXM7CiB9CiAKLVN0YXR1cyBUdW5lckZyb250ZW5kOjpnZXRTdGF0dXNFeHRlbmRlZF8xXzEoY29uc3QgdmVjdG9yPGludDMyX3Q+JiBzdGF0dXNUeXBlcywKLSAgICAgICAgdmVjdG9yPFR1bmVyRnJvbnRlbmRTdGF0dXM+KiBfYWlkbF9yZXR1cm4pIHsKLSAgICBpZiAobUZyb250ZW5kXzFfMSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dEKCJJRnJvbnRlbmRfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6Z2V0U3RhdHVzKGNvbnN0IHZlY3RvcjxGcm9udGVuZFN0YXR1c1R5cGU+JiBpbl9zdGF0dXNUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRTdGF0dXM+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXM7Ci0gICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzRXh0MV8xPiBzdGF0dXM7Ci0gICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzVHlwZUV4dDFfMT4gdHlwZXM7Ci0gICAgZm9yIChhdXRvIHMgOiBzdGF0dXNUeXBlcykgewotICAgICAgICB0eXBlcy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8RnJvbnRlbmRTdGF0dXNUeXBlRXh0MV8xPihzKSk7Ci0gICAgfQotCi0gICAgbUZyb250ZW5kXzFfMS0+Z2V0U3RhdHVzRXh0MV8xKHR5cGVzLCBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEZyb250ZW5kU3RhdHVzRXh0MV8xPiYgcykgewotICAgICAgICByZXMgPSByOwotICAgICAgICBzdGF0dXMgPSBzOwotICAgIH0pOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0KLSAgICBnZXRBaWRsRnJvbnRlbmRTdGF0dXNFeHQoc3RhdHVzLCAqX2FpZGxfcmV0dXJuKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtRnJvbnRlbmQtPmdldFN0YXR1cyhpbl9zdGF0dXNUeXBlcywgX2FpZGxfcmV0dXJuKTsKIH0KIAotU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OmdldEZyb250ZW5kSWQoaW50KiBfYWlkbF9yZXR1cm4pIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OmdldEZyb250ZW5kSWQoaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CiAgICAgKl9haWRsX3JldHVybiA9IG1JZDsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJGcm9udGVuZDo6Z2V0SGFyZHdhcmVJbmZvKHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIHJldHVybiBtRnJvbnRlbmQtPmdldEhhcmR3YXJlSW5mbyhfYWlkbF9yZXR1cm4pOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZyb250ZW5kOjpyZW1vdmVPdXRwdXRQaWQoaW50MzJfdCBpbl9waWQpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIHJldHVybiBtRnJvbnRlbmQtPnJlbW92ZU91dHB1dFBpZChpbl9waWQpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZyb250ZW5kOjpnZXRGcm9udGVuZFN0YXR1c1JlYWRpbmVzcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8RnJvbnRlbmRTdGF0dXNUeXBlPiYgaW5fc3RhdHVzVHlwZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPEZyb250ZW5kU3RhdHVzUmVhZGluZXNzPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUZyb250ZW5kLT5nZXRGcm9udGVuZFN0YXR1c1JlYWRpbmVzcyhpbl9zdGF0dXNUeXBlcywgX2FpZGxfcmV0dXJuKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vIEZyb250ZW5kQ2FsbGJhY2sgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotUmV0dXJuPHZvaWQ+IFR1bmVyRnJvbnRlbmQ6OkZyb250ZW5kQ2FsbGJhY2s6Om9uRXZlbnQoRnJvbnRlbmRFdmVudFR5cGUgZnJvbnRlbmRFdmVudFR5cGUpIHsKLSAgICBBTE9HRCgiRnJvbnRlbmRDYWxsYmFjazo6b25FdmVudCwgdHlwZT0lZCIsIGZyb250ZW5kRXZlbnRUeXBlKTsKLSAgICBtVHVuZXJGcm9udGVuZENhbGxiYWNrLT5vbkV2ZW50KChpbnQpZnJvbnRlbmRFdmVudFR5cGUpOwotICAgIHJldHVybiBWb2lkKCk7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZyb250ZW5kOjpGcm9udGVuZENhbGxiYWNrOjpvbkV2ZW50KEZyb250ZW5kRXZlbnRUeXBlIGZyb250ZW5kRXZlbnRUeXBlKSB7CisgICAgQUxPR1YoIkZyb250ZW5kQ2FsbGJhY2s6Om9uRXZlbnQsIHR5cGU9JWQiLCBmcm9udGVuZEV2ZW50VHlwZSk7CisgICAgaWYgKG1UdW5lckZyb250ZW5kQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJGcm9udGVuZENhbGxiYWNrLT5vbkV2ZW50KGZyb250ZW5kRXZlbnRUeXBlKTsKKyAgICB9CisgICAgcmV0dXJuIG5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKIH0KIAotUmV0dXJuPHZvaWQ+IFR1bmVyRnJvbnRlbmQ6OkZyb250ZW5kQ2FsbGJhY2s6Om9uU2Nhbk1lc3NhZ2UoCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckZyb250ZW5kOjpGcm9udGVuZENhbGxiYWNrOjpvblNjYW5NZXNzYWdlKAogICAgICAgICBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZSB0eXBlLCBjb25zdCBGcm9udGVuZFNjYW5NZXNzYWdlJiBtZXNzYWdlKSB7Ci0gICAgQUxPR0QoIkZyb250ZW5kQ2FsbGJhY2s6Om9uU2Nhbk1lc3NhZ2UsIHR5cGU9JWQiLCB0eXBlKTsKLSAgICBUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2Ugc2Nhbk1lc3NhZ2U7Ci0gICAgc3dpdGNoKHR5cGUpIHsKLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6TE9DS0VEOiB7Ci0gICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjppc0xvY2tlZD4obWVzc2FnZS5pc0xvY2tlZCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkVORDogewotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6aXNFbmQ+KG1lc3NhZ2UuaXNFbmQoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpQUk9HUkVTU19QRVJDRU5UOiB7Ci0gICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjpwcm9ncmVzc1BlcmNlbnQ+KG1lc3NhZ2UucHJvZ3Jlc3NQZXJjZW50KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6RlJFUVVFTkNZOiB7Ci0gICAgICAgICAgICBhdXRvIGYgPSBtZXNzYWdlLmZyZXF1ZW5jaWVzKCk7Ci0gICAgICAgICAgICB2ZWN0b3I8aW50PiBmcmVxdWVuY2llcyhiZWdpbihmKSwgZW5kKGYpKTsKLSAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OmZyZXF1ZW5jaWVzPihmcmVxdWVuY2llcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpTWU1CT0xfUkFURTogewotICAgICAgICAgICAgYXV0byBzID0gbWVzc2FnZS5zeW1ib2xSYXRlcygpOwotICAgICAgICAgICAgdmVjdG9yPGludD4gc3ltYm9sUmF0ZXMoYmVnaW4ocyksIGVuZChzKSk7Ci0gICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjpzeW1ib2xSYXRlcz4oc3ltYm9sUmF0ZXMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6SElFUkFSQ0hZOiB7Ci0gICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjpoaWVyYXJjaHk+KChpbnQpbWVzc2FnZS5oaWVyYXJjaHkoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpBTkFMT0dfVFlQRTogewotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6YW5hbG9nVHlwZT4oKGludCltZXNzYWdlLmFuYWxvZ1R5cGUoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpQTFBfSURTOiB7Ci0gICAgICAgICAgICBhdXRvIHAgPSBtZXNzYWdlLnBscElkcygpOwotICAgICAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IHBscElkcyhiZWdpbihwKSwgZW5kKHApKTsKLSAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OnBscElkcz4ocGxwSWRzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkdST1VQX0lEUzogewotICAgICAgICAgICAgYXV0byBnID0gbWVzc2FnZS5ncm91cElkcygpOwotICAgICAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IGdyb3VwSWRzKGJlZ2luKGcpLCBlbmQoZykpOwotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6Z3JvdXBJZHM+KGdyb3VwSWRzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OklOUFVUX1NUUkVBTV9JRFM6IHsKLSAgICAgICAgICAgIGF1dG8gaSA9IG1lc3NhZ2UuaW5wdXRTdHJlYW1JZHMoKTsKLSAgICAgICAgICAgIHZlY3RvcjxjaGFyMTZfdD4gc3RyZWFtSWRzKGJlZ2luKGkpLCBlbmQoaSkpOwotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6aW5wdXRTdHJlYW1JZHM+KHN0cmVhbUlkcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpTVEFOREFSRDogewotICAgICAgICAgICAgRnJvbnRlbmRTY2FuTWVzc2FnZTo6U3RhbmRhcmQgc3RkID0gbWVzc2FnZS5zdGQoKTsKLSAgICAgICAgICAgIGludCBzdGFuZGFyZDsKLSAgICAgICAgICAgIGlmIChzdGQuZ2V0RGlzY3JpbWluYXRvcigpID09IEZyb250ZW5kU2Nhbk1lc3NhZ2U6OlN0YW5kYXJkOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnNTdGQpIHsKLSAgICAgICAgICAgICAgICBzdGFuZGFyZCA9IChpbnQpIHN0ZC5zU3RkKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0ZC5nZXREaXNjcmltaW5hdG9yKCkgPT0KLSAgICAgICAgICAgICAgICAgICAgRnJvbnRlbmRTY2FuTWVzc2FnZTo6U3RhbmRhcmQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6dFN0ZCkgewotICAgICAgICAgICAgICAgIHN0YW5kYXJkID0gKGludCkgc3RkLnRTdGQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RkLmdldERpc2NyaW1pbmF0b3IoKSA9PQotICAgICAgICAgICAgICAgICAgICBGcm9udGVuZFNjYW5NZXNzYWdlOjpTdGFuZGFyZDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzaWZTdGQpIHsKLSAgICAgICAgICAgICAgICBzdGFuZGFyZCA9IChpbnQpIHN0ZC5zaWZTdGQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OnN0ZD4oc3RhbmRhcmQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6QVRTQzNfUExQX0lORk86IHsKLSAgICAgICAgICAgIHZlY3RvcjxGcm9udGVuZFNjYW5BdHNjM1BscEluZm8+IHBscEluZm9zID0gbWVzc2FnZS5hdHNjM1BscEluZm9zKCk7Ci0gICAgICAgICAgICB2ZWN0b3I8VHVuZXJGcm9udGVuZFNjYW5BdHNjM1BscEluZm8+IHR1bmVyUGxwSW5mb3M7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBscEluZm9zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYXV0byBpbmZvID0gcGxwSW5mb3NbaV07Ci0gICAgICAgICAgICAgICAgaW50OF90IHBscElkID0gKGludDhfdCkgaW5mby5wbHBJZDsKLSAgICAgICAgICAgICAgICBib29sIGxscyA9IChib29sKSBpbmZvLmJMbHNGbGFnOwotICAgICAgICAgICAgICAgIFR1bmVyRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvIHBscEluZm97Ci0gICAgICAgICAgICAgICAgICAgIC5wbHBJZCA9IHBscElkLAotICAgICAgICAgICAgICAgICAgICAubGxzRmxhZyA9IGxscywKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIHR1bmVyUGxwSW5mb3MucHVzaF9iYWNrKHBscEluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6YXRzYzNQbHBJbmZvcz4odHVuZXJQbHBJbmZvcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7CisgICAgQUxPR1YoIkZyb250ZW5kQ2FsbGJhY2s6Om9uU2Nhbk1lc3NhZ2UsIHR5cGU9JWQiLCB0eXBlKTsKKyAgICBpZiAobVR1bmVyRnJvbnRlbmRDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uU2Nhbk1lc3NhZ2UodHlwZSwgbWVzc2FnZSk7CiAgICAgfQotICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uU2Nhbk1lc3NhZ2UoKGludCl0eXBlLCBzY2FuTWVzc2FnZSk7Ci0gICAgcmV0dXJuIFZvaWQoKTsKKyAgICByZXR1cm4gbmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOwogfQogCi1SZXR1cm48dm9pZD4gVHVuZXJGcm9udGVuZDo6RnJvbnRlbmRDYWxsYmFjazo6b25TY2FuTWVzc2FnZUV4dDFfMSgKLSAgICAgICAgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzEgdHlwZSwgY29uc3QgRnJvbnRlbmRTY2FuTWVzc2FnZUV4dDFfMSYgbWVzc2FnZSkgewotICAgIEFMT0dEKCJvblNjYW5NZXNzYWdlRXh0MV8xOjpvblNjYW5NZXNzYWdlLCB0eXBlPSVkIiwgdHlwZSk7Ci0gICAgVHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlIHNjYW5NZXNzYWdlOwotICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzE6Ok1PRFVMQVRJT046IHsKLSAgICAgICAgICAgIEZyb250ZW5kTW9kdWxhdGlvbiBtID0gbWVzc2FnZS5tb2R1bGF0aW9uKCk7Ci0gICAgICAgICAgICBpbnQgbW9kdWxhdGlvbjsKLSAgICAgICAgICAgIHN3aXRjaCAobS5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJjOgotICAgICAgICAgICAgICAgICAgICBtb2R1bGF0aW9uID0gKGludCkgbS5kdmJjKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnQ6Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsYXRpb24gPSAoaW50KSBtLmR2YnQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiczoKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxhdGlvbiA9IChpbnQpIG0uZHZicygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczoKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxhdGlvbiA9IChpbnQpIG0uaXNkYnMoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnMzOgotICAgICAgICAgICAgICAgICAgICBtb2R1bGF0aW9uID0gKGludCkgbS5pc2RiczMoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsYXRpb24gPSAoaW50KSBtLmlzZGJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2M6Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsYXRpb24gPSAoaW50KSBtLmF0c2MoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzYzM6Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsYXRpb24gPSAoaW50KSBtLmF0c2MzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR0bWI6Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsYXRpb24gPSAoaW50KSBtLmR0bWIoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjptb2R1bGF0aW9uPihtb2R1bGF0aW9uKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzE6OkRWQkNfQU5ORVg6IHsKLSAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OmFubmV4PigoaW50KW1lc3NhZ2UuYW5uZXgoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlRXh0MV8xOjpISUdIX1BSSU9SSVRZOiB7Ci0gICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjppc0hpZ2hQcmlvcml0eT4obWVzc2FnZS5pc0hpZ2hQcmlvcml0eSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgbVR1bmVyRnJvbnRlbmRDYWxsYmFjay0+b25TY2FuTWVzc2FnZSgoaW50KXR5cGUsIHNjYW5NZXNzYWdlKTsKLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8gVHVuZXJGcm9udGVuZCBIZWxwZXIgTWV0aG9kcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi12b2lkIFR1bmVyRnJvbnRlbmQ6OmdldEFpZGxGcm9udGVuZFN0YXR1cygKLSAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzPiYgaGlkbFN0YXR1cywgdmVjdG9yPFR1bmVyRnJvbnRlbmRTdGF0dXM+JiBhaWRsU3RhdHVzKSB7Ci0gICAgZm9yIChGcm9udGVuZFN0YXR1cyBzIDogaGlkbFN0YXR1cykgewotICAgICAgICBUdW5lckZyb250ZW5kU3RhdHVzIHN0YXR1czsKLSAgICAgICAgc3dpdGNoIChzLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc0RlbW9kTG9ja2VkOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppc0RlbW9kTG9ja2VkPihzLmlzRGVtb2RMb2NrZWQoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6c25yOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpzbnI+KChpbnQpcy5zbnIoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6YmVyOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpiZXI+KChpbnQpcy5iZXIoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6cGVyOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpwZXI+KChpbnQpcy5wZXIoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6cHJlQmVyOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpwcmVCZXI+KChpbnQpcy5wcmVCZXIoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2lnbmFsUXVhbGl0eTogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6c2lnbmFsUXVhbGl0eT4oKGludClzLnNpZ25hbFF1YWxpdHkoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2lnbmFsU3RyZW5ndGg6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnNpZ25hbFN0cmVuZ3RoPigoaW50KXMuc2lnbmFsU3RyZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6c3ltYm9sUmF0ZTogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6c3ltYm9sUmF0ZT4oKGludClzLnN5bWJvbFJhdGUoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aW5uZXJGZWM6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmlubmVyRmVjPigobG9uZylzLmlubmVyRmVjKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1vZHVsYXRpb246IHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHMubW9kdWxhdGlvbigpLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvblN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJjOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjptb2R1bGF0aW9uPigoaW50KXMubW9kdWxhdGlvbigpLmR2YmMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6Om1vZHVsYXRpb24+KChpbnQpcy5tb2R1bGF0aW9uKCkuZHZicygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6Om1vZHVsYXRpb24+KChpbnQpcy5tb2R1bGF0aW9uKCkuaXNkYnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6bW9kdWxhdGlvbj4oKGludClzLm1vZHVsYXRpb24oKS5pc2RiczMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjptb2R1bGF0aW9uPigoaW50KXMubW9kdWxhdGlvbigpLmlzZGJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aW52ZXJzaW9uOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppbnZlcnNpb24+KChpbnQpcy5pbnZlcnNpb24oKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6bG5iVm9sdGFnZTogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6bG5iVm9sdGFnZT4oKGludClzLmxuYlZvbHRhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6cGxwSWQ6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnBscElkPigoaW50OF90KXMucGxwSWQoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNFV0JTOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppc0VXQlM+KHMuaXNFV0JTKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmFnYzogewotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6YWdjPigoaW50OF90KXMuYWdjKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzTG5hT246IHsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmlzTG5hT24+KHMuaXNMbmFPbigpKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc0xheWVyRXJyb3I6IHsKLSAgICAgICAgICAgICAgICB2ZWN0b3I8Ym9vbD4gZShzLmlzTGF5ZXJFcnJvcigpLmJlZ2luKCksIHMuaXNMYXllckVycm9yKCkuZW5kKCkpOwotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aXNMYXllckVycm9yPihlKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjptZXI6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6Om1lcj4oKGludClzLm1lcigpKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpmcmVxT2Zmc2V0OiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpmcmVxT2Zmc2V0PigoaW50KXMuZnJlcU9mZnNldCgpKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpoaWVyYXJjaHk6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmhpZXJhcmNoeT4oKGludClzLmhpZXJhcmNoeSgpKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc1JmTG9ja2VkOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppc1JmTG9ja2VkPihzLmlzUmZMb2NrZWQoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6cGxwSW5mbzogewotICAgICAgICAgICAgICAgIHZlY3RvcjxUdW5lckZyb250ZW5kU3RhdHVzQXRzYzNQbHBJbmZvPiBpbmZvOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byBpIDogcy5wbHBJbmZvKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5mby5wdXNoX2JhY2soewotICAgICAgICAgICAgICAgICAgICAgICAgLnBscElkID0gKGludDhfdClpLnBscElkLAotICAgICAgICAgICAgICAgICAgICAgICAgLmlzTG9ja2VkID0gaS5pc0xvY2tlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC51ZWMgPSAoaW50KWkudWVjLAotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpwbHBJbmZvPihpbmZvKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFR1bmVyRnJvbnRlbmQ6OmdldEFpZGxGcm9udGVuZFN0YXR1c0V4dCgKLSAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzRXh0MV8xPiYgaGlkbFN0YXR1cywgdmVjdG9yPFR1bmVyRnJvbnRlbmRTdGF0dXM+JiBhaWRsU3RhdHVzKSB7Ci0gICAgZm9yIChGcm9udGVuZFN0YXR1c0V4dDFfMSBzIDogaGlkbFN0YXR1cykgewotICAgICAgICBUdW5lckZyb250ZW5kU3RhdHVzIHN0YXR1czsKLSAgICAgICAgc3dpdGNoIChzLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjptb2R1bGF0aW9uczogewotICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ+IGFpZGxNb2Q7Ci0gICAgICAgICAgICAgICAgZm9yIChhdXRvIG0gOiBzLm1vZHVsYXRpb25zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjaygoaW50KW0uZHZiYygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soKGludCltLmR2YnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKChpbnQpbS5kdmJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soKGludCltLmlzZGJzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnMzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKChpbnQpbS5pc2RiczMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjaygoaW50KW0uaXNkYnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKChpbnQpbS5hdHNjKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzYzM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soKGludCltLmF0c2MzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHRtYjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjaygoaW50KW0uZHRtYigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6Om1vZHVsYXRpb25zPihhaWRsTW9kKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjpiZXJzOiB7Ci0gICAgICAgICAgICAgICAgdmVjdG9yPGludD4gYihzLmJlcnMoKS5iZWdpbigpLCBzLmJlcnMoKS5lbmQoKSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpiZXJzPihiKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjpjb2RlUmF0ZXM6IHsKLSAgICAgICAgICAgICAgICB2ZWN0b3I8aW50NjRfdD4gY29kZVJhdGVzOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byBjIDogcy5jb2RlUmF0ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBjb2RlUmF0ZXMucHVzaF9iYWNrKChsb25nKWMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmNvZGVSYXRlcz4oY29kZVJhdGVzKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjpiYW5kd2lkdGg6IHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHMuYmFuZHdpZHRoKCkuZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRCYW5kd2lkdGg6OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzYzM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmJhbmR3aWR0aD4oKGludClzLmJhbmR3aWR0aCgpLmF0c2MzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRCYW5kd2lkdGg6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6YmFuZHdpZHRoPigoaW50KXMuYmFuZHdpZHRoKCkuZHZiYygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kQmFuZHdpZHRoOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmJhbmR3aWR0aD4oKGludClzLmJhbmR3aWR0aCgpLmR2YnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZEJhbmR3aWR0aDo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6YmFuZHdpZHRoPigoaW50KXMuYmFuZHdpZHRoKCkuaXNkYnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZEJhbmR3aWR0aDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpiYW5kd2lkdGg+KChpbnQpcy5iYW5kd2lkdGgoKS5kdG1iKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmludGVydmFsOiB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzLmludGVydmFsKCkuZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRHdWFyZEludGVydmFsOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmludGVydmFsPigoaW50KXMuaW50ZXJ2YWwoKS5kdmJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRHdWFyZEludGVydmFsOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppbnRlcnZhbD4oKGludClzLmludGVydmFsKCkuaXNkYnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZEd1YXJkSW50ZXJ2YWw6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHRtYjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aW50ZXJ2YWw+KChpbnQpcy5pbnRlcnZhbCgpLmR0bWIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6dHJhbnNtaXNzaW9uTW9kZTogewotICAgICAgICAgICAgICAgIHN3aXRjaCAocy50cmFuc21pc3Npb25Nb2RlKCkuZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRUcmFuc21pc3Npb25Nb2RlOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnRyYW5zbWlzc2lvbk1vZGU+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXMudHJhbnNtaXNzaW9uTW9kZSgpLmR2YnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGU6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnRyYW5zbWlzc2lvbk1vZGU+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXMudHJhbnNtaXNzaW9uTW9kZSgpLmlzZGJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRUcmFuc21pc3Npb25Nb2RlOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR0bWI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnRyYW5zbWlzc2lvbk1vZGU+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXMudHJhbnNtaXNzaW9uTW9kZSgpLmR0bWIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6dWVjOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjp1ZWM+KChpbnQpcy51ZWMoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6c3lzdGVtSWQ6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnN5c3RlbUlkPigoY2hhcjE2X3Qpcy5zeXN0ZW1JZCgpKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjppbnRlcmxlYXZpbmc6IHsKLSAgICAgICAgICAgICAgICB2ZWN0b3I8aW50PiBhaWRsSW50ZXI7Ci0gICAgICAgICAgICAgICAgZm9yIChhdXRvIGkgOiBzLmludGVybGVhdmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaS5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRJbnRlcmxlYXZlTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjMzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsSW50ZXIucHVzaF9iYWNrKChpbnQpaS5hdHNjMygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRJbnRlcmxlYXZlTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJjOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxJbnRlci5wdXNoX2JhY2soKGludClpLmR2YmMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kSW50ZXJsZWF2ZU1vZGU6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHRtYjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsSW50ZXIucHVzaF9iYWNrKChpbnQpaS5kdG1iKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aW50ZXJsZWF2aW5nPihhaWRsSW50ZXIpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0U2VnbWVudDogewotICAgICAgICAgICAgICAgIGF1dG8gc2VnID0gcy5pc2RidFNlZ21lbnQoKTsKLSAgICAgICAgICAgICAgICB2ZWN0b3I8dWludDhfdD4gaShzZWcuYmVnaW4oKSwgc2VnLmVuZCgpKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmlzZGJ0U2VnbWVudD4oaSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6dHNEYXRhUmF0ZTogewotICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ+IHRzKHMudHNEYXRhUmF0ZSgpLmJlZ2luKCksIHMudHNEYXRhUmF0ZSgpLmVuZCgpKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnRzRGF0YVJhdGU+KHRzKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjpyb2xsT2ZmOiB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzLnJvbGxPZmYoKS5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZFJvbGxPZmY6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiczoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6cm9sbE9mZj4oKGludClzLnJvbGxPZmYoKS5kdmJzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRSb2xsT2ZmOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpyb2xsT2ZmPigoaW50KXMucm9sbE9mZigpLmlzZGJzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRSb2xsT2ZmOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6cm9sbE9mZj4oKGludClzLnJvbGxPZmYoKS5pc2RiczMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNNaXNvOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppc01pc28+KHMuaXNNaXNvKCkpOwotICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzTGluZWFyOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppc0xpbmVhcj4ocy5pc0xpbmVhcigpKTsKLSAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjppc1Nob3J0RnJhbWVzOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppc1Nob3J0RnJhbWVzPihzLmlzU2hvcnRGcmFtZXMoKSk7Ci0gICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotaGlkbF92ZWM8RnJvbnRlbmRBdHNjM1BscFNldHRpbmdzPiBUdW5lckZyb250ZW5kOjpnZXRBdHNjM1BscFNldHRpbmdzKAotICAgICAgICBjb25zdCBUdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncyYgc2V0dGluZ3MpIHsKLSAgICBpbnQgbGVuID0gc2V0dGluZ3MucGxwU2V0dGluZ3Muc2l6ZSgpOwotICAgIGhpZGxfdmVjPEZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncz4gcGxwcyA9IGhpZGxfdmVjPEZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncz4obGVuKTsKLSAgICAvLyBwYXJzZSBQTFAgc2V0dGluZ3MKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgcGxwSWQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5wbHBTZXR0aW5nc1tpXS5wbHBJZCk7Ci0gICAgICAgIEZyb250ZW5kQXRzYzNNb2R1bGF0aW9uIG1vZHVsYXRpb24gPQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNNb2R1bGF0aW9uPihzZXR0aW5ncy5wbHBTZXR0aW5nc1tpXS5tb2R1bGF0aW9uKTsKLSAgICAgICAgRnJvbnRlbmRBdHNjM1RpbWVJbnRlcmxlYXZlTW9kZSBpbnRlcmxlYXZlTW9kZSA9Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjM1RpbWVJbnRlcmxlYXZlTW9kZT4oCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5wbHBTZXR0aW5nc1tpXS5pbnRlcmxlYXZlTW9kZSk7Ci0gICAgICAgIEZyb250ZW5kQXRzYzNDb2RlUmF0ZSBjb2RlUmF0ZSA9Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjM0NvZGVSYXRlPihzZXR0aW5ncy5wbHBTZXR0aW5nc1tpXS5jb2RlUmF0ZSk7Ci0gICAgICAgIEZyb250ZW5kQXRzYzNGZWMgZmVjID0KLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZEF0c2MzRmVjPihzZXR0aW5ncy5wbHBTZXR0aW5nc1tpXS5mZWMpOwotICAgICAgICBGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3MgZnJvbnRlbmRBdHNjM1BscFNldHRpbmdzIHsKLSAgICAgICAgICAgICAgICAucGxwSWQgPSBwbHBJZCwKLSAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IG1vZHVsYXRpb24sCi0gICAgICAgICAgICAgICAgLmludGVybGVhdmVNb2RlID0gaW50ZXJsZWF2ZU1vZGUsCi0gICAgICAgICAgICAgICAgLmNvZGVSYXRlID0gY29kZVJhdGUsCi0gICAgICAgICAgICAgICAgLmZlYyA9IGZlYywKLSAgICAgICAgfTsKLSAgICAgICAgcGxwc1tpXSA9IGZyb250ZW5kQXRzYzNQbHBTZXR0aW5nczsKLSAgICB9Ci0gICAgcmV0dXJuIHBscHM7Ci19Ci0KLUZyb250ZW5kRHZic0NvZGVSYXRlIFR1bmVyRnJvbnRlbmQ6OmdldER2YnNDb2RlUmF0ZShjb25zdCBUdW5lckZyb250ZW5kRHZic0NvZGVSYXRlJiBjb2RlUmF0ZSkgewotICAgIEZyb250ZW5kSW5uZXJGZWMgaW5uZXJGZWMgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElubmVyRmVjPihjb2RlUmF0ZS5mZWMpOwotICAgIGJvb2wgaXNMaW5lYXIgPSBjb2RlUmF0ZS5pc0xpbmVhcjsKLSAgICBib29sIGlzU2hvcnRGcmFtZXMgPSBjb2RlUmF0ZS5pc1Nob3J0RnJhbWVzOwotICAgIHVpbnQzMl90IGJpdHNQZXIxMDAwU3ltYm9sID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvZGVSYXRlLmJpdHNQZXIxMDAwU3ltYm9sKTsKLSAgICBGcm9udGVuZER2YnNDb2RlUmF0ZSBjb2RlcmF0ZSB7Ci0gICAgICAgICAgICAuZmVjID0gaW5uZXJGZWMsCi0gICAgICAgICAgICAuaXNMaW5lYXIgPSBpc0xpbmVhciwKLSAgICAgICAgICAgIC5pc1Nob3J0RnJhbWVzID0gaXNTaG9ydEZyYW1lcywKLSAgICAgICAgICAgIC5iaXRzUGVyMTAwMFN5bWJvbCA9IGJpdHNQZXIxMDAwU3ltYm9sLAotICAgIH07Ci0gICAgcmV0dXJuIGNvZGVyYXRlOwotfQotCi1Gcm9udGVuZFNldHRpbmdzIFR1bmVyRnJvbnRlbmQ6OmdldEhpZGxGcm9udGVuZFNldHRpbmdzKGNvbnN0IFR1bmVyRnJvbnRlbmRTZXR0aW5ncyYgYWlkbFNldHRpbmdzKSB7Ci0gICAgYXV0byBzZXR0aW5ncyA9IGFpZGxTZXR0aW5ncy5zZXR0aW5nczsKLSAgICBGcm9udGVuZFNldHRpbmdzIGZyb250ZW5kU2V0dGluZ3M7Ci0KLSAgICBzd2l0Y2ggKHNldHRpbmdzLmdldFRhZygpKSB7Ci0gICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmFuYWxvZzogewotICAgICAgICAgICAgYXV0byBhbmFsb2cgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmFuYWxvZz4oKTsKLSAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3MuYW5hbG9nKHsKLSAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGFuYWxvZy5mcmVxdWVuY3kpLAotICAgICAgICAgICAgICAgIC50eXBlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRBbmFsb2dUeXBlPihhbmFsb2cuc2lnbmFsVHlwZSksCi0gICAgICAgICAgICAgICAgLnNpZlN0YW5kYXJkID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRBbmFsb2dTaWZTdGFuZGFyZD4oYW5hbG9nLnNpZlN0YW5kYXJkKSwKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6YXRzYzogewotICAgICAgICAgICAgYXV0byBhdHNjID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjphdHNjPigpOwotICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5ncy5hdHNjKHsKLSAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGF0c2MuZnJlcXVlbmN5KSwKLSAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IHN0YXRpY19jYXN0PEZyb250ZW5kQXRzY01vZHVsYXRpb24+KGF0c2MubW9kdWxhdGlvbiksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmF0c2MzOiB7Ci0gICAgICAgICAgICBhdXRvIGF0c2MzID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjphdHNjMz4oKTsKLSAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3MuYXRzYzMoewotICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYXRzYzMuZnJlcXVlbmN5KSwKLSAgICAgICAgICAgICAgICAuYmFuZHdpZHRoID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjM0JhbmR3aWR0aD4oYXRzYzMuYmFuZHdpZHRoKSwKLSAgICAgICAgICAgICAgICAuZGVtb2RPdXRwdXRGb3JtYXQgPSBzdGF0aWNfY2FzdDxGcm9udGVuZEF0c2MzRGVtb2RPdXRwdXRGb3JtYXQ+KAotICAgICAgICAgICAgICAgICAgICAgICAgYXRzYzMuZGVtb2RPdXRwdXRGb3JtYXQpLAotICAgICAgICAgICAgICAgIC5wbHBTZXR0aW5ncyA9IGdldEF0c2MzUGxwU2V0dGluZ3MoYXRzYzMpLAotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpjYWJsZTogewotICAgICAgICAgICAgYXV0byBkdmJjID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpjYWJsZT4oKTsKLSAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3MuZHZiYyh7Ci0gICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkdmJjLmZyZXF1ZW5jeSksCi0gICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YmNNb2R1bGF0aW9uPihkdmJjLm1vZHVsYXRpb24pLAotICAgICAgICAgICAgICAgIC5mZWMgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElubmVyRmVjPihkdmJjLmlubmVyRmVjKSwKLSAgICAgICAgICAgICAgICAuc3ltYm9sUmF0ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkdmJjLnN5bWJvbFJhdGUpLAotICAgICAgICAgICAgICAgIC5vdXRlckZlYyA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZiY091dGVyRmVjPihkdmJjLm91dGVyRmVjKSwKLSAgICAgICAgICAgICAgICAuYW5uZXggPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YmNBbm5leD4oZHZiYy5hbm5leCksCi0gICAgICAgICAgICAgICAgLnNwZWN0cmFsSW52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjU3BlY3RyYWxJbnZlcnNpb24+KAotICAgICAgICAgICAgICAgICAgICAgICAgZHZiYy5zcGVjdHJhbEludmVyc2lvbiksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmR2YnM6IHsKLSAgICAgICAgICAgIGF1dG8gZHZicyA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6ZHZicz4oKTsKLSAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3MuZHZicyh7Ci0gICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkdmJzLmZyZXF1ZW5jeSksCi0gICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnNNb2R1bGF0aW9uPihkdmJzLm1vZHVsYXRpb24pLAotICAgICAgICAgICAgICAgIC5jb2RlcmF0ZSA9IGdldER2YnNDb2RlUmF0ZShkdmJzLmNvZGVSYXRlKSwKLSAgICAgICAgICAgICAgICAuc3ltYm9sUmF0ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkdmJzLnN5bWJvbFJhdGUpLAotICAgICAgICAgICAgICAgIC5yb2xsb2ZmID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzUm9sbG9mZj4oZHZicy5yb2xsb2ZmKSwKLSAgICAgICAgICAgICAgICAucGlsb3QgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnNQaWxvdD4oZHZicy5waWxvdCksCi0gICAgICAgICAgICAgICAgLmlucHV0U3RyZWFtSWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZicy5pbnB1dFN0cmVhbUlkKSwKLSAgICAgICAgICAgICAgICAuc3RhbmRhcmQgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnNTdGFuZGFyZD4oZHZicy5zdGFuZGFyZCksCi0gICAgICAgICAgICAgICAgLnZjbU1vZGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnNWY21Nb2RlPihkdmJzLnZjbSksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmR2YnQ6IHsKLSAgICAgICAgICAgIGF1dG8gZHZidCA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6ZHZidD4oKTsKLSAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3MuZHZidCh7Ci0gICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkdmJ0LmZyZXF1ZW5jeSksCi0gICAgICAgICAgICAgICAgLnRyYW5zbWlzc2lvbk1vZGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRUcmFuc21pc3Npb25Nb2RlPigKLSAgICAgICAgICAgICAgICAgICAgICAgIGR2YnQudHJhbnNtaXNzaW9uTW9kZSksCi0gICAgICAgICAgICAgICAgLmJhbmR3aWR0aCA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZidEJhbmR3aWR0aD4oZHZidC5iYW5kd2lkdGgpLAotICAgICAgICAgICAgICAgIC5jb25zdGVsbGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0Q29uc3RlbGxhdGlvbj4oZHZidC5jb25zdGVsbGF0aW9uKSwKLSAgICAgICAgICAgICAgICAuaGllcmFyY2h5ID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0SGllcmFyY2h5PihkdmJ0LmhpZXJhcmNoeSksCi0gICAgICAgICAgICAgICAgLmhwQ29kZXJhdGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRDb2RlcmF0ZT4oZHZidC5ocENvZGVSYXRlKSwKLSAgICAgICAgICAgICAgICAubHBDb2RlcmF0ZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZidENvZGVyYXRlPihkdmJ0LmxwQ29kZVJhdGUpLAotICAgICAgICAgICAgICAgIC5ndWFyZEludGVydmFsID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0R3VhcmRJbnRlcnZhbD4oZHZidC5ndWFyZEludGVydmFsKSwKLSAgICAgICAgICAgICAgICAuaXNIaWdoUHJpb3JpdHkgPSBkdmJ0LmlzSGlnaFByaW9yaXR5LAotICAgICAgICAgICAgICAgIC5zdGFuZGFyZCA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZidFN0YW5kYXJkPihkdmJ0LnN0YW5kYXJkKSwKLSAgICAgICAgICAgICAgICAuaXNNaXNvID0gZHZidC5pc01pc28sCi0gICAgICAgICAgICAgICAgLnBscE1vZGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRQbHBNb2RlPihkdmJ0LnBscE1vZGUpLAotICAgICAgICAgICAgICAgIC5wbHBJZCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGR2YnQucGxwSWQpLAotICAgICAgICAgICAgICAgIC5wbHBHcm91cElkID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZHZidC5wbHBHcm91cElkKSwKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6aXNkYnM6IHsKLSAgICAgICAgICAgIGF1dG8gaXNkYnMgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmlzZGJzPigpOwotICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5ncy5pc2Ricyh7Ci0gICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihpc2Ricy5mcmVxdWVuY3kpLAotICAgICAgICAgICAgICAgIC5zdHJlYW1JZCA9IHN0YXRpY19jYXN0PHVpbnQxNl90Pihpc2Ricy5zdHJlYW1JZCksCi0gICAgICAgICAgICAgICAgLnN0cmVhbUlkVHlwZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnNTdHJlYW1JZFR5cGU+KGlzZGJzLnN0cmVhbUlkVHlwZSksCi0gICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzTW9kdWxhdGlvbj4oaXNkYnMubW9kdWxhdGlvbiksCi0gICAgICAgICAgICAgICAgLmNvZGVyYXRlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2Ric0NvZGVyYXRlPihpc2Ricy5jb2RlUmF0ZSksCi0gICAgICAgICAgICAgICAgLnN5bWJvbFJhdGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaXNkYnMuc3ltYm9sUmF0ZSksCi0gICAgICAgICAgICAgICAgLnJvbGxvZmYgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzUm9sbG9mZj4oaXNkYnMucm9sbG9mZiksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmlzZGJzMzogewotICAgICAgICAgICAgYXV0byBpc2RiczMgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmlzZGJzMz4oKTsKLSAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3MuaXNkYnMzKHsKLSAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJzMy5mcmVxdWVuY3kpLAotICAgICAgICAgICAgICAgIC5zdHJlYW1JZCA9IHN0YXRpY19jYXN0PHVpbnQxNl90Pihpc2RiczMuc3RyZWFtSWQpLAotICAgICAgICAgICAgICAgIC5zdHJlYW1JZFR5cGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzU3RyZWFtSWRUeXBlPihpc2RiczMuc3RyZWFtSWRUeXBlKSwKLSAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnMzTW9kdWxhdGlvbj4oaXNkYnMzLm1vZHVsYXRpb24pLAotICAgICAgICAgICAgICAgIC5jb2RlcmF0ZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnMzQ29kZXJhdGU+KGlzZGJzMy5jb2RlUmF0ZSksCi0gICAgICAgICAgICAgICAgLnN5bWJvbFJhdGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaXNkYnMzLnN5bWJvbFJhdGUpLAotICAgICAgICAgICAgICAgIC5yb2xsb2ZmID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RiczNSb2xsb2ZmPihpc2RiczMucm9sbG9mZiksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmlzZGJ0OiB7Ci0gICAgICAgICAgICBhdXRvIGlzZGJ0ID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjppc2RidD4oKTsKLSAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3MuaXNkYnQoewotICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaXNkYnQuZnJlcXVlbmN5KSwKLSAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnRNb2R1bGF0aW9uPihpc2RidC5tb2R1bGF0aW9uKSwKLSAgICAgICAgICAgICAgICAuYmFuZHdpZHRoID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidEJhbmR3aWR0aD4oaXNkYnQuYmFuZHdpZHRoKSwKLSAgICAgICAgICAgICAgICAubW9kZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnRNb2RlPihpc2RidC5tb2RlKSwKLSAgICAgICAgICAgICAgICAuY29kZXJhdGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJ0Q29kZXJhdGU+KGlzZGJ0LmNvZGVSYXRlKSwKLSAgICAgICAgICAgICAgICAuZ3VhcmRJbnRlcnZhbCA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnRHdWFyZEludGVydmFsPihpc2RidC5ndWFyZEludGVydmFsKSwKLSAgICAgICAgICAgICAgICAuc2VydmljZUFyZWFJZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihpc2RidC5zZXJ2aWNlQXJlYUlkKSwKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBmcm9udGVuZFNldHRpbmdzOwotfQotCi1Gcm9udGVuZFNldHRpbmdzRXh0MV8xIFR1bmVyRnJvbnRlbmQ6OmdldEhpZGxGcm9udGVuZFNldHRpbmdzRXh0KAotICAgICAgICBjb25zdCBUdW5lckZyb250ZW5kU2V0dGluZ3MmIGFpZGxTZXR0aW5ncykgewotICAgIEZyb250ZW5kU2V0dGluZ3NFeHQxXzEgZnJvbnRlbmRTZXR0aW5nc0V4dHsKLSAgICAgICAgLmVuZEZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhaWRsU2V0dGluZ3MuZW5kRnJlcXVlbmN5KSwKLSAgICAgICAgLmludmVyc2lvbiA9IHN0YXRpY19jYXN0PEZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb24+KGFpZGxTZXR0aW5ncy5pbnZlcnNpb24pLAotICAgIH07Ci0KLSAgICBhdXRvIHNldHRpbmdzID0gYWlkbFNldHRpbmdzLnNldHRpbmdzOwotICAgIHN3aXRjaCAoc2V0dGluZ3MuZ2V0VGFnKCkpIHsKLSAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6YW5hbG9nOiB7Ci0gICAgICAgICAgICBhdXRvIGFuYWxvZyA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6YW5hbG9nPigpOwotICAgICAgICAgICAgaWYgKGFuYWxvZy5pc0V4dGVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dC5zZXR0aW5nRXh0LmFuYWxvZyh7Ci0gICAgICAgICAgICAgICAgICAgIC5hZnRGbGFnID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRBbmFsb2dBZnRGbGFnPihhbmFsb2cuYWZ0RmxhZyksCi0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5ub2luaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmNhYmxlOiB7Ci0gICAgICAgICAgICBhdXRvIGR2YmMgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmNhYmxlPigpOwotICAgICAgICAgICAgaWYgKGR2YmMuaXNFeHRlbmRlZCkgewotICAgICAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5kdmJjKHsKLSAgICAgICAgICAgICAgICAgICAgLmludGVybGVhdmVNb2RlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRDYWJsZVRpbWVJbnRlcmxlYXZlTW9kZT4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHZiYy5pbnRlcmxlYXZlTW9kZSksCi0gICAgICAgICAgICAgICAgICAgIC5iYW5kd2lkdGggPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YmNCYW5kd2lkdGg+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR2YmMuYmFuZHdpZHRoKSwKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dC5zZXR0aW5nRXh0Lm5vaW5pdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6ZHZiczogewotICAgICAgICAgICAgYXV0byBkdmJzID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpkdmJzPigpOwotICAgICAgICAgICAgaWYgKGR2YnMuaXNFeHRlbmRlZCkgewotICAgICAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5kdmJzKHsKLSAgICAgICAgICAgICAgICAgICAgLnNjYW5UeXBlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzU2NhblR5cGU+KGR2YnMuc2NhblR5cGUpLAotICAgICAgICAgICAgICAgICAgICAuaXNEaXNlcWNSeE1lc3NhZ2UgPSBkdmJzLmlzRGlzZXFjUnhNZXNzYWdlLAotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzRXh0LnNldHRpbmdFeHQubm9pbml0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpkdmJ0OiB7Ci0gICAgICAgICAgICBhdXRvIGR2YnQgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmR2YnQ+KCk7Ci0gICAgICAgICAgICBpZiAoZHZidC5pc0V4dGVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dC5zZXR0aW5nRXh0LmR2YnQoewotICAgICAgICAgICAgICAgICAgICAuY29uc3RlbGxhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdmJ0Q29uc3RlbGxhdGlvbj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdmJ0LmNvbnN0ZWxsYXRpb24pLAotICAgICAgICAgICAgICAgICAgICAudHJhbnNtaXNzaW9uTW9kZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdmJ0VHJhbnNtaXNzaW9uTW9kZT4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdmJ0LnRyYW5zbWlzc2lvbk1vZGUpLAotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzRXh0LnNldHRpbmdFeHQubm9pbml0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpkdG1iOiB7Ci0gICAgICAgICAgICBhdXRvIGR0bWIgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmR0bWI+KCk7Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzRXh0LnNldHRpbmdFeHQuZHRtYih7Ci0gICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkdG1iLmZyZXF1ZW5jeSksCi0gICAgICAgICAgICAgICAgLnRyYW5zbWlzc2lvbk1vZGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER0bWJUcmFuc21pc3Npb25Nb2RlPigKLSAgICAgICAgICAgICAgICAgICAgICAgIGR0bWIudHJhbnNtaXNzaW9uTW9kZSksCi0gICAgICAgICAgICAgICAgLmJhbmR3aWR0aCA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHRtYkJhbmR3aWR0aD4oZHRtYi5iYW5kd2lkdGgpLAotICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iTW9kdWxhdGlvbj4oZHRtYi5tb2R1bGF0aW9uKSwKLSAgICAgICAgICAgICAgICAuY29kZVJhdGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER0bWJDb2RlUmF0ZT4oZHRtYi5jb2RlUmF0ZSksCi0gICAgICAgICAgICAgICAgLmd1YXJkSW50ZXJ2YWwgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER0bWJHdWFyZEludGVydmFsPihkdG1iLmd1YXJkSW50ZXJ2YWwpLAotICAgICAgICAgICAgICAgIC5pbnRlcmxlYXZlTW9kZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHRtYlRpbWVJbnRlcmxlYXZlTW9kZT4oZHRtYi5pbnRlcmxlYXZlTW9kZSksCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzRXh0LnNldHRpbmdFeHQubm9pbml0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZnJvbnRlbmRTZXR0aW5nc0V4dDsKLX0KK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJGcm9udGVuZC5oIGIvc2VydmljZXMvdHVuZXIvVHVuZXJGcm9udGVuZC5oCmluZGV4IDIyZmQ1MDkuLmRhNDcxZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRnJvbnRlbmQuaAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckZyb250ZW5kLmgKQEAgLTEsNSArMSw1IEBACiAvKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTcsOTUgKzE3LDc4IEBACiAjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJGUk9OVEVORF9ICiAjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJGUk9OVEVORF9ICiAKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvQm5Gcm9udGVuZENhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lGcm9udGVuZC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRnJvbnRlbmRDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyRnJvbnRlbmQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JVHVuZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMS9JRnJvbnRlbmQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMS9JRnJvbnRlbmRDYWxsYmFjay5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLXVzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpCblR1bmVyRnJvbnRlbmQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZyb250ZW5kQ2FsbGJhY2s7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckxuYjsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZEF0c2MzU2V0dGluZ3M7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmREdmJzQ29kZVJhdGU7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZFNldHRpbmdzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kU3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic0NvZGVSYXRlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEV2ZW50VHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTY2FuTWVzc2FnZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kU2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kU3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRnJvbnRlbmQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklGcm9udGVuZENhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZFNjYW5NZXNzYWdlRXh0MV8xOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZFNjYW5NZXNzYWdlVHlwZUV4dDFfMTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRTZXR0aW5nc0V4dDFfMTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRTdGF0dXNFeHQxXzE7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkJuRnJvbnRlbmRDYWxsYmFjazsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRFdmVudFR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU2Nhbk1lc3NhZ2U7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFNjYW5UeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTdGF0dXNSZWFkaW5lc3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU3RhdHVzVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUZyb250ZW5kOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRnJvbnRlbmRDYWxsYmFjazsKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAorbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgewogCiBjbGFzcyBUdW5lckZyb250ZW5kIDogcHVibGljIEJuVHVuZXJGcm9udGVuZCB7CiAKIHB1YmxpYzoKLSAgICBUdW5lckZyb250ZW5kKHNwPElGcm9udGVuZD4gZnJvbnRlbmQsIGludCBpZCk7CisgICAgVHVuZXJGcm9udGVuZChzaGFyZWRfcHRyPElGcm9udGVuZD4gZnJvbnRlbmQsIGludCBpZCk7CiAgICAgdmlydHVhbCB+VHVuZXJGcm9udGVuZCgpOwotICAgIFN0YXR1cyBzZXRDYWxsYmFjaygKLSAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmRDYWxsYmFjaz4mIHR1bmVyRnJvbnRlbmRDYWxsYmFjaykgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHR1bmUoY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBzZXR0aW5ncykgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHN0b3BUdW5lKCkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNjYW4oY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBzZXR0aW5ncywgaW50IGZyb250ZW5kU2NhblR5cGUpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzdG9wU2NhbigpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzZXRMbmIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJMbmI+JiBsbmIpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzZXRMbmEoYm9vbCBiRW5hYmxlKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgbGlua0NpQ2FtVG9Gcm9udGVuZChpbnQgY2lDYW1JZCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgdW5saW5rQ2lDYW1Ub0Zyb250ZW5kKGludCBjaUNhbUlkKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0U3RhdHVzKGNvbnN0IHZlY3RvcjxpbnQzMl90PiYgc3RhdHVzVHlwZXMsCi0gICAgICAgICAgICB2ZWN0b3I8VHVuZXJGcm9udGVuZFN0YXR1cz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIGdldFN0YXR1c0V4dGVuZGVkXzFfMShjb25zdCB2ZWN0b3I8aW50MzJfdD4mIHN0YXR1c1R5cGVzLAotICAgICAgICAgICAgdmVjdG9yPFR1bmVyRnJvbnRlbmRTdGF0dXM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBnZXRGcm9udGVuZElkKGludCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAotICAgIHN0cnVjdCBGcm9udGVuZENhbGxiYWNrIDogcHVibGljIElGcm9udGVuZENhbGxiYWNrIHsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmRDYWxsYmFjaz4mIGluX3R1bmVyRnJvbnRlbmRDYWxsYmFjaykgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgdHVuZShjb25zdCBGcm9udGVuZFNldHRpbmdzJiBpbl9zZXR0aW5ncykgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RvcFR1bmUoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzY2FuKGNvbnN0IEZyb250ZW5kU2V0dGluZ3MmIGluX3NldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJvbnRlbmRTY2FuVHlwZSBpbl9mcm9udGVuZFNjYW5UeXBlKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzdG9wU2NhbigpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldExuYihjb25zdCBzaGFyZWRfcHRyPElUdW5lckxuYj4mIGluX2xuYikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgbGlua0NpQ2FtVG9Gcm9udGVuZChpbnQzMl90IGluX2NpQ2FtSWQsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgdW5saW5rQ2lDYW1Ub0Zyb250ZW5kKGludDMyX3QgaW5fY2lDYW1JZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRTdGF0dXMoY29uc3QgdmVjdG9yPEZyb250ZW5kU3RhdHVzVHlwZT4mIGluX3N0YXR1c1R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRTdGF0dXM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEZyb250ZW5kSWQoaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRIYXJkd2FyZUluZm8oc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVtb3ZlT3V0cHV0UGlkKGludDMyX3QgaW5fcGlkKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRGcm9udGVuZFN0YXR1c1JlYWRpbmVzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEZyb250ZW5kU3RhdHVzVHlwZT4mIGluX3N0YXR1c1R5cGVzLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RnJvbnRlbmRTdGF0dXNSZWFkaW5lc3M+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCisgICAgc3RydWN0IEZyb250ZW5kQ2FsbGJhY2sgOiBwdWJsaWMgQm5Gcm9udGVuZENhbGxiYWNrIHsKICAgICAgICAgRnJvbnRlbmRDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+IHR1bmVyRnJvbnRlbmRDYWxsYmFjaykKLSAgICAgICAgICAgICAgICA6IG1UdW5lckZyb250ZW5kQ2FsbGJhY2sodHVuZXJGcm9udGVuZENhbGxiYWNrKSB7fTsKKyAgICAgICAgICAgICAgOiBtVHVuZXJGcm9udGVuZENhbGxiYWNrKHR1bmVyRnJvbnRlbmRDYWxsYmFjayl7fTsKIAotICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkV2ZW50KEZyb250ZW5kRXZlbnRUeXBlIGZyb250ZW5kRXZlbnRUeXBlKTsKLSAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25TY2FuTWVzc2FnZSgKLSAgICAgICAgICAgICAgICBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZSB0eXBlLCBjb25zdCBGcm9udGVuZFNjYW5NZXNzYWdlJiBtZXNzYWdlKTsKLSAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25TY2FuTWVzc2FnZUV4dDFfMSgKLSAgICAgICAgICAgICAgICBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZUV4dDFfMSB0eXBlLCBjb25zdCBGcm9udGVuZFNjYW5NZXNzYWdlRXh0MV8xJiBtZXNzYWdlKTsKKyAgICAgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb25FdmVudChGcm9udGVuZEV2ZW50VHlwZSBmcm9udGVuZEV2ZW50VHlwZSkgb3ZlcnJpZGU7CisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uU2Nhbk1lc3NhZ2UoRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGcm9udGVuZFNjYW5NZXNzYWdlJiBtZXNzYWdlKSBvdmVycmlkZTsKIAogICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+IG1UdW5lckZyb250ZW5kQ2FsbGJhY2s7CiAgICAgfTsKIAogcHJpdmF0ZToKLSAgICBoaWRsX3ZlYzxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M+IGdldEF0c2MzUGxwU2V0dGluZ3MoCi0gICAgICAgICAgICBjb25zdCBUdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncyYgc2V0dGluZ3MpOwotICAgIEZyb250ZW5kRHZic0NvZGVSYXRlIGdldER2YnNDb2RlUmF0ZShjb25zdCBUdW5lckZyb250ZW5kRHZic0NvZGVSYXRlJiBjb2RlUmF0ZSk7Ci0gICAgRnJvbnRlbmRTZXR0aW5ncyBnZXRIaWRsRnJvbnRlbmRTZXR0aW5ncyhjb25zdCBUdW5lckZyb250ZW5kU2V0dGluZ3MmIGFpZGxTZXR0aW5ncyk7Ci0gICAgRnJvbnRlbmRTZXR0aW5nc0V4dDFfMSBnZXRIaWRsRnJvbnRlbmRTZXR0aW5nc0V4dChjb25zdCBUdW5lckZyb250ZW5kU2V0dGluZ3MmIGFpZGxTZXR0aW5ncyk7Ci0gICAgdm9pZCBnZXRBaWRsRnJvbnRlbmRTdGF0dXMoCi0gICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRTdGF0dXM+JiBoaWRsU3RhdHVzLCB2ZWN0b3I8VHVuZXJGcm9udGVuZFN0YXR1cz4mIGFpZGxTdGF0dXMpOwotICAgIHZvaWQgZ2V0QWlkbEZyb250ZW5kU3RhdHVzRXh0KAotICAgICAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzRXh0MV8xPiYgaGlkbFN0YXR1cywgdmVjdG9yPFR1bmVyRnJvbnRlbmRTdGF0dXM+JiBhaWRsU3RhdHVzKTsKLQogICAgIGludCBtSWQ7Ci0gICAgc3A8SUZyb250ZW5kPiBtRnJvbnRlbmQ7Ci0gICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJRnJvbnRlbmQ+IG1Gcm9udGVuZF8xXzE7CisgICAgc2hhcmVkX3B0cjxJRnJvbnRlbmQ+IG1Gcm9udGVuZDsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAogCiAjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkZST05URU5EX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVySGVscGVyLmNwcCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVySGVscGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzY3MTEwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJIZWxwZXIuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVHVuZXJIZWxwZXIuaCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lcnJlc291cmNlbWFuYWdlci9JVHVuZXJSZXNvdXJjZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlTWFuYWdlck5hdGl2ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVycmVzb3VyY2VtYW5hZ2VyOjpJVHVuZXJSZXNvdXJjZU1hbmFnZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcjsKK3VzaW5nIDo6YW5kcm9pZDo6SUJpbmRlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aW50ZXJmYWNlX2Nhc3Q7Cit1c2luZyA6OmFuZHJvaWQ6OklTZXJ2aWNlTWFuYWdlcjsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKKy8vIFN5c3RlbSBGZWF0dXJlIGRlZmluZWQgaW4gUGFja2FnZU1hbmFnZXIKK3N0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2IEZFQVRVUkVfVFVORVIoOjphbmRyb2lkOjpTdHJpbmcxNigiYW5kcm9pZC5oYXJkd2FyZS50di50dW5lciIpKTsKKworaW50MzJfdCBUdW5lckhlbHBlcjo6c1Jlc291cmNlUmVxdWVzdENvdW50ID0gMDsKKworYm9vbCBUdW5lckhlbHBlcjo6Y2hlY2tUdW5lckZlYXR1cmUoKSB7CisgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzZXJ2aWNlTWdyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgc3A8SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiBwYWNrYWdlTWdyOworICAgIGlmIChzZXJ2aWNlTWdyLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBzZXJ2aWNlIG1hbmFnZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzZXJ2aWNlTWdyLT53YWl0Rm9yU2VydmljZShTdHJpbmcxNigicGFja2FnZV9uYXRpdmUiKSk7CisgICAgcGFja2FnZU1nciA9IGludGVyZmFjZV9jYXN0PElQYWNrYWdlTWFuYWdlck5hdGl2ZT4oYmluZGVyKTsKKyAgICBpZiAocGFja2FnZU1nciAhPSBudWxscHRyKSB7CisgICAgICAgIGJvb2wgaGFzRmVhdHVyZSA9IGZhbHNlOworICAgICAgICBTdGF0dXMgc3RhdHVzID0gcGFja2FnZU1nci0+aGFzU3lzdGVtRmVhdHVyZShGRUFUVVJFX1RVTkVSLCAwLCAmaGFzRmVhdHVyZSk7CisgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBoYXNTeXN0ZW1GZWF0dXJlIGZhaWxlZDogJXMiLCBfX2Z1bmNfXywgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJDdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHR1bmVyIGZlYXVyZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCIlczogQ2Fubm90IGZpbmQgcGFja2FnZSBtYW5hZ2VyLiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBUT0RPOiB1cGRhdGUgRGVtdXgsIERlc2NyYW1ibGVyLgordm9pZCBUdW5lckhlbHBlcjo6dXBkYXRlVHVuZXJSZXNvdXJjZXMoY29uc3QgdmVjdG9yPFR1bmVyRnJvbnRlbmRJbmZvPiYgZmVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvcjxpbnQzMl90PiYgbG5iSGFuZGxlcykgeworICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcihBU2VydmljZU1hbmFnZXJfd2FpdEZvclNlcnZpY2UoInR2X3R1bmVyX3Jlc291cmNlX21nciIpKTsKKyAgICBzaGFyZWRfcHRyPElUdW5lclJlc291cmNlTWFuYWdlcj4gdHVuZXJSTSA9IElUdW5lclJlc291cmNlTWFuYWdlcjo6ZnJvbUJpbmRlcihiaW5kZXIpOworICAgIGlmICh0dW5lclJNID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHR1bmVyUk0tPnNldEZyb250ZW5kSW5mb0xpc3QoZmVJbmZvcyk7CisgICAgdHVuZXJSTS0+c2V0TG5iSW5mb0xpc3QobG5iSGFuZGxlcyk7Cit9CisKKy8vIFRPRE86IGNyZWF0ZSBhIG1hcCBiZXR3ZWVuIHJlc291cmNlIGlkIGFuZCBoYW5kbGVzLgoraW50IFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShpbnQgcmVzb3VyY2VIYW5kbGUsIGludCAvKnR5cGUqLykgeworICAgIHJldHVybiAocmVzb3VyY2VIYW5kbGUgJiAweDAwZmYwMDAwKSA+PiAxNjsKK30KKworaW50IFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUhhbmRsZUZyb21JZChpbnQgaWQsIGludCByZXNvdXJjZVR5cGUpIHsKKyAgICAvLyBUT0RPOiBidWlsZCB1cCByYW5kb21seSBnZW5lcmF0ZWQgaWQgdG8gaGFuZGxlIG1hcHBpbmcKKyAgICByZXR1cm4gKHJlc291cmNlVHlwZSAmIDB4MDAwMDAwZmYpIDw8IDI0IHwgKGlkIDw8IDE2KSB8IChzUmVzb3VyY2VSZXF1ZXN0Q291bnQrKyAmIDB4ZmZmZik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJIZWxwZXIuaCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVySGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1ZGY1NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVySGVscGVyLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSRFZSSEVMUEVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkRWUkhFTFBFUl9ICisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXJyZXNvdXJjZW1hbmFnZXIvVHVuZXJGcm9udGVuZEluZm8uaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXJyZXNvdXJjZW1hbmFnZXI6OlR1bmVyRnJvbnRlbmRJbmZvOwordXNpbmcgOjphbmRyb2lkOjpTdHJpbmcxNjsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCitjb25zdCBzdGF0aWMgaW50IFRVTkVSX0hBTF9WRVJTSU9OX1VOS05PV04gPSAwOworY29uc3Qgc3RhdGljIGludCBUVU5FUl9IQUxfVkVSU0lPTl8xXzAgPSAxIDw8IDE2OworY29uc3Qgc3RhdGljIGludCBUVU5FUl9IQUxfVkVSU0lPTl8xXzEgPSAoMSA8PCAxNikgfCAxOworY29uc3Qgc3RhdGljIGludCBUVU5FUl9IQUxfVkVSU0lPTl8yXzAgPSAyIDw8IDE2OworCisvLyBLZWVwIHN5bmNpbmcgd2l0aCBTaGFyZUZpbHRlci5qYXZhCitjb25zdCBzdGF0aWMgaW50IFNUQVRVU19JTkFDQ0VTU0lCTEUgPSAxIDw8IDc7CisKK2NvbnN0IHN0YXRpYyBTdHJpbmcxNiBzU2hhcmVkRmlsdGVyUGVybWlzc2lvbigiYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19UVl9TSEFSRURfRklMVEVSIik7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRlJPTlRFTkQsCisgICAgREVNVVgsCisgICAgREVTQ1JBTUJMRVIsCisgICAgTE5CCit9IFR1bmVyUmVzb3VyY2VUeXBlOworCitjbGFzcyBUdW5lckhlbHBlciB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgY2hlY2tUdW5lckZlYXR1cmUoKTsKKworICAgIC8vIFRPRE86IHVwZGF0ZSBEZW11eCwgRGVzY3JhbWJsZXIuCisgICAgc3RhdGljIHZvaWQgdXBkYXRlVHVuZXJSZXNvdXJjZXMoY29uc3QgdmVjdG9yPFR1bmVyRnJvbnRlbmRJbmZvPiYgZmVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8aW50MzJfdD4mIGxuYkhhbmRsZXMpOworICAgIC8vIFRPRE86IGNyZWF0ZSBhIG1hcCBiZXR3ZWVuIHJlc291cmNlIGlkIGFuZCBoYW5kbGVzLgorICAgIHN0YXRpYyBpbnQgZ2V0UmVzb3VyY2VJZEZyb21IYW5kbGUoaW50IHJlc291cmNlSGFuZGxlLCBpbnQgdHlwZSk7CisgICAgc3RhdGljIGludCBnZXRSZXNvdXJjZUhhbmRsZUZyb21JZChpbnQgaWQsIGludCByZXNvdXJjZVR5cGUpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBpbnQzMl90IHNSZXNvdXJjZVJlcXVlc3RDb3VudDsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfVFVORVJEVlJIRUxQRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJMbmIuY3BwIGIvc2VydmljZXMvdHVuZXIvVHVuZXJMbmIuY3BwCmluZGV4IDc3MjQ4ZDQuLjFlMTQzYzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyTG5iLmNwcAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckxuYi5jcHAKQEAgLTE4LDEyMyArMTgsMTE2IEBACiAKICNpbmNsdWRlICJUdW5lckxuYi5oIgogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkxuYlBvc2l0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpMbmJUb25lOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpMbmJWb2x0YWdlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZXN1bHQ7CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lMbmJDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KIAordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJTG5iQ2FsbGJhY2s7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlc3VsdDsKKworbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgewogCi1UdW5lckxuYjo6VHVuZXJMbmIoc3A8SUxuYj4gbG5iLCBpbnQgaWQpIHsKK1R1bmVyTG5iOjpUdW5lckxuYihzaGFyZWRfcHRyPElMbmI+IGxuYiwgaW50IGlkKSB7CiAgICAgbUxuYiA9IGxuYjsKICAgICBtSWQgPSBpZDsKIH0KIAogVHVuZXJMbmI6On5UdW5lckxuYigpIHsKLSAgICBtTG5iID0gTlVMTDsKKyAgICBtTG5iID0gbnVsbHB0cjsKICAgICBtSWQgPSAtMTsKIH0KIAotU3RhdHVzIFR1bmVyTG5iOjpzZXRDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJMbmJDYWxsYmFjaz4mIHR1bmVyTG5iQ2FsbGJhY2spIHsKLSAgICBpZiAobUxuYiA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckxuYjo6c2V0Q2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iQ2FsbGJhY2s+JiBpbl90dW5lckxuYkNhbGxiYWNrKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIGlmICh0dW5lckxuYkNhbGxiYWNrID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIGlmIChpbl90dW5lckxuYkNhbGxiYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CiAgICAgfQogCi0gICAgc3A8SUxuYkNhbGxiYWNrPiBsbmJDYWxsYmFjayA9IG5ldyBMbmJDYWxsYmFjayh0dW5lckxuYkNhbGxiYWNrKTsKLSAgICBSZXN1bHQgc3RhdHVzID0gbUxuYi0+c2V0Q2FsbGJhY2sobG5iQ2FsbGJhY2spOwotICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICBzaGFyZWRfcHRyPElMbmJDYWxsYmFjaz4gbG5iQ2FsbGJhY2sgPQorICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8TG5iQ2FsbGJhY2s+KGluX3R1bmVyTG5iQ2FsbGJhY2spOworICAgIHJldHVybiBtTG5iLT5zZXRDYWxsYmFjayhsbmJDYWxsYmFjayk7CiB9CiAKLVN0YXR1cyBUdW5lckxuYjo6c2V0Vm9sdGFnZShpbnQgdm9sdGFnZSkgewotICAgIGlmIChtTG5iID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyTG5iOjpzZXRWb2x0YWdlKExuYlZvbHRhZ2UgaW5fdm9sdGFnZSkgeworICAgIGlmIChtTG5iID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklMbmIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgc3RhdHVzID0gbUxuYi0+c2V0Vm9sdGFnZShzdGF0aWNfY2FzdDxMbmJWb2x0YWdlPih2b2x0YWdlKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtTG5iLT5zZXRWb2x0YWdlKGluX3ZvbHRhZ2UpOwogfQogCi1TdGF0dXMgVHVuZXJMbmI6OnNldFRvbmUoaW50IHRvbmUpIHsKLSAgICBpZiAobUxuYiA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckxuYjo6c2V0VG9uZShMbmJUb25lIGluX3RvbmUpIHsKKyAgICBpZiAobUxuYiA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJTG5iIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHN0YXR1cyA9IG1MbmItPnNldFRvbmUoc3RhdGljX2Nhc3Q8TG5iVG9uZT4odG9uZSkpOwotICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbUxuYi0+c2V0VG9uZShpbl90b25lKTsKIH0KIAotU3RhdHVzIFR1bmVyTG5iOjpzZXRTYXRlbGxpdGVQb3NpdGlvbihpbnQgcG9zaXRpb24pIHsKLSAgICBpZiAobUxuYiA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckxuYjo6c2V0U2F0ZWxsaXRlUG9zaXRpb24oTG5iUG9zaXRpb24gaW5fcG9zaXRpb24pIHsKKyAgICBpZiAobUxuYiA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJTG5iIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHN0YXR1cyA9IG1MbmItPnNldFNhdGVsbGl0ZVBvc2l0aW9uKHN0YXRpY19jYXN0PExuYlBvc2l0aW9uPihwb3NpdGlvbikpOwotICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbUxuYi0+c2V0U2F0ZWxsaXRlUG9zaXRpb24oaW5fcG9zaXRpb24pOwogfQogCi1TdGF0dXMgVHVuZXJMbmI6OnNlbmREaXNlcWNNZXNzYWdlKGNvbnN0IHZlY3Rvcjx1aW50OF90PiYgZGlzZXFjTWVzc2FnZSkgewotICAgIGlmIChtTG5iID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyTG5iOjpzZW5kRGlzZXFjTWVzc2FnZShjb25zdCB2ZWN0b3I8dWludDhfdD4mIGluX2Rpc2VxY01lc3NhZ2UpIHsKKyAgICBpZiAobUxuYiA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJTG5iIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHN0YXR1cyA9IG1MbmItPnNlbmREaXNlcWNNZXNzYWdlKGRpc2VxY01lc3NhZ2UpOwotICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbUxuYi0+c2VuZERpc2VxY01lc3NhZ2UoaW5fZGlzZXFjTWVzc2FnZSk7CiB9CiAKLVN0YXR1cyBUdW5lckxuYjo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1MbmIgPT0gTlVMTCkgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJMbmI6OmNsb3NlKCkgeworICAgIGlmIChtTG5iID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklMbmIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBSZXN1bHQgcmVzID0gbUxuYi0+Y2xvc2UoKTsKLSAgICBtTG5iID0gTlVMTDsKKyAgICBhdXRvIHJlcyA9IG1MbmItPmNsb3NlKCk7CisgICAgbUxuYiA9IG51bGxwdHI7CiAKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogLy8vLy8vLy8vLy8vLy8vIElMbmJDYWxsYmFjayAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1SZXR1cm48dm9pZD4gVHVuZXJMbmI6OkxuYkNhbGxiYWNrOjpvbkV2ZW50KGNvbnN0IExuYkV2ZW50VHlwZSBsbmJFdmVudFR5cGUpIHsKLSAgICBpZiAobVR1bmVyTG5iQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICBtVHVuZXJMbmJDYWxsYmFjay0+b25FdmVudCgoaW50KWxuYkV2ZW50VHlwZSk7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckxuYjo6TG5iQ2FsbGJhY2s6Om9uRXZlbnQoY29uc3QgTG5iRXZlbnRUeXBlIGxuYkV2ZW50VHlwZSkgeworICAgIGlmIChtVHVuZXJMbmJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckxuYkNhbGxiYWNrLT5vbkV2ZW50KGxuYkV2ZW50VHlwZSk7CiAgICAgfQotICAgIHJldHVybiBWb2lkKCk7CisgICAgcmV0dXJuIG5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKIH0KIAotUmV0dXJuPHZvaWQ+IFR1bmVyTG5iOjpMbmJDYWxsYmFjazo6b25EaXNlcWNNZXNzYWdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkaXNlcWNNZXNzYWdlKSB7Ci0gICAgaWYgKG1UdW5lckxuYkNhbGxiYWNrICE9IE5VTEwgJiYgZGlzZXFjTWVzc2FnZSAhPSBOVUxMKSB7Ci0gICAgICAgIHZlY3Rvcjx1aW50OF90PiBtc2coYmVnaW4oZGlzZXFjTWVzc2FnZSksIGVuZChkaXNlcWNNZXNzYWdlKSk7Ci0gICAgICAgIG1UdW5lckxuYkNhbGxiYWNrLT5vbkRpc2VxY01lc3NhZ2UobXNnKTsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyTG5iOjpMbmJDYWxsYmFjazo6b25EaXNlcWNNZXNzYWdlKGNvbnN0IHZlY3Rvcjx1aW50OF90PiYgZGlzZXFjTWVzc2FnZSkgeworICAgIGlmIChtVHVuZXJMbmJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckxuYkNhbGxiYWNrLT5vbkRpc2VxY01lc3NhZ2UoZGlzZXFjTWVzc2FnZSk7CiAgICAgfQotICAgIHJldHVybiBWb2lkKCk7CisgICAgcmV0dXJuIG5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKIH0KKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lckxuYi5oIGIvc2VydmljZXMvdHVuZXIvVHVuZXJMbmIuaAppbmRleCA1MDBkMDcyLi43Mjk4OGE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lckxuYi5oCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyTG5iLmgKQEAgLTE3LDU1ICsxNyw2MSBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSRkxOQl9ICiAjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJGTE5CX0gKIAorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9CbkxuYkNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lMbmIuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lckxuYi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lMbmIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JTG5iQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6Qm5UdW5lckxuYjsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyTG5iQ2FsbGJhY2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklMbmI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklMbmJDYWxsYmFjazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6TG5iRXZlbnRUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpCbkxuYkNhbGxiYWNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJTG5iOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpMbmJFdmVudFR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkxuYlBvc2l0aW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpMbmJUb25lOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpMbmJWb2x0YWdlOwogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCituYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CiAKIGNsYXNzIFR1bmVyTG5iIDogcHVibGljIEJuVHVuZXJMbmIgewogCiBwdWJsaWM6Ci0gICAgVHVuZXJMbmIoc3A8SUxuYj4gbG5iLCBpbnQgaWQpOworICAgIFR1bmVyTG5iKHNoYXJlZF9wdHI8SUxuYj4gbG5iLCBpbnQgaWQpOwogICAgIHZpcnR1YWwgflR1bmVyTG5iKCk7Ci0gICAgU3RhdHVzIHNldENhbGxiYWNrKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iQ2FsbGJhY2s+JiB0dW5lckxuYkNhbGxiYWNrKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0Vm9sdGFnZShpbnQgdm9sdGFnZSkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldFRvbmUoaW50IHRvbmUpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzZXRTYXRlbGxpdGVQb3NpdGlvbihpbnQgcG9zaXRpb24pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzZW5kRGlzZXFjTWVzc2FnZShjb25zdCB2ZWN0b3I8dWludDhfdD4mIGRpc2VxY01lc3NhZ2UpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiYgaW5fdHVuZXJMbmJDYWxsYmFjaykgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0Vm9sdGFnZShMbmJWb2x0YWdlIGluX3ZvbHRhZ2UpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldFRvbmUoTG5iVG9uZSBpbl90b25lKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRTYXRlbGxpdGVQb3NpdGlvbihMbmJQb3NpdGlvbiBpbl9wb3NpdGlvbikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2VuZERpc2VxY01lc3NhZ2UoY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBpbl9kaXNlcWNNZXNzYWdlKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOwogCiAgICAgaW50IGdldElkKCkgeyByZXR1cm4gbUlkOyB9CiAKLSAgICBzdHJ1Y3QgTG5iQ2FsbGJhY2sgOiBwdWJsaWMgSUxuYkNhbGxiYWNrIHsKKyAgICBzdHJ1Y3QgTG5iQ2FsbGJhY2sgOiBwdWJsaWMgQm5MbmJDYWxsYmFjayB7CiAgICAgICAgIExuYkNhbGxiYWNrKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iQ2FsbGJhY2s+IHR1bmVyTG5iQ2FsbGJhY2spCi0gICAgICAgICAgICAgICAgOiBtVHVuZXJMbmJDYWxsYmFjayh0dW5lckxuYkNhbGxiYWNrKSB7fTsKKyAgICAgICAgICAgICAgOiBtVHVuZXJMbmJDYWxsYmFjayh0dW5lckxuYkNhbGxiYWNrKXt9OwogCi0gICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRXZlbnQoY29uc3QgTG5iRXZlbnRUeXBlIGxuYkV2ZW50VHlwZSk7Ci0gICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRGlzZXFjTWVzc2FnZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGlzZXFjTWVzc2FnZSk7CisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRXZlbnQoY29uc3QgTG5iRXZlbnRUeXBlIGxuYkV2ZW50VHlwZSkgb3ZlcnJpZGU7CisgICAgICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9uRGlzZXFjTWVzc2FnZShjb25zdCB2ZWN0b3I8dWludDhfdD4mIGRpc2VxY01lc3NhZ2UpIG92ZXJyaWRlOwogCiAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyTG5iQ2FsbGJhY2s+IG1UdW5lckxuYkNhbGxiYWNrOwogICAgIH07CiAKIHByaXZhdGU6CiAgICAgaW50IG1JZDsKLSAgICBzcDxJTG5iPiBtTG5iOworICAgIHNoYXJlZF9wdHI8SUxuYj4gbUxuYjsKIH07CiAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAogCiAjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkZMTkJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyU2VydmljZS5jcHAKaW5kZXggNWI0MTI5YS4uNDgzM2FhZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvVHVuZXJTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lclNlcnZpY2UuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMzY5ICsxNCwzNDIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiVHVuZXJTZXJ2aWNlIgogCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZU1hbmFnZXJOYXRpdmUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSAiVHVuZXJTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiVHVuZXJGcm9udGVuZC5oIgotI2luY2x1ZGUgIlR1bmVyTG5iLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSURlbXV4Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JRnJvbnRlbmQuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSUxuYi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCiAjaW5jbHVkZSAiVHVuZXJEZW11eC5oIgogI2luY2x1ZGUgIlR1bmVyRGVzY3JhbWJsZXIuaCIKKyNpbmNsdWRlICJUdW5lckZyb250ZW5kLmgiCisjaW5jbHVkZSAiVHVuZXJIZWxwZXIuaCIKKyNpbmNsdWRlICJUdW5lckxuYi5oIgogCi11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRBbmFsb2dDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllczsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZEF0c2NDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRDYWJsZUNhcGFiaWxpdGllczsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZER2YnNDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRJc2RidENhcGFiaWxpdGllczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJBdlNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlck1haW5UeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclNldHRpbmdzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4VHNGaWx0ZXJUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklGcm9udGVuZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUxuYjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6TG5iSWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpJRGVtdXg7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OklEZXNjcmFtYmxlcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6SUZyb250ZW5kOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OklQQ1RocmVhZFN0YXRlOwordXNpbmcgOjphbmRyb2lkOjpQZXJtaXNzaW9uQ2FjaGU7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwogCituYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK3NoYXJlZF9wdHI8VHVuZXJTZXJ2aWNlPiBUdW5lclNlcnZpY2U6OnNUdW5lclNlcnZpY2UgPSBudWxscHRyOwogCiBUdW5lclNlcnZpY2U6OlR1bmVyU2VydmljZSgpIHsKLSAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNlcnZpY2VNZ3IgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKLSAgICBzcDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiBwYWNrYWdlTWdyOwotICAgIGlmIChzZXJ2aWNlTWdyLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBzZXJ2aWNlIG1hbmFnZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzZXJ2aWNlTWdyLT53YWl0Rm9yU2VydmljZShTdHJpbmcxNigicGFja2FnZV9uYXRpdmUiKSk7Ci0gICAgICAgIHBhY2thZ2VNZ3IgPSBpbnRlcmZhY2VfY2FzdDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPihiaW5kZXIpOwotICAgIH0KLQotICAgIGJvb2wgaGFzRmVhdHVyZSA9IGZhbHNlOwotICAgIGlmIChwYWNrYWdlTWdyICE9IG51bGxwdHIpIHsKLSAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gcGFja2FnZU1nci0+aGFzU3lzdGVtRmVhdHVyZShGRUFUVVJFX1RVTkVSLCAwLCAmaGFzRmVhdHVyZSk7Ci0gICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBoYXNTeXN0ZW1GZWF0dXJlIGZhaWxlZDogJXMiLAotICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWhhc0ZlYXR1cmUpIHsKLSAgICAgICAgICAgIEFMT0dEKCJDdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHR1bmVyIGZlYXVyZS4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dEKCIlczogQ2Fubm90IGZpbmQgcGFja2FnZSBtYW5hZ2VyLiIsIF9fZnVuY19fKTsKKyAgICBpZiAoIVR1bmVySGVscGVyOjpjaGVja1R1bmVyRmVhdHVyZSgpKSB7CisgICAgICAgIEFMT0dEKCJEZXZpY2UgZG9lc24ndCBoYXZlIHR1bmVyIGhhcmR3YXJlLiIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyKEFTZXJ2aWNlTWFuYWdlcl93YWl0Rm9yU2VydmljZSgidHZfdHVuZXJfcmVzb3VyY2VfbWdyIikpOwotICAgIG1UdW5lclJlc291cmNlTWFuYWdlciA9IElUdW5lclJlc291cmNlTWFuYWdlcjo6ZnJvbUJpbmRlcihiaW5kZXIpOwogICAgIHVwZGF0ZVR1bmVyUmVzb3VyY2VzKCk7CiB9CiAKIFR1bmVyU2VydmljZTo6flR1bmVyU2VydmljZSgpIHt9CiAKIGJpbmRlcl9zdGF0dXNfdCBUdW5lclNlcnZpY2U6Omluc3RhbnRpYXRlKCkgewotICAgIHNoYXJlZF9wdHI8VHVuZXJTZXJ2aWNlPiBzZXJ2aWNlID0KLSAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyU2VydmljZT4oKTsKLSAgICByZXR1cm4gQVNlcnZpY2VNYW5hZ2VyX2FkZFNlcnZpY2Uoc2VydmljZS0+YXNCaW5kZXIoKS5nZXQoKSwgZ2V0U2VydmljZU5hbWUoKSk7CisgICAgc1R1bmVyU2VydmljZSA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyU2VydmljZT4oKTsKKyAgICByZXR1cm4gQVNlcnZpY2VNYW5hZ2VyX2FkZFNlcnZpY2Uoc1R1bmVyU2VydmljZS0+YXNCaW5kZXIoKS5nZXQoKSwgZ2V0U2VydmljZU5hbWUoKSk7Cit9CisKK3NoYXJlZF9wdHI8VHVuZXJTZXJ2aWNlPiBUdW5lclNlcnZpY2U6OmdldFR1bmVyU2VydmljZSgpIHsKKyAgICByZXR1cm4gc1R1bmVyU2VydmljZTsKIH0KIAogYm9vbCBUdW5lclNlcnZpY2U6Omhhc0lUdW5lcigpIHsKLSAgICBBTE9HRCgiaGFzSVR1bmVyIik7CisgICAgQUxPR1YoImhhc0lUdW5lciIpOwogICAgIGlmIChtVHVuZXIgIT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgbVR1bmVyID0gSVR1bmVyOjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1UdW5lciA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IElUdW5lciBzZXJ2aWNlIik7CisgICAgY29uc3Qgc3RyaW5nIHN0YXRzU2VydmljZU5hbWUgPSBzdHJpbmcoKSArIElUdW5lcjo6ZGVzY3JpcHRvciArICIvZGVmYXVsdCI7CisgICAgaWYgKEFTZXJ2aWNlTWFuYWdlcl9pc0RlY2xhcmVkKHN0YXRzU2VydmljZU5hbWUuY19zdHIoKSkpIHsKKyAgICAgICAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyKEFTZXJ2aWNlTWFuYWdlcl93YWl0Rm9yU2VydmljZShzdGF0c1NlcnZpY2VOYW1lLmNfc3RyKCkpKTsKKyAgICAgICAgbVR1bmVyID0gSVR1bmVyOjpmcm9tQmluZGVyKGJpbmRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVR1bmVyID0gbnVsbHB0cjsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgVHVuZXIgSEFMIFNlcnZpY2UiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBtVHVuZXJWZXJzaW9uID0gVFVORVJfSEFMX1ZFUlNJT05fMV8wOwotICAgIG1UdW5lcl8xXzEgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklUdW5lcjo6Y2FzdEZyb20obVR1bmVyKTsKLSAgICBpZiAobVR1bmVyXzFfMSAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1UdW5lclZlcnNpb24gPSBUVU5FUl9IQUxfVkVSU0lPTl8xXzE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgSVR1bmVyXzFfMSBzZXJ2aWNlIik7Ci0gICAgfQorCisgICAgbVR1bmVyVmVyc2lvbiA9IFRVTkVSX0hBTF9WRVJTSU9OXzJfMDsKKyAgICAvLyBUT0RPOiBFbmFibGUgdGhpcyBhZnRlciBUdW5lciBIQUwgaXMgZnJvemVuLgorICAgIC8vIGlmIChtVHVuZXItPmdldEludGVyZmFjZVZlcnNpb24oJm1UdW5lclZlcnNpb24pLmlzT2soKSkgeworICAgIC8vICAvLyBUdW5lciBBSURMIEhBTCB2ZXJzaW9uIDEgd2lsbCBiZSBUdW5lciBIQUwgMi4wCisgICAgLy8gIG1UdW5lclZlcnNpb24gPSAobVR1bmVyVmVyc2lvbiArIDEpIDw8IDE2OworICAgIC8vfQorCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgVHVuZXJTZXJ2aWNlOjpoYXNJVHVuZXJfMV8xKCkgewotICAgIEFMT0dEKCJoYXNJVHVuZXJfMV8xIik7Ci0gICAgaGFzSVR1bmVyKCk7Ci0gICAgcmV0dXJuIChtVHVuZXJWZXJzaW9uID09IFRVTkVSX0hBTF9WRVJTSU9OXzFfMSk7Ci19Ci0KLVN0YXR1cyBUdW5lclNlcnZpY2U6Om9wZW5EZW11eCgKLSAgICAgICAgaW50IC8qIGRlbXV4SGFuZGxlICovLCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRGVtdXg+KiBfYWlkbF9yZXR1cm4pIHsKLSAgICBBTE9HRCgib3BlbkRlbXV4Iik7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lclNlcnZpY2U6Om9wZW5EZW11eChpbnQzMl90IC8qIGluX2RlbXV4SGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEZW11eD4qIF9haWRsX3JldHVybikgeworICAgIEFMT0dWKCJvcGVuRGVtdXgiKTsKICAgICBpZiAoIWhhc0lUdW5lcigpKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRCkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQotICAgIFJlc3VsdCByZXM7Ci0gICAgdWludDMyX3QgaWQ7Ci0gICAgc3A8SURlbXV4PiBkZW11eFNwID0gbnVsbHB0cjsKLSAgICBzaGFyZWRfcHRyPElUdW5lckRlbXV4PiB0dW5lckRlbXV4ID0gbnVsbHB0cjsKLSAgICBtVHVuZXItPm9wZW5EZW11eChbJl0oUmVzdWx0IHIsIHVpbnQzMl90IGRlbXV4SWQsIGNvbnN0IHNwPElEZW11eD4mIGRlbXV4KSB7Ci0gICAgICAgIGRlbXV4U3AgPSBkZW11eDsKLSAgICAgICAgaWQgPSBkZW11eElkOwotICAgICAgICByZXMgPSByOwotICAgICAgICBBTE9HRCgib3BlbiBkZW11eCwgaWQgPSAlZCIsIGRlbXV4SWQpOwotICAgIH0pOwotICAgIGlmIChyZXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHR1bmVyRGVtdXggPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckRlbXV4PihkZW11eFNwLCBpZCk7Ci0gICAgICAgICpfYWlkbF9yZXR1cm4gPSB0dW5lckRlbXV4LT5yZWY8SVR1bmVyRGVtdXg+KCk7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgdmVjdG9yPGludDMyX3Q+IGlkOworICAgIHNoYXJlZF9wdHI8SURlbXV4PiBkZW11eDsKKyAgICBhdXRvIHN0YXR1cyA9IG1UdW5lci0+b3BlbkRlbXV4KCZpZCwgJmRlbXV4KTsKKyAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJEZW11eD4oZGVtdXgsIGlkWzBdKTsKICAgICB9CiAKLSAgICBBTE9HVygib3BlbiBkZW11eCBmYWlsZWQsIHJlcyA9ICVkIiwgcmVzKTsKLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotU3RhdHVzIFR1bmVyU2VydmljZTo6Z2V0RGVtdXhDYXBzKFR1bmVyRGVtdXhDYXBhYmlsaXRpZXMqIF9haWRsX3JldHVybikgewotICAgIEFMT0dEKCJnZXREZW11eENhcHMiKTsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6Z2V0RGVtdXhDYXBzKERlbXV4Q2FwYWJpbGl0aWVzKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBBTE9HVigiZ2V0RGVtdXhDYXBzIik7CiAgICAgaWYgKCFoYXNJVHVuZXIoKSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpOT1RfSU5JVElBTElaRUQpKTsKLSAgICB9Ci0gICAgUmVzdWx0IHJlczsKLSAgICBEZW11eENhcGFiaWxpdGllcyBjYXBzOwotICAgIG1UdW5lci0+Z2V0RGVtdXhDYXBzKFsmXShSZXN1bHQgciwgY29uc3QgRGVtdXhDYXBhYmlsaXRpZXMmIGRlbXV4Q2FwcykgewotICAgICAgICBjYXBzID0gZGVtdXhDYXBzOwotICAgICAgICByZXMgPSByOwotICAgIH0pOwotICAgIGlmIChyZXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgICpfYWlkbF9yZXR1cm4gPSBnZXRBaWRsRGVtdXhDYXBzKGNhcHMpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgQUxPR1coIkdldCBkZW11eCBjYXBzIGZhaWxlZCwgcmVzID0gJWQiLCByZXMpOwotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICByZXR1cm4gbVR1bmVyLT5nZXREZW11eENhcHMoX2FpZGxfcmV0dXJuKTsKIH0KIAotU3RhdHVzIFR1bmVyU2VydmljZTo6Z2V0RnJvbnRlbmRJZHModmVjdG9yPGludDMyX3Q+KiBpZHMpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6Z2V0RnJvbnRlbmRJZHModmVjdG9yPGludDMyX3Q+KiBpZHMpIHsKICAgICBpZiAoIWhhc0lUdW5lcigpKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRCkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQotICAgIGhpZGxfdmVjPEZyb250ZW5kSWQ+IGZlSWRzOwotICAgIFJlc3VsdCByZXMgPSBnZXRIaWRsRnJvbnRlbmRJZHMoZmVJZHMpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgaWRzLT5yZXNpemUoZmVJZHMuc2l6ZSgpKTsKLSAgICBjb3B5KGZlSWRzLmJlZ2luKCksIGZlSWRzLmVuZCgpLCBpZHMtPmJlZ2luKCkpOwogCi0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gbVR1bmVyLT5nZXRGcm9udGVuZElkcyhpZHMpOwogfQogCi1TdGF0dXMgVHVuZXJTZXJ2aWNlOjpnZXRGcm9udGVuZEluZm8oaW50MzJfdCBpZCwgVHVuZXJGcm9udGVuZEluZm8qIF9haWRsX3JldHVybikgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJTZXJ2aWNlOjpnZXRGcm9udGVuZEluZm8oaW50MzJfdCBpZCwgRnJvbnRlbmRJbmZvKiBfYWlkbF9yZXR1cm4pIHsKICAgICBpZiAoIWhhc0lUdW5lcigpKSB7CiAgICAgICAgIEFMT0dFKCJJVHVuZXIgc2VydmljZSBpcyBub3QgaW5pdC4iKTsKICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIEZyb250ZW5kSW5mbyBpbmZvOwotICAgIFJlc3VsdCByZXMgPSBnZXRIaWRsRnJvbnRlbmRJbmZvKGlkLCBpbmZvKTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Ci0gICAgfQotCi0gICAgVHVuZXJGcm9udGVuZEluZm8gdHVuZXJJbmZvID0gY29udmVydFRvQWlkbEZyb250ZW5kSW5mbyhpbmZvKTsKLSAgICAqX2FpZGxfcmV0dXJuID0gdHVuZXJJbmZvOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1UdW5lci0+Z2V0RnJvbnRlbmRJbmZvKGlkLCBfYWlkbF9yZXR1cm4pOwogfQogCi1TdGF0dXMgVHVuZXJTZXJ2aWNlOjpnZXRGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMoCi0gICAgICAgIGludDMyX3QgaWQsIFR1bmVyRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzKiBfYWlkbF9yZXR1cm4pIHsKLSAgICBpZiAoIWhhc0lUdW5lcl8xXzEoKSkgewotICAgICAgICBBTE9HRSgiSVR1bmVyXzFfMSBzZXJ2aWNlIGlzIG5vdCBpbml0LiIpOworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuRnJvbnRlbmQoaW50MzJfdCBmcm9udGVuZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIEFMT0dFKCJJVHVuZXIgc2VydmljZSBpcyBub3QgaW5pdC4iKTsKICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCByZXM7Ci0gICAgRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzIGR0bWJDYXBzOwotICAgIG1UdW5lcl8xXzEtPmdldEZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyhpZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzJiBjYXBzKSB7Ci0gICAgICAgIGR0bWJDYXBzID0gY2FwczsKLSAgICAgICAgcmVzID0gcjsKLSAgICB9KTsKLSAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgaW50IGlkID0gVHVuZXJIZWxwZXI6OmdldFJlc291cmNlSWRGcm9tSGFuZGxlKGZyb250ZW5kSGFuZGxlLCBGUk9OVEVORCk7CisgICAgc2hhcmVkX3B0cjxJRnJvbnRlbmQ+IGZyb250ZW5kOworICAgIGF1dG8gc3RhdHVzID0gbVR1bmVyLT5vcGVuRnJvbnRlbmRCeUlkKGlkLCAmZnJvbnRlbmQpOworICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckZyb250ZW5kPihmcm9udGVuZCwgaWQpOwogICAgIH0KIAotICAgIFR1bmVyRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzIGFpZGxEdG1iQ2Fwc3sKLSAgICAgICAgLnRyYW5zbWlzc2lvbk1vZGVDYXAgPSAoaW50KWR0bWJDYXBzLnRyYW5zbWlzc2lvbk1vZGVDYXAsCi0gICAgICAgIC5iYW5kd2lkdGhDYXAgPSAoaW50KWR0bWJDYXBzLmJhbmR3aWR0aENhcCwKLSAgICAgICAgLm1vZHVsYXRpb25DYXAgPSAoaW50KWR0bWJDYXBzLm1vZHVsYXRpb25DYXAsCi0gICAgICAgIC5jb2RlUmF0ZUNhcCA9IChpbnQpZHRtYkNhcHMuY29kZVJhdGVDYXAsCi0gICAgICAgIC5ndWFyZEludGVydmFsQ2FwID0gKGludClkdG1iQ2Fwcy5ndWFyZEludGVydmFsQ2FwLAotICAgICAgICAuaW50ZXJsZWF2ZU1vZGVDYXAgPSAoaW50KWR0bWJDYXBzLmludGVybGVhdmVNb2RlQ2FwLAotICAgIH07Ci0KLSAgICAqX2FpZGxfcmV0dXJuID0gYWlkbER0bWJDYXBzOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotU3RhdHVzIFR1bmVyU2VydmljZTo6b3BlbkZyb250ZW5kKAotICAgICAgICBpbnQzMl90IGZyb250ZW5kSGFuZGxlLCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kPiogX2FpZGxfcmV0dXJuKSB7Ci0gICAgaWYgKCFoYXNJVHVuZXIoKSkgewotICAgICAgICBBTE9HRSgiSVR1bmVyIHNlcnZpY2UgaXMgbm90IGluaXQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Ci0gICAgfQotCi0gICAgUmVzdWx0IHN0YXR1czsKLSAgICBzcDxJRnJvbnRlbmQ+IGZyb250ZW5kOwotICAgIGludCBpZCA9IGdldFJlc291cmNlSWRGcm9tSGFuZGxlKGZyb250ZW5kSGFuZGxlLCBGUk9OVEVORCk7Ci0gICAgbVR1bmVyLT5vcGVuRnJvbnRlbmRCeUlkKGlkLCBbJl0oUmVzdWx0IHJlc3VsdCwgY29uc3Qgc3A8SUZyb250ZW5kPiYgZmUpIHsKLSAgICAgICAgZnJvbnRlbmQgPSBmZTsKLSAgICAgICAgc3RhdHVzID0gcmVzdWx0OwotICAgIH0pOwotICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKLSAgICB9Ci0gICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyRnJvbnRlbmQ+KGZyb250ZW5kLCBpZCk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIFR1bmVyU2VydmljZTo6b3BlbkxuYihpbnQgbG5iSGFuZGxlLCBzaGFyZWRfcHRyPElUdW5lckxuYj4qIF9haWRsX3JldHVybikgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuTG5iKGludCBsbmJIYW5kbGUsIHNoYXJlZF9wdHI8SVR1bmVyTG5iPiogX2FpZGxfcmV0dXJuKSB7CiAgICAgaWYgKCFoYXNJVHVuZXIoKSkgewogICAgICAgICBBTE9HRCgiZ2V0IElUdW5lciBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgc3A8SUxuYj4gbG5iOwotICAgIGludCBpZCA9IGdldFJlc291cmNlSWRGcm9tSGFuZGxlKGxuYkhhbmRsZSwgTE5CKTsKLSAgICBtVHVuZXItPm9wZW5MbmJCeUlkKGlkLCBbJl0oUmVzdWx0IHJlc3VsdCwgY29uc3Qgc3A8SUxuYj4mIGxuYlNwKXsKLSAgICAgICAgbG5iID0gbG5iU3A7Ci0gICAgICAgIHN0YXR1cyA9IHJlc3VsdDsKLSAgICB9KTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgc2hhcmVkX3B0cjxJTG5iPiBsbmI7CisgICAgaW50IGlkID0gVHVuZXJIZWxwZXI6OmdldFJlc291cmNlSWRGcm9tSGFuZGxlKGxuYkhhbmRsZSwgTE5CKTsKKyAgICBhdXRvIHN0YXR1cyA9IG1UdW5lci0+b3BlbkxuYkJ5SWQoaWQsICZsbmIpOworICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckxuYj4obG5iLCBpZCk7CiAgICAgfQogCi0gICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyTG5iPihsbmIsIGlkKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLVN0YXR1cyBUdW5lclNlcnZpY2U6Om9wZW5MbmJCeU5hbWUoY29uc3Qgc3RyaW5nJiBsbmJOYW1lLCBzaGFyZWRfcHRyPElUdW5lckxuYj4qIF9haWRsX3JldHVybikgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuTG5iQnlOYW1lKGNvbnN0IHN0cmluZyYgbG5iTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckxuYj4qIF9haWRsX3JldHVybikgewogICAgIGlmICghaGFzSVR1bmVyKCkpIHsKICAgICAgICAgQUxPR0UoImdldCBJVHVuZXIgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKICAgICB9CiAKLSAgICBpbnQgbG5iSWQ7Ci0gICAgUmVzdWx0IHN0YXR1czsKLSAgICBzcDxJTG5iPiBsbmI7Ci0gICAgbVR1bmVyLT5vcGVuTG5iQnlOYW1lKGxuYk5hbWUsIFsmXShSZXN1bHQgciwgTG5iSWQgaWQsIGNvbnN0IHNwPElMbmI+JiBsbmJTcCkgewotICAgICAgICBzdGF0dXMgPSByOwotICAgICAgICBsbmIgPSBsbmJTcDsKLSAgICAgICAgbG5iSWQgPSAoaW50KWlkOwotICAgIH0pOwotICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB2ZWN0b3I8aW50MzJfdD4gaWQ7CisgICAgc2hhcmVkX3B0cjxJTG5iPiBsbmI7CisgICAgYXV0byBzdGF0dXMgPSBtVHVuZXItPm9wZW5MbmJCeU5hbWUobG5iTmFtZSwgJmlkLCAmbG5iKTsKKyAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJMbmI+KGxuYiwgaWRbMF0pOwogICAgIH0KIAotICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckxuYj4obG5iLCBsbmJJZCk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CiB9CiAKLVN0YXR1cyBUdW5lclNlcnZpY2U6Om9wZW5EZXNjcmFtYmxlcihpbnQzMl90IC8qZGVzY3JhbWJsZXJIYW5kbGUqLywKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJEZXNjcmFtYmxlcj4qIF9haWRsX3JldHVybikgeworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuRGVzY3JhbWJsZXIoaW50MzJfdCAvKmRlc2NyYW1ibGVySGFuZGxlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckRlc2NyYW1ibGVyPiogX2FpZGxfcmV0dXJuKSB7CiAgICAgaWYgKCFoYXNJVHVuZXIoKSkgewogICAgICAgICBBTE9HRCgiZ2V0IElUdW5lciBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgc3A8SURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcjsKLSAgICAvL2ludCBpZCA9IGdldFJlc291cmNlSWRGcm9tSGFuZGxlKGRlc2NyYW1ibGVySGFuZGxlLCBERVNDUkFNQkxFUik7Ci0gICAgbVR1bmVyLT5vcGVuRGVzY3JhbWJsZXIoWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRGVzY3JhbWJsZXI+JiBkZXNjcmFtYmxlclNwKSB7Ci0gICAgICAgIHN0YXR1cyA9IHI7Ci0gICAgICAgIGRlc2NyYW1ibGVyID0gZGVzY3JhbWJsZXJTcDsKLSAgICB9KTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgc2hhcmVkX3B0cjxJRGVzY3JhbWJsZXI+IGRlc2NyYW1ibGVyOworICAgIC8vIGludCBpZCA9IFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShkZXNjcmFtYmxlckhhbmRsZSwgREVTQ1JBTUJMRVIpOworICAgIGF1dG8gc3RhdHVzID0gbVR1bmVyLT5vcGVuRGVzY3JhbWJsZXIoJmRlc2NyYW1ibGVyKTsKKyAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJEZXNjcmFtYmxlcj4oZGVzY3JhbWJsZXIpOwogICAgIH0KIAotICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckRlc2NyYW1ibGVyPihkZXNjcmFtYmxlcik7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lclNlcnZpY2U6OmdldFR1bmVySGFsVmVyc2lvbihpbnQqIF9haWRsX3JldHVybikgeworICAgIGhhc0lUdW5lcigpOworICAgICpfYWlkbF9yZXR1cm4gPSBtVHVuZXJWZXJzaW9uOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuU2hhcmVkRmlsdGVyKGNvbnN0IHN0cmluZyYgaW5fZmlsdGVyVG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRSgiZ2V0IElUdW5lciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNTaGFyZWRGaWx0ZXJQZXJtaXNzaW9uKSkgeworICAgICAgICBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1RWX1NIQVJFRF9GSUxURVIiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2hhcmVkRmlsdGVyc0xvY2spOworICAgIGlmIChtU2hhcmVkRmlsdGVycy5maW5kKGluX2ZpbHRlclRva2VuKSA9PSBtU2hhcmVkRmlsdGVycy5lbmQoKSkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gbnVsbHB0cjsKKyAgICAgICAgQUxPR0QoImZhaWwgdG8gZmluZCAlcyIsIGluX2ZpbHRlclRva2VuLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBzaGFyZWRfcHRyPFR1bmVyRmlsdGVyPiBmaWx0ZXIgPSBtU2hhcmVkRmlsdGVycy5hdChpbl9maWx0ZXJUb2tlbik7CisgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgY29uc3QgaW50IHBpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGlmICghZmlsdGVyLT5pc1NoYXJlZEZpbHRlckFsbG93ZWQocGlkKSkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gbnVsbHB0cjsKKyAgICAgICAgQUxPR0QoInNoYXJlZCBmaWx0ZXIgJXMgaXMgb3BlbmVkIGluIHRoZSBzYW1lIHByb2Nlc3MiLCBpbl9maWx0ZXJUb2tlbi5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgZmlsdGVyLT5hdHRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjayhpbl9jYik7CisKKyAgICAqX2FpZGxfcmV0dXJuID0gZmlsdGVyOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJTZXJ2aWNlOjpzZXRMbmEoYm9vbCBiRW5hYmxlKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRCgiZ2V0IElUdW5lciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIHJldHVybiBtVHVuZXItPnNldExuYShiRW5hYmxlKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJTZXJ2aWNlOjpzZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhGcm9udGVuZFR5cGUgaW5fZnJvbnRlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluX21heE51bWJlcikgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgQUxPR0QoImdldCBJVHVuZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbVR1bmVyLT5zZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhpbl9mcm9udGVuZFR5cGUsIGluX21heE51bWJlcik7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyU2VydmljZTo6Z2V0TWF4TnVtYmVyT2ZGcm9udGVuZHMoRnJvbnRlbmRUeXBlIGluX2Zyb250ZW5kVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRCgiZ2V0IElUdW5lciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIHJldHVybiBtVHVuZXItPmdldE1heE51bWJlck9mRnJvbnRlbmRzKGluX2Zyb250ZW5kVHlwZSwgX2FpZGxfcmV0dXJuKTsKK30KKworc3RyaW5nIFR1bmVyU2VydmljZTo6YWRkRmlsdGVyVG9TaGFyZWQoY29uc3Qgc2hhcmVkX3B0cjxUdW5lckZpbHRlcj4mIHNoYXJlZEZpbHRlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2hhcmVkRmlsdGVyc0xvY2spOworCisgICAgLy8gVXNlIHNoYXJlZEZpbHRlciBhZGRyZXNzIGFzIHRva2VuLgorICAgIHN0cmluZyB0b2tlbiA9IHRvX3N0cmluZyhyZWludGVycHJldF9jYXN0PHN0ZDo6dWludHB0cl90PihzaGFyZWRGaWx0ZXIuZ2V0KCkpKTsKKyAgICBtU2hhcmVkRmlsdGVyc1t0b2tlbl0gPSBzaGFyZWRGaWx0ZXI7CisgICAgcmV0dXJuIHRva2VuOworfQorCit2b2lkIFR1bmVyU2VydmljZTo6cmVtb3ZlU2hhcmVkRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8VHVuZXJGaWx0ZXI+JiBzaGFyZWRGaWx0ZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNoYXJlZEZpbHRlcnNMb2NrKTsKKworICAgIC8vIFVzZSBzaGFyZWRGaWx0ZXIgYWRkcmVzcyBhcyB0b2tlbi4KKyAgICBtU2hhcmVkRmlsdGVycy5lcmFzZSh0b19zdHJpbmcocmVpbnRlcnByZXRfY2FzdDxzdGQ6OnVpbnRwdHJfdD4oc2hhcmVkRmlsdGVyLmdldCgpKSkpOwogfQogCiB2b2lkIFR1bmVyU2VydmljZTo6dXBkYXRlVHVuZXJSZXNvdXJjZXMoKSB7Ci0gICAgaWYgKCFoYXNJVHVuZXIoKSB8fCBtVHVuZXJSZXNvdXJjZU1hbmFnZXIgPT0gTlVMTCkgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byB1cGRhdGVUdW5lclJlc291cmNlcyIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgdXBkYXRlRnJvbnRlbmRSZXNvdXJjZXMoKTsKLSAgICB1cGRhdGVMbmJSZXNvdXJjZXMoKTsKLSAgICAvLyBUT0RPOiB1cGRhdGUgRGVtdXgsIERlc2NyYW1ibGVyLgorICAgIFR1bmVySGVscGVyOjp1cGRhdGVUdW5lclJlc291cmNlcyhnZXRUUk1Gcm9udGVuZEluZm9zKCksIGdldFRSTUxuYkhhbmRsZXMoKSk7CiB9CiAKLVN0YXR1cyBUdW5lclNlcnZpY2U6OmdldFR1bmVySGFsVmVyc2lvbihpbnQqIF9haWRsX3JldHVybikgewotICAgIGhhc0lUdW5lcigpOwotICAgICpfYWlkbF9yZXR1cm4gPSBtVHVuZXJWZXJzaW9uOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLXZvaWQgVHVuZXJTZXJ2aWNlOjp1cGRhdGVGcm9udGVuZFJlc291cmNlcygpIHsKLSAgICBoaWRsX3ZlYzxGcm9udGVuZElkPiBpZHM7Ci0gICAgUmVzdWx0IHJlcyA9IGdldEhpZGxGcm9udGVuZElkcyhpZHMpOwotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Cit2ZWN0b3I8VHVuZXJGcm9udGVuZEluZm8+IFR1bmVyU2VydmljZTo6Z2V0VFJNRnJvbnRlbmRJbmZvcygpIHsKICAgICB2ZWN0b3I8VHVuZXJGcm9udGVuZEluZm8+IGluZm9zOworICAgIHZlY3RvcjxpbnQzMl90PiBpZHM7CisgICAgYXV0byBzdGF0dXMgPSBtVHVuZXItPmdldEZyb250ZW5kSWRzKCZpZHMpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICByZXR1cm4gaW5mb3M7CisgICAgfQorCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgRnJvbnRlbmRJbmZvIGZyb250ZW5kSW5mbzsKLSAgICAgICAgUmVzdWx0IHJlcyA9IGdldEhpZGxGcm9udGVuZEluZm8oKGludClpZHNbaV0sIGZyb250ZW5kSW5mbyk7Ci0gICAgICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIGF1dG8gcmVzID0gbVR1bmVyLT5nZXRGcm9udGVuZEluZm8oaWRzW2ldLCAmZnJvbnRlbmRJbmZvKTsKKyAgICAgICAgaWYgKCFyZXMuaXNPaygpKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBUdW5lckZyb250ZW5kSW5mbyB0dW5lckZyb250ZW5kSW5mb3sKLSAgICAgICAgICAgIC5oYW5kbGUgPSBnZXRSZXNvdXJjZUhhbmRsZUZyb21JZCgoaW50KWlkc1tpXSwgRlJPTlRFTkQpLAotICAgICAgICAgICAgLnR5cGUgPSBzdGF0aWNfY2FzdDxpbnQ+KGZyb250ZW5kSW5mby50eXBlKSwKLSAgICAgICAgICAgIC5leGNsdXNpdmVHcm91cElkID0gc3RhdGljX2Nhc3Q8aW50Pihmcm9udGVuZEluZm8uZXhjbHVzaXZlR3JvdXBJZCksCisgICAgICAgICAgICAgICAgLmhhbmRsZSA9IFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUhhbmRsZUZyb21JZCgoaW50KWlkc1tpXSwgRlJPTlRFTkQpLAorICAgICAgICAgICAgICAgIC50eXBlID0gc3RhdGljX2Nhc3Q8aW50Pihmcm9udGVuZEluZm8udHlwZSksCisgICAgICAgICAgICAgICAgLmV4Y2x1c2l2ZUdyb3VwSWQgPSBmcm9udGVuZEluZm8uZXhjbHVzaXZlR3JvdXBJZCwKICAgICAgICAgfTsKICAgICAgICAgaW5mb3MucHVzaF9iYWNrKHR1bmVyRnJvbnRlbmRJbmZvKTsKICAgICB9Ci0gICAgbVR1bmVyUmVzb3VyY2VNYW5hZ2VyLT5zZXRGcm9udGVuZEluZm9MaXN0KGluZm9zKTsKKworICAgIHJldHVybiBpbmZvczsKIH0KIAotdm9pZCBUdW5lclNlcnZpY2U6OnVwZGF0ZUxuYlJlc291cmNlcygpIHsKLSAgICB2ZWN0b3I8aW50PiBoYW5kbGVzID0gZ2V0TG5iSGFuZGxlcygpOwotICAgIGlmIChoYW5kbGVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVR1bmVyUmVzb3VyY2VNYW5hZ2VyLT5zZXRMbmJJbmZvTGlzdChoYW5kbGVzKTsKLX0KLQotdmVjdG9yPGludD4gVHVuZXJTZXJ2aWNlOjpnZXRMbmJIYW5kbGVzKCkgewotICAgIHZlY3RvcjxpbnQ+IGxuYkhhbmRsZXM7Ci0gICAgaWYgKG1UdW5lciAhPSBOVUxMKSB7Ci0gICAgICAgIFJlc3VsdCByZXM7Ci0gICAgICAgIHZlY3RvcjxMbmJJZD4gbG5iSWRzOwotICAgICAgICBtVHVuZXItPmdldExuYklkcyhbJl0oUmVzdWx0IHIsIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxMbmJJZD4mIGlkcykgewotICAgICAgICAgICAgbG5iSWRzID0gaWRzOwotICAgICAgICAgICAgcmVzID0gcjsKLSAgICAgICAgfSk7Ci0gICAgICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTIHx8IGxuYklkcy5zaXplKCkgPT0gMCkgewotICAgICAgICB9IGVsc2UgewordmVjdG9yPGludDMyX3Q+IFR1bmVyU2VydmljZTo6Z2V0VFJNTG5iSGFuZGxlcygpIHsKKyAgICB2ZWN0b3I8aW50MzJfdD4gbG5iSGFuZGxlczsKKyAgICBpZiAobVR1bmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgdmVjdG9yPGludDMyX3Q+IGxuYklkczsKKyAgICAgICAgYXV0byByZXMgPSBtVHVuZXItPmdldExuYklkcygmbG5iSWRzKTsKKyAgICAgICAgaWYgKHJlcy5pc09rKCkpIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG5iSWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbG5iSGFuZGxlcy5wdXNoX2JhY2soZ2V0UmVzb3VyY2VIYW5kbGVGcm9tSWQoKGludClsbmJJZHNbaV0sIExOQikpOworICAgICAgICAgICAgICAgIGxuYkhhbmRsZXMucHVzaF9iYWNrKFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUhhbmRsZUZyb21JZChsbmJJZHNbaV0sIExOQikpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzg0LDE4NiArMzU3LDggQEAKICAgICByZXR1cm4gbG5iSGFuZGxlczsKIH0KIAotUmVzdWx0IFR1bmVyU2VydmljZTo6Z2V0SGlkbEZyb250ZW5kSWRzKGhpZGxfdmVjPEZyb250ZW5kSWQ+JiBpZHMpIHsKLSAgICBpZiAobVR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIH0KLSAgICBSZXN1bHQgcmVzOwotICAgIG1UdW5lci0+Z2V0RnJvbnRlbmRJZHMoWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxGcm9udGVuZElkPiYgZnJvbnRlbmRJZHMpIHsKLSAgICAgICAgaWRzID0gZnJvbnRlbmRJZHM7Ci0gICAgICAgIHJlcyA9IHI7Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotUmVzdWx0IFR1bmVyU2VydmljZTo6Z2V0SGlkbEZyb250ZW5kSW5mbyhpbnQgaWQsIEZyb250ZW5kSW5mbyYgaW5mbykgewotICAgIGlmIChtVHVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgfQotICAgIFJlc3VsdCByZXM7Ci0gICAgbVR1bmVyLT5nZXRGcm9udGVuZEluZm8oaWQsIFsmXShSZXN1bHQgciwgY29uc3QgRnJvbnRlbmRJbmZvJiBmZUluZm8pIHsKLSAgICAgICAgaW5mbyA9IGZlSW5mbzsKLSAgICAgICAgcmVzID0gcjsKLSAgICB9KTsKLSAgICByZXR1cm4gcmVzOwotfQotCi1UdW5lckRlbXV4Q2FwYWJpbGl0aWVzIFR1bmVyU2VydmljZTo6Z2V0QWlkbERlbXV4Q2FwcyhEZW11eENhcGFiaWxpdGllcyBjYXBzKSB7Ci0gICAgVHVuZXJEZW11eENhcGFiaWxpdGllcyBhaWRsQ2Fwc3sKLSAgICAgICAgLm51bURlbXV4ID0gKGludCljYXBzLm51bURlbXV4LAotICAgICAgICAubnVtUmVjb3JkID0gKGludCljYXBzLm51bVJlY29yZCwKLSAgICAgICAgLm51bVBsYXliYWNrID0gKGludCljYXBzLm51bVBsYXliYWNrLAotICAgICAgICAubnVtVHNGaWx0ZXIgPSAoaW50KWNhcHMubnVtVHNGaWx0ZXIsCi0gICAgICAgIC5udW1TZWN0aW9uRmlsdGVyID0gKGludCljYXBzLm51bVNlY3Rpb25GaWx0ZXIsCi0gICAgICAgIC5udW1BdWRpb0ZpbHRlciA9IChpbnQpY2Fwcy5udW1BdWRpb0ZpbHRlciwKLSAgICAgICAgLm51bVZpZGVvRmlsdGVyID0gKGludCljYXBzLm51bVZpZGVvRmlsdGVyLAotICAgICAgICAubnVtUGVzRmlsdGVyID0gKGludCljYXBzLm51bVBlc0ZpbHRlciwKLSAgICAgICAgLm51bVBjckZpbHRlciA9IChpbnQpY2Fwcy5udW1QY3JGaWx0ZXIsCi0gICAgICAgIC5udW1CeXRlc0luU2VjdGlvbkZpbHRlciA9IChpbnQpY2Fwcy5udW1CeXRlc0luU2VjdGlvbkZpbHRlciwKLSAgICAgICAgLmZpbHRlckNhcHMgPSAoaW50KWNhcHMuZmlsdGVyQ2FwcywKLSAgICAgICAgLmJUaW1lRmlsdGVyID0gY2Fwcy5iVGltZUZpbHRlciwKLSAgICB9OwotICAgIGFpZGxDYXBzLmxpbmtDYXBzLnJlc2l6ZShjYXBzLmxpbmtDYXBzLnNpemUoKSk7Ci0gICAgY29weShjYXBzLmxpbmtDYXBzLmJlZ2luKCksIGNhcHMubGlua0NhcHMuZW5kKCksIGFpZGxDYXBzLmxpbmtDYXBzLmJlZ2luKCkpOwotICAgIHJldHVybiBhaWRsQ2FwczsKLX0KLQotVHVuZXJGcm9udGVuZEluZm8gVHVuZXJTZXJ2aWNlOjpjb252ZXJ0VG9BaWRsRnJvbnRlbmRJbmZvKEZyb250ZW5kSW5mbyBoYWxJbmZvKSB7Ci0gICAgVHVuZXJGcm9udGVuZEluZm8gaW5mb3sKLSAgICAgICAgLnR5cGUgPSAoaW50KWhhbEluZm8udHlwZSwKLSAgICAgICAgLm1pbkZyZXF1ZW5jeSA9IChpbnQpaGFsSW5mby5taW5GcmVxdWVuY3ksCi0gICAgICAgIC5tYXhGcmVxdWVuY3kgPSAoaW50KWhhbEluZm8ubWF4RnJlcXVlbmN5LAotICAgICAgICAubWluU3ltYm9sUmF0ZSA9IChpbnQpaGFsSW5mby5taW5TeW1ib2xSYXRlLAotICAgICAgICAubWF4U3ltYm9sUmF0ZSA9IChpbnQpaGFsSW5mby5tYXhTeW1ib2xSYXRlLAotICAgICAgICAuYWNxdWlyZVJhbmdlID0gKGludCloYWxJbmZvLmFjcXVpcmVSYW5nZSwKLSAgICAgICAgLmV4Y2x1c2l2ZUdyb3VwSWQgPSAoaW50KWhhbEluZm8uZXhjbHVzaXZlR3JvdXBJZCwKLSAgICB9OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFsSW5mby5zdGF0dXNDYXBzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGluZm8uc3RhdHVzQ2Fwcy5wdXNoX2JhY2soKGludCloYWxJbmZvLnN0YXR1c0NhcHNbaV0pOwotICAgIH0KLQotICAgIFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXMgY2FwczsKLSAgICBzd2l0Y2ggKGhhbEluZm8udHlwZSkgewotICAgICAgICBjYXNlIEZyb250ZW5kVHlwZTo6QU5BTE9HOiB7Ci0gICAgICAgICAgICBpZiAoRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjphbmFsb2dDYXBzCi0gICAgICAgICAgICAgICAgICAgID09IGhhbEluZm8uZnJvbnRlbmRDYXBzLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgIFR1bmVyRnJvbnRlbmRBbmFsb2dDYXBhYmlsaXRpZXMgYW5hbG9nQ2Fwc3sKLSAgICAgICAgICAgICAgICAgICAgLnR5cGVDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmFuYWxvZ0NhcHMoKS50eXBlQ2FwLAotICAgICAgICAgICAgICAgICAgICAuc2lmU3RhbmRhcmRDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmFuYWxvZ0NhcHMoKS5zaWZTdGFuZGFyZENhcCwKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmFuYWxvZ0NhcHM+KGFuYWxvZ0NhcHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFR5cGU6OkFUU0M6IHsKLSAgICAgICAgICAgIGlmIChGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2NDYXBzCi0gICAgICAgICAgICAgICAgICAgID09IGhhbEluZm8uZnJvbnRlbmRDYXBzLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgIFR1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzIGF0c2NDYXBzewotICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuYXRzY0NhcHMoKS5tb2R1bGF0aW9uQ2FwLAotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgY2Fwcy5zZXQ8VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczo6YXRzY0NhcHM+KGF0c2NDYXBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRUeXBlOjpBVFNDMzogewotICAgICAgICAgICAgaWYgKEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzYzNDYXBzCi0gICAgICAgICAgICAgICAgICAgID09IGhhbEluZm8uZnJvbnRlbmRDYXBzLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgIFR1bmVyRnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllcyBhdHNjM0NhcHN7Ci0gICAgICAgICAgICAgICAgICAgIC5iYW5kd2lkdGhDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2MzQ2FwcygpLmJhbmR3aWR0aENhcCwKLSAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2MzQ2FwcygpLm1vZHVsYXRpb25DYXAsCi0gICAgICAgICAgICAgICAgICAgIC50aW1lSW50ZXJsZWF2ZU1vZGVDYXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkudGltZUludGVybGVhdmVNb2RlQ2FwLAotICAgICAgICAgICAgICAgICAgICAuY29kZVJhdGVDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2MzQ2FwcygpLmNvZGVSYXRlQ2FwLAotICAgICAgICAgICAgICAgICAgICAuZGVtb2RPdXRwdXRGb3JtYXRDYXAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS5kZW1vZE91dHB1dEZvcm1hdENhcCwKLSAgICAgICAgICAgICAgICAgICAgLmZlY0NhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkuZmVjQ2FwLAotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgY2Fwcy5zZXQ8VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczo6YXRzYzNDYXBzPihhdHNjM0NhcHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFR5cGU6OkRWQkM6IHsKLSAgICAgICAgICAgIGlmIChGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmNDYXBzCi0gICAgICAgICAgICAgICAgICAgID09IGhhbEluZm8uZnJvbnRlbmRDYXBzLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgIFR1bmVyRnJvbnRlbmRDYWJsZUNhcGFiaWxpdGllcyBjYWJsZUNhcHN7Ci0gICAgICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJjQ2FwcygpLm1vZHVsYXRpb25DYXAsCi0gICAgICAgICAgICAgICAgICAgIC5jb2RlUmF0ZUNhcCA9IChpbnQ2NF90KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YmNDYXBzKCkuZmVjQ2FwLAotICAgICAgICAgICAgICAgICAgICAuYW5uZXhDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YmNDYXBzKCkuYW5uZXhDYXAsCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICBjYXBzLnNldDxUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzOjpjYWJsZUNhcHM+KGNhYmxlQ2Fwcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kVHlwZTo6RFZCUzogewotICAgICAgICAgICAgaWYgKEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZic0NhcHMKLSAgICAgICAgICAgICAgICAgICAgPT0gaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgVHVuZXJGcm9udGVuZER2YnNDYXBhYmlsaXRpZXMgZHZic0NhcHN7Ci0gICAgICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJzQ2FwcygpLm1vZHVsYXRpb25DYXAsCi0gICAgICAgICAgICAgICAgICAgIC5jb2RlUmF0ZUNhcCA9IChsb25nKWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnNDYXBzKCkuaW5uZXJmZWNDYXAsCi0gICAgICAgICAgICAgICAgICAgIC5zdGFuZGFyZCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuZHZic0NhcHMoKS5zdGFuZGFyZCwKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmR2YnNDYXBzPihkdmJzQ2Fwcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZyb250ZW5kVHlwZTo6RFZCVDogewotICAgICAgICAgICAgaWYgKEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZidENhcHMKLSAgICAgICAgICAgICAgICAgICAgPT0gaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgVHVuZXJGcm9udGVuZER2YnRDYXBhYmlsaXRpZXMgZHZidENhcHN7Ci0gICAgICAgICAgICAgICAgICAgIC50cmFuc21pc3Npb25Nb2RlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLnRyYW5zbWlzc2lvbk1vZGVDYXAsCi0gICAgICAgICAgICAgICAgICAgIC5iYW5kd2lkdGhDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkuYmFuZHdpZHRoQ2FwLAotICAgICAgICAgICAgICAgICAgICAuY29uc3RlbGxhdGlvbkNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS5jb25zdGVsbGF0aW9uQ2FwLAotICAgICAgICAgICAgICAgICAgICAuY29kZVJhdGVDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkuY29kZXJhdGVDYXAsCi0gICAgICAgICAgICAgICAgICAgIC5oaWVyYXJjaHlDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkuaGllcmFyY2h5Q2FwLAotICAgICAgICAgICAgICAgICAgICAuZ3VhcmRJbnRlcnZhbENhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS5ndWFyZEludGVydmFsQ2FwLAotICAgICAgICAgICAgICAgICAgICAuaXNUMlN1cHBvcnRlZCA9IChib29sKWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkuaXNUMlN1cHBvcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgLmlzTWlzb1N1cHBvcnRlZCA9IChib29sKWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkuaXNNaXNvU3VwcG9ydGVkLAotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgY2Fwcy5zZXQ8VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczo6ZHZidENhcHM+KGR2YnRDYXBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRUeXBlOjpJU0RCUzogewotICAgICAgICAgICAgaWYgKEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnNDYXBzCi0gICAgICAgICAgICAgICAgICAgID09IGhhbEluZm8uZnJvbnRlbmRDYXBzLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgIFR1bmVyRnJvbnRlbmRJc2Ric0NhcGFiaWxpdGllcyBpc2Ric0NhcHN7Ci0gICAgICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2Ric0NhcHMoKS5tb2R1bGF0aW9uQ2FwLAotICAgICAgICAgICAgICAgICAgICAuY29kZVJhdGVDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJzQ2FwcygpLmNvZGVyYXRlQ2FwLAotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgY2Fwcy5zZXQ8VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczo6aXNkYnNDYXBzPihpc2Ric0NhcHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGcm9udGVuZFR5cGU6OklTREJTMzogewotICAgICAgICAgICAgaWYgKEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnMzQ2FwcwotICAgICAgICAgICAgICAgICAgICA9PSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKLSAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzIGlzZGJzM0NhcHN7Ci0gICAgICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2RiczNDYXBzKCkubW9kdWxhdGlvbkNhcCwKLSAgICAgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2RiczNDYXBzKCkuY29kZXJhdGVDYXAsCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICBjYXBzLnNldDxUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzOjppc2RiczNDYXBzPihpc2RiczNDYXBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRnJvbnRlbmRUeXBlOjpJU0RCVDogewotICAgICAgICAgICAgaWYgKEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnRDYXBzCi0gICAgICAgICAgICAgICAgICAgID09IGhhbEluZm8uZnJvbnRlbmRDYXBzLmdldERpc2NyaW1pbmF0b3IoKSkgewotICAgICAgICAgICAgICAgIFR1bmVyRnJvbnRlbmRJc2RidENhcGFiaWxpdGllcyBpc2RidENhcHN7Ci0gICAgICAgICAgICAgICAgICAgIC5tb2RlQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2RidENhcHMoKS5tb2RlQ2FwLAotICAgICAgICAgICAgICAgICAgICAuYmFuZHdpZHRoQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2RidENhcHMoKS5iYW5kd2lkdGhDYXAsCi0gICAgICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2RidENhcHMoKS5tb2R1bGF0aW9uQ2FwLAotICAgICAgICAgICAgICAgICAgICAuY29kZVJhdGVDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJ0Q2FwcygpLmNvZGVyYXRlQ2FwLAotICAgICAgICAgICAgICAgICAgICAuZ3VhcmRJbnRlcnZhbENhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnRDYXBzKCkuZ3VhcmRJbnRlcnZhbENhcCwKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmlzZGJ0Q2Fwcz4oaXNkYnRDYXBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpbmZvLmNhcHMgPSBjYXBzOwotICAgIHJldHVybiBpbmZvOwotfQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lclNlcnZpY2UuaCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyU2VydmljZS5oCmluZGV4IGY4ZTJlZTYuLjdmYzJhYTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyU2VydmljZS5oCkBAIC0xLDUgKzEsNSBAQAogLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTcsMTQxICsxNyw5NSBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSU0VSVklDRV9ICiAjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJTRVJWSUNFX0gKIAotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lcnJlc291cmNlbWFuYWdlci9JVHVuZXJSZXNvdXJjZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJFdmVudC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlclN0YXR1cy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9JVHVuZXIuaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMS9JVHVuZXIuaD4KLSNpbmNsdWRlIDxmbXEvQWlkbE1lc3NhZ2VRdWV1ZS5oPgotI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVycmVzb3VyY2VtYW5hZ2VyL1R1bmVyRnJvbnRlbmRJbmZvLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KIAotdXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6OkdyYW50b3JEZXNjcmlwdG9yOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6Ok1RRGVzY3JpcHRvcjsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpTeW5jaHJvbml6ZWRSZWFkV3JpdGU7CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSAiVHVuZXJGaWx0ZXIuaCIKKyNpbmNsdWRlICJUdW5lckhlbHBlci5oIgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4Q2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlckV2ZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJbmZvOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OklUdW5lcjsKIHVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6Qm5UdW5lclNlcnZpY2U7CiB1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckRlbXV4OwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJEZXNjcmFtYmxlcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRmlsdGVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGaWx0ZXJDYWxsYmFjazsKIHVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRnJvbnRlbmQ7CiB1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckxuYjsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJEZW11eENhcGFiaWxpdGllczsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXM7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRJbmZvOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVycmVzb3VyY2VtYW5hZ2VyOjpJVHVuZXJSZXNvdXJjZU1hbmFnZXI7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRldGFpbHM6OmxvZ0Vycm9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4Q2FwYWJpbGl0aWVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlckF2U2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyRXZlbnQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyTWFpblR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyU2V0dGluZ3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyU3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4VHNGaWx0ZXJTZXR0aW5nczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhUc0ZpbHRlclR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SURlbXV4OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRGVzY3JhbWJsZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklGaWx0ZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklGaWx0ZXJDYWxsYmFjazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SVR1bmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZXN1bHQ7Ci0KLXVzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVycmVzb3VyY2VtYW5hZ2VyOjpUdW5lckZyb250ZW5kSW5mbzsKK3VzaW5nIDo6YW5kcm9pZDo6TXV0ZXg7CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKK25hbWVzcGFjZSBhaWRsIHsKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY29uc3Qgc3RhdGljIGludCBUVU5FUl9IQUxfVkVSU0lPTl9VTktOT1dOID0gMDsKLWNvbnN0IHN0YXRpYyBpbnQgVFVORVJfSEFMX1ZFUlNJT05fMV8wID0gMSA8PCAxNjsKLWNvbnN0IHN0YXRpYyBpbnQgVFVORVJfSEFMX1ZFUlNJT05fMV8xID0gKDEgPDwgMTYpIHwgMTsKLS8vIFN5c3RlbSBGZWF0dXJlIGRlZmluZWQgaW4gUGFja2FnZU1hbmFnZXIKLXN0YXRpYyBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2IEZFQVRVUkVfVFVORVIoOjphbmRyb2lkOjpTdHJpbmcxNigiYW5kcm9pZC5oYXJkd2FyZS50di50dW5lciIpKTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBGUk9OVEVORCwKLSAgICBMTkIsCi0gICAgREVNVVgsCi0gICAgREVTQ1JBTUJMRVIsCi19IFR1bmVyUmVzb3VyY2VUeXBlOwotCi1zdHJ1Y3QgRmlsdGVyQ2FsbGJhY2sgOiBwdWJsaWMgSUZpbHRlckNhbGxiYWNrIHsKLSAgICB+RmlsdGVyQ2FsbGJhY2soKSB7fQotICAgIFJldHVybjx2b2lkPiBvbkZpbHRlckV2ZW50KGNvbnN0IERlbXV4RmlsdGVyRXZlbnQmKSB7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotICAgIFJldHVybjx2b2lkPiBvbkZpbHRlclN0YXR1cyhjb25zdCBEZW11eEZpbHRlclN0YXR1cykgewotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLX07CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CiAKIGNsYXNzIFR1bmVyU2VydmljZSA6IHB1YmxpYyBCblR1bmVyU2VydmljZSB7Ci0gICAgdHlwZWRlZiBBaWRsTWVzc2FnZVF1ZXVlPGludDhfdCwgU3luY2hyb25pemVkUmVhZFdyaXRlPiBBaWRsTWVzc2FnZVF1ZXVlOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IEhpZGxNZXNzYWdlUXVldWU7Ci0gICAgdHlwZWRlZiBNUURlc2NyaXB0b3I8aW50OF90LCBTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IEFpZGxNUURlc2M7Ci0KIHB1YmxpYzoKICAgICBzdGF0aWMgY2hhciBjb25zdCAqZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEudHVuZXIiOyB9CiAgICAgc3RhdGljIGJpbmRlcl9zdGF0dXNfdCBpbnN0YW50aWF0ZSgpOwogICAgIFR1bmVyU2VydmljZSgpOwogICAgIHZpcnR1YWwgflR1bmVyU2VydmljZSgpOwogCi0gICAgU3RhdHVzIGdldEZyb250ZW5kSWRzKHZlY3RvcjxpbnQzMl90PiogaWRzKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0RnJvbnRlbmRJbmZvKGludDMyX3QgaWQsIFR1bmVyRnJvbnRlbmRJbmZvKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBnZXRGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICBpbnQzMl90IGlkLCBUdW5lckZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgb3BlbkZyb250ZW5kKAotICAgICAgICAgICAgaW50MzJfdCBmcm9udGVuZEhhbmRsZSwgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIG9wZW5MbmIoaW50IGxuYkhhbmRsZSwgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBvcGVuTG5iQnlOYW1lKGNvbnN0IHN0cmluZyYgbG5iTmFtZSwgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBvcGVuRGVtdXgoaW50MzJfdCBkZW11eEhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPElUdW5lckRlbXV4PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0RGVtdXhDYXBzKFR1bmVyRGVtdXhDYXBhYmlsaXRpZXMqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIG9wZW5EZXNjcmFtYmxlcihpbnQzMl90IGRlc2NyYW1ibGVySGFuZGxlLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElUdW5lckRlc2NyYW1ibGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0VHVuZXJIYWxWZXJzaW9uKGludCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRGcm9udGVuZElkcyh2ZWN0b3I8aW50MzJfdD4qIG91dF9pZHMpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEZyb250ZW5kSW5mbyhpbnQzMl90IGluX2Zyb250ZW5kSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcm9udGVuZEluZm8qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlbkZyb250ZW5kKGludDMyX3QgaW5fZnJvbnRlbmRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5MbmIoaW50MzJfdCBpbl9sbmJIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckxuYj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlbkxuYkJ5TmFtZShjb25zdCBzdHJpbmcmIGluX2xuYk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckxuYj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlbkRlbXV4KGludDMyX3QgaW5fZGVtdXhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRGVtdXg+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldERlbXV4Q2FwcyhEZW11eENhcGFiaWxpdGllcyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuRGVzY3JhbWJsZXIoaW50MzJfdCBpbl9kZXNjcmFtYmxlckhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEZXNjcmFtYmxlcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0VHVuZXJIYWxWZXJzaW9uKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlblNoYXJlZEZpbHRlcihjb25zdCBzdHJpbmcmIGluX2ZpbHRlclRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldExuYShib29sIGluX2JFbmFibGUpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldE1heE51bWJlck9mRnJvbnRlbmRzKEZyb250ZW5kVHlwZSBpbl9mcm9udGVuZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbl9tYXhOdW1iZXIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldE1heE51bWJlck9mRnJvbnRlbmRzKEZyb250ZW5kVHlwZSBpbl9mcm9udGVuZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAotICAgIC8vIFRPRE86IGNyZWF0ZSBhIG1hcCBiZXR3ZWVuIHJlc291cmNlIGlkIGFuZCBoYW5kbGVzLgotICAgIHN0YXRpYyBpbnQgZ2V0UmVzb3VyY2VJZEZyb21IYW5kbGUoaW50IHJlc291cmNlSGFuZGxlLCBpbnQgLyp0eXBlKi8pIHsKLSAgICAgICAgcmV0dXJuIChyZXNvdXJjZUhhbmRsZSAmIDB4MDBmZjAwMDApID4+IDE2OwotICAgIH0KKyAgICBzdHJpbmcgYWRkRmlsdGVyVG9TaGFyZWQoY29uc3Qgc2hhcmVkX3B0cjxUdW5lckZpbHRlcj4mIHNoYXJlZEZpbHRlcik7CisgICAgdm9pZCByZW1vdmVTaGFyZWRGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxUdW5lckZpbHRlcj4mIHNoYXJlZEZpbHRlcik7CiAKLSAgICBpbnQgZ2V0UmVzb3VyY2VIYW5kbGVGcm9tSWQoaW50IGlkLCBpbnQgcmVzb3VyY2VUeXBlKSB7Ci0gICAgICAgIC8vIFRPRE86IGJ1aWxkIHVwIHJhbmRvbWx5IGdlbmVyYXRlZCBpZCB0byBoYW5kbGUgbWFwcGluZwotICAgICAgICByZXR1cm4gKHJlc291cmNlVHlwZSAmIDB4MDAwMDAwZmYpIDw8IDI0Ci0gICAgICAgICAgICAgICAgfCAoaWQgPDwgMTYpCi0gICAgICAgICAgICAgICAgfCAobVJlc291cmNlUmVxdWVzdENvdW50KysgJiAweGZmZmYpOwotICAgIH0KKyAgICBzdGF0aWMgc2hhcmVkX3B0cjxUdW5lclNlcnZpY2U+IGdldFR1bmVyU2VydmljZSgpOwogCiBwcml2YXRlOgogICAgIGJvb2wgaGFzSVR1bmVyKCk7Ci0gICAgYm9vbCBoYXNJVHVuZXJfMV8xKCk7CiAgICAgdm9pZCB1cGRhdGVUdW5lclJlc291cmNlcygpOworICAgIHZlY3RvcjxUdW5lckZyb250ZW5kSW5mbz4gZ2V0VFJNRnJvbnRlbmRJbmZvcygpOworICAgIHZlY3RvcjxpbnQzMl90PiBnZXRUUk1MbmJIYW5kbGVzKCk7CiAKLSAgICB2b2lkIHVwZGF0ZUZyb250ZW5kUmVzb3VyY2VzKCk7Ci0gICAgdm9pZCB1cGRhdGVMbmJSZXNvdXJjZXMoKTsKLSAgICBSZXN1bHQgZ2V0SGlkbEZyb250ZW5kSWRzKGhpZGxfdmVjPEZyb250ZW5kSWQ+JiBpZHMpOwotICAgIFJlc3VsdCBnZXRIaWRsRnJvbnRlbmRJbmZvKGludCBpZCwgRnJvbnRlbmRJbmZvJiBpbmZvKTsKLSAgICB2ZWN0b3I8aW50PiBnZXRMbmJIYW5kbGVzKCk7Ci0KLSAgICBUdW5lckRlbXV4Q2FwYWJpbGl0aWVzIGdldEFpZGxEZW11eENhcHMoRGVtdXhDYXBhYmlsaXRpZXMgY2Fwcyk7Ci0gICAgVHVuZXJGcm9udGVuZEluZm8gY29udmVydFRvQWlkbEZyb250ZW5kSW5mbyhGcm9udGVuZEluZm8gaGFsSW5mbyk7Ci0KLSAgICBzcDxJVHVuZXI+IG1UdW5lcjsKLSAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklUdW5lcj4gbVR1bmVyXzFfMTsKLQotICAgIHNoYXJlZF9wdHI8SVR1bmVyUmVzb3VyY2VNYW5hZ2VyPiBtVHVuZXJSZXNvdXJjZU1hbmFnZXI7Ci0gICAgaW50IG1SZXNvdXJjZVJlcXVlc3RDb3VudCA9IDA7Ci0KKyAgICBzaGFyZWRfcHRyPElUdW5lcj4gbVR1bmVyOwogICAgIGludCBtVHVuZXJWZXJzaW9uID0gVFVORVJfSEFMX1ZFUlNJT05fVU5LTk9XTjsKKyAgICBNdXRleCBtU2hhcmVkRmlsdGVyc0xvY2s7CisgICAgbWFwPHN0cmluZywgc2hhcmVkX3B0cjxUdW5lckZpbHRlcj4+IG1TaGFyZWRGaWx0ZXJzOworCisgICAgc3RhdGljIHNoYXJlZF9wdHI8VHVuZXJTZXJ2aWNlPiBzVHVuZXJTZXJ2aWNlOwogfTsKIAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCiAKICNlbmRpZiAvLyBBTkRST0lEX01FRElBX1RVTkVSU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lclRpbWVGaWx0ZXIuY3BwIGIvc2VydmljZXMvdHVuZXIvVHVuZXJUaW1lRmlsdGVyLmNwcAppbmRleCBlYTlkYTMwLi43M2NkNmI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9UdW5lclRpbWVGaWx0ZXIuY3BwCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyVGltZUZpbHRlci5jcHAKQEAgLTE4LDk3ICsxOCw5MSBAQAogCiAjaW5jbHVkZSAiVHVuZXJUaW1lRmlsdGVyLmgiCiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpDb25zdGFudDY0Qml0OworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9Db25zdGFudDY0Qml0Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgogCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkNvbnN0YW50NjRCaXQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlc3VsdDsKKworbmFtZXNwYWNlIGFpZGwgewogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgewogCi1UdW5lclRpbWVGaWx0ZXI6OlR1bmVyVGltZUZpbHRlcihzcDxJVGltZUZpbHRlcj4gdGltZUZpbHRlcikgeworVHVuZXJUaW1lRmlsdGVyOjpUdW5lclRpbWVGaWx0ZXIoc2hhcmVkX3B0cjxJVGltZUZpbHRlcj4gdGltZUZpbHRlcikgewogICAgIG1UaW1lRmlsdGVyID0gdGltZUZpbHRlcjsKIH0KIAogVHVuZXJUaW1lRmlsdGVyOjp+VHVuZXJUaW1lRmlsdGVyKCkgewotICAgIG1UaW1lRmlsdGVyID0gTlVMTDsKKyAgICBtVGltZUZpbHRlciA9IG51bGxwdHI7CiB9CiAKLVN0YXR1cyBUdW5lclRpbWVGaWx0ZXI6OnNldFRpbWVTdGFtcChpbnQ2NF90IHRpbWVTdGFtcCkgewotICAgIGlmIChtVGltZUZpbHRlciA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lclRpbWVGaWx0ZXI6OnNldFRpbWVTdGFtcChpbnQ2NF90IHRpbWVTdGFtcCkgeworICAgIGlmIChtVGltZUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJVGltZUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXMgPSBtVGltZUZpbHRlci0+c2V0VGltZVN0YW1wKHRpbWVTdGFtcCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBtVGltZUZpbHRlci0+c2V0VGltZVN0YW1wKHRpbWVTdGFtcCk7CiB9CiAKLVN0YXR1cyBUdW5lclRpbWVGaWx0ZXI6OmNsZWFyVGltZVN0YW1wKCkgewotICAgIGlmIChtVGltZUZpbHRlciA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lclRpbWVGaWx0ZXI6OmNsZWFyVGltZVN0YW1wKCkgeworICAgIGlmIChtVGltZUZpbHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJJVGltZUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXMgPSBtVGltZUZpbHRlci0+Y2xlYXJUaW1lU3RhbXAoKTsKLSAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIG1UaW1lRmlsdGVyLT5jbGVhclRpbWVTdGFtcCgpOwogfQogCi1TdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpnZXRTb3VyY2VUaW1lKGludDY0X3QqIF9haWRsX3JldHVybikgewotICAgIGlmIChtVGltZUZpbHRlciA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lclRpbWVGaWx0ZXI6OmdldFNvdXJjZVRpbWUoaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1UaW1lRmlsdGVyID09IG51bGxwdHIpIHsKICAgICAgICAgKl9haWRsX3JldHVybiA9IChpbnQ2NF90KUNvbnN0YW50NjRCaXQ6OklOVkFMSURfUFJFU0VOVEFUSU9OX1RJTUVfU1RBTVA7CiAgICAgICAgIEFMT0dFKCJJVGltZUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOwogICAgIH0KIAotICAgIFJlc3VsdCBzdGF0dXM7Ci0gICAgbVRpbWVGaWx0ZXItPmdldFNvdXJjZVRpbWUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IHQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSByOwotICAgICAgICAgICAgICAgICpfYWlkbF9yZXR1cm4gPSB0OwotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICBhdXRvIHN0YXR1cyA9IG1UaW1lRmlsdGVyLT5nZXRTb3VyY2VUaW1lKF9haWRsX3JldHVybik7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgICpfYWlkbF9yZXR1cm4gPSAoaW50NjRfdClDb25zdGFudDY0Qml0OjpJTlZBTElEX1BSRVNFTlRBVElPTl9USU1FX1NUQU1QOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CiAgICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotU3RhdHVzIFR1bmVyVGltZUZpbHRlcjo6Z2V0VGltZVN0YW1wKGludDY0X3QqIF9haWRsX3JldHVybikgewotICAgIGlmIChtVGltZUZpbHRlciA9PSBOVUxMKSB7Cis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lclRpbWVGaWx0ZXI6OmdldFRpbWVTdGFtcChpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobVRpbWVGaWx0ZXIgPT0gbnVsbHB0cikgewogICAgICAgICAqX2FpZGxfcmV0dXJuID0gKGludDY0X3QpQ29uc3RhbnQ2NEJpdDo6SU5WQUxJRF9QUkVTRU5UQVRJT05fVElNRV9TVEFNUDsKICAgICAgICAgQUxPR0UoIklUaW1lRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHN0YXR1czsKLSAgICBtVGltZUZpbHRlci0+Z2V0VGltZVN0YW1wKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCB0KSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gcjsKLSAgICAgICAgICAgICAgICAqX2FpZGxfcmV0dXJuID0gdDsKLSAgICAgICAgICAgIH0pOwotICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgYXV0byBzdGF0dXMgPSBtVGltZUZpbHRlci0+Z2V0VGltZVN0YW1wKF9haWRsX3JldHVybik7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgICpfYWlkbF9yZXR1cm4gPSAoaW50NjRfdClDb25zdGFudDY0Qml0OjpJTlZBTElEX1BSRVNFTlRBVElPTl9USU1FX1NUQU1QOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CiAgICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotU3RhdHVzIFR1bmVyVGltZUZpbHRlcjo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1UaW1lRmlsdGVyID09IE5VTEwpIHsKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVyVGltZUZpbHRlcjo6Y2xvc2UoKSB7CisgICAgaWYgKG1UaW1lRmlsdGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIklUaW1lRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CiAgICAgfQogCi0gICAgUmVzdWx0IHJlcyA9IG1UaW1lRmlsdGVyLT5jbG9zZSgpOwotICAgIG1UaW1lRmlsdGVyID0gTlVMTDsKKyAgICBhdXRvIHN0YXR1cyA9IG1UaW1lRmlsdGVyLT5jbG9zZSgpOworICAgIG1UaW1lRmlsdGVyID0gbnVsbHB0cjsKIAotICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQorCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyVGltZUZpbHRlci5oIGIvc2VydmljZXMvdHVuZXIvVHVuZXJUaW1lRmlsdGVyLmgKaW5kZXggZDY3NTMxOS4uMzFhNDdjZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvVHVuZXJUaW1lRmlsdGVyLmgKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJUaW1lRmlsdGVyLmgKQEAgLTE3LDM4ICsxNyw0MCBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSRlRJTUVGSUxURVJfSAogI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSRlRJTUVGSUxURVJfSAogCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0lUaW1lRmlsdGVyLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJUaW1lRmlsdGVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSVRpbWVGaWx0ZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMS90eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLXVzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpCblR1bmVyVGltZUZpbHRlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SVRpbWVGaWx0ZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OklUaW1lRmlsdGVyOwogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCituYW1lc3BhY2UgYWlkbCB7CiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CiAKIGNsYXNzIFR1bmVyVGltZUZpbHRlciA6IHB1YmxpYyBCblR1bmVyVGltZUZpbHRlciB7CiAKIHB1YmxpYzoKLSAgICBUdW5lclRpbWVGaWx0ZXIoc3A8SVRpbWVGaWx0ZXI+IHRpbWVGaWx0ZXIpOworICAgIFR1bmVyVGltZUZpbHRlcihzaGFyZWRfcHRyPElUaW1lRmlsdGVyPiB0aW1lRmlsdGVyKTsKICAgICB2aXJ0dWFsIH5UdW5lclRpbWVGaWx0ZXIoKTsKLSAgICBTdGF0dXMgc2V0VGltZVN0YW1wKGludDY0X3QgdGltZVN0YW1wKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgY2xlYXJUaW1lU3RhbXAoKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0U291cmNlVGltZShpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotICAgIFN0YXR1cyBnZXRUaW1lU3RhbXAoaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldFRpbWVTdGFtcChpbnQ2NF90IGluX3RpbWVTdGFtcCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2xlYXJUaW1lU3RhbXAoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRTb3VyY2VUaW1lKGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0VGltZVN0YW1wKGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKLSAgICBzcDxJVGltZUZpbHRlcj4gbVRpbWVGaWx0ZXI7CisgICAgc2hhcmVkX3B0cjxJVGltZUZpbHRlcj4gbVRpbWVGaWx0ZXI7CiB9OwogCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKIAogI2VuZGlmIC8vIEFORFJPSURfTUVESUFfVFVORVJGVElNRUZJTFRFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvT1dORVJTIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L09XTkVSUwppbmRleCAwY2ViOGU4Li5iZjlmZTM0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvT1dORVJTCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di9PV05FUlMKQEAgLTEsMiArMSwyIEBACi1uY2hhbGtvQGdvb2dsZS5jb20KK2hnY2hlbkBnb29nbGUuY29tCiBxdXhpYW5nZmFuZ0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRGVtdXguYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEZW11eC5haWRsCmluZGV4IDczYjAwYWUuLmZhMzI2YjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEZW11eC5haWRsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEZW11eC5haWRsCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKIAoraW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRGVtdXhGaWx0ZXJUeXBlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRHZyVHlwZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckR2cjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckR2ckNhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyRmlsdGVyOwpAQCAtMzYsMTAgKzM4LDE1IEBACiAgICAgdm9pZCBzZXRGcm9udGVuZERhdGFTb3VyY2UoaW4gSVR1bmVyRnJvbnRlbmQgZnJvbnRlbmQpOwogCiAgICAgLyoqCisgICAgICogU2V0IGEgZnJvbnRlbmQgcmVzb3VyY2UgYnkgSUQgYXMgZGF0YSBpbnB1dCBvZiB0aGUgZGVtdXgKKyAgICAgKi8KKyAgICB2b2lkIHNldEZyb250ZW5kRGF0YVNvdXJjZUJ5SWQoaW4gaW50IGZyb250ZW5kSWQpOworCisgICAgLyoqCiAgICAgICogT3BlbiBhIG5ldyBmaWx0ZXIgaW4gdGhlIGRlbXV4CiAgICAgICovCi0gICAgSVR1bmVyRmlsdGVyIG9wZW5GaWx0ZXIoCi0gICAgICAgIGluIGludCBtYWluVHlwZSwgaW4gaW50IHN1YnR5cGUsIGluIGludCBidWZmZXJTaXplLCBpbiBJVHVuZXJGaWx0ZXJDYWxsYmFjayBjYik7CisgICAgSVR1bmVyRmlsdGVyIG9wZW5GaWx0ZXIoaW4gRGVtdXhGaWx0ZXJUeXBlIHR5cGUsIGluIGludCBidWZmZXJTaXplLAorICAgICAgICBpbiBJVHVuZXJGaWx0ZXJDYWxsYmFjayBjYik7CiAKICAgICAvKioKICAgICAgKiBPcGVuIHRpbWUgZmlsdGVyIG9mIHRoZSBkZW11eC4KQEAgLTU5LDcgKzY2LDcgQEAKICAgICAvKioKICAgICAgKiBPcGVuIGEgRFZSIChEaWdpdGFsIFZpZGVvIFJlY29yZCkgaW5zdGFuY2UgaW4gdGhlIGRlbXV4LgogICAgICAqLwotICAgIElUdW5lckR2ciBvcGVuRHZyKGluIGludCBkdmJUeXBlLCBpbiBpbnQgYnVmZmVyU2l6ZSwgaW4gSVR1bmVyRHZyQ2FsbGJhY2sgY2IpOworICAgIElUdW5lckR2ciBvcGVuRHZyKGluIER2clR5cGUgZHZiVHlwZSwgaW4gaW50IGJ1ZmZlclNpemUsIGluIElUdW5lckR2ckNhbGxiYWNrIGNiKTsKIAogICAgIC8qKgogICAgICAqIENvbm5lY3QgQ29uZGl0aW9uYWwgQWNjZXNzIE1vZHVsZXMgKENBTSkgdGhyb3VnaCBDb21tb24gSW50ZXJmYWNlIChDSSkuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRGVzY3JhbWJsZXIuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEZXNjcmFtYmxlci5haWRsCmluZGV4IDczNzBlZWUuLjM5ZDE5M2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEZXNjcmFtYmxlci5haWRsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEZXNjcmFtYmxlci5haWRsCkBAIC0xNiw5ICsxNiw5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKIAoraW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRGVtdXhQaWQ7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJEZW11eDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRGVtdXhQaWQ7CiAKIC8qKgogICogVHVuZXIgRGVtdXggaW50ZXJmYWNlIGhhbmRsZXMgdHVuZXIgcmVsYXRlZCBvcGVyYXRpb25zLgpAQCAtMzksMTIgKzM5LDEyIEBACiAgICAgLyoqCiAgICAgICogQWRkIHBhY2tldHMnIFBJRCB0byB0aGUgZGVzY3JhbWJsZXIgZm9yIGRlc2NyYW1ibGluZy4KICAgICAgKi8KLSAgICB2b2lkIGFkZFBpZChpbiBUdW5lckRlbXV4UGlkIHBpZCwgaW4gSVR1bmVyRmlsdGVyIG9wdGlvbmFsU291cmNlRmlsdGVyKTsKKyAgICB2b2lkIGFkZFBpZChpbiBEZW11eFBpZCBwaWQsIGluIElUdW5lckZpbHRlciBvcHRpb25hbFNvdXJjZUZpbHRlcik7CiAKICAgICAvKioKICAgICAgKiBSZW1vdmUgcGFja2V0cycgUElEIGZyb20gdGhlIGRlc2NyYW1ibGVyLgogICAgICAqLwotICAgIHZvaWQgcmVtb3ZlUGlkKGluIFR1bmVyRGVtdXhQaWQgcGlkLCBpbiBJVHVuZXJGaWx0ZXIgb3B0aW9uYWxTb3VyY2VGaWx0ZXIpOworICAgIHZvaWQgcmVtb3ZlUGlkKGluIERlbXV4UGlkIHBpZCwgaW4gSVR1bmVyRmlsdGVyIG9wdGlvbmFsU291cmNlRmlsdGVyKTsKIAogICAgIC8qKgogICAgICAqIENsb3NlIGEgbmV3IGludGVyZmFjZSBvZiBJVHVuZXJEZXNjcmFtYmxlci4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEdnIuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEdnIuYWlkbAppbmRleCA4ZjE2MDFiLi4yYzAxYzRlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyLmFpZGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckR2ci5haWRsCkBAIC0xOCw4ICsxOCw4IEBACiAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEuTVFEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLmZtcS5TeW5jaHJvbml6ZWRSZWFkV3JpdGU7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5EdnJTZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRHZyU2V0dGluZ3M7CiAKIC8qKgogICogVHVuZXIgRHZyIGludGVyZmFjZSBoYW5kbGVzIHR1bmVyIHJlbGF0ZWQgb3BlcmF0aW9ucy4KQEAgLTM1LDcgKzM1LDcgQEAKICAgICAvKioKICAgICAgKiBDb25maWd1cmUgdGhlIERWUi4KICAgICAgKi8KLSAgICB2b2lkIGNvbmZpZ3VyZShpbiBUdW5lckR2clNldHRpbmdzIHNldHRpbmdzKTsKKyAgICB2b2lkIGNvbmZpZ3VyZShpbiBEdnJTZXR0aW5ncyBzZXR0aW5ncyk7CiAKICAgICAvKioKICAgICAgKiBBdHRhY2ggb25lIGZpbHRlciB0byBEVlIgaW50ZXJmYWNlIGZvciByZWNvcmRpbmcuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyQ2FsbGJhY2suYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEdnJDYWxsYmFjay5haWRsCmluZGV4IGUyMzRmZTUuLjMwNDNkMjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEdnJDYWxsYmFjay5haWRsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEdnJDYWxsYmFjay5haWRsCkBAIC0xNiw2ICsxNiw5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKIAoraW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuUGxheWJhY2tTdGF0dXM7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5SZWNvcmRTdGF0dXM7CisKIC8qKgogICogVHVuZXJEdnJDYWxsYmFjayBpbnRlcmZhY2UgaGFuZGxlcyB0dW5lciBkdnIgcmVsYXRlZCBjYWxsYmFja3MuCiAgKgpAQCAtMjUsMTAgKzI4LDEwIEBACiAgICAgLyoqCiAgICAgICogTm90aWZ5IHRoZSBjbGllbnQgYSBuZXcgc3RhdHVzIG9mIHRoZSBkZW11eCdzIHJlY29yZC4KICAgICAgKi8KLSAgICB2b2lkIG9uUmVjb3JkU3RhdHVzKGluIGludCBzdGF0dXMpOworICAgIHZvaWQgb25SZWNvcmRTdGF0dXMoaW4gUmVjb3JkU3RhdHVzIHN0YXR1cyk7CiAKICAgICAvKioKICAgICAgKiBOb3RpZnkgdGhlIGNsaWVudCBhIG5ldyBzdGF0dXMgb2YgdGhlIGRlbXV4J3MgcGxheWJhY2suCiAgICAgICovCi0gICAgdm9pZCBvblBsYXliYWNrU3RhdHVzKGluIGludCBzdGF0dXMpOworICAgIHZvaWQgb25QbGF5YmFja1N0YXR1cyhpbiBQbGF5YmFja1N0YXR1cyBzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZpbHRlci5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZpbHRlci5haWRsCmluZGV4IDEwZDRjM2IuLmRjNDBmMDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGaWx0ZXIuYWlkbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRmlsdGVyLmFpZGwKQEAgLTE5LDggKzE5LDExIEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uZm1xLk1RRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEuU3luY2hyb25pemVkUmVhZFdyaXRlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLk5hdGl2ZUhhbmRsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2hhcmVkSGFuZGxlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkRlbXV4RmlsdGVyU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5EZW11eEZpbHRlclR5cGU7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5BdlN0cmVhbVR5cGU7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5EZW11eEZpbHRlck1vbml0b3JFdmVudFR5cGU7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5GaWx0ZXJEZWxheUhpbnQ7CiAKIC8qKgogICogVHVuZXIgRmlsdGVyIGludGVyZmFjZSBoYW5kbGVzIHR1bmVyIHJlbGF0ZWQgb3BlcmF0aW9ucy4KQEAgLTQ2LDEyICs0OSwxMiBAQAogICAgIC8qKgogICAgICAqIENvbmZpZ3VyZSB0aGUgZmlsdGVyLgogICAgICAqLwotICAgIHZvaWQgY29uZmlndXJlKGluIFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiBjb25maWcpOworICAgIHZvaWQgY29uZmlndXJlKGluIERlbXV4RmlsdGVyU2V0dGluZ3Mgc2V0dGluZ3MpOwogCiAgICAgLyoqCiAgICAgICogQ29uZmlndXJlIHRoZSBtb25pdG9yIGV2ZW50IG9mIHRoZSBGaWx0ZXIuCiAgICAgICovCi0gICAgdm9pZCBjb25maWd1cmVNb25pdG9yRXZlbnQoaW4gaW50IG1vbml0b3JFdmVudFR5cGUpOworICAgIHZvaWQgY29uZmlndXJlTW9uaXRvckV2ZW50KGluIGludCBtb25pdG9yRXZlbnRUeXBlcyk7CiAKICAgICAvKioKICAgICAgKiBDb25maWd1cmUgdGhlIGNvbnRleHQgaWQgb2YgdGhlIElQIEZpbHRlci4KQEAgLTYxLDEyICs2NCwxMiBAQAogICAgIC8qKgogICAgICAqIENvbmZpZ3VyZSB0aGUgc3RyZWFtIHR5cGUgb2YgdGhlIG1lZGlhIEZpbHRlci4KICAgICAgKi8KLSAgICB2b2lkIGNvbmZpZ3VyZUF2U3RyZWFtVHlwZShpbiBpbnQgYXZTdHJlYW1UeXBlKTsKKyAgICB2b2lkIGNvbmZpZ3VyZUF2U3RyZWFtVHlwZShpbiBBdlN0cmVhbVR5cGUgYXZTdHJlYW1UeXBlKTsKIAogICAgIC8qKgogICAgICAqIEdldCB0aGUgYS92IHNoYXJlZCBtZW1vcnkgaGFuZGxlCiAgICAgICovCi0gICAgVHVuZXJGaWx0ZXJTaGFyZWRIYW5kbGVJbmZvIGdldEF2U2hhcmVkSGFuZGxlSW5mbygpOworICAgIGxvbmcgZ2V0QXZTaGFyZWRIYW5kbGUob3V0IE5hdGl2ZUhhbmRsZSBhdk1lbW9yeSk7CiAKICAgICAvKioKICAgICAgKiBSZWxlYXNlIHRoZSBoYW5kbGUgcmVwb3J0ZWQgYnkgdGhlIEhBTCBmb3IgQVYgbWVtb3J5LgpAQCAtOTcsNCArMTAwLDI4IEBACiAgICAgICogQ2xvc2UgdGhlIGZpbHRlci4KICAgICAgKi8KICAgICB2b2lkIGNsb3NlKCk7CisKKyAgICAvKioKKyAgICAgKiBBY3F1aXJlIGEgbmV3IFNoYXJlZEZpbHRlciB0b2tlbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSB0b2tlbiBvZiB0aGUgbmV3bHkgY3JlYXRlZCBTaGFyZWRGaWx0ZXIgaW5zdGFuY2UuCisgICAgICovCisgICAgU3RyaW5nIGFjcXVpcmVTaGFyZWRGaWx0ZXJUb2tlbigpOworCisgICAgLyoqCisgICAgICogRnJlZSBhIFNoYXJlZEZpbHRlciB0b2tlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJUb2tlbiB0aGUgU2hhcmVkRmlsdGVyIHRva2VuIHdpbGwgYmUgcmVsZWFzZWQuCisgICAgICogQHJldHVybiBhIHRva2VuIG9mIHRoZSBuZXdseSBjcmVhdGVkIFNoYXJlZEZpbHRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICB2b2lkIGZyZWVTaGFyZWRGaWx0ZXJUb2tlbihpbiBTdHJpbmcgZmlsdGVyVG9rZW4pOworCisgICAgLyoqCisgICAgICogR2V0IGZpbHRlciB0eXBlLgorICAgICAqCisgICAgICogQHJldHVybiBmaWx0ZXIgdHlwZS4KKyAgICAgKi8KKyAgICBEZW11eEZpbHRlclR5cGUgZ2V0RmlsdGVyVHlwZSgpOworCisgICAgdm9pZCBzZXREZWxheUhpbnQoaW4gRmlsdGVyRGVsYXlIaW50IGhpbnQpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZpbHRlckNhbGxiYWNrLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRmlsdGVyQ2FsbGJhY2suYWlkbAppbmRleCBlN2E1MmE3Li42YzUzMDQyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRmlsdGVyQ2FsbGJhY2suYWlkbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRmlsdGVyQ2FsbGJhY2suYWlkbApAQCAtMTYsNyArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5EZW11eEZpbHRlckV2ZW50OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRGVtdXhGaWx0ZXJTdGF0dXM7CiAKIC8qKgogICogVHVuZXJGaWx0ZXJDYWxsYmFjayBpbnRlcmZhY2UgaGFuZGxlcyB0dW5lciBmaWx0ZXIgcmVsYXRlZCBjYWxsYmFja3MuCkBAIC0yNywxMCArMjgsMTAgQEAKICAgICAvKioKICAgICAgKiBOb3RpZnkgdGhlIGNsaWVudCBhIG5ldyBzdGF0dXMgb2YgYSBmaWx0ZXIuCiAgICAgICovCi0gICAgdm9pZCBvbkZpbHRlclN0YXR1cyhpbnQgc3RhdHVzKTsKKyAgICB2b2lkIG9uRmlsdGVyU3RhdHVzKGluIERlbXV4RmlsdGVyU3RhdHVzIHN0YXR1cyk7CiAKICAgICAvKioKICAgICAgKiBOb3RpZnkgdGhlIGNsaWVudCB0aGF0IGEgbmV3IGZpbHRlciBldmVudCBoYXBwZW5lZC4KICAgICAgKi8KLSAgICB2b2lkIG9uRmlsdGVyRXZlbnQoaW4gVHVuZXJGaWx0ZXJFdmVudFtdIGZpbHRlckV2ZW50KTsKKyAgICB2b2lkIG9uRmlsdGVyRXZlbnQoaW4gRGVtdXhGaWx0ZXJFdmVudFtdIGV2ZW50cyk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRnJvbnRlbmQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGcm9udGVuZC5haWRsCmluZGV4IGVmMDI1NWEuLjA0OTNmMDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGcm9udGVuZC5haWRsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGcm9udGVuZC5haWRsCkBAIC0xLDUgKzEsNSBAQAogLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE2LDEwICsxNiwxMyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CiAKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkZyb250ZW5kU2NhblR5cGU7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5Gcm9udGVuZFNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRnJvbnRlbmRTdGF0dXM7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5Gcm9udGVuZFN0YXR1c1JlYWRpbmVzczsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyLkZyb250ZW5kU3RhdHVzVHlwZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckZyb250ZW5kQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJMbmI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kU3RhdHVzOwogCiAvKioKICAqIFR1bmVyIEZyb250ZW5kIGludGVyZmFjZSBoYW5kbGVzIGZyb250ZW5kIHJlbGF0ZWQgb3BlcmF0aW9ucy4KQEAgLTM5LDcgKzQyLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZXR0aW5ncyB0aGUgc2V0dGluZ3MgdG8gdHVuZSB3aXRoLgogICAgICAqLwotICAgIHZvaWQgdHVuZShpbiBUdW5lckZyb250ZW5kU2V0dGluZ3Mgc2V0dGluZ3MpOworICAgIHZvaWQgdHVuZShpbiBGcm9udGVuZFNldHRpbmdzIHNldHRpbmdzKTsKIAogICAgIC8qKgogICAgICAqIFN0b3AgdGhlIHByZXZpb3VzIHR1bmluZy4KQEAgLTUyLDcgKzU1LDcgQEAKICAgICAgKiBAcGFyYW0gc2V0dGluZ3MgdGhlIHNldHRpbmdzIHRvIHNjYW4gd2l0aC4KICAgICAgKiBAcGFyYW0gZnJvbnRlbmRTY2FuVHlwZSBzY2FuIHdpdGggZ2l2ZW4gdHlwZS4KICAgICAgKi8KLSAgICB2b2lkIHNjYW4oaW4gVHVuZXJGcm9udGVuZFNldHRpbmdzIHNldHRpbmdzLCBpbiBpbnQgZnJvbnRlbmRTY2FuVHlwZSk7CisgICAgdm9pZCBzY2FuKGluIEZyb250ZW5kU2V0dGluZ3Mgc2V0dGluZ3MsIGluIEZyb250ZW5kU2NhblR5cGUgZnJvbnRlbmRTY2FuVHlwZSk7CiAKICAgICAvKioKICAgICAgKiBTdG9wIHRoZSBwcmV2aW91cyBzY2FubmluZy4KQEAgLTY3LDEzICs3MCw2IEBACiAgICAgdm9pZCBzZXRMbmIoaW4gSVR1bmVyTG5iIGxuYik7CiAKICAgICAvKioKLSAgICAgKiBFbmFibGUgb3IgRGlzYWJsZSBMb3cgTm9pc2UgQW1wbGlmaWVyIChMTkEpLgotICAgICAqCi0gICAgICogQHBhcmFtIGJFbmFibGUgZW5hYmxlIExuYSBvciBub3QuCi0gICAgICovCi0gICAgdm9pZCBzZXRMbmEoaW4gYm9vbGVhbiBiRW5hYmxlKTsKLQotICAgIC8qKgogICAgICAqIExpbmsgRnJvbnRlbmQgdG8gdGhlIGNpY2FtIHdpdGggZ2l2ZW4gaWQuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIGx0cyBpZApAQCAtOTMsMTUgKzg5LDI1IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc3RhdHVzZXMgb2YgdGhlIGZyb250ZW5kLgogICAgICAqLwotICAgIFR1bmVyRnJvbnRlbmRTdGF0dXNbXSBnZXRTdGF0dXMoaW4gaW50W10gc3RhdHVzVHlwZXMpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgMS4xIGV4dGVuZGVkIHN0YXR1c2VzIG9mIHRoZSBmcm9udGVuZC4KLSAgICAgKi8KLSAgICBUdW5lckZyb250ZW5kU3RhdHVzW10gZ2V0U3RhdHVzRXh0ZW5kZWRfMV8xKGluIGludFtdIHN0YXR1c1R5cGVzKTsKKyAgICBGcm9udGVuZFN0YXR1c1tdIGdldFN0YXR1cyhpbiBGcm9udGVuZFN0YXR1c1R5cGVbXSBzdGF0dXNUeXBlcyk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpZCBvZiB0aGUgZnJvbnRlbmQuCiAgICAgICovCiAgICAgaW50IGdldEZyb250ZW5kSWQoKTsKKworICAgIC8qKgorICAgICAqIFJlcXVlc3QgaGFyZHdhcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZyb250ZW5kLgorICAgICAqLworICAgIFN0cmluZyBnZXRIYXJkd2FyZUluZm8oKTsKKworICAgIC8qKgorICAgICAqIEZpbHRlciBvdXQgdW5uZWNlc3NhcnkgUElEIGZyb20gZnJvbnRlbmQgb3V0cHV0LgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlT3V0cHV0UGlkKGludCBwaWQpOworCisgICAgLyoqCisgICAgICogR2V0cyBGcm9udGVuZFN0YXR1c+KAmSByZWFkaW5lc3Mgc3RhdHVzZXMgZm9yIGdpdmVuIHN0YXR1cyB0eXBlcy4KKyAgICAgKi8KKyAgICBGcm9udGVuZFN0YXR1c1JlYWRpbmVzc1tdIGdldEZyb250ZW5kU3RhdHVzUmVhZGluZXNzKGluIEZyb250ZW5kU3RhdHVzVHlwZVtdIHN0YXR1c1R5cGVzKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGcm9udGVuZENhbGxiYWNrLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRnJvbnRlbmRDYWxsYmFjay5haWRsCmluZGV4IGM5MmY1ZWUuLmQwYWIxMWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGcm9udGVuZENhbGxiYWNrLmFpZGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZyb250ZW5kQ2FsbGJhY2suYWlkbApAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiw3ICsxNiw5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRnJvbnRlbmRFdmVudFR5cGU7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5Gcm9udGVuZFNjYW5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU7CiAKIC8qKgogICogVHVuZXJGcm9udGVuZENhbGxiYWNrIGludGVyZmFjZSBoYW5kbGVzIHR1bmVyIGZyb250ZW5kIHJlbGF0ZWQgY2FsbGJhY2tzLgpAQCAtMjQsMTMgKzI2LDE0IEBACiAgKiB7QGhpZGV9CiAgKi8KIGludGVyZmFjZSBJVHVuZXJGcm9udGVuZENhbGxiYWNrIHsKLSAgICAgICAgLyoqCisgICAgLyoqCiAgICAgICogTm90aWZ5IHRoZSBjbGllbnQgdGhhdCBhIG5ldyBldmVudCBoYXBwZW5lZCBvbiB0aGUgZnJvbnRlbmQuCiAgICAgICovCi0gICAgdm9pZCBvbkV2ZW50KGluIGludCBmcm9udGVuZEV2ZW50VHlwZSk7CisgICAgdm9pZCBvbkV2ZW50KGluIEZyb250ZW5kRXZlbnRUeXBlIGZyb250ZW5kRXZlbnRUeXBlKTsKIAogICAgIC8qKgogICAgICAqIG5vdGlmeSB0aGUgY2xpZW50IG9mIHNjYW4gbWVzc2FnZXMuCiAgICAgICovCi0gICAgdm9pZCBvblNjYW5NZXNzYWdlKGluIGludCBtZXNzYWdlVHlwZSwgaW4gVHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlIG1lc3NhZ2UpOworICAgIHZvaWQgb25TY2FuTWVzc2FnZShpbiBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgaW4gRnJvbnRlbmRTY2FuTWVzc2FnZSBtZXNzYWdlKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJMbmIuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJMbmIuYWlkbAppbmRleCBkNjIxNDVlLi43OWYwNzYxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyTG5iLmFpZGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckxuYi5haWRsCkBAIC0xNiw2ICsxNiw5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKIAoraW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuTG5iUG9zaXRpb247CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5MbmJUb25lOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuTG5iVm9sdGFnZTsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckxuYkNhbGxiYWNrOwogCiAvKioKQEAgLTMyLDE3ICszNSwxNyBAQAogICAgIC8qKgogICAgICAqIFNldCB0aGUgbG5iJ3MgcG93ZXIgdm9sdGFnZS4KICAgICAgKi8KLSAgICB2b2lkIHNldFZvbHRhZ2UoaW4gaW50IHZvbHRhZ2UpOworICAgIHZvaWQgc2V0Vm9sdGFnZShpbiBMbmJWb2x0YWdlIHZvbHRhZ2UpOwogCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBsbmIncyB0b25lIG1vZGUuCiAgICAgICovCi0gICAgdm9pZCBzZXRUb25lKGluIGludCB0b25lKTsKKyAgICB2b2lkIHNldFRvbmUoaW4gTG5iVG9uZSB0b25lKTsKIAogICAgIC8qKgogICAgICAqIFNlbGVjdCB0aGUgbG5iJ3MgcG9zaXRpb24uCiAgICAgICovCi0gICAgdm9pZCBzZXRTYXRlbGxpdGVQb3NpdGlvbihpbiBpbnQgcG9zaXRpb24pOworICAgIHZvaWQgc2V0U2F0ZWxsaXRlUG9zaXRpb24oaW4gTG5iUG9zaXRpb24gcG9zaXRpb24pOwogCiAgICAgLyoqCiAgICAgICogU2VuZHMgRGlTRXFDIChEaWdpdGFsIFNhdGVsbGl0ZSBFcXVpcG1lbnQgQ29udHJvbCkgbWVzc2FnZS4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJMbmJDYWxsYmFjay5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckxuYkNhbGxiYWNrLmFpZGwKaW5kZXggMTE3MzUyZi4uMmI2ZWI1ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckxuYkNhbGxiYWNrLmFpZGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckxuYkNhbGxiYWNrLmFpZGwKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwogCitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5MbmJFdmVudFR5cGU7CisKIC8qKgogICogVHVuZUxuYkNhbGxiYWNrIGludGVyZmFjZSBoYW5kbGVzIHR1bmVyIGxuYiByZWxhdGVkIGNhbGxiYWNrcy4KICAqCkBAIC0yNSw3ICsyNyw3IEBACiAgICAgLyoqCiAgICAgICogTm90aWZ5IHRoZSBjbGllbnQgdGhhdCBhIG5ldyBldmVudCBoYXBwZW5lZCBvbiB0aGUgTG5iLgogICAgICAqLwotICAgIHZvaWQgb25FdmVudChpbiBpbnQgbG5iRXZlbnRUeXBlKTsKKyAgICB2b2lkIG9uRXZlbnQoaW4gTG5iRXZlbnRUeXBlIGxuYkV2ZW50VHlwZSk7CiAKICAgICAvKioKICAgICAgKiBub3RpZnkgdGhlIGNsaWVudCBvZiBuZXcgRGlTRXFDIG1lc3NhZ2UuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyU2VydmljZS5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lclNlcnZpY2UuYWlkbAppbmRleCA3NTViMTUyLi5iODA4NGFiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyU2VydmljZS5haWRsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJTZXJ2aWNlLmFpZGwKQEAgLTEsNSArMSw1IEBACiAvKioKLSAqIENvcHlyaWdodCAoYykgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChjKSAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiwxNiArMTYsMTUgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwogCi1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uZm1xLk1RRGVzY3JpcHRvcjsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEuU3luY2hyb25pemVkUmVhZFdyaXRlOwotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLmZtcS5VbnN5bmNocm9uaXplZFdyaXRlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudHYudHVuZXIuRGVtdXhDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5Gcm9udGVuZEluZm87CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS50di50dW5lci5Gcm9udGVuZFR5cGU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJEZW11eDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckRlc2NyYW1ibGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyRmlsdGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyRmlsdGVyQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJGcm9udGVuZDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckxuYjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRGVtdXhDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kRHRtYkNhcGFiaWxpdGllczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRJbmZvOwogCiAvKioKICAqIFR1bmVyU2VydmljZSBpbnRlcmZhY2UgaGFuZGxlcyB0dW5lciByZWxhdGVkIG9wZXJhdGlvbnMuCkBAIC0zMyw4ICszMiw4IEBACiAgKiB7QGhpZGV9CiAgKi8KIC8vQFZpbnRmU3RhYmlsaXR5CitAU3VwcHJlc3NXYXJuaW5ncyh2YWx1ZT17Im91dC1hcnJheSJ9KQogaW50ZXJmYWNlIElUdW5lclNlcnZpY2UgewotCiAgICAgLyoqCiAgICAgICogR2V0cyBmcm9udGVuZCBJRHMuCiAgICAgICovCkBAIC00MywxNSArNDIsMTAgQEAKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgZnJvbnRlbmQncyBpbmZvcm1hdGlvbi4KICAgICAgKgotICAgICAqIEBwYXJhbSBmcm9udGVuZEhhbmRsZSB0aGUgaGFuZGxlIG9mIHRoZSBmcm9udGVuZCBncmFudGVkIGJ5IFRSTS4KKyAgICAgKiBAcGFyYW0gZnJvbnRlbmRJZCB0aGUgSUQgb2YgdGhlIGZyb250ZW5kLgogICAgICAqIEByZXR1cm4gdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBmcm9udGVuZC4KICAgICAgKi8KLSAgICBUdW5lckZyb250ZW5kSW5mbyBnZXRGcm9udGVuZEluZm8oaW4gaW50IGZyb250ZW5kSGFuZGxlKTsKLQotICAgIC8qKgotICAgICAqIEdldCBEdG1iIEZyb250ZW5kIENhcGFiaWxpdGllcy4KLSAgICAgKi8KLSAgICBUdW5lckZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyBnZXRGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMoaW4gaW50IGlkKTsKKyAgICBGcm9udGVuZEluZm8gZ2V0RnJvbnRlbmRJbmZvKGluIGludCBmcm9udGVuZElkKTsKIAogICAgIC8qKgogICAgICAqIE9wZW4gYSBUdW5lciBGcm9udGVuZCBpbnRlcmZhY2UuCkBAIC04Nyw3ICs4MSw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBkZW11eOKAmXMgY2FwYWJpbGl0aWVzLgogICAgICAqLwotICAgIFR1bmVyRGVtdXhDYXBhYmlsaXRpZXMgZ2V0RGVtdXhDYXBzKCk7CisgICAgRGVtdXhDYXBhYmlsaXRpZXMgZ2V0RGVtdXhDYXBzKCk7CiAKICAgICAvKiBPcGVuIGEgbmV3IGludGVyZmFjZSBvZiBJVHVuZXJEZXNjcmFtYmxlciBnaXZlbiBhIGRlc2NyYW1ibGVySGFuZGxlLgogICAgICAqCkBAIC0xMDIsNCArOTYsMzggQEAKICAgICAgKiB2YWx1ZSBpcyB1bmtub3duIHZlcnNpb24gMC4KICAgICAgKi8KICAgICBpbnQgZ2V0VHVuZXJIYWxWZXJzaW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBPcGVuIGEgbmV3IFNoYXJlZEZpbHRlciBpbnN0YW5jZSBvZiBJVHVuZXJGaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyVG9rZW4gdGhlIFNoYXJlZEZpbHRlciB0b2tlbiBjcmVhdGVkIGJ5IElUdW5lckZpbHRlci4KKyAgICAgKiBAcGFyYW0gY2IgdGhlIElUdW5lckZpbHRlckNhbGxiYWNrIHVzZWQgdG8gcmVjZWl2ZSBjYWxsYmFjayBldmVudHMKKyAgICAgKiBAcmV0dXJuIGEgbmV3bHkgY3JlYXRlZCBJVHVuZXJGaWx0ZXIgaW50ZXJmYWNlLgorICAgICAqLworICAgIElUdW5lckZpbHRlciBvcGVuU2hhcmVkRmlsdGVyKGluIFN0cmluZyBmaWx0ZXJUb2tlbiwgaW4gSVR1bmVyRmlsdGVyQ2FsbGJhY2sgY2IpOworCisgICAgLyoqCisgICAgICogRW5hYmxlIG9yIERpc2FibGUgTG93IE5vaXNlIEFtcGxpZmllciAoTE5BKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiRW5hYmxlIGVuYWJsZSBMbmEgb3Igbm90LgorICAgICAqLworICAgIHZvaWQgc2V0TG5hKGluIGJvb2xlYW4gYkVuYWJsZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1heGltdW0gdXNhYmxlIGZyb250ZW5kcyBudW1iZXIgb2YgYSBnaXZlbiBmcm9udGVuZCB0eXBlLiBJdCdzIHVzZWQgYnkgY2xpZW50CisgICAgICogdG8gZW5hYmxlIG9yIGRpc2FibGUgZnJvbnRlbmRzIHdoZW4gY2FibGUgY29ubmVjdGlvbiBzdGF0dXMgaXMgY2hhbmdlZCBieSB1c2VyLgorICAgICAqCisgICAgICogQHBhcmFtIGZyb250ZW5kVHlwZSB0aGUgZnJvbnRlbmQgdHlwZSB3aGljaCB0aGUgbWF4aW11bSB1c2FibGUgbnVtYmVyIHdpbGwgYmUgc2V0LgorICAgICAqIEBwYXJhbSBtYXhOdW1iZXIgdGhlIG5ldyBtYXhpbXVtIHVzYWJsZSBudW1iZXIuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhpbiBGcm9udGVuZFR5cGUgZnJvbnRlbmRUeXBlLCBpbiBpbnQgbWF4TnVtYmVyKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWF4aW11bSB1c2FibGUgZnJvbnRlbmRzIG51bWJlciBvZiBhIGdpdmVuIGZyb250ZW5kIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbnRlbmRUeXBlIHRoZSBmcm9udGVuZCB0eXBlIHdoaWNoIHRoZSBtYXhpbXVtIHVzYWJsZSBudW1iZXIgd2lsbCBiZSBxdWVyaWVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSB1c2FibGUgbnVtYmVyIG9mIHRoZSBxdWVyaWVkIGZyb250ZW5kIHR5cGUuCisgICAgICovCisgICAgaW50IGdldE1heE51bWJlck9mRnJvbnRlbmRzKGluIEZyb250ZW5kVHlwZSBmcm9udGVuZFR5cGUpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyQXVkaW9FeHRyYU1ldGFEYXRhLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJBdWRpb0V4dHJhTWV0YURhdGEuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYzMzc0YS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJBdWRpb0V4dHJhTWV0YURhdGEuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRXh0cmEgTWV0YSBEYXRhIGZyb20gQUQgKEF1ZGlvIERlc2NyaXB0b3IpIGFjY29yZGluZyB0byBFVFNJIFRTIDEwMSAxNTQgVjIuMS4xLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckF1ZGlvRXh0cmFNZXRhRGF0YSB7Ci0gICAgYnl0ZSBhZEZhZGU7Ci0KLSAgICBieXRlIGFkUGFuOwotCi0gICAgYnl0ZSB2ZXJzaW9uVGV4dFRhZzsKLQotICAgIGJ5dGUgYWRHYWluQ2VudGVyOwotCi0gICAgYnl0ZSBhZEdhaW5Gcm9udDsKLQotICAgIGJ5dGUgYWRHYWluU3Vycm91bmQ7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEZW11eENhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhDYXBhYmlsaXRpZXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhYjE1MS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEZW11eENhcGFiaWxpdGllcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBUdW5lciBEZW11eCBjYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckRlbXV4Q2FwYWJpbGl0aWVzIHsKLSAgICBpbnQgbnVtRGVtdXg7Ci0KLSAgICBpbnQgbnVtUmVjb3JkOwotCi0gICAgaW50IG51bVBsYXliYWNrOwotCi0gICAgaW50IG51bVRzRmlsdGVyOwotCi0gICAgaW50IG51bVNlY3Rpb25GaWx0ZXI7Ci0KLSAgICBpbnQgbnVtQXVkaW9GaWx0ZXI7Ci0KLSAgICBpbnQgbnVtVmlkZW9GaWx0ZXI7Ci0KLSAgICBpbnQgbnVtUGVzRmlsdGVyOwotCi0gICAgaW50IG51bVBjckZpbHRlcjsKLQotICAgIGludCBudW1CeXRlc0luU2VjdGlvbkZpbHRlcjsKLQotICAgIGludCBmaWx0ZXJDYXBzOwotCi0gICAgaW50W10gbGlua0NhcHM7Ci0KLSAgICBib29sZWFuIGJUaW1lRmlsdGVyOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhJcEFkZHJlc3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4SXBBZGRyZXNzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NWY0MDQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhJcEFkZHJlc3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRGVtdXggaXAgYWRkcmVzcyBjb25maWd1cmUuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRGVtdXhJcEFkZHJlc3MgewotICAgIGJvb2xlYW4gaXNJcFY2OwotCi0gICAgYnl0ZVtdIGFkZHI7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEZW11eElwQWRkcmVzc1NldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEZW11eElwQWRkcmVzc1NldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNDQzODguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhJcEFkZHJlc3NTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJEZW11eElwQWRkcmVzczsKLQotLyoqCi0gKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGFuIElwIGZpbHRlci4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJEZW11eElwQWRkcmVzc1NldHRpbmdzIHsKLSAgICBUdW5lckRlbXV4SXBBZGRyZXNzIHNyY0lwQWRkcmVzczsKLQotICAgIFR1bmVyRGVtdXhJcEFkZHJlc3MgZHN0SXBBZGRyZXNzOwotCi0gICAgY2hhciBzcmNQb3J0OwotCi0gICAgY2hhciBkc3RQb3J0OwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhQaWQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4UGlkLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMjM4YjYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhQaWQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRGVtdXggUElEIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIFR1bmVyRGVtdXhQaWQgewotICAgIGNoYXIgdFBpZDsKLQotICAgIGNoYXIgbW10cFBpZDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckR2clNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEdnJTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM0ZDc1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckR2clNldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIER2ciBTZXR0aW5ncyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRHZyU2V0dGluZ3MgewotICAgIGludCBzdGF0dXNNYXNrOwotCi0gICAgaW50IGxvd1RocmVzaG9sZDsKLQotICAgIGludCBoaWdoVGhyZXNob2xkOwotCi0gICAgaW50IGRhdGFGb3JtYXQ7Ci0KLSAgICBpbnQgcGFja2V0U2l6ZTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckFscENvbmZpZ3VyYXRpb24uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckFscENvbmZpZ3VyYXRpb24uYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5ZTNhZi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJBbHBDb25maWd1cmF0aW9uLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclNldHRpbmdzOwotCi0vKioKLSAqIEZpbHRlciBTZXR0aW5ncyBmb3IgYW4gQUxQIGZpbHRlci4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJBbHBDb25maWd1cmF0aW9uIHsKLSAgICBieXRlIHBhY2tldFR5cGU7Ci0KLSAgICBieXRlIGxlbmd0aFR5cGU7Ci0KLSAgICBUdW5lckZpbHRlclNldHRpbmdzIGZpbHRlclNldHRpbmdzOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyQXZTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyQXZTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmY4OGYwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckF2U2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRmlsdGVyIFNldHRpbmdzIGZvciBhIFZpZGVvIGFuZCBBdWRpby4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJBdlNldHRpbmdzIHsKLSAgICAvKioKLSAgICAgKiB0cnVlIGlmIHRoZSBmaWx0ZXIgb3V0cHV0IGdvZXMgdG8gZGVjb2RlciBkaXJlY3RseSBpbiBwYXNzIHRocm91Z2ggbW9kZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzUGFzc3Rocm91Z2g7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOGNmZDEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyQ29uZmlndXJhdGlvbi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJBbHBDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJJcENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlck1tdHBDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJUbHZDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJUc0NvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogRmlsdGVyIGNvbmZpZ3VyYXRpb24uCi0gKgotICoge0BoaWRlfQotICovCi11bmlvbiBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24gewotICAgIFR1bmVyRmlsdGVyVHNDb25maWd1cmF0aW9uIHRzOwotCi0gICAgVHVuZXJGaWx0ZXJNbXRwQ29uZmlndXJhdGlvbiBtbXRwOwotCi0gICAgVHVuZXJGaWx0ZXJJcENvbmZpZ3VyYXRpb24gaXA7Ci0KLSAgICBUdW5lckZpbHRlclRsdkNvbmZpZ3VyYXRpb24gdGx2OwotCi0gICAgVHVuZXJGaWx0ZXJBbHBDb25maWd1cmF0aW9uIGFscDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckRvd25sb2FkRXZlbnQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckRvd25sb2FkRXZlbnQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3MWRkMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJEb3dubG9hZEV2ZW50LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEZpbHRlciBFdmVudCBmb3IgRG93bmxvYWQgZGF0YS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJEb3dubG9hZEV2ZW50IHsKLSAgICBpbnQgaXRlbUlkOwotCi0gICAgLyoqCi0gICAgICogTVBVIHNlcXVlbmNlIG51bWJlciBvZiBmaWx0ZXJlZCBkYXRhIChvbmx5IGZvciBNTVRQKQotICAgICAqLwotICAgIGludCBtcHVTZXF1ZW5jZU51bWJlcjsKLQotICAgIGludCBpdGVtRnJhZ21lbnRJbmRleDsKLQotICAgIGludCBsYXN0SXRlbUZyYWdtZW50SW5kZXg7Ci0KLSAgICAvKioKLSAgICAgKiBEYXRhIHNpemUgaW4gYnl0ZXMgb2YgZmlsdGVyZWQgZGF0YQotICAgICAqLwotICAgIGNoYXIgZGF0YUxlbmd0aDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckRvd25sb2FkU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckRvd25sb2FkU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3YTVmZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJEb3dubG9hZFNldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEZpbHRlciBTZXR0aW5ncyBmb3IgZG93bmxvYWRpbmcuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyRG93bmxvYWRTZXR0aW5ncyB7Ci0gICAgaW50IGRvd25sb2FkSWQ7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJFdmVudC5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyRXZlbnQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwNTUxMC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJFdmVudC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJEb3dubG9hZEV2ZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJJcFBheWxvYWRFdmVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyTWVkaWFFdmVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyTW10cFJlY29yZEV2ZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJNb25pdG9yRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclBlc0V2ZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclRlbWlFdmVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyVHNSZWNvcmRFdmVudDsKLQotLyoqCi0gKiBGaWx0ZXIgZXZlbnRzLgotICoKLSAqIHtAaGlkZX0KLSAqLwotdW5pb24gVHVuZXJGaWx0ZXJFdmVudCB7Ci0gICAgVHVuZXJGaWx0ZXJNZWRpYUV2ZW50IG1lZGlhOwotCi0gICAgVHVuZXJGaWx0ZXJTZWN0aW9uRXZlbnQgc2VjdGlvbjsKLQotICAgIFR1bmVyRmlsdGVyUGVzRXZlbnQgcGVzOwotCi0gICAgVHVuZXJGaWx0ZXJUc1JlY29yZEV2ZW50IHRzUmVjb3JkOwotCi0gICAgVHVuZXJGaWx0ZXJNbXRwUmVjb3JkRXZlbnQgbW10cFJlY29yZDsKLQotICAgIFR1bmVyRmlsdGVyRG93bmxvYWRFdmVudCBkb3dubG9hZDsKLQotICAgIFR1bmVyRmlsdGVySXBQYXlsb2FkRXZlbnQgaXBQYXlsb2FkOwotCi0gICAgVHVuZXJGaWx0ZXJUZW1pRXZlbnQgdGVtaTsKLQotICAgIFR1bmVyRmlsdGVyTW9uaXRvckV2ZW50IG1vbml0b3I7Ci0KLSAgICBpbnQgc3RhcnRJZDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlcklwQ29uZmlndXJhdGlvbi5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVySXBDb25maWd1cmF0aW9uLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGQ4ODkuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVySXBDb25maWd1cmF0aW9uLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckRlbXV4SXBBZGRyZXNzU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclNldHRpbmdzOwotCi0vKioKLSAqIEZpbHRlciBTZXR0aW5ncyBmb3IgYSBpcCBmaWx0ZXIuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVySXBDb25maWd1cmF0aW9uIHsKLSAgICBUdW5lckRlbXV4SXBBZGRyZXNzU2V0dGluZ3MgaXBBZGRyOwotCi0gICAgVHVuZXJGaWx0ZXJTZXR0aW5ncyBmaWx0ZXJTZXR0aW5nczsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlcklwUGF5bG9hZEV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJJcFBheWxvYWRFdmVudC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWJkYTkzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlcklwUGF5bG9hZEV2ZW50LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEZpbHRlciBFdmVudCBmb3IgSVAgcGF5bG9hZCBkYXRhLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlcklwUGF5bG9hZEV2ZW50IHsKLSAgICAvKioKLSAgICAgKiBEYXRhIHNpemUgaW4gYnl0ZXMgb2YgaXAgZGF0YQotICAgICAqLwotICAgIGNoYXIgZGF0YUxlbmd0aDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlck1lZGlhRXZlbnQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlck1lZGlhRXZlbnQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkYmNlOS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJNZWRpYUV2ZW50LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uTmF0aXZlSGFuZGxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJBdWRpb0V4dHJhTWV0YURhdGE7Ci0KLS8qKgotICogRmlsdGVyIEV2ZW50IGZvciBBdWRpbyBvciBWaWRlbyBGaWx0ZXIuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyTWVkaWFFdmVudCB7Ci0gICAgY2hhciBzdHJlYW1JZDsKLQotICAgIC8qKgotICAgICAqIHRydWUgaWYgUFRTIGlzIHByZXNlbnQgaW4gUEVTIGhlYWRlci4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzUHRzUHJlc2VudDsKLQotICAgIC8qKgotICAgICAqIFByZXNlbnRhdGlvbiBUaW1lIFN0YW1wIGZvciBhdWRpbyBvciB2aWRlbyBmcmFtZS4gSXQgYmFzZWQgb24gOTBLSHogaGFzCi0gICAgICogdGhlIHNhbWUgZm9ybWF0IGFzIFBUUyAoUHJlc2VudGF0aW9uIFRpbWUgU3RhbXApLgotICAgICAqLwotICAgIGxvbmcgcHRzOwotCi0gICAgLyoqCi0gICAgICogRGF0YSBzaXplIGluIGJ5dGVzIG9mIGF1ZGlvIG9yIHZpZGVvIGZyYW1lCi0gICAgICovCi0gICAgaW50IGRhdGFMZW5ndGg7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIG9mZnNldCBpbiB0aGUgbWVtb3J5IGJsb2NrIHdoaWNoIGlzIHNoYXJlZCBhbW9uZyBtdWx0aXBsZQotICAgICAqICBNZWRpYUV2ZW50cy4KLSAgICAgKi8KLSAgICBpbnQgb2Zmc2V0OwotCi0gICAgLyoqCi0gICAgICogQSBoYW5kbGUgYXNzb2NpYXRlZCB0byB0aGUgbWVtb3J5IHdoZXJlIGF1ZGlvIG9yIHZpZGVvIGRhdGEgc3RheXMuCi0gICAgICovCi0gICAgTmF0aXZlSGFuZGxlIGF2TWVtb3J5OwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgYXZNZW1vcnkgaXMgaW4gc2VjdXJlIGFyZWEsIGFuZCBpc24ndCBtYXBwYWJsZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzU2VjdXJlTWVtb3J5OwotCi0gICAgLyoqCi0gICAgICogQW4gSWQgaXMgdXNlZCBieSBIQUwgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBBViBkYXRhLgotICAgICAqIEZvciBzZWN1cmUgYXVkaW8sIGl0J3MgdGhlIGF1ZGlvIGhhbmRsZSB1c2VkIGJ5IEF1ZGlvIFRyYWNrLgotICAgICAqLwotICAgIGxvbmcgYXZEYXRhSWQ7Ci0KLSAgICAvKioKLSAgICAgKiBNUFUgc2VxdWVuY2UgbnVtYmVyIG9mIGZpbHRlcmVkIGRhdGEgKG9ubHkgZm9yIE1NVFApCi0gICAgICovCi0gICAgaW50IG1wdVNlcXVlbmNlTnVtYmVyOwotCi0gICAgYm9vbGVhbiBpc1Blc1ByaXZhdGVEYXRhOwotCi0gICAgLyoqCi0gICAgICogSWYgVHVuZXJBdWRpb0V4dHJhTWV0YURhdGEgZmllbGQgaXMgdmFsaWQgb3Igbm90Ci0gICAgICovCi0gICAgYm9vbGVhbiBpc0F1ZGlvRXh0cmFNZXRhRGF0YTsKLQotICAgIC8qKgotICAgICAqIE9ubHkgdmFsaWQgd2hlbiBpc0F1ZGlvRXh0cmFNZXRhRGF0YSBpcyB0cnVlCi0gICAgICovCi0gICAgVHVuZXJBdWRpb0V4dHJhTWV0YURhdGEgYXVkaW87Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJNbXRwQ29uZmlndXJhdGlvbi5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW10cENvbmZpZ3VyYXRpb24uYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyY2E4ZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJNbXRwQ29uZmlndXJhdGlvbi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZXR0aW5nczsKLQotLyoqCi0gKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGFuIG1tdHAgZmlsdGVyLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlck1tdHBDb25maWd1cmF0aW9uIHsKLSAgICBjaGFyIG1tdHBQaWQ7Ci0KLSAgICBUdW5lckZpbHRlclNldHRpbmdzIGZpbHRlclNldHRpbmdzOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW10cFJlY29yZEV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJNbXRwUmVjb3JkRXZlbnQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4NzFjZi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJNbXRwUmVjb3JkRXZlbnQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRmlsdGVyIEV2ZW50IGZvciBhbiBNTVRQIFJlY29yZCBGaWx0ZXIuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyTW10cFJlY29yZEV2ZW50IHsKLSAgICBpbnQgc2NIZXZjSW5kZXhNYXNrOwotCi0gICAgLyoqCi0gICAgICogQnl0ZSBudW1iZXIgZnJvbSBiZWdpbm5pbmcgb2YgdGhlIGZpbHRlcidzIG91dHB1dAotICAgICAqLwotICAgIGxvbmcgYnl0ZU51bWJlcjsKLQotICAgIC8qKgotICAgICAqIElmIHRoZSBjdXJyZW50IGV2ZW50IGNvbnRhaW5zIGV4dGVuZGVkIGluZm9ybWF0aW9uIG9yIG5vdAotICAgICAqLwotICAgIGJvb2xlYW4gaXNFeHRlbmRlZDsKLQotICAgIC8qKgotICAgICAqIFRoZSBQcmVzZW50YXRpb24gVGltZSBTdGFtcChQVFMpIGZvciB0aGUgYXVkaW8gb3IgdmlkZW8gZnJhbWUuIEl0IGlzIGJhc2VkIG9uIDkwS0h6Ci0gICAgICogYW5kIGhhcyB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIFBUUyBpbiBJU08vSUVDIDEzODE4LTEuCi0gICAgICovCi0gICAgbG9uZyBwdHM7Ci0KLSAgICAvKioKLSAgICAgKiBNUFUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBmaWx0ZXJlZCBkYXRhLiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgTU1UUC4KLSAgICAgKi8KLSAgICBpbnQgbXB1U2VxdWVuY2VOdW1iZXI7Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1hY3JvYmxvY2sgaW4gdGhlIHNsaWNlIGRlZmluZWQgaW4gSVRVLVQgUmVjLiBILjI2NC4KLSAgICAgKi8KLSAgICBpbnQgZmlyc3RNYkluU2xpY2U7Ci0KLSAgICAvKioKLSAgICAgKiBUUyBpbmRleCBtYXNrLgotICAgICAqLwotICAgIGludCB0c0luZGV4TWFzazsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlck1vbml0b3JFdmVudC5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW9uaXRvckV2ZW50LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYWI1ZTYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW9uaXRvckV2ZW50LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEZpbHRlciBtb25pdG9yIGV2ZW50cy4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIFR1bmVyRmlsdGVyTW9uaXRvckV2ZW50IHsKLSAgICAvKioKLSAgICAgKiBOZXcgc2NyYW1ibGluZyBzdGF0dXMuCi0gICAgICovCi0gICAgaW50IHNjcmFtYmxpbmdTdGF0dXM7Ci0KLSAgICAvKioKLSAgICAgKiBOZXcgY2lkIGZvciB0aGUgSVAgZmlsdGVyLgotICAgICAqLwotICAgIGludCBjaWQ7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJQZXNEYXRhU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclBlc0RhdGFTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTJmMzE0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclBlc0RhdGFTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIFBlcyBEYXRhLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlclBlc0RhdGFTZXR0aW5ncyB7Ci0gICAgY2hhciBzdHJlYW1JZDsKLQotICAgIGJvb2xlYW4gaXNSYXc7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJQZXNFdmVudC5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUGVzRXZlbnQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxZWNjNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJQZXNFdmVudC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBGaWx0ZXIgRXZlbnQgZm9yIFBFUyBGaWx0ZXIuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyUGVzRXZlbnQgewotICAgIGNoYXIgc3RyZWFtSWQ7Ci0KLSAgICAvKioKLSAgICAgKiBEYXRhIHNpemUgaW4gYnl0ZXMgb2YgUEVTIGRhdGEKLSAgICAgKi8KLSAgICBjaGFyIGRhdGFMZW5ndGg7Ci0KLSAgICAvKioKLSAgICAgKiBNUFUgc2VxdWVuY2UgbnVtYmVyIG9mIGZpbHRlcmVkIGRhdGEKLSAgICAgKi8KLSAgICBpbnQgbXB1U2VxdWVuY2VOdW1iZXI7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJSZWNvcmRTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUmVjb3JkU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliZTYyNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJSZWNvcmRTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTY0luZGV4TWFzazsKLQotLyoqCi0gKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIHJlY29yZGluZy4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJSZWNvcmRTZXR0aW5ncyB7Ci0gICAgaW50IHRzSW5kZXhNYXNrOwotCi0gICAgaW50IHNjSW5kZXhUeXBlOwotCi0gICAgVHVuZXJGaWx0ZXJTY0luZGV4TWFzayBzY0luZGV4TWFzazsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNjSW5kZXhNYXNrLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTY0luZGV4TWFzay5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDM3ZmNlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNjSW5kZXhNYXNrLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEZpbHRlciBTQyBJbmRleCBNYXNrCi0gKgotICoge0BoaWRlfQotICovCi11bmlvbiBUdW5lckZpbHRlclNjSW5kZXhNYXNrIHsKLSAgICBpbnQgc2M7Ci0KLSAgICBpbnQgc2NIZXZjOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvbkJpdHMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25CaXRzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNGY4NDIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvbkJpdHMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogQml0cyBzZXR0aW5ncyBvZiBhIHNlY3Rpb24gRmlsdGVyLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlclNlY3Rpb25CaXRzIHsKLSAgICBieXRlW10gZmlsdGVyOwotCi0gICAgYnl0ZVtdIG1hc2s7Ci0KLSAgICBieXRlW10gbW9kZTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb24uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb24uYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhYWJlNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uQ29uZGl0aW9uLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclNlY3Rpb25CaXRzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZWN0aW9uVGFibGVJbmZvOwotCi0vKioKLSAqIFNlY3Rpb24gZmlsdGVyIGNvbmRpdGlvbiBzZXR0aW5ncy4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIFR1bmVyRmlsdGVyU2VjdGlvbkNvbmRpdGlvbiB7Ci0gICAgVHVuZXJGaWx0ZXJTZWN0aW9uQml0cyBzZWN0aW9uQml0czsKLQotICAgIFR1bmVyRmlsdGVyU2VjdGlvblRhYmxlSW5mbyB0YWJsZUluZm87Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uRXZlbnQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25FdmVudC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjIwOTI2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25FdmVudC5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBGaWx0ZXIgRXZlbnQgZm9yIFNlY3Rpb24gRmlsdGVyLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlclNlY3Rpb25FdmVudCB7Ci0gICAgLyoqCi0gICAgICogVGFibGUgSUQgb2YgZmlsdGVyZWQgZGF0YQotICAgICAqLwotICAgIGNoYXIgdGFibGVJZDsKLQotICAgIC8qKgotICAgICAqIFZlcnNpb24gbnVtYmVyIG9mIGZpbHRlcmVkIGRhdGEKLSAgICAgKi8KLSAgICBjaGFyIHZlcnNpb247Ci0KLSAgICAvKioKLSAgICAgKiBTZWN0aW9uIG51bWJlciBvZiBmaWx0ZXJlZCBkYXRhCi0gICAgICovCi0gICAgY2hhciBzZWN0aW9uTnVtOwotCi0gICAgLyoqCi0gICAgICogRGF0YSBzaXplIGluIGJ5dGVzIG9mIGZpbHRlcmVkIGRhdGEKLSAgICAgKi8KLSAgICBjaGFyIGRhdGFMZW5ndGg7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25TZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjEyOWI2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25TZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZWN0aW9uQ29uZGl0aW9uOwotCi0vKioKLSAqIEZpbHRlciBTZXR0aW5ncyBmb3IgYSBzZWN0aW9uIGZpbHRlci4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJTZWN0aW9uU2V0dGluZ3MgewotICAgIFR1bmVyRmlsdGVyU2VjdGlvbkNvbmRpdGlvbiBjb25kaXRpb247Ci0KLSAgICBib29sZWFuIGlzQ2hlY2tDcmM7Ci0KLSAgICBib29sZWFuIGlzUmVwZWF0OwotCi0gICAgYm9vbGVhbiBpc1JhdzsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25UYWJsZUluZm8uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25UYWJsZUluZm8uYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M3OGM5ZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uVGFibGVJbmZvLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIFRhYmxlIGluZm8gc2V0dGluZ3Mgb2YgYSBzZWN0aW9uIEZpbHRlci4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJTZWN0aW9uVGFibGVJbmZvIHsKLSAgICBjaGFyIHRhYmxlSWQ7Ci0KLSAgICBjaGFyIHZlcnNpb247Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI3ZWFhNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJBdlNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJEb3dubG9hZFNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJQZXNEYXRhU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclJlY29yZFNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZWN0aW9uU2V0dGluZ3M7Ci0KLS8qKgotICogRmlsdGVyIFNldHRpbmdzLgotICoKLSAqIHtAaGlkZX0KLSAqLwotdW5pb24gVHVuZXJGaWx0ZXJTZXR0aW5ncyB7Ci0gICAgYm9vbGVhbiBub3RoaW5nOwotCi0gICAgVHVuZXJGaWx0ZXJBdlNldHRpbmdzIGF2OwotCi0gICAgVHVuZXJGaWx0ZXJTZWN0aW9uU2V0dGluZ3Mgc2VjdGlvbjsKLQotICAgIFR1bmVyRmlsdGVyUGVzRGF0YVNldHRpbmdzIHBlc0RhdGE7Ci0KLSAgICBUdW5lckZpbHRlclJlY29yZFNldHRpbmdzIHJlY29yZDsKLQotICAgIFR1bmVyRmlsdGVyRG93bmxvYWRTZXR0aW5ncyBkb3dubG9hZDsKLQotICAgIGJvb2xlYW4gaXNQYXNzdGhyb3VnaDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNoYXJlZEhhbmRsZUluZm8uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNoYXJlZEhhbmRsZUluZm8uYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIyZGZjMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTaGFyZWRIYW5kbGVJbmZvLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uTmF0aXZlSGFuZGxlOwotCi0vKioKLSAqIEZpbHRlciBTaGFyZWQgSGFuZGxlIEluZm9ybWF0aW9uLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlclNoYXJlZEhhbmRsZUluZm8gewotICAgIE5hdGl2ZUhhbmRsZSBoYW5kbGU7Ci0gICAgbG9uZyBzaXplOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRlbWlFdmVudC5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVGVtaUV2ZW50LmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNGU5OTMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVGVtaUV2ZW50LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEZpbHRlciBFdmVudCBmb3IgVGltZWQgRXh0ZXJuYWwgTWVkaWEgSW5mb3JtYXRpb24gKFRFTUkpIGRhdGEuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyVGVtaUV2ZW50IHsKLSAgICAvKioKLSAgICAgKiBQcmVzZW50YXRpb24gVGltZSBTdGFtcCBmb3IgYXVkaW8gb3IgdmlkZW8gZnJhbWUuIEl0IGJhc2VkIG9uIDkwS0h6IGhhcwotICAgICAqIHRoZSBzYW1lIGZvcm1hdCBhcyBQVFMgKFByZXNlbnRhdGlvbiBUaW1lIFN0YW1wKSBpbiBJU08vSUVDIDEzODE4LTEuCi0gICAgICovCi0gICAgbG9uZyBwdHM7Ci0KLSAgICAvKioKLSAgICAgKiBURU1JIERlc2NyaXB0b3IgVGFnCi0gICAgICovCi0gICAgYnl0ZSBkZXNjclRhZzsKLQotICAgIC8qKgotICAgICAqIFRFTUkgRGVzY3JpcHRvcgotICAgICAqLwotICAgIGJ5dGVbXSBkZXNjckRhdGE7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJUbHZDb25maWd1cmF0aW9uLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJUbHZDb25maWd1cmF0aW9uLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMjM3YjQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVGx2Q29uZmlndXJhdGlvbi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZXR0aW5nczsKLQotLyoqCi0gKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGEgdGx2IGZpbHRlci4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGaWx0ZXJUbHZDb25maWd1cmF0aW9uIHsKLSAgICBieXRlIHBhY2tldFR5cGU7Ci0KLSAgICBib29sZWFuIGlzQ29tcHJlc3NlZElwUGFja2V0OwotCi0gICAgVHVuZXJGaWx0ZXJTZXR0aW5ncyBmaWx0ZXJTZXR0aW5nczsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRzQ29uZmlndXJhdGlvbi5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVHNDb25maWd1cmF0aW9uLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMzg2ZTYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVHNDb25maWd1cmF0aW9uLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclNldHRpbmdzOwotCi0vKioKLSAqIEZpbHRlciBTZXR0aW5ncyBmb3IgYSBUUyBmaWx0ZXIuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRmlsdGVyVHNDb25maWd1cmF0aW9uIHsKLSAgICBjaGFyIHRwaWQ7Ci0KLSAgICBUdW5lckZpbHRlclNldHRpbmdzIGZpbHRlclNldHRpbmdzOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVHNSZWNvcmRFdmVudC5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVHNSZWNvcmRFdmVudC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTJhNzQ5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRzUmVjb3JkRXZlbnQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2NJbmRleE1hc2s7Ci0KLS8qKgotICogRmlsdGVyIEV2ZW50IGZvciBUUyBSZWNvcmQgRmlsdGVyLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZpbHRlclRzUmVjb3JkRXZlbnQgewotICAgIGNoYXIgcGlkOwotCi0gICAgaW50IHRzSW5kZXhNYXNrOwotCi0gICAgLyoqCi0gICAgICogSW5kZXhlcyBvZiByZWNvcmQgb3V0cHV0Ci0gICAgICovCi0gICAgVHVuZXJGaWx0ZXJTY0luZGV4TWFzayBzY0luZGV4TWFzazsKLQotICAgIC8qKgotICAgICAqIEJ5dGUgbnVtYmVyIGZyb20gYmVnaW5uaW5nIG9mIHRoZSBmaWx0ZXIncyBvdXRwdXQKLSAgICAgKi8KLSAgICBsb25nIGJ5dGVOdW1iZXI7Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgY3VycmVudCBldmVudCBjb250YWlucyBleHRlbmRlZCBpbmZvcm1hdGlvbiBvciBub3QKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRXh0ZW5kZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgUHJlc2VudGF0aW9uIFRpbWUgU3RhbXAoUFRTKSBmb3IgdGhlIGF1ZGlvIG9yIHZpZGVvIGZyYW1lLiBJdCBpcyBiYXNlZCBvbiA5MEtIegotICAgICAqIGFuZCBoYXMgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBQVFMgaW4gSVNPL0lFQyAxMzgxOC0xLgotICAgICAqLwotICAgIGxvbmcgcHRzOwotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtYWNyb2Jsb2NrIGluIHRoZSBzbGljZSBkZWZpbmVkIGluIElUVS1UIFJlYy4gSC4yNjQuCi0gICAgICovCi0gICAgaW50IGZpcnN0TWJJblNsaWNlOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBbmFsb2dDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YmYwNGUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBbmFsb2dDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogQW5hbG9nIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRBbmFsb2dDYXBhYmlsaXRpZXMgewotCS8qKgotICAgICAqIFNpZ25hbCBUeXBlIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgdHlwZUNhcDsKLQotICAgIC8qKgotICAgICAqIFN0YW5kYXJkIEludGVyY2hhbmdlIEZvcm1hdCAoU0lGKSBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IHNpZlN0YW5kYXJkQ2FwOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBbmFsb2dTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBbmFsb2dTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGNkOGM5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQW5hbG9nU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogQW5hbG9nIEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZEFuYWxvZ1NldHRpbmdzIHsKLSAgICAvKioKLSAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6Ci0gICAgICovCi0gICAgaW50IGZyZXF1ZW5jeTsKLQotICAgIGludCBzaWduYWxUeXBlOwotCi0gICAgLyoqCi0gICAgICogU3RhbmRhcmQgSW50ZXJjaGFuZ2UgRm9ybWF0IChTSUYpIHNldHRpbmcKLSAgICAgKi8KLSAgICBpbnQgc2lmU3RhbmRhcmQ7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZHMgYWZ0ZXIgaXNFeHRlbmRlZCBhcmUgb25seSB2YWxpZCB3aGVuIGlzRXh0ZW5kZWQgaXMgdHJ1ZQotICAgICAqLwotICAgIGJvb2xlYW4gaXNFeHRlbmRlZDsKLQotICAgIGludCBhZnRGbGFnOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzliZTc3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogQVRTQzMgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZEF0c2MzQ2FwYWJpbGl0aWVzIHsKLSAgICAvKioKLSAgICAgKiBCYW5kd2lkdGggY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBiYW5kd2lkdGhDYXA7Ci0KLSAgICAvKioKLSAgICAgKiBNb2R1bGF0aW9uIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgbW9kdWxhdGlvbkNhcDsKLQotICAgIC8qKgotICAgICAqIFRpbWVJbnRlcmxlYXZlTW9kZSBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IHRpbWVJbnRlcmxlYXZlTW9kZUNhcDsKLQotICAgIC8qKgotICAgICAqIENvZGVSYXRlIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgY29kZVJhdGVDYXA7Ci0KLSAgICAvKioKLSAgICAgKiBGRUMgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBmZWNDYXA7Ci0KLSAgICAvKioKLSAgICAgKiBEZW1vZHVsYXRvciBPdXRwdXQgRm9ybWF0IGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgZGVtb2RPdXRwdXRGb3JtYXRDYXA7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjllMWY3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBBdHNjMyBGcm9udGVuZCBQaHlzaWNhbCBMYXllciBQaXBlIFNldHRpbmdzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3MgewotICAgIGludCBwbHBJZDsKLQotICAgIGludCBtb2R1bGF0aW9uOwotCi0gICAgaW50IGludGVybGVhdmVNb2RlOwotCi0gICAgaW50IGNvZGVSYXRlOwotCi0gICAgLyoqCi0gICAgICogRm9yd2FyZCBFcnJvciBDb3JyZWN0aW9uIFR5cGUuCi0gICAgICovCi0gICAgaW50IGZlYzsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjM1NldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZmI4YzcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjM1NldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kQXRzYzNQbHBTZXR0aW5nczsKLQotLyoqCi0gKiBBdHNjMyBGcm9udGVuZCBTZXR0aW5ncyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRBdHNjM1NldHRpbmdzIHsKLSAgICAvKioKLSAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6Ci0gICAgICovCi0gICAgaW50IGZyZXF1ZW5jeTsKLQotICAgIC8qKgotICAgICAqIEJhbmR3aWR0aCBvZiB0dW5pbmcgYmFuZC4KLSAgICAgKi8KLSAgICBpbnQgYmFuZHdpZHRoOwotCi0gICAgaW50IGRlbW9kT3V0cHV0Rm9ybWF0OwotCi0gICAgVHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3NbXSBwbHBTZXR0aW5nczsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzY0NhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNmMyZmMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEFUU0MgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZEF0c2NDYXBhYmlsaXRpZXMgewotICAgIC8qKgotICAgICAqIE1vZHVsYXRpb24gY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBtb2R1bGF0aW9uQ2FwOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzY1NldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2NTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2E4YzA3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzY1NldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIEF0c2MgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kQXRzY1NldHRpbmdzIHsKLSAgICAvKioKLSAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6Ci0gICAgICovCi0gICAgaW50IGZyZXF1ZW5jeTsKLQotICAgIGludCBtb2R1bGF0aW9uOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYWJsZUNhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYWJsZUNhcGFiaWxpdGllcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODgwYzYwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogQ2FibGUoRFZCQykgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZENhYmxlQ2FwYWJpbGl0aWVzIHsKLSAgICAvKioKLSAgICAgKiBNb2R1bGF0aW9uIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgbW9kdWxhdGlvbkNhcDsKLQotICAgIC8qKgotICAgICAqIENvZGUgUmF0ZSBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgbG9uZyBjb2RlUmF0ZUNhcDsgLy8gaW5uZXIgRkVDIHdpbGwgY29udmVyZ2UgdG8gY29kZVJhdGUKLQotICAgIC8qKgotICAgICAqIEFubmV4IGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgYW5uZXhDYXA7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZENhYmxlU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQ2FibGVTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWJjZjI5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQ2FibGVTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBDYWJsZSBGcm9udGVuZCBTZXR0aW5ncyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRDYWJsZVNldHRpbmdzIHsKLSAgICAvKioKLSAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6Ci0gICAgICovCi0gICAgaW50IGZyZXF1ZW5jeTsKLQotICAgIGludCBtb2R1bGF0aW9uOwotCi0gICAgLyoqCi0gICAgICogSW5uZXIgRm9yd2FyZCBFcnJvciBDb3JyZWN0aW9uIHR5cGUgYXMgc3BlY2lmaWVkIGluIEVUU0kgRU4gMzAwIDQ2OCBWMS4xNS4xCi0gICAgICogYW5kIEVUU0kgRU4gMzAyIDMwNy0yIFYxLjEuMS4KLSAgICAgKi8KLSAgICBsb25nIGlubmVyRmVjOwotCi0gICAgLyoqCi0gICAgICogU3ltYm9scyBwZXIgc2Vjb25kCi0gICAgICovCi0gICAgaW50IHN5bWJvbFJhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBPdXRlciBGb3J3YXJkIEVycm9yIENvcnJlY3Rpb24gKEZFQykgVHlwZS4KLSAgICAgKi8KLSAgICBpbnQgb3V0ZXJGZWM7Ci0KLSAgICBpbnQgYW5uZXg7Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjdHJhbCBJbnZlcnNpb24gVHlwZS4KLSAgICAgKi8KLSAgICBpbnQgc3BlY3RyYWxJbnZlcnNpb247Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZHMgYWZ0ZXIgaXNFeHRlbmRlZCBhcmUgb25seSB2YWxpZCB3aGVuIGlzRXh0ZW5kZWQgaXMgdHJ1ZQotICAgICAqLwotICAgIGJvb2xlYW4gaXNFeHRlbmRlZDsKLQotICAgIGludCBpbnRlcmxlYXZlTW9kZTsKLQotICAgIGludCBiYW5kd2lkdGg7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZENhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlmMzFmMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZENhcGFiaWxpdGllcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZEFuYWxvZ0NhcGFiaWxpdGllczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZEF0c2MzQ2FwYWJpbGl0aWVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZENhYmxlQ2FwYWJpbGl0aWVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZER2YnNDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kRHZidENhcGFiaWxpdGllczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRJc2Ric0NhcGFiaWxpdGllczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRJc2RiczNDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXM7Ci0KLS8qKgotICogRnJvbnRlbmQgQ2FwYWJpbGl0aWVzIGludGVyZmFjZS4KLSAqCi0gKiBVc2UgYSBncm91cCBvZiB2ZWN0b3JzIGFzIHRoZSB3b3JrYXJvdW5kIGZvciBVbmlvbiBzdHJ1Y3R1cmUgdGhhdCBpcyBub3QgZnVsbHkgc3VwcG9ydGVkCi0gKiBpbiBBSURMIGN1cnJlbnRseS4KLSAqCi0gKiBDbGllbnQgbWF5IHVzZSBGcm9udGVuZEluZm8udHlwZSBhcyB0aGUgZGlzY3JpbWluYXIgdG8gY2hlY2sgdGhlIGNvcnJlc3BvbmRpbmcgdmVjdG9yLiBJZgotICogdGhlIHZlY3RvciBpcyBub3QgbnVsbCwgaXQgY29udGFpbnMgdmFsaWQgdmFsdWUuCi0gKgotICoge0BoaWRlfQotICovCi11bmlvbiBUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzIHsKLSAgICAvKioKLSAgICAgKiBBbmFsb2cgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZEFuYWxvZ0NhcGFiaWxpdGllcyBhbmFsb2dDYXBzOwotCi0gICAgLyoqCi0gICAgICogQVRTQyBGcm9udGVuZCBDYXBhYmlsaXRpZXMKLSAgICAgKi8KLSAgICBUdW5lckZyb250ZW5kQXRzY0NhcGFiaWxpdGllcyBhdHNjQ2FwczsKLQotICAgIC8qKgotICAgICAqIEFUU0MzIEZyb250ZW5kIENhcGFiaWxpdGllcwotICAgICAqLwotICAgIFR1bmVyRnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllcyBhdHNjM0NhcHM7Ci0KLSAgICAvKioKLSAgICAgKiBDYWJsZSBGcm9udGVuZCBDYXBhYmlsaXRpZXMKLSAgICAgKi8KLSAgICBUdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXMgY2FibGVDYXBzOwotCi0gICAgLyoqCi0gICAgICogRFZCUyBGcm9udGVuZCBDYXBhYmlsaXRpZXMKLSAgICAgKi8KLSAgICBUdW5lckZyb250ZW5kRHZic0NhcGFiaWxpdGllcyBkdmJzQ2FwczsKLQotICAgIC8qKgotICAgICAqIERWQlQgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZER2YnRDYXBhYmlsaXRpZXMgZHZidENhcHM7Ci0KLSAgICAvKioKLSAgICAgKiBJU0RCLVMgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZElzZGJzQ2FwYWJpbGl0aWVzIGlzZGJzQ2FwczsKLQotICAgIC8qKgotICAgICAqIElTREItUzMgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllcyBpc2RiczNDYXBzOwotCi0gICAgLyoqCi0gICAgICogSVNEQi1UIEZyb250ZW5kIENhcGFiaWxpdGllcwotICAgICAqLwotICAgIFR1bmVyRnJvbnRlbmRJc2RidENhcGFiaWxpdGllcyBpc2RidENhcHM7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHRtYkNhcGFiaWxpdGllcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGU0OTMzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHRtYkNhcGFiaWxpdGllcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBEVE1CIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzIHsKLSAgICBpbnQgdHJhbnNtaXNzaW9uTW9kZUNhcDsKLQotICAgIGludCBiYW5kd2lkdGhDYXA7Ci0KLSAgICBpbnQgbW9kdWxhdGlvbkNhcDsKLQotICAgIGludCBjb2RlUmF0ZUNhcDsKLQotICAgIGludCBndWFyZEludGVydmFsQ2FwOwotCi0gICAgaW50IGludGVybGVhdmVNb2RlQ2FwOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdG1iU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHRtYlNldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZTdmZjkuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdG1iU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRFRNQiBGcm9udGVuZCBTZXR0aW5ncyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmREdG1iU2V0dGluZ3MgewotICAgIGludCBmcmVxdWVuY3k7Ci0KLSAgICBpbnQgdHJhbnNtaXNzaW9uTW9kZTsKLQotICAgIGludCBiYW5kd2lkdGg7Ci0KLSAgICBpbnQgbW9kdWxhdGlvbjsKLQotICAgIGludCBjb2RlUmF0ZTsKLQotICAgIGludCBndWFyZEludGVydmFsOwotCi0gICAgaW50IGludGVybGVhdmVNb2RlOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnNDYXBhYmlsaXRpZXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU0MzIyYy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnNDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRFZCUyBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHZic0NhcGFiaWxpdGllcyB7Ci0gICAgLyoqCi0gICAgICogTW9kdWxhdGlvbiBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IG1vZHVsYXRpb25DYXA7Ci0KLSAgICAvKioKLSAgICAgKiBDb2RlIFJhdGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGxvbmcgY29kZVJhdGVDYXA7ICAvLyBpbm5lciBGRUMgd2lsbCBjb252ZXJnZSB0byBjb2RlUmF0ZQotCi0gICAgLyoqCi0gICAgICogU3ViIHN0YW5kYXJkcyBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IHN0YW5kYXJkOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzQ29kZVJhdGUuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NvZGVSYXRlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YjdkZTMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzQ29kZVJhdGUuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRHZicyBGcm9udGVuZCBDb2RlUmF0ZSBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmREdmJzQ29kZVJhdGUgewotICAgIC8qKgotICAgICAqIElubmVyIEZvcndhcmQgRXJyb3IgQ29ycmVjdGlvbiB0eXBlIGFzIHNwZWNpZmllZCBpbiBFVFNJIEVOIDMwMCA0NjggVjEuMTUuMQotICAgICAqIGFuZCBFVFNJIEVOIDMwMiAzMDctMiBWMS4xLjEuCi0gICAgICovCi0gICAgbG9uZyBmZWM7Ci0KLSAgICBib29sZWFuIGlzTGluZWFyOwotCi0gICAgLyoqCi0gICAgICogdHJ1ZSBpZiBlbmFibGUgc2hvcnQgZnJhbWUKLSAgICAgKi8KLSAgICBib29sZWFuIGlzU2hvcnRGcmFtZXM7Ci0KLSAgICAvKioKLSAgICAgKiBiaXRzIG51bWJlciBpbiAxMDAwIHN5bWJvbC4gMCBpZiB1c2UgdGhlIGRlZmF1bHQuCi0gICAgICovCi0gICAgaW50IGJpdHNQZXIxMDAwU3ltYm9sOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic1NldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjM2U0YjkuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmREdmJzQ29kZVJhdGU7Ci0KLS8qKgotICogRHZicyBGcm9udGVuZCBTZXR0aW5ncyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmREdmJzU2V0dGluZ3MgewotICAgIC8qKgotICAgICAqIFNpZ25hbCBmcmVxdWVuY3kgaW4gSGVydHoKLSAgICAgKi8KLSAgICBpbnQgZnJlcXVlbmN5OwotCi0gICAgaW50IG1vZHVsYXRpb247Ci0KLSAgICBUdW5lckZyb250ZW5kRHZic0NvZGVSYXRlIGNvZGVSYXRlOwotCi0gICAgaW50IHN5bWJvbFJhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBSb2xsIG9mZiB0eXBlLgotICAgICAqLwotICAgIGludCByb2xsb2ZmOwotCi0gICAgLyoqCi0gICAgICogUGlsb3QgbW9kZS4KLSAgICAgKi8KLSAgICBpbnQgcGlsb3Q7Ci0KLSAgICBpbnQgaW5wdXRTdHJlYW1JZDsKLQotICAgIGludCBzdGFuZGFyZDsKLQotICAgIC8qKgotICAgICAqIFZjbSBtb2RlLgotICAgICAqLwotICAgIGludCB2Y207Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZHMgYWZ0ZXIgaXNFeHRlbmRlZCBhcmUgb25seSB2YWxpZCB3aGVuIGlzRXh0ZW5kZWQgaXMgdHJ1ZQotICAgICAqLwotICAgIGJvb2xlYW4gaXNFeHRlbmRlZDsKLQotICAgIGludCBzY2FuVHlwZTsKLQotICAgIGJvb2xlYW4gaXNEaXNlcWNSeE1lc3NhZ2U7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnRDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZidENhcGFiaWxpdGllcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2YxNmRkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZidENhcGFiaWxpdGllcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBEVkJUIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzIHsKLSAgICAvKioKLSAgICAgKiBUcmFuc21pc3Npb24gTW9kZSBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IHRyYW5zbWlzc2lvbk1vZGVDYXA7Ci0KLSAgICAvKioKLSAgICAgKiBCYW5kd2lkdGggY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBiYW5kd2lkdGhDYXA7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdGVsbGF0aW9uIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgY29uc3RlbGxhdGlvbkNhcDsKLQotICAgIC8qKgotICAgICAqIENvZGUgUmF0ZSBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IGNvZGVSYXRlQ2FwOwotCi0gICAgLyoqCi0gICAgICogSGllcmFyY2h5IFR5cGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBoaWVyYXJjaHlDYXA7Ci0KLSAgICAvKioKLSAgICAgKiBHdWFyZCBJbnRlcnZhbCBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IGd1YXJkSW50ZXJ2YWxDYXA7Ci0KLSAgICAvKioKLSAgICAgKiBUMiBTdXBwb3J0IGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBib29sZWFuIGlzVDJTdXBwb3J0ZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBNaXNvIFN1cHBvcnQgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGJvb2xlYW4gaXNNaXNvU3VwcG9ydGVkOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJ0U2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZidFNldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Yzk0MmEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJ0U2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogRHZidCBGcm9udGVuZCBTZXR0aW5ncyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmREdmJ0U2V0dGluZ3MgewotICAgIC8qKgotICAgICAqIFNpZ25hbCBmcmVxdWVuY3kgaW4gSGVydHoKLSAgICAgKi8KLSAgICBpbnQgZnJlcXVlbmN5OwotCi0gICAgaW50IHRyYW5zbWlzc2lvbk1vZGU7Ci0KLSAgICBpbnQgYmFuZHdpZHRoOwotCi0gICAgaW50IGNvbnN0ZWxsYXRpb247Ci0KLSAgICBpbnQgaGllcmFyY2h5OwotCi0gICAgLyoqCi0gICAgICogQ29kZSBSYXRlIGZvciBIaWdoIFByaW9yaXR5IGxldmVsCi0gICAgICovCi0gICAgaW50IGhwQ29kZVJhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBDb2RlIFJhdGUgZm9yIExvdyBQcmlvcml0eSBsZXZlbAotICAgICAqLwotICAgIGludCBscENvZGVSYXRlOwotCi0gICAgaW50IGd1YXJkSW50ZXJ2YWw7Ci0KLSAgICBib29sZWFuIGlzSGlnaFByaW9yaXR5OwotCi0gICAgaW50IHN0YW5kYXJkOwotCi0gICAgYm9vbGVhbiBpc01pc287Ci0KLSAgICAvKioKLSAgICAgKiBQaHlzaWNhbCBMYXllciBQaXBlIChQTFApIG1vZGUKLSAgICAgKi8KLSAgICBpbnQgcGxwTW9kZTsKLQotICAgIC8qKgotICAgICAqIFBoeXNpY2FsIExheWVyIFBpcGUgKFBMUCkgSWQKLSAgICAgKi8KLSAgICBpbnQgcGxwSWQ7Ci0KLSAgICAvKioKLSAgICAgKiBQaHlzaWNhbCBMYXllciBQaXBlIChQTFApIEdyb3VwIElkCi0gICAgICovCi0gICAgaW50IHBscEdyb3VwSWQ7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZHMgYWZ0ZXIgaXNFeHRlbmRlZCBhcmUgb25seSB2YWxpZCB3aGVuIGlzRXh0ZW5kZWQgaXMgdHJ1ZQotICAgICAqLwotICAgIGJvb2xlYW4gaXNFeHRlbmRlZDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSW5mby5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJbmZvLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiY2NkNTYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJbmZvLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzOwotCi0vKioKLSAqIEZyb250ZW5kSW5mbyBpbnRlcmZhY2UgdGhhdCBjYXJyaWVzIHR1bmVyIGZyb250ZW5kIGluZm9ybWF0aW9uLgotICoKLSAqIDxwPlRoaXMgaXMgdXNlZCB0byB1cGRhdGUgdGhlIFR1bmVyUmVzb3VyY2VNYW5hZ2VyIGFuZCBwYXNzIEZyb250ZW5kCi0gKiBpbmZvcm1hdGlvbiBmcm9tIEhBTCB0byB0aGUgY2xpZW50IHNpZGUuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRJbmZvIHsKLSAgICAvKioKLSAgICAgKiBGcm9udGVuZCBIYW5kbGUKLSAgICAgKi8KLSAgICBpbnQgaGFuZGxlOwotCi0gICAgLyoqCi0gICAgICogRnJvbnRlbmQgVHlwZQotICAgICAqLwotICAgIGludCB0eXBlOwotCi0gICAgLyoqCi0gICAgICogTWluaW11bSBGcmVxdWVuY3kgaW4gSGVydHoKLSAgICAgKi8KLSAgICBpbnQgbWluRnJlcXVlbmN5OwotCi0gICAgLyoqCi0gICAgICogTWF4aW11bSBGcmVxdWVuY3kgaW4gSGVydHoKLSAgICAgKi8KLSAgICBpbnQgbWF4RnJlcXVlbmN5OwotCi0gICAgLyoqCi0gICAgICogTWluaW11bSBzeW1ib2xzIHBlciBzZWNvbmQKLSAgICAgKi8KLSAgICBpbnQgbWluU3ltYm9sUmF0ZTsKLQotICAgIC8qKgotICAgICAqIE1heGltdW0gc3ltYm9scyBwZXIgc2Vjb25kCi0gICAgICovCi0gICAgaW50IG1heFN5bWJvbFJhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBSYW5nZSBpbiBIZXJ0egotICAgICAqLwotICAgIGludCBhY3F1aXJlUmFuZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBGcm9udGVuZHMgYXJlIGFzc2lnbmVkIHdpdGggdGhlIHNhbWUgZXhjbHVzaXZlR3JvdXBJZCBpZiB0aGV5IGNhbid0Ci0gICAgICogZnVuY3Rpb24gYXQgc2FtZSB0aW1lLiBGb3IgaW5zdGFuY2UsIHRoZXkgc2hhcmUgc2FtZSBoYXJkd2FyZSBtb2R1bGUuCi0gICAgICovCi0gICAgaW50IGV4Y2x1c2l2ZUdyb3VwSWQ7Ci0KLSAgICAvKioKLSAgICAgKiBBIGxpc3Qgb2Ygc3VwcG9ydGVkIHN0YXR1cyB0eXBlcyB3aGljaCBjbGllbnQgY2FuIGlucXVpcnkKLSAgICAgKi8KLSAgICBpbnRbXSBzdGF0dXNDYXBzOwotCi0gICAgLyoqCi0gICAgICogRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCi0gICAgICovCi0gICAgVHVuZXJGcm9udGVuZENhcGFiaWxpdGllcyBjYXBzOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RiczNDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZGQ2N2EuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RiczNDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogSVNEQi1TMyBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzIHsKLSAgICAvKioKLSAgICAgKiBNb2R1bGF0aW9uIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgbW9kdWxhdGlvbkNhcDsKLQotICAgIC8qKgotICAgICAqIENvZGUgUmF0ZSBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IGNvZGVSYXRlQ2FwOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RiczNTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RiczNTZXR0aW5ncy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTExZmQ1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnMzU2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogSXNkYnMzIEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZElzZGJzM1NldHRpbmdzIHsKLSAgICAvKioKLSAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6Ci0gICAgICovCi0gICAgaW50IGZyZXF1ZW5jeTsKLQotICAgIGNoYXIgc3RyZWFtSWQ7Ci0KLSAgICBpbnQgc3RyZWFtSWRUeXBlOwotCi0gICAgaW50IG1vZHVsYXRpb247Ci0KLSAgICBpbnQgY29kZVJhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBTeW1ib2xzIHBlciBzZWNvbmQKLSAgICAgKi8KLSAgICBpbnQgc3ltYm9sUmF0ZTsKLQotICAgIGludCByb2xsb2ZmOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2Ric0NhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2Ric0NhcGFiaWxpdGllcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWRmZGY3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogSVNEQi1TIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRJc2Ric0NhcGFiaWxpdGllcyB7Ci0gICAgLyoqCi0gICAgICogTW9kdWxhdGlvbiBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IG1vZHVsYXRpb25DYXA7Ci0KLSAgICAvKioKLSAgICAgKiBDb2RlIFJhdGUgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBjb2RlUmF0ZUNhcDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2Ric1NldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZjlmNGEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2Ric1NldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi0vKioKLSAqIElzZGJzIEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZElzZGJzU2V0dGluZ3MgewotICAgIC8qKgotICAgICAqIFNpZ25hbCBmcmVxdWVuY3kgaW4gSGVydHoKLSAgICAgKi8KLSAgICBpbnQgZnJlcXVlbmN5OwotCi0gICAgY2hhciBzdHJlYW1JZDsKLQotICAgIGludCBzdHJlYW1JZFR5cGU7Ci0KLSAgICBpbnQgbW9kdWxhdGlvbjsKLQotICAgIGludCBjb2RlUmF0ZTsKLQotICAgIC8qKgotICAgICAqIFN5bWJvbHMgcGVyIHNlY29uZAotICAgICAqLwotICAgIGludCBzeW1ib2xSYXRlOwotCi0gICAgaW50IHJvbGxvZmY7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJ0Q2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJ0Q2FwYWJpbGl0aWVzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5Mjk1ZDguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RidENhcGFiaWxpdGllcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBJU0RCLVQgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXBhcmNlbGFibGUgVHVuZXJGcm9udGVuZElzZGJ0Q2FwYWJpbGl0aWVzIHsKLSAgICAvKioKLSAgICAgKiBJU0RCLVQgTW9kZSBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IG1vZGVDYXA7Ci0KLSAgICAvKioKLSAgICAgKiBCYW5kd2lkdGggY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBiYW5kd2lkdGhDYXA7Ci0KLSAgICAvKioKLSAgICAgKiBNb2R1bGF0aW9uIGNhcGFiaWxpdHkKLSAgICAgKi8KLSAgICBpbnQgbW9kdWxhdGlvbkNhcDsKLQotICAgIC8qKgotICAgICAqIENvZGUgUmF0ZSBjYXBhYmlsaXR5Ci0gICAgICovCi0gICAgaW50IGNvZGVSYXRlQ2FwOwotCi0gICAgLyoqCi0gICAgICogR3VhcmQgSW50ZXJ2YWwgY2FwYWJpbGl0eQotICAgICAqLwotICAgIGludCBndWFyZEludGVydmFsQ2FwOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJ0U2V0dGluZ3MuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkxZjNhNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJ0U2V0dGluZ3MuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLS8qKgotICogSXNkYnQgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kSXNkYnRTZXR0aW5ncyB7Ci0gICAgLyoqCi0gICAgICogU2lnbmFsIGZyZXF1ZW5jeSBpbiBIZXJ0egotICAgICAqLwotICAgIGludCBmcmVxdWVuY3k7Ci0KLSAgICBpbnQgbW9kdWxhdGlvbjsKLQotICAgIGludCBiYW5kd2lkdGg7Ci0KLSAgICBpbnQgbW9kZTsKLQotICAgIGludCBjb2RlUmF0ZTsKLQotICAgIGludCBndWFyZEludGVydmFsOwotCi0gICAgaW50IHNlcnZpY2VBcmVhSWQ7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFNjYW5BdHNjM1BscEluZm8uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU2NhbkF0c2MzUGxwSW5mby5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjhmY2JiLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU2NhbkF0c2MzUGxwSW5mby5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBBdHNjMyBGcm9udGVuZCBQaHlzaWNhbCBMYXllciBQaXBlIEluZm8uCi0gKgotICoge0BoaWRlfQotICovCi1wYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvIHsKLSAgICBieXRlIHBscElkOwotCi0gICAgYm9vbGVhbiBsbHNGbGFnOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZS5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTIxY2ExLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvOwotCi0vKioKLSAqIFR1bmVyIEZyb250ZW5kIFNjYW4gTWVzc2FnZSBpbnRlcmZhY2UuCi0gKgotICoge0BoaWRlfQotICovCi11bmlvbiBUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2UgewotICAgIGJvb2xlYW4gaXNMb2NrZWQ7Ci0KLSAgICBib29sZWFuIGlzRW5kOwotCi0gICAgYnl0ZSBwcm9ncmVzc1BlcmNlbnQ7Ci0KLSAgICBpbnRbXSBmcmVxdWVuY2llczsKLQotICAgIGludFtdIHN5bWJvbFJhdGVzOwotCi0gICAgaW50IGhpZXJhcmNoeTsKLQotICAgIGludCBhbmFsb2dUeXBlOwotCi0gICAgYnl0ZVtdIHBscElkczsKLQotICAgIGJ5dGVbXSBncm91cElkczsKLQotICAgIGNoYXJbXSBpbnB1dFN0cmVhbUlkczsKLQotICAgIGludCBzdGQ7Ci0KLSAgICBUdW5lckZyb250ZW5kU2NhbkF0c2MzUGxwSW5mb1tdIGF0c2MzUGxwSW5mb3M7Ci0KLSAgICBpbnQgbW9kdWxhdGlvbjsKLQotICAgIGludCBhbm5leDsKLQotICAgIGJvb2xlYW4gaXNIaWdoUHJpb3JpdHk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFNldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTVmM2UuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTZXR0aW5ncy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M7Ci0KLS8qKgotICogRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kU2V0dGluZ3MgewotICAgIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzIHNldHRpbmdzOwotCi0gICAgYm9vbGVhbiBpc0V4dGVuZGVkOwotCi0gICAgaW50IGVuZEZyZXF1ZW5jeTsKLQotICAgIGludCBpbnZlcnNpb247Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFN0YXR1cy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTdGF0dXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzYzAxYi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFN0YXR1cy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRTdGF0dXNBdHNjM1BscEluZm87Ci0KLS8qKgotICogVHVuZXIgRnJvbnRlbmQgU3RhdHVzIGludGVyZmFjZS4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLXVuaW9uIFR1bmVyRnJvbnRlbmRTdGF0dXMgewotICAgIC8qKgotICAgICAqIExvY2sgc3RhdHVzIGZvciBEZW1vZCBpbiBUcnVlL0ZhbHNlLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNEZW1vZExvY2tlZDsKLQotICAgIC8qKgotICAgICAqIFNOUiB2YWx1ZSBtZWFzdXJlZCBieSAwLjAwMSBkQi4KLSAgICAgKi8KLSAgICBpbnQgc25yOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBlcnJvciBiaXRzIHBlciAxIGJpbGxpb24gYml0cy4KLSAgICAgKi8KLSAgICBpbnQgYmVyOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBlcnJvciBwYWNrYWdlcyBwZXIgMSBiaWxsaW9uIHBhY2thZ2VzLgotICAgICAqLwotICAgIGludCBwZXI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIGVycm9yIGJpdHMgcGVyIDEgYmlsbGlvbiBiaXRzIGJlZm9yZSBGRUMuCi0gICAgICovCi0gICAgaW50IHByZUJlcjsKLQotICAgIC8qKgotICAgICAqIFNpZ25hbCBRdWFsaXR5IGluIHBlcmNlbnQuCi0gICAgICovCi0gICAgaW50IHNpZ25hbFF1YWxpdHk7Ci0KLSAgICAvKioKLSAgICAgKiBTaWduYWwgU3RyZW5ndGggbWVhc3VyZWQgYnkgMC4wMDEgZEJtLgotICAgICAqLwotICAgIGludCBzaWduYWxTdHJlbmd0aDsKLQotICAgIC8qKgotICAgICAqIFN5bWJvbHMgcGVyIHNlY29uZAotICAgICAqLwotICAgIGludCBzeW1ib2xSYXRlOwotCi0gICAgbG9uZyBpbm5lckZlYzsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGZyb250ZW5kIHR5cGUgdG8gZGVjaWRlIHRoZSBoaWRsIHR5cGUgdmFsdWUKLSAgICAgKi8KLSAgICBpbnQgbW9kdWxhdGlvbjsKLQotICAgIGludCBpbnZlcnNpb247Ci0KLSAgICBpbnQgbG5iVm9sdGFnZTsKLQotICAgIGJ5dGUgcGxwSWQ7Ci0KLSAgICBib29sZWFuIGlzRVdCUzsKLQotICAgIC8qKgotICAgICAqIEFHQyB2YWx1ZSBpcyBub3JtYWxpemVkIGZyb20gMCB0byAyNTUuCi0gICAgICovCi0gICAgYnl0ZSBhZ2M7Ci0KLSAgICBib29sZWFuIGlzTG5hT247Ci0KLSAgICBib29sZWFuW10gaXNMYXllckVycm9yOwotCi0gICAgLyoqCi0gICAgICogTUVSIHZhbHVlIG1lYXN1cmVkIGJ5IDAuMDAxIGRCCi0gICAgICovCi0gICAgaW50IG1lcjsKLQotICAgIC8qKgotICAgICAqIEZyZXF1ZW5jeSBkaWZmZXJlbmNlIGluIEhlcnR6LgotICAgICAqLwotICAgIGludCBmcmVxT2Zmc2V0OwotCi0gICAgaW50IGhpZXJhcmNoeTsKLQotICAgIGJvb2xlYW4gaXNSZkxvY2tlZDsKLQotICAgIC8qKgotICAgICAqIEEgbGlzdCBvZiBQTFAgc3RhdHVzIGZvciB0dW5lZCBQTFBzIGZvciBBVFNDMyBmcm9udGVuZC4KLSAgICAgKi8KLSAgICBUdW5lckZyb250ZW5kU3RhdHVzQXRzYzNQbHBJbmZvW10gcGxwSW5mbzsKLQotICAgIC8vIDEuMSBFeHRlbnNpb24gU3RhcnRpbmcKLQotICAgIC8qKgotICAgICAqIEV4dGVuZGVkIG1vZHVsYXRpb24gc3RhdHVzLiBDaGVjayBmcm9udGVuZCB0eXBlIHRvIGRlY2lkZSB0aGUgaGlkbCB0eXBlIHZhbHVlLgotICAgICAqLwotICAgIGludFtdIG1vZHVsYXRpb25zOwotCi0gICAgLyoqCi0gICAgICogRXh0ZW5kZWQgYml0IGVycm9yIHJhdGlvIHN0YXR1cy4KLSAgICAgKi8KLSAgICBpbnRbXSBiZXJzOwotCi0gICAgLyoqCi0gICAgICogRXh0ZW5kZWQgY29kZSByYXRlIHN0YXR1cy4KLSAgICAgKi8KLSAgICBsb25nW10gY29kZVJhdGVzOwotCi0gICAgLyoqCi0gICAgICogRXh0ZW5kZWQgYmFuZHdpZHRoIHN0YXR1cy4gQ2hlY2sgZnJvbnRlbmQgdHlwZSB0byBkZWNpZGUgdGhlIGhpZGwgdHlwZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBpbnQgYmFuZHdpZHRoOwotCi0gICAgLyoqCi0gICAgICogRXh0ZW5kZWQgZ3VhcmQgaW50ZXJ2YWwgc3RhdHVzLiBDaGVjayBmcm9udGVuZCB0eXBlIHRvIGRlY2lkZSB0aGUgaGlkbCB0eXBlIHZhbHVlLgotICAgICAqLwotICAgIGludCBpbnRlcnZhbDsKLQotICAgIC8qKgotICAgICAqIEV4dGVuZGVkIHRyYW5zbWlzc2lvbiBtb2RlIHN0YXR1cy4gQ2hlY2sgZnJvbnRlbmQgdHlwZSB0byBkZWNpZGUgdGhlIGhpZGwgdHlwZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBpbnQgdHJhbnNtaXNzaW9uTW9kZTsKLQotICAgIC8qKgotICAgICAqIFVuY29ycmVjdGFibGUgRXJyb3IgQ291bnRzIG9mIHRoZSBmcm9udGVuZCdzIFBoeXNpY2FsIExheWVyIFBpcGUgKFBMUCkKLSAgICAgKiBzaW5jZSB0aGUgbGFzdCB0dW5lIG9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBpbnQgdWVjOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgRFZCLVQyIHN5c3RlbSBpZCBzdGF0dXMuCi0gICAgICovCi0gICAgY2hhciBzeXN0ZW1JZDsKLQotICAgIC8qKgotICAgICAqIEZyb250ZW5kIEludGVybGVhdmluZyBNb2Rlcy4gQ2hlY2sgZnJvbnRlbmQgdHlwZSB0byBkZWNpZGUgdGhlIGhpZGwgdHlwZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBpbnRbXSBpbnRlcmxlYXZpbmc7Ci0KLSAgICAvKioKLSAgICAgKiBTZWdtZW50cyBpbiBJU0RCLVQgU3BlY2lmaWNhdGlvbiBvZiBhbGwgdGhlIGNoYW5uZWxzLgotICAgICAqLwotICAgIGJ5dGVbXSBpc2RidFNlZ21lbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc3BvcnQgU3RyZWFtIERhdGEgUmF0ZSBpbiBCUFMgb2YgdGhlIGN1cnJlbnQgY2hhbm5lbC4KLSAgICAgKi8KLSAgICBpbnRbXSB0c0RhdGFSYXRlOwotCi0gICAgLyoqCi0gICAgICogUm9sbCBPZmYgVHlwZSBzdGF0dXMgb2YgdGhlIGZyb250ZW5kLiBDaGVjayBmcm9udGVuZCB0eXBlIHRvIGRlY2lkZSB0aGUgaGlkbCB0eXBlIHZhbHVlLgotICAgICAqLwotICAgIGludCByb2xsT2ZmOwotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGZyb250ZW5kIGN1cnJlbnRseSBzdXBwb3J0cyBNSVNPIG9yIG5vdC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzTWlzbzsKLQotICAgIC8qKgotICAgICAqIElmIHRoZSBmcm9udGVuZCBjb2RlIHJhdGUgaXMgbGluZWFyIG9yIG5vdC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzTGluZWFyOwotCi0gICAgLyoqCi0gICAgICogSWYgc2hvcnQgZnJhbWVzIGFyZSBlbmFibGVkIG9yIG5vdC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzU2hvcnRGcmFtZXM7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFN0YXR1c0F0c2MzUGxwSW5mby5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTdGF0dXNBdHNjM1BscEluZm8uYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExNmMzNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFN0YXR1c0F0c2MzUGxwSW5mby5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKLQotLyoqCi0gKiBBdHNjMyBGcm9udGVuZCBQaHlzaWNhbCBMYXllciBQaXBlIEluZm8gaW4gRnJvbnRlbmQgc3RhdHVzLgotICoKLSAqIHtAaGlkZX0KLSAqLwotcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kU3RhdHVzQXRzYzNQbHBJbmZvIHsKLSAgICAvKioKLSAgICAgKiBQTFAgSWQgdmFsdWUuCi0gICAgICovCi0gICAgYnl0ZSBwbHBJZDsKLQotICAgIC8qKgotICAgICAqIERlbW9kIExvY2svVW5sb2NrIHN0YXR1cyBvZiB0aGlzIHBhcnRpY3VsYXIgUExQLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNMb2NrZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBVbmNvcnJlY3RhYmxlIEVycm9yIENvdW50cyAoVUVDKSBvZiB0aGlzIHBhcnRpY3VsYXIgUExQIHNpbmNlIGxhc3QgdHVuZSBvcGVyYXRpb24uCi0gICAgICovCi0gICAgaW50IHVlYzsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kVW5pb25TZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNjJjMmEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kQW5hbG9nU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kQXRzY1NldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZEF0c2MzU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kQ2FibGVTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmREdG1iU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kRHZic1NldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZER2YnRTZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRJc2Ric1NldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZElzZGJzM1NldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZElzZGJ0U2V0dGluZ3M7Ci0KLS8qKgotICogRnJvbnRlbmQgU2V0dGluZ3MgVW5pb24gaW50ZXJmYWNlLgotICoKLSAqIHtAaGlkZX0KLSAqLwotdW5pb24gVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3MgewotICAgIFR1bmVyRnJvbnRlbmRBbmFsb2dTZXR0aW5ncyBhbmFsb2c7Ci0KLSAgICBUdW5lckZyb250ZW5kQXRzY1NldHRpbmdzIGF0c2M7Ci0KLSAgICBUdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncyBhdHNjMzsKLQotICAgIFR1bmVyRnJvbnRlbmRDYWJsZVNldHRpbmdzIGNhYmxlOwotCi0gICAgVHVuZXJGcm9udGVuZER2YnNTZXR0aW5ncyBkdmJzOwotCi0gICAgVHVuZXJGcm9udGVuZER2YnRTZXR0aW5ncyBkdmJ0OwotCi0gICAgVHVuZXJGcm9udGVuZElzZGJzU2V0dGluZ3MgaXNkYnM7Ci0KLSAgICBUdW5lckZyb250ZW5kSXNkYnMzU2V0dGluZ3MgaXNkYnMzOwotCi0gICAgVHVuZXJGcm9udGVuZElzZGJ0U2V0dGluZ3MgaXNkYnQ7Ci0KLSAgICBUdW5lckZyb250ZW5kRHRtYlNldHRpbmdzIGR0bWI7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbERlbXV4LmNwcCBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRGVtdXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTUxZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbERlbXV4LmNwcApAQCAtMCwwICsxLDI3OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVHVuZXJIaWRsRGVtdXgiCisKKyNpbmNsdWRlICJUdW5lckhpZGxEZW11eC5oIgorCisjaW5jbHVkZSAiVHVuZXJIaWRsRHZyLmgiCisjaW5jbHVkZSAiVHVuZXJIaWRsRmlsdGVyLmgiCisjaW5jbHVkZSAiVHVuZXJIaWRsVGltZUZpbHRlci5oIgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyU3ViVHlwZTsKKwordXNpbmcgSGlkbERlbXV4QWxwRmlsdGVyVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhBbHBGaWx0ZXJUeXBlOwordXNpbmcgSGlkbERlbXV4RmlsdGVyTWFpblR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyTWFpblR5cGU7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclR5cGU7Cit1c2luZyBIaWRsRGVtdXhJcEZpbHRlclR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4SXBGaWx0ZXJUeXBlOwordXNpbmcgSGlkbERlbXV4TW10cEZpbHRlclR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4TW10cEZpbHRlclR5cGU7Cit1c2luZyBIaWRsRGVtdXhUbHZGaWx0ZXJUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRsdkZpbHRlclR5cGU7Cit1c2luZyBIaWRsRGVtdXhUc0ZpbHRlclR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4VHNGaWx0ZXJUeXBlOwordXNpbmcgSGlkbER2clR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkR2clR5cGU7Cit1c2luZyBIaWRsUmVzdWx0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZXN1bHQ7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKworVHVuZXJIaWRsRGVtdXg6OlR1bmVySGlkbERlbXV4KHNwPElEZW11eD4gZGVtdXgsIGludCBpZCkgeworICAgIG1EZW11eCA9IGRlbXV4OworICAgIG1EZW11eElkID0gaWQ7Cit9CisKK1R1bmVySGlkbERlbXV4Ojp+VHVuZXJIaWRsRGVtdXgoKSB7CisgICAgbURlbXV4ID0gbnVsbHB0cjsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRGVtdXg6OnNldEZyb250ZW5kRGF0YVNvdXJjZSgKKyAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZD4mIGluX2Zyb250ZW5kKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KEhpZGxSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaW50IGZyb250ZW5kSWQ7CisgICAgaW5fZnJvbnRlbmQtPmdldEZyb250ZW5kSWQoJmZyb250ZW5kSWQpOworICAgIEhpZGxSZXN1bHQgcmVzID0gbURlbXV4LT5zZXRGcm9udGVuZERhdGFTb3VyY2UoZnJvbnRlbmRJZCk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlbXV4OjpzZXRGcm9udGVuZERhdGFTb3VyY2VCeUlkKGludCBmcm9udGVuZElkKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KEhpZGxSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRGVtdXgtPnNldEZyb250ZW5kRGF0YVNvdXJjZShmcm9udGVuZElkKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRGVtdXg6Om9wZW5GaWx0ZXIoY29uc3QgRGVtdXhGaWx0ZXJUeXBlJiBpbl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbl9idWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oSGlkbFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsRGVtdXhGaWx0ZXJNYWluVHlwZSBtYWluVHlwZSA9IHN0YXRpY19jYXN0PEhpZGxEZW11eEZpbHRlck1haW5UeXBlPihpbl90eXBlLm1haW5UeXBlKTsKKyAgICBIaWRsRGVtdXhGaWx0ZXJUeXBlIGZpbHRlclR5cGV7CisgICAgICAgICAgICAubWFpblR5cGUgPSBtYWluVHlwZSwKKyAgICB9OworCisgICAgc3dpdGNoIChtYWluVHlwZSkgeworICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyTWFpblR5cGU6OlRTOgorICAgICAgICBmaWx0ZXJUeXBlLnN1YlR5cGUudHNGaWx0ZXJUeXBlKHN0YXRpY19jYXN0PEhpZGxEZW11eFRzRmlsdGVyVHlwZT4oCisgICAgICAgICAgICAgICAgaW5fdHlwZS5zdWJUeXBlLmdldDxEZW11eEZpbHRlclN1YlR5cGU6OlRhZzo6dHNGaWx0ZXJUeXBlPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyTWFpblR5cGU6Ok1NVFA6CisgICAgICAgIGZpbHRlclR5cGUuc3ViVHlwZS5tbXRwRmlsdGVyVHlwZShzdGF0aWNfY2FzdDxIaWRsRGVtdXhNbXRwRmlsdGVyVHlwZT4oCisgICAgICAgICAgICAgICAgaW5fdHlwZS5zdWJUeXBlLmdldDxEZW11eEZpbHRlclN1YlR5cGU6OlRhZzo6bW10cEZpbHRlclR5cGU+KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJNYWluVHlwZTo6SVA6CisgICAgICAgIGZpbHRlclR5cGUuc3ViVHlwZS5pcEZpbHRlclR5cGUoc3RhdGljX2Nhc3Q8SGlkbERlbXV4SXBGaWx0ZXJUeXBlPigKKyAgICAgICAgICAgICAgICBpbl90eXBlLnN1YlR5cGUuZ2V0PERlbXV4RmlsdGVyU3ViVHlwZTo6VGFnOjppcEZpbHRlclR5cGU+KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJNYWluVHlwZTo6VExWOgorICAgICAgICBmaWx0ZXJUeXBlLnN1YlR5cGUudGx2RmlsdGVyVHlwZShzdGF0aWNfY2FzdDxIaWRsRGVtdXhUbHZGaWx0ZXJUeXBlPigKKyAgICAgICAgICAgICAgICBpbl90eXBlLnN1YlR5cGUuZ2V0PERlbXV4RmlsdGVyU3ViVHlwZTo6VGFnOjp0bHZGaWx0ZXJUeXBlPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyTWFpblR5cGU6OkFMUDoKKyAgICAgICAgZmlsdGVyVHlwZS5zdWJUeXBlLmFscEZpbHRlclR5cGUoc3RhdGljX2Nhc3Q8SGlkbERlbXV4QWxwRmlsdGVyVHlwZT4oCisgICAgICAgICAgICAgICAgaW5fdHlwZS5zdWJUeXBlLmdldDxEZW11eEZpbHRlclN1YlR5cGU6OlRhZzo6YWxwRmlsdGVyVHlwZT4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgSGlkbFJlc3VsdCBzdGF0dXM7CisgICAgc3A8SGlkbElGaWx0ZXI+IGZpbHRlclNwOworICAgIHNwPFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s+IGZpbHRlckNiID0gbmV3IFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2soaW5fY2IpOworICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUZpbHRlckNhbGxiYWNrPiBjYlNwID0gZmlsdGVyQ2I7CisgICAgbURlbXV4LT5vcGVuRmlsdGVyKGZpbHRlclR5cGUsIHN0YXRpY19jYXN0PHVpbnQzMl90Pihpbl9idWZmZXJTaXplKSwgY2JTcCwKKyAgICAgICAgICAgICAgICAgICAgICAgWyZdKEhpZGxSZXN1bHQgciwgY29uc3Qgc3A8SGlkbElGaWx0ZXI+JiBmaWx0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclNwID0gZmlsdGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcjsKKyAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKworICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckhpZGxGaWx0ZXI+KGZpbHRlclNwLCBmaWx0ZXJDYiwgaW5fdHlwZSk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEZW11eDo6b3BlblRpbWVGaWx0ZXIoc2hhcmVkX3B0cjxJVHVuZXJUaW1lRmlsdGVyPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihIaWRsUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzOworICAgIHNwPEhpZGxJVGltZUZpbHRlcj4gZmlsdGVyU3A7CisgICAgbURlbXV4LT5vcGVuVGltZUZpbHRlcihbJl0oSGlkbFJlc3VsdCByLCBjb25zdCBzcDxIaWRsSVRpbWVGaWx0ZXI+JiBmaWx0ZXIpIHsKKyAgICAgICAgZmlsdGVyU3AgPSBmaWx0ZXI7CisgICAgICAgIHN0YXR1cyA9IHI7CisgICAgfSk7CisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKworICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckhpZGxUaW1lRmlsdGVyPihmaWx0ZXJTcCk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEZW11eDo6Z2V0QXZTeW5jSHdJZChjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIHR1bmVyRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihIaWRsUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIHVpbnQzMl90IGF2U3luY0h3SWQ7CisgICAgSGlkbFJlc3VsdCByZXM7CisgICAgc3A8SGlkbElGaWx0ZXI+IGhhbEZpbHRlciA9IHN0YXRpY19jYXN0PFR1bmVySGlkbEZpbHRlcio+KHR1bmVyRmlsdGVyLmdldCgpKS0+Z2V0SGFsRmlsdGVyKCk7CisgICAgbURlbXV4LT5nZXRBdlN5bmNId0lkKGhhbEZpbHRlciwgWyZdKEhpZGxSZXN1bHQgciwgdWludDMyX3QgaWQpIHsKKyAgICAgICAgcmVzID0gcjsKKyAgICAgICAgYXZTeW5jSHdJZCA9IGlkOworICAgIH0pOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gKGludClhdlN5bmNId0lkOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRGVtdXg6OmdldEF2U3luY1RpbWUoaW50MzJfdCBhdlN5bmNId0lkLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KEhpZGxSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgdWludDY0X3QgdGltZTsKKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICBtRGVtdXgtPmdldEF2U3luY1RpbWUoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGF2U3luY0h3SWQpLCBbJl0oSGlkbFJlc3VsdCByLCB1aW50NjRfdCB0cykgeworICAgICAgICByZXMgPSByOworICAgICAgICB0aW1lID0gdHM7CisgICAgfSk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgICpfYWlkbF9yZXR1cm4gPSAoaW50NjRfdCl0aW1lOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRGVtdXg6Om9wZW5EdnIoRHZyVHlwZSBpbl9kdmJUeXBlLCBpbnQzMl90IGluX2J1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckR2ckNhbGxiYWNrPiYgaW5fY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckR2cj4qIF9haWRsX3JldHVybikgeworICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oSGlkbFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICBzcDxIaWRsSUR2ckNhbGxiYWNrPiBjYWxsYmFjayA9IG5ldyBUdW5lckhpZGxEdnI6OkR2ckNhbGxiYWNrKGluX2NiKTsKKyAgICBzcDxIaWRsSUR2cj4gaGlkbER2cjsKKyAgICBtRGVtdXgtPm9wZW5EdnIoc3RhdGljX2Nhc3Q8SGlkbER2clR5cGU+KGluX2R2YlR5cGUpLCBpbl9idWZmZXJTaXplLCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgWyZdKEhpZGxSZXN1bHQgciwgY29uc3Qgc3A8SGlkbElEdnI+JiBkdnIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxEdnIgPSBkdnI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSByOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckhpZGxEdnI+KGhpZGxEdnIsIGluX2R2YlR5cGUpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRGVtdXg6OmNvbm5lY3RDaUNhbShpbnQzMl90IGNpQ2FtSWQpIHsKKyAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KEhpZGxSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRGVtdXgtPmNvbm5lY3RDaUNhbShzdGF0aWNfY2FzdDx1aW50MzJfdD4oY2lDYW1JZCkpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEZW11eDo6ZGlzY29ubmVjdENpQ2FtKCkgeworICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oSGlkbFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EZW11eC0+ZGlzY29ubmVjdENpQ2FtKCk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlbXV4OjpjbG9zZSgpIHsKKyAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KEhpZGxSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRGVtdXgtPmNsb3NlKCk7CisgICAgbURlbXV4ID0gbnVsbHB0cjsKKworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRGVtdXguaCBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRGVtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTM1ZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEZW11eC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJISURMREVNVVhfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSSElETERFTVVYX0gKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyRGVtdXguaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JVHVuZXIuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkR2clR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SURlbXV4OwordXNpbmcgOjpzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyA6OnN0ZDo6dmVjdG9yOworCit1c2luZyBIaWRsSURlbXV4ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRGVtdXg7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKworY2xhc3MgVHVuZXJIaWRsRGVtdXggOiBwdWJsaWMgQm5UdW5lckRlbXV4IHsKK3B1YmxpYzoKKyAgICBUdW5lckhpZGxEZW11eChzcDxIaWRsSURlbXV4PiBkZW11eCwgaW50IGRlbXV4SWQpOworICAgIHZpcnR1YWwgflR1bmVySGlkbERlbXV4KCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRGcm9udGVuZERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kPiYgaW5fZnJvbnRlbmQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldEZyb250ZW5kRGF0YVNvdXJjZUJ5SWQoaW50IGZyb250ZW5kSWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5GaWx0ZXIoY29uc3QgRGVtdXhGaWx0ZXJUeXBlJiBpbl90eXBlLCBpbnQzMl90IGluX2J1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgaW5fY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlblRpbWVGaWx0ZXIoc2hhcmVkX3B0cjxJVHVuZXJUaW1lRmlsdGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRBdlN5bmNId0lkKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fdHVuZXJGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldEF2U3luY1RpbWUoaW50MzJfdCBpbl9hdlN5bmNId0lkLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5EdnIoRHZyVHlwZSBpbl9kdmJUeXBlLCBpbnQzMl90IGluX2J1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckR2ckNhbGxiYWNrPiYgaW5fY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckR2cj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY29ubmVjdENpQ2FtKGludDMyX3QgaW5fY2lDYW1JZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZGlzY29ubmVjdENpQ2FtKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKworICAgIGludCBnZXRJZCgpIHsgcmV0dXJuIG1EZW11eElkOyB9CisKK3ByaXZhdGU6CisgICAgc3A8SGlkbElEZW11eD4gbURlbXV4OworICAgIGludCBtRGVtdXhJZDsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfVFVORVJISURMREVNVVhfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEZXNjcmFtYmxlci5jcHAgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbERlc2NyYW1ibGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDhjZDljCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEZXNjcmFtYmxlci5jcHAKQEAgLTAsMCArMSwxNDkgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlR1bmVySGlkbERlc2NyYW1ibGVyIgorCisjaW5jbHVkZSAiVHVuZXJIaWRsRGVzY3JhbWJsZXIuaCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KKworI2luY2x1ZGUgIlR1bmVySGlkbERlbXV4LmgiCisjaW5jbHVkZSAiVHVuZXJIaWRsRmlsdGVyLmgiCisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6UmVzdWx0OworCit1c2luZyBIaWRsUmVzdWx0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZXN1bHQ7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKworVHVuZXJIaWRsRGVzY3JhbWJsZXI6OlR1bmVySGlkbERlc2NyYW1ibGVyKHNwPEhpZGxJRGVzY3JhbWJsZXI+IGRlc2NyYW1ibGVyKSB7CisgICAgbURlc2NyYW1ibGVyID0gZGVzY3JhbWJsZXI7Cit9CisKK1R1bmVySGlkbERlc2NyYW1ibGVyOjp+VHVuZXJIaWRsRGVzY3JhbWJsZXIoKSB7CisgICAgbURlc2NyYW1ibGVyID0gbnVsbHB0cjsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRGVzY3JhbWJsZXI6OnNldERlbXV4U291cmNlKAorICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckRlbXV4PiYgaW5fdHVuZXJEZW11eCkgeworICAgIGlmIChtRGVzY3JhbWJsZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlc2NyYW1ibGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRGVzY3JhbWJsZXItPnNldERlbXV4U291cmNlKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VHVuZXJIaWRsRGVtdXgqPihpbl90dW5lckRlbXV4LmdldCgpKS0+Z2V0SWQoKSk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlc2NyYW1ibGVyOjpzZXRLZXlUb2tlbihjb25zdCB2ZWN0b3I8dWludDhfdD4mIGluX2tleVRva2VuKSB7CisgICAgaWYgKG1EZXNjcmFtYmxlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVzY3JhbWJsZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EZXNjcmFtYmxlci0+c2V0S2V5VG9rZW4oaW5fa2V5VG9rZW4pOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEZXNjcmFtYmxlcjo6YWRkUGlkKAorICAgICAgICBjb25zdCBEZW11eFBpZCYgaW5fcGlkLCBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX29wdGlvbmFsU291cmNlRmlsdGVyKSB7CisgICAgaWYgKG1EZXNjcmFtYmxlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVzY3JhbWJsZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBzcDxIaWRsSUZpbHRlcj4gaGFsRmlsdGVyID0KKyAgICAgICAgICAgIChpbl9vcHRpb25hbFNvdXJjZUZpbHRlciA9PSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA/IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgOiBzdGF0aWNfY2FzdDxUdW5lckhpZGxGaWx0ZXIqPihpbl9vcHRpb25hbFNvdXJjZUZpbHRlci5nZXQoKSktPmdldEhhbEZpbHRlcigpOworICAgIEhpZGxSZXN1bHQgcmVzID0gbURlc2NyYW1ibGVyLT5hZGRQaWQoZ2V0SGlkbERlbXV4UGlkKGluX3BpZCksIGhhbEZpbHRlcik7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbERlc2NyYW1ibGVyOjpyZW1vdmVQaWQoCisgICAgICAgIGNvbnN0IERlbXV4UGlkJiBpbl9waWQsIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIHsKKyAgICBpZiAobURlc2NyYW1ibGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZXNjcmFtYmxlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIHNwPEhpZGxJRmlsdGVyPiBoYWxGaWx0ZXIgPQorICAgICAgICAgICAgKGluX29wdGlvbmFsU291cmNlRmlsdGVyID09IG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgID8gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICA6IHN0YXRpY19jYXN0PFR1bmVySGlkbEZpbHRlcio+KGluX29wdGlvbmFsU291cmNlRmlsdGVyLmdldCgpKS0+Z2V0SGFsRmlsdGVyKCk7CisgICAgSGlkbFJlc3VsdCByZXMgPSBtRGVzY3JhbWJsZXItPnJlbW92ZVBpZChnZXRIaWRsRGVtdXhQaWQoaW5fcGlkKSwgaGFsRmlsdGVyKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRGVzY3JhbWJsZXI6OmNsb3NlKCkgeworICAgIGlmIChtRGVzY3JhbWJsZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlc2NyYW1ibGVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbURlc2NyYW1ibGVyLT5jbG9zZSgpOworICAgIG1EZXNjcmFtYmxlciA9IG51bGxwdHI7CisKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworSGlkbERlbXV4UGlkIFR1bmVySGlkbERlc2NyYW1ibGVyOjpnZXRIaWRsRGVtdXhQaWQoY29uc3QgRGVtdXhQaWQmIHBpZCkgeworICAgIEhpZGxEZW11eFBpZCBoaWRsUGlkOworICAgIHN3aXRjaCAocGlkLmdldFRhZygpKSB7CisgICAgY2FzZSBEZW11eFBpZDo6dFBpZDogeworICAgICAgICBoaWRsUGlkLnRQaWQoKHVpbnQxNl90KXBpZC5nZXQ8RGVtdXhQaWQ6OlRhZzo6dFBpZD4oKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4UGlkOjptbXRwUGlkOiB7CisgICAgICAgIGhpZGxQaWQubW10cFBpZCgodWludDE2X3QpcGlkLmdldDxEZW11eFBpZDo6VGFnOjptbXRwUGlkPigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gaGlkbFBpZDsKK30KKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbERlc2NyYW1ibGVyLmggYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbERlc2NyYW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5NDk2OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRGVzY3JhbWJsZXIuaApAQCAtMCwwICsxLDY2IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSSElETERFU0NSQU1CTEVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExERVNDUkFNQkxFUl9ICisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSURlc2NyYW1ibGVyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lUdW5lci5oPgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4UGlkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKK3VzaW5nIEhpZGxEZW11eFBpZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhQaWQ7Cit1c2luZyBIaWRsSURlc2NyYW1ibGVyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRGVzY3JhbWJsZXI7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKworY2xhc3MgVHVuZXJIaWRsRGVzY3JhbWJsZXIgOiBwdWJsaWMgQm5UdW5lckRlc2NyYW1ibGVyIHsKK3B1YmxpYzoKKyAgICBUdW5lckhpZGxEZXNjcmFtYmxlcihzcDxIaWRsSURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcik7CisgICAgdmlydHVhbCB+VHVuZXJIaWRsRGVzY3JhbWJsZXIoKTsKKworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldERlbXV4U291cmNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJEZW11eD4mIGluX3R1bmVyRGVtdXgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldEtleVRva2VuKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbl9rZXlUb2tlbikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgYWRkUGlkKAorICAgICAgICAgICAgY29uc3QgRGVtdXhQaWQmIGluX3BpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9vcHRpb25hbFNvdXJjZUZpbHRlcikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgcmVtb3ZlUGlkKAorICAgICAgICAgICAgY29uc3QgRGVtdXhQaWQmIGluX3BpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9vcHRpb25hbFNvdXJjZUZpbHRlcikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBIaWRsRGVtdXhQaWQgZ2V0SGlkbERlbXV4UGlkKGNvbnN0IERlbXV4UGlkJiBwaWQpOworCisgICAgc3A8SGlkbElEZXNjcmFtYmxlcj4gbURlc2NyYW1ibGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkhJRExERVNDUkFNQkxFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbER2ci5jcHAgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbER2ci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2MTlkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRHZyLmNwcApAQCAtMCwwICsxLDI1NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVHVuZXJIaWRsRHZyIgorCisjaW5jbHVkZSAiVHVuZXJIaWRsRHZyLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGF0YUZvcm1hdC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9QbGF5YmFja1N0YXR1cy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZWNvcmRTdGF0dXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVzdWx0Lmg+CisjaW5jbHVkZSA8Zm1xL0NvbnZlcnRNUURlc2NyaXB0b3JzLmg+CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGF0YUZvcm1hdDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6UGxheWJhY2tTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlY29yZFN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6UmVzdWx0OwordXNpbmcgOjphbmRyb2lkOjp1bnNhZmVIaWRsVG9BaWRsTVFEZXNjcmlwdG9yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKKwordXNpbmcgSGlkbERhdGFGb3JtYXQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRhdGFGb3JtYXQ7Cit1c2luZyBIaWRsUmVzdWx0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpSZXN1bHQ7Cit1c2luZyBNUURlc2MgPSBNUURlc2NyaXB0b3JTeW5jPHVpbnQ4X3Q+OworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK1R1bmVySGlkbER2cjo6VHVuZXJIaWRsRHZyKHNwPEhpZGxJRHZyPiBkdnIsIER2clR5cGUgdHlwZSkgeworICAgIG1EdnIgPSBkdnI7CisgICAgbVR5cGUgPSB0eXBlOworfQorCitUdW5lckhpZGxEdnI6On5UdW5lckhpZGxEdnIoKSB7CisgICAgbUR2ciA9IG51bGxwdHI7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbER2cjo6Z2V0UXVldWVEZXNjKEFpZGxNUURlc2MqIF9haWRsX3JldHVybikgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBNUURlc2MgZHZyTVFEZXNjOworICAgIEhpZGxSZXN1bHQgcmVzOworICAgIG1EdnItPmdldFF1ZXVlRGVzYyhbJl0oSGlkbFJlc3VsdCByLCBjb25zdCBNUURlc2MmIGRlc2MpIHsKKyAgICAgICAgZHZyTVFEZXNjID0gZGVzYzsKKyAgICAgICAgcmVzID0gcjsKKyAgICB9KTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgQWlkbE1RRGVzYyBhaWRsTVFEZXNjOworICAgIHVuc2FmZUhpZGxUb0FpZGxNUURlc2NyaXB0b3I8dWludDhfdCwgaW50OF90LCBTeW5jaHJvbml6ZWRSZWFkV3JpdGU+KGR2ck1RRGVzYywgJmFpZGxNUURlc2MpOworICAgICpfYWlkbF9yZXR1cm4gPSBtb3ZlKGFpZGxNUURlc2MpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRHZyOjpjb25maWd1cmUoY29uc3QgRHZyU2V0dGluZ3MmIGluX3NldHRpbmdzKSB7CisgICAgaWYgKG1EdnIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUR2ciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbUR2ci0+Y29uZmlndXJlKGdldEhpZGxEdnJTZXR0aW5ncyhpbl9zZXR0aW5ncykpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEdnI6OmF0dGFjaEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX2ZpbHRlcikgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAoaW5fZmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CisgICAgfQorCisgICAgc3A8SGlkbElGaWx0ZXI+IGhpZGxGaWx0ZXIgPSBzdGF0aWNfY2FzdDxUdW5lckhpZGxGaWx0ZXIqPihpbl9maWx0ZXIuZ2V0KCkpLT5nZXRIYWxGaWx0ZXIoKTsKKyAgICBpZiAoaGlkbEZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbUR2ci0+YXR0YWNoRmlsdGVyKGhpZGxGaWx0ZXIpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEdnI6OmRldGFjaEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGluX2ZpbHRlcikgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAoaW5fZmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CisgICAgfQorCisgICAgc3A8SGlkbElGaWx0ZXI+IGhhbEZpbHRlciA9IChzdGF0aWNfY2FzdDxUdW5lckhpZGxGaWx0ZXIqPihpbl9maWx0ZXIuZ2V0KCkpKS0+Z2V0SGFsRmlsdGVyKCk7CisgICAgaWYgKGhhbEZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbUR2ci0+ZGV0YWNoRmlsdGVyKGhhbEZpbHRlcik7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbER2cjo6c3RhcnQoKSB7CisgICAgaWYgKG1EdnIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUR2ciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbUR2ci0+c3RhcnQoKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRHZyOjpzdG9wKCkgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EdnItPnN0b3AoKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRHZyOjpmbHVzaCgpIHsKKyAgICBpZiAobUR2ciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRHZyLT5mbHVzaCgpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxEdnI6OmNsb3NlKCkgeworICAgIGlmIChtRHZyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1EdnItPmNsb3NlKCk7CisgICAgbUR2ciA9IG51bGxwdHI7CisKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworSGlkbER2clNldHRpbmdzIFR1bmVySGlkbER2cjo6Z2V0SGlkbER2clNldHRpbmdzKGNvbnN0IER2clNldHRpbmdzJiBzZXR0aW5ncykgeworICAgIEhpZGxEdnJTZXR0aW5ncyBzOworICAgIHN3aXRjaCAobVR5cGUpIHsKKyAgICBjYXNlIER2clR5cGU6OlBMQVlCQUNLOiB7CisgICAgICAgIHMucGxheWJhY2soeworICAgICAgICAgICAgICAgIC5zdGF0dXNNYXNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNldHRpbmdzLmdldDxEdnJTZXR0aW5nczo6cGxheWJhY2s+KCkuc3RhdHVzTWFzayksCisgICAgICAgICAgICAgICAgLmxvd1RocmVzaG9sZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0dGluZ3MuZ2V0PER2clNldHRpbmdzOjpwbGF5YmFjaz4oKS5sb3dUaHJlc2hvbGQpLAorICAgICAgICAgICAgICAgIC5oaWdoVGhyZXNob2xkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXR0aW5ncy5nZXQ8RHZyU2V0dGluZ3M6OnBsYXliYWNrPigpLmhpZ2hUaHJlc2hvbGQpLAorICAgICAgICAgICAgICAgIC5kYXRhRm9ybWF0ID0gc3RhdGljX2Nhc3Q8SGlkbERhdGFGb3JtYXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0PER2clNldHRpbmdzOjpwbGF5YmFjaz4oKS5kYXRhRm9ybWF0KSwKKyAgICAgICAgICAgICAgICAucGFja2V0U2l6ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5nZXQ8RHZyU2V0dGluZ3M6OnBsYXliYWNrPigpLnBhY2tldFNpemUpLAorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorICAgIGNhc2UgRHZyVHlwZTo6UkVDT1JEOiB7CisgICAgICAgIHMucmVjb3JkKHsKKyAgICAgICAgICAgICAgICAuc3RhdHVzTWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNldHRpbmdzLmdldDxEdnJTZXR0aW5nczo6cmVjb3JkPigpLnN0YXR1c01hc2spLAorICAgICAgICAgICAgICAgIC5sb3dUaHJlc2hvbGQgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNldHRpbmdzLmdldDxEdnJTZXR0aW5nczo6cmVjb3JkPigpLmxvd1RocmVzaG9sZCksCisgICAgICAgICAgICAgICAgLmhpZ2hUaHJlc2hvbGQgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNldHRpbmdzLmdldDxEdnJTZXR0aW5nczo6cmVjb3JkPigpLmhpZ2hUaHJlc2hvbGQpLAorICAgICAgICAgICAgICAgIC5kYXRhRm9ybWF0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhpZGxEYXRhRm9ybWF0PihzZXR0aW5ncy5nZXQ8RHZyU2V0dGluZ3M6OnJlY29yZD4oKS5kYXRhRm9ybWF0KSwKKyAgICAgICAgICAgICAgICAucGFja2V0U2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNldHRpbmdzLmdldDxEdnJTZXR0aW5nczo6cmVjb3JkPigpLnBhY2tldFNpemUpLAorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworLy8vLy8vLy8vLy8vLy8vIElEdnJDYWxsYmFjayAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUmV0dXJuPHZvaWQ+IFR1bmVySGlkbER2cjo6RHZyQ2FsbGJhY2s6Om9uUmVjb3JkU3RhdHVzKGNvbnN0IEhpZGxSZWNvcmRTdGF0dXMgc3RhdHVzKSB7CisgICAgaWYgKG1UdW5lckR2ckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVR1bmVyRHZyQ2FsbGJhY2stPm9uUmVjb3JkU3RhdHVzKHN0YXRpY19jYXN0PFJlY29yZFN0YXR1cz4oc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBUdW5lckhpZGxEdnI6OkR2ckNhbGxiYWNrOjpvblBsYXliYWNrU3RhdHVzKGNvbnN0IEhpZGxQbGF5YmFja1N0YXR1cyBzdGF0dXMpIHsKKyAgICBpZiAobVR1bmVyRHZyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJEdnJDYWxsYmFjay0+b25QbGF5YmFja1N0YXR1cyhzdGF0aWNfY2FzdDxQbGF5YmFja1N0YXR1cz4oc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxEdnIuaCBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRHZyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4MGZmNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRHZyLmgKQEAgLTAsMCArMSw5MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExEVlJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSSElETERWUl9ICisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRHZyU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRHZyVHlwZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyRHZyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckR2ckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSUR2ci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lEdnJDYWxsYmFjay5oPgorCisjaW5jbHVkZSAiVHVuZXJIaWRsRmlsdGVyLmgiCisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpNUURlc2NyaXB0b3I7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6U3luY2hyb25pemVkUmVhZFdyaXRlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEdnJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RHZyVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjpzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyA6OnN0ZDo6dmVjdG9yOworCit1c2luZyBIaWRsRHZyU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkR2clNldHRpbmdzOwordXNpbmcgSGlkbElEdnIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklEdnI7Cit1c2luZyBIaWRsSUR2ckNhbGxiYWNrID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRHZyQ2FsbGJhY2s7Cit1c2luZyBIaWRsUGxheWJhY2tTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlBsYXliYWNrU3RhdHVzOwordXNpbmcgSGlkbFJlY29yZFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVjb3JkU3RhdHVzOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK3VzaW5nIEFpZGxNUURlc2MgPSBNUURlc2NyaXB0b3I8aW50OF90LCBTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OworCitjbGFzcyBUdW5lckhpZGxEdnIgOiBwdWJsaWMgQm5UdW5lckR2ciB7CitwdWJsaWM6CisgICAgVHVuZXJIaWRsRHZyKHNwPEhpZGxJRHZyPiBkdnIsIER2clR5cGUgdHlwZSk7CisgICAgflR1bmVySGlkbER2cigpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0UXVldWVEZXNjKEFpZGxNUURlc2MqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY29uZmlndXJlKGNvbnN0IER2clNldHRpbmdzJiBpbl9zZXR0aW5ncykgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgYXR0YWNoRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgaW5fZmlsdGVyKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBkZXRhY2hGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9maWx0ZXIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RvcCgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGZsdXNoKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKworICAgIHN0cnVjdCBEdnJDYWxsYmFjayA6IHB1YmxpYyBIaWRsSUR2ckNhbGxiYWNrIHsKKyAgICAgICAgRHZyQ2FsbGJhY2soY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJEdnJDYWxsYmFjaz4gdHVuZXJEdnJDYWxsYmFjaykKKyAgICAgICAgICAgICAgOiBtVHVuZXJEdnJDYWxsYmFjayh0dW5lckR2ckNhbGxiYWNrKXt9OworCisgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uUmVjb3JkU3RhdHVzKGNvbnN0IEhpZGxSZWNvcmRTdGF0dXMgc3RhdHVzKTsKKyAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25QbGF5YmFja1N0YXR1cyhjb25zdCBIaWRsUGxheWJhY2tTdGF0dXMgc3RhdHVzKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+IG1UdW5lckR2ckNhbGxiYWNrOworICAgIH07CisKK3ByaXZhdGU6CisgICAgSGlkbER2clNldHRpbmdzIGdldEhpZGxEdnJTZXR0aW5ncyhjb25zdCBEdnJTZXR0aW5ncyYgc2V0dGluZ3MpOworCisgICAgc3A8SGlkbElEdnI+IG1EdnI7CisgICAgRHZyVHlwZSBtVHlwZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfVFVORVJISURMRFZSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRmlsdGVyLmNwcCBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTc0YTVjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxGaWx0ZXIuY3BwCkBAIC0wLDAgKzEsMTI4NiBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVHVuZXJIaWRsRmlsdGVyIgorCisjaW5jbHVkZSAiVHVuZXJIaWRsRmlsdGVyLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvQ29uc3RhbnQuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhTY0luZGV4Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgorI2luY2x1ZGUgPGFpZGxjb21tb25zdXBwb3J0L05hdGl2ZUhhbmRsZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGZtcS9Db252ZXJ0TVFEZXNjcmlwdG9ycy5oPgorCisjaW5jbHVkZSAiVHVuZXJIZWxwZXIuaCIKKyNpbmNsdWRlICJUdW5lckhpZGxTZXJ2aWNlLmgiCisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6QXVkaW9FeHRyYU1ldGFEYXRhOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpBdWRpb1N0cmVhbVR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkNvbnN0YW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEFscEZpbHRlclNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEFscEZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyRG93bmxvYWRFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJJcFBheWxvYWRFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJNYWluVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJNZWRpYUV2ZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlck1lZGlhRXZlbnRFeHRyYU1ldGFEYXRhOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlck1tdHBSZWNvcmRFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyUGVzRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyU2NJbmRleE1hc2s7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyU2VjdGlvbkJpdHM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyU2VjdGlvbkV2ZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5nc0NvbmRpdGlvbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3NDb25kaXRpb25UYWJsZUluZm87Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyU3ViVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJUZW1pRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyVHNSZWNvcmRFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhJcEFkZHJlc3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4SXBBZGRyZXNzSXBBZGRyZXNzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eElwRmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4SXBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eE1tdHBGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhNbXRwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhNbXRwRmlsdGVyVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhQaWQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4U2NJbmRleDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhUbHZGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhUbHZGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eFRzRmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4VHNGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eFRzRmlsdGVyVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6UmVzdWx0OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpTY3JhbWJsaW5nU3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpkdXBUb0FpZGw7Cit1c2luZyA6OmFuZHJvaWQ6OklQQ1RocmVhZFN0YXRlOwordXNpbmcgOjphbmRyb2lkOjptYWtlRnJvbUFpZGw7Cit1c2luZyA6OmFuZHJvaWQ6OnVuc2FmZUhpZGxUb0FpZGxNUURlc2NyaXB0b3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKKwordXNpbmcgSGlkbERlbXV4QWxwTGVuZ3RoVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhBbHBMZW5ndGhUeXBlOwordXNpbmcgSGlkbERlbXV4RmlsdGVyTWFpblR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyTWFpblR5cGU7Cit1c2luZyBIaWRsRGVtdXhJcEFkZHJlc3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4SXBBZGRyZXNzOwordXNpbmcgSGlkbERlbXV4TW10cEZpbHRlclR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4TW10cEZpbHRlclR5cGU7Cit1c2luZyBIaWRsRGVtdXhNbXRwUGlkID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eE1tdHBQaWQ7Cit1c2luZyBIaWRsRGVtdXhSZWNvcmRTY0luZGV4VHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhSZWNvcmRTY0luZGV4VHlwZTsKK3VzaW5nIEhpZGxEZW11eFN0cmVhbUlkID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFN0cmVhbUlkOwordXNpbmcgSGlkbERlbXV4VHNGaWx0ZXJUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyVHlwZTsKK3VzaW5nIEhpZGxSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKK3VzaW5nIEhpZGxBdWRpb1N0cmVhbVR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkF1ZGlvU3RyZWFtVHlwZTsKK3VzaW5nIEhpZGxDb25zdGFudCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6Q29uc3RhbnQ7Cit1c2luZyBIaWRsVmlkZW9TdHJlYW1UeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpWaWRlb1N0cmVhbVR5cGU7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKworVHVuZXJIaWRsRmlsdGVyOjpUdW5lckhpZGxGaWx0ZXIoc3A8SGlkbElGaWx0ZXI+IGZpbHRlciwgc3A8RmlsdGVyQ2FsbGJhY2s+IGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVtdXhGaWx0ZXJUeXBlIHR5cGUpCisgICAgICA6IG1GaWx0ZXIoZmlsdGVyKSwKKyAgICAgICAgbVR5cGUodHlwZSksCisgICAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgICAgbVNoYXJlZChmYWxzZSksCisgICAgICAgIG1DbGllbnRQaWQoLTEpLAorICAgICAgICBtRmlsdGVyQ2FsbGJhY2soY2IpIHsKKyAgICBtRmlsdGVyXzFfMSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6SUZpbHRlcjo6Y2FzdEZyb20oZmlsdGVyKTsKK30KKworVHVuZXJIaWRsRmlsdGVyOjp+VHVuZXJIaWRsRmlsdGVyKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUZpbHRlciA9IG51bGxwdHI7CisgICAgbUZpbHRlcl8xXzEgPSBudWxscHRyOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OmdldFF1ZXVlRGVzYyhBaWRsTVFEZXNjKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICAgICAgaW50MzJfdCBjYWxsaW5nUGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIGlmIChjYWxsaW5nUGlkID09IG1DbGllbnRQaWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgaW4gd3JvbmcgcHJvY2VzcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNUURlc2MgZmlsdGVyTVFEZXNjOworICAgIEhpZGxSZXN1bHQgcmVzOworICAgIG1GaWx0ZXItPmdldFF1ZXVlRGVzYyhbJl0oSGlkbFJlc3VsdCByLCBjb25zdCBNUURlc2MmIGRlc2MpIHsKKyAgICAgICAgZmlsdGVyTVFEZXNjID0gZGVzYzsKKyAgICAgICAgcmVzID0gcjsKKyAgICB9KTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgQWlkbE1RRGVzYyBhaWRsTVFEZXNjOworICAgIHVuc2FmZUhpZGxUb0FpZGxNUURlc2NyaXB0b3I8dWludDhfdCwgaW50OF90LCBTeW5jaHJvbml6ZWRSZWFkV3JpdGU+KGZpbHRlck1RRGVzYywgJmFpZGxNUURlc2MpOworICAgICpfYWlkbF9yZXR1cm4gPSBtb3ZlKGFpZGxNUURlc2MpOworCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OmdldElkKGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXM7CisgICAgbUZpbHRlci0+Z2V0SWQoWyZdKEhpZGxSZXN1bHQgciwgdWludDMyX3QgZmlsdGVySWQpIHsKKyAgICAgICAgcmVzID0gcjsKKyAgICAgICAgbUlkID0gZmlsdGVySWQ7CisgICAgfSk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICAqX2FpZGxfcmV0dXJuID0gbUlkOworCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OmdldElkNjRCaXQoaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlcl8xXzEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlcl8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzOworICAgIG1GaWx0ZXJfMV8xLT5nZXRJZDY0Qml0KFsmXShIaWRsUmVzdWx0IHIsIHVpbnQ2NF90IGZpbHRlcklkKSB7CisgICAgICAgIHJlcyA9IHI7CisgICAgICAgIG1JZDY0Qml0ID0gZmlsdGVySWQ7CisgICAgfSk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICAqX2FpZGxfcmV0dXJuID0gbUlkNjRCaXQ7CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZpbHRlcjo6Y29uZmlndXJlKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIGluX3NldHRpbmdzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBIaWRsRGVtdXhGaWx0ZXJTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzd2l0Y2ggKGluX3NldHRpbmdzLmdldFRhZygpKSB7CisgICAgY2FzZSBEZW11eEZpbHRlclNldHRpbmdzOjp0czogeworICAgICAgICBnZXRIaWRsVHNTZXR0aW5ncyhpbl9zZXR0aW5ncywgc2V0dGluZ3MpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eEZpbHRlclNldHRpbmdzOjptbXRwOiB7CisgICAgICAgIGdldEhpZGxNbXRwU2V0dGluZ3MoaW5fc2V0dGluZ3MsIHNldHRpbmdzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGVtdXhGaWx0ZXJTZXR0aW5nczo6aXA6IHsKKyAgICAgICAgZ2V0SGlkbElwU2V0dGluZ3MoaW5fc2V0dGluZ3MsIHNldHRpbmdzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGVtdXhGaWx0ZXJTZXR0aW5nczo6dGx2OiB7CisgICAgICAgIGdldEhpZGxUbHZTZXR0aW5ncyhpbl9zZXR0aW5ncywgc2V0dGluZ3MpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eEZpbHRlclNldHRpbmdzOjphbHA6IHsKKyAgICAgICAgZ2V0SGlkbEFscFNldHRpbmdzKGluX3NldHRpbmdzLCBzZXR0aW5ncyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1GaWx0ZXItPmNvbmZpZ3VyZShzZXR0aW5ncyk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpjb25maWd1cmVNb25pdG9yRXZlbnQoaW50MzJfdCBtb25pdG9yRXZlbnRUeXBlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlcl8xXzEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlcl8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbUZpbHRlcl8xXzEtPmNvbmZpZ3VyZU1vbml0b3JFdmVudChtb25pdG9yRXZlbnRUeXBlKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OmNvbmZpZ3VyZUlwRmlsdGVyQ29udGV4dElkKGludDMyX3QgY2lkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlcl8xXzEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlcl8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbUZpbHRlcl8xXzEtPmNvbmZpZ3VyZUlwQ2lkKGNpZCk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpjb25maWd1cmVBdlN0cmVhbVR5cGUoY29uc3QgQXZTdHJlYW1UeXBlJiBpbl9hdlN0cmVhbVR5cGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyXzFfMSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgSGlkbEF2U3RyZWFtVHlwZSB0eXBlOworICAgIGlmICghZ2V0SGlkbEF2U3RyZWFtVHlwZShpbl9hdlN0cmVhbVR5cGUsIHR5cGUpKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbUZpbHRlcl8xXzEtPmNvbmZpZ3VyZUF2U3RyZWFtVHlwZSh0eXBlKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OnNldERhdGFTb3VyY2UoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBmaWx0ZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAoZmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBvbiBhIHNoYXJlZCBmaWx0ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBzcDxIaWRsSUZpbHRlcj4gaGlkbEZpbHRlciA9IHN0YXRpY19jYXN0PFR1bmVySGlkbEZpbHRlcio+KGZpbHRlci5nZXQoKSktPmdldEhhbEZpbHRlcigpOworICAgIEhpZGxSZXN1bHQgcmVzID0gbUZpbHRlci0+c2V0RGF0YVNvdXJjZShoaWRsRmlsdGVyKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OmdldEF2U2hhcmVkSGFuZGxlKE5hdGl2ZUhhbmRsZSogb3V0X2F2TWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyXzFfMSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIEFMT0dEKCIlcyBpcyBjYWxsZWQgb24gYSBzaGFyZWQgZmlsdGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX1NUQVRFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXM7CisgICAgbUZpbHRlcl8xXzEtPmdldEF2U2hhcmVkSGFuZGxlKFsmXShIaWRsUmVzdWx0IHIsIGhpZGxfaGFuZGxlIGF2TWVtb3J5LCB1aW50NjRfdCBhdk1lbVNpemUpIHsKKyAgICAgICAgcmVzID0gcjsKKyAgICAgICAgaWYgKHJlcyA9PSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICAgICAqb3V0X2F2TWVtb3J5ID0gZHVwVG9BaWRsKGF2TWVtb3J5KTsKKyAgICAgICAgICAgICpfYWlkbF9yZXR1cm4gPSBzdGF0aWNfY2FzdDxpbnQ2NF90Pihhdk1lbVNpemUpOworICAgICAgICB9CisgICAgfSk7CisKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OnJlbGVhc2VBdkhhbmRsZShjb25zdCBOYXRpdmVIYW5kbGUmIGluX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgaW5fYXZEYXRhSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCkgeworICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIG9uIGEgc2hhcmVkIGZpbHRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIGhpZGxfaGFuZGxlIGhhbmRsZTsKKyAgICBoYW5kbGUuc2V0VG8obWFrZUZyb21BaWRsKGluX2hhbmRsZSksIHRydWUpOworICAgIEhpZGxSZXN1bHQgcmVzID0gbUZpbHRlci0+cmVsZWFzZUF2SGFuZGxlKGhhbmRsZSwgaW5fYXZEYXRhSWQpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICAvLyBDYWxsIHRvIEhBTCB0byBtYWtlIHN1cmUgdGhlIHRyYW5zcG9ydCBGRCB3YXMgYWJsZSB0byBiZSBjbG9zZWQgYnkgYmluZGVyLgorICAgIC8vIFRoaXMgaXMgYSB0cmlja3kgd29ya2Fyb3VuZCBmb3IgYSBwcm9ibGVtIGluIEJpbmRlci4KKyAgICAvLyBUT0RPOltiLzE5MjA0ODg0Ml0gV2hlbiB0aGF0IHByb2JsZW0gaXMgZml4ZWQgd2UgbWF5IGJlIGFibGUgdG8gcmVtb3ZlIG9yIGNoYW5nZSB0aGlzIGNvZGUuCisgICAgbUZpbHRlci0+Z2V0SWQoWyZdKEhpZGxSZXN1bHQgLyogciAqLywgdWludDMyX3QgLyogZmlsdGVySWQqLyl7fSk7CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZpbHRlcjo6c3RhcnQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgICAgIGludDMyX3QgY2FsbGluZ1BpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBpZiAoY2FsbGluZ1BpZCA9PSBtQ2xpZW50UGlkKSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIGluIHdyb25nIHByb2Nlc3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgICAgICB9CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRmlsdGVyLT5zdGFydCgpOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OnN0b3AoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgaWYgKG1TaGFyZWQpIHsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgICAgIGludDMyX3QgY2FsbGluZ1BpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBpZiAoY2FsbGluZ1BpZCA9PSBtQ2xpZW50UGlkKSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgaXMgY2FsbGVkIGluIHdyb25nIHByb2Nlc3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgICAgICB9CisgICAgfQorCisgICAgSGlkbFJlc3VsdCByZXMgPSBtRmlsdGVyLT5zdG9wKCk7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OmZsdXNoKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgICAgICBpbnQzMl90IGNhbGxpbmdQaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgaWYgKGNhbGxpbmdQaWQgPT0gbUNsaWVudFBpZCkgeworICAgICAgICAgICAgQUxPR0QoIiVzIGlzIGNhbGxlZCBpbiB3cm9uZyBwcm9jZXNzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbUZpbHRlci0+Zmx1c2goKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGaWx0ZXI6OmNsb3NlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkKSB7CisgICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgICAgICBpbnQzMl90IGNhbGxpbmdQaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgaWYgKGNhbGxpbmdQaWQgPT0gbUNsaWVudFBpZCkgeworICAgICAgICAgICAgaWYgKG1GaWx0ZXJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbUZpbHRlckNhbGxiYWNrLT5zZW5kU2hhcmVkRmlsdGVyU3RhdHVzKFNUQVRVU19JTkFDQ0VTU0lCTEUpOworICAgICAgICAgICAgICAgIG1GaWx0ZXJDYWxsYmFjay0+ZGV0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFR1bmVySGlkbFNlcnZpY2U6OmdldFR1bmVyU2VydmljZSgpLT5yZW1vdmVTaGFyZWRGaWx0ZXIodGhpcy0+cmVmPFR1bmVySGlkbEZpbHRlcj4oKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBDYWxsaW5nIGZyb20gc2hhcmVkIHByb2Nlc3MsIGRvIG5vdCByZWFsbHkgY2xvc2UgdGhpcyBmaWx0ZXIuCisgICAgICAgICAgICBpZiAobUZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPmRldGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1GaWx0ZXJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1GaWx0ZXJDYWxsYmFjay0+ZGV0YWNoQ2FsbGJhY2tzKCk7CisgICAgfQorICAgIEhpZGxSZXN1bHQgcmVzID0gbUZpbHRlci0+Y2xvc2UoKTsKKyAgICBtRmlsdGVyID0gbnVsbHB0cjsKKyAgICBtRmlsdGVyXzFfMSA9IG51bGxwdHI7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtU2hhcmVkID0gZmFsc2U7CisgICAgbUNsaWVudFBpZCA9IC0xOworCisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjphY3F1aXJlU2hhcmVkRmlsdGVyVG9rZW4oc3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAobVNoYXJlZCB8fCBtU3RhcnRlZCkgeworICAgICAgICBBTE9HRCgiY3JlYXRlIFNoYXJlZEZpbHRlciBpbiB3cm9uZyBzdGF0ZSIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICBtQ2xpZW50UGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgc3RyaW5nIHRva2VuID0KKyAgICAgICAgICAgIFR1bmVySGlkbFNlcnZpY2U6OmdldFR1bmVyU2VydmljZSgpLT5hZGRGaWx0ZXJUb1NoYXJlZCh0aGlzLT5yZWY8VHVuZXJIaWRsRmlsdGVyPigpKTsKKyAgICBfYWlkbF9yZXR1cm4tPmFzc2lnbih0b2tlbik7CisgICAgbVNoYXJlZCA9IHRydWU7CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZpbHRlcjo6ZnJlZVNoYXJlZEZpbHRlclRva2VuKGNvbnN0IHN0cmluZyYgLyogaW5fZmlsdGVyVG9rZW4gKi8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAoIW1TaGFyZWQpIHsKKyAgICAgICAgLy8gVGhlIGZpbHRlciBpcyBub3Qgc2hhcmVkIG9yIHRoZSBzaGFyZWQgZmlsdGVyIGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIGlmIChtRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPnNlbmRTaGFyZWRGaWx0ZXJTdGF0dXMoU1RBVFVTX0lOQUNDRVNTSUJMRSk7CisgICAgICAgIG1GaWx0ZXJDYWxsYmFjay0+ZGV0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soKTsKKyAgICB9CisKKyAgICBUdW5lckhpZGxTZXJ2aWNlOjpnZXRUdW5lclNlcnZpY2UoKS0+cmVtb3ZlU2hhcmVkRmlsdGVyKHRoaXMtPnJlZjxUdW5lckhpZGxGaWx0ZXI+KCkpOworICAgIG1TaGFyZWQgPSBmYWxzZTsKKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRmlsdGVyOjpnZXRGaWx0ZXJUeXBlKERlbXV4RmlsdGVyVHlwZSogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgICpfYWlkbF9yZXR1cm4gPSBtVHlwZTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZpbHRlcjo6c2V0RGVsYXlIaW50KGNvbnN0IEZpbHRlckRlbGF5SGludCYpIHsKKyAgICAvLyBzZXREZWxheUhpbnQgaXMgbm90IHN1cHBvcnRlZCBpbiBISURMIEhBTAorICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKK30KKworYm9vbCBUdW5lckhpZGxGaWx0ZXI6OmlzU2hhcmVkRmlsdGVyQWxsb3dlZChpbnQgY2FsbGluZ1BpZCkgeworICAgIHJldHVybiBtU2hhcmVkICYmIG1DbGllbnRQaWQgIT0gY2FsbGluZ1BpZDsKK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OmF0dGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBpbl9jYikgeworICAgIGlmIChtRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtRmlsdGVyQ2FsbGJhY2stPmF0dGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKGluX2NiKTsKKyAgICB9Cit9CisKK3NwPEhpZGxJRmlsdGVyPiBUdW5lckhpZGxGaWx0ZXI6OmdldEhhbEZpbHRlcigpIHsKKyAgICByZXR1cm4gbUZpbHRlcjsKK30KKworYm9vbCBUdW5lckhpZGxGaWx0ZXI6OmdldEhpZGxBdlN0cmVhbVR5cGUoY29uc3QgQXZTdHJlYW1UeXBlIGF2U3RyZWFtVHlwZSwgSGlkbEF2U3RyZWFtVHlwZSYgdHlwZSkgeworICAgIGlmIChpc0F1ZGlvRmlsdGVyKCkpIHsKKyAgICAgICAgQXVkaW9TdHJlYW1UeXBlIGF1ZGlvID0gYXZTdHJlYW1UeXBlLmdldDxBdlN0cmVhbVR5cGU6OmF1ZGlvPigpOworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pID4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oSGlkbEF1ZGlvU3RyZWFtVHlwZTo6RFJBKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHR5cGUuYXVkaW8oc3RhdGljX2Nhc3Q8SGlkbEF1ZGlvU3RyZWFtVHlwZT4oYXVkaW8pKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKGlzVmlkZW9GaWx0ZXIoKSkgeworICAgICAgICB0eXBlLnZpZGVvKHN0YXRpY19jYXN0PEhpZGxWaWRlb1N0cmVhbVR5cGU+KGF2U3RyZWFtVHlwZS5nZXQ8QXZTdHJlYW1UeXBlOjp2aWRlbz4oKSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVHVuZXJIaWRsRmlsdGVyOjppc0F1ZGlvRmlsdGVyKCkgeworICAgIHJldHVybiAobVR5cGUubWFpblR5cGUgPT0gRGVtdXhGaWx0ZXJNYWluVHlwZTo6VFMgJiYKKyAgICAgICAgICAgIG1UeXBlLnN1YlR5cGUuZ2V0PERlbXV4RmlsdGVyU3ViVHlwZTo6dHNGaWx0ZXJUeXBlPigpID09IERlbXV4VHNGaWx0ZXJUeXBlOjpBVURJTykgfHwKKyAgICAgICAgICAgKG1UeXBlLm1haW5UeXBlID09IERlbXV4RmlsdGVyTWFpblR5cGU6Ok1NVFAgJiYKKyAgICAgICAgICAgIG1UeXBlLnN1YlR5cGUuZ2V0PERlbXV4RmlsdGVyU3ViVHlwZTo6bW10cEZpbHRlclR5cGU+KCkgPT0gRGVtdXhNbXRwRmlsdGVyVHlwZTo6QVVESU8pOworfQorCitib29sIFR1bmVySGlkbEZpbHRlcjo6aXNWaWRlb0ZpbHRlcigpIHsKKyAgICByZXR1cm4gKG1UeXBlLm1haW5UeXBlID09IERlbXV4RmlsdGVyTWFpblR5cGU6OlRTICYmCisgICAgICAgICAgICBtVHlwZS5zdWJUeXBlLmdldDxEZW11eEZpbHRlclN1YlR5cGU6OnRzRmlsdGVyVHlwZT4oKSA9PSBEZW11eFRzRmlsdGVyVHlwZTo6VklERU8pIHx8CisgICAgICAgICAgIChtVHlwZS5tYWluVHlwZSA9PSBEZW11eEZpbHRlck1haW5UeXBlOjpNTVRQICYmCisgICAgICAgICAgICBtVHlwZS5zdWJUeXBlLmdldDxEZW11eEZpbHRlclN1YlR5cGU6Om1tdHBGaWx0ZXJUeXBlPigpID09IERlbXV4TW10cEZpbHRlclR5cGU6OlZJREVPKTsKK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OmdldEhpZGxUc1NldHRpbmdzKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGxEZW11eEZpbHRlclNldHRpbmdzJiBoaWRsU2V0dGluZ3MpIHsKKyAgICBjb25zdCBEZW11eFRzRmlsdGVyU2V0dGluZ3MmIHRzQ29uZiA9IHNldHRpbmdzLmdldDxEZW11eEZpbHRlclNldHRpbmdzOjp0cz4oKTsKKyAgICBIaWRsRGVtdXhUc0ZpbHRlclNldHRpbmdzIHRzeworICAgICAgICAgICAgLnRwaWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4odHNDb25mLnRwaWQpLAorICAgIH07CisKKyAgICBzd2l0Y2ggKHRzQ29uZi5maWx0ZXJTZXR0aW5ncy5nZXRUYWcoKSkgeworICAgIGNhc2UgRGVtdXhUc0ZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M6OmF2OiB7CisgICAgICAgIHRzLmZpbHRlclNldHRpbmdzLmF2KGdldEhpZGxBdlNldHRpbmdzKAorICAgICAgICAgICAgICAgIHRzQ29uZi5maWx0ZXJTZXR0aW5ncy5nZXQ8RGVtdXhUc0ZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M6OmF2PigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4VHNGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpzZWN0aW9uOiB7CisgICAgICAgIHRzLmZpbHRlclNldHRpbmdzLnNlY3Rpb24oZ2V0SGlkbFNlY3Rpb25TZXR0aW5ncygKKyAgICAgICAgICAgICAgICB0c0NvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0PERlbXV4VHNGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpzZWN0aW9uPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4VHNGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpwZXNEYXRhOiB7CisgICAgICAgIHRzLmZpbHRlclNldHRpbmdzLnBlc0RhdGEoZ2V0SGlkbFBlc0RhdGFTZXR0aW5ncygKKyAgICAgICAgICAgICAgICB0c0NvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0PERlbXV4VHNGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpwZXNEYXRhPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4VHNGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpyZWNvcmQ6IHsKKyAgICAgICAgdHMuZmlsdGVyU2V0dGluZ3MucmVjb3JkKGdldEhpZGxSZWNvcmRTZXR0aW5ncygKKyAgICAgICAgICAgICAgICB0c0NvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0PERlbXV4VHNGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpyZWNvcmQ+KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgdHMuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgaGlkbFNldHRpbmdzLnRzKHRzKTsKK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OmdldEhpZGxNbXRwU2V0dGluZ3MoY29uc3QgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWRsRGVtdXhGaWx0ZXJTZXR0aW5ncyYgaGlkbFNldHRpbmdzKSB7CisgICAgY29uc3QgRGVtdXhNbXRwRmlsdGVyU2V0dGluZ3MmIG1tdHBDb25mID0gc2V0dGluZ3MuZ2V0PERlbXV4RmlsdGVyU2V0dGluZ3M6Om1tdHA+KCk7CisgICAgSGlkbERlbXV4TW10cEZpbHRlclNldHRpbmdzIG1tdHB7CisgICAgICAgICAgICAubW10cFBpZCA9IHN0YXRpY19jYXN0PEhpZGxEZW11eE1tdHBQaWQ+KG1tdHBDb25mLm1tdHBQaWQpLAorICAgIH07CisKKyAgICBzd2l0Y2ggKG1tdHBDb25mLmZpbHRlclNldHRpbmdzLmdldFRhZygpKSB7CisgICAgY2FzZSBEZW11eE1tdHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjphdjogeworICAgICAgICBtbXRwLmZpbHRlclNldHRpbmdzLmF2KGdldEhpZGxBdlNldHRpbmdzKAorICAgICAgICAgICAgICAgIG1tdHBDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eE1tdHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjphdj4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eE1tdHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpzZWN0aW9uOiB7CisgICAgICAgIG1tdHAuZmlsdGVyU2V0dGluZ3Muc2VjdGlvbihnZXRIaWRsU2VjdGlvblNldHRpbmdzKAorICAgICAgICAgICAgICAgIG1tdHBDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eE1tdHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpzZWN0aW9uPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4TW10cEZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M6OnBlc0RhdGE6IHsKKyAgICAgICAgbW10cC5maWx0ZXJTZXR0aW5ncy5wZXNEYXRhKGdldEhpZGxQZXNEYXRhU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgbW10cENvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0PERlbXV4TW10cEZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M6OnBlc0RhdGE+KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGVtdXhNbXRwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6cmVjb3JkOiB7CisgICAgICAgIG1tdHAuZmlsdGVyU2V0dGluZ3MucmVjb3JkKGdldEhpZGxSZWNvcmRTZXR0aW5ncygKKyAgICAgICAgICAgICAgICBtbXRwQ29uZi5maWx0ZXJTZXR0aW5ncy5nZXQ8RGVtdXhNbXRwRmlsdGVyU2V0dGluZ3NGaWx0ZXJTZXR0aW5nczo6cmVjb3JkPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4TW10cEZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M6OmRvd25sb2FkOiB7CisgICAgICAgIG1tdHAuZmlsdGVyU2V0dGluZ3MuZG93bmxvYWQoZ2V0SGlkbERvd25sb2FkU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgbW10cENvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0PERlbXV4TW10cEZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M6OmRvd25sb2FkPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICAgIG1tdHAuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgaGlkbFNldHRpbmdzLm1tdHAobW10cCk7Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjpnZXRIaWRsSXBTZXR0aW5ncyhjb25zdCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWRsRGVtdXhGaWx0ZXJTZXR0aW5ncyYgaGlkbFNldHRpbmdzKSB7CisgICAgY29uc3QgRGVtdXhJcEZpbHRlclNldHRpbmdzJiBpcENvbmYgPSBzZXR0aW5ncy5nZXQ8RGVtdXhGaWx0ZXJTZXR0aW5nczo6aXA+KCk7CisgICAgSGlkbERlbXV4SXBBZGRyZXNzIGlwQWRkcnsKKyAgICAgICAgICAgIC5zcmNQb3J0ID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGlwQ29uZi5pcEFkZHIuc3JjUG9ydCksCisgICAgICAgICAgICAuZHN0UG9ydCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihpcENvbmYuaXBBZGRyLmRzdFBvcnQpLAorICAgIH07CisKKyAgICBpcENvbmYuaXBBZGRyLnNyY0lwQWRkcmVzcy5nZXRUYWcoKSA9PSBEZW11eElwQWRkcmVzc0lwQWRkcmVzczo6djYKKyAgICAgICAgICAgID8gaXBBZGRyLnNyY0lwQWRkcmVzcy52NihnZXRJcFY2QWRkcmVzcyhpcENvbmYuaXBBZGRyLnNyY0lwQWRkcmVzcykpCisgICAgICAgICAgICA6IGlwQWRkci5zcmNJcEFkZHJlc3MudjQoZ2V0SXBWNEFkZHJlc3MoaXBDb25mLmlwQWRkci5zcmNJcEFkZHJlc3MpKTsKKyAgICBpcENvbmYuaXBBZGRyLmRzdElwQWRkcmVzcy5nZXRUYWcoKSA9PSBEZW11eElwQWRkcmVzc0lwQWRkcmVzczo6djYKKyAgICAgICAgICAgID8gaXBBZGRyLmRzdElwQWRkcmVzcy52NihnZXRJcFY2QWRkcmVzcyhpcENvbmYuaXBBZGRyLmRzdElwQWRkcmVzcykpCisgICAgICAgICAgICA6IGlwQWRkci5kc3RJcEFkZHJlc3MudjQoZ2V0SXBWNEFkZHJlc3MoaXBDb25mLmlwQWRkci5kc3RJcEFkZHJlc3MpKTsKKworICAgIEhpZGxEZW11eElwRmlsdGVyU2V0dGluZ3MgaXA7CisgICAgaXAuaXBBZGRyID0gaXBBZGRyOworCisgICAgc3dpdGNoIChpcENvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0VGFnKCkpIHsKKyAgICBjYXNlIERlbXV4SXBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpzZWN0aW9uOiB7CisgICAgICAgIGlwLmZpbHRlclNldHRpbmdzLnNlY3Rpb24oZ2V0SGlkbFNlY3Rpb25TZXR0aW5ncygKKyAgICAgICAgICAgICAgICBpcENvbmYuZmlsdGVyU2V0dGluZ3MuZ2V0PERlbXV4SXBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpzZWN0aW9uPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERlbXV4SXBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpiUGFzc3Rocm91Z2g6IHsKKyAgICAgICAgaXAuZmlsdGVyU2V0dGluZ3MuYlBhc3N0aHJvdWdoKAorICAgICAgICAgICAgICAgIGlwQ29uZi5maWx0ZXJTZXR0aW5ncy5nZXQ8RGVtdXhJcEZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M6OmJQYXNzdGhyb3VnaD4oKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICAgIGlwLmZpbHRlclNldHRpbmdzLm5vaW5pdCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIGhpZGxTZXR0aW5ncy5pcChpcCk7Cit9CisKK2hpZGxfYXJyYXk8dWludDhfdCwgSVBfVjZfTEVOR1RIPiBUdW5lckhpZGxGaWx0ZXI6OmdldElwVjZBZGRyZXNzKAorICAgICAgICBjb25zdCBEZW11eElwQWRkcmVzc0lwQWRkcmVzcyYgYWRkcikgeworICAgIGhpZGxfYXJyYXk8dWludDhfdCwgSVBfVjZfTEVOR1RIPiBpcDsKKyAgICBpZiAoYWRkci5nZXQ8RGVtdXhJcEFkZHJlc3NJcEFkZHJlc3M6OnY2PigpLnNpemUoKSAhPSBJUF9WNl9MRU5HVEgpIHsKKyAgICAgICAgcmV0dXJuIGlwOworICAgIH0KKyAgICBjb3B5KGFkZHIuZ2V0PERlbXV4SXBBZGRyZXNzSXBBZGRyZXNzOjp2Nj4oKS5iZWdpbigpLAorICAgICAgICAgYWRkci5nZXQ8RGVtdXhJcEFkZHJlc3NJcEFkZHJlc3M6OnY2PigpLmVuZCgpLCBpcC5kYXRhKCkpOworICAgIHJldHVybiBpcDsKK30KKworaGlkbF9hcnJheTx1aW50OF90LCBJUF9WNF9MRU5HVEg+IFR1bmVySGlkbEZpbHRlcjo6Z2V0SXBWNEFkZHJlc3MoCisgICAgICAgIGNvbnN0IERlbXV4SXBBZGRyZXNzSXBBZGRyZXNzJiBhZGRyKSB7CisgICAgaGlkbF9hcnJheTx1aW50OF90LCBJUF9WNF9MRU5HVEg+IGlwOworICAgIGlmIChhZGRyLmdldDxEZW11eElwQWRkcmVzc0lwQWRkcmVzczo6djQ+KCkuc2l6ZSgpICE9IElQX1Y0X0xFTkdUSCkgeworICAgICAgICByZXR1cm4gaXA7CisgICAgfQorICAgIGNvcHkoYWRkci5nZXQ8RGVtdXhJcEFkZHJlc3NJcEFkZHJlc3M6OnY0PigpLmJlZ2luKCksCisgICAgICAgICBhZGRyLmdldDxEZW11eElwQWRkcmVzc0lwQWRkcmVzczo6djQ+KCkuZW5kKCksIGlwLmRhdGEoKSk7CisgICAgcmV0dXJuIGlwOworfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6Z2V0SGlkbFRsdlNldHRpbmdzKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWRsRGVtdXhGaWx0ZXJTZXR0aW5ncyYgaGlkbFNldHRpbmdzKSB7CisgICAgY29uc3QgRGVtdXhUbHZGaWx0ZXJTZXR0aW5ncyYgdGx2Q29uZiA9IHNldHRpbmdzLmdldDxEZW11eEZpbHRlclNldHRpbmdzOjp0bHY+KCk7CisgICAgSGlkbERlbXV4VGx2RmlsdGVyU2V0dGluZ3MgdGx2eworICAgICAgICAgICAgLnBhY2tldFR5cGUgPSBzdGF0aWNfY2FzdDx1aW50OF90Pih0bHZDb25mLnBhY2tldFR5cGUpLAorICAgICAgICAgICAgLmlzQ29tcHJlc3NlZElwUGFja2V0ID0gdGx2Q29uZi5pc0NvbXByZXNzZWRJcFBhY2tldCwKKyAgICB9OworCisgICAgc3dpdGNoICh0bHZDb25mLmZpbHRlclNldHRpbmdzLmdldFRhZygpKSB7CisgICAgY2FzZSBEZW11eFRsdkZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M6OnNlY3Rpb246IHsKKyAgICAgICAgdGx2LmZpbHRlclNldHRpbmdzLnNlY3Rpb24oZ2V0SGlkbFNlY3Rpb25TZXR0aW5ncygKKyAgICAgICAgICAgICAgICB0bHZDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eFRsdkZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M6OnNlY3Rpb24+KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGVtdXhUbHZGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpiUGFzc3Rocm91Z2g6IHsKKyAgICAgICAgdGx2LmZpbHRlclNldHRpbmdzLmJQYXNzdGhyb3VnaCgKKyAgICAgICAgICAgICAgICB0bHZDb25mLmZpbHRlclNldHRpbmdzLmdldDxEZW11eFRsdkZpbHRlclNldHRpbmdzRmlsdGVyU2V0dGluZ3M6OmJQYXNzdGhyb3VnaD4oKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICAgIHRsdi5maWx0ZXJTZXR0aW5ncy5ub2luaXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICBoaWRsU2V0dGluZ3MudGx2KHRsdik7Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjpnZXRIaWRsQWxwU2V0dGluZ3MoY29uc3QgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGxEZW11eEZpbHRlclNldHRpbmdzJiBoaWRsU2V0dGluZ3MpIHsKKyAgICBjb25zdCBEZW11eEFscEZpbHRlclNldHRpbmdzJiBhbHBDb25mID0gc2V0dGluZ3MuZ2V0PERlbXV4RmlsdGVyU2V0dGluZ3M6OmFscD4oKTsKKyAgICBIaWRsRGVtdXhBbHBGaWx0ZXJTZXR0aW5ncyBhbHB7CisgICAgICAgICAgICAucGFja2V0VHlwZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFscENvbmYucGFja2V0VHlwZSksCisgICAgICAgICAgICAubGVuZ3RoVHlwZSA9IHN0YXRpY19jYXN0PEhpZGxEZW11eEFscExlbmd0aFR5cGU+KGFscENvbmYubGVuZ3RoVHlwZSksCisgICAgfTsKKworICAgIHN3aXRjaCAoYWxwQ29uZi5maWx0ZXJTZXR0aW5ncy5nZXRUYWcoKSkgeworICAgIGNhc2UgRGVtdXhBbHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpzZWN0aW9uOiB7CisgICAgICAgIGFscC5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldEhpZGxTZWN0aW9uU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgYWxwQ29uZi5maWx0ZXJTZXR0aW5ncy5nZXQ8RGVtdXhBbHBGaWx0ZXJTZXR0aW5nc0ZpbHRlclNldHRpbmdzOjpzZWN0aW9uPigpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICAgIGFscC5maWx0ZXJTZXR0aW5ncy5ub2luaXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICBoaWRsU2V0dGluZ3MuYWxwKGFscCk7Cit9CisKK0hpZGxEZW11eEZpbHRlckF2U2V0dGluZ3MgVHVuZXJIaWRsRmlsdGVyOjpnZXRIaWRsQXZTZXR0aW5ncygKKyAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJBdlNldHRpbmdzJiBzZXR0aW5ncykgeworICAgIEhpZGxEZW11eEZpbHRlckF2U2V0dGluZ3MgYXZ7CisgICAgICAgICAgICAuaXNQYXNzdGhyb3VnaCA9IHNldHRpbmdzLmlzUGFzc3Rocm91Z2gsCisgICAgfTsKKyAgICByZXR1cm4gYXY7Cit9CisKK0hpZGxEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5ncyBUdW5lckhpZGxGaWx0ZXI6OmdldEhpZGxTZWN0aW9uU2V0dGluZ3MoCisgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzJiBzZXR0aW5ncykgeworICAgIEhpZGxEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5ncyBzZWN0aW9ueworICAgICAgICAgICAgLmlzQ2hlY2tDcmMgPSBzZXR0aW5ncy5pc0NoZWNrQ3JjLAorICAgICAgICAgICAgLmlzUmVwZWF0ID0gc2V0dGluZ3MuaXNSZXBlYXQsCisgICAgICAgICAgICAuaXNSYXcgPSBzZXR0aW5ncy5pc1JhdywKKyAgICB9OworCisgICAgc3dpdGNoIChzZXR0aW5ncy5jb25kaXRpb24uZ2V0VGFnKCkpIHsKKyAgICBjYXNlIERlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzQ29uZGl0aW9uOjpzZWN0aW9uQml0czogeworICAgICAgICBjb25zdCBEZW11eEZpbHRlclNlY3Rpb25CaXRzJiBzZWN0aW9uQml0cyA9CisgICAgICAgICAgICAgICAgc2V0dGluZ3MuY29uZGl0aW9uLmdldDxEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5nc0NvbmRpdGlvbjo6c2VjdGlvbkJpdHM+KCk7CisgICAgICAgIHZlY3Rvcjx1aW50OF90PiBmaWx0ZXIoc2VjdGlvbkJpdHMuZmlsdGVyLmJlZ2luKCksIHNlY3Rpb25CaXRzLmZpbHRlci5lbmQoKSk7CisgICAgICAgIHZlY3Rvcjx1aW50OF90PiBtYXNrKHNlY3Rpb25CaXRzLm1hc2suYmVnaW4oKSwgc2VjdGlvbkJpdHMubWFzay5lbmQoKSk7CisgICAgICAgIHZlY3Rvcjx1aW50OF90PiBtb2RlKHNlY3Rpb25CaXRzLm1vZGUuYmVnaW4oKSwgc2VjdGlvbkJpdHMubW9kZS5lbmQoKSk7CisgICAgICAgIHNlY3Rpb24uY29uZGl0aW9uLnNlY3Rpb25CaXRzKHsKKyAgICAgICAgICAgICAgICAuZmlsdGVyID0gZmlsdGVyLAorICAgICAgICAgICAgICAgIC5tYXNrID0gbWFzaywKKyAgICAgICAgICAgICAgICAubW9kZSA9IG1vZGUsCisgICAgICAgIH0pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5nc0NvbmRpdGlvbjo6dGFibGVJbmZvOiB7CisgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzQ29uZGl0aW9uVGFibGVJbmZvJiB0YWJsZUluZm8gPQorICAgICAgICAgICAgICAgIHNldHRpbmdzLmNvbmRpdGlvbi5nZXQ8RGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3NDb25kaXRpb246OnRhYmxlSW5mbz4oKTsKKyAgICAgICAgc2VjdGlvbi5jb25kaXRpb24udGFibGVJbmZvKHsKKyAgICAgICAgICAgICAgICAudGFibGVJZCA9IHN0YXRpY19jYXN0PHVpbnQxNl90Pih0YWJsZUluZm8udGFibGVJZCksCisgICAgICAgICAgICAgICAgLnZlcnNpb24gPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4odGFibGVJbmZvLnZlcnNpb24pLAorICAgICAgICB9KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2VjdGlvbjsKK30KKworSGlkbERlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzIFR1bmVySGlkbEZpbHRlcjo6Z2V0SGlkbFBlc0RhdGFTZXR0aW5ncygKKyAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJQZXNEYXRhU2V0dGluZ3MmIHNldHRpbmdzKSB7CisgICAgSGlkbERlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzIHBlc3sKKyAgICAgICAgICAgIC5zdHJlYW1JZCA9IHN0YXRpY19jYXN0PEhpZGxEZW11eFN0cmVhbUlkPihzZXR0aW5ncy5zdHJlYW1JZCksCisgICAgICAgICAgICAuaXNSYXcgPSBzZXR0aW5ncy5pc1JhdywKKyAgICB9OworICAgIHJldHVybiBwZXM7Cit9CisKK0hpZGxEZW11eEZpbHRlclJlY29yZFNldHRpbmdzIFR1bmVySGlkbEZpbHRlcjo6Z2V0SGlkbFJlY29yZFNldHRpbmdzKAorICAgICAgICBjb25zdCBEZW11eEZpbHRlclJlY29yZFNldHRpbmdzJiBzZXR0aW5ncykgeworICAgIEhpZGxEZW11eEZpbHRlclJlY29yZFNldHRpbmdzIHJlY29yZHsKKyAgICAgICAgICAgIC50c0luZGV4TWFzayA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXR0aW5ncy50c0luZGV4TWFzayksCisgICAgfTsKKworICAgIHN3aXRjaCAoc2V0dGluZ3Muc2NJbmRleE1hc2suZ2V0VGFnKCkpIHsKKyAgICBjYXNlIERlbXV4RmlsdGVyU2NJbmRleE1hc2s6OnNjSW5kZXg6IHsKKyAgICAgICAgcmVjb3JkLnNjSW5kZXhUeXBlID0gc3RhdGljX2Nhc3Q8SGlkbERlbXV4UmVjb3JkU2NJbmRleFR5cGU+KHNldHRpbmdzLnNjSW5kZXhUeXBlKTsKKyAgICAgICAgcmVjb3JkLnNjSW5kZXhNYXNrLnNjKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXR0aW5ncy5zY0luZGV4TWFzay5nZXQ8RGVtdXhGaWx0ZXJTY0luZGV4TWFzazo6c2NJbmRleD4oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEZW11eEZpbHRlclNjSW5kZXhNYXNrOjpzY0F2YzogeworICAgICAgICByZWNvcmQuc2NJbmRleFR5cGUgPSBIaWRsRGVtdXhSZWNvcmRTY0luZGV4VHlwZTo6U0M7CisgICAgICAgIHVpbnQzMl90IGluZGV4ID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0dGluZ3Muc2NJbmRleE1hc2suZ2V0PERlbXV4RmlsdGVyU2NJbmRleE1hc2s6OnNjQXZjPigpKTsKKyAgICAgICAgLy8gSElETCBIQUwgc3RhcnRpbmcgZnJvbSAxIDw8IDQ7IEFJREwgc3RhcnRpbmcgZnJvbSAxIDw8IDAuCisgICAgICAgIGluZGV4ID0gaW5kZXggPDwgNDsKKyAgICAgICAgcmVjb3JkLnNjSW5kZXhNYXNrLnNjKGluZGV4KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRGVtdXhGaWx0ZXJTY0luZGV4TWFzazo6c2NIZXZjOiB7CisgICAgICAgIHJlY29yZC5zY0luZGV4VHlwZSA9IHN0YXRpY19jYXN0PEhpZGxEZW11eFJlY29yZFNjSW5kZXhUeXBlPihzZXR0aW5ncy5zY0luZGV4VHlwZSk7CisgICAgICAgIHJlY29yZC5zY0luZGV4TWFzay5zY0hldmMoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNldHRpbmdzLnNjSW5kZXhNYXNrLmdldDxEZW11eEZpbHRlclNjSW5kZXhNYXNrOjpzY0hldmM+KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVjb3JkOworfQorCitIaWRsRGVtdXhGaWx0ZXJEb3dubG9hZFNldHRpbmdzIFR1bmVySGlkbEZpbHRlcjo6Z2V0SGlkbERvd25sb2FkU2V0dGluZ3MoCisgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBIaWRsRGVtdXhGaWx0ZXJEb3dubG9hZFNldHRpbmdzIGRvd25sb2FkeworICAgICAgICAgICAgLmRvd25sb2FkSWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0dGluZ3MuZG93bmxvYWRJZCksCisgICAgfTsKKyAgICByZXR1cm4gZG93bmxvYWQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLyBGaWx0ZXJDYWxsYmFjayAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUmV0dXJuPHZvaWQ+IFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6Om9uRmlsdGVyU3RhdHVzKEhpZGxEZW11eEZpbHRlclN0YXR1cyBzdGF0dXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgaWYgKG1UdW5lckZpbHRlckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVR1bmVyRmlsdGVyQ2FsbGJhY2stPm9uRmlsdGVyU3RhdHVzKHN0YXRpY19jYXN0PERlbXV4RmlsdGVyU3RhdHVzPihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6Om9uRmlsdGVyRXZlbnQoCisgICAgICAgIGNvbnN0IEhpZGxEZW11eEZpbHRlckV2ZW50JiBmaWx0ZXJFdmVudCkgeworICAgIHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+IGVtcHR5RXZlbnRzRXh0OworICAgIEhpZGxEZW11eEZpbHRlckV2ZW50RXh0IGVtcHR5RmlsdGVyRXZlbnRFeHR7CisgICAgICAgICAgICAuZXZlbnRzID0gZW1wdHlFdmVudHNFeHQsCisgICAgfTsKKyAgICBvbkZpbHRlckV2ZW50XzFfMShmaWx0ZXJFdmVudCwgZW1wdHlGaWx0ZXJFdmVudEV4dCk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6Om9uRmlsdGVyRXZlbnRfMV8xKAorICAgICAgICBjb25zdCBIaWRsRGVtdXhGaWx0ZXJFdmVudCYgZmlsdGVyRXZlbnQsIGNvbnN0IEhpZGxEZW11eEZpbHRlckV2ZW50RXh0JiBmaWx0ZXJFdmVudEV4dCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKKyAgICBpZiAobVR1bmVyRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiBldmVudHMgPSBmaWx0ZXJFdmVudC5ldmVudHM7CisgICAgICAgIHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+IGV2ZW50c0V4dCA9IGZpbHRlckV2ZW50RXh0LmV2ZW50czsKKyAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+IHR1bmVyRXZlbnRzOworCisgICAgICAgIGdldEFpZGxGaWx0ZXJFdmVudChldmVudHMsIGV2ZW50c0V4dCwgdHVuZXJFdmVudHMpOworICAgICAgICBtVHVuZXJGaWx0ZXJDYWxsYmFjay0+b25GaWx0ZXJFdmVudCh0dW5lckV2ZW50cyk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6c2VuZFNoYXJlZEZpbHRlclN0YXR1cyhpbnQzMl90IHN0YXR1cykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKKyAgICBpZiAobVR1bmVyRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0ciAmJiBtT3JpZ2luYWxDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckZpbHRlckNhbGxiYWNrLT5vbkZpbHRlclN0YXR1cyhzdGF0aWNfY2FzdDxEZW11eEZpbHRlclN0YXR1cz4oc3RhdHVzKSk7CisgICAgfQorfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmF0dGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKAorICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgaW5fY2IpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgbU9yaWdpbmFsQ2FsbGJhY2sgPSBtVHVuZXJGaWx0ZXJDYWxsYmFjazsKKyAgICBtVHVuZXJGaWx0ZXJDYWxsYmFjayA9IGluX2NiOworfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmRldGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKKyAgICBpZiAobVR1bmVyRmlsdGVyQ2FsbGJhY2sgIT0gbnVsbHB0ciAmJiBtT3JpZ2luYWxDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckZpbHRlckNhbGxiYWNrID0gbU9yaWdpbmFsQ2FsbGJhY2s7CisgICAgICAgIG1PcmlnaW5hbENhbGxiYWNrID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6ZGV0YWNoQ2FsbGJhY2tzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKKyAgICBtT3JpZ2luYWxDYWxsYmFjayA9IG51bGxwdHI7CisgICAgbVR1bmVyRmlsdGVyQ2FsbGJhY2sgPSBudWxscHRyOworfQorCisvLy8vLy8vLy8vLy8vLy8gRmlsdGVyQ2FsbGJhY2sgSGVscGVyIE1ldGhvZHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0QWlkbEZpbHRlckV2ZW50KAorICAgICAgICBjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAorICAgICAgICBjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LAorICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIGFpZGxFdmVudHMpIHsKKyAgICBpZiAoZXZlbnRzLmVtcHR5KCkgJiYgIWV2ZW50c0V4dC5lbXB0eSgpKSB7CisgICAgICAgIHN3aXRjaCAoZXZlbnRzRXh0WzBdLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICBjYXNlIEhpZGxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjptb25pdG9yRXZlbnQ6IHsKKyAgICAgICAgICAgIGdldE1vbml0b3JFdmVudChldmVudHNFeHQsIGFpZGxFdmVudHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6c3RhcnRJZDogeworICAgICAgICAgICAgZ2V0UmVzdGFydEV2ZW50KGV2ZW50c0V4dCwgYWlkbEV2ZW50cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFldmVudHMuZW1wdHkoKSkgeworICAgICAgICBzd2l0Y2ggKGV2ZW50c1swXS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6bWVkaWE6IHsKKyAgICAgICAgICAgIGdldE1lZGlhRXZlbnQoZXZlbnRzLCBhaWRsRXZlbnRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnNlY3Rpb246IHsKKyAgICAgICAgICAgIGdldFNlY3Rpb25FdmVudChldmVudHMsIGFpZGxFdmVudHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6cGVzOiB7CisgICAgICAgICAgICBnZXRQZXNFdmVudChldmVudHMsIGFpZGxFdmVudHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6dHNSZWNvcmQ6IHsKKyAgICAgICAgICAgIGdldFRzUmVjb3JkRXZlbnQoZXZlbnRzLCBldmVudHNFeHQsIGFpZGxFdmVudHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6bW10cFJlY29yZDogeworICAgICAgICAgICAgZ2V0TW10cFJlY29yZEV2ZW50KGV2ZW50cywgZXZlbnRzRXh0LCBhaWRsRXZlbnRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmRvd25sb2FkOiB7CisgICAgICAgICAgICBnZXREb3dubG9hZEV2ZW50KGV2ZW50cywgYWlkbEV2ZW50cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjppcFBheWxvYWQ6IHsKKyAgICAgICAgICAgIGdldElwUGF5bG9hZEV2ZW50KGV2ZW50cywgYWlkbEV2ZW50cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjp0ZW1pOiB7CisgICAgICAgICAgICBnZXRUZW1pRXZlbnQoZXZlbnRzLCBhaWRsRXZlbnRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0TWVkaWFFdmVudCgKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBIaWRsRGVtdXhGaWx0ZXJNZWRpYUV2ZW50JiBtZWRpYUV2ZW50ID0gZXZlbnRzW2ldLm1lZGlhKCk7CisgICAgICAgIERlbXV4RmlsdGVyTWVkaWFFdmVudCBtZWRpYTsKKworICAgICAgICBtZWRpYS5zdHJlYW1JZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KG1lZGlhRXZlbnQuc3RyZWFtSWQpOworICAgICAgICBtZWRpYS5pc1B0c1ByZXNlbnQgPSBtZWRpYUV2ZW50LmlzUHRzUHJlc2VudDsKKyAgICAgICAgbWVkaWEucHRzID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4obWVkaWFFdmVudC5wdHMpOworICAgICAgICBtZWRpYS5pc0R0c1ByZXNlbnQgPSBmYWxzZTsKKyAgICAgICAgbWVkaWEuZHRzID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oLTEpOworICAgICAgICBtZWRpYS5kYXRhTGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4obWVkaWFFdmVudC5kYXRhTGVuZ3RoKTsKKyAgICAgICAgbWVkaWEub2Zmc2V0ID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4obWVkaWFFdmVudC5vZmZzZXQpOworICAgICAgICBtZWRpYS5pc1NlY3VyZU1lbW9yeSA9IG1lZGlhRXZlbnQuaXNTZWN1cmVNZW1vcnk7CisgICAgICAgIG1lZGlhLmF2RGF0YUlkID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4obWVkaWFFdmVudC5hdkRhdGFJZCk7CisgICAgICAgIG1lZGlhLm1wdVNlcXVlbmNlTnVtYmVyID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obWVkaWFFdmVudC5tcHVTZXF1ZW5jZU51bWJlcik7CisgICAgICAgIG1lZGlhLmlzUGVzUHJpdmF0ZURhdGEgPSBtZWRpYUV2ZW50LmlzUGVzUHJpdmF0ZURhdGE7CisgICAgICAgIG1lZGlhLnNjSW5kZXhNYXNrLnNldDxEZW11eEZpbHRlclNjSW5kZXhNYXNrOjpzY0luZGV4PigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihEZW11eFNjSW5kZXg6OlVOREVGSU5FRCkpOworCisgICAgICAgIGlmIChtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICBIaWRsRGVtdXhGaWx0ZXJNZWRpYUV2ZW50OjpFeHRyYU1ldGFEYXRhOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF1ZGlvKSB7CisgICAgICAgICAgICBBdWRpb0V4dHJhTWV0YURhdGEgYXVkaW87CisgICAgICAgICAgICBhdWRpby5hZEZhZGUgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5hdWRpbygpLmFkRmFkZSk7CisgICAgICAgICAgICBhdWRpby5hZFBhbiA9IHN0YXRpY19jYXN0PGludDhfdD4obWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmF1ZGlvKCkuYWRQYW4pOworICAgICAgICAgICAgYXVkaW8udmVyc2lvblRleHRUYWcgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQxNl90PihtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS52ZXJzaW9uVGV4dFRhZyk7CisgICAgICAgICAgICBhdWRpby5hZEdhaW5DZW50ZXIgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5hdWRpbygpLmFkR2FpbkNlbnRlcik7CisgICAgICAgICAgICBhdWRpby5hZEdhaW5Gcm9udCA9IHN0YXRpY19jYXN0PGludDhfdD4obWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmF1ZGlvKCkuYWRHYWluRnJvbnQpOworICAgICAgICAgICAgYXVkaW8uYWRHYWluU3Vycm91bmQgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ4X3Q+KG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5hdWRpbygpLmFkR2FpblN1cnJvdW5kKTsKKyAgICAgICAgICAgIG1lZGlhLmV4dHJhTWV0YURhdGEuc2V0PERlbXV4RmlsdGVyTWVkaWFFdmVudEV4dHJhTWV0YURhdGE6OmF1ZGlvPihhdWRpbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZWRpYS5leHRyYU1ldGFEYXRhLnNldDxEZW11eEZpbHRlck1lZGlhRXZlbnRFeHRyYU1ldGFEYXRhOjpub2luaXQ+KHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1lZGlhRXZlbnQuYXZNZW1vcnkuZ2V0TmF0aXZlSGFuZGxlKCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbWVkaWEuYXZNZW1vcnkgPSBkdXBUb0FpZGwobWVkaWFFdmVudC5hdk1lbW9yeS5nZXROYXRpdmVIYW5kbGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBEZW11eEZpbHRlckV2ZW50IGZpbHRlckV2ZW50OworICAgICAgICBmaWx0ZXJFdmVudC5zZXQ8RGVtdXhGaWx0ZXJFdmVudDo6bWVkaWE+KG1vdmUobWVkaWEpKTsKKyAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKGZpbHRlckV2ZW50KSk7CisgICAgfQorfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFNlY3Rpb25FdmVudCgKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBIaWRsRGVtdXhGaWx0ZXJTZWN0aW9uRXZlbnQmIHNlY3Rpb25FdmVudCA9IGV2ZW50c1tpXS5zZWN0aW9uKCk7CisgICAgICAgIERlbXV4RmlsdGVyU2VjdGlvbkV2ZW50IHNlY3Rpb247CisKKyAgICAgICAgc2VjdGlvbi50YWJsZUlkID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2VjdGlvbkV2ZW50LnRhYmxlSWQpOworICAgICAgICBzZWN0aW9uLnZlcnNpb24gPSBzdGF0aWNfY2FzdDxpbnQzMl90PihzZWN0aW9uRXZlbnQudmVyc2lvbik7CisgICAgICAgIHNlY3Rpb24uc2VjdGlvbk51bSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHNlY3Rpb25FdmVudC5zZWN0aW9uTnVtKTsKKyAgICAgICAgc2VjdGlvbi5kYXRhTGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oc2VjdGlvbkV2ZW50LmRhdGFMZW5ndGgpOworCisgICAgICAgIERlbXV4RmlsdGVyRXZlbnQgZmlsdGVyRXZlbnQ7CisgICAgICAgIGZpbHRlckV2ZW50LnNldDxEZW11eEZpbHRlckV2ZW50OjpzZWN0aW9uPihtb3ZlKHNlY3Rpb24pKTsKKyAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKGZpbHRlckV2ZW50KSk7CisgICAgfQorfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFBlc0V2ZW50KGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgSGlkbERlbXV4RmlsdGVyUGVzRXZlbnQmIHBlc0V2ZW50ID0gZXZlbnRzW2ldLnBlcygpOworICAgICAgICBEZW11eEZpbHRlclBlc0V2ZW50IHBlczsKKworICAgICAgICBwZXMuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihwZXNFdmVudC5zdHJlYW1JZCk7CisgICAgICAgIHBlcy5kYXRhTGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ocGVzRXZlbnQuZGF0YUxlbmd0aCk7CisgICAgICAgIHBlcy5tcHVTZXF1ZW5jZU51bWJlciA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHBlc0V2ZW50Lm1wdVNlcXVlbmNlTnVtYmVyKTsKKworICAgICAgICBEZW11eEZpbHRlckV2ZW50IGZpbHRlckV2ZW50OworICAgICAgICBmaWx0ZXJFdmVudC5zZXQ8RGVtdXhGaWx0ZXJFdmVudDo6cGVzPihtb3ZlKHBlcykpOworICAgICAgICByZXMucHVzaF9iYWNrKG1vdmUoZmlsdGVyRXZlbnQpKTsKKyAgICB9Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0VHNSZWNvcmRFdmVudCgKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBEZW11eEZpbHRlclRzUmVjb3JkRXZlbnQgdHNSZWNvcmQ7CisgICAgICAgIGNvbnN0IEhpZGxEZW11eEZpbHRlclRzUmVjb3JkRXZlbnQmIHRzUmVjb3JkRXZlbnQgPSBldmVudHNbaV0udHNSZWNvcmQoKTsKKworICAgICAgICBEZW11eEZpbHRlclNjSW5kZXhNYXNrIHNjSW5kZXhNYXNrOworICAgICAgICBpZiAodHNSZWNvcmRFdmVudC5zY0luZGV4TWFzay5nZXREaXNjcmltaW5hdG9yKCkgPT0KKyAgICAgICAgICAgIEhpZGxEZW11eEZpbHRlclRzUmVjb3JkRXZlbnQ6OlNjSW5kZXhNYXNrOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnNjKSB7CisgICAgICAgICAgICBpbnQzMl90IGhpZGxTY0luZGV4ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odHNSZWNvcmRFdmVudC5zY0luZGV4TWFzay5zYygpKTsKKyAgICAgICAgICAgIGlmIChoaWRsU2NJbmRleCA8PSBzdGF0aWNfY2FzdDxpbnQzMl90PihEZW11eFNjSW5kZXg6OlNFUVVFTkNFKSkgeworICAgICAgICAgICAgICAgIHNjSW5kZXhNYXNrLnNldDxEZW11eEZpbHRlclNjSW5kZXhNYXNrOjpzY0luZGV4PihoaWRsU2NJbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEhJREwgSEFMIHN0YXJ0aW5nIGZyb20gMSA8PCA0OyBBSURMIHN0YXJ0aW5nIGZyb20gMSA8PCAwLgorICAgICAgICAgICAgICAgIHNjSW5kZXhNYXNrLnNldDxEZW11eEZpbHRlclNjSW5kZXhNYXNrOjpzY0F2Yz4oaGlkbFNjSW5kZXggPj4gNCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHNSZWNvcmRFdmVudC5zY0luZGV4TWFzay5nZXREaXNjcmltaW5hdG9yKCkgPT0KKyAgICAgICAgICAgICAgICAgICBIaWRsRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50OjpTY0luZGV4TWFzazo6aGlkbF9kaXNjcmltaW5hdG9yOjpzY0hldmMpIHsKKyAgICAgICAgICAgIHNjSW5kZXhNYXNrLnNldDxEZW11eEZpbHRlclNjSW5kZXhNYXNrOjpzY0hldmM+KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0c1JlY29yZEV2ZW50LnNjSW5kZXhNYXNrLnNjSGV2YygpKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHNSZWNvcmRFdmVudC5waWQuZ2V0RGlzY3JpbWluYXRvcigpID09IEhpZGxEZW11eFBpZDo6aGlkbF9kaXNjcmltaW5hdG9yOjp0UGlkKSB7CisgICAgICAgICAgICBEZW11eFBpZCBwaWQ7CisgICAgICAgICAgICBwaWQuc2V0PERlbXV4UGlkOjp0UGlkPihzdGF0aWNfY2FzdDxpbnQzMl90Pih0c1JlY29yZEV2ZW50LnBpZC50UGlkKCkpKTsKKyAgICAgICAgICAgIHRzUmVjb3JkLnBpZCA9IHBpZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIERlbXV4UGlkIHBpZDsKKyAgICAgICAgICAgIHBpZC5zZXQ8RGVtdXhQaWQ6OnRQaWQ+KHN0YXRpY19jYXN0PGludDMyX3Q+KENvbnN0YW50OjpJTlZBTElEX1RTX1BJRCkpOworICAgICAgICAgICAgdHNSZWNvcmQucGlkID0gcGlkOworICAgICAgICB9CisKKyAgICAgICAgdHNSZWNvcmQuc2NJbmRleE1hc2sgPSBzY0luZGV4TWFzazsKKyAgICAgICAgdHNSZWNvcmQudHNJbmRleE1hc2sgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0c1JlY29yZEV2ZW50LnRzSW5kZXhNYXNrKTsKKyAgICAgICAgdHNSZWNvcmQuYnl0ZU51bWJlciA9IHN0YXRpY19jYXN0PGludDY0X3Q+KHRzUmVjb3JkRXZlbnQuYnl0ZU51bWJlcik7CisKKyAgICAgICAgaWYgKGV2ZW50c0V4dC5zaXplKCkgPiBpICYmCisgICAgICAgICAgICBldmVudHNFeHRbaV0uZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICAgICAgICAgIEhpZGxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjp0c1JlY29yZCkgeworICAgICAgICAgICAgdHNSZWNvcmQucHRzID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oZXZlbnRzRXh0W2ldLnRzUmVjb3JkKCkucHRzKTsKKyAgICAgICAgICAgIHRzUmVjb3JkLmZpcnN0TWJJblNsaWNlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZXZlbnRzRXh0W2ldLnRzUmVjb3JkKCkuZmlyc3RNYkluU2xpY2UpOworICAgICAgICB9CisKKyAgICAgICAgRGVtdXhGaWx0ZXJFdmVudCBmaWx0ZXJFdmVudDsKKyAgICAgICAgZmlsdGVyRXZlbnQuc2V0PERlbXV4RmlsdGVyRXZlbnQ6OnRzUmVjb3JkPihtb3ZlKHRzUmVjb3JkKSk7CisgICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZShmaWx0ZXJFdmVudCkpOworICAgIH0KK30KKwordm9pZCBUdW5lckhpZGxGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRNbXRwUmVjb3JkRXZlbnQoCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCisgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRGVtdXhGaWx0ZXJNbXRwUmVjb3JkRXZlbnQgbW10cFJlY29yZDsKKyAgICAgICAgY29uc3QgSGlkbERlbXV4RmlsdGVyTW10cFJlY29yZEV2ZW50JiBtbXRwUmVjb3JkRXZlbnQgPSBldmVudHNbaV0ubW10cFJlY29yZCgpOworCisgICAgICAgIG1tdHBSZWNvcmQuc2NIZXZjSW5kZXhNYXNrID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obW10cFJlY29yZEV2ZW50LnNjSGV2Y0luZGV4TWFzayk7CisgICAgICAgIG1tdHBSZWNvcmQuYnl0ZU51bWJlciA9IHN0YXRpY19jYXN0PGludDY0X3Q+KG1tdHBSZWNvcmRFdmVudC5ieXRlTnVtYmVyKTsKKworICAgICAgICBpZiAoZXZlbnRzRXh0LnNpemUoKSA+IGkgJiYKKyAgICAgICAgICAgIGV2ZW50c0V4dFtpXS5nZXREaXNjcmltaW5hdG9yKCkgPT0KKyAgICAgICAgICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1tdHBSZWNvcmQpIHsKKyAgICAgICAgICAgIG1tdHBSZWNvcmQucHRzID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oZXZlbnRzRXh0W2ldLm1tdHBSZWNvcmQoKS5wdHMpOworICAgICAgICAgICAgbW10cFJlY29yZC5tcHVTZXF1ZW5jZU51bWJlciA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGV2ZW50c0V4dFtpXS5tbXRwUmVjb3JkKCkubXB1U2VxdWVuY2VOdW1iZXIpOworICAgICAgICAgICAgbW10cFJlY29yZC5maXJzdE1iSW5TbGljZSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGV2ZW50c0V4dFtpXS5tbXRwUmVjb3JkKCkuZmlyc3RNYkluU2xpY2UpOworICAgICAgICAgICAgbW10cFJlY29yZC50c0luZGV4TWFzayA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGV2ZW50c0V4dFtpXS5tbXRwUmVjb3JkKCkudHNJbmRleE1hc2spOworICAgICAgICB9CisKKyAgICAgICAgRGVtdXhGaWx0ZXJFdmVudCBmaWx0ZXJFdmVudDsKKyAgICAgICAgZmlsdGVyRXZlbnQuc2V0PERlbXV4RmlsdGVyRXZlbnQ6Om1tdHBSZWNvcmQ+KG1vdmUobW10cFJlY29yZCkpOworICAgICAgICByZXMucHVzaF9iYWNrKG1vdmUoZmlsdGVyRXZlbnQpKTsKKyAgICB9Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0RG93bmxvYWRFdmVudCgKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBIaWRsRGVtdXhGaWx0ZXJEb3dubG9hZEV2ZW50JiBkb3dubG9hZEV2ZW50ID0gZXZlbnRzW2ldLmRvd25sb2FkKCk7CisgICAgICAgIERlbXV4RmlsdGVyRG93bmxvYWRFdmVudCBkb3dubG9hZDsKKworICAgICAgICBkb3dubG9hZC5pdGVtSWQgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pihkb3dubG9hZEV2ZW50Lml0ZW1JZCk7CisgICAgICAgIGRvd25sb2FkLmRvd25sb2FkSWQgPSAtMTsKKyAgICAgICAgZG93bmxvYWQuaXRlbUZyYWdtZW50SW5kZXggPSBzdGF0aWNfY2FzdDxpbnQzMl90Pihkb3dubG9hZEV2ZW50Lml0ZW1GcmFnbWVudEluZGV4KTsKKyAgICAgICAgZG93bmxvYWQubXB1U2VxdWVuY2VOdW1iZXIgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pihkb3dubG9hZEV2ZW50Lm1wdVNlcXVlbmNlTnVtYmVyKTsKKyAgICAgICAgZG93bmxvYWQubGFzdEl0ZW1GcmFnbWVudEluZGV4ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZG93bmxvYWRFdmVudC5sYXN0SXRlbUZyYWdtZW50SW5kZXgpOworICAgICAgICBkb3dubG9hZC5kYXRhTGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZG93bmxvYWRFdmVudC5kYXRhTGVuZ3RoKTsKKworICAgICAgICBEZW11eEZpbHRlckV2ZW50IGZpbHRlckV2ZW50OworICAgICAgICBmaWx0ZXJFdmVudC5zZXQ8RGVtdXhGaWx0ZXJFdmVudDo6ZG93bmxvYWQ+KG1vdmUoZG93bmxvYWQpKTsKKyAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKGZpbHRlckV2ZW50KSk7CisgICAgfQorfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldElwUGF5bG9hZEV2ZW50KAorICAgICAgICBjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLCB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEhpZGxEZW11eEZpbHRlcklwUGF5bG9hZEV2ZW50JiBpcFBheWxvYWRFdmVudCA9IGV2ZW50c1tpXS5pcFBheWxvYWQoKTsKKyAgICAgICAgRGVtdXhGaWx0ZXJJcFBheWxvYWRFdmVudCBpcFBheWxvYWQ7CisKKyAgICAgICAgaXBQYXlsb2FkLmRhdGFMZW5ndGggPSBzdGF0aWNfY2FzdDxpbnQzMl90PihpcFBheWxvYWRFdmVudC5kYXRhTGVuZ3RoKTsKKworICAgICAgICBEZW11eEZpbHRlckV2ZW50IGZpbHRlckV2ZW50OworICAgICAgICBmaWx0ZXJFdmVudC5zZXQ8RGVtdXhGaWx0ZXJFdmVudDo6aXBQYXlsb2FkPihtb3ZlKGlwUGF5bG9hZCkpOworICAgICAgICByZXMucHVzaF9iYWNrKG1vdmUoZmlsdGVyRXZlbnQpKTsKKyAgICB9Cit9CisKK3ZvaWQgVHVuZXJIaWRsRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0VGVtaUV2ZW50KAorICAgICAgICBjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLCB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEhpZGxEZW11eEZpbHRlclRlbWlFdmVudCYgdGVtaUV2ZW50ID0gZXZlbnRzW2ldLnRlbWkoKTsKKyAgICAgICAgRGVtdXhGaWx0ZXJUZW1pRXZlbnQgdGVtaTsKKworICAgICAgICB0ZW1pLnB0cyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KHRlbWlFdmVudC5wdHMpOworICAgICAgICB0ZW1pLmRlc2NyVGFnID0gc3RhdGljX2Nhc3Q8aW50OF90Pih0ZW1pRXZlbnQuZGVzY3JUYWcpOworICAgICAgICB2ZWN0b3I8dWludDhfdD4gZGVzY3JEYXRhID0gdGVtaUV2ZW50LmRlc2NyRGF0YTsKKyAgICAgICAgdGVtaS5kZXNjckRhdGEucmVzaXplKGRlc2NyRGF0YS5zaXplKCkpOworICAgICAgICBjb3B5KGRlc2NyRGF0YS5iZWdpbigpLCBkZXNjckRhdGEuZW5kKCksIHRlbWkuZGVzY3JEYXRhLmJlZ2luKCkpOworCisgICAgICAgIERlbXV4RmlsdGVyRXZlbnQgZmlsdGVyRXZlbnQ7CisgICAgICAgIGZpbHRlckV2ZW50LnNldDxEZW11eEZpbHRlckV2ZW50Ojp0ZW1pPihtb3ZlKHRlbWkpKTsKKyAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKGZpbHRlckV2ZW50KSk7CisgICAgfQorfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldE1vbml0b3JFdmVudCgKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpIHsKKyAgICBIaWRsRGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQgbW9uaXRvckV2ZW50ID0gZXZlbnRzRXh0WzBdLm1vbml0b3JFdmVudCgpOworICAgIERlbXV4RmlsdGVyTW9uaXRvckV2ZW50IG1vbml0b3I7CisKKyAgICBzd2l0Y2ggKG1vbml0b3JFdmVudC5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICBjYXNlIEhpZGxEZW11eEZpbHRlck1vbml0b3JFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzY3JhbWJsaW5nU3RhdHVzOiB7CisgICAgICAgIG1vbml0b3Iuc2V0PERlbXV4RmlsdGVyTW9uaXRvckV2ZW50OjpzY3JhbWJsaW5nU3RhdHVzPigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTY3JhbWJsaW5nU3RhdHVzPihtb25pdG9yRXZlbnQuc2NyYW1ibGluZ1N0YXR1cygpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEhpZGxEZW11eEZpbHRlck1vbml0b3JFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpjaWQ6IHsKKyAgICAgICAgbW9uaXRvci5zZXQ8RGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQ6OmNpZD4oc3RhdGljX2Nhc3Q8aW50MzJfdD4obW9uaXRvckV2ZW50LmNpZCgpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisKKyAgICBEZW11eEZpbHRlckV2ZW50IGZpbHRlckV2ZW50OworICAgIGZpbHRlckV2ZW50LnNldDxEZW11eEZpbHRlckV2ZW50Ojptb25pdG9yRXZlbnQ+KG1vdmUobW9uaXRvcikpOworICAgIHJlcy5wdXNoX2JhY2sobW92ZShmaWx0ZXJFdmVudCkpOworfQorCit2b2lkIFR1bmVySGlkbEZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFJlc3RhcnRFdmVudCgKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpIHsKKyAgICBEZW11eEZpbHRlckV2ZW50IGZpbHRlckV2ZW50OworICAgIGZpbHRlckV2ZW50LnNldDxEZW11eEZpbHRlckV2ZW50OjpzdGFydElkPihzdGF0aWNfY2FzdDxpbnQzMl90PihldmVudHNFeHRbMF0uc3RhcnRJZCgpKSk7CisgICAgcmVzLnB1c2hfYmFjayhtb3ZlKGZpbHRlckV2ZW50KSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxGaWx0ZXIuaCBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNjN2ExYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRmlsdGVyLmgKQEAgLTAsMCArMSwyNDEgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJISURMRklMVEVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExGSUxURVJfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0F2U3RyZWFtVHlwZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlckF2U2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJEb3dubG9hZFNldHRpbmdzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyRXZlbnQuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJQZXNEYXRhU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlclNlY3Rpb25TZXR0aW5ncy5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9EZW11eEZpbHRlclNldHRpbmdzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyU3RhdHVzLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyVHlwZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyRmlsdGVyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZpbHRlckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSVR1bmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvSUZpbHRlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4xL0lGaWx0ZXJDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4xL3R5cGVzLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKKyNpbmNsdWRlIDxtYXA+CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6TmF0aXZlSGFuZGxlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6Ok1RRGVzY3JpcHRvcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkF2U3RyZWFtVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJBdlNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclJlY29yZFNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkRlbXV4RmlsdGVyVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhJcEFkZHJlc3NJcEFkZHJlc3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZpbHRlckRlbGF5SGludDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6Qm5UdW5lckZpbHRlcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRmlsdGVyQ2FsbGJhY2s7Cit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4OwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6c3RkOjpzaGFyZWRfcHRyOwordXNpbmcgOjpzdGQ6OnN0cmluZzsKK3VzaW5nIDo6c3RkOjp2ZWN0b3I7CisKK3VzaW5nIEhpZGxBdlN0cmVhbVR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkF2U3RyZWFtVHlwZTsKK3VzaW5nIEhpZGxEZW11eEFscEZpbHRlclNldHRpbmdzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEFscEZpbHRlclNldHRpbmdzOwordXNpbmcgSGlkbERlbXV4RmlsdGVyQXZTZXR0aW5ncyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJBdlNldHRpbmdzOwordXNpbmcgSGlkbERlbXV4RmlsdGVyRG93bmxvYWRFdmVudCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJEb3dubG9hZEV2ZW50OwordXNpbmcgSGlkbERlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5ncyA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJEb3dubG9hZFNldHRpbmdzOwordXNpbmcgSGlkbERlbXV4RmlsdGVySXBQYXlsb2FkRXZlbnQgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVySXBQYXlsb2FkRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJFdmVudCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJFdmVudDsKK3VzaW5nIEhpZGxEZW11eEZpbHRlck1lZGlhRXZlbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyTWVkaWFFdmVudDsKK3VzaW5nIEhpZGxEZW11eEZpbHRlck1tdHBSZWNvcmRFdmVudCA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJNbXRwUmVjb3JkRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJQZXNEYXRhU2V0dGluZ3MgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzOwordXNpbmcgSGlkbERlbXV4RmlsdGVyUGVzRXZlbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyUGVzRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5nczsKK3VzaW5nIEhpZGxEZW11eEZpbHRlclNlY3Rpb25FdmVudCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJTZWN0aW9uRXZlbnQ7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3MgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzOwordXNpbmcgSGlkbERlbXV4RmlsdGVyU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyU2V0dGluZ3M7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyU3RhdHVzOwordXNpbmcgSGlkbERlbXV4RmlsdGVyVGVtaUV2ZW50ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclRlbWlFdmVudDsKK3VzaW5nIEhpZGxEZW11eEZpbHRlclRzUmVjb3JkRXZlbnQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyVHNSZWNvcmRFdmVudDsKK3VzaW5nIEhpZGxEZW11eElwRmlsdGVyU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4SXBGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIEhpZGxEZW11eE1tdHBGaWx0ZXJTZXR0aW5ncyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhNbXRwRmlsdGVyU2V0dGluZ3M7Cit1c2luZyBIaWRsRGVtdXhUbHZGaWx0ZXJTZXR0aW5ncyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhUbHZGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIEhpZGxEZW11eFRzRmlsdGVyU2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4VHNGaWx0ZXJTZXR0aW5nczsKK3VzaW5nIEhpZGxEZW11eFBpZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhQaWQ7Cit1c2luZyBIaWRsSUZpbHRlciA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUZpbHRlcjsKK3VzaW5nIEhpZGxEdlN0cmVhbVR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkF2U3RyZWFtVHlwZTsKK3VzaW5nIEhpZGxEZW11eEZpbHRlckV2ZW50RXh0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpEZW11eEZpbHRlckV2ZW50RXh0OwordXNpbmcgSGlkbERlbXV4RmlsdGVyTW9uaXRvckV2ZW50ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpEZW11eEZpbHRlck1vbml0b3JFdmVudDsKK3VzaW5nIEhpZGxEZW11eEZpbHRlclRzUmVjb3JkRXZlbnRFeHQgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkRlbXV4RmlsdGVyVHNSZWNvcmRFdmVudEV4dDsKK3VzaW5nIEhpZGxJRmlsdGVyQ2FsbGJhY2sgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklGaWx0ZXJDYWxsYmFjazsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCit1c2luZyBNUURlc2MgPSBNUURlc2NyaXB0b3JTeW5jPHVpbnQ4X3Q+OwordXNpbmcgQWlkbE1RRGVzYyA9IE1RRGVzY3JpcHRvcjxpbnQ4X3QsIFN5bmNocm9uaXplZFJlYWRXcml0ZT47CisKK2NvbnN0IHN0YXRpYyBpbnQgSVBfVjRfTEVOR1RIID0gNDsKK2NvbnN0IHN0YXRpYyBpbnQgSVBfVjZfTEVOR1RIID0gMTY7CisKK2NsYXNzIFR1bmVySGlkbEZpbHRlciA6IHB1YmxpYyBCblR1bmVyRmlsdGVyIHsKK3B1YmxpYzoKKyAgICBjbGFzcyBGaWx0ZXJDYWxsYmFjayA6IHB1YmxpYyBIaWRsSUZpbHRlckNhbGxiYWNrIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEZpbHRlckNhbGxiYWNrKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+IHR1bmVyRmlsdGVyQ2FsbGJhY2spCisgICAgICAgICAgICAgIDogbVR1bmVyRmlsdGVyQ2FsbGJhY2sodHVuZXJGaWx0ZXJDYWxsYmFjayl7fTsKKworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkZpbHRlckV2ZW50KGNvbnN0IEhpZGxEZW11eEZpbHRlckV2ZW50JiBmaWx0ZXJFdmVudCk7CisgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRmlsdGVyRXZlbnRfMV8xKGNvbnN0IEhpZGxEZW11eEZpbHRlckV2ZW50JiBmaWx0ZXJFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSGlkbERlbXV4RmlsdGVyRXZlbnRFeHQmIGZpbHRlckV2ZW50RXh0KTsKKyAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25GaWx0ZXJTdGF0dXMoSGlkbERlbXV4RmlsdGVyU3RhdHVzIHN0YXR1cyk7CisKKyAgICAgICAgdm9pZCBzZW5kU2hhcmVkRmlsdGVyU3RhdHVzKGludDMyX3Qgc3RhdHVzKTsKKyAgICAgICAgdm9pZCBhdHRhY2hTaGFyZWRGaWx0ZXJDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgaW5fY2IpOworICAgICAgICB2b2lkIGRldGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKCk7CisgICAgICAgIHZvaWQgZGV0YWNoQ2FsbGJhY2tzKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIGdldEFpZGxGaWx0ZXJFdmVudChjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIGFpZGxFdmVudHMpOworCisgICAgICAgIHZvaWQgZ2V0TWVkaWFFdmVudChjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpOworICAgICAgICB2b2lkIGdldFNlY3Rpb25FdmVudChjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcyk7CisgICAgICAgIHZvaWQgZ2V0UGVzRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcyk7CisgICAgICAgIHZvaWQgZ2V0VHNSZWNvcmRFdmVudChjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKTsKKyAgICAgICAgdm9pZCBnZXRNbXRwUmVjb3JkRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpOworICAgICAgICB2b2lkIGdldERvd25sb2FkRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKTsKKyAgICAgICAgdm9pZCBnZXRJcFBheWxvYWRFdmVudChjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKTsKKyAgICAgICAgdm9pZCBnZXRUZW1pRXZlbnQoY29uc3QgdmVjdG9yPEhpZGxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ+JiByZXMpOworICAgICAgICB2b2lkIGdldE1vbml0b3JFdmVudChjb25zdCB2ZWN0b3I8SGlkbERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4mIHJlcyk7CisgICAgICAgIHZvaWQgZ2V0UmVzdGFydEV2ZW50KGNvbnN0IHZlY3RvcjxIaWRsRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgcmVzKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+IG1UdW5lckZpbHRlckNhbGxiYWNrOworICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiBtT3JpZ2luYWxDYWxsYmFjazsKKyAgICAgICAgTXV0ZXggbUNhbGxiYWNrTG9jazsKKyAgICB9OworCisgICAgVHVuZXJIaWRsRmlsdGVyKHNwPEhpZGxJRmlsdGVyPiBmaWx0ZXIsIHNwPEZpbHRlckNhbGxiYWNrPiBjYiwgRGVtdXhGaWx0ZXJUeXBlIHR5cGUpOworICAgIHZpcnR1YWwgflR1bmVySGlkbEZpbHRlcigpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0SWQoaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRJZDY0Qml0KGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0UXVldWVEZXNjKEFpZGxNUURlc2MqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY29uZmlndXJlKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIGluX3NldHRpbmdzKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjb25maWd1cmVNb25pdG9yRXZlbnQoaW50MzJfdCBpbl9tb25pdG9yRXZlbnRUeXBlcykgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY29uZmlndXJlSXBGaWx0ZXJDb250ZXh0SWQoaW50MzJfdCBpbl9jaWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNvbmZpZ3VyZUF2U3RyZWFtVHlwZShjb25zdCBBdlN0cmVhbVR5cGUmIGluX2F2U3RyZWFtVHlwZSkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0QXZTaGFyZWRIYW5kbGUoTmF0aXZlSGFuZGxlKiBvdXRfYXZNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyByZWxlYXNlQXZIYW5kbGUoY29uc3QgTmF0aXZlSGFuZGxlJiBpbl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgaW5fYXZEYXRhSWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldERhdGFTb3VyY2UoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBpbl9maWx0ZXIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RvcCgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGZsdXNoKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBhY3F1aXJlU2hhcmVkRmlsdGVyVG9rZW4oc3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGZyZWVTaGFyZWRGaWx0ZXJUb2tlbihjb25zdCBzdHJpbmcmIGluX2ZpbHRlclRva2VuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRGaWx0ZXJUeXBlKERlbXV4RmlsdGVyVHlwZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXREZWxheUhpbnQoY29uc3QgRmlsdGVyRGVsYXlIaW50JiBpbl9oaW50KSBvdmVycmlkZTsKKworICAgIGJvb2wgaXNTaGFyZWRGaWx0ZXJBbGxvd2VkKGludDMyX3QgcGlkKTsKKyAgICB2b2lkIGF0dGFjaFNoYXJlZEZpbHRlckNhbGxiYWNrKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBpbl9jYik7CisgICAgc3A8SGlkbElGaWx0ZXI+IGdldEhhbEZpbHRlcigpOworCitwcml2YXRlOgorICAgIGJvb2wgaXNBdWRpb0ZpbHRlcigpOworICAgIGJvb2wgaXNWaWRlb0ZpbHRlcigpOworCisgICAgSGlkbERlbXV4RmlsdGVyQXZTZXR0aW5ncyBnZXRIaWRsQXZTZXR0aW5ncyhjb25zdCBEZW11eEZpbHRlckF2U2V0dGluZ3MmIHNldHRpbmdzKTsKKyAgICBIaWRsRGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3MgZ2V0SGlkbFNlY3Rpb25TZXR0aW5ncygKKyAgICAgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyU2VjdGlvblNldHRpbmdzJiBzZXR0aW5ncyk7CisgICAgSGlkbERlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzIGdldEhpZGxQZXNEYXRhU2V0dGluZ3MoCisgICAgICAgICAgICBjb25zdCBEZW11eEZpbHRlclBlc0RhdGFTZXR0aW5ncyYgc2V0dGluZ3MpOworICAgIEhpZGxEZW11eEZpbHRlclJlY29yZFNldHRpbmdzIGdldEhpZGxSZWNvcmRTZXR0aW5ncyhjb25zdCBEZW11eEZpbHRlclJlY29yZFNldHRpbmdzJiBzZXR0aW5ncyk7CisgICAgSGlkbERlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5ncyBnZXRIaWRsRG93bmxvYWRTZXR0aW5ncygKKyAgICAgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5ncyYgc2V0dGluZ3MpOworICAgIGJvb2wgZ2V0SGlkbEF2U3RyZWFtVHlwZShjb25zdCBBdlN0cmVhbVR5cGUgYXZTdHJlYW1UeXBlLCBIaWRsQXZTdHJlYW1UeXBlJiB0eXBlKTsKKyAgICB2b2lkIGdldEhpZGxUc1NldHRpbmdzKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyU2V0dGluZ3MmIGhpZGxTZXR0aW5ncyk7CisgICAgdm9pZCBnZXRIaWRsTW10cFNldHRpbmdzKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWRsRGVtdXhGaWx0ZXJTZXR0aW5ncyYgaGlkbFNldHRpbmdzKTsKKyAgICB2b2lkIGdldEhpZGxJcFNldHRpbmdzKGNvbnN0IERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyU2V0dGluZ3MmIGhpZGxTZXR0aW5ncyk7CisgICAgdm9pZCBnZXRIaWRsVGx2U2V0dGluZ3MoY29uc3QgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyU2V0dGluZ3MmIGhpZGxTZXR0aW5ncyk7CisgICAgdm9pZCBnZXRIaWRsQWxwU2V0dGluZ3MoY29uc3QgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbERlbXV4RmlsdGVyU2V0dGluZ3MmIGhpZGxTZXR0aW5ncyk7CisKKyAgICBoaWRsX2FycmF5PHVpbnQ4X3QsIElQX1Y0X0xFTkdUSD4gZ2V0SXBWNEFkZHJlc3MoY29uc3QgRGVtdXhJcEFkZHJlc3NJcEFkZHJlc3MmIGFkZHIpOworICAgIGhpZGxfYXJyYXk8dWludDhfdCwgSVBfVjZfTEVOR1RIPiBnZXRJcFY2QWRkcmVzcyhjb25zdCBEZW11eElwQWRkcmVzc0lwQWRkcmVzcyYgYWRkcik7CisKKyAgICBzcDxIaWRsSUZpbHRlcj4gbUZpbHRlcjsKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklGaWx0ZXI+IG1GaWx0ZXJfMV8xOworICAgIGludDMyX3QgbUlkOworICAgIGludDY0X3QgbUlkNjRCaXQ7CisgICAgRGVtdXhGaWx0ZXJUeXBlIG1UeXBlOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgYm9vbCBtU2hhcmVkOworICAgIGludDMyX3QgbUNsaWVudFBpZDsKKyAgICBzcDxGaWx0ZXJDYWxsYmFjaz4gbUZpbHRlckNhbGxiYWNrOworICAgIE11dGV4IG1Mb2NrOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHR1bmVyCit9ICAvLyBuYW1lc3BhY2UgdHYKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhaWRsCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkhJRExGSUxURVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxGcm9udGVuZC5jcHAgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbEZyb250ZW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzk1N2YzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxGcm9udGVuZC5jcHAKQEAgLTAsMCArMSwxMjI0IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJUdW5lckhpZGxGcm9udGVuZCIKKworI2luY2x1ZGUgIlR1bmVySGlkbEZyb250ZW5kLmgiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvUmVzdWx0Lmg+CisKKyNpbmNsdWRlICJUdW5lckhpZGxMbmIuaCIKKyNpbmNsdWRlICJUdW5lckhpZGxTZXJ2aWNlLmgiCisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBbmFsb2dTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBbmFsb2dTaWZTdGFuZGFyZDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBbmFsb2dUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEF0c2MzQmFuZHdpZHRoOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEF0c2MzQ29kZVJhdGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQXRzYzNGZWM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQXRzYzNNb2R1bGF0aW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQXRzYzNTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBdHNjM1RpbWVJbnRlcmxlYXZlTW9kZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBdHNjTW9kdWxhdGlvbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRBdHNjU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQmFuZHdpZHRoOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZENhYmxlVGltZUludGVybGVhdmVNb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER0bWJCYW5kd2lkdGg7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHRtYkd1YXJkSW50ZXJ2YWw7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHRtYk1vZHVsYXRpb247Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHRtYlNldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER0bWJUaW1lSW50ZXJsZWF2ZU1vZGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHRtYlRyYW5zbWlzc2lvbk1vZGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZiY0FubmV4OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YmNCYW5kd2lkdGg7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZiY01vZHVsYXRpb247Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZiY1NldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YnNNb2R1bGF0aW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YnNSb2xsb2ZmOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YnNTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJzU3RhbmRhcmQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZidEJhbmR3aWR0aDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJ0Q29uc3RlbGxhdGlvbjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJ0R3VhcmRJbnRlcnZhbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJ0SGllcmFyY2h5OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YnRTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJ0U3RhbmRhcmQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZidFRyYW5zbWlzc2lvbk1vZGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kR3VhcmRJbnRlcnZhbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJbm5lckZlYzsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJbnRlcmxlYXZlTW9kZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2RiczNNb2R1bGF0aW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJzM1JvbGxvZmY7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSXNkYnMzU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSXNkYnNNb2R1bGF0aW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJzUm9sbG9mZjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2Ric1NldHRpbmdzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJ0QmFuZHdpZHRoOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJ0Q29kZXJhdGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSXNkYnRHdWFyZEludGVydmFsOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJ0TW9kZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRJc2RidE1vZHVsYXRpb247Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSXNkYnRTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRNb2R1bGF0aW9uOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kUm9sbE9mZjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFNjYW5NZXNzYWdlU3RhbmRhcmQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb247Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU3RhdHVzQXRzYzNQbHBJbmZvOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlc3VsdDsKKwordXNpbmcgSGlkbEZyb250ZW5kU3RhdHVzQXRzYzNQbHBJbmZvID0KKyAgICAgICAgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFN0YXR1c0F0c2MzUGxwSW5mbzsKK3VzaW5nIEhpZGxGcm9udGVuZEFuYWxvZ1NpZlN0YW5kYXJkID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEFuYWxvZ1NpZlN0YW5kYXJkOwordXNpbmcgSGlkbEZyb250ZW5kQW5hbG9nVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBbmFsb2dUeXBlOwordXNpbmcgSGlkbEZyb250ZW5kQXRzY01vZHVsYXRpb24gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzY01vZHVsYXRpb247Cit1c2luZyBIaWRsRnJvbnRlbmRBdHNjM0JhbmR3aWR0aCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM0JhbmR3aWR0aDsKK3VzaW5nIEhpZGxGcm9udGVuZEF0c2MzQ29kZVJhdGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNDb2RlUmF0ZTsKK3VzaW5nIEhpZGxGcm9udGVuZEF0c2MzRGVtb2RPdXRwdXRGb3JtYXQgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNEZW1vZE91dHB1dEZvcm1hdDsKK3VzaW5nIEhpZGxGcm9udGVuZEF0c2MzRmVjID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzRmVjOwordXNpbmcgSGlkbEZyb250ZW5kQXRzYzNNb2R1bGF0aW9uID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzTW9kdWxhdGlvbjsKK3VzaW5nIEhpZGxGcm9udGVuZEF0c2MzVGltZUludGVybGVhdmVNb2RlID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzVGltZUludGVybGVhdmVNb2RlOwordXNpbmcgSGlkbEZyb250ZW5kRHZiY0FubmV4ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YmNBbm5leDsKK3VzaW5nIEhpZGxGcm9udGVuZER2YmNNb2R1bGF0aW9uID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YmNNb2R1bGF0aW9uOwordXNpbmcgSGlkbEZyb250ZW5kRHZiY091dGVyRmVjID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YmNPdXRlckZlYzsKK3VzaW5nIEhpZGxGcm9udGVuZER2YmNTcGVjdHJhbEludmVyc2lvbiA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJjU3BlY3RyYWxJbnZlcnNpb247Cit1c2luZyBIaWRsRnJvbnRlbmREdmJzTW9kdWxhdGlvbiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzTW9kdWxhdGlvbjsKK3VzaW5nIEhpZGxGcm9udGVuZER2YnNQaWxvdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzUGlsb3Q7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJzUm9sbG9mZiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzUm9sbG9mZjsKK3VzaW5nIEhpZGxGcm9udGVuZER2YnNTZXR0aW5ncyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzU2V0dGluZ3M7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJzU3RhbmRhcmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1N0YW5kYXJkOwordXNpbmcgSGlkbEZyb250ZW5kRHZic1ZjbU1vZGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1ZjbU1vZGU7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJ0QmFuZHdpZHRoID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRCYW5kd2lkdGg7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJ0Q29kZXJhdGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidENvZGVyYXRlOwordXNpbmcgSGlkbEZyb250ZW5kRHZidENvbnN0ZWxsYXRpb24gPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidENvbnN0ZWxsYXRpb247Cit1c2luZyBIaWRsRnJvbnRlbmREdmJ0R3VhcmRJbnRlcnZhbCA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0R3VhcmRJbnRlcnZhbDsKK3VzaW5nIEhpZGxGcm9udGVuZER2YnRIaWVyYXJjaHkgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidEhpZXJhcmNoeTsKK3VzaW5nIEhpZGxGcm9udGVuZER2YnRQbHBNb2RlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRQbHBNb2RlOwordXNpbmcgSGlkbEZyb250ZW5kRHZidFNldHRpbmdzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRTZXR0aW5nczsKK3VzaW5nIEhpZGxGcm9udGVuZER2YnRTdGFuZGFyZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0U3RhbmRhcmQ7Cit1c2luZyBIaWRsRnJvbnRlbmREdmJ0VHJhbnNtaXNzaW9uTW9kZSA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0VHJhbnNtaXNzaW9uTW9kZTsKK3VzaW5nIEhpZGxGcm9udGVuZElubmVyRmVjID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElubmVyRmVjOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnMzQ29kZXJhdGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnMzQ29kZXJhdGU7Cit1c2luZyBIaWRsRnJvbnRlbmRJc2RiczNNb2R1bGF0aW9uID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzM01vZHVsYXRpb247Cit1c2luZyBIaWRsRnJvbnRlbmRJc2RiczNSb2xsb2ZmID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzM1JvbGxvZmY7Cit1c2luZyBIaWRsRnJvbnRlbmRJc2RiczNTZXR0aW5ncyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RiczNTZXR0aW5nczsKK3VzaW5nIEhpZGxGcm9udGVuZElzZGJzQ29kZXJhdGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnNDb2RlcmF0ZTsKK3VzaW5nIEhpZGxGcm9udGVuZElzZGJzTW9kdWxhdGlvbiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2Ric01vZHVsYXRpb247Cit1c2luZyBIaWRsRnJvbnRlbmRJc2Ric1JvbGxvZmYgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnNSb2xsb2ZmOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnNTZXR0aW5ncyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2Ric1NldHRpbmdzOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnNTdHJlYW1JZFR5cGUgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnNTdHJlYW1JZFR5cGU7Cit1c2luZyBIaWRsRnJvbnRlbmRJc2RidEJhbmR3aWR0aCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RidEJhbmR3aWR0aDsKK3VzaW5nIEhpZGxGcm9udGVuZElzZGJ0Q29kZXJhdGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnRDb2RlcmF0ZTsKK3VzaW5nIEhpZGxGcm9udGVuZElzZGJ0R3VhcmRJbnRlcnZhbCA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RidEd1YXJkSW50ZXJ2YWw7Cit1c2luZyBIaWRsRnJvbnRlbmRJc2RidE1vZGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnRNb2RlOwordXNpbmcgSGlkbEZyb250ZW5kSXNkYnRNb2R1bGF0aW9uID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0TW9kdWxhdGlvbjsKK3VzaW5nIEhpZGxGcm9udGVuZElzZGJ0U2V0dGluZ3MgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnRTZXR0aW5nczsKK3VzaW5nIEhpZGxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kTW9kdWxhdGlvblN0YXR1czsKK3VzaW5nIEhpZGxGcm9udGVuZFNjYW5BdHNjM1BscEluZm8gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kU2NhbkF0c2MzUGxwSW5mbzsKK3VzaW5nIEhpZGxGcm9udGVuZFNjYW5UeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNjYW5UeXBlOwordXNpbmcgSGlkbEZyb250ZW5kU3RhdHVzVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTdGF0dXNUeXBlOwordXNpbmcgSGlkbFJlc3VsdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OwordXNpbmcgSGlkbEZyb250ZW5kQW5hbG9nQWZ0RmxhZyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRBbmFsb2dBZnRGbGFnOwordXNpbmcgSGlkbEZyb250ZW5kQmFuZHdpZHRoID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZEJhbmR3aWR0aDsKK3VzaW5nIEhpZGxGcm9udGVuZENhYmxlVGltZUludGVybGVhdmVNb2RlID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZENhYmxlVGltZUludGVybGVhdmVNb2RlOwordXNpbmcgSGlkbEZyb250ZW5kRHZiY0JhbmR3aWR0aCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdmJjQmFuZHdpZHRoOwordXNpbmcgSGlkbEZyb250ZW5kRHRtYkJhbmR3aWR0aCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdG1iQmFuZHdpZHRoOwordXNpbmcgSGlkbEZyb250ZW5kRHRtYkNvZGVSYXRlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJDb2RlUmF0ZTsKK3VzaW5nIEhpZGxGcm9udGVuZER0bWJHdWFyZEludGVydmFsID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJHdWFyZEludGVydmFsOwordXNpbmcgSGlkbEZyb250ZW5kRHRtYk1vZHVsYXRpb24gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYk1vZHVsYXRpb247Cit1c2luZyBIaWRsRnJvbnRlbmREdG1iVGltZUludGVybGVhdmVNb2RlID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJUaW1lSW50ZXJsZWF2ZU1vZGU7Cit1c2luZyBIaWRsRnJvbnRlbmREdG1iVHJhbnNtaXNzaW9uTW9kZSA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdG1iVHJhbnNtaXNzaW9uTW9kZTsKK3VzaW5nIEhpZGxGcm9udGVuZER2YnNTY2FuVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdmJzU2NhblR5cGU7Cit1c2luZyBIaWRsRnJvbnRlbmRHdWFyZEludGVydmFsID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZEd1YXJkSW50ZXJ2YWw7Cit1c2luZyBIaWRsRnJvbnRlbmRJbnRlcmxlYXZlTW9kZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRJbnRlcmxlYXZlTW9kZTsKK3VzaW5nIEhpZGxGcm9udGVuZE1vZHVsYXRpb24gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kTW9kdWxhdGlvbjsKK3VzaW5nIEhpZGxGcm9udGVuZFJvbGxPZmYgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kUm9sbE9mZjsKK3VzaW5nIEhpZGxGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTsKK3VzaW5nIEhpZGxGcm9udGVuZFNwZWN0cmFsSW52ZXJzaW9uID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZFNwZWN0cmFsSW52ZXJzaW9uOwordXNpbmcgSGlkbEZyb250ZW5kU3RhdHVzVHlwZUV4dDFfMSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRTdGF0dXNUeXBlRXh0MV8xOworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK1R1bmVySGlkbEZyb250ZW5kOjpUdW5lckhpZGxGcm9udGVuZChzcDxIaWRsSUZyb250ZW5kPiBmcm9udGVuZCwgaW50IGlkKSB7CisgICAgbUZyb250ZW5kID0gZnJvbnRlbmQ7CisgICAgbUZyb250ZW5kXzFfMSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6SUZyb250ZW5kOjpjYXN0RnJvbShtRnJvbnRlbmQpOworICAgIG1JZCA9IGlkOworfQorCitUdW5lckhpZGxGcm9udGVuZDo6flR1bmVySGlkbEZyb250ZW5kKCkgeworICAgIG1Gcm9udGVuZCA9IG51bGxwdHI7CisgICAgbUZyb250ZW5kXzFfMSA9IG51bGxwdHI7CisgICAgbUlkID0gLTE7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZyb250ZW5kOjpzZXRDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZENhbGxiYWNrPiYgdHVuZXJGcm9udGVuZENhbGxiYWNrKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAodHVuZXJGcm9udGVuZENhbGxiYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CisgICAgfQorCisgICAgc3A8SGlkbElGcm9udGVuZENhbGxiYWNrPiBmcm9udGVuZENhbGxiYWNrID0gbmV3IEZyb250ZW5kQ2FsbGJhY2sodHVuZXJGcm9udGVuZENhbGxiYWNrKTsKKyAgICBIaWRsUmVzdWx0IHN0YXR1cyA9IG1Gcm9udGVuZC0+c2V0Q2FsbGJhY2soZnJvbnRlbmRDYWxsYmFjayk7CisgICAgaWYgKHN0YXR1cyA9PSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRnJvbnRlbmQ6OnR1bmUoY29uc3QgRnJvbnRlbmRTZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzOworICAgIEhpZGxGcm9udGVuZFNldHRpbmdzIGZyb250ZW5kU2V0dGluZ3M7CisgICAgSGlkbEZyb250ZW5kU2V0dGluZ3NFeHQxXzEgZnJvbnRlbmRTZXR0aW5nc0V4dDsKKyAgICBnZXRIaWRsRnJvbnRlbmRTZXR0aW5ncyhzZXR0aW5ncywgZnJvbnRlbmRTZXR0aW5ncywgZnJvbnRlbmRTZXR0aW5nc0V4dCk7CisgICAgaWYgKG1Gcm9udGVuZF8xXzEgIT0gbnVsbHB0cikgeworICAgICAgICBzdGF0dXMgPSBtRnJvbnRlbmRfMV8xLT50dW5lXzFfMShmcm9udGVuZFNldHRpbmdzLCBmcm9udGVuZFNldHRpbmdzRXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBtRnJvbnRlbmQtPnR1bmUoZnJvbnRlbmRTZXR0aW5ncyk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZyb250ZW5kOjpzdG9wVHVuZSgpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kLT5zdG9wVHVuZSgpOworICAgIGlmIChzdGF0dXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZyb250ZW5kOjpzY2FuKGNvbnN0IEZyb250ZW5kU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJvbnRlbmRTY2FuVHlwZSBmcm9udGVuZFNjYW5UeXBlKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1czsKKyAgICBIaWRsRnJvbnRlbmRTZXR0aW5ncyBmcm9udGVuZFNldHRpbmdzOworICAgIEhpZGxGcm9udGVuZFNldHRpbmdzRXh0MV8xIGZyb250ZW5kU2V0dGluZ3NFeHQ7CisgICAgZ2V0SGlkbEZyb250ZW5kU2V0dGluZ3Moc2V0dGluZ3MsIGZyb250ZW5kU2V0dGluZ3MsIGZyb250ZW5kU2V0dGluZ3NFeHQpOworICAgIGlmIChtRnJvbnRlbmRfMV8xICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3RhdHVzID0gbUZyb250ZW5kXzFfMS0+c2Nhbl8xXzEoZnJvbnRlbmRTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kU2NhblR5cGU+KGZyb250ZW5kU2NhblR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzRXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBtRnJvbnRlbmQtPnNjYW4oZnJvbnRlbmRTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZFNjYW5UeXBlPihmcm9udGVuZFNjYW5UeXBlKSk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZyb250ZW5kOjpzdG9wU2NhbigpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kLT5zdG9wU2NhbigpOworICAgIGlmIChzdGF0dXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZyb250ZW5kOjpzZXRMbmIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJMbmI+JiBsbmIpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChsbmIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlQpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1cyA9IG1Gcm9udGVuZC0+c2V0TG5iKHN0YXRpY19jYXN0PFR1bmVySGlkbExuYio+KGxuYi5nZXQoKSktPmdldElkKCkpOworICAgIGlmIChzdGF0dXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZyb250ZW5kOjpsaW5rQ2lDYW1Ub0Zyb250ZW5kKGludDMyX3QgY2lDYW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGlmIChtRnJvbnRlbmRfMV8xID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIklGcm9udGVuZF8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpbnQgbHRzSWQ7CisgICAgSGlkbFJlc3VsdCBzdGF0dXM7CisgICAgbUZyb250ZW5kXzFfMS0+bGlua0NpQ2FtKHN0YXRpY19jYXN0PHVpbnQzMl90PihjaUNhbUlkKSwgWyZdKEhpZGxSZXN1bHQgciwgdWludDMyX3QgaWQpIHsKKyAgICAgICAgc3RhdHVzID0gcjsKKyAgICAgICAgbHRzSWQgPSBpZDsKKyAgICB9KTsKKworICAgIGlmIChzdGF0dXMgPT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gbHRzSWQ7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRnJvbnRlbmQ6OnVubGlua0NpQ2FtVG9Gcm9udGVuZChpbnQzMl90IGNpQ2FtSWQpIHsKKyAgICBpZiAobUZyb250ZW5kXzFfMSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmRfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmRfMV8xLT51bmxpbmtDaUNhbShjaUNhbUlkKTsKKyAgICBpZiAoc3RhdHVzID09IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6Y2xvc2UoKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBUdW5lckhpZGxTZXJ2aWNlOjpnZXRUdW5lclNlcnZpY2UoKS0+cmVtb3ZlRnJvbnRlbmQodGhpcy0+cmVmPFR1bmVySGlkbEZyb250ZW5kPigpKTsKKworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kLT5jbG9zZSgpOworICAgIG1Gcm9udGVuZCA9IG51bGxwdHI7CisgICAgbUZyb250ZW5kXzFfMSA9IG51bGxwdHI7CisKKyAgICBpZiAoc3RhdHVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgfQorCisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6Z2V0U3RhdHVzKGNvbnN0IHZlY3RvcjxGcm9udGVuZFN0YXR1c1R5cGU+JiBpbl9zdGF0dXNUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlczsKKyAgICB2ZWN0b3I8SGlkbEZyb250ZW5kU3RhdHVzPiBzdGF0dXM7CisgICAgdmVjdG9yPEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMT4gc3RhdHVzRXh0OworICAgIHZlY3RvcjxIaWRsRnJvbnRlbmRTdGF0dXNUeXBlPiB0eXBlczsKKyAgICB2ZWN0b3I8SGlkbEZyb250ZW5kU3RhdHVzVHlwZUV4dDFfMT4gdHlwZXNFeHQ7CisgICAgZm9yIChhdXRvIHMgOiBpbl9zdGF0dXNUeXBlcykgeworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50MzJfdD4ocykgPD0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KEhpZGxGcm9udGVuZFN0YXR1c1R5cGU6OkFUU0MzX1BMUF9JTkZPKSkgeworICAgICAgICAgICAgdHlwZXMucHVzaF9iYWNrKHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZFN0YXR1c1R5cGU+KHMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHR5cGVzRXh0LnB1c2hfYmFjayhzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRTdGF0dXNUeXBlRXh0MV8xPihzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtRnJvbnRlbmQtPmdldFN0YXR1cyh0eXBlcywgWyZdKEhpZGxSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8SGlkbEZyb250ZW5kU3RhdHVzPiYgc3MpIHsKKyAgICAgICAgcmVzID0gcjsKKyAgICAgICAgZm9yIChhdXRvIHMgOiBzcykgeworICAgICAgICAgICAgc3RhdHVzLnB1c2hfYmFjayhzKTsKKyAgICAgICAgfQorICAgIH0pOworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICBpZiAobUZyb250ZW5kXzFfMSAhPSBudWxscHRyKSB7CisgICAgICAgIG1Gcm9udGVuZF8xXzEtPmdldFN0YXR1c0V4dDFfMSgKKyAgICAgICAgICAgICAgICB0eXBlc0V4dCwgWyZdKEhpZGxSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8SGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xPiYgc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gcjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIHMgOiBzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzRXh0LnB1c2hfYmFjayhzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgICAgICB9CisgICAgfQorCisgICAgZ2V0QWlkbEZyb250ZW5kU3RhdHVzKHN0YXR1cywgc3RhdHVzRXh0LCAqX2FpZGxfcmV0dXJuKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZyb250ZW5kOjpnZXRGcm9udGVuZElkKGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBtSWQ7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxGcm9udGVuZDo6Z2V0SGFyZHdhcmVJbmZvKHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBfYWlkbF9yZXR1cm4tPmNsZWFyKCk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbEZyb250ZW5kOjpyZW1vdmVPdXRwdXRQaWQoaW50MzJfdCAvKiBpbl9waWQgKi8pIHsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsRnJvbnRlbmQ6OmdldEZyb250ZW5kU3RhdHVzUmVhZGluZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxGcm9udGVuZFN0YXR1c1R5cGU+JiAvKiBpbl9zdGF0dXNUeXBlcyAqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8RnJvbnRlbmRTdGF0dXNSZWFkaW5lc3M+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBfYWlkbF9yZXR1cm4tPmNsZWFyKCk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7Cit9CisKK3ZvaWQgVHVuZXJIaWRsRnJvbnRlbmQ6OnNldExuYShib29sIGJFbmFibGUpIHsKKyAgICBpZiAobUZyb250ZW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1Gcm9udGVuZC0+c2V0TG5hKGJFbmFibGUpOworfQorCisvLy8vLy8vLy8vLy8vLy8gRnJvbnRlbmRDYWxsYmFjayAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUmV0dXJuPHZvaWQ+IFR1bmVySGlkbEZyb250ZW5kOjpGcm9udGVuZENhbGxiYWNrOjpvbkV2ZW50KEhpZGxGcm9udGVuZEV2ZW50VHlwZSBmcm9udGVuZEV2ZW50VHlwZSkgeworICAgIEFMT0dWKCJGcm9udGVuZENhbGxiYWNrOjpvbkV2ZW50LCB0eXBlPSVkIiwgZnJvbnRlbmRFdmVudFR5cGUpOworICAgIG1UdW5lckZyb250ZW5kQ2FsbGJhY2stPm9uRXZlbnQoc3RhdGljX2Nhc3Q8RnJvbnRlbmRFdmVudFR5cGU+KGZyb250ZW5kRXZlbnRUeXBlKSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IFR1bmVySGlkbEZyb250ZW5kOjpGcm9udGVuZENhbGxiYWNrOjpvblNjYW5NZXNzYWdlKAorICAgICAgICBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGUgdHlwZSwgY29uc3QgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgICBBTE9HVigiRnJvbnRlbmRDYWxsYmFjazo6b25TY2FuTWVzc2FnZSwgdHlwZT0lZCIsIHR5cGUpOworICAgIEZyb250ZW5kU2Nhbk1lc3NhZ2Ugc2Nhbk1lc3NhZ2U7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkxPQ0tFRDogeworICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6aXNMb2NrZWQ+KG1lc3NhZ2UuaXNMb2NrZWQoKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6RU5EOiB7CisgICAgICAgIHNjYW5NZXNzYWdlLnNldDxGcm9udGVuZFNjYW5NZXNzYWdlOjppc0VuZD4obWVzc2FnZS5pc0VuZCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpQUk9HUkVTU19QRVJDRU5UOiB7CisgICAgICAgIHNjYW5NZXNzYWdlLnNldDxGcm9udGVuZFNjYW5NZXNzYWdlOjpwcm9ncmVzc1BlcmNlbnQ+KG1lc3NhZ2UucHJvZ3Jlc3NQZXJjZW50KCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkZSRVFVRU5DWTogeworICAgICAgICBjb25zdCB2ZWN0b3I8dWludDMyX3Q+JiBmID0gbWVzc2FnZS5mcmVxdWVuY2llcygpOworICAgICAgICB2ZWN0b3I8aW50NjRfdD4gbGYoYmVnaW4oZiksIGVuZChmKSk7CisgICAgICAgIHNjYW5NZXNzYWdlLnNldDxGcm9udGVuZFNjYW5NZXNzYWdlOjpmcmVxdWVuY2llcz4obGYpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OlNZTUJPTF9SQVRFOiB7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx1aW50MzJfdD4mIHMgPSBtZXNzYWdlLnN5bWJvbFJhdGVzKCk7CisgICAgICAgIHZlY3RvcjxpbnQzMl90PiBzeW1ib2xSYXRlcyhiZWdpbihzKSwgZW5kKHMpKTsKKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6OnN5bWJvbFJhdGVzPihzeW1ib2xSYXRlcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6SElFUkFSQ0hZOiB7CisgICAgICAgIHNjYW5NZXNzYWdlLnNldDxGcm9udGVuZFNjYW5NZXNzYWdlOjpoaWVyYXJjaHk+KAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kRHZidEhpZXJhcmNoeT4obWVzc2FnZS5oaWVyYXJjaHkoKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkFOQUxPR19UWVBFOiB7CisgICAgICAgIHNjYW5NZXNzYWdlLnNldDxGcm9udGVuZFNjYW5NZXNzYWdlOjphbmFsb2dUeXBlPigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZEFuYWxvZ1R5cGU+KG1lc3NhZ2UuYW5hbG9nVHlwZSgpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6UExQX0lEUzogeworICAgICAgICBjb25zdCB2ZWN0b3I8dWludDhfdD4mIHAgPSBtZXNzYWdlLnBscElkcygpOworICAgICAgICB2ZWN0b3I8aW50MzJfdD4gcGxwSWRzKGJlZ2luKHApLCBlbmQocCkpOworICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6cGxwSWRzPihwbHBJZHMpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkdST1VQX0lEUzogeworICAgICAgICBjb25zdCB2ZWN0b3I8dWludDhfdD4mIGcgPSBtZXNzYWdlLmdyb3VwSWRzKCk7CisgICAgICAgIHZlY3RvcjxpbnQzMl90PiBncm91cElkcyhiZWdpbihnKSwgZW5kKGcpKTsKKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6Omdyb3VwSWRzPihncm91cElkcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6SU5QVVRfU1RSRUFNX0lEUzogeworICAgICAgICBjb25zdCB2ZWN0b3I8dWludDE2X3Q+JiBpID0gbWVzc2FnZS5pbnB1dFN0cmVhbUlkcygpOworICAgICAgICB2ZWN0b3I8aW50MzJfdD4gc3RyZWFtSWRzKGJlZ2luKGkpLCBlbmQoaSkpOworICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6aW5wdXRTdHJlYW1JZHM+KHN0cmVhbUlkcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6U1RBTkRBUkQ6IHsKKyAgICAgICAgY29uc3QgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2U6OlN0YW5kYXJkJiBzdGQgPSBtZXNzYWdlLnN0ZCgpOworICAgICAgICBGcm9udGVuZFNjYW5NZXNzYWdlU3RhbmRhcmQgc3RhbmRhcmQ7CisgICAgICAgIGlmIChzdGQuZ2V0RGlzY3JpbWluYXRvcigpID09IEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlOjpTdGFuZGFyZDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzU3RkKSB7CisgICAgICAgICAgICBzdGFuZGFyZC5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZVN0YW5kYXJkOjpzU3RkPigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzU3RhbmRhcmQ+KHN0ZC5zU3RkKCkpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGQuZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICAgICAgICAgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2U6OlN0YW5kYXJkOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRTdGQpIHsKKyAgICAgICAgICAgIHN0YW5kYXJkLnNldDxGcm9udGVuZFNjYW5NZXNzYWdlU3RhbmRhcmQ6OnRTdGQ+KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRTdGFuZGFyZD4oc3RkLnRTdGQoKSkpOworICAgICAgICB9IGVsc2UgaWYgKHN0ZC5nZXREaXNjcmltaW5hdG9yKCkgPT0KKyAgICAgICAgICAgICAgICAgICBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZTo6U3RhbmRhcmQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2lmU3RkKSB7CisgICAgICAgICAgICBzdGFuZGFyZC5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZVN0YW5kYXJkOjpzaWZTdGQ+KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZEFuYWxvZ1NpZlN0YW5kYXJkPihzdGQuc2lmU3RkKCkpKTsKKyAgICAgICAgfQorICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6c3RkPihzdGFuZGFyZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6QVRTQzNfUExQX0lORk86IHsKKyAgICAgICAgY29uc3QgdmVjdG9yPEhpZGxGcm9udGVuZFNjYW5BdHNjM1BscEluZm8+JiBwbHBJbmZvcyA9IG1lc3NhZ2UuYXRzYzNQbHBJbmZvcygpOworICAgICAgICB2ZWN0b3I8RnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvPiB0dW5lclBscEluZm9zOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBscEluZm9zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBGcm9udGVuZFNjYW5BdHNjM1BscEluZm8gcGxwSW5mb3sKKyAgICAgICAgICAgICAgICAgICAgLnBscElkID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ocGxwSW5mb3NbaV0ucGxwSWQpLAorICAgICAgICAgICAgICAgICAgICAuYkxsc0ZsYWcgPSBwbHBJbmZvc1tpXS5iTGxzRmxhZywKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0dW5lclBscEluZm9zLnB1c2hfYmFjayhwbHBJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6YXRzYzNQbHBJbmZvcz4odHVuZXJQbHBJbmZvcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbVR1bmVyRnJvbnRlbmRDYWxsYmFjay0+b25TY2FuTWVzc2FnZShzdGF0aWNfY2FzdDxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZT4odHlwZSksIHNjYW5NZXNzYWdlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gVHVuZXJIaWRsRnJvbnRlbmQ6OkZyb250ZW5kQ2FsbGJhY2s6Om9uU2Nhbk1lc3NhZ2VFeHQxXzEoCisgICAgICAgIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZUV4dDFfMSB0eXBlLCBjb25zdCBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZUV4dDFfMSYgbWVzc2FnZSkgeworICAgIEFMT0dWKCJvblNjYW5NZXNzYWdlRXh0MV8xOjpvblNjYW5NZXNzYWdlLCB0eXBlPSVkIiwgdHlwZSk7CisgICAgRnJvbnRlbmRTY2FuTWVzc2FnZSBzY2FuTWVzc2FnZTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZUV4dDFfMTo6TU9EVUxBVElPTjogeworICAgICAgICBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uIG0gPSBtZXNzYWdlLm1vZHVsYXRpb24oKTsKKyAgICAgICAgRnJvbnRlbmRNb2R1bGF0aW9uIG1vZHVsYXRpb247CisgICAgICAgIHN3aXRjaCAobS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmM6IHsKKyAgICAgICAgICAgIG1vZHVsYXRpb24uc2V0PEZyb250ZW5kTW9kdWxhdGlvbjo6ZHZiYz4oc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjTW9kdWxhdGlvbj4obS5kdmJjKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OiB7CisgICAgICAgICAgICBtb2R1bGF0aW9uLnNldDxGcm9udGVuZE1vZHVsYXRpb246OmR2YnQ+KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRDb25zdGVsbGF0aW9uPihtLmR2YnQoKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnM6IHsKKyAgICAgICAgICAgIG1vZHVsYXRpb24uc2V0PEZyb250ZW5kTW9kdWxhdGlvbjo6ZHZicz4oc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJzTW9kdWxhdGlvbj4obS5kdmJzKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczogeworICAgICAgICAgICAgbW9kdWxhdGlvbi5zZXQ8RnJvbnRlbmRNb2R1bGF0aW9uOjppc2Ricz4oCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnNNb2R1bGF0aW9uPihtLmlzZGJzKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczM6IHsKKyAgICAgICAgICAgIG1vZHVsYXRpb24uc2V0PEZyb250ZW5kTW9kdWxhdGlvbjo6aXNkYnMzPigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RiczNNb2R1bGF0aW9uPihtLmlzZGJzMygpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6IHsKKyAgICAgICAgICAgIG1vZHVsYXRpb24uc2V0PEZyb250ZW5kTW9kdWxhdGlvbjo6aXNkYnQ+KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJ0TW9kdWxhdGlvbj4obS5pc2RidCgpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzYzogeworICAgICAgICAgICAgbW9kdWxhdGlvbi5zZXQ8RnJvbnRlbmRNb2R1bGF0aW9uOjphdHNjPihzdGF0aWNfY2FzdDxGcm9udGVuZEF0c2NNb2R1bGF0aW9uPihtLmF0c2MoKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2MzOiB7CisgICAgICAgICAgICBtb2R1bGF0aW9uLnNldDxGcm9udGVuZE1vZHVsYXRpb246OmF0c2MzPigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjM01vZHVsYXRpb24+KG0uYXRzYzMoKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR0bWI6IHsKKyAgICAgICAgICAgIG1vZHVsYXRpb24uc2V0PEZyb250ZW5kTW9kdWxhdGlvbjo6ZHRtYj4oc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iTW9kdWxhdGlvbj4obS5kdG1iKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6Om1vZHVsYXRpb24+KG1vZHVsYXRpb24pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzE6OkRWQkNfQU5ORVg6IHsKKyAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PEZyb250ZW5kU2Nhbk1lc3NhZ2U6OmFubmV4PigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YmNBbm5leD4obWVzc2FnZS5hbm5leCgpKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZUV4dDFfMTo6SElHSF9QUklPUklUWTogeworICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8RnJvbnRlbmRTY2FuTWVzc2FnZTo6aXNIaWdoUHJpb3JpdHk+KG1lc3NhZ2UuaXNIaWdoUHJpb3JpdHkoKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgbVR1bmVyRnJvbnRlbmRDYWxsYmFjay0+b25TY2FuTWVzc2FnZShzdGF0aWNfY2FzdDxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZT4odHlwZSksIHNjYW5NZXNzYWdlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvLy8vLy8vLy8vLy8vLy8gVHVuZXJIaWRsRnJvbnRlbmQgSGVscGVyIE1ldGhvZHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3ZvaWQgVHVuZXJIaWRsRnJvbnRlbmQ6OmdldEFpZGxGcm9udGVuZFN0YXR1cyhjb25zdCB2ZWN0b3I8SGlkbEZyb250ZW5kU3RhdHVzPiYgaGlkbFN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8SGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xPiYgaGlkbFN0YXR1c0V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRTdGF0dXM+JiBhaWRsU3RhdHVzKSB7CisgICAgZm9yIChIaWRsRnJvbnRlbmRTdGF0dXMgcyA6IGhpZGxTdGF0dXMpIHsKKyAgICAgICAgRnJvbnRlbmRTdGF0dXMgc3RhdHVzOworICAgICAgICBzd2l0Y2ggKHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzRGVtb2RMb2NrZWQ6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OmlzRGVtb2RMb2NrZWQ+KHMuaXNEZW1vZExvY2tlZCgpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpzbnI6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OnNucj4oKGludClzLnNucigpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpiZXI6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OmJlcj4oKGludClzLmJlcigpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpwZXI6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OnBlcj4oKGludClzLnBlcigpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpwcmVCZXI6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OnByZUJlcj4oKGludClzLnByZUJlcigpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpzaWduYWxRdWFsaXR5OiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpzaWduYWxRdWFsaXR5PigoaW50KXMuc2lnbmFsUXVhbGl0eSgpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpzaWduYWxTdHJlbmd0aDogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6c2lnbmFsU3RyZW5ndGg+KChpbnQpcy5zaWduYWxTdHJlbmd0aCgpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpzeW1ib2xSYXRlOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpzeW1ib2xSYXRlPigoaW50KXMuc3ltYm9sUmF0ZSgpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppbm5lckZlYzogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6aW5uZXJGZWM+KHN0YXRpY19jYXN0PEZyb250ZW5kSW5uZXJGZWM+KHMuaW5uZXJGZWMoKSkpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1vZHVsYXRpb246IHsKKyAgICAgICAgICAgIEZyb250ZW5kTW9kdWxhdGlvblN0YXR1cyBtb2R1bGF0aW9uU3RhdHVzOworICAgICAgICAgICAgc3dpdGNoIChzLm1vZHVsYXRpb24oKS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvblN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJjOgorICAgICAgICAgICAgICAgIG1vZHVsYXRpb25TdGF0dXMuc2V0PEZyb250ZW5kTW9kdWxhdGlvblN0YXR1czo6ZHZiYz4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YmNNb2R1bGF0aW9uPihzLm1vZHVsYXRpb24oKS5kdmJjKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvblN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzOgorICAgICAgICAgICAgICAgIG1vZHVsYXRpb25TdGF0dXMuc2V0PEZyb250ZW5kTW9kdWxhdGlvblN0YXR1czo6ZHZicz4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnNNb2R1bGF0aW9uPihzLm1vZHVsYXRpb24oKS5kdmJzKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvblN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczoKKyAgICAgICAgICAgICAgICBtb2R1bGF0aW9uU3RhdHVzLnNldDxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmlzZGJzPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnNNb2R1bGF0aW9uPihzLm1vZHVsYXRpb24oKS5pc2RicygpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnMzOgorICAgICAgICAgICAgICAgIG1vZHVsYXRpb25TdGF0dXMuc2V0PEZyb250ZW5kTW9kdWxhdGlvblN0YXR1czo6aXNkYnMzPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnMzTW9kdWxhdGlvbj4ocy5tb2R1bGF0aW9uKCkuaXNkYnMzKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvblN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidDoKKyAgICAgICAgICAgICAgICBtb2R1bGF0aW9uU3RhdHVzLnNldDxGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmlzZGJ0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnRNb2R1bGF0aW9uPihzLm1vZHVsYXRpb24oKS5pc2RidCgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjptb2R1bGF0aW9uU3RhdHVzPihtb2R1bGF0aW9uU3RhdHVzKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppbnZlcnNpb246IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OmludmVyc2lvbj4oCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb24+KHMuaW52ZXJzaW9uKCkpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpsbmJWb2x0YWdlOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpsbmJWb2x0YWdlPihzdGF0aWNfY2FzdDxMbmJWb2x0YWdlPihzLmxuYlZvbHRhZ2UoKSkpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBscElkOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpwbHBJZD4oKGludDMyX3Qpcy5wbHBJZCgpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc0VXQlM6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OmlzRVdCUz4ocy5pc0VXQlMoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6YWdjOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjphZ2M+KChpbnQzMl90KXMuYWdjKCkpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzTG5hT246IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OmlzTG5hT24+KHMuaXNMbmFPbigpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc0xheWVyRXJyb3I6IHsKKyAgICAgICAgICAgIHZlY3Rvcjxib29sPiBlKHMuaXNMYXllckVycm9yKCkuYmVnaW4oKSwgcy5pc0xheWVyRXJyb3IoKS5lbmQoKSk7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppc0xheWVyRXJyb3I+KGUpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1lcjogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6bWVyPihzdGF0aWNfY2FzdDxpbnQzMl90PihzLm1lcigpKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZnJlcU9mZnNldDogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6ZnJlcU9mZnNldD4oc3RhdGljX2Nhc3Q8aW50NjRfdD4ocy5mcmVxT2Zmc2V0KCkpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpoaWVyYXJjaHk6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OmhpZXJhcmNoeT4oCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kRHZidEhpZXJhcmNoeT4ocy5oaWVyYXJjaHkoKSkpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzUmZMb2NrZWQ6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OmlzUmZMb2NrZWQ+KHMuaXNSZkxvY2tlZCgpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpwbHBJbmZvOiB7CisgICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRTdGF0dXNBdHNjM1BscEluZm8+IGluZm87CisgICAgICAgICAgICBmb3IgKGF1dG8gaSA6IHMucGxwSW5mbygpKSB7CisgICAgICAgICAgICAgICAgaW5mby5wdXNoX2JhY2soeworICAgICAgICAgICAgICAgICAgICAgICAgLnBscElkID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaS5wbHBJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAuaXNMb2NrZWQgPSBpLmlzTG9ja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgLnVlYyA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGkudWVjKSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OnBscEluZm8+KGluZm8pOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMSBzIDogaGlkbFN0YXR1c0V4dCkgeworICAgICAgICBGcm9udGVuZFN0YXR1cyBzdGF0dXM7CisgICAgICAgIHN3aXRjaCAocy5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6bW9kdWxhdGlvbnM6IHsKKyAgICAgICAgICAgIHZlY3RvcjxGcm9udGVuZE1vZHVsYXRpb24+IGFpZGxNb2Q7CisgICAgICAgICAgICBmb3IgKGF1dG8gbSA6IHMubW9kdWxhdGlvbnMoKSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiYzoKKyAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjTW9kdWxhdGlvbj4obS5kdmJjKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnM6CisgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kRHZic01vZHVsYXRpb24+KG0uZHZicygpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0OgorICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRDb25zdGVsbGF0aW9uPihtLmR2YnQoKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnM6CisgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnNNb2R1bGF0aW9uPihtLmlzZGJzKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzMzoKKyAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RiczNNb2R1bGF0aW9uPihtLmlzZGJzMygpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidDoKKyAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidE1vZHVsYXRpb24+KG0uaXNkYnQoKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzYzoKKyAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjTW9kdWxhdGlvbj4obS5hdHNjKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2MzOgorICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxGcm9udGVuZEF0c2MzTW9kdWxhdGlvbj4obS5hdHNjMygpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOgorICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxGcm9udGVuZER0bWJNb2R1bGF0aW9uPihtLmR0bWIoKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjptb2R1bGF0aW9ucz4oYWlkbE1vZCk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6YmVyczogeworICAgICAgICAgICAgdmVjdG9yPGludD4gYihzLmJlcnMoKS5iZWdpbigpLCBzLmJlcnMoKS5lbmQoKSk7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpiZXJzPihiKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjpjb2RlUmF0ZXM6IHsKKyAgICAgICAgICAgIHZlY3RvcjxGcm9udGVuZElubmVyRmVjPiBjb2RlUmF0ZXM7CisgICAgICAgICAgICBmb3IgKGF1dG8gYyA6IHMuY29kZVJhdGVzKCkpIHsKKyAgICAgICAgICAgICAgICBjb2RlUmF0ZXMucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kSW5uZXJGZWM+KGMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OmNvZGVSYXRlcz4oY29kZVJhdGVzKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjpiYW5kd2lkdGg6IHsKKyAgICAgICAgICAgIEZyb250ZW5kQmFuZHdpZHRoIGJhbmR3aWR0aDsKKyAgICAgICAgICAgIHN3aXRjaCAocy5iYW5kd2lkdGgoKS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kQmFuZHdpZHRoOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2MzOgorICAgICAgICAgICAgICAgIGJhbmR3aWR0aC5zZXQ8RnJvbnRlbmRCYW5kd2lkdGg6OmF0c2MzPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNCYW5kd2lkdGg+KHMuYmFuZHdpZHRoKCkuYXRzYzMoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRCYW5kd2lkdGg6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiYzoKKyAgICAgICAgICAgICAgICBiYW5kd2lkdGguc2V0PEZyb250ZW5kQmFuZHdpZHRoOjpkdmJjPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kRHZiY0JhbmR3aWR0aD4ocy5iYW5kd2lkdGgoKS5kdmJjKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kQmFuZHdpZHRoOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnQ6CisgICAgICAgICAgICAgICAgYmFuZHdpZHRoLnNldDxGcm9udGVuZEJhbmR3aWR0aDo6ZHZidD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRCYW5kd2lkdGg+KHMuYmFuZHdpZHRoKCkuZHZidCgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZEJhbmR3aWR0aDo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidDoKKyAgICAgICAgICAgICAgICBiYW5kd2lkdGguc2V0PEZyb250ZW5kQmFuZHdpZHRoOjppc2RidD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJ0QmFuZHdpZHRoPihzLmJhbmR3aWR0aCgpLmlzZGJ0KCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kQmFuZHdpZHRoOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR0bWI6CisgICAgICAgICAgICAgICAgYmFuZHdpZHRoLnNldDxGcm9udGVuZEJhbmR3aWR0aDo6ZHRtYj4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER0bWJCYW5kd2lkdGg+KHMuYmFuZHdpZHRoKCkuZHRtYigpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjpiYW5kd2lkdGg+KGJhbmR3aWR0aCk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6aW50ZXJ2YWw6IHsKKyAgICAgICAgICAgIEZyb250ZW5kR3VhcmRJbnRlcnZhbCBpbnRlcnZhbDsKKyAgICAgICAgICAgIHN3aXRjaCAocy5pbnRlcnZhbCgpLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRHdWFyZEludGVydmFsOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnQ6CisgICAgICAgICAgICAgICAgaW50ZXJ2YWwuc2V0PEZyb250ZW5kR3VhcmRJbnRlcnZhbDo6ZHZidD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRHdWFyZEludGVydmFsPihzLmludGVydmFsKCkuZHZidCgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZEd1YXJkSW50ZXJ2YWw6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6CisgICAgICAgICAgICAgICAgaW50ZXJ2YWwuc2V0PEZyb250ZW5kR3VhcmRJbnRlcnZhbDo6aXNkYnQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidEd1YXJkSW50ZXJ2YWw+KHMuaW50ZXJ2YWwoKS5pc2RidCgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZEd1YXJkSW50ZXJ2YWw6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHRtYjoKKyAgICAgICAgICAgICAgICBpbnRlcnZhbC5zZXQ8RnJvbnRlbmRHdWFyZEludGVydmFsOjpkdG1iPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kRHRtYkd1YXJkSW50ZXJ2YWw+KHMuaW50ZXJ2YWwoKS5kdG1iKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OmludGVydmFsPihpbnRlcnZhbCk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6dHJhbnNtaXNzaW9uTW9kZTogeworICAgICAgICAgICAgRnJvbnRlbmRUcmFuc21pc3Npb25Nb2RlIHRyYW5zbWlzc2lvbk1vZGU7CisgICAgICAgICAgICBzd2l0Y2ggKHMudHJhbnNtaXNzaW9uTW9kZSgpLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRUcmFuc21pc3Npb25Nb2RlOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnQ6CisgICAgICAgICAgICAgICAgdHJhbnNtaXNzaW9uTW9kZS5zZXQ8RnJvbnRlbmRUcmFuc21pc3Npb25Nb2RlOjpkdmJ0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kRHZidFRyYW5zbWlzc2lvbk1vZGU+KHMudHJhbnNtaXNzaW9uTW9kZSgpLmR2YnQoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRUcmFuc21pc3Npb25Nb2RlOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0OgorICAgICAgICAgICAgICAgIHRyYW5zbWlzc2lvbk1vZGUuc2V0PEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTo6aXNkYnQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidE1vZGU+KHMudHJhbnNtaXNzaW9uTW9kZSgpLmlzZGJ0KCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOgorICAgICAgICAgICAgICAgIHRyYW5zbWlzc2lvbk1vZGUuc2V0PEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTo6ZHRtYj4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZER0bWJUcmFuc21pc3Npb25Nb2RlPihzLnRyYW5zbWlzc2lvbk1vZGUoKS5kdG1iKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OnRyYW5zbWlzc2lvbk1vZGU+KHRyYW5zbWlzc2lvbk1vZGUpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnVlYzogeworICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6dWVjPihzdGF0aWNfY2FzdDxpbnQzMl90PihzLnVlYygpKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6c3lzdGVtSWQ6IHsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQ8RnJvbnRlbmRTdGF0dXM6OnN5c3RlbUlkPihzdGF0aWNfY2FzdDxpbnQzMl90PihzLnN5c3RlbUlkKCkpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjppbnRlcmxlYXZpbmc6IHsKKyAgICAgICAgICAgIHZlY3RvcjxGcm9udGVuZEludGVybGVhdmVNb2RlPiBhaWRsSW50ZXI7CisgICAgICAgICAgICBmb3IgKGF1dG8gaSA6IHMuaW50ZXJsZWF2aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBGcm9udGVuZEludGVybGVhdmVNb2RlIGxlYXZlTW9kZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGkuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRJbnRlcmxlYXZlTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjMzoKKyAgICAgICAgICAgICAgICAgICAgbGVhdmVNb2RlLnNldDxGcm9udGVuZEludGVybGVhdmVNb2RlOjphdHNjMz4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjM1RpbWVJbnRlcmxlYXZlTW9kZT4oaS5hdHNjMygpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kSW50ZXJsZWF2ZU1vZGU6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiYzoKKyAgICAgICAgICAgICAgICAgICAgbGVhdmVNb2RlLnNldDxGcm9udGVuZEludGVybGVhdmVNb2RlOjpkdmJjPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZENhYmxlVGltZUludGVybGVhdmVNb2RlPihpLmR2YmMoKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEhpZGxGcm9udGVuZEludGVybGVhdmVNb2RlOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR0bWI6CisgICAgICAgICAgICAgICAgICAgIGxlYXZlTW9kZS5zZXQ8RnJvbnRlbmRJbnRlcmxlYXZlTW9kZTo6ZHRtYj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iVGltZUludGVybGVhdmVNb2RlPihpLmR0bWIoKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWlkbEludGVyLnB1c2hfYmFjayhsZWF2ZU1vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6aW50ZXJsZWF2aW5nPihhaWRsSW50ZXIpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0U2VnbWVudDogeworICAgICAgICAgICAgY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBzZWcgPSBzLmlzZGJ0U2VnbWVudCgpOworICAgICAgICAgICAgdmVjdG9yPGludDMyX3Q+IGkoc2VnLmJlZ2luKCksIHNlZy5lbmQoKSk7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppc2RidFNlZ21lbnQ+KGkpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRzRGF0YVJhdGU6IHsKKyAgICAgICAgICAgIHZlY3RvcjxpbnQzMl90PiB0cyhzLnRzRGF0YVJhdGUoKS5iZWdpbigpLCBzLnRzRGF0YVJhdGUoKS5lbmQoKSk7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjp0c0RhdGFSYXRlPih0cyk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6cm9sbE9mZjogeworICAgICAgICAgICAgRnJvbnRlbmRSb2xsT2ZmIHJvbGxPZmY7CisgICAgICAgICAgICBzd2l0Y2ggKHMucm9sbE9mZigpLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRSb2xsT2ZmOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnM6CisgICAgICAgICAgICAgICAgcm9sbE9mZi5zZXQ8RnJvbnRlbmRSb2xsT2ZmOjpkdmJzPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kRHZic1JvbGxvZmY+KHMucm9sbE9mZigpLmR2YnMoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRSb2xsT2ZmOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzOgorICAgICAgICAgICAgICAgIHJvbGxPZmYuc2V0PEZyb250ZW5kUm9sbE9mZjo6aXNkYnM+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2Ric1JvbGxvZmY+KHMucm9sbE9mZigpLmlzZGJzKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kUm9sbE9mZjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczM6CisgICAgICAgICAgICAgICAgcm9sbE9mZi5zZXQ8RnJvbnRlbmRSb2xsT2ZmOjppc2RiczM+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RiczNSb2xsb2ZmPihzLnJvbGxPZmYoKS5pc2RiczMoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzLnNldDxGcm9udGVuZFN0YXR1czo6cm9sbE9mZj4ocm9sbE9mZik7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNNaXNvOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppc01pc28+KHMuaXNNaXNvKCkpOworICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgSGlkbEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzTGluZWFyOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppc0xpbmVhcj4ocy5pc0xpbmVhcigpKTsKKyAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjppc1Nob3J0RnJhbWVzOiB7CisgICAgICAgICAgICBzdGF0dXMuc2V0PEZyb250ZW5kU3RhdHVzOjppc1Nob3J0RnJhbWVzPihzLmlzU2hvcnRGcmFtZXMoKSk7CisgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworaGlkbF92ZWM8SGlkbEZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncz4gVHVuZXJIaWRsRnJvbnRlbmQ6OmdldEF0c2MzUGxwU2V0dGluZ3MoCisgICAgICAgIGNvbnN0IEZyb250ZW5kQXRzYzNTZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBpbnQgbGVuID0gc2V0dGluZ3MucGxwU2V0dGluZ3Muc2l6ZSgpOworICAgIGhpZGxfdmVjPEhpZGxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M+IHBscHMgPSBoaWRsX3ZlYzxIaWRsRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzPihsZW4pOworICAgIC8vIHBhcnNlIFBMUCBzZXR0aW5ncworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgdWludDhfdCBwbHBJZCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNldHRpbmdzLnBscFNldHRpbmdzW2ldLnBscElkKTsKKyAgICAgICAgSGlkbEZyb250ZW5kQXRzYzNNb2R1bGF0aW9uIG1vZHVsYXRpb24gPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZEF0c2MzTW9kdWxhdGlvbj4oc2V0dGluZ3MucGxwU2V0dGluZ3NbaV0ubW9kdWxhdGlvbik7CisgICAgICAgIEhpZGxGcm9udGVuZEF0c2MzVGltZUludGVybGVhdmVNb2RlIGludGVybGVhdmVNb2RlID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRBdHNjM1RpbWVJbnRlcmxlYXZlTW9kZT4oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5wbHBTZXR0aW5nc1tpXS5pbnRlcmxlYXZlTW9kZSk7CisgICAgICAgIEhpZGxGcm9udGVuZEF0c2MzQ29kZVJhdGUgY29kZVJhdGUgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZEF0c2MzQ29kZVJhdGU+KHNldHRpbmdzLnBscFNldHRpbmdzW2ldLmNvZGVSYXRlKTsKKyAgICAgICAgSGlkbEZyb250ZW5kQXRzYzNGZWMgZmVjID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kQXRzYzNGZWM+KHNldHRpbmdzLnBscFNldHRpbmdzW2ldLmZlYyk7CisgICAgICAgIEhpZGxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3MgZnJvbnRlbmRBdHNjM1BscFNldHRpbmdzeworICAgICAgICAgICAgICAgIC5wbHBJZCA9IHBscElkLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gbW9kdWxhdGlvbiwKKyAgICAgICAgICAgICAgICAuaW50ZXJsZWF2ZU1vZGUgPSBpbnRlcmxlYXZlTW9kZSwKKyAgICAgICAgICAgICAgICAuY29kZVJhdGUgPSBjb2RlUmF0ZSwKKyAgICAgICAgICAgICAgICAuZmVjID0gZmVjLAorICAgICAgICB9OworICAgICAgICBwbHBzW2ldID0gZnJvbnRlbmRBdHNjM1BscFNldHRpbmdzOworICAgIH0KKyAgICByZXR1cm4gcGxwczsKK30KKworSGlkbEZyb250ZW5kRHZic0NvZGVSYXRlIFR1bmVySGlkbEZyb250ZW5kOjpnZXREdmJzQ29kZVJhdGUoY29uc3QgRnJvbnRlbmREdmJzQ29kZVJhdGUmIGNvZGVSYXRlKSB7CisgICAgSGlkbEZyb250ZW5kSW5uZXJGZWMgaW5uZXJGZWMgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRJbm5lckZlYz4oY29kZVJhdGUuZmVjKTsKKyAgICBib29sIGlzTGluZWFyID0gY29kZVJhdGUuaXNMaW5lYXI7CisgICAgYm9vbCBpc1Nob3J0RnJhbWVzID0gY29kZVJhdGUuaXNTaG9ydEZyYW1lczsKKyAgICB1aW50MzJfdCBiaXRzUGVyMTAwMFN5bWJvbCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2RlUmF0ZS5iaXRzUGVyMTAwMFN5bWJvbCk7CisgICAgSGlkbEZyb250ZW5kRHZic0NvZGVSYXRlIGNvZGVyYXRleworICAgICAgICAgICAgLmZlYyA9IGlubmVyRmVjLAorICAgICAgICAgICAgLmlzTGluZWFyID0gaXNMaW5lYXIsCisgICAgICAgICAgICAuaXNTaG9ydEZyYW1lcyA9IGlzU2hvcnRGcmFtZXMsCisgICAgICAgICAgICAuYml0c1BlcjEwMDBTeW1ib2wgPSBiaXRzUGVyMTAwMFN5bWJvbCwKKyAgICB9OworICAgIHJldHVybiBjb2RlcmF0ZTsKK30KKwordm9pZCBUdW5lckhpZGxGcm9udGVuZDo6Z2V0SGlkbEZyb250ZW5kU2V0dGluZ3MoY29uc3QgRnJvbnRlbmRTZXR0aW5ncyYgYWlkbFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbEZyb250ZW5kU2V0dGluZ3MmIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkbEZyb250ZW5kU2V0dGluZ3NFeHQxXzEmIHNldHRpbmdzRXh0KSB7CisgICAgc3dpdGNoIChhaWRsU2V0dGluZ3MuZ2V0VGFnKCkpIHsKKyAgICBjYXNlIEZyb250ZW5kU2V0dGluZ3M6OmFuYWxvZzogeworICAgICAgICBjb25zdCBGcm9udGVuZEFuYWxvZ1NldHRpbmdzJiBhbmFsb2cgPSBhaWRsU2V0dGluZ3MuZ2V0PEZyb250ZW5kU2V0dGluZ3M6OmFuYWxvZz4oKTsKKyAgICAgICAgc2V0dGluZ3MuYW5hbG9nKHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGFuYWxvZy5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC50eXBlID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kQW5hbG9nVHlwZT4oYW5hbG9nLnR5cGUpLAorICAgICAgICAgICAgICAgIC5zaWZTdGFuZGFyZCA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZEFuYWxvZ1NpZlN0YW5kYXJkPihhbmFsb2cuc2lmU3RhbmRhcmQpLAorICAgICAgICB9KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5hbmFsb2coeworICAgICAgICAgICAgICAgIC5hZnRGbGFnID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kQW5hbG9nQWZ0RmxhZz4oYW5hbG9nLmFmdEZsYWcpLAorICAgICAgICB9KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuZW5kRnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGFuYWxvZy5lbmRGcmVxdWVuY3kpOworICAgICAgICBzZXR0aW5nc0V4dC5pbnZlcnNpb24gPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRTcGVjdHJhbEludmVyc2lvbj4oYW5hbG9nLmludmVyc2lvbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZyb250ZW5kU2V0dGluZ3M6OmF0c2M6IHsKKyAgICAgICAgY29uc3QgRnJvbnRlbmRBdHNjU2V0dGluZ3MmIGF0c2MgPSBhaWRsU2V0dGluZ3MuZ2V0PEZyb250ZW5kU2V0dGluZ3M6OmF0c2M+KCk7CisgICAgICAgIHNldHRpbmdzLmF0c2MoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYXRzYy5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kQXRzY01vZHVsYXRpb24+KGF0c2MubW9kdWxhdGlvbiksCisgICAgICAgIH0pOworICAgICAgICBzZXR0aW5nc0V4dC5lbmRGcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYXRzYy5lbmRGcmVxdWVuY3kpOworICAgICAgICBzZXR0aW5nc0V4dC5pbnZlcnNpb24gPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRTcGVjdHJhbEludmVyc2lvbj4oYXRzYy5pbnZlcnNpb24pOworICAgICAgICBzZXR0aW5nc0V4dC5zZXR0aW5nRXh0Lm5vaW5pdCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGcm9udGVuZFNldHRpbmdzOjphdHNjMzogeworICAgICAgICBjb25zdCBGcm9udGVuZEF0c2MzU2V0dGluZ3MmIGF0c2MzID0gYWlkbFNldHRpbmdzLmdldDxGcm9udGVuZFNldHRpbmdzOjphdHNjMz4oKTsKKyAgICAgICAgc2V0dGluZ3MuYXRzYzMoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYXRzYzMuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAuYmFuZHdpZHRoID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kQXRzYzNCYW5kd2lkdGg+KGF0c2MzLmJhbmR3aWR0aCksCisgICAgICAgICAgICAgICAgLmRlbW9kT3V0cHV0Rm9ybWF0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZEF0c2MzRGVtb2RPdXRwdXRGb3JtYXQ+KGF0c2MzLmRlbW9kT3V0cHV0Rm9ybWF0KSwKKyAgICAgICAgICAgICAgICAucGxwU2V0dGluZ3MgPSBnZXRBdHNjM1BscFNldHRpbmdzKGF0c2MzKSwKKyAgICAgICAgfSk7CisgICAgICAgIHNldHRpbmdzRXh0LmVuZEZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhdHNjMy5lbmRGcmVxdWVuY3kpOworICAgICAgICBzZXR0aW5nc0V4dC5pbnZlcnNpb24gPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRTcGVjdHJhbEludmVyc2lvbj4oYXRzYzMuaW52ZXJzaW9uKTsKKyAgICAgICAgc2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5ub2luaXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRnJvbnRlbmRTZXR0aW5nczo6ZHZiYzogeworICAgICAgICBjb25zdCBGcm9udGVuZER2YmNTZXR0aW5ncyYgZHZiYyA9IGFpZGxTZXR0aW5ncy5nZXQ8RnJvbnRlbmRTZXR0aW5nczo6ZHZiYz4oKTsKKyAgICAgICAgc2V0dGluZ3MuZHZiYyh7CisgICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkdmJjLmZyZXF1ZW5jeSksCisgICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJjTW9kdWxhdGlvbj4oZHZiYy5tb2R1bGF0aW9uKSwKKyAgICAgICAgICAgICAgICAuZmVjID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSW5uZXJGZWM+KGR2YmMuZmVjKSwKKyAgICAgICAgICAgICAgICAuc3ltYm9sUmF0ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkdmJjLnN5bWJvbFJhdGUpLAorICAgICAgICAgICAgICAgIC5vdXRlckZlYyA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YmNPdXRlckZlYz4oZHZiYy5vdXRlckZlYyksCisgICAgICAgICAgICAgICAgLmFubmV4ID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZiY0FubmV4PihkdmJjLmFubmV4KSwKKyAgICAgICAgICAgICAgICAuc3BlY3RyYWxJbnZlcnNpb24gPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJjU3BlY3RyYWxJbnZlcnNpb24+KGR2YmMuaW52ZXJzaW9uKSwKKyAgICAgICAgfSk7CisgICAgICAgIHNldHRpbmdzRXh0LnNldHRpbmdFeHQuZHZiYyh7CisgICAgICAgICAgICAgICAgLmludGVybGVhdmVNb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZENhYmxlVGltZUludGVybGVhdmVNb2RlPihkdmJjLmludGVybGVhdmVNb2RlKSwKKyAgICAgICAgICAgICAgICAuYmFuZHdpZHRoID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZiY0JhbmR3aWR0aD4oZHZiYy5iYW5kd2lkdGgpLAorICAgICAgICB9KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuZW5kRnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR2YmMuZW5kRnJlcXVlbmN5KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuaW52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb24+KGR2YmMuaW52ZXJzaW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRnJvbnRlbmRTZXR0aW5nczo6ZHZiczogeworICAgICAgICBjb25zdCBGcm9udGVuZER2YnNTZXR0aW5ncyYgZHZicyA9IGFpZGxTZXR0aW5ncy5nZXQ8RnJvbnRlbmRTZXR0aW5nczo6ZHZicz4oKTsKKyAgICAgICAgc2V0dGluZ3MuZHZicyh7CisgICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkdmJzLmZyZXF1ZW5jeSksCisgICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJzTW9kdWxhdGlvbj4oZHZicy5tb2R1bGF0aW9uKSwKKyAgICAgICAgICAgICAgICAuY29kZXJhdGUgPSBnZXREdmJzQ29kZVJhdGUoZHZicy5jb2RlcmF0ZSksCisgICAgICAgICAgICAgICAgLnN5bWJvbFJhdGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZicy5zeW1ib2xSYXRlKSwKKyAgICAgICAgICAgICAgICAucm9sbG9mZiA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YnNSb2xsb2ZmPihkdmJzLnJvbGxvZmYpLAorICAgICAgICAgICAgICAgIC5waWxvdCA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YnNQaWxvdD4oZHZicy5waWxvdCksCisgICAgICAgICAgICAgICAgLmlucHV0U3RyZWFtSWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZicy5pbnB1dFN0cmVhbUlkKSwKKyAgICAgICAgICAgICAgICAuc3RhbmRhcmQgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJzU3RhbmRhcmQ+KGR2YnMuc3RhbmRhcmQpLAorICAgICAgICAgICAgICAgIC52Y21Nb2RlID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZic1ZjbU1vZGU+KGR2YnMudmNtTW9kZSksCisgICAgICAgIH0pOworICAgICAgICBzZXR0aW5nc0V4dC5zZXR0aW5nRXh0LmR2YnMoeworICAgICAgICAgICAgICAgIC5zY2FuVHlwZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YnNTY2FuVHlwZT4oZHZicy5zY2FuVHlwZSksCisgICAgICAgICAgICAgICAgLmlzRGlzZXFjUnhNZXNzYWdlID0gZHZicy5pc0Rpc2VxY1J4TWVzc2FnZSwKKyAgICAgICAgfSk7CisgICAgICAgIHNldHRpbmdzRXh0LmVuZEZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkdmJzLmVuZEZyZXF1ZW5jeSk7CisgICAgICAgIHNldHRpbmdzRXh0LmludmVyc2lvbiA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZFNwZWN0cmFsSW52ZXJzaW9uPihkdmJzLmludmVyc2lvbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZyb250ZW5kU2V0dGluZ3M6OmR2YnQ6IHsKKyAgICAgICAgY29uc3QgRnJvbnRlbmREdmJ0U2V0dGluZ3MmIGR2YnQgPSBhaWRsU2V0dGluZ3MuZ2V0PEZyb250ZW5kU2V0dGluZ3M6OmR2YnQ+KCk7CisgICAgICAgIHNldHRpbmdzLmR2YnQoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHZidC5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC50cmFuc21pc3Npb25Nb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YnRUcmFuc21pc3Npb25Nb2RlPihkdmJ0LnRyYW5zbWlzc2lvbk1vZGUpLAorICAgICAgICAgICAgICAgIC5iYW5kd2lkdGggPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJ0QmFuZHdpZHRoPihkdmJ0LmJhbmR3aWR0aCksCisgICAgICAgICAgICAgICAgLmNvbnN0ZWxsYXRpb24gPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJ0Q29uc3RlbGxhdGlvbj4oZHZidC5jb25zdGVsbGF0aW9uKSwKKyAgICAgICAgICAgICAgICAuaGllcmFyY2h5ID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZidEhpZXJhcmNoeT4oZHZidC5oaWVyYXJjaHkpLAorICAgICAgICAgICAgICAgIC5ocENvZGVyYXRlID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZidENvZGVyYXRlPihkdmJ0LmhwQ29kZXJhdGUpLAorICAgICAgICAgICAgICAgIC5scENvZGVyYXRlID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZidENvZGVyYXRlPihkdmJ0LmxwQ29kZXJhdGUpLAorICAgICAgICAgICAgICAgIC5ndWFyZEludGVydmFsID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHZidEd1YXJkSW50ZXJ2YWw+KGR2YnQuZ3VhcmRJbnRlcnZhbCksCisgICAgICAgICAgICAgICAgLmlzSGlnaFByaW9yaXR5ID0gZHZidC5pc0hpZ2hQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAuc3RhbmRhcmQgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdmJ0U3RhbmRhcmQ+KGR2YnQuc3RhbmRhcmQpLAorICAgICAgICAgICAgICAgIC5pc01pc28gPSBkdmJ0LmlzTWlzbywKKyAgICAgICAgICAgICAgICAucGxwTW9kZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER2YnRQbHBNb2RlPihkdmJ0LnBscE1vZGUpLAorICAgICAgICAgICAgICAgIC5wbHBJZCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGR2YnQucGxwSWQpLAorICAgICAgICAgICAgICAgIC5wbHBHcm91cElkID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZHZidC5wbHBHcm91cElkKSwKKyAgICAgICAgfSk7CisgICAgICAgIHNldHRpbmdzRXh0LnNldHRpbmdFeHQuZHZidCh7CisgICAgICAgICAgICAgICAgLmNvbnN0ZWxsYXRpb24gPSBzdGF0aWNfY2FzdDwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdmJ0Q29uc3RlbGxhdGlvbj4oCisgICAgICAgICAgICAgICAgICAgICAgICBkdmJ0LmNvbnN0ZWxsYXRpb24pLAorICAgICAgICAgICAgICAgIC50cmFuc21pc3Npb25Nb2RlID0gc3RhdGljX2Nhc3Q8CisgICAgICAgICAgICAgICAgICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHZidFRyYW5zbWlzc2lvbk1vZGU+KAorICAgICAgICAgICAgICAgICAgICAgICAgZHZidC50cmFuc21pc3Npb25Nb2RlKSwKKyAgICAgICAgfSk7CisgICAgICAgIHNldHRpbmdzRXh0LmVuZEZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkdmJ0LmVuZEZyZXF1ZW5jeSk7CisgICAgICAgIHNldHRpbmdzRXh0LmludmVyc2lvbiA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZFNwZWN0cmFsSW52ZXJzaW9uPihkdmJ0LmludmVyc2lvbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZyb250ZW5kU2V0dGluZ3M6OmlzZGJzOiB7CisgICAgICAgIGNvbnN0IEZyb250ZW5kSXNkYnNTZXR0aW5ncyYgaXNkYnMgPSBhaWRsU2V0dGluZ3MuZ2V0PEZyb250ZW5kU2V0dGluZ3M6OmlzZGJzPigpOworICAgICAgICBzZXR0aW5ncy5pc2Ricyh7CisgICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihpc2Ricy5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC5zdHJlYW1JZCA9IHN0YXRpY19jYXN0PHVpbnQxNl90Pihpc2Ricy5zdHJlYW1JZCksCisgICAgICAgICAgICAgICAgLnN0cmVhbUlkVHlwZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElzZGJzU3RyZWFtSWRUeXBlPihpc2Ricy5zdHJlYW1JZFR5cGUpLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSXNkYnNNb2R1bGF0aW9uPihpc2Ricy5tb2R1bGF0aW9uKSwKKyAgICAgICAgICAgICAgICAuY29kZXJhdGUgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRJc2Ric0NvZGVyYXRlPihpc2Ricy5jb2RlcmF0ZSksCisgICAgICAgICAgICAgICAgLnN5bWJvbFJhdGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaXNkYnMuc3ltYm9sUmF0ZSksCisgICAgICAgICAgICAgICAgLnJvbGxvZmYgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRJc2Ric1JvbGxvZmY+KGlzZGJzLnJvbGxvZmYpLAorICAgICAgICB9KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuZW5kRnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJzLmVuZEZyZXF1ZW5jeSk7CisgICAgICAgIHNldHRpbmdzRXh0LnNldHRpbmdFeHQubm9pbml0KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZyb250ZW5kU2V0dGluZ3M6OmlzZGJzMzogeworICAgICAgICBjb25zdCBGcm9udGVuZElzZGJzM1NldHRpbmdzJiBpc2RiczMgPSBhaWRsU2V0dGluZ3MuZ2V0PEZyb250ZW5kU2V0dGluZ3M6OmlzZGJzMz4oKTsKKyAgICAgICAgc2V0dGluZ3MuaXNkYnMzKHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJzMy5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC5zdHJlYW1JZCA9IHN0YXRpY19jYXN0PHVpbnQxNl90Pihpc2RiczMuc3RyZWFtSWQpLAorICAgICAgICAgICAgICAgIC5zdHJlYW1JZFR5cGUgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRJc2Ric1N0cmVhbUlkVHlwZT4oaXNkYnMzLnN0cmVhbUlkVHlwZSksCisgICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRJc2RiczNNb2R1bGF0aW9uPihpc2RiczMubW9kdWxhdGlvbiksCisgICAgICAgICAgICAgICAgLmNvZGVyYXRlID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSXNkYnMzQ29kZXJhdGU+KGlzZGJzMy5jb2RlcmF0ZSksCisgICAgICAgICAgICAgICAgLnN5bWJvbFJhdGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaXNkYnMzLnN5bWJvbFJhdGUpLAorICAgICAgICAgICAgICAgIC5yb2xsb2ZmID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSXNkYnMzUm9sbG9mZj4oaXNkYnMzLnJvbGxvZmYpLAorICAgICAgICB9KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuZW5kRnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJzMy5lbmRGcmVxdWVuY3kpOworICAgICAgICBzZXR0aW5nc0V4dC5zZXR0aW5nRXh0Lm5vaW5pdCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGcm9udGVuZFNldHRpbmdzOjppc2RidDogeworICAgICAgICBjb25zdCBGcm9udGVuZElzZGJ0U2V0dGluZ3MmIGlzZGJ0ID0gYWlkbFNldHRpbmdzLmdldDxGcm9udGVuZFNldHRpbmdzOjppc2RidD4oKTsKKyAgICAgICAgSGlkbEZyb250ZW5kSXNkYnRNb2R1bGF0aW9uIG1vZHVsYXRpb24gPSBIaWRsRnJvbnRlbmRJc2RidE1vZHVsYXRpb246OlVOREVGSU5FRDsKKyAgICAgICAgSGlkbEZyb250ZW5kSXNkYnRDb2RlcmF0ZSBjb2RlcmF0ZSA9IEhpZGxGcm9udGVuZElzZGJ0Q29kZXJhdGU6OlVOREVGSU5FRDsKKyAgICAgICAgaWYgKGlzZGJ0LmxheWVyU2V0dGluZ3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbW9kdWxhdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElzZGJ0TW9kdWxhdGlvbj4oaXNkYnQubGF5ZXJTZXR0aW5nc1swXS5tb2R1bGF0aW9uKTsKKyAgICAgICAgICAgIGNvZGVyYXRlID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSXNkYnRDb2RlcmF0ZT4oaXNkYnQubGF5ZXJTZXR0aW5nc1swXS5jb2RlcmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0dGluZ3MuaXNkYnQoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaXNkYnQuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IG1vZHVsYXRpb24sCisgICAgICAgICAgICAgICAgLmJhbmR3aWR0aCA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElzZGJ0QmFuZHdpZHRoPihpc2RidC5iYW5kd2lkdGgpLAorICAgICAgICAgICAgICAgIC5tb2RlID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kSXNkYnRNb2RlPihpc2RidC5tb2RlKSwKKyAgICAgICAgICAgICAgICAuY29kZXJhdGUgPSBjb2RlcmF0ZSwKKyAgICAgICAgICAgICAgICAuZ3VhcmRJbnRlcnZhbCA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZElzZGJ0R3VhcmRJbnRlcnZhbD4oaXNkYnQuZ3VhcmRJbnRlcnZhbCksCisgICAgICAgICAgICAgICAgLnNlcnZpY2VBcmVhSWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaXNkYnQuc2VydmljZUFyZWFJZCksCisgICAgICAgIH0pOworICAgICAgICBzZXR0aW5nc0V4dC5lbmRGcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaXNkYnQuZW5kRnJlcXVlbmN5KTsKKyAgICAgICAgc2V0dGluZ3NFeHQuaW52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb24+KGlzZGJ0LmludmVyc2lvbik7CisgICAgICAgIHNldHRpbmdzRXh0LnNldHRpbmdFeHQubm9pbml0KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZyb250ZW5kU2V0dGluZ3M6OmR0bWI6IHsKKyAgICAgICAgY29uc3QgRnJvbnRlbmREdG1iU2V0dGluZ3MmIGR0bWIgPSBhaWRsU2V0dGluZ3MuZ2V0PEZyb250ZW5kU2V0dGluZ3M6OmR0bWI+KCk7CisgICAgICAgIHNldHRpbmdzRXh0LnNldHRpbmdFeHQuZHRtYih7CisgICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkdG1iLmZyZXF1ZW5jeSksCisgICAgICAgICAgICAgICAgLnRyYW5zbWlzc2lvbk1vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHRtYlRyYW5zbWlzc2lvbk1vZGU+KGR0bWIudHJhbnNtaXNzaW9uTW9kZSksCisgICAgICAgICAgICAgICAgLmJhbmR3aWR0aCA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER0bWJCYW5kd2lkdGg+KGR0bWIuYmFuZHdpZHRoKSwKKyAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER0bWJNb2R1bGF0aW9uPihkdG1iLm1vZHVsYXRpb24pLAorICAgICAgICAgICAgICAgIC5jb2RlUmF0ZSA9IHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZER0bWJDb2RlUmF0ZT4oZHRtYi5jb2RlUmF0ZSksCisgICAgICAgICAgICAgICAgLmd1YXJkSW50ZXJ2YWwgPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmREdG1iR3VhcmRJbnRlcnZhbD4oZHRtYi5ndWFyZEludGVydmFsKSwKKyAgICAgICAgICAgICAgICAuaW50ZXJsZWF2ZU1vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SGlkbEZyb250ZW5kRHRtYlRpbWVJbnRlcmxlYXZlTW9kZT4oZHRtYi5pbnRlcmxlYXZlTW9kZSksCisgICAgICAgIH0pOworICAgICAgICBzZXR0aW5nc0V4dC5lbmRGcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZHRtYi5lbmRGcmVxdWVuY3kpOworICAgICAgICBzZXR0aW5nc0V4dC5pbnZlcnNpb24gPSBzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRTcGVjdHJhbEludmVyc2lvbj4oZHRtYi5pbnZlcnNpb24pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRnJvbnRlbmQuaCBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsRnJvbnRlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjk4NjU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxGcm9udGVuZC5oCkBAIC0wLDAgKzEsMTI5IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSSElETEZST05URU5EX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExGUk9OVEVORF9ICisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSUZyb250ZW5kQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lckZyb250ZW5kLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSVR1bmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvSUZyb250ZW5kLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvSUZyb250ZW5kQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEF0c2MzU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZic0NvZGVSYXRlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEV2ZW50VHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTY2FuTWVzc2FnZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU2NhblR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFN0YXR1c1JlYWRpbmVzczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRTdGF0dXNUeXBlOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6c3RkOjpzaGFyZWRfcHRyOwordXNpbmcgOjpzdGQ6OnZlY3RvcjsKKwordXNpbmcgSGlkbEZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM1BscFNldHRpbmdzOwordXNpbmcgSGlkbEZyb250ZW5kRHZic0NvZGVSYXRlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnNDb2RlUmF0ZTsKK3VzaW5nIEhpZGxGcm9udGVuZEV2ZW50VHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRFdmVudFR5cGU7Cit1c2luZyBIaWRsRnJvbnRlbmRJZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJZDsKK3VzaW5nIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNjYW5NZXNzYWdlOwordXNpbmcgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTsKK3VzaW5nIEhpZGxGcm9udGVuZFNldHRpbmdzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNldHRpbmdzOwordXNpbmcgSGlkbEZyb250ZW5kU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFN0YXR1czsKK3VzaW5nIEhpZGxJRnJvbnRlbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklGcm9udGVuZDsKK3VzaW5nIEhpZGxJRnJvbnRlbmRDYWxsYmFjayA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6SUZyb250ZW5kQ2FsbGJhY2s7Cit1c2luZyBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZUV4dDFfMSA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRTY2FuTWVzc2FnZUV4dDFfMTsKK3VzaW5nIEhpZGxGcm9udGVuZFNjYW5NZXNzYWdlVHlwZUV4dDFfMSA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzE7Cit1c2luZyBIaWRsRnJvbnRlbmRTZXR0aW5nc0V4dDFfMSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRTZXR0aW5nc0V4dDFfMTsKK3VzaW5nIEhpZGxGcm9udGVuZFN0YXR1c0V4dDFfMSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRTdGF0dXNFeHQxXzE7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKworY2xhc3MgVHVuZXJIaWRsRnJvbnRlbmQgOiBwdWJsaWMgQm5UdW5lckZyb250ZW5kIHsKK3B1YmxpYzoKKyAgICBUdW5lckhpZGxGcm9udGVuZChzcDxIaWRsSUZyb250ZW5kPiBmcm9udGVuZCwgaW50IGlkKTsKKyAgICB2aXJ0dWFsIH5UdW5lckhpZGxGcm9udGVuZCgpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+JiBpbl90dW5lckZyb250ZW5kQ2FsbGJhY2spIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHR1bmUoY29uc3QgRnJvbnRlbmRTZXR0aW5ncyYgaW5fc2V0dGluZ3MpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHN0b3BUdW5lKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2Nhbihjb25zdCBGcm9udGVuZFNldHRpbmdzJiBpbl9zZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyb250ZW5kU2NhblR5cGUgaW5fZnJvbnRlbmRTY2FuVHlwZSkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc3RvcFNjYW4oKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRMbmIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJMbmI+JiBpbl9sbmIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGxpbmtDaUNhbVRvRnJvbnRlbmQoaW50MzJfdCBpbl9jaUNhbUlkLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHVubGlua0NpQ2FtVG9Gcm9udGVuZChpbnQzMl90IGluX2NpQ2FtSWQpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0U3RhdHVzKGNvbnN0IHZlY3RvcjxGcm9udGVuZFN0YXR1c1R5cGU+JiBpbl9zdGF0dXNUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRGcm9udGVuZElkKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0SGFyZHdhcmVJbmZvKHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHJlbW92ZU91dHB1dFBpZChpbnQzMl90IGluX3BpZCkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0RnJvbnRlbmRTdGF0dXNSZWFkaW5lc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxGcm9udGVuZFN0YXR1c1R5cGU+JiBpbl9zdGF0dXNUeXBlcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEZyb250ZW5kU3RhdHVzUmVhZGluZXNzPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0TG5hKGJvb2wgaW5fYkVuYWJsZSk7CisKKyAgICBzdHJ1Y3QgRnJvbnRlbmRDYWxsYmFjayA6IHB1YmxpYyBIaWRsSUZyb250ZW5kQ2FsbGJhY2sgeworICAgICAgICBGcm9udGVuZENhbGxiYWNrKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmRDYWxsYmFjaz4gdHVuZXJGcm9udGVuZENhbGxiYWNrKQorICAgICAgICAgICAgICA6IG1UdW5lckZyb250ZW5kQ2FsbGJhY2sodHVuZXJGcm9udGVuZENhbGxiYWNrKXt9OworCisgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRXZlbnQoSGlkbEZyb250ZW5kRXZlbnRUeXBlIGZyb250ZW5kRXZlbnRUeXBlKTsKKyAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25TY2FuTWVzc2FnZShIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIaWRsRnJvbnRlbmRTY2FuTWVzc2FnZSYgbWVzc2FnZSk7CisgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uU2Nhbk1lc3NhZ2VFeHQxXzEoSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlRXh0MV8xIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSGlkbEZyb250ZW5kU2Nhbk1lc3NhZ2VFeHQxXzEmIG1lc3NhZ2UpOworCisgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmRDYWxsYmFjaz4gbVR1bmVyRnJvbnRlbmRDYWxsYmFjazsKKyAgICB9OworCitwcml2YXRlOgorICAgIGhpZGxfdmVjPEhpZGxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M+IGdldEF0c2MzUGxwU2V0dGluZ3MoCisgICAgICAgICAgICBjb25zdCBGcm9udGVuZEF0c2MzU2V0dGluZ3MmIHNldHRpbmdzKTsKKyAgICBIaWRsRnJvbnRlbmREdmJzQ29kZVJhdGUgZ2V0RHZic0NvZGVSYXRlKGNvbnN0IEZyb250ZW5kRHZic0NvZGVSYXRlJiBjb2RlUmF0ZSk7CisgICAgdm9pZCBnZXRIaWRsRnJvbnRlbmRTZXR0aW5ncyhjb25zdCBGcm9udGVuZFNldHRpbmdzJiBhaWRsU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWRsRnJvbnRlbmRTZXR0aW5ncyYgc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWRsRnJvbnRlbmRTZXR0aW5nc0V4dDFfMSYgc2V0dGluZ3NFeHQpOworICAgIHZvaWQgZ2V0QWlkbEZyb250ZW5kU3RhdHVzKGNvbnN0IHZlY3RvcjxIaWRsRnJvbnRlbmRTdGF0dXM+JiBoaWRsU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvcjxIaWRsRnJvbnRlbmRTdGF0dXNFeHQxXzE+JiBoaWRsU3RhdHVzRXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1cz4mIGFpZGxTdGF0dXMpOworCisgICAgaW50IG1JZDsKKyAgICBzcDxIaWRsSUZyb250ZW5kPiBtRnJvbnRlbmQ7CisgICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJRnJvbnRlbmQ+IG1Gcm9udGVuZF8xXzE7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RVTkVSSElETEZST05URU5EX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsTG5iLmNwcCBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsTG5iLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2UyMGJiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxMbmIuY3BwCkBAIC0wLDAgKzEsMTYwIEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJUdW5lckhpZGxMbmIiCisKKyNpbmNsdWRlICJUdW5lckhpZGxMbmIuaCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9SZXN1bHQuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpSZXN1bHQ7Cit1c2luZyBIaWRsTG5iUG9zaXRpb24gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkxuYlBvc2l0aW9uOwordXNpbmcgSGlkbExuYlRvbmUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkxuYlRvbmU7Cit1c2luZyBIaWRsTG5iVm9sdGFnZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6TG5iVm9sdGFnZTsKK3VzaW5nIEhpZGxSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCitUdW5lckhpZGxMbmI6OlR1bmVySGlkbExuYihzcDxIaWRsSUxuYj4gbG5iLCBpbnQgaWQpIHsKKyAgICBtTG5iID0gbG5iOworICAgIG1JZCA9IGlkOworfQorCitUdW5lckhpZGxMbmI6On5UdW5lckhpZGxMbmIoKSB7CisgICAgbUxuYiA9IG51bGxwdHI7CisgICAgbUlkID0gLTE7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbExuYjo6c2V0Q2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iQ2FsbGJhY2s+JiBpbl90dW5lckxuYkNhbGxiYWNrKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmIChpbl90dW5lckxuYkNhbGxiYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CisgICAgfQorCisgICAgc3A8SGlkbElMbmJDYWxsYmFjaz4gbG5iQ2FsbGJhY2sgPSBuZXcgTG5iQ2FsbGJhY2soaW5fdHVuZXJMbmJDYWxsYmFjayk7CisgICAgSGlkbFJlc3VsdCBzdGF0dXMgPSBtTG5iLT5zZXRDYWxsYmFjayhsbmJDYWxsYmFjayk7CisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbExuYjo6c2V0Vm9sdGFnZShMbmJWb2x0YWdlIGluX3ZvbHRhZ2UpIHsKKyAgICBpZiAobUxuYiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJTG5iIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCBzdGF0dXMgPSBtTG5iLT5zZXRWb2x0YWdlKHN0YXRpY19jYXN0PEhpZGxMbmJWb2x0YWdlPihpbl92b2x0YWdlKSk7CisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbExuYjo6c2V0VG9uZShMbmJUb25lIGluX3RvbmUpIHsKKyAgICBpZiAobUxuYiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJTG5iIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCBzdGF0dXMgPSBtTG5iLT5zZXRUb25lKHN0YXRpY19jYXN0PEhpZGxMbmJUb25lPihpbl90b25lKSk7CisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbExuYjo6c2V0U2F0ZWxsaXRlUG9zaXRpb24oTG5iUG9zaXRpb24gaW5fcG9zaXRpb24pIHsKKyAgICBpZiAobUxuYiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJTG5iIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCBzdGF0dXMgPSBtTG5iLT5zZXRTYXRlbGxpdGVQb3NpdGlvbihzdGF0aWNfY2FzdDxIaWRsTG5iUG9zaXRpb24+KGluX3Bvc2l0aW9uKSk7CisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbExuYjo6c2VuZERpc2VxY01lc3NhZ2UoY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBpbl9kaXNlcWNNZXNzYWdlKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbUxuYi0+c2VuZERpc2VxY01lc3NhZ2UoaW5fZGlzZXFjTWVzc2FnZSk7CisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbExuYjo6Y2xvc2UoKSB7CisgICAgaWYgKG1MbmIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzID0gbUxuYi0+Y2xvc2UoKTsKKyAgICBtTG5iID0gbnVsbHB0cjsKKworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCisvLy8vLy8vLy8vLy8vLy8gSUxuYkNhbGxiYWNrIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitSZXR1cm48dm9pZD4gVHVuZXJIaWRsTG5iOjpMbmJDYWxsYmFjazo6b25FdmVudChjb25zdCBIaWRsTG5iRXZlbnRUeXBlIGxuYkV2ZW50VHlwZSkgeworICAgIGlmIChtVHVuZXJMbmJDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lckxuYkNhbGxiYWNrLT5vbkV2ZW50KHN0YXRpY19jYXN0PExuYkV2ZW50VHlwZT4obG5iRXZlbnRUeXBlKSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBUdW5lckhpZGxMbmI6OkxuYkNhbGxiYWNrOjpvbkRpc2VxY01lc3NhZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGRpc2VxY01lc3NhZ2UpIHsKKyAgICBpZiAobVR1bmVyTG5iQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICB2ZWN0b3I8dWludDhfdD4gbXNnKGJlZ2luKGRpc2VxY01lc3NhZ2UpLCBlbmQoZGlzZXFjTWVzc2FnZSkpOworICAgICAgICBtVHVuZXJMbmJDYWxsYmFjay0+b25EaXNlcWNNZXNzYWdlKG1zZyk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxMbmIuaCBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsTG5iLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjZjg0OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsTG5iLmgKQEAgLTAsMCArMSw4MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkhJRExMTkJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSSElETExOQl9ICisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvSUxuYi5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyTG5iLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSUxuYi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lMbmJDYWxsYmFjay5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkxuYkV2ZW50VHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6TG5iUG9zaXRpb247Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkxuYlRvbmU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkxuYlZvbHRhZ2U7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjpzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyA6OnN0ZDo6dmVjdG9yOworCit1c2luZyBIaWRsSUxuYiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUxuYjsKK3VzaW5nIEhpZGxJTG5iQ2FsbGJhY2sgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklMbmJDYWxsYmFjazsKK3VzaW5nIEhpZGxMbmJFdmVudFR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkxuYkV2ZW50VHlwZTsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCitjbGFzcyBUdW5lckhpZGxMbmIgOiBwdWJsaWMgQm5UdW5lckxuYiB7CitwdWJsaWM6CisgICAgVHVuZXJIaWRsTG5iKHNwPEhpZGxJTG5iPiBsbmIsIGludCBpZCk7CisgICAgdmlydHVhbCB+VHVuZXJIaWRsTG5iKCk7CisKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iQ2FsbGJhY2s+JiBpbl90dW5lckxuYkNhbGxiYWNrKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZXRWb2x0YWdlKExuYlZvbHRhZ2UgaW5fdm9sdGFnZSkgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0VG9uZShMbmJUb25lIGluX3RvbmUpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldFNhdGVsbGl0ZVBvc2l0aW9uKExuYlBvc2l0aW9uIGluX3Bvc2l0aW9uKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBzZW5kRGlzZXFjTWVzc2FnZShjb25zdCB2ZWN0b3I8dWludDhfdD4mIGluX2Rpc2VxY01lc3NhZ2UpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisKKyAgICBpbnQgZ2V0SWQoKSB7IHJldHVybiBtSWQ7IH0KKworICAgIHN0cnVjdCBMbmJDYWxsYmFjayA6IHB1YmxpYyBIaWRsSUxuYkNhbGxiYWNrIHsKKyAgICAgICAgTG5iQ2FsbGJhY2soY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJMbmJDYWxsYmFjaz4gdHVuZXJMbmJDYWxsYmFjaykKKyAgICAgICAgICAgICAgOiBtVHVuZXJMbmJDYWxsYmFjayh0dW5lckxuYkNhbGxiYWNrKXt9OworCisgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRXZlbnQoY29uc3QgSGlkbExuYkV2ZW50VHlwZSBsbmJFdmVudFR5cGUpOworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkRpc2VxY01lc3NhZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGRpc2VxY01lc3NhZ2UpOworCisgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyTG5iQ2FsbGJhY2s+IG1UdW5lckxuYkNhbGxiYWNrOworICAgIH07CisKK3ByaXZhdGU6CisgICAgaW50IG1JZDsKKyAgICBzcDxIaWRsSUxuYj4gbUxuYjsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfVFVORVJISURMTE5CX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsU2VydmljZS5jcHAgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbFNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNTVmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbFNlcnZpY2UuY3BwCkBAIC0wLDAgKzEsNzExIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVHVuZXJIaWRsU2VydmljZSIKKworI2luY2x1ZGUgIlR1bmVySGlkbFNlcnZpY2UuaCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9Gcm9udGVuZElzZGJ0VGltZUludGVybGVhdmVNb2RlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJUdW5lckhlbHBlci5oIgorI2luY2x1ZGUgIlR1bmVySGlkbERlbXV4LmgiCisjaW5jbHVkZSAiVHVuZXJIaWRsRGVzY3JhbWJsZXIuaCIKKyNpbmNsdWRlICJUdW5lckhpZGxGcm9udGVuZC5oIgorI2luY2x1ZGUgIlR1bmVySGlkbExuYi5oIgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEF0c2MzQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZEF0c2NDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER0bWJDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kRHZiY0NhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZER2YnRDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJzQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJ0Q2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZElzZGJ0VGltZUludGVybGVhdmVNb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpGcm9udGVuZFR5cGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlc3VsdDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcnJlc291cmNlbWFuYWdlcjo6VHVuZXJGcm9udGVuZEluZm87Cit1c2luZyA6OmFuZHJvaWQ6OklQQ1RocmVhZFN0YXRlOwordXNpbmcgOjphbmRyb2lkOjpQZXJtaXNzaW9uQ2FjaGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKwordXNpbmcgSGlkbEZyb250ZW5kSWQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSWQ7Cit1c2luZyBIaWRsTG5iSWQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkxuYklkOwordXNpbmcgSGlkbEZyb250ZW5kVHlwZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRUeXBlOworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK3NoYXJlZF9wdHI8VHVuZXJIaWRsU2VydmljZT4gVHVuZXJIaWRsU2VydmljZTo6c1R1bmVyU2VydmljZSA9IG51bGxwdHI7CisKK1R1bmVySGlkbFNlcnZpY2U6OlR1bmVySGlkbFNlcnZpY2UoKSB7CisgICAgaWYgKCFUdW5lckhlbHBlcjo6Y2hlY2tUdW5lckZlYXR1cmUoKSkgeworICAgICAgICBBTE9HRCgiRGV2aWNlIGRvZXNuJ3QgaGF2ZSB0dW5lciBoYXJkd2FyZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVwZGF0ZVR1bmVyUmVzb3VyY2VzKCk7Cit9CisKK1R1bmVySGlkbFNlcnZpY2U6On5UdW5lckhpZGxTZXJ2aWNlKCkgeworICAgIG1PcGVuZWRGcm9udGVuZHMuY2xlYXIoKTsKKyAgICBtTG5hU3RhdHVzID0gLTE7Cit9CisKK2JpbmRlcl9zdGF0dXNfdCBUdW5lckhpZGxTZXJ2aWNlOjppbnN0YW50aWF0ZSgpIHsKKyAgICBpZiAoSGlkbElUdW5lcjo6Z2V0U2VydmljZSgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBnZXQgSVR1bmVyIEhJREwgSEFMIik7CisgICAgICAgIHJldHVybiBTVEFUVVNfTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgc1R1bmVyU2VydmljZSA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVySGlkbFNlcnZpY2U+KCk7CisgICAgcmV0dXJuIEFTZXJ2aWNlTWFuYWdlcl9hZGRTZXJ2aWNlKHNUdW5lclNlcnZpY2UtPmFzQmluZGVyKCkuZ2V0KCksIGdldFNlcnZpY2VOYW1lKCkpOworfQorCitzaGFyZWRfcHRyPFR1bmVySGlkbFNlcnZpY2U+IFR1bmVySGlkbFNlcnZpY2U6OmdldFR1bmVyU2VydmljZSgpIHsKKyAgICByZXR1cm4gc1R1bmVyU2VydmljZTsKK30KKworYm9vbCBUdW5lckhpZGxTZXJ2aWNlOjpoYXNJVHVuZXIoKSB7CisgICAgQUxPR1YoImhhc0lUdW5lciIpOworICAgIGlmIChtVHVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBtVHVuZXIgPSBIaWRsSVR1bmVyOjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG1UdW5lciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IElUdW5lciBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbVR1bmVyVmVyc2lvbiA9IFRVTkVSX0hBTF9WRVJTSU9OXzFfMDsKKworICAgIG1UdW5lcl8xXzEgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklUdW5lcjo6Y2FzdEZyb20obVR1bmVyKTsKKyAgICBpZiAobVR1bmVyXzFfMSAhPSBudWxscHRyKSB7CisgICAgICAgIG1UdW5lclZlcnNpb24gPSBUVU5FUl9IQUxfVkVSU0lPTl8xXzE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBnZXQgSVR1bmVyXzFfMSBzZXJ2aWNlIik7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVHVuZXJIaWRsU2VydmljZTo6aGFzSVR1bmVyXzFfMSgpIHsKKyAgICBBTE9HVigiaGFzSVR1bmVyXzFfMSIpOworICAgIGhhc0lUdW5lcigpOworICAgIHJldHVybiAobVR1bmVyVmVyc2lvbiA9PSBUVU5FUl9IQUxfVkVSU0lPTl8xXzEpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxTZXJ2aWNlOjpvcGVuRGVtdXgoaW50MzJfdCAvKiBpbl9kZW11eEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckRlbXV4PiogX2FpZGxfcmV0dXJuKSB7CisgICAgQUxPR1YoIm9wZW5EZW11eCIpOworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzOworICAgIHVpbnQzMl90IGlkOworICAgIHNwPElEZW11eD4gZGVtdXhTcCA9IG51bGxwdHI7CisgICAgbVR1bmVyLT5vcGVuRGVtdXgoWyZdKEhpZGxSZXN1bHQgciwgdWludDMyX3QgZGVtdXhJZCwgY29uc3Qgc3A8SURlbXV4PiYgZGVtdXgpIHsKKyAgICAgICAgZGVtdXhTcCA9IGRlbXV4OworICAgICAgICBpZCA9IGRlbXV4SWQ7CisgICAgICAgIHJlcyA9IHI7CisgICAgICAgIEFMT0dEKCJvcGVuIGRlbXV4LCBpZCA9ICVkIiwgZGVtdXhJZCk7CisgICAgfSk7CisgICAgaWYgKHJlcyA9PSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckhpZGxEZW11eD4oZGVtdXhTcCwgaWQpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgQUxPR1coIm9wZW4gZGVtdXggZmFpbGVkLCByZXMgPSAlZCIsIHJlcyk7CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFNlcnZpY2U6OmdldERlbXV4Q2FwcyhEZW11eENhcGFiaWxpdGllcyogX2FpZGxfcmV0dXJuKSB7CisgICAgQUxPR1YoImdldERlbXV4Q2FwcyIpOworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgcmVzOworICAgIEhpZGxEZW11eENhcGFiaWxpdGllcyBjYXBzOworICAgIG1UdW5lci0+Z2V0RGVtdXhDYXBzKFsmXShIaWRsUmVzdWx0IHIsIGNvbnN0IEhpZGxEZW11eENhcGFiaWxpdGllcyYgZGVtdXhDYXBzKSB7CisgICAgICAgIGNhcHMgPSBkZW11eENhcHM7CisgICAgICAgIHJlcyA9IHI7CisgICAgfSk7CisgICAgaWYgKHJlcyA9PSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBnZXRBaWRsRGVtdXhDYXBzKGNhcHMpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgQUxPR1coIkdldCBkZW11eCBjYXBzIGZhaWxlZCwgcmVzID0gJWQiLCByZXMpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxTZXJ2aWNlOjpnZXRGcm9udGVuZElkcyh2ZWN0b3I8aW50MzJfdD4qIGlkcykgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGhpZGxfdmVjPEhpZGxGcm9udGVuZElkPiBmZUlkczsKKyAgICBIaWRsUmVzdWx0IHJlcyA9IGdldEhpZGxGcm9udGVuZElkcyhmZUlkcyk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICBpZHMtPnJlc2l6ZShmZUlkcy5zaXplKCkpOworICAgIGNvcHkoZmVJZHMuYmVnaW4oKSwgZmVJZHMuZW5kKCksIGlkcy0+YmVnaW4oKSk7CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFNlcnZpY2U6OmdldEZyb250ZW5kSW5mbyhpbnQzMl90IGlkLCBGcm9udGVuZEluZm8qIF9haWRsX3JldHVybikgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgQUxPR0UoIklUdW5lciBzZXJ2aWNlIGlzIG5vdCBpbml0LiIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbEZyb250ZW5kSW5mbyBpbmZvOworICAgIEhpZGxSZXN1bHQgcmVzID0gZ2V0SGlkbEZyb250ZW5kSW5mbyhpZCwgaW5mbyk7CisgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIEhpZGxGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMgZHRtYkNhcHM7CisgICAgaWYgKHN0YXRpY19jYXN0PEhpZGxGcm9udGVuZFR5cGU+KGluZm8udHlwZSkgPT0gSGlkbEZyb250ZW5kVHlwZTo6RFRNQikgeworICAgICAgICBpZiAoIWhhc0lUdW5lcl8xXzEoKSkgeworICAgICAgICAgICAgQUxPR0UoIklUdW5lcl8xXzEgc2VydmljZSBpcyBub3QgaW5pdC4iKTsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgICAgIH0KKworICAgICAgICBtVHVuZXJfMV8xLT5nZXRGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMoCisgICAgICAgICAgICAgICAgaWQsIFsmXShIaWRsUmVzdWx0IHIsIGNvbnN0IEhpZGxGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMmIGNhcHMpIHsKKyAgICAgICAgICAgICAgICAgICAgZHRtYkNhcHMgPSBjYXBzOworICAgICAgICAgICAgICAgICAgICByZXMgPSByOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgICAgICB9CisgICAgfQorCisgICAgKl9haWRsX3JldHVybiA9IGdldEFpZGxGcm9udGVuZEluZm8oaW5mbywgZHRtYkNhcHMpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsU2VydmljZTo6b3BlbkZyb250ZW5kKGludDMyX3QgZnJvbnRlbmRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGcm9udGVuZD4qIF9haWRsX3JldHVybikgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgQUxPR0UoIklUdW5lciBzZXJ2aWNlIGlzIG5vdCBpbml0LiIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCBzdGF0dXM7CisgICAgc3A8SGlkbElGcm9udGVuZD4gZnJvbnRlbmQ7CisgICAgaW50IGlkID0gVHVuZXJIZWxwZXI6OmdldFJlc291cmNlSWRGcm9tSGFuZGxlKGZyb250ZW5kSGFuZGxlLCBGUk9OVEVORCk7CisgICAgbVR1bmVyLT5vcGVuRnJvbnRlbmRCeUlkKGlkLCBbJl0oSGlkbFJlc3VsdCByZXN1bHQsIGNvbnN0IHNwPEhpZGxJRnJvbnRlbmQ+JiBmZSkgeworICAgICAgICBmcm9udGVuZCA9IGZlOworICAgICAgICBzdGF0dXMgPSByZXN1bHQ7CisgICAgfSk7CisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKworICAgIHNoYXJlZF9wdHI8VHVuZXJIaWRsRnJvbnRlbmQ+IHR1bmVyRnJvbnRlbmQgPQorICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJIaWRsRnJvbnRlbmQ+KGZyb250ZW5kLCBpZCk7CisgICAgaWYgKG1MbmFTdGF0dXMgIT0gLTEpIHsKKyAgICAgICAgdHVuZXJGcm9udGVuZC0+c2V0TG5hKG1MbmFTdGF0dXMgPT0gMSk7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1PcGVuZWRGcm9udGVuZHNMb2NrKTsKKyAgICAgICAgbU9wZW5lZEZyb250ZW5kcy5pbnNlcnQodHVuZXJGcm9udGVuZCk7CisgICAgfQorICAgICpfYWlkbF9yZXR1cm4gPSB0dW5lckZyb250ZW5kOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsU2VydmljZTo6b3BlbkxuYihpbnQgbG5iSGFuZGxlLCBzaGFyZWRfcHRyPElUdW5lckxuYj4qIF9haWRsX3JldHVybikgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgQUxPR0QoImdldCBJVHVuZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHN0YXR1czsKKyAgICBzcDxIaWRsSUxuYj4gbG5iOworICAgIGludCBpZCA9IFR1bmVySGVscGVyOjpnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShsbmJIYW5kbGUsIExOQik7CisgICAgbVR1bmVyLT5vcGVuTG5iQnlJZChpZCwgWyZdKEhpZGxSZXN1bHQgcmVzdWx0LCBjb25zdCBzcDxIaWRsSUxuYj4mIGxuYlNwKSB7CisgICAgICAgIGxuYiA9IGxuYlNwOworICAgICAgICBzdGF0dXMgPSByZXN1bHQ7CisgICAgfSk7CisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKworICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckhpZGxMbmI+KGxuYiwgaWQpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsU2VydmljZTo6b3BlbkxuYkJ5TmFtZShjb25zdCBzdHJpbmcmIGxuYk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyTG5iPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRSgiZ2V0IElUdW5lciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGludCBsbmJJZDsKKyAgICBIaWRsUmVzdWx0IHN0YXR1czsKKyAgICBzcDxIaWRsSUxuYj4gbG5iOworICAgIG1UdW5lci0+b3BlbkxuYkJ5TmFtZShsbmJOYW1lLCBbJl0oSGlkbFJlc3VsdCByLCBIaWRsTG5iSWQgaWQsIGNvbnN0IHNwPEhpZGxJTG5iPiYgbG5iU3ApIHsKKyAgICAgICAgc3RhdHVzID0gcjsKKyAgICAgICAgbG5iID0gbG5iU3A7CisgICAgICAgIGxuYklkID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaWQpOworICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJIaWRsTG5iPihsbmIsIGxuYklkKTsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFNlcnZpY2U6Om9wZW5EZXNjcmFtYmxlcigKKyAgICAgICAgaW50MzJfdCAvKmRlc2NyYW1ibGVySGFuZGxlKi8sIHNoYXJlZF9wdHI8SVR1bmVyRGVzY3JhbWJsZXI+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIEFMT0dEKCJnZXQgSVR1bmVyIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCBzdGF0dXM7CisgICAgc3A8SGlkbElEZXNjcmFtYmxlcj4gZGVzY3JhbWJsZXI7CisgICAgLy9pbnQgaWQgPSBUdW5lckhlbHBlcjo6Z2V0UmVzb3VyY2VJZEZyb21IYW5kbGUoZGVzY3JhbWJsZXJIYW5kbGUsIERFU0NSQU1CTEVSKTsKKyAgICBtVHVuZXItPm9wZW5EZXNjcmFtYmxlcihbJl0oSGlkbFJlc3VsdCByLCBjb25zdCBzcDxIaWRsSURlc2NyYW1ibGVyPiYgZGVzY3JhbWJsZXJTcCkgeworICAgICAgICBzdGF0dXMgPSByOworICAgICAgICBkZXNjcmFtYmxlciA9IGRlc2NyYW1ibGVyU3A7CisgICAgfSk7CisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKworICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckhpZGxEZXNjcmFtYmxlcj4oZGVzY3JhbWJsZXIpOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKK30KKworOjpuZGs6OlNjb3BlZEFTdGF0dXMgVHVuZXJIaWRsU2VydmljZTo6Z2V0VHVuZXJIYWxWZXJzaW9uKGludCogX2FpZGxfcmV0dXJuKSB7CisgICAgaGFzSVR1bmVyKCk7CisgICAgKl9haWRsX3JldHVybiA9IG1UdW5lclZlcnNpb247CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxTZXJ2aWNlOjpvcGVuU2hhcmVkRmlsdGVyKAorICAgICAgICBjb25zdCBzdHJpbmcmIGluX2ZpbHRlclRva2VuLCBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgaW5fY2IsCisgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRSgiZ2V0IElUdW5lciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNTaGFyZWRGaWx0ZXJQZXJtaXNzaW9uKSkgeworICAgICAgICBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1RWX1NIQVJFRF9GSUxURVIiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2hhcmVkRmlsdGVyc0xvY2spOworICAgIGlmIChtU2hhcmVkRmlsdGVycy5maW5kKGluX2ZpbHRlclRva2VuKSA9PSBtU2hhcmVkRmlsdGVycy5lbmQoKSkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gbnVsbHB0cjsKKyAgICAgICAgQUxPR0QoImZhaWwgdG8gZmluZCAlcyIsIGluX2ZpbHRlclRva2VuLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBzaGFyZWRfcHRyPFR1bmVySGlkbEZpbHRlcj4gZmlsdGVyID0gbVNoYXJlZEZpbHRlcnMuYXQoaW5fZmlsdGVyVG9rZW4pOworICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgIGNvbnN0IGludCBwaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICBpZiAoIWZpbHRlci0+aXNTaGFyZWRGaWx0ZXJBbGxvd2VkKHBpZCkpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG51bGxwdHI7CisgICAgICAgIEFMT0dEKCJzaGFyZWQgZmlsdGVyICVzIGlzIG9wZW5lZCBpbiB0aGUgc2FtZSBwcm9jZXNzIiwgaW5fZmlsdGVyVG9rZW4uY19zdHIoKSk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9TVEFURSkpOworICAgIH0KKworICAgIGZpbHRlci0+YXR0YWNoU2hhcmVkRmlsdGVyQ2FsbGJhY2soaW5fY2IpOworCisgICAgKl9haWRsX3JldHVybiA9IGZpbHRlcjsKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFNlcnZpY2U6OnNldExuYShib29sIGJFbmFibGUpIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIEFMT0dFKCJnZXQgSVR1bmVyIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgbUxuYVN0YXR1cyA9IGJFbmFibGUgPyAxIDogMDsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1PcGVuZWRGcm9udGVuZHNMb2NrKTsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbU9wZW5lZEZyb250ZW5kcy5iZWdpbigpOyBpdCAhPSBtT3BlbmVkRnJvbnRlbmRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAoKml0KS0+c2V0TG5hKG1MbmFTdGF0dXMgPT0gMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFNlcnZpY2U6OnNldE1heE51bWJlck9mRnJvbnRlbmRzKEZyb250ZW5kVHlwZSAvKiBpbl9mcm9udGVuZFR5cGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IC8qIGluX21heE51bWJlciAqLykgeworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxTZXJ2aWNlOjpnZXRNYXhOdW1iZXJPZkZyb250ZW5kcyhGcm9udGVuZFR5cGUgLyogaW5fZnJvbnRlbmRUeXBlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgKl9haWRsX3JldHVybiA9IC0xOworICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworfQorCitzdHJpbmcgVHVuZXJIaWRsU2VydmljZTo6YWRkRmlsdGVyVG9TaGFyZWQoY29uc3Qgc2hhcmVkX3B0cjxUdW5lckhpZGxGaWx0ZXI+JiBzaGFyZWRGaWx0ZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNoYXJlZEZpbHRlcnNMb2NrKTsKKworICAgIC8vIFVzZSBzaGFyZWRGaWx0ZXIgYWRkcmVzcyBhcyB0b2tlbi4KKyAgICBzdHJpbmcgdG9rZW4gPSB0b19zdHJpbmcocmVpbnRlcnByZXRfY2FzdDxzdGQ6OnVpbnRwdHJfdD4oc2hhcmVkRmlsdGVyLmdldCgpKSk7CisgICAgbVNoYXJlZEZpbHRlcnNbdG9rZW5dID0gc2hhcmVkRmlsdGVyOworCisgICAgcmV0dXJuIHRva2VuOworfQorCit2b2lkIFR1bmVySGlkbFNlcnZpY2U6OnJlbW92ZVNoYXJlZEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPFR1bmVySGlkbEZpbHRlcj4mIHNoYXJlZEZpbHRlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2hhcmVkRmlsdGVyc0xvY2spOworCisgICAgLy8gVXNlIHNoYXJlZEZpbHRlciBhZGRyZXNzIGFzIHRva2VuLgorICAgIG1TaGFyZWRGaWx0ZXJzLmVyYXNlKHRvX3N0cmluZyhyZWludGVycHJldF9jYXN0PHN0ZDo6dWludHB0cl90PihzaGFyZWRGaWx0ZXIuZ2V0KCkpKSk7Cit9CisKK3ZvaWQgVHVuZXJIaWRsU2VydmljZTo6cmVtb3ZlRnJvbnRlbmQoY29uc3Qgc2hhcmVkX3B0cjxUdW5lckhpZGxGcm9udGVuZD4mIGZyb250ZW5kKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1PcGVuZWRGcm9udGVuZHNMb2NrKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtT3BlbmVkRnJvbnRlbmRzLmJlZ2luKCk7IGl0ICE9IG1PcGVuZWRGcm9udGVuZHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGl0LT5nZXQoKSA9PSBmcm9udGVuZC5nZXQoKSkgeworICAgICAgICAgICAgbU9wZW5lZEZyb250ZW5kcy5lcmFzZShpdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUdW5lckhpZGxTZXJ2aWNlOjp1cGRhdGVUdW5lclJlc291cmNlcygpIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gdXBkYXRlVHVuZXJSZXNvdXJjZXMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFR1bmVySGVscGVyOjp1cGRhdGVUdW5lclJlc291cmNlcyhnZXRUUk1Gcm9udGVuZEluZm9zKCksIGdldFRSTUxuYkhhbmRsZXMoKSk7Cit9CisKK3ZlY3RvcjxUdW5lckZyb250ZW5kSW5mbz4gVHVuZXJIaWRsU2VydmljZTo6Z2V0VFJNRnJvbnRlbmRJbmZvcygpIHsKKyAgICB2ZWN0b3I8VHVuZXJGcm9udGVuZEluZm8+IGluZm9zOworICAgIGhpZGxfdmVjPEhpZGxGcm9udGVuZElkPiBpZHM7CisgICAgSGlkbFJlc3VsdCByZXMgPSBnZXRIaWRsRnJvbnRlbmRJZHMoaWRzKTsKKyAgICBpZiAocmVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIGluZm9zOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEhpZGxGcm9udGVuZEluZm8gZnJvbnRlbmRJbmZvOworICAgICAgICBIaWRsUmVzdWx0IHJlcyA9IGdldEhpZGxGcm9udGVuZEluZm8oc3RhdGljX2Nhc3Q8aW50MzJfdD4oaWRzW2ldKSwgZnJvbnRlbmRJbmZvKTsKKyAgICAgICAgaWYgKHJlcyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBUdW5lckZyb250ZW5kSW5mbyB0dW5lckZyb250ZW5kSW5mb3sKKyAgICAgICAgICAgICAgICAuaGFuZGxlID0gVHVuZXJIZWxwZXI6OmdldFJlc291cmNlSGFuZGxlRnJvbUlkKHN0YXRpY19jYXN0PGludDMyX3Q+KGlkc1tpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9OVEVORCksCisgICAgICAgICAgICAgICAgLnR5cGUgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pihmcm9udGVuZEluZm8udHlwZSksCisgICAgICAgICAgICAgICAgLmV4Y2x1c2l2ZUdyb3VwSWQgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pihmcm9udGVuZEluZm8uZXhjbHVzaXZlR3JvdXBJZCksCisgICAgICAgIH07CisgICAgICAgIGluZm9zLnB1c2hfYmFjayh0dW5lckZyb250ZW5kSW5mbyk7CisgICAgfQorCisgICAgcmV0dXJuIGluZm9zOworfQorCit2ZWN0b3I8aW50MzJfdD4gVHVuZXJIaWRsU2VydmljZTo6Z2V0VFJNTG5iSGFuZGxlcygpIHsKKyAgICB2ZWN0b3I8aW50MzJfdD4gbG5iSGFuZGxlczsKKyAgICBpZiAobVR1bmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgSGlkbFJlc3VsdCByZXM7CisgICAgICAgIHZlY3RvcjxIaWRsTG5iSWQ+IGxuYklkczsKKyAgICAgICAgbVR1bmVyLT5nZXRMbmJJZHMoWyZdKEhpZGxSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8SGlkbExuYklkPiYgaWRzKSB7CisgICAgICAgICAgICBsbmJJZHMgPSBpZHM7CisgICAgICAgICAgICByZXMgPSByOworICAgICAgICB9KTsKKyAgICAgICAgaWYgKHJlcyA9PSBIaWRsUmVzdWx0OjpTVUNDRVNTICYmIGxuYklkcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxuYklkcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGxuYkhhbmRsZXMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgVHVuZXJIZWxwZXI6OmdldFJlc291cmNlSGFuZGxlRnJvbUlkKHN0YXRpY19jYXN0PGludDMyX3Q+KGxuYklkc1tpXSksIExOQikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGxuYkhhbmRsZXM7Cit9CisKK0hpZGxSZXN1bHQgVHVuZXJIaWRsU2VydmljZTo6Z2V0SGlkbEZyb250ZW5kSWRzKGhpZGxfdmVjPEhpZGxGcm9udGVuZElkPiYgaWRzKSB7CisgICAgaWYgKG1UdW5lciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBIaWRsUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgfQorICAgIEhpZGxSZXN1bHQgcmVzOworICAgIG1UdW5lci0+Z2V0RnJvbnRlbmRJZHMoWyZdKEhpZGxSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8SGlkbEZyb250ZW5kSWQ+JiBmcm9udGVuZElkcykgeworICAgICAgICBpZHMgPSBmcm9udGVuZElkczsKKyAgICAgICAgcmVzID0gcjsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzOworfQorCitIaWRsUmVzdWx0IFR1bmVySGlkbFNlcnZpY2U6OmdldEhpZGxGcm9udGVuZEluZm8oY29uc3QgaW50IGlkLCBIaWRsRnJvbnRlbmRJbmZvJiBpbmZvKSB7CisgICAgaWYgKG1UdW5lciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBIaWRsUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgfQorICAgIEhpZGxSZXN1bHQgcmVzOworICAgIG1UdW5lci0+Z2V0RnJvbnRlbmRJbmZvKGlkLCBbJl0oSGlkbFJlc3VsdCByLCBjb25zdCBIaWRsRnJvbnRlbmRJbmZvJiBmZUluZm8pIHsKKyAgICAgICAgaW5mbyA9IGZlSW5mbzsKKyAgICAgICAgcmVzID0gcjsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzOworfQorCitEZW11eENhcGFiaWxpdGllcyBUdW5lckhpZGxTZXJ2aWNlOjpnZXRBaWRsRGVtdXhDYXBzKGNvbnN0IEhpZGxEZW11eENhcGFiaWxpdGllcyYgY2FwcykgeworICAgIERlbXV4Q2FwYWJpbGl0aWVzIGFpZGxDYXBzeworICAgICAgICAgICAgLm51bURlbXV4ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oY2Fwcy5udW1EZW11eCksCisgICAgICAgICAgICAubnVtUmVjb3JkID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oY2Fwcy5udW1SZWNvcmQpLAorICAgICAgICAgICAgLm51bVBsYXliYWNrID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oY2Fwcy5udW1QbGF5YmFjayksCisgICAgICAgICAgICAubnVtVHNGaWx0ZXIgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihjYXBzLm51bVRzRmlsdGVyKSwKKyAgICAgICAgICAgIC5udW1TZWN0aW9uRmlsdGVyID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oY2Fwcy5udW1TZWN0aW9uRmlsdGVyKSwKKyAgICAgICAgICAgIC5udW1BdWRpb0ZpbHRlciA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGNhcHMubnVtQXVkaW9GaWx0ZXIpLAorICAgICAgICAgICAgLm51bVZpZGVvRmlsdGVyID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oY2Fwcy5udW1WaWRlb0ZpbHRlciksCisgICAgICAgICAgICAubnVtUGVzRmlsdGVyID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oY2Fwcy5udW1QZXNGaWx0ZXIpLAorICAgICAgICAgICAgLm51bVBjckZpbHRlciA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGNhcHMubnVtUGNyRmlsdGVyKSwKKyAgICAgICAgICAgIC5udW1CeXRlc0luU2VjdGlvbkZpbHRlciA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGNhcHMubnVtQnl0ZXNJblNlY3Rpb25GaWx0ZXIpLAorICAgICAgICAgICAgLmZpbHRlckNhcHMgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihjYXBzLmZpbHRlckNhcHMpLAorICAgICAgICAgICAgLmJUaW1lRmlsdGVyID0gY2Fwcy5iVGltZUZpbHRlciwKKyAgICB9OworICAgIGFpZGxDYXBzLmxpbmtDYXBzLnJlc2l6ZShjYXBzLmxpbmtDYXBzLnNpemUoKSk7CisgICAgY29weShjYXBzLmxpbmtDYXBzLmJlZ2luKCksIGNhcHMubGlua0NhcHMuZW5kKCksIGFpZGxDYXBzLmxpbmtDYXBzLmJlZ2luKCkpOworICAgIHJldHVybiBhaWRsQ2FwczsKK30KKworRnJvbnRlbmRJbmZvIFR1bmVySGlkbFNlcnZpY2U6OmdldEFpZGxGcm9udGVuZEluZm8oCisgICAgICAgIGNvbnN0IEhpZGxGcm9udGVuZEluZm8mIGhhbEluZm8sIGNvbnN0IEhpZGxGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMmIGhhbER0bWJDYXBzKSB7CisgICAgRnJvbnRlbmRJbmZvIGluZm97CisgICAgICAgICAgICAudHlwZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kVHlwZT4oaGFsSW5mby50eXBlKSwKKyAgICAgICAgICAgIC5taW5GcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihoYWxJbmZvLm1pbkZyZXF1ZW5jeSksCisgICAgICAgICAgICAubWF4RnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oaGFsSW5mby5tYXhGcmVxdWVuY3kpLAorICAgICAgICAgICAgLm1pblN5bWJvbFJhdGUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLm1pblN5bWJvbFJhdGUpLAorICAgICAgICAgICAgLm1heFN5bWJvbFJhdGUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLm1heFN5bWJvbFJhdGUpLAorICAgICAgICAgICAgLmFjcXVpcmVSYW5nZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGhhbEluZm8uYWNxdWlyZVJhbmdlKSwKKyAgICAgICAgICAgIC5leGNsdXNpdmVHcm91cElkID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5leGNsdXNpdmVHcm91cElkKSwKKyAgICB9OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFsSW5mby5zdGF0dXNDYXBzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGluZm8uc3RhdHVzQ2Fwcy5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8RnJvbnRlbmRTdGF0dXNUeXBlPihoYWxJbmZvLnN0YXR1c0NhcHNbaV0pKTsKKyAgICB9CisKKyAgICBGcm9udGVuZENhcGFiaWxpdGllcyBjYXBzOworICAgIHN3aXRjaCAoaGFsSW5mby50eXBlKSB7CisgICAgY2FzZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kVHlwZTo6QU5BTE9HOiB7CisgICAgICAgIGlmIChIaWRsRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjphbmFsb2dDYXBzID09CisgICAgICAgICAgICBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgIEZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzIGFuYWxvZ0NhcHN7CisgICAgICAgICAgICAgICAgICAgIC50eXBlQ2FwID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuYW5hbG9nQ2FwcygpLnR5cGVDYXApLAorICAgICAgICAgICAgICAgICAgICAuc2lmU3RhbmRhcmRDYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmFuYWxvZ0NhcHMoKS5zaWZTdGFuZGFyZENhcCksCisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2Fwcy5zZXQ8RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmFuYWxvZ0NhcHM+KGFuYWxvZ0NhcHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRUeXBlOjpBVFNDOiB7CisgICAgICAgIGlmIChIaWRsRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjQ2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZEF0c2NDYXBhYmlsaXRpZXMgYXRzY0NhcHN7CisgICAgICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjQ2FwcygpLm1vZHVsYXRpb25DYXApLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PEZyb250ZW5kQ2FwYWJpbGl0aWVzOjphdHNjQ2Fwcz4oYXRzY0NhcHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRUeXBlOjpBVFNDMzogeworICAgICAgICBpZiAoSGlkbEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzYzNDYXBzID09CisgICAgICAgICAgICBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgIEZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXMgYXRzYzNDYXBzeworICAgICAgICAgICAgICAgICAgICAuYmFuZHdpZHRoQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS5iYW5kd2lkdGhDYXApLAorICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkubW9kdWxhdGlvbkNhcCksCisgICAgICAgICAgICAgICAgICAgIC50aW1lSW50ZXJsZWF2ZU1vZGVDYXAgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS50aW1lSW50ZXJsZWF2ZU1vZGVDYXApLAorICAgICAgICAgICAgICAgICAgICAuY29kZVJhdGVDYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2MzQ2FwcygpLmNvZGVSYXRlQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmRlbW9kT3V0cHV0Rm9ybWF0Q2FwID0gc3RhdGljX2Nhc3Q8aW50OF90PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS5kZW1vZE91dHB1dEZvcm1hdENhcCksCisgICAgICAgICAgICAgICAgICAgIC5mZWNDYXAgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS5mZWNDYXApLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PEZyb250ZW5kQ2FwYWJpbGl0aWVzOjphdHNjM0NhcHM+KGF0c2MzQ2Fwcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFR5cGU6OkRWQkM6IHsKKyAgICAgICAgaWYgKEhpZGxGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmNDYXBzID09CisgICAgICAgICAgICBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgIEZyb250ZW5kRHZiY0NhcGFiaWxpdGllcyBkdmJjQ2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YmNDYXBzKCkubW9kdWxhdGlvbkNhcCksCisgICAgICAgICAgICAgICAgICAgIC5mZWNDYXAgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJjQ2FwcygpLmZlY0NhcCksCisgICAgICAgICAgICAgICAgICAgIC5hbm5leENhcCA9IHN0YXRpY19jYXN0PGludDhfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuZHZiY0NhcHMoKS5hbm5leENhcCksCisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2Fwcy5zZXQ8RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmR2YmNDYXBzPihkdmJjQ2Fwcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFR5cGU6OkRWQlM6IHsKKyAgICAgICAgaWYgKEhpZGxGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnNDYXBzID09CisgICAgICAgICAgICBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgIEZyb250ZW5kRHZic0NhcGFiaWxpdGllcyBkdmJzQ2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnNDYXBzKCkubW9kdWxhdGlvbkNhcCksCisgICAgICAgICAgICAgICAgICAgIC5pbm5lcmZlY0NhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuZHZic0NhcHMoKS5pbm5lcmZlY0NhcCksCisgICAgICAgICAgICAgICAgICAgIC5zdGFuZGFyZCA9IHN0YXRpY19jYXN0PGludDhfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuZHZic0NhcHMoKS5zdGFuZGFyZCksCisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2Fwcy5zZXQ8RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmR2YnNDYXBzPihkdmJzQ2Fwcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFR5cGU6OkRWQlQ6IHsKKyAgICAgICAgaWYgKEhpZGxGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnRDYXBzID09CisgICAgICAgICAgICBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgIEZyb250ZW5kRHZidENhcGFiaWxpdGllcyBkdmJ0Q2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLnRyYW5zbWlzc2lvbk1vZGVDYXAgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLnRyYW5zbWlzc2lvbk1vZGVDYXApLAorICAgICAgICAgICAgICAgICAgICAuYmFuZHdpZHRoQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmJhbmR3aWR0aENhcCksCisgICAgICAgICAgICAgICAgICAgIC5jb25zdGVsbGF0aW9uQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmNvbnN0ZWxsYXRpb25DYXApLAorICAgICAgICAgICAgICAgICAgICAuY29kZXJhdGVDYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkuY29kZXJhdGVDYXApLAorICAgICAgICAgICAgICAgICAgICAuaGllcmFyY2h5Q2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmhpZXJhcmNoeUNhcCksCisgICAgICAgICAgICAgICAgICAgIC5ndWFyZEludGVydmFsQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmd1YXJkSW50ZXJ2YWxDYXApLAorICAgICAgICAgICAgICAgICAgICAuaXNUMlN1cHBvcnRlZCA9IGhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkuaXNUMlN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgLmlzTWlzb1N1cHBvcnRlZCA9IGhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkuaXNNaXNvU3VwcG9ydGVkLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PEZyb250ZW5kQ2FwYWJpbGl0aWVzOjpkdmJ0Q2Fwcz4oZHZidENhcHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRUeXBlOjpJU0RCUzogeworICAgICAgICBpZiAoSGlkbEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnNDYXBzID09CisgICAgICAgICAgICBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgIEZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMgaXNkYnNDYXBzeworICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnNDYXBzKCkubW9kdWxhdGlvbkNhcCksCisgICAgICAgICAgICAgICAgICAgIC5jb2RlcmF0ZUNhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnNDYXBzKCkuY29kZXJhdGVDYXApLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PEZyb250ZW5kQ2FwYWJpbGl0aWVzOjppc2Ric0NhcHM+KGlzZGJzQ2Fwcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFR5cGU6OklTREJTMzogeworICAgICAgICBpZiAoSGlkbEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnMzQ2FwcyA9PQorICAgICAgICAgICAgaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllcyBpc2RiczNDYXBzeworICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnMzQ2FwcygpLm1vZHVsYXRpb25DYXApLAorICAgICAgICAgICAgICAgICAgICAuY29kZXJhdGVDYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJzM0NhcHMoKS5jb2RlcmF0ZUNhcCksCisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2Fwcy5zZXQ8RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmlzZGJzM0NhcHM+KGlzZGJzM0NhcHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRUeXBlOjpJU0RCVDogeworICAgICAgICBpZiAoSGlkbEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnRDYXBzID09CisgICAgICAgICAgICBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgIEZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXMgaXNkYnRDYXBzeworICAgICAgICAgICAgICAgICAgICAubW9kZUNhcCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJ0Q2FwcygpLm1vZGVDYXApLAorICAgICAgICAgICAgICAgICAgICAuYmFuZHdpZHRoQ2FwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2RidENhcHMoKS5iYW5kd2lkdGhDYXApLAorICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnRDYXBzKCkubW9kdWxhdGlvbkNhcCksCisgICAgICAgICAgICAgICAgICAgIC5jb2RlcmF0ZUNhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnRDYXBzKCkuY29kZXJhdGVDYXApLAorICAgICAgICAgICAgICAgICAgICAuZ3VhcmRJbnRlcnZhbENhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnRDYXBzKCkuZ3VhcmRJbnRlcnZhbENhcCksCisgICAgICAgICAgICAgICAgICAgIC50aW1lSW50ZXJsZWF2ZUNhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oRnJvbnRlbmRJc2RidFRpbWVJbnRlcmxlYXZlTW9kZTo6VU5ERUZJTkVEKSwKKyAgICAgICAgICAgICAgICAgICAgLmlzU2VnbWVudEF1dG8gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgLmlzRnVsbFNlZ21lbnQgPSBmYWxzZSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjYXBzLnNldDxGcm9udGVuZENhcGFiaWxpdGllczo6aXNkYnRDYXBzPihpc2RidENhcHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxIaWRsRnJvbnRlbmRUeXBlPihpbmZvLnR5cGUpID09IEhpZGxGcm9udGVuZFR5cGU6OkRUTUIpIHsKKyAgICAgICAgICAgIEZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyBkdG1iQ2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLnRyYW5zbWlzc2lvbk1vZGVDYXAgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxEdG1iQ2Fwcy50cmFuc21pc3Npb25Nb2RlQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmJhbmR3aWR0aENhcCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbER0bWJDYXBzLmJhbmR3aWR0aENhcCksCisgICAgICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsRHRtYkNhcHMubW9kdWxhdGlvbkNhcCksCisgICAgICAgICAgICAgICAgICAgIC5jb2RlUmF0ZUNhcCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbER0bWJDYXBzLmNvZGVSYXRlQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmd1YXJkSW50ZXJ2YWxDYXAgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihoYWxEdG1iQ2Fwcy5ndWFyZEludGVydmFsQ2FwKSwKKyAgICAgICAgICAgICAgICAgICAgLmludGVybGVhdmVNb2RlQ2FwID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFsRHRtYkNhcHMuaW50ZXJsZWF2ZU1vZGVDYXApLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNhcHMuc2V0PEZyb250ZW5kQ2FwYWJpbGl0aWVzOjpkdG1iQ2Fwcz4oZHRtYkNhcHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisKKyAgICBpbmZvLmZyb250ZW5kQ2FwcyA9IGNhcHM7CisgICAgcmV0dXJuIGluZm87Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxTZXJ2aWNlLmggYi9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbFNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjUyZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxTZXJ2aWNlLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSSElETFNFUlZJQ0VfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSSElETFNFUlZJQ0VfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL0RlbXV4RmlsdGVyRXZlbnQuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvRGVtdXhGaWx0ZXJTdGF0dXMuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXJyZXNvdXJjZW1hbmFnZXIvVHVuZXJGcm9udGVuZEluZm8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMS9JVHVuZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgIlR1bmVySGVscGVyLmgiCisjaW5jbHVkZSAiVHVuZXJIaWRsRmlsdGVyLmgiCisjaW5jbHVkZSAiVHVuZXJIaWRsRnJvbnRlbmQuaCIKKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpEZW11eENhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RGVtdXhGaWx0ZXJTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkZyb250ZW5kSW5mbzsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6RnJvbnRlbmRUeXBlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJEZW11eDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRGVzY3JhbWJsZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZyb250ZW5kOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJMbmI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXJyZXNvdXJjZW1hbmFnZXI6OlR1bmVyRnJvbnRlbmRJbmZvOwordXNpbmcgOjphbmRyb2lkOjpNdXRleDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OnN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIDo6c3RkOjpzdHJpbmc7Cit1c2luZyA6OnN0ZDo6dmVjdG9yOworCit1c2luZyBIaWRsRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJDYXBhYmlsaXRpZXM7Cit1c2luZyBIaWRsRGVtdXhGaWx0ZXJFdmVudCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJFdmVudDsKK3VzaW5nIEhpZGxEZW11eEZpbHRlclN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJTdGF0dXM7Cit1c2luZyBIaWRsRGVtdXhDYXBhYmlsaXRpZXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4Q2FwYWJpbGl0aWVzOwordXNpbmcgSGlkbEZyb250ZW5kSW5mbyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJbmZvOwordXNpbmcgSGlkbElUdW5lciA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SVR1bmVyOwordXNpbmcgSGlkbFJlc3VsdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OwordXNpbmcgSGlkbEZyb250ZW5kSWQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSWQ7CisKK25hbWVzcGFjZSBhaWRsIHsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgdHYgeworbmFtZXNwYWNlIHR1bmVyIHsKKworY2xhc3MgVHVuZXJIaWRsU2VydmljZSA6IHB1YmxpYyBCblR1bmVyU2VydmljZSB7CitwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgY29uc3QqIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLnR1bmVyIjsgfQorICAgIHN0YXRpYyBiaW5kZXJfc3RhdHVzX3QgaW5zdGFudGlhdGUoKTsKKyAgICBUdW5lckhpZGxTZXJ2aWNlKCk7CisgICAgdmlydHVhbCB+VHVuZXJIaWRsU2VydmljZSgpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0RnJvbnRlbmRJZHModmVjdG9yPGludDMyX3Q+KiBvdXRfaWRzKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRGcm9udGVuZEluZm8oaW50MzJfdCBpbl9mcm9udGVuZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJvbnRlbmRJbmZvKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5Gcm9udGVuZChpbnQzMl90IGluX2Zyb250ZW5kSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuTG5iKGludDMyX3QgaW5fbG5iSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJMbmI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIG9wZW5MbmJCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGluX2xuYk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckxuYj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlbkRlbXV4KGludDMyX3QgaW5fZGVtdXhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRGVtdXg+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldERlbXV4Q2FwcyhEZW11eENhcGFiaWxpdGllcyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBvcGVuRGVzY3JhbWJsZXIoaW50MzJfdCBpbl9kZXNjcmFtYmxlckhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJEZXNjcmFtYmxlcj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgZ2V0VHVuZXJIYWxWZXJzaW9uKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb3BlblNoYXJlZEZpbHRlcihjb25zdCBzdHJpbmcmIGluX2ZpbHRlclRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXJDYWxsYmFjaz4mIGluX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldExuYShib29sIGluX2JFbmFibGUpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIHNldE1heE51bWJlck9mRnJvbnRlbmRzKEZyb250ZW5kVHlwZSBpbl9mcm9udGVuZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbl9tYXhOdW1iZXIpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldE1heE51bWJlck9mRnJvbnRlbmRzKEZyb250ZW5kVHlwZSBpbl9mcm9udGVuZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICAgIHN0cmluZyBhZGRGaWx0ZXJUb1NoYXJlZChjb25zdCBzaGFyZWRfcHRyPFR1bmVySGlkbEZpbHRlcj4mIHNoYXJlZEZpbHRlcik7CisgICAgdm9pZCByZW1vdmVTaGFyZWRGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxUdW5lckhpZGxGaWx0ZXI+JiBzaGFyZWRGaWx0ZXIpOworICAgIHZvaWQgcmVtb3ZlRnJvbnRlbmQoY29uc3Qgc2hhcmVkX3B0cjxUdW5lckhpZGxGcm9udGVuZD4mIGZyb250ZW5kKTsKKworICAgIHN0YXRpYyBzaGFyZWRfcHRyPFR1bmVySGlkbFNlcnZpY2U+IGdldFR1bmVyU2VydmljZSgpOworCitwcml2YXRlOgorICAgIGJvb2wgaGFzSVR1bmVyKCk7CisgICAgYm9vbCBoYXNJVHVuZXJfMV8xKCk7CisgICAgdm9pZCB1cGRhdGVUdW5lclJlc291cmNlcygpOworICAgIHZlY3RvcjxUdW5lckZyb250ZW5kSW5mbz4gZ2V0VFJNRnJvbnRlbmRJbmZvcygpOworICAgIHZlY3RvcjxpbnQzMl90PiBnZXRUUk1MbmJIYW5kbGVzKCk7CisgICAgSGlkbFJlc3VsdCBnZXRIaWRsRnJvbnRlbmRJZHMoaGlkbF92ZWM8SGlkbEZyb250ZW5kSWQ+JiBpZHMpOworICAgIEhpZGxSZXN1bHQgZ2V0SGlkbEZyb250ZW5kSW5mbyhjb25zdCBpbnQgaWQsIEhpZGxGcm9udGVuZEluZm8mIGluZm8pOworICAgIERlbXV4Q2FwYWJpbGl0aWVzIGdldEFpZGxEZW11eENhcHMoY29uc3QgSGlkbERlbXV4Q2FwYWJpbGl0aWVzJiBjYXBzKTsKKyAgICBGcm9udGVuZEluZm8gZ2V0QWlkbEZyb250ZW5kSW5mbyhjb25zdCBIaWRsRnJvbnRlbmRJbmZvJiBoYWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhpZGxGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMmIGR0bWJDYXBzKTsKKworICAgIHNwPEhpZGxJVHVuZXI+IG1UdW5lcjsKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklUdW5lcj4gbVR1bmVyXzFfMTsKKyAgICBpbnQgbVR1bmVyVmVyc2lvbiA9IFRVTkVSX0hBTF9WRVJTSU9OX1VOS05PV047CisgICAgTXV0ZXggbVNoYXJlZEZpbHRlcnNMb2NrOworICAgIG1hcDxzdHJpbmcsIHNoYXJlZF9wdHI8VHVuZXJIaWRsRmlsdGVyPj4gbVNoYXJlZEZpbHRlcnM7CisgICAgTXV0ZXggbU9wZW5lZEZyb250ZW5kc0xvY2s7CisgICAgdW5vcmRlcmVkX3NldDxzaGFyZWRfcHRyPFR1bmVySGlkbEZyb250ZW5kPj4gbU9wZW5lZEZyb250ZW5kczsKKyAgICBpbnQgbUxuYVN0YXR1cyA9IC0xOworCisgICAgc3RhdGljIHNoYXJlZF9wdHI8VHVuZXJIaWRsU2VydmljZT4gc1R1bmVyU2VydmljZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0dW5lcgorfSAgLy8gbmFtZXNwYWNlIHR2Cit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfVFVORVJISURMU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9oaWRsL1R1bmVySGlkbFRpbWVGaWx0ZXIuY3BwIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxUaW1lRmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDYwNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxUaW1lRmlsdGVyLmNwcApAQCAtMCwwICsxLDEzMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVHVuZXJIaWRsVGltZUZpbHRlciIKKworI2luY2x1ZGUgIlR1bmVySGlkbFRpbWVGaWx0ZXIuaCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS90di90dW5lci9Db25zdGFudDY0Qml0Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyL1Jlc3VsdC5oPgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OkNvbnN0YW50NjRCaXQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlJlc3VsdDsKKwordXNpbmcgSGlkbFJlc3VsdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYWlkbCB7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIHR2IHsKK25hbWVzcGFjZSB0dW5lciB7CisKK1R1bmVySGlkbFRpbWVGaWx0ZXI6OlR1bmVySGlkbFRpbWVGaWx0ZXIoc3A8SGlkbElUaW1lRmlsdGVyPiB0aW1lRmlsdGVyKSB7CisgICAgbVRpbWVGaWx0ZXIgPSB0aW1lRmlsdGVyOworfQorCitUdW5lckhpZGxUaW1lRmlsdGVyOjp+VHVuZXJIaWRsVGltZUZpbHRlcigpIHsKKyAgICBtVGltZUZpbHRlciA9IG51bGxwdHI7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFRpbWVGaWx0ZXI6OnNldFRpbWVTdGFtcChpbnQ2NF90IHRpbWVTdGFtcCkgeworICAgIGlmIChtVGltZUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJVGltZUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbVRpbWVGaWx0ZXItPnNldFRpbWVTdGFtcChzdGF0aWNfY2FzdDx1aW50NjRfdD4odGltZVN0YW1wKSk7CisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFRpbWVGaWx0ZXI6OmNsZWFyVGltZVN0YW1wKCkgeworICAgIGlmIChtVGltZUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJVGltZUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzID0gbVRpbWVGaWx0ZXItPmNsZWFyVGltZVN0YW1wKCk7CisgICAgaWYgKHN0YXR1cyAhPSBIaWRsUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFRpbWVGaWx0ZXI6OmdldFNvdXJjZVRpbWUoaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1UaW1lRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IChpbnQ2NF90KUNvbnN0YW50NjRCaXQ6OklOVkFMSURfUFJFU0VOVEFUSU9OX1RJTUVfU1RBTVA7CisgICAgICAgIEFMT0dFKCJJVGltZUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEhpZGxSZXN1bHQgc3RhdHVzOworICAgIG1UaW1lRmlsdGVyLT5nZXRTb3VyY2VUaW1lKFsmXShIaWRsUmVzdWx0IHIsIHVpbnQ2NF90IHQpIHsKKyAgICAgICAgc3RhdHVzID0gcjsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IHN0YXRpY19jYXN0PGludDY0X3Q+KHQpOworICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oQ29uc3RhbnQ2NEJpdDo6SU5WQUxJRF9QUkVTRU5UQVRJT05fVElNRV9TVEFNUCk7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6Om9rKCk7Cit9CisKKzo6bmRrOjpTY29wZWRBU3RhdHVzIFR1bmVySGlkbFRpbWVGaWx0ZXI6OmdldFRpbWVTdGFtcChpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobVRpbWVGaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gKGludDY0X3QpQ29uc3RhbnQ2NEJpdDo6SU5WQUxJRF9QUkVTRU5UQVRJT05fVElNRV9TVEFNUDsKKyAgICAgICAgQUxPR0UoIklUaW1lRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSGlkbFJlc3VsdCBzdGF0dXM7CisgICAgbVRpbWVGaWx0ZXItPmdldFRpbWVTdGFtcChbJl0oSGlkbFJlc3VsdCByLCB1aW50NjRfdCB0KSB7CisgICAgICAgIHN0YXR1cyA9IHI7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBzdGF0aWNfY2FzdDxpbnQ2NF90Pih0KTsKKyAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IEhpZGxSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IHN0YXRpY19jYXN0PGludDY0X3Q+KENvbnN0YW50NjRCaXQ6OklOVkFMSURfUFJFU0VOVEFUSU9OX1RJTUVfU1RBTVApOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCis6Om5kazo6U2NvcGVkQVN0YXR1cyBUdW5lckhpZGxUaW1lRmlsdGVyOjpjbG9zZSgpIHsKKyAgICBpZiAobVRpbWVGaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSVRpbWVGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBIaWRsUmVzdWx0IHJlcyA9IG1UaW1lRmlsdGVyLT5jbG9zZSgpOworICAgIG1UaW1lRmlsdGVyID0gbnVsbHB0cjsKKworICAgIGlmIChyZXMgIT0gSGlkbFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpvaygpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsVGltZUZpbHRlci5oIGIvc2VydmljZXMvdHVuZXIvaGlkbC9UdW5lckhpZGxUaW1lRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmOWM1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2hpZGwvVHVuZXJIaWRsVGltZUZpbHRlci5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJISURMVElNRUZJTFRFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFVORVJISURMVElNRUZJTFRFUl9ICisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvQm5UdW5lclRpbWVGaWx0ZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JVGltZUZpbHRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKKwordXNpbmcgSGlkbElUaW1lRmlsdGVyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJVGltZUZpbHRlcjsKKworbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSB0diB7CituYW1lc3BhY2UgdHVuZXIgeworCitjbGFzcyBUdW5lckhpZGxUaW1lRmlsdGVyIDogcHVibGljIEJuVHVuZXJUaW1lRmlsdGVyIHsKK3B1YmxpYzoKKyAgICBUdW5lckhpZGxUaW1lRmlsdGVyKHNwPEhpZGxJVGltZUZpbHRlcj4gdGltZUZpbHRlcik7CisgICAgdmlydHVhbCB+VHVuZXJIaWRsVGltZUZpbHRlcigpOworCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgc2V0VGltZVN0YW1wKGludDY0X3QgaW5fdGltZVN0YW1wKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjbGVhclRpbWVTdGFtcCgpIG92ZXJyaWRlOworICAgIDo6bmRrOjpTY29wZWRBU3RhdHVzIGdldFNvdXJjZVRpbWUoaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBnZXRUaW1lU3RhbXAoaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICA6Om5kazo6U2NvcGVkQVN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHNwPEhpZGxJVGltZUZpbHRlcj4gbVRpbWVGaWx0ZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdHVuZXIKK30gIC8vIG5hbWVzcGFjZSB0dgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGFpZGwKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RVTkVSSElETFRJTUVGSUxURVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvbWFpbl90dW5lcnNlcnZpY2UuY3BwIGIvc2VydmljZXMvdHVuZXIvbWFpbl90dW5lcnNlcnZpY2UuY3BwCmluZGV4IDU4NmEwZTIuLmEwMTRkZWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL21haW5fdHVuZXJzZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy90dW5lci9tYWluX3R1bmVyc2VydmljZS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwzMCArMTQsMzMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiVHVuZXJTZXJ2aWNlLmgiCisjaW5jbHVkZSAiaGlkbC9UdW5lckhpZGxTZXJ2aWNlLmgiCisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJIaWRsU2VydmljZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJTZXJ2aWNlOwogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotaW50IG1haW4oaW50IGFyZ2MgX191bnVzZWQsIGNoYXIqKiBhcmd2KSB7CitpbnQgbWFpbigpIHsKICAgICBBTE9HRCgiVHVuZXIgc2VydmljZSBzdGFydGluZyIpOwogCi0gICAgc3RyY3B5KGFyZ3ZbMF0sICJtZWRpYS50dW5lciIpOwogICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgIEFMT0dEKCJTZXJ2aWNlTWFuYWdlcjogJXAiLCBzbS5nZXQoKSk7CiAKLSAgICBiaW5kZXJfc3RhdHVzX3Qgc3RhdHVzID0gVHVuZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOworICAgIC8vIENoZWNrIGxlZ2FjeSBISURMIEhBTCBmaXJzdC4gSWYgaXQncyBub3QgZXhpc3RlZCwgdXNlIEFJREwgSEFMLgorICAgIGJpbmRlcl9zdGF0dXNfdCBzdGF0dXMgPSBUdW5lckhpZGxTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgIGlmIChzdGF0dXMgIT0gU1RBVFVTX09LKSB7Ci0gICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gYWRkIHR1bmVyIHNlcnZpY2UgYXMgQUlETCBpbnRlcmZhY2UiKTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzdGF0dXMgPSBUdW5lclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgICAgIENIRUNLKHN0YXR1cyA9PSBTVEFUVVNfT0spOwogICAgIH0KIAogICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5qb2luVGhyZWFkUG9vbCgpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7ICAvLyBzaG91bGQgbm90IHJlYWNoZWQKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL21lZGlhdHVuZXIucmMgYi9zZXJ2aWNlcy90dW5lci9tZWRpYXR1bmVyLnJjCmluZGV4IGZkMzA2MTguLjZhM2UxOTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3R1bmVyL21lZGlhdHVuZXIucmMKKysrIGIvc2VydmljZXMvdHVuZXIvbWVkaWF0dW5lci5yYwpAQCAtMiw0ICsyLDcgQEAKICAgICBjbGFzcyBtYWluCiAgICAgZ3JvdXAgbWVkaWEKICAgICBpb3ByaW8gcnQgNAorICAgIG9ucmVzdGFydCByZXN0YXJ0IHZlbmRvci50dW5lci1oYWwtMS0wCisgICAgb25yZXN0YXJ0IHJlc3RhcnQgdmVuZG9yLnR1bmVyLWhhbC0xLTEKKyAgICBvbnJlc3RhcnQgcmVzdGFydCB2ZW5kb3IudHVuZXItZGVmYXVsdAogICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaCBIaWdoUGVyZm9ybWFuY2UK